diff --git a/Zframework/color.lua b/Zframework/color.lua index 1e05dff0..3456562c 100644 --- a/Zframework/color.lua +++ b/Zframework/color.lua @@ -3,10 +3,10 @@ local COLOR={ fire= {1.0, 0.4, 0.0}, orange= {1.0, 0.6, 0.0}, yellow= {1.0, 1.0, 0.0}, - lame= {0.7, 1.0, 0.0}, + lime= {0.7, 1.0, 0.0}, grass= {0.5, 1.0, 0.0}, green= {0.0, 1.0, 0.0}, - water= {0.0, 1.0, 0.6}, + aqua= {0.0, 1.0, 0.6}, cyan= {0.0, 1.0, 1.0}, sky= {0.0, 0.7, 1.0}, sea= {0.0, 0.4, 1.0}, @@ -20,10 +20,10 @@ local COLOR={ lFire= {1.0, 0.7, 0.5}, lOrange= {1.0, 0.8, 0.3}, lYellow= {1.0, 1.0, 0.5}, - lLame= {0.8, 1.0, 0.4}, + lLime= {0.8, 1.0, 0.4}, lGrass= {0.6, 1.0, 0.4}, lGreen= {0.5, 1.0, 0.5}, - lWater= {0.4, 1.0, 0.7}, + lAqua= {0.4, 1.0, 0.7}, lCyan= {0.5, 1.0, 1.0}, lSky= {0.5, 0.8, 1.0}, lSea= {0.4, 0.7, 1.0}, @@ -37,10 +37,10 @@ local COLOR={ dFire= {0.6, 0.3, 0.0}, dOrange= {0.6, 0.4, 0.0}, dYellow= {0.6, 0.6, 0.0}, - dLame= {0.5, 0.6, 0.0}, + dLime= {0.5, 0.6, 0.0}, dGrass= {0.3, 0.6, 0.0}, dGreen= {0.0, 0.6, 0.0}, - dWater= {0.0, 0.6, 0.4}, + dAqua= {0.0, 0.6, 0.4}, dCyan= {0.0, 0.6, 0.6}, dSky= {0.0, 0.4, 0.6}, dSea= {0.0, 0.2, 0.6}, @@ -51,9 +51,9 @@ local COLOR={ dPink= {0.6, 0.0, 0.3}, black= {0.0, 0.0, 0.0}, - dGrey= {0.3, 0.3, 0.3}, - grey= {0.6, 0.6, 0.6}, - lGrey= {0.8, 0.8, 0.8}, + dGray= {0.3, 0.3, 0.3}, + gray= {0.6, 0.6, 0.6}, + lGray= {0.8, 0.8, 0.8}, white= {1.0, 1.0, 1.0}, } local map={ @@ -63,20 +63,20 @@ local map={ W="white", }for k,v in next,map do COLOR[k]=COLOR[v]end -local list_norm={"red","fire","orange","yellow","lame","grass","green","water","cyan","sky","sea","blue","purple","grape","magenta","pink"} +local list_norm={"red","fire","orange","yellow","i","grass","green","aqua","cyan","sky","sea","blue","purple","grape","magenta","pink"} local len_list_norm=#list_norm local rnd=math.random function COLOR.random_norm() return COLOR[list_norm[rnd(len_list_norm)]] end -local list_bright={"lRed","lFire","lOrange","lYellow","lLame","lGrass","lGreen","lWater","lCyan","lSky","lSea","lBlue","lPurple","lGrape","lMagenta","lPink"} +local list_bright={"lRed","lFire","lOrange","lYellow","lLime","lGrass","lGreen","lAqua","lCyan","lSky","lSea","lBlue","lPurple","lGrape","lMagenta","lPink"} local len_list_bright=#list_bright function COLOR.random_bright() return COLOR[list_bright[rnd(len_list_bright)]] end -local list_dark={"dRed","dFire","dOrange","dYellow","dLame","dGrass","dGreen","dWater","dCyan","dSky","dSea","dBlue","dPurple","dGrape","dMagenta","dPink"} +local list_dark={"dRed","dFire","dOrange","dYellow","dLime","dGrass","dGreen","dAqua","dCyan","dSky","dSea","dBlue","dPurple","dGrape","dMagenta","dPink"} local len_list_dark=#list_dark function COLOR.random_dark() return COLOR[list_dark[rnd(len_list_dark)]] @@ -101,7 +101,7 @@ function COLOR.rainbow_dark(phase) sin(phase+2.0944)*.2+.4, sin(phase-2.0944)*.2+.4 end -function COLOR.rainbow_grey(phase) +function COLOR.rainbow_gray(phase) return sin(phase)*.16+.5, sin(phase+2.0944)*.16+.5, diff --git a/Zframework/doGC.lua b/Zframework/doGC.lua index 10708bf7..48193c2e 100644 --- a/Zframework/doGC.lua +++ b/Zframework/doGC.lua @@ -1,13 +1,24 @@ local gc=love.graphics local cmds={ - move="translate", - zoom="scale", - rgb="setColor", - wid="setLineWidth", - line="line", - rect="rectangle", - circ="circle", - poly="polygon", + reset="origin", + trans="translate", + scale="scale", + rotat="rotate", + + setCL="setColor", + setCM="setColorMask", + setLW="setLineWidth", + setLS="setLineStyle", + setLJ="setLineJoin", + + draw="draw", + dLine="line", + fRect=function(...)gc.rectangle("fill",...)end, + dRect=function(...)gc.rectangle("line",...)end, + fCirc=function(...)gc.circle("fill",...)end, + dCirc=function(...)gc.circle("line",...)end, + fPoly=function(...)gc.polygon("fill",...)end, + dPoly=function(...)gc.polygon("line",...)end, } return function(L) gc.push() @@ -17,7 +28,14 @@ return function(L) gc.setColor(1,1,1) gc.setLineWidth(1) for i=3,#L do - gc[cmds[L[i][1]]](unpack(L[i],2)) + print(L[i][1]) + local cmd=cmds[L[i][1]] + print(L[i][1]) + if type(cmd)=="string"then + gc[cmd](unpack(L[i],2)) + else + cmd(unpack(L[i],2)) + end end gc.setCanvas() gc.pop() diff --git a/Zframework/file.lua b/Zframework/file.lua index a57efafa..4453137f 100644 --- a/Zframework/file.lua +++ b/Zframework/file.lua @@ -12,11 +12,13 @@ function FILE.load(name) setfenv(s,{}) return s() end - else + elseif s:sub(1,1)=="["or s:sub(1,1)=="{"then local res=JSON.decode(s) if res then return res end + else + return s end end LOG.print(name.." "..text.loadError,COLOR.red) @@ -24,19 +26,22 @@ function FILE.load(name) end function FILE.save(data,name,mode) if not mode then mode=""end - name=name - if mode:find("l")then - data=DUMPTABLE(data) - if not data then - LOG.print(name.." "..text.saveError.."dump error","error") - return + if type(data)=="table"then + if mode:find("l")then + data=DUMPTABLE(data) + if not data then + LOG.print(name.." "..text.saveError.."dump error","error") + return + end + else + data=JSON.encode(data) + if not data then + LOG.print(name.." "..text.saveError.."json error","error") + return + end end else - data=JSON.encode(data) - if not data then - LOG.print(name.." "..text.saveError.."json error","error") - return - end + data=tostring(data) end local F=fs.newFile(name) diff --git a/Zframework/init.lua b/Zframework/init.lua index 52d69656..b91d8303 100644 --- a/Zframework/init.lua +++ b/Zframework/init.lua @@ -349,7 +349,7 @@ end function love.focus(f) if f then love.timer.step() - elseif SCN.cur=="play"and SETTING.autoPause then + elseif SCN.cur=="game"and SETTING.autoPause then pauseGame() end end @@ -461,10 +461,15 @@ local devColor={ } love.draw,love.update=nil--remove default draw/update function love.run() - local SCN=SCN - local SETTING=SETTING + local love=love + local SCN,WIDGET=SCN,WIDGET + local VOC,BG,SYSFX=VOC,BG,SYSFX + local TASK,LOG,TEXT=TASK,LOG,TEXT + + local SETTING=SETTING local TIME=TIME + local STEP,WAIT=love.timer.step,love.timer.sleep local FPS=love.timer.getFPS local MINI=love.window.isMinimized @@ -506,12 +511,12 @@ function love.run() TASK.update() WS.update(dt) VOC.update() - BG.update(dt) + BG.update(dt)--BG animation SYSFX.update(dt) WIDGET.update()--Widgets animation - if SCN.update then SCN.update(dt)end--Scene Updater + if SCN.update then SCN.update(dt)end--Scene updater if SCN.swapping then SCN.swapUpdate()end--Scene swapping animation - TEXT.update() + TEXT.update()--Update global texts animation LOG.update() --DRAW diff --git a/conf.lua b/conf.lua index d1d29c10..4a8c10c1 100644 --- a/conf.lua +++ b/conf.lua @@ -1,7 +1,7 @@ VERSION={ - code=1404, - string="Alpha V0.14.4", - name="日出 Sunrise", + code=1405, + string="Alpha V0.14.5", + name="晨 Morn", } function love.conf(t) t.identity="Techmino"--Saving folder diff --git a/main.lua b/main.lua index dc8c9faf..e8e3f144 100644 --- a/main.lua +++ b/main.lua @@ -63,6 +63,7 @@ FIELD[1]=newBoard()--Initialize field[1] NET= require"parts.net" AIBUILDER= require"parts.AITemplate" FREEROW= require"parts.freeRow" +USERS= require"parts.users" TEXTURE= require"parts.texture" SKIN= require"parts.skin" diff --git a/media/SFX/drop.ogg b/media/SFX/drop.ogg index 2192f71c..0063a1b9 100644 Binary files a/media/SFX/drop.ogg and b/media/SFX/drop.ogg differ diff --git a/media/image/modeicon/classic.png b/media/image/modeicon/classic.png deleted file mode 100644 index e8c92191..00000000 Binary files a/media/image/modeicon/classic.png and /dev/null differ diff --git a/parts/gametoolfunc.lua b/parts/gametoolfunc.lua index 44f3b301..0c93cfb2 100644 --- a/parts/gametoolfunc.lua +++ b/parts/gametoolfunc.lua @@ -614,7 +614,7 @@ function loadGame(M,ifQuickPlay,ifNet)--Load a mode and go to game scene SCN.go("net_game","swipeD") else drawableText.modeName:set(text.modes[M][1].." "..text.modes[M][2]) - SCN.go("play",ifQuickPlay and"swipeD"or"fade_togame") + SCN.go("game",ifQuickPlay and"swipeD"or"fade_togame") SFX.play("enter") end end @@ -731,7 +731,7 @@ do--function resetGameData(args) end function resetGameData(args,seed) if not args then args=""end - if PLAYERS[1]and not GAME.replaying and(GAME.frame>400 or GAME.result)then + if PLAYERS[1]and not GAME.replaying and(PLAYERS[1].frameRun>400 or GAME.result)then mergeStat(STAT,PLAYERS[1].stat) STAT.todayTime=STAT.todayTime+PLAYERS[1].stat.time end @@ -740,11 +740,11 @@ do--function resetGameData(args) GAME.warnLVL0=0 GAME.warnLVL=0 if args:find("r")then - GAME.frame=0 + GAME.frameStart=0 GAME.recording=false GAME.replaying=1 else - GAME.frame=args:find("n")and 0 or 150-SETTING.reTime*15 + GAME.frameStart=args:find("n")and 0 or 150-SETTING.reTime*15 GAME.seed=seed or rnd(1046101471,2662622626) GAME.pauseTime=0 GAME.pauseCount=0 @@ -790,39 +790,10 @@ do--function resetGameData(args) collectgarbage() end end -function gameStart()--Call when countdown finish (GAME.frame==180) - SFX.play("start") - for P=1,#PLAYERS do - P=PLAYERS[P] - P.control=true - P.timing=true - P:popNext() - end -end -function checkStart() - if GAME.frame<=180 then - if GAME.frame==180 then - gameStart() - elseif GAME.frame==60 or GAME.frame==120 then - SFX.play("ready") - end - for p=1,#PLAYERS do - local P=PLAYERS[p] - if P.movDir~=0 then - if P.moving0 then GAME.warnLVL=max(GAME.warnLVL-.026,0) end - if GAME.warnLVL>1.126 and GAME.frame%30==0 then + if GAME.warnLVL>1.126 and P1.frameRun%30==0 then SFX.fplay("warning",SETTING.sfx_warn) end end @@ -973,7 +944,7 @@ do--function saveRecording() os.date("%Y/%m/%d %A %H:%M:%S\n").. GAME.curModeName.."\n".. VERSION.string.."\n".. - (USER.username or"Player") + "Local Player" local fileBody= GAME.seed.."\n".. JSON.encode(GAME.setting).."\n".. @@ -1006,22 +977,22 @@ do--function drawFWM() string.char(65,117,116,111,114,32,100,111,32,106,111,103,111,58,32,77,114,90,95,50,54,10,71,114,97,118,97,195,167,195,181,101,115,32,99,111,110,116,101,110,100,111,32,101,115,116,97,32,77,97,114,99,97,10,100,101,32,195,161,103,117,97,32,110,195,163,111,32,115,195,163,111,32,97,117,116,111,114,105,122,97,100,97,115), string.char(65,117,116,104,111,114,58,32,77,114,90,95,50,54,10,82,101,99,111,114,100,105,110,103,115,32,99,111,110,116,97,105,110,105,110,103,32,116,104,105,115,10,119,97,116,101,114,109,97,114,107,32,97,114,101,32,117,110,97,117,116,104,111,114,105,122,101,100), } - --你竟然找到了这里!那么在动手之前读读下面这些吧。 - --【魔幻躲关键字搜索警告,看得懂就行】 - --千万不要为了在网络公共场合发视屏或者直播需要而擅自删除这部分代码! - --录制视屏上传到公共场合(包括但不限于任何视屏平台/论坛/几十个人以上的社区群等)很可能会对Techmino未来的发展有负面影响 - --如果被TTC发现,TTC随时可以用DMCA从法律层面强迫停止开发,到时候谁都没得玩。这是真的,已经有几个方块这么死了… + --你竟然找到了这里!那么在动手之前读读下面这些吧。 + --【魔幻错别字躲关键字搜索警告,看得懂就行】 + --千万不要为了在网络公共场合发视屏或者直播需要而擅自删除这部分代码! + --录制视屏上传到公共场合(包括但不限于任何视屏平台/论坛/好几十个人及以上的非方块社区/群等)很可能会对Techmino未来的发展有负面影响 + --如果被TTC发现,随时可能被他们用DMCA从法律层面强迫停止开发,到时候谁都没得玩。这是真的,已经有几个方块这么死了… --氵印限制还可以减少低质量视屏泛滥,也能减轻过多不是真的感兴趣路人玩家入坑可能带来的压力 --想发视屏的话请先向作者申请,描述录制的大致内容,同意了才可以去关闭氵印 --等Techmino发展到一定程度之后会解除这个限制 --最后,别把藏在这里的东西截图/复制出去哦~ - --感谢您对Techmino的支持!!! + --感谢您对Techmino的支持!!! local setFont,TIME,mStr=setFont,TIME,mStr function drawFWM() local t=TIME() setFont(25) gc_setColor(1,1,1,.2+.1*(sin(3*t)+sin(2.6*t))) - mStr(m[SETTING.lang]or m[1],240,60+26*sin(t)) + mStr(m[_G["\83\69\84\84\73\78\71"]["\108\97\110\103"]or m[1]],240,60+26*sin(t)) end end function drawWarning() diff --git a/parts/globalTables.lua b/parts/globalTables.lua index eabb78ae..4ee9d2ec 100644 --- a/parts/globalTables.lua +++ b/parts/globalTables.lua @@ -15,12 +15,12 @@ MODOPT={--Mod options unranked=true, }, {no=2,id="FL",name="hideNext", - key="e",x=320,y=230,color="water", + key="e",x=320,y=230,color="aqua", list={1,2,3,4,5}, func=function(P,O)P.gameEnv.nextStartPos=O +1 end, }, {no=3,id="IH",name="infHold", - key="r",x=440,y=230,color="water", + key="r",x=440,y=230,color="aqua", func=function(P)P.gameEnv.infHold=true end, unranked=true, }, @@ -91,7 +91,7 @@ MODOPT={--Mod options }, {no=16,id="TL",name="tele", - key="z",x=200,y=470,color="lGrey", + key="z",x=200,y=470,color="lGray", func=function(P) P.gameEnv.das,P.gameEnv.arr=0,0 P.gameEnv.sddas,P.gameEnv.sdarr=0,0 @@ -99,7 +99,7 @@ MODOPT={--Mod options unranked=true, }, {no=17,id="FX",name="noRotation", - key="x",x=320,y=470,color="lGrey", + key="x",x=320,y=470,color="lGray", func=function(P) disableKey(P,3) disableKey(P,4) @@ -108,7 +108,7 @@ MODOPT={--Mod options unranked=true, }, {no=18,id="GL",name="noMove", - key="c",x=440,y=470,color="lGrey", + key="c",x=440,y=470,color="lGray", func=function(P) disableKey(P,1)disableKey(P,2) disableKey(P,11)disableKey(P,12) @@ -190,7 +190,6 @@ GAME={--Global game data init=false, --If need initializing game when enter scene-play net=false, --If play net game - frame=0, --Frame count result=false, --Game result (string) rank=false, --Rank reached pauseTime=0, --Time paused @@ -222,14 +221,12 @@ GAME={--Global game data RANKS=FILE.load("conf/unlock")or{sprint_10l=0}--Ranks of modes USER=FILE.load("conf/user")or{--User infomation --Network infos - username=false, uid=false, authToken=false, --Local data xp=0,lv=1, } -USERS=FILE.load("conf/users")or{} SETTING={--Settings --Tuning das=10,arr=2,dascut=0, @@ -252,6 +249,7 @@ SETTING={--Settings 10,13,2,8 }, face={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, + dataSaving=false, --Graphic block=true,ghost=.3,center=1, @@ -333,8 +331,8 @@ keyMap=FILE.load("conf/key")or{--Key setting }, } VK_org=FILE.load("conf/virtualkey")or{--Virtualkey layout, refresh all VKs' position with this before each game - {ava=true, x=80, y=720-200, r=80,color=COLOR.lame},--moveLeft - {ava=true, x=320, y=720-200, r=80,color=COLOR.lame},--moveRight + {ava=true, x=80, y=720-200, r=80,color=COLOR.lime},--moveLeft + {ava=true, x=320, y=720-200, r=80,color=COLOR.lime},--moveRight {ava=true, x=1280-80, y=720-200, r=80,color=COLOR.red},--rotRight {ava=true, x=1280-200, y=720-80, r=80,color=COLOR.orange},--rotLeft {ava=true, x=1280-200, y=720-320, r=80,color=COLOR.magenta},--rot180 @@ -343,16 +341,16 @@ VK_org=FILE.load("conf/virtualkey")or{--Virtualkey layout, refresh all VKs' posi {ava=true, x=1280-320, y=720-200, r=80,color=COLOR.yellow},--hold {ava=true, x=1280-80, y=280, r=80,color=COLOR.lRed},--func1 {ava=true, x=80, y=280, r=80,color=COLOR.lMagenta},--func2 - {ava=false, x=100, y=50, r=80,color=COLOR.water},--insLeft - {ava=false, x=200, y=50, r=80,color=COLOR.water},--insRight + {ava=false, x=100, y=50, r=80,color=COLOR.aqua},--insLeft + {ava=false, x=200, y=50, r=80,color=COLOR.aqua},--insRight {ava=false, x=300, y=50, r=80,color={COLOR.rainbow(3.5)}},--insDown {ava=false, x=400, y=50, r=80,color={COLOR.rainbow(3.3)}},--down1 {ava=false, x=500, y=50, r=80,color={COLOR.rainbow(3.1)}},--down4 {ava=false, x=600, y=50, r=80,color={COLOR.rainbow(2.9)}},--down10 - {ava=false, x=700, y=50, r=80,color=COLOR.lLame},--dropLeft - {ava=false, x=800, y=50, r=80,color=COLOR.lLame},--dropRight - {ava=false, x=900, y=50, r=80,color=COLOR.lWater},--addToLeft - {ava=false, x=1000, y=50, r=80,color=COLOR.lWater},--addToRight + {ava=false, x=700, y=50, r=80,color=COLOR.lLime},--dropLeft + {ava=false, x=800, y=50, r=80,color=COLOR.lLime},--dropRight + {ava=false, x=900, y=50, r=80,color=COLOR.laqua},--addToLeft + {ava=false, x=1000, y=50, r=80,color=COLOR.laqua},--addToRight } virtualkey={}for i=1,#VK_org do virtualkey[i]={}end--In-game virtualkey layout REPLAY=FILE.load("conf/replay")or{} \ No newline at end of file diff --git a/parts/kickList.lua b/parts/kickList.lua index 63ba3f83..d0953eb5 100644 --- a/parts/kickList.lua +++ b/parts/kickList.lua @@ -1,14 +1,15 @@ -local noKick,noKick_180,pushZero do - local zero={0,0} - local Zero={zero} - noKick={[01]=Zero,[10]=Zero,[03]=Zero,[30]=Zero,[12]=Zero,[21]=Zero,[32]=Zero,[23]=Zero} - noKick_180={[01]=Zero,[10]=Zero,[03]=Zero,[30]=Zero,[12]=Zero,[21]=Zero,[32]=Zero,[23]=Zero,[02]=Zero,[20]=Zero,[13]=Zero,[31]=Zero} +local map={}for x=-4,4 do map[x]={}for y=-4,4 do map[x][y]={x,y}end end + +local noKickSet,noKickSet_180,pushZero do + local Zero={map[0][0]} + noKickSet={[01]=Zero,[10]=Zero,[03]=Zero,[30]=Zero,[12]=Zero,[21]=Zero,[32]=Zero,[23]=Zero} + noKickSet_180={[01]=Zero,[10]=Zero,[03]=Zero,[30]=Zero,[12]=Zero,[21]=Zero,[32]=Zero,[23]=Zero,[02]=Zero,[20]=Zero,[13]=Zero,[31]=Zero} function pushZero(t) for _,L in next,t do if type(L)=="table"then for _,v in next,L do if not v[1]or v[1][1]~=0 or v[1][2]~=0 then - table.insert(v,1,zero) + table.insert(v,1,map[0][0]) end end end @@ -16,33 +17,40 @@ local noKick,noKick_180,pushZero do end end -local collect do - local map={} - for x=-3,3 do map[x]={}for y=-3,3 do map[x][y]={x,y}end end - function collect(T)--Make all vec point to the same vec - if type(T)=="table"then - for _,t in next,T do - for k,vec in next,t do - t[k]=map[vec[1]][vec[2]] - end - end +--Convert vector string to table +local function vecStrConv(list) + for k,vecStr in next,list do + list[k]=map[tonumber(vecStr:sub(1,2))][tonumber(vecStr:sub(3,4))] + end +end + +--Make all vec point to the same vec +local function collectSet(set) + if type(set)~="table"then return end + for _,list in next,set do + if type(list[1])=="string"then + vecStrConv(list) end end end -local function C_sym(L)--Use this if the block is centrosymmetry, *PTR!!! +--Use this if the block is centrosymmetry, *PTR!!! +local function centroSymSet(L) L[23]=L[01]L[32]=L[10] L[21]=L[03]L[12]=L[30] L[20]=L[02]L[31]=L[13] end -local function flipList(O)--Use this to copy a symmetry list + +--Use this to copy a symmetry set +local function flipList(O) if not O then return end local L={} - for i=1,#O do - L[i]={-O[i][1],O[i][2]} + for i,s in next,O do + L[i]=string.char(88-s:byte())..s:sub(2) end return L end + local function reflect(a) local b={} b[03]=flipList(a[01]) @@ -80,48 +88,48 @@ do } TRS={ { - [01]={{-1, 0},{-1, 1},{ 0,-2},{-1, 2},{ 0, 1}}, - [10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1,-2},{ 1,-2}}, - [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-1},{ 1,-2}}, - [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}}, - [12]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}}, - [21]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2}}, - [32]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2}}, - [23]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}}, - [02]={{ 1, 0},{-1, 0},{ 0,-1},{ 0, 1}}, - [20]={{-1, 0},{ 1, 0},{ 0, 1},{ 0,-1}}, - [13]={{ 0,-1},{ 0, 1},{-1, 0},{ 0,-2}}, - [31]={{ 0, 1},{ 0,-1},{ 1, 0}}, + [01]={"-1+0","-1+1","+0-2","-1+2","+0+1"}, + [10]={"+1+0","+1-1","+0+2","+1-2","+1-2"}, + [03]={"+1+0","+1+1","+0-2","+1-1","+1-2"}, + [30]={"-1+0","-1-1","+0+2","-1+2","+0-1"}, + [12]={"+1+0","+1-1","+0+2","+1+2"}, + [21]={"-1+0","-1+1","+0-2","-1-2"}, + [32]={"-1+0","-1-1","+0+2","-1+2"}, + [23]={"+1+0","+1+1","+0-2","+1-2"}, + [02]={"+1+0","-1+0","+0-1","+0+1"}, + [20]={"-1+0","+1+0","+0+1","+0-1"}, + [13]={"+0-1","+0+1","+0-2"}, + [31]={"+0+1","+0-1","+0+2"}, },--Z false,--S { - [01]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-2},{ 1, 1}}, - [10]={{ 1, 0},{ 1,-1},{-1, 0},{ 0, 2},{ 1, 2}}, - [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 1,-1},{ 0, 1}}, - [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1},{-1, 1}}, - [12]={{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-1},{ 0, 2},{ 1, 2}}, - [21]={{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 1},{ 0,-2},{-1,-2}}, - [32]={{-1, 0},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{-1, 1}}, - [23]={{ 1, 0},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2}}, - [02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}}, - [20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}}, - [13]={{ 0,-1},{ 0, 1},{ 1, 0}}, - [31]={{ 0, 1},{ 0,-1},{-1, 0}}, + [01]={"-1+0","-1+1","+1+0","+0-2","+1+1"}, + [10]={"+1+0","+1-1","-1+0","+0+2","+1+2"}, + [03]={"+1+0","+1+1","+0-2","+1-2","+1-1","+0+1"}, + [30]={"-1+0","-1-1","+0+2","-1+2","+0-1","-1+1"}, + [12]={"+1+0","+1-1","+1+1","-1+0","+0-1","+0+2","+1+2"}, + [21]={"-1+0","-1+1","-1-1","+1+0","+0+1","+0-2","-1-2"}, + [32]={"-1+0","-1-1","+1+0","+0+2","-1+2","-1+1"}, + [23]={"+1+0","+1-1","-1+0","+1+1","+0-2","+1-2"}, + [02]={"-1+0","+1+0","+0-1","+0+1"}, + [20]={"+1+0","-1+0","+0+1","+0-1"}, + [13]={"+0-1","+0+1","+1+0"}, + [31]={"+0+1","+0-1","-1+0"}, },--J false,--L { - [01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{ 0, 1}}, - [10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 0,-1}}, - [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0, 1}}, - [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}}, - [12]={{ 1, 0},{ 1,-1},{ 0,-1},{-1,-1},{ 0, 2},{ 1, 2}}, - [21]={{-1, 0},{ 0,-2},{-1,-2},{ 1, 1}}, - [32]={{-1, 0},{-1,-1},{ 0,-1},{ 1,-1},{ 0, 2},{-1, 2}}, - [23]={{ 1, 0},{ 0,-2},{ 1,-2},{-1, 1}}, - [02]={{-1, 0},{ 1, 0},{ 0, 1}}, - [20]={{ 1, 0},{-1, 0},{ 0,-1}}, - [13]={{ 0,-1},{ 0, 1},{ 1, 0},{ 0,-2},{ 0, 2}}, - [31]={{ 0,-1},{ 0, 1},{-1, 0},{ 0,-2},{ 0, 2}}, + [01]={"-1+0","-1+1","+0-2","-1-2","+0+1"}, + [10]={"+1+0","+1-1","+0+2","+1+2","+0-1"}, + [03]={"+1+0","+1+1","+0-2","+1-2","+0+1"}, + [30]={"-1+0","-1-1","+0+2","-1+2","+0-1"}, + [12]={"+1+0","+1-1","+0-1","-1-1","+0+2","+1+2"}, + [21]={"-1+0","+0-2","-1-2","+1+1"}, + [32]={"-1+0","-1-1","+0-1","+1-1","+0+2","-1+2"}, + [23]={"+1+0","+0-2","+1-2","-1+1"}, + [02]={"-1+0","+1+0","+0+1"}, + [20]={"+1+0","-1+0","+0-1"}, + [13]={"+0-1","+0+1","+1+0","+0-2","+0+2"}, + [31]={"+0-1","+0+1","-1+0","+0-2","+0+2"}, },--T function(P,d) if P.gameEnv.easyFresh then @@ -162,111 +170,111 @@ do end end,--O { - [01]={{ 0, 1},{ 1, 0},{-2, 0},{-2,-1},{ 1, 2}}, - [10]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}}, - [03]={{ 0, 1},{-1, 0},{ 2, 0},{ 2,-1},{-1, 2}}, - [30]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}}, - [12]={{-1, 0},{ 2, 0},{ 2,-1},{ 0,-1},{-1, 2}}, - [21]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}}, - [32]={{ 1, 0},{-2, 0},{-2,-1},{ 0,-1},{ 1, 2}}, - [23]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}}, - [02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}}, - [20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}}, - [13]={{ 0,-1},{-1, 0},{ 1, 0},{ 0, 1}}, - [31]={{ 0,-1},{ 1, 0},{-1, 0},{ 0, 1}}, + [01]={"+0+1","+1+0","-2+0","-2-1","+1+2"}, + [10]={"+2+0","-1+0","-1-2","+2+1","+0+1"}, + [03]={"+0+1","-1+0","+2+0","+2-1","-1+2"}, + [30]={"-2+0","+1+0","+1-2","-2+1","+0+1"}, + [12]={"-1+0","+2+0","+2-1","+0-1","-1+2"}, + [21]={"-2+0","+1+0","+1-2","-2+1","+0+1"}, + [32]={"+1+0","-2+0","-2-1","+0-1","+1+2"}, + [23]={"+2+0","-1+0","-1-2","+2+1","+0+1"}, + [02]={"-1+0","+1+0","+0-1","+0+1"}, + [20]={"+1+0","-1+0","+0+1","+0-1"}, + [13]={"+0-1","-1+0","+1+0","+0+1"}, + [31]={"+0-1","+1+0","-1+0","+0+1"}, },--I { - [01]={{-1, 0},{ 0, 1},{ 1, 1},{ 0,-3},{ 0, 2},{ 0, 3},{-1, 2}}, - [10]={{ 1, 0},{ 0,-1},{-1,-1},{ 0,-2},{ 0,-3},{ 0, 3},{ 1,-2}}, - [03]={{ 1, 0},{ 0,-3},{ 0, 1},{ 0, 2},{ 0, 3},{ 1, 2}}, - [30]={{-1, 0},{ 0, 1},{ 0,-2},{ 0,-3},{ 0, 3},{-1,-2}}, + [01]={"-1+0","+0+1","+1+1","+0-3","+0+2","+0+3","-1+2"}, + [10]={"+1+0","+0-1","-1-1","+0-2","+0-3","+0+3","+1-2"}, + [03]={"+1+0","+0-3","+0+1","+0+2","+0+3","+1+2"}, + [30]={"-1+0","+0+1","+0-2","+0-3","+0+3","-1-2"}, },--Z5 false,--S5 { - [01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{-1,-1},{ 0, 1}}, - [10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 0,-1},{ 1, 1}}, - [03]={{ 1, 0},{ 1, 1},{ 0,-2},{-1, 1}}, - [30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2}}, - [12]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 1, 1}}, - [21]={{-1, 0},{-1,-1},{-1, 1},{ 0,-2},{-1,-2},{-1,-1}}, - [32]={{-1, 0},{-1,-1},{-1, 1},{ 1, 0},{ 0,-1},{ 0, 2},{-1, 2}}, - [23]={{ 1, 0},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2}}, - [02]={{-1, 0},{ 0,-1},{ 0, 1}}, - [20]={{ 1, 0},{ 0, 1},{ 0,-1}}, - [13]={{ 1, 0},{ 0, 1},{-1, 0}}, - [31]={{-1, 0},{ 0,-1},{ 1, 0}}, + [01]={"-1+0","-1+1","+0-2","-1-2","-1-1","+0+1"}, + [10]={"+1+0","+1-1","+0+2","+1+2","+0-1","+1+1"}, + [03]={"+1+0","+1+1","+0-2","-1+1"}, + [30]={"-1+0","-1-1","+0+2","-1+2"}, + [12]={"+1+0","+1-1","+0+2","+1+2","+1+1"}, + [21]={"-1+0","-1-1","-1+1","+0-2","-1-2","-1-1"}, + [32]={"-1+0","-1-1","-1+1","+0-1","+0+2","-1+2"}, + [23]={"+1+0","+1+1","-1+0","+0-2","+1-2"}, + [02]={"-1+0","+0-1","+0+1"}, + [20]={"+1+0","+0+1","+0-1"}, + [13]={"+1+0","+0+1","-1+0"}, + [31]={"-1+0","+0-1","+1+0"}, },--P false,--Q { - [01]={{-1, 0},{ 1, 0},{-1, 1},{ 0,-2},{ 0,-3}}, - [10]={{ 1, 0},{ 1,-1},{-1, 0},{ 0, 2},{ 0, 3}}, - [03]={{ 1, 0},{ 1,-1},{ 0, 1},{ 0,-2},{ 0,-3}}, - [30]={{-1, 1},{ 1, 0},{ 0,-1},{ 0, 2},{ 0, 3}}, - [12]={{ 1, 0},{ 0,-1},{-1, 0},{ 0, 2}}, - [21]={{-1, 0},{ 0, 1},{ 1, 0},{ 0,-2}}, - [32]={{-1, 0},{ 0, 1},{-1, 1},{ 1, 0},{ 0, 2},{-2, 0}}, - [23]={{ 1, 0},{ 1,-1},{ 0,-1},{-1, 0},{ 0,-2},{ 2, 0}}, - [02]={{ 1, 0},{-1, 0},{-1,-1}}, - [20]={{-1, 0},{ 1, 0},{ 1, 1}}, - [13]={{ 0,-1},{-1, 1},{ 0, 1}}, - [31]={{ 0,-1},{ 1,-1},{ 0, 1}}, + [01]={"-1+0","+1+0","-1+1","+0-2","+0-3"}, + [10]={"+1+0","+1-1","-1+0","+0+2","+0+3"}, + [03]={"+1+0","+1-1","+0+1","+0-2","+0-3"}, + [30]={"-1+1","+1+0","+0-1","+0+2","+0+3"}, + [12]={"+1+0","+0-1","-1+0","+0+2"}, + [21]={"-1+0","+0+1","+1+0","+0-2"}, + [32]={"-1+0","+0+1","-1+1","+1+0","+0+2","-2+0"}, + [23]={"+1+0","+1-1","+0-1","-1+0","+0-2","+2+0"}, + [02]={"+1+0","-1+0","-1-1"}, + [20]={"-1+0","+1+0","+1+1"}, + [13]={"+0-1","-1+1","+0+1"}, + [31]={"+0-1","+1-1","+0+1"}, },--F false,--E { - [01]={{ 0,-1},{-1,-1},{ 1, 1},{ 1, 0},{ 1,-3},{-1, 0},{ 0, 2},{-1, 2}}, - [10]={{ 1, 0},{ 0,-1},{-1,-1},{ 0,-2},{-1, 1},{ 0,-3},{ 1,-2},{ 0, 1}}, - [03]={{ 0,-1},{ 1,-1},{-1,-1},{-1, 0},{-1,-3},{ 1, 0},{ 0, 2},{ 1, 2}}, - [30]={{-1, 0},{ 0,-1},{ 1,-1},{ 0,-2},{ 1, 1},{ 0,-3},{-1,-2},{ 0, 1}}, - [12]={{ 1, 0},{-1, 0},{ 0,-2},{ 0,-3},{ 0, 1},{-1, 1}}, - [21]={{ 1,-1},{-1, 0},{ 1, 0},{ 0,-1},{ 0, 2},{ 0, 3}}, - [32]={{-1, 0},{ 1, 0},{ 0,-2},{ 0,-3},{ 0, 1},{ 1, 1}}, - [23]={{-1,-1},{ 1, 0},{-1, 0},{ 0,-1},{ 0, 2},{ 0, 3}}, - [02]={{ 0, 1},{ 0,-1},{ 0, 2}}, - [20]={{ 0,-1},{ 0, 1},{ 0,-2}}, - [13]={{ 1, 0},{-1, 1},{-2, 0}}, - [31]={{-1, 0},{ 1, 1},{ 2, 0}}, + [01]={"+0-1","-1-1","+1+0","+1+1","+0-3","-1+0","+0+2","-1+2"}, + [10]={"+1+0","+0-1","-1-1","+0-2","-1+1","+0-3","+1-2","+0+1"}, + [03]={"+0-1","+1-1","-1+0","-1+1","+0-3","+1+0","+0+2","+1+2"}, + [30]={"-1+0","+0-1","+1-1","+0-2","+1+1","+0-3","-1-2","+0+1"}, + [12]={"+1+0","-1+0","+0-2","+0-3","+0+1","-1+1"}, + [21]={"+1-1","-1+0","+1+0","+0-1","+0+2","+0+3"}, + [32]={"-1+0","+1+0","+0-2","+0-3","+0+1","+1+1"}, + [23]={"-1-1","+1+0","-1+0","+0-1","+0+2","+0+3"}, + [02]={"+0-1","+0+1","+0+2"}, + [20]={"+0-1","+0+1","+0-2"}, + [13]={"+1+0","-1+1","-2+0"}, + [31]={"-1+0","+1+1","+2+0"}, },--T5 { - [01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2}}, - [10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}}, - [03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}}, - [30]={{-1, 0},{-1,-1},{ 0,-2},{-1, 2}}, - [12]={{ 1, 0},{ 1,-1},{ 1, 1}}, - [21]={{-1,-1},{-1, 1},{-1,-1}}, - [32]={{-1, 0},{-1,-1},{-1, 1}}, - [23]={{ 1,-1},{ 1, 1},{ 1,-1}}, - [02]={{ 0, 1}}, - [20]={{ 0,-1}}, - [13]={{ 0,-1},{ 0, 1},{ 1, 0}}, - [31]={{ 0,-1},{ 0, 1},{-1, 0}}, + [01]={"-1+0","-1+1","+0-2","-1-2"}, + [10]={"+1+0","+1-1","+0+2","+1+2"}, + [03]={"+1+0","+1+1","+0-2","+1-2"}, + [30]={"-1+0","-1-1","+0-2","-1+2"}, + [12]={"+1+0","+1-1","+1+1"}, + [21]={"-1-1","-1+1","-1-1"}, + [32]={"-1+0","-1-1","-1+1"}, + [23]={"+1-1","+1+1","+1-1"}, + [02]={"+0+1"}, + [20]={"+0-1"}, + [13]={"+0-1","+0+1","+1+0"}, + [31]={"+0-1","+0+1","-1+0"}, },--U { - [01]={{ 0, 1},{-1, 0},{ 0,-2},{-1,-2}}, - [10]={{ 0, 1},{ 1, 0},{ 0,-2},{ 1,-2}}, - [03]={{ 0,-1},{ 0, 1},{ 0, 2}}, - [30]={{ 0,-1},{ 0, 1},{ 0,-2}}, - [12]={{ 0,-1},{ 0, 1}}, - [21]={{ 0,-1},{ 0,-2}}, - [32]={{ 1, 0},{-1, 0}}, - [23]={{-1, 0},{ 1, 0}}, - [02]={{-1, 1},{ 1,-1}}, - [20]={{ 1,-1},{-1, 1}}, - [13]={{ 1, 1},{-1,-1}}, - [31]={{-1,-1},{ 1, 1}}, + [01]={"+0+1","-1+0","+0-2","-1-2"}, + [10]={"+0+1","+1+0","+0-2","+1-2"}, + [03]={"+0-1","+0+1","+0+2"}, + [30]={"+0-1","+0+1","+0-2"}, + [12]={"+0-1","+0+1"}, + [21]={"+0-1","+0-2"}, + [32]={"+1+0","-1+0"}, + [23]={"-1+0","+1+0"}, + [02]={"-1+1","+1-1"}, + [20]={"+1-1","-1+1"}, + [13]={"+1+1","-1-1"}, + [31]={"-1-1","+1+1"}, },--V { - [01]={{ 0,-1},{-1, 0},{ 1, 0},{ 1,-1},{ 0, 2}}, - [10]={{ 0,-1},{-1,-1},{ 0, 1},{ 0,-2},{ 1,-2},{ 0, 2}}, - [03]={{ 1, 0},{ 1, 1},{ 0,-1},{ 0,-2},{ 0,-3},{ 1,-1},{ 0, 1},{ 0, 2},{ 0, 3}}, - [30]={{-1, 0},{-1, 1},{ 0,-1},{ 0,-2},{ 0,-3},{-1,-1},{ 0, 1},{ 0, 2},{ 0, 3}}, - [12]={{ 1, 0},{ 0,-1},{-2, 0},{ 1, 1},{-1, 0},{ 0, 1},{-1,-1}}, - [21]={{-1, 0},{ 0,-1},{ 2, 0},{-1, 1},{ 1, 0},{ 0, 1},{ 1,-1}}, - [32]={{ 0,-1},{ 1, 0},{ 0, 1},{-1, 0},{-1,-1},{ 0, 2}}, - [23]={{ 0,-1},{ 1,-1},{ 0, 1},{ 0,-2},{-1,-2},{ 0, 2}}, - [02]={{ 0,-1},{-1, 0}}, - [20]={{ 0, 1},{ 1, 0}}, - [13]={{ 0, 1},{-1, 0}}, - [31]={{ 0,-1},{ 1, 0}}, + [01]={"+0-1","-1+0","+1+0","+1-1","+0+2"}, + [10]={"+0-1","-1-1","+0+1","+0-2","+1-2","+0+2"}, + [03]={"+1+0","+1+1","+0-1","+0-2","+0-3","+1-1","+0+1","+0+2","+0+3"}, + [30]={"-1+0","-1+1","+0-1","+0-2","+0-3","-1-1","+0+1","+0+2","+0+3"}, + [12]={"+1+0","+0-1","-2+0","+1+1","-1+0","+0+1","-1-1"}, + [21]={"-1+0","+0-1","+2+0","-1+1","+1+0","+0+1","+1-1"}, + [32]={"+0-1","+1+0","+0+1","-1+0","-1-1","+0+2"}, + [23]={"+0-1","+1-1","+0+1","+0-2","-1-2","+0+2"}, + [02]={"+0-1","-1+0"}, + [20]={"+0+1","+1+0"}, + [13]={"+0+1","-1+0"}, + [31]={"+0-1","+1+0"}, },--W function(P,d) if P.type=="human"then SFX.play("rotate",nil,P:getCenterX()*.15)end @@ -284,89 +292,89 @@ do P:freshBlock("fresh") end,--X { - [01]={{-1, 0},{-1, 1},{ 0,-3},{-1, 1},{-1, 2},{ 0, 1}}, - [10]={{-1, 0},{ 1,-1},{ 0, 3},{ 1,-1},{ 1,-2},{ 0, 1}}, - [03]={{ 0,-1},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0,-3},{ 1,-3},{-1, 1}}, - [30]={{ 0, 1},{-1, 1},{ 1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0, 3},{-1, 3},{ 1,-1}}, - [12]={{ 1, 0},{ 1,-1},{ 0,-1},{ 1,-2},{ 0,-2},{ 1, 1},{-1, 0},{ 0, 2},{ 1, 2}}, - [21]={{-1, 0},{-1, 1},{ 0, 1},{-1, 2},{ 0, 2},{-1,-1},{ 1, 0},{ 0,-2},{-1,-2}}, - [32]={{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{ 0,-2}}, - [23]={{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2},{ 0, 2}}, - [02]={{ 0,-1},{ 1,-1},{-1, 0},{ 2,-1},{ 0, 1}}, - [20]={{ 0, 1},{-1, 1},{ 1, 0},{-2, 1},{ 0,-1}}, - [13]={{-1, 0},{-1,-1},{ 0, 1},{-1,-2}}, - [31]={{ 1, 0},{ 1, 1},{ 0,-1},{ 1, 2}}, + [01]={"-1+0","-1+1","+0-3","-1+1","-1+2","+0+1"}, + [10]={"-1+0","+1-1","+0+3","+1-1","+1-2","+0+1"}, + [03]={"+0-1","+1-1","-1+0","+1+1","+0-2","+1-2","+0-3","+1-3","-1+1"}, + [30]={"+0+1","-1+1","+1+0","-1-1","+0+2","-1+2","+0+3","-1+3","+1-1"}, + [12]={"+1+0","+1-1","+0-1","+1-2","+0-2","+1+1","-1+0","+0+2","+1+2"}, + [21]={"-1+0","-1+1","+0+1","-1+2","+0+2","-1-1","+1+0","+0-2","-1-2"}, + [32]={"-1+0","-1+1","-1-1","+1+0","+0+2","-1+2","+0-2"}, + [23]={"+1+0","+1-1","+1+1","-1+0","+0-2","+1-2","+0+2"}, + [02]={"+0-1","+1-1","-1+0","+2-1"}, + [20]={"+0+1","-1+1","+1+0","-2+1"}, + [13]={"-1+0","-1-1","+0+1","-1-2"}, + [31]={"+1+0","+1+1","+0-1","+1+2"}, },--J5 false,--L5 { - [01]={{-1, 0},{-1, 0},{-1, 1},{ 1, 0},{-1, 2},{-1,-1},{ 0,-3},{ 0, 1}}, - [10]={{-1, 0},{ 1, 0},{ 1,-1},{ 1, 0},{ 1,-2},{ 1, 1},{ 0, 3},{ 0, 1}}, - [03]={{ 0,-1},{ 1, 0},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0,-3},{ 1,-3},{-1, 1}}, - [30]={{ 0, 1},{-1, 0},{-1, 1},{ 1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0, 3},{-1, 3},{ 1,-1}}, - [12]={{ 1, 0},{ 1,-1},{ 0,-1},{ 1,-2},{ 0,-2},{ 1, 1},{-1, 0},{ 0, 2},{ 1, 2}}, - [21]={{-1, 0},{-1, 1},{ 0, 1},{-1, 2},{ 0, 2},{-1,-1},{ 1, 0},{ 0,-2},{-1,-2}}, - [32]={{ 0,-1},{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{ 0,-2}}, - [23]={{ 0, 1},{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-2},{ 1,-2},{ 0, 2}}, - [02]={{ 0,-1},{ 1,-1},{-1, 0},{ 2,-1},{ 0, 1}}, - [20]={{ 0, 1},{-1, 1},{ 1, 0},{-2, 1},{ 0,-1}}, - [13]={{-1, 0},{-1,-1},{ 0, 1},{-1,-2}}, - [31]={{ 1, 0},{ 1, 1},{ 0,-1},{ 1, 2}}, + [01]={"-1+0","-1+0","-1+1","+1+0","-1+2","-1-1","+0-3","+0+1"}, + [10]={"-1+0","+1+0","+1-1","+1+0","+1-2","+1+1","+0+3","+0+1"}, + [03]={"+0-1","+1+0","+1-1","-1+0","+1+1","+0-2","+1-2","+0-3","+1-3","-1+1"}, + [30]={"+0+1","-1+0","-1+1","+1+0","-1-1","+0+2","-1+2","+0+3","-1+3","+1-1"}, + [12]={"+1+0","+1-1","+0-1","+1-2","+0-2","+1+1","-1+0","+0+2","+1+2"}, + [21]={"-1+0","-1+1","+0+1","-1+2","+0+2","-1-1","+1+0","+0-2","-1-2"}, + [32]={"+0-1","-1+0","-1+1","-1-1","+1+0","+0+2","-1+2","+0-2"}, + [23]={"+0+1","+1+0","+1-1","+1+1","-1+0","+0-2","+1-2","+0+2"}, + [02]={"+0-1","+1-1","-1+0","+2-1","+0+1"}, + [20]={"+0+1","-1+1","+1+0","-2+1","+0-1"}, + [13]={"-1+0","-1-1","+0+1","-1-2"}, + [31]={"+1+0","+1+1","+0-1","+1+2"}, },--R false,--Y { - [01]={{-1, 0},{-1, 1},{ 0, 1},{ 1, 0},{-1, 2},{-2, 0},{ 0,-2}}, - [10]={{ 1, 0},{-1, 0},{ 0,-1},{ 1,-1},{ 1,-2},{ 2, 0},{ 0, 2}}, - [03]={{-1, 0},{ 1,-1},{ 0,-2},{ 0,-3},{ 1, 0},{ 1,-2},{ 1,-3},{ 0, 1},{-1, 1}}, - [30]={{-1, 0},{ 1,-1},{ 1,-2},{ 1, 0},{ 0,-2},{ 1,-3},{-1, 2},{ 0, 3},{-1, 3}}, - [12]={{-1, 0},{ 1,-1},{-1,-1},{ 1,-2},{ 1, 0},{ 0,-2},{ 1,-3},{-1, 2},{ 0, 3},{-1, 3}}, - [21]={{-1, 0},{ 1,-1},{ 1, 1},{ 0,-2},{ 0,-3},{ 1, 0},{ 1,-2},{ 1,-3},{ 0, 1},{-1, 1}}, - [32]={{-1, 0},{ 0,-1},{-1,-2},{ 1,-1},{ 1, 0},{ 1, 1},{ 0, 2},{ 0, 3}}, - [23]={{ 0,-2},{ 0,-3},{ 1, 2},{ 1, 0},{ 0, 1},{-1, 1},{ 0,-1},{ 0, 2}}, - [02]={{-1, 0},{ 0, 2},{ 0,-1}}, - [20]={{ 1, 0},{ 0,-2},{ 0, 1}}, - [13]={{-1, 0},{-1,-1},{ 0, 1},{ 1, 2}}, - [31]={{ 1, 0},{ 1, 1},{ 0,-1},{-1,-2}}, + [01]={"-1+0","-1+1","+0+1","+1+0","-1+2","-2+0","+0-2"}, + [10]={"+1+0","-1+0","+0-1","+1-1","+1-2","+2+0","+0+2"}, + [03]={"-1+0","+1-1","+0-2","+0-3","+1+0","+1-2","+1-3","+0+1","-1+1"}, + [30]={"-1+0","+1-1","+1-2","+1+0","+0-2","+1-3","-1+2","+0+3","-1+3"}, + [12]={"-1+0","+1-1","-1-1","+1-2","+1+0","+0-2","+1-3","-1+2","+0+3","-1+3"}, + [21]={"-1+0","+1-1","+1+1","+0-2","+0-3","+1+0","+1-2","+1-3","+0+1","-1+1"}, + [32]={"-1+0","+0-1","-1-2","+1-1","+1+0","+1+1","+0+2","+0+3"}, + [23]={"+0-2","+0-3","+1+2","+1+0","+0+1","-1+1","+0-1","+0+2"}, + [02]={"-1+0","+0+2","+0-1"}, + [20]={"+1+0","+0-2","+0+1"}, + [13]={"-1+0","-1-1","+0+1","+1+2"}, + [31]={"+1+0","+1+1","+0-1","-1-2"}, },--N false,--H { - [01]={{ 1,-1},{ 1, 0},{ 1, 1},{ 0, 1},{-1, 1},{-1, 0},{-1,-1},{ 0,-1},{ 0,-2},{-2,-1},{-2,-2},{ 2, 0},{ 2,-1},{ 2,-2},{ 1, 2},{ 2, 2},{-1, 2},{-2, 2}}, - [10]={{-1, 0},{-1,-1},{ 0,-1},{ 1,-1},{-2,-2},{-2,-1},{-2, 0},{-1,-2},{ 0,-2},{ 1,-2},{ 2,-2},{-1, 1},{-2, 1},{-2, 2},{ 1, 0},{ 2, 0},{ 2,-1},{ 0, 1},{ 1,-1},{ 2,-2}}, - [03]={{-1,-1},{-1, 0},{-1, 1},{-0, 1},{ 1, 1},{ 1, 0},{ 1,-1},{-0,-1},{-0,-2},{ 2,-1},{ 2,-2},{-2, 0},{-2,-1},{-2,-2},{-1, 2},{-2, 2},{ 1, 2},{ 2, 2}}, - [30]={{ 1, 0},{ 1,-1},{-0,-1},{-1,-1},{ 2,-2},{ 2,-1},{ 2, 0},{ 1,-2},{-0,-2},{-1,-2},{-2,-2},{ 1, 1},{ 2, 1},{ 2, 2},{-1, 0},{-2, 0},{-2,-1},{ 0, 1},{-1,-1},{-2,-2}}, + [01]={"+1-1","+1+0","+1+1","+0+1","-1+1","-1+0","-1-1","+0-1","+0-2","-2-1","-2-2","+2+0","+2-1","+2-2","+1+2","+2+2","-1+2","-2+2"}, + [10]={"-1+0","-1-1","+0-1","+1-1","-2-2","-2-1","-2+0","-1-2","+0-2","+1-2","+2-2","-1+1","-2+1","-2+2","+1+0","+2+0","+2-1","+0+1","+1-1","+2-2"}, + [03]={"-1-1","-1+0","-1+1","-0+1","+1+1","+1+0","+1-1","-0-1","-0-2","+2-1","+2-2","-2+0","-2-1","-2-2","-1+2","-2+2","+1+2","+2+2"}, + [30]={"+1+0","+1-1","-0-1","-1-1","+2-2","+2-1","+2+0","+1-2","-0-2","-1-2","-2-2","+1+1","+2+1","+2+2","-1+0","-2+0","-2-1","+0+1","-1-1","-2-2"}, },--I5 { - [01]={{-1, 0},{-1,-1},{ 1, 1},{-1, 1}}, - [10]={{-1, 0},{ 1, 0},{-1,-1},{ 1, 1}}, - [03]={{ 1, 0},{ 1,-1},{-1, 1},{ 1, 1}}, - [30]={{ 1, 0},{-1, 0},{ 1,-1},{-1, 1}}, + [01]={"-1+0","-1-1","+1+1","-1+1"}, + [10]={"-1+0","+1+0","-1-1","+1+1"}, + [03]={"+1+0","+1-1","-1+1","+1+1"}, + [30]={"+1+0","-1+0","+1-1","-1+1"}, },--I3 { - [01]={{-1, 0},{ 1, 0}}, - [10]={{ 1, 0},{-1, 0}}, - [03]={{ 0, 1},{ 0,-1}}, - [30]={{ 0,-1},{ 0, 1}}, - [12]={{ 0, 1},{ 0,-1}}, - [21]={{ 0,-1},{ 0, 1}}, - [32]={{-1, 0},{ 1, 0}}, - [23]={{ 1, 0},{-1, 0}}, - [02]={{ 0,-1},{ 1,-1},{-1,-1}}, - [20]={{ 0, 1},{-1, 1},{ 1, 1}}, - [13]={{ 0,-1},{-1,-1},{ 1,-1}}, - [31]={{ 0, 1},{ 1, 1},{-1, 1}}, + [01]={"-1+0","+1+0"}, + [10]={"+1+0","-1+0"}, + [03]={"+0+1","+0-1"}, + [30]={"+0-1","+0+1"}, + [12]={"+0+1","+0-1"}, + [21]={"+0-1","+0+1"}, + [32]={"-1+0","+1+0"}, + [23]={"+1+0","-1+0"}, + [02]={"+0-1","+1-1","-1-1"}, + [20]={"+0+1","-1+1","+1+1"}, + [13]={"+0-1","-1-1","+1-1"}, + [31]={"+0+1","+1+1","-1+1"}, },--C { - [01]={{-1, 0},{ 0, 1}}, - [10]={{ 1, 0},{ 0, 1}}, - [03]={{ 1, 0},{ 0, 1}}, - [30]={{-1, 0},{ 0, 1}}, - [12]={{ 1, 0},{ 0, 2}}, - [21]={{ 0,-1},{-1, 0}}, - [32]={{-1, 0},{ 0, 2}}, - [23]={{ 0,-1},{-1, 0}}, - [02]={{ 0,-1},{ 0, 1}}, - [20]={{ 0, 1},{ 0,-1}}, - [13]={{-1, 0},{ 1, 0}}, - [31]={{ 1, 0},{-1, 0}}, + [01]={"-1+0","+0+1"}, + [10]={"+1+0","+0+1"}, + [03]={"+1+0","+0+1"}, + [30]={"-1+0","+0+1"}, + [12]={"+1+0","+0+2"}, + [21]={"+0-1","-1+0"}, + [32]={"-1+0","+0+2"}, + [23]={"+0-1","-1+0"}, + [02]={"+0-1","+0+1"}, + [20]={"+0+1","+0-1"}, + [13]={"-1+0","+1+0"}, + [31]={"+1+0","-1+0"}, },--I2 nil,--O1 } @@ -378,9 +386,9 @@ do TRS[20]=reflect(TRS[19])--L5J5 TRS[22]=reflect(TRS[21])--RY TRS[24]=reflect(TRS[23])--NH - C_sym(TRS[8])C_sym(TRS[9])--S5Z5 - C_sym(TRS[25])C_sym(TRS[26])--I5I3 - for i=1,29 do collect(TRS[i])end + centroSymSet(TRS[8])centroSymSet(TRS[9])--S5Z5 + centroSymSet(TRS[25])centroSymSet(TRS[26])--I5I3 + for i=1,29 do collectSet(TRS[i])end pushZero(TRS) end @@ -388,35 +396,35 @@ local SRS do SRS={ { - [01]={{-1,0},{-1, 1},{ 0,-2},{-1,-2}}, - [10]={{ 1,0},{ 1,-1},{ 0, 2},{ 1, 2}}, - [03]={{ 1,0},{ 1, 1},{ 0,-2},{ 1,-2}}, - [30]={{-1,0},{-1,-1},{ 0, 2},{-1, 2}}, - [12]={{ 1,0},{ 1,-1},{ 0, 2},{ 1, 2}}, - [21]={{-1,0},{-1, 1},{ 0,-2},{-1,-2}}, - [32]={{-1,0},{-1,-1},{ 0, 2},{-1, 2}}, - [23]={{ 1,0},{ 1, 1},{ 0,-2},{ 1,-2}}, + [01]={"-1+0","-1+1","+0-2","-1-2"}, + [10]={"+1+0","+1-1","+0+2","+1+2"}, + [03]={"+1+0","+1+1","+0-2","+1-2"}, + [30]={"-1+0","-1-1","+0+2","-1+2"}, + [12]={"+1+0","+1-1","+0+2","+1+2"}, + [21]={"-1+0","-1+1","+0-2","-1-2"}, + [32]={"-1+0","-1-1","+0+2","-1+2"}, + [23]={"+1+0","+1+1","+0-2","+1-2"}, [02]={},[20]={},[13]={},[31]={}, },--Z false,--S false,--J false,--L false,--T - noKick,--O + noKickSet,--O { - [01]={{-2, 0},{ 1, 0},{-2,-1},{ 1, 2}}, - [10]={{ 2, 0},{-1, 0},{ 2, 1},{-1,-2}}, - [12]={{-1, 0},{ 2, 0},{-1, 2},{ 2,-1}}, - [21]={{ 1, 0},{-2, 0},{ 1,-2},{-2, 1}}, - [23]={{ 2, 0},{-1, 0},{ 2, 1},{-1,-2}}, - [32]={{-2, 0},{ 1, 0},{-2,-1},{ 1, 2}}, - [30]={{ 1, 0},{-2, 0},{ 1,-2},{-2, 1}}, - [03]={{-1, 0},{ 2, 0},{-1, 2},{ 2,-1}}, + [01]={"-2+0","+1+0","-2-1","+1+2"}, + [10]={"+2+0","-1+0","+2+1","-1-2"}, + [12]={"-1+0","+2+0","-1+2","+2-1"}, + [21]={"+1+0","-2+0","+1-2","-2+1"}, + [23]={"+2+0","-1+0","+2+1","-1-2"}, + [32]={"-2+0","+1+0","-2-1","+1+2"}, + [30]={"+1+0","-2+0","+1-2","-2+1"}, + [03]={"-1+0","+2+0","-1+2","+2-1"}, [02]={},[20]={},[13]={},[31]={}, }--I } - collect(SRS[1]) - collect(SRS[7]) + collectSet(SRS[1]) + collectSet(SRS[7]) pushZero(SRS) for i=2,5 do SRS[i]=SRS[1]end for i=8,29 do SRS[i]=SRS[1]end @@ -424,7 +432,8 @@ end local C2 do - local L={{0,0},{-1,0},{1,0},{0,-1},{-1,-1},{1,-1},{-2,0},{2,0}} + local L={"+0+0","-1+0","+1+0","+0-1","-1-1","+1-1","-2+0","+2+0"} + vecStrConv(L) C2={ { [01]=L,[10]=L,[12]=L,[21]=L, @@ -432,36 +441,35 @@ do [02]=L,[20]=L,[13]=L,[31]=L, } } - collect(C2[1]) for i=2,29 do C2[i]=C2[1]end end local C2sym do - local L={{0,0},{-1,0},{1,0},{0,-1},{-1,-1},{1,-1},{-2,0},{2,0}} - local R={{0,0},{1,0},{-1,0},{0,-1},{1,-1},{-1,-1},{2,0},{-2,0}} + local L={"+0+0","-1+0","+1+0","+0-1","-1-1","+1-1","-2+0","+2+0"} + local R={"+0+0","+1+0","-1+0","+0-1","+1-1","-1-1","+2+0","-2+0"} local Z={ [01]=R,[10]=L,[03]=L,[30]=R, [12]=R,[21]=L,[32]=L,[23]=R, [02]=R,[20]=L,[13]=L,[31]=R, } - collect(Z) local S=reflect(Z) - collect(S) + collectSet(Z) + collectSet(S) C2sym={ Z,S,--Z,S Z,S,--J,L Z,--T - noKick,--O + noKickSet,--O Z,--I Z,S,--Z5,S5 Z,S,--P,Q Z,S,--F,E Z,Z,Z,Z,--T5,U,V,W - noKick,--X + noKickSet,--X Z,S,--J5,L5 Z,S,--R,Y Z,S,--N,H @@ -472,10 +480,10 @@ do end local Classic={} -for i=1,29 do Classic[i]=noKick end +for i=1,29 do Classic[i]=noKickSet end local None={} -for i=1,29 do None[i]=noKick_180 end +for i=1,29 do None[i]=noKickSet_180 end return{ TRS=TRS, diff --git a/parts/language/dict_en.lua b/parts/language/dict_en.lua index 99b93b8a..c720acc1 100644 --- a/parts/language/dict_en.lua +++ b/parts/language/dict_en.lua @@ -39,7 +39,7 @@ return{ {"Applets", "applets", "help", - "[Entrance of applets has been moved to command line]", + "[Entrance of applets has been moved to console]", }, --Games @@ -202,26 +202,6 @@ return{ "term", "Blocks per minute\n\tReflects playing speed of a player.\nAlso apparently MrZ forgot that it can be called PPM to avoid confusing with the music term.", }, - {"APM", - "apm attackperminute", - "term", - "Attack per minute\n\tReflects offensive power of a player.\nIn Techmino, the concept of \"attack\" sometimes includes the fractional lines of an attack. Since sending garbage rounds down before sending, this value can be higher than your actual attack power.", - }, - {"SPM", - "spm linessentperminute", - "term", - "[lines] Sent per minute\n\tReflects *actual* offensive power of a player. (Seems like this does not count lines used for cancelling garbage in buffer.)", - }, - {"ADPM", - "adpm attackdigperminute", - "term", - "Attack&Dig per minute\n\tUsed to compare skill differences between the two players within one match; slightly more accurate than APM.", - }, - {"DPM", - "dpm digperminute defendperminute", - "term", - "Dig/Defend per minute\n\tSometimes can reflect how well a player can survive garbage.", - }, {"KPM", "kpm keysperminute keypressesperminute", "term", @@ -232,47 +212,32 @@ return{ "term", "Keypresses per piece\n\tReflects how efficient the player is with the controls. Reduce this number by learning to finesse.", }, + {"APM", + "apm attackperminute", + "term", + "Attack per minute\n\tReflects offensive power of a player.\nIn Techmino, the concept of \"attack\" sometimes includes the fractional lines of an attack. Since sending garbage rounds down before sending, this value can be higher than your actual attack power.", + }, + {"SPM", + "spm linessentperminute", + "term", + "[lines] Sent per minute\n\tReflects *actual* offensive power of a player. (Seems like this does not count lines used for cancelling garbage in buffer.)", + }, + {"DPM", + "dpm digperminute defendperminute", + "term", + "Dig/Defend per minute\n\tSometimes can reflect how well a player can survive garbage.", + }, + {"ADPM", + "adpm attackdigperminute", + "term", + "Attack&Dig per minute\n\tUsed to compare skill differences between the two players within one match; slightly more accurate than APM.", + }, {"APL", "apl attackperline efficiency", "term", "Attack per line [cleared]\n\tAlso known as \"efficiency\"; reflects the per-line efficiency of attacks. For example, Tetrises and T-spins have higher efficiency than doubles and triples.", }, - {"All Clear", - "pc perfectclear ac allclear", - "term", - "Formerly known as Perfect Clear (PC). That is also still the term preferred by the communities and used in Techmino.\nClear all minoes on the field.", - }, - {"HPC", - "hpc hc clear halfperfectclear", - "term", - "*Techmino-exclusive*\nHalf Perfect Clear\nExtension of an All Clear. Should a line clear resemble an All Clear when ignoring lines below the clear, the clear is a Half Perfect Clear, and sends a small extra amount of attack.", - }, - {"TSS", - "tss t1 tspinsingle", - "term", - "T-Spin Single\nClear 1 line with a T-Spin.", - }, - {"TSD", - "tsd t2 tspindouble", - "term", - "T-Spin Double\nClear 2 lines with a T-Spin.", - }, - {"TST", - "tst t3 tspintriple", - "term", - "T-Spin Triple\nClear 3 lines with a T-Spin.", - }, - {"MTSS", - "mtss minitspinsingle tsms tspinminisingle", - "term", - "Mini T-Spin Single\nFormerly known as T-Spin Mini Single.\nClear 1 line with a Mini T-Spin.\nDifferent games apparently have different ways to determine whether a T-Spin is a Mini.", - }, - {"MTSD", - "mtsd minitspindouble tsmd tspinminidouble", - "term", - "Mini T-Spin Double\nFormerly known as T-Spin Mini Double (TSMD).\nClear 2 lines with a Mini T-Spin.\nDifferent games apparently have different ways to determine whether a T-Spin is a Mini.\nIn addition, different games have different behavior when clearing a Mini T-Spin Double: some games credit this move correctly, and some games use a different displayed text because they never programmed this in.", - }, {"Single", "single", "term", @@ -298,12 +263,27 @@ return{ "term", "The name of the game (and its trademark). Also the name for clearing 4 lines.\nCoined from Tetra (greek for \"four\") and Tennis (favorite sport of Alexey Pajitnov, creator of Tetris).", }, + {"All Clear", + "pc perfectclear ac allclear", + "term", + "Formerly known as Perfect Clear (PC). That is also still the term preferred by the communities and used in Techmino.\nClear all minoes on the field.", + }, + {"HPC", + "hpc hc clear halfperfectclear", + "term", + "*Techmino-exclusive*\nHalf Perfect Clear\nExtension of an All Clear. Should a line clear resemble an All Clear when ignoring lines below the clear, the clear is a Half Perfect Clear, and sends a small extra amount of attack.", + }, {"Spin", "spin", "term", "Use rotation to move a piece into a position otherwise unreachable. In some games, this sends extra attack or awards extra score.", }, + {"Mini", + "mini", + "term", + "A modifier to Spins, applied to Spin actions that the game considers easy (thus the name \"EZ T-Spin\" in an old game). Score and attack bonuses are reduced for Mini Spins.\nDifferent games have different rules for what counts as a Mini, and many are not intuitive. You can just remember a few common shapes.", + }, {"All-Spin", "allspin", "term", @@ -314,6 +294,31 @@ return{ "term", "A spin using the T piece.\nIn modern official games, T-Spins are detected using the 3-corner rule, i.e. if at least three of the four cells diagonal to the rotation center, it is a T-Spin. Some games have extra rules to mark a T-Spin as a Mini T-Spin instead, which has reduced attack/score.", }, + {"TSS", + "tss t1 tspinsingle", + "term", + "T-Spin Single\nClear 1 line with a T-Spin.", + }, + {"TSD", + "tsd t2 tspindouble", + "term", + "T-Spin Double\nClear 2 lines with a T-Spin.", + }, + {"TST", + "tst t3 tspintriple", + "term", + "T-Spin Triple\nClear 3 lines with a T-Spin.", + }, + {"MTSS", + "mtss minitspinsingle tsms tspinminisingle", + "term", + "Mini T-Spin Single\nFormerly known as T-Spin Mini Single.\nClear 1 line with a Mini T-Spin.\nDifferent games apparently have different ways to determine whether a T-Spin is a Mini.", + }, + {"MTSD", + "mtsd minitspindouble tsmd tspinminidouble", + "term", + "Mini T-Spin Double\nFormerly known as T-Spin Mini Double (TSMD).\nClear 2 lines with a Mini T-Spin.\nDifferent games apparently have different ways to determine whether a T-Spin is a Mini.\nIn addition, different games have different behavior when clearing a Mini T-Spin Double: some games credit this move correctly, and some games use a different displayed text because they never programmed this in.", + }, {"O-Spin", "ospin", "term", @@ -350,11 +355,6 @@ return{ "*Techmino-exclusive*\nTechmino Rotation System\nThe rotation system used in Techmino.\nIt is based on SRS, with fixes on common cases where S/Z are locked from rotating, and some extra useful kicks. Each pentomino also has a kick table roughly based on SRS logic.", }, - {"Mini", - "mini", - "term", - "A modifier to Spins, applied to Spin actions that the game considers easy (thus the name \"EZ T-Spin\" in an old game). Score and attack bonuses are reduced for Mini Spins.\nDifferent games have different rules for what counts as a Mini, and many are not intuitive. You can just remember a few common shapes.", - }, {"Back to Back", "b2b btb backtoback", "term", @@ -903,17 +903,22 @@ return{ "Tetris Research community member.\nPersonal bests: Sprint 26.193 seconds\nOne of the prestigious players in the Chinese Tetris community. Author of T-ex and Tetr.js Farter's Dig Mod.", "https://space.bilibili.com/132966", }, + {"Teatube", + "teatube ttb chaguan chanaiye sifangchaye 022", + "name", + "Administrator of the Tetris Research community, Operator of the Tetris Online Study private server, chief editor of the Huiji wiki.\nPersonal bests: Sprint 33 seconds, Tetris Online peak stats 50LPM, 70APM.", + "https://space.bilibili.com/834903", + }, {"Sniraite", "sniraite", "name", "Tetris Research community member.\nPersonal bests: Sprint 23 seconds\nOne of the top players in China. Should be the fastest player in Mainland China.", "https://space.bilibili.com/561589", }, - {"Teatube", - "teatube ttb chaguan chanaiye sifangchaye 022", + {"xb", + "xb", "name", - "Administrator of the Tetris Research community, Operator of the Tetris Online Study private server, chief editor of the Huiji wiki.\nPersonal bests: Sprint 33 seconds, Tetris Online peak stats 50LPM, 70APM.", - "https://space.bilibili.com/834903", + "Tetris Research community member.\nMain organizer for competitions in the community.", }, {"Flyz", "flyz fxg", @@ -927,11 +932,6 @@ return{ "Tetris Research community member.\nPersonal bests: Sprint 22.831 seconds (25.483 seconds on mobile), MPH Sprint 56 seconds, X rank on Tetr.io\nOne of the top players of 20G in China, achieved almost every achievement in TGM3.", "https://space.bilibili.com/287769888", }, - {"xb", - "xb", - "name", - "Tetris Research community member.\nMain organizer for competitions in the community.", - }, {"蕴空之灵", "ykzl yunkongzhiling niao bird", "name", @@ -1022,12 +1022,6 @@ return{ "Tetris Research community member, Virtual content creator.\nA top Tetris 99 players known for his strategies.", "https://space.bilibili.com/147529", }, - {"ditoly", - "ditoly icrem kuimei jk", - "name", - "Tetris Research community member.", - "https://space.bilibili.com/13014410", - }, {"蓝绿", "lanlv gompyn imple lee blari'o blariho", "name", @@ -1039,11 +1033,4 @@ return{ "Tetris Research community member, Virtual content creator.\nPractically the mascot of the community. Voice actress of Techmino.", "https://space.bilibili.com/846180", }, - - {"Windkey", - "wdk windkey fengyaoshi", - "name", - "Former community member.\nBad reputation due to excessive center 4-wides.", - "https://space.bilibili.com/25576872", - }, } diff --git a/parts/language/dict_zh.lua b/parts/language/dict_zh.lua index affb4b1d..65a96201 100644 --- a/parts/language/dict_zh.lua +++ b/parts/language/dict_zh.lua @@ -28,13 +28,13 @@ return{ {"灰机wiki", "灰机wiki huiji wiki", "help", - "俄罗斯方块中文维基,由一群来自俄罗斯方块研究群及下属群的方块同好建立的关于俄罗斯方块的中文百科全书。\n当前大部分页面翻译和参考来自Harddrop wiki和Tetris Wiki", + "俄罗斯方块中文维基,由一群来自俄罗斯方块研究群及下属群的方块同好建立的关于俄罗斯方块的中文百科全书。\n目前其大部分页面翻译和参考来自Harddrop wiki和Tetris Wiki", "https://tetris.huijiwiki.com", }, {"小程序", "小程序 applets", "help", - "[小程序入口已移动至命令行]", + "[小程序入口已移动至控制台]", }, --游戏(题库) @@ -61,7 +61,7 @@ return{ {"King of Stackers", "回合制 kos kingofstackers", "game", - "King of Stackers\n网页版回合制对战方块点击即玩(可能很卡)", + "King of Stackers\n网页版回合制对战方块点击即玩(可能很卡),主要规则为:以7块为一个回合,双方轮流在自己场地中放置方块,任何的攻击只在对方回合放一块不消行后生效,策略性很强。有不同的伤害表设置。", "https://kingofstackers.com/games.php", }, {"Tetr.js", @@ -79,13 +79,13 @@ return{ {"Jstris", "网页 手机 js jstris", "game", - "全平台网页对战方块点击即玩(服务器在国外可能很卡)", + "全平台网页对战方块点击即玩(服务器在国外可能很卡)。有常用的科研向单机模式和自定义各种参数的功能,但没有很多强制速度向的挑战项目。都是纯色素材导致画面效果不怎么好。移动端的键位设置并不舒适。", "https://jstris.jezevec10.com", }, {"TETR.IO", "网页 io tetrio", "game", - "炫酷在线对战方块点击即玩(推荐使用电脑,移动设备需要外接键盘)(服务器在国外,可能超级慢甚至打不开)", + "炫酷在线对战方块点击即玩(推荐使用电脑,移动设备需要外接键盘)(服务器在国外,可能超级慢甚至打不开)有很科学的排位系统,自定义功能非常全面,同时也提供电脑客户端下载(可以去除广告)。缺点是单机模式非常非常少。", "https://tetr.io", }, {"World Wide Combo", @@ -202,26 +202,6 @@ return{ "term", "Block per Minute\n块每分,体现玩家下块速度\n别问为什么不是PPM,问就是不知道", }, - {"APM", - "apm attack gongji", - "term", - "Attack per Minute\n攻击每分,即玩家每分钟能打出的垃圾行数。\n一定程度体现玩家攻击力", - }, - {"SPM", - "spm send gongji", - "term", - "Send per Minute\n送出每分,即玩家每分钟实际打出去给对手的垃圾行数。\n一定程度体现玩家给对手实际造成的攻击力", - }, - {"ADPM", - "adpm attack defend", - "term", - "Atk+Dig per Minute\n攻击+挖掘每分,用于在同一局游戏内对比玩家间水平差距,比apm更准确一些", - }, - {"DPM", - "dpm dig defend", - "term", - "Dig/Defend per Minute\n挖掘每分,即玩家每分钟向下挖掘的垃圾行数。\n某些时候可以体现玩家生存能力\n\n或:防御(抵消+挖掘)每分", - }, {"KPM", "kpm sudu", "term", @@ -232,6 +212,26 @@ return{ "term", "Key per Piece\n按键每块,体现玩家操作是否繁琐。\n学会极简提升操作效率以减少此数字", }, + {"APM", + "apm attack gongji", + "term", + "Attack per Minute\n攻击每分,即玩家每分钟能打出的垃圾行数。\n一定程度体现玩家攻击力", + }, + {"SPM", + "spm send gongji", + "term", + "Send per Minute\n送出每分,即玩家每分钟实际打出去给对手的垃圾行数。\n一定程度体现玩家给对手实际造成的攻击力", + }, + {"DPM", + "dpm dig defend", + "term", + "Dig/Defend per Minute\n挖掘每分,即玩家每分钟向下挖掘的垃圾行数。\n某些时候可以体现玩家生存能力\n\n或:防御(抵消+挖掘)每分", + }, + {"ADPM", + "adpm attack defend", + "term", + "Atk+Dig per Minute\n攻击+挖掘每分,用于在同一局游戏内对比玩家间水平差距,比apm更准确一些。\n在TETR.IO中有一个叫vs的数据就是ADPM(调整了比例)",--TODO + }, {"APL", "apl xiaolv", "term", @@ -239,6 +239,31 @@ return{ }, --术语(消除名) + {"Single", + "single xiaoyi", + "term", + "消一行", + }, + {"Double", + "double xiaoer", + "term", + "消两行", + }, + {"Triple", + "triple xiaosan", + "term", + "消三行", + }, + {"Techrash", + "techrash xiaosi", + "term", + "消四行(Tech限定)", + }, + {"Tetris", + "tetris xiaosi", + "term", + "商标,Tetris游戏名,同时也是别的方块游戏里消四行的名字。\n含义是Tetra(古希腊语 四)+Tennis(游戏原作者喜欢的运动)。", + }, {"PC", "pc perfectclear ac allclear quanxiao quanqing", "term", @@ -247,7 +272,29 @@ return{ {"HPC", "hpc hc clear banqing banquanqing banquanxiao", "term", - "Half-PC\nPC(全消)的外延,如果去掉消除部分之下的场地后上面部分是一个PC,那么这个消除就是半PC,打出一些攻击(仅Tech中有)。", + "Half-PC\nPC(全消)的外延,\"下方有剩余方块\"的全消(特别地,如果只消1行则必须不剩余玩家放置的方块),能打出一些攻击和防御(仅Tech中有)。", + }, + + --术语(旋转相关) + {"Spin", + "spin xuanzhuan zuandong", + "term", + "(部分游戏中)使用旋转将方块卡进不能直接移动进入的位置,具体判定规则不同游戏不一样,可能会有攻击加成。", + }, + {"Mini", + "迷你 mini", + "term", + "spin附加mini后攻击会弱化,用于平衡不同难易度的tspin攻击,判定在不同游戏都不一样,而且大多数很不好理解,建议只记住常见形状即可。", + }, + {"Allspin", + "allspin", + "term", + "一种规则,指所有方块的spin都有攻击力,而不止是Tspin才有攻击(Tspin only)。", + }, + {"Tspin", + "tspin txuan", + "term", + "在官方规则中,当T方块在锁定前的最后一个操作是旋转,并且锁定后旋转中心对应的四个斜角位置有三个不是空气,那么这就是一个Tspin。PS:如果满足一些额外条件会被打上mini标签减少攻击力。", }, {"TSS", "tss t1 tspin", @@ -274,55 +321,13 @@ return{ "term", "mini T-spin double\n指T方块mini spin消2行(仅部分游戏内存在且判定不一样)。", }, - {"Single", - "single xiaoyi", - "term", - "消一行", - }, - {"Double", - "double xiaoer", - "term", - "消两行", - }, - {"Triple", - "triple xiaosan", - "term", - "消三行", - }, - {"Techrash", - "techrash xiaosi", - "term", - "消四行(Tech限定)", - }, - {"Tetris", - "tetris xiaosi", - "term", - "商标,Tetris游戏名,同时也是别的方块游戏里消四行的名字。\n含义是Tetra(古希腊语 四)+Tennis(作者喜欢的运动)。", - }, - - --术语(旋转相关) - {"Spin", - "spin xuanzhuan zuandong", - "term", - "(部分游戏中)使用旋转将方块卡进不能直接移动进入的位置,具体判定规则不同游戏不一样,可能会有攻击加成。", - }, - {"Allspin", - "allspin", - "term", - "一种规则,指所有方块的spin都有攻击力,而不止是Tspin才有攻击(Tspin only)。", - }, - {"Tspin", - "tspin txuan", - "term", - "在官方规则中,当T方块在锁定前的最后一个操作是旋转,并且锁定后旋转中心对应的四个斜角位置有三个不是空气,那么这就是一个Tspin。PS:如果满足一些额外条件会被打上mini标签减少攻击力。", - }, {"Ospin", "ospin", "term", "由于O方块旋转后形状不变,只能左右移动,所以经常被卡住,于是方块圈就有了ospin的梗:\n有人做过T99/TF中的O变形的特效视频且广为流传;\nT-ex设计的旋转系统可以用spin使O传送进坑;\nTech设计的变形系统中可以旋转O来变形/传送进入一些特定形状的洞。", }, - {"踢墙", - "踢墙 wallkick tiqiang", + {"旋转系统(踢墙)", + "旋转系统 踢墙 xuanzhuanxitong wallkick tiqiang", "term", "(部分游戏中)方块旋转后可能和场地或者墙壁有碰撞,此时系统可能会给方块施加的偏移,让方块不会因此被卡住而不能操作。详见SRS词条", }, @@ -353,11 +358,6 @@ return{ }, --术语(游戏内名词) - {"mini", - "迷你 mini", - "term", - "spin附加mini后攻击会弱化,用于平衡不同难易度的tspin攻击,判定在不同游戏都不一样,而且大多数很不好理解,建议只记住常见形状即可。", - }, {"B2B", "大满贯 b2b btb backtoback", "term", @@ -433,7 +433,7 @@ return{ {"连击", "连击 ren combo", "term", - "从第二次消除起叫1ren/combo", + "从第二次消除起叫1ren/combo,打出的攻击根据游戏设计的不同也不同", }, {"Side", "连击 ·side", @@ -538,7 +538,7 @@ return{ {"SDF", "软降速度 sdf softdropfactor", "term", - "Soft Drop Factor,软降速度因子(倍率),部分游戏中的软降机制是让重力变为原来的若干倍,SDF就是这个倍数。\n基本所有官块和tetr.io使用这个机制,本游戏不使用。", + "Soft Drop Factor,软降速度因子(倍率),部分游戏中的软降机制就是在按住软件键时方块受到的重力变为原来的若干倍,SDF就是这个变大的倍数。\n基本所有官块和tetr.io使用这个机制,但本游戏不使用。", }, {"bag7出块", "bag出块 bag7bag", @@ -913,17 +913,23 @@ return{ "【研究群】「TTTT」\n40行26.193秒\nCN块圈元老之一,《T-ex》和《屁块》的作者", "https://space.bilibili.com/132966", }, + {"Teatube", + "teatube ttb chaguan chanaiye sifangchaye t022", + "name", + "【研究群】「T022」\n40行33秒 top数据高峰约50L70A\n研究群管理,探索群群主,茶服服主,人形方块百科史书,现中文方块维基主催\n自2011年正式加入CN方块社区以来,以探索方块有趣的思想作为主动力,茶茶今天也在茶馆里当着茶房管理员——\n\n其他名称:TTB,永远旋转的炸弹,茶乃叶,四方茶叶\n明明茶管是蓝孩子却被群友叫茶娘…怎么想都很奇怪啊!嘛大家喜欢的话就随便啦——", + "https://space.bilibili.com/834903", + }, {"Sniraite", "sniraite shege 11renpc t024", "name", "【研究群】「T024」\n40行sub23\n国内一流方块玩家,应该是大陆最速", "https://space.bilibili.com/561589", }, - {"Teatube", - "teatube ttb chaguan chanaiye sifangchaye t022", + {"xb", + "xb t043", "name", - "【研究群】「T022」\n40行33秒 top数据高峰约50L70A\n研究群管理,探索群群主,茶服服主,人形方块百科史书,现中文方块维基主催\n自2011年正式加入CN方块社区以来,以探索方块有趣的思想作为主动力,茶茶今天也在茶馆里当着茶房管理员——\n\n其他名称:TTB,永远旋转的炸弹,茶乃叶,四方茶叶\n明明茶管是蓝孩子却被群友叫茶娘…怎么想都很奇怪啊!嘛大家喜欢的话就随便啦——", - "https://space.bilibili.com/834903", + "【研究群】「T043」\n俄罗斯方块中文维基(灰机wiki)主要编者(之一", + "https://space.bilibili.com/226132", }, {"Flyz", "flyz fxg t114", @@ -937,12 +943,6 @@ return{ "【研究群】「T127」\n40行22.831秒(手机25.483),MPH40行56秒,tetr.io段位X,数据约60L95A\n20G规则国内一流玩家,拿到了TGM3几乎全部的最终成就(全世界都没几个)\n其他名称:小柒 kissne 127\n还是车车人,几个正作成绩:永EX NM 1B FS 风L NM", "https://space.bilibili.com/287769888", }, - {"xb", - "xb t043", - "name", - "【研究群】「T043」\n研究群赛事主要主办人", - "https://space.bilibili.com/226132", - }, {"蕴空之灵", "蕴空之灵 ykzl yunkongzhiling niao bird t196", "name", @@ -1033,12 +1033,6 @@ return{ "【研究群】「T1934」\nvup,T99国内一流战术型玩家", "https://space.bilibili.com/147529", }, - {"ditoly", - "葵 ditoly icrem kuimei jk t3055", - "name", - "【研究群】「T3055」\n被清华劝退现于北大的打块天才jk\n(好像也被北大劝退了?不知道)", - "https://space.bilibili.com/13014410", - }, {"蓝绿", "蓝绿 lanlv gompyn imple lee blari'o blariho t3182", "name", @@ -1050,11 +1044,4 @@ return{ "【研究群】「T7023」\nvup,喜欢打块的猫猫(Z酱单推),techmino配音之一", "https://space.bilibili.com/846180", }, - - {"Windkey", - "wdk windkey fengyaoshi", - "name", - "曾经是群友,对战基本只用开局c4w导致风评很差,想学c4w可以看他", - "https://space.bilibili.com/25576872", - }, } \ No newline at end of file diff --git a/parts/language/lang_en.lua b/parts/language/lang_en.lua index 3ca4b320..13a813f2 100644 --- a/parts/language/lang_en.lua +++ b/parts/language/lang_en.lua @@ -95,6 +95,7 @@ return{ createRoomTooFast="You are creating a room too fast!", createRoomSuccessed="Room successfully created!", + started="Playing", joinRoom="has joined the room.", leaveRoom="has left the room.", notReady="Waiting", @@ -253,7 +254,8 @@ return{ refreshing="Refreshing rooms", noRoom="There aren't any rooms right now...", refresh="Refresh", - new="New Room", + new="New Room(2)", + new2="New Room(5)", join="Join", up="↑", down="↓", @@ -503,8 +505,8 @@ return{ dict={ title="TetroDictionary", link="Open URL", - up="↑", - down="↓", + up="↑",down="↓", + pageup="↑↑",pagedown="↓↓", }, stat={ path="Open Data Folder", @@ -646,6 +648,7 @@ return{ }, app_dtw={ reset="Reset", + arcade="Arcade", mode="Mode", }, savedata={ @@ -665,7 +668,7 @@ return{ resetData="Reset Data", }, error={ - cmd="CMD", + cmd="Console", quit="Quit", }, }, @@ -867,7 +870,7 @@ return{ {c.fire,"Also try Tetr.js!"}, {c.fire,"Also try Tetra Legends!"}, {c.grape,"T-spin!"}, - {c.grey,"REGRET!!"}, + {c.gray,"REGRET!!"}, {c.lR,"Z ",c.lG,"S ",c.lSea,"J ",c.lOrange,"L ",c.lGrape,"T ",c.lY,"O ",c.lC,"I"}, {c.lY,"COOL!!"}, {c.R,"\"DMCA abusing\""}, diff --git a/parts/language/lang_fr.lua b/parts/language/lang_fr.lua index 1fa821f9..11e5dcd3 100644 --- a/parts/language/lang_fr.lua +++ b/parts/language/lang_fr.lua @@ -96,6 +96,7 @@ return{ createRoomTooFast="Vous avez créé un salon trop rapidement !", createRoomSuccessed="Salon créé avec succès !", + -- started="Playing", joinRoom="a rejoint le salon.", leaveRoom="a quitté le salon.", notReady="Attente", @@ -460,8 +461,6 @@ return{ dict={ title="TetroDictionary", link="Ouvrir URL", - up="↑", - down="↓", }, stat={ path="Ouvrir dossier des données", @@ -556,6 +555,7 @@ return{ }, app_dtw={ reset="Réinitialiser", + -- arcade="Arcade", -- mode="Mode", }, about={ @@ -580,7 +580,7 @@ return{ resetData="Réinitialiser les données", }, error={ - cmd="CMD", + cmd="Console", quit="Quit", }, }, diff --git a/parts/language/lang_pt.lua b/parts/language/lang_pt.lua index d8972fa9..55f7890e 100644 --- a/parts/language/lang_pt.lua +++ b/parts/language/lang_pt.lua @@ -95,6 +95,7 @@ return{ -- createRoomTooFast="Create room too fast!", -- createRoomSuccessed="Room successfully created!", + -- started="Playing", joinRoom="Entrou a sala.", leaveRoom="Saiu da sala.", -- notReady="Waiting", @@ -253,7 +254,8 @@ return{ -- refreshing="Refreshing Rooms", noRoom="Nenhuma sala agora", -- refresh="Refresh", - -- new="New room", + -- new="New Room(2)", + -- new2="New Room(5)", -- join="Join", up="↑", down="↓", @@ -503,8 +505,6 @@ return{ dict={ title="TetroDictionary", link="Abrir URL", - up="↑", - down="↓", }, stat={ path="Abrir Pasta De Data", @@ -644,6 +644,7 @@ return{ }, app_dtw={ reset="Resetar", + -- arcade="Arcade", -- mode="Mode", }, savedata={ @@ -663,7 +664,7 @@ return{ resetData="Reset data", }, error={ - cmd="CMD", + cmd="Console", quit="Quit", }, }, @@ -857,8 +858,8 @@ return{ {COLOR.fire,"Tente também Tetr.js"}, {COLOR.fire,"Tente também Tetralegends"}, {COLOR.grape,"T-spin!"}, - {COLOR.grey,"暫定段位:9"}, - {COLOR.grey,"REGRET!!"}, + {COLOR.gray,"暫定段位:9"}, + {COLOR.gray,"REGRET!!"}, {COLOR.lR,"Z ",COLOR.lG,"S ",COLOR.lSea,"J ",COLOR.lOrange,"L ",COLOR.lGrape,"T ",COLOR.lY,"O ",COLOR.lC,"I"}, {COLOR.lY,"LEGAL!!"}, {COLOR.R,"\"DMCA abusing\""}, diff --git a/parts/language/lang_sp.lua b/parts/language/lang_sp.lua index 051d7aeb..9914cec9 100644 --- a/parts/language/lang_sp.lua +++ b/parts/language/lang_sp.lua @@ -96,6 +96,7 @@ return{ createRoomTooFast="¡Creas salas muy rápido, párale we!", createRoomSuccessed="¡Sala creada con éxito!", + -- started="Playing", joinRoom="entró a la sala.", leaveRoom="salió de la sala.", notReady="En espera", @@ -231,7 +232,8 @@ return{ -- refreshing="Refreshing Rooms", noRoom="No Hay Salas Actualmente", refresh="Refrescar", - new="Sala Nueva", + new="Sala Nueva(2)", + new2="Sala Nueva(5)", join="Unirse", up="↑", down="↓", @@ -464,8 +466,6 @@ return{ dict={ title="TetroDictionary", link="Abrir URL", - up="↑", - down="↓", }, stat={ path="Abrir carpeta del juego", @@ -559,6 +559,7 @@ return{ }, app_dtw={ reset="Reiniciar", + -- arcade="Arcade", mode="Modo", }, savedata={ @@ -578,7 +579,7 @@ return{ resetData="Reiniciar datos", }, error={ - cmd="CMD", + cmd="Console", quit="Salir", }, }, diff --git a/parts/language/lang_symbol.lua b/parts/language/lang_symbol.lua index 7dfda31f..5f3e33ba 100644 --- a/parts/language/lang_symbol.lua +++ b/parts/language/lang_symbol.lua @@ -346,8 +346,6 @@ return{ dict={ title="TetroDictionary", link="~~e>>", - up="↑", - down="↓", }, stat={ path="%$%", @@ -487,6 +485,7 @@ return{ }, app_dtw={ reset="R", + arcade="↓↓", mode="?", }, }, diff --git a/parts/language/lang_yygq.lua b/parts/language/lang_yygq.lua index 2053ae5e..14d3dfac 100644 --- a/parts/language/lang_yygq.lua +++ b/parts/language/lang_yygq.lua @@ -43,9 +43,10 @@ return{ createRoomTooFast="手痒要开这么多房间?", createRoomSuccessed="创好了", + started="开了", notReady="没有准备好", beReady="准备好了", - champion="爷爷是 $1", + champion="神仙是 $1", stat={ "开了几次:", @@ -182,7 +183,7 @@ return{ tapFX="动画", }, error={ - cmd="CMD", + cmd="Console", quit="Quit", }, }, diff --git a/parts/language/lang_zh.lua b/parts/language/lang_zh.lua index bc6cde48..3a4df2d5 100644 --- a/parts/language/lang_zh.lua +++ b/parts/language/lang_zh.lua @@ -95,6 +95,7 @@ return{ createRoomTooFast="创建房间太快啦,等等吧", createRoomSuccessed="创建房间成功!", + started="游戏中", joinRoom="进入房间", leaveRoom="离开房间", notReady="等待中", @@ -253,7 +254,8 @@ return{ refreshing="刷新房间列表中", noRoom="一个房间都没有哎...", refresh="刷新", - new="创建房间", + new="创建房间(2)", + new2="创建房间(5)", join="加入", up="↑", down="↓", @@ -580,8 +582,8 @@ return{ dict={ title="小Z方块词典", link="打开链接", - up="↑", - down="↓", + up="↑",down="↓", + pageup="↑↑",pagedown="↓↓", }, stat={ path="打开存储目录", @@ -647,6 +649,7 @@ return{ }, app_dtw={ reset="重置", + arcade="街机", mode="模式", }, savedata={ @@ -666,7 +669,7 @@ return{ resetData="重置统计", }, error={ - cmd="命令行", + cmd="控制台", quit="退出", }, }, @@ -800,8 +803,9 @@ return{ "本游戏的一部分内容是国际合作的!", "本游戏的B2B是气槽机制,和传统的开关机制不一样哦", "本游戏可不是休闲游戏。", - "本游戏内置了几个休(ying)闲(he)小游戏哦~去词典找找吧", + "本游戏内置了几个休(ying)闲(he)小游戏哦~入口就藏在这个菜单", "必须要软降才能到达的位置都会判定为极简操作", + "别看攻击效率不高,其实消四还是很强的", "别问游戏名怎么取的,问就是随便想的", "不同人打40行最合适的方式不一样,s1w/63/散消/s2w...", "不同游戏(甚至不同模式)中不同战术的能力都不一样,并没有绝对的强弱之分", @@ -826,6 +830,7 @@ return{ "对战游戏不是单机游戏,所以timing在对战里也非常重要!", "多年小游戏玩家表示痛恨假加载,启动动画主要是在加载资源", "多hold现代块又回来了!", + "俄罗斯方块完全可以作为电竞游戏", "发现有个\"隐形\"皮肤了吗", "方块不能吃", "方块教会我们,合群了就会消失,...", @@ -943,6 +948,7 @@ return{ "这里的极简判定不松不严,放心软降,小心hold!", "震惊,我只是一条凑数tip吗", "中国的方块起步晚,所以世界级高手很少…下一个会是你吗?", + "众所周知俄罗斯方块是经典编程练手游戏(?", "注意到方块\"旋转\"的时候到底发生了些什么吗?", "自定义场地可以画图实现逐页演示", "总共有300多条tip哦", @@ -977,7 +983,7 @@ return{ "Farter:\"是民间UI动效艺术作品\"", "Farter:\"是一滩散乱的代码组成的蜜汁结构\"", "Farter:\"它是现在的techmino已发布版本\"", - "Farter:论方块的软工意义(就算这么小个范围内,各种取舍蒙混翻车现象都总会以很易懂的方式出现(", + "Farter:\"论方块的软工意义(就算这么小个范围内,各种取舍蒙混翻车现象都总会以很易懂的方式出现(\"", "fin neo iso 是满足tspin条件的特殊t2的名字", "if a==true", "l-=-1", @@ -987,14 +993,17 @@ return{ "sin²α-cos²β=-C(α+β)C(α-β)", "sin²α-sin²β=S(α+β)S(α-β)", "sin2α=2SαCα", - "Staff名单里飘过的是赞助榜单,喜欢本游戏的话可以给Z酱打赞助", + "Staff名单里飘过的是赞助榜单,喜欢本游戏的话可以给Z酱打赞助哦", "SΔABC=√(h(h-a)(h-b)(h-c)), h=(a+b+c)/2", "Tech生日不太清楚,那就定在2019.6.26吧", "Tech也有节日主题了哦", "Techmino = Technique + tetromino", "Techmino n.铁壳米诺(游戏名)", + "Techmino console了解一下", "Techmino安卓下载", "Techmino好玩!", + "Techmino 好玩!", + "Techmino 濂界帺锛", "Techmino有一个Nspire-CX版本!", "Techmino在哪里下载", "Techminohaowan", @@ -1004,6 +1013,7 @@ return{ "Z酱累了,Z酱不想更新", "Z酱只是个写代码的,懂什么方块", "Z块等身抱枕来一个(x", + {c.aqua,"AQUA"}, {c.B,"BLUE"}, {c.C,""}, {c.C,"15puzzle好玩!"}, @@ -1034,23 +1044,24 @@ return{ {c.G,"快捷键: Ctrl+Tab=切换标签页"}, {c.G,"快捷键: Ctrl+W=关闭当前标签页"}, {c.G,"快捷键: shift+del=永久删除文件 (技术人员别杠)"}, + {c.G,"GREEN"}, {c.grape,"GRAPE"}, {c.grape,"T-spin!"}, {c.grass,"GRASS"}, - {c.grey,"感谢Phigros提供部分tip模板("}, - {c.grey,"暂定段位:9"}, - {c.grey,"REGRET!!"}, - {c.lame,"LAME"}, + {c.gray,"感谢Phigros提供部分tip模板("}, + {c.gray,"暂定段位:9"}, + {c.gray,"REGRET!!"}, + {c.lime,"LIME"}, {c.lC,"26连T2来一个?"}, {c.lC,"Xspin",c.W,"是啥"}, {c.lGrape,"Naki",c.W," 可爱!"}, - {c.lGrey,"腱鞘炎警告"}, - {c.lGrey,"看起来是个计算器,其实…"}, - {c.lGrey,"没学过编曲,音乐都是自己瞎写的,觉得不好听就去设置关了吧"}, - {c.lGrey,"秘密数字:626"}, - {c.lGrey,"你有一个好"}, - {c.lGrey,"STSD必死"}, - {c.lGrey,"Techmino没有抽卡没有氪金,太良心了"}, + {c.lGray,"腱鞘炎警告"}, + {c.lGray,"看起来是个计算器,其实…"}, + {c.lGray,"没学过编曲,音乐都是自己瞎写的,觉得不好听就去设置关了吧"}, + {c.lGray,"秘密数字:626"}, + {c.lGray,"你有一个好"}, + {c.lGray,"STSD必死"}, + {c.lGray,"Techmino没有抽卡没有氪金,太良心了"}, {c.lR,"Z ",c.lG,"S ",c.lSea,"J ",c.lOrange,"L ",c.lGrape,"T ",c.lY,"O ",c.lC,"I"}, {c.lSea,"茶娘",c.W," 可爱!"}, {c.lY,"COOL!!"}, @@ -1076,16 +1087,14 @@ return{ {c.sky,"Lua",c.W,"天下第一"}, {c.sky,"SKY"}, {c.W,"1, 2, ",c.C,"⑨",c.W,"!!!!!"}, - {c.W,"效率药水",c.grey," 效率提升 (8:00)"}, - {c.W,"协调药水",c.grey," MD减少 II(1:30)"}, - {c.water,"WATER"}, + {c.W,"效率药水",c.gray," 效率提升 (8:00)"}, + {c.W,"协调药水",c.gray," MD减少 II(1:30)"}, {c.Y,"暂定段位:GM"}, {c.Y,"暂定段位:M"}, {c.Y,"暂定段位:MK"}, {c.Y,"暂定段位:MM"}, {c.Y,"暂定段位:MO"}, {c.Y,"暂定段位:MV"}, - {c.Y,"GREEN"}, {c.Y,"Miya",c.W," 可爱!"}, {c.Y,"O-spin Triple!"}, {c.Y,"YELLOW"}, diff --git a/parts/language/manual_en.lua b/parts/language/manual_en.lua index 72d2a01b..3e105d43 100644 --- a/parts/language/manual_en.lua +++ b/parts/language/manual_en.lua @@ -32,12 +32,12 @@ Attack system: Special line clears will the increase B2B gauge, making later special line clears have either a B2B or B2B2B bonus (see below) - Half Perfect Clear (a P.C. "with blocks left below". If it's an I clearing 1 line, the remaining blocks must not be player-placed): - Attack +2, Extra Blocking +2 + Hemi Perfect Clear (a P.C. "with blocks left below". If it's an I clearing 1 line, the remaining blocks must not be player-placed): + Attack +4, Extra Blocking +2 Perfect Clear (aka All Clear): Sends 8 to 16 (increments within a game by 2 for every PC) OR every other damage above, whichever is higher, - and +2 extra blocking. (note: if lines cleared in this round >4, then B2B gauge will be completely filled) + and +2 extra blocking. Combos: All damage above will be given a (combo x25%) bonus, or (combo x15% for Single clear) (capped at 12 combo), +1 more attack for 3 Combo or more. @@ -63,6 +63,8 @@ Back to Back (B2B) gauge: A regular line clear -250 Spin Single/Double/Triple/Techrash/Techrash+ + 50/100/180/800/1000 (x50% if Mini) Techrash/Techrash+ + 150/200/... + PC when lines cleared in this round >4, +800 + Hemi-PC, +100 Spin (0 lines) +20. Do note that the B2B gauge cannot exceed 800 using this method. When gauge is above 800, a drop without clearing lines decreases it by 40, but cannot drop below 800 diff --git a/parts/language/manual_zh.lua b/parts/language/manual_zh.lua index 239b39e8..37d0902a 100644 --- a/parts/language/manual_zh.lua +++ b/parts/language/manual_zh.lua @@ -27,8 +27,8 @@ spin判定: B2B攻击+1 B3B攻击+50%,+1额外抵挡 特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文) - 半全消("下方有剩余方块"的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+2,额外抵挡+2 - 全消:全消伤害为8~16(本局内递增2),和上述其他伤害取大,然后+2额外抵挡(注:本局消行数>4时会将B2B点数拉满) + 半全消("下方有剩余方块"的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+4,额外抵挡+2 + 全消:全消伤害为8~16(本局内递增2),和上述其他伤害取大,然后+2额外抵挡 连击:每次连击给予上述攻击[连击数*25%(上限12连)(如果只消一行就是15%)]的加成,>=3次时再额外加1攻击 根据上述规则计算后,向下取整,攻击打出 @@ -48,6 +48,8 @@ back to back(B2B)点数说明: 普通消除:-250 spin1~5:+[50/100/180/800/1000](mini变为原来50%) 消四/五/六:+[150/200/...] + 本局内消行数>4时全消:+800 + 半全消:+100 空spin:+20,此法得到的点数不能超过800 当点数在800以上时空放一块-40(不低于800) diff --git a/parts/list.lua b/parts/list.lua index 21a39f66..23c92c35 100644 --- a/parts/list.lua +++ b/parts/list.lua @@ -181,54 +181,6 @@ do--drawableText } end -do--SCS(spinCenters) - local N1,N2,N3,N4={0,1},{1,0},{1,1},{.5,.5} - local I1,I2,I3,I4={-.5,1.5},{1.5,-.5},{.5,1.5},{1.5,.5} - local V4={1.5,1.5} - local L1,L2={0,2},{2,0} - local S1,S2={-.5,.5},{.5,-.5} - local D={0,0} - SCS={ - --Tetramino - {[0]=N1,N2,N3,N3},--Z - {[0]=N1,N2,N3,N3},--S - {[0]=N1,N2,N3,N3},--L - {[0]=N1,N2,N3,N3},--J - {[0]=N1,N2,N3,N3},--T - {[0]=N4,N4,N4,N4},--O - {[0]=I1,I2,I3,I4},--I - - --Pentomino - {[0]=N3,N3,N3,N3},--Z5 - {[0]=N3,N3,N3,N3},--S5 - {[0]=N1,N2,N3,N3},--P - {[0]=N1,N2,N3,N3},--Q - {[0]=N3,N3,N3,N3},--F - {[0]=N3,N3,N3,N3},--E - {[0]=N3,N3,N3,N3},--T5 - {[0]=N1,N2,N3,N3},--U - {[0]=I3,N4,I4,V4},--V - {[0]=N3,N3,N3,N3},--W - {[0]=N3,N3,N3,N3},--X - {[0]=I3,I4,I3,I4},--J5 - {[0]=I3,I4,I3,I4},--L5 - {[0]=I3,I4,I3,I4},--R - {[0]=I3,I4,I3,I4},--Y - {[0]=I3,I4,I3,I4},--N - {[0]=I3,I4,I3,I4},--H - {[0]=L1,L2,L1,L2},--I5 - - --Trimino - {[0]=N1,N2,N1,N2},--I3 - {[0]=N4,N4,N4,N4},--C - - --Domino - {[0]=S1,S2,N4,N4},--I2 - - --Dot - {[0]=D,D,D,D},--O1 - } -end do--BLOCKS local O,_=true,false BLOCKS={ @@ -292,6 +244,55 @@ do--BLOCKS end end +do--SCS(spinCenters) + local N1,N2,N3,N4={0,1},{1,0},{1,1},{.5,.5} + local I1,I2,I3,I4={-.5,1.5},{1.5,-.5},{.5,1.5},{1.5,.5} + local V4={1.5,1.5} + local L1,L2={0,2},{2,0} + local S1,S2={-.5,.5},{.5,-.5} + local D={0,0} + SCS={ + --Tetramino + {[0]=N1,N2,N3,N3},--Z + {[0]=N1,N2,N3,N3},--S + {[0]=N1,N2,N3,N3},--L + {[0]=N1,N2,N3,N3},--J + {[0]=N1,N2,N3,N3},--T + {[0]=N4,N4,N4,N4},--O + {[0]=I1,I2,I3,I4},--I + + --Pentomino + {[0]=N3,N3,N3,N3},--Z5 + {[0]=N3,N3,N3,N3},--S5 + {[0]=N1,N2,N3,N3},--P + {[0]=N1,N2,N3,N3},--Q + {[0]=N3,N3,N3,N3},--F + {[0]=N3,N3,N3,N3},--E + {[0]=N3,N3,N3,N3},--T5 + {[0]=N1,N2,N3,N3},--U + {[0]=I3,N4,I4,V4},--V + {[0]=N3,N3,N3,N3},--W + {[0]=N3,N3,N3,N3},--X + {[0]=I3,I4,I3,I4},--J5 + {[0]=I3,I4,I3,I4},--L5 + {[0]=I3,I4,I3,I4},--R + {[0]=I3,I4,I3,I4},--Y + {[0]=I3,I4,I3,I4},--N + {[0]=I3,I4,I3,I4},--H + {[0]=L1,L2,L1,L2},--I5 + + --Trimino + {[0]=N1,N2,N1,N2},--I3 + {[0]=N4,N4,N4,N4},--C + + --Domino + {[0]=S1,S2,N4,N4},--I2 + + --Dot + {[0]=D,D,D,D},--O1 + } +end + rankColor={ {.6,.3,.3}, {.7,.5,.3}, @@ -301,28 +302,7 @@ rankColor={ } minoColor={ - COLOR.red, - COLOR.fire, - COLOR.orange, - COLOR.yellow, - COLOR.lame, - COLOR.grass, - COLOR.green, - COLOR.water, - COLOR.cyan, - COLOR.sky, - COLOR.sea, - COLOR.blue, - COLOR.purple, - COLOR.grape, - COLOR.magenta, - COLOR.pink, - COLOR.dGrey, - COLOR.black, - COLOR.lYellow, - COLOR.grey, - COLOR.lGrey, - COLOR.dPurple, - COLOR.dRed, - COLOR.dGreen, + COLOR.red, COLOR.fire, COLOR.orange, COLOR.yellow, COLOR.lime, COLOR.grass, COLOR.green, COLOR.aqua, + COLOR.cyan, COLOR.sky, COLOR.sea, COLOR.blue, COLOR.purple, COLOR.grape, COLOR.magenta, COLOR.pink, + COLOR.dGray,COLOR.black,COLOR.lYellow, COLOR.gray, COLOR.lGray, COLOR.dPurple, COLOR.dRed, COLOR.dGreen, } \ No newline at end of file diff --git a/parts/modes/attacker_h.lua b/parts/modes/attacker_h.lua index 091e61db..0c8d1c69 100644 --- a/parts/modes/attacker_h.lua +++ b/parts/modes/attacker_h.lua @@ -8,7 +8,7 @@ return{ task=function(P) while true do YIELD() - if P.control and SCN.cur=="play"and P.atkBuffer.sum==0 then + if P.control and P.atkBuffer.sum==0 then local p=#P.atkBuffer+1 local B,D=P.atkBuffer,P.modeData local t diff --git a/parts/modes/attacker_u.lua b/parts/modes/attacker_u.lua index c0bf5798..623fa85f 100644 --- a/parts/modes/attacker_u.lua +++ b/parts/modes/attacker_u.lua @@ -7,7 +7,7 @@ return{ task=function(P) while true do YIELD() - if P.control and SCN.cur=="play"and P.atkBuffer.sum<4 then + if P.control and P.atkBuffer.sum<4 then local p=#P.atkBuffer+1 local B,D=P.atkBuffer,P.modeData local s diff --git a/parts/modes/bigbang.lua b/parts/modes/bigbang.lua index bb697a37..a318f911 100644 --- a/parts/modes/bigbang.lua +++ b/parts/modes/bigbang.lua @@ -1,6 +1,6 @@ local format=string.format return{ - color=COLOR.lGrey, + color=COLOR.lGray, env={ drop=1e99,lock=1e99, holdCount=0, diff --git a/parts/modes/c4wtrain_l.lua b/parts/modes/c4wtrain_l.lua index 7126300d..7c24df47 100644 --- a/parts/modes/c4wtrain_l.lua +++ b/parts/modes/c4wtrain_l.lua @@ -1,4 +1,3 @@ -local rnd=math.random local rem=table.remove local function check_c4w(P) if P.lastPiece.row==0 then @@ -38,18 +37,18 @@ return{ P.visTime[i]=FREEROW.get(20) for x=4,7 do F[i][x]=0 end end - if rnd()<.6 then + if P:RND()<.6 then local initCell={11,14,12,13,21,24} for _=1,3 do - _=rem(initCell,rnd(#initCell)) + _=rem(initCell,P:RND(#initCell)) F[math.floor(_/10)][3+_%10]=20 end else local initCell={11,12,13,14,21,22,23,24} - rem(initCell,rnd(5,8)) - rem(initCell,rnd(1,4)) + rem(initCell,P:RND(5,8)) + rem(initCell,P:RND(1,4)) for _=1,6 do - _=rem(initCell,rnd(#initCell)) + _=rem(initCell,P:RND(#initCell)) F[math.floor(_/10)][3+_%10]=20 end end diff --git a/parts/modes/c4wtrain_n.lua b/parts/modes/c4wtrain_n.lua index a7f336a9..0432d660 100644 --- a/parts/modes/c4wtrain_n.lua +++ b/parts/modes/c4wtrain_n.lua @@ -1,4 +1,3 @@ -local rnd=math.random local rem=table.remove local function check_c4w(P) if P.lastPiece.row>0 then @@ -36,18 +35,18 @@ return{ P.visTime[i]=FREEROW.get(20) for x=4,7 do F[i][x]=0 end end - if rnd()<.6 then + if P:RND()<.6 then local initCell={11,14,12,13,21,24} for _=1,3 do - _=rem(initCell,rnd(#initCell)) + _=rem(initCell,P:RND(#initCell)) F[math.floor(_/10)][3+_%10]=20 end else local initCell={11,12,13,14,21,22,23,24} - rem(initCell,rnd(5,8)) - rem(initCell,rnd(1,4)) + rem(initCell,P:RND(5,8)) + rem(initCell,P:RND(1,4)) for _=1,6 do - _=rem(initCell,rnd(#initCell)) + _=rem(initCell,P:RND(#initCell)) F[math.floor(_/10)][3+_%10]=20 end end diff --git a/parts/modes/defender_l.lua b/parts/modes/defender_l.lua index 12d44d08..35485db1 100644 --- a/parts/modes/defender_l.lua +++ b/parts/modes/defender_l.lua @@ -9,7 +9,7 @@ return{ task=function(P) while true do YIELD() - if P.control and SCN.cur=="play"then + if P.control then local D=P.modeData D.counter=D.counter+1 local t=math.max(240-2*D.wave,40) diff --git a/parts/modes/defender_n.lua b/parts/modes/defender_n.lua index fecff8cb..6e583278 100644 --- a/parts/modes/defender_n.lua +++ b/parts/modes/defender_n.lua @@ -9,7 +9,7 @@ return{ task=function(P) while true do YIELD() - if P.control and SCN.cur=="play"then + if P.control then local D=P.modeData D.counter=D.counter+1 local t=math.max(360-D.wave*2,60) diff --git a/parts/modes/dig_h.lua b/parts/modes/dig_h.lua index a1971249..009a0558 100644 --- a/parts/modes/dig_h.lua +++ b/parts/modes/dig_h.lua @@ -7,7 +7,7 @@ return{ task=function(P) while true do YIELD() - if P.control and SCN.cur=="play"then + if P.control then local D=P.modeData D.timer=D.timer+1 if D.timer>=math.max(90,180-D.wave)then diff --git a/parts/modes/dig_u.lua b/parts/modes/dig_u.lua index f6ad5bf3..312847ce 100644 --- a/parts/modes/dig_u.lua +++ b/parts/modes/dig_u.lua @@ -6,7 +6,7 @@ return{ task=function(P) while true do YIELD() - if P.control and SCN.cur=="play"then + if P.control then local D=P.modeData D.timer=D.timer+1 if D.timer>=math.max(30,80-.3*D.wave)then diff --git a/parts/modes/drought_l.lua b/parts/modes/drought_l.lua index adff9e2d..dbdef6bf 100644 --- a/parts/modes/drought_l.lua +++ b/parts/modes/drought_l.lua @@ -7,7 +7,7 @@ return{ for _=1,3 do P:getNext(7)end while true do YIELD() - if not P.nextQueue[1] then + if not P.nextQueue[1]then local height=FREEROW.get(0) local max=#P.field if max>0 then diff --git a/parts/modes/master_final.lua b/parts/modes/master_final.lua index 8715ad59..c777780c 100644 --- a/parts/modes/master_final.lua +++ b/parts/modes/master_final.lua @@ -40,7 +40,7 @@ local function score(P) end return{ - color=COLOR.lGrey, + color=COLOR.lGray, env={ noTele=true, das=5,arr=1, diff --git a/parts/modes/master_phantasm.lua b/parts/modes/master_phantasm.lua index c751d30a..73967268 100644 --- a/parts/modes/master_phantasm.lua +++ b/parts/modes/master_phantasm.lua @@ -85,7 +85,7 @@ return{ p=41 end elseif T==62 then--Stage 5: survive without easy-fresh rule - P.life=1 + P.life=P.life+1 ENV.lock=13 ENV.wait=5 ENV.fall=5 @@ -113,7 +113,7 @@ return{ P.modeData.target=226 SFX.play("reach") elseif T==226 then--Stage 8: final invisible - P.life=P.life+2 + P.life=P.life+1 ENV.bone=false P:setInvisible(90) diff --git a/parts/modes/netBattle.lua b/parts/modes/netBattle.lua index c9bcbd58..e86df1d6 100644 --- a/parts/modes/netBattle.lua +++ b/parts/modes/netBattle.lua @@ -6,7 +6,6 @@ return{ pushSpeed=5, garbageSpeed=2, noMod=true, - bg="space", bgm={"race","push","secret8th","secret7th","waterfall","oxygen","shining terminal","storm","rockblock","magicblock","cruelty"}, }, load=function() diff --git a/parts/modes/sprintMPH.lua b/parts/modes/sprintMPH.lua index b1717e05..d4cecb31 100644 --- a/parts/modes/sprintMPH.lua +++ b/parts/modes/sprintMPH.lua @@ -19,7 +19,7 @@ return{ end, score=function(P)return{P.stat.time,P.stat.piece}end, scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end, - comp=function(a,b)return a[1]=1000 then P:win("finish")end end, bg="rainbow",bgm="push", @@ -22,10 +22,10 @@ return{ local T=P.stat.time return T<=750 and 5 or - T<=950 and 4 or - T<=1100 and 3 or - T<=1260 and 2 or - T<=1600 and 1 or + T<=900 and 4 or + T<=1260 and 3 or + T<=1620 and 2 or + T<=2000 and 1 or 0 end, } \ No newline at end of file diff --git a/parts/modes/sprint_100l.lua b/parts/modes/sprint_100l.lua index c5168975..a97b866e 100644 --- a/parts/modes/sprint_100l.lua +++ b/parts/modes/sprint_100l.lua @@ -23,9 +23,9 @@ return{ return T<=70 and 5 or T<=90 and 4 or - T<=120 and 3 or - T<=150 and 2 or - T<=200 and 1 or + T<=126 and 3 or + T<=162 and 2 or + T<=226 and 1 or 0 end, } \ No newline at end of file diff --git a/parts/modes/sprint_400l.lua b/parts/modes/sprint_400l.lua index cdb88311..27eb89e1 100644 --- a/parts/modes/sprint_400l.lua +++ b/parts/modes/sprint_400l.lua @@ -23,9 +23,9 @@ return{ return T<=300 and 5 or T<=380 and 4 or - T<=440 and 3 or - T<=500 and 2 or - T<=640 and 1 or + T<=500 and 3 or + T<=626 and 2 or + T<=800 and 1 or 0 end, } \ No newline at end of file diff --git a/parts/modes/sprint_40l.lua b/parts/modes/sprint_40l.lua index 6f1b8c3f..442e2a58 100644 --- a/parts/modes/sprint_40l.lua +++ b/parts/modes/sprint_40l.lua @@ -23,7 +23,7 @@ return{ local T=P.stat.time return T<=26 and 5 or - T<=32.6 and 4 or + T<=36 and 4 or T<=52.6 and 3 or T<=92.9 and 2 or T<=183 and 1 or diff --git a/parts/modes/survivor_e.lua b/parts/modes/survivor_e.lua index 08078e7d..fd5d99a0 100644 --- a/parts/modes/survivor_e.lua +++ b/parts/modes/survivor_e.lua @@ -6,7 +6,7 @@ return{ task=function(P) while true do YIELD() - if P.control and SCN.cur=="play"then + if P.control then local D=P.modeData D.timer=D.timer+1 if D.timer>=math.max(60,150-2*D.wave)and P.atkBuffer.sum<4 then diff --git a/parts/modes/survivor_h.lua b/parts/modes/survivor_h.lua index fe29cfb5..06ae003d 100644 --- a/parts/modes/survivor_h.lua +++ b/parts/modes/survivor_h.lua @@ -6,7 +6,7 @@ return{ task=function(P) while true do YIELD() - if P.control and SCN.cur=="play"then + if P.control then local D=P.modeData D.timer=D.timer+1 local B=P.atkBuffer diff --git a/parts/modes/survivor_l.lua b/parts/modes/survivor_l.lua index f77b0c6b..579683fb 100644 --- a/parts/modes/survivor_l.lua +++ b/parts/modes/survivor_l.lua @@ -6,7 +6,7 @@ return{ task=function(P) while true do YIELD() - if P.control and SCN.cur=="play"then + if P.control then local D=P.modeData D.timer=D.timer+1 if D.timer>=math.max(60,150-D.wave)and P.atkBuffer.sum<20 then diff --git a/parts/modes/survivor_n.lua b/parts/modes/survivor_n.lua index 88a21325..0c8cfdad 100644 --- a/parts/modes/survivor_n.lua +++ b/parts/modes/survivor_n.lua @@ -6,7 +6,7 @@ return{ task=function(P) while true do YIELD() - if P.control and SCN.cur=="play"then + if P.control then local D=P.modeData D.timer=D.timer+1 if D.timer>=math.max(90,180-2*D.wave)and P.atkBuffer.sum<8 then diff --git a/parts/modes/survivor_u.lua b/parts/modes/survivor_u.lua index 37f0a08d..4f7608bd 100644 --- a/parts/modes/survivor_u.lua +++ b/parts/modes/survivor_u.lua @@ -8,7 +8,7 @@ return{ task=function(P) while true do YIELD() - if P.control and SCN.cur=="play"then + if P.control then local D=P.modeData D.timer=D.timer+1 if D.timer>=math.max(300,600-10*D.wave)and P.atkBuffer.sum<20 then diff --git a/parts/modes/tech_finesse.lua b/parts/modes/tech_finesse.lua index 684dcfc3..45940117 100644 --- a/parts/modes/tech_finesse.lua +++ b/parts/modes/tech_finesse.lua @@ -6,7 +6,7 @@ return{ arr=0, drop=1e99,lock=60, freshLimit=15, - function(P)if P.stat.atk>=200 then P:win("finish")end end, + function(P)if P.stat.atk>=100 then P:win("finish")end end, fineKill=true, bg="flink",bgm="infinite", }, diff --git a/parts/modes/tech_finesse_f.lua b/parts/modes/tech_finesse_f.lua index 71c4cbaf..80f90bc2 100644 --- a/parts/modes/tech_finesse_f.lua +++ b/parts/modes/tech_finesse_f.lua @@ -7,13 +7,13 @@ local function tech_check_hard(P) return end end - if P.stat.atk>=200 then + if P.stat.atk>=100 then P:win("finish") end end return{ - color=COLOR.grey, + color=COLOR.gray, env={ arr=0, drop=1e99,lock=60, diff --git a/parts/modes/tech_h.lua b/parts/modes/tech_h.lua index ebee9481..aeb3e311 100644 --- a/parts/modes/tech_h.lua +++ b/parts/modes/tech_h.lua @@ -6,7 +6,7 @@ return{ drop=20,lock=60, freshLimit=15, b2bKill=true, - function(P)if P.stat.atk>=200 then P:win("finish")end end, + function(P)if P.stat.atk>=100 then P:win("finish")end end, bg="matrix",bgm="down", }, load=function() diff --git a/parts/modes/tech_h_plus.lua b/parts/modes/tech_h_plus.lua index 41970f71..18e63acf 100644 --- a/parts/modes/tech_h_plus.lua +++ b/parts/modes/tech_h_plus.lua @@ -7,7 +7,7 @@ local function tech_check_hard(P) return end end - if P.stat.atk>=200 then + if P.stat.atk>=100 then P:win("finish") end end diff --git a/parts/modes/tech_l.lua b/parts/modes/tech_l.lua index 702ffca3..24a6908a 100644 --- a/parts/modes/tech_l.lua +++ b/parts/modes/tech_l.lua @@ -6,7 +6,7 @@ return{ drop=0,lock=60, freshLimit=15, b2bKill=true, - function(P)if P.stat.atk>=200 then P:win("finish")end end, + function(P)if P.stat.atk>=100 then P:win("finish")end end, bg="matrix",bgm="warped", }, load=function() diff --git a/parts/modes/tech_l_plus.lua b/parts/modes/tech_l_plus.lua index 4306437f..b304130e 100644 --- a/parts/modes/tech_l_plus.lua +++ b/parts/modes/tech_l_plus.lua @@ -7,7 +7,7 @@ local function tech_check_hard(P) return end end - if P.stat.atk>=200 then + if P.stat.atk>=100 then P:win("finish") end end diff --git a/parts/modes/tech_n.lua b/parts/modes/tech_n.lua index 501b563c..d2808579 100644 --- a/parts/modes/tech_n.lua +++ b/parts/modes/tech_n.lua @@ -6,7 +6,7 @@ return{ infHold=true, drop=1e99,lock=1e99, b2bKill=true, - function(P)if P.stat.atk>=200 then P:win("finish")end end, + function(P)if P.stat.atk>=100 then P:win("finish")end end, bg="matrix",bgm="new era", }, load=function() diff --git a/parts/modes/tech_n_plus.lua b/parts/modes/tech_n_plus.lua index e1a9b318..c1e1d4c8 100644 --- a/parts/modes/tech_n_plus.lua +++ b/parts/modes/tech_n_plus.lua @@ -7,7 +7,7 @@ local function tech_check_hard(P) return end end - if P.stat.atk>=200 then + if P.stat.atk>=100 then P:win("finish") end end diff --git a/parts/modes/ultra.lua b/parts/modes/ultra.lua index 815e06cc..ef36ecf9 100644 --- a/parts/modes/ultra.lua +++ b/parts/modes/ultra.lua @@ -1,7 +1,7 @@ local gc=love.graphics local warnTime={60,90,105,115,116,117,118,119,120} return{ - color=COLOR.lGrey, + color=COLOR.lGray, env={ noTele=true, minarr=1,minsdarr=1, diff --git a/parts/modes/zen.lua b/parts/modes/zen.lua index aab2917d..0de30483 100644 --- a/parts/modes/zen.lua +++ b/parts/modes/zen.lua @@ -1,5 +1,5 @@ return{ - color=COLOR.lGrey, + color=COLOR.lGray, env={ drop=120,lock=120, infHold=true, diff --git a/parts/net.lua b/parts/net.lua index a39fb247..fd9f783b 100644 --- a/parts/net.lua +++ b/parts/net.lua @@ -110,17 +110,12 @@ function NET.wsconn_stream() end --Disconnect -function NET.wsclose_user() - WS.close("user") -end -function NET.wsclose_play() - WS.close("play") -end -function NET.wsclose_stream() - WS.close("stream") -end +function NET.wsclose_app()WS.close("app")end +function NET.wsclose_user()WS.close("user")end +function NET.wsclose_play()WS.close("play")end +function NET.wsclose_stream()WS.close("stream")end ---Account +--Account & User function NET.register(username,email,password) if NET.lock("register")then WS.send("app",JSON.encode{ @@ -141,34 +136,16 @@ function NET.getAccessToken() WS.send("user",JSON.encode{action=0}) end end -function NET.getUserInfo(id,ifDetail) +function NET.getUserInfo(uid) + local hash=not SETTING.dataSaving and USERS.getHash(uid) WS.send("user",JSON.encode{ action=1, data={ - id=id or USER.uid, - detailed=ifDetail or false, + id=uid, + hash=hash, }, }) end -function NET.storeUserInfo(d) - local user=USERS[d.uid] - if not user then - user={} - USERS[d.uid]=user - end - user.uid=d.uid - user.username=d.username - user.motto=d.motto - user.avatar=d.avatar - - --Get own name - if d.uid==USER.uid then - USER.username=d.username - FILE.save(USER,"conf/user","q") - end - - -- FILE.save(USERS,"conf/users") -end --Room function NET.fetchRoom() @@ -323,7 +300,7 @@ function NET.updateWS_user() LOG.print(text.accessSuccessed) NET.wsconn_play() elseif res.action==1 then--Get userInfo - NET.storeUserInfo(res.data) + USERS.updateUserData(res.data) end else WS.alert("user") @@ -490,9 +467,8 @@ function NET.updateWS_stream() elseif res.action==3 then--Player leave --? elseif res.action==4 then--Player died - local uid=res.data.uid for _,P in next,PLY_ALIVE do - if P.uid==uid then + if P.uid==d.uid then P:lose(true) break end diff --git a/parts/patron.lua b/parts/patron.lua index eb3615ec..e20aab4f 100644 --- a/parts/patron.lua +++ b/parts/patron.lua @@ -110,337 +110,337 @@ return{ { name="八零哥", font=25, - color=C.grey, + color=C.gray, }, { name="蕴空之灵", font=25, - color=C.grey, + color=C.gray, }, { name="gggf127", font=25, - color=C.grey, + color=C.gray, }, { name="solainu", font=25, - color=C.grey, + color=C.gray, }, { name="ThTsOd", font=25, - color=C.grey, + color=C.gray, }, { name="Fireboos", font=25, - color=C.grey, + color=C.gray, }, { name="星月千雪", font=25, - color=C.grey, + color=C.gray, }, { name="10元", font=25, - color=C.grey, + color=C.gray, }, { name="立斐", font=25, - color=C.grey, + color=C.gray, }, { name="Deep_Sea", font=25, - color=C.grey, + color=C.gray, }, { name="时雪", font=25, - color=C.grey, + color=C.gray, }, { name="yyangdid", font=25, - color=C.grey, + color=C.gray, }, { name="sfqr", font=25, - color=C.grey, + color=C.gray, }, { name="心痕", font=25, - color=C.grey, + color=C.gray, }, { name="Sasoric", font=25, - color=C.grey, + color=C.gray, }, { name="夏小亚", font=25, - color=C.grey, + color=C.gray, }, { name="仁参", font=25, - color=C.grey, + color=C.gray, }, { name="乐↗乐↘", font=25, - color=C.grey, + color=C.gray, }, { name="喜欢c4w的ztcjoin", font=25, - color=C.grey, + color=C.gray, }, { name="面包", font=25, - color=C.grey, + color=C.gray, }, { name="蠢熏", font=25, - color=C.grey, + color=C.gray, }, { name="潘一栗", font=25, - color=C.grey, + color=C.gray, }, { name="Lied", font=25, - color=C.grey, + color=C.gray, }, { name="星街书婉", font=25, - color=C.grey, + color=C.gray, }, { name="祝西", font=25, - color=C.grey, + color=C.gray, }, { name="829", font=25, - color=C.grey, + color=C.gray, }, { name="e m*12", font=25, - color=C.grey, + color=C.gray, }, { name="我永远爱白银诺艾尔(鹏", font=25, - color=C.grey, + color=C.gray, }, { name="PCX", font=25, - color=C.grey, + color=C.gray, }, { name="kagura77", font=25, - color=C.grey, + color=C.gray, }, { name="呆喂", font=25, - color=C.grey, + color=C.gray, }, { name="GlowingEmbers", font=25, - color=C.grey, + color=C.gray, }, { name="轩辕辚", font=25, - color=C.grey, + color=C.gray, }, { name="HimuroAki", font=25, - color=C.grey, + color=C.gray, }, { name="TCV100", font=25, - color=C.grey, + color=C.gray, }, { - name="tech有养成系统了@6565", + name="tech有养成系统了@7065", font=25, - color=C.grey, + color=C.gray, }, { name="HAGE KANOBU", font=25, - color=C.grey, + color=C.gray, }, { name="闪电和拐棍", font=25, - color=C.grey, + color=C.gray, }, { name="葡萄味的曼妥思", font=25, - color=C.grey, + color=C.gray, }, { name="蓝绿", font=25, - color=C.grey, + color=C.gray, }, { name="天生的魔法师", font=25, - color=C.grey, + color=C.gray, }, { name="琳雨空", font=25, - color=C.grey, + color=C.gray, }, { name="T8779.易缄", font=25, - color=C.grey, + color=C.gray, }, { name="诗情画意", font=25, - color=C.grey, + color=C.gray, }, { name="星姐阿夸双推Man暗炎", font=25, - color=C.grey, + color=C.gray, }, { name="[*炎]", font=25, - color=C.grey, + color=C.gray, }, { name="[*Y]", font=25, - color=C.grey, + color=C.gray, }, { name="aaa222", font=25, - color=C.grey, + color=C.gray, }, { name="[**城]", font=25, - color=C.grey, + color=C.gray, }, { name="cnDD", font=25, - color=C.grey, + color=C.gray, }, { name="红桃老给", font=25, - color=C.grey, + color=C.gray, }, { name="昭庭玲秋", font=25, - color=C.grey, + color=C.gray, }, { name="旋树墩", font=25, - color=C.grey, + color=C.gray, }, { name="火花工作室", font=25, - color=C.grey, + color=C.gray, }, { name="Cosine", font=25, - color=C.grey, + color=C.gray, }, { name="沁音的芝麻王", font=25, - color=C.grey, + color=C.gray, }, { name="SuperJH", font=25, - color=C.grey, + color=C.gray, }, { name="天上_飞", font=25, - color=C.grey, + color=C.gray, }, { name="uiro", font=25, - color=C.grey, + color=C.gray, }, { name="宇酱", font=25, - color=C.grey, + color=C.gray, }, { name="[W*N]", font=25, - color=C.grey, + color=C.gray, }, { name="[Z*.]", font=25, - color=C.grey, + color=C.gray, }, { name="[*之]", font=25, - color=C.grey, + color=C.gray, }, { name="白衣", font=25, - color=C.grey, + color=C.gray, }, { name="给虫", font=25, - color=C.grey, + color=C.gray, }, { name="我永远喜欢樱花小姐", font=25, - color=C.grey, + color=C.gray, }, { name="xb", font=25, - color=C.grey, + color=C.gray, }, { name="flaribbit", @@ -450,47 +450,47 @@ return{ { name="工口发动机", font=25, - color=C.grey, + color=C.gray, }, { name="金海星", font=25, - color=C.grey, + color=C.gray, }, { name="tatianyi", font=25, - color=C.grey, + color=C.gray, }, { name="[*瞳]", font=25, - color=C.grey, + color=C.gray, }, { name="彼方云城", font=25, - color=C.grey, + color=C.gray, }, { name="pm250", font=25, - color=C.grey, + color=C.gray, }, { name="nanaya", font=25, - color=C.grey, + color=C.gray, }, { name="黑红蓝白", font=25, - color=C.grey, + color=C.gray, }, { name="细胞", font=25, - color=C.grey, + color=C.gray, }, { name="流光梦", @@ -500,16 +500,16 @@ return{ { name="George2003", font=25, - color=C.grey, + color=C.gray, }, { name="竹月可安", font=25, - color=C.grey, + color=C.gray, }, { name="T7887库德里尔", font=25, - color=C.grey, + color=C.gray, }, } \ No newline at end of file diff --git a/parts/player/draw.lua b/parts/player/draw.lua index ca4fc9eb..16b13306 100644 --- a/parts/player/draw.lua +++ b/parts/player/draw.lua @@ -218,8 +218,8 @@ local function drawBoarders(P) gc_rectangle("line",-16,-3,15,604)--B2b bar boarder end local attackColor={ - {COLOR.dGrey,COLOR.white}, - {COLOR.grey,COLOR.white}, + {COLOR.dGray,COLOR.white}, + {COLOR.gray,COLOR.white}, {COLOR.lPurple,COLOR.white}, {COLOR.lRed,COLOR.white}, {COLOR.dGreen,COLOR.cyan}, @@ -426,12 +426,12 @@ local function drawMission(P) end local function drawStartCounter(P) gc_setColor(1,1,1) - if GAME.frame<180 then - if GAME.frame==0 then + if P.frameRun<180 then + if P.frameRun==0 then setFont(70) mStr(P.ready and text.beReady or text.notReady,305,220) else - local count=179-GAME.frame + local count=179-P.frameRun gc_push("transform") gc_translate(305,220) setFont(95) @@ -459,7 +459,7 @@ function draw.drawNext_norm(P) local bk,clr=P.nextQueue[N].bk,P.nextQueue[N].color local k=#bk>2 and 2.2/#bk or 1 gc_scale(k) - for i=1,#bk do for j=1,#bk[1] do + for i=1,#bk do for j=1,#bk[1]do if bk[i][j]then gc_draw(texture[clr],30*(j-#bk[1]*.5)-30,-30*(i-#bk*.5))-- drawCell(i-#bk*.5,j-#bk[1]*.5,clr) end @@ -497,7 +497,7 @@ function draw.drawNext_hidden(P) local bk,clr=P.nextQueue[N].bk,P.nextQueue[N].color local k=#bk>2 and 2.2/#bk or 1 gc_scale(k) - for i=1,#bk do for j=1,#bk[1] do + for i=1,#bk do for j=1,#bk[1]do if bk[i][j]then gc_draw(texture[clr],30*(j-#bk[1]*.5)-30,-30*(i-#bk*.5))-- drawCell(i-#bk*.5,j-#bk[1]*.5,clr) end @@ -650,7 +650,7 @@ function draw.norm(P) gc_setStencilTest("equal",1) gc_setLineWidth(20) for i=0,24 do - gc_setColor(COLOR.rainbow_grey(t*.626+i*.1)) + gc_setColor(COLOR.rainbow_gray(t*.626+i*.1)) gc_line(20*i-190,-2,20*i+10,602) end gc_setStencilTest() @@ -800,7 +800,7 @@ function draw.norm_remote(P) gc_setStencilTest("equal",1) gc_setLineWidth(20) for i=0,24 do - gc_setColor(COLOR.rainbow_grey(t*.626+i*.1)) + gc_setColor(COLOR.rainbow_gray(t*.626+i*.1)) gc_line(20*i-190,-2,20*i+10,602) end gc_setStencilTest() diff --git a/parts/player/init.lua b/parts/player/init.lua index 98eb955e..01b01f29 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -43,7 +43,7 @@ local function pressKey(P,keyID) P.keyPressing[keyID]=true P.actList[keyID](P) if P.control then - ins(P.keyTime,1,GAME.frame) + ins(P.keyTime,1,P.frameRun) P.keyTime[11]=nil end P.stat.key=P.stat.key+1 @@ -55,12 +55,12 @@ end local function pressKey_Rec(P,keyID) if P.keyAvailable[keyID]and P.alive then local L=GAME.rep - ins(L,GAME.frame) + ins(L,P.frameRun) ins(L,keyID) P.keyPressing[keyID]=true P.actList[keyID](P) if P.control then - ins(P.keyTime,1,GAME.frame) + ins(P.keyTime,1,P.frameRun) P.keyTime[11]=nil end P.stat.key=P.stat.key+1 @@ -68,7 +68,7 @@ local function pressKey_Rec(P,keyID) end local function releaseKey_Rec(P,keyID) local L=GAME.rep - ins(L,GAME.frame) + ins(L,P.frameRun) ins(L,32+keyID) P.keyPressing[keyID]=false end @@ -97,22 +97,24 @@ local function newEmptyPlayer(id,mini) P.x,P.y,P.size=0,0,1 P.frameColor=0 - P.mini=mini--If draw in small mode - --Set these at Player:setPosition() -- P.fieldX,P.fieldY=... -- P.centerX,P.centerY=... -- P.absFieldX,P.absFieldY=... - if P.mini then + --If draw in small mode + P.mini=mini + if mini then P.canvas=love.graphics.newCanvas(60,120) - P.frameWait=rnd(30,120) + P.frameWait=rnd(26,62) P.draw=PLY.draw.small else P.draw=PLY.draw.norm end + P.randGen=love.math.newRandomGenerator(GAME.seed) + P.frameRun=GAME.frameStart P.alive=true P.control=false P.timing=false @@ -323,15 +325,14 @@ local function applyGameEnv(P)--Finish gameEnv processing ENV.splashFX=false ENV.shakeFX=false ENV.text=false - else - if ENV.lockFX==0 then ENV.lockFX=false end - if ENV.dropFX==0 then ENV.dropFX=false end - if ENV.moveFX==0 then ENV.moveFX=false end - if ENV.clearFX==0 then ENV.clearFX=false end - if ENV.splashFX==0 then ENV.splashFX=false end - if ENV.shakeFX==0 then ENV.shakeFX=false end - if ENV.atkFX==0 then ENV.atkFX=false end end + if ENV.lockFX==0 then ENV.lockFX=false end + if ENV.dropFX==0 then ENV.dropFX=false end + if ENV.moveFX==0 then ENV.moveFX=false end + if ENV.clearFX==0 then ENV.clearFX=false end + if ENV.splashFX==0 then ENV.splashFX=false end + if ENV.shakeFX==0 then ENV.shakeFX=false end + if ENV.atkFX==0 then ENV.atkFX=false end if ENV.ghost==0 then ENV.ghost=false end if ENV.center==0 then ENV.center=false end end @@ -354,6 +355,7 @@ function PLY.newDemoPlayer(id) P.sound=true P.demo=true + P.frameRun=180 P.draw=PLY.draw.demo P.control=true GAME.modeEnv=DemoEnv diff --git a/parts/player/player.lua b/parts/player/player.lua index 163ddcfc..6b7e9a5c 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -336,9 +336,10 @@ function Player:ifoverlap(bk,x,y) end end function Player:attack(R,send,time,line,fromStream) + local atkFX=self.gameEnv.atkFX if GAME.net then if self.type=="human"then--Local player attack others - ins(GAME.rep,GAME.frame) + ins(GAME.rep,self.frameRun) ins(GAME.rep, R.sid+ send*0x100+ @@ -346,9 +347,12 @@ function Player:attack(R,send,time,line,fromStream) line*0x100000000+ 0x2000000000000 ) + if atkFX then + self:createBeam(R,send,atkFX,self.cur.color) + end end if fromStream and R.type=="human"then--Local player receiving lines - ins(GAME.rep,GAME.frame) + ins(GAME.rep,R.frameRun) ins(GAME.rep, self.sid+ send*0x100+ @@ -360,6 +364,9 @@ function Player:attack(R,send,time,line,fromStream) end else R:receive(self,send,time,line) + if atkFX then + self:createBeam(R,send,atkFX,self.cur.color) + end end end function Player:receive(A,send,time,line) @@ -589,7 +596,7 @@ function Player:spin(d,ifpre) local ix,iy=self.curX+self.cur.sc[2]-isc[2],self.curY+self.cur.sc[1]-isc[1] for test=1,#kickData do local x,y=ix+kickData[test][1],iy+kickData[test][2] - if not self:ifoverlap(icb,x,y)and(self.freshTime>=0 or kickData[test][2]<0)then + if not self:ifoverlap(icb,x,y)and(self.freshTime>0 or kickData[test][2]<0)then ix,iy=x,y if self.gameEnv.moveFX and self.gameEnv.block then self:createMoveFX() @@ -602,7 +609,7 @@ function Player:spin(d,ifpre) if not ifpre then self:freshBlock("move") end - if kickData[test][2]>0 and self.freshTime~=t and self.curY~=self.imgY then + if kickData[test][2]>0 and self.freshTime==t and self.curY~=self.imgY then self.freshTime=self.freshTime-1 end @@ -774,12 +781,12 @@ function Player:popNext(ifhold)--Pop nextQueue to hand end end - local _=self.keyPressing + local pressing=self.keyPressing --IHS - if not ifhold and _[8]and self.gameEnv.ihs then + if not ifhold and pressing[8]and self.gameEnv.ihs and self.holdTime>0 then self:hold(true) - _[8]=false + pressing[8]=false else self:resetBlock() end @@ -797,9 +804,9 @@ function Player:popNext(ifhold)--Pop nextQueue to hand end --IHdS - if _[6]and not ifhold then + if pressing[6]and not ifhold then self.act_hardDrop(self) - _[6]=false + pressing[6]=false end else self:hold() @@ -953,9 +960,9 @@ do--Player.drop(self)--Place piece function Player:drop() local _ local CHN=VOC.getFreeChannel() - self.dropTime[11]=ins(self.dropTime,1,GAME.frame)--Update speed dial + self.dropTime[11]=ins(self.dropTime,1,self.frameRun)--Update speed dial local ENV=self.gameEnv - local STAT=self.stat + local Stat=self.stat local piece=self.lastPiece local finish @@ -974,7 +981,7 @@ do--Player.drop(self)--Place piece --Tri-corner spin check if self.spinLast then if C.id<6 then - local x,y=CX+self.cur.sc[2],CY+self.cur.sc[1] + local x,y=CX+C.sc[2],CY+C.sc[1] local c=0 if self:solid(x-1,y+1)then c=c+1 end if self:solid(x+1,y+1)then c=c+1 end @@ -1100,15 +1107,17 @@ do--Player.drop(self)--Place piece end end - --Cancel no-sense clearing FX - _=#self.clearingRow - while _>0 and self.clearingRow[_]>#self.field do - self.clearingRow[_]=nil - _=_-1 + --Cancel top clearing FX + for i=#self.clearingRow,1,-1 do + if self.clearingRow[i]>#self.field then + rem(self.clearingRow) + else + break + end end if self.clearingRow[1]then self.falling=ENV.fall - elseif cc>=#C.bk then + else clear=true end @@ -1117,16 +1126,16 @@ do--Player.drop(self)--Place piece if not finesse then if dospin then self.ctrlCount=self.ctrlCount-2 end--Allow 2 more step for roof-less spin local id=C.id - local d=self.ctrlCount-finesseList[id][self.cur.dir+1][CX] + local d=self.ctrlCount-finesseList[id][C.dir+1][CX] finePts=d<=0 and 5 or max(3-d,0) else finePts=5 end piece.finePts=finePts - STAT.finesseRate=STAT.finesseRate+finePts + Stat.finesseRate=Stat.finesseRate+finePts if finePts<5 then - STAT.extraPiece=STAT.extraPiece+1 + Stat.extraPiece=Stat.extraPiece+1 if ENV.fineKill then finish=true end @@ -1164,7 +1173,7 @@ do--Player.drop(self)--Place piece atk=b2bATK[cc]+cc*.5 exblock=exblock+1 cscore=cscore*2 - STAT.b3b=STAT.b3b+1 + Stat.b3b=Stat.b3b+1 if self.sound then VOC.play("b3b",CHN) end @@ -1172,7 +1181,7 @@ do--Player.drop(self)--Place piece self:showText(text.b2b..text.block[C.name]..text.spin.." "..text.clear[cc],0,-30,35,"spin") atk=b2bATK[cc] cscore=cscore*1.2 - STAT.b2b=STAT.b2b+1 + Stat.b2b=Stat.b2b+1 if self.sound then VOC.play("b2b",CHN) end @@ -1207,7 +1216,7 @@ do--Player.drop(self)--Place piece sendTime=100 exblock=exblock+1 cscore=cscore*1.8 - STAT.b3b=STAT.b3b+1 + Stat.b3b=Stat.b3b+1 if self.sound then VOC.play("b3b",CHN) end @@ -1216,7 +1225,7 @@ do--Player.drop(self)--Place piece sendTime=80 atk=3*cc-7 cscore=cscore*1.3 - STAT.b2b=STAT.b2b+1 + Stat.b2b=Stat.b2b+1 if self.sound then VOC.play("b2b",CHN) end @@ -1258,37 +1267,40 @@ do--Player.drop(self)--Place piece end --PC/HPC - if clear and #self.field==0 then - self:showText(text.PC,0,-80,50,"flicker") - atk=max(atk,min(8+STAT.pc*2,16)) - exblock=exblock+2 - sendTime=sendTime+120 - if STAT.row+cc>4 then - self.b2b=1000 - cscore=cscore+300*min(6+STAT.pc,10) - else + if clear then + if #self.field==0 then + self:showText(text.PC,0,-80,50,"flicker") + atk=max(atk,min(8+Stat.pc*2,16)) + exblock=exblock+2 + sendTime=sendTime+120 + if Stat.row+cc>4 then + self.b2b=self.b2b+800 + cscore=cscore+300*min(6+Stat.pc,10) + else + cscore=cscore+626 + end + Stat.pc=Stat.pc+1 + if self.sound then + SFX.play("clear") + VOC.play("perfect_clear",CHN) + end + piece.pc=true + piece.special=true + elseif cc>=#C.bk and(cc>1 or #self.field==self.garbageBeneath)then + self:showText(text.HPC,0,-80,50,"fly") + atk=atk+4 + exblock=exblock+2 + sendTime=sendTime+60 + self.b2b=self.b2b+100 cscore=cscore+626 + Stat.hpc=Stat.hpc+1 + if self.sound then + SFX.play("clear") + VOC.play("half_clear",CHN) + end + piece.hpc=true + piece.special=true end - STAT.pc=STAT.pc+1 - if self.sound then - SFX.play("clear") - VOC.play("perfect_clear",CHN) - end - piece.pc=true - piece.special=true - elseif clear and(cc>1 or #self.field==self.garbageBeneath)then - self:showText(text.HPC,0,-80,50,"fly") - atk=atk+2 - exblock=exblock+2 - sendTime=sendTime+60 - cscore=cscore+626 - STAT.hpc=STAT.hpc+1 - if self.sound then - SFX.play("clear") - VOC.play("half_clear",CHN) - end - piece.hpc=true - piece.special=true end if self.b2b>1000 then self.b2b=1000 end @@ -1323,9 +1335,6 @@ do--Player.drop(self)--Place piece if M>0 then for i=1,M do self:attack(self.atker[i],send,sendTime,generateLine(self:RND(10))) - if ENV.atkFX then - self:createBeam(self.atker[i],send,ENV.atkFX,C.color) - end end else T=randomTarget(self) @@ -1339,9 +1348,6 @@ do--Player.drop(self)--Place piece end if T then self:attack(T,send,sendTime,generateLine(self:RND(10))) - if ENV.atkFX then - self:createBeam(T,send,ENV.atkFX,C.color) - end end end if self.sound and send>3 then SFX.play("emit",min(send,7)*.1)end @@ -1386,13 +1392,18 @@ do--Player.drop(self)--Place piece end --Speed bonus - if self.dropSpeed>60 then - cscore=cscore*(.9+self.dropSpeed/600) - end + if self.dropSpeed>60 then cscore=cscore*(.9+self.dropSpeed/600)end cscore=int(cscore) if ENV.score then - self:showText(cscore,(self.curX+self.cur.sc[2]-5.5)*30,(10-self.curY-self.cur.sc[1])*30+self.fieldBeneath+self.fieldUp,40-600/(cscore+20),"score",2) + self:showText( + cscore, + (self.curX+C.sc[2]-5.5)*30, + (10-self.curY-C.sc[1])*30+self.fieldBeneath+self.fieldUp, + 40-600/(cscore+20), + "score", + 2 + ) end piece.row,piece.dig=cc,gbcc @@ -1436,33 +1447,33 @@ do--Player.drop(self)--Place piece end --Update stat - STAT.score=STAT.score+cscore - STAT.piece=STAT.piece+1 - STAT.row=STAT.row+cc - STAT.maxFinesseCombo=max(STAT.maxFinesseCombo,self.finesseCombo) - STAT.maxCombo=max(STAT.maxCombo,self.combo) + Stat.score=Stat.score+cscore + Stat.piece=Stat.piece+1 + Stat.row=Stat.row+cc + Stat.maxFinesseCombo=max(Stat.maxFinesseCombo,self.finesseCombo) + Stat.maxCombo=max(Stat.maxCombo,self.combo) if atk>0 then - STAT.atk=STAT.atk+atk + Stat.atk=Stat.atk+atk if send>0 then - STAT.send=STAT.send+int(send) + Stat.send=Stat.send+int(send) end if off>0 then - STAT.off=STAT.off+off + Stat.off=Stat.off+off end end if gbcc>0 then - STAT.dig=STAT.dig+gbcc + Stat.dig=Stat.dig+gbcc if atk>0 then - STAT.digatk=STAT.digatk+atk*gbcc/cc + Stat.digatk=Stat.digatk+atk*gbcc/cc end end local n=C.name if dospin then - _=STAT.spin[n] _[cc+1]=_[cc+1]+1--Spin[1~25][0~4] - _=STAT.spins _[cc+1]=_[cc+1]+1--Spin[0~4] + _=Stat.spin[n] _[cc+1]=_[cc+1]+1--Spin[1~25][0~4] + _=Stat.spins _[cc+1]=_[cc+1]+1--Spin[0~4] elseif cc>0 then - _=STAT.clear[n] _[cc]=_[cc]+1--Clear[1~25][1~5] - _=STAT.clears _[cc]=_[cc]+1--Clear[1~5] + _=Stat.clear[n] _[cc]=_[cc]+1--Clear[1~25][1~5] + _=Stat.clears _[cc]=_[cc]+1--Clear[1~5] end if finish then @@ -1598,7 +1609,7 @@ function tick_autoPause() while true do yield() time=time+1 - if SCN.cur~="play"or GAME.frame<180 then + if SCN.cur~="game"or PLAYERS[1].frameRun<180 then return elseif time==120 then pauseGame() @@ -1686,7 +1697,7 @@ function Player:die()--Called both when win/lose! end if GAME.net then if self.id==1 then - ins(GAME.rep,GAME.frame) + ins(GAME.rep,self.frameRun) ins(GAME.rep,0) else if self.lastRecv and self.lastRecv.id==1 then diff --git a/parts/player/update.lua b/parts/player/update.lua index 8290e6c8..2495b6c3 100644 --- a/parts/player/update.lua +++ b/parts/player/update.lua @@ -114,8 +114,29 @@ local update={ } function update.alive(P,dt) local ENV=P.gameEnv + local S=P.stat + + P.frameRun=P.frameRun+1 + if P.frameRun<=180 then + if P.frameRun==180 then + if P.id==1 then SFX.play("start")end + P.control=true + P.timing=true + P:popNext() + elseif P.frameRun==60 or P.frameRun==120 then + if P.id==1 then SFX.play("ready")end + end + if P.movDir~=0 then + if P.moving0 end}, - WIDGET.newKey{name="record1", x=1100,y=390,w=220,h=50,fText="",color="grey",code=pressKey"1",hide=function()return state==2 end}, - WIDGET.newKey{name="record2", x=1100,y=450,w=220,h=50,fText="",color="grey",code=pressKey"2",hide=function()return state==2 end}, + WIDGET.newKey{name="record1", x=1100,y=390,w=220,h=50,fText="",color="gray",code=pressKey"1",hide=function()return state==2 end}, + WIDGET.newKey{name="record2", x=1100,y=450,w=220,h=50,fText="",color="gray",code=pressKey"2",hide=function()return state==2 end}, WIDGET.newKey{name="replay1", x=1245,y=390,w=50,fText="!",color="green",code=pressKey"c1",hide=function()return state==2 or #repeater.seq[1]==0 end}, WIDGET.newKey{name="replay2", x=1245,y=450,w=50,fText="!",color="green",code=pressKey"c2",hide=function()return state==2 or #repeater.seq[2]==0 end}, WIDGET.newButton{name="back", x=1140,y=640,w=170,h=80,font=40,code=backScene}, diff --git a/parts/scenes/app_cannon.lua b/parts/scenes/app_cannon.lua index 38ce5a79..4ec26a0d 100644 --- a/parts/scenes/app_cannon.lua +++ b/parts/scenes/app_cannon.lua @@ -82,16 +82,16 @@ end local scoreColor={ "white",--0 - "water",--20 + "aqua",--20 "sky",--40 "blue",--60 "grape",--80 "pink",--100 - "red","fire","orange","yellow","lWater",--200 + "red","fire","orange","yellow","lAqua",--200 "lSky","lBlue","lGrape","lPink","lRed",--300 - "lFire","lOrange","lYellow","dWater","dSky",--400 + "lFire","lOrange","lYellow","dAqua","dSky",--400 "dBlue","dGrape","dPink","dRed","dFire",--500 - "dYellow","lGrey","grey","dGrey",--before 600, black after + "dYellow","lGray","gray","dGray",--before 600, black after } function scene.draw() --Spawn area diff --git a/parts/scenes/app_cmd.lua b/parts/scenes/app_cmd.lua index 81be3d9f..cc70af9e 100644 --- a/parts/scenes/app_cmd.lua +++ b/parts/scenes/app_cmd.lua @@ -6,7 +6,7 @@ local C=COLOR local inputBox=WIDGET.newInputBox{name="input",x=40,y=650,w=1200,h=50} local outputBox=WIDGET.newTextBox{name="output",x=40,y=30,w=1200,h=600,font=25,lineH=25,fix=true} local function log(str)outputBox:push(str)end -log{C.lGrape,"Techmino Shell"} +log{C.lGrape,"Techmino Console"} log{C.lBlue,"©2020 26F Studio some rights reserved"} log{C.dRed,"DO NOT RUN ANY CODE YOU DON'T UNDERSTAND"} @@ -275,7 +275,7 @@ do--commands.help(arg) log{C.lPink,"Page ",C.lG,page,C.lPink," of ",C.lG,maxPage} for i=pageSize*(page-1)+1,math.min(pageSize*page,#command_help_list)do local cmd=command_help_list[i] - log{C.W,cmd,C.grey," "..command_help_messages[cmd].description} + log{C.W,cmd,C.gray," "..command_help_messages[cmd].description} end else log{C.R,"Invalid page number. Must be between 1 and "..maxPage.." (inclusive)."} @@ -306,7 +306,7 @@ function commands.print(name) log{C.R,"No file called '"..name.."'"} end else - log{C.water,"Usage: print [filename]"} + log{C.aqua,"Usage: print [filename]"} end end function commands.url(url) @@ -316,7 +316,7 @@ function commands.url(url) log{C.R,"[ERR] ",C.W,err} end else - log{C.water,"Usage: url [url]"} + log{C.aqua,"Usage: url [url]"} end end local function tree(path,name,depth) @@ -368,7 +368,7 @@ function commands.del(name) log{C.R,"No file called '"..name.."'"} end else - log{C.water,"Usage: del [filename]"} + log{C.aqua,"Usage: del [filename]"} end end commands.exit=backScene @@ -384,7 +384,7 @@ function commands.fn(n) return end end - log{C.water,"Usage: fn [1~12]"} + log{C.aqua,"Usage: fn [1~12]"} end function commands.scrinfo() for _,v in next,SCR.info()do @@ -396,7 +396,7 @@ function commands.wireframe(bool) gc.setWireframe(bool=="true") log("Wireframe: "..(gc.isWireframe()and"on"or"off")) else - log{C.water,"Usage: wireframe [true|false]"} + log{C.aqua,"Usage: wireframe [true|false]"} end end function commands.gammacorrect(bool) @@ -404,7 +404,7 @@ function commands.gammacorrect(bool) love._setGammaCorrect(bool=="true") log("GammaCorrect: "..(gc.isGammaCorrect()and"on"or"off")) else - log{C.water,"Usage: gammacorrect [true|false]"} + log{C.aqua,"Usage: gammacorrect [true|false]"} end end function commands.rmwtm(pw) @@ -413,7 +413,7 @@ function commands.rmwtm(pw) log{C.lC,"\87\97\116\101\114\109\97\114\107\32\82\101\109\111\118\101\100"} SFX.play("clear") else - log{C.water,"Usage: rmwtm [password]"} + log{C.aqua,"Usage: rmwtm [password]"} end end function commands.unlockall(bool) @@ -437,7 +437,7 @@ function commands.play(m)--marathon_bfmax can only entered through here elseif m~=""then log{C.R,"No mode called "..m} else - log{C.water,"Usage: play [modeName]"} + log{C.aqua,"Usage: play [modeName]"} end end function commands.playbgm(bgm) @@ -452,7 +452,7 @@ function commands.playbgm(bgm) log("Already playing: "..bgm) end else - log{C.water,"Usage: playbgm [bgmName]"} + log{C.aqua,"Usage: playbgm [bgmName]"} end end function commands.stopbgm() @@ -470,7 +470,7 @@ function commands.setbg(name) log("Background already set to '"..name.."'") end else - log{C.water,"Usage: setbg [bgName]"} + log{C.aqua,"Usage: setbg [bgName]"} end end function commands.theme(name) @@ -481,7 +481,7 @@ function commands.theme(name) log("No theme called "..name) end else - log{C.water,"Usage: theme [themeName]"} + log{C.aqua,"Usage: theme [themeName]"} end end function commands.demo() @@ -519,11 +519,11 @@ do--commands.applet(name) return end end - log{C.water,"No this applet"} + log{C.aqua,"No this applet"} else - log{C.water,"Usage:"} - log{C.water,"applet -list"} - log{C.water,"applet [appName]"} + log{C.aqua,"Usage:"} + log{C.aqua,"applet -list"} + log{C.aqua,"applet [appName]"} end end commands.app=commands.applet @@ -689,7 +689,7 @@ function scene.keyDown(k) log(">Commands start with '"..str.."' :") table.sort(res) for i=1,#res do - log{COLOR.lGrey,res[i]} + log{COLOR.lGray,res[i]} end elseif #res==1 then inputBox.value=res[1] diff --git a/parts/scenes/app_dropper.lua b/parts/scenes/app_dropper.lua index 31f58064..ba284c71 100644 --- a/parts/scenes/app_dropper.lua +++ b/parts/scenes/app_dropper.lua @@ -188,7 +188,7 @@ function scene.draw() gc.setColor(COLOR.rainbow_light(TIME()*2.6)) mStr("DROPPER",640,120) - gc.setColor(COLOR.rainbow_grey(TIME()*1.626)) + gc.setColor(COLOR.rainbow_gray(TIME()*1.626)) setFont(55) mStr("Score - "..score,640,290) mStr("High Score - "..highScore,640,370) diff --git a/parts/scenes/app_dtw.lua b/parts/scenes/app_dtw.lua index a657eed5..f89d6be6 100644 --- a/parts/scenes/app_dtw.lua +++ b/parts/scenes/app_dtw.lua @@ -12,25 +12,23 @@ local targets={ [620]=true, [1000]=true, [2600]=true, - [5000]=true, - [10000]=true, - [26000]=true, } local state,progress local startTime,time local keyTime local speed,maxSpeed +local arcade,rollSpeed local tileColor={ - COLOR.black, - COLOR.dRed, - COLOR.dG, - COLOR.dB, - COLOR.dY, - COLOR.dSky, - COLOR.dPurple, + {.0,.0,.0}, + {.3,.0,.0}, + {.0,.3,.0}, + {.0,.0,.3}, + {.3,.3,.0}, + {.0,.1,.3}, + {.2,.0,.3}, } local modeName={ "Normal", @@ -96,8 +94,9 @@ local function reset() progress={} state,time=0,0 score=0 + rollSpeed=6.26 - pos={rnd(4)}for _=1,5 do newTile()end + pos={rnd(4)}for _=1,6 do newTile()end height=0 diePos=false end @@ -106,8 +105,9 @@ local scene={} function scene.sceneInit() mode=1 + arcade=true reset() - BG.set("grey") + BG.set("gray") BGM.play("way") love.keyboard.setKeyRepeat(false) end @@ -131,9 +131,9 @@ local function touch(n) ins(keyTime,1,TIME()) keyTime[21]=nil score=score+1 - if targets[score]then + if not arcade and targets[score]then ins(progress,format("%s - %.3fs",score,TIME()-startTime)) - if score==26000 then + if score==2600 then for i=1,#pos do pos[i]=626 end @@ -158,13 +158,15 @@ function scene.keyDown(key) if key=="r"then reset() elseif key=="escape"then SCN.back() elseif state~=2 then - if key=="d"or key=="c"then touch(1) - elseif key=="f"or key=="v"then touch(2) - elseif key=="j"or key=="n"then touch(3) - elseif key=="k"or key=="m"then touch(4) + if key=="d"or key=="c"then touch(1) + elseif key=="f"or key=="v"then touch(2) + elseif key=="j"or key=="n"then touch(3) + elseif key=="k"or key=="m"then touch(4) elseif(key=="q"or key=="tab")and state==0 then mode=mode%#modeName+1 reset() + elseif key=="w"and state==0 then + arcade=not arcade end end end @@ -181,62 +183,80 @@ end function scene.update() if state==1 then - time=TIME()-startTime local t=TIME() + time=t-startTime local v=0 for i=2,20 do v=v+i*(i-1)*.3/(t-keyTime[i])end speed=speed*.99+v*.01 if speed>maxSpeed then maxSpeed=speed end + + if arcade then + height=height-rollSpeed + rollSpeed=rollSpeed+.00355 + if height<-120 then + state=2 + SFX.play("clear_2") + end + else + height=height*.6 + end end - height=height*.6 end function scene.draw() --Draw mode gc.setColor(1,1,1) setFont(50) - mStr(modeName[mode],155,300) + mStr(modeName[mode],155,380) - --Draw speed - setFont(45) - gc.setColor(1,.6,.6) - mStr(format("%.2f",maxSpeed/60),155,400) - gc.setColor(1,1,1) - mStr(format("%.2f",speed/60),155,460) + if arcade then + --Draw rolling speed + mStr(format("%.2f/s",rollSpeed/2),155,490) + else + --Draw speed + setFont(45) + gc.setColor(1,.6,.6) + mStr(format("%.2f",maxSpeed/60),155,460) + gc.setColor(1,1,1) + mStr(format("%.2f",speed/60),155,520) - --Draw time - setFont(45) - gc.print(format("%.3f",time),1030,70) + --Progress time list + setFont(30) + gc.setColor(.6,.6,.6) + for i=1,#progress do + gc.print(progress[i],1030,120+25*i) + end - --Progress time list - setFont(30) - gc.setColor(.6,.6,.6) - for i=1,#progress do - gc.print(progress[i],1030,120+25*i) + --Draw time + gc.setColor(1,1,1) + setFont(45) + gc.print(format("%.3f",time),1030,70) end --Draw tiles - gc.setColor(1,1,1) gc.rectangle("fill",300,0,680,720) gc.setColor(tileColor[mode]) - for i=1,#pos do - if pos[i]<10 then - gc.rectangle("fill",130+170*pos[i]+8,720-i*120-height+8,170-16,120-16) - else - gc.rectangle("fill",130+170*(pos[i]%10)+8,720-i*120-height+8,170-16,120-16) - gc.rectangle("fill",130+170*int(pos[i]/10)+8,720-i*120-height+8,170-16,120-16) + gc.push("transform") + gc.translate(0,720-height+8) + for i=1,#pos do + if pos[i]<10 then + gc.rectangle("fill",130+170*pos[i]+8,-i*120,170-16,120-16) + else + gc.rectangle("fill",130+170*(pos[i]%10)+8,-i*120,170-16,120-16) + gc.rectangle("fill",130+170*int(pos[i]/10)+8,-i*120,170-16,120-16) + end end - end + gc.pop() --Draw track line gc.setColor(0,0,0) - gc.setLineWidth(4) + gc.setLineWidth(2) for x=1,5 do x=130+170*x gc.line(x,0,x,720) end for y=0,6 do - y=720-120*y-height + y=720-120*y-height%120 gc.line(300,y,980,y) end @@ -259,6 +279,7 @@ end scene.widgetList={ WIDGET.newButton{name="reset", x=155,y=100,w=180,h=100,color="lGreen",font=40,code=pressKey"r"}, WIDGET.newButton{name="mode", x=155,y=220,w=180,h=100,font=40,code=pressKey"q",hide=function()return state~=0 end}, + WIDGET.newSwitch{name="arcade", x=230,y=330,font=40,disp=function()return arcade end,code=pressKey"w",hide=function()return state~=0 end}, WIDGET.newButton{name="back", x=1140,y=640,w=170,h=80,font=40,code=backScene}, } diff --git a/parts/scenes/app_tap.lua b/parts/scenes/app_tap.lua index a0d3fe34..6cec4407 100644 --- a/parts/scenes/app_tap.lua +++ b/parts/scenes/app_tap.lua @@ -13,7 +13,7 @@ function scene.sceneInit() lastKey=nil speed=0 keyTime={}for i=1,40 do keyTime[i]=-1e99 end - BG.set("grey") + BG.set("gray") BGM.play("push") love.keyboard.setKeyRepeat(false) end diff --git a/parts/scenes/app_ten.lua b/parts/scenes/app_ten.lua index e176f909..fcd24d1d 100644 --- a/parts/scenes/app_ten.lua +++ b/parts/scenes/app_ten.lua @@ -269,7 +269,7 @@ function scene.draw() local N=board[i][j] if N>0 then if hide and N>maxNew then - setColor(COLOR.dGrey) + setColor(COLOR.dGray) rectangle("fill",320+j*128-128,40+i*128-128,128,128) setColor(1,1,1,.3) mStr("?",j*128+256,i*128-75) diff --git a/parts/scenes/customGame.lua b/parts/scenes/customGame.lua index d3988082..3d1a100b 100644 --- a/parts/scenes/customGame.lua +++ b/parts/scenes/customGame.lua @@ -144,9 +144,9 @@ end scene.widgetList={ WIDGET.newText{name="title", x=520, y=5,font=70,align="R"}, - WIDGET.newText{name="subTitle", x=530, y=50,font=35,align="L",color="grey"}, - WIDGET.newText{name="defSeq", x=330, y=550,align="L",color="grey",hide=function()return BAG[1]end}, - WIDGET.newText{name="noMsn", x=610, y=550,align="L",color="grey",hide=function()return MISSION[1]end}, + WIDGET.newText{name="subTitle", x=530, y=50,font=35,align="L",color="gray"}, + WIDGET.newText{name="defSeq", x=330, y=550,align="L",color="gray",hide=function()return BAG[1]end}, + WIDGET.newText{name="noMsn", x=610, y=550,align="L",color="gray",hide=function()return MISSION[1]end}, --Basic WIDGET.newSelector{name="drop", x=170, y=150,w=220,color="orange", list={0,.125,.25,.5,1,2,3,4,5,6,7,8,9,10,12,14,16,18,20,25,30,40,60,180,1e99},disp=CUSval("drop"),code=CUSsto("drop")}, @@ -167,7 +167,7 @@ scene.widgetList={ --More WIDGET.newKey{name="advance", x=730, y=190,w=220,h=90,color="red", font=35,code=goScene"custom_advance"}, WIDGET.newKey{name="mod", x=730, y=310,w=220,h=90,color="white", font=35,code=goScene"mod"}, - WIDGET.newKey{name="field", x=170, y=640,w=240,h=80,color="water", font=25,code=goScene"custom_field"}, + WIDGET.newKey{name="field", x=170, y=640,w=240,h=80,color="aqua", font=25,code=goScene"custom_field"}, WIDGET.newKey{name="sequence", x=450, y=640,w=240,h=80,color="pink", font=25,code=goScene"custom_sequence"}, WIDGET.newKey{name="mission", x=730, y=640,w=240,h=80,color="sky", font=25,code=goScene"custom_mission"}, diff --git a/parts/scenes/custom_advance.lua b/parts/scenes/custom_advance.lua index 14df8793..ef9132ab 100644 --- a/parts/scenes/custom_advance.lua +++ b/parts/scenes/custom_advance.lua @@ -11,7 +11,7 @@ local scene={} scene.widgetList={ WIDGET.newText{name="title", x=520,y=5,font=70,align="R"}, - WIDGET.newText{name="subTitle", x=530,y=50,font=35,align="L",color="grey"}, + WIDGET.newText{name="subTitle", x=530,y=50,font=35,align="L",color="gray"}, --Control WIDGET.newSlider{name="nextCount", x=200, y=150, w=200,unit=6,disp=CUSval("nextCount"),code=CUSsto("nextCount")}, diff --git a/parts/scenes/custom_field.lua b/parts/scenes/custom_field.lua index 0edef2b3..14d00f73 100644 --- a/parts/scenes/custom_field.lua +++ b/parts/scenes/custom_field.lua @@ -424,16 +424,16 @@ end local function setPen(i)return function()penType=i end end scene.widgetList={ WIDGET.newText{name="title", x=1020,y=5,font=70,align="R"}, - WIDGET.newText{name="subTitle", x=1030,y=50,font=35,align="L",color="grey"}, + WIDGET.newText{name="subTitle", x=1030,y=50,font=35,align="L",color="gray"}, WIDGET.newButton{name="b1", x=580, y=130,w=75,fText="",color=COLOR.red, code=setPen(1)},--B1 WIDGET.newButton{name="b2", x=660, y=130,w=75,fText="",color=COLOR.fire, code=setPen(2)},--B2 WIDGET.newButton{name="b3", x=740, y=130,w=75,fText="",color=COLOR.orange, code=setPen(3)},--B3 WIDGET.newButton{name="b4", x=820, y=130,w=75,fText="",color=COLOR.yellow, code=setPen(4)},--B4 - WIDGET.newButton{name="b5", x=900, y=130,w=75,fText="",color=COLOR.lame, code=setPen(5)},--B5 + WIDGET.newButton{name="b5", x=900, y=130,w=75,fText="",color=COLOR.lime, code=setPen(5)},--B5 WIDGET.newButton{name="b6", x=980, y=130,w=75,fText="",color=COLOR.grass, code=setPen(6)},--B6 WIDGET.newButton{name="b7", x=1060, y=130,w=75,fText="",color=COLOR.green, code=setPen(7)},--B7 - WIDGET.newButton{name="b8", x=1140, y=130,w=75,fText="",color=COLOR.water, code=setPen(8)},--B8 + WIDGET.newButton{name="b8", x=1140, y=130,w=75,fText="",color=COLOR.aqua, code=setPen(8)},--B8 WIDGET.newButton{name="b9", x=580, y=210,w=75,fText="",color=COLOR.cyan, code=setPen(9)},--B9 WIDGET.newButton{name="b10", x=660, y=210,w=75,fText="",color=COLOR.sky, code=setPen(10)},--B10 @@ -444,17 +444,17 @@ scene.widgetList={ WIDGET.newButton{name="b15", x=1060, y=210,w=75,fText="",color=COLOR.magenta,code=setPen(15)},--B15 WIDGET.newButton{name="b16", x=1140, y=210,w=75,fText="",color=COLOR.pink, code=setPen(16)},--B16 - WIDGET.newButton{name="b17", x=580, y=290,w=75,fText="[ ]",color="dGrey", code=setPen(17)},--BONE + WIDGET.newButton{name="b17", x=580, y=290,w=75,fText="[ ]",color="dGray", code=setPen(17)},--BONE WIDGET.newButton{name="b18", x=660, y=290,w=75,fText="N", color="black", code=setPen(18)},--HIDE WIDGET.newButton{name="b19", x=740, y=290,w=75,fText="B", color="lYellow",code=setPen(19)},--BOMB - WIDGET.newButton{name="b20", x=820, y=290,w=75,fText="_", color="grey", code=setPen(20)},--GB1 - WIDGET.newButton{name="b21", x=900, y=290,w=75,fText="_", color="lGrey", code=setPen(21)},--GB2 + WIDGET.newButton{name="b20", x=820, y=290,w=75,fText="_", color="gray", code=setPen(20)},--GB1 + WIDGET.newButton{name="b21", x=900, y=290,w=75,fText="_", color="lGray", code=setPen(21)},--GB2 WIDGET.newButton{name="b22", x=980, y=290,w=75,fText="_", color="dPurple",code=setPen(22)},--GB3 WIDGET.newButton{name="b23", x=1060, y=290,w=75,fText="_", color="dRed", code=setPen(23)},--GB4 WIDGET.newButton{name="b24", x=1140, y=290,w=75,fText="_", color="dGreen", code=setPen(24)},--GB5 - WIDGET.newButton{name="any", x=600, y=400,w=120,color="lGrey", font=40,code=setPen(0)}, - WIDGET.newButton{name="space", x=730, y=400,w=120,color="grey", font=65,code=setPen(-1)}, + WIDGET.newButton{name="any", x=600, y=400,w=120,color="lGray", font=40,code=setPen(0)}, + WIDGET.newButton{name="space", x=730, y=400,w=120,color="gray", font=65,code=setPen(-1)}, WIDGET.newButton{name="smartPen", x=860, y=400,w=120,color="lGreen", font=30,code=setPen(-2)}, WIDGET.newButton{name="pushLine", x=990, y=400,w=120,h=120,color="lYellow",font=20,code=pressKey"k"}, WIDGET.newButton{name="delLine", x=1120, y=400,w=120,h=120,color="lYellow",font=20,code=pressKey"l"}, diff --git a/parts/scenes/custom_mission.lua b/parts/scenes/custom_mission.lua index b5688b98..78ba8218 100644 --- a/parts/scenes/custom_mission.lua +++ b/parts/scenes/custom_mission.lua @@ -160,7 +160,7 @@ function scene.draw() elseif L[i]>4 then gc.setColor(COLOR.rainbow(i+TIME()*6.26)) else - gc.setColor(COLOR.grey) + gc.setColor(COLOR.gray) end gc.print(missionEnum[L[i]],x,y-25) x=x+56 @@ -185,7 +185,7 @@ end scene.widgetList={ WIDGET.newText{name="title", x=520,y=5,font=70,align="R"}, - WIDGET.newText{name="subTitle", x=530,y=50,font=35,align="L",color="grey"}, + WIDGET.newText{name="subTitle", x=530,y=50,font=35,align="L",color="gray"}, WIDGET.newKey{name="_1", x=800, y=540, w=90, font=50,code=pressKey(01)}, WIDGET.newKey{name="_2", x=900, y=540, w=90, font=50,code=pressKey(02)}, diff --git a/parts/scenes/custom_sequence.lua b/parts/scenes/custom_sequence.lua index 17deb1b6..061711a0 100644 --- a/parts/scenes/custom_sequence.lua +++ b/parts/scenes/custom_sequence.lua @@ -186,7 +186,7 @@ end scene.widgetList={ WIDGET.newText{name="title", x=520,y=5,font=70,align="R"}, - WIDGET.newText{name="subTitle",x=530,y=50,font=35,align="L",color="grey"}, + WIDGET.newText{name="subTitle",x=530,y=50,font=35,align="L",color="gray"}, WIDGET.newSelector{name="sequence", x=1080,y=60,w=200,color="yellow", @@ -208,30 +208,30 @@ scene.widgetList={ WIDGET.newKey{name="backsp",x=920,y=460,w=80,color="lYellow",font=50,code=pressKey"backspace"}, WIDGET.newKey{name="reset", x=1000,y=460,w=80,color="lYellow",font=25,code=pressKey"delete"}, - WIDGET.newKey{name="Z5", x=120,y=540,w=80,color="lGrey",font=50,code=pressKey(8)}, - WIDGET.newKey{name="S5", x=200,y=540,w=80,color="lGrey",font=50,code=pressKey(9)}, - WIDGET.newKey{name="P", x=280,y=540,w=80,color="lGrey",font=50,code=pressKey(10)}, - WIDGET.newKey{name="Q", x=360,y=540,w=80,color="lGrey",font=50,code=pressKey(11)}, - WIDGET.newKey{name="F", x=440,y=540,w=80,color="lGrey",font=50,code=pressKey(12)}, - WIDGET.newKey{name="E", x=520,y=540,w=80,color="lGrey",font=50,code=pressKey(13)}, - WIDGET.newKey{name="T5", x=600,y=540,w=80,color="lGrey",font=50,code=pressKey(14)}, - WIDGET.newKey{name="U", x=680,y=540,w=80,color="lGrey",font=50,code=pressKey(15)}, - WIDGET.newKey{name="V", x=760,y=540,w=80,color="lGrey",font=50,code=pressKey(16)}, - WIDGET.newKey{name="I3", x=840,y=540,w=80,color="grey",font=50,code=pressKey(26)}, - WIDGET.newKey{name="C", x=920,y=540,w=80,color="grey",font=50,code=pressKey(27)}, + WIDGET.newKey{name="Z5", x=120,y=540,w=80,color="lGray",font=50,code=pressKey(8)}, + WIDGET.newKey{name="S5", x=200,y=540,w=80,color="lGray",font=50,code=pressKey(9)}, + WIDGET.newKey{name="P", x=280,y=540,w=80,color="lGray",font=50,code=pressKey(10)}, + WIDGET.newKey{name="Q", x=360,y=540,w=80,color="lGray",font=50,code=pressKey(11)}, + WIDGET.newKey{name="F", x=440,y=540,w=80,color="lGray",font=50,code=pressKey(12)}, + WIDGET.newKey{name="E", x=520,y=540,w=80,color="lGray",font=50,code=pressKey(13)}, + WIDGET.newKey{name="T5", x=600,y=540,w=80,color="lGray",font=50,code=pressKey(14)}, + WIDGET.newKey{name="U", x=680,y=540,w=80,color="lGray",font=50,code=pressKey(15)}, + WIDGET.newKey{name="V", x=760,y=540,w=80,color="lGray",font=50,code=pressKey(16)}, + WIDGET.newKey{name="I3", x=840,y=540,w=80,color="gray",font=50,code=pressKey(26)}, + WIDGET.newKey{name="C", x=920,y=540,w=80,color="gray",font=50,code=pressKey(27)}, WIDGET.newKey{name="rnd", x=1000,y=540,w=80,color="red",font=25,code=pressKey"="}, - WIDGET.newKey{name="W", x=120,y=620,w=80,color="lGrey",font=50,code=pressKey(17)}, - WIDGET.newKey{name="X", x=200,y=620,w=80,color="lGrey",font=50,code=pressKey(18)}, - WIDGET.newKey{name="J5", x=280,y=620,w=80,color="lGrey",font=50,code=pressKey(19)}, - WIDGET.newKey{name="L5", x=360,y=620,w=80,color="lGrey",font=50,code=pressKey(20)}, - WIDGET.newKey{name="R", x=440,y=620,w=80,color="lGrey",font=50,code=pressKey(21)}, - WIDGET.newKey{name="Y", x=520,y=620,w=80,color="lGrey",font=50,code=pressKey(22)}, - WIDGET.newKey{name="N", x=600,y=620,w=80,color="lGrey",font=50,code=pressKey(23)}, - WIDGET.newKey{name="H", x=680,y=620,w=80,color="lGrey",font=50,code=pressKey(24)}, - WIDGET.newKey{name="I5", x=760,y=620,w=80,color="lGrey",font=50,code=pressKey(25)}, - WIDGET.newKey{name="I2", x=840,y=620,w=80,color="dGrey",font=50,code=pressKey(28)}, - WIDGET.newKey{name="O1", x=920,y=620,w=80,color="dGrey",font=50,code=pressKey(29)}, + WIDGET.newKey{name="W", x=120,y=620,w=80,color="lGray",font=50,code=pressKey(17)}, + WIDGET.newKey{name="X", x=200,y=620,w=80,color="lGray",font=50,code=pressKey(18)}, + WIDGET.newKey{name="J5", x=280,y=620,w=80,color="lGray",font=50,code=pressKey(19)}, + WIDGET.newKey{name="L5", x=360,y=620,w=80,color="lGray",font=50,code=pressKey(20)}, + WIDGET.newKey{name="R", x=440,y=620,w=80,color="lGray",font=50,code=pressKey(21)}, + WIDGET.newKey{name="Y", x=520,y=620,w=80,color="lGray",font=50,code=pressKey(22)}, + WIDGET.newKey{name="N", x=600,y=620,w=80,color="lGray",font=50,code=pressKey(23)}, + WIDGET.newKey{name="H", x=680,y=620,w=80,color="lGray",font=50,code=pressKey(24)}, + WIDGET.newKey{name="I5", x=760,y=620,w=80,color="lGray",font=50,code=pressKey(25)}, + WIDGET.newKey{name="I2", x=840,y=620,w=80,color="dGray",font=50,code=pressKey(28)}, + WIDGET.newKey{name="O1", x=920,y=620,w=80,color="dGray",font=50,code=pressKey(29)}, WIDGET.newButton{name="copy", x=1140, y=460,w=170,h=80,color="lRed", font=40,code=pressKey"cC",hide=function()return #BAG==0 end}, diff --git a/parts/scenes/depause.lua b/parts/scenes/depause.lua index 8856a178..f8ef896b 100644 --- a/parts/scenes/depause.lua +++ b/parts/scenes/depause.lua @@ -14,17 +14,17 @@ function scene.update(dt) timer=timer-dt*.8 if timer<0 then SFX.play("click") - SCN.swapTo("play","none") + SCN.swapTo("game","none") end end function scene.draw() --Game scene if timer*1.26<1 then - SCN.scenes.play.draw() + SCN.scenes.game.draw() end - --Grey screen cover + --Gray screen cover gc.setColor(.15,.15,.15,timer*1.26) gc.push("transform") gc.origin() diff --git a/parts/scenes/dict.lua b/parts/scenes/dict.lua index 5f394ad6..b0141b37 100644 --- a/parts/scenes/dict.lua +++ b/parts/scenes/dict.lua @@ -3,7 +3,7 @@ local gc=love.graphics local inputBox=WIDGET.newInputBox{name="input",x=20,y=110,w=726,h=60,font=40} local int,abs=math.floor,math.abs local min,sin=math.min,math.sin -local ins,rem=table.insert,table.remove +local ins=table.insert local find=string.find local scene={} @@ -19,22 +19,17 @@ local scrollPos--Scroll down length local lastSearch--Last searched string -function scene.sceneInit() - dict=require("parts.language.dict_"..({"zh","zh","zh","en","en","en","en","en"})[SETTING.lang]) - - inputBox:clear() - result={} - url=dict[1][5] - - waiting=0 - selected=1 - scrollPos=0 - - lastSearch=false - TASK.new(function()YIELD()WIDGET.sel=inputBox end) - BG.set("rainbow") -end - +local typeColor={ + help=COLOR.Y, + other=COLOR.lOrange, + game=COLOR.lC, + term=COLOR.lR, + setup=COLOR.lY, + pattern=COLOR.lGrass, + english=COLOR.B, + name=COLOR.lPurple, +} +local function getList()return result[1]and result or dict end local function clearResult() TABLE.clear(result) selected,scrollPos=1,0 @@ -56,10 +51,26 @@ local function search() if #result>0 then SFX.play("reach") end - url=(result[1]and result or dict)[selected][5] + url=getList()[selected][5] lastSearch=input end +function scene.sceneInit() + dict=require("parts.language.dict_"..({"zh","zh","zh","en","en","en","en","en"})[SETTING.lang]) + + inputBox:clear() + result={} + url=dict[1][5] + + waiting=0 + selected=1 + scrollPos=0 + + lastSearch=false + TASK.new(function()YIELD()WIDGET.sel=inputBox end) + BG.set("rainbow") +end + function scene.wheelMoved(_,y) WHEELMOV(y) end @@ -72,15 +83,15 @@ function scene.keyDown(key) end end elseif key=="down"then - if selected and selected<#(result[1]and result or dict)then + if selected and selected<#getList()then selected=selected+1 if selected>scrollPos+15 then scrollPos=selected-15 end end - elseif key=="pageup"then + elseif key=="left"or key=="pageup"then for _=1,12 do scene.keyDown("up")end - elseif key=="pagedown"then + elseif key=="right"or key=="pagedown"then for _=1,12 do scene.keyDown("down")end elseif key=="link"then love.system.openURL(url) @@ -99,7 +110,7 @@ function scene.keyDown(key) SCN.back() end end - url=(result[1]and result or dict)[selected][5] + url=getList()[selected][5] end function scene.update(dt) @@ -122,18 +133,8 @@ function scene.update(dt) end end -local typeColor={ - help=COLOR.yellow, - other=COLOR.lOrange, - game=COLOR.lCyan, - term=COLOR.lRed, - setup=COLOR.lYellow, - pattern=COLOR.lGrass, - english=COLOR.blue, - name=COLOR.lPurple, -} function scene.draw() - local list=result[1]and result or dict + local list=getList() gc.setColor(1,1,1) local t=list[selected][4] if #t>900 then @@ -181,9 +182,11 @@ end scene.widgetList={ WIDGET.newText{name="title", x=20, y=5,font=70,align="L"}, inputBox, - WIDGET.newKey{name="link", x=1140, y=650,w=200,h=80,font=35,code=pressKey"link",hide=function()return not url end}, - WIDGET.newKey{name="up", x=1190, y=440,w=100,h=100,font=35,code=pressKey"up",hide=not MOBILE}, - WIDGET.newKey{name="down", x=1190, y=550,w=100,h=100,font=35,code=pressKey"down",hide=not MOBILE}, + WIDGET.newKey{name="link", x=1150, y=655,w=200,h=80,font=35,code=pressKey"link",hide=function()return not url end}, + WIDGET.newKey{name="up", x=1130, y=460,w=60,h=90,font=35,code=pressKey"up",hide=not MOBILE}, + WIDGET.newKey{name="down", x=1130, y=560,w=60,h=90,font=35,code=pressKey"down",hide=not MOBILE}, + WIDGET.newKey{name="pageup", x=1210, y=460,w=80,h=90,font=35,code=pressKey"pageup",hide=not MOBILE}, + WIDGET.newKey{name="pagedown", x=1210, y=560,w=80,h=90,font=35,code=pressKey"pagedown",hide=not MOBILE}, WIDGET.newButton{name="back", x=1165, y=60,w=170,h=80,font=40,code=backScene}, } diff --git a/parts/scenes/error.lua b/parts/scenes/error.lua index 1c8dc774..94ef389d 100644 --- a/parts/scenes/error.lua +++ b/parts/scenes/error.lua @@ -12,6 +12,10 @@ function scene.sceneInit() stateInfo=SYSTEM.."-"..VERSION.string.." scene:"..ERRDATA[#ERRDATA].scene errorText=LOADED and text.errorMsg or"An error has occurred during loading.\nError info has been created, and you can send it to the author." errorShot,errorInfo=ERRDATA[#ERRDATA].shot,ERRDATA[#ERRDATA].mes + NET.wsclose_app() + NET.wsclose_user() + NET.wsclose_play() + NET.wsclose_stream() if SETTING then SFX.fplay("error",SETTING.voc*.8 or 0)end end diff --git a/parts/scenes/play.lua b/parts/scenes/game.lua similarity index 95% rename from parts/scenes/play.lua rename to parts/scenes/game.lua index 8fc6d4fa..74c25cae 100644 --- a/parts/scenes/play.lua +++ b/parts/scenes/game.lua @@ -27,7 +27,7 @@ end scene.mouseDown=NULL local function restart() - resetGameData(GAME.frame<240 and"q") + resetGameData(PLAYERS[1].frameRun<240 and"q") noKey=GAME.replaying noTouch=noKey end @@ -133,7 +133,7 @@ function scene.update(dt) _=GAME.replaying local P1=PLAYERS[1] local L=GAME.rep - while GAME.frame==L[_]do + while P1.frameRun==L[_]do local key=L[_+1] if key==0 then--Just wait elseif key<=32 then--Press key @@ -150,10 +150,6 @@ function scene.update(dt) touchMoveLastFrame=false updateVirtualkey() - GAME.frame=GAME.frame+1 - - --Counting, include pre-das - if checkStart()then return end --Update players for p=1,#PLAYERS do PLAYERS[p]:update(dt)end @@ -162,7 +158,7 @@ function scene.update(dt) checkWarning() --Fresh royale target - if GAME.modeEnv.royaleMode and GAME.frame%120==0 then + if GAME.modeEnv.royaleMode and PLAYERS[1].frameRun%120==0 then freshMostDangerous() end end diff --git a/parts/scenes/load.lua b/parts/scenes/load.lua index 67357aaa..5b9372e2 100644 --- a/parts/scenes/load.lua +++ b/parts/scenes/load.lua @@ -75,50 +75,57 @@ local loadingThread=coroutine.wrap(function() upFloor() local modeIcons={} modeIcons.marathon=DOGC{32,32, - {"move",3,1}, - {"rect","fill",10,4,-2,23}, - {"poly","fill",10,4,24,10,10,16.5}, - {"rect","fill",4,24,10,3}, - }YIELD() - modeIcons.tsd=DOGC{64,64, - {"rect","fill",7,7,16,16}, - {"rect","fill",7,41,16,16}, - {"rect","fill",41,41,16,16}, - {"move",.5,.5}, - {"poly","line",7,24,56,24,56,39,39,39,39,56,24,56,24,39,7,39}, + {"trans",3,1}, + {"fRect",10,4,-2,23}, + {"fPoly",10,4,24,10,10,16.5}, + {"fRect",4,24,10,3}, }YIELD() modeIcons.infinite=DOGC{64,64, - {"wid",4}, - {"circ","line",32,32,28}, - {"line",32,32,32,14}, - {"line",32,32,41,41}, - {"move",.5,.5}, - {"rect","fill",30,7,4,4}, - {"rect","fill",7,30,4,4}, - {"rect","fill",52,30,4,4}, - {"rect","fill",30,52,4,4}, + {"setLW",4}, + {"dCirc",32,32,28}, + {"dLine",32,32,32,14}, + {"dLine",32,32,41,41}, + {"trans",.5,.5}, + {"fRect",30,7,4,4}, + {"fRect",7,30,4,4}, + {"fRect",52,30,4,4}, + {"fRect",30,52,4,4}, + }YIELD() + modeIcons.classic=DOGC{64,64, + {"setLW",6}, + {"dRect",10,24,12,12}, + {"dRect",26,24,12,12}, + {"dRect",42,24,12,12}, + {"dRect",26,40,12,12}, + }YIELD() + modeIcons.tsd=DOGC{64,64, + {"fRect",7,7,16,16}, + {"fRect",7,41,16,16}, + {"fRect",41,41,16,16}, + {"trans",.5,.5}, + {"fPoly",7,24,56,24,56,39,39,39,39,56,24,56,24,39,7,39}, }YIELD() modeIcons.t49=DOGC{64,64, - {"wid",2}, - {"rect","line",05,05,10,20},{"rect","line",49,05,10,20}, - {"rect","line",05,39,10,20},{"rect","line",49,39,10,20}, - {"rect","line",20,10,23,43}, - {"rgb",1,1,1,.7}, - {"rect","fill",20,10,23,43}, + {"setLW",2}, + {"dRect",05,05,10,20},{"dRect",49,05,10,20}, + {"dRect",05,39,10,20},{"dRect",49,39,10,20}, + {"dRect",20,10,23,43}, + {"setCL",1,1,1,.7}, + {"fRect",20,10,23,43}, }YIELD() modeIcons.t99=DOGC{64,64, - {"wid",2}, - {"rect","line",02,02,6,12},{"rect","line",11,02,6,12}, - {"rect","line",02,18,6,12},{"rect","line",11,18,6,12}, - {"rect","line",02,34,6,12},{"rect","line",11,34,6,12}, - {"rect","line",02,50,6,12},{"rect","line",11,50,6,12}, - {"rect","line",47,02,6,12},{"rect","line",56,02,6,12}, - {"rect","line",47,18,6,12},{"rect","line",56,18,6,12}, - {"rect","line",47,34,6,12},{"rect","line",56,34,6,12}, - {"rect","line",47,50,6,12},{"rect","line",56,50,6,12}, - {"rect","line",20,10,23,43}, - {"rgb",1,1,1,.7}, - {"rect","fill",20,10,23,43}, + {"setLW",2}, + {"dRect",02,02,6,12},{"dRect",11,02,6,12}, + {"dRect",02,18,6,12},{"dRect",11,18,6,12}, + {"dRect",02,34,6,12},{"dRect",11,34,6,12}, + {"dRect",02,50,6,12},{"dRect",11,50,6,12}, + {"dRect",47,02,6,12},{"dRect",56,02,6,12}, + {"dRect",47,18,6,12},{"dRect",56,18,6,12}, + {"dRect",47,34,6,12},{"dRect",56,34,6,12}, + {"dRect",47,50,6,12},{"dRect",56,50,6,12}, + {"dRect",20,10,23,43}, + {"setCL",1,1,1,.7}, + {"fRect",20,10,23,43}, }YIELD() upFloor() @@ -356,7 +363,7 @@ function scene.draw() setFont(25) for i=0,26 do local x,y=light[3*i+1],light[3*i+2] - gc.setColor(COLOR[i==progress and"grey"or light[3*i+3]and"dOrange"or"dGrey"]) + gc.setColor(COLOR[i==progress and"gray"or light[3*i+3]and"dOrange"or"dGray"]) gc.circle("fill",x,y,23) gc.setColor(.16,.16,.16) gc.circle("line",x,y,23) diff --git a/parts/scenes/main.lua b/parts/scenes/main.lua index a0fec1f7..4a223d0d 100644 --- a/parts/scenes/main.lua +++ b/parts/scenes/main.lua @@ -37,7 +37,6 @@ function scene.sceneInit() --Create demo player destroyPlayers() GAME.modeEnv=NONE - GAME.frame=0 GAME.seed=math.random(2e6) PLY.newDemoPlayer(1) PLAYERS[1]:setPosition(520,140,.8) @@ -71,18 +70,21 @@ function scene.keyDown(key) end elseif key=="a"then if testButton(3)then - if WS.status("user")=="running"then - if not NET.connected then - TEXT.show(text.noInternet,640,450,60,"flicker") - SFX.play("finesseError") - elseif not NET.allow_online then + if NET.connected then + if NET.allow_online then + if WS.status("user")=="running"then + NET.getAccessToken() + else + SCN.go("login") + end + else TEXT.show(text.needUpdate,640,450,60,"flicker") SFX.play("finesseError") - else - NET.getAccessToken() end else - SCN.go("login") + TEXT.show(text.noInternet,640,450,60,"flicker") + NET.wsconn_app() + SFX.play("finesseError") end end elseif key=="z"then @@ -127,7 +129,6 @@ function scene.keyDown(key) end function scene.update(dt) - GAME.frame=GAME.frame+1 PLAYERS[1]:update(dt) scrollX=scrollX-2.6 if scrollX<-tip:getWidth()then @@ -176,7 +177,7 @@ scene.widgetList={ WIDGET.newButton{name="custom", x=-1200,y=570,w=800,h=100, color="lSea", font=45,align="R",edge=30, code=pressKey"z"}, WIDGET.newButton{name="setting",x=2480,y=210,w=800,h=100, color="lOrange",font=40,align="L",edge=30, code=pressKey"-"}, - WIDGET.newButton{name="stat", x=2480,y=330,w=800,h=100, color="lLame", font=40,align="L",edge=30, code=pressKey"p"}, + WIDGET.newButton{name="stat", x=2480,y=330,w=800,h=100, color="lLime", font=40,align="L",edge=30, code=pressKey"p"}, WIDGET.newButton{name="dict", x=2480,y=450,w=800,h=100, color="lGreen", font=40,align="L",edge=30, code=pressKey"l"}, WIDGET.newButton{name="manual", x=2480,y=570,w=800,h=100, color="lC", font=40,align="L",edge=30, code=pressKey","}, diff --git a/parts/scenes/mode.lua b/parts/scenes/mode.lua index 0a3c6e4e..fba3c30f 100644 --- a/parts/scenes/mode.lua +++ b/parts/scenes/mode.lua @@ -173,7 +173,7 @@ function scene.update() end local _=SCN.stat.tar - mapCam.zoomMethod=_=="play"and 1 or _=="mode"and 2 + mapCam.zoomMethod=_=="game"and 1 or _=="mode"and 2 if mapCam.zoomMethod==1 then _=mapCam.zoomK if _<.8 then _=_*1.05 end diff --git a/parts/scenes/net_game.lua b/parts/scenes/net_game.lua index d84a45cc..744dcc57 100644 --- a/parts/scenes/net_game.lua +++ b/parts/scenes/net_game.lua @@ -199,15 +199,11 @@ function scene.update(dt) if NET.checkPlayDisconn()then SCN.back()end if not playing then return end - local _ + local P1=PLAYERS[1] local GAME=GAME touchMoveLastFrame=false updateVirtualkey() - GAME.frame=GAME.frame+1 - - --Counting, include pre-das - if checkStart()then return end --Update players for p=1,#PLAYERS do PLAYERS[p]:update(dt)end @@ -216,16 +212,16 @@ function scene.update(dt) checkWarning() --Upload stream - if GAME.frame-lastUpstreamTime>8 then + if P1.frameRun-lastUpstreamTime>8 then local stream stream,upstreamProgress=dumpRecording(GAME.rep,upstreamProgress) if #stream>0 then NET.uploadRecStream(stream) else - ins(GAME.rep,GAME.frame) + ins(GAME.rep,P1.frameRun) ins(GAME.rep,0) end - lastUpstreamTime=PLAYERS[1].alive and GAME.frame or 1e99 + lastUpstreamTime=PLAYERS[1].alive and P1.frameRun or 1e99 end end @@ -271,19 +267,21 @@ function scene.draw() end scene.widgetList={ textBox, - WIDGET.newKey{name="ready",x=900,y=560,w=400,h=100,color="lB",font=40,code=pressKey"space",hide=function() - return - playing or - not textBox.hide or - PLY_NET[1].ready or - NET.getlock("ready") + WIDGET.newKey{name="ready",x=900,y=560,w=400,h=100,color="lB",font=40,code=pressKey"space", + hide=function() + return + playing or + not textBox.hide or + PLY_NET[1].ready or + NET.getlock("ready") end}, - WIDGET.newKey{name="cancel",x=900,y=560,w=400,h=100,color="grey",font=40,code=pressKey"space",hide=function() - return - playing or - not textBox.hide or - not PLY_NET[1].ready or - NET.getlock("ready") + WIDGET.newKey{name="cancel",x=900,y=560,w=400,h=100,color="gray",font=40,code=pressKey"space", + hide=function() + return + playing or + not textBox.hide or + not PLY_NET[1].ready or + NET.getlock("ready") end}, WIDGET.newKey{name="hideChat",fText="...",x=380,y=35,w=60,font=35,code=pressKey"\\"}, WIDGET.newKey{name="quit",fText="X",x=900,y=35,w=60,font=40,code=pressKey"escape"}, diff --git a/parts/scenes/net_menu.lua b/parts/scenes/net_menu.lua index 846ce2ad..5cb229d9 100644 --- a/parts/scenes/net_menu.lua +++ b/parts/scenes/net_menu.lua @@ -4,32 +4,32 @@ local scene={} function scene.sceneInit() lastLogoutTime=-1e99 - BG.set("space") + BG.set() end function scene.sceneBack() NET.wsclose_play() end scene.widgetList={ - WIDGET.newButton{name="ffa", x=640, y=200,w=350,h=120,color="black",font=40,code=NULL}, - WIDGET.newButton{name="rooms", x=640, y=360,w=350,h=120, font=40,code=goScene"net_rooms"}, + WIDGET.newButton{name="ffa", x=640, y=200,w=350,h=120,font=40,code=function()NET.enterRoom("ffa")end}, + WIDGET.newButton{name="rooms", x=640, y=360,w=350,h=120,font=40,code=goScene"net_rooms"}, WIDGET.newButton{name="chat", x=640, y=540,w=350,h=120,color="black",font=40,code=NULL}, - WIDGET.newButton{name="logout", x=1140, y=70,w=180,h=70,color="dR",code=function() - if TIME()-lastLogoutTime<1 then - if USER.uid then - NET.wsclose_play() - NET.wsclose_user() - USER.username=false - USER.uid=false - USER.authToken=false - FILE.save(USER,"conf/user","q") - SCN.back() + WIDGET.newButton{name="logout", x=1140, y=70,w=180,h=70,color="dR", + code=function() + if TIME()-lastLogoutTime<1 then + if USER.uid then + NET.wsclose_play() + NET.wsclose_user() + USER.uid=false + USER.authToken=false + FILE.save(USER,"conf/user","q") + SCN.back() + end + else + LOG.print(text.sureQuit,COLOR.orange) + lastLogoutTime=TIME() end - else - LOG.print(text.sureQuit,COLOR.orange) - lastLogoutTime=TIME() - end - end}, + end}, WIDGET.newButton{name="back", x=1140, y=640,w=170,h=80, font=40,code=backScene}, } diff --git a/parts/scenes/net_rooms.lua b/parts/scenes/net_rooms.lua index 0f38b9bf..dcaf454a 100644 --- a/parts/scenes/net_rooms.lua +++ b/parts/scenes/net_rooms.lua @@ -14,7 +14,7 @@ end local scene={} function scene.sceneInit() - BG.set("space") + BG.set() scrollPos=0 selected=1 fetchRoom() @@ -28,17 +28,16 @@ function scene.keyDown(k) if fetchTimer<=3.26 then fetchRoom() end - elseif k=="n"then - if TIME()-lastCreateRoomTime>16.2 then + elseif k=="m"or k=="n"then + if TIME()-lastCreateRoomTime>6.26 then NET.createRoom( - kb.isDown("1")and"solo"or - kb.isDown("2")and"classic"or + k=="m"and"classic"or tonumber(USER.uid)<100 and( - kb.isDown("3")and"r49"or - kb.isDown("4")and"r99"or - kb.isDown("5")and"unlimited" + kb.isDown("q")and"r49"or + kb.isDown("w")and"r99"or + kb.isDown("e")and"unlimited" )or"solo", - (USER.username or"???").."'s room" + (USERS.getUsername(USER.uid)or"???").."'s room" ) lastCreateRoomTime=TIME() else @@ -87,7 +86,7 @@ end function scene.draw() --Fetching timer gc.setColor(1,1,1,.26) - gc.arc("fill","pie",240,620,60,-1.5708,-1.5708-1.2566*fetchTimer) + gc.arc("fill","pie",130,620,60,-1.5708,-1.5708-1.2566*fetchTimer) --Room list gc.setColor(1,1,1) @@ -105,7 +104,7 @@ function scene.draw() end if R.start then gc.setColor(0,1,0) - gc.print("S",800,66+40*i) + gc.print(text.started,800,66+40*i) end gc.setColor(.9,.9,1) gc.print(scrollPos+i,95,66+40*i) @@ -122,11 +121,12 @@ local function hide_noRoom()return #NET.roomList==0 end scene.widgetList={ WIDGET.newText{name="refreshing",x=640,y=255,font=45,hide=function()return not NET.getlock("fetchRoom")end}, WIDGET.newText{name="noRoom", x=640,y=260,font=40,hide=function()return #NET.roomList>0 or NET.getlock("fetchRoom")end}, - WIDGET.newKey{name="refresh", x=240,y=620,w=140,h=140,font=35,code=fetchRoom, hide=function()return fetchTimer>3.26 end}, - WIDGET.newKey{name="new", x=440,y=620,w=140,h=140,font=25,code=pressKey"n"}, - WIDGET.newKey{name="join", x=640,y=620,w=140,h=140,font=40,code=pressKey"return", hide=hide_noRoom}, - WIDGET.newKey{name="up", x=840,y=585,w=140,h=70,font=40,code=pressKey"up", hide=hide_noRoom}, - WIDGET.newKey{name="down", x=840,y=655,w=140,h=70,font=40,code=pressKey"down", hide=hide_noRoom}, + WIDGET.newKey{name="refresh", x=130,y=620,w=140,h=140,font=35,code=fetchRoom, hide=function()return fetchTimer>3.26 end}, + WIDGET.newKey{name="new", x=330,y=620,w=140,h=140,font=20,code=pressKey"n"}, + WIDGET.newKey{name="new2", x=530,y=620,w=140,h=140,font=20,code=pressKey"m"}, + WIDGET.newKey{name="join", x=730,y=620,w=140,h=140,font=40,code=pressKey"return", hide=hide_noRoom}, + WIDGET.newKey{name="up", x=930,y=585,w=140,h=70,font=40,code=pressKey"up", hide=hide_noRoom}, + WIDGET.newKey{name="down", x=930,y=655,w=140,h=70,font=40,code=pressKey"down", hide=hide_noRoom}, WIDGET.newButton{name="back", x=1140,y=640,w=170,h=80,font=40,code=backScene}, } diff --git a/parts/scenes/pause.lua b/parts/scenes/pause.lua index be7bb890..ccc88685 100644 --- a/parts/scenes/pause.lua +++ b/parts/scenes/pause.lua @@ -6,7 +6,7 @@ local SCR,setFont,mStr=SCR,setFont,mStr local fnsRankColor={ Z=COLOR.lYellow, - S=COLOR.lGrey, + S=COLOR.lGray, A=COLOR.sky, B=COLOR.lGreen, C=COLOR.magenta, @@ -34,11 +34,11 @@ function scene.sceneInit(org) local P=PLAYERS[1] local S=P.stat - timer=org=="play"and 0 or 50 + timer=org=="game"and 0 or 50 local frameLostRate=(S.frame/S.time/60-1)*100 form={ - {COLOR.white,TIMESTR(S.time),COLOR[frameLostRate>10 and"red"or frameLostRate>3 and"yellow"or"grey"],format(" (%.2f%%)",frameLostRate)}, + {COLOR.white,TIMESTR(S.time),COLOR[frameLostRate>10 and"red"or frameLostRate>3 and"yellow"or"gray"],format(" (%.2f%%)",frameLostRate)}, format("%d/%d/%d",S.key,S.rotate,S.hold), format("%d %.2fPPS",S.piece,S.piece/S.time), format("%d(%d) %.2fLPM",S.row,S.dig,S.row/S.time*60), @@ -113,14 +113,14 @@ function scene.sceneInit(org) else rank,trophy=nil end - if org~="play"and GAME.prevBG then + if org~="game"and GAME.prevBG then BG.set(GAME.prevBG) end end function scene.sceneBack() love.keyboard.setKeyRepeat(true) STAT.todayTime=STAT.todayTime+PLAYERS[1].stat.time - if not GAME.replaying and(GAME.frame>400 or GAME.result)and not GAME.result then + if not GAME.replaying and(PLAYERS[1].frameRun>400 or GAME.result)and not GAME.result then mergeStat(STAT,PLAYERS[1].stat) FILE.save(STAT,"conf/data") end @@ -130,17 +130,17 @@ function scene.keyDown(key) if key=="q"then SCN.back() elseif key=="escape"then - SCN.swapTo(GAME.result and"play"or"depause","none") + SCN.swapTo(GAME.result and"game"or"depause","none") elseif key=="s"then GAME.prevBG=BG.cur SCN.go("setting_sound") elseif key=="r"then resetGameData() - SCN.swapTo("play","none") + SCN.swapTo("game","none") elseif key=="p"then if(GAME.result or GAME.replaying)and #PLAYERS==1 then resetGameData("r") - SCN.swapTo("play","none") + SCN.swapTo("game","none") end elseif key=="o"then if(GAME.result or GAME.replaying)and #PLAYERS==1 and not GAME.saved and saveRecording()then @@ -166,7 +166,7 @@ local textPos={90,131,-90,131,-200,-25,-90,-181,90,-181,200,-25} local dataPos={90,143,-90,143,-200,-13,-90,-169,90,-169,200,-13} function scene.draw() local T=timer*.02 - if T<1 or GAME.result then SCN.scenes.play.draw()end + if T<1 or GAME.result then SCN.scenes.game.draw()end --Dark BG local _=T @@ -194,7 +194,7 @@ function scene.draw() gc.draw(drawableText.modeName,40,240) --Infos - if GAME.frame>180 then + if PLAYERS[1].frameRun>180 then gc.setLineWidth(2) --Finesse rank & trophy if rank then @@ -264,7 +264,7 @@ function scene.draw() end --Radar Chart - if T>.5 and GAME.frame>180 then + if T>.5 and PLAYERS[1].frameRun>180 then T=T*2-1 gc.setLineWidth(2) gc.push("transform") diff --git a/parts/scenes/savedata.lua b/parts/scenes/savedata.lua index 5daeca7f..ace832b8 100644 --- a/parts/scenes/savedata.lua +++ b/parts/scenes/savedata.lua @@ -34,53 +34,57 @@ scene.widgetList={ WIDGET.newButton{name="exportSetting", x=790,y=150,w=280,h=100,color="lGreen",font=25,code=function()dumpCB(SETTING)end}, WIDGET.newButton{name="exportVK", x=1090,y=150,w=280,h=100,color="lGreen",font=25,code=function()dumpCB(VK_org)end}, - WIDGET.newButton{name="importUnlock", x=190,y=300,w=280,h=100,color="lBlue",font=25,code=function() - local D=parseCB() - if D then - TABLE.update(D,RANKS) - FILE.save(RANKS,"conf/unlock") - LOG.print(text.importSuccess,"message") - else - LOG.print(text.dataCorrupted,"warn") - end - end}, - WIDGET.newButton{name="importData", x=490,y=300,w=280,h=100,color="lBlue",font=25,code=function() - local D=parseCB() - if D and D.version==STAT.version then - TABLE.update(D,STAT) - FILE.save(STAT,"conf/data") - LOG.print(text.importSuccess,"message") - else - LOG.print(text.dataCorrupted,"warn") - end - end}, - WIDGET.newButton{name="importSetting", x=790,y=300,w=280,h=100,color="lBlue",font=25,code=function() - local D=parseCB() - if D then - TABLE.update(D,SETTING) - FILE.save(SETTING,"conf/settings") - LOG.print(text.importSuccess,"message") - else - LOG.print(text.dataCorrupted,"warn") - end - end}, - WIDGET.newButton{name="importVK", x=1090,y=300,w=280,h=100,color="lBlue",font=25,code=function() - local D=parseCB() - if D then - TABLE.update(D,VK_org) - FILE.save(VK_org,"conf/virtualkey") - LOG.print(text.importSuccess,"message") - else - LOG.print(text.dataCorrupted,"warn") - end - end}, - - WIDGET.newButton{name="reset", x=640,y=460,w=280,h=100,color="lRed",font=40,code=function() - scene.widgetList.reset.hide=true - scene.widgetList.resetUnlock.hide=false - scene.widgetList.resetRecord.hide=false - scene.widgetList.resetData.hide=false - end}, + WIDGET.newButton{name="importUnlock", x=190,y=300,w=280,h=100,color="lBlue",font=25, + code=function() + local D=parseCB() + if D then + TABLE.update(D,RANKS) + FILE.save(RANKS,"conf/unlock") + LOG.print(text.importSuccess,"message") + else + LOG.print(text.dataCorrupted,"warn") + end + end}, + WIDGET.newButton{name="importData", x=490,y=300,w=280,h=100,color="lBlue",font=25, + code=function() + local D=parseCB() + if D and D.version==STAT.version then + TABLE.update(D,STAT) + FILE.save(STAT,"conf/data") + LOG.print(text.importSuccess,"message") + else + LOG.print(text.dataCorrupted,"warn") + end + end}, + WIDGET.newButton{name="importSetting", x=790,y=300,w=280,h=100,color="lBlue",font=25, + code=function() + local D=parseCB() + if D then + TABLE.update(D,SETTING) + FILE.save(SETTING,"conf/settings") + LOG.print(text.importSuccess,"message") + else + LOG.print(text.dataCorrupted,"warn") + end + end}, + WIDGET.newButton{name="importVK", x=1090,y=300,w=280,h=100,color="lBlue",font=25, + code=function() + local D=parseCB() + if D then + TABLE.update(D,VK_org) + FILE.save(VK_org,"conf/virtualkey") + LOG.print(text.importSuccess,"message") + else + LOG.print(text.dataCorrupted,"warn") + end + end}, + WIDGET.newButton{name="reset", x=640,y=460,w=280,h=100,color="lRed",font=40, + code=function() + scene.widgetList.reset.hide=true + scene.widgetList.resetUnlock.hide=false + scene.widgetList.resetRecord.hide=false + scene.widgetList.resetData.hide=false + end}, WIDGET.newButton{name="resetUnlock", x=340,y=460,w=280,h=100,color="red", code=function() love.filesystem.remove("conf/unlock") @@ -106,7 +110,6 @@ scene.widgetList={ LOG.print("effected after restart game","message") LOG.print("play one game to get data back","message") end,hide=true}, - WIDGET.newButton{name="back", x=640,y=620,w=200,h=80,font=40,code=backScene}, } diff --git a/parts/scenes/setting_game.lua b/parts/scenes/setting_game.lua index 2c0347af..7a7f0eef 100644 --- a/parts/scenes/setting_game.lua +++ b/parts/scenes/setting_game.lua @@ -34,15 +34,16 @@ scene.widgetList={ WIDGET.newSwitch{name="swap", x=1060, y=370, font=20,disp=SETval("swap"), code=SETrev("swap")}, WIDGET.newSwitch{name="fine", x=1060, y=430, font=20,disp=SETval("fine"), code=function()SETTING.fine=not SETTING.fine if SETTING.fine then SFX.play("finesseError",.6) end end}, WIDGET.newSwitch{name="appLock", x=1060, y=490, font=20,disp=SETval("appLock"), code=SETrev("appLock")}, - WIDGET.newSwitch{name="simpMode", x=1060, y=550, font=25,disp=SETval("simpMode"),code=function() - SETTING.simpMode=not SETTING.simpMode - for i=1,#SCN.stack,2 do - if SCN.stack[i]=="main"or SCN.stack[i]=="main_simple"then - SCN.stack[i]=SETTING.simpMode and"main_simple"or"main" - break + WIDGET.newSwitch{name="simpMode", x=1060, y=550, font=25,disp=SETval("simpMode"), + code=function() + SETTING.simpMode=not SETTING.simpMode + for i=1,#SCN.stack,2 do + if SCN.stack[i]=="main"or SCN.stack[i]=="main_simple"then + SCN.stack[i]=SETTING.simpMode and"main_simple"or"main" + break + end end - end - end}, + end}, WIDGET.newButton{name="back", x=1140, y=640, w=170,h=80, font=40,code=backScene}, } diff --git a/parts/scenes/test.lua b/parts/scenes/test.lua index c856b7d5..3a520bdd 100644 --- a/parts/scenes/test.lua +++ b/parts/scenes/test.lua @@ -24,13 +24,13 @@ function scene.gamepadDown(key) push("[gamepadDown] <"..key..">") end function scene.gamepadUp(key) - push{COLOR.grey,"[gamepadUp] <"..key..">"} + push{COLOR.gray,"[gamepadUp] <"..key..">"} end function scene.keyDown(key) push("[keyDown] <"..key..">") end function scene.keyUp(key) - push{COLOR.grey,"[keyUp] <"..key..">"} + push{COLOR.gray,"[keyUp] <"..key..">"} end function scene.mouseDown(x,y,k) push(("[mouseDown] <%d: %d, %d>"):format(k,x,y)) @@ -40,7 +40,7 @@ function scene.mouseMove(x,y) end function scene.mouseUp(x,y,k) SYSFX.newRectRipple(1,x-10,y-10,21,21) - push{COLOR.grey,"[mouseUp] <"..k..">"} + push{COLOR.gray,"[mouseUp] <"..k..">"} end function scene.touchClick(x,y) SYSFX.newRipple(.5,x,y,50) @@ -55,7 +55,7 @@ function scene.touchMove(x,y) end function scene.touchUp(x,y) SYSFX.newRipple(.5,x,y,50) - push{COLOR.grey,"[touchUp]"} + push{COLOR.gray,"[touchUp]"} end function scene.wheelMoved(dx,dy) push(("[wheelMoved] <%d, %d>"):format(dx,dy)) diff --git a/parts/texture.lua b/parts/texture.lua index f8631006..ac70d6a5 100644 --- a/parts/texture.lua +++ b/parts/texture.lua @@ -34,7 +34,6 @@ end --Texture of puzzle mode TEXTURE.puzzleMark={} -gc.setLineWidth(3) for i=1,17 do TEXTURE.puzzleMark[i]=NSC(30,30) local _=minoColor[i] @@ -47,15 +46,14 @@ for i=18,24 do gc.setColor(minoColor[i]) gc.rectangle("line",7,7,16,16) end -local _=NSC(30,30) -gc.setColor(1,1,1) -gc.line(5,5,25,25) -gc.line(5,25,25,5) -TEXTURE.puzzleMark[-1]=NSC(30,30) -gc.setColor(1,1,1,.8) -gc.draw(_) -_:release() -gc.setCanvas() +TEXTURE.puzzleMark[-1]=DOGC{30,30, + {"setCL",1,1,1,.8}, + {"draw",DOGC{30,30, + {"setLW",3}, + {"dLine",5,5,25,25}, + {"dLine",5,25,25,5}, + }} +} --A simple pixel font TEXTURE.pixelNum={} diff --git a/parts/updateLog.lua b/parts/updateLog.lua index a14f61a3..c9b8b533 100644 --- a/parts/updateLog.lua +++ b/parts/updateLog.lua @@ -1,7 +1,7 @@ return SPLITSTR([=[ 未来模式: 无尽PC挑战; 简单极简练习; 任务生存; 对称; 无摩擦; 连击练习; 拼方形 - 极简教程/考试; 大爆炸; 音游模式; 跑酷; 术语问答; 养成玩法 + 极简教程/考试; 大爆炸; 音游模式; 跑酷; 术语问答; 养成玩法; 收集向抽奖玩法 OSD; 强制Misdrop; 涂色模式(模仿喷喷, designed by teatube) 未来大游戏: puyo; 花仙子方块; 2048; 泡泡龙 @@ -22,6 +22,39 @@ return SPLITSTR([=[ 可选虚拟按键颜色; 工程编译到字节码; task-Z(新AI) 录像回放菜单; 跳帧开关; 教学关; 超60帧; 热更新 +0.14.5: 晨 Morn + 新增: + 新增BGM:Empty(用于节日主题,by ERM) + 音乐室显示音乐作者 + 新增开5人房的按钮 + 小程序dtw增加街机模式 + 改动: + 微调TRS中PQT5J5L5的踢墙表 + 加强消四,增加b2b点数(100→150) + 增强hpc攻击力(2→4) + 修改pc和hpc对b2b点数的影响 + 调低竞速模式部分评价要求,科研模式通关条件改为100攻击(原200) + 调整master-ph命数奖励 + 对战背景改为主题默认背景 + 修改硬降音效 + 词典修改部分词条,调整词条顺序(意见来自群友 库德里尔) + 移除词典中两个不必要的个人词条 + 词典支持左右键翻页,添加触屏可用的翻页按钮 + "命令行"改名控制台 + 代码: + file模块升级 + 新增users模块用来管理网络用户缓存信息 + play场景改名game + 重构GAME.frame相关内容 + 修复: + 登录界面邮箱格式判定错误 + 调整主菜单点击联网游戏按钮代码的逻辑 + 没开ihs的时候提前hold会死 + 修复锁延刷新次数比显示(设置)的多一次 + 网络玩家倒计时阶段按键会让别人看到的录像播放不正确 + c4w模式回放时初始地形会不一样 + 上踢无限悬空 + 0.14.4: 日出 Sunrise 新增: 添加触摸/点击特效开关 diff --git a/parts/users.lua b/parts/users.lua new file mode 100644 index 00000000..c0af85d0 --- /dev/null +++ b/parts/users.lua @@ -0,0 +1,67 @@ +local loadImage=love.graphics.newImage +local fs=love.filesystem + +local texture_noImage=DOGC{32,32, + {"setCL",0,0,0}, + {"fRect",0,0,32,32}, + {"setCL",1,1,1}, + {"setLW",3}, + {"dLine",0,0,31,31}, + {"dLine",0,31,31,0}, +} + +local function _getEmptyUser() + return{ + username="[X]", + motto="Techmino haowan", + hash="", + new=false, + } +end + +local db_img={} +local db=setmetatable({},{__index=function(self,k) + local file="cache/user"..k..".dat" + local d=fs.getInfo(file)and JSON.decode(fs.read(file))or _getEmptyUser() + rawset(self,k,d) + if type(d.hash)=="string"and #d.hash>0 and fs.getInfo(d.hash)then + db_img[k].avatar=loadImage(d.hash) + end + return d +end}) + +local USERS={} + +function USERS.updateUserData(data) + local uid=data.uid + db[uid].username=data.username + db[uid].motto=data.motto + fs.write("cache/user"..uid..".dat",JSON.encode{ + username=data.username, + motto=data.motto, + hash=data.hash, + }) + if data.avatar then + fs.write("cache/"..data.hash,data.avatar:sub(data.avatar:find","+1)) + db_img[uid].avatar=loadImage("cache/"..data.hash) + db[uid].hash=type(data.hash)=="string"and data.hash>0 and data.hash + db[uid].new=true + end +end + +function USERS.getUsername(uid)return db[uid].username end +function USERS.getMotto(uid)return db[uid].motto end +function USERS.getHash(uid)return db[uid].hash end +function USERS.getAvatar(uid) + if db_img[uid]then + return db_img[uid] + else + if not db[uid].new then + NET.getUserInfo(uid) + db[uid].new=true + end + return texture_noImage + end +end + +return USERS \ No newline at end of file