Compare commits

..

25 Commits

Author SHA1 Message Date
MrZ626
5e45d65289 0.11.3: 新极简系统 2020-10-11 18:50:49 +08:00
MrZ626
902d0519de 词典新增大量内容 2020-10-11 18:50:45 +08:00
MrZ626
f1ada720ec 整理代码 2020-10-11 14:10:39 +08:00
MrZ626
109da7d249 bgm大规模调整 2020-10-11 02:03:35 +08:00
MrZ626
03d600c819 新BGM:storm(用于防守/生存) 2020-10-11 02:02:59 +08:00
MrZ626
ffa7ce406b 修复模式hook函数通关后TICK任务丢失 2020-10-11 01:33:29 +08:00
MrZ626
591f588911 高重力分数倍率增加一档 2020-10-11 01:32:36 +08:00
MrZ626
74cd63acff 修复mini判定不能触发 2020-10-11 01:30:21 +08:00
MrZ626
30fffd6908 增加极简连击系统并且极简点数计算系统大改 2020-10-11 01:28:53 +08:00
MrZ626
243a663ee6 自定义模式自由选择BGM 2020-10-10 12:42:53 +08:00
MrZ626
c9124bea42 修复回放时同时按两个键kpm变无穷 2020-10-10 12:40:36 +08:00
MrZ626
2b10439788 整理代码 2020-10-09 23:10:35 +08:00
MrZ626
cd0d83cf2a 修复科研模式可以同时触发胜利和失败 2020-10-09 22:20:50 +08:00
MrZ626
c506de8b5b 挖掘模式胜利标识修改 2020-10-09 17:55:06 +08:00
MrZ626
f3b47eb0f2 加载外部库模块化 2020-10-09 11:30:48 +08:00
MrZ626
74d0b8b92c 主界面AI试玩有音效 2020-10-08 20:24:55 +08:00
MrZ626
8e4d6e2bda 词典使用全角逗号,tips调整 2020-10-08 19:59:35 +08:00
MrZ626
364c9ba559 删点没用东西 2020-10-08 18:14:29 +08:00
MrZ626
859daa5908 开局前按键次数也会被统计 2020-10-08 18:13:10 +08:00
MrZ626
5ec14a7cc1 修复挖掘模式rank判定条件错误(之前没修好) 2020-10-07 19:18:41 +08:00
MrZ626
2f21dece58 修复词典打开链接,新增大家的b站空间链接 2020-10-07 00:47:23 +08:00
MrZ626
7384db5d52 降低100L的D评级难度 2020-10-06 22:43:37 +08:00
MrZ626
fefc1ce8df 增加大量tips 2020-10-06 22:41:13 +08:00
MrZ626
64374aed81 挖掘模式rank判定条件错误 2020-10-06 21:32:14 +08:00
MrZ626
4cb2dbad3b 缩减更新历史文档行数 2020-10-06 19:04:30 +08:00
74 changed files with 915 additions and 859 deletions

View File

@@ -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)

View File

@@ -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={
"既然你能玩到这个游戏,应该也不需要什么帮助吧?",

View File

@@ -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
--

View File

@@ -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}),

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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(

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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,

View File

@@ -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,

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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,
}

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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)

View File

@@ -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={

View File

@@ -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,

View File

@@ -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",

View File

@@ -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>--------------------------

View File

@@ -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

View File

@@ -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开关排版和机制
不允许使用瞬移操作的模式虚拟按键也不显示