Compare commits
133 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a2ccff5959 | ||
|
|
c064b8d0f3 | ||
|
|
3484d35b77 | ||
|
|
d8a3e1c97a | ||
|
|
7020bbc55d | ||
|
|
56803fa83b | ||
|
|
030956bdb8 | ||
|
|
835690c609 | ||
|
|
1d8e2094e0 | ||
|
|
a6389ce4be | ||
|
|
a22cc09675 | ||
|
|
17c301c775 | ||
|
|
4ad28a324a | ||
|
|
12254b5849 | ||
|
|
d178140d7d | ||
|
|
2dfbee784d | ||
|
|
29844c5716 | ||
|
|
392798d7f5 | ||
|
|
666a3bd6ef | ||
|
|
159d1e4e57 | ||
|
|
e90515453a | ||
|
|
7aa38225fe | ||
|
|
cfa6b8cd90 | ||
|
|
2f6d53a88f | ||
|
|
832d222f5d | ||
|
|
00b4a206ab | ||
|
|
dd07df9ac0 | ||
|
|
974f2b823c | ||
|
|
2ebf8f5941 | ||
|
|
0fc8d864ea | ||
|
|
28fd42fdd3 | ||
|
|
e8c471c059 | ||
|
|
d9da71723d | ||
|
|
3ca0f6f9af | ||
|
|
f45331d019 | ||
|
|
39e18df6e7 | ||
|
|
6cb5c1a179 | ||
|
|
db51b68058 | ||
|
|
f128527039 | ||
|
|
5694316eac | ||
|
|
7fdc5729d2 | ||
|
|
fc1f363a8b | ||
|
|
1545cb2154 | ||
|
|
1e58ef93a4 | ||
|
|
d9dd56f6e2 | ||
|
|
11d7caa6f6 | ||
|
|
36c5432c65 | ||
|
|
940e08ea54 | ||
|
|
0de1317d2f | ||
|
|
d2e6fd2dcc | ||
|
|
9527d7c0c2 | ||
|
|
c73e07ecaf | ||
|
|
8058a9385a | ||
|
|
44a859296a | ||
|
|
057b36bf5b | ||
|
|
3ce669442d | ||
|
|
bb3de2c396 | ||
|
|
796bd649c2 | ||
|
|
30a8444840 | ||
|
|
fc7695a9f3 | ||
|
|
d1d2def4b0 | ||
|
|
f17a776c14 | ||
|
|
f9b2929a64 | ||
|
|
22b4924b63 | ||
|
|
dfba194108 | ||
|
|
a5f3315037 | ||
|
|
02051b5413 | ||
|
|
74622c377f | ||
|
|
d034be1aff | ||
|
|
df0be2468e | ||
|
|
ce2bf43eab | ||
|
|
f418a22c42 | ||
|
|
bcf1c9c7d4 | ||
|
|
ca6d3ba9e2 | ||
|
|
0aca743e0c | ||
|
|
c75edd9af8 | ||
|
|
e3f3c87c30 | ||
|
|
ccdfce9f88 | ||
|
|
9cd4bd55a1 | ||
|
|
311a11e1df | ||
|
|
db99ed87a0 | ||
|
|
40f9bb28f5 | ||
|
|
c1e36b0669 | ||
|
|
cdfe748f08 | ||
|
|
1c53d0bea5 | ||
|
|
8b445a49b9 | ||
|
|
c68df20847 | ||
|
|
7509420d72 | ||
|
|
db539dafd1 | ||
|
|
b842293563 | ||
|
|
3818c32d33 | ||
|
|
3bf447cb86 | ||
|
|
5f14acf1f2 | ||
|
|
ab7e0e31f6 | ||
|
|
6dee6e5481 | ||
|
|
1fba135b4d | ||
|
|
c7e7198dc6 | ||
|
|
4aae83c7ad | ||
|
|
cf61df2acb | ||
|
|
f866ac1778 | ||
|
|
ae3338dc20 | ||
|
|
4567f19885 | ||
|
|
b667b1e19f | ||
|
|
53d28c1346 | ||
|
|
1b34a13321 | ||
|
|
b370807de1 | ||
|
|
37fa39b5b8 | ||
|
|
d824b87b17 | ||
|
|
0bf4642f10 | ||
|
|
49f79068ae | ||
|
|
34351cb6d4 | ||
|
|
37520a9634 | ||
|
|
9714ba1113 | ||
|
|
b6cf044441 | ||
|
|
bf7fbb1218 | ||
|
|
ed66f5b467 | ||
|
|
38f5ec6393 | ||
|
|
15ecee6767 | ||
|
|
640403866f | ||
|
|
25efce87dc | ||
|
|
79bc8f9527 | ||
|
|
0043052057 | ||
|
|
75f1651042 | ||
|
|
b1ca2c8dda | ||
|
|
069b547e58 | ||
|
|
e5136dd2e5 | ||
|
|
d58b7a9ff1 | ||
|
|
f192e8c993 | ||
|
|
2e9260ace5 | ||
|
|
880b48dc5d | ||
|
|
a3c7a8af26 | ||
|
|
088800c769 | ||
|
|
ecf899f610 |
@@ -34,7 +34,7 @@ function BG.setDefault(bg)
|
||||
end
|
||||
function BG.set(background)
|
||||
if not background then background=BG.default end
|
||||
if not BGs[background]then LOG.print("No BGM file: "..background,10,COLOR.orange)end
|
||||
if not BGs[background]then LOG.print("No BG file: "..background,10,COLOR.orange)end
|
||||
if background==BG.cur or not SETTING.bg then return end
|
||||
BG.discard()
|
||||
BG.cur=background
|
||||
|
||||
@@ -5,7 +5,6 @@ local BGM={
|
||||
play=NULL,
|
||||
freshVolume=NULL,
|
||||
stop=NULL,
|
||||
reload=NULL,
|
||||
--nowPlay=[str:playing ID]
|
||||
--playing=[src:playing SRC]
|
||||
}
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
function copyList(org)
|
||||
local L={}
|
||||
for i=1,#org do
|
||||
if type(org[i])~="table"then
|
||||
L[i]=org[i]
|
||||
else
|
||||
L[i]=copyList(org[i])
|
||||
end
|
||||
end
|
||||
return L
|
||||
end
|
||||
function copyTable(org)
|
||||
local L={}
|
||||
for k,v in next,org do
|
||||
if type(v)~="table"then
|
||||
L[k]=v
|
||||
else
|
||||
L[k]=copyTable(v)
|
||||
end
|
||||
end
|
||||
return L
|
||||
end
|
||||
function addToTable(G,base)--For all things in G if same type in base, push to base
|
||||
for k,v in next,G do
|
||||
if type(v)==type(base[k])then
|
||||
if type(v)=="table"then
|
||||
addToTable(v,base[k])
|
||||
else
|
||||
base[k]=v
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function completeTable(G,base)--For all things in G if no val in base, push to base
|
||||
for k,v in next,G do
|
||||
if base[k]==nil then
|
||||
base[k]=v
|
||||
elseif type(v)=="table"and type(base[k])=="table"then
|
||||
completeTable(v,base[k])
|
||||
end
|
||||
end
|
||||
end
|
||||
25
Zframework/doGC.lua
Normal file
@@ -0,0 +1,25 @@
|
||||
local gc=love.graphics
|
||||
local cmds={
|
||||
move="translate",
|
||||
zoom="scale",
|
||||
rgb="setColor",
|
||||
wid="setLineWidth",
|
||||
line="line",
|
||||
rect="rectangle",
|
||||
circ="circle",
|
||||
poly="polygon",
|
||||
}
|
||||
return function(L)
|
||||
gc.push()
|
||||
local canvas=gc.newCanvas(L[1],L[2])
|
||||
gc.setCanvas(canvas)
|
||||
gc.origin()
|
||||
gc.setColor(1,1,1)
|
||||
gc.setLineWidth(1)
|
||||
for i=3,#L do
|
||||
gc[cmds[L[i][1]]](unpack(L[i],2))
|
||||
end
|
||||
gc.setCanvas()
|
||||
gc.pop()
|
||||
return canvas
|
||||
end
|
||||
@@ -7,7 +7,7 @@ local tabs={
|
||||
"\t\t\t\t",
|
||||
"\t\t\t\t\t",
|
||||
}
|
||||
function dumpTable(L,t)
|
||||
return function(L,t)
|
||||
local s
|
||||
if t then
|
||||
s="{\n"
|
||||
@@ -40,7 +40,7 @@ function dumpTable(L,t)
|
||||
T=type(v)
|
||||
if T=="number"then v=tostring(v)
|
||||
elseif T=="string"then v="\""..v.."\""
|
||||
elseif T=="table"then v=dumpTable(v,t+1)
|
||||
elseif T=="table"then v=DUMPTABLE(v,t+1)
|
||||
elseif T=="boolean"then v=tostring(v)
|
||||
else error("Error data type!")
|
||||
end
|
||||
|
||||
@@ -13,7 +13,7 @@ function FILE.load(name)
|
||||
return s()
|
||||
end
|
||||
else
|
||||
local res=json.decode(s)
|
||||
local res=JSON.decode(s)
|
||||
if res then
|
||||
return res
|
||||
end
|
||||
@@ -26,13 +26,13 @@ function FILE.save(data,name,mode)
|
||||
if not mode then mode=""end
|
||||
name=name
|
||||
if mode:find("l")then
|
||||
data=dumpTable(data)
|
||||
data=DUMPTABLE(data)
|
||||
if not data then
|
||||
LOG.print(name.." "..text.saveError.."dump error","error")
|
||||
return
|
||||
end
|
||||
else
|
||||
data=json.encode(data)
|
||||
data=JSON.encode(data)
|
||||
if not data then
|
||||
LOG.print(name.." "..text.saveError.."json error","error")
|
||||
return
|
||||
|
||||
@@ -1,41 +1,45 @@
|
||||
SCR= require"Zframework/screen"
|
||||
COLOR= require"Zframework/color"
|
||||
SCN= require"Zframework/scene"
|
||||
LOG= require"Zframework/log"
|
||||
WS= require"Zframework/websocket"
|
||||
SCR= require"Zframework.screen"
|
||||
COLOR= require"Zframework.color"
|
||||
SCN= require"Zframework.scene"
|
||||
LOG= require"Zframework.log"
|
||||
WS= require"Zframework.websocket"
|
||||
|
||||
loadLib=require"Zframework/loadLib"
|
||||
require"Zframework/wheelScroll"
|
||||
LOADLIB=require"Zframework.loadLib"
|
||||
WHEELMOV=require"Zframework.wheelScroll"
|
||||
|
||||
require"Zframework/setFont"
|
||||
require"Zframework/mDraw"
|
||||
require"Zframework.setFont"
|
||||
MDRAW=require"Zframework.mDraw"
|
||||
mStr=MDRAW.str
|
||||
mText=MDRAW.simpX
|
||||
mDraw=MDRAW.draw
|
||||
|
||||
require"Zframework/json"
|
||||
require"Zframework/dumpTable"
|
||||
require"Zframework/urlEncode"
|
||||
-- UPPERCHAR=require"Zframework.upperChar"
|
||||
JSON=require"Zframework.json"
|
||||
DUMPTABLE=require"Zframework.dumpTable"
|
||||
URLENCODE=require"Zframework.urlEncode"
|
||||
|
||||
-- require"Zframework/upperChar"
|
||||
require"Zframework/copyTable"
|
||||
require"Zframework/splitStr"
|
||||
require"Zframework/toTime"
|
||||
TABLE=require"Zframework.tableExtend"
|
||||
SPLITSTR=require"Zframework.splitStr"
|
||||
TIMESTR=require"Zframework.timeStr"
|
||||
|
||||
VIB= require"Zframework/vibrate"
|
||||
SFX= require"Zframework/sfx"
|
||||
VIB= require"Zframework.vibrate"
|
||||
SFX= require"Zframework.sfx"
|
||||
|
||||
LIGHT= require"Zframework/light"
|
||||
BG= require"Zframework/background"
|
||||
WIDGET= require"Zframework/widget"
|
||||
TEXT= require"Zframework/text"
|
||||
SYSFX= require"Zframework/sysFX"
|
||||
LIGHT= require"Zframework.light"
|
||||
DOGC= require"Zframework.doGC"
|
||||
BG= require"Zframework.background"
|
||||
WIDGET= require"Zframework.widget"
|
||||
TEXT= require"Zframework.text"
|
||||
SYSFX= require"Zframework.sysFX"
|
||||
|
||||
IMG= require"Zframework/image"
|
||||
BGM= require"Zframework/bgm"
|
||||
VOC= require"Zframework/voice"
|
||||
IMG= require"Zframework.image"
|
||||
BGM= require"Zframework.bgm"
|
||||
VOC= require"Zframework.voice"
|
||||
|
||||
LANG= require"Zframework/languages"
|
||||
TASK= require"Zframework/task"
|
||||
FILE= require"Zframework/file"
|
||||
PROFILE=require"Zframework/profile"
|
||||
LANG= require"Zframework.languages"
|
||||
TASK= require"Zframework.task"
|
||||
FILE= require"Zframework.file"
|
||||
PROFILE=require"Zframework.profile"
|
||||
|
||||
local ms,kb=love.mouse,love.keyboard
|
||||
|
||||
@@ -376,6 +380,7 @@ function love.errorhandler(msg)
|
||||
local BGcolor=rnd()>.026 and{.3,.5,.9}or{.62,.3,.926}
|
||||
local needDraw=true
|
||||
local count=0
|
||||
local errorMsg=text and text.errorMsg or"An error has occurred during loading.\nError info has been created, and you can send it to the author."
|
||||
return function()
|
||||
love.event.pump()
|
||||
for E,a,b in love.event.poll()do
|
||||
@@ -387,17 +392,17 @@ function love.errorhandler(msg)
|
||||
needDraw=true
|
||||
elseif E=="focus"then
|
||||
needDraw=true
|
||||
elseif E=="touchpressed"and b<100 or E=="mousepressed" and a==2 or E=="keypressed"and a=="space"then
|
||||
elseif E=="touchpressed"and b<26 or E=="mousepressed" and a==2 or E=="keypressed"and a=="z"then
|
||||
if count<3 then
|
||||
count=count+1
|
||||
SFX.play("ready")
|
||||
SFX.play("ready",.5)
|
||||
else
|
||||
local code=loadstring(love.system.getClipboardText())
|
||||
if code then
|
||||
code()
|
||||
SFX.play("reach")
|
||||
SFX.play("reach",.5)
|
||||
else
|
||||
SFX.play("finesseError")
|
||||
SFX.play("finesseError",.5)
|
||||
end
|
||||
count=0
|
||||
end
|
||||
@@ -411,7 +416,7 @@ function love.errorhandler(msg)
|
||||
gc.replaceTransform(xOy)
|
||||
gc_draw(errScrShot,100,365,nil,512/errScrShot:getWidth(),288/errScrShot:getHeight())
|
||||
setFont(100)gc_print(":(",100,40,0,1.2)
|
||||
setFont(40)gc_printf(text.errorMsg,100,200,SCR.w0-100)
|
||||
setFont(40)gc_printf(errorMsg,100,200,SCR.w0-100)
|
||||
setFont(20)
|
||||
gc_print(SYSTEM.."-"..VERSION_NAME,100,660)
|
||||
gc_print("scene:"..SCN.cur,400,660)
|
||||
@@ -461,7 +466,8 @@ function love.run()
|
||||
love.resize(gc.getWidth(),gc.getHeight())
|
||||
|
||||
--Scene Launch
|
||||
SCN.init(SETTING.appLock and"calculator"or"load")
|
||||
SCN.push("quit","slowFade")
|
||||
SCN.init("load")
|
||||
|
||||
return function()
|
||||
local _
|
||||
@@ -514,7 +520,7 @@ function love.run()
|
||||
--Draw cursor
|
||||
if mouseShow then
|
||||
local R=int((t+1)/2)%7+1
|
||||
_=SKIN.libColor[SETTING.skin[R]]
|
||||
_=minoColor[SETTING.skin[R]]
|
||||
gc_setColor(_[1],_[2],_[3],min(abs(1-t%2),.3))
|
||||
_=SCS[R][0]
|
||||
gc_draw(TEXTURE.miniBlock[R],mx,my,t%3.14159265359*4,16,16,_[2]+.5,#BLOCKS[R][0]-_[1]-.5)
|
||||
|
||||
@@ -20,9 +20,10 @@
|
||||
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
-- SOFTWARE.
|
||||
|
||||
-- Editted by MrZ
|
||||
|
||||
local ins,char=table.insert,string.char
|
||||
json = {}
|
||||
local json = {}
|
||||
|
||||
-------------------------------------------------------------------------------
|
||||
-- Encode
|
||||
@@ -117,9 +118,8 @@ function json.encode(val)
|
||||
local a,b=pcall(encode,val)
|
||||
if a then
|
||||
return b
|
||||
else
|
||||
elseif LOG then
|
||||
LOG.print(text.jsonError..": "..(b or"uknErr"),"warn")
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
@@ -348,8 +348,8 @@ function json.decode(str)
|
||||
local a,b=pcall(decode,str)
|
||||
if a then
|
||||
return b
|
||||
else
|
||||
elseif LOG then
|
||||
LOG.print(text.jsonError..": "..(b or"uknErr"),"warn")
|
||||
return
|
||||
end
|
||||
end
|
||||
end
|
||||
return json
|
||||
@@ -1,11 +1,5 @@
|
||||
local langList,publicText={},{}
|
||||
local LANG={}
|
||||
|
||||
--Call these before call LANG.init()
|
||||
function LANG.setLangList(list)langList=list end
|
||||
function LANG.setPublicText(L)publicText=L end
|
||||
|
||||
function LANG.init()--Attention, calling this will destory all initializing methods, create a LANG.set()!
|
||||
function LANG.init(langList,publicText)--Attention, calling this will destory all initializing methods, create a LANG.set()!
|
||||
local function langFallback(T0,T)
|
||||
for k,v in next,T0 do
|
||||
if type(v)=="table"and not v.refuseCopy then--refuseCopy: just copy pointer, not contents
|
||||
@@ -62,5 +56,4 @@ function LANG.init()--Attention, calling this will destory all initializing meth
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return LANG
|
||||
@@ -1,10 +1,10 @@
|
||||
local gc=love.graphics
|
||||
function mStr(s,x,y)
|
||||
gc.printf(s,x-626,y,1252,"center")
|
||||
end
|
||||
function mText(s,x,y)
|
||||
gc.draw(s,x-s:getWidth()*.5,y)
|
||||
end
|
||||
function mDraw(s,x,y,a,k)
|
||||
gc.draw(s,x,y,a,k,nil,s:getWidth()*.5,s:getHeight()*.5)
|
||||
end
|
||||
local printf=love.graphics.printf
|
||||
local draw=love.graphics.draw
|
||||
local mDraw={}
|
||||
function mDraw.str(str,x,y)printf(str,x-626,y,1252,"center")end
|
||||
function mDraw.simpX(str,x,y)draw(str,x-str:getWidth()*.5,y)end
|
||||
function mDraw.simpY(str,x,y)draw(str,x,y-str:getHeight()*.5)end
|
||||
function mDraw.X(str,x,y,a,k)draw(str,x,y,a,k,nil,str:getWidth()*.5,0)end
|
||||
function mDraw.Y(str,x,y,a,k)draw(str,x,y,a,k,nil,0,str:getHeight()*.5)end
|
||||
function mDraw.draw(str,x,y,a,k)draw(str,x,y,a,k,nil,str:getWidth()*.5,str:getHeight()*.5)end
|
||||
return mDraw
|
||||
@@ -14,7 +14,7 @@ local SCN={
|
||||
time=false, --Full swap time
|
||||
draw=false, --Swap draw func
|
||||
},
|
||||
stack={"quit","slowFade"},--Scene stack
|
||||
stack={},--Scene stack
|
||||
|
||||
scenes=scenes,
|
||||
|
||||
|
||||
@@ -31,12 +31,17 @@ function SCR.resize(w,h)
|
||||
SCR.safeX,SCR.safeY,SCR.safeW,SCR.safeH=love.window.getSafeArea()
|
||||
SCR.xOy:setTransformation(w/2,h/2,nil,SCR.k,nil,SCR.w0/2,SCR.h0/2)
|
||||
end
|
||||
function SCR.print()
|
||||
LOG.print("Screen Info:")
|
||||
for k,v in next,SCR do
|
||||
if type(v)=="number"then
|
||||
LOG.print(k..": "..v)
|
||||
end
|
||||
end
|
||||
function SCR.info()
|
||||
return{
|
||||
("w0,h0 : %d, %d"):format(SCR.w0,SCR.h0),
|
||||
("x,y : %d, %d"):format(SCR.x,SCR.y),
|
||||
("cx,cy : %d, %d"):format(SCR.cx,SCR.cy),
|
||||
("ex,ey : %d, %d"):format(SCR.ex,SCR.ey),
|
||||
("w,h : %d, %d"):format(SCR.w,SCR.h),
|
||||
("W,H : %d, %d"):format(SCR.W,SCR.H),
|
||||
("safeX,safeY : %d, %d"):format(SCR.safeX,SCR.safeY),
|
||||
("safeW,safeH : %d, %d"):format(SCR.safeW,SCR.safeH),
|
||||
("k,dpi,rad : %d, %d, %.4f"):format(SCR.k,SCR.dpi,SCR.rad),
|
||||
}
|
||||
end
|
||||
return SCR
|
||||
@@ -4,7 +4,6 @@ local SFX={
|
||||
play=NULL,
|
||||
fplay=NULL,
|
||||
reset=NULL,
|
||||
reload=NULL,
|
||||
}
|
||||
function SFX.init(list)
|
||||
SFX.init=nil
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local find,sub=string.find,string.sub
|
||||
function splitStr(s,sep)
|
||||
return function(s,sep)
|
||||
local L={}
|
||||
local p1,p2=1--start,target
|
||||
while p1<=#s do
|
||||
|
||||
52
Zframework/tableExtend.lua
Normal file
@@ -0,0 +1,52 @@
|
||||
local next,type=next,type
|
||||
local TABLE={}
|
||||
function TABLE.shift(org)
|
||||
local L={}
|
||||
for i=1,#org do
|
||||
if type(org[i])~="table"then
|
||||
L[i]=org[i]
|
||||
else
|
||||
L[i]=TABLE.shift(org[i])
|
||||
end
|
||||
end
|
||||
return L
|
||||
end
|
||||
function TABLE.copy(org)
|
||||
local L={}
|
||||
for k,v in next,org do
|
||||
if type(v)~="table"then
|
||||
L[k]=v
|
||||
else
|
||||
L[k]=TABLE.copy(v)
|
||||
end
|
||||
end
|
||||
return L
|
||||
end
|
||||
function TABLE.add(G,base)--For all things in G if same type in base, push to base
|
||||
for k,v in next,G do
|
||||
if type(v)==type(base[k])then
|
||||
if type(v)=="table"then
|
||||
TABLE.add(v,base[k])
|
||||
else
|
||||
base[k]=v
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
function TABLE.complete(G,base)--For all things in G if no val in base, push to base
|
||||
for k,v in next,G do
|
||||
if base[k]==nil then
|
||||
base[k]=v
|
||||
elseif type(v)=="table"and type(base[k])=="table"then
|
||||
TABLE.complete(v,base[k])
|
||||
end
|
||||
end
|
||||
end
|
||||
function TABLE.reIndex(org)
|
||||
for k,v in next,org do
|
||||
if type(v)=="string"then
|
||||
org[k]=org[v]
|
||||
end
|
||||
end
|
||||
end
|
||||
return TABLE
|
||||
@@ -1,5 +1,5 @@
|
||||
local int,format=math.floor,string.format
|
||||
function toTime(s)
|
||||
return function(s)
|
||||
if s<60 then
|
||||
return format("%.3fs",s)
|
||||
elseif s<3600 then
|
||||
@@ -7,6 +7,6 @@ local upperList={
|
||||
[";"]=":",["'"]="\"",
|
||||
[","]="<",["."]=">",["/"]="?",
|
||||
}
|
||||
function upperChar(c)
|
||||
return function(c)
|
||||
return upperList[c]or upper(c)
|
||||
end
|
||||
@@ -1,6 +1,6 @@
|
||||
local rshift=bit.rshift
|
||||
local b16={[0]="0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"}
|
||||
function urlEncode(str)
|
||||
return function(str)
|
||||
local out=""
|
||||
for i=1,#str do
|
||||
if str:sub(i,i):match("[a-zA-Z0-9]")then
|
||||
|
||||
@@ -4,7 +4,6 @@ local VOC={
|
||||
getFreeChannel=NULL,
|
||||
play=NULL,
|
||||
update=NULL,
|
||||
reload=NULL,
|
||||
}
|
||||
function VOC.init(list)
|
||||
VOC.init=nil
|
||||
|
||||
@@ -4,8 +4,8 @@ local path="/tech/socket/v1"
|
||||
|
||||
local wsThread=[[
|
||||
-- lua + love2d threading websocket client
|
||||
-- original pure lua ver. by flaribbit and Particle_G and MrZ_26
|
||||
-- threading version by MrZ_26
|
||||
-- Original pure lua ver. by flaribbit and Particle_G and MrZ
|
||||
-- Threading version by MrZ
|
||||
|
||||
local triggerCHN,sendCHN,readCHN=...
|
||||
|
||||
@@ -15,11 +15,8 @@ local byte,char=string.byte,string.char
|
||||
local band,bor,bxor=bit.band,bit.bor,bit.bxor
|
||||
local shl,shr=bit.lshift,bit.rshift
|
||||
|
||||
|
||||
|
||||
local SOCK=require"socket".tcp()
|
||||
|
||||
|
||||
local JSON=require"Zframework.json"
|
||||
|
||||
local mask_key={1,14,5,14}
|
||||
local function _send(opcode,message)
|
||||
@@ -56,29 +53,52 @@ do--Connect
|
||||
local path=sendCHN:demand()
|
||||
local body=sendCHN:demand()
|
||||
|
||||
SOCK:settimeout(2.6)
|
||||
local res,err=SOCK:connect(host,port)
|
||||
if res~=1 then error(res,err)end
|
||||
if res then
|
||||
--WebSocket handshake
|
||||
if not body then body=""end
|
||||
SOCK:send(
|
||||
"GET "..path.." HTTP/1.1\r\n"..
|
||||
"Host: "..host..":"..port.."\r\n"..
|
||||
"Connection: Upgrade\r\n"..
|
||||
"Upgrade: websocket\r\n"..
|
||||
"Content-Type: application/json\r\n"..
|
||||
"Content-Length: "..#body.."\r\n"..
|
||||
"Sec-WebSocket-Version: 13\r\n"..
|
||||
"Sec-WebSocket-Key: osT3F7mvlojIvf3/8uIsJQ==\r\n\r\n"..--secKey
|
||||
body
|
||||
)
|
||||
|
||||
--WebSocket handshake
|
||||
if not body then body=""end
|
||||
SOCK:send(
|
||||
"GET "..path.." HTTP/1.1\r\n"..
|
||||
"Host: "..host..":"..port.."\r\n"..
|
||||
"Connection: Upgrade\r\n"..
|
||||
"Upgrade: websocket\r\n"..
|
||||
"Content-Type: application/json\r\n"..
|
||||
"Content-Length: "..#body.."\r\n"..
|
||||
"Sec-WebSocket-Version: 13\r\n"..
|
||||
"Sec-WebSocket-Key: osT3F7mvlojIvf3/8uIsJQ==\r\n\r\n"..--secKey
|
||||
body
|
||||
)
|
||||
readCHN:push("success")
|
||||
--First line of HTTP
|
||||
local l=SOCK:receive("*l")
|
||||
local code=l:find(" "); code=l:sub(code+1,code+3)
|
||||
|
||||
if code=="101"then
|
||||
readCHN:push("success")
|
||||
else
|
||||
local ctLen
|
||||
repeat
|
||||
l=SOCK:receive("*l")
|
||||
if not ctLen and l:find"Length"then
|
||||
ctLen=tonumber(l:match"%d+")
|
||||
end
|
||||
until l==""
|
||||
l=SOCK:receive(ctLen)
|
||||
local reason=JSON.decode(l)
|
||||
if reason then reason=reason.message end
|
||||
readCHN:push(code.."-"..(reason or l))
|
||||
end
|
||||
else
|
||||
readCHN:push(err)
|
||||
end
|
||||
SOCK:settimeout(0)
|
||||
end
|
||||
|
||||
|
||||
|
||||
while true do
|
||||
triggerCHN:demond()
|
||||
triggerCHN:demand()
|
||||
while sendCHN:getCount()>=2 do
|
||||
local op=sendCHN:pop()
|
||||
local message=sendCHN:pop()
|
||||
@@ -110,7 +130,15 @@ while true do
|
||||
readCHN:push(op)
|
||||
if op==8 then--close
|
||||
SOCK:close()
|
||||
readCHN:push(string.format("%d-%s",shl(byte(res,1),8)+byte(res,2).."-"..res:sub(3,-3)))
|
||||
if res:sub(1,4)=="HTTP"then
|
||||
local code=res:find(" ")
|
||||
code=res:sub(code+1,code+3)
|
||||
local res=res:sub(res:find("\n\n")+1)
|
||||
reason=JSON.decode(res)if reason then reason=reason.message end
|
||||
readCHN:push(code.."-"..(reason or res))
|
||||
else
|
||||
readCHN:push(string.format("%d-%s",shl(byte(res,1),8)+byte(res,2).."-"..res:sub(3,-3)))
|
||||
end
|
||||
else
|
||||
readCHN:push(res)
|
||||
end
|
||||
@@ -188,10 +216,16 @@ function WS.update()
|
||||
for name,ws in next,wsList do
|
||||
ws.triggerCHN:push(0)
|
||||
if ws.status=="connecting"then
|
||||
if ws.readCHN:pop()=="success"then
|
||||
ws.status="running"
|
||||
ws.lastPingTime=time
|
||||
ws.lastPongTime=time
|
||||
local mes=ws.readCHN:pop()
|
||||
if mes then
|
||||
if mes=="success"then
|
||||
ws.status="running"
|
||||
ws.lastPingTime=time
|
||||
ws.lastPongTime=time
|
||||
else
|
||||
ws.status="dead"
|
||||
LOG.print(text.wsFailed,"warn")
|
||||
end
|
||||
end
|
||||
elseif time-ws.lastPingTime>ws.pingInterval then
|
||||
ws.sendCHN:push(9)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
local floatWheel=0
|
||||
function wheelScroll(y)
|
||||
return function(y)
|
||||
if y>0 then
|
||||
if floatWheel<0 then floatWheel=0 end
|
||||
floatWheel=floatWheel+y^1.2
|
||||
|
||||
@@ -868,11 +868,9 @@ function textBox:scroll(n)
|
||||
end
|
||||
end
|
||||
function textBox:clear()
|
||||
if not self.fix then
|
||||
self.texts={}
|
||||
self.scrollPos=0
|
||||
SFX.play("fall")
|
||||
end
|
||||
self.texts={}
|
||||
self.scrollPos=0
|
||||
SFX.play("fall")
|
||||
end
|
||||
function textBox:draw()
|
||||
local x,y,w,h=self.x,self.y,self.w,self.h
|
||||
@@ -920,7 +918,7 @@ end
|
||||
function textBox:getInfo()
|
||||
return format("x=%d,y=%d,w=%d,h=%d",self.x+self.w*.5,self.y+self.h*.5,self.w,self.h)
|
||||
end
|
||||
function WIDGET.newTextBox(D)--name,x,y,w,h[,font][,fix],hide
|
||||
function WIDGET.newTextBox(D)--name,x,y,w,h[,font][,lineH][,fix],hide
|
||||
local _={
|
||||
name= D.name,
|
||||
|
||||
@@ -942,11 +940,11 @@ function WIDGET.newTextBox(D)--name,x,y,w,h[,font][,fix],hide
|
||||
h= D.h,
|
||||
|
||||
font= D.font or 30,
|
||||
fix=D.fix,
|
||||
texts={},
|
||||
fix= D.fix,
|
||||
texts= {},
|
||||
hide= D.hide,
|
||||
}
|
||||
_.lineH=7*(_.font/5)
|
||||
_.lineH=D.lineH or _.font*7/5
|
||||
_.capacity=int((D.h-10)/_.lineH)
|
||||
|
||||
for k,v in next,textBox do _[k]=v end
|
||||
@@ -976,11 +974,11 @@ function WIDGET.set(list)
|
||||
for i=1,#list do
|
||||
list[i]:reset()
|
||||
end
|
||||
if FESTIVAL and SCN.cur~="custom_field"then
|
||||
if THEME and SCN.cur~="custom_field"then
|
||||
local c1,c2,c3
|
||||
if FESTIVAL=="xMas"then
|
||||
if THEME=="xMas"then
|
||||
c1,c2,c3=COLOR.red,COLOR.white,COLOR.green
|
||||
elseif FESTIVAL=="sprFes"then
|
||||
elseif THEME=="sprFes"then
|
||||
c1,c2,c3=COLOR.red,COLOR.orange,COLOR.yellow
|
||||
else
|
||||
return
|
||||
@@ -1069,7 +1067,7 @@ function WIDGET.keyPressed(k)
|
||||
local swap_xy=k=="up"or k=="down"
|
||||
if swap_xy then WX,WY=WY,WX end -- note that we do not swap them back later
|
||||
for _,W1 in ipairs(WIDGET.active)do
|
||||
if W~=W1 and W1.resCtr and not(W.hide==true or W.hide and W.hide())then
|
||||
if W~=W1 and W1.resCtr and not(W1.hide==true or W1.hide and W1.hide())then
|
||||
local L=W1.resCtr
|
||||
for j=1,#L,2 do
|
||||
local x,y=L[j],L[j+1]
|
||||
|
||||
4
conf.lua
@@ -1,5 +1,5 @@
|
||||
VERSION_CODE=1302
|
||||
VERSION_NAME="Alpha V0.13.2"
|
||||
VERSION_CODE=1303
|
||||
VERSION_NAME="Alpha V0.13.3"
|
||||
love.setDeprecationOutput(false)
|
||||
function love.conf(t)
|
||||
t.identity="Techmino"--Saving folder
|
||||
|
||||
@@ -131,7 +131,7 @@ return{--返回一个table,你也可以在之前定义一些常量或者函数
|
||||
PLY.draw.drawTargetLine(P,r)--使用自带的境界高度线绘制函数
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,--游戏结束时需要保存的本局关键信息
|
||||
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,--把score返回的数据显示出来的方法
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,--把score返回的数据显示出来的方法
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,--按照时间排序,时间一样就看块数
|
||||
getRank=function(P)--计算评级
|
||||
if P.stat.row<40 then return end--你总得打完40行对吧,否则直接return空掉,成绩都不记录
|
||||
|
||||
2
love-api for VSCode.lua
Normal file
@@ -0,0 +1,2 @@
|
||||
--Just tell IDE to load love-api, no actual usage
|
||||
love=require"love"
|
||||
106
main.lua
@@ -14,12 +14,14 @@ local fs=love.filesystem
|
||||
NONE={}function NULL()end
|
||||
DBP=print--Use this in permanent code
|
||||
TIME=love.timer.getTime
|
||||
YIELD=coroutine.yield
|
||||
SYSTEM=love.system.getOS()
|
||||
MOBILE=SYSTEM=="Android"or SYSTEM=="iOS"
|
||||
SAVEDIR=fs.getSaveDirectory()
|
||||
|
||||
--Global Vars & Settings
|
||||
LOADED=false
|
||||
DAILYLAUNCH=false
|
||||
NOGAME=false
|
||||
LOGIN=false
|
||||
EDITING=""
|
||||
@@ -27,7 +29,7 @@ WSCONN=false
|
||||
LATEST_VERSION=false
|
||||
|
||||
--Festival check within one statement
|
||||
FESTIVAL=(
|
||||
THEME=(
|
||||
--Christmas
|
||||
os.date"%m"=="12"and math.abs(os.date"%d"-25)<4 and
|
||||
"Xmas"or
|
||||
@@ -52,6 +54,7 @@ FESTIVAL=(
|
||||
false
|
||||
)
|
||||
|
||||
--System setting
|
||||
math.randomseed(os.time()*626)
|
||||
love.keyboard.setKeyRepeat(true)
|
||||
love.keyboard.setTextInput(false)
|
||||
@@ -70,6 +73,7 @@ end
|
||||
|
||||
--Delete some useless files
|
||||
for _,v in next,{
|
||||
"client.so",
|
||||
"cold_clear.dll",
|
||||
"CCloader.dll",
|
||||
"tech_u.dat",
|
||||
@@ -117,20 +121,20 @@ end
|
||||
--Load modules
|
||||
require"Zframework"
|
||||
|
||||
require"parts/list"
|
||||
require"parts/globalTables"
|
||||
require"parts/gametoolfunc"
|
||||
require"parts.list"
|
||||
require"parts.globalTables"
|
||||
require"parts.gametoolfunc"
|
||||
SCR.setSize(1280,720)--Initialize Screen size
|
||||
FIELD[1]=newBoard()--Initialize field[1]
|
||||
|
||||
AIBUILDER= require"parts/AITemplate"
|
||||
FREEROW= require"parts/freeRow"
|
||||
AIBUILDER= require"parts.AITemplate"
|
||||
FREEROW= require"parts.freeRow"
|
||||
|
||||
TEXTURE= require"parts/texture"
|
||||
SKIN= require"parts/skin"
|
||||
PLY= require"parts/player"
|
||||
AIFUNC= require"parts/ai"
|
||||
MODES= require"parts/modes"
|
||||
TEXTURE= require"parts.texture"
|
||||
SKIN= require"parts.skin"
|
||||
PLY= require"parts.player"
|
||||
AIFUNC= require"parts.ai"
|
||||
MODES= require"parts.modes"
|
||||
|
||||
--First start for phones
|
||||
if not fs.getInfo("conf/settings")and MOBILE then
|
||||
@@ -201,6 +205,7 @@ SKIN.init{
|
||||
"coloredbone_mrz",
|
||||
"wtf",
|
||||
}
|
||||
|
||||
--Initialize sound libs
|
||||
SFX.init((function()
|
||||
local L={}
|
||||
@@ -224,7 +229,6 @@ BGM.init((function()
|
||||
end
|
||||
return L
|
||||
end)())
|
||||
|
||||
VOC.init{
|
||||
"zspin","sspin","lspin","jspin","tspin","ospin","ispin",
|
||||
"single","double","triple","techrash",
|
||||
@@ -236,29 +240,30 @@ VOC.init{
|
||||
}
|
||||
|
||||
--Initialize language lib
|
||||
LANG.setLangList{
|
||||
require"parts/language/lang_zh",
|
||||
require"parts/language/lang_zh2",
|
||||
require"parts/language/lang_yygq",
|
||||
require"parts/language/lang_en",
|
||||
require"parts/language/lang_fr",
|
||||
require"parts/language/lang_sp",
|
||||
require"parts/language/lang_pt",
|
||||
require"parts/language/lang_symbol",
|
||||
--1. Add language file to LANG folder;
|
||||
--2. Require it;
|
||||
--3. Add a button in parts/scenes/setting_lang.lua;
|
||||
}
|
||||
LANG.setPublicText{
|
||||
block={
|
||||
"Z","S","J","L","T","O","I",
|
||||
"Z5","S5","Q","P","F","E",
|
||||
"T5","U","V","W","X",
|
||||
"J5","L5","R","Y","N","H","I5",
|
||||
"I3","C","I2","O1"
|
||||
LANG.init(
|
||||
{
|
||||
require"parts.language.lang_zh",
|
||||
require"parts.language.lang_zh2",
|
||||
require"parts.language.lang_yygq",
|
||||
require"parts.language.lang_en",
|
||||
require"parts.language.lang_fr",
|
||||
require"parts.language.lang_sp",
|
||||
require"parts.language.lang_pt",
|
||||
require"parts.language.lang_symbol",
|
||||
--1. Add language file to LANG folder;
|
||||
--2. Require it;
|
||||
--3. Add a button in parts/scenes/setting_lang.lua;
|
||||
},
|
||||
}
|
||||
LANG.init()
|
||||
{
|
||||
block={
|
||||
"Z","S","J","L","T","O","I",
|
||||
"Z5","S5","Q","P","F","E",
|
||||
"T5","U","V","W","X",
|
||||
"J5","L5","R","Y","N","H","I5",
|
||||
"I3","C","I2","O1"
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
--Load shader files from SOURCE ONLY
|
||||
SHADER={}
|
||||
@@ -276,7 +281,7 @@ for _,v in next,fs.getDirectoryItems("parts/backgrounds")do
|
||||
if fs.getRealDirectory("parts/backgrounds/"..v)~=SAVEDIR then
|
||||
if v:sub(-3)=="lua"then
|
||||
local name=v:sub(1,-5)
|
||||
BG.add(name,require("parts/backgrounds/"..name))
|
||||
BG.add(name,require("parts.backgrounds."..name))
|
||||
end
|
||||
else
|
||||
LOG.print("Dangerous file : %SAVE%/parts/backgrounds/"..v)
|
||||
@@ -287,32 +292,33 @@ end
|
||||
for _,v in next,fs.getDirectoryItems("parts/scenes")do
|
||||
if fs.getRealDirectory("parts/scenes/"..v)~=SAVEDIR then
|
||||
local sceneName=v:sub(1,-5)
|
||||
SCN.add(sceneName,require("parts/scenes/"..sceneName))
|
||||
SCN.add(sceneName,require("parts.scenes."..sceneName))
|
||||
LANG.addScene(sceneName)
|
||||
else
|
||||
LOG.print("Dangerous file : %SAVE%/parts/scenes/"..v)
|
||||
end
|
||||
end
|
||||
|
||||
LANG.set(SETTING.lang)
|
||||
|
||||
--Update data
|
||||
do
|
||||
--Check setting file
|
||||
if
|
||||
type(STAT.version)~="number"or
|
||||
type(SETTING.block)~="boolean"or
|
||||
type(SETTING.sfx_spawn)~="number"or
|
||||
type(SETTING.ghost)~="number"or
|
||||
type(SETTING.center)~="number"or
|
||||
type(SETTING.grid)~="number"or
|
||||
#SETTING.skin<29 or
|
||||
SETTING.bgm>1 or SETTING.sfx>1 or SETTING.voc>1 or
|
||||
SETTING.stereo>1 or SETTING.VKSFX>1 or SETTING.VKAlpha>1
|
||||
SETTING.stereo>1 or SETTING.VKSFX>1 or SETTING.VKAlpha>1 or
|
||||
SETTING.VKCurW>1 or SETTING.VKCurW>1
|
||||
then
|
||||
NOGAME=true
|
||||
fs.remove("conf/settings")
|
||||
end
|
||||
|
||||
freshDate()
|
||||
if STAT.extraRate then
|
||||
STAT.finesseRate=5*(STAT.piece-STAT.extraRate)
|
||||
end
|
||||
@@ -325,29 +331,27 @@ do
|
||||
RANKS.sprintFix=nil
|
||||
RANKS.sprintLock=nil
|
||||
end
|
||||
while STAT.version<1205 or SETTING.VKCurW>1 or SETTING.VKCurW>1 do
|
||||
SETTING.VKCurW=SETTING.VKCurW*.1
|
||||
SETTING.VKTchW=SETTING.VKTchW*.1
|
||||
end
|
||||
if STAT.version<1208 then
|
||||
SETTING.skinSet=1
|
||||
end
|
||||
if STAT.version<1225 then
|
||||
SETTING.skin={1,7,11,3,14,4,9,1,7,2,6,10,2,13,5,9,15,10,11,3,12,2,16,8,4,10,13,2,8}
|
||||
end
|
||||
|
||||
if STAT.version<1300 then
|
||||
STAT.lastPlay="sprint_10l"
|
||||
for _,name in next,fs.getDirectoryItems("replay")do
|
||||
fs.remove("replay/"..name)
|
||||
end
|
||||
end
|
||||
|
||||
if STAT.version<1302 then
|
||||
if RANKS.pctrain_n then RANKS.pctrain_n=0 end
|
||||
if RANKS.pctrain_l then RANKS.pctrain_l=0 end
|
||||
fs.remove("conf/user")
|
||||
NOGAME=true
|
||||
end
|
||||
|
||||
if STAT.version<1303 then
|
||||
SETTING.appLock=false
|
||||
end
|
||||
|
||||
for _,v in next,VK_org do
|
||||
if not v.color then
|
||||
NOGAME=true
|
||||
@@ -358,8 +362,6 @@ do
|
||||
|
||||
if RANKS.infinite then RANKS.infinite=6 end
|
||||
if RANKS.infinite_dig then RANKS.infinite_dig=6 end
|
||||
if RANKS.pctrain_n then RANKS.pctrain_n=0 end
|
||||
if RANKS.pctrain_l then RANKS.pctrain_l=0 end
|
||||
|
||||
local needSaveRank
|
||||
for k in next,RANKS do
|
||||
@@ -408,13 +410,13 @@ do
|
||||
end
|
||||
end
|
||||
|
||||
if FESTIVAL=="Xmas"then
|
||||
if THEME=="Xmas"then
|
||||
BG.setDefault("snow")
|
||||
BGM.setDefault("mXmas")
|
||||
elseif FESTIVAL=="sprFes"then
|
||||
elseif THEME=="sprFes"then
|
||||
BG.setDefault("firework")
|
||||
BGM.setDefault("spring festival")
|
||||
elseif FESTIVAL=="zDay"then
|
||||
elseif THEME=="zDay"then
|
||||
BG.setDefault("lanterns")
|
||||
BGM.setDefault("overzero")
|
||||
else
|
||||
|
||||
BIN
media/BGM/dream.ogg
Normal file
BIN
media/BGM/venus.ogg
Normal file
BIN
media/image/modeicon/attack.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
media/image/modeicon/bigbang.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
media/image/modeicon/classic.png
Normal file
|
After Width: | Height: | Size: 183 B |
BIN
media/image/modeicon/defend.png
Normal file
|
After Width: | Height: | Size: 552 B |
BIN
media/image/modeicon/dig.png
Normal file
|
After Width: | Height: | Size: 534 B |
BIN
media/image/modeicon/dig_sprint.png
Normal file
|
After Width: | Height: | Size: 603 B |
BIN
media/image/modeicon/drought.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
media/image/modeicon/gm.png
Normal file
|
After Width: | Height: | Size: 275 B |
BIN
media/image/modeicon/hidden.png
Normal file
|
After Width: | Height: | Size: 483 B |
BIN
media/image/modeicon/master.png
Normal file
|
After Width: | Height: | Size: 324 B |
BIN
media/image/modeicon/mess.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
BIN
media/image/modeicon/pc.png
Normal file
|
After Width: | Height: | Size: 283 B |
BIN
media/image/modeicon/rhythm.png
Normal file
|
After Width: | Height: | Size: 489 B |
BIN
media/image/modeicon/round.png
Normal file
|
After Width: | Height: | Size: 272 B |
BIN
media/image/modeicon/solo.png
Normal file
|
After Width: | Height: | Size: 338 B |
BIN
media/image/modeicon/sprint1.png
Normal file
|
After Width: | Height: | Size: 403 B |
BIN
media/image/modeicon/sprint2.png
Normal file
|
After Width: | Height: | Size: 434 B |
BIN
media/image/modeicon/sprint3.png
Normal file
|
After Width: | Height: | Size: 464 B |
BIN
media/image/modeicon/survivor.png
Normal file
|
After Width: | Height: | Size: 347 B |
BIN
media/image/modeicon/tech.png
Normal file
|
After Width: | Height: | Size: 395 B |
BIN
media/image/modeicon/ultra.png
Normal file
|
After Width: | Height: | Size: 457 B |
BIN
media/image/modeicon/zen.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
148
parts/ai.lua
@@ -1,20 +1,13 @@
|
||||
--[[
|
||||
HighestBlock
|
||||
BlockedCells
|
||||
Wells
|
||||
FilledLines
|
||||
4deepShape
|
||||
BlockedWells
|
||||
]]
|
||||
local int,ceil,min,abs,rnd,modf=math.floor,math.ceil,math.min,math.abs,math.random,math.modf
|
||||
local ins,rem=table.insert,table.remove
|
||||
local YIELD=YIELD
|
||||
-- controlname:
|
||||
-- 1~5:mL,mR,rR,rL,rF,
|
||||
-- 6~10:hD,sD,H,A,R,
|
||||
-- 11~13:LL,RR,DD
|
||||
local blockPos={4,4,4,4,4,5,4}
|
||||
-------------------------------------------------Cold clear
|
||||
local _CC=loadLib("CC",{
|
||||
local _CC=LOADLIB("CC",{
|
||||
Windows="CCloader",
|
||||
Linux="CCloader",
|
||||
Android="libCCloader.so",
|
||||
@@ -24,23 +17,24 @@ if _CC then
|
||||
local CCblockID={6,5,4,3,2,1,0}
|
||||
CC={
|
||||
getConf= _CC.get_default_config ,--()options,weights
|
||||
fastWeights=_CC.fast_weights ,--(weights)
|
||||
fastWeights=_CC.fast_weights ,--(weights)
|
||||
--setConf= _CC.set_options ,--(options,hold,20g,bag7)
|
||||
|
||||
new= _CC.launch_async ,--(options,weights)bot
|
||||
new= _CC.launch_async ,--(options,weights)bot
|
||||
addNext= function(bot,id)_CC.add_next_piece_async(bot,CCblockID[id])end ,--(bot,piece)
|
||||
update= _CC.reset_async ,--(bot,field,b2b,combo)
|
||||
think= _CC.request_next_move ,--(bot)
|
||||
getMove= _CC.poll_next_move ,--(bot)success,dest,hold,move
|
||||
destroy= _CC.destroy_async ,--(bot)
|
||||
|
||||
setHold= _CC.set_hold ,--(opt,bool)
|
||||
setHold= _CC.set_hold ,--(opt,bool)
|
||||
set20G= _CC.set_20g ,--(opt,bool)
|
||||
-- setPCLoop= _CC.set_pcloop ,--(opt,bool)
|
||||
setBag= _CC.set_bag7 ,--(opt,bool)
|
||||
setBag= _CC.set_bag7 ,--(opt,bool)
|
||||
setNode= _CC.set_max_nodes ,--(opt,bool)
|
||||
free= _CC.free ,--(opt/wei)
|
||||
free= _CC.free ,--(opt/wei)
|
||||
}
|
||||
local CC=CC
|
||||
function CC.updateField(P)
|
||||
local F,i={},1
|
||||
for y=1,#P.field do
|
||||
@@ -90,6 +84,14 @@ if _CC then
|
||||
end
|
||||
end
|
||||
-------------------------------------------------9 Stack setup
|
||||
--[[Future:
|
||||
HighestBlock
|
||||
BlockedCells
|
||||
Wells
|
||||
FilledLines
|
||||
4deepShape
|
||||
BlockedWells
|
||||
]]
|
||||
local dirCount={1,1,3,3,3,0,1}
|
||||
local FCL={
|
||||
[1]={
|
||||
@@ -196,8 +198,10 @@ local function getScore(field,cb,cy)
|
||||
end
|
||||
-------------------------------------------------
|
||||
return{
|
||||
["9S"]={
|
||||
function(P,ctrl)
|
||||
["9S"]=function(P,keys)
|
||||
while true do
|
||||
--Thinking
|
||||
YIELD()
|
||||
local Tfield={}--Test field
|
||||
local best={x=1,dir=0,hold=false,score=-1e99}--Best method
|
||||
local field_org=P.field
|
||||
@@ -224,22 +228,18 @@ return{
|
||||
local cy=#Tfield+1
|
||||
|
||||
--Move to bottom
|
||||
while true do
|
||||
if cy==1 then break end
|
||||
if not ifoverlapAI(Tfield,cb,cx,cy-1)then
|
||||
cy=cy-1
|
||||
else
|
||||
break
|
||||
end
|
||||
while cy>1 and not ifoverlapAI(Tfield,cb,cx,cy-1)do
|
||||
cy=cy-1
|
||||
end
|
||||
|
||||
--Simulate lock
|
||||
for i=1,#cb do
|
||||
local y=cy+i-1
|
||||
if not Tfield[y]then Tfield[y]=getRow(0)end
|
||||
local L=Tfield[y]
|
||||
for j=1,#cb[1]do
|
||||
if cb[i][j]then
|
||||
Tfield[y][cx+j-1]=1
|
||||
L[cx+j-1]=1
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -258,73 +258,61 @@ return{
|
||||
while #Tfield>0 do
|
||||
discardRow(rem(Tfield,1))
|
||||
end
|
||||
local p=#ctrl+1
|
||||
if best.hold then
|
||||
ctrl[p]=8
|
||||
p=p+1
|
||||
ins(keys,8)
|
||||
end
|
||||
local l=FCL[best.bn][best.dir+1][best.x]
|
||||
for i=1,#l do
|
||||
ctrl[p]=l[i]
|
||||
p=p+1
|
||||
ins(keys,l[i])
|
||||
end
|
||||
ctrl[p]=6
|
||||
return 2
|
||||
end,
|
||||
function(P)
|
||||
ins(keys,6)
|
||||
|
||||
--Check if time to change target
|
||||
YIELD()
|
||||
if P:RND()<.00126 then
|
||||
P:changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.3 and 2 or 3)
|
||||
end
|
||||
return 1
|
||||
end,
|
||||
},
|
||||
["CC"]=CC and{
|
||||
[0]=NULL,
|
||||
function(P)--Start thinking
|
||||
if not pcall(CC.think,P.AI_bot)then
|
||||
LOG.print("CC is dead ("..P.id..")","error")
|
||||
return 0
|
||||
end
|
||||
return 2
|
||||
end,
|
||||
function(P,ctrl)--Poll keys
|
||||
local success,result,dest,hold,move=pcall(CC.getMove,P.AI_bot)
|
||||
if success then
|
||||
if result==2 then
|
||||
ins(ctrl,6)
|
||||
return 3
|
||||
elseif result==0 then
|
||||
for i=1,#dest do
|
||||
for j=1,#dest[i]do
|
||||
dest[i][j]=dest[i][j]+1
|
||||
end
|
||||
end
|
||||
end,
|
||||
["CC"]=CC and function(P,keys)
|
||||
while true do
|
||||
--Start thinking
|
||||
YIELD()
|
||||
if not pcall(CC.think,P.AI_bot)then break end
|
||||
|
||||
--Poll keys
|
||||
local success,result,dest,hold,move
|
||||
repeat
|
||||
YIELD()
|
||||
success,result,dest,hold,move=pcall(CC.getMove,P.AI_bot)
|
||||
until not success or result==0 or result==2
|
||||
if not success then break end
|
||||
if result==2 then
|
||||
ins(keys,6)
|
||||
elseif result==0 then
|
||||
dest[5],dest[6]=dest[1][1],dest[1][2]
|
||||
dest[7],dest[8]=dest[2][1],dest[2][2]
|
||||
dest[1],dest[2]=dest[3][1],dest[3][2]
|
||||
dest[3],dest[4]=dest[4][1],dest[4][2]
|
||||
P.AI_dest=dest
|
||||
if hold then keys[1]=8 end--Hold
|
||||
while move[1]do
|
||||
local m=rem(move,1)
|
||||
if m<4 then
|
||||
ins(keys,m+1)
|
||||
elseif not P.AIdata._20G then
|
||||
ins(keys,13)
|
||||
end
|
||||
P.AI_dest=dest
|
||||
if hold then ctrl[1]=8 end--Hold
|
||||
while move[1]do
|
||||
local m=rem(move,1)
|
||||
if m<4 then
|
||||
ins(ctrl,m+1)
|
||||
elseif not P.AIdata._20G then
|
||||
ins(ctrl,13)
|
||||
end
|
||||
end
|
||||
ins(ctrl,6)
|
||||
return 3
|
||||
else
|
||||
--Stay this stage
|
||||
return 2
|
||||
end
|
||||
else
|
||||
LOG.print("CC is dead ("..P.id..")","error")
|
||||
return 0
|
||||
ins(keys,6)
|
||||
end
|
||||
end,
|
||||
function(P)--Check if time to change target
|
||||
|
||||
--Check if time to change target
|
||||
YIELD()
|
||||
if P:RND()<.00126 then
|
||||
P:changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.3 and 2 or 3)
|
||||
end
|
||||
return 1
|
||||
end,
|
||||
},
|
||||
}--AI think stage
|
||||
end
|
||||
LOG.print("CC is dead ("..P.id..")","error")
|
||||
end,
|
||||
}--AI brains
|
||||
@@ -1,11 +1,12 @@
|
||||
--Cool liquid background
|
||||
--A lantern background which is full of festive atmosphere. Lantern image by ScF
|
||||
local gc=love.graphics
|
||||
local int,rnd=math.floor,math.random
|
||||
local ins,rem=table.insert,table.remove
|
||||
local mDraw=mDraw
|
||||
local back={}
|
||||
|
||||
local lanterns
|
||||
local t
|
||||
|
||||
function back.init()
|
||||
lanterns={}
|
||||
t=0
|
||||
@@ -40,9 +41,10 @@ function back.draw()
|
||||
gc.push("transform")
|
||||
gc.origin()
|
||||
gc.setColor(1,1,1)
|
||||
local img=IMG.lanterns
|
||||
for i=1,#lanterns do
|
||||
local L=lanterns[i]
|
||||
mDraw(IMG.lanterns[int(L.phase*6)+1],L.x,L.y,nil,L.size)
|
||||
mDraw(img[int(L.phase*6)+1],L.x,L.y,nil,L.size)
|
||||
end
|
||||
gc.pop()
|
||||
end
|
||||
|
||||
6
parts/backgrounds/light.lua
Normal file
@@ -0,0 +1,6 @@
|
||||
local gc=love.graphics
|
||||
local back={}
|
||||
function back.draw()
|
||||
gc.clear(.95,.95,.95)
|
||||
end
|
||||
return back
|
||||
@@ -8,7 +8,7 @@ local colorLib
|
||||
local blocks
|
||||
local scs
|
||||
function back.init()
|
||||
colorLib=SKIN.libColor
|
||||
colorLib=minoColor
|
||||
blocks=BLOCKS
|
||||
scs=SCS
|
||||
t=rnd()*2600
|
||||
|
||||
@@ -86,7 +86,7 @@ end
|
||||
|
||||
function newBoard(f)--Generate a new board
|
||||
if f then
|
||||
return copyList(f)
|
||||
return TABLE.shift(f)
|
||||
else
|
||||
local F={}
|
||||
for i=1,20 do F[i]={0,0,0,0,0,0,0,0,0,0}end
|
||||
@@ -350,7 +350,7 @@ function royaleLevelup()
|
||||
for _,P in next,PLAYERS.alive do
|
||||
P.gameEnv.drop=spd
|
||||
end
|
||||
if GAME.curMode.name:find("ultimate")then
|
||||
if GAME.curMode.name:find("_u")then
|
||||
for i=1,#PLAYERS.alive do
|
||||
local P=PLAYERS.alive[i]
|
||||
P.gameEnv.drop=int(P.gameEnv.drop*.3)
|
||||
@@ -471,12 +471,16 @@ function generateLine(hole)
|
||||
-- return 2^10-1-2^(hole-1)
|
||||
return 1023-2^(hole-1)
|
||||
end
|
||||
function freshDate()
|
||||
function freshDate(mode)
|
||||
if not mode then mode=""end
|
||||
local date=os.date("%Y/%m/%d")
|
||||
if STAT.date~=date then
|
||||
STAT.date=date
|
||||
STAT.todayTime=0
|
||||
LOG.print(text.newDay,"message")
|
||||
if not mode:find("q")then
|
||||
LOG.print(text.newDay,"message")
|
||||
end
|
||||
return true
|
||||
end
|
||||
end
|
||||
function legalGameTime()--Check if today's playtime is legal
|
||||
@@ -670,14 +674,14 @@ do--function dumpBasicConfig()
|
||||
for _,key in next,gameSetting do
|
||||
S[key]=SETTING[key]
|
||||
end
|
||||
return data.encode("string","base64",json.encode(S))
|
||||
return data.encode("string","base64",JSON.encode(S))
|
||||
end
|
||||
end
|
||||
do--function resetGameData(args)
|
||||
local function tick_showMods()
|
||||
local time=0
|
||||
while true do
|
||||
coroutine.yield()
|
||||
YIELD()
|
||||
time=time+1
|
||||
if time%20==0 then
|
||||
local M=GAME.mod[time/20]
|
||||
@@ -706,7 +710,7 @@ do--function resetGameData(args)
|
||||
local S={}
|
||||
for _,key in next,gameSetting do
|
||||
if type(SETTING[key])=="table"then
|
||||
S[key]=copyList(SETTING[key])
|
||||
S[key]=TABLE.shift(SETTING[key])
|
||||
else
|
||||
S[key]=SETTING[key]
|
||||
end
|
||||
@@ -961,8 +965,8 @@ do--function saveRecording()
|
||||
(USER.name or"Player")
|
||||
local fileBody=
|
||||
GAME.seed.."\n"..
|
||||
json.encode(GAME.setting).."\n"..
|
||||
json.encode(getModList()).."\n"..
|
||||
JSON.encode(GAME.setting).."\n"..
|
||||
JSON.encode(getModList()).."\n"..
|
||||
dumpRecording(GAME.rep)
|
||||
|
||||
--Write file
|
||||
@@ -1067,7 +1071,7 @@ end
|
||||
do
|
||||
--[[
|
||||
launch:
|
||||
local res=json.decode(res.body)
|
||||
local res=JSON.decode(res.body)
|
||||
if res.message=="OK"then
|
||||
LOG.print(res.notice,360,COLOR.sky)
|
||||
if VERSION_CODE>=res.version_code then
|
||||
@@ -1101,7 +1105,7 @@ do
|
||||
PATH.http..PATH.user,
|
||||
"GET",
|
||||
{["Content-Type"]="application/json"},
|
||||
json.encode{
|
||||
JSON.encode{
|
||||
email=USER.email,
|
||||
authToken=USER.authToken,
|
||||
}
|
||||
@@ -1122,13 +1126,13 @@ do
|
||||
LOG.print(text.loginSuccessed)
|
||||
|
||||
--TODO:getUserInfo
|
||||
json.encode{
|
||||
JSON.encode{
|
||||
email=USER.email,
|
||||
authToken=USER.authToken,
|
||||
}
|
||||
|
||||
--TODO:getAccessToken
|
||||
json.encode{
|
||||
JSON.encode{
|
||||
email=USER.email,
|
||||
authToken=USER.authToken,
|
||||
}
|
||||
@@ -1146,13 +1150,13 @@ do
|
||||
PATH.http..PATH.access,
|
||||
"POST",
|
||||
{["Content-Type"]="application/json"},
|
||||
json.encode{
|
||||
JSON.encode{
|
||||
email=USER.email,
|
||||
authToken=USER.authToken,
|
||||
}
|
||||
)
|
||||
else
|
||||
local err=json.decode(res.body)
|
||||
local err=JSON.decode(res.body)
|
||||
if err then
|
||||
LOG.print(text.httpCode..res.code..": "..err.message,"warn")
|
||||
end
|
||||
@@ -1216,7 +1220,7 @@ do
|
||||
|
||||
function TICK_WS_app()
|
||||
while true do
|
||||
coroutine.yield()
|
||||
YIELD()
|
||||
local status=WS.status("app")
|
||||
if status=="running"then
|
||||
local message,op=WS.read("app")
|
||||
@@ -1229,7 +1233,7 @@ do
|
||||
LOG.print(text.wsClose..message,"warn")
|
||||
return
|
||||
else
|
||||
message=json.decode(message)
|
||||
message=JSON.decode(message)
|
||||
end
|
||||
end
|
||||
elseif status~="connecting"then
|
||||
@@ -1239,7 +1243,7 @@ do
|
||||
end
|
||||
function TICK_WS_chat()
|
||||
while true do
|
||||
coroutine.yield()
|
||||
YIELD()
|
||||
local status=WS.status("chat")
|
||||
if status=="running"then
|
||||
local message,op=WS.read("chat")
|
||||
@@ -1252,7 +1256,7 @@ do
|
||||
LOG.print(text.wsClose..message,"warn")
|
||||
return
|
||||
else
|
||||
message=json.decode(message)
|
||||
message=JSON.decode(message)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -153,44 +153,33 @@ CUSTOMENV={--gameEnv for cutsom game
|
||||
wait=0,
|
||||
fall=0,
|
||||
|
||||
--Control
|
||||
nextCount=6,
|
||||
nextStartPos=1,
|
||||
holdCount=1,
|
||||
infHold=false,
|
||||
phyHold=false,
|
||||
|
||||
--Visual
|
||||
block=true,
|
||||
ghost=.3,
|
||||
center=1,
|
||||
bagLine=false,
|
||||
highCam=false,
|
||||
nextPos=false,
|
||||
bone=false,
|
||||
hideBoard=false,
|
||||
flipBoard=false,
|
||||
|
||||
--Rule
|
||||
mindas=0,
|
||||
minarr=0,
|
||||
minsdarr=0,
|
||||
sequence="bag",
|
||||
ospin=true,
|
||||
deepDrop=false,
|
||||
fieldH=20,
|
||||
RS="TRS",
|
||||
|
||||
noTele=false,
|
||||
ospin=true,
|
||||
fineKill=false,
|
||||
b2bKill=false,
|
||||
missionKill=false,
|
||||
easyFresh=true,
|
||||
deepDrop=false,
|
||||
visible="show",
|
||||
target=1e99,
|
||||
freshLimit=1e99,
|
||||
|
||||
|
||||
opponent="X",
|
||||
life=0,
|
||||
garbageSpeed=1,
|
||||
pushSpeed=3,
|
||||
missionKill=false,
|
||||
|
||||
--Else
|
||||
bg="none",
|
||||
@@ -309,7 +298,9 @@ SETTING={--Settings
|
||||
VKCurW=.4,--Cur-Pos Weight
|
||||
VKIcon=true,--If disp icon
|
||||
VKAlpha=.3,
|
||||
}local S=FILE.load("conf/settings")if S then addToTable(S,SETTING)end
|
||||
}
|
||||
local S=FILE.load("conf/settings")
|
||||
if S then TABLE.add(S,SETTING)end
|
||||
S=FILE.load("conf/data")
|
||||
if S then--Statistics
|
||||
STAT=S
|
||||
|
||||
@@ -7,7 +7,9 @@ local noKick,noKick_180,pushZero do
|
||||
for _,L in next,t do
|
||||
if type(L)=="table"then
|
||||
for _,v in next,L do
|
||||
table.insert(v,1,zero)
|
||||
if not v[1]or v[1][1]~=0 or v[1][2]~=0 then
|
||||
table.insert(v,1,zero)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -31,6 +33,7 @@ end
|
||||
local function C_sym(L)--Use this if the block is centrosymmetry, *PTR!!!
|
||||
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
|
||||
if not O then return end
|
||||
@@ -268,9 +271,9 @@ do
|
||||
},--W
|
||||
function(P,d)
|
||||
if P.type=="human"then SFX.fieldPlay("rotate",nil,P)end
|
||||
local iki=XspinList[d]
|
||||
for test=1,#iki do
|
||||
local x,y=P.curX+iki[test][1],P.curY+iki[test][2]
|
||||
local kickData=XspinList[d]
|
||||
for test=1,#kickData do
|
||||
local x,y=P.curX+kickData[test][1],P.curY+kickData[test][2]
|
||||
if not P:ifoverlap(P.cur.bk,x,y)then
|
||||
P.curX,P.curY=x,y
|
||||
P.spinLast=1
|
||||
@@ -366,9 +369,7 @@ do
|
||||
[13]={{-1, 0},{ 1, 0}},
|
||||
[31]={{ 1, 0},{-1, 0}},
|
||||
},--I2
|
||||
{
|
||||
[01]={},[10]={},[03]={},[30]={},
|
||||
},--O1
|
||||
nil,--O1
|
||||
}
|
||||
TRS[2]= reflect(TRS[1])--SZ
|
||||
TRS[4]= reflect(TRS[3])--LJ
|
||||
@@ -377,9 +378,9 @@ do
|
||||
TRS[13]=reflect(TRS[12])--FE
|
||||
TRS[20]=reflect(TRS[19])--L5J5
|
||||
TRS[22]=reflect(TRS[21])--RY
|
||||
TRS[24]=reflect(TRS[23])--HN
|
||||
C_sym(TRS[8])C_sym(TRS[9])
|
||||
C_sym(TRS[25])C_sym(TRS[26])C_sym(TRS[29])
|
||||
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
|
||||
pushZero(TRS)
|
||||
end
|
||||
|
||||
@@ -25,6 +25,11 @@ return{
|
||||
"Chinese: 灰机wiki\nA Chinese Tetris wiki, written by Tetris fans from the Tetris Research community.\nCurrently, most of its pages are translated from Hard Drop Wiki and Tetris Wiki.\n(Link is in Chinese.)",
|
||||
"https://tetris.huijiwiki.com",
|
||||
},
|
||||
{"Applets",
|
||||
"applets",
|
||||
"help",
|
||||
"Type the following codes for some fun applets!\n15-Puzzle: 15p; Schulte Grid: grid\nPong: pong; AtoZ: atoz; 2048: 2048\nCubefield: cube; Just get ten: ten\nUltimate Tic-tac-toe: uttt\nTapping speed test: tap\nDon't touch white: dtw\nCannon: can; Dropper: drp\nCalculater: calc\nReflect: refl\nPolyforge: poly\nCommand Line: cmd",
|
||||
},
|
||||
|
||||
--Games
|
||||
{"TTT",
|
||||
@@ -411,6 +416,11 @@ return{
|
||||
"term",
|
||||
"Attacking: send garbage lines to your opponent by clearing lines.\nDefending: after your opponent send you lines, you offset this garbage by clearing lines.\nCounter attack: Send attack back at your opponent after offseting incoming garbage, or taking the hit then attack back.\nIn most games, garbage offsetting is 1:1, i.e. one attack offsets one incoming garbage.",
|
||||
},
|
||||
{"Combo",
|
||||
"ren combo",
|
||||
"term",
|
||||
"Known in Japan as REN.\nConsecutive line clears make up combos. The second line clear in the combo is 1 combo, and the third line clear is 2 combo, and so on.\nUnlike Back to Back, placing a piece that does not clear a line will break the combo.",
|
||||
},
|
||||
{"Side well",
|
||||
"sidewell",
|
||||
"term",
|
||||
@@ -461,11 +471,6 @@ return{
|
||||
"term",
|
||||
"A way of stacking where you have a 6-block-wide stack on the left, and a 3-block-wide stack on the right.\nFor a skilled player, this method of stacking might reduce the key presses needed for stacking, and is a popular Sprint stacking method. The reason why it works has to do with the fact that pieces spawn with a bias to the left.",
|
||||
},
|
||||
{"Combo",
|
||||
"ren combo",
|
||||
"term",
|
||||
"Known in Japan as REN.\nConsecutive line clears make up combos. The second line clear in the combo is 1 combo, and the third line clear is 2 combo, and so on.\nUnlike Back to Back, placing a piece that does not clear a line will break the combo.",
|
||||
},
|
||||
{"20G",
|
||||
"20g",
|
||||
"term",
|
||||
@@ -765,11 +770,6 @@ return{
|
||||
"Techmino's Github repository. Stars are appreciated",
|
||||
"https://github.com/26F-Studio/Techmino",
|
||||
},
|
||||
{"Minigame",
|
||||
"minigame",
|
||||
"other",
|
||||
"Type the following codes in the search bar of this dictionary for some fun minigames!\n\n15-Puzzle: 15p\nSchulte Grid: grid\nPong: pong\nAtoZ: atoz\nUltimate Tic-tac-toe: uttt\nCubefield: cube\n2048: 2048\nJust get ten: ten\nTapping speed test: tap\nDon't touch white: dtw",
|
||||
},
|
||||
|
||||
--English
|
||||
{"SFX",
|
||||
@@ -995,6 +995,12 @@ return{
|
||||
"Tetris Research community member.\nSprint 47.2 seconds, 29TSD in Techmino, 25 All Clears in PC Challenge - Lunatic\nLots of mental computation power.",
|
||||
"https://space.bilibili.com/403250559",
|
||||
},
|
||||
{"Particle_G",
|
||||
"particleg",
|
||||
"name",
|
||||
"Tetris Research community member.\nSprint 59.4 seconds\nThe developer of Techmino backend",
|
||||
"https://space.bilibili.com/3306106",
|
||||
},
|
||||
{"琳雨空",
|
||||
"linyukong",
|
||||
"name",
|
||||
@@ -1013,10 +1019,10 @@ return{
|
||||
"Tetris Research community member.",
|
||||
"https://space.bilibili.com/13014410",
|
||||
},
|
||||
{"Gompyn",
|
||||
"lanlv gompyn",
|
||||
{"蓝绿",
|
||||
"lanlv gompyn imple lee blari'o blariho",
|
||||
"name",
|
||||
"Tetris Research community member.\nTechnical player.",
|
||||
"Tetris Research community member.\nParticipant of Techmino backend",
|
||||
},
|
||||
{"喵田弥夜Miya",
|
||||
"miya miaotianmiye",
|
||||
|
||||
@@ -19,22 +19,27 @@ return{
|
||||
"俄罗斯方块中文维基,由一群来自俄罗斯方块研究群及下属群的方块同好建立的关于俄罗斯方块的中文百科全书。\n当前大部分页面翻译和参考来自Harddrop wiki和Tetris Wiki",
|
||||
"https://tetris.huijiwiki.com",
|
||||
},
|
||||
{"小程序",
|
||||
"小程序 applets",
|
||||
"help",
|
||||
"输入以下词语打开小程序:\n15-Puzzle: 15p; Schulte Grid: grid\nPong: pong; AtoZ: atoz; 2048: 2048\nCubefield: cube; Just get ten: ten\nUltimate Tic-tac-toe: uttt\nTapping speed test: tap\nDon't touch white: dtw\nCannon: can; Dropper: drp\nCalculater: calc\nReflect: refl\nPolyforge: poly\nCommand Line: cmd",
|
||||
},
|
||||
|
||||
--游戏(题库)
|
||||
{"TTT",
|
||||
"ttt",
|
||||
"教程 ttt",
|
||||
"game",
|
||||
"现代方块特殊操作手把手教程(推荐使用电脑,移动设备需要外接键盘)\n\t推荐能无hold纯消四完成40行挑战的人学习\n\t内含T-spin、极简、SRS、部分对战定式介绍等教程\n\t完全吃透了话就可以成为教练啦!\n注:提供的链接是翻译后挂在茶服的版本",
|
||||
"http://121.4.147.128/ttt",
|
||||
},
|
||||
{"TTPC",
|
||||
"ttpc",
|
||||
"pc教程 ttpc",
|
||||
"game",
|
||||
"SRS+bag7方块游戏开局PC教程(推荐使用电脑,移动设备需要外接键盘)\n\t推荐完成了ttt的人学习(必须先学会SRS)\n\t(不包括六巧板等其它PC定式)\n\n注:提供的链接是翻译后挂在茶服的版本",
|
||||
"http://121.4.147.128/ttpc",
|
||||
},
|
||||
{"NAZO",
|
||||
"nazo",
|
||||
"题库 nazo",
|
||||
"game",
|
||||
"各类SRS试题(手机触屏玩不了)\n\t推荐能通过ttt的玩家尝试。\n\t内含各种t-spin/all-spin题目,简单到极难题目都有。\n\n注:提供的链接是翻译后挂在茶服的版本",
|
||||
"http://121.4.147.128/nazo",
|
||||
@@ -42,48 +47,43 @@ return{
|
||||
|
||||
--游戏(网页)
|
||||
{"King of Stackers",
|
||||
"kos kingofstackers",
|
||||
"回合制 kos kingofstackers",
|
||||
"game",
|
||||
"King of Stackers\n网页版回合制对战方块点击即玩(可能很卡)",
|
||||
"https://kingofstackers.com/games.php",
|
||||
},
|
||||
{"Tetr.js",
|
||||
"tetrjs",
|
||||
"网页 手机 tetrjs",
|
||||
"game",
|
||||
"全平台网页版单机方块点击即玩,有对新人比较友好的全自定义(大多数常用功能),手机只能选几个默认按键组,不能自由摆放。别的都很好",
|
||||
"http://farter.cn/t",
|
||||
},
|
||||
{"Tetra Legends",
|
||||
"tl tetralegends",
|
||||
"网页 tl tetralegends",
|
||||
"game",
|
||||
"全平台网页版单机方块点击即玩(推荐使用电脑,移动设备需要外接键盘)(第一次加载可能很慢),除了手感不够舒适以外功能比较强大,动效很好看,还把很多别的游戏里不可见的机制可视化了,游戏体验很好。\n\n注:包含节奏模式!\n\n2020年12月,基本确定由于各种原因不再继续开发",
|
||||
"https://tetralegends.app",
|
||||
},
|
||||
{"Tetra Online",
|
||||
"to tetraonline",
|
||||
"game",
|
||||
"PC方块打开Steam免费下载即玩,开发团队只有Dr.Ocelot和Mine两个人(都没有很多开发经验),UI部分模仿PPT,手感故意设计为较慢,平时玩无延迟方块的玩家会很不习惯,音乐不错,攻击特效好看。2020年12月9日收到来自TTC的DCMA警告信于是被迫停止开发,在一段时间后关服并下架。",
|
||||
},
|
||||
{"Jstris",
|
||||
"js jstris",
|
||||
"网页 手机 js jstris",
|
||||
"game",
|
||||
"全平台网页对战方块点击即玩(服务器在国外可能很卡)",
|
||||
"https://jstris.jezevec10.com",
|
||||
},
|
||||
{"Tetr.io",
|
||||
"io tetrio",
|
||||
"网页 io tetrio",
|
||||
"game",
|
||||
"炫酷在线对战方块点击即玩(推荐使用电脑,移动设备需要外接键盘)(服务器在国外,可能超级慢甚至打不开)",
|
||||
"https://tetr.io",
|
||||
},
|
||||
{"World Wide Combo",
|
||||
"wwc worldwidecombo",
|
||||
"网页 wwc worldwidecombo",
|
||||
"game",
|
||||
"网页全世界匹配制1对1方块点击即玩(服务器在国外可能很卡)",
|
||||
"https://worldwidecombos.com",
|
||||
},
|
||||
{"Tetris Friends",
|
||||
"tf tetrisfriends",
|
||||
"网页 tf tetrisfriends",
|
||||
"game",
|
||||
"一个已经关服了的网页版方块,曾经是一个不错的对战平台\n现在有人架了私服(怀旧服?)",
|
||||
"https://notrisfoes.com",
|
||||
@@ -91,7 +91,7 @@ return{
|
||||
|
||||
--游戏(街机/类街机)
|
||||
{"TGM",
|
||||
"tgm tetrisgrandmaster",
|
||||
"俄罗斯方块大师 tgm tetrisgrandmaster",
|
||||
"game",
|
||||
"一个街机平台方块系列,S13/GM等称号出自该系列,可以在win平台运行\n\n其中TGM3目前玩得最普遍,部分模式说明:\nMaster:大师模式,有段位评价,拿到更高段位点的要求:非消一的连击和消四,字幕战中消除和通关,每100的前70小于【标准时间,上一个0~70秒数+2】中小的一个,每100总用时不能超过限定值(不然取消上一个方法的加分并反扣点数);到500若没有进标准时间会强制结束游戏(称为铁门);字幕战有两个难度,半隐和全隐,后者必须拿到几乎全部的段位点才能进,消除奖励的段位点也更多。\nShirase:死亡模式,类似于techmino中的20G-极限,开局就是高速20G,500和1000有铁门,500开始底下开始涨垃圾行,1000开始出现骨块,1300通关进入大方块字幕战;段位结算:每通100加1段从S1到S13,如果通关了字幕战就会有金色的S13\n\n更多内容详见链接",
|
||||
"http://121.4.147.128/TGMGUIDE/",
|
||||
@@ -114,7 +114,7 @@ return{
|
||||
|
||||
--游戏(PC/主机)
|
||||
{"Tetris99",
|
||||
"t99 tetris99",
|
||||
"吃鸡 t99 tetris99",
|
||||
"game",
|
||||
"ns端方块,主玩99人混战的吃鸡模式,战术比重比较大,胜率不只由玩家在平时1v1时的水平决定。也有一些常用单机模式如马拉松等",
|
||||
},
|
||||
@@ -128,6 +128,11 @@ return{
|
||||
"game",
|
||||
"一个win平台方块,主要用来6人内对战/单挑/刷每日40L榜/挖掘模式/打机器人。支持自定义das/arr但都不能到0,有一点输入延迟但问题不大,是新人入块圈不错的选择。\n\n现在还开着的服务器有:\n\tTO-P(波兰服,服务器在波兰,可能会卡顿)\n\tTO-S(研究服,研究群群友自己开的服,很稳定,需要进群注册)\n\tTO-X(千雪服,VUP星月千雪于20年9月开的服,还处于实验阶段)",
|
||||
},
|
||||
{"Tetra Online",
|
||||
"to tetraonline",
|
||||
"game",
|
||||
"PC方块打开Steam免费下载即玩(现在已经没了),开发团队只有Dr.Ocelot和Mine两个人(都没有很多开发经验),UI部分模仿PPT,手感故意设计为较慢,平时玩无延迟方块的玩家会很不习惯,音乐不错,攻击特效好看。2020年12月9日收到来自TTC的DCMA警告信于是被迫停止开发,在一段时间后关服并下架。",
|
||||
},
|
||||
{"Tetris Effect",
|
||||
"tec tetriseffectconnect",
|
||||
"game",
|
||||
@@ -154,12 +159,12 @@ return{
|
||||
"块圈玩家自制win平台方块,其实就是一个nullpomino的自带资源包的改版,将东方project元素结合到俄罗斯方块的游戏,好玩但是难度较大,适合有方块基础并且各项能力都较强的玩家游玩(不然都不知道自己怎么死的)",
|
||||
},
|
||||
{"Misamino",
|
||||
"misamino",
|
||||
"回合制 misamino",
|
||||
"game",
|
||||
"块圈玩家自制win平台方块,单机1v1,主玩回合制模式,可以自定义ai(自己写的话需要了解接口)",
|
||||
},
|
||||
{"JJ块",
|
||||
"jj gougou",
|
||||
"手机 jj gougou",
|
||||
"game",
|
||||
"jj棋牌平台下一个休闲游戏,安卓百度“JJ比赛”官网下载平台后可以找到(找不到的话是你没在官网下载或者你是ios系统)。竖屏,输入延迟很小超流畅,可自定义das/arr/20G软降,简单自定义键位,无hold,没有b2b,无攻击缓冲不可抵消,每次攻击上限为4,连击较强,其他同现代方块",
|
||||
},
|
||||
@@ -310,49 +315,49 @@ return{
|
||||
"(部分游戏中)方块旋转后系统可能会给方块施加的偏移,详见SRS词条",
|
||||
},
|
||||
{"SRS",
|
||||
"srs rotate",
|
||||
"超级旋转系统 srs rotate",
|
||||
"term",
|
||||
"Super Rotation System\n现代方块最常用的旋转系统,每个方块都有一个旋转中心,旋转后如果和场地有重合,会根据<从哪个方向转到哪个方向>进行一些偏移测试,可以让方块钻进入一些特定形状的洞。",
|
||||
},
|
||||
{"NRS",
|
||||
"nrs rotate",
|
||||
"旋转系统 nrs rotate",
|
||||
"term",
|
||||
"Nintendo Rotation System",
|
||||
},
|
||||
{"ARS",
|
||||
"ars rotate",
|
||||
"旋转系统 ars rotate",
|
||||
"term",
|
||||
"Arika Rotation System, TGM系列使用的旋转系统(3代中的C模式)\n或者\nAtari Rotation System, 一个左上对齐旋转系统",
|
||||
},
|
||||
{"DRS",
|
||||
"drs rotate",
|
||||
"旋转系统 drs rotate",
|
||||
"term",
|
||||
"DTET Rotation System",
|
||||
},
|
||||
{"TRS",
|
||||
"trs rotate",
|
||||
"旋转系统 trs rotate",
|
||||
"term",
|
||||
"Techmino Rotation System\nTechmino独有的旋转系统,基于SRS设计,修补了一些常见SZ卡死的地形,增加了不少实用踢墙,每个五连块也基本按照SRS的spin逻辑单独设计了踢墙表。",
|
||||
},
|
||||
|
||||
--术语(游戏内名词)
|
||||
{"mini",
|
||||
"mini",
|
||||
"迷你 mini",
|
||||
"term",
|
||||
"spin附加mini后攻击会弱化,用于平衡不同难易度的tspin攻击,判定在不同游戏都不一样,而且大多数很不好理解,建议只记住常见形状即可。",
|
||||
},
|
||||
{"B2B",
|
||||
"b2b btb backtoback",
|
||||
"大满贯 b2b btb backtoback",
|
||||
"term",
|
||||
"Back to Back\n连续打出两次特殊消行(spin和消四),中间不夹杂普通消行,可以提供额外的攻击(在tech中b2b为满贯,大满贯是b3b)",
|
||||
},
|
||||
{"B2B2B",
|
||||
"b2b2b b3b",
|
||||
"大满贯 b2b2b b3b",
|
||||
"term",
|
||||
"b2b的加强版,缩写b3b,大量b2b后连续b2b会变成b2b2b(b3b),提供更强的攻击(仅Tech中有)",
|
||||
},
|
||||
{"Fin/Neo/Iso",
|
||||
"fin neo iso",
|
||||
"特殊 fin neo iso",
|
||||
"term",
|
||||
"一种特殊T2的名字,不同的游戏内的攻击可能不一样,没有特殊价值,可以不详细了解。",
|
||||
},
|
||||
@@ -364,37 +369,37 @@ return{
|
||||
"现代方块是一个模糊的概念,这里列出一部分\"标准\"规则,满足大部分的都可以认为是现代方块:\n1.可见场地大小是10*20,不过上方空间也是存在的,上限可以自己定,一些游戏用的是40\n2.七种方块从顶部正中间出现(奇数宽方块偏左,高度可以是方块底部或顶部贴着场地顶),同一种方块的朝向(一般是平的面朝下)和颜色都一致\n3.一个合适的随机出块机制(常见的详见bag7词条和his词条)\n4.一个合适的的旋转系统(至少有双旋,详见双旋词条)(比如SRS,详见SRS词条)\n5.一个合适的锁定延迟系统,详见锁定延迟词条\n6.一个合适的死亡判定,详见死亡判定词条\n7.有Next系统(一般是3~6个),详见Next词条,并且方向和出现时候的方向一致\n8.有Hold系统,详见Hold词条\n9.如果有出块延迟和消行延迟,那么需要有提前xx系统,详见IRS和IHS词条,IMS是本游戏特有\n10.有DAS系统负责精密并且快速的左右移动,详见DAS词条",
|
||||
},
|
||||
{"IRS",
|
||||
"irs initialrotatesystem",
|
||||
"提前 irs initialrotatesystem",
|
||||
"term",
|
||||
"Initial Rotation System\n提前旋转系统,提前按下旋转后方块出现就是转好的形状,有时可以避免死亡。",
|
||||
},
|
||||
{"IHS",
|
||||
"ihs initialholdsystem",
|
||||
"提前 ihs initialholdsystem",
|
||||
"term",
|
||||
"Initial Hold System\n提前Hold系统,提前按下hold后直接出现hold里的方块,有时可以避免死亡。",
|
||||
},
|
||||
{"IMS",
|
||||
"ims initialmovesystem",
|
||||
"提前 ims initialmovesystem",
|
||||
"term",
|
||||
"Initial Move System\n提前移动系统,提前按下移动后方块出现在移动好的位置,有时可以避免死亡。",
|
||||
},
|
||||
{"Next",
|
||||
"next yulan xiayige",
|
||||
"预览 下一个 next yulan xiayige",
|
||||
"term",
|
||||
"预览功能,指示后边几个块的顺序。\n提前思考手上这块怎么摆可以让后面轻松是玩家提升的必需技能。",
|
||||
},
|
||||
{"Hold",
|
||||
"hold zancun",
|
||||
"暂存 换 hold zancun",
|
||||
"term",
|
||||
"暂存功能,将手里的方块和hold槽中的交换,不能连续使用。\n用来调整块序,更容易摆出你想要的形状。",
|
||||
},
|
||||
{"Misdrop",
|
||||
"md misdrop",
|
||||
"误 md misdrop",
|
||||
"term",
|
||||
"误放,就是不小心放错了地方",
|
||||
},
|
||||
{"Mishold",
|
||||
"mh mishold",
|
||||
"误hold mh mishold",
|
||||
"term",
|
||||
"误hold,就是不小心按到hold导致死亡或失去pc机会等",
|
||||
},
|
||||
@@ -404,7 +409,7 @@ return{
|
||||
"在…之下\n用于表示成绩,单位一般可不写,比如40行成绩sub30是秒,1000行sub15是分钟,不写项目默认是40L\n\n例:39.95秒是sub40,40.5秒不是sub40\n请不要使用sub62之类的词,因为sub本身就是表示大约,一分钟左右的成绩精确到10就可以了,一般30秒以内的sub才会精确到1秒。",
|
||||
},
|
||||
{"Donate",
|
||||
"donate juanzeng",
|
||||
"捐赠 捐献 donate juanzeng",
|
||||
"term",
|
||||
"捐赠\n指刻意临时盖住洞去做tspin等操作来实现不断b2b的一类技巧。",
|
||||
},
|
||||
@@ -413,8 +418,13 @@ return{
|
||||
"term",
|
||||
"通过消除给对手发送垃圾行=攻击\n别人打过来攻击之后用攻击抵消=防御(相杀)\n抵消/吃下所有攻击后打出攻击=反击\n\n注:大多游戏的攻防是1:1的,4行攻击抵消对手的4行攻击",
|
||||
},
|
||||
{"连击",
|
||||
"连击 ren combo",
|
||||
"term",
|
||||
"从第二次消除起叫1ren/combo",
|
||||
},
|
||||
{"Side",
|
||||
"side",
|
||||
"连击 ·side",
|
||||
"term",
|
||||
"在场地旁边空出n列的堆叠法\n用来制造连击,对于新人是一个不错的进攻方法。但由于起楼的时候可能会被顶死而且总效率不高,导致高端玩家不会单独做wide,更可能会在中局堆好炮并且观察到对手短时间内不会打出伤害的时候可以造,用来大幅加强瞬时火力。",
|
||||
},
|
||||
@@ -424,17 +434,17 @@ return{
|
||||
"Side 1 Wide\n旁边空1列,是传统方块游戏里常见的消四打法。\n在现代方块对战中新手可以使用,短时间能打出大量攻击,但在高手场出场率不高,因为效率低,容易被对面一波打死,故只在极少数情况合适的时候用。",
|
||||
},
|
||||
{"S2W",
|
||||
"s2w side2wide",
|
||||
"连击 ·s2w side2wide",
|
||||
"term",
|
||||
"Side 2 Wide\n旁边空2列,是常见的连击打法。\n难度很低,现代块对战中新手可以使用,结合hold可以很轻松地打出大连击。高手场使用不多,因为准备时间太长,会被对面提前打进垃圾行,导致连击数减少,效率也没有特别高,故一套打完也不一定能杀人。",
|
||||
},
|
||||
{"S3W",
|
||||
"s3w side2wide",
|
||||
"连击 ·s3w side2wide",
|
||||
"term",
|
||||
"Side 3 Wide\n旁边空3列,不如2w常见的连击打法。能打出的连击数比2w多,但是难度偏大很容易断连。",
|
||||
},
|
||||
{"S4W",
|
||||
"s4w side4wide",
|
||||
"连击 ·s4w side4wide",
|
||||
"term",
|
||||
"Side 4 Wide\n旁边空4列,一种连击打法,能打出很高的连击,并且准备时间比别的wide打法短,故动作快的话可以抢在对手打进垃圾之前堆很高然后打出超大连击。\n(因为可能会被提前打死,风险挺大,所以没有c4w那么不平衡)",
|
||||
},
|
||||
@@ -444,22 +454,22 @@ return{
|
||||
"Center 1 Wide\n中间空1列,一种实战里消4同时辅助打TSD的打法,需要玩家理解<平衡法>,熟练之后可以轻松消四+T2输出,难度也不是特别大。",
|
||||
},
|
||||
{"C2W",
|
||||
"c2w center2wide",
|
||||
"连击 ·c2w center2wide",
|
||||
"term",
|
||||
"Center 2 Wide\n中间空2列,一种连击打法",
|
||||
},
|
||||
{"C3W",
|
||||
"c3w center3wide",
|
||||
"连击 ·c3w center3wide",
|
||||
"term",
|
||||
"Center 3 Wide\n中间空3列,一种连击打法",
|
||||
},
|
||||
{"C4W",
|
||||
"c4w center4wide",
|
||||
"连击 ·c4w center4wide",
|
||||
"term",
|
||||
"Center 4 Wide\n中间空四列,一种连击打法,能打出很高的连击,利用了大多数专业对战方块游戏的死亡判定机制,可以放心堆高不担心被顶死,然后开始连击。是一种利用游戏机制的不平衡策略(尤其在开局时),观赏性不是很强还可以以弱胜强,成本太低所以成为了部分游戏中约定的类似 禁招 的东西,请在了解情况后再使用,不然可能会被别人骂。\n\n本游戏里做了平衡,c4w强度没有别的游戏高,而且打的是电脑所以放心用~",
|
||||
},
|
||||
{"N-res",
|
||||
"residual c4w s4w",
|
||||
"连击 ·residual c4w s4w",
|
||||
"term",
|
||||
"N-Residual\nN-剩余,指4w连击楼底部留几个方格,常用的是3-res和6-res。\n3-res路线少比较好学,成功率也很高,实战完全够用\n6-res路线多更难用,但是计算力很强的话比3res更稳,也可以用来完成特殊挑战(比如本游戏的c4w练习要求100连击通关)",
|
||||
},
|
||||
@@ -468,13 +478,8 @@ return{
|
||||
"term",
|
||||
"指左边6列右边3列的堆叠方式。在玩家有足够的计算能力后可以减少堆叠所用的按键数(反之可能甚至会增加),是主流的用于减少操作数的高端40L堆叠方式,原理跟出块位置是中间偏左有关。",
|
||||
},
|
||||
{"连击",
|
||||
"连击 ren combo",
|
||||
"term",
|
||||
"从第二次消除起叫1ren/combo",
|
||||
},
|
||||
{"20G",
|
||||
"20g",
|
||||
"高重力 20g",
|
||||
"term",
|
||||
"现代方块的最高下落速度,表观就是方块瞬间到底,不存在中间的下落过程,会让方块无法跨越壕沟/从山谷爬出。",
|
||||
},
|
||||
@@ -494,7 +499,7 @@ return{
|
||||
"方块<碰到地面→锁定>之间的时间。经典块仅方块下落一格时刷新倒计时,而现代方块中往往任何操作都将重置该倒计时,所以连续移动和操作可以让方块不马上锁定,拖一会时间(重置次数有限,一般是15)。",
|
||||
},
|
||||
{"Finesse",
|
||||
"finesse jijiancaozuo zuijiancaozuo",
|
||||
"极简操作 最简操作 finesse jijiancaozuo zuijiancaozuo",
|
||||
"term",
|
||||
"极简操作\n用最少的按键数将方块移到想去的位置的技术,节约时间和减少misdrop。练习可用jstris的极简错误重开或者techmino中打开极简错误提示,多玩就可以。\n\n注意,本游戏使用的极简判定系统不是说完全和理论最少操作数一样,而是不需要软降就能达到的位置才会按照标准出块方向和你的按键次数执行极简检测,故在此不像js存在软降后误杀。但是多了一些新的条件,比如【手上和hold一样/已经按了超过3次按键后】再hold后按键次数不重置(让下一块极简失误)。\n极简率计算:\n没有超过标准极简法操作数的为Perfect计100%,超出一步为Great计50%,超出两步为Bad计25%,两步以上为Miss计0%,其中Bad和Miss会断连\n\n注:20G下极简系统和0G一样工作,所以得到的数值不准确,参考价值偏低",
|
||||
},
|
||||
@@ -504,7 +509,7 @@ return{
|
||||
"常用语,指在低重力的单人模式里减速研究怎么做各种Tspin,本游戏中拓展了含义,用于称呼几乎需要全程spin的游戏模式。",
|
||||
},
|
||||
{"DAS & ARR",
|
||||
"das arr",
|
||||
"灵敏度 das arr",
|
||||
"term",
|
||||
"DAS(Delay-auto-shift,延迟自动移动)系统。\n\nDAS,自动移动延迟,指从<按下移动键时动了一格>到<开始自动移动>之间的时间\nARR(Auto-repeat-rate),自动重复速率,指<每次自动移动>之间的时间\n\n单位都是f(帧,1帧=1/60秒)\n新人不会调的话推荐用das=8~10,arr=1~2\n对自己能力比较自信或者是已经有一定水平想提速推荐用das=4~6,arr=0\n(如果是别的游戏单位是ms(毫秒),那么乘16.7就可算出对应的数值)\n\n最佳调整方法:das越小越好,小到玩家依然能精准区分单点/长按为止;arr能0就0,游戏不允许的话就能拉多小拉多小\n\n这套系统也被叫作DAS系统",
|
||||
},
|
||||
@@ -519,42 +524,42 @@ return{
|
||||
"本游戏中在放了一个方块后会取消/重置/减小das计时器,让自动移动不会立刻生效,减少移动键松开晚了导致下一块一出现就立即开始移动的情况\n注:别的游戏中das打断可能和本游戏这个机制有区别,仅供参考",
|
||||
},
|
||||
{"SDF",
|
||||
"sdf softdropfactor",
|
||||
"软降速度 sdf softdropfactor",
|
||||
"term",
|
||||
"Soft Drop Factor,软降速度因子(倍率),部分游戏中的软降机制是让重力变为原来的若干倍,SDF就是这个倍数。\n基本所有官块和tetr.io使用这个机制,本游戏不使用。",
|
||||
},
|
||||
{"bag7出块",
|
||||
"bag7bag",
|
||||
"bag出块 bag7bag",
|
||||
"term",
|
||||
"bag7\n一种现代方块的出块方式,开局起每7个块是7种形状各出现一次\n\n例如:\nZSJLTOI OTSLZIJ LTISZOJ",
|
||||
},
|
||||
{"His出块",
|
||||
"history",
|
||||
"his出块 history",
|
||||
"term",
|
||||
"一种出块方式,例如his 4 roll 6 (h4r6) 就是在随机生成新的next的时候,随机一个跟最后4次生成的next中有一样的,就重新随机,直到已经尝试6次或和那4个都不一样。",
|
||||
},
|
||||
{"Hypertap",
|
||||
"hypertap",
|
||||
"超连点 hypertap",
|
||||
"term",
|
||||
"快速震动手指,实现比长按更快速+灵活的高速单点移动,主要在经典块的高难度下(因为das不可调而且特别慢,高速下很容易md导致失败,此时手动连点就比自动移动更快)或者受特殊情况限制不适合用自动移动时使用。会使用这个技术的人被称为Hypertapper",
|
||||
},
|
||||
{"TOP攻击表",
|
||||
"top attack",
|
||||
"攻击表 top attack",
|
||||
"term",
|
||||
"消1/2/3/4打0/1/2/4\nTspin攻击为消行数*2,如果符合mini条件则/2\n连击攻击:001122334445+\nb2b攻击+1(如果是T3则+2)\npc攻击+6(该部分攻击aoe直接打出到所有对手,不抵消缓冲槽中的攻击)",
|
||||
},
|
||||
{"Techmino攻击表",
|
||||
"tech attack",
|
||||
"攻击表 tech attack",
|
||||
"term",
|
||||
"攻击系统:\n 普通消除:\n 消<4行打出[消行数-0.5]攻击\n 特殊消除:\n 如果是spin,打出[2*消行数]攻击,\n B2B攻击+[1/1/2/4/8(spin1~5)]\n B3B攻击在B2B基础上+消行数*0.5,+1额外抵挡\n mini减至25%\n 不是spin但是单次消>=4行,打出[消行数]攻击,\n B2B攻击+1\n B3B攻击+50%,+1额外抵挡\n 特殊消除会增加B2B点数,让之后的特殊消除获得B2B(B3B)增益(详细说明见下文)\n 半全消(<下方有剩余方块>的全消,如果是I消1行则必须不剩余玩家放置的方块):伤害+2,额外抵挡+2\n 全消:将上述伤害之和减半,再+8~20(本局内递增2),+2额外抵挡(注:本局消行数>4时会将B2B点数拉满)\n 连击:每次连击给予上述攻击[连击数*25%(如果只消一行就是15%)]的加成,12combo达到上限,连击>=3次时再额外加1攻击\n 根据上述规则计算后,向下取整,攻击打出",
|
||||
},
|
||||
{"C2序列",
|
||||
"c2 seq",
|
||||
"c2序列 seq",
|
||||
"term",
|
||||
"七个块初始权重0\n全体乘2再加0~1的随机数,选数字最大的块出,然后将其权重除以3.5,循环",
|
||||
},
|
||||
{"C2踢墙",
|
||||
"c2 kick",
|
||||
"c2踢墙 kick",
|
||||
"term",
|
||||
"左,右,下,左下,右下,左2,右2\n(任何方块的任何旋转都使用这个表)",
|
||||
},
|
||||
@@ -772,11 +777,6 @@ return{
|
||||
"Techmino的github仓库地址,欢迎star",
|
||||
"https://github.com/26F-Studio/Techmino",
|
||||
},
|
||||
{"小游戏",
|
||||
"小游戏 minigame xiaoyouxi",
|
||||
"other",
|
||||
"输入以下词语,小游戏免费玩!\n\n15-Puzzle: 15p\nSchulte Grid: grid\nPong: pong\nAtoZ: atoz\nUltimate Tic-tac-toe: uttt\nCubefield: cube\n2048: 2048\nJust get ten: ten\nTapping speed test: tap\nDon't touch white: dtw",
|
||||
},
|
||||
|
||||
--英文
|
||||
{"SFX",
|
||||
@@ -817,7 +817,7 @@ return{
|
||||
"一流玩家,很强",
|
||||
},
|
||||
{"Doremy",
|
||||
"doremy 123",
|
||||
"哆来咪 doremy 123",
|
||||
"name",
|
||||
"一流玩家,雨宫说他是世界第二",
|
||||
},
|
||||
@@ -880,7 +880,7 @@ return{
|
||||
{"小Z",
|
||||
"小Z z xiaoz",
|
||||
"name",
|
||||
"这个百科的名字!曾经是群里的答疑机器人,此词典数据库也就是沿用了机器人问答库~",
|
||||
"这个百科的名字!曾经是群里的答疑机器人,此词典数据库也沿用了机器人的问答库~",
|
||||
},
|
||||
{"MrZ",
|
||||
"mrz zjiang ddd 026 t626",
|
||||
@@ -1003,6 +1003,12 @@ return{
|
||||
"【研究群】「T942」\n40行47.2秒,29TSD,全清挑战-疯狂25PC\n算力极强的思维型选手,不比速度的许多项目都是世界水平",
|
||||
"https://space.bilibili.com/403250559",
|
||||
},
|
||||
{"Particle_G",
|
||||
"particleg t1080",
|
||||
"name",
|
||||
"【研究群】「T1080」\n40行59.4秒\nTechmino后端(服务器)主要开发人员",
|
||||
"https://space.bilibili.com/3306106",
|
||||
},
|
||||
{"琳雨空",
|
||||
"琳雨空 linyukong t1505",
|
||||
"name",
|
||||
@@ -1016,15 +1022,15 @@ return{
|
||||
"https://space.bilibili.com/147529",
|
||||
},
|
||||
{"ditoly",
|
||||
"ditoly icrem kuimei jk t3055",
|
||||
"葵 ditoly icrem kuimei jk t3055",
|
||||
"name",
|
||||
"【研究群】「T3055」\n被清华劝退现于北大的打块天才jk\n(好像也被北大劝退了?不知道)",
|
||||
"https://space.bilibili.com/13014410",
|
||||
},
|
||||
{"蓝绿",
|
||||
"蓝绿 lanlv gompyn t3182",
|
||||
"蓝绿 lanlv gompyn imple lee blari'o blariho t3182",
|
||||
"name",
|
||||
"【研究群】「T3182」\n高技术力,喜欢催更",
|
||||
"【研究群】「T3182」\n高技术力,参与了Techmino后端开发",
|
||||
},
|
||||
{"喵田弥夜",
|
||||
"喵田弥夜 miya miaotianmiye mao t7023",
|
||||
|
||||
@@ -184,15 +184,15 @@ return{
|
||||
"Author: MrZ E-mail: 1046101471@qq.com",
|
||||
"Powered by LOVE2D",
|
||||
"",
|
||||
"Program: MrZ, Particle_G, [T9972, FinnTenzor]",
|
||||
"Art: MrZ, ScF, [Gnyar, T0722]",
|
||||
"Program: MrZ, Particle_G, [蓝绿, FinnTenzor]",
|
||||
"Art: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
|
||||
"Music: MrZ, [T0722]",
|
||||
"Voice & Sound: Miya, Naki, MrZ",
|
||||
"Test: 思竣 Performance: 模电, HBM",
|
||||
"Translate: User670, MattMayuga, Mizu, Mr.Faq, ScF",
|
||||
"",
|
||||
"Special Thanks:",
|
||||
"User670, Big_True, Flyz, Farter,",
|
||||
"User670, Big_True, Flyz, Farter, T9972",
|
||||
"蕴空之灵, Teatube, [All test staff]",
|
||||
},
|
||||
used=[[
|
||||
@@ -275,9 +275,8 @@ return{
|
||||
autoPause="Pause when focus is lost",
|
||||
swap="Key Combination (Change Atk. Mode)",
|
||||
fine="Finesse Error Sound",
|
||||
appLock="App Lock (Password: 626)",
|
||||
appLock="App Lock (Password: 6+26)",
|
||||
simpMode="Simple mode",
|
||||
calc="App Lock",
|
||||
},
|
||||
setting_video={
|
||||
title="Video Settings",
|
||||
@@ -424,21 +423,10 @@ return{
|
||||
nextCount="Next",
|
||||
holdCount="Hold",
|
||||
infHold="Infinite Hold",
|
||||
block="Draw Block",
|
||||
ghost="Ghost",
|
||||
center="Center",
|
||||
upEdge="3D Block",
|
||||
bagLine="Bag Line",
|
||||
highCam="Birds-eye View",
|
||||
nextPos="Next Preview",
|
||||
phyHold="Physical Hold",
|
||||
bone="Bone Blocks",
|
||||
|
||||
mindas="Min. DAS",
|
||||
minarr="Min. ARR",
|
||||
minsdarr="Min. SDARR",
|
||||
noTele="No Teleportation",
|
||||
fieldH="Field height",
|
||||
RS="Rotation System",
|
||||
ospin="O-Spin",
|
||||
deepDrop="Deep Drop",
|
||||
target="Target",
|
||||
@@ -457,6 +445,7 @@ return{
|
||||
|
||||
any="Erase",
|
||||
space="×",
|
||||
smartPen="Smart",
|
||||
|
||||
pushLine="Add Line(K)",
|
||||
delLine="Del Line(L)",
|
||||
@@ -612,7 +601,7 @@ return{
|
||||
b3b="B3B",
|
||||
pc="PC",
|
||||
},
|
||||
mg_15p={
|
||||
app_15p={
|
||||
reset="Shuffle",
|
||||
color="Color",
|
||||
blind="Blind",
|
||||
@@ -620,34 +609,35 @@ return{
|
||||
pathVis="Show Path",
|
||||
revKB="Reverse",
|
||||
},
|
||||
mg_schulteG={
|
||||
app_schulteG={
|
||||
reset="Reset",
|
||||
rank="Size",
|
||||
blind="Blind",
|
||||
disappear="Hide",
|
||||
tapFX="Tap FX",
|
||||
},
|
||||
mg_pong={
|
||||
app_pong={
|
||||
reset="Restart",
|
||||
},
|
||||
mg_AtoZ={
|
||||
app_AtoZ={
|
||||
level="Level",
|
||||
keyboard="Keyboard",
|
||||
reset="Reset",
|
||||
},
|
||||
mg_2048={
|
||||
app_2048={
|
||||
reset="Reset",
|
||||
blind="Blind",
|
||||
tapControl="Tap control",
|
||||
|
||||
skip="Skip Round",
|
||||
},
|
||||
mg_ten={
|
||||
app_ten={
|
||||
reset="Reset",
|
||||
next="Next",
|
||||
blind="Blind",
|
||||
fast="Fast",
|
||||
},
|
||||
mg_dtw={
|
||||
app_dtw={
|
||||
reset="Reset",
|
||||
mode="Mode",
|
||||
},
|
||||
|
||||
@@ -5,7 +5,6 @@ return{
|
||||
sureQuit="Appuyez à nouveau pour sortir",
|
||||
newVersion="Merci d'avoir mis le jeu à jour ! Les nouvelles fonctionnalités sont listées ci-dessous.",
|
||||
httpTimeout="La connexion au réseau ne s'est pas faite à temps.",
|
||||
marking="Créateur du jeu: MrZ_26\nSi vous pouvez voir ceci, cet enregistrement est illégal\nToute explication est fausse et invalide.",
|
||||
newDay="[Anti-addiction] Nouveau jour, nouveau commencement !",
|
||||
playedLong="[Anti-addiction] Vous avez joué pendant un bon bout de temps aujourd'hui. Faites des pauses.",
|
||||
playedTooMuch="[Anti-addiction] Vous avez joué trop longtemps ! Vous ne pouvez plus jouer.",
|
||||
@@ -163,15 +162,15 @@ return{
|
||||
"Author: MrZ E-mail: 1046101471@qq.com",
|
||||
"Powered by LOVE2D",
|
||||
"",
|
||||
"Programme : MrZ, Particle_G, [T9972, FinnTenzor]",
|
||||
"Art : MrZ, ScF, [Gnyar, T0722]",
|
||||
"Programme : MrZ, Particle_G, [蓝绿, FinnTenzor]",
|
||||
"Art : MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
|
||||
"Musique : MrZ, [T0722]",
|
||||
"Voix & Sons: Miya, Naki, MrZ Performance: 模电, HBM",
|
||||
"Test: 思竣 Performance: 模电, HBM",
|
||||
"Traduction: User670, MattMayuga, Mizu, Mr.Faq, ScF",
|
||||
"",
|
||||
"Merci à:",
|
||||
"User670, Big_True, Flyz, Farter,",
|
||||
"User670, Big_True, Flyz, Farter, T9972",
|
||||
"蕴空之灵, Teatube, [All test staff]",
|
||||
},
|
||||
used=[[
|
||||
@@ -251,8 +250,8 @@ return{
|
||||
autoPause="Mettre en pause en cas de perte de focus",
|
||||
swap="Combinaison de touches (changer le mode d'attaque)",
|
||||
fine="Son d'erreur de Finesse",
|
||||
appLock="Verrouillage d'appli (MDP : 626)",
|
||||
calc="Verrouillage d'appli",
|
||||
appLock="Verrouillage d'appli (MDP : 6+26)",
|
||||
-- simpMode="Simple mode",
|
||||
},
|
||||
setting_video={
|
||||
title="Paramètres vidéo",
|
||||
@@ -400,21 +399,10 @@ return{
|
||||
nextCount="Prévisualisations de pièces",
|
||||
holdCount="Réserve",
|
||||
infHold="Réserver une fois",
|
||||
block="Dessiner le bloc",
|
||||
ghost="Pièce fantôme",
|
||||
center="Centre",
|
||||
upEdge="3D bloc",
|
||||
bagLine="Ligne du Sac",
|
||||
highCam="Vue d'oiseau",
|
||||
nextPos="Prévisualisation de position",
|
||||
-- phyHold="Physical Hold",
|
||||
bone="Crochets",
|
||||
|
||||
mindas="DAS minimum",
|
||||
minarr="ARR minimum",
|
||||
minsdarr="SDARR minimum",
|
||||
noTele="Pas de téléportation",
|
||||
-- fieldH="Field height",
|
||||
RS="Système de rotation",
|
||||
ospin="O-spin",
|
||||
-- deepDrop="Deep Drop",
|
||||
target="But",
|
||||
@@ -433,6 +421,8 @@ return{
|
||||
|
||||
any="Effacer",
|
||||
space="×",
|
||||
-- smartPen="Smart",
|
||||
|
||||
pushLine="Ajouter ligne (K)",
|
||||
delLine="Supprimer ligne (L)",
|
||||
|
||||
@@ -523,7 +513,7 @@ return{
|
||||
_3="Triple",
|
||||
_4="Techrash",
|
||||
},
|
||||
mg_15p={
|
||||
app_15p={
|
||||
reset="Réinitialiser",
|
||||
color="Couleur",
|
||||
blind="Aveugler",
|
||||
@@ -531,33 +521,34 @@ return{
|
||||
pathVis="Montrer le tracé",
|
||||
revKB="Inverser",
|
||||
},
|
||||
mg_schulteG={
|
||||
app_schulteG={
|
||||
reset="Réinitialiser",
|
||||
rank="Taille",
|
||||
blind="Aveugler",
|
||||
disappear="Cacher",
|
||||
tapFX="Effet quand tapé",
|
||||
},
|
||||
mg_pong={
|
||||
app_pong={
|
||||
reset="Redémarrer",
|
||||
},
|
||||
mg_AtoZ={
|
||||
app_AtoZ={
|
||||
level="niveau",
|
||||
keyboard="Clavier",
|
||||
reset="Redémarrer",
|
||||
},
|
||||
mg_2048={
|
||||
app_2048={
|
||||
reset="Réinitialiser",
|
||||
blind="Aveugler",
|
||||
tapControl="Contrôle par toucher",
|
||||
skip="Passer Round",
|
||||
},
|
||||
mg_ten={
|
||||
app_ten={
|
||||
reset="Réinitialiser",
|
||||
next="Prévisualisations",
|
||||
blind="Aveugler",
|
||||
-- fast="Fast",
|
||||
},
|
||||
mg_dtw={
|
||||
app_dtw={
|
||||
reset="Réinitialiser",
|
||||
-- mode="Mode",
|
||||
},
|
||||
|
||||
@@ -184,15 +184,15 @@ return{
|
||||
"Author: MrZ E-mail: 1046101471@qq.com",
|
||||
"Powered by LOVE2D",
|
||||
"",
|
||||
"Programa: MrZ, Particle_G, [T9972, FinnTenzor]",
|
||||
"Art: MrZ, ScF, [Gnyar, T0722]",
|
||||
"Programa: MrZ, Particle_G, [蓝绿, FinnTenzor]",
|
||||
"Art: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
|
||||
"Music: MrZ, [T0722]",
|
||||
"Voice & Sound: Miya, Naki, MrZ",
|
||||
"Test: 思竣 Performance: 模电, HBM",
|
||||
"Traduzir: User670, MattMayuga, Mizu, Mr.Faq, ScF",
|
||||
"",
|
||||
"Special Thanks:",
|
||||
"User670, Big_True, Flyz, Farter,",
|
||||
"User670, Big_True, Flyz, Farter, T9972",
|
||||
"蕴空之灵, Teatube, [All test staff]",
|
||||
},
|
||||
used=[[
|
||||
@@ -275,9 +275,8 @@ return{
|
||||
autoPause="Pausar quando foco for perco",
|
||||
swap="Combinação de tecla(Mudar modo de atk)",
|
||||
fine="Som Falha de destreza",
|
||||
appLock="App Lock (Senha: 626)",
|
||||
appLock="App Lock (Senha: 6+26)",
|
||||
-- simpMode="Simple mode",
|
||||
calc="App Lock",
|
||||
},
|
||||
setting_video={
|
||||
title="Config. de vídeo",
|
||||
@@ -424,21 +423,10 @@ return{
|
||||
nextCount="Prox.",
|
||||
holdCount="Segurar",
|
||||
infHold="Segurar Infinito",
|
||||
block="Mostrar bloco",
|
||||
ghost="Fantasma",
|
||||
center="Centro",
|
||||
upEdge="3D bloco",
|
||||
bagLine="Linha De Bolsa",
|
||||
highCam="Vista Olho-De-Pássaro",
|
||||
nextPos="Próxima pos.",
|
||||
-- phyHold="Physical Hold",
|
||||
bone="Bone Blocks",
|
||||
|
||||
mindas="Min. DAS",
|
||||
minarr="Min. ARR",
|
||||
minsdarr="Min. SDARR",
|
||||
noTele="Sem teleporte",
|
||||
-- fieldH="Field height",
|
||||
RS="Sistema de rotação",
|
||||
ospin="O-Spin",
|
||||
-- deepDrop="Deep Drop",
|
||||
target="Alvo",
|
||||
@@ -457,6 +445,7 @@ return{
|
||||
|
||||
any="Apagar",
|
||||
space="×",
|
||||
-- smartPen="Smart",
|
||||
|
||||
pushLine="Add Linha(K)",
|
||||
delLine="Del Linha(L)",
|
||||
@@ -612,7 +601,7 @@ return{
|
||||
b3b="B3B",
|
||||
pc="PC",
|
||||
},
|
||||
mg_15p={
|
||||
app_15p={
|
||||
reset="Embaralhar",
|
||||
color="Cor",
|
||||
blind="Cego",
|
||||
@@ -620,33 +609,34 @@ return{
|
||||
pathVis="Mostrar caminho",
|
||||
revKB="Reverso",
|
||||
},
|
||||
mg_schulteG={
|
||||
app_schulteG={
|
||||
reset="Resetar",
|
||||
rank="Tamanho",
|
||||
blind="Cego",
|
||||
disappear="Escond.",
|
||||
tapFX="FX De Toque",
|
||||
},
|
||||
mg_pong={
|
||||
app_pong={
|
||||
reset="Reiniciar",
|
||||
},
|
||||
mg_AtoZ={
|
||||
app_AtoZ={
|
||||
level="Nivel",
|
||||
keyboard="Teclado",
|
||||
reset="Reiniciar",
|
||||
},
|
||||
mg_2048={
|
||||
app_2048={
|
||||
reset="Resetar",
|
||||
blind="Cego",
|
||||
-- tapControl="Tap control",
|
||||
-- skip="Skip Round",
|
||||
},
|
||||
mg_ten={
|
||||
app_ten={
|
||||
reset="Resetar",
|
||||
next="Próxima",
|
||||
blind="Cego",
|
||||
-- fast="Fast",
|
||||
},
|
||||
mg_dtw={
|
||||
app_dtw={
|
||||
reset="Resetar",
|
||||
-- mode="Mode",
|
||||
},
|
||||
|
||||
@@ -164,15 +164,15 @@ return{
|
||||
"Autor:MrZ Email: 1046101471@qq.com",
|
||||
"Creado con LOVE2D",
|
||||
"",
|
||||
"Programación: MrZ, Particle_G, [T9972, FinnTenzor]",
|
||||
"Artistas: MrZ, ScF, [Gnyar, T0722]",
|
||||
"Programación: MrZ, Particle_G, [蓝绿, FinnTenzor]",
|
||||
"Artistas: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
|
||||
"Música: MrZ, [T0722]",
|
||||
"Voces/Sonidos: Miya, Naki, MrZ Performance: 模电, HBM",
|
||||
"Testeo: 思竣 Performance: 模电, HBM",
|
||||
"Traducción: User670, MattMayuga, Mizu, Mr.Faq, ScF",
|
||||
"",
|
||||
"Agradecimientos:",
|
||||
"User670, Big_True, Flyz, Farter,",
|
||||
"User670, Big_True, Flyz, Farter, T9972",
|
||||
"蕴空之灵, Teatube, [Todo el Staff de Testeo]",
|
||||
},
|
||||
used=[[
|
||||
@@ -255,9 +255,8 @@ return{
|
||||
autoPause="Pausar cuando la ventana no está enfocada",
|
||||
swap="Combinación de Teclas (Cambiar Modo de Ataque)",
|
||||
fine="Sonido de Error de Finesse",
|
||||
appLock="Bloqueo de App (Contraseña: 626)",
|
||||
appLock="Bloqueo de App (Contraseña: 6+26)",
|
||||
-- simpMode="Simple mode",
|
||||
calc="Bloqueo de App",
|
||||
},
|
||||
setting_video={
|
||||
title="Ajustes de Video",
|
||||
@@ -400,21 +399,10 @@ return{
|
||||
nextCount="Siguiente",
|
||||
holdCount="Reserva",
|
||||
-- infHold="Hold Único",
|
||||
block="Dibujar Bloques",
|
||||
ghost="Fantasma",
|
||||
center="Centrar",
|
||||
upEdge="3D Bloques",
|
||||
bagLine="Línea de Bag de Pzas.",
|
||||
highCam="Vista Aérea",
|
||||
nextPos="Nro. de Pzas. Siguientes",
|
||||
-- phyHold="Physical Hold",
|
||||
bone="Bone Block",
|
||||
|
||||
mindas="DAS Mínimo",
|
||||
minarr="ARR Mínimo",
|
||||
minsdarr="SDARR Mínimo",
|
||||
noTele="Sin Teleport",
|
||||
-- fieldH="Field height",
|
||||
-- RS="Rotation System",
|
||||
ospin="O-Spin",
|
||||
-- deepDrop="Deep Drop",
|
||||
target="Objetivo",
|
||||
@@ -529,7 +517,7 @@ return{
|
||||
_3="Triple",
|
||||
_4="Techrash",
|
||||
},
|
||||
mg_15p={
|
||||
app_15p={
|
||||
reset="Mezclar",
|
||||
color="Color",
|
||||
blind="A ciegas",
|
||||
@@ -537,33 +525,34 @@ return{
|
||||
pathVis="Mostrar Movs.",
|
||||
revKB="Deshacer",
|
||||
},
|
||||
mg_schulteG={
|
||||
app_schulteG={
|
||||
reset="Reiniciar",
|
||||
rank="Tamaño",
|
||||
blind="A ciegas",
|
||||
disappear="No mostrar",
|
||||
tapFX="Sonido al pulsar",
|
||||
},
|
||||
mg_pong={
|
||||
app_pong={
|
||||
reset="Reiniciar",
|
||||
},
|
||||
mg_AtoZ={
|
||||
app_AtoZ={
|
||||
-- level="Level",
|
||||
-- keyboard="Keyboard",
|
||||
reset="Reiniciar",
|
||||
},
|
||||
mg_2048={
|
||||
app_2048={
|
||||
reset="Reiniciar",
|
||||
blind="A ciegas",
|
||||
-- tapControl="Tap control",
|
||||
-- skip="Skip Round",
|
||||
},
|
||||
mg_ten={
|
||||
app_ten={
|
||||
reset="Reiniciar",
|
||||
next="Siguiente",
|
||||
blind="A ciegas",
|
||||
-- fast="Fast",
|
||||
},
|
||||
mg_dtw={
|
||||
app_dtw={
|
||||
reset="Reiniciar",
|
||||
-- mode="Mode",
|
||||
},
|
||||
|
||||
@@ -135,9 +135,8 @@ return{
|
||||
autoPause="A||",
|
||||
swap="=+=+=",
|
||||
fine="12 X 21",
|
||||
appLock="?XX(=626)",
|
||||
-- simpMode="_",
|
||||
calc="?XX",
|
||||
appLock="?XX(=6+26)",
|
||||
simpMode=".",
|
||||
},
|
||||
setting_video={
|
||||
title="{~~}",
|
||||
@@ -281,21 +280,10 @@ return{
|
||||
nextCount="→",
|
||||
holdCount="[ ]",
|
||||
infHold="∞*[ ]",
|
||||
block="==↓==",
|
||||
ghost="__↓__",
|
||||
center="+",
|
||||
upEdge="[]`",
|
||||
bagLine="123|123",
|
||||
highCam="↑__↑",
|
||||
nextPos="???←",
|
||||
phyHold="P-[ ]",
|
||||
bone="[]",
|
||||
|
||||
mindas="mDAS",
|
||||
minarr="mARR",
|
||||
minsdarr="msdARR",
|
||||
noTele="X→→X",
|
||||
fieldH="↑[]↓",
|
||||
RS="''?",
|
||||
ospin="O→Any",
|
||||
deepDrop="\\↓↓/",
|
||||
target="&=",
|
||||
@@ -314,6 +302,8 @@ return{
|
||||
|
||||
any="_",
|
||||
space="×",
|
||||
smartPen="~",
|
||||
|
||||
pushLine="↑↑↑↑↑(K)",
|
||||
delLine="==X==(L)",
|
||||
|
||||
@@ -456,7 +446,7 @@ return{
|
||||
b3b="^^",
|
||||
pc="#<>#",
|
||||
},
|
||||
mg_15p={
|
||||
app_15p={
|
||||
reset="!@#$%",
|
||||
color="~~~",
|
||||
blind="???",
|
||||
@@ -464,33 +454,34 @@ return{
|
||||
pathVis="--==>",
|
||||
revKB="Reverse",
|
||||
},
|
||||
mg_schulteG={
|
||||
app_schulteG={
|
||||
reset="!@#$%",
|
||||
rank="←?→",
|
||||
blind="???",
|
||||
disappear="=X=",
|
||||
tapFX="↓ !",
|
||||
},
|
||||
mg_pong={
|
||||
app_pong={
|
||||
reset="R",
|
||||
},
|
||||
mg_AtoZ={
|
||||
app_AtoZ={
|
||||
level="_ _ _",
|
||||
keyboard="[##]",
|
||||
reset="R",
|
||||
},
|
||||
mg_2048={
|
||||
app_2048={
|
||||
reset="R",
|
||||
blind="???",
|
||||
tapControl="_↓",
|
||||
skip=">>",
|
||||
},
|
||||
mg_ten={
|
||||
app_ten={
|
||||
reset="R",
|
||||
next="→",
|
||||
blind="???",
|
||||
fast="~~→",
|
||||
},
|
||||
mg_dtw={
|
||||
app_dtw={
|
||||
reset="R",
|
||||
mode="?",
|
||||
},
|
||||
|
||||
@@ -70,7 +70,6 @@ return{
|
||||
ctrl="改控制",
|
||||
key="改键位",
|
||||
touch="改触屏",
|
||||
calc="家长锁",
|
||||
},
|
||||
setting_video={
|
||||
title="改画面",
|
||||
@@ -169,7 +168,7 @@ return{
|
||||
b3b="很牛逼",
|
||||
pc="消干净了",
|
||||
},
|
||||
mg_15p={
|
||||
app_15p={
|
||||
reset="打乱",
|
||||
color="彩",
|
||||
blind="盲",
|
||||
@@ -177,7 +176,7 @@ return{
|
||||
pathVis="路径显示",
|
||||
revKB="键盘反向",
|
||||
},
|
||||
mg_schulteG={
|
||||
app_schulteG={
|
||||
reset="重开",
|
||||
rank="尺寸",
|
||||
blind="盲",
|
||||
|
||||
@@ -185,15 +185,15 @@ return{
|
||||
"作者:MrZ 邮箱:1046101471@qq.com",
|
||||
"使用LOVE2D引擎",
|
||||
"",
|
||||
"程序: MrZ, Particle_G, [T9972, FinnTenzor]",
|
||||
"美术: MrZ, ScF, [Gnyar, T0722]",
|
||||
"程序: MrZ, Particle_G, [蓝绿, FinnTenzor]",
|
||||
"美术: MrZ, ScF, [Gnyar, 旋律星萤, T0722]",
|
||||
"音乐: MrZ, [T0722]",
|
||||
"音效/语音: Miya, Naki, MrZ",
|
||||
"测试: 思竣 演出: 模电, HBM",
|
||||
"翻译: User670, MattMayuga, Mizu, Mr.Faq, ScF",
|
||||
"",
|
||||
"特别感谢:",
|
||||
"User670, Big_True, Flyz, Farter,",
|
||||
"User670, Big_True, Flyz, Farter, T9972",
|
||||
"蕴空之灵, Teatube, [所有内测人员]",
|
||||
},
|
||||
used=[[
|
||||
@@ -276,9 +276,8 @@ return{
|
||||
autoPause="失去焦点自动暂停",
|
||||
swap="组合键切换攻击模式",
|
||||
fine="极简操作提示音",
|
||||
appLock="软件锁(密码626)",
|
||||
appLock="软件锁(密码6+26)",
|
||||
simpMode="简洁模式",
|
||||
calc="软件锁",
|
||||
},
|
||||
setting_video={
|
||||
title="画面设置",
|
||||
@@ -424,21 +423,10 @@ return{
|
||||
nextCount="Next",
|
||||
holdCount="Hold",
|
||||
infHold="无限Hold",
|
||||
block="方块可见",
|
||||
ghost="阴影透明度",
|
||||
center="中心透明度",
|
||||
upEdge="3D方块",
|
||||
bagLine="包分界线",
|
||||
highCam="超屏视野",
|
||||
nextPos="生成预览",
|
||||
phyHold="物理Hold",
|
||||
bone="骨块",
|
||||
|
||||
mindas="最小DAS",
|
||||
minarr="最小ARR",
|
||||
minsdarr="最小软降ARR",
|
||||
noTele="禁止瞬移",
|
||||
fieldH="场地高度",
|
||||
RS="旋转系统",
|
||||
ospin="O-spin",
|
||||
deepDrop="穿墙软降",
|
||||
target="目标行数",
|
||||
@@ -457,6 +445,8 @@ return{
|
||||
|
||||
any="不定",
|
||||
space="×",
|
||||
smartPen="智能",
|
||||
|
||||
pushLine="增加一行(K)",
|
||||
delLine="消除行(L)",
|
||||
|
||||
@@ -611,7 +601,7 @@ return{
|
||||
b3b="B3B",
|
||||
pc="PC",
|
||||
},
|
||||
mg_15p={
|
||||
app_15p={
|
||||
reset="打乱",
|
||||
color="颜色",
|
||||
blind="盲打",
|
||||
@@ -619,37 +609,38 @@ return{
|
||||
pathVis="路径显示",
|
||||
revKB="键盘反向",
|
||||
},
|
||||
mg_schulteG={
|
||||
app_schulteG={
|
||||
reset="重来",
|
||||
rank="尺寸",
|
||||
blind="盲打",
|
||||
disappear="消失",
|
||||
tapFX="点击动画",
|
||||
},
|
||||
mg_pong={
|
||||
app_pong={
|
||||
reset="重置",
|
||||
},
|
||||
mg_AtoZ={
|
||||
app_AtoZ={
|
||||
level="关卡",
|
||||
keyboard="键盘",
|
||||
reset="重置",
|
||||
},
|
||||
mg_UTTT={
|
||||
app_UTTT={
|
||||
reset="重置",
|
||||
},
|
||||
mg_2048={
|
||||
app_2048={
|
||||
reset="重置",
|
||||
blind="盲打",
|
||||
tapControl="点击操作",
|
||||
|
||||
skip="跳过回合",
|
||||
},
|
||||
mg_ten={
|
||||
app_ten={
|
||||
reset="重置",
|
||||
next="预览",
|
||||
blind="盲打",
|
||||
fast="速打",
|
||||
},
|
||||
mg_dtw={
|
||||
app_dtw={
|
||||
reset="重置",
|
||||
mode="模式",
|
||||
},
|
||||
@@ -804,7 +795,7 @@ return{
|
||||
"触摸板打osu也很好!",
|
||||
"凑数tip什么时候能站起来!",
|
||||
"打好块跟学习一样没有捷径,多练。",
|
||||
"大概还是有人会看tips的",
|
||||
"大概还是有人会看tip的",
|
||||
"大满贯10连击消四全清!",
|
||||
"戴上耳机以获得最佳体验",
|
||||
"单手也能玩!",
|
||||
@@ -817,6 +808,7 @@ return{
|
||||
"对战游戏不是单机游戏,所以timing在对战里也非常重要!",
|
||||
"多年小游戏玩家表示痛恨假加载,启动动画主要是在加载资源",
|
||||
"多hold现代块又回来了!",
|
||||
"物理hold了解一下",
|
||||
"发现有个\"隐形\"皮肤了吗",
|
||||
"方块不能吃",
|
||||
"方块教会我们,合群了就会消失,...",
|
||||
@@ -824,7 +816,7 @@ return{
|
||||
"服务器随时爆炸",
|
||||
"感觉自己明明按键了但是没反应?你真的按到了吗?",
|
||||
"感觉自己速度到上限了?试着把das调低一点",
|
||||
"感谢群友帮忙想tips",
|
||||
"感谢群友帮忙想tip",
|
||||
"感谢Orzmic为这个tip显示框提供灵感",
|
||||
"刚接触方块的话多玩玩就行,40行两分钟以外没啥好针对性练习的",
|
||||
"刚开始练全隐形可以尽量堆平,留一列消四",
|
||||
@@ -865,7 +857,6 @@ return{
|
||||
"你今天的人品值是:0.26",
|
||||
"你今天的人品值是:0",
|
||||
"你今天的人品值是:12.7",
|
||||
"你今天的人品值是:14.06",
|
||||
"你今天的人品值是:22",
|
||||
"你今天的人品值是:26",
|
||||
"你今天的人品值是:28.3",
|
||||
@@ -874,13 +865,15 @@ return{
|
||||
"你今天的人品值是:62.6",
|
||||
"你今天的人品值是:87.2",
|
||||
"你今天的人品值是:89.5",
|
||||
"你今天的人品值是:99.9",
|
||||
"你今天的人品值是:9999%",
|
||||
"你今天的人品值是:"..math.random(100),
|
||||
"你可以从统计页面打开游戏存档目录",
|
||||
"你们考虑过Z酱的感受吗?没有!你们只考虑你自己。",
|
||||
"你知道吗,全程不使用左右移动键完成40行模式是有可能的",
|
||||
"你知道吗:看主页机器人玩可能比较费电",
|
||||
"你知道吗:全程不使用任何旋转键完成40行模式是有可能的",
|
||||
"你知道吗:全程不使用左右移动键完成40行模式是有可能的",
|
||||
"你知道吗:停留在模式地图界面很费电",
|
||||
"你准备好了吗?",
|
||||
"请不要一直看主页机器人玩,可能比较费电",
|
||||
"请勿大力敲打设备!敲坏了就没有Techmino玩了",
|
||||
"请勿使用三只手游玩",
|
||||
"去玩别的方块的时候记得没有Ospin!",
|
||||
@@ -898,10 +891,9 @@ return{
|
||||
"挖掘能力在对战里非常非常非常重要!!!!",
|
||||
"玩到一半弹出消息框?快去设置禁止弹窗",
|
||||
"为了保护玩家们的健康,本游戏有一个临时的简易防沉迷系统!(不过估计你也触发不了/笑)",
|
||||
"为了防止误触,玩到一半重开需要长按重开键",
|
||||
"为什么关卡那么少!因为前一模式成绩连D都没达到,再加把劲吧~",
|
||||
"我曾经在极度愤怒的时候15秒消了40行",
|
||||
"我们是不是第一个在方块游戏做tips的?",
|
||||
"我们是不是第一个在方块游戏做tip的?",
|
||||
"我是一条凑数tip",
|
||||
"我也不知道分数有啥用应该只是好看的,建议别管他,只看关卡要求你做啥",
|
||||
"我也是一条凑数tip",
|
||||
@@ -994,7 +986,7 @@ return{
|
||||
{c.C,"泰拉瑞亚好玩!"},
|
||||
{c.C,"我的世界好玩!"},
|
||||
{c.C,"CYAN"},
|
||||
{c.C,"Orzmic好玩!不过还没出"},
|
||||
{c.C,"Orzmic好玩!"},
|
||||
{c.C,"Osu!好玩!"},
|
||||
{c.C,"Phigros好玩!"},
|
||||
{c.C,"VVVVVV好玩!"},
|
||||
@@ -1020,7 +1012,7 @@ return{
|
||||
{c.grape,"T-spin!"},
|
||||
{c.grass,"GRASS"},
|
||||
{c.grey,"俄罗斯方块环游记也不错!"},
|
||||
{c.grey,"感谢Phigros提供部分tips模板("},
|
||||
{c.grey,"感谢Phigros提供部分tip模板("},
|
||||
{c.grey,"暂定段位:9"},
|
||||
{c.grey,"REGRET!!"},
|
||||
{c.lame,"LAME"},
|
||||
@@ -1059,8 +1051,8 @@ 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.W,"效率药水",c.grey," 效率提升 (8:00)"},
|
||||
{c.W,"协调药水",c.grey," MD减少 II(1:30)"},
|
||||
{c.water,"WATER"},
|
||||
{c.Y,"暂定段位:GM"},
|
||||
{c.Y,"暂定段位:M"},
|
||||
|
||||
@@ -84,10 +84,7 @@ return{
|
||||
nextCount="预览个数",
|
||||
holdCount="暂存个数",
|
||||
infHold="无限暂存",
|
||||
|
||||
mindas="最小首次移动延迟",
|
||||
minarr="最小移动重复延迟",
|
||||
minsdarr="最小软降重复延迟",
|
||||
phyHold="物理暂存",
|
||||
},
|
||||
music={
|
||||
bgm="音乐",
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
return splitStr([=[
|
||||
return SPLITSTR([=[
|
||||
Gameplay:
|
||||
The system will provide you with tetrominoes (4-block pieces),
|
||||
with a total of 7 types, and the player needs to control them
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
return splitStr([=[
|
||||
return SPLITSTR([=[
|
||||
游戏方法:
|
||||
系统会提供的一个个四连骨牌("方块",总共7种)
|
||||
玩家需要控制(左右移动和旋转90,180,270度)这些骨牌直到下落到场地底部,锁定
|
||||
|
||||
@@ -230,17 +230,6 @@ do--SCS(spinCenters)
|
||||
}
|
||||
end
|
||||
do--BLOCKS
|
||||
local function RotCW(B)
|
||||
local N={}
|
||||
local r,c=#B,#B[1]--row,col
|
||||
for x=1,c do
|
||||
N[x]={}
|
||||
for y=1,r do
|
||||
N[x][y]=B[y][c-x+1]
|
||||
end
|
||||
end
|
||||
return N
|
||||
end
|
||||
local O,_=true,false
|
||||
BLOCKS={
|
||||
--Tetramino
|
||||
@@ -282,20 +271,58 @@ do--BLOCKS
|
||||
--Dot
|
||||
{{O}}, --O1
|
||||
}
|
||||
local function RotCW(B)
|
||||
local N={}
|
||||
local r,c=#B,#B[1]--row,col
|
||||
for x=1,c do
|
||||
N[x]={}
|
||||
for y=1,r do
|
||||
N[x][y]=B[y][c-x+1]
|
||||
end
|
||||
end
|
||||
return N
|
||||
end
|
||||
for i=1,#BLOCKS do
|
||||
local B=BLOCKS[i]
|
||||
BLOCKS[i]={[0]=B}
|
||||
B=RotCW(B)BLOCKS[i][1]=B
|
||||
B=RotCW(B)BLOCKS[i][2]=B
|
||||
B=RotCW(B)BLOCKS[i][3]=B
|
||||
for j=1,3 do
|
||||
B=RotCW(B)
|
||||
BLOCKS[i][j]=B
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
rankColor={
|
||||
COLOR.dRed, --D
|
||||
COLOR.dOrange, --C
|
||||
COLOR.lYellow, --B
|
||||
COLOR.lBlue, --A
|
||||
COLOR.lCyan, --S
|
||||
COLOR.lGreen, --Special
|
||||
{.6,.3,.3},
|
||||
{.7,.5,.3},
|
||||
{.9,.7,.5},
|
||||
{.6,.9,1},
|
||||
{.95,.95,.5},
|
||||
}
|
||||
|
||||
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,
|
||||
}
|
||||
@@ -1,21 +1,21 @@
|
||||
return{
|
||||
{name="sprint_10l", x=0, y=0, size=40,shape=1,icon="sprint", unlock={"sprint_20l","sprint_40l"}},
|
||||
{name="sprint_20l", x=-200, y=0, size=50,shape=1,icon="sprint"},
|
||||
{name="sprint_40l", x=0, y=-300, size=40,shape=1,icon="sprint", unlock={"dig_10l","sprint_100l","marathon_n","sprintPenta","sprintMPH"}},
|
||||
{name="sprint_100l", x=-200, y=-200, size=50,shape=1,icon="sprint", unlock={"sprint_400l","drought_n"}},
|
||||
{name="sprint_400l", x=-400, y=-200, size=40,shape=1,icon="sprint", unlock={"sprint_1000l"}},
|
||||
{name="sprint_1000l", x=-600, y=-200, size=40,shape=1,icon="sprint"},
|
||||
{name="sprint_10l", x=0, y=0, size=40,shape=1,icon="sprint1", unlock={"sprint_20l","sprint_40l"}},
|
||||
{name="sprint_20l", x=-200, y=0, size=50,shape=1,icon="sprint1"},
|
||||
{name="sprint_40l", x=0, y=-300, size=40,shape=1,icon="sprint2", unlock={"dig_10l","sprint_100l","marathon_n","sprintPenta","sprintMPH"}},
|
||||
{name="sprint_100l", x=-200, y=-200, size=50,shape=1,icon="sprint2", unlock={"sprint_400l","drought_n"}},
|
||||
{name="sprint_400l", x=-400, y=-200, size=40,shape=1,icon="sprint3", unlock={"sprint_1000l"}},
|
||||
{name="sprint_1000l", x=-600, y=-200, size=40,shape=1,icon="sprint3"},
|
||||
|
||||
{name="sprintPenta", x=210, y=-370, size=40,shape=3,icon="sprint"},
|
||||
{name="sprintMPH", x=210, y=-230, size=40,shape=3,icon="sprint"},
|
||||
{name="sprintPenta", x=210, y=-370, size=40,shape=3,icon="tech"},
|
||||
{name="sprintMPH", x=210, y=-230, size=40,shape=3,icon="tech"},
|
||||
|
||||
{name="drought_n", x=-400, y=0, size=40,shape=1,icon="noI", unlock={"drought_l"}},
|
||||
{name="drought_n", x=-400, y=0, size=40,shape=1,icon="drought", unlock={"drought_l"}},
|
||||
{name="drought_l", x=-600, y=0, size=40,shape=1,icon="mess"},
|
||||
|
||||
{name="dig_10l", x=-200, y=-400, size=40,shape=1,icon="dig", unlock={"dig_40l"}},
|
||||
{name="dig_40l", x=-400, y=-400, size=40,shape=1,icon="dig", unlock={"dig_100l"}},
|
||||
{name="dig_100l", x=-600, y=-400, size=40,shape=1,icon="dig", unlock={"dig_400l"}},
|
||||
{name="dig_400l", x=-800, y=-200, size=40,shape=1,icon="dig"},
|
||||
{name="dig_10l", x=-200, y=-400, size=40,shape=1,icon="dig_sprint", unlock={"dig_40l"}},
|
||||
{name="dig_40l", x=-400, y=-400, size=40,shape=1,icon="dig_sprint", unlock={"dig_100l"}},
|
||||
{name="dig_100l", x=-600, y=-400, size=40,shape=1,icon="dig_sprint", unlock={"dig_400l"}},
|
||||
{name="dig_400l", x=-800, y=-200, size=40,shape=1,icon="dig_sprint"},
|
||||
|
||||
{name="marathon_n", x=0, y=-600, size=60,shape=1,icon="marathon",unlock={"marathon_h","rhythm_e","solo_e","round_e","blind_e","classic_fast","survivor_e","bigbang","zen"}},
|
||||
{name="marathon_h", x=0, y=-800, size=50,shape=1,icon="marathon",unlock={"master_beginner"}},
|
||||
@@ -26,12 +26,12 @@ return{
|
||||
{name="solo_l", x=-1200,y=-1000,size=40,shape=1,icon="solo", unlock={"solo_u"}},
|
||||
{name="solo_u", x=-1400,y=-1000,size=40,shape=1,icon="solo"},
|
||||
|
||||
{name="techmino49_e", x=-1100,y=-1200,size=40,shape=1,icon="royale", unlock={"techmino49_h","techmino99_e"}},
|
||||
{name="techmino49_h", x=-1100,y=-1400,size=40,shape=1,icon="royale", unlock={"techmino49_u"}},
|
||||
{name="techmino49_u", x=-1100,y=-1600,size=40,shape=1,icon="royale"},
|
||||
{name="techmino99_e", x=-1300,y=-1400,size=40,shape=1,icon="royale", unlock={"techmino99_h"}},
|
||||
{name="techmino99_h", x=-1300,y=-1600,size=40,shape=1,icon="royale", unlock={"techmino99_u"}},
|
||||
{name="techmino99_u", x=-1300,y=-1800,size=40,shape=1,icon="royale"},
|
||||
{name="techmino49_e", x=-1100,y=-1200,size=40,shape=1,icon="t49", unlock={"techmino49_h","techmino99_e"}},
|
||||
{name="techmino49_h", x=-1100,y=-1400,size=40,shape=1,icon="t49", unlock={"techmino49_u"}},
|
||||
{name="techmino49_u", x=-1100,y=-1600,size=40,shape=1,icon="t49"},
|
||||
{name="techmino99_e", x=-1300,y=-1400,size=40,shape=1,icon="t99", unlock={"techmino99_h"}},
|
||||
{name="techmino99_h", x=-1300,y=-1600,size=40,shape=1,icon="t99", unlock={"techmino99_u"}},
|
||||
{name="techmino99_u", x=-1300,y=-1800,size=40,shape=1,icon="t99"},
|
||||
|
||||
{name="round_e", x=-600, y=-800, size=40,shape=1,icon="round", unlock={"round_n"}},
|
||||
{name="round_n", x=-800, y=-800, size=40,shape=1,icon="round", unlock={"round_h"}},
|
||||
@@ -43,20 +43,20 @@ return{
|
||||
{name="master_advance", x=0, y=-1200,size=40,shape=3,icon="master", unlock={"master_final","GM","master_phantasm"}},
|
||||
{name="master_final", x=0, y=-1600,size=40,shape=2,icon="master"},
|
||||
{name="master_phantasm",x=-150, y=-1500,size=40,shape=2,icon="master"},
|
||||
{name="GM", x=150, y=-1500,size=40,shape=2,icon="master"},
|
||||
{name="GM", x=150, y=-1500,size=40,shape=2,icon="gm"},
|
||||
|
||||
{name="rhythm_e", x=-350, y=-1000,size=40,shape=1,icon="rhythm", unlock={"rhythm_h"}},
|
||||
{name="rhythm_h", x=-350, y=-1200,size=40,shape=3,icon="rhythm", unlock={"rhythm_u"}},
|
||||
{name="rhythm_u", x=-350, y=-1400,size=40,shape=2,icon="rhythm"},
|
||||
|
||||
{name="blind_e", x=150, y=-700, size=40,shape=1,icon="blind", unlock={"blind_n"}},
|
||||
{name="blind_n", x=150, y=-800, size=40,shape=1,icon="blind", unlock={"blind_h"}},
|
||||
{name="blind_h", x=150, y=-900, size=35,shape=1,icon="blind", unlock={"blind_l"}},
|
||||
{name="blind_l", x=150, y=-1000,size=35,shape=3,icon="blind", unlock={"blind_u"}},
|
||||
{name="blind_u", x=150, y=-1100,size=35,shape=3,icon="blind", unlock={"blind_wtf"}},
|
||||
{name="blind_wtf", x=150, y=-1200,size=35,shape=2,icon="blind"},
|
||||
{name="blind_e", x=150, y=-700, size=40,shape=1,icon="hidden", unlock={"blind_n"}},
|
||||
{name="blind_n", x=150, y=-800, size=40,shape=1,icon="hidden", unlock={"blind_h"}},
|
||||
{name="blind_h", x=150, y=-900, size=35,shape=1,icon="hidden", unlock={"blind_l"}},
|
||||
{name="blind_l", x=150, y=-1000,size=35,shape=3,icon="hidden", unlock={"blind_u"}},
|
||||
{name="blind_u", x=150, y=-1100,size=35,shape=3,icon="hidden", unlock={"blind_wtf"}},
|
||||
{name="blind_wtf", x=150, y=-1200,size=35,shape=2,icon="hidden"},
|
||||
|
||||
{name="classic_fast", x=-150, y=-950,size=40,shape=2,icon="classic"},
|
||||
{name="classic_fast", x=-150, y=-950, size=40,shape=2,icon="classic"},
|
||||
|
||||
{name="survivor_e", x=300, y=-600, size=40,shape=1,icon="survivor",unlock={"survivor_n"}},
|
||||
{name="survivor_n", x=500, y=-600, size=40,shape=1,icon="survivor",unlock={"survivor_h","attacker_h","defender_n","dig_h"}},
|
||||
@@ -64,21 +64,21 @@ return{
|
||||
{name="survivor_l", x=900, y=-600, size=40,shape=3,icon="survivor",unlock={"survivor_u"}},
|
||||
{name="survivor_u", x=1100, y=-600, size=40,shape=2,icon="survivor"},
|
||||
|
||||
{name="attacker_h", x=300, y=-800, size=40,shape=1,icon="attacker",unlock={"attacker_u"}},
|
||||
{name="attacker_u", x=300, y=-1000,size=40,shape=1,icon="attacker"},
|
||||
{name="attacker_h", x=300, y=-800, size=40,shape=1,icon="attack", unlock={"attacker_u"}},
|
||||
{name="attacker_u", x=300, y=-1000,size=40,shape=1,icon="attack"},
|
||||
|
||||
{name="defender_n", x=500, y=-800, size=40,shape=1,icon="defender",unlock={"defender_l"}},
|
||||
{name="defender_l", x=500, y=-1000,size=40,shape=1,icon="defender"},
|
||||
{name="defender_n", x=500, y=-800, size=40,shape=1,icon="defend", unlock={"defender_l"}},
|
||||
{name="defender_l", x=500, y=-1000,size=40,shape=1,icon="defend"},
|
||||
|
||||
{name="dig_h", x=700, y=-800, size=40,shape=1,icon="dig", unlock={"dig_u"}},
|
||||
{name="dig_u", x=700, y=-1000,size=40,shape=1,icon="dig"},
|
||||
|
||||
{name="bigbang", x=400, y=-400, size=50,shape=1,icon="bigbang", unlock={"c4wtrain_n","pctrain_n","tech_n"}},
|
||||
{name="c4wtrain_n", x=700, y=-400, size=40,shape=1,icon="c4wtrain",unlock={"c4wtrain_l"}},
|
||||
{name="c4wtrain_l", x=900, y=-400, size=40,shape=1,icon="c4wtrain"},
|
||||
{name="c4wtrain_n", x=700, y=-400, size=40,shape=1,icon="pc",unlock={"c4wtrain_l"}},
|
||||
{name="c4wtrain_l", x=900, y=-400, size=40,shape=1,icon="pc"},
|
||||
|
||||
{name="pctrain_n", x=700, y=-220, size=40,shape=1,icon="pctrain", unlock={"pctrain_l","pc_n"}},
|
||||
{name="pctrain_l", x=900, y=-220, size=40,shape=1,icon="pctrain"},
|
||||
{name="pctrain_n", x=700, y=-220, size=40,shape=1,icon="pc", unlock={"pctrain_l","pc_n"}},
|
||||
{name="pctrain_l", x=900, y=-220, size=40,shape=1,icon="pc"},
|
||||
|
||||
{name="pc_n", x=800, y=-100, size=40,shape=1,icon="pc", unlock={"pc_h"}},
|
||||
{name="pc_h", x=1000, y=-100, size=40,shape=3,icon="pc", unlock={"pc_l"}},
|
||||
@@ -101,7 +101,7 @@ return{
|
||||
{name="zen", x=-800, y=-600, size=40,shape=1,icon="zen", unlock={"ultra","infinite","infinite_dig"}},
|
||||
{name="ultra", x=-1000,y=-400, size=40,shape=1,icon="ultra"},
|
||||
{name="infinite", x=-800, y=-400, size=40,shape=1,icon="infinite"},
|
||||
{name="infinite_dig", x=-1000,y=-600, size=40,shape=1,icon="infinite"},
|
||||
{name="infinite_dig", x=-1000,y=-600, size=40,shape=1,icon="dig"},
|
||||
|
||||
{name="sprintFix"},
|
||||
{name="sprintLock"},
|
||||
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
dropPiece=score,
|
||||
task=function(P)
|
||||
while true do
|
||||
coroutine.yield()
|
||||
YIELD()
|
||||
if P.stat.time>=53.5 then
|
||||
P.modeData.point=min(P.modeData.point+16,80)
|
||||
P.modeData.event=sectionName[int(P.modeData.point*.1)+1]
|
||||
|
||||
@@ -7,7 +7,7 @@ return{
|
||||
pushSpeed=2,
|
||||
task=function(P)
|
||||
while true do
|
||||
coroutine.yield()
|
||||
YIELD()
|
||||
if P.control and SCN.cur=="play"and P.atkBuffer.sum==0 then
|
||||
local p=#P.atkBuffer+1
|
||||
local B,D=P.atkBuffer,P.modeData
|
||||
@@ -49,7 +49,7 @@ return{
|
||||
mText(drawableText.nextWave,69,380)
|
||||
end,
|
||||
score=function(P)return{P.modeData.event,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.event
|
||||
|
||||
@@ -6,7 +6,7 @@ return{
|
||||
freshLimit=15,
|
||||
task=function(P)
|
||||
while true do
|
||||
coroutine.yield()
|
||||
YIELD()
|
||||
if P.control and SCN.cur=="play"and P.atkBuffer.sum<4 then
|
||||
local p=#P.atkBuffer+1
|
||||
local B,D=P.atkBuffer,P.modeData
|
||||
@@ -60,7 +60,7 @@ return{
|
||||
mText(drawableText.nextWave,69,380)
|
||||
end,
|
||||
score=function(P)return{P.modeData.event,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.event
|
||||
|
||||
@@ -21,7 +21,7 @@ return{
|
||||
mStr(P.stat.clears[4],69,340)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -27,7 +27,7 @@ return{
|
||||
gc.draw(IMG.electric,124,106,0,2.6)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -28,7 +28,7 @@ return{
|
||||
gc.draw(IMG.electric,124,106,0,2.6)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
gc.draw(IMG.electric,124,106,0,2.6)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -27,7 +27,7 @@ return{
|
||||
gc.draw(IMG.electric,124,106,0,2.6)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -56,7 +56,7 @@ return{
|
||||
mStr(P.stat.clears[4],69,340)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,40),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -60,7 +60,7 @@ return{
|
||||
mText(drawableText.maxcmb,69,450)
|
||||
end,
|
||||
score=function(P)return{min(P.modeData.point,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Combo "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Combo "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.modeData.point
|
||||
|
||||
@@ -58,7 +58,7 @@ return{
|
||||
mText(drawableText.maxcmb,69,450)
|
||||
end,
|
||||
score=function(P)return{min(P.modeData.point,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Combo "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Combo "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -57,12 +57,12 @@ return{
|
||||
mStr(P.stat.row,69,225)
|
||||
mText(drawableText.line,69,290)
|
||||
if P.modeData.event==0 then
|
||||
local m=puzzleMark
|
||||
local mark=TEXTURE.puzzleMark
|
||||
local F=FIELD[P.modeData.point+1]
|
||||
for y=1,20 do for x=1,10 do
|
||||
local T=F[y][x]
|
||||
if T~=0 then
|
||||
gc.draw(m[T],150+30*x-30+dx,600-30*y+dy)
|
||||
gc.draw(mark[T],150+30*x-30+dx,600-30*y+dy)
|
||||
end
|
||||
end end
|
||||
end
|
||||
|
||||
@@ -9,7 +9,7 @@ return{
|
||||
pushSpeed=2,
|
||||
task=function(P)
|
||||
while true do
|
||||
coroutine.yield()
|
||||
YIELD()
|
||||
if P.control and SCN.cur=="play"then
|
||||
local D=P.modeData
|
||||
D.counter=D.counter+1
|
||||
@@ -55,7 +55,7 @@ return{
|
||||
mText(drawableText.rpm,69,380)
|
||||
end,
|
||||
score=function(P)return{P.modeData.event,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.event
|
||||
|
||||
@@ -9,7 +9,7 @@ return{
|
||||
pushSpeed=1,
|
||||
task=function(P)
|
||||
while true do
|
||||
coroutine.yield()
|
||||
YIELD()
|
||||
if P.control and SCN.cur=="play"then
|
||||
local D=P.modeData
|
||||
D.counter=D.counter+1
|
||||
@@ -55,7 +55,7 @@ return{
|
||||
mText(drawableText.rpm,69,380)
|
||||
end,
|
||||
score=function(P)return{P.modeData.event,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Waves "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local W=P.modeData.event
|
||||
|
||||
@@ -27,7 +27,7 @@ return{
|
||||
mStr(100-P.stat.dig,69,265)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<100 then return end
|
||||
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
mStr(10-P.stat.dig,69,265)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<10 then return end
|
||||
|
||||
@@ -27,7 +27,7 @@ return{
|
||||
mStr(400-P.stat.dig,69,265)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<400 then return end
|
||||
|
||||
@@ -27,7 +27,7 @@ return{
|
||||
mStr(40-P.stat.dig,69,265)
|
||||
end,
|
||||
score=function(P)return{P.stat.time,P.stat.piece}end,
|
||||
scoreDisp=function(D)return toTime(D[1]).." "..D[2].." Pieces"end,
|
||||
scoreDisp=function(D)return TIMESTR(D[1]).." "..D[2].." Pieces"end,
|
||||
comp=function(a,b)return a[1]<b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
if P.stat.dig<40 then return end
|
||||
|
||||
@@ -6,7 +6,7 @@ return{
|
||||
freshLimit=15,
|
||||
task=function(P)
|
||||
while true do
|
||||
coroutine.yield()
|
||||
YIELD()
|
||||
if P.control and SCN.cur=="play"then
|
||||
local D=P.modeData
|
||||
D.counter=D.counter+1
|
||||
|
||||
@@ -5,7 +5,7 @@ return{
|
||||
freshLimit=15,
|
||||
task=function(P)
|
||||
while true do
|
||||
coroutine.yield()
|
||||
YIELD()
|
||||
if P.control and SCN.cur=="play"then
|
||||
local D=P.modeData
|
||||
D.counter=D.counter+1
|
||||
|
||||
@@ -107,15 +107,15 @@ return{
|
||||
mStr(R>=0 and R or 0,69,265)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
if L>=100 then
|
||||
local T=P.stat.time
|
||||
return
|
||||
T<=100 and 5 or
|
||||
T<=120 and 4 or
|
||||
T<=110 and 5 or
|
||||
T<=126 and 4 or
|
||||
T<=160 and 3 or
|
||||
T<=240 and 2 or
|
||||
1
|
||||
|
||||
@@ -21,7 +21,7 @@ return{
|
||||
mStr(R>=0 and R or 0,69,265)
|
||||
end,
|
||||
score=function(P)return{min(P.stat.row,100),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -33,7 +33,7 @@ return{
|
||||
infHold=true,
|
||||
dropPiece=check_rise,
|
||||
pushSpeed=1.2,
|
||||
bg="wing",bgm="infinite",
|
||||
bg="wing",bgm="dream",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1)
|
||||
|
||||
@@ -6,7 +6,7 @@ return{
|
||||
env={
|
||||
noTele=true,
|
||||
wait=8,fall=20,
|
||||
target=10,dropPiece=function (P)
|
||||
target=10,dropPiece=function(P)
|
||||
if P.combo>1 or P.b2b>0 or P.lastPiece.row>1 then
|
||||
if P.combo>1 then P:showText("2x",0,-220,40,"flicker",.3)end
|
||||
if P.b2b>0 then P:showText("spin",0,-160,40,"flicker",.3)end
|
||||
|
||||
@@ -37,7 +37,7 @@ return{
|
||||
gc.rectangle("fill",25,375,90,4)
|
||||
end,
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -33,7 +33,7 @@ return{
|
||||
gc.rectangle("fill",25,375,90,4)
|
||||
end,
|
||||
score=function(P)return{math.min(P.stat.row,200),P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Lines "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local L=P.stat.row
|
||||
|
||||
@@ -63,7 +63,7 @@ return{
|
||||
gc.rectangle("fill",25,375,90,4)
|
||||
end,
|
||||
score=function(P)return{P.modeData.point,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].."P "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].."P "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)
|
||||
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
|
||||
end,
|
||||
|
||||
@@ -65,7 +65,7 @@ return{
|
||||
gc.rectangle("fill",25,375,90,4)
|
||||
end,
|
||||
score=function(P)return{P.modeData.point,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].."P "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].."P "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)
|
||||
return a[1]>b[1]or(a[1]==b[1]and a[2]<b[2])
|
||||
end,
|
||||
|
||||
@@ -62,7 +62,7 @@ return{
|
||||
gc.rectangle("fill",25,375,90,4)
|
||||
end,
|
||||
score=function(P)return{P.modeData.point,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].."P "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].."P "..TIMESTR(D[2])end,
|
||||
comp=function(a,b)return a[1]>b[1]or a[1]==b[1]and a[2]<b[2]end,
|
||||
getRank=function(P)
|
||||
local S=P.modeData.point
|
||||
|
||||