Compare commits

..

1 Commits

Author SHA1 Message Date
MrZ_26
4652be7067 0.8.14 2020-04-30 01:23:11 +08:00
14 changed files with 286 additions and 169 deletions

View File

@@ -1,4 +1,4 @@
gameVersion="Alpha V0.8.13" gameVersion="Alpha V0.8.14"
function love.conf(t) function love.conf(t)
t.identity="Techmino"--SaveDir name t.identity="Techmino"--SaveDir name
t.version="11.1" t.version="11.1"

View File

@@ -11,7 +11,8 @@ setting={
--game --game
ghost=true,center=true, ghost=true,center=true,
smo=true,grid=false, smooth=true,grid=false,
lockFX=2,
dropFX=3, dropFX=3,
shakeFX=2, shakeFX=2,
atkFX=3, atkFX=3,

View File

@@ -243,7 +243,8 @@ return{
center="旋转中心", center="旋转中心",
bg="背景", bg="背景",
bgspace="星空背景", bgspace="星空背景",
smo="平滑下落", smooth="平滑下落",
lockFX="锁定特效等级",
dropFX="下落特效等级", dropFX="下落特效等级",
shakeFX="晃动特效等级", shakeFX="晃动特效等级",
atkFX="攻击特效等级", atkFX="攻击特效等级",
@@ -279,7 +280,8 @@ return{
prev5="",next5="",spin5="R", prev5="",next5="",spin5="R",
prev6="",next6="",spin6="R", prev6="",next6="",spin6="R",
prev7="",next7="",spin7="R", prev7="",next7="",spin7="R",
reset="重置方向", skinR="重置配色",
faceR="重置方向",
back=BK, back=BK,
}, },
setting_touch={ setting_touch={

View File

@@ -240,7 +240,8 @@ return{
center="旋转中心", center="旋转中心",
bg="背景", bg="背景",
bgspace="星空背景", bgspace="星空背景",
smo="平滑下落", smooth="平滑下落",
lockFX="锁定特效等级",
dropFX="下落特效等级", dropFX="下落特效等级",
shakeFX="晃动特效等级", shakeFX="晃动特效等级",
atkFX="攻击特效等级", atkFX="攻击特效等级",
@@ -276,7 +277,8 @@ return{
prev5="",next5="",spin5="", prev5="",next5="",spin5="",
prev6="",next6="",spin6="", prev6="",next6="",spin6="",
prev7="",next7="",spin7="", prev7="",next7="",spin7="",
reset="重置方向", skinR="重置配色",
faceR="重置方向",
back=BK, back=BK,
}, },
setting_touch={ setting_touch={

View File

@@ -239,7 +239,8 @@ Lib used:
center="Center", center="Center",
bg="Background", bg="Background",
bgspace="BG space", bgspace="BG space",
smo="Smoooth drop", smooth="Smooth drop",
lockFX="Lock FX level",
dropFX="Drop FX level", dropFX="Drop FX level",
shakeFX="Shake FX level", shakeFX="Shake FX level",
atkFX="ATK FX level", atkFX="ATK FX level",
@@ -275,7 +276,8 @@ Lib used:
prev5="",next5="",spin5="R", prev5="",next5="",spin5="R",
prev6="",next6="",spin6="R", prev6="",next6="",spin6="R",
prev7="",next7="",spin7="R", prev7="",next7="",spin7="R",
reset="reset Dir", skinR="reset Color",
faceR="reset Dir",
back=BK, back=BK,
}, },
setting_touch={ setting_touch={

View File

@@ -178,6 +178,16 @@ local touchDown,touchUp,touchMove={},{},{}
local keyDown,keyUp={},{} local keyDown,keyUp={},{}
local gamepadDown,gamepadUp={},{} local gamepadDown,gamepadUp={},{}
function mouseDown.load()
sceneTemp.skip=true
end
function keyDown.load()
sceneTemp.skip=true
end
function touchDown.load()
sceneTemp.skip=true
end
function mouseDown.intro(x,y,k) function mouseDown.intro(x,y,k)
if k==2 then if k==2 then
VOICE("bye") VOICE("bye")
@@ -729,9 +739,9 @@ function wheelMoved.history(x,y)
end end
function keyDown.history(key) function keyDown.history(key)
if key=="up"then if key=="up"then
sceneTemp[2]=max(sceneTemp[2]-10,1) sceneTemp[2]=max(sceneTemp[2]-3,1)
elseif key=="down"then elseif key=="down"then
sceneTemp[2]=min(sceneTemp[2]+10,#sceneTemp[1]-22) sceneTemp[2]=min(sceneTemp[2]+3,#sceneTemp[1]-22)
elseif key=="escape"then elseif key=="escape"then
scene.back() scene.back()
end end
@@ -813,7 +823,7 @@ local function widgetControl_gamepad(i)
end end
end end
end end
local lastX,lastY--last clickDown pos local lastX,lastY=0,0--last clickDown pos
function love.mousepressed(x,y,k,t,num) function love.mousepressed(x,y,k,t,num)
if t then return end if t then return end
mouseShow=true mouseShow=true
@@ -830,8 +840,7 @@ function love.mousepressed(x,y,k,t,num)
widgetPress(widget_sel,mx,my) widgetPress(widget_sel,mx,my)
end end
end end
lastX=mx lastX,lastY=mx,my
lastY=my
end end
function love.mousemoved(x,y,dx,dy,t) function love.mousemoved(x,y,dx,dy,t)
if t then return end if t then return end
@@ -1284,6 +1293,7 @@ function love.errorhandler(msg)
local function _(_)CAP=gc.newImage(_)end local function _(_)CAP=gc.newImage(_)end
gc.captureScreenshot(_) gc.captureScreenshot(_)
gc.present() gc.present()
setting.sfx=setting.voc--only for error "voice" played with voice volume,not saved
if SFX.list.error then SFX.play("error",.8)end if SFX.list.error then SFX.play("error",.8)end
local BGcolor=rnd()>.026 and{.3,.5,.9},{.62,.3,.926} local BGcolor=rnd()>.026 and{.3,.5,.9},{.62,.3,.926}
local needDraw=true local needDraw=true
@@ -1311,6 +1321,7 @@ function love.errorhandler(msg)
setFont(38)gc.printf(text.errorMsg,100,200,1280-100) setFont(38)gc.printf(text.errorMsg,100,200,1280-100)
setFont(20) setFont(20)
gc.print(system.."-"..gameVersion,100,660) gc.print(system.."-"..gameVersion,100,660)
gc.print("scene:"..scene.cur,400,660)
gc.printf(err[1],626,360,1260-626) gc.printf(err[1],626,360,1260-626)
gc.print("TRACEBACK",626,426) gc.print("TRACEBACK",626,426)
for i=4,#err-2 do for i=4,#err-2 do

View File

@@ -51,7 +51,7 @@ return{
end end
end end
end, end,
bg="game4",bgm="way", bg="game4",bgm="shining terminal",
}, },
pauseLimit=true, pauseLimit=true,
load=function() load=function()

View File

@@ -28,13 +28,15 @@ if setting.lang==1 then
"使用love2d引擎制作", "使用love2d引擎制作",
"有疑问?先看设置有没有你想要的", "有疑问?先看设置有没有你想要的",
"有建议的话可以把信息反馈给作者~", "有建议的话可以把信息反馈给作者~",
"不要按F8", "不要按F10",
"秘密数字:626", "秘密数字:626",
"CLASSIC SEXY RUSSIAN BLOCKS", "CLASSIC SEXY RUSSIAN BLOCKS",
"戴上耳机以获得最佳体验", "戴上耳机以获得最佳体验",
"少女祈祷中", "少女祈祷中",
"按键/点击以全力加载,跳过动画",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI "LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI
"(第一次才准)今日幸运数字:"..math.random(100,626), "RUR'U'R'FR2U'R'U'RUR'F'",
"Am G F G",
} }
elseif setting.lang==2 then elseif setting.lang==2 then
L={ L={
@@ -65,13 +67,15 @@ elseif setting.lang==2 then
"使用love2d引擎制作", "使用love2d引擎制作",
"有疑问?先看设置有没有你想要的", "有疑问?先看设置有没有你想要的",
"有建议的话可以把信息反馈给作者~", "有建议的话可以把信息反馈给作者~",
"不要按F8", "不要按F10",
"秘密数字:626", "秘密数字:626",
"CLASSIC SEXY RUSSIAN BLOCKS", "CLASSIC SEXY RUSSIAN BLOCKS",
"戴上耳机以获得最佳体验", "戴上耳机以获得最佳体验",
"少女祈祷中", "少女祈祷中",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI "按键/点击以全力加载,跳过动画",
"(第一次才准)今日幸运数字:"..math.random(100,626), "LrL,RlR LLr,RRl RRR/LLL F!!",
"RUR'U'R'FR2U'R'U'RUR'F'",
"Am G F G",
} }
elseif setting.lang==3 then elseif setting.lang==3 then
L={ L={
@@ -102,13 +106,16 @@ elseif setting.lang==3 then
"Powered by love2d", "Powered by love2d",
"Find out what's in the setting!", "Find out what's in the setting!",
"Any suggestions to author!", "Any suggestions to author!",
"DO NOT PRESS F8", "DO NOT PRESS F10",
"Secret num:626", "Secret num:626",
"Techmino=Technique+Tetromino", "Techmino=Technique+Tetromino",
"CLASSIC SEXY RUSSIAN BLOCKS", "CLASSIC SEXY RUSSIAN BLOCKS",
"Headphones for better experience", "Headphones for better experience",
"少女祈禱中", "少女祈禱中",
"LrL,RlR LLr,RRl RRR/LLL F!!",--ZSLJTTI "any-key/click to skip loading animation",
"RUR'U'R'FR2U'R'U'RUR'F'",
"Am G F G",
"LrL,RlR LLr,RRl RRR/LLL F!!",
} }
end end
return L[math.random(#L)] return L[math.random(#L)]

View File

@@ -1,13 +1,3 @@
local O,_=true,false
local L={
{{_,O,O},{O,O,_}}, --Z
{{O,O,_},{_,O,O}}, --S
{{O,O,O},{_,_,O}}, --L
{{O,O,O},{O,_,_}}, --J
{{O,O,O},{_,O,_}}, --T
{{O,O},{O,O}}, --O
{{O,O,O,O}}, --I
}
local function RotCW(B) local function RotCW(B)
local N={} local N={}
local r,c=#B,#B[1]--row,col local r,c=#B,#B[1]--row,col
@@ -19,14 +9,16 @@ local function RotCW(B)
end end
return N return N
end end
local O,_=true,false
-- [1,1,1] local L={
-- [0,0,1]--r=2,c=3 {{_,O,O},{O,O,_}}, --Z
-- ↓ (Y inv) {{O,O,_},{_,O,O}}, --S
-- [1,1] {{O,O,O},{_,_,O}}, --L
-- [1,0] {{O,O,O},{O,_,_}}, --J
-- [1,0] {{O,O,O},{_,O,_}}, --T
{{O,O},{O,O}}, --O
{{O,O,O,O}}, --I
}
for i=1,#L do for i=1,#L do
local B=L[i] local B=L[i]
L[i]={[0]=B} L[i]={[0]=B}

View File

@@ -12,7 +12,10 @@ local gameEnv0={
sddas=2,sdarr=2, sddas=2,sdarr=2,
quickR=true,swap=true, quickR=true,swap=true,
ghost=true,center=true, ghost=true,center=true,
grid=false,swap=true, smooth=false,grid=false,
lockFX=3,dropFX=3,
shakeFX=3,
_20G=false,bone=false, _20G=false,bone=false,
drop=60,lock=60, drop=60,lock=60,
wait=0,fall=0, wait=0,fall=0,
@@ -31,6 +34,7 @@ local gameEnv0={
fine=false,fineKill=false, fine=false,fineKill=false,
target=1e99,dropPiece=NULL, target=1e99,dropPiece=NULL,
mindas=0,minarr=0,minsdarr=0, mindas=0,minarr=0,minsdarr=0,
bg="none",bgm="race" bg="none",bgm="race"
} }
local comboAtk={0,0,1,1,2,2,2,3,3,4,3}--2 else local comboAtk={0,0,1,1,2,2,2,3,3,4,3}--2 else
@@ -180,7 +184,7 @@ local function Pdraw_norm(P)
end end
end end
else--field block only else--field block only
local dy,stepY=0,setting.smo and(P.falling/(P.gameEnv.fall+1))^2.5*30 or 30 local dy,stepY=0,P.gameEnv.smooth and(P.falling/(P.gameEnv.fall+1))^2.5*30 or 30
local A=P.falling/P.gameEnv.fall local A=P.falling/P.gameEnv.fall
local h,H=1,#P.field local h,H=1,#P.field
for j=int(P.fieldBeneath/30+1),H do for j=int(P.fieldBeneath/30+1),H do
@@ -200,15 +204,25 @@ local function Pdraw_norm(P)
end end
gc.translate(0,dy) gc.translate(0,dy)
end--Field with falling animation end--Field with falling animation
for i=1,#P.shade do for i=1,#P.lockFX do
local S=P.shade[i] local _=P.lockFX[i]
gc.setColor(1,1,1,S[1]*.12) if _[3]<.5 then
for x=S[3],S[5]do gc.setColor(1,1,1,2*_[3])
for y=S[6],S[4]do gc.rectangle("fill",_[1],_[2],60*_[3],30)
drawPixel(y,x,S[2]) else
gc.setColor(1,1,1,2-2*_[3])
gc.rectangle("fill",_[1]+30,_[2],60*_[3]-60,30)
end
end--lockFX
for i=1,#P.dropFX do
local _=P.dropFX[i]
gc.setColor(1,1,1,_[1]*.12)
for x=_[3],_[5]do
for y=_[6],_[4]do
drawPixel(y,x,_[2])
end end
end end
end--shade FX end--dropFX
if P.waiting==-1 then if P.waiting==-1 then
if P.gameEnv.ghost then if P.gameEnv.ghost then
gc.setColor(1,1,1,.3) gc.setColor(1,1,1,.3)
@@ -218,9 +232,9 @@ local function Pdraw_norm(P)
end end
end end end end
end--Ghost end--Ghost
-- local dy=setting.smo and(P.y_img~=P.curY and or 1)^4*30 or 0 -- local dy=setting.smooth and(P.y_img~=P.curY and or 1)^4*30 or 0
local dy local dy
if setting.smo then if P.gameEnv.smooth then
if P.y_img~=P.curY then if P.y_img~=P.curY then
dy=(min(P.dropDelay,1e99)/P.gameEnv.drop-1)*30 dy=(min(P.dropDelay,1e99)/P.gameEnv.drop-1)*30
else else
@@ -438,7 +452,7 @@ local function Pdraw_demo(P)
end end
end end
else--field block only else--field block only
local dy,stepY=0,setting.smo and(P.falling/(P.gameEnv.fall+1))^2.5*30 or 30 local dy,stepY=0,P.gameEnv.smooth and(P.falling/(P.gameEnv.fall+1))^2.5*30 or 30
local A=P.falling/P.gameEnv.fall local A=P.falling/P.gameEnv.fall
local h,H=1,#P.field local h,H=1,#P.field
for j=int(P.fieldBeneath/30+1),H do for j=int(P.fieldBeneath/30+1),H do
@@ -458,15 +472,25 @@ local function Pdraw_demo(P)
end end
gc.translate(0,dy) gc.translate(0,dy)
end--Field with falling animation end--Field with falling animation
for i=1,#P.shade do for i=1,#P.lockFX do
local S=P.shade[i] local _=P.lockFX[i]
if _[3]<.5 then
gc.setColor(1,1,1,3*_[3])
gc.rectangle("fill",_[1],_[2],60*_[3],30)
else
gc.setColor(1,1,1,3-3*_[3])
gc.rectangle("fill",_[1]+30,_[2],60*_[3]-60,30)
end
end--lockFX
for i=1,#P.dropFX do
local S=P.dropFX[i]
gc.setColor(1,1,1,S[1]*.12) gc.setColor(1,1,1,S[1]*.12)
for x=S[3],S[5]do for x=S[3],S[5]do
for y=S[6],S[4]do for y=S[6],S[4]do
drawPixel(y,x,S[2]) drawPixel(y,x,S[2])
end end
end end
end--shade FX end--dropFX
if P.waiting==-1 then if P.waiting==-1 then
gc.setColor(1,1,1,.3) gc.setColor(1,1,1,.3)
for i=1,P.r do for j=1,P.c do for i=1,P.r do for j=1,P.c do
@@ -515,22 +539,31 @@ local function updateFXs(P,dt)
P.score1=int(min(P.score1*.9+P.stat.score*.1+1)) P.score1=int(min(P.score1*.9+P.stat.score*.1+1))
end end
end end
for i=#P.shade,1,-1 do for i=#P.lockFX,1,-1 do
local S=P.shade[i] local _=P.lockFX[i]
S[1]=S[1]-1+setting.dropFX*.15 _[3]=_[3]+_[4]
if S[1]<=0 then if _[3]>1 then
rem(P.shade,i) rem(P.lockFX,i)
end end
end end--lockFX
for i=#P.dropFX,1,-1 do
local S=P.dropFX[i]
S[1]=S[1]-1+P.gameEnv.dropFX*.15
if S[1]<=0 then
rem(P.dropFX,i)
end
end--dropFX
if setting.shakeFX>0 then if P.gameEnv.shakeFX then
local O=P.fieldOff local O=P.fieldOff
O.vx,O.vy=O.vx*.8-abs(O.x)^1.2*(O.x>0 and .1 or -.1),O.vy*.8-abs(O.y)^1.2*(O.y>0 and .1 or -.1) O.vx,O.vy=O.vx*.8-abs(O.x)^1.2*(O.x>0 and .1 or -.1),O.vy*.8-abs(O.y)^1.2*(O.y>0 and .1 or -.1)
O.x,O.y=O.x+O.vx,O.y+O.vy O.x,O.y=O.x+O.vx,O.y+O.vy
if abs(O.x)<.3 then O.x=0 end if abs(O.x)<.3 then O.x=0 end
if abs(O.y)<.3 then O.y=0 end if abs(O.y)<.3 then O.y=0 end
end--field shaking end--field shaking
updateText(P.bonus) if P.bonus then
updateText(P.bonus)
end
for i=#P.atkBuffer,1,-1 do for i=#P.atkBuffer,1,-1 do
local A=P.atkBuffer[i] local A=P.atkBuffer[i]
A.time=A.time+1 A.time=A.time+1
@@ -609,8 +642,8 @@ local function Pupdate_alive(P,dt)
P.act.moveLeft(P,true) P.act.moveLeft(P,true)
end end
end end
if P:ifoverlap(P.cur.bk,P.curX-1,P.curY) and not P.small then if P.gameEnv.shakeFX and P:ifoverlap(P.cur.bk,P.curX-1,P.curY)then
P.fieldOff.vx=-setting.shakeFX*.5 P.fieldOff.vx=-P.gameEnv.shakeFX*.5
end end
P.moving=-moving-1 P.moving=-moving-1
else else
@@ -642,8 +675,8 @@ local function Pupdate_alive(P,dt)
P.act.moveRight(P,true) P.act.moveRight(P,true)
end end
end end
if P:ifoverlap(P.cur.bk,P.curX+1,P.curY) and not P.small then if P.gameEnv.shakeFX and P:ifoverlap(P.cur.bk,P.curX+1,P.curY)then
P.fieldOff.vx=setting.shakeFX*.5 P.fieldOff.vx=P.gameEnv.shakeFX*.5
end end
P.moving=moving+1 P.moving=moving+1
else else
@@ -661,8 +694,8 @@ local function Pupdate_alive(P,dt)
else else
P.act.insDown(P) P.act.insDown(P)
end end
if not P.small then if P.gameEnv.shakeFX then
P.fieldOff.vy=setting.shakeFX*.3 P.fieldOff.vy=P.gameEnv.shakeFX*.3
end end
end end
else else
@@ -733,7 +766,7 @@ local function Pupdate_alive(P,dt)
end end
local function Pupdate_dead(P,dt) local function Pupdate_dead(P,dt)
if P.timing then P.stat.time=P.stat.time+dt end if P.timing then P.stat.time=P.stat.time+dt end
if not P.small then if P.keyRec then
P.keySpeed=P.keySpeed*.96+P.stat.key/P.stat.time*60*.04 P.keySpeed=P.keySpeed*.96+P.stat.key/P.stat.time*60*.04
P.dropSpeed=P.dropSpeed*.96+P.stat.piece/P.stat.time*60*.04 P.dropSpeed=P.dropSpeed*.96+P.stat.piece/P.stat.time*60*.04
--Final average speeds --Final average speeds
@@ -764,13 +797,33 @@ player={}local player=player
----------------------------<FX>---------------------------- ----------------------------<FX>----------------------------
local textFX=textFX local textFX=textFX
function player.showText(P,text,dx,dy,font,style,spd,stop) function player.showText(P,text,dx,dy,font,style,spd,stop)
if not P.small then if P.bonus then
P.bonus[#P.bonus+1]=getTEXT(text,150+dx,300+dy,font*P.size,style,spd,stop) P.bonus[#P.bonus+1]=getTEXT(text,150+dx,300+dy,font*P.size,style,spd,stop)
end end
end end
local function without(L,e)
for i=1,#L do
if L[i]==e then return end
end
return true
end
function player.createLockFX(P)
local BK=P.cur.bk
local t=.1-P.gameEnv.lockFX*.02
for i=1,P.r do
local y=P.curY+i-1
if without(P.clearedRow,y)then
for j=1,P.c do
if BK[i][j]then
ins(P.lockFX,{30*(P.curX+j-2),600-30*y,0,t})
end
end
end
end
end
function player.createShade(P,x1,y1,x2,y2)--x1<x2,y1>y2! function player.createShade(P,x1,y1,x2,y2)--x1<x2,y1>y2!
if P.gameEnv.block and y1>=y2 then if P.gameEnv.block and y1>=y2 then
P.shade[#P.shade+1]={5,P.cur.color,x1,y1,x2,y2} P.dropFX[#P.dropFX+1]={5,P.cur.color,x1,y1,x2,y2}
end end
end end
function player.createBeam(P,R,send,time,target,color,clear,spin,mini,combo) function player.createBeam(P,R,send,time,target,color,clear,spin,mini,combo)
@@ -783,7 +836,7 @@ function player.createBeam(P,R,send,time,target,color,clear,spin,mini,combo)
end end
local radius,corner local radius,corner
local a,r,g,b=1,unpack(P.color[color]) local a,r,g,b=1,unpack(skin.libColor[color])
if clear>10 then if clear>10 then
radius=10+3*send+100/(target+4) radius=10+3*send+100/(target+4)
local t=clear%10 local t=clear%10
@@ -932,7 +985,7 @@ function player.garbageRelease(P)
::L:: ::L::
local A=P.atkBuffer[n] local A=P.atkBuffer[n]
if A and A.countdown<=0 and not A.sent then if A and A.countdown<=0 and not A.sent then
P:garbageRise(8+A.lv,A.amount,A.pos) P:garbageRise(12+A.lv,A.amount,A.pos)
P.atkBuffer.sum=P.atkBuffer.sum-A.amount P.atkBuffer.sum=P.atkBuffer.sum-A.amount
A.sent,A.time=true,0 A.sent,A.time=true,0
P.stat.pend=P.stat.pend+A.amount P.stat.pend=P.stat.pend+A.amount
@@ -958,9 +1011,13 @@ function player.garbageRise(P,color,amount,pos)
for i=1,#P.clearingRow do for i=1,#P.clearingRow do
P.clearingRow[i]=P.clearingRow[i]+amount P.clearingRow[i]=P.clearingRow[i]+amount
end end
for i=1,#P.shade do for i=1,#P.lockFX do
local S=P.shade[i] local _=P.lockFX[i]
S[4],S[6]=S[4]+amount,S[6]+amount _[2]=_[2]-30*amount--calculated pos!Must *=-30
end
for i=1,#P.dropFX do
local _=P.dropFX[i]
_[4],_[6]=_[4]+amount,_[6]+amount
end end
if #P.field>40 then P:lose()end if #P.field>40 then P:lose()end
end end
@@ -1019,11 +1076,11 @@ function player.freshgho(P)
P.spinLast=false P.spinLast=false
end end
if P.curY>P.y_img then if P.curY>P.y_img then
if not P.small then if P.gameEnv.dropFX then
if setting.dropFX>0 then P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1) end
end if P.gameEnv.shakeFX then
P.fieldOff.vy=setting.shakeFX*.5 P.fieldOff.vy=P.gameEnv.shakeFX*.5
end end
P.curY=P.y_img P.curY=P.y_img
end end
@@ -1112,7 +1169,7 @@ function player.spin(P,d,ifpre)
end end
do return end do return end
::spin:: ::spin::
if not P.small and setting.dropFX>0 then if P.gameEnv.dropFX then
P:createShade(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY) P:createShade(P.curX,P.curY+P.r-1,P.curX+P.c-1,P.curY)
end end
local y0=P.curY local y0=P.curY
@@ -1243,9 +1300,11 @@ function player.drop(P)--Place piece
end--卡块 end--卡块
end end
--消行 --锁定
if P.clearedRow[1]then P.clearedRow={}end
P:lock() P:lock()
--清空消行列表
if P.clearedRow[1]then P.clearedRow={}end
--消行
local cc=0 local cc=0
for i=0,P.r-1 do for i=0,P.r-1 do
local h=P.curY+i local h=P.curY+i
@@ -1270,6 +1329,15 @@ function player.drop(P)--Place piece
end end
if P.clearingRow[1]then P.falling=P.gameEnv.fall end if P.clearingRow[1]then P.falling=P.gameEnv.fall end
--处理锁定特效
if P.gameEnv.lockFX then
if cc==0 then
P:createLockFX()
elseif P.lockFX[1]then
P.lockFX={}
end
end
--spin结算 --spin结算
if P.spinLast then if P.spinLast then
if cc>0 then if cc>0 then
@@ -1289,38 +1357,41 @@ function player.drop(P)--Place piece
else else
dospin=false dospin=false
end end
--极简判定:遮挡判断法
local finesse
if P.curY<=18 then
local y0=P.curY
local x,c=P.curX,P.c
local B=P.cur.bk
for x=1,c do
local y
for i=#B,1,-1 do
if B[i][x]then y=i;goto L1 end
end
goto L2
::L1::
if y then
x=P.curX+x-1
for y=y0+y,#P.field do
if solid(P,x,y)then
finesse=true
goto L2
end--有遮挡视为最简
end
end
end
end
::L2::
--移除消去的行
for i=cc,1,-1 do for i=cc,1,-1 do
_=P.clearedRow[i] _=P.clearedRow[i]
freeRow.discard(rem(P.field,_)) freeRow.discard(rem(P.field,_))
freeRow.discard(rem(P.visTime,_)) freeRow.discard(rem(P.visTime,_))
end end
--极简判定: if not finesse then--极简判定:操作判断法
--遮挡判断法
if P.curY>18 then
goto finesse
else
local y0=P.curY
local x,c=P.curX,P.c
local B=P.cur.bk
for x=1,c do
local y
for i=#B,1,-1 do
if B[i][x]then y=i;goto L2 end
end
goto L1
::L2::
if y then
x=P.curX+x-1
for y=y0+y,#P.field do
if solid(P,x,y)then goto finesse end--有遮挡视为最简
end
end
end
::L1::
end
do--操作判断法
if dospin then P.ctrlCount=P.ctrlCount-2 end--对无遮挡spin宽松两步 if dospin then P.ctrlCount=P.ctrlCount-2 end--对无遮挡spin宽松两步
local id=P.cur.id local id=P.cur.id
local dir=P.dir+1 local dir=P.dir+1
@@ -1339,7 +1410,6 @@ function player.drop(P)--Place piece
--非最简 --非最简
end end
end end
::finesse::
if cc>0 then if cc>0 then
cmb=cmb+1 cmb=cmb+1
@@ -1846,15 +1916,13 @@ function player.act.hardDrop(P)
P.keyPressing[6]=false P.keyPressing[6]=false
elseif P.control and P.waiting==-1 then elseif P.control and P.waiting==-1 then
if P.curY~=P.y_img then if P.curY~=P.y_img then
if not P.small then if P.gameEnv.dropFX then
if setting.dropFX>0 then P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
end
end end
P.curY=P.y_img P.curY=P.y_img
P.spinLast=false P.spinLast=false
if not P.small then if P.gameEnv.shakeFX then
P.fieldOff.vy=setting.shakeFX*.6 P.fieldOff.vy=P.gameEnv.shakeFX*.6
end end
if P.human then if P.human then
SFX.play("drop",nil,getBlockPosition(P)) SFX.play("drop",nil,getBlockPosition(P))
@@ -1900,7 +1968,7 @@ function player.act.insLeft(P,auto)
local x0,y0=P.curX,P.curY local x0,y0=P.curX,P.curY
while not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)do while not P:ifoverlap(P.cur.bk,P.curX-1,P.curY)do
P.curX=P.curX-1 P.curX=P.curX-1
if not P.small and setting.dropFX>0 then if P.gameEnv.dropFX then
P:createShade(P.curX+P.c,P.curY+P.r-1,P.curX+P.c,P.curY) P:createShade(P.curX+P.c,P.curY+P.r-1,P.curX+P.c,P.curY)
end end
P:freshgho() P:freshgho()
@@ -1908,8 +1976,8 @@ function player.act.insLeft(P,auto)
if x0~=P.curX then if x0~=P.curX then
if P.gameEnv.easyFresh or y0~=P.curY then P:freshLockDelay()end if P.gameEnv.easyFresh or y0~=P.curY then P:freshLockDelay()end
end end
if not P.small then if P.gameEnv.shakeFX then
P.fieldOff.vx=-setting.shakeFX*.5 P.fieldOff.vx=-P.gameEnv.shakeFX*.5
end end
if auto then if auto then
if P.ctrlCount==0 then P.ctrlCount=1 end if P.ctrlCount==0 then P.ctrlCount=1 end
@@ -1922,7 +1990,7 @@ function player.act.insRight(P,auto)
local x0,y0=P.curX,P.curY local x0,y0=P.curX,P.curY
while not P:ifoverlap(P.cur.bk,P.curX+1,P.curY)do while not P:ifoverlap(P.cur.bk,P.curX+1,P.curY)do
P.curX=P.curX+1 P.curX=P.curX+1
if not P.small and setting.dropFX>0 then if P.gameEnv.dropFX then
P:createShade(P.curX-1,P.curY+P.r-1,P.curX-1,P.curY) P:createShade(P.curX-1,P.curY+P.r-1,P.curX-1,P.curY)
end end
P:freshgho() P:freshgho()
@@ -1930,8 +1998,8 @@ function player.act.insRight(P,auto)
if x0~=P.curX then if x0~=P.curX then
if P.gameEnv.easyFresh or y0~=P.curY then P:freshLockDelay()end if P.gameEnv.easyFresh or y0~=P.curY then P:freshLockDelay()end
end end
if not P.small then if P.gameEnv.shakeFX then
P.fieldOff.vx=setting.shakeFX*.5 P.fieldOff.vx=P.gameEnv.shakeFX*.5
end end
if auto then if auto then
if P.ctrlCount==0 then P.ctrlCount=1 end if P.ctrlCount==0 then P.ctrlCount=1 end
@@ -1941,11 +2009,11 @@ function player.act.insRight(P,auto)
end end
function player.act.insDown(P) function player.act.insDown(P)
if P.curY~=P.y_img then if P.curY~=P.y_img then
if not P.small then if P.gameEnv.dropFX then
if setting.dropFX>0 then P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1)
P:createShade(P.curX,P.curY+1,P.curX+P.c-1,P.y_img+P.r-1) end
end if P.gameEnv.shakeFX then
P.fieldOff.vy=setting.shakeFX*.5 P.fieldOff.vy=P.gameEnv.shakeFX*.5
end end
P.curY,P.lockDelay,P.spinLast=P.y_img,P.gameEnv.lock,false P.curY,P.lockDelay,P.spinLast=P.y_img,P.gameEnv.lock,false
end end
@@ -2041,8 +2109,11 @@ function newDemoPlayer(id,x,y,size)
das=10,arr=2, das=10,arr=2,
sddas=2,sdarr=2, sddas=2,sdarr=2,
quickR=true,swap=true, quickR=true,swap=true,
ghost=true,center=true, ghost=setting.ghost,center=setting.center,
grid=false,swap=true, smooth=setting.smooth,grid=setting.grid,
lockFX=setting.lockFX,dropFX=setting.dropFX,
shakeFX=setting.shakeFX,
_20G=false,bone=false, _20G=false,bone=false,
drop=1e99,lock=1e99, drop=1e99,lock=1e99,
wait=10,fall=20, wait=10,fall=20,
@@ -2062,9 +2133,13 @@ function newDemoPlayer(id,x,y,size)
target=1e99,dropPiece=NULL, target=1e99,dropPiece=NULL,
mindas=0,minarr=0,minsdarr=0, mindas=0,minarr=0,minsdarr=0,
} }
local ENV=P.gameEnv
if ENV.lockFX==0 then ENV.lockFX=nil end
if ENV.dropFX==0 then ENV.dropFX=nil end
if ENV.shakeFX==0 then ENV.shakeFX=nil end
P.color={} P.color={}
for _=1,7 do for _=1,7 do
P.color[_]=skin.libColor[P.gameEnv.skin[_]] P.color[_]=skin.libColor[ENV.skin[_]]
end end
P.cur={bk={{}},id=0,color=0,name=0} P.cur={bk={{}},id=0,color=0,name=0}
P.sc,P.dir,P.r,P.c={0,0},0,0,0 P.sc,P.dir,P.r,P.c={0,0},0,0,0
@@ -2084,9 +2159,9 @@ function newDemoPlayer(id,x,y,size)
P:getNext(rem(bag1,rnd(#bag1))) P:getNext(rem(bag1,rnd(#bag1)))
end end
P.newNext=freshMethod.bag7 P.newNext=freshMethod.bag7
if P.gameEnv.sequence==1 then P.bag={} if ENV.sequence==1 then P.bag={}
elseif P.gameEnv.sequence==2 then P.his={}for i=1,4 do P.his[i]=P.next.id[i+3]end elseif ENV.sequence==2 then P.his={}for i=1,4 do P.his[i]=P.next.id[i+3]end
elseif P.gameEnv.sequence==3 then elseif ENV.sequence==3 then
end end
P.human=false P.human=false
@@ -2122,7 +2197,7 @@ function newDemoPlayer(id,x,y,size)
P.combo,P.b2b=0,0 P.combo,P.b2b=0,0
P.fieldBeneath=0 P.fieldBeneath=0
P.score1,P.b2b1=0,0 P.score1,P.b2b1=0,0
P.shade={} P.dropFX,P.lockFX={},{}
P.bonus={} P.bonus={}
P.dust=clearDust:clone() P.dust=clearDust:clone()
P.dust:start() P.dust:start()
@@ -2132,24 +2207,25 @@ end
function newPlayer(id,x,y,size,AIdata) function newPlayer(id,x,y,size,AIdata)
players[id]={id=id} players[id]={id=id}
local P=players[id] local P=players[id]
for k,v in next,player do P[k]=v end--Class function for k,v in next,player do P[k]=v end--inherit functions of player class
players.alive[#players.alive+1]=P players.alive[#players.alive+1]=P
P.x,P.y,P.size=x,y,size or 1 P.x,P.y,P.size=x,y,size or 1
P.fieldOff={x=0,y=0,vx=0,vy=0}--for shake FX P.fieldOff={x=0,y=0,vx=0,vy=0}--for shake FX
P.small=P.size<.1--if draw in small mode P.small=P.size<.1--if draw in small mode
P.keyRec=not P.small--if calculate keySpeed
if P.small then if P.small then
P.centerX,P.centerY=P.x+300*P.size,P.y+600*P.size P.centerX,P.centerY=P.x+300*P.size,P.y+600*P.size
P.canvas=love.graphics.newCanvas(60,120) P.canvas=love.graphics.newCanvas(60,120)
P.frameWait=rnd(30,120) P.frameWait=rnd(30,120)
P.draw=Pdraw_small P.draw=Pdraw_small
else else
P.keyRec=true--if calculate keySpeed
P.centerX,P.centerY=P.x+300*P.size,P.y+370*P.size P.centerX,P.centerY=P.x+300*P.size,P.y+370*P.size
P.absFieldX=P.x+150*P.size P.absFieldX=P.x+150*P.size
P.absFieldY=P.y+60*P.size P.absFieldY=P.y+60*P.size
P.draw=Pdraw_norm P.draw=Pdraw_norm
P.dust=clearDust:clone() P.dust=clearDust:clone()
P.dust:start() P.dust:start()
P.bonus={}--texts
end end
P.update=Pupdate_alive P.update=Pupdate_alive
@@ -2178,18 +2254,18 @@ function newPlayer(id,x,y,size,AIdata)
--Royale-related --Royale-related
P.gameEnv={}--Current game setting environment P.gameEnv={}--Current game setting environment
local ENV=P.gameEnv
for k,v in next,gameEnv0 do for k,v in next,gameEnv0 do
if modeEnv[k]~=nil then if modeEnv[k]~=nil then
v=modeEnv[k] v=modeEnv[k]
elseif setting[k]~=nil then elseif setting[k]~=nil then
v=setting[k] v=setting[k]
end end
P.gameEnv[k]=v ENV[k]=v
end--load game settings end--load game settings
P.gameEnv.das=max(P.gameEnv.das,P.gameEnv.mindas) ENV.das=max(ENV.das,ENV.mindas)
P.gameEnv.arr=max(P.gameEnv.arr,P.gameEnv.minarr) ENV.arr=max(ENV.arr,ENV.minarr)
P.gameEnv.sdarr=max(P.gameEnv.sdarr,P.gameEnv.minsdarr) ENV.sdarr=max(ENV.sdarr,ENV.minsdarr)
if not AIdata then P.gameEnv.next=min(P.gameEnv.next,setting.maxNext)end--AIdata is not human
P.cur={bk={{}},id=0,color=0,name=0}--shape,shapeID,colorID,nameID P.cur={bk={{}},id=0,color=0,name=0}--shape,shapeID,colorID,nameID
P.sc,P.dir,P.r,P.c={0,0},0,0,0--spinCenter,direction,row,col P.sc,P.dir,P.r,P.c={0,0},0,0,0--spinCenter,direction,row,col
@@ -2198,14 +2274,14 @@ function newPlayer(id,x,y,size,AIdata)
P.holded=false P.holded=false
P.next={} P.next={}
P.dropDelay,P.lockDelay=P.gameEnv.drop,P.gameEnv.lock P.dropDelay,P.lockDelay=ENV.drop,ENV.lock
P.freshTime=0 P.freshTime=0
P.spinLast,P.lastClear=false,nil P.spinLast,P.lastClear=false,nil
P.spinSeq=0--for Ospin,each digit mean a spin P.spinSeq=0--for Ospin,each digit mean a spin
P.ctrlCount=0--key press time,for finesse check P.ctrlCount=0--key press time,for finesse check
P.his={rnd(7),rnd(7),rnd(7),rnd(7)} P.his={rnd(7),rnd(7),rnd(7),rnd(7)}
local s=P.gameEnv.sequence local s=ENV.sequence
if s=="bag7"or s=="his4"then if s=="bag7"or s=="his4"then
local bag1={1,2,3,4,5,6,7} local bag1={1,2,3,4,5,6,7}
for _=1,7 do for _=1,7 do
@@ -2228,10 +2304,10 @@ function newPlayer(id,x,y,size,AIdata)
end end
end end
P.newNext=freshMethod[P.gameEnv.sequence] P.newNext=freshMethod[ENV.sequence]
if P.gameEnv.sequence==1 then P.bag={}--Bag7 if ENV.sequence==1 then P.bag={}--Bag7
elseif P.gameEnv.sequence==2 then P.his={}for i=1,4 do P.his[i]=P.next.id[i+3]end--History4 elseif ENV.sequence==2 then P.his={}for i=1,4 do P.his[i]=P.next.id[i+3]end--History4
elseif P.gameEnv.sequence==3 then--Pure random elseif ENV.sequence==3 then--Pure random
end end
if AIdata then if AIdata then
@@ -2240,12 +2316,12 @@ function newPlayer(id,x,y,size,AIdata)
P.AI_stage=1 P.AI_stage=1
P.AI_needFresh=false P.AI_needFresh=false
P.AI_keys={} P.AI_keys={}
P.AI_delay=min(int(P.gameEnv.drop*.8),2*AIdata.delta) P.AI_delay=min(int(ENV.drop*.8),2*AIdata.delta)
P.AI_delay0=AIdata.delta P.AI_delay0=AIdata.delta
P.AIdata={ P.AIdata={
next=AIdata.next, next=AIdata.next,
hold=AIdata.hold, hold=AIdata.hold,
_20G=P.gameEnv._20G, _20G=ENV._20G,
bag7=AIdata.bag7=="bag7", bag7=AIdata.bag7=="bag7",
node=AIdata.node, node=AIdata.node,
} }
@@ -2266,21 +2342,31 @@ function newPlayer(id,x,y,size,AIdata)
P.RS=kickList.TRS P.RS=kickList.TRS
P.AI_keys={} P.AI_keys={}
end end
P.gameEnv.face={0,0,0,0,0,0,0} ENV.face={0,0,0,0,0,0,0}
P.gameEnv.skin={1,5,2,8,10,3,7} ENV.skin={1,5,2,8,10,3,7}
else else
P.human=true P.human=true
P.RS=kickList.TRS P.RS=kickList.TRS
players.human=players.human+1 players.human=players.human+1
ENV.next=min(ENV.next,setting.maxNext)
end
if P.small then
ENV.lockFX=nil
ENV.dropFX=nil
ENV.shakeFX=nil
else
if ENV.lockFX==0 then ENV.lockFX=nil end
if ENV.dropFX==0 then ENV.dropFX=nil end
if ENV.shakeFX==0 then ENV.shakeFX=nil end
end end
P.color={} P.color={}
for _=1,7 do for _=1,7 do
P.color[_]=skin.libColor[P.gameEnv.skin[_]] P.color[_]=skin.libColor[ENV.skin[_]]
end end
P.showTime=visible_opt[P.gameEnv.visible] P.showTime=visible_opt[ENV.visible]
P.keepVisible=P.gameEnv.visible=="show" P.keepVisible=ENV.visible=="show"
P.keyPressing={}for i=1,12 do P.keyPressing[i]=false end P.keyPressing={}for i=1,12 do P.keyPressing[i]=false end
@@ -2291,8 +2377,7 @@ function newPlayer(id,x,y,size,AIdata)
P.fieldBeneath=0 P.fieldBeneath=0
P.score1,P.b2b1=0,0 P.score1,P.b2b1=0,0
P.shade={} P.dropFX,P.lockFX={},{}
P.bonus={}--texts
P.endCounter=0--used after gameover P.endCounter=0--used after gameover
P.result=nil--string:"WIN"/"K.O." P.result=nil--string:"WIN"/"K.O."

View File

@@ -19,6 +19,7 @@ local sceneInit={
1,--Loading counter 1,--Loading counter
#voiceName,--Loading bar lenth(current) #voiceName,--Loading bar lenth(current)
require("parts/getTip"),--tip require("parts/getTip"),--tip
skip=false,--if skipping
} }
end, end,
intro=function() intro=function()

View File

@@ -82,6 +82,7 @@ function Tmr.load()
scene.swapTo("intro","none") scene.swapTo("intro","none")
end end
end end
if L.skip and not scene.swapping then goto R end
end end
function Tmr.intro() function Tmr.intro()
sceneTemp=sceneTemp+1 sceneTemp=sceneTemp+1

View File

@@ -1,6 +1,5 @@
local S=[=[ local S=[=[
"Patron"(rmb10+)(ordered by first char): "Patron"(rmb10+)(ordered by first char):
10元
八零哥 八零哥
Fireboos Fireboos
gggf127 gggf127
@@ -16,6 +15,7 @@ local S=[=[
心痕 心痕
蕴空之灵 蕴空之灵
yyangdid yyangdid
10元
?[D*a] ?[D*a]
Thanks! Thanks!
@@ -32,7 +32,6 @@ Future outlook:
Shifting field Shifting field
Other: Other:
bag sep-line switch bag sep-line switch
more drop fx,like light on locked block
game recording game recording
(powerinfo switch) (powerinfo switch)
new virtualWidgets like joysticks new virtualWidgets like joysticks
@@ -42,14 +41,26 @@ Future outlook:
Encrypt source code(compile to byte code) Encrypt source code(compile to byte code)
new AI:task-Z new AI:task-Z
CC smarter(think of garbage buffer) CC smarter(think of garbage buffer)
0.8.14:
new:
click/tap/any-key to skip loading animation
lock animation
changed:
display scene info when error
//many optimization
fixed:
error when attack
error garbage line color
error in finesse checking
some times error when touch screen
0.8.13: 0.8.13:
new: new:
a independent page to set DAS/ARR,with an animation for preview a independent page to set DAS/ARR,with an animation for preview
changed: changed:
new virtualkey animation new virtualkey animation
freer drawing mode(Incompatible with old ver.) freer drawing mode(Incompatible with old ver.)
score of spins little changed
combo&b3b attack changed combo&b3b attack changed
score of spins little changed
fixed: fixed:
wrong behavior in pause scene wrong behavior in pause scene
ospin error in 0.8.12 ospin error in 0.8.12

View File

@@ -255,18 +255,19 @@ local Widget={
sound= newButton(200,80,240,80,C.lightCyan,35,function()scene.swapTo("setting_sound")end, nil,"game"), sound= newButton(200,80,240,80,C.lightCyan,35,function()scene.swapTo("setting_sound")end, nil,"game"),
game= newButton(1080,80,240,80,C.lightCyan,35,function()scene.swapTo("setting_game")end, nil,"ghost"), game= newButton(1080,80,240,80,C.lightCyan,35,function()scene.swapTo("setting_game")end, nil,"ghost"),
ghost= newSwitch(310,180,35, SETval("ghost"), SETrev("ghost"), nil,"center"), ghost= newSwitch(310,180,35, SETval("ghost"), SETrev("ghost"), nil,"center"),
center= newSwitch(580,180,35, SETval("center"), SETrev("center"), nil,"smo"), center= newSwitch(580,180,35, SETval("center"), SETrev("center"), nil,"smooth"),
smo= newSwitch(310,260,25, SETval("smo"), SETrev("smo"), nil,"grid"), smooth= newSwitch(310,260,25, SETval("smooth"), SETrev("smooth"), nil,"grid"),
grid= newSwitch(580,260,30, SETval("grid"), SETrev("grid"), nil,"dropFX"), grid= newSwitch(580,260,30, SETval("grid"), SETrev("grid"), nil,"lockFX"),
dropFX= newSlider(310,350,373,5,35,nil, SETval("dropFX"), SETsto("dropFX"), nil,"shakeFX"), lockFX= newSlider(310,340,373,3,35,nil, SETval("lockFX"), SETsto("lockFX"), nil,"dropFX"),
shakeFX=newSlider(310,430,373,5,35,nil, SETval("shakeFX"), SETsto("shakeFX"), nil,"atkFX"), dropFX= newSlider(310,410,373,5,35,nil, SETval("dropFX"), SETsto("dropFX"), nil,"shakeFX"),
atkFX= newSlider(310,510,373,5,35,nil, SETval("atkFX"), SETsto("atkFX"), nil,"frame"), shakeFX=newSlider(310,480,373,5,35,nil, SETval("shakeFX"), SETsto("shakeFX"), nil,"atkFX"),
frame= newSlider(310,590,373,10,35,nil,function()return setting.frameMul>35 and setting.frameMul/10 or setting.frameMul/5-4 end,function(i)setting.frameMul=i<5 and 5*i+20 or 10*i end,nil,"fullscreen"), atkFX= newSlider(310,550,373,5,35,nil, SETval("atkFX"), SETsto("atkFX"), nil,"frame"),
frame= newSlider(310,620,373,10,35,nil,function()return setting.frameMul>35 and setting.frameMul/10 or setting.frameMul/5-4 end,function(i)setting.frameMul=i<5 and 5*i+20 or 10*i end,nil,"fullscreen"),
fullscreen=newSwitch(990,180,40,SETval("fullscreen"),function() fullscreen=newSwitch(990,180,40,SETval("fullscreen"),function()
setting.fullscreen=not setting.fullscreen setting.fullscreen=not setting.fullscreen
love.window.setFullscreen(setting.fullscreen) love.window.setFullscreen(setting.fullscreen)
if not setting.fullscreen then if not setting.fullscreen then
love.resize(love.graphics.getWidth(),love.graphics.getHeight()) love.resize(love.graphics.getWidth(),love.graphics.getHeight())
end end
end,nil,"bg"), end,nil,"bg"),
bg= newSwitch(990,250,35,SETval("bg"),SETrev("bg"),nil,"bgspace"), bg= newSwitch(990,250,35,SETval("bg"),SETrev("bg"),nil,"bgspace"),
@@ -331,7 +332,8 @@ local Widget={
--spin6=newButton(825,550,90,65,C.white,30,nextDir(6)),--O cannot rotate --spin6=newButton(825,550,90,65,C.white,30,nextDir(6)),--O cannot rotate
spin7= newButton(965,550,90,65,C.white,30,nextDir(7)), spin7= newButton(965,550,90,65,C.white,30,nextDir(7)),
reset= newButton(200,650,180,80,C.lightRed,35,function()for i=1,7 do setting.face[i]=0 end SFX.play("rotate")end), skinR= newButton(200,650,180,80,C.lightPurple,35,function()setting.skin={1,5,2,8,10,3,7}SFX.play("hold")end),
faceR= newButton(480,650,180,80,C.lightRed,35,function()setting.face={0,0,0,0,0,0,0}SFX.play("rotate")end),
back= newButton(1140,650,200,80,C.white,40,scene.back), back= newButton(1140,650,200,80,C.white,40,scene.back),
}, },
setting_touch={ setting_touch={