Compare commits
25 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5e45d65289 | ||
|
|
902d0519de | ||
|
|
f1ada720ec | ||
|
|
109da7d249 | ||
|
|
03d600c819 | ||
|
|
ffa7ce406b | ||
|
|
591f588911 | ||
|
|
74cd63acff | ||
|
|
30fffd6908 | ||
|
|
243a663ee6 | ||
|
|
c9124bea42 | ||
|
|
2b10439788 | ||
|
|
cd0d83cf2a | ||
|
|
c506de8b5b | ||
|
|
f3b47eb0f2 | ||
|
|
74d0b8b92c | ||
|
|
8e4d6e2bda | ||
|
|
364c9ba559 | ||
|
|
859daa5908 | ||
|
|
5ec14a7cc1 | ||
|
|
2f21dece58 | ||
|
|
7384db5d52 | ||
|
|
fefc1ce8df | ||
|
|
64374aed81 | ||
|
|
4cb2dbad3b |
@@ -24,13 +24,27 @@ local BGM={
|
||||
--playing=[src:playing SRC]
|
||||
}
|
||||
BGM.list={
|
||||
"blank",
|
||||
"race","push","way","reason",
|
||||
"newera","oxygen","infinite","down",
|
||||
"secret7th","secret8th",
|
||||
"waterfall","shining terminal","distortion","far",
|
||||
"rockblock","cruelty","final","8-bit happiness","end",
|
||||
"how feeling",
|
||||
"blank",--menu
|
||||
"race",--sprint, solo
|
||||
"infinite",--infinite norm/dig, ultra, zen, tech-finesse
|
||||
"push",--marathon, round, tsd, blind-5/6
|
||||
"way",--dig sprint
|
||||
"reason",--drought, blind-1/2/3/4
|
||||
|
||||
"secret8th",--master-1, survivor-2
|
||||
"secret7th",--master-2, survivor-3
|
||||
"waterfall",--sprint Penta/MPH
|
||||
"newera",--bigbang, pc challenge, survivor-1, tech-normal
|
||||
"oxygen",--c4w/pc train
|
||||
|
||||
"distortion",--master-3
|
||||
"far",--GM
|
||||
"shining terminal",--attacker
|
||||
"storm",--defender, survivor-4/5
|
||||
"down",--dig, tech-hard/lunatic
|
||||
|
||||
"rockblock",--classic, 49/99
|
||||
"cruelty","final","8-bit happiness","end","how feeling",--49/99
|
||||
}
|
||||
BGM.len=#BGM.list
|
||||
function BGM.loadOne(N)
|
||||
|
||||
@@ -119,9 +119,9 @@ local langList={
|
||||
"接收/抵消/上涨:",
|
||||
"挖掘/挖掘攻击:",
|
||||
"效率/挖掘效率:",
|
||||
"多余操作/极简率:",
|
||||
"满贯/大满贯:",
|
||||
"全/半清:",
|
||||
"多余操作/最大极简连锁/极简率:",
|
||||
},
|
||||
help={
|
||||
"既然你能玩到这个游戏,应该也不需要什么帮助吧?",
|
||||
@@ -671,9 +671,9 @@ local langList={
|
||||
"接收/抵消/上涨:",
|
||||
"挖掘/挖掘攻击:",
|
||||
"效率/挖掘效率:",
|
||||
"多余操作/极简率:",
|
||||
"满贯/大满贯:",
|
||||
"全/半清:",
|
||||
"多余操作/最大极简连锁/极简率:",
|
||||
},
|
||||
help={
|
||||
"既然你能玩到这个游戏,应该也不需要什么帮助吧?",
|
||||
@@ -1218,9 +1218,9 @@ local langList={
|
||||
"Recv./Res./Asc.:",
|
||||
"Dig/Dig Atk.:",
|
||||
"Eff./Dig Eff.:",
|
||||
"Finesse Errs./Rate:",
|
||||
"B2B/B3B:",
|
||||
"PC/HPC:",
|
||||
"FnsErrs./maxFnsChain/FnsRate:",
|
||||
},
|
||||
help={
|
||||
"Now you can play this, you are probabaly do not need \"help\"?",
|
||||
@@ -1765,9 +1765,9 @@ local langList={
|
||||
"←/-↓/↑:",
|
||||
"↓/↓→.:",
|
||||
"^%/↓^%:",
|
||||
"!#!X/%:",
|
||||
"^/^^:",
|
||||
"#<>#/<>:",
|
||||
"!#!X/^#^/%:",
|
||||
},
|
||||
help={
|
||||
"□□□□~~~, ?_?x ?",
|
||||
@@ -2312,9 +2312,9 @@ local langList={
|
||||
"接收/抵消/上涨:",
|
||||
"挖掘/挖掘攻击:",
|
||||
"效率/挖掘效率:",
|
||||
"多余操作/极简率:",
|
||||
"牛逼/很牛逼:",
|
||||
"消光/消半截:",
|
||||
"多余操作/最大极简连击/极简率:",
|
||||
},
|
||||
help={
|
||||
"既然你能玩到这个游戏,应该也不需要什么帮助吧?",
|
||||
|
||||
@@ -2,6 +2,66 @@ local gc=love.graphics
|
||||
local int=math.floor
|
||||
local sub,find,format=string.sub,string.find,string.format
|
||||
|
||||
do--LOADLIB
|
||||
local libName={
|
||||
CC={
|
||||
Windows="CCloader",
|
||||
Linux="CCloader",
|
||||
Android="libCCloader.so",
|
||||
libFunc="luaopen_CCloader",
|
||||
},
|
||||
NETlib={
|
||||
Windows="client",
|
||||
Linux="client",
|
||||
Android="client.so",
|
||||
libFunc="client",
|
||||
},
|
||||
}
|
||||
function LOADLIB(name)
|
||||
local libName=libName[name]
|
||||
if system=="Windows"or system=="Linux"then
|
||||
local success,message=require(libName[system])
|
||||
if success then
|
||||
LOG.print(name.." load successfully","warn",color.green)
|
||||
else
|
||||
LOG.print("Cannot load "..name..": "..message,"warn",color.red)
|
||||
end
|
||||
elseif system=="Android"then
|
||||
local fs=love.filesystem
|
||||
local platform={"arm64-v8a","armeabi-v7a"}
|
||||
local libFunc
|
||||
for i=1,#platform do
|
||||
local soFile,size=fs.read("data","libAndroid/"..platform[i].."/"..libName.Android)
|
||||
if soFile then
|
||||
local success,message=fs.write(libName.Android,soFile,size)
|
||||
if success then
|
||||
libFunc,message=package.loadlib(table.concat({fs.getSaveDirectory(),libName.Android},"/"),libName.libFunc)
|
||||
if libFunc then
|
||||
LOG.print(name.." lib loaded","warn",color.green)
|
||||
break
|
||||
else
|
||||
LOG.print("Cannot load "..name..": "..message,"warn",color.red)
|
||||
end
|
||||
else
|
||||
LOG.print("Write "..name.."-"..platform[i].." to saving failed: "..message,"warn",color.red)
|
||||
end
|
||||
else
|
||||
LOG.print("Read "..name.."-"..platform[i].." failed","warn",color.red)
|
||||
end
|
||||
end
|
||||
if not libFunc then
|
||||
LOG.print("failed to load "..name,"warn",color.red)
|
||||
return
|
||||
end
|
||||
LOG.print(name.." load successfully","warn",color.green)
|
||||
libFunc()
|
||||
else
|
||||
LOG.print("No "..name.." for "..system,"warn",color.red)
|
||||
return
|
||||
end
|
||||
return true
|
||||
end
|
||||
end
|
||||
do--setFont
|
||||
local newFont=gc.setNewFont
|
||||
local setNewFont=gc.setFont
|
||||
@@ -25,7 +85,6 @@ do--setFont
|
||||
end
|
||||
else
|
||||
function setFont(s)
|
||||
local f=fontCache[s]
|
||||
if s~=currentFontSize then
|
||||
if not fontCache[s]then
|
||||
fontCache[s]=newFont(s)
|
||||
@@ -92,17 +151,34 @@ do--dumpTable
|
||||
end
|
||||
do--HTTPrequest
|
||||
local http=require("socket.http")
|
||||
function HTTPrequest(url)
|
||||
function HTTPrequest(url,method)
|
||||
local data={}
|
||||
local res,code,response_headers,response_body=http.request{
|
||||
url=url,
|
||||
sink=ltn12.sink.table(data)
|
||||
sink=ltn12.sink.table(data),
|
||||
method=method or"GET",
|
||||
}
|
||||
if code~=200 then
|
||||
LOG.print("NET ERROR: code="..(code or"nil"))
|
||||
end
|
||||
return data[1]
|
||||
end
|
||||
--[[
|
||||
LOADLIB("NETlib")
|
||||
function HTTPrequest(url,method)
|
||||
local task,err=client.httpraw{
|
||||
url=url,
|
||||
method=method,
|
||||
-- header={},
|
||||
-- body="",
|
||||
}
|
||||
if not err then
|
||||
TASK.new(TICK.httpRequest,{code=task,time=0})
|
||||
else
|
||||
LOG.print("NET error: "..err,"error")
|
||||
end
|
||||
end
|
||||
]]
|
||||
end
|
||||
do--json
|
||||
--
|
||||
|
||||
@@ -87,7 +87,7 @@ local CUSlist={
|
||||
life={0,1,2,3,5,10,15,26,42,87,500},
|
||||
pushSpeed={1,2,3,5,15},
|
||||
bg={"none","bg1","bg2","rainbow","rainbow2","glow","rgb","aura","wing","matrix","space"},
|
||||
bgm={"blank","race","push","way","reason","newera","oxygen","infinite","down","secret7th","secret8th","rockblock","cruelty","final"},
|
||||
bgm=BGM.list,
|
||||
}
|
||||
--Lambda Funcs for widgets,delete at file end
|
||||
local function CUSval(k) return function() return customEnv[k] end end
|
||||
@@ -621,7 +621,7 @@ local Widgets={
|
||||
newButton({name="back", x=640, y=600,w=170,h=80,color="white",font=35,code=BACK}),
|
||||
},
|
||||
dict={
|
||||
newKey({name="link", x=740,y=60,w=200,h=80,color="white",font=35,code=pressKey("link")}),
|
||||
newKey({name="link", x=740,y=60,w=200,h=80,color="white",font=35,code=pressKey("link"),hide=function()return not sceneTemp.url end}),
|
||||
newKey({name="keyboard", x=960,y=60,w=200,h=80,color="white",font=35,code=pressKey("kb"),hide=function()return not sceneTemp.select end}),
|
||||
newButton({name="back", x=1165,y=60,w=170,h=80,color="white",font=40,code=BACK}),
|
||||
newKeyboard({name="kb", x=310,y=325,w=940,h=370,hide=function()return sceneTemp.hideKB end}),
|
||||
|
||||
2
conf.lua
2
conf.lua
@@ -1,4 +1,4 @@
|
||||
gameVersion="Alpha V0.11.2"
|
||||
gameVersion="Alpha V0.11.3"
|
||||
love.setDeprecationOutput(false)
|
||||
function love.conf(t)
|
||||
t.identity="Techmino"--Saving folder
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
4
main.lua
4
main.lua
@@ -195,6 +195,10 @@ do
|
||||
S.spin[i][6]=0
|
||||
end
|
||||
end
|
||||
if S.extraRate then
|
||||
S.finesseRate=S.extraRate
|
||||
end
|
||||
if fs.getInfo("bigbang.dat")then fs.remove("bigbang.dat")end
|
||||
if S.version~=gameVersion then
|
||||
S.version=gameVersion
|
||||
newVersionLaunch=true
|
||||
|
||||
@@ -38,7 +38,7 @@ return{
|
||||
PLY.newPlayer(1,340,15)
|
||||
players[1].modeData.event="M7"
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
mText(drawableText.line,69,370)
|
||||
mText(drawableText.techrash,69,490)
|
||||
mText(drawableText.grade,69,240)
|
||||
|
||||
@@ -40,7 +40,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(55)
|
||||
mStr(P.modeData.event,69,270)
|
||||
mStr("22",69,390)
|
||||
|
||||
@@ -49,7 +49,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(55)
|
||||
mStr(P.modeData.event,69,270)
|
||||
mStr(
|
||||
|
||||
@@ -19,9 +19,9 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
score=function(P)return{P.modeData.event,P.stat.extraRate}end,
|
||||
score=function(P)return{P.modeData.event,P.stat.finesseRate*25/P.stat.piece}end,
|
||||
scoreDisp=function(D)return D[1].."Stage "..format("%.2f",D[2]).."%"end,
|
||||
comp=function(a,b)return a[1]>b[1]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
|
||||
return
|
||||
|
||||
@@ -13,7 +13,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
mText(drawableText.line,69,370)
|
||||
mText(drawableText.techrash,69,490)
|
||||
setFont(75)
|
||||
|
||||
@@ -17,7 +17,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
mText(drawableText.line,69,370)
|
||||
mText(drawableText.techrash,69,490)
|
||||
setFont(75)
|
||||
|
||||
@@ -18,7 +18,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
mText(drawableText.line,69,370)
|
||||
mText(drawableText.techrash,69,490)
|
||||
setFont(75)
|
||||
|
||||
@@ -14,7 +14,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
mText(drawableText.line,69,370)
|
||||
mText(drawableText.techrash,69,490)
|
||||
setFont(75)
|
||||
|
||||
@@ -11,13 +11,13 @@ return{
|
||||
dropPiece=PLY.check_lineReach,
|
||||
freshLimit=15,
|
||||
target=200,
|
||||
bg="rgb",bgm="way",
|
||||
bg="rgb",bgm="push",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
mText(drawableText.line,69,370)
|
||||
mText(drawableText.techrash,69,490)
|
||||
setFont(75)
|
||||
|
||||
@@ -12,7 +12,7 @@ return{
|
||||
dropPiece=PLY.check_lineReach,
|
||||
freshLimit=15,
|
||||
target=100,
|
||||
bg="none",bgm="way",
|
||||
bg="none",bgm="push",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
@@ -21,7 +21,7 @@ return{
|
||||
LOG.print(text.switchSpawnSFX,color.yellow)
|
||||
end
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
if not game.result then
|
||||
if game.replaying then
|
||||
gc.setColor(.3,.3,.3,.7)
|
||||
|
||||
@@ -44,7 +44,7 @@ return{
|
||||
elseif r==6 then F[1][7],F[1][6],F[1][5]=13,13,13
|
||||
end
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(P.combo,69,380)
|
||||
mStr(P.modeData.point,69,470)
|
||||
|
||||
@@ -42,7 +42,7 @@ return{
|
||||
elseif r==6 then F[1][7],F[1][6],F[1][5]=13,13,13
|
||||
end
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(P.combo,69,380)
|
||||
mStr(P.modeData.point,69,470)
|
||||
|
||||
@@ -32,7 +32,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(75)
|
||||
local r=P.gameEnv.target*.1
|
||||
mStr(r<11 and 18 or r<22 and r+8 or r==22 and"00"or r==23 and"0a"or format("%x",r*10-220),69,280)
|
||||
|
||||
@@ -51,7 +51,7 @@ return{
|
||||
modeEnv.bg=customEnv.bg
|
||||
modeEnv.bgm=customEnv.bgm
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(55)
|
||||
if P.gameEnv.target>1e10 then
|
||||
mStr(P.stat.row,69,295)
|
||||
|
||||
@@ -37,17 +37,17 @@ return{
|
||||
end
|
||||
end
|
||||
end,
|
||||
bg="rainbow2",bgm="down",
|
||||
bg="rainbow2",bgm="storm",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(55)
|
||||
mStr(P.modeData.event,69,270)
|
||||
mStr(P.modeData.point,69,390)
|
||||
mText(drawableText.wave,69,350)
|
||||
mText(drawableText.wave,69,330)
|
||||
mText(drawableText.rpm,69,450)
|
||||
end,
|
||||
score=function(P)return{P.modeData.event,P.stat.time}end,
|
||||
|
||||
@@ -37,17 +37,17 @@ return{
|
||||
end
|
||||
end
|
||||
end,
|
||||
bg="rainbow2",bgm="way",
|
||||
bg="rainbow2",bgm="storm",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(55)
|
||||
mStr(P.modeData.event,69,270)
|
||||
mStr(P.modeData.point,69,390)
|
||||
mText(drawableText.wave,69,350)
|
||||
mText(drawableText.wave,69,330)
|
||||
mText(drawableText.rpm,69,450)
|
||||
end,
|
||||
score=function(P)return{P.modeData.event,P.stat.time}end,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
local function check_rise(P)
|
||||
if P.stat.dig==10 then
|
||||
P:win()
|
||||
P:win("finish")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -27,7 +27,7 @@ return{
|
||||
scoreDisp=function(D)return toTime(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.row<10 then return end
|
||||
if P.stat.dig<10 then return end
|
||||
local T=P.stat.time
|
||||
return
|
||||
T<=7 and 5 or
|
||||
|
||||
@@ -3,7 +3,7 @@ local function check_rise(P)
|
||||
P:garbageRise(13,1,P:RND(10))
|
||||
end
|
||||
if P.stat.dig==100 then
|
||||
P:win()
|
||||
P:win("finish")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -30,7 +30,7 @@ return{
|
||||
scoreDisp=function(D)return toTime(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.row<10 then return end
|
||||
if P.stat.dig<100 then return end
|
||||
local T=P.stat.time
|
||||
return
|
||||
T<=120 and 5 or
|
||||
|
||||
@@ -3,7 +3,7 @@ local function check_rise(P)
|
||||
P:garbageRise(13,1,P:RND(10))
|
||||
end
|
||||
if P.stat.dig==40 then
|
||||
P:win()
|
||||
P:win("finish")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -30,7 +30,7 @@ return{
|
||||
scoreDisp=function(D)return toTime(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.row<10 then return end
|
||||
if P.stat.dig<40 then return end
|
||||
local T=P.stat.time
|
||||
return
|
||||
T<=50 and 5 or
|
||||
|
||||
@@ -3,7 +3,7 @@ local function check_rise(P)
|
||||
P:garbageRise(13,1,P:RND(10))
|
||||
end
|
||||
if P.stat.dig==400 then
|
||||
P:win()
|
||||
P:win("finish")
|
||||
end
|
||||
end
|
||||
|
||||
@@ -30,7 +30,7 @@ return{
|
||||
scoreDisp=function(D)return toTime(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.row<10 then return end
|
||||
if P.stat.dig<400 then return end
|
||||
local T=P.stat.time
|
||||
return
|
||||
T<=540 and 5 or
|
||||
|
||||
@@ -16,13 +16,13 @@ return{
|
||||
D.event=D.event+1
|
||||
end
|
||||
end,
|
||||
bg="bg2",bgm="way",
|
||||
bg="bg2",bgm="down",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(65)
|
||||
mStr(P.modeData.event,69,380)
|
||||
mText(drawableText.wave,69,445)
|
||||
|
||||
@@ -21,7 +21,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(65)
|
||||
mStr(P.modeData.event,69,380)
|
||||
mText(drawableText.wave,69,445)
|
||||
|
||||
@@ -101,7 +101,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(70)
|
||||
local R=100-P.stat.row
|
||||
mStr(R>=0 and R or 0,69,335)
|
||||
|
||||
@@ -15,7 +15,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(70)
|
||||
local R=100-P.stat.row
|
||||
mStr(R>=0 and R or 0,69,335)
|
||||
|
||||
@@ -9,7 +9,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(format("%.1f",P.stat.atk),69,260)
|
||||
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
|
||||
|
||||
@@ -42,7 +42,7 @@ return{
|
||||
P:garbageRise(13,1,P:RND(10))
|
||||
end
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(P.stat.dig,69,260)
|
||||
mStr(P.stat.atk,69,380)
|
||||
|
||||
@@ -28,7 +28,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(P.stat.row,69,390)
|
||||
mStr(P.modeData.event*100+100,69,440)
|
||||
|
||||
@@ -27,7 +27,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(P.stat.row,69,390)
|
||||
mStr(P.modeData.point+10,69,440)
|
||||
|
||||
@@ -55,7 +55,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(P.modeData.point,69,390)
|
||||
mStr((P.modeData.event+1)*100,69,440)
|
||||
|
||||
@@ -57,7 +57,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(P.modeData.point,69,390)
|
||||
mStr((P.modeData.event+1)*100,69,440)
|
||||
|
||||
@@ -54,7 +54,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(P.modeData.point,69,390)
|
||||
mStr((P.modeData.event+1)*100,69,440)
|
||||
|
||||
@@ -13,7 +13,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
local R=100-P.stat.row
|
||||
mStr(R>=0 and R or 0,69,320)
|
||||
|
||||
@@ -13,7 +13,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
local R=100-P.stat.row
|
||||
mStr(R>=0 and R or 0,69,320)
|
||||
|
||||
@@ -12,7 +12,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
local R=100-P.stat.row
|
||||
mStr(R>=0 and R or 0,69,320)
|
||||
|
||||
@@ -65,7 +65,7 @@ return{
|
||||
PLY.newPlayer(1,340,15)
|
||||
newPC(players[1])
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(75)
|
||||
mStr(P.stat.pc,69,400)
|
||||
mText(drawableText.pc,69,482)
|
||||
|
||||
@@ -56,7 +56,7 @@ return{
|
||||
PLY.newPlayer(1,340,15)
|
||||
newPC(players[1])
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(75)
|
||||
mStr(P.stat.pc,69,400)
|
||||
mText(drawableText.pc,69,482)
|
||||
|
||||
@@ -24,9 +24,9 @@ return{
|
||||
return
|
||||
T<=70 and 5 or
|
||||
T<=90 and 4 or
|
||||
T<=110 and 3 or
|
||||
T<=130 and 2 or
|
||||
T<=160 and 1 or
|
||||
T<=120 and 3 or
|
||||
T<=150 and 2 or
|
||||
T<=200 and 1 or
|
||||
0
|
||||
end,
|
||||
}
|
||||
@@ -22,7 +22,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(65)
|
||||
mStr(P.modeData.event,69,380)
|
||||
mText(drawableText.wave,69,445)
|
||||
|
||||
@@ -22,13 +22,13 @@ return{
|
||||
P.modeData.event=P.modeData.event+1
|
||||
end
|
||||
end,
|
||||
bg="glow",bgm="newera",
|
||||
bg="glow",bgm="secret7th",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(65)
|
||||
mStr(P.modeData.event,69,380)
|
||||
mText(drawableText.wave,69,445)
|
||||
|
||||
@@ -17,13 +17,13 @@ return{
|
||||
P.modeData.event=P.modeData.event+1
|
||||
end
|
||||
end,
|
||||
bg="glow",bgm="secret8th",
|
||||
bg="glow",bgm="storm",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(65)
|
||||
mStr(P.modeData.event,69,380)
|
||||
mText(drawableText.wave,69,445)
|
||||
|
||||
@@ -21,13 +21,13 @@ return{
|
||||
P.modeData.event=d
|
||||
end
|
||||
end,
|
||||
bg="glow",bgm="newera",
|
||||
bg="glow",bgm="secret8th",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(65)
|
||||
mStr(P.modeData.event,69,380)
|
||||
mText(drawableText.wave,69,445)
|
||||
|
||||
@@ -23,13 +23,13 @@ return{
|
||||
P.modeData.event=P.modeData.event+1
|
||||
end
|
||||
end,
|
||||
bg="rgb",bgm="secret7th",
|
||||
bg="rgb",bgm="storm",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(65)
|
||||
mStr(P.modeData.event,69,380)
|
||||
mText(drawableText.wave,69,445)
|
||||
|
||||
@@ -15,7 +15,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(format("%.1f",P.stat.atk),69,260)
|
||||
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
|
||||
@@ -23,7 +23,7 @@ return{
|
||||
mText(drawableText.eff,69,433)
|
||||
end,
|
||||
score=function(P)return{P.stat.atk<=200 and int(P.stat.atk)or 200,P.stat.time}end,
|
||||
scoreDisp=function(D)return D[1].." "..toTime(D[2])end,
|
||||
scoreDisp=function(D)return D[1].." Attack "..toTime(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.atk
|
||||
|
||||
@@ -4,6 +4,7 @@ local function tech_check_hard(P)
|
||||
if #P.clearedRow>0 then
|
||||
if not P.lastClear.special then
|
||||
P:lose()
|
||||
return
|
||||
end
|
||||
end
|
||||
if P.stat.atk>=200 then
|
||||
@@ -25,7 +26,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(format("%.1f",P.stat.atk),69,260)
|
||||
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
|
||||
|
||||
@@ -3,8 +3,7 @@ local int=math.floor
|
||||
local function tech_check_easy(P)
|
||||
if #P.clearedRow>0 and P.b2b<40 then
|
||||
P:lose()
|
||||
end
|
||||
if P.stat.atk>=200 then
|
||||
elseif P.stat.atk>=200 then
|
||||
P:win("finish")
|
||||
end
|
||||
end
|
||||
@@ -15,12 +14,12 @@ return{
|
||||
drop=20,lock=60,
|
||||
freshLimit=15,
|
||||
dropPiece=tech_check_easy,
|
||||
bg="matrix",bgm="push",
|
||||
bg="matrix",bgm="down",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(format("%.1f",P.stat.atk),69,260)
|
||||
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
|
||||
|
||||
@@ -4,6 +4,7 @@ local function tech_check_hard(P)
|
||||
if #P.clearedRow>0 then
|
||||
if not(P.lastClear.spin or P.lastClear.pc)then
|
||||
P:lose()
|
||||
return
|
||||
end
|
||||
end
|
||||
if P.stat.atk>=200 then
|
||||
@@ -17,12 +18,12 @@ return{
|
||||
drop=30,lock=60,
|
||||
freshLimit=15,
|
||||
dropPiece=tech_check_hard,
|
||||
bg="matrix",bgm="push",
|
||||
bg="matrix",bgm="down",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(format("%.1f",P.stat.atk),69,260)
|
||||
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
|
||||
|
||||
@@ -3,8 +3,7 @@ local int=math.floor
|
||||
local function tech_check_easy(P)
|
||||
if #P.clearedRow>0 and P.b2b<40 then
|
||||
P:lose()
|
||||
end
|
||||
if P.stat.atk>=200 then
|
||||
elseif P.stat.atk>=200 then
|
||||
P:win("finish")
|
||||
end
|
||||
end
|
||||
@@ -20,7 +19,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(format("%.1f",P.stat.atk),69,260)
|
||||
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
|
||||
|
||||
@@ -4,6 +4,7 @@ local function tech_check_hard(P)
|
||||
if #P.clearedRow>0 then
|
||||
if not(P.lastClear.spin or P.lastClear.pc)then
|
||||
P:lose()
|
||||
return
|
||||
end
|
||||
end
|
||||
if P.stat.atk>=200 then
|
||||
@@ -22,7 +23,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(format("%.1f",P.stat.atk),69,260)
|
||||
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
|
||||
|
||||
@@ -3,8 +3,7 @@ local int=math.floor
|
||||
local function tech_check_easy(P)
|
||||
if #P.clearedRow>0 and P.b2b<40 then
|
||||
P:lose()
|
||||
end
|
||||
if P.stat.atk>=200 then
|
||||
elseif P.stat.atk>=200 then
|
||||
P:win("finish")
|
||||
end
|
||||
end
|
||||
@@ -20,7 +19,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(format("%.1f",P.stat.atk),69,260)
|
||||
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
|
||||
|
||||
@@ -4,6 +4,7 @@ local function tech_check_hard(P)
|
||||
if #P.clearedRow>0 then
|
||||
if not(P.lastClear.spin or P.lastClear.pc)then
|
||||
P:lose()
|
||||
return
|
||||
end
|
||||
end
|
||||
if P.stat.atk>=200 then
|
||||
@@ -22,7 +23,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(45)
|
||||
mStr(format("%.1f",P.stat.atk),69,260)
|
||||
mStr(format("%.2f",P.stat.atk/P.stat.row),69,380)
|
||||
|
||||
@@ -56,7 +56,7 @@ return{
|
||||
n=n+1
|
||||
end end
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(35)
|
||||
mStr(#players.alive.."/49",69,245)
|
||||
mStr(P.modeData.point,80,285)
|
||||
|
||||
@@ -56,7 +56,7 @@ return{
|
||||
n=n+1
|
||||
end end
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(35)
|
||||
mStr(#players.alive.."/49",69,245)
|
||||
mStr(P.modeData.point,80,285)
|
||||
|
||||
@@ -56,7 +56,7 @@ return{
|
||||
n=n+1
|
||||
end end
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(35)
|
||||
mStr(#players.alive.."/49",69,245)
|
||||
mStr(P.modeData.point,80,285)
|
||||
|
||||
@@ -56,7 +56,7 @@ return{
|
||||
n=n+1
|
||||
end end
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(35)
|
||||
mStr(#players.alive.."/99",69,245)
|
||||
mStr(P.modeData.point,80,285)
|
||||
|
||||
@@ -56,7 +56,7 @@ return{
|
||||
n=n+1
|
||||
end end
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(35)
|
||||
mStr(#players.alive.."/99",69,245)
|
||||
mStr(P.modeData.point,80,285)
|
||||
|
||||
@@ -56,7 +56,7 @@ return{
|
||||
n=n+1
|
||||
end end
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(35)
|
||||
mStr(#players.alive.."/99",69,245)
|
||||
mStr(P.modeData.point,80,285)
|
||||
|
||||
@@ -16,12 +16,12 @@ return{
|
||||
oncehold=false,
|
||||
dropPiece=check_tsd,
|
||||
ospin=false,
|
||||
bg="matrix",bgm="reason",
|
||||
bg="matrix",bgm="push",
|
||||
},
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(65)
|
||||
mStr(P.modeData.event,69,320)
|
||||
mText(drawableText.tsd,69,385)
|
||||
|
||||
@@ -16,13 +16,13 @@ return{
|
||||
freshLimit=15,
|
||||
dropPiece=check_tsd,
|
||||
ospin=false,
|
||||
bg="matrix",bgm="reason",
|
||||
bg="matrix",bgm="push",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(65)
|
||||
mStr(P.modeData.event,69,320)
|
||||
mText(drawableText.tsd,69,385)
|
||||
|
||||
@@ -16,13 +16,13 @@ return{
|
||||
freshLimit=15,
|
||||
dropPiece=check_tsd,
|
||||
ospin=false,
|
||||
bg="matrix",bgm="reason",
|
||||
bg="matrix",bgm="push",
|
||||
},
|
||||
pauseLimit=true,
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(65)
|
||||
mStr(P.modeData.event,69,320)
|
||||
mText(drawableText.tsd,69,385)
|
||||
|
||||
@@ -27,7 +27,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
gc.setLineWidth(2)
|
||||
gc.rectangle("line",55,190,32,402)
|
||||
local T=P.stat.time/120
|
||||
|
||||
@@ -9,7 +9,7 @@ return{
|
||||
load=function()
|
||||
PLY.newPlayer(1,340,15)
|
||||
end,
|
||||
mesDisp=function(P,dx,dy)
|
||||
mesDisp=function(P)
|
||||
setFont(70)
|
||||
local R=200-P.stat.row
|
||||
mStr(R>=0 and R or 0,69,335)
|
||||
|
||||
55
parts/ai.lua
55
parts/ai.lua
@@ -16,59 +16,7 @@ local Timer=love.timer.getTime
|
||||
local blockPos={4,4,4,4,4,5,4}
|
||||
local scs={{0,1},{0,1},{0,1},{0,1},{0,1},{.5,.5},{-.5,1.5}}
|
||||
-------------------------------------------------Cold clear
|
||||
do
|
||||
local fs=love.filesystem
|
||||
if system=="Windows"then
|
||||
local success,message=require("CCloader")
|
||||
if success then
|
||||
LOG.print("CC load successfully","warn",color.green)
|
||||
else
|
||||
LOG.print("Cannot load CC: "..message,"warn",color.red)
|
||||
end
|
||||
if fs.getInfo("CCloader.dll")then
|
||||
NOGAME="delCC"
|
||||
end
|
||||
elseif system=="Linux"then
|
||||
local success,message=require("CCloader")
|
||||
if success then
|
||||
LOG.print("CC load successfully","warn",color.green)
|
||||
else
|
||||
LOG.print("Cannot load CC: "..message,"warn",color.red)
|
||||
end
|
||||
elseif system=="Android"then
|
||||
local armList={"arm64-v8a","armeabi-v7a"}
|
||||
local libFunc,success,message
|
||||
for i=1,#armList do
|
||||
local CCloader_f,size=fs.read("data","libAndroid/"..armList[i].."/libCCloader.so")
|
||||
if CCloader_f then
|
||||
LOG.print("Read CC-"..armList[i].." successfully","warn",color.green)
|
||||
success,message=fs.write("libCCloader.so",CCloader_f,size)
|
||||
if success then
|
||||
LOG.print("Write CC-"..armList[i].." to saving successfully","warn",color.green)
|
||||
libFunc,message=package.loadlib(table.concat({fs.getSaveDirectory(),"libCCloader.so"},"/"),"luaopen_CCloader")
|
||||
if libFunc then
|
||||
LOG.print("CC lib loaded","warn",color.green)
|
||||
break
|
||||
else
|
||||
LOG.print("Cannot load CC: "..message,"warn",color.red)
|
||||
end
|
||||
else
|
||||
LOG.print("Write CC-"..armList[i].." to saving failed","warn",color.red)
|
||||
end
|
||||
else
|
||||
LOG.print("Read CC-"..armList[i].." failed","warn",color.red)
|
||||
end
|
||||
end
|
||||
if not libFunc then
|
||||
LOG.print("failed to load CC","warn",color.red)
|
||||
goto FAILED
|
||||
end
|
||||
LOG.print("CC load successfully","warn",color.green)
|
||||
libFunc()
|
||||
else
|
||||
LOG.print("No CC for "..system,"warn",color.red)
|
||||
goto FAILED
|
||||
end
|
||||
if LOADLIB("CC")then
|
||||
local CCblockID={6,5,4,3,2,1,0}
|
||||
CC={
|
||||
getConf= cc.get_default_config ,--()options,weights
|
||||
@@ -135,7 +83,6 @@ do
|
||||
collectgarbage()
|
||||
end
|
||||
end
|
||||
::FAILED::
|
||||
-------------------------------------------------9 Stack setup
|
||||
local dirCount={1,1,3,3,3,0,1}
|
||||
local spinOffset={
|
||||
|
||||
@@ -64,7 +64,7 @@ stat={
|
||||
version=gameVersion,
|
||||
run=0,game=0,time=0,
|
||||
key=0,rotate=0,hold=0,
|
||||
extraPiece=0,extraRate=0,
|
||||
extraPiece=0,finesseRate=0,
|
||||
piece=0,row=0,dig=0,
|
||||
atk=0,digatk=0,
|
||||
send=0,recv=0,pend=0,off=0,
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
local L
|
||||
if setting.lang==1 or setting.lang==2 then
|
||||
L={
|
||||
'注意到"旋转"到底对方块做了些什么吗?',
|
||||
"(RUR'U')R'FR2U'R'U'(RUR'F')",
|
||||
"\\196/",
|
||||
"↑↑↓↓←→←→BABA",
|
||||
@@ -17,29 +18,40 @@ if setting.lang==1 or setting.lang==2 then
|
||||
"4+4+4+4+2+2+1=17",
|
||||
"40行世界纪录:15.654s",
|
||||
"626r/s",
|
||||
"把手机调到特殊的日期也不会发生什么的(真的",
|
||||
"报时机器人:新的一天开始了",
|
||||
"本游戏可不是休闲游戏",
|
||||
"本游戏难度上限很高,做好心理准备。",
|
||||
"必须要软降才能放进去的方块一定不会判定你是非极简操作",
|
||||
"别问游戏名怎么取的,问就是随便想的",
|
||||
"不是动画,真的在加载!",
|
||||
"不要盯着bug不放",
|
||||
"不要随意宣传,不要随意宣传,不要随意宣传",
|
||||
"不要向不感兴趣的路人推荐!!!!!!!!",
|
||||
"不要在上课时玩游戏!",
|
||||
"草(日本语)",
|
||||
"茶娘 可爱!",
|
||||
"触摸板打osu是什么体验",
|
||||
"打好块没有捷径,多练。",
|
||||
"大满贯10连击消四全清!",
|
||||
"戴上耳机以获得最佳体验",
|
||||
"单手也能玩!",
|
||||
"低帧率会降低游戏体验",
|
||||
"调到特殊的日期也不会发生什么的",
|
||||
"俄罗斯方块环游记也不错!",
|
||||
"方块默认出现的方向都是重心在下哦",
|
||||
"方块研究所 有一个Nspire-CX版本!",
|
||||
"感觉自己明明按键了但是没反应?你真的按到了吗?",
|
||||
"感谢Phigros,让我抄了一堆tips(",
|
||||
"给别人推荐本游戏的时候请记住我真的不叫铁壳米诺!!!",
|
||||
"更小的DAS和ARR拥有更高的操作上限(前提是你能控制得了)",
|
||||
"还能写些什么tip呢",
|
||||
"合群了就会消失,但是消失不代表没有意义",
|
||||
"很有精神!",
|
||||
"健康小贴士:不要熬夜,真的会猝死",
|
||||
"健康小贴士:玩游戏多眨眼,不然会干眼病",
|
||||
"键位是可以自定义的",
|
||||
"觉得移动速度太慢或太快,手感不好?快去设置调整DAS/ARR",
|
||||
"联网还没做呢,别急",
|
||||
"卖弱禁言警告",
|
||||
"没学过编曲,音乐都是自己凭感觉写的,觉得不好听就设置里关了吧",
|
||||
"没有专业美术的人,程序员审美警告",
|
||||
"每个块的出现方向可以自定义",
|
||||
@@ -48,23 +60,36 @@ if setting.lang==1 or setting.lang==2 then
|
||||
"免费吃鸡方块",
|
||||
"喵!",
|
||||
"魔方好玩!",
|
||||
"你的双手是为了你的一生服务的,而不是Techmino",
|
||||
"你可以从统计页面打开游戏存档目录",
|
||||
"请不要随意宣传,出了事都怪你们",
|
||||
"请不要向对方块不感兴趣的路人推荐此游戏。",
|
||||
"请勿大力敲打设备!敲坏了就没有Techmino玩了",
|
||||
"扫雷好玩!",
|
||||
"少女祈祷中",
|
||||
"使用love2d引擎制作",
|
||||
"适度游戏益脑,沉迷游戏伤身,合理安排时间,享受健康生活",
|
||||
"术语不认识?去帮助-词典里查查吧",
|
||||
"泰拉瑞亚好玩!",
|
||||
"提前旋转等设置可以用来救命",
|
||||
"玩到一半弹出消息框?快去设置禁止弹窗",
|
||||
"为了防止误触,玩到一半重开需要长按重开键",
|
||||
"为了收集Tips一直关游戏就没意思了,要的就是惊喜",
|
||||
"为什么关卡那么少啊!-因为你前一模式成绩连D都没有达到,再加把劲吧~",
|
||||
"我的世界好玩!",
|
||||
"我们的每一条tips都很正经(确信",
|
||||
"我们是不是第一个在方块游戏做tips的?",
|
||||
"无聊翻翻设置是好习惯",
|
||||
"希望极简率没事",
|
||||
"希望你们都能喜欢Z…哦不是,喜欢Techmino",
|
||||
"享受Tech的特色旋转系统!",
|
||||
"新人请千万记住,打好基础,不要太早学那些花里胡哨的。",
|
||||
"旋转不是变形!请尽量灵活利用顺逆时针两个旋转键!",
|
||||
"学会使用两个旋转键,三个更好",
|
||||
"游戏作者40行卡27秒好几个月了...",
|
||||
"有建议的话可以把信息反馈给作者~",
|
||||
"有疑问? 先看设置有没有你想要的",
|
||||
"注意到\"旋转\"到底对方块做了些什么吗?",
|
||||
"在?为什么半夜打块?",
|
||||
"长时间游戏状态会越来越差!玩久了记得放松一下~",
|
||||
"这里的极简判定不松不严,放心软降,小心hold!",
|
||||
"ALLSPIN!",
|
||||
"Alt+F4=关闭当前窗口",
|
||||
"Alt+Tab=切换窗口",
|
||||
@@ -101,11 +126,14 @@ if setting.lang==1 or setting.lang==2 then
|
||||
"STSD必死",
|
||||
"Techmino好玩!",
|
||||
"Techminohaowan",
|
||||
"TechOS?那是什么",
|
||||
"Tetr.io也很好玩!",
|
||||
"Tetr.js也很好玩!",
|
||||
"Tetralegends也很好玩!",
|
||||
"uid:225238922",
|
||||
"VVVVVV好玩!",
|
||||
"Xspin是个啥玩意",
|
||||
"Z块等身抱枕来一个(x",
|
||||
"ZS JL T O I",
|
||||
-- "Z酱 可爱!",
|
||||
}
|
||||
@@ -113,7 +141,7 @@ elseif setting.lang==3 then
|
||||
L={
|
||||
":pog:",
|
||||
"(RUR'U')R'FR2U'R'U'(RUR'F')",
|
||||
"\"Free block game with royale mode\"",
|
||||
'Free block game with royale mode"',
|
||||
"\\jezevec/\\jezevec/\\jezevec/",
|
||||
"\\osk/\\osk/\\osk/",
|
||||
"↑↑↓↓←→←→BABA",
|
||||
@@ -157,7 +185,7 @@ elseif setting.lang==3 then
|
||||
"e^(pi*i/2)=i",
|
||||
"Enjoy Tech. Rotation System!",
|
||||
"Find out what's in the setting!",
|
||||
"Have you noticed what does \"rotating\" do to block?",
|
||||
'Have you noticed what does "rotating" do to block?',
|
||||
"Headphones for better experience",
|
||||
"Hello world!",
|
||||
"Initial Rotation etc. can save your life",
|
||||
|
||||
184
parts/player.lua
184
parts/player.lua
@@ -66,7 +66,7 @@ local PLY={}--Lib
|
||||
--------------------------</LIB>--------------------------
|
||||
|
||||
--------------------------<Update>--------------------------
|
||||
local function updateLine(P,dt)
|
||||
local function updateLine(P,dt)--Attacks, line pushing, cam moving
|
||||
local bf=P.atkBuffer
|
||||
for i=#bf,1,-1 do
|
||||
local A=bf[i]
|
||||
@@ -165,15 +165,17 @@ local function updateTasks(P)
|
||||
end
|
||||
local function Pupdate_alive(P,dt)
|
||||
if P.timing then P.stat.time=P.stat.time+dt end
|
||||
if P.keyRec then
|
||||
if P.keyRec then--Update speeds
|
||||
local _=game.frame
|
||||
|
||||
local v=0
|
||||
for i=2,10 do v=v+i*(i-1)*7.2/(_-P.keyTime[i])end
|
||||
for i=2,10 do v=v+i*(i-1)*7.2/(_-P.keyTime[i]+1)end
|
||||
P.keySpeed=P.keySpeed*.99+v*.1
|
||||
|
||||
v=0
|
||||
for i=2,10 do v=v+i*(i-1)*7.2/(_-P.dropTime[i])end
|
||||
P.dropSpeed=P.dropSpeed*.99+v*.1
|
||||
--Update speeds
|
||||
|
||||
if modeEnv.royaleMode then
|
||||
if P.keyPressing[9]then
|
||||
P.swappingAtkMode=min(P.swappingAtkMode+2,30)
|
||||
@@ -291,7 +293,7 @@ local function Pupdate_alive(P,dt)
|
||||
goto stop
|
||||
else
|
||||
local L=#P.clearingRow
|
||||
if P.human and P.gameEnv.fall>0 and #P.field+L>P.clearingRow[L]then SFX.play("fall")end
|
||||
if P.sound and P.gameEnv.fall>0 and #P.field+L>P.clearingRow[L]then SFX.play("fall")end
|
||||
P.clearingRow={}
|
||||
end
|
||||
end
|
||||
@@ -358,6 +360,9 @@ local function Pupdate_alive(P,dt)
|
||||
else
|
||||
P.b2b1=max(P.b2b1*.95+P.b2b*.05-.6,P.b2b)
|
||||
end
|
||||
if P.finesseComboTime>0 then
|
||||
P.finesseComboTime=P.finesseComboTime-1
|
||||
end
|
||||
updateLine(P,dt)
|
||||
updateFXs(P,dt)
|
||||
updateTasks(P)
|
||||
@@ -376,11 +381,16 @@ local function Pupdate_dead(P,dt)
|
||||
P.falling=P.falling-1
|
||||
if P.falling<0 then
|
||||
local L=#P.clearingRow
|
||||
if P.human and P.gameEnv.fall>0 and #P.field+L>P.clearingRow[L]then SFX.play("fall")end
|
||||
if P.sound and P.gameEnv.fall>0 and #P.field+L>P.clearingRow[L]then SFX.play("fall")end
|
||||
P.clearingRow={}
|
||||
end
|
||||
end
|
||||
if P.b2b1>0 then P.b2b1=max(0,P.b2b1*.92-1)end
|
||||
if P.b2b1>0 then
|
||||
P.b2b1=max(0,P.b2b1*.92-1)
|
||||
end
|
||||
if P.finesseComboTime>0 then
|
||||
P.finesseComboTime=P.finesseComboTime-1
|
||||
end
|
||||
updateLine(P,dt)
|
||||
updateFXs(P,dt)
|
||||
updateTasks(P)
|
||||
@@ -781,7 +791,38 @@ local Pdraw_norm do
|
||||
gc.setColor(1,1,1)
|
||||
gc.draw(drawableText.bpm,540,550)
|
||||
gc.draw(drawableText.kpm,494,643)
|
||||
|
||||
--Score & Time
|
||||
setFont(25)
|
||||
gc.setColor(0,0,0,.3)
|
||||
gc.print(P.score1,18,579)
|
||||
gc.print(format("%.2f",P.stat.time),18,609)
|
||||
|
||||
gc.setColor(color.lYellow)gc.print(P.score1,20,580)
|
||||
gc.setColor(color.sky)gc.print(format("%.2f",P.stat.time),20,610)
|
||||
|
||||
--FinesseCombo
|
||||
if P.finesseCombo>2 then
|
||||
_=P.finesseComboTime
|
||||
local T=P.finesseCombo.."x"
|
||||
if _>0 then
|
||||
gc.setColor(1,1,1,_*.2)
|
||||
gc.print(T,20,640)
|
||||
gc.setColor(1,1,1,1.2-_*.1)
|
||||
gc.push("transform")
|
||||
gc.translate(20,670)
|
||||
gc.scale(1+_*.08)
|
||||
gc.print(T,0,-30)
|
||||
gc.pop()
|
||||
else
|
||||
gc.setColor(1,1,1)
|
||||
gc.print(T,20,640)
|
||||
end
|
||||
end
|
||||
|
||||
--Lives
|
||||
if P.life>0 then
|
||||
gc.setColor(1,1,1)
|
||||
if P.life<=3 then
|
||||
for i=1,P.life do
|
||||
gc.draw(IMG.lifeIcon,450+25*i,665,nil,.8)
|
||||
@@ -793,8 +834,6 @@ local Pdraw_norm do
|
||||
gc.print(P.life,517,665)
|
||||
end
|
||||
end
|
||||
mStr(format("%.2f",P.stat.time),69,588)--Time
|
||||
mStr(P.score1,69,630)--Score
|
||||
|
||||
--Display Ys
|
||||
-- gc.setLineWidth(6)
|
||||
@@ -1026,12 +1065,13 @@ local function getNewStatTable()
|
||||
local T={
|
||||
time=0,score=0,
|
||||
key=0,rotate=0,hold=0,
|
||||
extraPiece=0,extraRate=0,
|
||||
extraPiece=0,finesseRate=0,
|
||||
piece=0,row=0,dig=0,
|
||||
atk=0,digatk=0,
|
||||
send=0,recv=0,pend=0,off=0,
|
||||
clear={},clears={},spin={},spins={},
|
||||
pc=0,hpc=0,b2b=0,b3b=0,
|
||||
maxCombo=0,maxFinesseCombo=0,
|
||||
}
|
||||
for i=1,25 do
|
||||
T.clear[i]={0,0,0,0,0}
|
||||
@@ -1050,8 +1090,8 @@ local function pressKey(P,i)
|
||||
ins(P.keyTime,1,game.frame)
|
||||
P.keyTime[11]=nil
|
||||
end
|
||||
P.stat.key=P.stat.key+1
|
||||
end
|
||||
P.stat.key=P.stat.key+1
|
||||
end
|
||||
end
|
||||
local function releaseKey(P,i)
|
||||
@@ -1070,8 +1110,8 @@ local function pressKey_Rec(P,i)
|
||||
ins(P.keyTime,1,game.frame)
|
||||
P.keyTime[11]=nil
|
||||
end
|
||||
P.stat.key=P.stat.key+1
|
||||
end
|
||||
P.stat.key=P.stat.key+1
|
||||
end
|
||||
end
|
||||
local function releaseKey_Rec(P,i)
|
||||
@@ -1270,8 +1310,6 @@ local prepareSequence do
|
||||
freshPrepare[ENV.sequence](P)
|
||||
P.newNext=freshMethod[ENV.sequence]
|
||||
else
|
||||
print(type(ENV.sequence))
|
||||
print(type(ENV.freshMethod))
|
||||
assert(type(ENV.sequence)=="function"and type(ENV.freshMethod)=="function","wrong sequence generator code")
|
||||
ENV.sequence(P)
|
||||
P.newNext=ENV.freshMethod
|
||||
@@ -1292,7 +1330,7 @@ local function loadAI(P,AIdata)--Load AI params
|
||||
|
||||
next=AIdata.next,
|
||||
hold=AIdata.hold,
|
||||
_20G=ENV._20G,
|
||||
_20G=P._20G,
|
||||
bag=AIdata.bag,
|
||||
node=AIdata.node,
|
||||
}
|
||||
@@ -1407,11 +1445,13 @@ local function newEmptyPlayer(id,x,y,size)
|
||||
P.waiting,P.falling=-1,-1
|
||||
P.clearingRow,P.clearedRow={},{}--Clearing animation height,cleared row mark
|
||||
P.combo,P.b2b=0,0
|
||||
P.finesseCombo=0
|
||||
P.garbageBeneath=0
|
||||
P.fieldBeneath=0
|
||||
P.fieldUp=0
|
||||
|
||||
P.score1,P.b2b1=0,0
|
||||
P.finesseComboTime=0
|
||||
P.dropFX,P.moveFX,P.lockFX,P.clearFX={},{},{},{}
|
||||
P.tasks={}--Tasks
|
||||
P.bonus={}--Texts
|
||||
@@ -1577,20 +1617,6 @@ function player.ckfull(P,i)
|
||||
for j=1,10 do if P.field[i][j]<=0 then return end end
|
||||
return true
|
||||
end
|
||||
function player.finesseError(P,rate)
|
||||
P.stat.extraPiece=P.stat.extraPiece+1
|
||||
P.stat.extraRate=P.stat.extraRate+rate
|
||||
if P.human then
|
||||
if P.gameEnv.fineKill then
|
||||
SFX.play("finesseError_long",.6)
|
||||
P:lose()
|
||||
elseif setting.fine then
|
||||
SFX.play("finesseError",.8)
|
||||
end
|
||||
elseif P.gameEnv.fineKill then
|
||||
P:lose()
|
||||
end
|
||||
end
|
||||
function player.attack(P,R,send,time,...)
|
||||
if setting.atkFX>0 then
|
||||
P:createBeam(R,send,time,...)
|
||||
@@ -1615,7 +1641,7 @@ function player.attack(P,R,send,time,...)
|
||||
}--Sorted insert(by time)
|
||||
B.sum=B.sum+send
|
||||
R.stat.recv=R.stat.recv+send
|
||||
if R.human then
|
||||
if R.sound then
|
||||
SFX.play(send<4 and "blip_1"or"blip_2",min(send+1,5)*.1)
|
||||
end
|
||||
end
|
||||
@@ -1875,7 +1901,7 @@ function player.resetBlock(P)
|
||||
end
|
||||
|
||||
--Spawn SFX
|
||||
if P.human and id<8 then
|
||||
if P.sound and id<8 then
|
||||
SFX.fplay(spawnSFX_name[id],setting.spawn)
|
||||
end
|
||||
end
|
||||
@@ -1914,7 +1940,7 @@ function player.spin(P,d,ifpre)
|
||||
P.freshTime=P.freshTime+1
|
||||
end
|
||||
|
||||
if P.human then
|
||||
if P.sound then
|
||||
SFX.fieldPlay(ifpre and"prerotate"or P:ifoverlap(P.cur.bk,P.curX,P.curY+1)and P:ifoverlap(P.cur.bk,P.curX-1,P.curY)and P:ifoverlap(P.cur.bk,P.curX+1,P.curY)and"rotatekick"or"rotate",nil,P)
|
||||
end
|
||||
P.stat.rotate=P.stat.rotate+1
|
||||
@@ -1931,13 +1957,12 @@ function player.hold(P,ifpre)
|
||||
if not(H or C)then return end
|
||||
|
||||
--Finesse check
|
||||
if H and C and H.id==C.id and H.name==C.name or P.ctrlCount>1 then
|
||||
P:finesseError(1)
|
||||
if not(H and C and H.id==C.id and H.name==C.name or P.ctrlCount>1)then
|
||||
P.ctrlCount=0
|
||||
end
|
||||
|
||||
P.holded=P.gameEnv.oncehold
|
||||
P.spinLast=false
|
||||
P.ctrlCount=0
|
||||
P.spinSeq=0
|
||||
|
||||
P.cur,P.hd=H,C--Swap hold
|
||||
@@ -1972,7 +1997,7 @@ function player.hold(P,ifpre)
|
||||
if P:ifoverlap(P.cur.bk,P.curX,P.curY)then P:lock()P:lose()end
|
||||
end
|
||||
|
||||
if P.human then
|
||||
if P.sound then
|
||||
SFX.play(ifpre and"prehold"or"hold")
|
||||
end
|
||||
P.stat.hold=P.stat.hold+1
|
||||
@@ -2180,9 +2205,7 @@ do--player.drop(P)--Place piece
|
||||
--Final spin check
|
||||
if dospin>0 then
|
||||
if cc>0 then
|
||||
if P.spinLast then
|
||||
dospin=dospin+1
|
||||
end
|
||||
dospin=dospin+(P.spinLast or 0)
|
||||
if dospin<3 then
|
||||
mini=CB.id<6 and cc<P.r
|
||||
end
|
||||
@@ -2251,15 +2274,38 @@ do--player.drop(P)--Place piece
|
||||
end
|
||||
|
||||
--Finesse check (control)
|
||||
local finePts
|
||||
if not finesse then
|
||||
if dospin then P.ctrlCount=P.ctrlCount-2 end--Allow 2 more step for roof-less spin
|
||||
local id=CB.id
|
||||
local d=P.ctrlCount-finesseList[id][P.dir+1][CX]
|
||||
if d>=2 then
|
||||
P:finesseError(2)
|
||||
elseif d>0 then
|
||||
P:finesseError(d)
|
||||
finePts=d<=0 and 4 or max(3-d,0)
|
||||
else
|
||||
finePts=4
|
||||
end
|
||||
|
||||
P.stat.finesseRate=P.stat.finesseRate+finePts
|
||||
if finePts<4 then
|
||||
P.stat.extraPiece=P.stat.extraPiece+1
|
||||
if P.gameEnv.fineKill then
|
||||
P:lose()
|
||||
end
|
||||
if P.sound then
|
||||
if P.gameEnv.fineKill then
|
||||
SFX.play("finesseError_long",.6)
|
||||
elseif setting.fine then
|
||||
SFX.play("finesseError",.8)
|
||||
end
|
||||
end
|
||||
end
|
||||
if finePts<2 then
|
||||
P.finesseCombo=0
|
||||
else
|
||||
P.finesseCombo=P.finesseCombo+1
|
||||
if P.finesseCombo>2 then
|
||||
P.finesseComboTime=12
|
||||
end
|
||||
if P.sound then SFX.fieldPlay("lock",nil,P)end
|
||||
end
|
||||
|
||||
if cc>0 then--If lines cleared, about 200 lines below
|
||||
@@ -2276,7 +2322,7 @@ do--player.drop(P)--Place piece
|
||||
exblock=exblock+1
|
||||
cscore=cscore*2
|
||||
STAT.b3b=STAT.b3b+1
|
||||
if P.human then
|
||||
if P.sound then
|
||||
VOC.play("b3b",CHN)
|
||||
end
|
||||
elseif P.b2b>=50 then
|
||||
@@ -2284,7 +2330,7 @@ do--player.drop(P)--Place piece
|
||||
atk=b2bATK[cc]
|
||||
cscore=cscore*1.2
|
||||
STAT.b2b=STAT.b2b+1
|
||||
if P.human then
|
||||
if P.sound then
|
||||
VOC.play("b2b",CHN)
|
||||
end
|
||||
else
|
||||
@@ -2298,7 +2344,7 @@ do--player.drop(P)--Place piece
|
||||
sendTime=sendTime+60
|
||||
cscore=cscore*.5
|
||||
P.b2b=P.b2b+b2bPoint[cc]*.5
|
||||
if P.human then
|
||||
if P.sound then
|
||||
VOC.play("mini",CHN)
|
||||
end
|
||||
else
|
||||
@@ -2306,7 +2352,7 @@ do--player.drop(P)--Place piece
|
||||
end
|
||||
C.mini=mini
|
||||
C.special=true
|
||||
if P.human then
|
||||
if P.sound then
|
||||
SFX.play(spin_n[cc])
|
||||
VOC.play(spinName[CB.name],CHN)
|
||||
end
|
||||
@@ -2319,7 +2365,7 @@ do--player.drop(P)--Place piece
|
||||
exblock=exblock+1
|
||||
cscore=cscore*1.8
|
||||
STAT.b3b=STAT.b3b+1
|
||||
if P.human then
|
||||
if P.sound then
|
||||
VOC.play("b3b",CHN)
|
||||
end
|
||||
elseif P.b2b>=50 then
|
||||
@@ -2328,7 +2374,7 @@ do--player.drop(P)--Place piece
|
||||
atk=cc+1
|
||||
cscore=cscore*1.3
|
||||
STAT.b2b=STAT.b2b+1
|
||||
if P.human then
|
||||
if P.sound then
|
||||
VOC.play("b2b",CHN)
|
||||
end
|
||||
else
|
||||
@@ -2341,7 +2387,7 @@ do--player.drop(P)--Place piece
|
||||
else
|
||||
C.special=false
|
||||
end
|
||||
if P.human then
|
||||
if P.sound then
|
||||
VOC.play(clearName[cc],CHN)
|
||||
end
|
||||
|
||||
@@ -2359,7 +2405,7 @@ do--player.drop(P)--Place piece
|
||||
cscore=cscore+626
|
||||
end
|
||||
STAT.pc=STAT.pc+1
|
||||
if P.human then
|
||||
if P.sound then
|
||||
SFX.play("clear")
|
||||
VOC.play("perfect_clear",CHN)
|
||||
end
|
||||
@@ -2372,7 +2418,7 @@ do--player.drop(P)--Place piece
|
||||
sendTime=sendTime+60
|
||||
cscore=cscore+626
|
||||
STAT.hpc=STAT.hpc+1
|
||||
if P.human then
|
||||
if P.sound then
|
||||
SFX.play("clear")
|
||||
VOC.play("half_clear",CHN)
|
||||
end
|
||||
@@ -2449,7 +2495,7 @@ do--player.drop(P)--Place piece
|
||||
P:attack(T,send,sendTime,1,CB.color,C,cmb)
|
||||
end
|
||||
end
|
||||
if P.human and send>3 then SFX.play("emit",min(send,7)*.1)end
|
||||
if P.sound and send>3 then SFX.play("emit",min(send,7)*.1)end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -2479,7 +2525,7 @@ do--player.drop(P)--Place piece
|
||||
SFX.play("reach")
|
||||
if P.curMission>#ENV.mission then
|
||||
P.curMission=nil
|
||||
P:win()
|
||||
P:win("finish")
|
||||
end
|
||||
elseif ENV.missionKill then
|
||||
P:showText(text.missionFailed,0,140,40,"flicker",.5)
|
||||
@@ -2489,7 +2535,7 @@ do--player.drop(P)--Place piece
|
||||
end
|
||||
|
||||
--SFX & Vibrate
|
||||
if P.human then
|
||||
if P.sound then
|
||||
SFX.play(clear_n[cc])
|
||||
SFX.play(ren_n[min(cmb,11)])
|
||||
if cmb>14 then SFX.play("ren_mega",(cmb-10)*.1)end
|
||||
@@ -2502,7 +2548,7 @@ do--player.drop(P)--Place piece
|
||||
if dospin then
|
||||
P:showText(text.block[CB.name]..text.spin,0,-30,45,"appear")
|
||||
P.b2b=P.b2b+20
|
||||
if P.human then
|
||||
if P.sound then
|
||||
SFX.play("spin_0")
|
||||
VOC.play(spinName[CB.name],CHN)
|
||||
end
|
||||
@@ -2517,12 +2563,13 @@ do--player.drop(P)--Place piece
|
||||
|
||||
P.combo=cmb
|
||||
|
||||
local mul=1
|
||||
--DropSpeed bonus
|
||||
if P._20G then
|
||||
cscore=cscore*2
|
||||
elseif ENV.drop<3 then
|
||||
elseif ENV.drop<1 then
|
||||
cscore=cscore*1.5
|
||||
elseif ENV.drop<3 then
|
||||
cscore=cscore*1.2
|
||||
end
|
||||
|
||||
--Speed bonus
|
||||
@@ -2534,9 +2581,13 @@ do--player.drop(P)--Place piece
|
||||
if ENV.score then
|
||||
P:showText(cscore,(P.curX+P.sc[2]-5.5)*30,(10-P.curY-P.sc[1])*30+P.fieldBeneath+P.fieldUp,int(8-120/(cscore+20))*5,"score",2)
|
||||
end
|
||||
|
||||
--Update stat
|
||||
STAT.score=STAT.score+cscore
|
||||
STAT.piece=STAT.piece+1
|
||||
STAT.row=STAT.row+cc
|
||||
STAT.maxFinesseCombo=max(STAT.maxFinesseCombo,P.finesseCombo)
|
||||
STAT.maxCombo=max(STAT.maxCombo,P.combo)
|
||||
if atk>0 then
|
||||
STAT.atk=STAT.atk+atk
|
||||
if send>0 then
|
||||
@@ -2550,8 +2601,6 @@ do--player.drop(P)--Place piece
|
||||
STAT.dig=STAT.dig+gbcc
|
||||
STAT.digatk=STAT.digatk+atk*gbcc/cc
|
||||
end
|
||||
|
||||
--Update stat
|
||||
local n=CB.name
|
||||
if dospin then
|
||||
_=STAT.spin[n] _[cc+1]=_[cc+1]+1--Spin[1~25][0~4]
|
||||
@@ -2564,9 +2613,6 @@ do--player.drop(P)--Place piece
|
||||
--Drop event
|
||||
_=ENV.dropPiece
|
||||
if _ then _(P)end
|
||||
|
||||
--Stereo SFX
|
||||
if P.human then SFX.fieldPlay("lock",nil,P)end
|
||||
end
|
||||
end
|
||||
--------------------------</Methods>--------------------------
|
||||
@@ -2632,7 +2678,7 @@ function player.die(P)--Called when win/lose,not really die!
|
||||
P.update=Pupdate_dead
|
||||
P.waiting=1e99
|
||||
P.b2b=0
|
||||
for i=1,#P.tasks do rem(P.tasks)end
|
||||
P.tasks={}
|
||||
for i=1,#P.atkBuffer do
|
||||
P.atkBuffer[i].sent=true
|
||||
P.atkBuffer[i].time=0
|
||||
@@ -2813,7 +2859,7 @@ function player.act.moveLeft(P,auto)
|
||||
end
|
||||
P.curX=P.curX-1
|
||||
P:freshBlock(false,true)
|
||||
if P.human and P.curY==P.imgY then SFX.play("move")end
|
||||
if P.sound and P.curY==P.imgY then SFX.play("move")end
|
||||
if not auto then P.moving=0 end
|
||||
P.spinLast=false
|
||||
else
|
||||
@@ -2840,7 +2886,7 @@ function player.act.moveRight(P,auto)
|
||||
end
|
||||
P.curX=P.curX+1
|
||||
P:freshBlock(false,true)
|
||||
if P.human and P.curY==P.imgY then SFX.play("move")end
|
||||
if P.sound and P.curY==P.imgY then SFX.play("move")end
|
||||
if not auto then P.moving=0 end
|
||||
P.spinLast=false
|
||||
else
|
||||
@@ -2887,7 +2933,7 @@ function player.act.hardDrop(P)
|
||||
if P.gameEnv.shakeFX then
|
||||
P.fieldOff.vy=P.gameEnv.shakeFX*.6
|
||||
end
|
||||
if P.human then
|
||||
if P.sound then
|
||||
SFX.fieldPlay("drop",nil,P)
|
||||
VIB(1)
|
||||
end
|
||||
@@ -3110,6 +3156,7 @@ function PLY.newDemoPlayer(id,x,y,size)
|
||||
prepareSequence(P)
|
||||
|
||||
P.human=false
|
||||
P.sound=true
|
||||
loadAI(P,{
|
||||
type="CC",
|
||||
next=5,
|
||||
@@ -3126,6 +3173,7 @@ function PLY.newRemotePlayer(id,x,y,size,actions)
|
||||
local P=newEmptyPlayer(id,x,y,size)
|
||||
|
||||
P.human=false
|
||||
P.sound=false
|
||||
P.remote=true
|
||||
|
||||
-- P.updateAction=buildActionFunctionFromActions(P, actions)
|
||||
@@ -3155,6 +3203,7 @@ function PLY.newAIPlayer(id,x,y,size,AIdata)
|
||||
prepareSequence(P)
|
||||
|
||||
P.human=false
|
||||
P.sound=false
|
||||
loadAI(P,AIdata)
|
||||
end
|
||||
function PLY.newPlayer(id,x,y,size)
|
||||
@@ -3165,6 +3214,7 @@ function PLY.newPlayer(id,x,y,size)
|
||||
prepareSequence(P)
|
||||
|
||||
P.human=true
|
||||
P.sound=true
|
||||
P.RS=kickList.TRS
|
||||
end
|
||||
--------------------------</Generator>--------------------------
|
||||
|
||||
@@ -120,13 +120,6 @@ do--calculator
|
||||
elseif v==1379e8+2626e4+1379 then
|
||||
S.pass=true
|
||||
SCN.go("debug")
|
||||
elseif v==34494 then
|
||||
error("This is an error testing message.")
|
||||
elseif v==114514 or v==1145141919810 then
|
||||
error("小鬼自裁请")
|
||||
elseif v==123456789 then
|
||||
S.reg=123456789
|
||||
v=987654321
|
||||
end
|
||||
end
|
||||
elseif k=="escape"then
|
||||
@@ -2421,6 +2414,19 @@ do--play
|
||||
end
|
||||
end
|
||||
do--pause
|
||||
local ranks={
|
||||
|
||||
}
|
||||
local rankColor={
|
||||
Z=color.lYellow,
|
||||
S=color.lGrey,
|
||||
A=color.sky,
|
||||
B=color.lGreen,
|
||||
C=color.magenta,
|
||||
D=color.dGreen,
|
||||
E=color.red,
|
||||
F=color.dRed,
|
||||
}
|
||||
function sceneInit.pause(org)
|
||||
if
|
||||
org=="setting_game"or
|
||||
@@ -2429,7 +2435,8 @@ do--pause
|
||||
then
|
||||
TEXT.show(text.needRestart,640,440,50,"fly",.6)
|
||||
end
|
||||
local S=players[1].stat
|
||||
local P=players[1]
|
||||
local S=P.stat
|
||||
sceneTemp={
|
||||
timer=org=="play"and 0 or 50,
|
||||
list={
|
||||
@@ -2442,9 +2449,8 @@ do--pause
|
||||
format("%d/%d/%d/%d",S.clears[1],S.clears[2],S.clears[3],S.clears[4]),
|
||||
format("(%d)/%d/%d/%d",S.spins[1],S.spins[2],S.spins[3],S.spins[4]),
|
||||
format("%d/%d ; %d/%d",S.b2b,S.b3b,S.pc,S.hpc),
|
||||
format("%d [%.2f%%]",S.extraPiece,100*max(1-S.extraRate/S.piece,0)),
|
||||
format("%d/%dx/%.2f%%",S.extraPiece,S.maxFinesseCombo,S.finesseRate*25/S.piece),
|
||||
},
|
||||
|
||||
--From right-down, 60 degree each
|
||||
radar={
|
||||
(S.off+S.dig)/S.time*60,--DefPM
|
||||
@@ -2457,8 +2463,8 @@ do--pause
|
||||
val={1/80,1/80,1/80,1/60,1/100,1/40},
|
||||
timing=org=="play",
|
||||
}
|
||||
local _=sceneTemp
|
||||
local A,B=_.radar,_.val
|
||||
local S=sceneTemp
|
||||
local A,B=S.radar,S.val
|
||||
|
||||
--Normalize Values
|
||||
for i=1,6 do
|
||||
@@ -2473,9 +2479,9 @@ do--pause
|
||||
if B[i]>.5 then f=2 end
|
||||
if B[i]>1 then f=3 break end
|
||||
end
|
||||
if f==1 then _.color,f={.4,.9,.5},1.25 --Vegetable
|
||||
elseif f==2 then _.color,f={.4,.7,.9},1 --Normal
|
||||
elseif f==3 then _.color,f={1,.3,.3},.626 --Diao
|
||||
if f==1 then S.color,f={.4,.9,.5},1.25 --Vegetable
|
||||
elseif f==2 then S.color,f={.4,.7,.9},1 --Normal
|
||||
elseif f==3 then S.color,f={1,.3,.3},.626 --Diao
|
||||
end
|
||||
A={
|
||||
120*.5*f, 120*3^.5*.5*f,
|
||||
@@ -2485,13 +2491,34 @@ do--pause
|
||||
120*.5*f, 120*-3^.5*.5*f,
|
||||
120*1*f, 120*0*f,
|
||||
}
|
||||
_.scale=f
|
||||
_.standard=A
|
||||
S.scale=f
|
||||
S.standard=A
|
||||
|
||||
for i=6,1,-1 do
|
||||
B[2*i-1],B[2*i]=B[i]*A[2*i-1],B[i]*A[2*i]
|
||||
end
|
||||
_.val=B
|
||||
S.val=B
|
||||
|
||||
if P.result=="WIN"then
|
||||
local acc=P.stat.finesseRate*.25/P.stat.piece
|
||||
S.rank=
|
||||
acc==1. and"Z"or
|
||||
acc>.97 and"S"or
|
||||
acc>.94 and"A"or
|
||||
acc>.87 and"B"or
|
||||
acc>.70 and"C"or
|
||||
acc>.50 and"D"or
|
||||
acc>.30 and"E"or
|
||||
"F"
|
||||
S.rankColor=rankColor[S.rank]
|
||||
if acc==1 then
|
||||
S.trophy="All Perfect"
|
||||
S.trophyColor=color.yellow
|
||||
elseif P.stat.maxFinesseCombo==P.stat.piece then
|
||||
S.trophy="Full Combo"
|
||||
S.trophyColor=color.lCyan
|
||||
end
|
||||
end
|
||||
end
|
||||
function sceneBack.pause()
|
||||
love.keyboard.setKeyRepeat(true)
|
||||
@@ -2534,6 +2561,7 @@ do--pause
|
||||
local S=sceneTemp
|
||||
local T=S.timer*.02
|
||||
if T<1 or game.result then Pnt.play()end
|
||||
|
||||
--Dark BG
|
||||
local _=T
|
||||
if game.result then _=_*.7 end
|
||||
@@ -2571,6 +2599,18 @@ do--pause
|
||||
end
|
||||
end
|
||||
|
||||
--rank & trophy
|
||||
if S.rank then
|
||||
setFont(60)
|
||||
gc.setColor(S.rankColor[1],S.rankColor[2],S.rankColor[3],T)
|
||||
gc.print(S.rank,420,635)
|
||||
if S.trophy then
|
||||
setFont(40)
|
||||
gc.setColor(S.trophyColor[1],S.trophyColor[2],S.trophyColor[3],T*2-1)
|
||||
gc.print(S.trophy,160-120*(1-T^.5),650)
|
||||
end
|
||||
end
|
||||
|
||||
--Radar Chart
|
||||
if T>.5 and game.frame>180 then
|
||||
T=T*2-1
|
||||
@@ -3145,15 +3185,19 @@ end
|
||||
do--dict
|
||||
function sceneInit.dict()
|
||||
sceneTemp={
|
||||
input="",
|
||||
dict=require("document/dict"),
|
||||
|
||||
input="",
|
||||
result={},
|
||||
url=nil,
|
||||
select=1,
|
||||
scroll=0,
|
||||
|
||||
lastSearch=nil,
|
||||
hideKB=system~="Windows",
|
||||
hideKB=true,
|
||||
}
|
||||
local S=sceneTemp
|
||||
S.url=(S.result[1]and S.result or S.dict)[S.select][5]
|
||||
BG.set("rainbow")
|
||||
end
|
||||
|
||||
@@ -3204,11 +3248,7 @@ do--dict
|
||||
end
|
||||
end
|
||||
elseif key=="link"then
|
||||
local url=(S.result[1]and S.result or S.dict)[S.select][5]
|
||||
LOG.print(url)
|
||||
if url then
|
||||
love.system.openURL(url)
|
||||
end
|
||||
love.system.openURL(S.url)
|
||||
elseif key=="kb"then
|
||||
S.hideKB=not S.hideKB
|
||||
elseif key=="delete"then
|
||||
@@ -3240,6 +3280,7 @@ do--dict
|
||||
S.lastSearch=S.input
|
||||
end
|
||||
end
|
||||
S.url=(S.result[1]and S.result or S.dict)[S.select][5]
|
||||
end
|
||||
|
||||
local typeColor={
|
||||
@@ -3247,6 +3288,7 @@ do--dict
|
||||
other=color.lOrange,
|
||||
game=color.lCyan,
|
||||
term=color.lRed,
|
||||
english=color.green,
|
||||
name=color.lPurple,
|
||||
}
|
||||
function Pnt.dict()
|
||||
@@ -3355,9 +3397,9 @@ do--stat
|
||||
S.recv.." "..S.off.." "..S.pend,
|
||||
S.dig.." "..int(S.digatk),
|
||||
format("%.2f %.2f",S.atk/S.row,S.digatk/S.dig),
|
||||
format("%d/%.3f%%",S.extraPiece,100*max(1-S.extraRate/S.piece,0)),
|
||||
S.b2b.." "..S.b3b,
|
||||
S.pc.." "..S.hpc,
|
||||
format("%d/%.2f%%",S.extraPiece,S.finesseRate*25/S.piece),
|
||||
},
|
||||
}
|
||||
for i=1,11 do
|
||||
@@ -3418,7 +3460,7 @@ do--history
|
||||
}
|
||||
if newVersionLaunch then
|
||||
newVersionLaunch=nil
|
||||
sceneTemp.pos=4
|
||||
sceneTemp.pos=3
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -6,42 +6,24 @@ local S=[=[
|
||||
靏鸖龘龘 込余 saki
|
||||
模电 吃水榴莲 世界沃德
|
||||
<rmb10+>
|
||||
八零哥 蕴空之灵 gggf127 dtg ThTsOd
|
||||
Fireboos 金巧 10元 立斐 Deep_Sea
|
||||
时雪 yyangdid sfqr 心痕 Sasoric
|
||||
夏小亚 仁参 乐↗乐↘ 喜欢c4w的ztcjoin
|
||||
面包 蠢熏 潘一栗 Lied 星街书婉 祝西
|
||||
829 e m*12 我永远爱白银诺艾尔(鹏 PCX
|
||||
kagura77 呆喂 GlowingEmbers 轩辕辚
|
||||
HimuroAki TCV100 tech有养成系统了@7065
|
||||
HAGE KANOBU 闪电和拐棍 葡萄味的曼妥思
|
||||
蓝绿 天生的魔法师 琳雨空 T8779.易缄
|
||||
诗情画意 星姐阿夸双推Man暗炎 [*炎] [*Y]
|
||||
aaa222 [**城] cnDD 红桃老给 昭庭玲秋
|
||||
旋树墩 火花工作室 Cosine 沁音的芝麻王
|
||||
SuperJH 天上_飞 uiro 宇酱 [W*N]
|
||||
[Z*.]
|
||||
八零哥 蕴空之灵 gggf127 dtg ThTsOd Fireboos 金巧 10元
|
||||
立斐 Deep_Sea 时雪 yyangdid sfqr 心痕 Sasoric 夏小亚
|
||||
仁参 乐↗乐↘ 喜欢c4w的ztcjoin 面包 蠢熏 潘一栗 Lied 星街书婉
|
||||
祝西 829 e m*12 我永远爱白银诺艾尔(鹏 PCX kagura77 呆喂
|
||||
GlowingEmbers 轩辕辚 HimuroAki TCV100 tech有养成系统了@7065
|
||||
HAGE KANOBU 闪电和拐棍 葡萄味的曼妥思 蓝绿 天生的魔法师 琳雨空
|
||||
T8779.易缄 诗情画意 星姐阿夸双推Man暗炎 [*炎] [*Y] aaa222 [**城]
|
||||
cnDD 红桃老给 昭庭玲秋 旋树墩 火花工作室 Cosine 沁音的芝麻王
|
||||
SuperJH 天上_飞 uiro 宇酱 [W*N] [Z*.] [*之]
|
||||
Thanks!!!
|
||||
|
||||
Future outlook:
|
||||
New modes:
|
||||
dig practice
|
||||
dig zen
|
||||
infinite PC challenge
|
||||
infinite PC challenge; easy finesse (only revert current)
|
||||
reverb (often repeat a piece many times)
|
||||
game tutorial
|
||||
finesse tutorial/exam (3next, 1pt/mino, drop to score)
|
||||
easy finesse (only revert current)
|
||||
combo
|
||||
backfire
|
||||
bigbang
|
||||
rhythm
|
||||
KPP-locked
|
||||
square
|
||||
task survival
|
||||
symmetry
|
||||
game Abbr. test
|
||||
parkour
|
||||
combo; backfire; bigbang; rhythm; square
|
||||
task survival; symmetry; parkour; game tutorial
|
||||
game Abbr. testl finesse tutorial/exam (3next, 1pt/mino, drop to score)
|
||||
Other:
|
||||
mod system with:
|
||||
block/field/up/low hidden
|
||||
@@ -49,31 +31,47 @@ Future outlook:
|
||||
field flip(LR/UD)
|
||||
no fail(∞ lives)
|
||||
mini games:
|
||||
2048 (with next/deadly mode)
|
||||
扫雷
|
||||
坦克大战
|
||||
找不同
|
||||
数独
|
||||
连连看
|
||||
热更新; 联网游戏
|
||||
录像保存/导出; 按块回放录像
|
||||
⑨S机器人调试模式
|
||||
健康游戏时间提醒;游戏内文档
|
||||
物理hold; 多hold; 多方块
|
||||
自定义游戏支持选择旋转系统(C2,DTET,ASC...)
|
||||
自定义游戏允许按各种目的复制数据; 画图智能画笔
|
||||
地图增加模式图标; 多语音包系统
|
||||
split判定及效果
|
||||
2048 (带预览; 后妈发牌)
|
||||
扫雷; 坦克大战; 找不同
|
||||
热更新; 联网游戏; 录像保存/导出; 按块回放录像
|
||||
⑨S机器人调试模式; 健康游戏时间提醒;游戏内文档
|
||||
物理hold; 多hold
|
||||
多方块; 多语音包系统
|
||||
自定义游戏选择旋转系统(C2,DTET,ASC...)
|
||||
自定义游戏按各种目的复制数据; 画图智能画笔
|
||||
地图增加模式图标; split判定及效果
|
||||
更多画面效果; 一些3D小玩意
|
||||
方块散落动画; 超60帧
|
||||
"一键操作"; 手机滑动操作; 特殊控件(例如虚拟摇杆)
|
||||
方块散落动画; 更多画面效果; 一些3D小玩意; 支持超60帧
|
||||
task-Z(新AI); 工程编译到字节码
|
||||
|
||||
0.11.3: 新极简系统 New Finesse System
|
||||
新内容:
|
||||
增加极简连击系统并且极简点数计算系统大改
|
||||
新BGM:Storm(用于防守/生存)
|
||||
非极简不播放锁定音效
|
||||
主界面AI试玩有音效
|
||||
改动:
|
||||
词典新增大量内容
|
||||
修复词典打开链接,新增大家的b站空间链接
|
||||
BGM大规模调整
|
||||
高重力分数倍率增加一档
|
||||
自定义模式自由选择BGM
|
||||
代码:
|
||||
玩家新增sound属性开关声效
|
||||
修复模式hook函数通关后TICK任务丢失
|
||||
修复:
|
||||
mini判定不能触发
|
||||
挖掘模式rank判定条件错误
|
||||
回放时同时按两个键kpm变无穷
|
||||
科研模式可以同时触发胜利和失败
|
||||
|
||||
0.11.2: 弹球小游戏 Pong
|
||||
新内容:
|
||||
Pong
|
||||
公开小游戏入口
|
||||
词典支持跳转超链接
|
||||
新BGM:waterfall(用于特种40L)
|
||||
新BGM:Waterfall(用于特种40L)
|
||||
新模式:挖掘10/40/100/400/1000
|
||||
改动:
|
||||
修改查询机制,增加词条,优化词典体验
|
||||
@@ -209,8 +207,8 @@ Future outlook:
|
||||
隐形模式回放时方块不会完全隐藏
|
||||
画图界面新增顶起一行和消除满行功能
|
||||
把音乐室装修得更好看了
|
||||
新BGM: Down
|
||||
修改BGM: Rockblock
|
||||
新BGM:Down
|
||||
修改BGM:Rockblock
|
||||
改动:
|
||||
优化15p开关排版和机制
|
||||
不允许使用瞬移操作的模式虚拟按键也不显示
|
||||
|
||||
Reference in New Issue
Block a user