diff --git a/document/mode.txt b/document/mode.txt index 445cbb04..daab4d64 100644 --- a/document/mode.txt +++ b/document/mode.txt @@ -33,6 +33,7 @@ irs true 提前旋转 ims true 提前移动 + skinSet [设置值] 方块贴图,只能填写内置皮肤的名字 skin [设置值] 方块颜色,包含25个整数(1~16)的table face [设置值] 方块朝向,包含25个整数(0~3)的table diff --git a/main.lua b/main.lua index 65ce089f..51fc4259 100644 --- a/main.lua +++ b/main.lua @@ -126,33 +126,33 @@ IMG.init{ }, } SKIN.init{ - 'crystal_scf', - 'matte_mrz', - 'contrast_mrz', - 'polkadots_scf', - 'toy_scf', - 'smooth_mrz', - 'simple_scf', - 'glass_scf', - 'penta_scf', - 'bubble_scf', - 'minoes_scf', - 'pure_mrz', - 'bright_scf', - 'glow_mrz', - 'plastic_mrz', - 'paper_mrz', - 'yinyang_scf', - 'cartooncup_earety', - 'jelly_miya', - 'brick_notypey', - 'gem_notypey', - 'classic', - 'ball_shaw', - 'retro_notypey', - 'textbone_mrz', - 'coloredbone_mrz', - 'wtf', + {name="crystal_scf",path='media/image/skin/crystal_scf.png'}, + {name="matte_mrz",path='media/image/skin/matte_mrz.png'}, + {name="contrast_mrz",path='media/image/skin/contrast_mrz.png'}, + {name="polkadots_scf",path='media/image/skin/polkadots_scf.png'}, + {name="toy_scf",path='media/image/skin/toy_scf.png'}, + {name="smooth_mrz",path='media/image/skin/smooth_mrz.png'}, + {name="simple_scf",path='media/image/skin/simple_scf.png'}, + {name="glass_scf",path='media/image/skin/glass_scf.png'}, + {name="penta_scf",path='media/image/skin/penta_scf.png'}, + {name="bubble_scf",path='media/image/skin/bubble_scf.png'}, + {name="minoes_scf",path='media/image/skin/minoes_scf.png'}, + {name="pure_mrz",path='media/image/skin/pure_mrz.png'}, + {name="bright_scf",path='media/image/skin/bright_scf.png'}, + {name="glow_mrz",path='media/image/skin/glow_mrz.png'}, + {name="plastic_mrz",path='media/image/skin/plastic_mrz.png'}, + {name="paper_mrz",path='media/image/skin/paper_mrz.png'}, + {name="yinyang_scf",path='media/image/skin/yinyang_scf.png'}, + {name="cartooncup_earety",path='media/image/skin/cartooncup_earety.png'}, + {name="jelly_miya",path='media/image/skin/jelly_miya.png'}, + {name="brick_notypey",path='media/image/skin/brick_notypey.png'}, + {name="gem_notypey",path='media/image/skin/gem_notypey.png'}, + {name="classic",path='media/image/skin/classic.png'}, + {name="ball_shaw",path='media/image/skin/ball_shaw.png'}, + {name="retro_notypey",path='media/image/skin/retro_notypey.png'}, + {name="textbone_mrz",path='media/image/skin/textbone_mrz.png'}, + {name="coloredbone_mrz",path='media/image/skin/coloredbone_mrz.png'}, + {name="wtf",path='media/image/skin/wtf.png'}, } --Initialize sound libs @@ -272,6 +272,7 @@ do needSave=true end if not SETTING.VKSkin then SETTING.VKSkin=1 end + if type(SETTING.skinSet)=='number'then SETTING.skinSet='crystal_scf'end if not TABLE.find({8,10,13,17,22,29,37,47,62,80,100},SETTING.frameMul)then SETTING.frameMul=100 end diff --git a/parts/backgrounds/blackhole.lua b/parts/backgrounds/blackhole.lua index 794730de..39875b44 100644 --- a/parts/backgrounds/blackhole.lua +++ b/parts/backgrounds/blackhole.lua @@ -24,7 +24,7 @@ function back.update() rotate=6.2832*rnd(), va=.05-rnd()*.1, size=SCR.rad*(2+rnd()*3)/100, - texture=SKIN.curText[rnd(16)], + texture=SKIN.lib[SETTING.skinSet][rnd(16)], } ins(squares,S) t=rnd(6,12) diff --git a/parts/backgrounds/blockfall.lua b/parts/backgrounds/blockfall.lua index 5266d943..1d9254dc 100644 --- a/parts/backgrounds/blockfall.lua +++ b/parts/backgrounds/blockfall.lua @@ -25,7 +25,7 @@ function back.update() k=k, vy=k*2, block=B, - texture=SKIN.curText[SETTING.skin[r]], + texture=SKIN.lib[SETTING.skinSet][SETTING.skin[r]], }) end for i=#mino,1,-1 do diff --git a/parts/globalTables.lua b/parts/globalTables.lua index 9ce054df..ae944894 100644 --- a/parts/globalTables.lua +++ b/parts/globalTables.lua @@ -305,7 +305,7 @@ SETTING={--Settings fine=false, simpMode=false, lang=1, - skinSet=1, + skinSet='crystal_scf', skin={ 1,7,11,3,14,4,9, 1,7,2,6,10,2,13,5,9,15,10,11,3,12,2,16,8,4, diff --git a/parts/language/lang_en.lua b/parts/language/lang_en.lua index 97891284..b6dcad52 100644 --- a/parts/language/lang_en.lua +++ b/parts/language/lang_en.lua @@ -417,6 +417,7 @@ return{ restart="Retry", }, setting_skin={ + skinSet="Block Skin", title="Layout Settings", spin1="R",spin2="R",spin3="R",spin4="R",spin5="R",spin6="R",spin7="R", skinR="Reset Color", diff --git a/parts/language/lang_es.lua b/parts/language/lang_es.lua index afd81c05..7f542eb3 100644 --- a/parts/language/lang_es.lua +++ b/parts/language/lang_es.lua @@ -379,6 +379,7 @@ return{ restart="Reiniciar", }, setting_skin={ + -- skinSet="Block Skin", title="Ajustes de Texturas", skinR="Color por def.", faceR="Direc. por def.", diff --git a/parts/language/lang_fr.lua b/parts/language/lang_fr.lua index 736b38ff..a6abddfb 100644 --- a/parts/language/lang_fr.lua +++ b/parts/language/lang_fr.lua @@ -378,6 +378,7 @@ return{ restart="Réessayer", }, setting_skin={ + -- skinSet="Block Skin", title="Disposition", spin1="R",spin2="R",spin3="R",spin4="R",spin5="R",spin6="R",spin7="R", skinR="Réinit. Couleur", diff --git a/parts/language/lang_pt.lua b/parts/language/lang_pt.lua index b0cd8a89..974dc0d1 100644 --- a/parts/language/lang_pt.lua +++ b/parts/language/lang_pt.lua @@ -404,6 +404,7 @@ return{ restart="Reiniciar", }, setting_skin={ + -- skinSet="Block Skin", title="Config. Layout", spin1="R",spin2="R",spin3="R",spin4="R",spin5="R",spin6="R",spin7="R", skinR="Reset Cor", diff --git a/parts/language/lang_symbol.lua b/parts/language/lang_symbol.lua index 03bbb9ad..8df94369 100644 --- a/parts/language/lang_symbol.lua +++ b/parts/language/lang_symbol.lua @@ -232,6 +232,7 @@ return{ restart="_→_", }, setting_skin={ + skinSet="[x]?", title="%{~~}", skinR="R @%&", faceR="R ↑↓←→.", diff --git a/parts/language/lang_yygq.lua b/parts/language/lang_yygq.lua index 65c1b9c1..0bc65bfc 100644 --- a/parts/language/lang_yygq.lua +++ b/parts/language/lang_yygq.lua @@ -111,6 +111,7 @@ return{ reset="重设", }, setting_skin={ + skinSet="皮肤", title="改外观", }, setting_touchSwitch={ diff --git a/parts/language/lang_zh.lua b/parts/language/lang_zh.lua index ffa015a1..e184c209 100644 --- a/parts/language/lang_zh.lua +++ b/parts/language/lang_zh.lua @@ -416,6 +416,7 @@ return{ restart="重新开始", }, setting_skin={ + skinSet="方块皮肤", title="外观设置", spin1="R",spin2="R",spin3="R",spin4="R",spin5="R",spin6="R",spin7="R", skinR="重置配色", diff --git a/parts/player/draw.lua b/parts/player/draw.lua index 8e3f8811..9e864a48 100644 --- a/parts/player/draw.lua +++ b/parts/player/draw.lua @@ -96,8 +96,7 @@ local function applyFieldOffset(P,notNorm) end local function stencilBoard()gc_rectangle('fill',0,-10,300,610)end -local function drawRow(h,V,L,showInvis) - local texture=SKIN.curText +local function drawRow(texture,h,V,L,showInvis) local t=TIME()*4 for i=1,10 do if L[i]>0 then @@ -116,20 +115,20 @@ local function drawField(P) local V,F=P.visTime,P.field local start=int((P.fieldBeneath+P.fieldUp)/30+1) local showInvis=GAME.replaying - + local texture=P.skinLib if P.falling==-1 then--Blocks only if ENV.upEdge then gc_setShader(shader_lighter) gc_translate(0,-4) -- - for j=start,min(start+21,#F)do drawRow(j,V[j],F[j])end + for j=start,min(start+21,#F)do drawRow(texture,j,V[j],F[j])end -- gc_setShader(shader_fieldSatur) gc_translate(0,4) end -- - for j=start,min(start+21,#F)do drawRow(j,V[j],F[j],showInvis)end + for j=start,min(start+21,#F)do drawRow(texture,j,V[j],F[j],showInvis)end -- else--With falling animation local stepY=ENV.smooth and(P.falling/(ENV.fall+1))^2.5*30 or 30 @@ -145,7 +144,7 @@ local function drawField(P) h=h+1 gc_translate(0,-stepY) end - drawRow(j,V[j],F[j]) + drawRow(texture,j,V[j],F[j]) end -- gc_setShader(shader_fieldSatur) @@ -162,7 +161,7 @@ local function drawField(P) gc_setColor(1,1,1,alpha) gc_rectangle('fill',0,30-30*j,300,stepY) end - drawRow(j,V[j],F[j],showInvis) + drawRow(texture,j,V[j],F[j],showInvis) end -- gc_pop() @@ -191,7 +190,7 @@ local function drawFXs(P) end --MoveFX - local texture=SKIN.curText + local texture=P.skinLib for i=1,#P.moveFX do local S=P.moveFX[i] gc_setColor(1,1,1,.6-S[4]*.6) @@ -211,7 +210,7 @@ end local drawGhost={ color=function(P,clr,alpha) gc_setColor(1,1,1,alpha) - local texture=SKIN.curText + local texture=P.skinLib local CB=P.cur.bk for i=1,#CB do for j=1,#CB[1]do if CB[i][j]then @@ -221,7 +220,7 @@ local drawGhost={ end, gray=function(P,_,alpha) gc_setColor(1,1,1,alpha) - local texture=SKIN.curText + local texture=P.skinLib local CB=P.cur.bk for i=1,#CB do for j=1,#CB[1]do if CB[i][j]then @@ -298,7 +297,7 @@ end local function drawBlock(P,clr) gc_setColor(1,1,1) gc_setShader(shader_blockSatur) - local texture=SKIN.curText[clr] + local texture=P.skinLib[clr] local CB=P.cur.bk for i=1,#CB do for j=1,#CB[1]do if CB[i][j]then @@ -420,7 +419,7 @@ local function drawHold(P) for n=1,#holdQueue do if n==N then gc_setColor(.6,.4,.4)end local bk,clr=holdQueue[n].bk,holdQueue[n].color - local texture=SKIN.curText[clr] + local texture=P.skinLib[clr] local k=#bk>2 and 2.2/#bk or 1 gc_scale(k) for i=1,#bk do for j=1,#bk[1]do @@ -539,7 +538,7 @@ draw.applyFieldOffset=applyFieldOffset draw.drawGhost=drawGhost function draw.drawNext_norm(P) local ENV=P.gameEnv - local texture=SKIN.curText + local texture=P.skinLib gc_translate(316,20) local N=ENV.nextCount*72 gc_setColor(0,0,0,.4)gc_rectangle('fill',0,0,124,N+8) @@ -574,7 +573,7 @@ function draw.drawNext_norm(P) end function draw.drawNext_hidden(P) local ENV=P.gameEnv - local texture=SKIN.curText + local texture=P.skinLib gc_translate(316,20) local N=ENV.nextCount*72 gc_setColor(.5,0,0,.4)gc_rectangle('fill',0,0,124,N+8) @@ -699,7 +698,7 @@ function draw.norm(P) gc_translate(0,-dy) --Draw block & rotation center if ENV.block then - drawBlockOutline(P,SKIN.curText[curColor],trans) + drawBlockOutline(P,P.skinLib[curColor],trans) drawBlock(P,curColor) if ENV.center then gc_setColor(1,1,1,ENV.center) @@ -833,7 +832,7 @@ function draw.small(P) --Field local F=P.field - local texture=SKIN.curTextMini + local texture=SKIN.libMini[SETTING.skinSet] for j=1,#F do for i=1,10 do if F[j][i]>0 then gc_draw(texture[F[j][i]],6*i-6,120-6*j) @@ -902,7 +901,7 @@ function draw.demo(P) if ENV.block then local dy=ENV.smooth and P.ghoY~=P.curY and(P.dropDelay/ENV.drop-1)*30 or 0 gc_translate(0,-dy) - drawBlockOutline(P,SKIN.curText[curColor],P.lockDelay/ENV.lock) + drawBlockOutline(P,P.skinLib[curColor],P.lockDelay/ENV.lock) drawBlock(P,curColor) gc_translate(0,dy) end diff --git a/parts/player/gameEnv0.lua b/parts/player/gameEnv0.lua index 3560fcf9..27e40237 100644 --- a/parts/player/gameEnv0.lua +++ b/parts/player/gameEnv0.lua @@ -38,6 +38,7 @@ return{ RS='TRS', sequence='bag', seqData={1,2,3,4,5,6,7}, + skinSet='crystal_scf', face=false,skin=false, mission=false, diff --git a/parts/player/init.lua b/parts/player/init.lua index 22e9abf2..be44e0e1 100644 --- a/parts/player/init.lua +++ b/parts/player/init.lua @@ -293,6 +293,8 @@ local function applyGameEnv(P)--Finish gameEnv processing P.keyAvailable[v]=false end + P.skinLib=SKIN.lib[ENV.skinSet] + P:setInvisible( ENV.visible=='show'and -1 or ENV.visible=='easy'and 300 or diff --git a/parts/player/player.lua b/parts/player/player.lua index a8646d27..ec4cb1d8 100644 --- a/parts/player/player.lua +++ b/parts/player/player.lua @@ -91,7 +91,7 @@ function Player:createSplashFX(h) if c>0 then SYSFX.newCell( 2.5-self.gameEnv.splashFX*.4, - SKIN.curText[c], + self.skinLib[c], size, self.fieldX+(30*x-15)*size,y-30*h*size, rnd()*5-2.5,rnd()*-1, diff --git a/parts/scenes/customGame.lua b/parts/scenes/customGame.lua index 4ccd3209..86994456 100644 --- a/parts/scenes/customGame.lua +++ b/parts/scenes/customGame.lua @@ -149,7 +149,7 @@ function scene.draw() gc.rectangle('line',-2,-2,304,604) local F=FIELD[1] local cross=TEXTURE.puzzleMark[-1] - local texture=SKIN.curText + local texture=SKIN.lib[SETTING.skinSet] for y=1,20 do for x=1,10 do local B=F[y][x] if B>0 then diff --git a/parts/scenes/custom_field.lua b/parts/scenes/custom_field.lua index 85412ff6..f9e605c5 100644 --- a/parts/scenes/custom_field.lua +++ b/parts/scenes/custom_field.lua @@ -273,7 +273,7 @@ function scene.draw() gc.setLineWidth(2) local cross=TEXTURE.puzzleMark[-1] local F=FIELD[page] - local texture=SKIN.curText + local texture=SKIN.lib[SETTING.skinSet] for y=1,20 do for x=1,10 do local B=F[y][x] if B>0 then diff --git a/parts/scenes/load.lua b/parts/scenes/load.lua index 6a798b69..48af6a3c 100644 --- a/parts/scenes/load.lua +++ b/parts/scenes/load.lua @@ -21,11 +21,6 @@ local loadingThread=coroutine.wrap(function() logoColor2={COLOR.rainbow_light(r)} end YIELD('loadSFX')SFX.loadAll() - YIELD('loadSkin') - for i=1,SKIN.getCount()do - SKIN.loadOne() - if i%math.floor(SKIN.getCount()/9)==0 then YIELD()end - end YIELD('loadVoice')VOC.loadAll() YIELD('loadFont')for i=1,17 do getFont(15+5*i)end @@ -123,7 +118,6 @@ local loadingThread=coroutine.wrap(function() end YIELD('loadOther') - SKIN.change(SETTING.skinSet) STAT.run=STAT.run+1 --Connect to server diff --git a/parts/scenes/setting_control.lua b/parts/scenes/setting_control.lua index ca506906..88337113 100644 --- a/parts/scenes/setting_control.lua +++ b/parts/scenes/setting_control.lua @@ -67,7 +67,7 @@ function scene.draw() gc.line(400,-10,400,90) --O mino animation - local O=SKIN.curText[SETTING.skin[6]] + local O=SKIN.lib[SETTING.skinSet][SETTING.skin[6]] gc.draw(O,40*pos,0,nil,40/30) gc.draw(O,40*pos,40,nil,40/30) gc.draw(O,40*pos+40,0,nil,40/30) diff --git a/parts/scenes/setting_game.lua b/parts/scenes/setting_game.lua index 64055bf6..054272ab 100644 --- a/parts/scenes/setting_game.lua +++ b/parts/scenes/setting_game.lua @@ -13,9 +13,9 @@ function scene.draw() local t=TIME() local b=math.floor(t*2)%16+1 gc.setColor(1,1,1) - gc.draw(SKIN.curText[b],410,540-WIDGET.scrollPos,t%6.2832,2,nil,15,15) + gc.draw(SKIN.lib[SETTING.skinSet][b],410,540-WIDGET.scrollPos,t%6.2832,2,nil,15,15) gc.setColor(1,1,1,t*2%1) - gc.draw(SKIN.curText[b%16+1],410,540-WIDGET.scrollPos,t%6.2832,2,nil,15,15) + gc.draw(SKIN.lib[SETTING.skinSet][b%16+1],410,540-WIDGET.scrollPos,t%6.2832,2,nil,15,15) end scene.widgetScrollHeight=200 diff --git a/parts/scenes/setting_skin.lua b/parts/scenes/setting_skin.lua index 47816445..81562993 100644 --- a/parts/scenes/setting_skin.lua +++ b/parts/scenes/setting_skin.lua @@ -21,7 +21,7 @@ end function scene.draw() local t=TIME() gc.setColor(1,1,1) - local texture=SKIN.curText + local texture=SKIN.lib[SETTING.skinSet] for n=1,7 do gc.push('transform') gc.translate(-10+140*n,340) @@ -59,8 +59,7 @@ end scene.widgetList={ WIDGET.newText{name="title", x=80,y=50,font=70,align='L'}, - WIDGET.newButton{name="prev", x=700,y=100,w=140,h=100,fText="←",font=50,code=function()SKIN.prevSet()end}, - WIDGET.newButton{name="next", x=860,y=100,w=140,h=100,fText="→",font=50,code=function()SKIN.nextSet()end}, + WIDGET.newSelector{name="skinSet",x=780,y=100,w=260,list=SKIN.getList(),disp=SETval('skinSet'),code=SETsto('skinSet')}, WIDGET.newButton{name="prev1", x=130,y=230,w=90,h=65,fText="↑",code=function()prevSkin(1)end}, WIDGET.newButton{name="prev2", x=270,y=230,w=90,h=65,fText="↑",code=function()prevSkin(2)end}, WIDGET.newButton{name="prev3", x=410,y=230,w=90,h=65,fText="↑",code=function()prevSkin(3)end}, diff --git a/parts/scenes/setting_video.lua b/parts/scenes/setting_video.lua index 0382181a..78093489 100644 --- a/parts/scenes/setting_video.lua +++ b/parts/scenes/setting_video.lua @@ -16,7 +16,7 @@ function scene.draw() gc.pop() gc.push('transform') gc.setColor(1,1,1) - local L=SKIN.curText + local L=SKIN.lib[SETTING.skinSet] local T=L[1] gc.translate(0,1410-WIDGET.scrollPos) gc.setShader(SHADER.blockSatur) diff --git a/parts/skin.lua b/parts/skin.lua index 7152e852..0bf9f211 100644 --- a/parts/skin.lua +++ b/parts/skin.lua @@ -1,82 +1,54 @@ -local SKIN={ - getCount=function()return 0 end, - loadOne=function()error("Cannot load before init!")end, - loadAll=function()error("Cannot load before init!")end, - prevSet=NULL, - nextSet=NULL, - prev=NULL, - next=NULL, - rotate=NULL, - change=NULL, -} +local SKIN={} function SKIN.init(list) + local Skins={} + + local simpList={} + for _,v in next,list do + table.insert(simpList,v.name) + Skins[v.name]=v.path + end + function SKIN.getList()return simpList end + local gc=love.graphics - local int=math.floor local function C(x,y) - local _=gc.newCanvas(x,y) - gc.setCanvas(_) - return _ - end - local count=#list function SKIN.getCount()return count end - SKIN.lib={} - SKIN.libMini={} - - local function load(skip) - for i=1,count do - gc.push() - gc.origin() - gc.setDefaultFilter('nearest','nearest') - gc.setColor(1,1,1) - SKIN.lib[i],SKIN.libMini[i]={},{} - local N="media/image/skin/"..list[i]..".png" - local I - if love.filesystem.getInfo(N)then - I=gc.newImage(N) - else - I=gc.newImage("media/image/skin/"..list[1]..".png") - MES.new('warn',"No skin file: "..list[i]) - end - gc.setDefaultFilter('linear','linear') - for y=0,2 do - for x=1,8 do - SKIN.lib[i][8*y+x]=C(30,30) - gc.draw(I,30-30*x,-30*y) - - SKIN.libMini[i][8*y+x]=C(6,6) - gc.draw(I,6-6*x,-6*y,nil,.2) - end - end - I:release() - gc.setCanvas() - gc.pop() - if not skip and i~=count then - coroutine.yield() - end - end - SKIN.loadOne=nil - SKIN.loadAll=nil - - function SKIN.prevSet()--Prev skin_set - local _=(SETTING.skinSet-2)%count+1 - SETTING.skinSet=_ - SKIN.change(_) - _=list[_] - TEXT.show(_,1100,100,int(300/#_)+5,'fly') - end - function SKIN.nextSet()--Next skin_set - local _=SETTING.skinSet%count+1 - SETTING.skinSet=_ - SKIN.change(_) - _=list[_] - TEXT.show(_,1100,100,int(300/#_)+5,'fly') - end - function SKIN.change(i)--Change to skin_set[i] - SKIN.curText=SKIN.lib[i] - SKIN.curTextMini=SKIN.libMini[i] - end + local canvas=gc.newCanvas(x,y) + gc.setCanvas(canvas) + return canvas end - SKIN.loadOne=coroutine.wrap(load) - function SKIN.loadAll()load(true)end + SKIN.lib,SKIN.libMini={},{} + local skinMeta={__index=function(self,name) + gc.push() + gc.origin() + local f1,f2=gc.getDefaultFilter() + gc.setDefaultFilter('nearest','nearest') + local I + local N=Skins[name] + if love.filesystem.getInfo(N)then + I=gc.newImage(N) + else + MES.new('warn',"No skin file: "..Skins[name]) + end + gc.setDefaultFilter(f1,f2) + + SKIN.lib[name],SKIN.libMini[name]={},{} + gc.setColor(1,1,1) + for y=0,2 do + for x=1,8 do + SKIN.lib[name][8*y+x]=C(30,30) + if I then gc.draw(I,30-30*x,-30*y)end + + SKIN.libMini[name][8*y+x]=C(6,6) + if I then gc.draw(I,6-6*x,-6*y,nil,.2)end + end + end + gc.setCanvas() + gc.pop() + return self[name] + end} + setmetatable(SKIN.lib,skinMeta) + setmetatable(SKIN.libMini,skinMeta) + + function SKIN.loadAll()SKIN.loadAll=nil for _,v in next,list do local _=SKIN.lib[v.name]end end end return SKIN \ No newline at end of file