Compare commits
8 Commits
pre0.17.0-
...
pre0.17.0-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
36de1c0751 | ||
|
|
704341fd15 | ||
|
|
22b61bc9c3 | ||
|
|
f4cbbc0a2a | ||
|
|
dc99187b9d | ||
|
|
915598dec4 | ||
|
|
e7b4518d73 | ||
|
|
9603a78e87 |
@@ -42,16 +42,28 @@ function SFX.init(list)
|
||||
end
|
||||
function SFX.load(path)
|
||||
local c=0
|
||||
local missing=0
|
||||
for i=1,#sfxList do
|
||||
local fullPath=path..sfxList[i]..'.ogg'
|
||||
if love.filesystem.getInfo(fullPath)then
|
||||
if Sources[sfxList[i]]then
|
||||
for j=1,#Sources[sfxList[i]]do
|
||||
Sources[sfxList[i]][j]:release()
|
||||
end
|
||||
end
|
||||
Sources[sfxList[i]]={love.audio.newSource(fullPath,'static')}
|
||||
c=c+1
|
||||
else
|
||||
LOG("No SFX: "..sfxList[i]..'.ogg',.1)
|
||||
missing=missing+1
|
||||
end
|
||||
end
|
||||
LOG(c.."/"..#sfxList.." SFX files loaded")
|
||||
LOG(missing.." SFX files missing")
|
||||
if missing>0 then
|
||||
MES.new('info',missing.." SFX files missing")
|
||||
end
|
||||
collectgarbage()
|
||||
end
|
||||
function SFX.loadSample(pack)
|
||||
assert(type(pack)=='table',"Usage: SFX.loadsample([table])")
|
||||
|
||||
@@ -303,17 +303,6 @@ function key:draw()
|
||||
local align=self.align
|
||||
local r,g,b=c[1],c[2],c[3]
|
||||
|
||||
--Background
|
||||
gc_setColor(0,0,0,.3)
|
||||
gc_rectangle('fill',x,y,w,h,4)
|
||||
|
||||
--Frame
|
||||
if not self.noFrame then
|
||||
gc_setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
|
||||
gc_setLineWidth(2)
|
||||
gc_rectangle('line',x,y,w,h,3)
|
||||
end
|
||||
|
||||
--Fill
|
||||
if self.fShade then
|
||||
gc_setColor(r,g,b,ATV*.25)
|
||||
@@ -325,6 +314,16 @@ function key:draw()
|
||||
gc_draw(self.fShade,x+w-self.edge-self.fShade:getWidth(),y+h*.5-self.fShade:getHeight()*.5)
|
||||
end
|
||||
else
|
||||
--Background
|
||||
gc_setColor(0,0,0,.3)
|
||||
gc_rectangle('fill',x,y,w,h,4)
|
||||
|
||||
--Frame
|
||||
gc_setColor(.2+r*.8,.2+g*.8,.2+b*.8,.7)
|
||||
gc_setLineWidth(2)
|
||||
gc_rectangle('line',x,y,w,h,3)
|
||||
|
||||
--Shade
|
||||
gc_setColor(1,1,1,ATV*.05)
|
||||
gc_rectangle('fill',x,y,w,h,3)
|
||||
end
|
||||
@@ -351,7 +350,7 @@ function key:press(_,_,k)
|
||||
SFX.play('key')
|
||||
end
|
||||
end
|
||||
function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,noFrame][,color][,font=30][,fType][,sound=true][,align='M'][,edge=0][,code][,hideF][,hide]
|
||||
function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,color][,font=30][,fType][,sound=true][,align='M'][,edge=0][,code][,hideF][,hide]
|
||||
if not D.h then D.h=D.w end
|
||||
local _={
|
||||
name= D.name or"_",
|
||||
@@ -371,10 +370,9 @@ function WIDGET.newKey(D)--name,x,y,w[,h][,fText][,fShade][,noFrame][,color][,fo
|
||||
|
||||
fText= D.fText,
|
||||
fShade= D.fShade,
|
||||
noFrame=D.noFrame,
|
||||
color= D.color and(COLOR[D.color]or D.color)or COLOR.Z,
|
||||
font= D.font or 30,
|
||||
fType=D.fType,
|
||||
fType= D.fType,
|
||||
sound= D.sound~=false,
|
||||
align= D.align or'M',
|
||||
edge= D.edge or 0,
|
||||
@@ -635,7 +633,7 @@ function WIDGET.newSlider(D)--name,x,y,w[,lim][,fText][,color][,unit][,smooth][,
|
||||
unit= D.unit or 1,
|
||||
smooth=false,
|
||||
font= D.font or 30,
|
||||
fType=D.fType,
|
||||
fType= D.fType,
|
||||
change=D.change,
|
||||
disp= D.disp,
|
||||
code= D.code or NULL,
|
||||
@@ -951,7 +949,7 @@ function WIDGET.newInputBox(D)--name,x,y,w[,h][,font=30][,fType][,secret][,regex
|
||||
},
|
||||
|
||||
font= D.font or int(D.h/7-1)*5,
|
||||
fType=D.fType,
|
||||
fType= D.fType,
|
||||
secret=D.secret==true,
|
||||
regex= D.regex,
|
||||
limit= D.limit,
|
||||
|
||||
3
main.lua
3
main.lua
@@ -23,8 +23,7 @@ local fs=love.filesystem
|
||||
VERSION=require"version"
|
||||
TIME=love.timer.getTime
|
||||
YIELD=coroutine.yield
|
||||
SYSTEM=love.system.getOS()
|
||||
if SYSTEM=='OS X'then SYSTEM='macOS'end
|
||||
SYSTEM=love.system.getOS()if SYSTEM=='OS X'then SYSTEM='macOS'end
|
||||
FNSF=SYSTEM:find'\79\83'--What does FNSF stand for? IDK so don't ask me lol
|
||||
MOBILE=SYSTEM=='Android'or SYSTEM=='iOS'
|
||||
SAVEDIR=fs.getSaveDirectory()
|
||||
|
||||
@@ -25,8 +25,8 @@ function bot_cc:revive()
|
||||
self.P:loadAI(self.data)
|
||||
end
|
||||
function bot_cc:pushNewNext(id)
|
||||
self.ccBot:addNext(rem(self.nexts,1))
|
||||
ins(self.nexts,id)
|
||||
self.ccBot:addNext(rem(self.bufferedNexts,1))
|
||||
ins(self.bufferedNexts,id)
|
||||
end
|
||||
function bot_cc:thread()
|
||||
local P,keys=self.P,self.keys
|
||||
|
||||
@@ -12,7 +12,7 @@ local baseBot={
|
||||
function baseBot.update(bot)
|
||||
local P=bot.P
|
||||
local keys=bot.keys
|
||||
if P.control and P.waiting==0 then
|
||||
if P.control and P.cur then
|
||||
bot.delay=bot.delay-1
|
||||
if not keys[1]then
|
||||
if bot.runningThread then
|
||||
@@ -85,7 +85,7 @@ function BOT.new(P,data)
|
||||
if data.type=="CC"then
|
||||
P:setRS('SRS')
|
||||
bot.keys={}
|
||||
bot.nexts={}
|
||||
bot.bufferedNexts={}
|
||||
bot.delay=data.delay
|
||||
bot.delay0=data.delay
|
||||
if P.gameEnv.holdCount>1 then
|
||||
@@ -109,20 +109,25 @@ function BOT.new(P,data)
|
||||
return
|
||||
self.ccBot[k]and function(_,...)self.ccBot[k](self.ccBot,...)end or
|
||||
cc_lua[k]and function(_,...)cc_lua[k](self,...)end or
|
||||
baseBot[k]and baseBot[k]or
|
||||
error("No actions called "..k)
|
||||
assert(baseBot[k],"No CC action called "..k)
|
||||
end})
|
||||
|
||||
for i,B in next,P.nextQueue do
|
||||
if i<=data.next then
|
||||
local pushed=0
|
||||
if P.cur then
|
||||
bot:addNext(P.cur.id)
|
||||
pushed=pushed+1
|
||||
end
|
||||
for _,B in next,P.nextQueue do
|
||||
if pushed<=data.next then
|
||||
bot:addNext(B.id)
|
||||
pushed=pushed+1
|
||||
else
|
||||
ins(bot.nexts,B.id)
|
||||
ins(bot.bufferedNexts,B.id)
|
||||
end
|
||||
end
|
||||
bot.runningThread=coroutine.wrap(cc_lua.thread)
|
||||
bot.runningThread(bot)
|
||||
elseif data.type=="9S"or true then--9s or else
|
||||
else--if data.type=="9S"then--9s or else
|
||||
TABLE.cover(baseBot,bot)
|
||||
TABLE.cover(require"parts.bot.bot_9s",bot)
|
||||
P:setRS('TRS')
|
||||
|
||||
@@ -3,6 +3,7 @@ return
|
||||
drop=1,
|
||||
wait=8,
|
||||
fall=20,
|
||||
fieldH=10,
|
||||
mesDisp=function(P)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
PLY.draw.drawTargetLine(P,200-P.stat.row)
|
||||
|
||||
@@ -5,6 +5,7 @@ return
|
||||
drop=120,
|
||||
wait=8,
|
||||
fall=20,
|
||||
fieldH=10,
|
||||
mesDisp=function(P)
|
||||
PLY.draw.drawProgress(P.stat.row,P.modeData.target)
|
||||
PLY.draw.drawTargetLine(P,200-P.stat.row)
|
||||
|
||||
@@ -10,7 +10,7 @@ return{
|
||||
end
|
||||
setField(P,D.finished+1)
|
||||
SYSFX.newShade(1.4,P.absFieldX,P.absFieldY,300*P.size,610*P.size,.6,.8,.6)
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
else
|
||||
P:win('finish')
|
||||
end
|
||||
|
||||
@@ -41,15 +41,15 @@ return{
|
||||
if D.target==110 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=5,5
|
||||
P.gameEnv.sddas,P.gameEnv.sdarr=5,5
|
||||
SFX.play('blip_2',.7)
|
||||
SFX.play('warn_2',.7)
|
||||
elseif D.target==140 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=4,4
|
||||
P.gameEnv.sddas,P.gameEnv.sdarr=4,4
|
||||
SFX.play('blip_2',.7)
|
||||
SFX.play('warn_2',.7)
|
||||
elseif D.target==170 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=3,3
|
||||
P.gameEnv.sddas,P.gameEnv.sdarr=3,3
|
||||
SFX.play('blip_2',.7)
|
||||
SFX.play('warn_2',.7)
|
||||
elseif D.target==200 then
|
||||
P:win('finish')
|
||||
return
|
||||
|
||||
@@ -40,7 +40,7 @@ return{
|
||||
if D.target==110 then
|
||||
P.gameEnv.drop,P.gameEnv.lock=2,2
|
||||
P.gameEnv.sddas,P.gameEnv.sdarr=2,2
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
elseif D.target==200 then
|
||||
P:win('finish')
|
||||
return
|
||||
|
||||
@@ -20,7 +20,7 @@ return{
|
||||
D.pt=D.pt+s
|
||||
|
||||
if D.pt%100==99 then
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
s=D.target/100--range from 1 to 9
|
||||
local E=P.gameEnv
|
||||
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
D.pt=D.pt+s
|
||||
|
||||
if D.pt%100==99 then
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
s=D.target/100
|
||||
local E=P.gameEnv
|
||||
|
||||
@@ -24,7 +24,7 @@ return{
|
||||
D.pt=D.pt+s
|
||||
|
||||
if D.pt%100==99 then
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
elseif D.pt>=D.target then--Level up!
|
||||
s=D.target/100
|
||||
local E=P.gameEnv
|
||||
|
||||
@@ -147,7 +147,7 @@ return
|
||||
|
||||
P.modeData.target=260
|
||||
p=260
|
||||
SFX.play('blip_2')
|
||||
SFX.play('warn_2')
|
||||
SFX.play('reach')
|
||||
else
|
||||
p=260
|
||||
|
||||
@@ -818,7 +818,7 @@ do--function checkWarning()
|
||||
end
|
||||
GAME.warnLVL=_
|
||||
if GAME.warnLVL>1.126 and P1.frameRun%30==0 then
|
||||
SFX.fplay('warning',SETTING.sfx_warn)
|
||||
SFX.fplay('warn_beep',SETTING.sfx_warn)
|
||||
end
|
||||
elseif GAME.warnLVL>0 then
|
||||
GAME.warnLVL=max(GAME.warnLVL-.026,0)
|
||||
|
||||
@@ -157,7 +157,7 @@ function NETPLY.setJoinMode(uid,ready)
|
||||
return
|
||||
end
|
||||
end
|
||||
SFX.play('blip_2',.5)
|
||||
SFX.play('warn_2',.5)
|
||||
end
|
||||
end
|
||||
return
|
||||
|
||||
@@ -136,7 +136,7 @@ local function _newEmptyPlayer(id,mini)
|
||||
}
|
||||
P.newNext=false--Warped coroutine to get new next, loaded in applyGameEnv()
|
||||
]]
|
||||
P.movDir,P.moving,P.downing=0,0,0--Last move key,DAS charging,downDAS charging
|
||||
P.movDir,P.moving,P.downing=0,0,-1--Last move key,DAS charging,downDAS charging
|
||||
P.dropDelay,P.lockDelay=0,0
|
||||
P.waiting,P.falling=0,0
|
||||
P.freshTime=0
|
||||
|
||||
@@ -220,7 +220,7 @@ function Player:act_moveLeft(auto)
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
end
|
||||
self.movDir=-1
|
||||
if self.control and self.waiting==0 then
|
||||
if self.cur then
|
||||
if self.cur and not self:ifoverlap(self.cur.bk,self.curX-1,self.curY)then
|
||||
self:createMoveFX('left')
|
||||
self.curX=self.curX-1
|
||||
@@ -241,7 +241,7 @@ function Player:act_moveRight(auto)
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
end
|
||||
self.movDir=1
|
||||
if self.control and self.waiting==0 then
|
||||
if self.cur then
|
||||
if self.cur and not self:ifoverlap(self.cur.bk,self.curX+1,self.curY)then
|
||||
self:createMoveFX('right')
|
||||
self.curX=self.curX+1
|
||||
@@ -258,21 +258,21 @@ function Player:act_moveRight(auto)
|
||||
end
|
||||
end
|
||||
function Player:act_rotRight()
|
||||
if self.control and self.cur then
|
||||
if self.cur then
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
self:spin(1)
|
||||
self.keyPressing[3]=false
|
||||
end
|
||||
end
|
||||
function Player:act_rotLeft()
|
||||
if self.control and self.cur then
|
||||
if self.cur then
|
||||
self.ctrlCount=self.ctrlCount+1
|
||||
self:spin(3)
|
||||
self.keyPressing[4]=false
|
||||
end
|
||||
end
|
||||
function Player:act_rot180()
|
||||
if self.control and self.cur then
|
||||
if self.cur then
|
||||
self.ctrlCount=self.ctrlCount+2
|
||||
self:spin(2)
|
||||
self.keyPressing[5]=false
|
||||
@@ -280,7 +280,7 @@ function Player:act_rot180()
|
||||
end
|
||||
function Player:act_hardDrop()
|
||||
local ENV=self.gameEnv
|
||||
if self.control and self.cur then
|
||||
if self.cur then
|
||||
if self.lastPiece.autoLock and self.frameRun-self.lastPiece.frame<ENV.dropcut then
|
||||
SFX.play('drop_cancel',.3)
|
||||
else
|
||||
@@ -304,12 +304,19 @@ function Player:act_hardDrop()
|
||||
end
|
||||
end
|
||||
function Player:act_softDrop()
|
||||
self.downing=1
|
||||
if self.control and self.cur then
|
||||
self.downing=0
|
||||
if self.cur then
|
||||
if self.curY>self.ghoY then
|
||||
self.curY=self.curY-1
|
||||
self:freshBlock('fresh')
|
||||
self.spinLast=false
|
||||
if self.gameEnv.sddas==0 then
|
||||
if self.gameEnv.sdarr==0 then
|
||||
self:act_insDown()
|
||||
else
|
||||
self:act_down1()
|
||||
self:act_down1()
|
||||
end
|
||||
else
|
||||
self:act_down1()
|
||||
end
|
||||
self:checkTouchSound()
|
||||
elseif self.gameEnv.deepdrop then
|
||||
self:_deepdrop()
|
||||
@@ -317,7 +324,7 @@ function Player:act_softDrop()
|
||||
end
|
||||
end
|
||||
function Player:act_hold()
|
||||
if self.control and self.cur then
|
||||
if self.cur then
|
||||
if self:hold()then
|
||||
self.keyPressing[8]=false
|
||||
end
|
||||
@@ -819,7 +826,7 @@ function Player:receive(A,send,time,line)
|
||||
self.atkBufferSum=self.atkBufferSum+send
|
||||
self.stat.recv=self.stat.recv+send
|
||||
if self.sound then
|
||||
SFX.play(send<4 and'blip_1'or'blip_2',min(send+1,5)*.1)
|
||||
SFX.play(send<4 and'warn_1'or'warn_2',min(send+1,5)*.1)
|
||||
end
|
||||
if send>=2 then
|
||||
self:shakeField(send/2)
|
||||
@@ -889,7 +896,7 @@ function Player:freshBlock(mode,ifTele)--string mode: push/move/fresh/newBlock
|
||||
if(mode=='move'or mode=='newBlock'or mode=='push')and self.cur then
|
||||
local CB=self.cur.bk
|
||||
self.ghoY=min(#self.field+1,self.curY)
|
||||
if self._20G or ENV.sdarr==0 and self.keyPressing[7]and self.downing>ENV.sddas then
|
||||
if self._20G or ENV.sdarr==0 and self.keyPressing[7]and self.downing>=ENV.sddas then
|
||||
local _=self.ghoY
|
||||
|
||||
--Move ghost to bottom
|
||||
@@ -1325,7 +1332,7 @@ function Player:hold_swap(ifpre)
|
||||
self.stat.hold=self.stat.hold+1
|
||||
end
|
||||
function Player:hold(ifpre)
|
||||
if self.holdTime>0 and(ifpre or self.falling==0 and self.waiting==0)then
|
||||
if self.holdTime>0 and(self.cur or ifpre)then
|
||||
if self.gameEnv.holdMode=='hold'then
|
||||
self:hold_norm(ifpre)
|
||||
elseif self.gameEnv.holdMode=='swap'then
|
||||
@@ -2048,7 +2055,7 @@ do
|
||||
return _cc,_gbcc
|
||||
end
|
||||
end
|
||||
function Player:loadAI(data)--Load AI params
|
||||
function Player:loadAI(data)--Load AI with params
|
||||
self.bot=BOT.new(self,data)
|
||||
self.bot.data=data
|
||||
end
|
||||
@@ -2301,6 +2308,9 @@ local function update_alive(P)
|
||||
P.control=true
|
||||
P.timing=true
|
||||
P:popNext()
|
||||
if P.bot then
|
||||
P.bot:updateField()
|
||||
end
|
||||
end
|
||||
if P.movDir~=0 then
|
||||
if P.moving<P.gameEnv.das then
|
||||
@@ -2413,8 +2423,7 @@ local function update_alive(P)
|
||||
--Drop pressed
|
||||
if P.keyPressing[7]then
|
||||
P.downing=P.downing+1
|
||||
local d=P.downing-ENV.sddas
|
||||
if d>1 then
|
||||
if P.downing>=ENV.sddas then
|
||||
if ENV.sdarr==0 then
|
||||
P:act_insDown()
|
||||
end
|
||||
@@ -2423,7 +2432,7 @@ local function update_alive(P)
|
||||
end
|
||||
end
|
||||
else
|
||||
P.downing=0
|
||||
P.downing=-1
|
||||
end
|
||||
|
||||
local stopAtFalling
|
||||
@@ -2457,7 +2466,7 @@ local function update_alive(P)
|
||||
local dist--Drop distance
|
||||
if D>1 then
|
||||
D=D-1
|
||||
if P.downing>ENV.sddas then
|
||||
if P.keyPressing[7]and P.downing>=ENV.sddas then
|
||||
D=D-ceil(ENV.drop/ENV.sdarr)
|
||||
end
|
||||
if D<=0 then
|
||||
@@ -2468,7 +2477,7 @@ local function update_alive(P)
|
||||
goto THROW_stop
|
||||
end
|
||||
elseif D==1 then--We don't know why dropDelay is 1, so checking ENV.drop>1 is neccessary
|
||||
if ENV.drop>1 and P.downing>ENV.sddas and(P.downing-ENV.sddas)%ENV.sdarr==0 then
|
||||
if ENV.drop>1 and P.downing>=ENV.sddas and(P.downing-ENV.sddas)%ENV.sdarr==0 then
|
||||
dist=2
|
||||
else
|
||||
dist=1
|
||||
|
||||
@@ -187,7 +187,7 @@ function scene.update(dt)
|
||||
speed=speed+.2
|
||||
end
|
||||
level=level+1
|
||||
SFX.play('blip_1')
|
||||
SFX.play('warn_1')
|
||||
end
|
||||
sunH=sunH+.01
|
||||
elseif menu==1 then
|
||||
|
||||
@@ -209,7 +209,7 @@ function scene.keyDown(key)
|
||||
elseif key=='n'then
|
||||
ins(FIELD,page+1,DATA.newBoard(FIELD[page]))
|
||||
page=page+1
|
||||
SFX.play('blip_1',.8)
|
||||
SFX.play('warn_1',.8)
|
||||
SYSFX.newShade(3,200,60,300,600,.5,1,.5)
|
||||
elseif key=='m'then
|
||||
rem(FIELD,page)
|
||||
@@ -438,32 +438,32 @@ scene.widgetList={
|
||||
WIDGET.newText{name='title', x=1020,y=5,font=70,align='R'},
|
||||
WIDGET.newText{name='subTitle', x=1030,y=50,font=35,align='L',color='H'},
|
||||
|
||||
WIDGET.newButton{name='b1', x=580, y=130,w=76,fText="",color='R',code=_setPen(1)},--B1
|
||||
WIDGET.newButton{name='b2', x=660, y=130,w=76,fText="",color='F',code=_setPen(2)},--B2
|
||||
WIDGET.newButton{name='b3', x=740, y=130,w=76,fText="",color='O',code=_setPen(3)},--B3
|
||||
WIDGET.newButton{name='b4', x=820, y=130,w=76,fText="",color='Y',code=_setPen(4)},--B4
|
||||
WIDGET.newButton{name='b5', x=900, y=130,w=76,fText="",color='L',code=_setPen(5)},--B5
|
||||
WIDGET.newButton{name='b6', x=980, y=130,w=76,fText="",color='J',code=_setPen(6)},--B6
|
||||
WIDGET.newButton{name='b7', x=1060,y=130,w=76,fText="",color='G',code=_setPen(7)},--B7
|
||||
WIDGET.newButton{name='b8', x=1140,y=130,w=76,fText="",color='A',code=_setPen(8)},--B8
|
||||
WIDGET.newButton{name='b1', x=580, y=130,w=73,fText="",color='R',code=_setPen(1)},--B1
|
||||
WIDGET.newButton{name='b2', x=660, y=130,w=73,fText="",color='F',code=_setPen(2)},--B2
|
||||
WIDGET.newButton{name='b3', x=740, y=130,w=73,fText="",color='O',code=_setPen(3)},--B3
|
||||
WIDGET.newButton{name='b4', x=820, y=130,w=73,fText="",color='Y',code=_setPen(4)},--B4
|
||||
WIDGET.newButton{name='b5', x=900, y=130,w=73,fText="",color='L',code=_setPen(5)},--B5
|
||||
WIDGET.newButton{name='b6', x=980, y=130,w=73,fText="",color='J',code=_setPen(6)},--B6
|
||||
WIDGET.newButton{name='b7', x=1060,y=130,w=73,fText="",color='G',code=_setPen(7)},--B7
|
||||
WIDGET.newButton{name='b8', x=1140,y=130,w=73,fText="",color='A',code=_setPen(8)},--B8
|
||||
|
||||
WIDGET.newButton{name='b9', x=580, y=210,w=76,fText="",color='C',code=_setPen(9)},--B9
|
||||
WIDGET.newButton{name='b10', x=660, y=210,w=76,fText="",color='N',code=_setPen(10)},--B10
|
||||
WIDGET.newButton{name='b11', x=740, y=210,w=76,fText="",color='S',code=_setPen(11)},--B11
|
||||
WIDGET.newButton{name='b12', x=820, y=210,w=76,fText="",color='B',code=_setPen(12)},--B12
|
||||
WIDGET.newButton{name='b13', x=900, y=210,w=76,fText="",color='V',code=_setPen(13)},--B13
|
||||
WIDGET.newButton{name='b14', x=980, y=210,w=76,fText="",color='P',code=_setPen(14)},--B14
|
||||
WIDGET.newButton{name='b15', x=1060,y=210,w=76,fText="",color='M',code=_setPen(15)},--B15
|
||||
WIDGET.newButton{name='b16', x=1140,y=210,w=76,fText="",color='W',code=_setPen(16)},--B16
|
||||
WIDGET.newButton{name='b9', x=580, y=210,w=73,fText="",color='C',code=_setPen(9)},--B9
|
||||
WIDGET.newButton{name='b10', x=660, y=210,w=73,fText="",color='N',code=_setPen(10)},--B10
|
||||
WIDGET.newButton{name='b11', x=740, y=210,w=73,fText="",color='S',code=_setPen(11)},--B11
|
||||
WIDGET.newButton{name='b12', x=820, y=210,w=73,fText="",color='B',code=_setPen(12)},--B12
|
||||
WIDGET.newButton{name='b13', x=900, y=210,w=73,fText="",color='V',code=_setPen(13)},--B13
|
||||
WIDGET.newButton{name='b14', x=980, y=210,w=73,fText="",color='P',code=_setPen(14)},--B14
|
||||
WIDGET.newButton{name='b15', x=1060,y=210,w=73,fText="",color='M',code=_setPen(15)},--B15
|
||||
WIDGET.newButton{name='b16', x=1140,y=210,w=73,fText="",color='W',code=_setPen(16)},--B16
|
||||
|
||||
WIDGET.newButton{name='b17', x=580, y=290,w=76,font=40,fText=CHAR.icon.bone, color='dH',code=_setPen(17)},--BONE
|
||||
WIDGET.newButton{name='b18', x=660, y=290,w=76,font=40,fText=CHAR.icon.invis, color='D', code=_setPen(18)},--HIDE
|
||||
WIDGET.newButton{name='b19', x=740, y=290,w=76,font=40,fText=CHAR.icon.bomb, color='lY',code=_setPen(19)},--BOMB
|
||||
WIDGET.newButton{name='b20', x=820, y=290,w=76,font=40,fText=CHAR.icon.garbage,color='H', code=_setPen(20)},--GB1
|
||||
WIDGET.newButton{name='b21', x=900, y=290,w=76,font=40,fText=CHAR.icon.garbage,color='lH',code=_setPen(21)},--GB2
|
||||
WIDGET.newButton{name='b22', x=980, y=290,w=76,font=40,fText=CHAR.icon.garbage,color='dV',code=_setPen(22)},--GB3
|
||||
WIDGET.newButton{name='b23', x=1060,y=290,w=76,font=40,fText=CHAR.icon.garbage,color='dR',code=_setPen(23)},--GB4
|
||||
WIDGET.newButton{name='b24', x=1140,y=290,w=76,font=40,fText=CHAR.icon.garbage,color='dG',code=_setPen(24)},--GB5
|
||||
WIDGET.newButton{name='b17', x=580, y=290,w=73,font=40,fText=CHAR.icon.bone, color='dH',code=_setPen(17)},--BONE
|
||||
WIDGET.newButton{name='b18', x=660, y=290,w=73,font=40,fText=CHAR.icon.invis, color='D', code=_setPen(18)},--HIDE
|
||||
WIDGET.newButton{name='b19', x=740, y=290,w=73,font=40,fText=CHAR.icon.bomb, color='lY',code=_setPen(19)},--BOMB
|
||||
WIDGET.newButton{name='b20', x=820, y=290,w=73,font=40,fText=CHAR.icon.garbage,color='H', code=_setPen(20)},--GB1
|
||||
WIDGET.newButton{name='b21', x=900, y=290,w=73,font=40,fText=CHAR.icon.garbage,color='lH',code=_setPen(21)},--GB2
|
||||
WIDGET.newButton{name='b22', x=980, y=290,w=73,font=40,fText=CHAR.icon.garbage,color='dV',code=_setPen(22)},--GB3
|
||||
WIDGET.newButton{name='b23', x=1060,y=290,w=73,font=40,fText=CHAR.icon.garbage,color='dR',code=_setPen(23)},--GB4
|
||||
WIDGET.newButton{name='b24', x=1140,y=290,w=73,font=40,fText=CHAR.icon.garbage,color='dG',code=_setPen(24)},--GB5
|
||||
|
||||
WIDGET.newButton{name='any', x=600, y=400,w=120,color='lH', font=40,code=_setPen(0)},
|
||||
WIDGET.newButton{name='space', x=730, y=400,w=120,color='H', font=55,code=_setPen(-1),fText=CHAR.icon.cross_thick},
|
||||
|
||||
@@ -53,12 +53,12 @@ pad={x=140,y=65,page=1,
|
||||
{samp={tag='clear_7',func=function()playClearSFX(7)end}},
|
||||
{samp={tag='clear_10',func=function()playClearSFX(10)end}},
|
||||
},
|
||||
{{sfx='prerotate'}, {sfx='rotate'}, {sfx='rotatekick'}, {}, {voc='single'}, {voc='double'}, {voc='triple'}, {voc='techrash'}},
|
||||
{{sfx='finesseError'},{sfx='finesseError_long'},{sfx='drop_cancel'},{}, {sfx='spin_0'}, {sfx='spin_1'}, {sfx='spin_2'}, {sfx='spin_3'}},
|
||||
{{sfx='ren_1'}, {sfx='ren_2'}, {sfx='ren_3'}, {sfx='ren_4'}, {}, {sfx='warning'},{sfx='reach'}, {sfx='pc'}},
|
||||
{{sfx='ren_5'}, {sfx='ren_6'}, {sfx='ren_7'}, {sfx='ren_8'}, {}, {sfx='collect'},{sfx='emit'}, {sfx='blip_1'}},
|
||||
{{sfx='ren_9'}, {sfx='ren_10'}, {sfx='ren_11'}, {sfx='ren_mega'},{voc='win'}, {voc='lose'}, {sfx='win'}, {sfx='fail'}},
|
||||
{{sfx='spawn_1'}, {sfx='spawn_2'}, {sfx='spawn_3'}, {sfx='spawn_4'}, {sfx='spawn_5'},{sfx='spawn_6'},{sfx='spawn_7'},{}},
|
||||
{{sfx='prerotate'}, {sfx='rotate'}, {sfx='rotatekick'}, {}, {voc='single'}, {voc='double'}, {voc='triple'}, {voc='techrash'}},
|
||||
{{sfx='finesseError'},{sfx='finesseError_long'},{sfx='drop_cancel'},{}, {sfx='spin_0'}, {sfx='spin_1'}, {sfx='spin_2'}, {sfx='spin_3'}},
|
||||
{{sfx='ren_1'}, {sfx='ren_2'}, {sfx='ren_3'}, {sfx='ren_4'}, {}, {sfx='warn_beep'},{sfx='reach'}, {sfx='pc'}},
|
||||
{{sfx='ren_5'}, {sfx='ren_6'}, {sfx='ren_7'}, {sfx='ren_8'}, {}, {sfx='collect'}, {sfx='emit'}, {sfx='warn_1'}},
|
||||
{{sfx='ren_9'}, {sfx='ren_10'}, {sfx='ren_11'}, {sfx='ren_mega'},{voc='win'}, {voc='lose'}, {sfx='win'}, {sfx='fail'}},
|
||||
{{sfx='spawn_1'}, {sfx='spawn_2'}, {sfx='spawn_3'}, {sfx='spawn_4'}, {sfx='spawn_5'},{sfx='spawn_6'}, {sfx='spawn_7'},{}},
|
||||
},
|
||||
{
|
||||
{{voc='mini'}, {voc='b2b'}, {voc='b3b'}, {voc='perfect_clear'},{voc='half_clear'},{}, {}, {}},
|
||||
@@ -90,8 +90,8 @@ pad={x=140,y=65,page=1,
|
||||
{{voc='mini'}, {voc='b2b'}, {voc='b3b'}, {voc='perfect_clear'}, {voc='half_clear'}, {sfx='finesseError'}, {sfx='finesseError_long'}, {sfx='drop_cancel'},},
|
||||
{{voc='zspin'}, {voc='sspin'}, {voc='jspin'}, {voc='lspin'}, {voc='tspin'}, {voc='ospin'}, {voc='ispin'}, {}},
|
||||
{{voc='single'}, {voc='double'}, {voc='triple'},{voc='techrash'}, {sfx='ren_mega', vol=0.25},{sfx='ren_mega', vol=0.5},{sfx='ren_mega', vol=0.75},{sfx='ren_mega'}},
|
||||
{{sfx='ren_1'}, {sfx='ren_2'}, {sfx='ren_3'}, {sfx='ren_4'}, {sfx='blip_1'}, {sfx='warning'}, {sfx='reach'}, {sfx='pc'}},
|
||||
{{sfx='ren_5'}, {sfx='ren_6'}, {sfx='ren_7'}, {sfx='ren_8'}, {sfx='blip_2'}, {sfx='collect'}, {sfx='emit'}, {}},
|
||||
{{sfx='ren_1'}, {sfx='ren_2'}, {sfx='ren_3'}, {sfx='ren_4'}, {sfx='warn_1'}, {sfx='warn_beep'}, {sfx='reach'}, {sfx='pc'}},
|
||||
{{sfx='ren_5'}, {sfx='ren_6'}, {sfx='ren_7'}, {sfx='ren_8'}, {sfx='warn_2'}, {sfx='collect'}, {sfx='emit'}, {}},
|
||||
{{sfx='ren_9'}, {sfx='ren_10'}, {sfx='ren_11'},{sfx='ren_mega'}, {voc='win'}, {voc='lose'}, {sfx='win'}, {sfx='fail'}},
|
||||
},
|
||||
{
|
||||
|
||||
@@ -200,7 +200,7 @@ function scene.socketRead(cmd,d)
|
||||
COLOR.dY,"#"..d.uid.." ",
|
||||
COLOR.Y,text.joinRoom,
|
||||
}
|
||||
SFX.play('click')
|
||||
SFX.play('warn_1')
|
||||
elseif cmd=='leave'then
|
||||
textBox:push{
|
||||
COLOR.lR,d.username,
|
||||
|
||||
@@ -222,7 +222,7 @@ function scene.draw()
|
||||
end
|
||||
|
||||
--Big info frame
|
||||
if PLAYERS[1].frameRun>180 then
|
||||
if PLAYERS[1].frameRun>=180 then
|
||||
gc.push('transform')
|
||||
gc.translate(560,205)
|
||||
gc.setLineWidth(2)
|
||||
@@ -349,12 +349,12 @@ scene.widgetList={
|
||||
WIDGET.newKey{name='setting', x=290,y=440,w=300,h=70,code=pressKey's',hideF=function()return GAME.fromRepMenu end},
|
||||
WIDGET.newKey{name='quit', x=290,y=540,w=300,h=70,code=pressKey'q'},
|
||||
WIDGET.newKey{name='tas', x=290,y=620,w=240,h=50,code=pressKey't',hideF=function()return not SETTING.allowTAS or GAME.tasUsed or GAME.result or GAME.replaying end},
|
||||
WIDGET.newKey{name='page_prev',x=500,y=390,w=70,code=pressKey'tab',noFrame=true,
|
||||
WIDGET.newKey{name='page_prev',x=500,y=390,w=70,code=pressKey'tab',
|
||||
fText=GC.DO{70,70,{'setLW',2}, {'dRPol',33,35,32,3,6,3.142},{'dRPol',45,35,32,3,6,3.142}},
|
||||
fShade=GC.DO{70,70,{'setCL',1,1,1,.4},{'draw',GC.DO{70,70,{'setCL',1,1,1,1},{'fRPol',33,35,32,3,6,3.142},{'fRPol',45,35,32,3,6,3.142}}}},
|
||||
hideF=function()return PLAYERS[1].frameRun<=180 end,
|
||||
},
|
||||
WIDGET.newKey{name='page_next',x=1230,y=390,w=70,code=pressKey'Stab',noFrame=true,
|
||||
WIDGET.newKey{name='page_next',x=1230,y=390,w=70,code=pressKey'Stab',
|
||||
fText=GC.DO{70,70,{'setLW',2}, {'dRPol',37,35,32,3,6},{'dRPol',25,35,32,3,6}},
|
||||
fShade=GC.DO{70,70,{'setCL',1,1,1,.4},{'draw',GC.DO{70,70,{'setCL',1,1,1,1},{'fRPol',37,35,32,3,6},{'fRPol',25,35,32,3,6}}}},
|
||||
hideF=function()return PLAYERS[1].frameRun<=180 end,
|
||||
|
||||
@@ -81,10 +81,10 @@ scene.widgetList={
|
||||
|
||||
WIDGET.newSlider{name='mainVol', x=300, y=170,w=420,lim=220,color='lG',disp=SETval('mainVol'), code=function(v)SETTING.mainVol=v love.audio.setVolume(SETTING.mainVol)end},
|
||||
WIDGET.newSlider{name='bgm', x=300, y=240,w=420,lim=220,color='lG',disp=SETval('bgm'), code=function(v)SETTING.bgm=v BGM.setVol(SETTING.bgm)end},
|
||||
WIDGET.newSlider{name='sfx', x=300, y=310,w=420,lim=220,color='lC',disp=SETval('sfx'), code=function(v)SETTING.sfx=v SFX.setVol(SETTING.sfx)end, change=function()SFX.play('blip_1')end},
|
||||
WIDGET.newSlider{name='sfx', x=300, y=310,w=420,lim=220,color='lC',disp=SETval('sfx'), code=function(v)SETTING.sfx=v SFX.setVol(SETTING.sfx)end, change=function()SFX.play('warn_1')end},
|
||||
WIDGET.newSlider{name='stereo', x=300, y=380,w=420,lim=220,color='lC',disp=SETval('stereo'), code=function(v)SETTING.stereo=v SFX.setStereo(SETTING.stereo)end,change=function()SFX.play('move',1,-1)SFX.play('lock',1,1)end,hideF=function()return SETTING.sfx==0 end},
|
||||
WIDGET.newSlider{name='spawn', x=300, y=450,w=420,lim=220,color='lC',disp=SETval('sfx_spawn'), code=function(v)SETTING.sfx_spawn=v end, change=function()SFX.fplay('spawn_'..math.random(7),SETTING.sfx_spawn)end,},
|
||||
WIDGET.newSlider{name='warn', x=300, y=520,w=420,lim=220,color='lC',disp=SETval('sfx_warn'), code=function(v)SETTING.sfx_warn=v end, change=function()SFX.fplay('warning',SETTING.sfx_warn)end},
|
||||
WIDGET.newSlider{name='warn', x=300, y=520,w=420,lim=220,color='lC',disp=SETval('sfx_warn'), code=function(v)SETTING.sfx_warn=v end, change=function()SFX.fplay('warn_beep',SETTING.sfx_warn)end},
|
||||
WIDGET.newSlider{name='vib', x=300, y=590,w=420,lim=220,color='lN',disp=SETval('vib'),unit=10,code=function(v)SETTING.vib=v end, change=function()if SETTING.vib>0 then VIB(SETTING.vib+2)end end},
|
||||
WIDGET.newSlider{name='voc', x=300, y=660,w=420,lim=220,color='lN',disp=SETval('voc'), code=function(v)SETTING.voc=v VOC.setVol(SETTING.voc)end, change=function()VOC.play('test')end},
|
||||
|
||||
|
||||
@@ -19,35 +19,35 @@ return[=[
|
||||
新机制:出块延迟打断(ARE打断)(默认关闭) #471
|
||||
新机制:锁定在外判负(lockout)(默认关闭)
|
||||
新机制:全局默认使用5帧窒息延迟
|
||||
新功能:没有键盘全支持的场景可以用方向键控制光标操作 #329
|
||||
新功能:自定义图片背景功能(可调透明度)(目前仅电脑可用)
|
||||
新功能:支持摇杆和扳机(参数暂时不能调整)
|
||||
新功能:没有键盘全支持的场景可以用方向键控制光标操作 #329
|
||||
新BGM:malate(暂未使用)
|
||||
新小程序:Memorize,Triple
|
||||
改动:
|
||||
关闭背景的灰底亮度可调 #119
|
||||
美化各种控件样式
|
||||
调整游戏大logo为正体字
|
||||
软降n格的键也可以触发深降
|
||||
普通消1不再有single语音
|
||||
优化键位设置菜单各种键的显示
|
||||
优化大量菜单的背景颜色细节
|
||||
修改默认和zday节日的主菜单BGM
|
||||
平滑马拉松-普通和混战模式的速度曲线
|
||||
三个高难隐形使用不同模式图标 #493
|
||||
修改按钮音效,给复选框和选择器添加新音效
|
||||
ultra模式计时器改为秒表,重开的时候会重播bgm
|
||||
出块/消行延迟逻辑修正,现在真的是0延迟,不再有一帧等待了(略微影响手感,更滑)
|
||||
新BGM:malate(暂未使用)
|
||||
玩法改动:
|
||||
出块/消行延迟逻辑修正,现在真的是0延迟,不再有一帧等待了(可以比原来更滑一点)
|
||||
大改重力和软降的结算逻辑,两个值接近的时候不会看起来不自然了 #438
|
||||
Ospin变O后操作序列清空,变远端朝下JL时允许水平可移动
|
||||
生成位置预览开启后hold的生成位置也可见 #453
|
||||
ultra模式计时器改为秒表,重开的时候会重播bgm
|
||||
TRS的S/Z添加四个踢墙防止在一些地方卡死
|
||||
优化pc训练模式体验,添加胜利条件,不再无尽
|
||||
平滑马拉松-普通和混战模式的速度曲线
|
||||
堆积模式添加15帧的窒息延迟 #465
|
||||
软降n格的键也可以触发深降
|
||||
系统改动:
|
||||
美化各种控件样式
|
||||
调整游戏大logo为正体字
|
||||
优化大量菜单的背景颜色细节
|
||||
普通消1不再有single语音
|
||||
优化键位设置菜单各种键的显示
|
||||
修改部分不常用设置时会显示警告
|
||||
两种按钮上的文本也会挤压绘制了
|
||||
关闭背景的灰底亮度可调 #119
|
||||
修改默认和zday节日的主菜单BGM
|
||||
修改按钮音效,给复选框和选择器添加新音效
|
||||
三个高难隐形使用不同模式图标 #493
|
||||
小程序arm加入计时器和重置按钮
|
||||
控制台使用等宽字体,更有味道(
|
||||
控制台使用等宽字体,更对味
|
||||
美化控制台help命令列表
|
||||
代码:
|
||||
BGM模块可限制最大加载数,不容易达到上限导致没声 #447
|
||||
@@ -58,6 +58,7 @@ return[=[
|
||||
扩展字符串扩展模块
|
||||
THEME模块移出框架
|
||||
修复:
|
||||
软降在sddas/sdarr很小的时候行为不正确
|
||||
机翻语言超级消除无行数显示 #462
|
||||
竞速-效率左侧信息颜色问题
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
return{
|
||||
["apkCode"]=415,
|
||||
["apkCode"]=416,
|
||||
["code"]=1700,
|
||||
["string"]="V0.17.0",
|
||||
["room"]="ver A-2",
|
||||
|
||||
Reference in New Issue
Block a user