Merge branch 'master' into resolve-conflict-with-MrZ626/master

This commit is contained in:
Gompyn
2020-08-21 20:36:22 +08:00
committed by GitHub
103 changed files with 3895 additions and 2178 deletions

View File

@@ -16,7 +16,7 @@ local Timer=love.timer.getTime
-- 6~10:hD,sD,H,A,R,
-- 11~13:LL,RR,DD
local blockPos={4,4,4,4,4,5,4}
local scs={{1,2},{1,2},{1,2},{1,2},{1,2},{1.5,1.5},{0.5,2.5}}
local scs={{0,1},{0,1},{0,1},{0,1},{0,1},{.5,.5},{-.5,1.5}}
-------------------------------------------------Cold clear
local CCblockID={6,5,4,3,2,1,0}
if system=="Windows"then
@@ -198,7 +198,8 @@ end
return{
["9S"]={
function(P,ctrl)
local Tfield={}--test field
local Tfield={}--Test field
local best={x=1,dir=0,hold=false,score=-1e99}--Best method
local field_org=P.field
for i=1,#field_org do
Tfield[i]=freeRow.get(0)
@@ -206,7 +207,7 @@ return{
Tfield[i][j]=field_org[i][j]
end
end
local best={x=1,dir=0,hold=false,score=-1e99}
for ifhold=0,P.gameEnv.hold and 1 or 0 do
--Get block id
local bn
@@ -217,13 +218,17 @@ return{
end
if not bn then goto CTN end
for dir=0,dirCount[bn] do--each dir
for dir=0,dirCount[bn] do--Each dir
local cb=blocks[bn][dir]
for cx=1,11-#cb[1]do--each pos
for cx=1,11-#cb[1]do--Each pos
local cy=#Tfield+1
--Move to bottom
while not ifoverlapAI(Tfield,cb,cx,cy-1)do
cy=cy-1
end--move to bottom
end
--Simulate lock
for i=1,#cb do
local y=cy+i-1
if not Tfield[y]then Tfield[y]=freeRow.get(0)end
@@ -232,7 +237,7 @@ return{
Tfield[y][cx+j-1]=1
end
end
end--simulate lock
end
local score=getScore(Tfield,cb,cy)
if score>best.score then
best={bn=bn,x=cx,dir=dir,hold=ifhold==1,score=score}
@@ -243,9 +248,11 @@ return{
::CTN::
end
if not best.bn then return 1 end
--Release cache
while #Tfield>0 do
freeRow.discard(rem(Tfield,1))
end--Release cache
end
local p=#ctrl+1
if best.hold then
ctrl[p]=8
@@ -270,11 +277,11 @@ return{
end,
},
["CC"]={
function(P)
function(P)--Start thinking
BOT.think(P.AI_bot)
return 2
end,--start thinking
function(P,ctrl)
end,
function(P,ctrl)--Poll keys
local success,dest,hold,move=BOT.getMove(P.AI_bot)
if success == 2 then
ins(ctrl,6)
@@ -298,10 +305,11 @@ return{
ins(ctrl,6)
return 3
else
return 2--stay this stage
--Stay this stage
return 2
end
end,--poll keys
function(P)
end,
function(P)--Check if time to change target
P.AI_delay=P.AI_delay0
if Timer()-P.modeData.point>P.modeData.event then
P.modeData.point=Timer()
@@ -309,6 +317,6 @@ return{
P:changeAtkMode(rnd()<.85 and 1 or #P.atker>3 and 4 or rnd()<.3 and 2 or 3)
end
return 1
end,--check if time to change target
end,
},
}--AI think stage

View File

@@ -1,25 +1,28 @@
setting={
--game
--Game
das=10,arr=2,
sddas=0,sdarr=2,
ihs=true,irs=true,ims=true,
reTime=4,
maxNext=6,
autoPause=true,
quickR=true,
swap=true,
--System
reTime=4,
autoPause=true,
fine=false,
appLock=false,
lang=1,
skinSet=1,
skin={1,5,8,2,10,3,7,1,5,1,5,8,2,10,3,7,10,7,8,2,8,2,1,5,3},
face={},
--graphic
--Graphic
ghost=true,center=true,
smooth=true,grid=false,
bagLine=false,
lockFX=2,
dropFX=3,
dropFX=2,
moveFX=2,
clearFX=2,
shakeFX=2,
atkFX=3,
@@ -31,7 +34,7 @@ setting={
bg=true,
powerInfo=false,
--sound
--Sound
sfx=10,
spawn=0,
bgm=7,
@@ -39,15 +42,15 @@ setting={
vib=0,
voc=0,
--virtualkey
--Virtualkey
VKSFX=3,--SFX volume
VKVIB=0,--VIB
VKSwitch=false,--if disp
VKTrack=false,--if tracked
VKDodge=false,--if dodge
VKSwitch=false,--If disp
VKTrack=false,--If tracked
VKDodge=false,--If dodge
VKTchW=3,--Touch-Pos Weight
VKCurW=4,--Cur-Pos Weight
VKIcon=true,--if disp icon
VKIcon=true,--If disp icon
VKAlpha=3,
}
for i=1,25 do
@@ -64,7 +67,7 @@ stat={
send=0,recv=0,pend=0,off=0,
clear={},spin={},
pc=0,hpc=0,b2b=0,b3b=0,score=0,
lastPlay="sprint_10",--last played mode ID
lastPlay="sprint_10",--Last played mode ID
}
for i=1,25 do
stat.clear[i]={0,0,0,0,0}
@@ -73,9 +76,9 @@ end
keyMap={
{"left","right","x","z","c","up","down","space","tab","r"},{},
--keyboard
--Keyboard
{"dpleft","dpright","a","b","y","dpup","dpdown","rightshoulder","x","leftshoulder"},{},
--joystick
--Joystick
}
for i=1,#keyMap do for j=1,20 do
if not keyMap[i][j]then keyMap[i][j]=""end

View File

@@ -1,6 +1,6 @@
local freeRow={}
local L={}--storage
local _=0--lenth
local L={}--Storage
local _=0--Lenth
function freeRow.reset(num)
if num<_ then
for i=_,num+1,-1 do

View File

@@ -6,6 +6,25 @@ local sub,find=string.sub,string.find
local char,byte=string.char,string.byte
local ins,rem=table.insert,table.remove
local default_setting={
"das","arr",
"sddas","sdarr",
"ihs","irs","ims",
"maxNext",
"swap",
-- "face",
}
local function copyGameSetting()
local S={face={}}
for _,v in next,default_setting do
S[v]=setting[v]
end
for i=1,25 do
S.face[i]=setting.face[i]
end
return S
end
function destroyPlayers()
for i=#players,1,-1 do
local P=players[i]
@@ -25,7 +44,6 @@ function destroyPlayers()
for i=#players.alive,1,-1 do
players.alive[i]=nil
end
players.human=0
collectgarbage()
end
@@ -43,18 +61,22 @@ function restoreVirtualKey()
virtualkey[9].ava=false
end
end
function copyBoard()
local str=""
local H=0
for y=20,1,-1 do
for x=1,10 do
if preField[y][x]~=0 then
H=y
goto L
goto topFound
end
end
end
::L::
::topFound::
--Encode field
for y=1,H do
local S=""
local L=preField[y]
@@ -63,38 +85,36 @@ function copyBoard()
end
str=str..S
end
love.system.setClipboardText("Techmino sketchpad:"..data.encode("string","base64",data.compress("string","deflate",str)))
TEXT.show(text.copySuccess,350,360,40,"appear",.5)
return data.encode("string","base64",data.compress("string","deflate",str))
end
function pasteBoard()
function pasteBoard(str)
local _
local fX,fY=1,1--*ptr for Field(r*10+(c-1))
--Read data
local str=love.system.getClipboardText()
local p=find(str,":")--ptr*
if p then str=sub(str,p+1)end
--Decode
_,str=pcall(data.decode,"string","base64",str)
if not _ then goto ERROR end
if not _ then return end
_,str=pcall(data.decompress,"string","deflate",str)
if not _ then goto ERROR end
p=1
if not _ then return end
local fX,fY=1,1--*ptr for Field(r*10+(c-1))
local p=1
while true do
_=byte(str,p)--1byte
--Str end
if not _ then
if fX~=1 then
goto ERROR
return
else
fY=fY+1
break
end
end--str end
end
__=_%32-1--Block id
if __>17 then return end--Illegal blockid
_=int(_/32)--Mode id
__=_%32-1--block id
if __>17 then goto ERROR end--illegal blockid
_=int(_/32)--mode id
preField[fY][fX]=__
if fX<10 then
fX=fX+1
@@ -111,8 +131,41 @@ function pasteBoard()
preField[y][x]=0
end
end
do return end
::ERROR::TEXT.show(text.dataCorrupted,350,360,35,"flicker",.5)
return true
end
function copySequence()
local str=""
for i=1,#preBag do
str=str..char(preBag[i]-1)
end
return data.encode("string","base64",data.compress("string","deflate",str))
end
function pasteSequence(str)
local _
--Decode
_,str=pcall(data.decode,"string","base64",str)
if not _ then return end
_,str=pcall(data.decompress,"string","deflate",str)
if not _ then return end
local bag={}
for i=1,#str do
_=byte(str,i)
if _<25 then
bag[i]=_+1
else
return
end
end
preBag=bag
sceneTemp.cur=#preBag
return true
end
function mergeStat(stat,delta)
@@ -128,7 +181,8 @@ function mergeStat(stat,delta)
end
end
end
function randomTarget(P)
function randomTarget(P)--Return a random opponent for P
if #players.alive>1 then
local R
repeat
@@ -136,7 +190,7 @@ function randomTarget(P)
until R~=P
return R
end
end--return a random opponent for P
end
function freshMostDangerous()
game.mostDangerous,game.secDangerous=nil
local m,m2=0,0
@@ -196,24 +250,27 @@ function royaleLevelup()
local P=players.alive[i]
P.gameEnv.drop=int(P.gameEnv.drop*.3)
if P.gameEnv.drop==0 then
P.curY=P.y_img
P.curY=P.imgY
P.gameEnv._20G=true
if P.AI_mode=="CC"then CC_switch20G(P)end--little cheating,never mind
if P.AI_mode=="CC"then CC_switch20G(P)end
end
end
end
end
function pauseGame()
if not SCN.swapping then
restartCount=0--Avoid strange darkness
if not game.result then
game.pauseCount=game.pauseCount+1
end
for i=1,#players do
local l=players[i].keyPressing
for j=1,#l do
if l[j]then
players[i]:releaseKey(j)
if not game.replaying then
for i=1,#players do
local l=players[i].keyPressing
for j=1,#l do
if l[j]then
players[i]:releaseKey(j)
end
end
end
end
@@ -223,65 +280,38 @@ end
function resumeGame()
SCN.swapTo("play","none")
end
function loadGame(M)
--rec={}
function loadGame(M,ifQuickPlay)
stat.lastPlay=M
curMode=Modes[M]
local lang=setting.lang
drawableText.modeName:set(text.modes[M][1])
drawableText.levelName:set(text.modes[M][2])
needResetGameData=true
SCN.swapTo("play","fade_togame")
SCN.swapTo("play",ifQuickPlay and"swipe"or"fade_togame")
SFX.play("enter")
end
function resetPartGameData()
game={
frame=150-setting.reTime*15,
result=false,
pauseTime=0,
pauseCount=0,
garbageSpeed=1,
warnLVL0=0,
warnLVL=0,
}
destroyPlayers()
curMode.load()
TEXT.clear()
if modeEnv.task then
for i=1,#players do
players[i]:newTask(modeEnv.task)
end
end
if modeEnv.royaleMode then
for i=1,#players do
players[i]:changeAtk(randomTarget(players[i]))
end
end
BG.set(modeEnv.bg)
BGM.play(modeEnv.bgm)
if modeEnv.royaleMode then
for i=1,#players do
players[i]:changeAtk(randomTarget(players[i]))
end
game.stage=1
game.garbageSpeed=.3
end
restoreVirtualKey()
collectgarbage()
end
function resetGameData()
game={
frame=150-setting.reTime*15,
result=false,
pauseTime=0,--Time paused
pauseCount=0,--Pausing count
garbageSpeed=1,--garbage timing speed
warnLVL0=0,
warnLVL=0,
}
if players[1]and not game.replaying then
mergeStat(stat,players[1].stat)
end
game.frame=150-setting.reTime*15
game.result=false
game.pauseTime=0
game.pauseCount=0
game.garbageSpeed=1
game.warnLVL0=0
game.warnLVL=0
game.recording=true
game.replaying=false
game.setting=copyGameSetting()
game.rec={}
math.randomseed(tm.getTime())
game.seed=rnd(261046101471026)
destroyPlayers()
modeEnv=curMode.env
curMode.load()--bg/bgm need redefine in custom,so up here
curMode.load()--BG/BGM need redefine in custom,so up here
if modeEnv.task then
for i=1,#players do
players[i]:newTask(modeEnv.task)
@@ -306,12 +336,59 @@ function resetGameData()
SFX.play("ready")
collectgarbage()
end
function resetPartGameData(replaying)
if players[1]and not game.replaying then
mergeStat(stat,players[1].stat)
end
game.result=false
game.garbageSpeed=1
game.warnLVL0=0
game.warnLVL=0
if replaying then
game.frame=0
game.recording=false
game.replaying=1
else
game.frame=150-setting.reTime*15
game.pauseTime=0
game.pauseCount=0
game.recording=true
game.replaying=false
game.setting=copyGameSetting()
game.rec={}
math.randomseed(tm.getTime())
game.seed=rnd(1046101471,2662622626)
end
destroyPlayers()
modeEnv=curMode.env
curMode.load()
if modeEnv.task then
for i=1,#players do
players[i]:newTask(modeEnv.task)
end
end
BG.set(modeEnv.bg)
BGM.play(modeEnv.bgm)
TEXT.clear()
if modeEnv.royaleMode then
for i=1,#players do
players[i]:changeAtk(randomTarget(players[i]))
end
game.stage=1
game.garbageSpeed=.3
end
restoreVirtualKey()
collectgarbage()
end
function gameStart()
SFX.play("start")
for P=1,#players do
P=players[P]
P:popNext()
P.timing=true
P.control=true
P.timing=true
P:popNext()
end
end

View File

@@ -4,6 +4,7 @@ if setting.lang==1 or setting.lang==2 then
"ZS JL T O I",
"VVVVVV好玩!",
"uid:225238922",
"tetralegends也很好玩!",
"tetr.js也很好玩!",
"tetr.io也很好玩!",
"Techminohaowan",
@@ -13,9 +14,9 @@ if setting.lang==1 or setting.lang==2 then
"osu好玩!",
"O spin Triple!",
"nullpomino也很好玩!",
"Naki 可爱",
"Miya:喵!",
"Naki 可爱!",
"Miya 可爱!",
"Lua天下第一",
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
"Let-The-Bass-Kick!",
"l-=-1",
@@ -27,7 +28,6 @@ if setting.lang==1 or setting.lang==2 then
"DT炮=TSD+TST炮",
"Cultris II也很好玩!",
"COOL!!",
"CLASSIC SEXY RUSSIAN BLOCKS",
"BT炮=beta炮",
"B2B2B2B存在吗?",
"B2B2B???",
@@ -36,9 +36,9 @@ if setting.lang==1 or setting.lang==2 then
"注意到\"旋转\"到底对方块做了些什么吗?",
"有疑问? 先看设置有没有你想要的",
"有建议的话可以把信息反馈给作者~",
"音乐都是瞎写的,觉得不好听就把BGM关了罢",
"学会使用两个旋转键, 三个更好",
"享受特色旋转系统!",
"新人请千万记住,打好基础,不要太早学那些花里胡哨的",
"享受Tech的特色旋转系统!",
"无聊翻翻设置是好习惯",
"我的世界好玩!",
"提前旋转等设置可以用来救命",
@@ -48,16 +48,21 @@ if setting.lang==1 or setting.lang==2 then
"少女祈祷中",
"扫雷好玩!",
"哦,我的上帝",
"你可以长按R键重新开始游戏(也不是很长)",
"你可以从统计页面打开游戏存档目录",
"你好 世界!",
"魔方好玩!",
"喵!",
"免费吃鸡方块",
"秘密数字:626",
"每个虚拟按键都可以隐藏/显示",
"每个块的出现方向可以自定义",
"没专业美术,程序员审美警告",
"没学过编曲,音乐都是自己凭感觉写的,觉得不好听就设置里关了吧",
"联网还没做呢, 别急",
"键位是可以自定义的",
"健康小贴士:上厕所太用力容易脑出血(尤其是老年人!)",
"健康小贴士:不要熬夜,真的容易猝死",
"合群了就会消失, 但是消失不代表没有意义",
"更小的DAS和ARR拥有更高的操作上限(如果你还能控制得了的话)",
"俄罗斯方块环游记也不错!",
@@ -65,8 +70,8 @@ if setting.lang==1 or setting.lang==2 then
"低帧率会降低游戏体验",
"戴上耳机以获得最佳体验",
"大满贯10连击消四全清!",
"车车人在此",
"茶娘可爱",
"打好块没有捷径,多练",
"茶娘 可爱!",
"草(日本语)",
"不要在上课时玩游戏!",
"不要盯着bug不放",
@@ -75,6 +80,7 @@ if setting.lang==1 or setting.lang==2 then
"别问游戏名怎么取的,问就是随便想的",
"本游戏难度上限很高, 做好心理准备",
"本游戏可不是休闲游戏",
"报时机器人:新的一天开始了",
"626r/s",
"40行世界纪录:15.654s",
"4+4+4+4+2+2+1=17",
@@ -86,10 +92,12 @@ if setting.lang==1 or setting.lang==2 then
"2.7182818284590452353",
"15puzzle好玩!",
"11renPC!",
"100行内23PC来一个?",
"1, 2, 9!!!!!",
"<方块研究所>有一个Nspire-CX版本!",
"↑↑↓↓←→←→BABA",
"(RUR'U')R'FR2U'R'U'(RUR'F')",
-- "Z酱 可爱!",
}
elseif setting.lang==3 then
L={
@@ -106,6 +114,7 @@ elseif setting.lang==3 then
"This in not a casual game",
"This game can be very hard,be mentally perpared",
"Tetris journey has network battle!",
"Tetralegends is fun!",
"Terraria is fun!",
"Techmino=Technique+Tetromino",
"Techmino is so fun!",
@@ -117,7 +126,7 @@ elseif setting.lang==3 then
"REGRET!!",
"Powered by love2d",
"Playing too much = taking drugs",
"osu is fun!",
"OSU is fun!",
"Only offline game now",
"OHHHHHHHHHHHHHH",
"O spin triple!",
@@ -127,13 +136,14 @@ elseif setting.lang==3 then
"Miya so cute!",
"Minesweeper is fun!",
"Minecraft is fun!",
"Lua No.1",
"LrL RlR LLr RRl RRR LLL FFF RfR RRf rFF",
"lower fps causes lower game experience",
"Lower fps causes lower game experience",
"Let-The-Bass-Kick!",
"l-=-1",
"Is B2B2B2B possible?",
"Initial Rotation etc. can save your life",
"iced so bully",
"Hold R key to restart game",
"Hello world!",
"Headphones for better experience",
"Have you noticed what does \"rotating\" do to block?",
@@ -146,10 +156,9 @@ elseif setting.lang==3 then
"DO NOT PRESS F10",
"Do not play game in class!",
"Disappearing doesn't mean useless",
"diao so bully",
"Diao so bully",
"COOL!!",
"CLASSIC SEXY RUSSIAN BLOCKS",
"BT cannon=beta",
"BT cannon=beta cannon",
"Back to Back 10 combo Techrash PC!",
"B2B2B???",
"Any suggestions to author!",
@@ -157,9 +166,9 @@ elseif setting.lang==3 then
"Also try VVVVVV!",
"Also try Tetr.js!",
"Also try Tetr.io!",
"Also try Nullpomino!",
"Also try Jstris!",
"Also try Cultris II!",
"Also try Bullpomino!",
"ALLSPIN!",
"少女祈禱中",
"40L WR: 15.654s",
@@ -186,5 +195,79 @@ elseif setting.lang==4 then
s=s..L[math.random(#L)]
end
return s
elseif setting.lang==5 then
local R=math.random()
if R<.05 then
local time={
--[[00]]"大半夜的在这干啥呢?不睡觉是会猝死的",
--[[01]]"大半夜的在这干啥呢?不睡觉是会猝死的",
--[[02]]"现在打块你是认真的?",
--[[03]]"现在打块你是认真的?",
--[[04]]"早起是好的,但是你不应该打块",
--[[05]]"早起是好的,但是你不应该打块",
--[[06]]"早饭吃好了?",
--[[07]]"早饭吃好了?",
--[[08]]"九点多了,没自己的事情要做?",
--[[09]]"十点多了,没自己的事情要做?",
--[[10]]"十一点多了,午饭有的吃么",
--[[11]]"十二点多了,午饭有的吃么",
--[[12]]"累了累了,现在不想说你",
--[[13]]"累了累了,现在不想说你",
--[[14]]"累了累了,现在不想说你",
--[[15]]"累了累了,现在不想说你",
--[[16]]"累了累了,现在不想说你",
--[[17]]"晚饭吃好了?",
--[[18]]"晚饭吃好了?",
--[[19]]"累了累了,现在不想说你",
--[[20]]"累了累了,现在不想说你",
--[[21]]"好睡了,作息健康活得久",
--[[22]]"好睡了,作息健康活得久",
--[[23]]"大半夜的在这干啥呢?不睡觉是会猝死的",
}
return time[tonumber(os.date("%H"))+1]
elseif R<.1 then
local int=math.floor
L={
"平均"..int(stat.row/stat.time*60).."LPM,那可真强呢",
"平均"..int(stat.atk/stat.time*60).."APM,好厉害哦",
"平均"..(int(stat.atk/stat.row*10)*.1).."效,你看这数据能看么",
"平均"..(int(stat.atk/stat.row*10)*.1).."效,我就不说你多菜了",
"才玩"..stat.game.."把,跟几十万局的没法比",
"才玩"..stat.game.."把,玩了不下几万局的人可不在少数",
"才玩了"..int(stat.time/3600).."小时,人家总时长是你不知道多少倍",
"才玩了"..int(stat.time/3600).."小时,别人总时长跟你都不在一个数量级",
}
else
L={
"Diao?上次被我c4w秒了的那人?",
"隐形难吗?那个节目上的谁,水平那么菜也打得还行,就是你菜",
"一口一个wtcl还不赶紧去练,你是不思进取还是不想好好说话?",
"我一个滑铲就挖了个11renPC",
"我曾经在极度愤怒的时候15秒消了40行",
"天天F3F3,怕别人不知道你菜?",
"天天卖弱,你一定把把150apm吧?",
"天天催更催更,你咋不来帮忙开发啊,真以为作者很强催催啥都有?",
"设置都看过一遍了吗?明明都能调还嫌这嫌那,可牛逼了您",
"少玩点,多眨眼,到时候瞎了别怪我没提醒你",
"人只用一只手都能玩,你呢?",
"没那水平别天天整什么花里胡哨的,人玩几年你想几天赶上?",
"满口PCDT信天翁,还会点别的么?",
"叫你多练消四不听,现在要速度没速度,spin打完地形一塌糊涂,开心了?",
"叫你多练就多练,想着几天变神仙,当自己是谁?",
"还搁这玩手机呢,作业做完了?",
"除了雨宫太阳你还认识谁?Jonas知道吗?Ajanba听过吗?",
"不会吧不会吧,真的还有人不能随手Tspin?",
"别会个c4w就以为自己多强,这是基本功罢了",
"60lpm?拍硬降刷的吧",
"4pps不是人均水平?",
"40行还要40多秒,就这?",
"20G很难?是个人都能玩吧",
"20连pc不是随手?",
"100apm?定式刷的吧",
"0202年了,还在玩这种小孩子玩的游戏?",
"极限20G?那不是随手通",
"全隐40行全消四很难吗??",
}
end
end
return L[math.random(#L)]

View File

@@ -4,7 +4,7 @@ local ZERO={[01]=Zero,[10]=Zero,[03]=Zero,[30]=Zero,[12]=Zero,[21]=Zero,[32]=Zer
local map={}
for x=-3,3 do map[x]={}for y=-3,3 do map[x][y]={x,y}end end
local function collect(T)--make all vec point to the same vec
local function collect(T)--Make all vec point to the same vec
if type(T)=="table"then
for _,T in next,T do
for k,vec in next,T do
@@ -14,11 +14,11 @@ local function collect(T)--make all vec point to the same vec
end
end
local function C_sym(L)--use this if the block is centrosymmetry, *PTR!!!
local function C_sym(L)--Use this if the block is centrosymmetry, *PTR!!!
L[23]=L[01]L[32]=L[10]
L[21]=L[03]L[12]=L[30]
end
local function flipList(O)--use this to copy a symmetry list
local function flipList(O)--Use this to copy a symmetry list
if not O then return end
local L={}
for i=1,#O do
@@ -84,14 +84,14 @@ local TRS={
},--Z
{},--S
{
[01]={{-1, 0},{-1, 1},{ 0,-2},{ 1, 1}},
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2}},
[01]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-2},{ 1, 1}},
[10]={{ 1, 0},{ 1,-1},{-1, 0},{ 0, 2},{ 1, 2}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 1,-1},{ 0, 1}},
[30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1},{-1, 1}},
[12]={{ 1, 0},{ 1,-1},{ 1, 1},{-1, 0},{ 0,-1},{ 0, 2},{ 1, 2}},
[21]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-2},{-1,-2}},
[32]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{-1, 1}},
[23]={{ 1, 0},{ 1,-1},{ 1, 1},{ 0,-2},{ 1,-2}},
[21]={{-1, 0},{-1, 1},{-1,-1},{ 1, 0},{ 0, 1},{ 0,-2},{-1,-2}},
[32]={{-1, 0},{-1,-1},{ 1, 0},{ 0, 2},{-1, 2},{-1, 1}},
[23]={{ 1, 0},{ 1,-1},{-1, 0},{ 1, 1},{ 0,-2},{ 1,-2}},
[02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}},
[20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}},
[13]={{ 0,-1},{ 0, 1},{ 1, 0}},
@@ -99,14 +99,14 @@ local TRS={
},--J
{},--L
{
[01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{-1,-1}},
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 0,-1},{ 1, 1}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2}},
[01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{ 0, 1}},
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 0,-1}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 0, 1}},
[30]={{-1, 0},{-1,-1},{ 0, 2},{-1, 2},{ 0,-1}},
[12]={{ 1, 0},{ 1,-1},{ 0,-1},{-1,-1},{ 0, 2},{ 1, 2}},
[21]={{-1, 0},{ 0,-2},{-1,-2},{ 1, 1}},
[21]={{-1, 0},{ 0,-2},{-1,-2},{ 1, 1},{ 1, 0}},
[32]={{-1, 0},{-1,-1},{ 0,-1},{ 1,-1},{ 0, 2},{-1, 2}},
[23]={{ 1, 0},{ 0,-2},{ 1,-2},{-1, 1}},
[23]={{ 1, 0},{ 0,-2},{ 1,-2},{-1, 1},{-1, 0}},
[02]={{-1, 0},{ 1, 0},{ 0, 1}},
[20]={{ 1, 0},{-1, 0},{ 0,-1}},
[13]={{ 0,-1},{ 0, 1},{ 1, 0},{ 0,-2},{ 0, 2}},
@@ -114,10 +114,9 @@ local TRS={
},--T
function(P,d)
if P.human then SFX.fieldPlay("rotate",nil,P)end
if P.gameEnv.easyFresh then P:freshLockDelay()end
if not P.gameEnv.ospin then return end
local x,y=P.curX,P.curY
if y==P.y_img and((P:solid(x-1,y)or P:solid(x-1,y+1)))and(P:solid(x+2,y)or P:solid(x+2,y+1))then
if y==P.imgY and((P:solid(x-1,y)or P:solid(x-1,y+1)))and(P:solid(x+2,y)or P:solid(x+2,y+1))then
local D=P.spinSeq%100*10+d
P.spinSeq=D
if D<100 then return end
@@ -136,7 +135,7 @@ local TRS={
P.dir,P.sc=dir,scs[id][dir]
P.spinLast=2
P.stat.rotate=P.stat.rotate+1
P:freshgho()
P:freshBlock(false,true)
P.spinSeq=0
SFX.fieldPlay("rotatekick",nil,P)
return
@@ -146,16 +145,17 @@ local TRS={
else
P.spinSeq=0
end
P:freshBlock(true,true)
end,--O
{
[01]={{ 0, 1},{ 1, 0},{-2, 0},{-2,-1},{ 1, 2}},
[10]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 2}},
[10]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}},
[03]={{ 0, 1},{-1, 0},{ 2, 0},{ 2,-1},{-1, 2}},
[30]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 2}},
[12]={{-1, 0},{ 2, 0},{ 0,-1},{-1, 2},{ 2,-1}},
[21]={{-2, 0},{ 1, 0},{ 0, 1},{ 1,-2},{-2, 1}},
[32]={{ 1, 0},{-2, 0},{ 0,-1},{ 1, 2},{-2,-1}},
[23]={{ 2, 0},{-1, 0},{ 0, 1},{-1,-2},{ 2, 1}},
[30]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}},
[12]={{-1, 0},{ 2, 0},{ 2,-1},{ 0,-1},{-1, 2}},
[21]={{-2, 0},{ 1, 0},{ 1,-2},{-2, 1},{ 0, 1}},
[32]={{ 1, 0},{-2, 0},{-2,-1},{ 0,-1},{ 1, 2}},
[23]={{ 2, 0},{-1, 0},{-1,-2},{ 2, 1},{ 0, 1}},
[02]={{-1, 0},{ 1, 0},{ 0,-1},{ 0, 1}},
[20]={{ 1, 0},{-1, 0},{ 0, 1},{ 0,-1}},
[13]={{ 0,-1},{-1, 0},{ 1, 0},{ 0, 1}},
@@ -186,23 +186,23 @@ local TRS={
{
[01]={{-1, 0},{ 1, 0},{-1, 1},{ 0,-2},{ 0,-3}},
[10]={{ 1, 0},{ 1,-1},{-1, 0},{ 0, 2},{ 0, 3}},
[03]={{ 1, 0},{ 1,-1}, { 0, 1},{ 0,-2},{ 0,-3}},
[30]={{-1, 0},{-1, 1},{ 1, 0},{ 0,-1},{ 0, 2},{ 0, 3}},
[03]={{ 1, 0},{ 1,-1},{ 0, 1},{ 0,-2},{ 0,-3}},
[30]={{-1, 1},{ 1, 0},{ 0,-1},{ 0, 2},{ 0, 3}},
[12]={{ 1, 0},{ 0,-1},{-1, 0},{ 0, 2}},
[21]={{-1, 0},{ 0, 1},{ 1, 0},{ 0,-2}},
[32]={{-1, 0},{-1, 1},{ 0, 1},{ 0,-1},{ 1, 0},{ 0, 2},{-2, 0}},
[23]={{ 1, 0},{ 1,-1},{ 0,-1},{ 0, 1},{-1, 0},{ 0,-2},{ 2, 0}},
[02]={{ 1, 0},{-1, 0},{ 0, 1}},
[20]={{-1, 0},{ 1, 0},{ 0,-1}},
[13]={{ 0,-1},{ 1, 0},{ 0, 1}},
[31]={{ 0,-1},{-1, 0},{ 0, 1}},
[32]={{-1, 0},{ 0, 1},{-1, 1},{ 1, 0},{ 0, 2},{-2, 0}},
[23]={{ 1, 0},{ 1,-1},{ 0,-1},{-1, 0},{ 0,-2},{ 2, 0}},
[02]={{ 1, 0},{-1, 0},{-1,-1}},
[20]={{-1, 0},{ 1, 0},{ 1, 1}},
[13]={{ 0,-1},{-1, 1},{ 0, 1}},
[31]={{ 0,-1},{ 1,-1},{ 0, 1}},
},--F
{},--E
{
[01]={{ 0,-1},{-1,-1},{ 1,-1},{ 1, 0},{ 1,-3},{-1, 0},{ 0, 2},{-1, 2}},
[10]={{ 1, 0},{ 0,-1},{-1,-1},{ 0,-2},{ 0,-3},{ 1,-2},{ 0, 1}},
[01]={{ 0,-1},{-1,-1},{ 1, 1},{ 1, 0},{ 1,-3},{-1, 0},{ 0, 2},{-1, 2}},
[10]={{ 1, 0},{ 0,-1},{-1,-1},{ 0,-2},{-1, 1},{ 0,-3},{ 1,-2},{ 0, 1}},
[03]={{ 0,-1},{ 1,-1},{-1,-1},{-1, 0},{-1,-3},{ 1, 0},{ 0, 2},{ 1, 2}},
[30]={{-1, 0},{ 0,-1},{ 1,-1},{ 0,-2},{ 0,-3},{-1,-2},{ 0, 1}},
[30]={{-1, 0},{ 0,-1},{ 1,-1},{ 0,-2},{ 1, 1},{ 0,-3},{-1,-2},{ 0, 1}},
[12]={{ 1, 0},{-1, 0},{ 0,-2},{ 0,-3},{ 0, 1},{-1, 1}},
[21]={{ 1,-1},{-1, 0},{ 1, 0},{ 0,-1},{ 0, 2},{ 0, 3}},
[32]={{-1, 0},{ 1, 0},{ 0,-2},{ 0,-3},{ 0, 1},{ 1, 1}},
@@ -213,10 +213,10 @@ local TRS={
[31]={{-1, 0},{ 1, 1},{ 2, 0}},
},--T5
{
[01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-1},{-1,-2}},
[10]={{ 1, 0},{ 1,-1}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-1},{ 1,-2}},
[30]={{-1, 0},{-1,-1}},
[01]={{-1, 0},{-1, 1},{ 0,-2},{-1,-2},{-1,-3}},
[10]={{ 1, 0},{ 1,-1},{ 0, 2},{ 1, 2},{ 1, 3}},
[03]={{ 1, 0},{ 1, 1},{ 0,-2},{ 1,-2},{ 1,-3}},
[30]={{-1, 0},{-1,-1},{ 0,-2},{-1, 2},{-1, 3}},
[12]={{ 1, 0},{ 1,-1},{ 1, 1}},
[21]={{-1,-1},{-1, 1},{-1,-1}},
[32]={{-1, 0},{-1,-1},{-1, 1}},
@@ -256,18 +256,18 @@ local TRS={
},--W
function(P,d)
if P.human then SFX.fieldPlay("rotate",nil,P)end
if P.gameEnv.easyFresh then P:freshLockDelay()end
local iki=XspinList[d]
for test=1,#iki do
local x,y=P.curX+iki[test][1],P.curY+iki[test][2]
if not P:ifoverlap(P.cur.bk,x,y)then
P.curX,P.curY=x,y
P.spinLast=1
P:freshgho()
P:freshBlock(false,true)
P.stat.rotate=P.stat.rotate+1
return
end
end
P:freshBlock(true,true)
end,--X
{
[01]={{-1, 0},{-1, 1},{ 0,-3},{-1, 1},{-1, 2},{ 0, 1}},

View File

@@ -1,3 +1,4 @@
local sin,cos=math.sin,math.cos
snapLevelValue={1,10,20,40,60,80}
title={
{
@@ -114,6 +115,12 @@ title={
5878, 463,
},
}
for _,C in next,title do
for i=1,#C do
C[i]=C[i]*.1626
end
end
--[[
title2={}
for i=1,#title do title2[i]=title[i]end
title2[5]={
@@ -140,12 +147,22 @@ title2[5]={
3001, 1280,
2779, 1280,
}
for _,C in next,title do
for i=1,#C do
C[i]=C[i]*.1626
]]
title_fan={}
for i=1,8 do
local L={}
title_fan[i]=L
for j=1,#title[i]do
L[j]=title[i][j]
end
for j=1,#L,2 do
local x,y=L[j],L[j+1]--0<x<3041, 290<y<1280
x,y=-(x+240+y*.3)*.002,(y-580)*.9
x,y=y*cos(x),-y*sin(x)--Rec-Pol-Rec
L[j],L[j+1]=x,y+300
end
end
customID={
"drop","lock",
"wait","fall",
@@ -168,7 +185,7 @@ customRange={
target={10,20,40,100,200,500,1000,1e99},
freshLimit={0,8,15,1e99},
opponent={0,1,2,3,4,5,11,12,13,14,15,16},
bg={"none","game1","game2","game3","aura","rgb","glow","matrix"},
bg={"none","bg1","bg2","rainbow","aura","rgb","glow","matrix"},
bgm={"blank","way","race","newera","push","reason","infinite","secret7th","secret8th","rockblock"},
}
local function T(s,t)return love.graphics.newText(setFont(s),t)end
@@ -189,20 +206,17 @@ drawableText={
mxcmb=T(20,"Max Combo"),
pc=T(20,"Perfect Clear"),
ko=T(25,"KO"),
D=T(100,"D"),
C=T(100,"C"),
B=T(100,"B"),
A=T(100,"A"),
S=T(100,"S"),
D=T(100,"D"),C=T(100,"C"),B=T(100,"B"),A=T(100,"A"),S=T(100,"S"),
modeName=T(30),levelName=T(30),
anykey=T(40),
replaying=T(20),
next=T(40),hold=T(40),
win=T(120),finish=T(120),
lose=T(120),pause=T(120),
gameover=T(100),pause=T(120),
custom=T(80),sequence=T(80),
setting_game=T(80),setting_video=T(80),setting_sound=T(80),
@@ -210,9 +224,7 @@ drawableText={
preview=T(40),
keyboard=T(25),joystick=T(25),
ctrlSetHelp=T(30),
musicRoom=T(80),
nowPlaying=T(50),
musicRoom=T(80),nowPlaying=T(50),
VKTchW=T(30),VKOrgW=T(30),VKCurW=T(30),
noScore=T(45),
highScore=T(30),
noScore=T(45),highScore=T(30),
}

View File

@@ -27,8 +27,8 @@ return{
{name="round_4", x=-900, y=-800, size=35,shape=1,icon="round", unlock={"round_5"}},
{name="round_5", x=-1100, y=-800, size=35,shape=1,icon="round", unlock={}},
{name="master_beginner", x=0, y=-1000, size=35,shape=1,icon="master", unlock={"master_adavnce"}},
{name="master_adavnce", x=0, y=-1200, size=35,shape=1,icon="master", unlock={"master_final","GM"}},
{name="master_beginner", x=0, y=-1000, size=35,shape=1,icon="master", unlock={"master_advance"}},
{name="master_advance", x=0, y=-1200, size=35,shape=1,icon="master", unlock={"master_final","GM"}},
{name="master_final", x=0, y=-1400, size=40,shape=2,icon="master", unlock={}},
{name="GM", x=150, y=-1500, size=35,shape=1,icon="master", unlock={}},
@@ -82,5 +82,5 @@ return{
{name="infinite_dig", x=-1000, y=-600, size=35,shape=1,icon="infinite_dig",unlock={}},
{name="custom_clear", x=200, y=-350, size=45,shape=3,icon="custom", unlock={}},
{name="custom_puzzle", x=200, y=-200, size=45,shape=3,icon="puzzle", unlock={}},
{name="sprintPenta", x=-200, y=-200, size=45,shape=3,icon="sprint", unlock={}},
{name="sprintPenta", x=-200, y=-200, size=50,shape=2,icon="sprint", unlock={}},
}

File diff suppressed because it is too large Load Diff

View File

@@ -18,6 +18,8 @@ local list={
"paper(mrz)",
"classic(_)",
"brick(notypey)",
"retro(notypey)",
"retro_grey(notypey)",
"text_bone(mrz)",
"colored_bone(mrz)",
"white_bone(mrz)",
@@ -97,33 +99,33 @@ function SKIN.load()
gc.pop()
end
local L=#list
function SKIN.prevSet()--prev skin_set
function SKIN.prevSet()--Prev skin_set
local _=(setting.skinSet-2)%L+1
setting.skinSet=_
SKIN.change(_)
_=list[_]
TEXT.show(_,1100,100,int(300/#_)+5,"fly")
end
function SKIN.nextSet()--next skin_set
function SKIN.nextSet()--Next skin_set
local _=setting.skinSet%L+1
setting.skinSet=_
SKIN.change(_)
_=list[_]
TEXT.show(_,1100,100,int(300/#_)+5,"fly")
end
function SKIN.prev(i)--prev skin for [i]
function SKIN.prev(i)--Prev skin for [i]
local _=setting.skin
_[i]=(_[i]-2)%11+1
end
function SKIN.next(i)--next skin for [i]
function SKIN.next(i)--Next skin for [i]
local _=setting.skin
_[i]=_[i]%11+1
end
function SKIN.rotate(i)--change direction of [i]
function SKIN.rotate(i)--Change direction of [i]
setting.face[i]=(setting.face[i]+1)%4
SFX.play("rotate")
end
function SKIN.change(i)--change to skin_set[i]
function SKIN.change(i)--Change to skin_set[i]
blockSkin=SKIN.lib[i]
blockSkinMini=SKIN.libMini[i]
end

View File

@@ -1,9 +1,9 @@
local N1,N2={1,2},{2,1}
local N3,N4={2,2},{1.5,1.5}
local I1,I2={0.5,2.5},{2.5,0.5}
local I3,I4={1.5,2.5},{2.5,1.5}
local V4={2.5,2.5}
local L1,L2={1,3},{3,1}
local N1,N2={0,1},{1,0}
local N3,N4={1,1},{.5,.5}
local I1,I2={-.5,1.5},{1.5,-.5}
local I3,I4={.5,1.5},{1.5,.5}
local V4={1.5,1.5}
local L1,L2={0,2},{2,0}
local scs={
--Tetramino
{[0]=N1,N2,N3,N3},--Z

View File

@@ -3,9 +3,10 @@ local Tick={}
function Tick.finish(P)
P.endCounter=P.endCounter+1
if P.endCounter<40 then
--Make field visible
for j=1,#P.field do for i=1,10 do
if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
end end--Make field visible
end end
elseif P.endCounter==60 then
return true
end
@@ -13,9 +14,10 @@ end
function Tick.lose(P)
P.endCounter=P.endCounter+1
if P.endCounter<40 then
--Make field visible
for j=1,#P.field do for i=1,10 do
if P.visTime[j][i]<20 then P.visTime[j][i]=P.visTime[j][i]+.5 end
end end--Make field visible
end end
elseif P.endCounter>80 then
for i=1,#P.field do
for j=1,10 do
@@ -35,6 +37,7 @@ function Tick.lose(P)
end
if not modeEnv.royaleMode and #players>1 then
P.y=P.y+P.endCounter*.26
P.absFieldY=P.absFieldY+P.endCounter*.26
end
end
function Tick.throwBadge(data)--{ifAI,Sender,timer}
@@ -52,8 +55,9 @@ function Tick.throwBadge(data)--{ifAI,Sender,timer}
else
x2,y2=R.x+66*R.size,R.y+344*R.size
end
--Generate badge object
FX_badge[#FX_badge+1]={x1,y1,x2,y2,t=0}
--generate badge object
if not data[1]and data[3]%8==0 then
SFX.play("collect")
@@ -63,6 +67,7 @@ function Tick.throwBadge(data)--{ifAI,Sender,timer}
end
function Tick.autoPause(data)
data[1]=data[1]+1
if SCN.cur~="play"then return true end
if data[1]==120 then
if SCN.cur=="play"then
pauseGame()
@@ -70,14 +75,4 @@ function Tick.autoPause(data)
return true
end
end
function Tick.autoResize(data)
data[1]=data[1]+1
if data[1]==62 then
local w,h=gc.getWidth(),gc.getHeight()
if w<h then
love.resize(w,h)
end
return true
end
end
return Tick

File diff suppressed because it is too large Load Diff