Compare commits
20 Commits
pre0.17.0-
...
pre0.17.0-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ef12ab0cee | ||
|
|
3d26db7a01 | ||
|
|
dd3df9981b | ||
|
|
5d04e83529 | ||
|
|
7ed4626d71 | ||
|
|
ecf5a29a71 | ||
|
|
1a24b346a0 | ||
|
|
72d06c7a02 | ||
|
|
26fde8c694 | ||
|
|
8adeb99be7 | ||
|
|
c92f15156b | ||
|
|
63f69d712b | ||
|
|
55a1bd06f3 | ||
|
|
6a29abf7f0 | ||
|
|
83bdd9f2c4 | ||
|
|
95879827c8 | ||
|
|
2ade518207 | ||
|
|
36c8449e4d | ||
|
|
3c04df69f3 | ||
|
|
1224ee9a67 |
@@ -298,6 +298,15 @@ local jsAxisEventName={
|
||||
triggerleft='triggerleft',
|
||||
triggerright='triggerright'
|
||||
}
|
||||
local gamePadKeys={'a','b','x','y','back','guide','start','leftstick','rightstick','leftshoulder','rightshoulder','dpup','dpdown','dpleft','dpright'}
|
||||
local dPadToKey={
|
||||
dpup='up',
|
||||
dpdown='down',
|
||||
dpleft='left',
|
||||
dpright='right',
|
||||
start='return',
|
||||
back='escape',
|
||||
}
|
||||
function love.joystickadded(JS)
|
||||
jsState[JS:getID()]={
|
||||
_loveJSObj=JS,
|
||||
@@ -310,6 +319,11 @@ end
|
||||
function love.joystickremoved(JS)
|
||||
local js=jsState[JS:getID()]
|
||||
if js then
|
||||
for i=1,#gamePadKeys do
|
||||
if JS:isGamepadDown(gamePadKeys[i])then
|
||||
love.gamepadreleased(JS,gamePadKeys[i])
|
||||
end
|
||||
end
|
||||
love.gamepadaxis(JS,'leftx',0)
|
||||
love.gamepadaxis(JS,'lefty',0)
|
||||
love.gamepadaxis(JS,'rightx',0)
|
||||
@@ -320,14 +334,13 @@ function love.joystickremoved(JS)
|
||||
MES.new('info',"Joystick removed")
|
||||
end
|
||||
end
|
||||
|
||||
function love.gamepadaxis(JS,axis,val)
|
||||
local js=jsState[JS:getID()]
|
||||
if js then
|
||||
if axis=='leftx'or axis=='lefty'or axis=='rightx'or axis=='righty'then
|
||||
local newVal=--range: [0,1]
|
||||
val>.5 and 1 or
|
||||
val<-.5 and -1 or
|
||||
val>.4 and 1 or
|
||||
val<-.4 and -1 or
|
||||
0
|
||||
if newVal~=js[axis]then
|
||||
if js[axis]==-1 then
|
||||
@@ -343,7 +356,7 @@ function love.gamepadaxis(JS,axis,val)
|
||||
js[axis]=newVal
|
||||
end
|
||||
elseif axis=='triggerleft'or axis=='triggerright'then
|
||||
local newVal=val>0 and 1 or 0--range: [-1,1]
|
||||
local newVal=val>-.3 and 1 or 0--range: [-1,1]
|
||||
if newVal~=js[axis]then
|
||||
if newVal==1 then
|
||||
love.gamepadpressed(JS,jsAxisEventName[axis])
|
||||
@@ -355,15 +368,6 @@ function love.gamepadaxis(JS,axis,val)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local dPadToKey={
|
||||
dpup='up',
|
||||
dpdown='down',
|
||||
dpleft='left',
|
||||
dpright='right',
|
||||
start='return',
|
||||
back='escape',
|
||||
}
|
||||
function love.gamepadpressed(_,i)
|
||||
mouseShow=false
|
||||
if SCN.swapping then return end
|
||||
@@ -384,11 +388,11 @@ end
|
||||
function love.directorydropped(dir)
|
||||
if SCN.directoryDropped then SCN.directoryDropped(dir)end
|
||||
end
|
||||
local lastGCtime=0
|
||||
local autoGCcount=0
|
||||
function love.lowmemory()
|
||||
if love.timer.getTime()-lastGCtime>6.26 then
|
||||
collectgarbage()
|
||||
lastGCtime=love.timer.getTime()
|
||||
collectgarbage()
|
||||
if autoGCcount<3 then
|
||||
autoGCcount=autoGCcount+1
|
||||
MES.new('check',"[auto GC] low MEM 设备内存过低")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -140,8 +140,8 @@ do
|
||||
},--Z
|
||||
false,--S
|
||||
{
|
||||
[01]={'+0+0','-1+0','-1+1','+0-2','+1+1','+0+1'},
|
||||
[10]={'+0+0','+1+0','+1-1','+0+2','-1-1','+0-1'},
|
||||
[01]={'+0+0','-1+0','-1+1','+0-2','+1+1','+0+1','+0-1'},
|
||||
[10]={'+0+0','+1+0','+1-1','+0+2','-1-1','+0-1','+0+1'},
|
||||
[03]={'+0+0','+1+0','+1+1','+0-2','+1-2','+1-1','+0+1'},
|
||||
[30]={'+0+0','-1+0','-1-1','+0+2','-1+2','+0-1','-1+1'},
|
||||
[12]={'+0+0','+1+0','+1-1','+1+1','-1+0','+0-1','+0+2','+1+2'},
|
||||
|
||||
@@ -61,7 +61,7 @@ function back.draw()
|
||||
|
||||
gc_setLineWidth(6)
|
||||
gc_setColor(.8,.9,1,.3)
|
||||
for i=1,8 do gc_polygon('line',SVG_TITLE_FAN[i])end
|
||||
for i=1,#SVG_TITLE_FAN do gc_polygon('line',SVG_TITLE_FAN[i])end
|
||||
|
||||
gc_setLineWidth(2)
|
||||
gc_setColor(1,.5,.7,.3)
|
||||
|
||||
@@ -12,7 +12,7 @@ local baseBot={
|
||||
function baseBot.update(bot)
|
||||
local P=bot.P
|
||||
local keys=bot.keys
|
||||
if P.control and P.waiting==-1 then
|
||||
if P.control and P.waiting==0 then
|
||||
bot.delay=bot.delay-1
|
||||
if not keys[1]then
|
||||
if bot.runningThread then
|
||||
|
||||
@@ -6,6 +6,8 @@ return{
|
||||
lock=1e99,
|
||||
wait=0,
|
||||
fall=0,
|
||||
hang=5,
|
||||
hurry=1e99,
|
||||
|
||||
--Control
|
||||
nextCount=6,
|
||||
@@ -13,7 +15,6 @@ return{
|
||||
holdCount=1,
|
||||
infHold=true,
|
||||
phyHold=false,
|
||||
hang=5,
|
||||
|
||||
--Visual
|
||||
bone=false,
|
||||
|
||||
@@ -297,6 +297,15 @@ function legalGameTime()--Check if today's playtime is legal
|
||||
end
|
||||
return true
|
||||
end
|
||||
do--function trySettingWarn()
|
||||
local lastWarnTime=0
|
||||
function trySettingWarn()
|
||||
if TIME()-lastWarnTime>2.6 then
|
||||
MES.new('warn',text.settingWarn,5)
|
||||
end
|
||||
lastWarnTime=TIME()
|
||||
end
|
||||
end
|
||||
|
||||
function mergeStat(stat,delta)--Merge delta stat. to global stat.
|
||||
for k,v in next,delta do
|
||||
@@ -818,13 +827,17 @@ do--function pressKey(k)
|
||||
end
|
||||
do--CUS/SETXXX(k)
|
||||
local CUSTOMENV=CUSTOMENV
|
||||
local warnList={
|
||||
'ims','RS','FTLock','frameMul','highCam',
|
||||
'VKSwitch','VKIcon','VKTrack','VKDodge',
|
||||
}
|
||||
function CUSval(k)return function()return CUSTOMENV[k]end end
|
||||
function ROOMval(k)return function()return ROOMENV[k]end end
|
||||
function SETval(k)return function()return SETTING[k]end end
|
||||
function CUSrev(k)return function()CUSTOMENV[k]=not CUSTOMENV[k]end end
|
||||
function ROOMrev(k)return function()ROOMENV[k]=not ROOMENV[k]end end
|
||||
function SETrev(k)return function()SETTING[k]=not SETTING[k]end end
|
||||
function SETrev(k)return function()if TABLE.find(warnList,k)then trySettingWarn()end SETTING[k]=not SETTING[k]end end
|
||||
function CUSsto(k)return function(i)CUSTOMENV[k]=i end end
|
||||
function ROOMsto(k)return function(i)ROOMENV[k]=i end end
|
||||
function SETsto(k)return function(i)SETTING[k]=i end end
|
||||
function SETsto(k)return function(i)if TABLE.find(warnList,k)then trySettingWarn()end SETTING[k]=i end end
|
||||
end
|
||||
|
||||
@@ -20,140 +20,129 @@ RANK_COLORS={
|
||||
{1,.5,.4},
|
||||
{.95,.5,.95},
|
||||
}
|
||||
do--SVG_TITLE
|
||||
SVG_TITLE={
|
||||
do--SVG_TITLE_FILL, SVG_TITLE_LINE
|
||||
SVG_TITLE_FILL={
|
||||
{
|
||||
53, 60,
|
||||
1035, 0,
|
||||
964, 218,
|
||||
660, 218,
|
||||
391, 1300,
|
||||
231, 1154,
|
||||
415, 218,
|
||||
0, 218,
|
||||
0,0,
|
||||
0,34,
|
||||
63,34,
|
||||
63,227,
|
||||
97,227,
|
||||
97,34,
|
||||
160,34,
|
||||
160,0,
|
||||
},
|
||||
{
|
||||
716, 290,
|
||||
1429, 290,
|
||||
1312, 462,
|
||||
875, 489,
|
||||
821, 695,
|
||||
1148, 712,
|
||||
1017, 902,
|
||||
761, 924,
|
||||
707, 1127,
|
||||
1106, 1101,
|
||||
1198, 1300,
|
||||
465, 1300,
|
||||
126,60,
|
||||
244,60,
|
||||
244,94,
|
||||
160,94,
|
||||
160,127,
|
||||
230,127,
|
||||
230,161,
|
||||
160,161,
|
||||
160,194,
|
||||
244,194,
|
||||
244,227,
|
||||
126,227,
|
||||
},
|
||||
{
|
||||
1516, 287,
|
||||
2102, 290,
|
||||
2036, 464,
|
||||
1598, 465,
|
||||
1322, 905,
|
||||
1395, 1102,
|
||||
1819, 1064,
|
||||
1743, 1280,
|
||||
1286, 1310,
|
||||
1106, 902,
|
||||
262,82,
|
||||
283,60,
|
||||
385,60,
|
||||
385,94,
|
||||
296,94,
|
||||
296,194,
|
||||
385,194,
|
||||
385,227,
|
||||
283,227,
|
||||
262,206,
|
||||
},
|
||||
{
|
||||
2179, 290,
|
||||
2411, 290,
|
||||
2272, 688,
|
||||
2674, 666,
|
||||
2801, 290,
|
||||
3041, 290,
|
||||
2693, 1280,
|
||||
2464, 1280,
|
||||
2601, 879,
|
||||
2199, 897,
|
||||
2056, 1280,
|
||||
1828, 1280,
|
||||
404,60,
|
||||
437,60,
|
||||
437,127,
|
||||
505,127,
|
||||
505,60,
|
||||
538,60,
|
||||
538,227,
|
||||
505,227,
|
||||
505,161,
|
||||
437,161,
|
||||
437,227,
|
||||
404,227,
|
||||
},
|
||||
{
|
||||
3123, 290,
|
||||
3480, 290,
|
||||
3496, 480,
|
||||
3664, 290,
|
||||
4017, 294,
|
||||
3682, 1280,
|
||||
3453, 1280,
|
||||
3697, 578,
|
||||
3458, 843,
|
||||
3304, 842,
|
||||
3251, 561,
|
||||
3001, 1280,
|
||||
2779, 1280,
|
||||
558,60,
|
||||
604,60,
|
||||
640,153,
|
||||
676,60,
|
||||
722,60,
|
||||
722,227,
|
||||
688,227,
|
||||
688,108,
|
||||
655,194,
|
||||
625,194,
|
||||
591,108,
|
||||
591,227,
|
||||
558,227,
|
||||
},
|
||||
{
|
||||
4088, 290,
|
||||
4677, 290,
|
||||
4599, 501,
|
||||
4426, 502,
|
||||
4219, 1069,
|
||||
4388, 1070,
|
||||
4317, 1280,
|
||||
3753, 1280,
|
||||
3822, 1068,
|
||||
3978, 1068,
|
||||
4194, 504,
|
||||
4016, 504,
|
||||
743,60,
|
||||
777,60,
|
||||
777,227,
|
||||
743,227,
|
||||
},
|
||||
{
|
||||
4747, 290,
|
||||
4978, 295,
|
||||
4921, 464,
|
||||
5186, 850,
|
||||
5366, 290,
|
||||
5599, 295,
|
||||
5288, 1280,
|
||||
5051, 1280,
|
||||
5106, 1102,
|
||||
4836, 709,
|
||||
4641, 1280,
|
||||
4406, 1280,
|
||||
798,60,
|
||||
831,60,
|
||||
899,173,
|
||||
899,60,
|
||||
933,60,
|
||||
933,227,
|
||||
899,227,
|
||||
831,115,
|
||||
831,227,
|
||||
798,227,
|
||||
},
|
||||
{
|
||||
5814, 290,
|
||||
6370, 295,
|
||||
6471, 415,
|
||||
6238, 1156,
|
||||
6058, 1280,
|
||||
5507, 1280,
|
||||
5404, 1154,
|
||||
5635, 416,
|
||||
-- 5814, 290,
|
||||
-- 5878, 463,
|
||||
5770, 542,
|
||||
5617, 1030,
|
||||
5676, 1105,
|
||||
5995, 1106,
|
||||
6100, 1029,
|
||||
6255, 541,
|
||||
6199, 465,
|
||||
5878, 463,
|
||||
950,82,
|
||||
971,60,
|
||||
1064,60,
|
||||
1085,82,
|
||||
1085,206,
|
||||
1064,227,
|
||||
971,227,
|
||||
950,206,
|
||||
950,82,
|
||||
|
||||
984,94,
|
||||
984,194,
|
||||
1051,194,
|
||||
1051,94,
|
||||
984,94,
|
||||
},
|
||||
}
|
||||
for _,C in next,SVG_TITLE do
|
||||
for _,C in next,SVG_TITLE_FILL do
|
||||
for i=1,#C do
|
||||
C[i]=C[i]*.1626
|
||||
C[i]=C[i]*.94
|
||||
end
|
||||
end
|
||||
|
||||
SVG_TITLE_LINE=TABLE.shift(SVG_TITLE_FILL)
|
||||
SVG_TITLE_LINE[8],SVG_TITLE_LINE[9]={},{}
|
||||
for j=1,16 do SVG_TITLE_LINE[8][j]=SVG_TITLE_FILL[8][j]end
|
||||
for j=19,#SVG_TITLE_FILL[8]-2 do SVG_TITLE_LINE[9][j-18]=SVG_TITLE_FILL[8][j]end
|
||||
end
|
||||
do--SVG_TITLE_FAN
|
||||
SVG_TITLE_FAN={}
|
||||
local sin,cos=math.sin,math.cos
|
||||
for i=1,8 do
|
||||
local L={}
|
||||
for i=1,9 do
|
||||
local L=TABLE.copy(SVG_TITLE_LINE[i])
|
||||
SVG_TITLE_FAN[i]=L
|
||||
for j=1,#SVG_TITLE[i]do
|
||||
L[j]=SVG_TITLE[i][j]
|
||||
end
|
||||
for j=1,#L,2 do
|
||||
local x,y=L[j],L[j+1]--0<x<3041, 290<y<1280
|
||||
x,y=-(x+240+y*.3)*.002,(y-580)*.9
|
||||
local x,y=L[j],L[j+1]--0<x<988, 290<y<1280
|
||||
x,y=-(x+280)*.002,(y-580)*.9--X=ang, Y=dist
|
||||
x,y=y*cos(x),-y*sin(x)--Rec-Pol-Rec
|
||||
L[j],L[j+1]=x,y+300
|
||||
end
|
||||
@@ -547,13 +536,12 @@ do--Game data tables
|
||||
ROOMENV={
|
||||
--Room config
|
||||
capacity=10,
|
||||
FTLock=true,
|
||||
|
||||
--Basic
|
||||
drop=30,
|
||||
lock=60,
|
||||
wait=0,
|
||||
fall=0,
|
||||
FTLock=true,
|
||||
drop=30,lock=60,
|
||||
wait=0,fall=0,
|
||||
hang=5,hurry=1e99,
|
||||
|
||||
--Control
|
||||
nextCount=6,
|
||||
|
||||
@@ -16,8 +16,8 @@ return{
|
||||
{"To New Players",
|
||||
"guide newbie noob",
|
||||
"help",
|
||||
"To new players that want to get better at the game:\n\tTwo principles:\n\t1. find a version with good controls (e.g. Techmino, Tetr.io, Tetris Online, Jstris, Tetr.js). Do not use those version used for programming practice.\n\t2. Build foundations in your skills (stable Techrashes using next queue to aid decisions), don't go for fancy T-Spins from the start.\n\n\tTwo main techniques:\n\t1. familiarize yourself with spawn locations of pieces, and the controls to move the piece into each location\n\t2. Plan ahead of where to put the pieces\nHere is a article written by a well-known player in Chinese Tetris community talking about advices to new players. Click the globe if you can read simplified Chinese.",
|
||||
"https://bilibili.com/read/cv2352939",
|
||||
"To new players that want to get better at the game:\n\tTwo principles:\n\t1. find a version with good controls (e.g. Techmino, Tetr.io, Tetris Online, Jstris, Tetr.js). Do not use those version used for programming practice.\n\t2. Build foundations in your skills (stable Techrashes using next queue to aid decisions), don't go for fancy T-Spins from the start.\n\n\tTwo main techniques:\n\t1. familiarize yourself with spawn locations of pieces, and the controls to move the piece into each location\n\t2. Plan ahead of where to put the pieces\nHere is a article written by a well-known player in Chinese Tetris community talking about advices to new players. Click the globe to read the translated article by User670.",
|
||||
"https://github.com/user670/temp/blob/master/tips_to_those_new_to_top.md",
|
||||
},
|
||||
{"Learning T-spins",
|
||||
"tspin learning study guide tips",
|
||||
|
||||
@@ -15,6 +15,7 @@ return{
|
||||
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 have some rests!",
|
||||
settingWarn="Modifing uncommon setting, be careful!",
|
||||
|
||||
atkModeName={"Random","Badges","K.O.s","Attackers"},
|
||||
royale_remain="$1 Players Remains",
|
||||
@@ -296,6 +297,8 @@ return{
|
||||
lock="Lock Delay",
|
||||
wait="Entry Delay",
|
||||
fall="Line Delay",
|
||||
hang="Death Delay",
|
||||
hurry="ARE Interruption",
|
||||
|
||||
capacity="Capacity",
|
||||
create="Create",
|
||||
@@ -330,6 +333,7 @@ return{
|
||||
ctrl="Control Settings",
|
||||
key="Key Mappings",
|
||||
touch="Touch Settings",
|
||||
showVK="Show Virtual Keys",
|
||||
reTime="Start Delay",
|
||||
RS="Rotation System",
|
||||
menuPos="Menu Button Pos.",
|
||||
@@ -461,7 +465,6 @@ return{
|
||||
|
||||
norm="Normal",
|
||||
pro="Advanced",
|
||||
hide="Show Virtual Keys",
|
||||
icon="Icon",
|
||||
sfx="SFX",
|
||||
vib="VIB",
|
||||
@@ -480,6 +483,7 @@ return{
|
||||
wait="Entry Delay",
|
||||
fall="Line Delay",
|
||||
hang="Death Delay",
|
||||
hurry="ARE Interruption",
|
||||
|
||||
bg="Background",
|
||||
bgm="Music",
|
||||
@@ -498,6 +502,7 @@ return{
|
||||
|
||||
eventSet="Rule Set",
|
||||
|
||||
holdMode="Hold Mode",
|
||||
nextCount="Next",
|
||||
holdCount="Hold",
|
||||
infHold="Infinite Hold",
|
||||
|
||||
@@ -5,6 +5,7 @@ return{
|
||||
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.",
|
||||
-- settingWarn="Modifing uncommon setting, be careful!",
|
||||
|
||||
atkModeName={"Al azar","Medallas","KOs","Atacantes"},
|
||||
royale_remain="$1 Jugadores Restantes",
|
||||
@@ -262,6 +263,8 @@ return{
|
||||
lock="Retraso de Bloqueo",
|
||||
wait="Retraso de Spawneo",
|
||||
fall="Retraso de Línea",
|
||||
-- hang="Death Delay",
|
||||
-- hurry="ARE Interruption",
|
||||
|
||||
capacity="Capacidad",
|
||||
create="Crear",
|
||||
@@ -296,6 +299,7 @@ return{
|
||||
ctrl="Sensibilidad",
|
||||
key="Teclas",
|
||||
touch="Controles Táctiles",
|
||||
showVK="Mostrar Tec. Virtual",
|
||||
reTime="Retraso de Inicio",
|
||||
RS="Sistema de Rotación",
|
||||
menuPos="Pos. del Botón de Menú",
|
||||
@@ -426,7 +430,6 @@ return{
|
||||
|
||||
norm="Normal",
|
||||
pro="Profesional",
|
||||
hide="Mostrar Tec. Virtual",
|
||||
icon="Ícono",
|
||||
sfx="SFX",
|
||||
vib="Vibr.",
|
||||
@@ -445,6 +448,7 @@ return{
|
||||
wait="Retraso de Spawneo",
|
||||
fall="Retraso de Línea",
|
||||
-- hang="Death Delay",
|
||||
-- hurry="ARE Interruption",
|
||||
|
||||
bg="Fondo",
|
||||
bgm="Música",
|
||||
|
||||
@@ -5,6 +5,7 @@ return{
|
||||
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.",
|
||||
-- settingWarn="Modifing uncommon setting, be careful!",
|
||||
|
||||
atkModeName={"Aléatoire","Badges","K.O.s faciles","Attaquants"},
|
||||
royale_remain="$1 Joueurs restants",
|
||||
@@ -258,6 +259,8 @@ return{
|
||||
lock="Délai de verrouillage",
|
||||
wait="Délai d'apparition",
|
||||
fall="Délai de ligne",
|
||||
-- hang="Death Delay",
|
||||
-- hurry="ARE Interruption",
|
||||
|
||||
-- capacity="Capacity",
|
||||
-- create="Create",
|
||||
@@ -293,6 +296,7 @@ return{
|
||||
ctrl="Paramètres de contrôle",
|
||||
key="Touches",
|
||||
touch="Boutons virtuels",
|
||||
showVK="Montrer les touches virtuelles",
|
||||
reTime="Délai de démarrage",
|
||||
RS="Système de rotation",
|
||||
-- menuPos="Menu button pos.",
|
||||
@@ -427,7 +431,6 @@ return{
|
||||
|
||||
norm="Normal",
|
||||
pro="Professionel",
|
||||
hide="Montrer les touches virtuelles",
|
||||
icon="Icône",
|
||||
sfx="Sons",
|
||||
vib="Vib.",
|
||||
@@ -446,6 +449,7 @@ return{
|
||||
wait="Délai d'apparition",
|
||||
fall="Délai de ligne",
|
||||
-- hang="Death Delay",
|
||||
-- hurry="ARE Interruption",
|
||||
|
||||
bg="Arrière-plan",
|
||||
bgm="Musique",
|
||||
|
||||
@@ -6,6 +6,7 @@ return{
|
||||
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.",
|
||||
-- settingWarn="Modifing uncommon setting, be careful!",
|
||||
|
||||
atkModeName={"Aleatório","Emblemas","K.O.s","Atacantes"},
|
||||
royale_remain="$1 Jogadores restantes",
|
||||
@@ -284,6 +285,8 @@ return{
|
||||
lock="Delay Trava",
|
||||
wait="Delay Entrada",
|
||||
fall="Delay Linha",
|
||||
-- hang="Death Delay",
|
||||
-- hurry="ARE Interruption",
|
||||
|
||||
-- capacity="Capacity",
|
||||
-- create="Create",
|
||||
@@ -318,6 +321,7 @@ return{
|
||||
ctrl="Config. controle",
|
||||
key="Map. teclas",
|
||||
touch="Config. toque",
|
||||
showVK="Mostrar tecla virtual",
|
||||
reTime="Demora iniciação",
|
||||
RS="Sistema de rotação",
|
||||
-- menuPos="Menu button pos.",
|
||||
@@ -449,7 +453,6 @@ return{
|
||||
|
||||
norm="Normal",
|
||||
pro="Professional",
|
||||
hide="Mostrar tecla virtual",
|
||||
icon="Icone",
|
||||
sfx="SFX",
|
||||
vib="VIB",
|
||||
@@ -468,6 +471,7 @@ return{
|
||||
wait="Delay Entrada",
|
||||
fall="Delay Linha",
|
||||
-- hang="Death Delay",
|
||||
-- hurry="ARE Interruption",
|
||||
|
||||
bg="Fundo",
|
||||
bgm="Música",
|
||||
|
||||
@@ -190,6 +190,8 @@ return{
|
||||
lock="↓_",
|
||||
wait="→=",
|
||||
fall="↓=",
|
||||
hang=":(=",
|
||||
hurry="_x",
|
||||
|
||||
capacity="<0/?>",
|
||||
create=">",
|
||||
@@ -225,6 +227,7 @@ return{
|
||||
ctrl="=?=",
|
||||
key="=?",
|
||||
touch="_?",
|
||||
showVK="--?",
|
||||
reTime="3-2-1",
|
||||
RS="''?",
|
||||
menuPos="←M→?",
|
||||
@@ -354,7 +357,6 @@ return{
|
||||
|
||||
norm="-",
|
||||
pro="+",
|
||||
hide="--?",
|
||||
icon="@?",
|
||||
sfx="#!#",
|
||||
vib="=~=",
|
||||
@@ -373,6 +375,7 @@ return{
|
||||
wait="→=",
|
||||
fall="↓=",
|
||||
hang=":(=",
|
||||
hurry="_x",
|
||||
|
||||
bg="{~}",
|
||||
bgm="(~)",
|
||||
|
||||
@@ -11,6 +11,7 @@ return{fallback='zh',
|
||||
},
|
||||
playedLong="玩很久了, 给我注意点",
|
||||
playedTooMuch="特么再敢玩眼睛瞎掉, 爬!",
|
||||
settingWarn="别乱动,小心点",
|
||||
|
||||
royale_remain="剩 $1 人",
|
||||
cmb={nil,"1连","2连","3连","4连","5连","6连","7连","8连","9连","10连!","11连!","12连!","13连!","14连!","15连!","16连!","17连!","18连!","19连!","Very 连"},
|
||||
|
||||
@@ -15,6 +15,7 @@ return{
|
||||
newDay="新的一天,新的开始~",
|
||||
playedLong="已经玩很久了!注意休息!",
|
||||
playedTooMuch="今天玩太久啦!打块好玩但也要适可而止哦~",
|
||||
settingWarn="正在修改不常用设置,小心操作!",
|
||||
|
||||
atkModeName={"随机","徽章","击杀","反击"},
|
||||
royale_remain="剩余 $1 名玩家",
|
||||
@@ -296,6 +297,8 @@ return{
|
||||
lock="锁定延迟",
|
||||
wait="出块等待",
|
||||
fall="消行延迟",
|
||||
hang="窒息延迟",
|
||||
hurry="ARE打断",
|
||||
|
||||
capacity="房间容量",
|
||||
create="创建",
|
||||
@@ -330,6 +333,7 @@ return{
|
||||
ctrl="控制设置",
|
||||
key="键位设置",
|
||||
touch="触屏设置",
|
||||
showVK="显示虚拟按键",
|
||||
reTime="开局等待时间",
|
||||
RS="旋转系统",
|
||||
menuPos="菜单按钮位置",
|
||||
@@ -460,7 +464,6 @@ return{
|
||||
|
||||
norm="标准",
|
||||
pro="专业",
|
||||
hide="显示虚拟按键",
|
||||
icon="图标",
|
||||
sfx="按键音效",
|
||||
vib="按键振动",
|
||||
@@ -479,6 +482,7 @@ return{
|
||||
wait="出块等待",
|
||||
fall="消行延迟",
|
||||
hang="窒息延迟",
|
||||
hurry="ARE打断",
|
||||
|
||||
bg="背景",
|
||||
bgm="音乐",
|
||||
@@ -905,7 +909,7 @@ return{
|
||||
"快去打一把100%极简看看会怎样",
|
||||
"锟斤拷锟斤拷锟斤拷",
|
||||
"来学编程,好玩的",
|
||||
"老牌益智游戏了属于是",
|
||||
"老牌益智游戏了",
|
||||
"连续pc有大量知识要背,不过背出来后随手10连pc不是问题",
|
||||
"六连块总共有……?那不重要,不会做的(大概",
|
||||
"论如何正确使用Unicode私用区定制字体",
|
||||
@@ -927,13 +931,13 @@ return{
|
||||
"你们考虑过Z酱的感受吗?没有!你们只考虑你自己。",
|
||||
"你说彩蛋?嗯…算是有,可以找找",
|
||||
"你有一个好",
|
||||
"你知道吗:看主页机器人玩可能比较费电",
|
||||
"你知道吗:全程不使用任何旋转键完成40行模式是有可能的",
|
||||
"你知道吗:全程不使用左右移动键完成40行模式是有可能的",
|
||||
"你知道吗:停留在模式地图界面很费电",
|
||||
"你知道吗:在其他(方块)游戏相关场合提及本游戏是很不礼貌的",
|
||||
"你知道吗:O-Spin是在0.8.20 (Fantastic Global Update II)中诞生的",
|
||||
"你知道吗:TRS旋转系统的最初形态在0.0.091726版本就存在了",
|
||||
"你知道吗[001]看主页机器人玩可能比较费电",
|
||||
"你知道吗[002]全程不使用任何旋转键完成40行模式是有可能的",
|
||||
"你知道吗[003]全程不使用左右移动键完成40行模式是有可能的",
|
||||
"你知道吗[004]停留在模式地图界面很费电",
|
||||
"你知道吗[005]在其他(方块)游戏相关场合提及本游戏是很不礼貌的",
|
||||
"你知道吗[006]O-Spin是在0.8.20 (Fantastic Global Update II)中诞生的",
|
||||
"你知道吗[007]TRS旋转系统的最初形态在0.0.091726版本就存在了",
|
||||
"你准备好了吗?",
|
||||
"其实很多时候“吃键”是玩家对游戏机制不了解或者自己的操作问题导致的",
|
||||
"其实S和Z有四个方向(状态),虽然看起来只有两个",
|
||||
@@ -967,8 +971,9 @@ return{
|
||||
"时间碎片[013] V0.14.4加入第一首不是用Beepbox制作的BGM",
|
||||
"时间碎片[014] V0.14.5加入第一首社区玩家自制BGM",
|
||||
"时间碎片[015] V0.15.5加入录像回放菜单",
|
||||
"时间碎片[016] V0.16.0应该是单次更新内容",
|
||||
"时间碎片[016] V0.16.0应该是单次更新内容最多的(起码更新历史最长)",
|
||||
"时间碎片[017] V0.16.2加入打击垫样式的音效室",
|
||||
"时间碎片[018] V0.17.0加入手柄的摇杆和扳机支持",
|
||||
"使用固定堆叠方法达成20TSD难度很低",
|
||||
"试试用跳舞毯打块",
|
||||
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
|
||||
@@ -1058,18 +1063,18 @@ return{
|
||||
"e^(πi)=-1",
|
||||
"e^(πi/2)=i",
|
||||
"e^(πi/4)=(1+i)/√2",
|
||||
"Farter:“成天被夸赞‘好玩’的”",
|
||||
"Farter:“可以形成方块圈子小中心话题,同作者一起衍生一些概念与梗的”",
|
||||
"Farter:“论方块的软工意义(就算这么小个范围内,各种取舍蒙混翻车现象都总会以很易懂的方式出现(”",
|
||||
"Farter:“民间微创新”",
|
||||
"Farter:“民间音lè与图案”",
|
||||
"Farter:“民间游戏设计”",
|
||||
"Farter:“是方块爱好者研究平台”",
|
||||
"Farter:“是方块萌新入坑接收器”",
|
||||
"Farter:“是居家旅行装逼必备”",
|
||||
"Farter:“是民间UI动效艺术作品”",
|
||||
"Farter:“是一滩散乱的代码组成的蜜汁结构”",
|
||||
"Farter:“它是现在的techmino已发布版本”",
|
||||
"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",
|
||||
|
||||
@@ -15,6 +15,7 @@ return{
|
||||
newDay="新的一天,新的开始!",
|
||||
playedLong="你已经玩了很长时间了。一定要好好休息!",
|
||||
playedTooMuch="你玩得太久了!玩方块游戏很有趣,但现在是休息的时候了。",
|
||||
settingWarn="修改设置时,请小心!",
|
||||
|
||||
atkModeName={"随机的","徽章","击败","攻击者"},
|
||||
royale_remain="剩余$1球员",
|
||||
@@ -294,6 +295,8 @@ return{
|
||||
lock="锁定延迟",
|
||||
wait="进入延迟",
|
||||
fall="线路延迟",
|
||||
hang="毁灭延迟",
|
||||
hurry="是打扰吗",
|
||||
|
||||
capacity="容量",
|
||||
create="创造",
|
||||
@@ -328,6 +331,7 @@ return{
|
||||
ctrl="控制设置",
|
||||
key="键映射",
|
||||
touch="触摸设置",
|
||||
showVK="显示虚拟密钥",
|
||||
reTime="启动延迟",
|
||||
RS="轮换制",
|
||||
menuPos="菜单按钮位置",
|
||||
@@ -458,7 +462,6 @@ return{
|
||||
|
||||
norm="正常",
|
||||
pro="专业的",
|
||||
hide="显示虚拟密钥",
|
||||
icon="偶像",
|
||||
sfx="特技效果",
|
||||
vib="振动",
|
||||
@@ -477,6 +480,7 @@ return{
|
||||
wait="进入延迟",
|
||||
fall="线路延迟",
|
||||
hang="毁灭延迟",
|
||||
hurry="是打扰吗",
|
||||
|
||||
bg="背景",
|
||||
bgm="音乐",
|
||||
@@ -753,7 +757,7 @@ return{
|
||||
['infinite_dig']= {"无限:挖掘", "", "挖,挖,挖"},
|
||||
['marathon_inf']= {"马拉松", "无尽", "无尽马拉松"},
|
||||
|
||||
['custom_clear']= {"习俗", "正常"} ,
|
||||
['custom_clear']= {"习俗", "正常"},
|
||||
['custom_puzzle']= {"习俗", "令人费解的"},
|
||||
},
|
||||
}
|
||||
|
||||
@@ -15,6 +15,7 @@ return{
|
||||
newDay="新的一天,新的開始~",
|
||||
playedLong="你玩太久了!注意休息!",
|
||||
playedTooMuch="今天玩得太久啦!Techmino好玩但也要注意休息哦~",
|
||||
settingWarn="正在修改不常用設定,小心操作!",
|
||||
|
||||
atkModeName={"隨機","徽章","K.O.","反擊"},
|
||||
royale_remain="剩下 $1 名玩家",
|
||||
@@ -295,6 +296,8 @@ return{
|
||||
lock="鎖定延遲",
|
||||
wait="方塊生成等待",
|
||||
fall="行清除延遲",
|
||||
hang="死亡延遲",
|
||||
hurry="ARE打斷",
|
||||
|
||||
capacity="房間容量",
|
||||
create="創建",
|
||||
@@ -329,6 +332,7 @@ return{
|
||||
ctrl="控制設置",
|
||||
key="鍵位設置",
|
||||
touch="觸控設置",
|
||||
showVK="顯示虛擬擊鍵",
|
||||
reTime="開局等待時間",
|
||||
RS="旋轉系統",
|
||||
menuPos="菜單按鈕位置",
|
||||
@@ -459,7 +463,6 @@ return{
|
||||
|
||||
norm="標準",
|
||||
pro="專業",
|
||||
hide="顯示虛擬擊鍵",
|
||||
icon="圖標",
|
||||
sfx="擊鍵音效",
|
||||
vib="擊鍵振動",
|
||||
@@ -478,6 +481,7 @@ return{
|
||||
wait="方塊生成等待",
|
||||
fall="行清除延遲",
|
||||
hang="死亡延遲",
|
||||
hurry="ARE打斷",
|
||||
|
||||
bg="背景",
|
||||
bgm="音樂",
|
||||
|
||||
@@ -78,7 +78,7 @@ return{
|
||||
{font=25,name="[*炎]"},
|
||||
{font=25,name="[*Y]"},
|
||||
{font=25,name="aaa222"},
|
||||
{font=25,name="[**城]"},
|
||||
{font=25,name="人偶"},
|
||||
{font=25,name="cnDD"},
|
||||
{font=25,name="红桃老给"},
|
||||
{font=25,name="昭庭玲秋"},
|
||||
@@ -126,4 +126,5 @@ return{
|
||||
{font=25,name="费尔特林"},
|
||||
{font=25,name="零醇丘卡"},
|
||||
{font=25,name="Hathtiz"},
|
||||
{font=25,name="江江江江17"},
|
||||
}
|
||||
|
||||
@@ -170,7 +170,7 @@ local function _drawField(P,showInvis)
|
||||
local V,F=P.visTime,P.field
|
||||
local start=int((P.fieldBeneath+P.fieldUp)/30+1)
|
||||
local texture=P.skinLib
|
||||
if P.falling==-1 then--Blocks only
|
||||
if P.falling==0 then--Blocks only
|
||||
if ENV.upEdge then
|
||||
gc_setShader(shader_lighter)
|
||||
gc_translate(0,-4)
|
||||
@@ -782,7 +782,7 @@ function draw.norm(P,repMode)
|
||||
_drawFXs(P)
|
||||
|
||||
--Draw current block
|
||||
if P.cur and P.waiting==-1 then
|
||||
if P.cur then
|
||||
local C=P.cur
|
||||
local curColor=C.color
|
||||
|
||||
@@ -981,7 +981,6 @@ function draw.small(P)
|
||||
end
|
||||
function draw.demo(P)
|
||||
local ENV=P.gameEnv
|
||||
local curColor=P.cur.color
|
||||
|
||||
--Camera
|
||||
gc_push('transform')
|
||||
@@ -997,7 +996,8 @@ function draw.demo(P)
|
||||
gc_translate(0,600)
|
||||
_drawField(P)
|
||||
_drawFXs(P)
|
||||
if P.cur and P.waiting==-1 then
|
||||
if P.cur then
|
||||
local curColor=P.cur.color
|
||||
if ENV.ghost then
|
||||
drawGhost[ENV.ghostType](P.cur.bk,P.curX,P.ghoY,ENV.ghost,P.skinLib,curColor)
|
||||
end
|
||||
|
||||
@@ -3,7 +3,6 @@ return{
|
||||
dascut=0,dropcut=0,
|
||||
sddas=2,sdarr=2,
|
||||
ihs=true,irs=true,ims=true,
|
||||
hang=5,FTLock=true,
|
||||
|
||||
ghostType='gray',
|
||||
block=true,ghost=.3,center=1,
|
||||
@@ -30,6 +29,7 @@ return{
|
||||
|
||||
drop=60,lock=60,
|
||||
wait=0,fall=0,
|
||||
hang=5,hurry=1e99,
|
||||
bone=false,
|
||||
lockout=false,
|
||||
fieldH=20,heightLimit=1e99,
|
||||
@@ -69,4 +69,5 @@ return{
|
||||
|
||||
bg='none',bgm='race',
|
||||
allowMod=true,
|
||||
FTLock=true,
|
||||
}
|
||||
|
||||
@@ -36,54 +36,6 @@ local function _getNewStatTable()
|
||||
end
|
||||
return T
|
||||
end
|
||||
local playerActions={
|
||||
Player.act_moveLeft, --1
|
||||
Player.act_moveRight, --2
|
||||
Player.act_rotRight, --3
|
||||
Player.act_rotLeft, --4
|
||||
Player.act_rot180, --5
|
||||
Player.act_hardDrop, --6
|
||||
Player.act_softDrop, --7
|
||||
Player.act_hold, --8
|
||||
Player.act_func1, --9
|
||||
Player.act_func2, --10
|
||||
Player.act_insLeft, --11
|
||||
Player.act_insRight, --12
|
||||
Player.act_insDown, --13
|
||||
Player.act_down1, --14
|
||||
Player.act_down4, --15
|
||||
Player.act_down10, --16
|
||||
Player.act_dropLeft, --17
|
||||
Player.act_dropRight, --18
|
||||
Player.act_zangiLeft, --19
|
||||
Player.act_zangiRight,--20
|
||||
}
|
||||
local function _pressKey(P,keyID)
|
||||
if P.keyAvailable[keyID]and P.alive then
|
||||
P.keyPressing[keyID]=true
|
||||
playerActions[keyID](P)
|
||||
P.stat.key=P.stat.key+1
|
||||
end
|
||||
end
|
||||
local function _releaseKey(P,keyID)
|
||||
P.keyPressing[keyID]=false
|
||||
end
|
||||
local function _pressKey_Rec(P,keyID)
|
||||
if P.keyAvailable[keyID]and P.alive then
|
||||
local L=GAME.rep
|
||||
ins(L,P.frameRun)
|
||||
ins(L,keyID)
|
||||
P.keyPressing[keyID]=true
|
||||
playerActions[keyID](P)
|
||||
P.stat.key=P.stat.key+1
|
||||
end
|
||||
end
|
||||
local function _releaseKey_Rec(P,keyID)
|
||||
local L=GAME.rep
|
||||
ins(L,P.frameRun)
|
||||
ins(L,32+keyID)
|
||||
P.keyPressing[keyID]=false
|
||||
end
|
||||
local function _newEmptyPlayer(id,mini)
|
||||
local P={id=id}
|
||||
PLAYERS[id]=P
|
||||
@@ -92,15 +44,6 @@ local function _newEmptyPlayer(id,mini)
|
||||
--Inherit functions of Player class
|
||||
for k,v in next,Player do P[k]=v end
|
||||
|
||||
--Set key/timer event
|
||||
if P.id==1 and GAME.recording then
|
||||
P.pressKey=_pressKey_Rec
|
||||
P.releaseKey=_releaseKey_Rec
|
||||
else
|
||||
P.pressKey=_pressKey
|
||||
P.releaseKey=_releaseKey
|
||||
end
|
||||
|
||||
--Field position
|
||||
P.swingOffset={--Shake FX
|
||||
x=0,y=0,
|
||||
@@ -195,7 +138,7 @@ local function _newEmptyPlayer(id,mini)
|
||||
]]
|
||||
P.movDir,P.moving,P.downing=0,0,0--Last move key,DAS charging,downDAS charging
|
||||
P.dropDelay,P.lockDelay=0,0
|
||||
P.waiting,P.falling=-1,-1
|
||||
P.waiting,P.falling=0,0
|
||||
P.freshTime=0
|
||||
P.spinLast=false
|
||||
P.ctrlCount=0--Key press time, for finesse check
|
||||
|
||||
@@ -200,7 +200,317 @@ function Player:createBeam(R,send)
|
||||
end
|
||||
--------------------------</FX>--------------------------
|
||||
|
||||
--------------------------<Action>--------------------------
|
||||
function Player:_deepDrop()
|
||||
local CB=self.cur.bk
|
||||
local y=self.curY-1
|
||||
while self:ifoverlap(CB,self.curX,y)and y>0 do
|
||||
y=y-1
|
||||
end
|
||||
if y>0 then
|
||||
self.ghoY=y
|
||||
self:createDropFX()
|
||||
self.curY=y
|
||||
self:freshBlock('move')
|
||||
SFX.play('swipe')
|
||||
end
|
||||
end
|
||||
function Player:act_moveLeft(auto)
|
||||
if not auto then
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
end
|
||||
self.movDir=-1
|
||||
if self.control and self.waiting==0 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
|
||||
self:freshBlock('move')
|
||||
if not auto then
|
||||
self.moving=0
|
||||
end
|
||||
self.spinLast=false
|
||||
else
|
||||
self.moving=self.gameEnv.das
|
||||
end
|
||||
else
|
||||
self.moving=0
|
||||
end
|
||||
end
|
||||
function Player:act_moveRight(auto)
|
||||
if not auto then
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
end
|
||||
self.movDir=1
|
||||
if self.control and self.waiting==0 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
|
||||
self:freshBlock('move')
|
||||
if not auto then
|
||||
self.moving=0
|
||||
end
|
||||
self.spinLast=false
|
||||
else
|
||||
self.moving=self.gameEnv.das
|
||||
end
|
||||
else
|
||||
self.moving=0
|
||||
end
|
||||
end
|
||||
function Player:act_rotRight()
|
||||
if self.control and self.waiting==0 and 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.waiting==0 and 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.waiting==0 and self.cur then
|
||||
self.ctrlCount=self.ctrlCount+2
|
||||
self:spin(2)
|
||||
self.keyPressing[5]=false
|
||||
end
|
||||
end
|
||||
function Player:act_hardDrop()
|
||||
local ENV=self.gameEnv
|
||||
if self.control and self.waiting==0 and self.cur then
|
||||
if self.lastPiece.autoLock and self.frameRun-self.lastPiece.frame<ENV.dropcut then
|
||||
SFX.play('drop_cancel',.3)
|
||||
else
|
||||
if self.curY>self.ghoY then
|
||||
self:createDropFX()
|
||||
self.curY=self.ghoY
|
||||
self.spinLast=false
|
||||
if self.sound then
|
||||
SFX.play('drop',nil,self:getCenterX()*.15)
|
||||
if SETTING.vib>0 then VIB(SETTING.vib+1)end
|
||||
end
|
||||
end
|
||||
if ENV.shakeFX then
|
||||
self.swingOffset.vy=.6
|
||||
self.swingOffset.va=self.swingOffset.va+self:getCenterX()*6e-4
|
||||
end
|
||||
self.lockDelay=-1
|
||||
self.keyPressing[6]=false
|
||||
self:drop()
|
||||
end
|
||||
end
|
||||
end
|
||||
function Player:act_softDrop()
|
||||
self.downing=1
|
||||
if self.control and self.waiting==0 and self.cur then
|
||||
if self.curY>self.ghoY then
|
||||
self.curY=self.curY-1
|
||||
self:freshBlock('fresh')
|
||||
self.spinLast=false
|
||||
self:checkTouchSound()
|
||||
elseif self.gameEnv.deepdrop then
|
||||
self:_deepdrop()
|
||||
end
|
||||
end
|
||||
end
|
||||
function Player:act_hold()
|
||||
if self.control and self.waiting==0 then
|
||||
self:hold()
|
||||
self.keyPressing[8]=false
|
||||
end
|
||||
end
|
||||
function Player:act_func1()
|
||||
self.gameEnv.fkey1(self)
|
||||
end
|
||||
function Player:act_func2()
|
||||
self.gameEnv.fkey2(self)
|
||||
end
|
||||
|
||||
function Player:act_insLeft(auto)
|
||||
if not self.cur then
|
||||
return
|
||||
end
|
||||
local x0=self.curX
|
||||
while not self:ifoverlap(self.cur.bk,self.curX-1,self.curY)do
|
||||
self:createMoveFX('left')
|
||||
self.curX=self.curX-1
|
||||
self:freshBlock('move',true)
|
||||
end
|
||||
if self.curX~=x0 then
|
||||
self.spinLast=false
|
||||
self:checkTouchSound()
|
||||
end
|
||||
if self.gameEnv.shakeFX then
|
||||
self.swingOffset.vx=-1.5
|
||||
end
|
||||
if auto then
|
||||
if self.ctrlCount==0 then
|
||||
self.ctrlCount=1
|
||||
end
|
||||
else
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
end
|
||||
end
|
||||
function Player:act_insRight(auto)
|
||||
if not self.cur then
|
||||
return
|
||||
end
|
||||
local x0=self.curX
|
||||
while not self:ifoverlap(self.cur.bk,self.curX+1,self.curY)do
|
||||
self:createMoveFX('right')
|
||||
self.curX=self.curX+1
|
||||
self:freshBlock('move',true)
|
||||
end
|
||||
if self.curX~=x0 then
|
||||
self.spinLast=false
|
||||
self:checkTouchSound()
|
||||
end
|
||||
if self.gameEnv.shakeFX then
|
||||
self.swingOffset.vx=1.5
|
||||
end
|
||||
if auto then
|
||||
if self.ctrlCount==0 then
|
||||
self.ctrlCount=1
|
||||
end
|
||||
else
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
end
|
||||
end
|
||||
function Player:act_insDown()
|
||||
if self.cur and self.curY>self.ghoY then
|
||||
local ENV=self.gameEnv
|
||||
self:createDropFX()
|
||||
if ENV.shakeFX then
|
||||
self.swingOffset.vy=.5
|
||||
end
|
||||
self.curY=self.ghoY
|
||||
self.lockDelay=ENV.lock
|
||||
self.spinLast=false
|
||||
self:freshBlock('fresh')
|
||||
self:checkTouchSound()
|
||||
end
|
||||
end
|
||||
function Player:act_down1()
|
||||
if self.cur then
|
||||
if self.curY>self.ghoY then
|
||||
self:createMoveFX('down')
|
||||
self.curY=self.curY-1
|
||||
self:freshBlock('fresh')
|
||||
self.spinLast=false
|
||||
elseif self.gameEnv.deepdrop then
|
||||
self:_deepdrop()
|
||||
end
|
||||
end
|
||||
end
|
||||
function Player:act_down4()
|
||||
if self.cur then
|
||||
if self.curY>self.ghoY then
|
||||
local ghoY0=self.ghoY
|
||||
self.ghoY=max(self.curY-4,self.ghoY)
|
||||
self:createDropFX()
|
||||
self.curY,self.ghoY=self.ghoY,ghoY0
|
||||
self:freshBlock('fresh')
|
||||
self.spinLast=false
|
||||
elseif self.gameEnv.deepdrop then
|
||||
self:_deepdrop()
|
||||
end
|
||||
end
|
||||
end
|
||||
function Player:act_down10()
|
||||
if self.cur then
|
||||
if self.curY>self.ghoY then
|
||||
local ghoY0=self.ghoY
|
||||
self.ghoY=max(self.curY-0,self.ghoY)
|
||||
self:createDropFX()
|
||||
self.curY,self.ghoY=self.ghoY,ghoY0
|
||||
self:freshBlock('fresh')
|
||||
self.spinLast=false
|
||||
elseif self.gameEnv.deepdrop then
|
||||
self:_deepdrop()
|
||||
end
|
||||
end
|
||||
end
|
||||
function Player:act_dropLeft()
|
||||
if self.cur then
|
||||
self:act_insLeft()
|
||||
self:act_hardDrop()
|
||||
end
|
||||
end
|
||||
function Player:act_dropRight()
|
||||
if self.cur then
|
||||
self:act_insRight()
|
||||
self:act_hardDrop()
|
||||
end
|
||||
end
|
||||
function Player:act_zangiLeft()
|
||||
if self.cur then
|
||||
self:act_insLeft()
|
||||
self:act_insDown()
|
||||
self:act_insRight()
|
||||
self:act_hardDrop()
|
||||
end
|
||||
end
|
||||
function Player:act_zangiRight()
|
||||
if self.cur then
|
||||
self:act_insRight()
|
||||
self:act_insDown()
|
||||
self:act_insLeft()
|
||||
self:act_hardDrop()
|
||||
end
|
||||
end
|
||||
--------------------------</Action>--------------------------
|
||||
|
||||
--------------------------<Method>--------------------------
|
||||
local playerActions={
|
||||
Player.act_moveLeft, --1
|
||||
Player.act_moveRight, --2
|
||||
Player.act_rotRight, --3
|
||||
Player.act_rotLeft, --4
|
||||
Player.act_rot180, --5
|
||||
Player.act_hardDrop, --6
|
||||
Player.act_softDrop, --7
|
||||
Player.act_hold, --8
|
||||
Player.act_func1, --9
|
||||
Player.act_func2, --10
|
||||
Player.act_insLeft, --11
|
||||
Player.act_insRight, --12
|
||||
Player.act_insDown, --13
|
||||
Player.act_down1, --14
|
||||
Player.act_down4, --15
|
||||
Player.act_down10, --16
|
||||
Player.act_dropLeft, --17
|
||||
Player.act_dropRight, --18
|
||||
Player.act_zangiLeft, --19
|
||||
Player.act_zangiRight,--20
|
||||
}function Player:pressKey(keyID)
|
||||
if self.keyAvailable[keyID]and self.alive then
|
||||
if self.waiting>self.gameEnv.hurry then
|
||||
self.waiting=self.gameEnv.hurry
|
||||
if self.waiting==0 and self.falling==0 then
|
||||
self:popNext()
|
||||
end
|
||||
end
|
||||
self.keyPressing[keyID]=true
|
||||
playerActions[keyID](self)
|
||||
self.stat.key=self.stat.key+1
|
||||
if self.id==1 and GAME.recording then
|
||||
local L=GAME.rep
|
||||
ins(L,self.frameRun)
|
||||
ins(L,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)
|
||||
end
|
||||
end
|
||||
function Player:newTask(code,...)
|
||||
local thread=coroutine.create(code)
|
||||
assert(resume(thread,self,...))
|
||||
@@ -719,6 +1029,16 @@ function Player:_removeClearedLines()
|
||||
FREEROW.discard(rem(self.visTime,h))
|
||||
end
|
||||
end
|
||||
function Player:_updateFalling(val)
|
||||
self.falling=val
|
||||
if self.falling==0 then
|
||||
local L=#self.clearingRow
|
||||
if self.sound and self.gameEnv.fall>0 and #self.field+L>self.clearingRow[L]then
|
||||
SFX.play('fall')
|
||||
end
|
||||
TABLE.cut(self.clearingRow)
|
||||
end
|
||||
end
|
||||
function Player:removeTopClearingFX()
|
||||
for i=#self.clearingRow,1,-1 do
|
||||
if self.clearingRow[i]>#self.field then
|
||||
@@ -728,7 +1048,7 @@ function Player:removeTopClearingFX()
|
||||
end
|
||||
end
|
||||
if self.clearingRow[1]then
|
||||
self.falling=self.gameEnv.fall
|
||||
self:_updateFalling(self.gameEnv.fall)
|
||||
return false
|
||||
else
|
||||
return true
|
||||
@@ -1004,7 +1324,7 @@ 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.waiting==-1)then
|
||||
if self.holdTime>0 and(ifpre or self.falling==0 and self.waiting==0)then
|
||||
if self.gameEnv.holdMode=='hold'then
|
||||
self:hold_norm(ifpre)
|
||||
elseif self.gameEnv.holdMode=='swap'then
|
||||
@@ -1039,9 +1359,9 @@ function Player:popNext(ifhold)--Pop nextQueue to hand
|
||||
self.spinLast=false
|
||||
self.ctrlCount=0
|
||||
|
||||
self.cur=rem(self.nextQueue,1)
|
||||
self.newNext()
|
||||
if self.cur then
|
||||
if self.nextQueue[1]then
|
||||
self.cur=rem(self.nextQueue,1)
|
||||
self.newNext()
|
||||
self.pieceCount=self.pieceCount+1
|
||||
|
||||
local pressing=self.keyPressing
|
||||
@@ -1251,8 +1571,6 @@ do
|
||||
piece.centX,piece.centY=self.curX+sc[2],self.curY+sc[1]
|
||||
piece.frame,piece.autoLock=self.frameRun,autoLock
|
||||
|
||||
self.waiting=ENV.wait
|
||||
|
||||
--Tri-corner spin check
|
||||
if self.spinLast then
|
||||
if C.id<6 then
|
||||
@@ -1637,6 +1955,9 @@ do
|
||||
end
|
||||
end
|
||||
|
||||
--Fresh ARE
|
||||
self.waiting=ENV.wait
|
||||
|
||||
--Prevent sudden death if hang>0
|
||||
if ENV.hang>ENV.wait and self.nextQueue[1]then
|
||||
local B=self.nextQueue[1]
|
||||
@@ -1699,6 +2020,13 @@ do
|
||||
else
|
||||
self:_triggerEvent('hook_drop')
|
||||
end
|
||||
|
||||
--Remove controling block
|
||||
self.cur=nil
|
||||
|
||||
if self.waiting==0 and self.falling==0 then
|
||||
self:popNext()
|
||||
end
|
||||
end
|
||||
|
||||
function Player:clearFilledLines(start,height)
|
||||
@@ -1708,7 +2036,7 @@ do
|
||||
self:showText(text.clear[min(_cc,21)],0,0,75,'beat',.4)
|
||||
if _cc>6 then self:showText(text.cleared:gsub("$1",_cc),0,55,30,'zoomout',.4)end
|
||||
self:_removeClearedLines()
|
||||
self.falling=self.gameEnv.fall
|
||||
self:_updateFalling(self.gameEnv.fall)
|
||||
self.stat.row=self.stat.row+_cc
|
||||
self.stat.dig=self.stat.dig+_gbcc
|
||||
self.stat.score=self.stat.score+clearSCR[_cc]
|
||||
@@ -2014,7 +2342,7 @@ local function update_alive(P)
|
||||
if P.movDir~=0 then
|
||||
local das,arr=ENV.das,ENV.arr
|
||||
local mov=P.moving
|
||||
if P.waiting==-1 then
|
||||
if P.waiting==0 then
|
||||
if P.movDir==1 then
|
||||
if P.keyPressing[2]then
|
||||
if arr>0 then
|
||||
@@ -2098,26 +2426,25 @@ local function update_alive(P)
|
||||
P.downing=0
|
||||
end
|
||||
|
||||
local stopAtFalling
|
||||
|
||||
--Falling animation
|
||||
if P.falling>=0 then
|
||||
P.falling=P.falling-1
|
||||
if P.falling>=0 then
|
||||
if P.falling>0 then
|
||||
stopAtFalling=true
|
||||
P:_updateFalling(P.falling-1)
|
||||
if P.falling>0 then
|
||||
goto THROW_stop
|
||||
else
|
||||
local L=#P.clearingRow
|
||||
if P.sound and ENV.fall>0 and #P.field+L>P.clearingRow[L]then
|
||||
SFX.play('fall')
|
||||
end
|
||||
P.clearingRow={}
|
||||
end
|
||||
end
|
||||
|
||||
--Update block state
|
||||
if P.control then
|
||||
--Try spawn new block
|
||||
if P.waiting>=0 then
|
||||
P.waiting=P.waiting-1
|
||||
if P.waiting<0 then
|
||||
if not P.cur then
|
||||
if not stopAtFalling and P.waiting>0 then
|
||||
P.waiting=P.waiting-1
|
||||
end
|
||||
if P.waiting<=0 then
|
||||
P:popNext()
|
||||
end
|
||||
goto THROW_stop
|
||||
@@ -2238,15 +2565,8 @@ local function update_dead(P)
|
||||
P.swappingAtkMode=min(P.swappingAtkMode+2,30)
|
||||
end
|
||||
|
||||
if P.falling>=0 then
|
||||
P.falling=P.falling-1
|
||||
if P.falling<0 then
|
||||
local L=#P.clearingRow
|
||||
if P.sound and P.gameEnv.fall>0 and #P.field+L>P.clearingRow[L]then
|
||||
SFX.play('fall')
|
||||
end
|
||||
P.clearingRow={}
|
||||
end
|
||||
if P.falling>0 then
|
||||
P:_updateFalling(P.falling-1)
|
||||
end
|
||||
if P.b2b1>0 then
|
||||
P.b2b1=max(0,P.b2b1*.92-1)
|
||||
@@ -2466,254 +2786,4 @@ function Player:lose(force)
|
||||
end
|
||||
--------------------------<\Event>--------------------------
|
||||
|
||||
--------------------------<Action>--------------------------
|
||||
function Player:act_moveLeft(auto)
|
||||
if not auto then
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
end
|
||||
self.movDir=-1
|
||||
if self.control and self.waiting==-1 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
|
||||
self:freshBlock('move')
|
||||
if not auto then
|
||||
self.moving=0
|
||||
end
|
||||
self.spinLast=false
|
||||
else
|
||||
self.moving=self.gameEnv.das
|
||||
end
|
||||
else
|
||||
self.moving=0
|
||||
end
|
||||
end
|
||||
function Player:act_moveRight(auto)
|
||||
if not auto then
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
end
|
||||
self.movDir=1
|
||||
if self.control and self.waiting==-1 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
|
||||
self:freshBlock('move')
|
||||
if not auto then
|
||||
self.moving=0
|
||||
end
|
||||
self.spinLast=false
|
||||
else
|
||||
self.moving=self.gameEnv.das
|
||||
end
|
||||
else
|
||||
self.moving=0
|
||||
end
|
||||
end
|
||||
function Player:act_rotRight()
|
||||
if self.control and self.waiting==-1 and 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.waiting==-1 and 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.waiting==-1 and self.cur then
|
||||
self.ctrlCount=self.ctrlCount+2
|
||||
self:spin(2)
|
||||
self.keyPressing[5]=false
|
||||
end
|
||||
end
|
||||
function Player:act_hardDrop()
|
||||
local ENV=self.gameEnv
|
||||
if self.control and self.waiting==-1 and self.cur then
|
||||
if self.lastPiece.autoLock and self.frameRun-self.lastPiece.frame<ENV.dropcut then
|
||||
SFX.play('drop_cancel',.3)
|
||||
else
|
||||
if self.curY>self.ghoY then
|
||||
self:createDropFX()
|
||||
self.curY=self.ghoY
|
||||
self.spinLast=false
|
||||
if self.sound then
|
||||
SFX.play('drop',nil,self:getCenterX()*.15)
|
||||
if SETTING.vib>0 then VIB(SETTING.vib+1)end
|
||||
end
|
||||
end
|
||||
if ENV.shakeFX then
|
||||
self.swingOffset.vy=.6
|
||||
self.swingOffset.va=self.swingOffset.va+self:getCenterX()*6e-4
|
||||
end
|
||||
self.lockDelay=-1
|
||||
self:drop()
|
||||
self.keyPressing[6]=false
|
||||
end
|
||||
end
|
||||
end
|
||||
function Player:act_softDrop()
|
||||
local ENV=self.gameEnv
|
||||
self.downing=1
|
||||
if self.control and self.waiting==-1 and self.cur then
|
||||
if self.curY>self.ghoY then
|
||||
self.curY=self.curY-1
|
||||
self:freshBlock('fresh')
|
||||
self.spinLast=false
|
||||
self:checkTouchSound()
|
||||
elseif ENV.deepDrop then
|
||||
local CB=self.cur.bk
|
||||
local y=self.curY-1
|
||||
while self:ifoverlap(CB,self.curX,y)and y>0 do
|
||||
y=y-1
|
||||
end
|
||||
if y>0 then
|
||||
self.ghoY=y
|
||||
self:createDropFX()
|
||||
self.curY=y
|
||||
self:freshBlock('move')
|
||||
SFX.play('swipe')
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function Player:act_hold()
|
||||
if self.control then
|
||||
if self.waiting==-1 then
|
||||
self:hold()
|
||||
self.keyPressing[8]=false
|
||||
end
|
||||
end
|
||||
end
|
||||
function Player:act_func1()
|
||||
self.gameEnv.fkey1(self)
|
||||
end
|
||||
function Player:act_func2()
|
||||
self.gameEnv.fkey2(self)
|
||||
end
|
||||
|
||||
function Player:act_insLeft(auto)
|
||||
if not self.cur then
|
||||
return
|
||||
end
|
||||
local x0=self.curX
|
||||
while not self:ifoverlap(self.cur.bk,self.curX-1,self.curY)do
|
||||
self:createMoveFX('left')
|
||||
self.curX=self.curX-1
|
||||
self:freshBlock('move',true)
|
||||
end
|
||||
if self.curX~=x0 then
|
||||
self.spinLast=false
|
||||
self:checkTouchSound()
|
||||
end
|
||||
if self.gameEnv.shakeFX then
|
||||
self.swingOffset.vx=-1.5
|
||||
end
|
||||
if auto then
|
||||
if self.ctrlCount==0 then
|
||||
self.ctrlCount=1
|
||||
end
|
||||
else
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
end
|
||||
end
|
||||
function Player:act_insRight(auto)
|
||||
if not self.cur then
|
||||
return
|
||||
end
|
||||
local x0=self.curX
|
||||
while not self:ifoverlap(self.cur.bk,self.curX+1,self.curY)do
|
||||
self:createMoveFX('right')
|
||||
self.curX=self.curX+1
|
||||
self:freshBlock('move',true)
|
||||
end
|
||||
if self.curX~=x0 then
|
||||
self.spinLast=false
|
||||
self:checkTouchSound()
|
||||
end
|
||||
if self.gameEnv.shakeFX then
|
||||
self.swingOffset.vx=1.5
|
||||
end
|
||||
if auto then
|
||||
if self.ctrlCount==0 then
|
||||
self.ctrlCount=1
|
||||
end
|
||||
else
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
end
|
||||
end
|
||||
function Player:act_insDown()
|
||||
if self.cur and self.curY>self.ghoY then
|
||||
local ENV=self.gameEnv
|
||||
self:createDropFX()
|
||||
if ENV.shakeFX then
|
||||
self.swingOffset.vy=.5
|
||||
end
|
||||
self.curY=self.ghoY
|
||||
self.lockDelay=ENV.lock
|
||||
self.spinLast=false
|
||||
self:freshBlock('fresh')
|
||||
self:checkTouchSound()
|
||||
end
|
||||
end
|
||||
function Player:act_down1()
|
||||
if self.cur and self.curY>self.ghoY then
|
||||
self:createMoveFX('down')
|
||||
self.curY=self.curY-1
|
||||
self:freshBlock('fresh')
|
||||
self.spinLast=false
|
||||
end
|
||||
end
|
||||
function Player:act_down4()
|
||||
if self.cur and self.curY>self.ghoY then
|
||||
local ghoY0=self.ghoY
|
||||
self.ghoY=max(self.curY-4,self.ghoY)
|
||||
self:createDropFX()
|
||||
self.curY,self.ghoY=self.ghoY,ghoY0
|
||||
self:freshBlock('fresh')
|
||||
self.spinLast=false
|
||||
end
|
||||
end
|
||||
function Player:act_down10()
|
||||
if self.cur and self.curY>self.ghoY then
|
||||
local ghoY0=self.ghoY
|
||||
self.ghoY=max(self.curY-10,self.ghoY)
|
||||
self:createDropFX()
|
||||
self.curY,self.ghoY=self.ghoY,ghoY0
|
||||
self:freshBlock('fresh')
|
||||
self.spinLast=false
|
||||
end
|
||||
end
|
||||
function Player:act_dropLeft()
|
||||
if self.cur then
|
||||
self:act_insLeft()
|
||||
self:act_hardDrop()
|
||||
end
|
||||
end
|
||||
function Player:act_dropRight()
|
||||
if self.cur then
|
||||
self:act_insRight()
|
||||
self:act_hardDrop()
|
||||
end
|
||||
end
|
||||
function Player:act_zangiLeft()
|
||||
if self.cur then
|
||||
self:act_insLeft()
|
||||
self:act_insDown()
|
||||
self:act_insRight()
|
||||
self:act_hardDrop()
|
||||
end
|
||||
end
|
||||
function Player:act_zangiRight()
|
||||
if self.cur then
|
||||
self:act_insRight()
|
||||
self:act_insDown()
|
||||
self:act_insLeft()
|
||||
self:act_hardDrop()
|
||||
end
|
||||
end
|
||||
--------------------------</Action>--------------------------
|
||||
return Player
|
||||
|
||||
@@ -17,6 +17,7 @@ local sList={
|
||||
wait={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
|
||||
fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
|
||||
hang={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
|
||||
hurry={0,1,2,3,4,5,6,7,8,10,1e99},
|
||||
eventSet=EVENTSETS,
|
||||
holdMode={'hold','swap'},
|
||||
}
|
||||
@@ -212,7 +213,8 @@ scene.widgetList={
|
||||
WIDGET.newSelector{name='lock', x=730,y=410,w=260,color='O',list=sList.lock,disp=CUSval('lock'),code=CUSsto('lock')},
|
||||
WIDGET.newSelector{name='wait', x=730,y=520,w=260,color='G',list=sList.wait,disp=CUSval('wait'),code=CUSsto('wait')},
|
||||
WIDGET.newSelector{name='fall', x=730,y=600,w=260,color='G',list=sList.fall,disp=CUSval('fall'),code=CUSsto('fall')},
|
||||
WIDGET.newSelector{name='hang', x=730,y=680,w=260,color='G',list=sList.hang,disp=CUSval('hang'),code=CUSsto('hang')},
|
||||
WIDGET.newSelector{name='hurry', x=730,y=680,w=260,color='G',list=sList.hurry,disp=CUSval('hurry'),code=CUSsto('hurry')},
|
||||
WIDGET.newSelector{name='hang', x=730,y=760,w=260,color='G',list=sList.hang,disp=CUSval('hang'),code=CUSsto('hang')},
|
||||
|
||||
--Copy / Paste / Start
|
||||
WIDGET.newButton{name='copy', x=1070,y=300,w=310,h=70,color='lR',font=25,code=pressKey"cC"},
|
||||
@@ -222,19 +224,19 @@ scene.widgetList={
|
||||
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=pressKey"escape"},
|
||||
|
||||
--Rule set
|
||||
WIDGET.newSelector{name='eventSet', x=1050,y=740,w=340,color='H',list=sList.eventSet,disp=CUSval('eventSet'),code=CUSsto('eventSet')},
|
||||
WIDGET.newSelector{name='eventSet', x=1050,y=760,w=340,color='H',list=sList.eventSet,disp=CUSval('eventSet'),code=CUSsto('eventSet')},
|
||||
|
||||
--Special rules
|
||||
WIDGET.newSwitch{name='ospin', x=850, y=820 ,lim=210,disp=CUSval('ospin'), code=CUSrev('ospin')},
|
||||
WIDGET.newSwitch{name='fineKill', x=850, y=880 ,lim=210,disp=CUSval('fineKill'), code=CUSrev('fineKill')},
|
||||
WIDGET.newSwitch{name='b2bKill', x=850, y=940 ,lim=210,disp=CUSval('b2bKill'), code=CUSrev('b2bKill')},
|
||||
WIDGET.newSwitch{name='lockout', x=850, y=1000,lim=210,disp=CUSval('lockout'), code=CUSrev('lockout')},
|
||||
WIDGET.newSwitch{name='easyFresh', x=1170,y=820 ,lim=250,disp=CUSval('easyFresh'),code=CUSrev('easyFresh')},
|
||||
WIDGET.newSwitch{name='deepDrop', x=1170,y=880 ,lim=250,disp=CUSval('deepDrop'), code=CUSrev('deepDrop')},
|
||||
WIDGET.newSwitch{name='bone', x=1170,y=940 ,lim=250,disp=CUSval('bone'), code=CUSrev('bone')},
|
||||
WIDGET.newSwitch{name='ospin', x=850, y=830, lim=210,disp=CUSval('ospin'), code=CUSrev('ospin')},
|
||||
WIDGET.newSwitch{name='fineKill', x=850, y=890, lim=210,disp=CUSval('fineKill'), code=CUSrev('fineKill')},
|
||||
WIDGET.newSwitch{name='b2bKill', x=850, y=950, lim=210,disp=CUSval('b2bKill'), code=CUSrev('b2bKill')},
|
||||
WIDGET.newSwitch{name='lockout', x=850, y=1010,lim=210,disp=CUSval('lockout'), code=CUSrev('lockout')},
|
||||
WIDGET.newSwitch{name='easyFresh', x=1170,y=830, lim=250,disp=CUSval('easyFresh'),code=CUSrev('easyFresh')},
|
||||
WIDGET.newSwitch{name='deepDrop', x=1170,y=890, lim=250,disp=CUSval('deepDrop'), code=CUSrev('deepDrop')},
|
||||
WIDGET.newSwitch{name='bone', x=1170,y=950, lim=250,disp=CUSval('bone'), code=CUSrev('bone')},
|
||||
|
||||
--Next & Hold
|
||||
WIDGET.newSelector{name='holdMode', x=310, y=890, w=300,color='lY',list=sList.holdMode,disp=CUSval('holdMode'),code=CUSsto('holdMode')},
|
||||
WIDGET.newSelector{name='holdMode', x=310, y=890, w=300,color='lY',list=sList.holdMode,disp=CUSval('holdMode'),code=CUSsto('holdMode'),hideF=function()return CUSTOMENV.holdCount==0 end},
|
||||
WIDGET.newSlider{name='nextCount', x=140, y=960, lim=130,w=180,unit=6,disp=CUSval('nextCount'),code=CUSsto('nextCount')},
|
||||
WIDGET.newSlider{name='holdCount', x=140, y=1030,lim=130,w=180,unit=6,disp=CUSval('holdCount'),code=CUSsto('holdCount')},
|
||||
WIDGET.newSwitch{name='infHold', x=560, y=960, lim=200, disp=CUSval('infHold'),code=CUSrev('infHold'),hideF=function()return CUSTOMENV.holdCount==0 end},
|
||||
|
||||
@@ -12,7 +12,7 @@ local dict--Dict list
|
||||
local result--Result Lable
|
||||
|
||||
local lastTickInput
|
||||
local waiting--Searching animation timer
|
||||
local searchWait--Searching animation timer
|
||||
local selected--Selected option
|
||||
local scrollPos--Scroll down length
|
||||
|
||||
@@ -53,7 +53,7 @@ local function _clearResult()
|
||||
TABLE.cut(result)
|
||||
selected=1
|
||||
scrollPos=0
|
||||
waiting,lastSearch=0,false
|
||||
searchWait,lastSearch=0,false
|
||||
scene.widgetList.copy.hide=false
|
||||
end
|
||||
local function _search()
|
||||
@@ -82,7 +82,7 @@ function scene.sceneInit()
|
||||
inputBox:clear()
|
||||
result={}
|
||||
|
||||
waiting=0
|
||||
searchWait=0
|
||||
selected=1
|
||||
scrollPos=0
|
||||
|
||||
@@ -153,13 +153,13 @@ function scene.update(dt)
|
||||
if #input==0 then
|
||||
_clearResult()
|
||||
else
|
||||
waiting=.8
|
||||
searchWait=.8
|
||||
end
|
||||
lastTickInput=input
|
||||
end
|
||||
if waiting>0 then
|
||||
waiting=waiting-dt
|
||||
if waiting<=0 then
|
||||
if searchWait>0 then
|
||||
searchWait=searchWait-dt
|
||||
if searchWait<=0 then
|
||||
if #input>0 and input~=lastSearch then
|
||||
_search()
|
||||
end
|
||||
@@ -202,7 +202,7 @@ function scene.draw()
|
||||
gc.rectangle('line',300,180,958,526,5)
|
||||
gc.rectangle('line',20,180,280,526,5)
|
||||
|
||||
if waiting>0 then
|
||||
if searchWait>0 then
|
||||
local r=TIME()*2
|
||||
local R=int(r)%7+1
|
||||
gc.setColor(1,1,1,1-abs(r%1*2-1))
|
||||
|
||||
@@ -11,6 +11,14 @@ local t1,t2,animeType
|
||||
local studioLogo--Studio logo text object
|
||||
local logoColor1,logoColor2
|
||||
|
||||
local titleTransform={
|
||||
function(t)gc.translate(0,max(50-t,0)^2/25)end,
|
||||
function(t)gc.translate(0,-max(50-t,0)^2/25)end,
|
||||
function(t,i)local d=max(50-t,0)gc.translate(sin(TIME()*3+626*i)*d,cos(TIME()*3+626*i)*d)end,
|
||||
function(t,i)local d=max(50-t,0)gc.translate(sin(TIME()*3+626*i)*d,-cos(TIME()*3+626*i)*d)end,
|
||||
function(t)gc.setColor(1,1,1,min(t*.02,1)+rnd()*.2)end,
|
||||
}
|
||||
|
||||
local loadingThread=coroutine.wrap(function()
|
||||
DAILYLAUNCH=freshDate'q'
|
||||
if DAILYLAUNCH then
|
||||
@@ -113,7 +121,7 @@ function scene.sceneInit()
|
||||
progress=0
|
||||
maxProgress=10
|
||||
t1,t2=0,0--Timer
|
||||
animeType={}for i=1,8 do animeType[i]=rnd(5)end--Random animation type
|
||||
animeType={}for i=1,#SVG_TITLE_FILL do animeType[i]=rnd(#titleTransform)end--Random animation type
|
||||
end
|
||||
function scene.sceneBack()
|
||||
love.event.quit()
|
||||
@@ -147,13 +155,6 @@ function scene.update(dt)
|
||||
end
|
||||
end
|
||||
|
||||
local titleTransform={
|
||||
function(t)gc.translate(0,max(50-t,0)^2/25)end,
|
||||
function(t)gc.translate(0,-max(50-t,0)^2/25)end,
|
||||
function(t,i)local d=max(50-t,0)gc.translate(sin(TIME()*3+626*i)*d,cos(TIME()*3+626*i)*d)end,
|
||||
function(t,i)local d=max(50-t,0)gc.translate(sin(TIME()*3+626*i)*d,-cos(TIME()*3+626*i)*d)end,
|
||||
function(t)gc.setColor(1,1,1,min(t*.02,1)+rnd()*.2)end,
|
||||
}
|
||||
local titleColor={COLOR.P,COLOR.F,COLOR.V,COLOR.A,COLOR.M,COLOR.N,COLOR.W,COLOR.Y}
|
||||
function scene.draw()
|
||||
gc.clear(.08,.08,.084)
|
||||
@@ -166,7 +167,8 @@ function scene.draw()
|
||||
end
|
||||
gc.push('transform')
|
||||
gc.translate(126,100)
|
||||
for i=1,8 do
|
||||
for i=1,#SVG_TITLE_FILL do
|
||||
local triangles=love.math.triangulate(SVG_TITLE_FILL[i])
|
||||
local t=t1-i*15
|
||||
if t>0 then
|
||||
gc.push('transform')
|
||||
@@ -176,9 +178,12 @@ function scene.draw()
|
||||
gc.translate(0,math.abs(10-dt)-10)
|
||||
end
|
||||
gc.setColor(titleColor[i][1],titleColor[i][2],titleColor[i][3],min(t*.025,1)*.2)
|
||||
gc.polygon('fill',SVG_TITLE[i])
|
||||
for j=1,#triangles do
|
||||
gc.polygon('fill',triangles[j])
|
||||
end
|
||||
gc.setColor(1,1,1,min(t*.025,1))
|
||||
gc.polygon('line',SVG_TITLE[i])
|
||||
gc.polygon('line',SVG_TITLE_LINE[i])
|
||||
if i==8 then gc.polygon('line',SVG_TITLE_LINE[9])end
|
||||
gc.pop()
|
||||
end
|
||||
end
|
||||
|
||||
@@ -20,7 +20,10 @@ local sList={
|
||||
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},
|
||||
wait={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
|
||||
fall={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
|
||||
hang={0,1,2,3,4,5,6,7,8,10,15,20,30,60},
|
||||
hurry={0,1,2,3,4,5,6,7,8,10,1e99},
|
||||
eventSet=EVENTSETS,
|
||||
holdMode={'hold','swap'},
|
||||
}
|
||||
|
||||
local scene={}
|
||||
@@ -87,6 +90,8 @@ scene.widgetList={
|
||||
WIDGET.newSelector{name='lock', x=730,y=410,w=260,color='O',list=sList.lock,disp=ROOMval('lock'),code=ROOMsto('lock')},
|
||||
WIDGET.newSelector{name='wait', x=730,y=520,w=260,color='G',list=sList.wait,disp=ROOMval('wait'),code=ROOMsto('wait')},
|
||||
WIDGET.newSelector{name='fall', x=730,y=600,w=260,color='G',list=sList.fall,disp=ROOMval('fall'),code=ROOMsto('fall')},
|
||||
WIDGET.newSelector{name='hurry', x=730,y=680,w=260,color='G',list=sList.hurry,disp=ROOMval('hurry'),code=ROOMval('hurry')},
|
||||
WIDGET.newSelector{name='hang', x=730,y=760,w=260,color='G',list=sList.hang,disp=ROOMval('hang'),code=ROOMval('hang')},
|
||||
|
||||
--Capacity & Create & Back
|
||||
WIDGET.newSelector{name='capacity', x=1070,y=330,w=310,color='lY',list={2,3,4,5,7,10,17,31,49,99},disp=ROOMval('capacity'),code=ROOMsto('capacity')},
|
||||
@@ -94,18 +99,19 @@ scene.widgetList={
|
||||
WIDGET.newButton{name='back', x=1140,y=640,w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
|
||||
|
||||
--Special rules
|
||||
WIDGET.newSwitch{name='ospin', x=850, y=760 ,lim=210,disp=ROOMval('ospin'), code=ROOMrev('ospin')},
|
||||
WIDGET.newSwitch{name='fineKill', x=850, y=850 ,lim=210,disp=ROOMval('fineKill'), code=ROOMrev('fineKill')},
|
||||
WIDGET.newSwitch{name='b2bKill', x=850, y=940 ,lim=210,disp=ROOMval('b2bKill'), code=ROOMrev('b2bKill')},
|
||||
WIDGET.newSwitch{name='lockout', x=850, y=1030,lim=210,disp=ROOMval('lockout'), code=ROOMval('lockout')},
|
||||
WIDGET.newSwitch{name='easyFresh', x=1170,y=760 ,lim=250,disp=ROOMval('easyFresh'),code=ROOMrev('easyFresh')},
|
||||
WIDGET.newSwitch{name='deepDrop', x=1170,y=850 ,lim=250,disp=ROOMval('deepDrop'), code=ROOMrev('deepDrop')},
|
||||
WIDGET.newSwitch{name='bone', x=1170,y=940 ,lim=250,disp=ROOMval('bone'), code=ROOMrev('bone')},
|
||||
WIDGET.newSwitch{name='ospin', x=850, y=850, lim=210,disp=ROOMval('ospin'), code=ROOMrev('ospin')},
|
||||
WIDGET.newSwitch{name='fineKill', x=850, y=910, lim=210,disp=ROOMval('fineKill'), code=ROOMrev('fineKill')},
|
||||
WIDGET.newSwitch{name='b2bKill', x=850, y=970, lim=210,disp=ROOMval('b2bKill'), code=ROOMrev('b2bKill')},
|
||||
WIDGET.newSwitch{name='lockout', x=850, y=1030,lim=210,disp=ROOMval('lockout'), code=ROOMrev('lockout')},
|
||||
WIDGET.newSwitch{name='easyFresh', x=1170,y=850, lim=250,disp=ROOMval('easyFresh'),code=ROOMrev('easyFresh')},
|
||||
WIDGET.newSwitch{name='deepDrop', x=1170,y=910, lim=250,disp=ROOMval('deepDrop'), code=ROOMrev('deepDrop')},
|
||||
WIDGET.newSwitch{name='bone', x=1170,y=970, lim=250,disp=ROOMval('bone'), code=ROOMrev('bone')},
|
||||
|
||||
--Rule set
|
||||
WIDGET.newSelector{name='eventSet', x=310,y=880,w=360,color='H',list=sList.eventSet,disp=ROOMval('eventSet'),code=ROOMsto('eventSet')},
|
||||
WIDGET.newSelector{name='eventSet', x=1050,y=760,w=340,color='H',list=sList.eventSet,disp=ROOMval('eventSet'),code=ROOMval('eventSet')},
|
||||
|
||||
--Next & Hold
|
||||
WIDGET.newSelector{name='holdMode', x=310, y=890, w=300,color='lY',list=sList.holdMode,disp=ROOMval('holdMode'),code=ROOMval('holdMode'),hideF=function()return CUSTOMENV.holdCount==0 end},
|
||||
WIDGET.newSlider{name='nextCount', x=140, y=960, lim=130,w=200,unit=6,disp=ROOMval('nextCount'),code=ROOMsto('nextCount')},
|
||||
WIDGET.newSlider{name='holdCount', x=140, y=1030,lim=130,w=200,unit=6,disp=ROOMval('holdCount'),code=ROOMsto('holdCount')},
|
||||
WIDGET.newSwitch{name='infHold', x=560, y=960, lim=200, disp=ROOMval('infHold'),code=ROOMrev('infHold'),hideF=function()return ROOMENV.holdCount==0 end},
|
||||
|
||||
@@ -31,24 +31,25 @@ function scene.draw()
|
||||
end
|
||||
|
||||
scene.widgetList={
|
||||
WIDGET.newText{name='title', x=640,y=15,font=80},
|
||||
WIDGET.newText{name='title', x=640,y=15,font=80},
|
||||
|
||||
WIDGET.newButton{name='graphic', x=200, y=80, w=240,h=80,color='lC',font=35,code=swapScene('setting_video','swipeR')},
|
||||
WIDGET.newButton{name='sound', x=1080, y=80, w=240,h=80,color='lC',font=35,code=swapScene('setting_sound','swipeL')},
|
||||
WIDGET.newButton{name='graphic', x=200, y=80, w=240,h=80,color='lC',font=35,code=swapScene('setting_video','swipeR')},
|
||||
WIDGET.newButton{name='sound', x=1080, y=80, w=240,h=80,color='lC',font=35,code=swapScene('setting_sound','swipeL')},
|
||||
|
||||
WIDGET.newButton{name='layout', x=250, y=540, w=200,h=70,font=35,code=goScene'setting_skin'},
|
||||
WIDGET.newButton{name='layout', x=250, y=540, w=200,h=70,font=35,code=goScene'setting_skin'},
|
||||
|
||||
WIDGET.newButton{name='ctrl', x=290, y=220, w=320,h=80,font=35,code=goScene'setting_control'},
|
||||
WIDGET.newButton{name='key', x=640, y=220, w=320,h=80,color=MOBILE and'dH',font=35,code=goScene'setting_key'},
|
||||
WIDGET.newButton{name='touch', x=990, y=220, w=320,h=80,color=not MOBILE and'dH',font=35,code=goScene'setting_touch'},
|
||||
WIDGET.newSlider{name='reTime', x=330, y=320, w=300,lim=180,unit=10,disp=SETval('reTime'), code=SETsto('reTime'),show=function(S)return(.5+S.disp()*.25).."s"end},
|
||||
WIDGET.newSelector{name='RS', x=300, y=420, w=300,color='S', disp=SETval('RS'), code=SETsto('RS'),list={'TRS','SRS','SRS_plus','SRS_X','BiRS','ARS_Z','ASC','ASC_plus','C2','C2_sym','Classic','Classic_plus','None','None_plus'}},
|
||||
WIDGET.newSelector{name='menuPos', x=980, y=320, w=300,color='O', disp=SETval('menuPos'), code=SETsto('menuPos'),list={'left','middle','right'}},
|
||||
WIDGET.newSwitch{name='sysCursor' ,x=1060, y=390, lim=580, disp=SETval('sysCursor'),code=function()SETTING.sysCursor=not SETTING.sysCursor applyCursor()end},
|
||||
WIDGET.newSwitch{name='autoPause', x=1060, y=450, lim=580, disp=SETval('autoPause'),code=SETrev('autoPause')},
|
||||
WIDGET.newSwitch{name='autoSave', x=1060, y=500, lim=580, disp=SETval('autoSave'), code=SETrev('autoSave')},
|
||||
WIDGET.newSwitch{name='autoLogin', x=960, y=580, lim=480, disp=SETval('autoLogin'),code=SETrev('autoLogin')},
|
||||
WIDGET.newSwitch{name='simpMode', x=960, y=640, lim=480, disp=SETval('simpMode'),
|
||||
WIDGET.newButton{name='ctrl', x=290, y=220, w=320,h=80,font=35,code=goScene'setting_control'},
|
||||
WIDGET.newButton{name='key', x=640, y=220, w=320,h=80,color=MOBILE and'dH',font=35, code=goScene'setting_key'},
|
||||
WIDGET.newButton{name='touch', x=990, y=220, w=320,h=80,color=not MOBILE and'dH',font=35, code=goScene'setting_touch',hideF=function()return not SETTING.VKSwitch end},
|
||||
WIDGET.newSwitch{name='showVK', x=1100, y=150, lim=400, disp=SETval('VKSwitch'), code=SETrev('VKSwitch')},
|
||||
WIDGET.newSlider{name='reTime', x=330, y=320, w=300,lim=180,unit=10,disp=SETval('reTime'), code=SETsto('reTime'),show=function(S)return(.5+S.disp()*.25).."s"end},
|
||||
WIDGET.newSelector{name='RS', x=300, y=420, w=300,color='S', disp=SETval('RS'), code=SETsto('RS'),list={'TRS','SRS','SRS_plus','SRS_X','BiRS','ARS_Z','ASC','ASC_plus','C2','C2_sym','Classic','Classic_plus','None','None_plus'}},
|
||||
WIDGET.newSelector{name='menuPos',x=980, y=320, w=300,color='O', disp=SETval('menuPos'), code=SETsto('menuPos'),list={'left','middle','right'}},
|
||||
WIDGET.newSwitch{name='sysCursor',x=1060, y=390, lim=580, disp=SETval('sysCursor'),code=function()SETTING.sysCursor=not SETTING.sysCursor applyCursor()end},
|
||||
WIDGET.newSwitch{name='autoPause',x=1060, y=450, lim=580, disp=SETval('autoPause'),code=SETrev('autoPause')},
|
||||
WIDGET.newSwitch{name='autoSave', x=1060, y=500, lim=580, disp=SETval('autoSave'), code=SETrev('autoSave')},
|
||||
WIDGET.newSwitch{name='autoLogin',x=960, y=580, lim=480, disp=SETval('autoLogin'),code=SETrev('autoLogin')},
|
||||
WIDGET.newSwitch{name='simpMode', x=960, y=640, lim=480, disp=SETval('simpMode'),
|
||||
code=function()
|
||||
SETTING.simpMode=not SETTING.simpMode
|
||||
for i=1,#SCN.stack,2 do
|
||||
@@ -58,7 +59,7 @@ scene.widgetList={
|
||||
end
|
||||
end
|
||||
end},
|
||||
WIDGET.newButton{name='back', x=1140, y=640, w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
|
||||
WIDGET.newButton{name='back', x=1140, y=640, w=170,h=80,font=60,fText=CHAR.icon.back,code=backScene},
|
||||
}
|
||||
|
||||
return scene
|
||||
|
||||
@@ -62,6 +62,7 @@ local function _nextSkin(i)
|
||||
SETTING.skin[i]=SETTING.skin[i]%16+1
|
||||
end
|
||||
local function _nextDir(i)
|
||||
trySettingWarn()
|
||||
SETTING.face[i]=(SETTING.face[i]+1)%4
|
||||
minoRot0[i]=minoRot0[i]+1.5707963
|
||||
if not selEggMode and not GAME.playing then
|
||||
|
||||
@@ -5,7 +5,7 @@ function scene.sceneInit()
|
||||
end
|
||||
|
||||
function scene.draw()
|
||||
if SETTING.VKSwitch and SETTING.VKTrack then
|
||||
if SETTING.VKTrack then
|
||||
love.graphics.setColor(1,1,1)
|
||||
setFont(30)
|
||||
mStr(text.VKTchW,140+500*SETTING.VKTchW,800-WIDGET.scrollPos)
|
||||
@@ -15,9 +15,17 @@ function scene.draw()
|
||||
end
|
||||
|
||||
local function _VKAdisp(n)return function()return VK_ORG[n].ava end end
|
||||
local function _VKAcode(n)return function()VK_ORG[n].ava=not VK_ORG[n].ava end end
|
||||
local function _notShow()return not SETTING.VKSwitch end
|
||||
local function _notTrack()return not(SETTING.VKSwitch and SETTING.VKTrack)end
|
||||
local function _VKAcode(n)
|
||||
return n<10 and
|
||||
function()
|
||||
VK_ORG[n].ava=not VK_ORG[n].ava
|
||||
trySettingWarn()
|
||||
end or
|
||||
function()
|
||||
VK_ORG[n].ava=not VK_ORG[n].ava
|
||||
end
|
||||
end
|
||||
local function _notTrack()return not SETTING.VKTrack end
|
||||
|
||||
scene.widgetScrollHeight=340
|
||||
scene.widgetList={
|
||||
@@ -44,13 +52,12 @@ scene.widgetList={
|
||||
|
||||
WIDGET.newButton{name='norm', x=840, y=80, w=240,h=80, font=35,code=function()for i=1,20 do VK_ORG[i].ava=i<11 end end},
|
||||
WIDGET.newButton{name='pro', x=1120, y=80, w=240,h=80, font=35,code=function()for i=1,20 do VK_ORG[i].ava=true end end},
|
||||
WIDGET.newSwitch{name='hide', x=1150, y=200, lim=400, font=40,disp=SETval('VKSwitch'),code=SETrev('VKSwitch')},
|
||||
WIDGET.newSwitch{name='icon', x=1150, y=300, lim=400, font=40,disp=SETval('VKIcon'),code=SETrev('VKIcon'),hideF=_notShow},
|
||||
WIDGET.newSlider{name='sfx', x=830, y=380, lim=160,w=400, font=35,change=function()SFX.play('virtualKey',SETTING.VKSFX)end,disp=SETval('VKSFX'),code=SETsto('VKSFX'),hideF=_notShow},
|
||||
WIDGET.newSlider{name='vib', x=830, y=450, lim=160,w=400,unit=6, font=35,change=function()if SETTING.vib>0 then VIB(SETTING.vib+SETTING.VKVIB)end end,disp=SETval('VKVIB'),code=SETsto('VKVIB'),hideF=_notShow},
|
||||
WIDGET.newSlider{name='alpha', x=830, y=520, lim=160,w=400, font=40,disp=SETval('VKAlpha'),code=SETsto('VKAlpha'),hideF=_notShow},
|
||||
WIDGET.newSwitch{name='icon', x=1150, y=240, lim=400, font=35,disp=SETval('VKIcon'),code=SETrev('VKIcon')},
|
||||
WIDGET.newSlider{name='sfx', x=830, y=320, lim=160,w=400, font=35,change=function()SFX.play('virtualKey',SETTING.VKSFX)end,disp=SETval('VKSFX'),code=SETsto('VKSFX')},
|
||||
WIDGET.newSlider{name='vib', x=830, y=390, lim=160,w=400,unit=6, font=35,change=function()if SETTING.vib>0 then VIB(SETTING.vib+SETTING.VKVIB)end end,disp=SETval('VKVIB'),code=SETsto('VKVIB')},
|
||||
WIDGET.newSlider{name='alpha', x=830, y=460, lim=160,w=400, font=35,disp=SETval('VKAlpha'),code=SETsto('VKAlpha')},
|
||||
|
||||
WIDGET.newSwitch{name='track', x=360, y=720, lim=250, font=35,disp=SETval('VKTrack'),code=SETrev('VKTrack'),hideF=_notShow},
|
||||
WIDGET.newSwitch{name='track', x=360, y=720, lim=250, font=35,disp=SETval('VKTrack'),code=SETrev('VKTrack')},
|
||||
WIDGET.newSwitch{name='dodge', x=800, y=720, lim=250, font=35,disp=SETval('VKDodge'),code=SETrev('VKDodge'),hideF=_notTrack},
|
||||
WIDGET.newSlider{name='tchW', x=140, y=860, w=1000, font=35,disp=SETval('VKTchW'),code=function(i)SETTING.VKTchW=i SETTING.VKCurW=math.max(SETTING.VKCurW,i)end,hideF=_notTrack},
|
||||
WIDGET.newSlider{name='curW', x=140, y=930, w=1000, font=35,disp=SETval('VKCurW'),code=function(i)SETTING.VKCurW=i SETTING.VKTchW=math.min(SETTING.VKTchW,i)end,hideF=_notTrack},
|
||||
|
||||
@@ -69,38 +69,37 @@ end
|
||||
gc.setDefaultFilter('linear','linear')
|
||||
|
||||
|
||||
TEXTURE.title=NSC(1160,236)--Title image (Middle: 580,118)
|
||||
TEXTURE.title=NSC(1040,236)--Title image (Middle: 580,118)
|
||||
do
|
||||
for i=1,8 do
|
||||
local triangles=love.math.triangulate(SVG_TITLE[i])
|
||||
gc.setLineWidth(12)
|
||||
gc.translate(10,10)
|
||||
for i=1,#SVG_TITLE_FILL do
|
||||
local triangles=love.math.triangulate(SVG_TITLE_FILL[i])
|
||||
|
||||
gc.translate(12*i,i==1 and 8 or 14)
|
||||
|
||||
gc.setLineWidth(16)
|
||||
gc.setColor(COLOR.Z)
|
||||
gc.polygon('line',SVG_TITLE[i])
|
||||
gc.polygon('line',SVG_TITLE_FILL[i])
|
||||
|
||||
gc.setColor(.2,.2,.2)
|
||||
for j=1,#triangles do
|
||||
gc.polygon('fill',triangles[j])
|
||||
end
|
||||
|
||||
gc.translate(-12*i,i==1 and -8 or -14)
|
||||
end
|
||||
gc.translate(-10,-10)
|
||||
end
|
||||
|
||||
TEXTURE.title_color=NSC(1160,236)--Title image (colored)
|
||||
TEXTURE.title_color=NSC(1040,236)--Title image (colored)
|
||||
do
|
||||
local titleColor={COLOR.P,COLOR.F,COLOR.V,COLOR.A,COLOR.M,COLOR.N,COLOR.W,COLOR.Y}
|
||||
|
||||
gc.translate(10,10)
|
||||
for i=1,8 do
|
||||
local triangles=love.math.triangulate(SVG_TITLE[i])
|
||||
local triangles=love.math.triangulate(SVG_TITLE_FILL[i])
|
||||
|
||||
gc.translate(12*i,i==1 and 8 or 14)
|
||||
|
||||
gc.setLineWidth(16)
|
||||
gc.setLineWidth(12)
|
||||
gc.setColor(COLOR.Z)
|
||||
gc.polygon('line',SVG_TITLE[i])
|
||||
gc.polygon('line',SVG_TITLE_FILL[i])
|
||||
|
||||
gc.setLineWidth(4)
|
||||
gc.setColor(COLOR.D)
|
||||
@@ -109,14 +108,11 @@ do
|
||||
end
|
||||
|
||||
gc.setColor(.2+.8*titleColor[i][1],.2+.8*titleColor[i][2],.2+.8*titleColor[i][3],.3)
|
||||
gc.translate(-4,-4)
|
||||
for j=1,#triangles do
|
||||
gc.polygon('fill',triangles[j])
|
||||
end
|
||||
gc.translate(4,4)
|
||||
|
||||
gc.translate(-12*i,i==1 and -8 or -14)
|
||||
end
|
||||
gc.translate(-10,-10)
|
||||
end
|
||||
|
||||
TEXTURE.multiple=GC.DO{15,15,
|
||||
|
||||
@@ -3,30 +3,36 @@ return[=[
|
||||
Tetro-1010(2C2N, 重力); Tetra-link(桌游)
|
||||
噗哟; 泡泡龙; 求合体; 坦克大战; 扫雷; 接水管; 记忆
|
||||
其他未来内容:
|
||||
组队战; 实时统计数据可视化; 教学关; 从录像继续
|
||||
重做模式选择UI; 重做模组UI; 加速下落; spike相关统计数据
|
||||
实时统计数据可视化; 教学关脚本语言; 从录像继续
|
||||
模式系统重做; 重做模组UI; 加速下落; spike相关统计数据
|
||||
支持更多手柄; 场地格边缘线; 模式数据分析; 高级自定义序列
|
||||
等级系统; 成就系统; 手势操作; C2连击; 特殊控件(虚拟摇杆等)
|
||||
方块位移/旋转动画; 更细节的DAS选项; 拓展主题系统
|
||||
可调攻击系统; 更多消除方式; 可调场地宽度; 新联网游戏场景切换逻辑
|
||||
工程编译到字节码; task-Z(新AI); 自适应UI; 多方块
|
||||
组队战; 方块位移/旋转动画; 更细节的DAS选项; 拓展主题系统
|
||||
更自由的攻击系统; 更多消除方式; 可调场地宽度; 新联网游戏场景切换逻辑
|
||||
task-Z(新AI); 自适应UI; 多方块
|
||||
|
||||
0.17.0: 硬着陆 Hard Landing
|
||||
新增:
|
||||
新模式:大爆炸
|
||||
新模式:策略堆叠(原设计来自游戏Cambridge, by NOT_A_ROBOT)
|
||||
添加lockout判负规则(默认关闭)
|
||||
新机制:出块延迟打断(ARE打断)(默认关闭) #471
|
||||
添加锁定在外判负(lockout)规则(默认关闭)
|
||||
全局默认使用5帧窒息延迟
|
||||
尝试支持摇杆和扳机
|
||||
支持摇杆和扳机(参数暂时不能调整)
|
||||
改动:
|
||||
TRS的S/Z添加四个踢墙防止在一些地方卡死
|
||||
调整游戏大logo为正体字
|
||||
软降n格的键也可以触发深降
|
||||
出块/消行延迟逻辑修正,现在真的是0延迟,不再有一帧等待了
|
||||
生成位置预览开启后hold的生成位置也可见 #453
|
||||
TRS的S/Z添加四个踢墙防止在一些地方卡死
|
||||
优化pc训练模式体验,添加胜利条件,不再无尽
|
||||
堆积模式添加15帧的窒息延迟 #465
|
||||
小程序arm加入计时器和重置按钮
|
||||
修改部分不常用设置时会显示警告
|
||||
代码:
|
||||
bgm模块可限制最大加载数,不容易达到上限导致没声 #447
|
||||
bgm模块可限制最大加载数,不容易达到上限导致没声 #447
|
||||
语音模块支持设置轻微随机音调偏移半径(游戏内固定使用1)
|
||||
较大规模整理玩家相关代码,重构出块延迟和消行延迟逻辑
|
||||
修复:
|
||||
机翻语言超级消除无行数显示 #462
|
||||
竞速-效率左侧信息颜色问题
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
return{
|
||||
["apkCode"]=406,
|
||||
["apkCode"]=408,
|
||||
["code"]=1700,
|
||||
["string"]="V0.17.0",
|
||||
["room"]="ver A-2",
|
||||
|
||||
Reference in New Issue
Block a user