0.9.2:调试界面,新背景,布局微调

This commit is contained in:
MrZ_26
2020-07-21 00:16:15 +08:00
parent ee99943ed9
commit ae650bd1ff
33 changed files with 305 additions and 330 deletions

View File

@@ -44,21 +44,6 @@ back.rgb={
)
end,
}--Changing pure color
back.strap={
init=function()
t=0
end,
update=function(dt)
t=t+dt
end,
draw=function()
SHADER.strap:send("t",t*.626)
gc.setColor(.4,.626,.626)
gc.setShader(SHADER.strap)
gc.rectangle("fill",0,0,scr.w,scr.h)
gc.setShader()
end,
}--Horizonal ranbow
back.flink={
init=function()
t=0
@@ -95,63 +80,58 @@ back.aura={
back.game1={
init=function()
t=0
BG.resize(scr.w,scr.h)
BG.resize(scr.w)
end,
resize=function(w,h)
SHADER.rainbow:send("w",w*scr.dpi)
SHADER.rainbow:send("h",h*scr.dpi)
resize=function(w)
SHADER.gradient1:send("w",w*scr.dpi)
end,
update=function(dt)
t=t+dt
end,
draw=function()
SHADER.rainbow:send("t",t)
gc.setColor(.6,.6,.6)
gc.setShader(SHADER.rainbow)
SHADER.gradient1:send("t",t)
gc.setShader(SHADER.gradient1)
gc.rectangle("fill",0,0,scr.w,scr.h)
gc.setShader()
end,
}--Rolling rainbow
}--Horizonal red-blue gradient
back.game2={
init=function()
t=0
BG.resize(scr.w,scr.h)
BG.resize(nil,scr.h)
end,
resize=function(w,h)
SHADER.rainbow:send("w",w*scr.dpi)
SHADER.rainbow:send("h",h*scr.dpi)
SHADER.gradient2:send("h",h*scr.dpi)
end,
update=function(dt)
t=t+dt
end,
draw=function()
SHADER.rainbow:send("t",t)
gc.setColor(.7,.4,.4)
gc.setShader(SHADER.rainbow)
SHADER.gradient2:send("t",t)
gc.setShader(SHADER.gradient2)
gc.rectangle("fill",0,0,scr.w,scr.h)
gc.setShader()
end,
}--Red rolling rainbow
}--Vertical red-green gradient
back.game3={
init=function()
t=0
BG.resize(scr.w,scr.h)
end,
resize=function(w,h)
SHADER.rainbow:send("w",w*scr.dpi)
SHADER.rainbow:send("h",h*scr.dpi)
SHADER.gradient3:send("w",w*scr.dpi)
SHADER.gradient3:send("h",h*scr.dpi)
end,
update=function(dt)
t=t+dt
end,
draw=function()
SHADER.rainbow:send("t",t)
gc.setColor(.5,.5,.8)
gc.setShader(SHADER.rainbow)
SHADER.gradient3:send("t",t)
gc.setShader(SHADER.gradient3)
gc.rectangle("fill",0,0,scr.w,scr.h)
gc.setShader()
end,
}--Blue rolling rainbow
}--beautiful RGB
back.game4={
init=function()
t=0
@@ -160,11 +140,7 @@ back.game4={
t=t+dt
end,
draw=function()
SHADER.strap:send("t",t*1.26)
gc.setColor(.5,.626,.74)
gc.setShader(SHADER.strap)
gc.rectangle("fill",0,0,scr.w,scr.h)
gc.setShader()
end,
}--Blue strap
back.game5={
@@ -189,7 +165,7 @@ back.game6={
t=0
colorLib=_G.SKIN.libColor
colorSet=_G.setting.skin
miniBlock=_G.miniBlock
blockImg=_G.TEXTURE.miniBlock
end,
update=function(dt)
t=t+dt
@@ -202,7 +178,7 @@ back.game6={
local R=7-int(t*.5)%7
local _=colorLib[colorSet[R]]
gc.setColor(_[1],_[2],_[3],.1)
gc.draw(miniBlock[R],640,360,t%3.1416*6,400,400,scs[R][0][2]-.5,#blocks[R][0]-scs[R][0][1]+.5)
gc.draw(blockImg[R],640,360,t%3.1416*6,400,400,scs[R][0][2]-.5,#blocks[R][0]-scs[R][0][1]+.5)
end,
}--Fast lightning + spining tetromino
@@ -284,7 +260,7 @@ BG={
update=NULL,
draw=back.none.draw,
}
function BG.set(bg)
function BG.set(bg,data)
if bg==BG.cur or not setting.bg then return end
if BG.discard then
BG.discard()

View File

@@ -290,8 +290,8 @@ end
local customSet={
{3,20,1,1,7,1,1,1,3,4,1,2,3},
{5,20,1,1,7,1,1,1,8,3,8,3,3},
{1,22,1,1,7,3,1,1,8,4,1,7,7},
{3,20,1,1,7,1,1,3,8,3,1,7,8},
{1,22,1,1,7,3,1,1,8,4,1,6,7},
{3,20,1,1,7,1,1,3,8,3,1,6,8},
{25,11,8,11,4,1,2,1,8,3,1,4,9},
}
function keyDown.custom(key)
@@ -696,7 +696,16 @@ function gamepadUp.play(key)
end
end
function touchDown.help(id,x,y)
function keyDown.staff(key,RESET)
if key=="escape"then
SCN.back()
elseif key=="\122"then
if RESET or kb.isDown("\109")and kb.isDown("\114")then
SCN.goto("debug")
end
end
end
function touchDown.staff(id,x,y)
local pw=sceneTemp.pw
local t=pw%4
if
@@ -707,8 +716,7 @@ function touchDown.help(id,x,y)
then
pw=pw+1
if pw==8 then
marking=nil
SFX.play("reach")
SCN.goto("debug")
end
else
pw=x<640 and y<360==1 and 1 or 0
@@ -716,66 +724,6 @@ function touchDown.help(id,x,y)
sceneTemp.pw=pw
end
function keyDown.staff(key,RESET)
if key=="escape"then
SCN.back()
elseif key=="\122"then
if RESET or kb.isDown("\109")and kb.isDown("\114")then
sceneTemp.ct=sceneTemp.ct+1
if sceneTemp.ct==5 then
TEXT.show("What are you up to?",640,200,40,"appear",.5)
elseif sceneTemp.ct==10 then
TEXT.show("Stop what you are doing.",640,200,40,"flicker",.5)
elseif sceneTemp.ct==16 then
TEXT.show("RESET ALL DATA?",640,200,40,"appear",.3,.2)
elseif sceneTemp.ct==20 then
TEXT.show("SURE?????",640,200,40,"beat",.3,.2)
elseif sceneTemp.ct==26 then
local L=love.filesystem.getDirectoryItems("")
for i=1,#L do
local s=L[i]
if s:sub(-4)==".dat"then
love.filesystem.remove(s)
end
end
SFX.play("lock")
SFX.play("clear_4")
SFX.play("finesseError_long")
SCN.back()
TEXT.clear()
end
sceneTemp.v=-6.26
marking=nil
SFX.play("reach")
end
end
end
function touchDown.staff(id,x,y)
if #tc.getTouches()==5 then
keyDown.staff('\122',true)
end
end
function keyDown.stat(key)
if key=="u"and kb.isDown("lshift","rshift")then
touchDown.stat()
end
end
function touchDown.stat(id,x,y)
local s=sceneTemp
s.count=s.count+1
if rnd()<.0626 and s.count>26 then
for name,M in next,Modes do
if not modeRanks[name]then
modeRanks[name]=M.score and 0 or 6
end
end
FILE.saveUnlock()
TEXT.show("DEV:\85\78\76\79\67\75\65\76\76",640,360,60,"stretch",.6)
SFX.play("clear_4")
end
end
function wheelMoved.history(x,y)
wheelScroll(y)
end
@@ -1088,7 +1036,7 @@ function love.run()
local R=int(r)%7+1
_=SKIN.libColor[setting.skin[R]]
gc.setColor(_[1],_[2],_[3],min(1-abs(1-r%1*2),.3))
gc.draw(miniBlock[R],mx,my,Timer()%3.1416*4,20,20,scs[2*R]-.5,#blocks[R][0]-scs[2*R-1]+.5)
gc.draw(TEXTURE.miniBlock[R],mx,my,Timer()%3.1416*4,20,20,scs[2*R]-.5,#blocks[R][0]-scs[2*R-1]+.5)
gc.setColor(1,1,1,.5)gc.circle("fill",mx,my,5)
gc.setColor(1,1,1)gc.circle("fill",mx,my,3)
end--Awesome mouse!

View File

@@ -1,7 +1,7 @@
local langList={
{
anykey="按任意键继续",
newVersion="检测到更新!存档格式已修改",
newVersion="检测到更新!",
marking="游戏作者:MrZ_26\n任何视频/直播不得出现此水印\n任何转述声明无效",
lang="中文",
atkModeName={"随机","徽章","击杀","反击"},
@@ -146,7 +146,7 @@ local langList={
"",
"使用LOVE2D引擎",
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过内测群822023725进行免费下载/更新",
"仅通过内测群1080457319进行免费下载/更新",
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了震动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
@@ -176,7 +176,7 @@ local langList={
simple-love-lights[dylhunn]
]],
support="支持作者",
group="官方QQ群(如果没有被暗改的话就是这个):822023725",
group="官方QQ群(如果没有被暗改的话就是这个):1080457319",
WidgetText={
main={
play="开始",
@@ -364,6 +364,12 @@ local langList={
path="打开存储目录",
back="返回",
},
debug={
killWTM="关闭水印",
unlock="解锁全模式",
reset="清空所有数据",
back="返回",
},
},
modes={
["sprint_10"]= {"竞速", "10L", "消除10行"},
@@ -443,7 +449,7 @@ local langList={
},
{
anykey="按任意键继续",
newVersion="检测到更新!存档格式已修改",
newVersion="检测到更新!",
marking="游戏作者:MrZ_26\n任何视频/直播不得出现此水印\n任何转述声明无效",
lang="全中文",
atkModeName={"随机","徽章","击杀","反击"},
@@ -585,7 +591,7 @@ local langList={
"从TO/C2/KOS/TGM3/JS等方块获得过灵感",
"",
"错误或者建议请附带截图发送到内测群或者作者邮箱~",
"仅通过内测群822023725进行免费下载/更新",
"仅通过内测群1080457319进行免费下载/更新",
"其他渠道获得游戏皆有被修改/加广告/植入病毒的风险,程序只申请了震动&联网权限!",
"若由于被修改的本游戏产生的各种损失作者不负责(我怎么负责啊跟我有啥关系)",
"请从正规途径获得最新版,游戏现为免费,不过有打赏当然感谢啦~",
@@ -615,7 +621,7 @@ local langList={
simple-love-lights[dylhunn]
]],
support="支持作者",
group="官方QQ群(如果没有被暗改的话就是这个):822023725",
group="官方QQ群(如果没有被暗改的话就是这个):1080457319",
WidgetText={
main={
play="开始",
@@ -803,6 +809,12 @@ local langList={
path="打开存储目录",
back="返回",
},
debug={
killWTM="关闭水印",
unlock="解锁全模式",
reset="清空所有数据",
back="返回",
},
},
modes={
["sprint_10"]= {"竞速", "10行", "消除10行"},
@@ -882,7 +894,7 @@ local langList={
},
{
anykey="Press any button",
newVersion="Updating detected! Saving format updated",
newVersion="Updating detected!",
marking="Game Author:MrZ_26\nIllegal recording if see this\nAny explanation invalid",
lang="English",
atkModeName={"Random","Badges","K.O.s","Attackers"},
@@ -1043,7 +1055,7 @@ local langList={
},
used="Tool used:\n\tBeepbox\n\tGFIE\n\tGoldwave\nLib used:\n\tCold_Clear[MinusKelvin]\n\tsimple-love-lights[dylhunn]",
support="Support author",
group="Official QQ Group(if not hacked):822023725",
group="Official QQ Group(if not hacked):1080457319",
WidgetText={
main={
play="Play",
@@ -1231,6 +1243,12 @@ local langList={
path="Open Data Folder",
back="Back",
},
debug={
killWTM="kill watermark",
unlock="unlock all",
reset="reset all",
back="Back",
},
},
modes={
["sprint_10"]= {"Sprint", "10L", "Clear 10 lines!"},
@@ -1310,7 +1328,7 @@ local langList={
},
{
anykey="↓□↓",
newVersion="&!!! ___!",
newVersion="&!!!",
marking="Game Author:MrZ_26\nIllegal recording if see this\nAny explanation invalid",
lang="?????",
atkModeName={"?","( )","!","←→"},
@@ -1471,7 +1489,7 @@ local langList={
},
used="Tool used:\n\tBeepbox\n\tGFIE\n\tGoldwave\nLib used:\n\tCold_Clear[MinusKelvin]\n\tsimple-love-lights[dylhunn]",
support="Support author",
group="Official QQ Group(if not hacked):822023725",
group="Official QQ Group(if not hacked):1080457319",
WidgetText={
main={
play="!!!",
@@ -1658,6 +1676,12 @@ local langList={
path="_$_",
back="X",
},
debug={
killWTM="kill watermark",
unlock="unlock all",
reset="reset all",
back="X",
},
},
modes={
["sprint_10"]= {"Sprint", "10L", "Clear 10 lines!"},

View File

@@ -65,6 +65,7 @@ local function drawVirtualkey()
local a=setting.VKAlpha*.1
local _
if setting.VKIcon then
local icons=TEXTURE.VKIcon
for i=1,#V do
if V[i].ava then
local B=V[i]
@@ -72,7 +73,7 @@ local function drawVirtualkey()
gc.setLineWidth(B.r*.07)
gc.circle("line",B.x,B.y,B.r,10)--Button outline
_=V[i].pressTime
gc.draw(VKIcon[i],B.x,B.y,nil,B.r*.026+_*.08,nil,18,18)--icon
gc.draw(icons[i],B.x,B.y,nil,B.r*.026+_*.08,nil,18,18)--icon
if _>0 then
gc.setColor(1,1,1,a*_*.08)
gc.circle("fill",B.x,B.y,B.r*.94,10)--Glow
@@ -265,7 +266,7 @@ function Pnt.mode()
end
if cam.keyCtrl then
gc.setColor(1,1,1)
gc.draw(mapCross,460-20,360-20)
gc.draw(TEXTURE.mapCross,460-20,360-20)
end
end
function Pnt.music()
@@ -322,11 +323,11 @@ function Pnt.sequence()
setFont(40)
gc.print(len,120,300)
local L=miniBlock
local L=TEXTURE.miniBlock
local x,y=120,126
local cx,cy=120,126
for i=1,len do
local B=miniBlock[bag[i]]
local B=L[bag[i]]
gc.draw(B,x,y,nil,15,15,0,B:getHeight()*.5)
x=x+B:getWidth()*15+10
if x>1126 then
@@ -528,7 +529,7 @@ function Pnt.pause()
setFont(26)
for i=1,10 do
gc.print(text.pauseStat[i],40,210+40*i)
gc.printf(_[i],245,210+40*i,250,"right")
gc.printf(_[i],195,210+40*i,300,"right")
end
end
@@ -750,17 +751,12 @@ end
function Pnt.staff()
local L=text.staff
local t=sceneTemp.time
if t>0 then
setFont(40)
for i=1,#L do
mStr(L[i],640,800+80*i-t*40)
end
mDraw(IMG.coloredTitleImage,640,800-t*40,nil,2)
mDraw(IMG.coloredTitleImage,640,2160-t*40,nil,2)
else
setFont(60)
mStr("Don't tell this to anyone.",640,-100-t*40)
setFont(40)
for i=1,#L do
mStr(L[i],640,800+80*i-t*40)
end
mDraw(IMG.coloredTitleImage,640,800-t*40,nil,2)
mDraw(IMG.coloredTitleImage,640,2160-t*40,nil,2)
end
function Pnt.stat()
local chart=sceneTemp.chart

View File

@@ -187,7 +187,7 @@ function sceneInit.setting_control()
dir=1,
wait=30,
}
BG.set("strap")
BG.set("game1")
end
function sceneInit.setting_key()
sceneTemp={
@@ -208,16 +208,13 @@ function sceneInit.setting_touchSwitch()
BG.set("matrix")
end
function sceneInit.help()
sceneTemp={
pw=0,
}
BG.set("space")
end
function sceneInit.staff()
sceneTemp={
pw=0,
time=0,
v=1,
ct=0,
}
BG.set("space")
end
@@ -234,7 +231,6 @@ function sceneInit.stat()
end
end
sceneTemp={
count=0,
chart={
A1=S.spin,A2=S.clear,
X1=X1,X2=X2,
@@ -259,9 +255,14 @@ function sceneInit.stat()
end
end
function sceneInit.history()
BG.set("strap")
BG.set("game1")
sceneTemp={require("parts/updateLog"),1}--scroll pos
end
function sceneInit.debug()
sceneTemp={
ct=0,
}
end
function sceneInit.quit()
love.timer.sleep(.3)
love.event.quit()

View File

@@ -6,7 +6,8 @@ return{
alpha=N("alpha"),
warning=N("warning"),
rainbow=N("rainbow"),
strap=N("strap"),
aura=N("aura"),
gradient1=N("grad1"),--Horizonal
gradient2=N("grad2"),--Vertical
gradient3=N("grad3"),--Oblique
}

View File

@@ -0,0 +1,10 @@
extern float t,w;
vec4 effect(vec4 color,Image text,vec2 pos,vec2 scr_pos){
float x=scr_pos.x/w;
return vec4(
.8-x*.6,
.3+.2*sin(t),
.15+x*.7,
1
);
}

View File

@@ -0,0 +1,10 @@
extern float t,h;
vec4 effect(vec4 color,Image text,vec2 pos,vec2 scr_pos){
float y=scr_pos.y/h;
return vec4(
.8-y*.6,
.2+y*.4,
.3+.1*sin(t),
1
);
}

View File

@@ -0,0 +1,11 @@
extern float t,w,h;
vec4 effect(vec4 color,Image text,vec2 pos,vec2 scr_pos){
float x=scr_pos.x/w;
float y=scr_pos.y/h;
return vec4(
.8-y*.6-.2*sin(t/6.26),
.3+.1*sin(t),
.2+x*.6,
1
);
}

View File

@@ -1,15 +0,0 @@
#define PI 3.14159265
extern float w,h;
extern float t;
vec4 effect(vec4 color,Image text,vec2 pos,vec2 scr_pos){
float x=scr_pos.x-w/2.;
float y=scr_pos.y-h/2.;
float a=(step(0.,x)*2.-1.)*PI+atan(y,x)+PI*0.5+t*0.626;
return vec4(
color.r*(sin(a+PI*0./3.)*0.3+0.5),
color.g*(sin(a+PI*2./3.)*0.3+0.5),
color.b*(sin(a+PI*4./3.)*0.3+0.5),
1.
);
}

View File

@@ -1,11 +0,0 @@
#define PI 3.14159265
extern float t;
vec4 effect(vec4 color,Image text,vec2 pos,vec2 scr_pos){
float x=scr_pos.x/262.+t;
return vec4(
color.r*(sin(x+PI*0./3.)*0.3+0.5),
color.g*(sin(x+PI*2./3.)*0.3+0.5),
color.b*(sin(x+PI*4./3.)*0.3+0.5),
1.
);
}

View File

@@ -139,24 +139,24 @@ local Widgets={
O= newButton(650, 440,90, 90,C.white, 50,pressKey(6)),
I= newButton(750, 440,90, 90,C.white, 50,pressKey(7)),
Z5= newButton(150, 540,90, 90,C.white, 50,pressKey(8)),
S5= newButton(250, 540,90, 90,C.white, 50,pressKey(9)),
P= newButton(350, 540,90, 90,C.white, 50,pressKey(10)),
Q= newButton(450, 540,90, 90,C.white, 50,pressKey(11)),
F= newButton(550, 540,90, 90,C.white, 50,pressKey(12)),
E= newButton(650, 540,90, 90,C.white, 50,pressKey(13)),
T5= newButton(750, 540,90, 90,C.white, 50,pressKey(14)),
U= newButton(850, 540,90, 90,C.white, 50,pressKey(15)),
V= newButton(950, 540,90, 90,C.white, 50,pressKey(16)),
W= newButton(150, 640,90, 90,C.white, 50,pressKey(17)),
X= newButton(250, 640,90, 90,C.white, 50,pressKey(18)),
J5= newButton(350, 640,90, 90,C.white, 50,pressKey(19)),
L5= newButton(450, 640,90, 90,C.white, 50,pressKey(20)),
R= newButton(550, 640,90, 90,C.white, 50,pressKey(21)),
Y= newButton(650, 640,90, 90,C.white, 50,pressKey(22)),
N= newButton(750, 640,90, 90,C.white, 50,pressKey(23)),
H= newButton(850, 640,90, 90,C.white, 50,pressKey(24)),
I5= newButton(950, 640,90, 90,C.white, 50,pressKey(25)),
Z5= newButton(150, 540,90, 90,C.darkGrey, 50,pressKey(8)),
S5= newButton(250, 540,90, 90,C.darkGrey, 50,pressKey(9)),
P= newButton(350, 540,90, 90,C.darkGrey, 50,pressKey(10)),
Q= newButton(450, 540,90, 90,C.darkGrey, 50,pressKey(11)),
F= newButton(550, 540,90, 90,C.darkGrey, 50,pressKey(12)),
E= newButton(650, 540,90, 90,C.darkGrey, 50,pressKey(13)),
T5= newButton(750, 540,90, 90,C.darkGrey, 50,pressKey(14)),
U= newButton(850, 540,90, 90,C.darkGrey, 50,pressKey(15)),
V= newButton(950, 540,90, 90,C.darkGrey, 50,pressKey(16)),
W= newButton(150, 640,90, 90,C.darkGrey, 50,pressKey(17)),
X= newButton(250, 640,90, 90,C.darkGrey, 50,pressKey(18)),
J5= newButton(350, 640,90, 90,C.darkGrey, 50,pressKey(19)),
L5= newButton(450, 640,90, 90,C.darkGrey, 50,pressKey(20)),
R= newButton(550, 640,90, 90,C.darkGrey, 50,pressKey(21)),
Y= newButton(650, 640,90, 90,C.darkGrey, 50,pressKey(22)),
N= newButton(750, 640,90, 90,C.darkGrey, 50,pressKey(23)),
H= newButton(850, 640,90, 90,C.darkGrey, 50,pressKey(24)),
I5= newButton(950, 640,90, 90,C.darkGrey, 50,pressKey(25)),
left= newButton(850, 440,90, 90,C.lightGreen, 55,pressKey("left")),
right= newButton(950, 440,90, 90,C.lightGreen, 55,pressKey("right")),
@@ -425,6 +425,44 @@ local Widgets={
path= newButton(980,620,250,80,C.white,25,function()love.system.openURL(love.filesystem.getSaveDirectory())end,mobileHide,"back"),
back= newButton(640,620,200,80,C.white,40,BACK,nil,"path"),
},
debug={
killWTM=newButton(340,200,260,100,C.white,35,function()
marking=nil
TEXT.show("\68\69\86\58\87\97\116\101\114\109\97\114\107\32\82\101\109\111\118\101\100",640,360,60,"stretch",.6)
SFX.play("clear")
end),
unlock= newButton(640,200,260,100,C.white,40,function()
for name,M in next,Modes do
if not modeRanks[name]then
modeRanks[name]=M.score and 0 or 6
end
end
FILE.saveUnlock()
TEXT.show("\68\69\86\58\85\78\76\79\67\75\65\76\76",640,360,60,"stretch",.6)
SFX.play("clear_2")
end),
reset= newButton(940,200,260,100,C.white,40,function()
sceneTemp.ct=sceneTemp.ct+1
if sceneTemp.ct==1 then
TEXT.show("RESET ALL DATA?",640,360,50,"appear",.5)
elseif sceneTemp.ct==5 then
TEXT.show("SURE?????",640,360,80,"beat",.5)
elseif sceneTemp.ct==10 then
local L=love.filesystem.getDirectoryItems("")
for i=1,#L do
local s=L[i]
if s:sub(-4)==".dat"then
love.filesystem.remove(s)
end
end
SFX.play("clear_4")SFX.play("finesseError_long")
TEXT.clear()
TEXT.show("ALL SAVING FILE DELETED",640,360,60,"stretch",.4)
SCN.back()
end
end),
back= newButton(640,620,200,80,C.white,40,BACK),
},
}
mobileHide,SETval,SETsto,SETrev=nil
pressKey,setPen,prevSkin,nextSkin=nil