diff --git a/ai.lua b/ai.lua index 74beed4e..d2341fc5 100644 --- a/ai.lua +++ b/ai.lua @@ -5,7 +5,7 @@ VerticalTransitions BlockedCells Wells FilledLines -TetrisShape +TechrashShape BlockedWells; ]] dirCount={1,1,3,3,3,0,1} @@ -97,17 +97,17 @@ function getScore(field,cb,cx,cy) for x=1,9 do local dh=abs(height[x]-height[x]) if dh>1 then - rough=rough+min(dh^2,10) + rough=rough+min(dh^1.5,10) end end ins(freeRow,height) return -highest*5 - -rough*15 + -rough*20 -cy*20 -#cb*10 +clear^2*4 - -hole*15 + -hole*25 end function AI_getControls(ctrl) local Tfield={}--test field @@ -119,7 +119,7 @@ function AI_getControls(ctrl) end end local best={x=1,dir=0,hold=false,score=-9e99} - for ifhold=0,1 do + for ifhold=0,gameEnv.hold and 1 or 0 do local bn=ifhold==0 and bn or hn>0 and hn or nxt[1] for dir=0,dirCount[bn] do--each dir local cb=blocks[bn][dir] diff --git a/call&sys.lua b/call&sys.lua index 0a267e9d..c2a48a5b 100644 --- a/call&sys.lua +++ b/call&sys.lua @@ -58,6 +58,25 @@ function keyDown.mode(key) if modeSel>1 then modeSel=modeSel-1 end elseif key=="return"then startGame(modeID[modeSel]) + elseif key=="c"then + gotoScene("custom") + elseif key=="escape"then + back() + end +end +function keyDown.custom(key) + if key=="left"then + local k=customID[optSel] + customSel[k]=(customSel[k]-2)%#customRange[k]+1 + elseif key=="right"then + local k=customID[optSel] + customSel[k]=customSel[k]%#customRange[k]+1 + elseif key=="down"then + optSel=optSel%#customID+1 + elseif key=="up"then + optSel=(optSel-2)%#customID+1 + elseif key=="return"then + startGame("custom") elseif key=="escape"then back() end @@ -219,7 +238,7 @@ function love.mousepressed(x,y,k,t,num) if not t then mouseShow=true mx,my=convert(x,y) - if mouseDown[scene]then mouseDown[scene](mx,my,k)end + --if mouseDown[scene]then mouseDown[scene](mx,my,k)end if k==1 then if not sceneSwaping and Buttons.sel then local B=Buttons[scene][Buttons.sel] @@ -229,7 +248,7 @@ function love.mousepressed(x,y,k,t,num) love.mousemoved(x,y) sysSFX("button") end - elseif k==3 then + elseif k==2 then back() end end diff --git a/cb.ttf b/cb.ttf deleted file mode 100644 index ed0d1180..00000000 Binary files a/cb.ttf and /dev/null differ diff --git a/conf.lua b/conf.lua index 7461dcd8..d9705bcd 100644 --- a/conf.lua +++ b/conf.lua @@ -5,11 +5,11 @@ function love.conf(t) t.version="11.1" t.console=X t.accelerometerjoystick=X--Enable the accelerometer on iOS and Android by exposing it as a Joystick (boolean) - t.gammacorrect=true + t.gammacorrect=X t.audio.mixwithsystem=true--Switch on to keep background music playing local W=t.window - W.title="Techmino V0.68" + W.title="Techmino V0.7.1" W.icon="/image/icon.png" W.width,W.height=1280,720 W.borderless=X diff --git a/gamefunc.lua b/gamefunc.lua index f3aaed4d..a5051dbc 100644 --- a/gamefunc.lua +++ b/gamefunc.lua @@ -42,7 +42,7 @@ function createPlayer(id,x,y,size,AIspeed,data) P.control=false P.timing=false P.time=0 - P.cstat={key=0,piece=0,row=0,atk=0,tetris=0}--Current gamestat + P.cstat={key=0,piece=0,row=0,atk=0,techrash=0}--Current gamestat P.keyTime={}for i=1,10 do P.keyTime[i]=-1e5 end P.keySpeed=0 P.dropTime={}for i=1,10 do P.dropTime[i]=-1e5 end P.dropSpeed=0 @@ -74,12 +74,13 @@ function createPlayer(id,x,y,size,AIspeed,data) P.nb[i]=blocks[P.nxt[i]][0] end--First bag + P.freshNext=randomMethod[P.gameEnv.sequence] if P.gameEnv.sequence==1 then P.bag={}--Bag7 elseif P.gameEnv.sequence==2 then P.his={}for i=1,4 do P.his[i]=P.nxt[i+3]end--History4 elseif P.gameEnv.sequence==3 then--Pure random end + P.showTime=P.gameEnv.visible==1 and 1e99 or P.gameEnv.visible==2 and 300 or 20 - P.freshNext=randomMethod[P.gameEnv.sequence] P.cb,P.sc,P.bn,P.r,P.c,P.cx,P.cy,P.dir,P.y_img={{}},{0,0},1,0,0,0,0,0,0 P.keyPressing={}for i=1,12 do P.keyPressing[i]=false end P.moving,P.downing=0,0 @@ -221,7 +222,7 @@ function pressKey(i,player) ins(keyTime,1,frame)rem(keyTime,11) cstat.key=cstat.key+1 - if player.id==1 then stat.key=stat.key+1 end + if P.id==1 then stat.key=stat.key+1 end --Key count end -- if playmode=="recording"then ins(rec,{i,frame})end @@ -322,21 +323,21 @@ function drop() P.combo=P.combo+1--combo=0 is under if cc==4 then if b2b>500 then - showText("Tetris B2B2B","fly",70) + showText("Techrash B2B2B","fly",70) csend=6 sendTime=80 exblock=exblock+1 elseif b2b>=100 then - showText("Tetris B2B","drive",70) + showText("Techrash B2B","drive",70) sendTime=70 csend=5 else - showText("Tetris","stretch",80) + showText("Techrash","stretch",80) sendTime=60 csend=4 end P.b2b=P.b2b+100 - P.cstat.tetris=P.cstat.tetris+1 + P.cstat.techrash=P.cstat.techrash+1 elseif cc>0 then if dospin then if b2b>500 then @@ -433,9 +434,9 @@ function drop() end elseif cc==0 then if P.b2b>450 then - P.b2b=max(b2b-2,450) + P.b2b=b2b-10 elseif P.b2b>100 then - P.b2b=max(b2b-5,100) + P.b2b=max(b2b-6,100) end garbageRelease() end diff --git a/image/block/1.png b/image/block/1.png new file mode 100644 index 00000000..80fb3e13 Binary files /dev/null and b/image/block/1.png differ diff --git a/image/block/1/1.png b/image/block/1/1.png deleted file mode 100644 index 472a8d14..00000000 Binary files a/image/block/1/1.png and /dev/null differ diff --git a/image/block/1/10.png b/image/block/1/10.png deleted file mode 100644 index 6159a4ab..00000000 Binary files a/image/block/1/10.png and /dev/null differ diff --git a/image/block/1/11.png b/image/block/1/11.png deleted file mode 100644 index 2030cca5..00000000 Binary files a/image/block/1/11.png and /dev/null differ diff --git a/image/block/1/12.png b/image/block/1/12.png deleted file mode 100644 index 992f1c75..00000000 Binary files a/image/block/1/12.png and /dev/null differ diff --git a/image/block/1/13.png b/image/block/1/13.png deleted file mode 100644 index 74ed4cab..00000000 Binary files a/image/block/1/13.png and /dev/null differ diff --git a/image/block/1/2.png b/image/block/1/2.png deleted file mode 100644 index e17d239b..00000000 Binary files a/image/block/1/2.png and /dev/null differ diff --git a/image/block/1/3.png b/image/block/1/3.png deleted file mode 100644 index a50596a6..00000000 Binary files a/image/block/1/3.png and /dev/null differ diff --git a/image/block/1/4.png b/image/block/1/4.png deleted file mode 100644 index ddb10aa2..00000000 Binary files a/image/block/1/4.png and /dev/null differ diff --git a/image/block/1/5.png b/image/block/1/5.png deleted file mode 100644 index d1cf98a0..00000000 Binary files a/image/block/1/5.png and /dev/null differ diff --git a/image/block/1/6.png b/image/block/1/6.png deleted file mode 100644 index 330d6f91..00000000 Binary files a/image/block/1/6.png and /dev/null differ diff --git a/image/block/1/7.png b/image/block/1/7.png deleted file mode 100644 index 1d8e2217..00000000 Binary files a/image/block/1/7.png and /dev/null differ diff --git a/image/block/1/8.png b/image/block/1/8.png deleted file mode 100644 index 2463647d..00000000 Binary files a/image/block/1/8.png and /dev/null differ diff --git a/image/block/1/9.png b/image/block/1/9.png deleted file mode 100644 index 5752a1fc..00000000 Binary files a/image/block/1/9.png and /dev/null differ diff --git a/list.lua b/list.lua index 1af83f58..c7d9c74a 100644 --- a/list.lua +++ b/list.lua @@ -95,8 +95,11 @@ bgm={ prevMenu={ load=love.event.quit, ready="mode", - play="mode", + play=function() + gotoScene(gamemode~="custom"and"mode"or"custom") + end, mode="main", + custom="mode", help="main", stat="main", setting=function() @@ -109,8 +112,8 @@ prevMenu={ main="quit", } -modeID={"sprint","marathon","zen","infinite","solo","death","blind","puzzle","tetris41","asymsolo","gmroll","p2","p3","p4"} -modeName={"Sprint","Marathon","Zen","Infinite","1v1","Death","Blind","Puzzle","Tetris 41","Asymmetry solo","GM roll","2P","3P","4P"} +modeID={"sprint","marathon","zen","infinite","solo","death","blind","puzzle","techmino41","asymsolo","gmroll","p2","p3","p4"} +modeName={"Sprint","Marathon","Zen","Infinite","1v1","Death","Blind","Puzzle","Techmino 41","Asymmetry solo","GM roll","2P","3P","4P"} modeInfo={ sprint="Clear 40 Lines", marathon="Clear 200 Lines", @@ -120,7 +123,7 @@ modeInfo={ death="Survive under terrible speed", blind="Invisible board!", puzzle="Your keyboard broke", - tetris41="Melee fight with 40 AIs", + techmino41="Melee fight with 40 AIs", asymsolo=" See-->", gmroll="Who want to be the grand master?", p2="2 players game", @@ -128,6 +131,59 @@ modeInfo={ p4="4 players game", } +customID={ + "drop", + "lock", + "wait", + "fall", + "next", + "hold", + "sequence", + "visible", + "target", + "freshLimit", + "opponent", +}--Order +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:", +}--Key str +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"}, + sequence={"bag","his4","random"}, + visible={"Show","half","hide"}, + target=nil, + freshLimit=nil, + opponent={"No CPU",1,2,3,4,5,6,7,8,9,10,11}, +}--number-Val str +customRange={ + drop={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99,-1}, + lock={0,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99}, + wait={1,3,5,7,10,15,20,30,60}, + fall={1,3,5,7,10,15,20,30,60}, + next={0,1,2,3,4,5,6}, + hold={true,false}, + sequence={1,2,3}, + visible={1,2,3}, + target={10,20,40,100,200,500,1000}, + freshLimit={0,5,15,1e99}, + opponent={0,60,30,20,15,10,7,5,4,3,2,1}, +} + actName={"moveLeft","moveRight","rotRight","rotLeft","rotFlip","hardDrop","softDrop","hold","restart","insLeft","insRight","insDown"} actName_show={"Move Left:","Move Right:","Rotate Right:","Rotate Left:","Rotate Flip","Hard Drop:","Soft Drop:","Hold:","Restart:","Instant Left:","Instant Right:","Ins Down:"} blockPos={4,4,4,4,4,5,4} @@ -144,8 +200,8 @@ marathon_drop={[0]=60,48,40,30,24,18,15,12,10,8,7,6,5,4,3,2,1,1,0,0} death_lock={10,9,9,8,8} death_wait={6,6,5,5,4} death_fall={10,9,8,7,6} -snapLevelValue={1,10,20,40,60,80} snapLevelName={"Free pos","Snap-10","Snap-20","Snap-40","Snap-60","Snap-80"} +snapLevelValue={1,10,20,40,60,80} act={ moveLeft=function(auto) @@ -180,7 +236,10 @@ act={ end end, softDrop=function() - if cy~=y_img then P.cy=cy-1 end + if cy~=y_img then + P.cy=cy-1 + P.spinLast=false + end P.downing=1 end, rotRight=function()spin(1)end, @@ -205,8 +264,22 @@ act={ freshgho() end end, - down1=function()if cy~=y_img then P.cy=cy-1 end end, - down4=function()for i=1,4 do if cy~=y_img then P.cy=cy-1 else break end end end, + down1=function() + if cy~=y_img then + P.cy=cy-1 + P.spinLast=false + end + end, + down4=function() + for i=1,4 do + if cy~=y_img then + P.cy=cy-1 + P.spinLast=false + else + break + end + end + end, quit=function()Event.gameover.lose()end, --System movements } @@ -232,38 +305,38 @@ TRS={ [1]={ [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{0,1}}, [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1}}, - [12]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, - [21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, - [23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, - [32]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}}, + [12]={{0,0},{1,0},{1,-1},{-1,0},{0,2},{1,2}}, + [21]={{0,0},{-1,0},{-1,1},{1,0},{0,-2},{-1,-2}}, + [23]={{0,0},{1,0},{1,1},{1,-1},{0,-2},{1,-2}}, + [32]={{0,0},{-1,0},{-1,-1},{-1,1},{0,2},{-1,2}}, [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}}, [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, [02]={{0,0},{1,0},{-1,0},{0,-1},{0,1}}, [20]={{0,0},{-1,0},{1,0},{0,1},{0,-1}}, - [13]={{0,0},{0,-1},{0,1},{-1,0},{1,0},{0,2}}, - [31]={{0,0},{0,1},{0,-1},{1,0},{-1,0},{0,2}}, - }, + [13]={{0,0},{0,-1},{0,1},{-1,0}}, + [31]={{0,0},{0,1},{0,-1},{1,0}}, + },--Z/J [2]={ [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, [10]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, - [12]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, - [21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, - [23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, - [32]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}}, - [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}}, - [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{0,1}}, + [12]={{0,0},{1,0},{1,-1},{1,1},{0,2},{1,2}}, + [21]={{0,0},{-1,0},{-1,1},{-1,-1},{0,-2},{-1,-2}}, + [23]={{0,0},{1,0},{1,1},{-1,0},{0,-2},{1,-2}}, + [32]={{0,0},{-1,0},{-1,-1},{1,0},{0,2},{-1,2}}, + [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1},{-1,1}}, + [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{1,-1},{0,1}}, [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, [20]={{0,0},{1,0},{-1,0},{0,1},{0,-1}}, - [13]={{0,0},{0,1},{0,-1},{1,0},{-1,0},{0,2}}, - [31]={{0,0},{0,-1},{0,1},{-1,0},{1,0},{0,2}}, - }, + [13]={{0,0},{0,1},{0,-1},{1,0}}, + [31]={{0,0},{0,-1},{0,1},{-1,0}}, + },--S/L [5]={ - [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, - [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1}}, - [12]={{0,0},{1,0},{1,-1},{0,2},{1,2}}, - [21]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2}}, - [23]={{0,0},{1,0},{1,1},{0,-2},{1,-2}}, - [32]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2}}, + [01]={{0,0},{-1,0},{-1,1},{0,-2},{-1,-2},{-1,-1},{0,1}}, + [10]={{0,0},{1,0},{1,-1},{0,2},{1,2},{0,-1},{1,1}}, + [12]={{0,0},{1,0},{1,-1},{0,-1},{-1,-1},{0,2},{1,2}}, + [21]={{0,0},{-1,0},{-1,1},{1,1},{0,-2},{-1,-2}}, + [23]={{0,0},{1,0},{1,1},{-1,1},{0,-2},{1,-2}}, + [32]={{0,0},{-1,0},{-1,-1},{0,-1},{1,-1},{0,2},{-1,2}}, [30]={{0,0},{-1,0},{-1,-1},{0,2},{-1,2},{0,-1}}, [03]={{0,0},{1,0},{1,1},{0,-2},{1,-2},{0,1}}, [02]={{0,0},{-1,0},{1,0},{0,-1},{0,1}}, @@ -295,13 +368,22 @@ Buttons={ {x=250,y=380,w=330,h=60,rgb=color.blue,t="Settings",code=function()gotoScene("setting")end,up=1,down=3}, {x=165,y=460,w=160,h=60,rgb=color.yellow,t="Help",code=function()gotoScene("help")end,up=2,down=5,right=4}, {x=335,y=460,w=160,h=60,rgb=color.cyan,t="Statistics",code=function()gotoScene("stat")end,up=2,down=5,left=3}, - {x=250,y=540,w=330,h=60,rgb=color.grey,t="Quit",code=function()gotoScene("quit")end,up=3}, + {x=250,y=540,w=330,h=60,rgb=color.grey,t="Quit",code=back,up=3}, }, mode={ - {x=1000,y=210,w=200,h=140,rgb=color.white,hide=function()return not setting.virtualkeySwitch end,code=function()if modeSel>1 then modeSel=modeSel-1 end end}, - {x=1000,y=430,w=200,h=140,rgb=color.white,t="v",f=80,hide=function()return not setting.virtualkeySwitch end,code=function()if modeSel<#modeID then modeSel=modeSel+1 end end}, + {x=1000,y=210,w=200,h=140,rgb=color.white,t="Λ",f=64,code=function()if modeSel>1 then modeSel=modeSel-1 end end}, + {x=1000,y=430,w=200,h=140,rgb=color.white,t="v",f=80,code=function()if modeSel<#modeID then modeSel=modeSel+1 end end}, {x=1000,y=600,w=180,h=80,rgb=color.green,t="Start",code=function()startGame(modeID[modeSel])end}, - {x=640,y=630,w=180,h=60,rgb=color.white,t="Back",code=function()gotoScene("main")end}, + {x=400,y=150,w=180,h=80,rgb=color.yellow,t="Custom(c)",code=function()gotoScene("custom")end}, + {x=640,y=630,w=180,h=60,rgb=color.white,t="Back",code=back}, + }, + custom={ + {x=1000,y=200,w=100,h=100,rgb=color.white,t="Λ",f=40,code=function()optSel=(optSel-2)%#customID+1 end}, + {x=1000,y=440,w=100,h=100,rgb=color.white,t="v",f=50,code=function()optSel=optSel%#customID+1 end}, + {x=880,y=320,w=100,h=100,rgb=color.white,t="<",f=50,code=function()local k=customID[optSel]customSel[k]=(customSel[k]-2)%#customRange[k]+1 end}, + {x=1120,y=320,w=100,h=100,rgb=color.white,t=">",f=50,code=function()local k=customID[optSel]customSel[k]=customSel[k]%#customRange[k]+1 end}, + {x=1000,y=580,w=180,h=80,rgb=color.green,t="Start",code=function()startGame("custom")end}, + {x=640,y=630,w=180,h=60,rgb=color.white,t="Back",code=back}, }, play={ }, @@ -350,14 +432,14 @@ Buttons={ end,up=14,down=16}, {x=870,y=420,w=340,h=60,rgb=color.green,t="Control settings",code=function()gotoScene("setting2")end,up=15,down=17}, {x=870,y=500,w=340,h=60,rgb=color.yellow,t="Touch settings",code=function()gotoScene("setting3")end,up=16,down=18}, - {x=640,y=640,w=210,h=60,rgb=color.white,t="Save&Back",code=function()back()end,up=17}, + {x=640,y=640,w=210,h=60,rgb=color.white,t="Save&Back",code=back,up=17}, --15~18 }, setting2={--Control setting - {x=840,y=630,w=180,h=60,rgb=color.white,t="Back",code=function()keysetting=nil;back()end}, + {x=840,y=630,w=180,h=60,rgb=color.white,t="Back",code=back}, }, setting3={--Touch setting - {x=640,y=410,w=170,h=80,t="Back",code=function()back()end}, + {x=640,y=410,w=170,h=80,t="Back",code=back}, {x=640,y=210,w=500,h=80,t=function()return setting.virtualkeySwitch and"Hide Virtual Key"or"Show Virtual Key"end,code=function() setting.virtualkeySwitch=not setting.virtualkeySwitch end}, @@ -388,11 +470,11 @@ Buttons={ end}, }, help={ - {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end,right=2}, + {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=back,right=2}, {x=980,y=590,w=230,h=60,rgb=color.white,t="Author's qq",code=function()sys.openURL("tencent://message/?uin=1046101471&Site=&Menu=yes")end,left=1}, }, stat={ - {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=function()back()end}, + {x=640,y=590,w=180,h=60,rgb=color.white,t="Back",code=back}, }, sel=nil,--selected button id(integer) } @@ -435,7 +517,7 @@ Text={ }, help={ "I think you don't need \"help\".", - "THIS IS NOT TETRIS,and SRS NOT USED.", + "THIS IS ONLY A SMALL BLOCK GAME", "But just play like playing TOP/C2/KOS/TGM3", "Game is not public now,so DO NOT DISTIRBUTE", "", diff --git a/main.lua b/main.lua index 5e02a672..f81438e0 100644 --- a/main.lua +++ b/main.lua @@ -3,6 +3,7 @@ toN,toS=tonumber,tostring int,ceil,abs,rnd,max,min,sin,cos,atan,pi=math.floor,math.ceil,math.abs,math.random,math.max,math.min,math.sin,math.cos,math.atan,math.pi sub,gsub,find,format,byte,char=string.sub,string.gsub,string.find,string.format,string.byte,string.char ins,rem,sort=table.insert,table.remove,table.sort +null=function()end ww,wh=gc.getWidth(),gc.getHeight() Timer=tm.getTime--Easy&Quick to get time! @@ -28,7 +29,7 @@ function setFont(s) if Fonts[s]then gc.setFont(Fonts[s]) else - local t=gc.setNewFont("cb.ttf",s) + local t=gc.setNewFont("siyuanhei.otf",s-5) Fonts[s]=t gc.setFont(t) end @@ -41,11 +42,11 @@ gameEnv0={ sddas=0,sdarr=2, ghost=true,center=true, drop=30,lock=45, - wait=0,fall=20, + wait=1,fall=1, next=6,hold=true, sequence=1,visible=1, - _20G=false,target=9e99, - freshLimit=9e99, + _20G=false,target=1e99, + freshLimit=1e99, virtualkey={ {80,720-80,6400,80},--moveLeft {240,720-80,6400,80},--moveRight @@ -57,9 +58,22 @@ gameEnv0={ {1280-80,720-400,6400,80},--hold {80,80,6400,80},--restart }, - reach=function()end, + reach=null, --not all is actually used,some only provide a key } +customSel={ + drop=20, + lock=20, + wait=1, + fall=1, + next=7, + hold=1, + sequence=1, + visible=1, + target=4, + freshLimit=3, + opponent=1, +} randomMethod={ function() P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1) @@ -75,13 +89,10 @@ randomMethod={ end, function() P.bn,P.cb=rem(P.nxt,1),rem(P.nb,1) - for j=1,4 do - local i,f=rnd(7) - for k=1,4 do - if i==P.his[k]then f=true end - end - if not f then break end - end + local i,j=nil,0 + ::r:: + i,j=rnd(7),j+1 + if(i==P.his[1]or i==P.his[2]or i==P.his[3]or i==P.his[4])and j<6 then goto r end P.nxt[6],P.nb[6]=i,blocks[i][0] rem(P.his,1)ins(P.his,i) end, @@ -94,8 +105,7 @@ randomMethod={ loadmode={ sprint=function() modeEnv={ - wait=1, - fall=1, + drop=60, target=40, reach=Event.gameover.win, } @@ -107,8 +117,6 @@ loadmode={ modeEnv={ drop=1e99, lock=1e99, - wait=1, - fall=1, target=200, reach=Event.gameover.win, } @@ -120,8 +128,6 @@ loadmode={ modeEnv={ drop=1e99, lock=1e99, - wait=1, - fall=1, } createPlayer(1,340,15) curBG="glow" @@ -145,7 +151,6 @@ loadmode={ marathon=function() modeEnv={ drop=60, - wait=1, fall=20, target=10, reach=Event.marathon_reach, @@ -179,7 +184,6 @@ loadmode={ _20G=true, drop=0, lock=1e99, - wait=1, fall=10, target=40, reach=Event.gameover.win, @@ -188,10 +192,8 @@ loadmode={ curBG="glow" BGM("way") end, - tetris41=function() + techmino41=function() modeEnv={ - wait=1, - fall=1, freshLimit=15, } royaleMode=true @@ -216,8 +218,6 @@ loadmode={ end, solo=function() modeEnv={ - wait=1, - fall=1, freshLimit=15, } createPlayer(1,20,15)--Player @@ -230,8 +230,6 @@ loadmode={ modeEnv={ drop=15, lock=30, - wait=1, - fall=1, visible=0, freshLimit=10, } @@ -242,8 +240,6 @@ loadmode={ end, asymsolo=function() modeEnv={ - wait=1, - fall=1, visible=2, freshLimit=15, } @@ -255,8 +251,6 @@ loadmode={ end, p2=function() modeEnv={ - wait=1, - fall=1, freshLimit=15, } createPlayer(1,20,15) @@ -267,8 +261,6 @@ loadmode={ end, p3=function() modeEnv={ - wait=1, - fall=1, freshLimit=15, } createPlayer(1,20,100,.65) @@ -280,8 +272,6 @@ loadmode={ end, p4=function() modeEnv={ - wait=1, - fall=1, freshLimit=15, } createPlayer(1,25,150,.5) @@ -292,6 +282,23 @@ loadmode={ curBG="game2" BGM("way") end, + custom=function() + modeEnv={reach=Event.gameover.win} + for i=1,#customID do + local k=customID[i] + modeEnv[k]=customRange[k][customSel[k]] + end + modeEnv._20G=modeEnv.drop==-1 + if modeEnv.opponent==0 then + createPlayer(1,340,15) + else + modeEnv.target=nil + createPlayer(1,20,15) + createPlayer(2,660,85,.9,modeEnv.opponent) + end + curBG="matrix" + BGM("reason") + end, } Event={ gameover={ @@ -429,59 +436,65 @@ mesDisp={ mStr(cstat.atk,-75,320) mStr(format("%.2f",2.5*cstat.atk/cstat.piece),-75,430) setFont(20) - gc.print("Attack",-103,360) - gc.print("Efficiency",-114,472) + gc.print("Attack",-100,360) + gc.print("Efficiency",-108,472) end, gmroll=function() - setFont(35) - gc.print("Tetris",-120,390) + setFont(30) + gc.print("Techrash",-130,390) setFont(80) - mStr(cstat.tetris,-75,420) + mStr(cstat.techrash,-75,420) end, marathon=function() setFont(50) mStr(P.cstat.row,-75,330) mStr(gameEnv.target,-75,380) - gc.line(-120,377,-30,377) + gc.rectangle("fill",-120,376,90,4) end, death=function() setFont(50) mStr(P.cstat.row,-75,330) mStr(gameEnv.target,-75,380) - gc.line(-120,377,-30,377) + gc.rectangle("fill",-120,376,90,4) end, puzzle=function() setFont(75) mStr(max(40-P.cstat.row,0),-75,280) end, - tetris41=function() + techmino41=function() gc.draw(badgeIcon,-120,150,nil,1.5) setFont(50) gc.print(badge,-65,150) mStr(cstat.atk,-75,320) mStr(#players.alive,-75,430) setFont(20) - gc.print("Attack",-103,360) + gc.print("Attack",-100,360) gc.print("Remain",-105,472) end, blind=function() - setFont(35) - gc.print("Rows",-115,220) - gc.print("Tetris",-120,390) + setFont(30) + gc.print("Rows",-110,220) + gc.print("Techrash",-130,390) setFont(80) mStr(P.cstat.row,-75,250) - mStr(cstat.tetris,-75,420) + mStr(cstat.techrash,-75,420) end, solo=function() - gc.print("Attack",-130,365) + gc.print("Attack",-128,365) setFont(80) mStr(cstat.atk,-75,300) end, asymsolo=function() - gc.print("Attack",-132,365) + gc.print("Attack",-128,365) setFont(80) mStr(cstat.atk,-75,300) end, + custom=function() + if gameEnv.target<1e4 then + setFont(75) + mStr(max(gameEnv.target-P.cstat.row,0),-75,280) + end + end } --Game system Data @@ -547,12 +560,12 @@ stat={ } --User Data&User Setting --------------------------------Wrning!_G __index Ply[n] when chng any playr's elments! -require("list") -require("texture") -require("ai") require("toolfunc") require("sysfunc") require("gamefunc") +require("list") +require("texture") +require("ai") require("timer") require("paint") require("scene") diff --git a/paint.lua b/paint.lua index 9d104109..ece766d1 100644 --- a/paint.lua +++ b/paint.lua @@ -190,6 +190,15 @@ function Pnt.BG.strap() gc.draw(background[2],x,0,nil,10) gc.draw(background[2],x-1280,0,nil,10) end +function Pnt.BG.matrix() + for i=0,15 do + for j=0,8 do + local t=sin(Timer()*((2.468*i-1.357*j)%3))*.3 + gc.setColor(t,t,t) + gc.rectangle("fill",80*i,80*j,80,80) + end + end +end function Pnt.load() gc.setLineWidth(4) @@ -198,28 +207,18 @@ function Pnt.load() gc.setColor(1,1,1) gc.rectangle("line",340,340,640,40) setFont(30) - mStr(Text.load[loading],640,345) + mStr(Text.load[loading],640,346) setFont(20) mStr("not animation,real loading!",640,392) end function Pnt.main() gc.setColor(1,1,1) setFont(30) - gc.print("Alpha V0.68",370,150) + gc.print("Alpha V0.7.1",370,150) gc.print(system,530,110) gc.draw(titleImage,30,30) end function Pnt.mode() - if setting.virtualkeySwitch then - gc.setColor(.5,.5,.5) - gc.draw(charV,1019,249,pi) - gc.draw(charV,1021,249,pi) - gc.draw(charV,1019,251,pi) - gc.draw(charV,1020,251,pi) - gc.setColor(1,1,1) - gc.draw(charV,1020,250,pi) - end - gc.setColor(1,1,1) setFont(30) mStr(modeInfo[modeID[modeSel]],270,300) setFont(80) @@ -234,6 +233,25 @@ function Pnt.mode() end end end +function Pnt.custom() + setFont(80) + gc.setColor(color.lightGrey) + gc.print("Custom Game",20,20) + gc.setColor(color.white) + gc.print("Custom Game",22,23) + setFont(35) + for i=1,#customID do + local k=customID[i] + local y=90+35*i + gc.print(customOption[k],50,y) + if customVal[k]then + gc.print(customVal[k][customSel[k]],350,y) + else + gc.print(customRange[k][customSel[k]],350,y) + end + end + gc.print("→",10,88+35*optSel) +end function Pnt.play() for p=1,#players do P=players[p] diff --git a/scene.lua b/scene.lua index 17dd7fa9..13b9d0e6 100644 --- a/scene.lua +++ b/scene.lua @@ -23,6 +23,12 @@ function game.mode() curBG="none" BGM("blank") end +function game.custom() + optSel=optSel or 1 + scene="custom" + curBG="matrix" + BGM("blank") +end function game.play() scene="play" --curBG="game1" diff --git a/siyuanhei.otf b/siyuanhei.otf new file mode 100644 index 00000000..53e03e03 Binary files /dev/null and b/siyuanhei.otf differ diff --git a/texture.lua b/texture.lua index 2729cf11..3d39191e 100644 --- a/texture.lua +++ b/texture.lua @@ -1,16 +1,24 @@ -setFont(80) -charV=gc.newText(Fonts[80],"v") local N=gc.newImage +function C(x,y) + c=gc.newCanvas(x,y) + gc.setCanvas(c) +end titleImage=N("/image/mess/title.png") mouseIcon=N("/image/mess/mouseIcon.png") spinCenter=N("/image/mess/spinCenter.png") dialCircle=N("/image/mess/dialCircle.png") dialNeedle=N("/image/mess/dialNeedle.png") badgeIcon=N("/image/mess/badge.png") + blockSkin={} +local img=N("/image/block/1.png") for i=1,13 do - blockSkin[i]=N("/image/block/1/"..i..".png") + C(30,30) + gc.draw(img,30-30*i,0) + blockSkin[i]=c end +img:release() + background={} gc.setColor(1,1,1) background={ @@ -24,7 +32,7 @@ end PTC={dust={}}--Particle systems -c=gc.newCanvas(6,6)gc.setCanvas(c) +C(6,6) gc.clear(1,1,1) PTC.dust[0]=gc.newParticleSystem(c,1000) PTC.dust[0]:setParticleLifetime(.2,.3) diff --git a/timer.lua b/timer.lua index 4f1b2eb9..f9ed2371 100644 --- a/timer.lua +++ b/timer.lua @@ -163,7 +163,9 @@ function Tmr.play(dt) removeRow(field,clearing[i]) removeRow(visTime,clearing[i]) end - P.clearing={} + while #clearing>0 do + rem(clearing) + end end --Rows cleared drop elseif waiting>0 then @@ -190,9 +192,7 @@ function Tmr.play(dt) end P.b2b1=P.b2b1*.93+P.b2b*.07 if P.b2b>500 then - P.b2b=P.b2b-.2 - elseif P.b2b>100 then - P.b2b=P.b2b-.15 + P.b2b=P.b2b-.06 end --Alive else