Compare commits

..

12 Commits

Author SHA1 Message Date
MrZ_26
f0a118e714 Alpha V0.7.19 2020-02-04 19:34:43 +08:00
MrZ_26
3019f83999 Alpha V0.7.18 2020-02-04 19:34:16 +08:00
MrZ_26
438046f77f Alpha V0.7.17 2020-02-04 19:34:07 +08:00
MrZ_26
830f0ffbed Alpha V0.7.16 2020-02-04 19:33:52 +08:00
MrZ_26
849e5b586e Alpha V0.7.15 2020-02-04 19:33:41 +08:00
MrZ_26
f82e979f9c Alpha V0.7.14 2020-02-04 19:33:20 +08:00
MrZ_26
c9a3e3ce1b Alpha V0.7.13+ 2020-02-04 19:33:03 +08:00
MrZ_26
72dcb84662 Alpha V0.7.12 2020-02-04 19:32:38 +08:00
MrZ_26
4af2126254 Alpha V0.7.11 2020-02-04 19:32:26 +08:00
MrZ_26
42d7b1be94 Alpha V0.7.10 2020-02-04 19:32:10 +08:00
MrZ_26
a31474c43a Alpha V0.7.9 2020-02-04 19:31:45 +08:00
MrZ_26
75c7955bb5 Alpha V0.7.8 2020-02-04 19:31:31 +08:00
107 changed files with 4548 additions and 2966 deletions

BIN
BGM/8-bit happiness.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
BGM/end.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
BGM/newera.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
BGM/rockblock.ogg Normal file

Binary file not shown.

BIN
BGM/secret7th.ogg Normal file

Binary file not shown.

BIN
BGM/secret8th.ogg Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
SFX/collect.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
SFX/lock.ogg Normal file

Binary file not shown.

BIN
SFX/ren_mega.ogg Normal file

Binary file not shown.

Binary file not shown.

BIN
SFX/swipe.ogg Normal file

Binary file not shown.

BIN
VOICE/I_1.ogg Normal file

Binary file not shown.

BIN
VOICE/I_2.ogg Normal file

Binary file not shown.

BIN
VOICE/J_1.ogg Normal file

Binary file not shown.

BIN
VOICE/J_2.ogg Normal file

Binary file not shown.

BIN
VOICE/L_1.ogg Normal file

Binary file not shown.

BIN
VOICE/L_2.ogg Normal file

Binary file not shown.

BIN
VOICE/O_1.ogg Normal file

Binary file not shown.

BIN
VOICE/O_2.ogg Normal file

Binary file not shown.

BIN
VOICE/PC_1.ogg Normal file

Binary file not shown.

BIN
VOICE/S_1.ogg Normal file

Binary file not shown.

BIN
VOICE/S_2.ogg Normal file

Binary file not shown.

BIN
VOICE/T_1.ogg Normal file

Binary file not shown.

BIN
VOICE/T_2.ogg Normal file

Binary file not shown.

BIN
VOICE/Z_1.ogg Normal file

Binary file not shown.

BIN
VOICE/Z_2.ogg Normal file

Binary file not shown.

BIN
VOICE/b2b_1.ogg Normal file

Binary file not shown.

BIN
VOICE/b2b_2.ogg Normal file

Binary file not shown.

BIN
VOICE/b2b_3.ogg Normal file

Binary file not shown.

BIN
VOICE/b3b_1.ogg Normal file

Binary file not shown.

BIN
VOICE/double_1.ogg Normal file

Binary file not shown.

BIN
VOICE/double_2.ogg Normal file

Binary file not shown.

BIN
VOICE/double_3.ogg Normal file

Binary file not shown.

BIN
VOICE/lose_1.ogg Normal file

Binary file not shown.

BIN
VOICE/lose_2.ogg Normal file

Binary file not shown.

BIN
VOICE/lose_3.ogg Normal file

Binary file not shown.

BIN
VOICE/mini_1.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_1.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_11.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_12.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_13.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_2.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_21.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_22.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_3.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_31.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_4.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_o0.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_o1.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_o2.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_o3.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_o4.ogg Normal file

Binary file not shown.

BIN
VOICE/nya_o5.ogg Normal file

Binary file not shown.

BIN
VOICE/single_1.ogg Normal file

Binary file not shown.

BIN
VOICE/single_2.ogg Normal file

Binary file not shown.

BIN
VOICE/single_3.ogg Normal file

Binary file not shown.

BIN
VOICE/spin-_1.ogg Normal file

Binary file not shown.

BIN
VOICE/spin-_2.ogg Normal file

Binary file not shown.

BIN
VOICE/spin_1.ogg Normal file

Binary file not shown.

BIN
VOICE/spin_2.ogg Normal file

Binary file not shown.

BIN
VOICE/spin_3.ogg Normal file

Binary file not shown.

BIN
VOICE/spin_4.ogg Normal file

Binary file not shown.

BIN
VOICE/spin_5.ogg Normal file

Binary file not shown.

BIN
VOICE/triple_1.ogg Normal file

Binary file not shown.

BIN
VOICE/triple_2.ogg Normal file

Binary file not shown.

BIN
VOICE/tts_1.ogg Normal file

Binary file not shown.

BIN
VOICE/win_1.ogg Normal file

Binary file not shown.

BIN
VOICE/win_2.ogg Normal file

Binary file not shown.

Binary file not shown.

51
ai.lua
View File

@@ -49,17 +49,18 @@ FCL[5]=FCL[3]
clearScore={[0]=0,0,2,4,12} clearScore={[0]=0,0,2,4,12}
function ifoverlapAI(f,bk,x,y) function ifoverlapAI(f,bk,x,y)
if y<1 then return true end if y<1 then return true end
if y>#f then return nil end if y>#f then return end
for i=1,#bk do for j=1,#bk[1]do for i=1,#bk do for j=1,#bk[1]do
if f[y+i-1]and bk[i][j]>0 and f[y+i-1][x+j-1]>0 then return true end if f[y+i-1]and bk[i][j]and f[y+i-1][x+j-1]>0 then return true end
end end end end
end end
function resetField(f0,f,start) function resetField(f0,f,start)
while f[start]do ::L::if f[start]then
removeRow(f,start) removeRow(f,start)
goto L
end end
for i=start,#f0 do for i=start,#f0 do
f[i]=getNewRow() f[i]=getNewRow(0)
for j=1,10 do for j=1,10 do
f[i][j]=f0[i][j] f[i][j]=f0[i][j]
end end
@@ -68,25 +69,24 @@ end
function getScore(field,bn,cb,cx,cy) function getScore(field,bn,cb,cx,cy)
local score=0 local score=0
local highest=0 local highest=0
local height=getNewRow() local height=getNewRow(0)
local clear=0 local clear=0
local hole=0 local hole=0
for i=cy+#cb-1,cy,-1 do for i=cy+#cb-1,cy,-1 do
local f=true
for j=1,10 do for j=1,10 do
if field[i][j]==0 then f=false;break end if field[i][j]==0 then goto L end
end
if f then
removeRow(field,i)
clear=clear+1
end end
removeRow(field,i)
clear=clear+1
::L::
end end
if #field==0 then return 9e99 end--PC best if #field==0 then return 9e99 end--PC best
for x=1,10 do for x=1,10 do
local h=#field local h=#field
while field[h][x]==0 and h>1 do ::L::if field[h][x]==0 and h>1 then
h=h-1 h=h-1
goto L
end end
height[x]=h height[x]=h
if x>3 and x<8 and h>highest then highest=h end if x>3 and x<8 and h>highest then highest=h end
@@ -117,33 +117,34 @@ function getScore(field,bn,cb,cx,cy)
+clearScore[clear]*(8+#field) +clearScore[clear]*(8+#field)
-hole*50 -hole*50
if #field>6 then score=score-highest*5 end if #field>6 then score=score-highest*5 end
if mh1>3 then score=score-50-mh1*40 end if mh1>3 then score=score-40-mh1*30 end
return score return score
end end
function AI_getControls(ctrl) function AI_getControls(ctrl)
local Tfield={}--test field local Tfield={}--test field
local field_org=P.field local field_org=P.field
for i=1,#field_org do for i=1,#field_org do
Tfield[i]=getNewRow() Tfield[i]=getNewRow(0)
for j=1,10 do for j=1,10 do
Tfield[i][j]=field_org[i][j] Tfield[i][j]=field_org[i][j]
end end
end end
local best={x=1,dir=0,hold=false,score=-9e99} local best={x=1,dir=0,hold=false,score=-9e99}
for ifhold=0,P.gameEnv.hold and 1 or 0 do for ifhold=0,P.gameEnv.hold and 1 or 0 do
local bn=ifhold==0 and P.bn or P.hn>0 and P.hn or P.nxt[1] local bn=ifhold==0 and P.cur.id or P.hold.id>0 and P.hold.id or P.next[1].id
for dir=0,dirCount[bn] do--each dir for dir=0,dirCount[bn] do--each dir
local cb=blocks[bn][dir] local cb=blocks[bn][dir]
for cx=1,11-#cb[1]do--each pos for cx=1,11-#cb[1]do--each pos
local cy=#Tfield+1 local cy=#Tfield+1
while not ifoverlapAI(Tfield,cb,cx,cy-1)do ::L::if not ifoverlapAI(Tfield,cb,cx,cy-1)then
cy=cy-1 cy=cy-1
goto L
end--move to bottom end--move to bottom
for i=1,#cb do for i=1,#cb do
local y=cy+i-1 local y=cy+i-1
if not Tfield[y]then Tfield[y]=getNewRow()end if not Tfield[y]then Tfield[y]=getNewRow(0)end
for j=1,#cb[1]do for j=1,#cb[1]do
if cb[i][j]~=0 then if cb[i][j]then
Tfield[y][cx+j-1]=1 Tfield[y][cx+j-1]=1
end end
end end
@@ -156,8 +157,11 @@ function AI_getControls(ctrl)
end end
end end
end end
while #Tfield>0 do
::L::
if #Tfield>0 then
removeRow(Tfield,1) removeRow(Tfield,1)
goto L
end--Release cache end--Release cache
if best.hold then if best.hold then
ins(ctrl,8) ins(ctrl,8)
@@ -167,11 +171,4 @@ function AI_getControls(ctrl)
ins(ctrl,l[i]) ins(ctrl,l[i])
end end
ins(ctrl,6) ins(ctrl,6)
if rnd()<.1 then
if P.atkMode~=4 and P==mostDangerous then
ins(P.ai.controls,9)
--Smarter AI???
end
end
end end

Binary file not shown.

View File

@@ -1,5 +1,97 @@
local gc,tm=love.graphics,love.timer
local ms,kb,tc=love.mouse,love.keyboard,love.touch
local wd=love.window
local setFont=setFont
local Timer=tm.getTime
local scr=scr
local xOy=love.math.newTransform()
local focus=true
local mx,my,mouseShow=-20,-20,false
local touching=nil--1st touching ID
local sceneInit={
load=function()
loading=1--Loading mode
loadnum=1--Loading counter
loadprogress=0--Loading bar(0~1)
loadTip=text.tips[rnd(#text.tips)]
end,
intro=function()
count=0
BGM("blank")
end,
main=function()
collectgarbage()
end,
mode=function()
curBG="none"
saveData()
modeSel=modeSel or 1
levelSel=levelSel or 3
BGM("blank")
end,
custom=function()
optSel=optSel or 1
curBG="matrix"
BGM("blank")
end,
draw=function()
curBG="none"
kb.setKeyRepeat(true)
clearSureTime=0
pen,sx,sy=1,1,1
end,
play=function()
restartCount=0
if needResetGameData then
resetGameData()
needResetGameData=nil
end
end,
pause=function()
end,
setting=function()
curBG="none"
end,
setting2=function()
curBoard=1
keyboardSet=1
joystickSet=1
keyboardSetting=false
joystickSetting=false
end,--Control settings
setting3=function()
curBG="game1"
defaultSel=1
sel=nil
snapLevel=1
end,--Touch setting
help=function()
end,
stat=function()
end,
quit=function()
love.event.quit()
end,
}
BGblockList={}for i=1,16 do BGblockList[i]={v=0}end
local BGblock={tm=150,next=7,ct=0}
local function getNewBlock()
BGblock.ct=BGblock.ct+1
if BGblock.ct==17 then BGblock.ct=1 end
local t=BGblockList[BGblock.ct]
t.bn,t.size=BGblock.next,2+3*rnd()
t.b=blocks[t.bn][rnd(0,3)]
t.x=rnd(-#t.b[1]*t.size*30+100,1180)
t.y=-#t.b*30*t.size
t.v=t.size*(1+rnd())
BGblock.next=BGblock.next%7+1
return t
end
function onVirtualkey(x,y) function onVirtualkey(x,y)
local x,y=xOy:inverseTransformPoint(x,y)
local d2,nearest,distance local d2,nearest,distance
for K=1,#virtualkey do for K=1,#virtualkey do
local b=virtualkey[K] local b=virtualkey[K]
@@ -12,44 +104,37 @@ function onVirtualkey(x,y)
end end
return nearest return nearest
end end
function buttonControl_key(i) function buttonControl_key(i)
if i=="up"or i=="down"or i=="left"or i=="right"then if i=="up"or i=="down"or i=="left"or i=="right"then
if not Buttons.sel then if Buttons.sel then
if Buttons[scene][1]then Buttons.sel=Buttons[scene][Buttons.sel[i]]or Buttons.sel
Buttons.sel=1
end
else else
Buttons.sel=Buttons[scene][Buttons.sel][i]or Buttons.sel Buttons.sel=select(2,next(Buttons[scene]))
end end
elseif i=="space"or i=="return"then elseif i=="space"or i=="return"then
if not sceneSwaping and Buttons.sel then if not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel] Buttons.sel.alpha=1
B.code() Buttons.sel.code()
B.alpha=1 SFX("button")
sysSFX("button") VOICE("nya")
end end
end end
end end
function buttonControl_gamepad(i) function buttonControl_gamepad(i)
if i=="dpup"or i=="dpdown"or i=="dpleft"or i=="dpright"then if i=="dpup"or i=="dpdown"or i=="dpleft"or i=="dpright"then
if not Buttons.sel then if Buttons.sel then
if Buttons[scene][1]then Buttons.sel=Buttons[scene][Buttons.sel[i=="dpup"and"up"or i=="dpdown"and"down"or i=="dpleft"and"left"or"right"]]or Buttons.sel
Buttons.sel=1
end
mouseShow=false
else else
Buttons.sel=Buttons[scene][Buttons.sel][i=="dpup"and"up"or i=="dpdown"and"down"or i=="dpleft"and"left"or"right"]or Buttons.sel Buttons.sel=select(2,next(Buttons[scene]))
end end
elseif i=="start"then elseif i=="start"then
if not sceneSwaping and Buttons.sel then if not sceneSwaping and Buttons.sel then
local B=Buttons[scene][Buttons.sel] Buttons.sel.alpha=1
B.code() Buttons.sel.code()
B.alpha=1 SFX("button")
sysSFX("button") VOICE("nya")
end end
end end
mouseShow=false
end end
mouseDown={} mouseDown={}
@@ -60,6 +145,125 @@ function mouseDown.intro(x,y,k)
gotoScene("main") gotoScene("main")
end end
end end
function mouseDown.draw(x,y,k)
mouseMove.draw(x,y)
end
function mouseDown.setting3(x,y,k)
if k==2 then back()end
for K=1,#virtualkey do
local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then
sel=K
end
end
end
mouseMove={}
function mouseMove.draw(x,y,dx,dy)
sx,sy=int((x-200)/30)+1,20-int((y-60)/30)
if sx<1 or sx>10 then sx=nil end
if sy<1 or sy>20 then sy=nil end
if sx and sy and ms.isDown(1,2,3)then
preField[sy][sx]=ms.isDown(1)and pen or ms.isDown(2)and 0 or -1
end
end
function mouseMove.setting3(x,y,dx,dy)
if sel and ms.isDown(1)then
local b=virtualkey[sel]
b[1],b[2]=b[1]+dx,b[2]+dy
end
end
mouseUp={}
function mouseUp.setting3(x,y,k)
if sel then
local b=virtualkey[sel]
local k=snapLevelValue[snapLevel]
b[1],b[2]=int(b[1]/k+.5)*k,int(b[2]/k+.5)*k
end
end
wheelmoved={}
function wheelmoved.draw(x,y)
if y<0 then
pen=pen+1
if pen==8 then pen=9 elseif pen==14 then pen=0 end
else
pen=pen-1
if pen==8 then pen=7 elseif pen==-1 then pen=13 end
end
end
function wheelmoved.mode(x,y)
modeSel=min(max(modeSel+(y>0 and -1 or 1),1),#modeID)
levelSel=ceil(#modeLevel[modeID[modeSel]]*.5)
end
touchDown={}
function touchDown.intro(id,x,y)
gotoScene("main")
end
function touchDown.draw(id,x,y)
end
function touchDown.setting3(id,x,y)
for K=1,#virtualkey do
local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then
sel=K
end
end
end
function touchDown.play(id,x,y)
if setting.virtualkeySwitch then
local t=onVirtualkey(x,y)
if t then
pressKey(t,players[1])
end
end
end
touchUp={}
function touchUp.setting3(id,x,y)
if sel then
x,y=xOy:inverseTransformPoint(x,y)
if sel then
local b=virtualkey[sel]
local k=snapLevelValue[snapLevel]
b[1],b[2]=int(b[1]/k+.5)*k,int(b[2]/k+.5)*k
end
end
end
function touchUp.play(id,x,y)
if setting.virtualkeySwitch then
local t=onVirtualkey(x,y)
if t then
releaseKey(t,players[1])
end
end
end
touchMove={}
function touchMove.setting3(id,x,y,dx,dy)
if sel then
local b=virtualkey[sel]
b[1],b[2]=b[1]+dx,b[2]+dy
end
end
function touchMove.draw(id,x,y,dx,dy)
sx,sy=int((x-200)/30)+1,20-int((y-60)/30)
if sx<1 or sx>10 then sx=nil end
if sy<1 or sy>20 then sy=nil end
if sx and sy then
preField[sy][sx]=pen
end
end
function touchMove.play(id,x,y,dx,dy)
if setting.virtualkeySwitch then
local l=tc.getTouches()
for n=1,#virtualkey do
local b=virtualkey[n]
for i=1,#l do
local x,y=xOy:inverseTransformPoint(tc.getPosition(l[i]))
if(x-b[1])^2+(y-b[2])^2<=b[3]then goto L end
end
releaseKey(n,players[1])
::L::
end
end
end
keyDown={} keyDown={}
function keyDown.intro(key) function keyDown.intro(key)
if key=="escape"then if key=="escape"then
@@ -106,12 +310,44 @@ function keyDown.custom(key)
optSel=optSel%#customID+1 optSel=optSel%#customID+1
elseif key=="up"then elseif key=="up"then
optSel=(optSel-2)%#customID+1 optSel=(optSel-2)%#customID+1
elseif key=="d"then
gotoScene("draw")
elseif key=="return"then elseif key=="return"then
loadGame(0,1) loadGame(0,1)
elseif key=="space"then
loadGame(0,2)
elseif key=="escape"then elseif key=="escape"then
back() back()
end end
end end
function keyDown.draw(key)
if key=="delete"then
Buttons.draw.clear.code()
elseif key=="up"or key=="down"or key=="left"or key=="right"then
if not sx then sx=1 end
if not sy then sy=1 end
if key=="up"and sy<20 then sy=sy+1
elseif key=="down"and sy>1 then sy=sy-1
elseif key=="left"and sx>1 then sx=sx-1
elseif key=="right"and sx<10 then sx=sx+1
end
if kb.isDown("space")then
preField[sy][sx]=pen
end
elseif key=="space"then
if sx and sy then
preField[sy][sx]=pen
end
elseif key=="tab"then
pen=-1
elseif key=="backspace"then
pen=0
elseif key=="escape"then
back()
else
pen=find("123qwea#sdzxc",key)or pen
end
end
function keyDown.setting2(key) function keyDown.setting2(key)
if key=="escape"then if key=="escape"then
if keyboardSetting then if keyboardSetting then
@@ -142,31 +378,34 @@ function keyDown.setting2(key)
end end
end end
function keyDown.play(key) function keyDown.play(key)
if key=="escape"then back()return nil end if key=="escape"and not sceneSwaping then
return(frame<180 and back or pauseGame)()
end
local m=setting.keyMap local m=setting.keyMap
for p=1,4 do for p=1,human do
local lib=setting.keyLib[p] for k=1,12 do
for s=1,#lib do if key==m[2*p-1][k]or key==m[2*p][k]then
for k=1,12 do pressKey(k,players[p])
if key==m[lib[s]][k]then return
pressKey(k,players[p])
return nil
end
end end
end end
end end
end end
function keyDown.pause(key)
if key=="escape"then
back()
elseif key=="return"or key=="space"then
resumeGame()
end
end
keyUp={} keyUp={}
function keyUp.play(key) function keyUp.play(key)
local m=setting.keyMap local m=setting.keyMap
for p=1,4 do for p=1,human do
local lib=setting.keyLib[p] for k=1,12 do
for s=1,#lib do if key==m[2*p-1][k]or key==m[2*p][k]then
for k=1,12 do releaseKey(k,players[p])
if key==m[lib[s]][k]then return
releaseKey(k,players[p])
return nil
end
end end
end end
end end
@@ -220,16 +459,13 @@ function gamepadDown.setting2(key)
end end
end end
function gamepadDown.play(key) function gamepadDown.play(key)
if key=="back"then back()return nil end if key=="back"then back()return end
local m=setting.keyMap local m=setting.keyMap
for p=1,4 do for p=1,human do
local lib=setting.keyLib[p] for k=1,12 do
for s=1,#lib do if key==m[2*p+7][k]or key==m[2*p+8][k]then
for k=1,12 do pressKey(k,players[p])
if key==m[8+lib[s]][k]then return
pressKey(k,players[p])
return nil
end
end end
end end
end end
@@ -237,176 +473,134 @@ end
gamepadUp={} gamepadUp={}
function gamepadUp.play(key) function gamepadUp.play(key)
local m=setting.keyMap local m=setting.keyMap
for p=1,4 do for p=1,human do
local lib=setting.keyLib[p] for k=1,12 do
for s=1,#lib do if key==m[2*p+7][k]or key==m[2*p+8][k]then
for k=1,12 do releaseKey(k,players[p])
if key==m[8+lib[s]][k]then return
releaseKey(k,players[p])
return nil
end
end end
end end
end end
end end
wheelmoved={}
function wheelmoved.mode(x,y)
modeSel=min(max(modeSel-sgn(y),1),#modeID)
levelSel=ceil(#modeLevel[modeID[modeSel]]*.5)
end
--Warning,these are not system callbacks!
function love.mousemoved(x,y,dx,dy,t)
if not t then
mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y)
Buttons.sel=nil
for i=1,#Buttons[scene]do
local B=Buttons[scene][i]
if not(B.hide and B.hide())then
if abs(mx-B.x)<B.w*.5 and abs(my-B.y)<B.h*.5 then
Buttons.sel=i
return nil
end
end
end
end
end
function love.mousepressed(x,y,k,t,num) function love.mousepressed(x,y,k,t,num)
if not t then if t then return end
mouseShow=true mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y) mx,my=xOy:inverseTransformPoint(x,y)
if mouseDown[scene]then if mouseDown[scene]then
mouseDown[scene](mx,my,k) mouseDown[scene](mx,my,k)
else elseif k==2 then
if k==1 then back()
if not sceneSwaping and Buttons.sel then end
local B=Buttons[scene][Buttons.sel] if k==1 then
B.code() if not sceneSwaping and Buttons.sel then
B.alpha=1 local B=Buttons.sel
Buttons.sel=nil B.code()
love.mousemoved(x,y) B.alpha=1
sysSFX("button") Buttons.sel=nil
end love.mousemoved(x,y,0,0)
elseif k==2 then SFX("button")
back() VOICE("nya")
VIB(1)
end
end
end
function love.mousemoved(x,y,dx,dy,t)
if t then return end
mouseShow=true
mx,my=xOy:inverseTransformPoint(x,y)
Buttons.sel=nil
if mouseMove[scene]then
mouseMove[scene](mx,my,dx/scr.k,dy/scr.k)
end
for _,B in next,Buttons[scene]do
if not(B.hide and B.hide())then
if abs(mx-B.x)<B.w*.5 and abs(my-B.y)<B.h*.5 then
Buttons.sel=B
return
end end
end end
end end
end end
function love.mousereleased(x,y,k,t,num) function love.mousereleased(x,y,k,t,num)
if t then return end
mx,my=xOy:inverseTransformPoint(x,y)
if mouseUp[scene]then
mouseUp[scene](mx,my,k)
end
end end
function love.wheelmoved(x,y)
if wheelmoved[scene]then wheelmoved[scene](x,y)end
end
function love.touchpressed(id,x,y) function love.touchpressed(id,x,y)
mouseShow=false
if not touching then if not touching then
touching=id touching=id
love.mousemoved(x,y) love.touchmoved(id,x,y,0,0)
mouseShow=false
end end
if scene=="play"then if touchDown[scene]then
if setting.virtualkeySwitch then touchDown[scene](id,xOy:inverseTransformPoint(x,y))
local t=onVirtualkey(x,y)
if t then
pressKey(t,players[1])
end
end
elseif scene=="setting3"then
x,y=xOy:inverseTransformPoint(x,y)
for K=1,#virtualkey do
local b=virtualkey[K]
if (x-b[1])^2+(y-b[2])^2<b[3]then
sel=K
end
end
elseif scene=="intro"then
gotoScene("main")
end end
end end
function love.touchreleased(id,x,y) function love.touchreleased(id,x,y)
if id==touching then if id==touching then
touching=nil touching=nil
if Buttons.sel then if Buttons.sel then
local B=Buttons[scene][Buttons.sel] local B=Buttons.sel
B.code() B.code()
B.alpha=1 B.alpha=1
Buttons.sel=nil Buttons.sel=nil
SFX("button")
VOICE("nya")
VIB(1)
end end
Buttons.sel=nil Buttons.sel=nil
mouseShow=false
end end
if scene=="play"and setting.virtualkeySwitch then if touchUp[scene]then
local t=onVirtualkey(x,y) touchUp[scene](id,xOy:inverseTransformPoint(x,y))
if t then
releaseKey(t,players[1])
end
elseif scene=="setting3"and sel then
x,y=xOy:inverseTransformPoint(x,y)
if sel then
local b=virtualkey[sel]
local k=snapLevelValue[snapLevel]
b[1],b[2]=int(b[1]/k+.5)*k,int(b[2]/k+.5)*k
end
end end
end end
function love.touchmoved(id,x,y,dx,dy) function love.touchmoved(id,x,y,dx,dy)
love.mousemoved(x,y) x,y=xOy:inverseTransformPoint(x,y)
mouseShow=false if touchMove[scene]then
touchMove[scene](id,x,y,dx/scr.k,dy/scr.k)
end
Buttons.sel=nil
for _,B in next,Buttons[scene]do
if not(B.hide and B.hide())then
if abs(x-B.x)<B.w*.5 and abs(y-B.y)<B.h*.5 then
Buttons.sel=B
return
end
end
end
if not Buttons.sel then if not Buttons.sel then
touching=nil touching=nil
end end
if scene=="play"and setting.virtualkeySwitch then
local l=tc.getTouches()
for n=1,#virtualkey do
local b=virtualkey[n]
local p=false
for i=1,#l do
local x,y=xOy:inverseTransformPoint(tc.getPosition(l[i]))
if(x-b[1])^2+(y-b[2])^2<=b[3]then
p=true
break
end
end
if not p and players[1].isKeyDown then
releaseKey(n,players[1])
end
end
elseif scene=="setting3"then
x,y=xOy:inverseTransformPoint(x,y)
dx,dy=dx*screenK,dy*screenK
if sel then
local b=virtualkey[sel]
b[1],b[2]=b[1]+dx,b[2]+dy
end
end
end end
function love.keypressed(i) function love.keypressed(i)
if i=="f12"then devMode=not devMode end mouseShow=false
if i=="f8"then devMode=not devMode end
if devMode then if devMode then
if Buttons.sel then if i=="k"then
local B=Buttons[scene][Buttons.sel] P=players.alive[rnd(#players.alive)]
if i=="left"then P.lastRecv=players[1]
B.x=B.x-10 Event.lose()
elseif i=="right"then --Test code here
B.x=B.x+10 elseif i=="q"then
elseif i=="up"then local B=Buttons.sel if B then print(format("x=%d,y=%d,w=%d,h=%d",B.x,B.y,B.w,B.h))end
B.y=B.y-10 elseif Buttons.sel then
elseif i=="down"then local B=Buttons.sel
B.y=B.y+10 if i=="left"then B.x=B.x-10
elseif i==","then elseif i=="right"then B.x=B.x+10
B.w=B.w-10 elseif i=="up"then B.y=B.y-10
elseif i=="."then elseif i=="down"then B.y=B.y+10
B.w=B.w+10 elseif i==","then B.w=B.w-10
elseif i=="/"then elseif i=="."then B.w=B.w+10
B.h=B.h-10 elseif i=="/"then B.h=B.h-10
elseif i=="'"then elseif i=="'"then B.h=B.h+10
B.h=B.h+10
end
end
if i=="q"then
for i=1,#Buttons[scene]do
local B=Buttons[scene][i]
print(format("x=%d,y=%d,w=%d,h=%d",B.x,B.y,B.w,B.h))
end end
end end
else else
@@ -415,7 +609,6 @@ function love.keypressed(i)
else buttonControl_key(i) else buttonControl_key(i)
end end
end end
mouseShow=false
end end
function love.keyreleased(i) function love.keyreleased(i)
if keyUp[scene]then keyUp[scene](i) if keyUp[scene]then keyUp[scene](i)
@@ -423,169 +616,179 @@ function love.keyreleased(i)
end end
function love.gamepadpressed(joystick,i) function love.gamepadpressed(joystick,i)
mouseShow=false
if gamepadDown[scene]then return gamepadDown[scene](i) if gamepadDown[scene]then return gamepadDown[scene](i)
elseif i=="back"then back() elseif i=="back"then back()
else buttonControl_gamepad(i) else buttonControl_gamepad(i)
end end
mouseShow=false
end end
function love.gamepadreleased(joystick,i) function love.gamepadreleased(joystick,i)
if gamepadUp[scene]then gamepadUp[scene](i) if gamepadUp[scene]then gamepadUp[scene](i)
end end
end end
--[[ --[[
function love.joystickpressed(js,k) function love.joystickpressed(js,k)end
function love.joystickaxis(js,axis,valend
end function love.joystickhat(js,hat,dirend
function love.joystickaxis(js,axis,val) function love.sendData(data)end
function love.receiveData(id,data)end
end
function love.joystickhat(js,hat,dir)
end
]] ]]
function love.wheelmoved(x,y) function love.lowmemory()
if wheelmoved[scene]then wheelmoved[scene](x,y)end collectgarbage()
end
function love.resize(w,h)
scr.w,scr.h,scr.r=w,h,h/w
if scr.r>=.5625 then
scr.k=w/1280
scr.x,scr.y=0,(h-w*9/16)*.5
else
scr.k=h/720
scr.x,scr.y=(w-h*16/9)*.5,0
end
gc.origin()
xOy=xOy:setTransformation(w*.5,h*.5,nil,scr.k,nil,640,360)
gc.replaceTransform(xOy)
collectgarbage()
end
function love.focus(f)
if not f and wd.isMinimized()and scene=="play"then pauseGame()end
end end
function love.update(dt) function love.update(dt)
--[[ -- if players then for k,v in pairs(players[1])do
if players then -- if rawget(_G,k)and k~="next"and k~="hold"and k~="stat"then print(k,_G[v])end
for k,v in pairs(players[1])do -- end end--check player data flew(debugging)
if rawget(_G,k)then print(k)end
end
end--check player data flew(debugging)
]]
for i=#BGblock,1,-1 do for i=#BGblock,1,-1 do
BGblock[i].y=BGblock[i].y+BGblock[i].v BGblock[i].y=BGblock[i].y+BGblock[i].v
if BGblock[i].y>720 then rem(BGblock,i)end if BGblock[i].y>720 then rem(BGblock,i)end
end end
if setting.bgblock then if setting.bgblock then
BGblock.ct=BGblock.ct-1 BGblock.tm=BGblock.tm-1
if BGblock.ct==0 then if BGblock.tm==0 then
ins(BGblock,getNewBlock()) ins(BGblock,getNewBlock())
BGblock.ct=rnd(20,30) BGblock.tm=rnd(20,30)
end end
end end
if sceneSwaping then if sceneSwaping then
sceneSwaping.time=sceneSwaping.time-1 sceneSwaping.time=sceneSwaping.time-1
if sceneSwaping.time==sceneSwaping.mid then if sceneSwaping.time==sceneSwaping.mid then
for i=1,#Buttons[scene]do for k,B in next,Buttons[scene]do
Buttons[scene][i].alpha=0 B.alpha=0
end--Reset buttons' state end--Reset buttons' alpha
game[sceneSwaping.tar]()
Buttons.sel=nil Buttons.sel=nil
scene=sceneSwaping.tar
sceneInit[scene]()
elseif sceneSwaping.time==0 then elseif sceneSwaping.time==0 then
sceneSwaping=nil sceneSwaping=nil
end end
elseif Tmr[scene]then end
if Tmr[scene]then
Tmr[scene](dt) Tmr[scene](dt)
end end
updateButton() for i=#Task,1,-1 do
end Task[i]:update()
function love.sendData(data) end
return nil if voicePlaying[1]then
end if not voicePlaying[1]:isPlaying()then
function love.receiveData(id,data) rem(voicePlaying,1)
return nil end
if voicePlaying[1] and not voicePlaying[1]:isPlaying()then voicePlaying[1]:play()end
end
for k,B in next,Buttons[scene]do
local t=B==Buttons.sel and .4 or 0
B.alpha=abs(B.alpha-t)>.02 and(B.alpha+(B.alpha<t and .02 or -.02))or t
if B.alpha>t then B.alpha=B.alpha-.02 elseif B.alpha<t then B.alpha=B.alpha+.02 end
end--update Buttons
end end
local scs={1,2,1,2,1,2,1,2,1,2,1.5,1.5,.5,2.5}
function love.draw() function love.draw()
gc.clear() gc.discard()--SPEED UPUPUP!
Pnt.BG[curBG]() Pnt.BG[setting.bg and curBG or"grey"]()
gc.setColor(1,1,1,.3) gc.setColor(1,1,1,.2)
for n=1,#BGblock do for n=1,#BGblock do
local b,img=BGblock[n].b,blockSkin[BGblock[n].bn] local b,img=BGblock[n].b,blockSkin[BGblock[n].bn]
local size=BGblock[n].size local size=BGblock[n].size
for i=1,#b do for j=1,#b[1]do for i=1,#b do for j=1,#b[1]do
if b[i][j]>0 then if b[i][j]then
gc.draw(img,BGblock[n].x+(j-1)*30*size,BGblock[n].y+(i-1)*30*size,nil,size) gc.draw(img,BGblock[n].x+(j-1)*30*size,BGblock[n].y+(i-1)*30*size,nil,size)
end end
end end end end
end end
if Pnt[scene]then Pnt[scene]()end if Pnt[scene]then Pnt[scene]()end
drawButton() for k,B in next,Buttons[scene]do
if not(B.hide and B.hide())then
local C=B.rgb or color.white
gc.setColor(C[1],C[2],C[3],B.alpha)
gc.rectangle("fill",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h)
gc.setColor(C)
gc.setLineWidth(3)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h,4)
gc.setColor(C[1],C[2],C[3],.3)
gc.setLineWidth(5)gc.rectangle("line",B.x-B.w*.5,B.y-B.h*.5,B.w,B.h,4)
local t=B.t
local y0
if t then
if type(t)=="function"then t=t()end
setFont(B.f or 40)
y0=B.y-currentFont*.64
gc.printf(t,B.x-201,y0+2,400,"center")
gc.printf(t,B.x-199,y0+2,400,"center")
gc.printf(t,B.x-201,y0,400,"center")
gc.printf(t,B.x-199,y0,400,"center")
gc.setColor(C)
mStr(t,B.x,y0+1)
end
end
end--Draw buttons
if mouseShow and not touching then if mouseShow and not touching then
local r=Timer()*.5 local r=Timer()*.5
gc.setColor(1,1,1,min(1-abs(1-r%1*2),.3)) gc.setColor(1,1,1,min(1-abs(1-r%1*2),.3))
r=int(r)%7+1 r=int(r)%7+1
gc.draw(mouseBlock[r],mx,my,Timer()%pi*4,20,20,scs[r][0][2]-.5,#blocks[r][0]-scs[r][0][1]+.5) gc.draw(mouseBlock[r],mx,my,Timer()%pi*4,20,20,scs[2*r]-.5,#blocks[r][0]-scs[2*r-1]+.5)
gc.setColor(1,1,1,.5) gc.setColor(1,1,1,.5)gc.circle("fill",mx,my,5)
gc.circle("fill",mx,my,5) gc.setColor(1,1,1)gc.circle("fill",mx,my,3)
gc.setColor(1,1,1) end--Awesome mouse!
gc.circle("fill",mx,my,3) if sceneSwaping then sceneSwaping.draw()end--Swaping animation
end if scr.r~=.5625 then
if sceneSwaping then sceneSwaping.draw()end
if wh/ww>.5625 then
gc.setColor(0,0,0) gc.setColor(0,0,0)
gc.rectangle("fill",0,0,1280,ww*9/16-wh) if scr.r>.5625 then
gc.rectangle("fill",0,720,1280,wh-ww*9/16) local d=(scr.h-scr.w*9/16)*.5/scr.k
elseif wh/ww<.5625 then gc.rectangle("fill",0,0,1280,-d)
gc.setColor(0,0,0) gc.rectangle("fill",0,720,1280,d)
gc.rectangle("fill",0,0,wh*16/9-ww,720) else--high
gc.rectangle("fill",1280,0,ww-wh*16/9,720) local d=(scr.w-scr.h*16/9)*.5/scr.k
end gc.rectangle("fill",0,0,-d,720)
gc.rectangle("fill",1280,0,d,720)
end--wide
end--Black side
setFont(20)gc.setColor(1,1,1) setFont(20)gc.setColor(1,1,1)
gc.print(tm.getFPS(),5,700) gc.print(tm.getFPS(),5,700)
if devMode then if devMode then
gc.print(mx.." "..my,5,640)
gc.print(#freeRow or 0,5,660)
gc.print(gcinfo(),5,680) gc.print(gcinfo(),5,680)
gc.print(freeRow and #freeRow or 0,5,660)
end end
end end
function love.resize(w,h)
ww,wh=w,h
screenK=h/w>=.5625 and w/1280 or h/720
xOy=xOy:setTransformation(w*.5,h*.5,nil,screenK,nil,640,360)
gc.replaceTransform(xOy)
end
function love.run() function love.run()
local frameT=Timer() local frameT=Timer()
local readyDrawFrame=0 local readyDrawFrame=0
local PUMP,POLL=love.event.pump,love.event.poll
love.resize(gc.getWidth(),gc.getHeight()) love.resize(gc.getWidth(),gc.getHeight())
game.load()--System scene Launch scene="load"sceneInit.load()--System Launch
math.randomseed(os.time()*626)
return function() return function()
love.event.pump() PUMP()
for name,a,b,c,d,e,f in love.event.poll()do for N,a,b,c,d,e in POLL()do
if name=="quit"then return 0 end if N=="quit"then return 0
love.handlers[name](a,b,c,d,e,f) elseif love[N]then love[N](a,b,c,d,e)end
end end
if focus then tm.step()
tm.step() love.update(tm.getDelta())
-- love.receiveData(id,data) readyDrawFrame=readyDrawFrame+setting.frameMul
love.update(tm.getDelta()) if readyDrawFrame>=100 then
readyDrawFrame=readyDrawFrame+setting.frameMul readyDrawFrame=readyDrawFrame-100
if readyDrawFrame>=100 then love.draw()
readyDrawFrame=readyDrawFrame-100 gc.present()
gc.clear()
love.draw()
gc.present()
end
if not(wd.hasFocus()or keeprun)then
focus=false
ms.setVisible(true)
if bgmPlaying then bgm[bgmPlaying]:pause()end
if scene=="play"then
for i=1,#players.alive do
local l=players.alive[i].isKeyDown
for j=1,#l do
if l[j]then
releaseKey(j,players.alive[i])
end
end
end
end
end
else
tm.sleep(.5)
if wd.hasFocus()then
tm.step()
focus=true
ms.setVisible(false)
if bgmPlaying then bgm[bgmPlaying]:play()end
end
end end
while Timer()-frameT<1/60 do end ::L::if Timer()-frameT<1/60 then goto L end
frameT=Timer() frameT=Timer()
tm.sleep(.001)
end end
end end

37
class.lua Normal file
View File

@@ -0,0 +1,37 @@
Task={}
metatable_task={__index=Task}
function newTask(code,P,data)
local obj={
code=code,
P=P,
data=data,
}
setmetatable(obj,metatable_task)
ins(Task,obj)
end
function clearTask(opt)
if opt=="all"then
while Task[1]do
rem(Task,i)
end
elseif opt=="play"then
for i=#Task,1,-1 do
if Task[i].P then
rem(Task,i)
end
end
else--Player table
for i=#Task,1,-1 do
if Task[i].P==P then
rem(Task,i)
end
end
end
end
function Task:update()
if(not self.P or self.P and scene=="play")and self:code(self.P,self.data)then
for i=#Task,1,-1 do
if Task[i]==self then rem(Task,i)return end
end--Destroy
end
end

View File

@@ -9,15 +9,15 @@ function love.conf(t)
t.audio.mixwithsystem=true--Switch on to keep sysBGM t.audio.mixwithsystem=true--Switch on to keep sysBGM
local W=t.window local W=t.window
W.title="Techmino V0.7.7" W.title="Techmino V0.7.19"
W.icon="/image/icon.png" W.icon="/image/icon.png"
W.width,W.height=1280,720 W.width,W.height=1280,720
W.minwidth,W.minheight=640,360
W.borderless=X W.borderless=X
W.resizable=true W.resizable=true
W.minwidth,W.minheight=640,360
W.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string) W.fullscreentype="desktop"--Choose between "desktop" fullscreen or "exclusive" fullscreen mode (string)
W.fullscreen=X W.fullscreen=X
W.vsync=X--0 to set ∞fps W.vsync=0--0∞fps
W.msaa=X--The number of samples to use with multi-sampled antialiasing (number) W.msaa=X--The number of samples to use with multi-sampled antialiasing (number)
W.depth=X--Bits per sample in the depth buffer W.depth=X--Bits per sample in the depth buffer
W.stencil=1--The number of bits per sample in the stencil buffer W.stencil=1--The number of bits per sample in the stencil buffer

1163
dataList.lua Normal file

File diff suppressed because it is too large Load Diff

BIN
font.ttf Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

BIN
image/block.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

BIN
image/mess/groupcode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
image/mess/light.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

BIN
image/mess/lightBulb.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 421 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 638 B

BIN
image/mess/paycode.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

BIN
image/virtualkey/func.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 370 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 300 B

245
language/chi.lua Normal file
View File

@@ -0,0 +1,245 @@
return{
atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"},
techrash="Techrash",
techrashB2B="B2B Techrash",
techrashB3B="B2B2B Techrash",
block={"Z","S","L","J","T","O","I"},
clear={" single"," double"," triple"},
spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"},
b2b="B2B ",b3b="B2B2B ",
mini="Mini",
PC="Perfect Clear",
hold="暂存",next="下一个",
stage={"关卡 1","关卡 2","关卡 3","关卡 4","关卡 5",},
maxspeed="最高速度",
speedup="速度加快",
win="胜利",
lose="失败",
pause="暂停",
finish="结束",
pauseTime="暂停时间",
custom="自定义游戏",
customOption={
drop="下落延迟:",
lock="锁定延迟:",
wait="放块延迟:",
fall="消行延迟:",
next="序列数量:",
hold="暂存:",
sequence="序列:",
visible="可见性:",
target="目标行数:",
freshLimit="锁延刷新次数:",
opponent="对手速度等级:",
},
customVal={
drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,"","[20G]"},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
wait=nil,
fall=nil,
next=nil,
hold={"","","无限"},
sequence={"bag7","his4","随机"},
visible={"可见","半隐","全隐","瞬隐"},
target={10,20,40,100,200,500,1000,""},
freshLimit={0,8,15,""},
opponent={"无电脑",1,2,3,4,5,6,7,8,9,10,11},
},
softdropdas="软降DAS:",
softdroparr="软降ARR:",
snapLevelName={"任意摆放","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
keyboard="键盘",joystick="手柄",
space="空格",enter="回车",
setting2Help="方向键选择/翻页,回车修改,esc返回",
actName={"左移:","右移:","顺时针旋转:","逆时针旋转:","180°旋转","硬降:","软降:","暂存:","功能键:","重新开始:","左瞬移:","右瞬移:","软降到底:"},
modeName={
[0]="自定义",
"竞速","马拉松","大师","经典","","无尽","单挑","仅TSD","隐形","挖掘","生存","科研",
"C4W练习","全清训练","全清挑战","49人混战","99人混战","干旱","多人",
},
modeInfo={
sprint="挑战世界纪录",
marathon="尝试坚持到最后",
master="成为方块大师",
classic="高速经典",
zen="无重力消除200行",
infinite="科研沙盒",
solo="打败AI",
tsd="尽可能做TSD",
blind="最强大脑",
dig="核能挖掘机",
survivor="防守练习",
tech="尽可能不要普通消除",
c4wtrain="无 限 连 击",
pctrain="熟悉全清定式的组合",
pcchallenge="100行内尽可能多PC",
techmino49="49人混战",
techmino99="99人混战",
drought="异常序列",
hotseat="友尽模式",
},
load={"加载语音ing","加载音乐ing","加载音效ing","加载完成",},
tips={
"不是动画,真的在加载!",
"整个游戏都是MrZ完成的!",
"大满贯10连击消四全清!",
"<方块研究所>有一个Nspire-CX版本!",
"B2B2B2B存在吗?",
"MEGACMB!",
"ALLSPIN!",
"O型回旋三清?",
"只用一个输入设备就可以游玩了",
"Miya:喵!",
"225238922,哔哩哔哩 干杯~",
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
"合群了就会消失,但是消失不代表没有意义",
"学会使用两个旋转键,三个更好",
"更小的DAS和ARR拥有更高的操作上限",
"注意到\"旋转\"到底对方块做了些什么吗?",
"20G是一套全新的游戏规则",
"不要在上课时玩游戏!",
"本游戏难度上限很高,做好心理准备",
"方块可以不是个休闲游戏",
"调到特殊的日期也不会发生什么的",
"[随机文本]",
},
stat={
"游戏运行次数:",
"游戏局数:",
"游戏时间:",
"按键数:",
"旋转数:",
"Hold次数:",
"方块使用数:",
"消行数:",
"攻击数:",
"发送数:",
"接收数:",
"上涨数:",
"消除数:",
"Spin数:",
"B2B数:",
"PC数:",
"效率:",
},
help={
"好像也没啥好帮助的吧?就当是关于了",
"这只是一个方块游戏,请勿过度解读和随意联想",
"不过就当成TOP/C2/KOS/TGM3/JS玩好了",
"游戏还在测试阶段,请 勿 外 传",
"",
"使用LOVE2D引擎",
"作者:MrZ 邮箱:1046101471@qq.com",
"程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ 语音:Miya",
"使用工具:VScode,GFIE,Beepbox,Goldwave",
"特别感谢:Farter,196,Teatube,Flyz,T830,[所有测试人员]和 你!",
"错误或者建议请附带相关信息发送到作者邮箱~",
},
support="支持作者",
group="官方QQ群",
ButtonText={
main={
play="开始",
setting="设置",
stat="统计信息",
help="帮助",
quit="退出",
},
mode={
up="Λ",
down="v",
left="<",
right=">",
start="开始",
custom="自定义(C)",
back="返回",
},
custom={
up="Λ",
down="v",
left="<",
right=">",
start1="消除开始",
start2="拼图开始",
draw="画图(D)",
back="返回",
},
draw={
free="不定",
block1="",
block2="",
block3="",
block4="",
block5="",
block6="",
block7="",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
erase="×",
clear="清空",
back="返回",
},
play={
pause="暂停",
},
pause={
resume="继续",
quit="退出",
},
setting={
ghost=function()return setting.ghost and"阴影:开"or"阴影:关"end,
center=function()return setting.center and"旋转中心:开"or"旋转中心:关"end,
grid=function()return setting.grid and"网格:开"or"网格:关"end,
swap=function()return setting.swap and"目标选择:组合键"or"目标选择:循环"end,
fxs=function()return setting.fxs and"特效:开"or"特效:关"end,
bg=function()return setting.bg and"背景:开"or"背景:关"end,
dasD="-",dasU="+",
arrD="-",arrU="+",
sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+",
ctrl="控制设置",
touch="触摸设置",
lang=function()return langName[setting.lang]end,
sfx=function()return setting.sfx and"音效:开"or"音效:关"end,
bgm=function()return setting.bgm and"音乐:开"or"音乐:关"end,
vib=function()return "震动:"..setting.vib end,
voc=function()return setting.voc and"语音:开"or"语音:关"end,
fullscreen=function()return setting.fullscreen and"全屏:开"or"全屏:关"end,
bgblock=function()return setting.bgblock and"背景动画:开"or"背景动画:关"end,
frame=function()return"绘制帧:"..setting.frameMul.."%"end,
skin="切换方块皮肤",
back="保存&返回",
},
setting2={
back="返回",
},
setting3={
back="返回",
hide=function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end,
default="默认组合",
snap=function()return text.snapLevelName[snapLevel]end,
alpha=function()return percent0to5[setting.virtualkeyAlpha]end,
icon="图标",
size="大小",
},
help={
back="返回",
qq="作者QQ",
},
stat={
back="返回",
path="打开存储目录",
},
},
}

245
language/chi_full.lua Normal file
View File

@@ -0,0 +1,245 @@
return{
atkModeName={"随机","徽章","击杀","反击"},
royale_remain=function(n)return"剩余 "..n.." 名玩家"end,
cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"},
techrash="四清",
techrashB2B="满贯 四清",
techrashB3B="大满贯 四清",
block={"Z","S","L","J","T","O","I"},
clear={"单清","双清","三清"},
spin={"Z型回旋","S型回旋","L型回旋","J型回旋","T型回旋","O型回旋","I型回旋"},
b2b="满贯",b3b="大满贯",
mini="迷你",
PC="场地全清",
hold="暂存",next="下一个",
stage={"关卡 1","关卡 2","关卡 3","关卡 4","关卡 5",},
maxspeed="最高速度",
speedup="速度加快",
win="胜利",
lose="失败",
pause="暂停",
finish="结束",
pauseTime="暂停时间",
custom="自定义游戏",
customOption={
drop="下落延迟:",
lock="锁定延迟:",
wait="放块延迟:",
fall="消行延迟:",
next="序列数量:",
hold="暂存:",
sequence="序列:",
visible="可见性:",
target="目标行数:",
freshLimit="锁延刷新次数:",
opponent="对手速度等级:",
},
customVal={
drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,"","[20G]"},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
wait=nil,
fall=nil,
next=nil,
hold={"","","无限"},
sequence={"bag7","his4","随机"},
visible={"可见","半隐","全隐","瞬隐"},
target={10,20,40,100,200,500,1000,""},
freshLimit={0,8,15,""},
opponent={"无电脑",1,2,3,4,5,6,7,8,9,10,11},
},
softdropdas="软降DAS:",
softdroparr="软降ARR:",
snapLevelName={"任意摆放","10px吸附","20px吸附","40px吸附","60px吸附","80px吸附"},
keyboard="键盘",joystick="手柄",
space="空格",enter="回车",
setting2Help="方向键选择/翻页,回车修改,esc返回",
actName={"左移:","右移:","顺时针旋转:","逆时针旋转:","180°旋转","硬降:","软降:","暂存:","功能键:","重新开始:","左瞬移:","右瞬移:","软降到底:"},
modeName={
[0]="自定义",
"竞速","马拉松","大师","经典","","无尽","单挑","仅TSD","隐形","挖掘","生存","科研",
"C4W练习","全清训练","全清挑战","49人混战","99人混战","干旱","多人",
},
modeInfo={
sprint="挑战世界纪录",
marathon="尝试坚持到最后",
master="成为方块大师",
classic="高速经典",
zen="无重力消除200行",
infinite="科研沙盒",
solo="打败AI",
tsd="尽可能做T旋双清",
blind="最强大脑",
dig="核能挖掘机",
survivor="防守练习",
tech="尽可能不要普通消除!",
c4wtrain="无 限 连 击",
pctrain="熟悉全清定式的组合",
pcchallenge="100行内尽可能多全清",
techmino49="49人混战",
techmino99="99人混战",
drought="异常序列",
hotseat="友尽模式",
},
load={"加载语音ing","加载音乐ing","加载音效ing","加载完成",},
tips={
"不是动画,真的在加载!",
"整个游戏都是MrZ完成的!",
"大满贯10连击消四全清!",
"<方块研究所>有一个Nspire-CX版本!",
"B2B2B2B存在吗?",
"MEGACMB!",
"ALLSPIN!",
"O型回旋三清?",
"只用一个输入设备就可以游玩了",
"Miya:喵!",
"225238922,哔哩哔哩 干杯~",
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
"合群了就会消失,但是消失不代表没有意义",
"学会使用两个旋转键,三个更好",
"更小的DAS和ARR拥有更高的操作上限",
"注意到\"旋转\"到底对方块做了些什么吗?",
"20G是一套全新的游戏规则",
"不要在上课时玩游戏!",
"本游戏难度上限很高,做好心理准备",
"方块可以不是个休闲游戏",
"调到特殊的日期也不会发生什么的",
"[随机文本]",
},
stat={
"游戏运行次数:",
"游戏局数:",
"游戏时间:",
"按键数:",
"旋转数:",
"暂存次数:",
"方块使用:",
"消行数:",
"攻击行数:",
"发送数:",
"接收数:",
"上涨数:",
"消除数:",
"旋转消行数:",
"满贯数:",
"全清数:",
"效率:",
},
help={
"好像也没啥好帮助的吧?就当是关于了",
"这只是一个方块游戏,请勿过度解读和随意联想",
"不过就当成TOP/C2/KOS/TGM3/JS玩好了",
"游戏还在测试阶段,请 勿 外 传",
"",
"使用LOVE2D引擎",
"作者:MrZ 邮箱:1046101471@qq.com",
"程序:MrZ 美术:MrZ 音乐:MrZ 音效:MrZ 语音:Miya",
"使用工具:VScode,GFIE,Beepbox,Goldwave",
"特别感谢:Farter,Teatube,196,Flyz,T830,[所有测试人员]和 你!",
"错误或者建议请附带相关信息发送到作者邮箱~",
},
support="支持作者",
group="官方QQ群",
ButtonText={
main={
play="开始",
setting="设置",
stat="统计信息",
help="帮助",
quit="退出",
},
mode={
up="Λ",
down="v",
left="<",
right=">",
start="开始",
custom="自定义(C)",
back="返回",
},
custom={
up="Λ",
down="v",
left="<",
right=">",
start1="消除开始",
start2="拼图开始",
draw="画图(D)",
back="返回",
},
draw={
free="不定",
block1="",
block2="",
block3="",
block4="",
block5="",
block6="",
block7="",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
erase="×",
clear="清空",
back="返回",
},
play={
pause="暂停",
},
pause={
resume="继续",
quit="退出",
},
setting={
ghost=function()return setting.ghost and"阴影:开"or"阴影:关"end,
center=function()return setting.center and"旋转中心:开"or"旋转中心:关"end,
grid=function()return setting.grid and"网格:开"or"网格:关"end,
swap=function()return setting.swap and"目标选择:组合键"or"目标选择:循环"end,
fxs=function()return setting.fxs and"特效:开"or"特效:关"end,
bg=function()return setting.bg and"背景:开"or"背景:关"end,
dasD="-",dasU="+",
arrD="-",arrU="+",
sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+",
ctrl="控制设置",
touch="触摸设置",
lang=function()return langName[setting.lang]end,
sfx=function()return setting.sfx and"音效:开"or"音效:关"end,
bgm=function()return setting.bgm and"音乐:开"or"音乐:关"end,
vib=function()return "震动:"..setting.vib end,
voc=function()return setting.voc and"语音:开"or"语音:关"end,
fullscreen=function()return setting.fullscreen and"全屏:开"or"全屏:关"end,
bgblock=function()return setting.bgblock and"背景动画:开"or"背景动画:关"end,
frame=function()return"绘制帧:"..setting.frameMul.."%"end,
skin="切换方块皮肤",
back="保存&返回",
},
setting2={
back="返回",
},
setting3={
back="返回",
hide=function()return setting.virtualkeySwitch and"隐藏虚拟按键"or"显示虚拟按键"end,
default="默认组合",
snap=function()return text.snapLevelName[snapLevel]end,
alpha=function()return percent0to5[setting.virtualkeyAlpha]end,
icon="图标",
size="大小",
},
help={
back="返回",
qq="作者QQ",
},
stat={
back="返回",
path="打开存储目录",
},
},
}

245
language/eng.lua Normal file
View File

@@ -0,0 +1,245 @@
return{
atkModeName={"Random","Badges","K.O.s","Counters"},
royale_remain=function(n)return n.." Players Remain"end,
cmb={nil,nil,"3 Combo","4 Combo","5 Combo","6 Combo","7 Combo","8 Combo","9 Combo","10 Combo!","11 Combo!","12 Combo!","13 Combo!","14 Combo!","15 Combo!","16 Combo!","17 Combo!","18 Combo!","19 Combo!","MEGACMB"},
techrash="Techrash",
techrashB2B="B2B Techrash",
techrashB3B="B2B2B Techrash",
block={"Z","S","L","J","T","O","I"},
clear={" single"," double"," triple"},
spin={"Z-spin","S-spin","L-spin","J-spin","T-spin","O-spin","I-spin"},
b2b="B2B ",b3b="B2B2B ",
mini="Mini",
PC="Perfect Clear",
hold="Hold",next="Next",
stage={"STAGE 1","STAGE 2","STAGE 3","STAGE 4","STAGE 5",},
maxspeed="Max speed",
speedup="Speed up",
win="WIN",
lose="LOSE",
pause="PAUSE",
finish="FINISH",
pauseTime="Pause time",
custom="Custom Game",
customOption={
drop="Drop delay:",
lock="Lock delay:",
wait="Next piece delay:",
fall="Clear row delay:",
next="Next count:",
hold="Hold:",
sequence="Sequence:",
visible="Visible:",
target="Line limit:",
freshLimit="Lock fresh limit:",
opponent="Opponent speed:",
},
customVal={
drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,"","[20G]"},
lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,""},
wait=nil,
fall=nil,
next=nil,
hold={"ON","OFF","FREE"},
sequence={"bag7","his4","random"},
visible={"normal","time","invisible","sudden"},
target={10,20,40,100,200,500,1000,""},
freshLimit={0,8,15,""},
opponent={"No CPU",1,2,3,4,5,6,7,8,9,10,11},
},
softdropdas="softdropDAS:",
softdroparr="softdropARR:",
snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"},
keyboard="Keyboard",joystick="Joystick",
space="Space",enter="Enter",
setting2Help="Arrowkey to select/change slot,Enter to change,Esc back",
actName={"Move Left:","Move Right:","Rotate Right:","Rotate Left:","Rotate Flip:","Hard Drop:","Soft Drop:","Hold:","Function:","Restart:","Instant Left:","Instant Right:","Ins Down:"},
modeName={
[0]="Custom",
"Sprint","Marathon","Master","Classic","Zen","Infinite","1v1","TSD-only","Blind","Dig","Survivor","Tech",
"C4W Train","PC Train","PC Challenge","Techmino49","Techmino99","Drought","Hotseat",
},
modeInfo={
sprint="Speed run",
marathon="Survive and reach target",
master="To be Grand Master",
classic="Vintage car drag racing",
zen="Clear 200 Lines without gravity",
infinite="Infinite game,infinite happiness",
solo="Beat AI",
tsd="Make more T-spin-doubles",
blind="Invisible board",
dig="Downstack!",
survivor="Hand them!",
tech="Don't do normal clear",
c4wtrain="Infinite combo",
pctrain="Let's learn some PCs",
pcchallenge="Make PCs in 100 Lines",
techmino49="Melee fight with 48 AIs",
techmino99="Melee fight with 98 AIs",
drought="ERRSEQ flood attack",
hotseat="",
},
load={"Loading VOICE","Loading BGM","Loading SFX","Finished",},
tips={
"Not animation,real loading!",
"The WHOLE game is made by MrZ!",
"Back to Back 10 combo Techrash PC!",
"Techmino has a Nspire-CX edition!",
"Is B2B2B2B possible?",
"MEGACMB!",
"ALLSPIN!",
"O spin triple?",
"You can play with any input device!",
"Miya:Nya!",
"225238922,Bilibili cheers!",
"Playing too much = taking drugs",
"Disappearing doesn't mean useless",
"Try to use two rotate button,three better",
"Small DAS&ARR can make you faster,if you can adapt to it",
"Have you noticed what does \"rotating\" do to block?",
"20G is a brand new game rule",
"Do not play game in class!",
"This game can be very hard,be mentally perpared",
"This in not a casual game",
"Nothing will happen when some special day come",
"[random text]",
},
stat={
"Games run:",
"Games played:",
"Game time:",
"Key pressed:",
"Rotate:",
"Hold:",
"Block used:",
"Rows cleared:",
"Attack:",
"Sent:",
"Receive:",
"Pend:",
"Clear:",
"Spin:",
"B2B:",
"PC:",
"Efficiency:",
},
help={
"I don't think you need \"help\".",
"THIS IS ONLY A BLOCK GAME",
"But just play like playing TOP/C2/KOS/TGM3",
"Game is not public now,so DO NOT DISTIRBUTE",
"",
"Powered by LOVE2D",
"Author:MrZ E-mail:1046101471@qq.com",
"Programe:MrZ Art:MrZ Music:MrZ SFX:MrZ VOICE:Miya",
"Tool used:VScode,GFIE,Beepbox,Goldwave",
"Special thanks:Farter,Teatube,196,Flyz,T830,[all test staff] and YOU!",
"Any bugs/suggestions to my E-mail.",
},
support="Support Author",
group="Official QQ Group",
ButtonText={
main={
play="Play",
setting="Settings",
stat="Statistics",
help="Help",
quit="Quit",
},
mode={
up="Λ",
down="v",
left="<",
right=">",
start="Start",
custom="Custom(C)",
back="Back",
},
custom={
up="Λ",
down="v",
left="<",
right=">",
start1="Clear Start",
start2="Puzzle Start",
draw="Draw(D)",
back="Back",
},
draw={
free="FREE",
block1="",
block2="",
block3="",
block4="",
block5="",
block6="",
block7="",
gb1="",
gb2="",
gb3="",
gb4="",
gb5="",
erase="×",
clear="CLEAR",
back="Back",
},
play={
pause="Pause",
},
pause={
resume="Resume",
quit="Quit",
},
setting={
ghost=function()return setting.ghost and"Ghost:ON"or"Ghost:OFF"end,
center=function()return setting.center and"Center:ON"or"Center:OFF"end,
grid=function()return setting.grid and"Grid:ON"or"Grid:OFF"end,
swap=function()return setting.swap and"Swap:comboKey"or"Swap:loop"end,
fxs=function()return setting.fxs and"FXs:ON"or"FXs:OFF"end,
bg=function()return setting.bg and"BG:ON"or"BG:OFF"end,
dasD="-",dasU="+",
arrD="-",arrU="+",
sddasD="-",sddasU="+",
sdarrD="-",sdarrU="+",
ctrl="Control settings",
touch="Touch settings",
lang=function()return langName[setting.lang]end,
sfx=function()return setting.sfx and"SFX:ON"or"SFX:OFF"end,
bgm=function()return setting.bgm and"BGM:ON"or"BGM:OFF"end,
voc=function()return setting.voc and"VOC:ON"or"VOC:OFF"end,
vib=function()return "VIB:"..setting.vib end,
fullscreen=function()return setting.fullscreen and"Fullscreen:ON"or"Fullscreen:OFF"end,
bgblock=function()return setting.bgblock and"BG animation:ON"or"BG animation:OFF"end,
frame=function()return"FrameDraw:"..setting.frameMul.."%"end,
skin="Change Block Skin",
back="Save&Back",
},
setting2={
back="Back",
},
setting3={
back="Back",
hide=function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end,
default="Defaults",
snap=function()return text.snapLevelName[snapLevel]end,
alpha=function()return percent0to5[setting.virtualkeyAlpha]end,
icon="Icon",
size="Size",
},
help={
back="Back",
qq="Author's qq",
},
stat={
back="Back",
path="Open Data Folder",
},
}
}

Some files were not shown because too many files have changed in this diff Show More