Line endings...be normalized!

This commit is contained in:
Jason Felds
2011-03-17 01:47:30 -04:00
parent 146e8e14f1
commit a085d0d1da
1962 changed files with 444486 additions and 444486 deletions
+49 -49
View File
@@ -1,50 +1,50 @@
Place announcer folders in this directory.
[Announcer format]
sm-ssc's announcers look for certain names. These can either be a single sound,
or a folder containing many sounds (of which one is picked at random).
[Announcer calls]
Grouped by Screen/Element that calls them, though only the sound/folder name for
each item is important.
ScreenWithMenuElements
* (ScreenName) intro
ScreenTitleMenu
* title menu game name
ScreenSelect
* (ScreenName) IdleComment
ScreenSelectMusic
* select music intro
* select music comment general
* select music comment hard
* select music comment new
* select music comment repeat
* select course comment general
ScreenGameplay
* gameplay intro
* gameplay ready
* gameplay here we go normal
* gameplay here we go final
* gameplay here we go extra
* gameplay comment hot
* gameplay comment danger
* gameplay comment good
* gameplay comment oni
* gameplay (100-1000) combo
* gameplay combo stopped
* gameplay combo overflow
* gameplay battle trick level(1-3)
* gameplay battle damage level(1-3)
* gameplay extra
* gameplay cleared
* gameplay failed
* gameplay oni failed
* gameplay oni failed halfway
MenuTimer
Place announcer folders in this directory.
[Announcer format]
sm-ssc's announcers look for certain names. These can either be a single sound,
or a folder containing many sounds (of which one is picked at random).
[Announcer calls]
Grouped by Screen/Element that calls them, though only the sound/folder name for
each item is important.
ScreenWithMenuElements
* (ScreenName) intro
ScreenTitleMenu
* title menu game name
ScreenSelect
* (ScreenName) IdleComment
ScreenSelectMusic
* select music intro
* select music comment general
* select music comment hard
* select music comment new
* select music comment repeat
* select course comment general
ScreenGameplay
* gameplay intro
* gameplay ready
* gameplay here we go normal
* gameplay here we go final
* gameplay here we go extra
* gameplay comment hot
* gameplay comment danger
* gameplay comment good
* gameplay comment oni
* gameplay (100-1000) combo
* gameplay combo stopped
* gameplay combo overflow
* gameplay battle trick level(1-3)
* gameplay battle damage level(1-3)
* gameplay extra
* gameplay cleared
* gameplay failed
* gameplay oni failed
* gameplay oni failed halfway
MenuTimer
* hurry up
+3 -3
View File
@@ -1,4 +1,4 @@
return Def.Quad {
InitCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH*2,SCREEN_HEIGHT*2;diffuse, Var "Color1";);
GainFocusCommand=cmd(finishtweening;diffusealpha,1;accelerate,0.6;diffusealpha,0);
return Def.Quad {
InitCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH*2,SCREEN_HEIGHT*2;diffuse, Var "Color1";);
GainFocusCommand=cmd(finishtweening;diffusealpha,1;accelerate,0.6;diffusealpha,0);
};
+1 -1
View File
@@ -1 +1 @@
Place BGAnimation folders in here.
Place BGAnimation folders in here.
+3 -3
View File
@@ -1,4 +1,4 @@
return Def.Quad {
InitCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH*2,SCREEN_HEIGHT*2);
GainFocusCommand=cmd(finishtweening;diffusealpha,1;accelerate,0.6;diffusealpha,0);
return Def.Quad {
InitCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH*2,SCREEN_HEIGHT*2);
GainFocusCommand=cmd(finishtweening;diffusealpha,1;accelerate,0.6;diffusealpha,0);
};
+3 -3
View File
@@ -1,4 +1,4 @@
return Def.Quad {
InitCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH*2,SCREEN_HEIGHT*2);
GainFocusCommand=cmd(finishtweening;diffuse,color("#FFFFA0");accelerate,0.6;diffusealpha,0);
return Def.Quad {
InitCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH*2,SCREEN_HEIGHT*2);
GainFocusCommand=cmd(finishtweening;diffuse,color("#FFFFA0");accelerate,0.6;diffusealpha,0);
};
+11 -11
View File
@@ -1,11 +1,11 @@
-- Centered.
local cColor1 = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
-- Centered.
local cColor1 = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+15 -15
View File
@@ -1,15 +1,15 @@
-- 4 repeats of the same file using File 1
local cColor1 = color(Var "Color1");
local a = LoadActor(Var "File1") .. {
OnCommand=cmd(scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
local t = Def.ActorFrame {
a .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
};
return t;
-- 4 repeats of the same file using File 1
local cColor1 = color(Var "Color1");
local a = LoadActor(Var "File1") .. {
OnCommand=cmd(scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
local t = Def.ActorFrame {
a .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
};
return t;
+16 -16
View File
@@ -1,16 +1,16 @@
-- 4 repeats of the same file using File 2
local cColor1 = color(Var "Color1");
local a = LoadActor(Var "File2") .. {
OnCommand=cmd(scaletoclipped,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
local t = Def.ActorFrame {
a .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
};
return t;
-- 4 repeats of the same file using File 2
local cColor1 = color(Var "Color1");
local a = LoadActor(Var "File2") .. {
OnCommand=cmd(scaletoclipped,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
local t = Def.ActorFrame {
a .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
};
return t;
+8 -8
View File
@@ -1,9 +1,9 @@
-- Alternating files being played back at once
local t = Def.ActorFrame {
LoadActor(Var "File1") .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM);scaletoclipped,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;rate,0.25) };
LoadActor(Var "File2") .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM);scaletoclipped,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;rate,0.25) };
LoadActor(Var "File2") .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM);scaletoclipped,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;rate,0.25) };
LoadActor(Var "File1") .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM);scaletoclipped,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;rate,0.25) };
};
-- Alternating files being played back at once
local t = Def.ActorFrame {
LoadActor(Var "File1") .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM);scaletoclipped,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;rate,0.25) };
LoadActor(Var "File2") .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM);scaletoclipped,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;rate,0.25) };
LoadActor(Var "File2") .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM);scaletoclipped,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;rate,0.25) };
LoadActor(Var "File1") .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM);scaletoclipped,SCREEN_WIDTH/2,SCREEN_HEIGHT/2;rate,0.25) };
};
return t
+16 -16
View File
@@ -1,16 +1,16 @@
-- 4 repeats of the same file in a kaleidoscope fashion.
local cColor1 = color(Var "Color1");
local a = LoadActor(Var "File1") .. {
OnCommand=cmd(scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1;zoomx,self:GetZoomX()*-1;zoomy,self:GetZoomY()*-1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
local t = Def.ActorFrame {
a .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
};
return t;
-- 4 repeats of the same file in a kaleidoscope fashion.
local cColor1 = color(Var "Color1");
local a = LoadActor(Var "File1") .. {
OnCommand=cmd(scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1;zoomx,self:GetZoomX()*-1;zoomy,self:GetZoomY()*-1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
local t = Def.ActorFrame {
a .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(1,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(1,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
a .. { OnCommand=cmd(x,scale(3,0,4,SCREEN_LEFT,SCREEN_RIGHT);y,scale(3,0,4,SCREEN_TOP,SCREEN_BOTTOM)); };
};
return t;
+17 -17
View File
@@ -1,17 +1,17 @@
-- A visualization overplayed on the songs background.
local cColor1 = color(Var "Color1");
local cColor2 = color(Var "Color2");
local t = Def.ActorFrame {
Def.Sprite {
InitCommand=cmd(LoadFromCurrentSongBackground);
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1);
};
LoadActor(Var "File1") .. {
OnCommand=cmd(blend,"BlendMode_Add";x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor2);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
-- A visualization overplayed on the songs background.
local cColor1 = color(Var "Color1");
local cColor2 = color(Var "Color2");
local t = Def.ActorFrame {
Def.Sprite {
InitCommand=cmd(LoadFromCurrentSongBackground);
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1);
};
LoadActor(Var "File1") .. {
OnCommand=cmd(blend,"BlendMode_Add";x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor2);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+11 -11
View File
@@ -1,11 +1,11 @@
-- A stretched file that does not loop back.
local cColor1 = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1;loop,false);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
-- A stretched file that does not loop back.
local cColor1 = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1;loop,false);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+11 -11
View File
@@ -1,11 +1,11 @@
-- A Movie that plays stretched.
local cColor1 = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
-- A Movie that plays stretched.
local cColor1 = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+11 -11
View File
@@ -1,11 +1,11 @@
-- Align left when cropping to 4:3.
local cColor1 = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(horizalign,left;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
-- Align left when cropping to 4:3.
local cColor1 = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(horizalign,left;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+11 -11
View File
@@ -1,11 +1,11 @@
-- Stretch a file with blue diffusion.
local cColor1 = color("0,0,1,1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
-- Stretch a file with blue diffusion.
local cColor1 = color("0,0,1,1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+11 -11
View File
@@ -1,11 +1,11 @@
--- Stretch a file with green diffusion.
local cColor1 = color("0,1,0,1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
--- Stretch a file with green diffusion.
local cColor1 = color("0,1,0,1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+11 -11
View File
@@ -1,11 +1,11 @@
--- Stretch a file with red diffusion.
local cColor1 = color("1,0,0,1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
--- Stretch a file with red diffusion.
local cColor1 = color("1,0,0,1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+11 -11
View File
@@ -1,11 +1,11 @@
-- Stretched & Paused.
local cColor1 = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1;pause);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
-- Stretched & Paused.
local cColor1 = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1;pause);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+12 -12
View File
@@ -1,12 +1,12 @@
-- Stretch & Replay.
local cColor1 = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1;position,0);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
-- Stretch & Replay.
local cColor1 = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,cColor1;position,0);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+12 -12
View File
@@ -1,12 +1,12 @@
-- Upper left corner of the screen.
local cColor1 = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
-- Upper left corner of the screen.
local cColor1 = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(diffuse,cColor1);
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+16 -16
View File
@@ -1,16 +1,16 @@
local Color1 = color(Var "Color1");
local Color2 = color(Var "Color2");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,Color1;effectclock,"music");
};
LoadActor(Var "File2") .. {
OnCommand=cmd(blend,"BlendMode_Add";x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,Color2;effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
local Color1 = color(Var "Color1");
local Color2 = color(Var "Color2");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,Color1;effectclock,"music");
};
LoadActor(Var "File2") .. {
OnCommand=cmd(blend,"BlendMode_Add";x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;scaletoclipped,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,Color2;effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+4 -4
View File
@@ -1,4 +1,4 @@
<BackgroundTransition
LeavesCommand="stoptweening;linear,1.0;diffusealpha,0"
RootCommand=""
/>
<BackgroundTransition
LeavesCommand="stoptweening;linear,1.0;diffusealpha,0"
RootCommand=""
/>
+4 -4
View File
@@ -1,4 +1,4 @@
<BackgroundTransition
LeavesCommand="croptop,-0.3;fadetop,0.3;linear,1.0;croptop,1.3"
RootCommand=""
/>
<BackgroundTransition
LeavesCommand="croptop,-0.3;fadetop,0.3;linear,1.0;croptop,1.3"
RootCommand=""
/>
+4 -4
View File
@@ -1,4 +1,4 @@
<BackgroundTransition
LeavesCommand="cropright,-0.3;faderight,0.3;linear,1.0;cropright,1.3"
RootCommand=""
/>
<BackgroundTransition
LeavesCommand="cropright,-0.3;faderight,0.3;linear,1.0;cropright,1.3"
RootCommand=""
/>
+4 -4
View File
@@ -1,4 +1,4 @@
<BackgroundTransition
LeavesCommand="cropleft,-0.3;fadeleft,0.3;linear,1.0;cropleft,1.3"
RootCommand=""
/>
<BackgroundTransition
LeavesCommand="cropleft,-0.3;fadeleft,0.3;linear,1.0;cropleft,1.3"
RootCommand=""
/>
+4 -4
View File
@@ -1,4 +1,4 @@
<BackgroundTransition
LeavesCommand="cropbottom,-0.3;fadebottom,0.3;linear,1.0;cropbottom,1.3"
RootCommand=""
/>
<BackgroundTransition
LeavesCommand="cropbottom,-0.3;fadebottom,0.3;linear,1.0;cropbottom,1.3"
RootCommand=""
/>
+4 -4
View File
@@ -1,4 +1,4 @@
<BackgroundTransition
LeavesCommand="linear,1.0;diffusealpha,0"
RootCommand="stoptweening;linear,1.0;addy,SCREEN_HEIGHT"
/>
<BackgroundTransition
LeavesCommand="linear,1.0;diffusealpha,0"
RootCommand="stoptweening;linear,1.0;addy,SCREEN_HEIGHT"
/>
+4 -4
View File
@@ -1,4 +1,4 @@
<BackgroundTransition
LeavesCommand="linear,1.0;diffusealpha,0"
RootCommand="stoptweening;linear,1.0;addx,-SCREEN_WIDTH"
/>
<BackgroundTransition
LeavesCommand="linear,1.0;diffusealpha,0"
RootCommand="stoptweening;linear,1.0;addx,-SCREEN_WIDTH"
/>
+4 -4
View File
@@ -1,4 +1,4 @@
<BackgroundTransition
LeavesCommand="linear,1.0;diffusealpha,0"
RootCommand="stoptweening;linear,1.0;addx,SCREEN_WIDTH"
/>
<BackgroundTransition
LeavesCommand="linear,1.0;diffusealpha,0"
RootCommand="stoptweening;linear,1.0;addx,SCREEN_WIDTH"
/>
+4 -4
View File
@@ -1,4 +1,4 @@
<BackgroundTransition
LeavesCommand="linear,1.0;diffusealpha,0"
RootCommand="stoptweening;linear,1.0;addy,-SCREEN_HEIGHT"
/>
<BackgroundTransition
LeavesCommand="linear,1.0;diffusealpha,0"
RootCommand="stoptweening;linear,1.0;addy,-SCREEN_HEIGHT"
/>
+4 -4
View File
@@ -1,5 +1,5 @@
DWI-style CDTitles can be placed here.
However, you are highly encouraged to place the CDTitle graphics
inside the song folder since the package manager cannot use the
DWI-style CDTitles can be placed here.
However, you are highly encouraged to place the CDTitle graphics
inside the song folder since the package manager cannot use the
DWI-style CDTitles or Music folders.
+20 -20
View File
@@ -1,21 +1,21 @@
IF YOU DO NOT HAVE THE BONE FILES, 3D DANCING CHARACTERS WILL NOT WORK.
THE BONE FILES ARE NOT DISTRIBUTED WITH ANY VERSION OF STEPMANIA/sm-ssc SINCE
THEY CONTAIN COPYRIGHTED MATERIAL NOT MADE BY US. IF WE COME UP WITH DATA LATER,
COOL. IF NOT, SO BE IT.
http://stepmaniathings.com/downloads/characters/-required-bones-and-helper-files.html
EXTRACT THE FILES IN THIS FOLDER SO THAT YOU SEE tons of _DDRPC_*.bones.txt files.
THEN 3D CHARACTERS WILL WORK.
JUST DON'T SPAM THE FORUMS AND BUGTRACKER ABOUT IT.
THE INSTRUCTIONS COME WITH THE PROGRAM. YOU'RE READING THEM RIGHT NOW!!!
oh and for compatibility, you will want to perform the following renames:
old name | new name
------------------+--------------
DancePad-DDR.txt | DancePad.txt
DancePads-DDR.txt | DancePads.txt
a bit presumptious, but anything in the name of keeping it safe in regards to
IF YOU DO NOT HAVE THE BONE FILES, 3D DANCING CHARACTERS WILL NOT WORK.
THE BONE FILES ARE NOT DISTRIBUTED WITH ANY VERSION OF STEPMANIA/sm-ssc SINCE
THEY CONTAIN COPYRIGHTED MATERIAL NOT MADE BY US. IF WE COME UP WITH DATA LATER,
COOL. IF NOT, SO BE IT.
http://stepmaniathings.com/downloads/characters/-required-bones-and-helper-files.html
EXTRACT THE FILES IN THIS FOLDER SO THAT YOU SEE tons of _DDRPC_*.bones.txt files.
THEN 3D CHARACTERS WILL WORK.
JUST DON'T SPAM THE FORUMS AND BUGTRACKER ABOUT IT.
THE INSTRUCTIONS COME WITH THE PROGRAM. YOU'RE READING THEM RIGHT NOW!!!
oh and for compatibility, you will want to perform the following renames:
old name | new name
------------------+--------------
DancePad-DDR.txt | DancePad.txt
DancePads-DDR.txt | DancePads.txt
a bit presumptious, but anything in the name of keeping it safe in regards to
copyright, yeah?
+9 -9
View File
@@ -1,10 +1,10 @@
[Character]
Level1Attack1=1.5x
Level1Attack2=hidden
Level1Attack3=reverse
Level2Attack1=dizzy
Level2Attack2=sudden
Level2Attack3=expand
Level3Attack1=0.5x
Level3Attack2=drunk
[Character]
Level1Attack1=1.5x
Level1Attack2=hidden
Level1Attack3=reverse
Level2Attack1=dizzy
Level2Attack2=sudden
Level2Attack3=expand
Level3Attack1=0.5x
Level3Attack2=drunk
Level3Attack3=brake
+2 -2
View File
@@ -1,3 +1,3 @@
Course files (.crs) typically go in folders, though they aren't shown like that
on the wheel... yet. (Coming soon: a metric that allows a theme to do that, once
Course files (.crs) typically go in folders, though they aren't shown like that
on the wheel... yet. (Coming soon: a metric that allows a theme to do that, once
we get the wheel to treat course directories like song directories)
+55 -55
View File
@@ -1,55 +1,55 @@
[Skill0]
WeightMiss=8
WeightW5=8
WeightW4=8
WeightW3=30
WeightW2=30
WeightW1=30
[Skill1]
WeightMiss=5
WeightW5=5
WeightW4=5
WeightW3=25
WeightW2=30
WeightW1=35
[Skill2]
WeightMiss=3
WeightW5=3
WeightW4=3
WeightW3=20
WeightW2=30
WeightW1=40
[Skill3]
WeightMiss=2
WeightW5=2
WeightW4=2
WeightW3=15
WeightW2=30
WeightW1=45
[Skill4]
WeightMiss=1
WeightW5=1
WeightW4=1
WeightW3=10
WeightW2=30
WeightW1=50
[Skill5]
WeightMiss=
WeightW5=1
WeightW4=1
WeightW3=5
WeightW2=30
WeightW1=55
[Skill6]
WeightMiss=
WeightW5=
WeightW4=
WeightW3=5
WeightW2=30
WeightW1=70
[Skill0]
WeightMiss=8
WeightW5=8
WeightW4=8
WeightW3=30
WeightW2=30
WeightW1=30
[Skill1]
WeightMiss=5
WeightW5=5
WeightW4=5
WeightW3=25
WeightW2=30
WeightW1=35
[Skill2]
WeightMiss=3
WeightW5=3
WeightW4=3
WeightW3=20
WeightW2=30
WeightW1=40
[Skill3]
WeightMiss=2
WeightW5=2
WeightW4=2
WeightW3=15
WeightW2=30
WeightW1=45
[Skill4]
WeightMiss=1
WeightW5=1
WeightW4=1
WeightW3=10
WeightW2=30
WeightW1=50
[Skill5]
WeightMiss=
WeightW5=1
WeightW4=1
WeightW3=5
WeightW2=30
WeightW1=55
[Skill6]
WeightMiss=
WeightW5=
WeightW4=
WeightW3=5
WeightW2=30
WeightW1=70
+28 -28
View File
@@ -1,28 +1,28 @@
[AutoMapping]
;Intentional space at the end of the Device name
DeviceRegex=GamePad Pro USB
Description=GamePad Pro USB
[dance]
1_Back=Joy1_B9
1_Down=Joy1_Down1:Joy1_B2
1_Left=Joy1_Left1:Joy1_B1
1_Right=Joy1_Right1:Joy1_B3
1_Start=Joy1_B10
1_Up=Joy1_Up1:Joy1_B4
1_UpLeft=Joy1_B5
1_UpRight=Joy1_B6
[pump]
1_Back=Joy1_B9
1_Center=Joy1_B1
1_DownLeft=Joy1_B7
1_DownRight=Joy1_B8
1_MenuDown=Joy1_Down1
1_MenuLeft=Joy1_Left1
1_MenuRight=Joy1_Right1
1_MenuUp=Joy1_Up1
1_Start=Joy1_B10
1_UpLeft=Joy1_B5
1_UpRight=Joy1_B6
[AutoMapping]
;Intentional space at the end of the Device name
DeviceRegex=GamePad Pro USB
Description=GamePad Pro USB
[dance]
1_Back=Joy1_B9
1_Down=Joy1_Down1:Joy1_B2
1_Left=Joy1_Left1:Joy1_B1
1_Right=Joy1_Right1:Joy1_B3
1_Start=Joy1_B10
1_Up=Joy1_Up1:Joy1_B4
1_UpLeft=Joy1_B5
1_UpRight=Joy1_B6
[pump]
1_Back=Joy1_B9
1_Center=Joy1_B1
1_DownLeft=Joy1_B7
1_DownRight=Joy1_B8
1_MenuDown=Joy1_Down1
1_MenuLeft=Joy1_Left1
1_MenuRight=Joy1_Right1
1_MenuUp=Joy1_Up1
1_Start=Joy1_B10
1_UpLeft=Joy1_B5
1_UpRight=Joy1_B6
+2 -2
View File
@@ -1,2 +1,2 @@
#P1#
#P2#
#P1#
#P2#
+72 -72
View File
@@ -1,73 +1,73 @@
// File for specifying Random Attacks, used by the Random Attacks mod and Attack Mines mod.
// Only specify one modifier per attack.
//
// Sample lines:
//
// #ATTACK:drunk;
// #ATTACK:30% tornado;
// #ATTACK:-20% beat;
//
//
// Speed Mods
//
#ATTACK:0.5x;
#ATTACK:1x;
#ATTACK:1.5x;
#ATTACK:2x;
//
// Accel Mods
//
#ATTACK:boost;
#ATTACK:brake;
#ATTACK:wave;
#ATTACK:expand;
//
// Effect Mods
//
#ATTACK:drunk;
#ATTACK:dizzy;
#ATTACK:confusion;
#ATTACK:65% mini;
#ATTACK:20% flip;
#ATTACK:30% invert;
#ATTACK:30% tornado;
#ATTACK:tipsy;
#ATTACK:beat;
#ATTACK:bumpy;
//
// Appearance Mods
//
#ATTACK:50% hidden;
#ATTACK:50% sudden;
#ATTACK:30% blink;
//
// Hide Mods
//
#ATTACK:dark;
#ATTACK:blind;
//
// Transform Mods
//
#ATTACK:mines;
//
// Scroll
//
#ATTACK:30% reverse;
#ATTACK:reverse;
#ATTACK:centered;
//
// Perspective Mods
//
#ATTACK:hallway;
#ATTACK:space;
#ATTACK:incoming;
#ATTACK:overhead;
// File for specifying Random Attacks, used by the Random Attacks mod and Attack Mines mod.
// Only specify one modifier per attack.
//
// Sample lines:
//
// #ATTACK:drunk;
// #ATTACK:30% tornado;
// #ATTACK:-20% beat;
//
//
// Speed Mods
//
#ATTACK:0.5x;
#ATTACK:1x;
#ATTACK:1.5x;
#ATTACK:2x;
//
// Accel Mods
//
#ATTACK:boost;
#ATTACK:brake;
#ATTACK:wave;
#ATTACK:expand;
//
// Effect Mods
//
#ATTACK:drunk;
#ATTACK:dizzy;
#ATTACK:confusion;
#ATTACK:65% mini;
#ATTACK:20% flip;
#ATTACK:30% invert;
#ATTACK:30% tornado;
#ATTACK:tipsy;
#ATTACK:beat;
#ATTACK:bumpy;
//
// Appearance Mods
//
#ATTACK:50% hidden;
#ATTACK:50% sudden;
#ATTACK:30% blink;
//
// Hide Mods
//
#ATTACK:dark;
#ATTACK:blind;
//
// Transform Mods
//
#ATTACK:mines;
//
// Scroll
//
#ATTACK:30% reverse;
#ATTACK:reverse;
#ATTACK:centered;
//
// Perspective Mods
//
#ATTACK:hallway;
#ATTACK:space;
#ATTACK:incoming;
#ATTACK:overhead;
#ATTACK:distant;
+439 -439
View File
@@ -1,439 +1,439 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!--
# This file is UTF-8; to be readable, edit it in an editor capable
# of UTF-8, such as Notepad in Windows 2000 and later.
# Also it's best to view this with a font that supports various UTF-8
# characters, as opposed to monospaced fonts.
#
# Six keywords: TitleFrom, ArtistFrom, SubtitleFrom, TitleTo,
# ArtistTo, SubtitleTo.
#
# From lines are regular expressions. If all From lines for a set
# are matched, all To lines are replaced.
#
# All lines, by default, must match the entire line; for example,
# "Foo" matches only "Foo", not "Foobar". Matches are case-insensitive.
#
# Matches are checked in the order given in this file; more than one
# set may match a single song.
#
# Courses are matched by title only.
#
# Note that changes to this file are only applied to songs when they are
# first loaded. Delete the files in the "Cache" directory after making
# changes.
-->
<Translations>
<Songs>
<Translation TitleFrom="17 ?(Sai|Ages)?" TitleTo="17才" />
<Translation TitleFrom="Hypnotic Crisis" TitleTo="HYPNØTIC CRISIS" />
<Translation TitleFrom="((Matsuri )|(\{ ))Japan" TitleTo="祭 JAPAN" />
<!-- Matsuri Japan is often just "Japan". There may be other songs by -->
<!-- that name, too, so match the artist, too. -->
<Translation TitleFrom="Japan" ArtistFrom=".*(Re-Venge)|(RevenG).*" TitleTo="祭 JAPAN" />
<Translation TitleFrom="(Dancing|Odoru) Po[mn]pokolin" TitleTo="おどるポンポコリン" />
<Translation TitleFrom="(God of Romance)|(Roman(su|ce) no Kamisama)" TitleTo="ロマンスの神様" />
<!-- People can't decide how they want to spell this, so cope with both l or r, and one or two l/r and t. -->
<Translation TitleFrom="Sana Mo((ll?)|(rr?))et(t?)e Ne Ente" TitleTo="サナ・モレッテ・ネ・エンテ" />
<!-- "Candy", "Candy star", or "Candy #". -->
<Translation TitleFrom="Candy(( star)?|#)" ArtistFrom="Luv.*" TitleTo="CANDY☆" />
<Translation TitleFrom="Freckles( ?-? ?Sobakasu)?" TitleTo="そばかす" />
<Translation TitleFrom="Sobakasu( ?-? ?Freckles)?" TitleTo="そばかす" />
<Translation TitleFrom="Yozora no Muko" TitleTo="夜空ノムコウ" />
<Translation TitleFrom="Bre[a=]k ?Down!?" TitleTo="BRE∀K DOWN!" />
<!-- "Candy", "Candy heart", or "Candy $". -->
<Translation TitleFrom="Candy(( heart)?|\$)" ArtistFrom=".*(Riyu|りゆ).*" TitleTo="CANDY♡" />
<Translation TitleFrom="(Kakumei)|(\+\{)" TitleTo="革命" />
<!-- Fix up hacked titles from 3.0 spigumus hacks: -->
<Translation TitleFrom="} JAPAN" TitleTo="祭 JAPAN" />
<Translation TitleFrom="\+\{" TitleTo="革命" />
<Translation TitleFrom="Sweet Sweet (Love |\$ )?Magic" TitleTo="Sweet Sweet ♡ Magic" />
<!-- Special stuff is done. Titles: -->
<Translation TitleFrom="Matsuri Japan" TitleTo="祭 JAPAN" />
<Translation TitleFrom="Kakumei" TitleTo="革命" />
<Translation TitleFrom="Bre[a=]k ?Down!?" TitleTo="BRE∀K DOWN!" />
<!-- People can't decide how they want to spell this, so cope with both l or r, and one or two l/r and t. -->
<Translation TitleFrom="Sana Mo((ll?)|(rr?))et(t?)e Ne Ente" TitleTo="サナ・モレッテ・ネ・エンテ" />
<Translation TitleFrom="Hypnotic Crisis" TitleTo="HYPNØTIC CRISIS" />
<Translation TitleFrom="Yozora no Muko" TitleTo="夜空ノムコウ" />
<!-- Handle a typo: -->
<Translation TitleFrom="(A(oi|io) Shoudou|Blue Impulse)" TitleTo="蒼い衝動" />
<Translation TitleFrom="Daikenkai" TitleTo="大見解" />
<Translation TitleFrom="Love (Love )?Shine" TitleTo="LOVE ♡ SHINE" />
<Translation TitleFrom="(God of Romance)|(Romansu no Kamisama)" TitleTo="ロマンスの神様" />
<Translation TitleFrom="(Dancing Pompokolin)|(Odoru Pompokolin)" TitleTo="おどるポンポコリン" />
<Translation TitleFrom="Aoi Shoudou\(for EXTREME\)" TitleTo="蒼い衝動(for EXTREME)" />
<Translation TitleFrom="Love Love Sugar" TitleTo="♡LOVE²シュガ→♡" />
<!-- Handle Door and Doors -->
<Translation TitleFrom="(Doors? of Magic)|(Mahou no Tobira)" TitleTo="魔法の扉" SubtitleTo="(スペース&planet;マコのテーマ)" />
<Translation TitleFrom="Mikeneko Rock" TitleTo="三毛猫ロック" />
<!-- Handle "Mobo Moga:Mobo * Moga"; spaces optional. -->
<Translation TitleFrom="Mobo ?\*? ?Moga" TitleTo="MOBO★MOGA" />
<Translation TitleFrom="Sakura" TitleTo="桜" />
<Translation TitleFrom="Waltz of the Flowers" TitleTo="花のワルツ" />
<Translation TitleFrom="Chotto Kiitena" TitleTo="ちょっときいてな" />
<!-- No need to write transliterations for these. -->
<Translation TitleFrom="L'amour et la liberte" TitleTo="L'amour et la liberté" DontTransliterate />
<Translation TitleFrom="La Senorita" TitleTo="La Señorita" DontTransliterate />
<Translation TitleFrom="La Senorita Virtual" TitleTo="La Señorita Virtual" DontTransliterate />
<Translation TitleFrom="Senorita" TitleTo="SEÑORITA" DontTransliterate />
<Translation TitleFrom="Senorita\(Speedy Mix\)" TitleTo="SEÑORITA" SubtitleTo="Speedy Mix" DontTransliterate />
<Translation TitleFrom="Chotto Kiitena" TitleTo="ちょっときいてな" />
<Translation TitleFrom="The Strong Jaeger" TitleTo="合体せよ!ストロングイェーガー!!" />
<!-- Subtitles: -->
<!-- (Title is Graduation.) -->
<Translation SubtitleFrom=".*(Each Tomorrow|sorezore no ashita).*" SubtitleTo="~それぞれの明日~" />
<!-- Some files are missing the space, so the subtitle isn't parsed. -->
<Translation TitleFrom="GRADUATION~(Each Tomorrow|sorezore no ashita)~" TitleTo="GRADUATION"
SubtitleTo="~それぞれの明日~" SubtitleTransTo="sorezore no ashita" DontTransliterate />
<!-- Artists: -->
<Translation TitleFrom="Max 300" ArtistFrom="%" ArtistTo="Ω" />
<Translation ArtistFrom="Omega" ArtistTo="Ω" />
<!-- I've seen both "Kosaku" and "Kosaka"; Kosaka is correct, but handle both. -->
<Translation ArtistFrom="(Riyu Kosak[au])|(Kosak[au] Riyu)" ArtistTo="小坂りゆ" />
<Translation ArtistFrom="ZZ" ArtistTo="&doublezeta;" />
<!-- Serious tropical ska bomb? ruh roh -->
<Translation ArtistFrom="Anettai Maji.*Ska (Bakudan|Bukuden)" ArtistTo="亜熱帯マジ-SKA爆弾" />
<Translation ArtistFrom="(Spanish Folk Music|Mexican Folk Song)" ArtistTo="メキシコ民謡" />
<Translation ArtistFrom="Sanae? Shintani" ArtistTo="新谷さなえ" />
<Translation TitleFrom="White Lovers" ArtistFrom="Sana" ArtistTo="新谷さなえ" />
<Translation ArtistFrom="YOMA KOMATSU" ArtistTo="ΨΦMA KΦMATSU" />
<Translation ArtistFrom="Bus Stop featuring Carl Douglas" ArtistTo="BUS★STOP featuring CARL DOUGLAS" />
<Translation TitleFrom="(Kick the Can|One Two|Na-Na|Swing It)" ArtistFrom="BUS STOP" ArtistTo="BUS★STOP" />
<Translation ArtistFrom="dj TAKA feat. ?Noria" ArtistTo="dj TAKA feat. のりあ" />
<Translation ArtistFrom="(Miyuki Kunitake)|(Kunitake Miyuki)" ArtistTo="くにたけみゆき" />
<!-- Tournamix: -->
<Translation ArtistFrom="(Masahiro Andoh)|(Andoh Masahiro)" ArtistTo="安藤まさひろ" />
<Translation TitleFrom="Sakura Saku" TitleTo="桜咲く" />
<!-- Theme from Excel Saga: 愛(忠誠心) -->
<!-- http://www.jvcmusic.co.jp/m-serve/tv/excel/index.html -->
<Translation ArtistFrom="(Toshio Masuda)|(Masuda Toshio)" ArtistTo="舛田利雄" />
<!-- Theme from Trigun -->
<Translation ArtistFrom="(Tsuneo Imahori)|(Imahori Tsuneo)" ArtistTo="今堀恒雄" />
<!-- Tournamix 2: -->
<!-- http://www.web-konami.com/products/ps2/castlevania/ -->
<Translation ArtistFrom="(Michuri Yamane)|(Yamane Michuri)" ArtistTransTo="Michiru Yamane" ArtistTo="山根ミチル" />
<!-- Tournamix 3: -->
<Translation TitleFrom="Tsugaru Kaikyou no Onna" TitleTo="津軽海峡の女" ArtistTo="ソニン" />
<Translation TitleFrom="Kaniyuuutsu" TitleTo="甘いユウウツ" />
<Translation TitleFrom="Negai" TitleTo="願い" />
<!-- http://www.avexnet.or.jp/avexdb/morinaga/ -->
<Translation ArtistFrom="(Hatsumi Morinaga)|(Morinaga Hatsumi)" ArtistTo="守永初美" />
<!-- Tournamix 4: -->
<Translation TitleFrom="Akumajo Dracula MEDLEY" TitleTo="悪魔城ドラキュラMEDLEY" />
<Translation ArtistFrom="Kukeihakurabu" ArtistTo="矩形波倶楽部" />
<Translation ArtistFrom="Yuji Ueda & Yui Horie" ArtistTo="上田祐司&堀江由衣" />
<Translation ArtistFrom="Atsuko Enomoto" ArtistTo="榎本温子" />
<Translation TitleFrom="Hareta Hi no Marine" TitleTo="晴れた日のマリーン" />
<Translation ArtistFrom="Gotou? Maki" ArtistTo="後藤真希" />
<Translation TitleFrom="La Duena del Swing" TitleTo="La Dueña del Swing" />
<Translation TitleFrom="Pokemon Trainer Theme" TitleTo="Pokémon Trainer Theme" />
<Translation ArtistFrom="Pokemon Jhoto" ArtistTo="Pokémon Jhoto" />
<Translation TitleFrom="Watashi No Tamagoyaki" TitleTo="私の卵焼き" />
<Translation TitleFrom="sora *mimi keek[ei]" TitleTo="空耳ケーキ" />
<Translation TitleFrom="The Peace!" TitleTo="The☆Peace!" />
<Translation TitleFrom="tentaikansoku" TitleTo="天体観測" ArtistTo="入尾信充" />
<Translation SubtitleFrom="\(e=mc2 mix\)" SubtitleTo="(e=mc² mix)" />
<Translation ArtistFrom="Taku Iwa[sz]aki" ArtistTransTo="Taku Iwasaki" ArtistTo="岩崎琢" />
<Translation ArtistFrom="Hideki Naganuma" ArtistTo="長沼英樹" />
<!-- Note that these are double-width parentheses. -->
<Translation TitleFrom="Under Star\(Hajime no Ippo Opening 2\)" TitleTo="Under Star" SubtitleTo="(はじめの一歩 Opening 2"
SubtitleTransTo="(Hajime no Ippo Opening 2)" />
<!-- This song had the game title in the artist field, instead of the actual artist. -->
<Translation ArtistFrom="Seiken Densetsu 2 OST" TitleTo="Meridian Dance" SubtitleTo="聖剣伝説2OST"
SubtitleTransTo="Seiken Densetsu 2 OST" ArtistTo="菊田裕樹" ArtistTransTo="Hiroki Kikuta" />
<Translation ArtistFrom="Ayumi and Vincent de Moor" ArtistTo="あゆみ and Vincent de Moor" />
<Translation ArtistFrom="Toshio Sakurai" ArtistTo="桜井敏郎" />
<Translation ArtistFrom="Yasunori Mitsuda" ArtistTo="光田康典" />
<Translation ArtistFrom="Lee Jung Hyun" ArtistTo="이정현" />
<Translation ArtistFrom="Tamaki Nami" ArtistTo="玉置成実" />
<Translation ArtistFrom="Tomoe Shinohara" ArtistTo="篠原ともえ" />
<Translation ArtistFrom="Maaya Sakamoto" ArtistTo="坂本真綾" />
<Translation TitleFrom="Black Cat" TitleTo="검은고양이" />
<Translation TitleFrom="Dream Possession" TitleTo="夢有" TitleTransTo="Yume Ari" ArtistTo="Des-ROW·組"
ArtistTransTo="Des-ROW and KUMI" />
<Translation ArtistFrom="Aaron Kwok" ArtistTo="郭富城" />
<!-- LIGHTNING STAR (Sonic the Hedgehog) -->
<Translation ArtistFrom="(Yuzo Koshiro)|(Koshiro Yuzo)" ArtistTo="古代祐三" />
<!-- VLAD -->
<Translation ArtistFrom="Jaurim" ArtistTo="자우림" />
<!-- Tournamix 4+: -->
<Translation ArtistFrom="Gwashi" ArtistTo="グワシ" />
<Translation TitleFrom="Kuru Kuru Mirakuru" TitleTo="くるくるミラクル" />
<Translation TitleFrom="Nuh" TitleTo="너" />
<!-- Error fix: make sure we don't change the artist like this for the wrong song. -->
<Translation TitleFrom="PARTY☆NIGHT" SubtitleFrom="\(Hyper Para Para Version\)" ArtistFrom="林原めぐみ&奥井雅美"
ArtistTo="真田アサミ&沢城みゆき&氷上恭子" ArtistTransTo="Sanada Asami, Sawashiro Miyuki and Hikami Kyouko" />
<Translation TitleFrom="Sakura Saku Mirai Koi Yume" TitleTo="サクラサクミライコイユメ" />
<Translation TitleFrom="Salariman Aboeji" TitleTo="샐러리맨 아버지" />
<Translation TitleFrom="This is Unmei" TitleTo="This is 運命" ArtistTo="メロン記念日" />
<Translation TitleFrom="Torinouta" TitleTo="鳥の歌" />
<Translation TitleFrom="Wonder Woman" TitleTo="神奇女侠" />
<Translation TitleFrom="Honeymoon" TitleTo="허니문" />
<Translation TitleFrom="Michyo" TitleTo="미쳐" />
<Translation TitleFrom="(Tell Me)|(Mal Hae)" TitleTo="마해" />
<Translation TitleFrom="Dal Ah Dal Ah" TitleTo="달아달아" />
<Translation TitleFrom="Hanabi" TitleTo="花火" />
<Translation TitleFrom="Hanabi\(Lange Remix\)" TitleTo="花火" TitleTransTo="Hanabi" SubtitleTo="Lange Remix" />
<Translation TitleFrom="Heaven of Hoodlums" TitleTo="깡패천국" />
<Translation TitleFrom="Haruka Kanata" TitleTo="遥か彼方" />
<Translation TitleFrom="hyakugojyuuichi" TitleTo="百五十一" />
<Translation TitleFrom="Midsummers Night Midsummers Dream" TitleTo="真夏の花・真夏の夢" TitleTransTo="Midsummer's Night Midsummer's Dream" />
<Translation TitleFrom="Deluxe" ArtistFrom="Key-a-Kiss" TitleTo="デラックス" />
<Translation ArtistFrom="Melon Kinenbi" ArtistTo="メロン記念日" />
<Translation ArtistFrom="(Sammi Cheng)|(Cheng Sammy)" ArtistTo="郑秀文" />
<Translation ArtistFrom="(Wong Faye)|(Faye Wong)" ArtistTo="王菲" />
<Translation ArtistFrom="(Namie Amuro)|(Amuro Namie)" ArtistTo="あむろなみえ" />
<Translation TitleFrom="This Is Unmei" TitleTo="This is 運命" />
<Translation TitleFrom="Michyo" TitleTo="미쳐" />
<Translation TitleFrom="Smile" ArtistFrom="Myco" SubtitleTo="(満月をさがして)" />
<Translation TitleFrom="Journey to the West" TitleTo="西遊記" />
<Translation ArtistFrom="Dicky Cheung" ArtistTo="張衛健" />
<Translation ArtistFrom="Yoo Seung Jun" ArtistTo="유승준" />
<Translation ArtistFrom="Leon Lai" ArtistTo="黎明" />
<Translation ArtistFrom="KOTOKO & Hiromi Sato" ArtistTo="KOTOKO&佐藤裕美" />
<Translation ArtistFrom="M-FLO loves Crystal Kay" ArtistTo="M-FLO l♡ves Crystal Kay" />
<Translation TitleFrom="Syunikiss" ArtistFrom="Malice Mizer" SubtitleTo="~二度目の哀悼~" />
<Translation TitleFrom="kono omoi o tsutaetai" ArtistFrom="sakura" TitleTo="この思いを伝えたい" ArtistTo="さくら" />
<!-- Tournamix 5: -->
<Translation TitleFrom="OMEGA" ArtistFrom="MAX DRAGON" TitleTo="Ω" />
<Translation TitleFrom="Haruka Kanata" TitleTo="遥か彼方" />
<Translation TitleFrom="Honjitsu wa Seiten Nari" TitleTo="本日は晴天なり" />
<Translation TitleFrom="Strong Star Soldier" TitleTo="強いぞ星の戦士" />
<Translation TitleFrom="O M E G A" TitleTo="Ω" />
<!-- http://www.makusonia.com/discography/album/album_2.html -->
<Translation TitleFrom="(Majimena|Urajimena) *Kikkake" TitleTo="真面目なキッカケ" />
<Translation TitleFrom="Guri Guri" TitleTo="グリグリ" />
<!-- Don't translit all songs named "Sigma" to Σ; only the ones that are actually -->
<!-- intended to be written that way. -->
<Translation TitleFrom="Sigma" ArtistFrom="(Shiina Ringo|椎名林檎)" TitleTo="Σ" />
<!-- Gimmick for this artist only: -->
<Translation TitleFrom="Motto" ArtistFrom="(Ishisaka Kumiko)|(Kumiko Ishisaka)|(石坂久美子)" TitleTo="Mottö" />
<!-- http://www.hotei.com/ -->
<Translation ArtistFrom="(Hotei Tomoyasu)|(Tomoyasu Hotei)" ArtistTo="布袋寅泰" />
<!-- http://www.uyax.com/whats/index.html -->
<Translation ArtistFrom="(Yuuya Asaoka)|(Yuuya Asaoka)" ArtistTo="浅岡雄也" />
<!-- http://www5a.biglobe.ne.jp/~iwadare/main_fl_j.html -->
<Translation ArtistFrom="(Noriyuki Iwadare)|(Iwadare Noriyuki)" ArtistTo="岩垂徳行" />
<!-- http://www.avexnet.or.jp/shimatani/ -->
<Translation ArtistFrom="(Hitomi Shimatani)|(Shimatani Hitomi)" ArtistTo="島谷ひとみ" />
<!-- http://www.pokemon.co.jp/videodvdcd/others/01.html -->
<!-- http://www.amazon.co.jp/exec/obidos/ASIN/B00005F3KX/qid=1085712723/br=1-10/ref=br_lf_m_9/249-1818804-8449929 -->
<Translation TitleFrom="POKEMON ieru ka NEO" ArtistFrom="Imakuni" TitleTo="ポケモン言えるかneo" ArtistTo="イマクニ?" />
<!-- http://www.toshiba-emi.co.jp/domestic/artists/ringo/ -->
<Translation ArtistFrom="(Shiina Ringo)|(Shiina Ringo)" ArtistTo="椎名林檎" />
<!-- http://sdb.noppo.com/kumiko_w.htm -->
<Translation ArtistFrom="KLONOA *\(kumiko watanabe\)" ArtistTo="KLONOA (渡辺久美子)" />
<Translation SubtitleFrom="- HOSHI NO UMI KAZE NO YUME -" SubtitleTo="-星の海風の夢-" />
<!-- http://www.geneon-ent.co.jp/rondorobe/music/parapara/meca-max.html -->
<!-- http://system.emedia.co.jp/details/NMC-1070912-9976204.html -->
<Translation ArtistFrom="(Shinichi Ish?ihara)|(Ish?ihara Shinichi)" ArtistTo="石原慎一" />
<!-- http://www.geneon-ent.co.jp/rondorobe/music/parapara/meca-max.html -->
<!-- http://system.emedia.co.jp/details/NMC-1070912-9976204.html -->
<Translation ArtistFrom="(Norifumi Ono)|(Ono Norifumi)" ArtistTo="小野訓史" />
<!-- http://www.konamistyle.com/product/product_detail.aspx?pfid=KOLA-51 -->
<Translation ArtistFrom="(Kumiko Ishisaka)|(Ishisaka Kumiko)" ArtistTo="石坂久美子" />
<!-- http://www.smtown.com/smtown/shin/ -->
<Translation ArtistFrom="Shinhwa" ArtistTo="신화" />
<Translation ArtistFrom="(Hong Seok)|(Seok Hong)" ArtistTo="홍석" />
<!-- http://www.ampcast.com/music/14706/artist.php -->
<Translation ArtistFrom="KaW vs. Smiley vs. Inspector K" ArtistTo="KaW vs. ☺ vs. Inspector K" />
<!-- http://www.hicbc.com/tv/kirby/staff/ -->
<Translation ArtistFrom="Miyagawa Akira" ArtistTo="宮川彬良" />
<!-- OSC (Original Step Contest; http://ddrosc.bemanistyle.com/osc3/): -->
<Translation TitleFrom="Love Hina" SubtitleFrom="- main theme" ArtistFrom="Hayashibra Megumi\(Haruka Urashima\)"
TitleTo="桜咲く" TitleTransTo="Sakura Saku" SubtitleTo="-erase-" SubtitleTransTo="-erase-" ArtistTo="林原めぐみ"
ArtistTransTo="Hayashibara Megumi (Haruka Urashima)" />
<!-- OSC2: -->
<Translation TitleFrom="Dejiko to Gema" SubtitleFrom="no RAP DE DATE" TitleTo="でじことゲマの" SubtitleTo="ラップDEデート"
ArtistFrom="Assami Sanada \+ Yoshiko Kamei" ArtistTo="真田アサミ&亀井芳子" ArtistTransTo="Asami Sanada + Yoshiko Kamei" />
<!-- OSC3: -->
<Translation ArtistFrom="E-Paksa" ArtistTo="이박사" />
<!-- http://www.sonicteam.com/sonicadv/snd/cd_1.html -->
<Translation ArtistFrom="(Naofumi Hataya)|(Hataya Naofumi)" ArtistTo="幡谷尚史" />
<!--
# Note: while this name is Chinese, we're displaying it with a Japanese
# font page. We don't have any way to tag text language. This isn't
# really a problem: I think Japanese and Chinese people prefer seeing
# characters in their own language's font, anyway, so let's just leave
# it up to the theme to pick which font style to use.
-->
<Translation TitleFrom="Red Sun" ArtistFrom="Alan Tam / Hacken Lee" TitleTo="紅日" ArtistTo="譚詠麟/李克勤" />
<Translation TitleFrom="Sabishii Kute Loneliness" ArtistFrom="wandasu" TitleTo="淋しくてLoneliness"
ArtistTo="ワンダース" />
<!-- Foonmix: "Yubikiri" has the artist translit in the subtitle translit; move it. -->
<Translation ArtistFrom="ねこみみ魔法使い feat.都築きせの" SubtitleTransTo="-erase-" ArtistTransTo="NekomimiMahouTsukai feat.KisenoTsuduki" />
<!-- DREAMS COME TRUE: -->
<Translation TitleFrom="Asa ga Mata Kuru" TitleTo="朝がまた来る" />
<Translation TitleFrom="Haretara Line" TitleTo="晴れたらいいね" />
<Translation TitleFrom="Kessenwa Kinyoubi" TitleTo="決戦は金曜日" />
<Translation TitleFrom="Nante Koi Shitandaro" TitleTo="なんて恋したんだろ" />
<Translation TitleFrom="Ureshii! Tanoshii! Daisuki!" TitleTo="うれしい! たのしい! 大好き!" />
<Translation TitleFrom="Mirai Yosouzu II" TitleTo="未来予想図II" />
<!-- OHA: -->
<Translation ArtistFrom="War[ui]jiennu" ArtistTo="わるじぇんぬ" />
<Translation ArtistFrom="Yama-?chan with Jimusasu ?Hikaru" ArtistTo="やまちゃん with ジムナスひかる" />
<Translation TitleFrom="OHA OHA Sutaataa" TitleTo="OHA OHA スターター" />
<Translation ArtistFrom="Yama-?chan (&|with) (Reimondo|Raymond)" ArtistTo="やまちゃん&レイモンド" />
<Translation ArtistFrom="Oha Kids with Imakuni(\??)" ArtistTo="おはおはキッズ with イマクニ?" />
<Translation TitleFrom="Sayonara no Kawari Ni" TitleTo="サヨナラのかわりに" />
<Translation ArtistFrom="(Ohhagumi|Oha Gumi)" ArtistTo="おはぐみ" />
<Translation ArtistFrom="Morikubo Shoutarou" ArtistTo="怪人ゾナー" />
<Translation TitleFrom="Zonapara" TitleTo="ゾナパラ" />
<Translation SubtitleFrom=".*WHY! Parapara Remix.*" SubtitleTo="WHY! パラパラ・リミックス" />
<Translation ArtistFrom="Zobekka" ArtistTo="ゾベッカ" />
<!-- (not oha sta, hurr) -->
<Translation ArtistFrom="Omega Versus KTz" ArtistTo="Ω Versus KTz" />
<Translation ArtistFrom="DJ Demon Versus Omega" ArtistTo="DJ 鬼 Versus 鬼" />
<Translation ArtistFrom="NW 260, ZZ, and 290" ArtistTo="NW 260, &doublezeta;, and 290" />
<!-- Tokimeki Memorial Dancing Summer Vacation -->
<Translation TitleFrom="Anata ni Aete" TitleTo="あなたに会えて" />
<Translation ArtistFrom="Junko Noda" ArtistTo="野田 順子" />
<Translation TitleFrom="Futari no Toki" TitleTo="二人の時" />
<Translation TitleFrom="Haru-iro no Kaze no Naka de" TitleTo="春色の風の中で" />
<Translation ArtistFrom="Mami Kingetsu" ArtistTo="金月 真美" />
<Translation TitleFrom="Motto! Motto! Tokimeki" TitleTo="もっと! モット! TOKIMEKI" />
<Translation TitleFrom="Tokimeki no Organ" TitleTo="ときめきのオルゴール" />
<Translation TitleFrom="Yuuki no Kamisama" TitleTo="勇気の神様" />
<Translation ArtistFrom="Yuuko Asahina" ArtistTo="朝比奈 夕子" />
<!-- Handle some broken data. -->
<Translation TitleFrom="Kamisama" ArtistFrom="Unknown" TitleTo="勇気の神様" ArtistTo="野田 順子" />
<Translation TitleFrom="Haru" ArtistFrom="Unknown" TitleTo="春色の風の中で" ArtistTo="金月 真美" />
<Translation TitleFrom="Hero Club-MIX" ArtistFrom="Unknown" ArtistTo="朝比奈 夕子" />
<Translation TitleFrom="Olgore" ArtistFrom="Unkown" TitleTo="ときめきのオルゴール" ArtistTo="金月 真美" />
<Translation TitleFrom="Anata" ArtistFrom="Unknown" TitleTo="あなたに会えて" ArtistTo="野田 順子" />
<Translation TitleFrom="Futari" ArtistFrom="Unknown" TitleTo="二人の時" ArtistTo="金月 真美" />
<Translation TitleFrom="Mot! Mot! Tokimeki" ArtistFrom="Unknown" TitleTo="もっと! モット! TOKIMEKI"
ArtistTo="金月 真美" />
<!-- Disney Dancing Museum: -->
<Translation TitleFrom="Chip 'N' Dale's Vacation" TitleTo="チップとデールのバケーション" ArtistTo="チップ&デール" />
<Translation TitleFrom="Disco Magic" ArtistFrom="Minnie" TitleTo="ディスコマジック" ArtistTo="ミニー" />
<Translation TitleFrom="Electrical Parade" ArtistFrom="Minnie" TitleTo="エレクトリカル・パレード" ArtistTo="ミニー" />
<Translation TitleFrom="Go Go Go" ArtistFrom="Donald" TitleTo="ゴー・ゴー・ゴー" ArtistTo="ドナルド" />
<Translation TitleFrom="Goofy's Rock 'N' Roll Show" TitleTo="グーフィーのロックンロールショー" ArtistTo="グーフィー" />
<Translation TitleFrom="Irish River" ArtistFrom="Goofy" TitleTo="アイリッシュリバー" ArtistTo="グーフィー" />
<Translation TitleFrom="It's A Small World" ArtistFrom="Huey, Dewey & Louie" TitleTo="イッツ・ア・スモール・ワールド"
ArtistTo="ヒューイ/デューイ/ルーイ" />
<Translation TitleFrom="Mickey Fever" TitleTo="ミッキー・フィーバー" ArtistTo="ミッキー" />
<Translation TitleFrom="Mickey Motion" TitleTo="ミッキー・モーション" ArtistTo="ミニー" />
<Translation TitleFrom="Mickey Mouse March" ArtistFrom="Mickey" TitleTo="ミッキーマウス・マーチ" ArtistTo="ミッキー" />
<Translation TitleFrom="Mickey Mouse Ondo" TitleTo="ミッキーマウス音頭" ArtistTo="ミッキー" />
<Translation TitleFrom="Minnie's Yoo Hoo!" TitleTo="ミニーのユーフー!" ArtistTo="ミニー" />
<Translation TitleFrom="Miwaku no Tango" ArtistFrom="Clarabell" TitleTo="魅惑のタンゴ" ArtistTo="クララベル" />
<Translation TitleFrom="Morty and Ferdy's Carnival" TitleTo="モーティとフェルディのカーニバル" ArtistTo="モーティ&フェルディ" />
<Translation TitleFrom="Para-Para Venus" ArtistFrom="Daisy" TitleTo="パラパラヴィーナス" ArtistTo="デイジー" />
<Translation TitleFrom="Russian Dance" ArtistFrom="Scrooge" TitleTo="ロシアの踊り" ArtistTo="スクルーヅ" />
<Translation TitleFrom="Savanna No Mukou" ArtistFrom="Donald" TitleTo="サバンナのむこう" ArtistTo="ドナルド" />
<Translation TitleFrom="Taiyo No Rakuen" ArtistFrom="Horace" TitleTo="太陽の楽園" ArtistTo="ホーレス" />
<Translation TitleFrom="Tap! Tap! Tap!" ArtistFrom="Grandma Duck" TitleTo="タップ!タップ!タップ!" ArtistTo="グランアダックタ" />
<Translation TitleFrom="The Tiki Tiki Tiki Room" ArtistFrom="Goofy" TitleTo="魅惑のチキルーム" ArtistTo="グーフィー" />
<Translation TitleFrom="Turkey In The Straw" ArtistFrom="Pluto" TitleTo="藁の中の七面鳥" ArtistTo="プルート" />
<Translation TitleFrom="Waltz of the Flowers" ArtistFrom="Daisy" TitleTo="花のワルツ" ArtistTo="デイジー" />
<Translation TitleFrom="Pokemon" TitleTo="Pokémon" />
<!-- Korean: -->
<Translation TitleFrom="Ba Kkwo" TitleTo="바꿔" />
<Translation TitleFrom="Wa" TitleTo="와" />
<Translation TitleFrom="Bu Dam" TitleTo="부담" />
<Translation TitleFrom="Byul" TitleTo="별" />
<Translation ArtistFrom="(Gunchuri Kko Kko)|(Country Kko Kko)" ArtistTo="컨츄리꼬꼬" />
<Translation ArtistFrom="Back Ji Young" ArtistTo="백지영" />
<Translation ArtistFrom="Lee Jung Hyun" ArtistTo="이정현" />
<Translation TitleFrom="Hogisim" TitleTo="호기심" />
<Translation TitleFrom="Aromdaon 21C" TitleTo="아름다운21C" ArtistTo="2000 대한민국" />
<Translation TitleFrom="Gyoung Go" TitleTo="경고" />
<Translation TitleFrom="Sung Suk" TitleTo="성숙" />
<Translation TitleFrom="Gamyunwi Shigan" TitleTo="가면의 시간" />
<Translation TitleFrom="(Gaggai)|(Gagaai)" TitleTo="가까이" />
<Translation ArtistFrom="Tashannie" ArtistTo=" 타샤니" />
<Translation ArtistFrom="Hans Band" ArtistTo="한스밴드" />
<!-- In the Groove: -->
<Translation ArtistFrom="Smiley" ArtistTo="☺" />
<Translation ArtistFrom="KaW feat. Smiley" ArtistTo="KaW feat. ☺" />
<!-- Mungyodance -->
<Translation TitleFrom="Hardcore Disco (Kitsune\? Remix)" TitleTo="Hardcore Disco (Kitsune² Remix)" />
<Translation TitleFrom="Micro N\?" TitleTo="Micro N²" />
<Translation TitleFrom="Caramelldansen (Ryu\* Remix)" TitleTo="Caramelldansen (Ryu☆ Remix)" />
<Translation ArtistFrom="Kitsune\?" ArtistTo="Kitsune²" />
<Translation ArtistFrom="Bl\?mchen" ArtistTo="Blümchen" />
<Translation ArtistFrom="Kitsune\? and Emoticon" ArtistTo="Kitsune² and Emoticon" />
<Translation ArtistFrom="Emoticon & Kitsune\?" ArtistTo="Emoticon & Kitsune²" />
<Translation ArtistFrom="D-Mode-D feat. Kitsune\?" ArtistTo="D-Mode-D feat. Kitsune²" />
<Translation ArtistFrom="Kitsune\? and D-Mode-D" ArtistTo="Kitsune² and D-Mode-D" />
<Translation ArtistFrom="Hecate and Kitsune\?" ArtistTo="Hecate and Kitsune²" />
<Translation ArtistFrom="Renard vs Kitsune\?" ArtistTo="Renard vs Kitsune²" />
<Translation ArtistFrom="MGD-Crew feat. Kitsune\?" ArtistTo="MGD-Crew feat. Kitsune²" />
<Translation ArtistFrom="Sonitus Vir x Kitsune\?" ArtistTo="Sonitus Vir x Kitsune²" />
<!-- Misc: -->
<Translation TitleFrom="Pokemon" TitleTo="Pokémon" DontTransliterate />
<Translation ArtistFrom="Omega Versus KTz" ArtistTo="Ω Versus KTz" />
<Translation ArtistFrom="DJ Demon Versus Omega" ArtistTo="DJ 鬼 Versus Ω" />
<Translation ArtistFrom="NW 260, ZZ, and 290" ArtistTo="NW 260, &doublezeta;, and 290" />
<!-- http://bemanistyle.com/sims/viewsim.php?id=1161 -->
<Translation TitleFrom="Renai Revolution 21" TitleTo="恋愛レボリューション21" />
<!-- http://bemanistyle.com/sims/viewsim.php?id=1160 -->
<Translation SubtitleFrom="~Ai no Big Band~" SubtitleTo="~愛のビッグバンドー~" />
<!-- CHOP CHOP, MASTER ONION'S RAP (PaRappa the Rapper) -->
<Translation ArtistFrom="(Masaya Matsuura)|(Matsuura Masaya)" ArtistTo="松浦雅也" />
<!-- Fanboy bonus: -->
<Translation ArtistFrom="(Megumi Hayashibara)|(Hayashibara Megumi)" ArtistTo="林原めぐみ" />
<Translation ArtistFrom="(Ayumi Hamasaki)|(Hamasaki Ayumi)" ArtistTo="浜崎あゆみ" />
<Translation ArtistFrom="(Hiroko Kasahara)|(Kasahara Hiroko)" ArtistTo="笠原弘子" />
<Translation ArtistFrom="(Mai Kuraki)|(Kuraki Mai)" ArtistTo="倉木麻衣" />
<Translation ArtistFrom="Miryokuteki" ArtistTo="魅力的" />
<Translation ArtistFrom="(Yuki Kimura)|(Kimura Yuki)" ArtistTo="木村由姫" />
<Translation ArtistFrom="(Takako Matsu)|(Matsu Takako)" ArtistTo="松たか子" />
<Translation ArtistFrom="(Suzuki Ami)|(Ami Suzuki)" ArtistTo="鈴木あみ" />
<Translation ArtistFrom="(Sakura Tange)|(Tange Sakura)" ArtistTo="丹下桜" />
<Translation ArtistFrom="(Hikaru Utada)|(Utada Hikaru)" ArtistTo="宇多田ひかる" />
<Translation ArtistFrom="(Masami Okui)|(Okui Masami)" ArtistTo="奥井雅美" />
<Translation ArtistFrom="Morning Musume" ArtistTo="Morning娘" />
<Translation ArtistFrom="(You?ko Ishida)|(Ishida You?ko)" ArtistTo="石田燿子" />
<Translation ArtistFrom="(You?ko Kanno)|(Kanno You?ko)" ArtistTo="菅野よう子" />
<Translation ArtistFrom="You?ko Kanno (and|&) the Seatbelts" ArtistTo="菅野よう子 and the Seatbelts" />
<Translation ArtistFrom="(Megumi Ogata)|(Ogata Megumi)" ArtistTo="緒方恵美" />
<Translation ArtistFrom="(You?ko Takahashi)|(Takahashi You?ko)" ArtistTo="高橋洋子" />
<Translation ArtistFrom="(Daichi Akitaroh)|(Akitaroh Daichi)" ArtistTo="大地丙太郎" />
<Translation ArtistFrom="(Yui Horie)|(Horie Yui)" ArtistTo="堀江由衣" />
<Translation ArtistFrom="(Nobuo Uematsu)|(Uematsu Nobuo)" ArtistTo="植松伸夫" />
<Translation ArtistFrom="Mitsuishi Kotono" ArtistTo="三石琴乃" />
<Translation ArtistFrom="(Kou?ji Kondou?|Kondou? Kou?ji)" ArtistTo="近藤浩治" />
<Translation ArtistFrom="(Yuki Matsuoka)|(Matsuoka Yuki)" ArtistTo="松岡由貴" />
<Translation ArtistFrom="Blue?mchen" ArtistTo="Blümchen" DontTransliterate />
</Songs>
<Courses>
<Translation TitleFrom="(Kidou)|(Demon Road)|(Road of Oni)|(Oni Michi)|(Kidou/Onimichi \(Demon Road\))"
TitleTo="鬼道" />
<Translation TitleFrom="(Kidou 2)|(Demon Road 2)|(Road of Oni 2)|(Oni Michi 2)|(Kidou 2/Onimichi 2 \(Demon Road 2\))"
TitleTo="鬼道 弐" />
<Translation TitleFrom="Love" TitleTo="Love ♡" />
<Translation TitleFrom="Love Love" TitleTo="Love ♡" />
<Translation TitleFrom="(2 ?MB)|(Road of 2 ?MB)" TitleTo="2MB道" />
<Translation TitleFrom="Dancemania( Oni)?" TitleTo="Dancemania 鬼" />
<Translation TitleFrom="(TaQ( Oni)?)|(Road of TaQ)" TitleTo="TaQ道" />
<Translation TitleFrom="(Legend(ary)? Road)|(Road of Legend)" TitleTo="伝説道" />
<Translation TitleFrom="(Slow Demon Road)|(Road of Slow)|(Demon's Slow Road)" TitleTo="鬼の遅道" />
<!-- "Road of True"? Maybe "Truth"? -->
<Translation TitleFrom="(True Demon Road)|(Road of Tru.*)" TitleTo="真鬼道" />
<Translation TitleFrom="(DDR HOME VERSION)" TitleTo="家庭用DDRコース" />
<Translation TitleFrom="Four Seasons" TitleTo="春夏秋冬" />
<Translation TitleFrom="DanceMania Nonstop" TitleTo="DanceMania 連" />
<Translation TitleFrom="(Otome no Michi|Maiden Star Road)" TitleTo="乙女☆道" />
<Translation TitleFrom="(Oni no Ran)|(Rebellion of Demons)" TitleTo="鬼の乱" />
</Courses>
<Groups>
<Translation TitleFrom="((Dance Dance Revolution)|(dance dance revolution)|(DANCE DANCE REVOLUTION))(.*)"
TitleTo="DDR\${5}" />
<Translation TitleFrom="((Pump It Up)|(pump it up)|(PUMP IT UP))(.*)" TitleTo="PIU\${5}" />
<Translation TitleFrom="((ParaParaParadise)|(paraparaparadise)|(PARAPARAPARADISE)|(Para Para Paradise)|(para para paradise)|(PARA PARA PARADISE))(.*)"
TitleTo="PPP\${8}" />
<Translation TitleFrom="((Dancing Stage)|(dancing stage)|(DANCING STAGE))(.*)" TitleTo="DS\${5}" />
<Translation TitleFrom="((Ez2dancer)|(Ez 2 Dancer))(.*)" TitleTo="EZ2\${4}" />
<Translation TitleFrom="((Technomotion)|(Techno Motion))(.*)" TitleTo="TM\${4}" />
<Translation TitleFrom="((Dance Station 3DDX)|(DS3DDX))(.*)" TitleTo="3DDX\${4}" />
<Translation TitleFrom="((BeatMania)|(Beatmania)|(BEATMANIA)|(beatmania))(.*)" TitleTo="BM\${6}" />
<Translation TitleFrom="((In The Groove)|(In the Groove))(.*)" TitleTo="ITG\${4}" />
<!-- <Translation TitleFrom="((Mungyodance)|(Mungyodance))(.*)" TitleTo="MGD\${4}" /> -->
<!-- <Translation TitleFrom="((Flightmix)|(Flightmix))(.*)" TitleTo="FMX\${4}" /> -->
<!-- <Translation TitleFrom="((Kurimix)|(Kurimix))(.*)" TitleTo="KMX\${4}" /> -->
</Groups>
</Translations>
<?xml version="1.0" encoding="UTF-8" ?>
<!--
# This file is UTF-8; to be readable, edit it in an editor capable
# of UTF-8, such as Notepad in Windows 2000 and later.
# Also it's best to view this with a font that supports various UTF-8
# characters, as opposed to monospaced fonts.
#
# Six keywords: TitleFrom, ArtistFrom, SubtitleFrom, TitleTo,
# ArtistTo, SubtitleTo.
#
# From lines are regular expressions. If all From lines for a set
# are matched, all To lines are replaced.
#
# All lines, by default, must match the entire line; for example,
# "Foo" matches only "Foo", not "Foobar". Matches are case-insensitive.
#
# Matches are checked in the order given in this file; more than one
# set may match a single song.
#
# Courses are matched by title only.
#
# Note that changes to this file are only applied to songs when they are
# first loaded. Delete the files in the "Cache" directory after making
# changes.
-->
<Translations>
<Songs>
<Translation TitleFrom="17 ?(Sai|Ages)?" TitleTo="17才" />
<Translation TitleFrom="Hypnotic Crisis" TitleTo="HYPNØTIC CRISIS" />
<Translation TitleFrom="((Matsuri )|(\{ ))Japan" TitleTo="祭 JAPAN" />
<!-- Matsuri Japan is often just "Japan". There may be other songs by -->
<!-- that name, too, so match the artist, too. -->
<Translation TitleFrom="Japan" ArtistFrom=".*(Re-Venge)|(RevenG).*" TitleTo="祭 JAPAN" />
<Translation TitleFrom="(Dancing|Odoru) Po[mn]pokolin" TitleTo="おどるポンポコリン" />
<Translation TitleFrom="(God of Romance)|(Roman(su|ce) no Kamisama)" TitleTo="ロマンスの神様" />
<!-- People can't decide how they want to spell this, so cope with both l or r, and one or two l/r and t. -->
<Translation TitleFrom="Sana Mo((ll?)|(rr?))et(t?)e Ne Ente" TitleTo="サナ・モレッテ・ネ・エンテ" />
<!-- "Candy", "Candy star", or "Candy #". -->
<Translation TitleFrom="Candy(( star)?|#)" ArtistFrom="Luv.*" TitleTo="CANDY☆" />
<Translation TitleFrom="Freckles( ?-? ?Sobakasu)?" TitleTo="そばかす" />
<Translation TitleFrom="Sobakasu( ?-? ?Freckles)?" TitleTo="そばかす" />
<Translation TitleFrom="Yozora no Muko" TitleTo="夜空ノムコウ" />
<Translation TitleFrom="Bre[a=]k ?Down!?" TitleTo="BRE∀K DOWN!" />
<!-- "Candy", "Candy heart", or "Candy $". -->
<Translation TitleFrom="Candy(( heart)?|\$)" ArtistFrom=".*(Riyu|りゆ).*" TitleTo="CANDY♡" />
<Translation TitleFrom="(Kakumei)|(\+\{)" TitleTo="革命" />
<!-- Fix up hacked titles from 3.0 spigumus hacks: -->
<Translation TitleFrom="} JAPAN" TitleTo="祭 JAPAN" />
<Translation TitleFrom="\+\{" TitleTo="革命" />
<Translation TitleFrom="Sweet Sweet (Love |\$ )?Magic" TitleTo="Sweet Sweet ♡ Magic" />
<!-- Special stuff is done. Titles: -->
<Translation TitleFrom="Matsuri Japan" TitleTo="祭 JAPAN" />
<Translation TitleFrom="Kakumei" TitleTo="革命" />
<Translation TitleFrom="Bre[a=]k ?Down!?" TitleTo="BRE∀K DOWN!" />
<!-- People can't decide how they want to spell this, so cope with both l or r, and one or two l/r and t. -->
<Translation TitleFrom="Sana Mo((ll?)|(rr?))et(t?)e Ne Ente" TitleTo="サナ・モレッテ・ネ・エンテ" />
<Translation TitleFrom="Hypnotic Crisis" TitleTo="HYPNØTIC CRISIS" />
<Translation TitleFrom="Yozora no Muko" TitleTo="夜空ノムコウ" />
<!-- Handle a typo: -->
<Translation TitleFrom="(A(oi|io) Shoudou|Blue Impulse)" TitleTo="蒼い衝動" />
<Translation TitleFrom="Daikenkai" TitleTo="大見解" />
<Translation TitleFrom="Love (Love )?Shine" TitleTo="LOVE ♡ SHINE" />
<Translation TitleFrom="(God of Romance)|(Romansu no Kamisama)" TitleTo="ロマンスの神様" />
<Translation TitleFrom="(Dancing Pompokolin)|(Odoru Pompokolin)" TitleTo="おどるポンポコリン" />
<Translation TitleFrom="Aoi Shoudou\(for EXTREME\)" TitleTo="蒼い衝動(for EXTREME)" />
<Translation TitleFrom="Love Love Sugar" TitleTo="♡LOVE²シュガ→♡" />
<!-- Handle Door and Doors -->
<Translation TitleFrom="(Doors? of Magic)|(Mahou no Tobira)" TitleTo="魔法の扉" SubtitleTo="(スペース&planet;マコのテーマ)" />
<Translation TitleFrom="Mikeneko Rock" TitleTo="三毛猫ロック" />
<!-- Handle "Mobo Moga:Mobo * Moga"; spaces optional. -->
<Translation TitleFrom="Mobo ?\*? ?Moga" TitleTo="MOBO★MOGA" />
<Translation TitleFrom="Sakura" TitleTo="桜" />
<Translation TitleFrom="Waltz of the Flowers" TitleTo="花のワルツ" />
<Translation TitleFrom="Chotto Kiitena" TitleTo="ちょっときいてな" />
<!-- No need to write transliterations for these. -->
<Translation TitleFrom="L'amour et la liberte" TitleTo="L'amour et la liberté" DontTransliterate />
<Translation TitleFrom="La Senorita" TitleTo="La Señorita" DontTransliterate />
<Translation TitleFrom="La Senorita Virtual" TitleTo="La Señorita Virtual" DontTransliterate />
<Translation TitleFrom="Senorita" TitleTo="SEÑORITA" DontTransliterate />
<Translation TitleFrom="Senorita\(Speedy Mix\)" TitleTo="SEÑORITA" SubtitleTo="Speedy Mix" DontTransliterate />
<Translation TitleFrom="Chotto Kiitena" TitleTo="ちょっときいてな" />
<Translation TitleFrom="The Strong Jaeger" TitleTo="合体せよ!ストロングイェーガー!!" />
<!-- Subtitles: -->
<!-- (Title is Graduation.) -->
<Translation SubtitleFrom=".*(Each Tomorrow|sorezore no ashita).*" SubtitleTo="~それぞれの明日~" />
<!-- Some files are missing the space, so the subtitle isn't parsed. -->
<Translation TitleFrom="GRADUATION~(Each Tomorrow|sorezore no ashita)~" TitleTo="GRADUATION"
SubtitleTo="~それぞれの明日~" SubtitleTransTo="sorezore no ashita" DontTransliterate />
<!-- Artists: -->
<Translation TitleFrom="Max 300" ArtistFrom="%" ArtistTo="Ω" />
<Translation ArtistFrom="Omega" ArtistTo="Ω" />
<!-- I've seen both "Kosaku" and "Kosaka"; Kosaka is correct, but handle both. -->
<Translation ArtistFrom="(Riyu Kosak[au])|(Kosak[au] Riyu)" ArtistTo="小坂りゆ" />
<Translation ArtistFrom="ZZ" ArtistTo="&doublezeta;" />
<!-- Serious tropical ska bomb? ruh roh -->
<Translation ArtistFrom="Anettai Maji.*Ska (Bakudan|Bukuden)" ArtistTo="亜熱帯マジ-SKA爆弾" />
<Translation ArtistFrom="(Spanish Folk Music|Mexican Folk Song)" ArtistTo="メキシコ民謡" />
<Translation ArtistFrom="Sanae? Shintani" ArtistTo="新谷さなえ" />
<Translation TitleFrom="White Lovers" ArtistFrom="Sana" ArtistTo="新谷さなえ" />
<Translation ArtistFrom="YOMA KOMATSU" ArtistTo="ΨΦMA KΦMATSU" />
<Translation ArtistFrom="Bus Stop featuring Carl Douglas" ArtistTo="BUS★STOP featuring CARL DOUGLAS" />
<Translation TitleFrom="(Kick the Can|One Two|Na-Na|Swing It)" ArtistFrom="BUS STOP" ArtistTo="BUS★STOP" />
<Translation ArtistFrom="dj TAKA feat. ?Noria" ArtistTo="dj TAKA feat. のりあ" />
<Translation ArtistFrom="(Miyuki Kunitake)|(Kunitake Miyuki)" ArtistTo="くにたけみゆき" />
<!-- Tournamix: -->
<Translation ArtistFrom="(Masahiro Andoh)|(Andoh Masahiro)" ArtistTo="安藤まさひろ" />
<Translation TitleFrom="Sakura Saku" TitleTo="桜咲く" />
<!-- Theme from Excel Saga: 愛(忠誠心) -->
<!-- http://www.jvcmusic.co.jp/m-serve/tv/excel/index.html -->
<Translation ArtistFrom="(Toshio Masuda)|(Masuda Toshio)" ArtistTo="舛田利雄" />
<!-- Theme from Trigun -->
<Translation ArtistFrom="(Tsuneo Imahori)|(Imahori Tsuneo)" ArtistTo="今堀恒雄" />
<!-- Tournamix 2: -->
<!-- http://www.web-konami.com/products/ps2/castlevania/ -->
<Translation ArtistFrom="(Michuri Yamane)|(Yamane Michuri)" ArtistTransTo="Michiru Yamane" ArtistTo="山根ミチル" />
<!-- Tournamix 3: -->
<Translation TitleFrom="Tsugaru Kaikyou no Onna" TitleTo="津軽海峡の女" ArtistTo="ソニン" />
<Translation TitleFrom="Kaniyuuutsu" TitleTo="甘いユウウツ" />
<Translation TitleFrom="Negai" TitleTo="願い" />
<!-- http://www.avexnet.or.jp/avexdb/morinaga/ -->
<Translation ArtistFrom="(Hatsumi Morinaga)|(Morinaga Hatsumi)" ArtistTo="守永初美" />
<!-- Tournamix 4: -->
<Translation TitleFrom="Akumajo Dracula MEDLEY" TitleTo="悪魔城ドラキュラMEDLEY" />
<Translation ArtistFrom="Kukeihakurabu" ArtistTo="矩形波倶楽部" />
<Translation ArtistFrom="Yuji Ueda & Yui Horie" ArtistTo="上田祐司&堀江由衣" />
<Translation ArtistFrom="Atsuko Enomoto" ArtistTo="榎本温子" />
<Translation TitleFrom="Hareta Hi no Marine" TitleTo="晴れた日のマリーン" />
<Translation ArtistFrom="Gotou? Maki" ArtistTo="後藤真希" />
<Translation TitleFrom="La Duena del Swing" TitleTo="La Dueña del Swing" />
<Translation TitleFrom="Pokemon Trainer Theme" TitleTo="Pokémon Trainer Theme" />
<Translation ArtistFrom="Pokemon Jhoto" ArtistTo="Pokémon Jhoto" />
<Translation TitleFrom="Watashi No Tamagoyaki" TitleTo="私の卵焼き" />
<Translation TitleFrom="sora *mimi keek[ei]" TitleTo="空耳ケーキ" />
<Translation TitleFrom="The Peace!" TitleTo="The☆Peace!" />
<Translation TitleFrom="tentaikansoku" TitleTo="天体観測" ArtistTo="入尾信充" />
<Translation SubtitleFrom="\(e=mc2 mix\)" SubtitleTo="(e=mc² mix)" />
<Translation ArtistFrom="Taku Iwa[sz]aki" ArtistTransTo="Taku Iwasaki" ArtistTo="岩崎琢" />
<Translation ArtistFrom="Hideki Naganuma" ArtistTo="長沼英樹" />
<!-- Note that these are double-width parentheses. -->
<Translation TitleFrom="Under Star\(Hajime no Ippo Opening 2\)" TitleTo="Under Star" SubtitleTo="(はじめの一歩 Opening 2"
SubtitleTransTo="(Hajime no Ippo Opening 2)" />
<!-- This song had the game title in the artist field, instead of the actual artist. -->
<Translation ArtistFrom="Seiken Densetsu 2 OST" TitleTo="Meridian Dance" SubtitleTo="聖剣伝説2OST"
SubtitleTransTo="Seiken Densetsu 2 OST" ArtistTo="菊田裕樹" ArtistTransTo="Hiroki Kikuta" />
<Translation ArtistFrom="Ayumi and Vincent de Moor" ArtistTo="あゆみ and Vincent de Moor" />
<Translation ArtistFrom="Toshio Sakurai" ArtistTo="桜井敏郎" />
<Translation ArtistFrom="Yasunori Mitsuda" ArtistTo="光田康典" />
<Translation ArtistFrom="Lee Jung Hyun" ArtistTo="이정현" />
<Translation ArtistFrom="Tamaki Nami" ArtistTo="玉置成実" />
<Translation ArtistFrom="Tomoe Shinohara" ArtistTo="篠原ともえ" />
<Translation ArtistFrom="Maaya Sakamoto" ArtistTo="坂本真綾" />
<Translation TitleFrom="Black Cat" TitleTo="검은고양이" />
<Translation TitleFrom="Dream Possession" TitleTo="夢有" TitleTransTo="Yume Ari" ArtistTo="Des-ROW·組"
ArtistTransTo="Des-ROW and KUMI" />
<Translation ArtistFrom="Aaron Kwok" ArtistTo="郭富城" />
<!-- LIGHTNING STAR (Sonic the Hedgehog) -->
<Translation ArtistFrom="(Yuzo Koshiro)|(Koshiro Yuzo)" ArtistTo="古代祐三" />
<!-- VLAD -->
<Translation ArtistFrom="Jaurim" ArtistTo="자우림" />
<!-- Tournamix 4+: -->
<Translation ArtistFrom="Gwashi" ArtistTo="グワシ" />
<Translation TitleFrom="Kuru Kuru Mirakuru" TitleTo="くるくるミラクル" />
<Translation TitleFrom="Nuh" TitleTo="너" />
<!-- Error fix: make sure we don't change the artist like this for the wrong song. -->
<Translation TitleFrom="PARTY☆NIGHT" SubtitleFrom="\(Hyper Para Para Version\)" ArtistFrom="林原めぐみ&奥井雅美"
ArtistTo="真田アサミ&沢城みゆき&氷上恭子" ArtistTransTo="Sanada Asami, Sawashiro Miyuki and Hikami Kyouko" />
<Translation TitleFrom="Sakura Saku Mirai Koi Yume" TitleTo="サクラサクミライコイユメ" />
<Translation TitleFrom="Salariman Aboeji" TitleTo="샐러리맨 아버지" />
<Translation TitleFrom="This is Unmei" TitleTo="This is 運命" ArtistTo="メロン記念日" />
<Translation TitleFrom="Torinouta" TitleTo="鳥の歌" />
<Translation TitleFrom="Wonder Woman" TitleTo="神奇女侠" />
<Translation TitleFrom="Honeymoon" TitleTo="허니문" />
<Translation TitleFrom="Michyo" TitleTo="미쳐" />
<Translation TitleFrom="(Tell Me)|(Mal Hae)" TitleTo="마해" />
<Translation TitleFrom="Dal Ah Dal Ah" TitleTo="달아달아" />
<Translation TitleFrom="Hanabi" TitleTo="花火" />
<Translation TitleFrom="Hanabi\(Lange Remix\)" TitleTo="花火" TitleTransTo="Hanabi" SubtitleTo="Lange Remix" />
<Translation TitleFrom="Heaven of Hoodlums" TitleTo="깡패천국" />
<Translation TitleFrom="Haruka Kanata" TitleTo="遥か彼方" />
<Translation TitleFrom="hyakugojyuuichi" TitleTo="百五十一" />
<Translation TitleFrom="Midsummers Night Midsummers Dream" TitleTo="真夏の花・真夏の夢" TitleTransTo="Midsummer's Night Midsummer's Dream" />
<Translation TitleFrom="Deluxe" ArtistFrom="Key-a-Kiss" TitleTo="デラックス" />
<Translation ArtistFrom="Melon Kinenbi" ArtistTo="メロン記念日" />
<Translation ArtistFrom="(Sammi Cheng)|(Cheng Sammy)" ArtistTo="郑秀文" />
<Translation ArtistFrom="(Wong Faye)|(Faye Wong)" ArtistTo="王菲" />
<Translation ArtistFrom="(Namie Amuro)|(Amuro Namie)" ArtistTo="あむろなみえ" />
<Translation TitleFrom="This Is Unmei" TitleTo="This is 運命" />
<Translation TitleFrom="Michyo" TitleTo="미쳐" />
<Translation TitleFrom="Smile" ArtistFrom="Myco" SubtitleTo="(満月をさがして)" />
<Translation TitleFrom="Journey to the West" TitleTo="西遊記" />
<Translation ArtistFrom="Dicky Cheung" ArtistTo="張衛健" />
<Translation ArtistFrom="Yoo Seung Jun" ArtistTo="유승준" />
<Translation ArtistFrom="Leon Lai" ArtistTo="黎明" />
<Translation ArtistFrom="KOTOKO & Hiromi Sato" ArtistTo="KOTOKO&佐藤裕美" />
<Translation ArtistFrom="M-FLO loves Crystal Kay" ArtistTo="M-FLO l♡ves Crystal Kay" />
<Translation TitleFrom="Syunikiss" ArtistFrom="Malice Mizer" SubtitleTo="~二度目の哀悼~" />
<Translation TitleFrom="kono omoi o tsutaetai" ArtistFrom="sakura" TitleTo="この思いを伝えたい" ArtistTo="さくら" />
<!-- Tournamix 5: -->
<Translation TitleFrom="OMEGA" ArtistFrom="MAX DRAGON" TitleTo="Ω" />
<Translation TitleFrom="Haruka Kanata" TitleTo="遥か彼方" />
<Translation TitleFrom="Honjitsu wa Seiten Nari" TitleTo="本日は晴天なり" />
<Translation TitleFrom="Strong Star Soldier" TitleTo="強いぞ星の戦士" />
<Translation TitleFrom="O M E G A" TitleTo="Ω" />
<!-- http://www.makusonia.com/discography/album/album_2.html -->
<Translation TitleFrom="(Majimena|Urajimena) *Kikkake" TitleTo="真面目なキッカケ" />
<Translation TitleFrom="Guri Guri" TitleTo="グリグリ" />
<!-- Don't translit all songs named "Sigma" to Σ; only the ones that are actually -->
<!-- intended to be written that way. -->
<Translation TitleFrom="Sigma" ArtistFrom="(Shiina Ringo|椎名林檎)" TitleTo="Σ" />
<!-- Gimmick for this artist only: -->
<Translation TitleFrom="Motto" ArtistFrom="(Ishisaka Kumiko)|(Kumiko Ishisaka)|(石坂久美子)" TitleTo="Mottö" />
<!-- http://www.hotei.com/ -->
<Translation ArtistFrom="(Hotei Tomoyasu)|(Tomoyasu Hotei)" ArtistTo="布袋寅泰" />
<!-- http://www.uyax.com/whats/index.html -->
<Translation ArtistFrom="(Yuuya Asaoka)|(Yuuya Asaoka)" ArtistTo="浅岡雄也" />
<!-- http://www5a.biglobe.ne.jp/~iwadare/main_fl_j.html -->
<Translation ArtistFrom="(Noriyuki Iwadare)|(Iwadare Noriyuki)" ArtistTo="岩垂徳行" />
<!-- http://www.avexnet.or.jp/shimatani/ -->
<Translation ArtistFrom="(Hitomi Shimatani)|(Shimatani Hitomi)" ArtistTo="島谷ひとみ" />
<!-- http://www.pokemon.co.jp/videodvdcd/others/01.html -->
<!-- http://www.amazon.co.jp/exec/obidos/ASIN/B00005F3KX/qid=1085712723/br=1-10/ref=br_lf_m_9/249-1818804-8449929 -->
<Translation TitleFrom="POKEMON ieru ka NEO" ArtistFrom="Imakuni" TitleTo="ポケモン言えるかneo" ArtistTo="イマクニ?" />
<!-- http://www.toshiba-emi.co.jp/domestic/artists/ringo/ -->
<Translation ArtistFrom="(Shiina Ringo)|(Shiina Ringo)" ArtistTo="椎名林檎" />
<!-- http://sdb.noppo.com/kumiko_w.htm -->
<Translation ArtistFrom="KLONOA *\(kumiko watanabe\)" ArtistTo="KLONOA (渡辺久美子)" />
<Translation SubtitleFrom="- HOSHI NO UMI KAZE NO YUME -" SubtitleTo="-星の海風の夢-" />
<!-- http://www.geneon-ent.co.jp/rondorobe/music/parapara/meca-max.html -->
<!-- http://system.emedia.co.jp/details/NMC-1070912-9976204.html -->
<Translation ArtistFrom="(Shinichi Ish?ihara)|(Ish?ihara Shinichi)" ArtistTo="石原慎一" />
<!-- http://www.geneon-ent.co.jp/rondorobe/music/parapara/meca-max.html -->
<!-- http://system.emedia.co.jp/details/NMC-1070912-9976204.html -->
<Translation ArtistFrom="(Norifumi Ono)|(Ono Norifumi)" ArtistTo="小野訓史" />
<!-- http://www.konamistyle.com/product/product_detail.aspx?pfid=KOLA-51 -->
<Translation ArtistFrom="(Kumiko Ishisaka)|(Ishisaka Kumiko)" ArtistTo="石坂久美子" />
<!-- http://www.smtown.com/smtown/shin/ -->
<Translation ArtistFrom="Shinhwa" ArtistTo="신화" />
<Translation ArtistFrom="(Hong Seok)|(Seok Hong)" ArtistTo="홍석" />
<!-- http://www.ampcast.com/music/14706/artist.php -->
<Translation ArtistFrom="KaW vs. Smiley vs. Inspector K" ArtistTo="KaW vs. ☺ vs. Inspector K" />
<!-- http://www.hicbc.com/tv/kirby/staff/ -->
<Translation ArtistFrom="Miyagawa Akira" ArtistTo="宮川彬良" />
<!-- OSC (Original Step Contest; http://ddrosc.bemanistyle.com/osc3/): -->
<Translation TitleFrom="Love Hina" SubtitleFrom="- main theme" ArtistFrom="Hayashibra Megumi\(Haruka Urashima\)"
TitleTo="桜咲く" TitleTransTo="Sakura Saku" SubtitleTo="-erase-" SubtitleTransTo="-erase-" ArtistTo="林原めぐみ"
ArtistTransTo="Hayashibara Megumi (Haruka Urashima)" />
<!-- OSC2: -->
<Translation TitleFrom="Dejiko to Gema" SubtitleFrom="no RAP DE DATE" TitleTo="でじことゲマの" SubtitleTo="ラップDEデート"
ArtistFrom="Assami Sanada \+ Yoshiko Kamei" ArtistTo="真田アサミ&亀井芳子" ArtistTransTo="Asami Sanada + Yoshiko Kamei" />
<!-- OSC3: -->
<Translation ArtistFrom="E-Paksa" ArtistTo="이박사" />
<!-- http://www.sonicteam.com/sonicadv/snd/cd_1.html -->
<Translation ArtistFrom="(Naofumi Hataya)|(Hataya Naofumi)" ArtistTo="幡谷尚史" />
<!--
# Note: while this name is Chinese, we're displaying it with a Japanese
# font page. We don't have any way to tag text language. This isn't
# really a problem: I think Japanese and Chinese people prefer seeing
# characters in their own language's font, anyway, so let's just leave
# it up to the theme to pick which font style to use.
-->
<Translation TitleFrom="Red Sun" ArtistFrom="Alan Tam / Hacken Lee" TitleTo="紅日" ArtistTo="譚詠麟/李克勤" />
<Translation TitleFrom="Sabishii Kute Loneliness" ArtistFrom="wandasu" TitleTo="淋しくてLoneliness"
ArtistTo="ワンダース" />
<!-- Foonmix: "Yubikiri" has the artist translit in the subtitle translit; move it. -->
<Translation ArtistFrom="ねこみみ魔法使い feat.都築きせの" SubtitleTransTo="-erase-" ArtistTransTo="NekomimiMahouTsukai feat.KisenoTsuduki" />
<!-- DREAMS COME TRUE: -->
<Translation TitleFrom="Asa ga Mata Kuru" TitleTo="朝がまた来る" />
<Translation TitleFrom="Haretara Line" TitleTo="晴れたらいいね" />
<Translation TitleFrom="Kessenwa Kinyoubi" TitleTo="決戦は金曜日" />
<Translation TitleFrom="Nante Koi Shitandaro" TitleTo="なんて恋したんだろ" />
<Translation TitleFrom="Ureshii! Tanoshii! Daisuki!" TitleTo="うれしい! たのしい! 大好き!" />
<Translation TitleFrom="Mirai Yosouzu II" TitleTo="未来予想図II" />
<!-- OHA: -->
<Translation ArtistFrom="War[ui]jiennu" ArtistTo="わるじぇんぬ" />
<Translation ArtistFrom="Yama-?chan with Jimusasu ?Hikaru" ArtistTo="やまちゃん with ジムナスひかる" />
<Translation TitleFrom="OHA OHA Sutaataa" TitleTo="OHA OHA スターター" />
<Translation ArtistFrom="Yama-?chan (&|with) (Reimondo|Raymond)" ArtistTo="やまちゃん&レイモンド" />
<Translation ArtistFrom="Oha Kids with Imakuni(\??)" ArtistTo="おはおはキッズ with イマクニ?" />
<Translation TitleFrom="Sayonara no Kawari Ni" TitleTo="サヨナラのかわりに" />
<Translation ArtistFrom="(Ohhagumi|Oha Gumi)" ArtistTo="おはぐみ" />
<Translation ArtistFrom="Morikubo Shoutarou" ArtistTo="怪人ゾナー" />
<Translation TitleFrom="Zonapara" TitleTo="ゾナパラ" />
<Translation SubtitleFrom=".*WHY! Parapara Remix.*" SubtitleTo="WHY! パラパラ・リミックス" />
<Translation ArtistFrom="Zobekka" ArtistTo="ゾベッカ" />
<!-- (not oha sta, hurr) -->
<Translation ArtistFrom="Omega Versus KTz" ArtistTo="Ω Versus KTz" />
<Translation ArtistFrom="DJ Demon Versus Omega" ArtistTo="DJ 鬼 Versus 鬼" />
<Translation ArtistFrom="NW 260, ZZ, and 290" ArtistTo="NW 260, &doublezeta;, and 290" />
<!-- Tokimeki Memorial Dancing Summer Vacation -->
<Translation TitleFrom="Anata ni Aete" TitleTo="あなたに会えて" />
<Translation ArtistFrom="Junko Noda" ArtistTo="野田 順子" />
<Translation TitleFrom="Futari no Toki" TitleTo="二人の時" />
<Translation TitleFrom="Haru-iro no Kaze no Naka de" TitleTo="春色の風の中で" />
<Translation ArtistFrom="Mami Kingetsu" ArtistTo="金月 真美" />
<Translation TitleFrom="Motto! Motto! Tokimeki" TitleTo="もっと! モット! TOKIMEKI" />
<Translation TitleFrom="Tokimeki no Organ" TitleTo="ときめきのオルゴール" />
<Translation TitleFrom="Yuuki no Kamisama" TitleTo="勇気の神様" />
<Translation ArtistFrom="Yuuko Asahina" ArtistTo="朝比奈 夕子" />
<!-- Handle some broken data. -->
<Translation TitleFrom="Kamisama" ArtistFrom="Unknown" TitleTo="勇気の神様" ArtistTo="野田 順子" />
<Translation TitleFrom="Haru" ArtistFrom="Unknown" TitleTo="春色の風の中で" ArtistTo="金月 真美" />
<Translation TitleFrom="Hero Club-MIX" ArtistFrom="Unknown" ArtistTo="朝比奈 夕子" />
<Translation TitleFrom="Olgore" ArtistFrom="Unkown" TitleTo="ときめきのオルゴール" ArtistTo="金月 真美" />
<Translation TitleFrom="Anata" ArtistFrom="Unknown" TitleTo="あなたに会えて" ArtistTo="野田 順子" />
<Translation TitleFrom="Futari" ArtistFrom="Unknown" TitleTo="二人の時" ArtistTo="金月 真美" />
<Translation TitleFrom="Mot! Mot! Tokimeki" ArtistFrom="Unknown" TitleTo="もっと! モット! TOKIMEKI"
ArtistTo="金月 真美" />
<!-- Disney Dancing Museum: -->
<Translation TitleFrom="Chip 'N' Dale's Vacation" TitleTo="チップとデールのバケーション" ArtistTo="チップ&デール" />
<Translation TitleFrom="Disco Magic" ArtistFrom="Minnie" TitleTo="ディスコマジック" ArtistTo="ミニー" />
<Translation TitleFrom="Electrical Parade" ArtistFrom="Minnie" TitleTo="エレクトリカル・パレード" ArtistTo="ミニー" />
<Translation TitleFrom="Go Go Go" ArtistFrom="Donald" TitleTo="ゴー・ゴー・ゴー" ArtistTo="ドナルド" />
<Translation TitleFrom="Goofy's Rock 'N' Roll Show" TitleTo="グーフィーのロックンロールショー" ArtistTo="グーフィー" />
<Translation TitleFrom="Irish River" ArtistFrom="Goofy" TitleTo="アイリッシュリバー" ArtistTo="グーフィー" />
<Translation TitleFrom="It's A Small World" ArtistFrom="Huey, Dewey & Louie" TitleTo="イッツ・ア・スモール・ワールド"
ArtistTo="ヒューイ/デューイ/ルーイ" />
<Translation TitleFrom="Mickey Fever" TitleTo="ミッキー・フィーバー" ArtistTo="ミッキー" />
<Translation TitleFrom="Mickey Motion" TitleTo="ミッキー・モーション" ArtistTo="ミニー" />
<Translation TitleFrom="Mickey Mouse March" ArtistFrom="Mickey" TitleTo="ミッキーマウス・マーチ" ArtistTo="ミッキー" />
<Translation TitleFrom="Mickey Mouse Ondo" TitleTo="ミッキーマウス音頭" ArtistTo="ミッキー" />
<Translation TitleFrom="Minnie's Yoo Hoo!" TitleTo="ミニーのユーフー!" ArtistTo="ミニー" />
<Translation TitleFrom="Miwaku no Tango" ArtistFrom="Clarabell" TitleTo="魅惑のタンゴ" ArtistTo="クララベル" />
<Translation TitleFrom="Morty and Ferdy's Carnival" TitleTo="モーティとフェルディのカーニバル" ArtistTo="モーティ&フェルディ" />
<Translation TitleFrom="Para-Para Venus" ArtistFrom="Daisy" TitleTo="パラパラヴィーナス" ArtistTo="デイジー" />
<Translation TitleFrom="Russian Dance" ArtistFrom="Scrooge" TitleTo="ロシアの踊り" ArtistTo="スクルーヅ" />
<Translation TitleFrom="Savanna No Mukou" ArtistFrom="Donald" TitleTo="サバンナのむこう" ArtistTo="ドナルド" />
<Translation TitleFrom="Taiyo No Rakuen" ArtistFrom="Horace" TitleTo="太陽の楽園" ArtistTo="ホーレス" />
<Translation TitleFrom="Tap! Tap! Tap!" ArtistFrom="Grandma Duck" TitleTo="タップ!タップ!タップ!" ArtistTo="グランアダックタ" />
<Translation TitleFrom="The Tiki Tiki Tiki Room" ArtistFrom="Goofy" TitleTo="魅惑のチキルーム" ArtistTo="グーフィー" />
<Translation TitleFrom="Turkey In The Straw" ArtistFrom="Pluto" TitleTo="藁の中の七面鳥" ArtistTo="プルート" />
<Translation TitleFrom="Waltz of the Flowers" ArtistFrom="Daisy" TitleTo="花のワルツ" ArtistTo="デイジー" />
<Translation TitleFrom="Pokemon" TitleTo="Pokémon" />
<!-- Korean: -->
<Translation TitleFrom="Ba Kkwo" TitleTo="바꿔" />
<Translation TitleFrom="Wa" TitleTo="와" />
<Translation TitleFrom="Bu Dam" TitleTo="부담" />
<Translation TitleFrom="Byul" TitleTo="별" />
<Translation ArtistFrom="(Gunchuri Kko Kko)|(Country Kko Kko)" ArtistTo="컨츄리꼬꼬" />
<Translation ArtistFrom="Back Ji Young" ArtistTo="백지영" />
<Translation ArtistFrom="Lee Jung Hyun" ArtistTo="이정현" />
<Translation TitleFrom="Hogisim" TitleTo="호기심" />
<Translation TitleFrom="Aromdaon 21C" TitleTo="아름다운21C" ArtistTo="2000 대한민국" />
<Translation TitleFrom="Gyoung Go" TitleTo="경고" />
<Translation TitleFrom="Sung Suk" TitleTo="성숙" />
<Translation TitleFrom="Gamyunwi Shigan" TitleTo="가면의 시간" />
<Translation TitleFrom="(Gaggai)|(Gagaai)" TitleTo="가까이" />
<Translation ArtistFrom="Tashannie" ArtistTo=" 타샤니" />
<Translation ArtistFrom="Hans Band" ArtistTo="한스밴드" />
<!-- In the Groove: -->
<Translation ArtistFrom="Smiley" ArtistTo="☺" />
<Translation ArtistFrom="KaW feat. Smiley" ArtistTo="KaW feat. ☺" />
<!-- Mungyodance -->
<Translation TitleFrom="Hardcore Disco (Kitsune\? Remix)" TitleTo="Hardcore Disco (Kitsune² Remix)" />
<Translation TitleFrom="Micro N\?" TitleTo="Micro N²" />
<Translation TitleFrom="Caramelldansen (Ryu\* Remix)" TitleTo="Caramelldansen (Ryu☆ Remix)" />
<Translation ArtistFrom="Kitsune\?" ArtistTo="Kitsune²" />
<Translation ArtistFrom="Bl\?mchen" ArtistTo="Blümchen" />
<Translation ArtistFrom="Kitsune\? and Emoticon" ArtistTo="Kitsune² and Emoticon" />
<Translation ArtistFrom="Emoticon & Kitsune\?" ArtistTo="Emoticon & Kitsune²" />
<Translation ArtistFrom="D-Mode-D feat. Kitsune\?" ArtistTo="D-Mode-D feat. Kitsune²" />
<Translation ArtistFrom="Kitsune\? and D-Mode-D" ArtistTo="Kitsune² and D-Mode-D" />
<Translation ArtistFrom="Hecate and Kitsune\?" ArtistTo="Hecate and Kitsune²" />
<Translation ArtistFrom="Renard vs Kitsune\?" ArtistTo="Renard vs Kitsune²" />
<Translation ArtistFrom="MGD-Crew feat. Kitsune\?" ArtistTo="MGD-Crew feat. Kitsune²" />
<Translation ArtistFrom="Sonitus Vir x Kitsune\?" ArtistTo="Sonitus Vir x Kitsune²" />
<!-- Misc: -->
<Translation TitleFrom="Pokemon" TitleTo="Pokémon" DontTransliterate />
<Translation ArtistFrom="Omega Versus KTz" ArtistTo="Ω Versus KTz" />
<Translation ArtistFrom="DJ Demon Versus Omega" ArtistTo="DJ 鬼 Versus Ω" />
<Translation ArtistFrom="NW 260, ZZ, and 290" ArtistTo="NW 260, &doublezeta;, and 290" />
<!-- http://bemanistyle.com/sims/viewsim.php?id=1161 -->
<Translation TitleFrom="Renai Revolution 21" TitleTo="恋愛レボリューション21" />
<!-- http://bemanistyle.com/sims/viewsim.php?id=1160 -->
<Translation SubtitleFrom="~Ai no Big Band~" SubtitleTo="~愛のビッグバンドー~" />
<!-- CHOP CHOP, MASTER ONION'S RAP (PaRappa the Rapper) -->
<Translation ArtistFrom="(Masaya Matsuura)|(Matsuura Masaya)" ArtistTo="松浦雅也" />
<!-- Fanboy bonus: -->
<Translation ArtistFrom="(Megumi Hayashibara)|(Hayashibara Megumi)" ArtistTo="林原めぐみ" />
<Translation ArtistFrom="(Ayumi Hamasaki)|(Hamasaki Ayumi)" ArtistTo="浜崎あゆみ" />
<Translation ArtistFrom="(Hiroko Kasahara)|(Kasahara Hiroko)" ArtistTo="笠原弘子" />
<Translation ArtistFrom="(Mai Kuraki)|(Kuraki Mai)" ArtistTo="倉木麻衣" />
<Translation ArtistFrom="Miryokuteki" ArtistTo="魅力的" />
<Translation ArtistFrom="(Yuki Kimura)|(Kimura Yuki)" ArtistTo="木村由姫" />
<Translation ArtistFrom="(Takako Matsu)|(Matsu Takako)" ArtistTo="松たか子" />
<Translation ArtistFrom="(Suzuki Ami)|(Ami Suzuki)" ArtistTo="鈴木あみ" />
<Translation ArtistFrom="(Sakura Tange)|(Tange Sakura)" ArtistTo="丹下桜" />
<Translation ArtistFrom="(Hikaru Utada)|(Utada Hikaru)" ArtistTo="宇多田ひかる" />
<Translation ArtistFrom="(Masami Okui)|(Okui Masami)" ArtistTo="奥井雅美" />
<Translation ArtistFrom="Morning Musume" ArtistTo="Morning娘" />
<Translation ArtistFrom="(You?ko Ishida)|(Ishida You?ko)" ArtistTo="石田燿子" />
<Translation ArtistFrom="(You?ko Kanno)|(Kanno You?ko)" ArtistTo="菅野よう子" />
<Translation ArtistFrom="You?ko Kanno (and|&) the Seatbelts" ArtistTo="菅野よう子 and the Seatbelts" />
<Translation ArtistFrom="(Megumi Ogata)|(Ogata Megumi)" ArtistTo="緒方恵美" />
<Translation ArtistFrom="(You?ko Takahashi)|(Takahashi You?ko)" ArtistTo="高橋洋子" />
<Translation ArtistFrom="(Daichi Akitaroh)|(Akitaroh Daichi)" ArtistTo="大地丙太郎" />
<Translation ArtistFrom="(Yui Horie)|(Horie Yui)" ArtistTo="堀江由衣" />
<Translation ArtistFrom="(Nobuo Uematsu)|(Uematsu Nobuo)" ArtistTo="植松伸夫" />
<Translation ArtistFrom="Mitsuishi Kotono" ArtistTo="三石琴乃" />
<Translation ArtistFrom="(Kou?ji Kondou?|Kondou? Kou?ji)" ArtistTo="近藤浩治" />
<Translation ArtistFrom="(Yuki Matsuoka)|(Matsuoka Yuki)" ArtistTo="松岡由貴" />
<Translation ArtistFrom="Blue?mchen" ArtistTo="Blümchen" DontTransliterate />
</Songs>
<Courses>
<Translation TitleFrom="(Kidou)|(Demon Road)|(Road of Oni)|(Oni Michi)|(Kidou/Onimichi \(Demon Road\))"
TitleTo="鬼道" />
<Translation TitleFrom="(Kidou 2)|(Demon Road 2)|(Road of Oni 2)|(Oni Michi 2)|(Kidou 2/Onimichi 2 \(Demon Road 2\))"
TitleTo="鬼道 弐" />
<Translation TitleFrom="Love" TitleTo="Love ♡" />
<Translation TitleFrom="Love Love" TitleTo="Love ♡" />
<Translation TitleFrom="(2 ?MB)|(Road of 2 ?MB)" TitleTo="2MB道" />
<Translation TitleFrom="Dancemania( Oni)?" TitleTo="Dancemania 鬼" />
<Translation TitleFrom="(TaQ( Oni)?)|(Road of TaQ)" TitleTo="TaQ道" />
<Translation TitleFrom="(Legend(ary)? Road)|(Road of Legend)" TitleTo="伝説道" />
<Translation TitleFrom="(Slow Demon Road)|(Road of Slow)|(Demon's Slow Road)" TitleTo="鬼の遅道" />
<!-- "Road of True"? Maybe "Truth"? -->
<Translation TitleFrom="(True Demon Road)|(Road of Tru.*)" TitleTo="真鬼道" />
<Translation TitleFrom="(DDR HOME VERSION)" TitleTo="家庭用DDRコース" />
<Translation TitleFrom="Four Seasons" TitleTo="春夏秋冬" />
<Translation TitleFrom="DanceMania Nonstop" TitleTo="DanceMania 連" />
<Translation TitleFrom="(Otome no Michi|Maiden Star Road)" TitleTo="乙女☆道" />
<Translation TitleFrom="(Oni no Ran)|(Rebellion of Demons)" TitleTo="鬼の乱" />
</Courses>
<Groups>
<Translation TitleFrom="((Dance Dance Revolution)|(dance dance revolution)|(DANCE DANCE REVOLUTION))(.*)"
TitleTo="DDR\${5}" />
<Translation TitleFrom="((Pump It Up)|(pump it up)|(PUMP IT UP))(.*)" TitleTo="PIU\${5}" />
<Translation TitleFrom="((ParaParaParadise)|(paraparaparadise)|(PARAPARAPARADISE)|(Para Para Paradise)|(para para paradise)|(PARA PARA PARADISE))(.*)"
TitleTo="PPP\${8}" />
<Translation TitleFrom="((Dancing Stage)|(dancing stage)|(DANCING STAGE))(.*)" TitleTo="DS\${5}" />
<Translation TitleFrom="((Ez2dancer)|(Ez 2 Dancer))(.*)" TitleTo="EZ2\${4}" />
<Translation TitleFrom="((Technomotion)|(Techno Motion))(.*)" TitleTo="TM\${4}" />
<Translation TitleFrom="((Dance Station 3DDX)|(DS3DDX))(.*)" TitleTo="3DDX\${4}" />
<Translation TitleFrom="((BeatMania)|(Beatmania)|(BEATMANIA)|(beatmania))(.*)" TitleTo="BM\${6}" />
<Translation TitleFrom="((In The Groove)|(In the Groove))(.*)" TitleTo="ITG\${4}" />
<!-- <Translation TitleFrom="((Mungyodance)|(Mungyodance))(.*)" TitleTo="MGD\${4}" /> -->
<!-- <Translation TitleFrom="((Flightmix)|(Flightmix))(.*)" TitleTo="FMX\${4}" /> -->
<!-- <Translation TitleFrom="((Kurimix)|(Kurimix))(.*)" TitleTo="KMX\${4}" /> -->
</Groups>
</Translations>
+30 -30
View File
@@ -1,30 +1,30 @@
.ssc Format Changelog
________________________________________________________________________________
In case anyone else wishes to implement the .ssc format in their own simulator,
a changelog is provided here between each version.
Notice: .ssc is not a finalized format at the moment. There are plans for a
change to JSON, but it is unsure if this will be done.
Implement .ssc at your own risk.
________________________________________________________________________________
[v0.55] - Wolfman2000
* Add #COMBOS tag to the Song and Steps (does nothing here).
[v0.54] - Wolfman2000
* Add #ATTACKS tag to the Notedata sections. Right now it does nothing.
[v0.53] - Wolfman2000
* Added Fakes to the RadarCategories. Start parsing between versions.
* Always write out the latest version to cache and hard drive.
[v0.52] - AJ
* Add CHARTSTYLE tag to NoteData section.
[v0.51] - AJ
* Move VERSION tag to the first line.
* Limit VERSION tag to two decimal places.
[v0.5] - Wolfman2000
* Initial MSD-based version.
.ssc Format Changelog
________________________________________________________________________________
In case anyone else wishes to implement the .ssc format in their own simulator,
a changelog is provided here between each version.
Notice: .ssc is not a finalized format at the moment. There are plans for a
change to JSON, but it is unsure if this will be done.
Implement .ssc at your own risk.
________________________________________________________________________________
[v0.55] - Wolfman2000
* Add #COMBOS tag to the Song and Steps (does nothing here).
[v0.54] - Wolfman2000
* Add #ATTACKS tag to the Notedata sections. Right now it does nothing.
[v0.53] - Wolfman2000
* Added Fakes to the RadarCategories. Start parsing between versions.
* Always write out the latest version to cache and hard drive.
[v0.52] - AJ
* Add CHARTSTYLE tag to NoteData section.
[v0.51] - AJ
* Move VERSION tag to the first line.
* Limit VERSION tag to two decimal places.
[v0.5] - Wolfman2000
* Initial MSD-based version.
+2108 -2108
View File
File diff suppressed because it is too large Load Diff
+54 -54
View File
@@ -1,55 +1,55 @@
sm-ssc Command Line Arguments
================================================================================
Pass all arguments with --. For example, version would be entered as --version.
stepmania --version
Passing package files to StepMania on the command line will install them:
stepmania moonlight.smzip
================================================================================
[GameState]
* player
usage: --player=1
Joins in the specified player. Can also pass --player=2 at the same time,
if desired. However, sm-ssc does not support more than two players, so don't
go past 2.
* mode
usage: --mode=
Applys a GameCommand to all players if valid.
--------------------------------------------------------------------------------
[NetworkSyncManager]
* netip
usage: --netip=localhost
Connects to a server for online play.
--------------------------------------------------------------------------------
[PrefsManager]
* Type
usage: --Type=arcade
Reads preferences from [Preferences-{Type}], usually from the metrics.
--------------------------------------------------------------------------------
[StepMania]
* ExportNsisStrings
usage: --ExportNsisStrings
Exports strings for the installer.
* ExportLuaInformation
usage: --ExportLuaInformation
Exports Lua.xml using the default theme (and anything it falls back on)
for reference.
* theme
usage: --theme=default | --theme="theme with spaces"
Sets the current theme.
* language
usage: --language=en
Sets the current language.
* version
usage: --version
Displays version information.
--------------------------------------------------------------------------------
[ThemeManager]
* metric
usage: --metric=(element)::(metric)=(value)
sm-ssc Command Line Arguments
================================================================================
Pass all arguments with --. For example, version would be entered as --version.
stepmania --version
Passing package files to StepMania on the command line will install them:
stepmania moonlight.smzip
================================================================================
[GameState]
* player
usage: --player=1
Joins in the specified player. Can also pass --player=2 at the same time,
if desired. However, sm-ssc does not support more than two players, so don't
go past 2.
* mode
usage: --mode=
Applys a GameCommand to all players if valid.
--------------------------------------------------------------------------------
[NetworkSyncManager]
* netip
usage: --netip=localhost
Connects to a server for online play.
--------------------------------------------------------------------------------
[PrefsManager]
* Type
usage: --Type=arcade
Reads preferences from [Preferences-{Type}], usually from the metrics.
--------------------------------------------------------------------------------
[StepMania]
* ExportNsisStrings
usage: --ExportNsisStrings
Exports strings for the installer.
* ExportLuaInformation
usage: --ExportLuaInformation
Exports Lua.xml using the default theme (and anything it falls back on)
for reference.
* theme
usage: --theme=default | --theme="theme with spaces"
Sets the current theme.
* language
usage: --language=en
Sets the current language.
* version
usage: --version
Displays version information.
--------------------------------------------------------------------------------
[ThemeManager]
* metric
usage: --metric=(element)::(metric)=(value)
Sets [Element] Metric=Value in the metrics. Can be used multiple times.
+36 -36
View File
@@ -1,36 +1,36 @@
Mission Mode Specifications/Draft
-- #TITLE:; self explanitory
#TITLE:;
-- #METER:; defines the meter that shows up in StepsDisplay's.
#METER:;
-- #BANNER:; is a great thing to add because it makes sense in the long run.
#BANNER:;
-- #STYLE:; restricts playmodes ala Pump Pro.
#STYLE:;
-- #MISSIONREF:; is a complete LuaReference that has a params table passed
-- into the function, and is required to pass either:
-- A: A true / false parameter for MISSION CLEARED / FAILED
-- B: A seperate grade tier for missions, complimenting the default grade
score.
-- C: A replacement grade tier for missions, requesting an enum for
the grade to be set.
#MISSIONREF:;
#SONG:;
--[[ Example ]]
#TITLE:Test Mission;
#METER:9;
#BANNER:TestMission.png;
#STYLE:Single,Versus;
#MISSIONREF:function(self,params)
local tPlayerStats = params.PlayerStageStats;
if tPlayerStats.GetTapNoteScores('TapNoteScore_W2') > 0 then
return 'Grade_Failed'
else
return 'Grade_Tier01'
end
end;
#SONG:In The Groove 2/Determinator:Medium:2x,Hidden;
Mission Mode Specifications/Draft
-- #TITLE:; self explanitory
#TITLE:;
-- #METER:; defines the meter that shows up in StepsDisplay's.
#METER:;
-- #BANNER:; is a great thing to add because it makes sense in the long run.
#BANNER:;
-- #STYLE:; restricts playmodes ala Pump Pro.
#STYLE:;
-- #MISSIONREF:; is a complete LuaReference that has a params table passed
-- into the function, and is required to pass either:
-- A: A true / false parameter for MISSION CLEARED / FAILED
-- B: A seperate grade tier for missions, complimenting the default grade
score.
-- C: A replacement grade tier for missions, requesting an enum for
the grade to be set.
#MISSIONREF:;
#SONG:;
--[[ Example ]]
#TITLE:Test Mission;
#METER:9;
#BANNER:TestMission.png;
#STYLE:Single,Versus;
#MISSIONREF:function(self,params)
local tPlayerStats = params.PlayerStageStats;
if tPlayerStats.GetTapNoteScores('TapNoteScore_W2') > 0 then
return 'Grade_Failed'
else
return 'Grade_Tier01'
end
end;
#SONG:In The Groove 2/Determinator:Medium:2x,Hidden;
+83 -83
View File
@@ -1,84 +1,84 @@
sm-ssc Code Style Guidelines
--------------------------------------------------------------------------------
AJ is biased, but prefers to edit text in SciTE and just uses Visual Studio when
necessary. "It's really slow!"
That being said, the sm-ssc code style guidelines are as follows:
1) Follow the current coding conventions set forth in the source code.
This means use tabs. AJ prefers tabs have a width of 4. Visual Studio and web
browsers assume tabs to be 8 by default. :/
Use of the tab character means you can define however wide you want it to be.
Use of the space character is allowed for complex alignment. There are many
examples of this in the code.
If it can be done in one line, do so:
int xTwenty(int factor){ return factor*20; }
Otherwise, follow what's in the code, namely...
for single line ifs :
if( somecrap )
dosomethingelse();
for multi-lines:
if( anothercrap )
{
omg();
lotsofstuff();
}
Naming conventions seem to be Hungarian (of Apps or System, I do not know).
2) Remove any unnecessary whitespace. "Unnecessary" whitespace includes tabs
at the end of } characters, tabs that lead nowhere, like this one:
and keep in mind that this can be done with spaces too:
so watch yourself. Remove 'em all.
3) When making LOG->Trace()s in code, it's best to include the name of the Class
and Function in [], like so:
LOG->Info( "[NetworkSyncManager::Listen] Initializing socket..." );
You may not always need to do this, but it helps for clarity and sanity.
4) Comment style. (This is a preferred suggestion. You may choose to do whatever
you like, but it is recommended to follow this style when submitting code for
inclusion.)
// is preferred for one-liners
// and also blocks of text where the comment isn't too long.
// sometimes you'll find // comments longer than this thrown in there by AJ
/* instead of doing this.
* when making a new line in a long form comment, start like this line.
* and put the end where it fits. */
/*
* doing this (first line blank) is discouraged, but is allowed in certain places.
* Copyright notices use this style and should remain doing so; don't clean it up
* in that instance. All new copyright notices should follow this style as well,
* for consistency's sake.
*/
/* use of long comments for one line is VERY discouraged */
// usually, it will will get cleaned up into this style, but there are exceptions:
// exception #1: function arguments
void SomeFunction(size_t /*ACTUAL DATA TYPE*/)
// where you need to have it be /* */ or else it'll mess up.
// exception #2: #defines
#define /* you must use long form in defines, */ \
// otherwise it won't parse the newline correctly (this will cause an error) \
// exception #3: .h files
/* ScreenTypicalExample - this always shows up like this. It usually is always one line, even when it extends past column 80. This is acceptible; Most people don't write novels here like I just did. */
// on comment length:
/* typically total 80 characters is the preferred width per line, like this one.
* Sometimes, you can get away with sentences where a word or phrase hangs over the edge,
* especially if you can guess the context without needing to scroll.
* Pre-existing comments are usually trimmed to meet the 80-column width if they
* go way overboard. */
sm-ssc Code Style Guidelines
--------------------------------------------------------------------------------
AJ is biased, but prefers to edit text in SciTE and just uses Visual Studio when
necessary. "It's really slow!"
That being said, the sm-ssc code style guidelines are as follows:
1) Follow the current coding conventions set forth in the source code.
This means use tabs. AJ prefers tabs have a width of 4. Visual Studio and web
browsers assume tabs to be 8 by default. :/
Use of the tab character means you can define however wide you want it to be.
Use of the space character is allowed for complex alignment. There are many
examples of this in the code.
If it can be done in one line, do so:
int xTwenty(int factor){ return factor*20; }
Otherwise, follow what's in the code, namely...
for single line ifs :
if( somecrap )
dosomethingelse();
for multi-lines:
if( anothercrap )
{
omg();
lotsofstuff();
}
Naming conventions seem to be Hungarian (of Apps or System, I do not know).
2) Remove any unnecessary whitespace. "Unnecessary" whitespace includes tabs
at the end of } characters, tabs that lead nowhere, like this one:
and keep in mind that this can be done with spaces too:
so watch yourself. Remove 'em all.
3) When making LOG->Trace()s in code, it's best to include the name of the Class
and Function in [], like so:
LOG->Info( "[NetworkSyncManager::Listen] Initializing socket..." );
You may not always need to do this, but it helps for clarity and sanity.
4) Comment style. (This is a preferred suggestion. You may choose to do whatever
you like, but it is recommended to follow this style when submitting code for
inclusion.)
// is preferred for one-liners
// and also blocks of text where the comment isn't too long.
// sometimes you'll find // comments longer than this thrown in there by AJ
/* instead of doing this.
* when making a new line in a long form comment, start like this line.
* and put the end where it fits. */
/*
* doing this (first line blank) is discouraged, but is allowed in certain places.
* Copyright notices use this style and should remain doing so; don't clean it up
* in that instance. All new copyright notices should follow this style as well,
* for consistency's sake.
*/
/* use of long comments for one line is VERY discouraged */
// usually, it will will get cleaned up into this style, but there are exceptions:
// exception #1: function arguments
void SomeFunction(size_t /*ACTUAL DATA TYPE*/)
// where you need to have it be /* */ or else it'll mess up.
// exception #2: #defines
#define /* you must use long form in defines, */ \
// otherwise it won't parse the newline correctly (this will cause an error) \
// exception #3: .h files
/* ScreenTypicalExample - this always shows up like this. It usually is always one line, even when it extends past column 80. This is acceptible; Most people don't write novels here like I just did. */
// on comment length:
/* typically total 80 characters is the preferred width per line, like this one.
* Sometimes, you can get away with sentences where a word or phrase hangs over the edge,
* especially if you can guess the context without needing to scroll.
* Pre-existing comments are usually trimmed to meet the 80-column width if they
* go way overboard. */
5) There are no other rules (yet).
+16 -16
View File
@@ -1,17 +1,17 @@
sm-ssc has a few compile flags that are helpful to know, as well as ones
inherited from StepMania.
================================================================================
stepmania:
================================================================================
WITHOUT_NETWORKING
Disables all networking stuff (SMO).
================================================================================
sm-ssc:
================================================================================
SSC_FUTURES
{todo}
--------------------------------------------------------------------------------
HAVE_VERSION_INFO
If this isn't defined, passing in --version will only show the name of the
current sm-ssc version, no build number or date.
sm-ssc has a few compile flags that are helpful to know, as well as ones
inherited from StepMania.
================================================================================
stepmania:
================================================================================
WITHOUT_NETWORKING
Disables all networking stuff (SMO).
================================================================================
sm-ssc:
================================================================================
SSC_FUTURES
{todo}
--------------------------------------------------------------------------------
HAVE_VERSION_INFO
If this isn't defined, passing in --version will only show the name of the
current sm-ssc version, no build number or date.
Please define HAVE_VERSION_INFO if you can when building sm-ssc.
+22 -22
View File
@@ -1,23 +1,23 @@
The Golden Rules of sm-ssc Development
--------------------------------------------------------------------------------
In addition to CodingStyle.txt, this is the doctrine for operation of sm-ssc.
1) Always remember that the original branch of StepMania exists, and that we need
to give back to it in order for sm-ssc to survive.
(Literal: Be sure to commit useful changes/fixes to the mainline StepMania branch
every so often.)
2) If you want something done, you should probably work on it yourself. However,
SSC members should be willing to help if their area of expertise and the problem
domain overlap (life permitting).
3) Always know your priorities. sm-ssc is important, but it's not life itself.
Take breaks every once in a while. Work on other things. Don't get burned out
from nonstop sm-ssc development.
4) Patches should be checked for compatibility/compilability before being
accepted and integrated. Common sense, but a golden rule nevertheless.
5) Anyone who decides to theme for sm-ssc during development is willing to
accept that occasionally, changes to the default and/or fallback theme will
The Golden Rules of sm-ssc Development
--------------------------------------------------------------------------------
In addition to CodingStyle.txt, this is the doctrine for operation of sm-ssc.
1) Always remember that the original branch of StepMania exists, and that we need
to give back to it in order for sm-ssc to survive.
(Literal: Be sure to commit useful changes/fixes to the mainline StepMania branch
every so often.)
2) If you want something done, you should probably work on it yourself. However,
SSC members should be willing to help if their area of expertise and the problem
domain overlap (life permitting).
3) Always know your priorities. sm-ssc is important, but it's not life itself.
Take breaks every once in a while. Work on other things. Don't get burned out
from nonstop sm-ssc development.
4) Patches should be checked for compatibility/compilability before being
accepted and integrated. Common sense, but a golden rule nevertheless.
5) Anyone who decides to theme for sm-ssc during development is willing to
accept that occasionally, changes to the default and/or fallback theme will
break things.
+466 -466
View File
@@ -1,466 +1,466 @@
PRELIMINARY - - - - - - - - 05/03/2004
Protocol version 4
But 0x04 will be its version for inter-protocol purposes.
This protocol is only intended to replace current protocol. Because current protocol
not expanable
SMLAN PROTCOL TCP/8765
Protcol is entirelly packaged in EzSockets Data Packets (use send and receive packet)
This will prevent any out-of-sync errors with future or past versions.
The protocol is impervious to fragmented, or bonded TCP packets.
Basic Representation:
Octet 0123 4 5
+----+-+---//--+
|ssss|C|Payload|
+----+-+---//--+
ssss - size of packet, handled by ezsockets (if you're using C++)
C - Command.
Payload - variable size based on command
The payload may contain more data than expected, i.e. new protocol version.
In the following protocol, the term size means the size of the chunk of data.
If the "size" is "NT" then that means it's a null-terminating string.
"MSN" most significant 4 bits (byte/16)
"LSN" least significant 4 bits (byte%16)
Note: Primary player is 0x0, secondary player is 0x1
CLIENT to SERVER protocol:
000: No Operation
Desc: This command will cause server to respond with a no op response.
Payload: None
Response: Server 001
001: No Operation Response
Desc: This command is used to respond to a no operation.
Payload: None
Response: None
002: Hello
Desc: This is the first packet from a client to server, stating below
information (NOTE: Names are no longer sent in this packet)
Payload:
Size Description:
1 Client protocol version
NT Name of build of StepMania
Response: Server 002
003: Game Start Request
Desc: This command is called once after most loading is done, and
again immediately before the sound starts.
Payload:
Size Description
MSN Primary player difficulty (feet) (0 for no player)
LSN Secondary player difficulty (feet) (0 for no player)
MSN Primary player difficulty (0=Beginner, 1=easy, etc.)
LSN Second player difficulty (0=Beginner, 1=easy, etc.)
MSN Start Position (0 is pre-sync, 1 is for sync)
LSN Reserved
NT Song Title
NT Song Subtitle
NT Song Artist
NT Course Title (If none exists; make it just a null)
NT Song Options (in string-format)
NT Primary Player's options (Null if non-existant)
NT Secondary Player's Options (Null if non-existant)
Response: Server 003
004: Game Over Notice
Desc: This command is sent when end of game is encounterd
Payload: None.
Response: None.
005: Game Status update
Desc: Updates game info for each step
Payload:
Size Description
MSN Player #
Protocol <= 2
LSN StepID
1: Miss
2: W5
3: W4
4: W3
5: W2
6: W1
7: LetGo
8: Held
Protocol >= 3
LSN StepID
1: HitMine
2: AvoidMine
3: Miss
4: W5
5: W4
6: W3
7: W2
8: W1
9: LetGo
10: Held
MSN Projected Grade (StepMania enum int)
LSN Reserved
4 Net-order long containing score.
2 Net-order int containing combo.
2 Net-order int containing health.
2 Net-order # containing offset
32767 would be DEAD on the note
If the user is hitting late, the # will be higher
It if the user is exactly 0.25 seconds off, the
number will be different by 500, if 0.5, it will be
different by 1000.
Response: None.
006: Style Update (PLEASE NOTE THIS HAS NOTHING TO DO WITH SERVER COMMAND 6)
Desc: This is sent when a style is chosen.
Size:
1 # of enabled players (1 means 1, 2 means 2)
1 Player # (0 means 1st, 1 means 2nd)
NT Player Name for #
(Additional player's and #'s) (enabled players ONLY)
Response: None
007: Chat message
Desc: The user typed a message for general chat.
Size:
NT Message
008: Request Start Game and Tell server existance/non existance of song.
Desc: The user selected a song on a Net-enabled selection
Size:
1 Usage of message
0: (in response to server 8) User has specified song
1: (in response to server 8) User does NOT have specified song
2: User requested a start game on given song
NT Song Title (As gotten by GetTranslitMainTitle)
NT Song Artist (As Gotten by GetTranslitArtist)
NT Song Subtitle (As gotten by GetTranslitSubTitle)
009: //Reserved
010: User entered/exited Network Music Selection Screen
Size:
1
0: exited ScreenNetSelectMusic
1: entered ScreenNetSelectMusic
2: **Not Sent**
3: entered options screen
4: exited the evaluation screen
5: entered evaluation screen
6: exited ScreenNetRoom
7: entered ScreenNetRoom
011: User has changed player options
Size:
NT Player 0's options
NT Player 1's options
012: SMOnline Packet. //SPECIAL CASE!!!
NOTE: The smonline packet is not defined here.
The SMLan packet 12 is a wrapper for the SMOnline packet.
This is so that we can have "protection" of sorts when
it comes to the coding of SMOnline, so we don't have to
use the lower level commands when dealing with SMOnline.
Size:
1 SMOnline command //This used to say 2, but it looks like 1 in all cases
<VARIABLE> SMOnline data
013: Reserved
014: Reserved
015: XML Packet. This packet contains data in XML format.
Size:
NT XML
SERVER to CLIENT protocol: (begins at 128)
NOTE: Server responses always add 128, thus a server response for no operation
is 128, not 000
000(128):No Operation
Desc: This command will cause server to respond with a no op response.
Payload: None
Response: Server 001
001(129):No Operation Response
Desc: This command is used to respond to a no operation.
Payload: None
Response: None
002(130):Server Hello Response
Desc: This introduces the server.
Payload:
Size Description
1 Server protocol version //NOTE: if protocol version is 128+, then this
server is an SMOnline server
NT Server Name
4 Random key ( at the moment only used for an alternate login method )
003(131):Allow Start
Desc: This will cause the client to start the game.
Payload: None
Response: None
004(132):Game over stats
Desc: this packet is send in response to the game over packet
it contains information regarding how well each player did.
Payload:
1 # of players sent in this packet (active players)
The way this works is to send every player's info for a given
field. Like every player's score will be sent first, then every
player's grade.
1 First player's player ID
<Other player's IDs>
4 Score
<Other player's scores>
1 Grade
<Other player's Grades>
1 Difficulty (0=beginner, 1=light, etc.)
<Other player's difficulties>
#this next chunk of step types is actually reversed
2 miss
<Other player's misses>
2 boo
<Other player's boos>
2 good (All players)
2 great (All players)
2 perfect (All players)
2 marvelous (All players)
2 ok (All players)
2 max_combo (All players)
NT Player's options
<Other player's options>
005:(133)Scoreboard update
Desc: This will update the client's scoreboard.
Payload:
Size
1 Which section
0: Names
1: Combos
2: Projected Grades
1 # of players to display
If Names, then:
1 Player in first place's index
1 Player in second place's index
...
1 Last player's index
If Combos, then:
2 First player's combo
2 Second Player's combo
...
2 Last player's combo
If Project grades
1 Player 1's grade (in the same format used when reporting projected grades)
1 Player 2's grade
...
1 Last player's projected grade
006:(134)System Message (PLEASE NOTE THIS HAS NOTHING TO DO WITH CLIENT COMMAND 6)
Desc: Send system message to user
Payload:
Size Description
NT Message
007:(135)Chat Message
Desc: Add a chat message to the chat window on some StepMania screens.
Payload:
Size Description
NT Message
008:(136)Tell client to start song/ask if client has song
Desc: The user selected a song on a Net-enabled selection
Size:
1 Usage of message
0: See if client has song
1: See if client has song, if so, scroll to song
2: See if client has song, if so, scroll to song, and play that song
3: Blindly start song
NT Song Title (As gotten by GetTranslitMainTitle)
NT Song Artist (As Gotten by GetTranslitArtist)
NT Song Subtitle (As gotten by GetTranslitSubTitle)
009:(137)Update user list
Desc: This sends all the users currently connected
Size:
1 Max # of players
1 # of players in this packet
1 Player 0's status
NT Player 0's name (if there is no player here... make it a null (""))
1 Player 1's status
NT Player 1's name
...
1 Last player's status
NT Last player's name
Status:
0 Inative (no info on this user yet)
1 Active (you know who it is)
2 In Selection Screen
3 In Options
4 In Evaluation
010:(138)Force change to Networking select music screen.
Size:
NT Set Specified gametype
NT Set Specified style
011:(139)Reserved
012:(140)SMOnline Packet. //SPECIAL CASE!!!
NOTE: The smonline packet is not defined here.
The SMLan packet 12 is a wrapper for the SMOnline packet.
This is so that we can have "protection" of sorts when
it comes to the coding of SMOnline, so we don't have to
use the lower level commands when dealing with SMOnline.
Size:
1 SMOnline command
<VARIABLE> SMOnline data
013:(141)Formatted information packet
Desc: Send formatted information regarding the server back to the player.
NOTE: The purpose of this function is alternatively to be a broadcast
packet. (You can expect it via UDP broadcast)
Size:
NT Server Name
2 Port the server is listening on
2 Number of players connected
014:(142)Attack Client
Size:
1 Player Number
4 Time to Last (in MS)
NT Text describing modifiers.
015:(143) XML reply. Contains XML
Size:
NT XML
----------------------------------------------------------------
Client SMOnline packets:
000: Send Login Information
Size:
1 Player Number
1 Encryption text
0: MD5 hash
1: MD5 ( MD5 hash + salt ) (salt is plain text, base 10 string )
NT Username
NT Password
Note: The client is not permitted to use method (1) for authentication
if the salt it received from the server is 0
001: User asks to enter room
Size:
1 Enter/Exit?
0: User wishes to exit room
1: User wishes to enter room
NT Room Name (Used when entering rooms)
NT Password (Empty if password not used)
002: Create a new Room
Size:
1 Room Type
0: Normal room (has sub rooms)
1: Game room (no sub rooms)
NT Room Title
NT Room Description
NT Room Password (blank if no password)
003: Requests Room Info
Size:
NT Room Name
Server SMOnline packets:
000: Login Response
1 Approval Status
0: Approved
1: Approval Failed
NT Login response (plain text)
001: Room Update (Changing rooms)
Size:
1 Type of update
0: Change Room Title
1: Update List of other rooms (or games)
If Room Title Update:
NT Room Title
NT Room Description
1 Type of room:
0: Chat room
1: Game room
1 Allows creation of sub room.
0: Does not allow creation of subrooms
1: Allows creation of subrooms
If Room List Update:
1 Number of rooms
NT Room1 Title
NT Room1 Description
NT Room2 Title
NT Room2 Description
...
NT RoomN Title
NT RoomN Description
Room Status appended for reverse compatibility
1 Room1 Status
0: Normal Room
1: Unused
2: Room in game
3: First stage of song selection has been done
4: Second stage of song selection has been done
1 Room2 Status
...
1 RoomN Status
Room Flags appended for reverse compatibility
1 Room1 Flags
bit 0: Passworded if true
1 Room2 Status
...
1 RoomN Status
002: Request general information from server.
1 Format for stats
0: Normal unformatted stats
003: Room Info
Size:
NT Last Song Title
NT Last Song Subtitle
NT Last Song Artist
1 Num Players
1 Max Players
NT Player1 Name
...
NT PlayerN Name
PRELIMINARY - - - - - - - - 05/03/2004
Protocol version 4
But 0x04 will be its version for inter-protocol purposes.
This protocol is only intended to replace current protocol. Because current protocol
not expanable
SMLAN PROTCOL TCP/8765
Protcol is entirelly packaged in EzSockets Data Packets (use send and receive packet)
This will prevent any out-of-sync errors with future or past versions.
The protocol is impervious to fragmented, or bonded TCP packets.
Basic Representation:
Octet 0123 4 5
+----+-+---//--+
|ssss|C|Payload|
+----+-+---//--+
ssss - size of packet, handled by ezsockets (if you're using C++)
C - Command.
Payload - variable size based on command
The payload may contain more data than expected, i.e. new protocol version.
In the following protocol, the term size means the size of the chunk of data.
If the "size" is "NT" then that means it's a null-terminating string.
"MSN" most significant 4 bits (byte/16)
"LSN" least significant 4 bits (byte%16)
Note: Primary player is 0x0, secondary player is 0x1
CLIENT to SERVER protocol:
000: No Operation
Desc: This command will cause server to respond with a no op response.
Payload: None
Response: Server 001
001: No Operation Response
Desc: This command is used to respond to a no operation.
Payload: None
Response: None
002: Hello
Desc: This is the first packet from a client to server, stating below
information (NOTE: Names are no longer sent in this packet)
Payload:
Size Description:
1 Client protocol version
NT Name of build of StepMania
Response: Server 002
003: Game Start Request
Desc: This command is called once after most loading is done, and
again immediately before the sound starts.
Payload:
Size Description
MSN Primary player difficulty (feet) (0 for no player)
LSN Secondary player difficulty (feet) (0 for no player)
MSN Primary player difficulty (0=Beginner, 1=easy, etc.)
LSN Second player difficulty (0=Beginner, 1=easy, etc.)
MSN Start Position (0 is pre-sync, 1 is for sync)
LSN Reserved
NT Song Title
NT Song Subtitle
NT Song Artist
NT Course Title (If none exists; make it just a null)
NT Song Options (in string-format)
NT Primary Player's options (Null if non-existant)
NT Secondary Player's Options (Null if non-existant)
Response: Server 003
004: Game Over Notice
Desc: This command is sent when end of game is encounterd
Payload: None.
Response: None.
005: Game Status update
Desc: Updates game info for each step
Payload:
Size Description
MSN Player #
Protocol <= 2
LSN StepID
1: Miss
2: W5
3: W4
4: W3
5: W2
6: W1
7: LetGo
8: Held
Protocol >= 3
LSN StepID
1: HitMine
2: AvoidMine
3: Miss
4: W5
5: W4
6: W3
7: W2
8: W1
9: LetGo
10: Held
MSN Projected Grade (StepMania enum int)
LSN Reserved
4 Net-order long containing score.
2 Net-order int containing combo.
2 Net-order int containing health.
2 Net-order # containing offset
32767 would be DEAD on the note
If the user is hitting late, the # will be higher
It if the user is exactly 0.25 seconds off, the
number will be different by 500, if 0.5, it will be
different by 1000.
Response: None.
006: Style Update (PLEASE NOTE THIS HAS NOTHING TO DO WITH SERVER COMMAND 6)
Desc: This is sent when a style is chosen.
Size:
1 # of enabled players (1 means 1, 2 means 2)
1 Player # (0 means 1st, 1 means 2nd)
NT Player Name for #
(Additional player's and #'s) (enabled players ONLY)
Response: None
007: Chat message
Desc: The user typed a message for general chat.
Size:
NT Message
008: Request Start Game and Tell server existance/non existance of song.
Desc: The user selected a song on a Net-enabled selection
Size:
1 Usage of message
0: (in response to server 8) User has specified song
1: (in response to server 8) User does NOT have specified song
2: User requested a start game on given song
NT Song Title (As gotten by GetTranslitMainTitle)
NT Song Artist (As Gotten by GetTranslitArtist)
NT Song Subtitle (As gotten by GetTranslitSubTitle)
009: //Reserved
010: User entered/exited Network Music Selection Screen
Size:
1
0: exited ScreenNetSelectMusic
1: entered ScreenNetSelectMusic
2: **Not Sent**
3: entered options screen
4: exited the evaluation screen
5: entered evaluation screen
6: exited ScreenNetRoom
7: entered ScreenNetRoom
011: User has changed player options
Size:
NT Player 0's options
NT Player 1's options
012: SMOnline Packet. //SPECIAL CASE!!!
NOTE: The smonline packet is not defined here.
The SMLan packet 12 is a wrapper for the SMOnline packet.
This is so that we can have "protection" of sorts when
it comes to the coding of SMOnline, so we don't have to
use the lower level commands when dealing with SMOnline.
Size:
1 SMOnline command //This used to say 2, but it looks like 1 in all cases
<VARIABLE> SMOnline data
013: Reserved
014: Reserved
015: XML Packet. This packet contains data in XML format.
Size:
NT XML
SERVER to CLIENT protocol: (begins at 128)
NOTE: Server responses always add 128, thus a server response for no operation
is 128, not 000
000(128):No Operation
Desc: This command will cause server to respond with a no op response.
Payload: None
Response: Server 001
001(129):No Operation Response
Desc: This command is used to respond to a no operation.
Payload: None
Response: None
002(130):Server Hello Response
Desc: This introduces the server.
Payload:
Size Description
1 Server protocol version //NOTE: if protocol version is 128+, then this
server is an SMOnline server
NT Server Name
4 Random key ( at the moment only used for an alternate login method )
003(131):Allow Start
Desc: This will cause the client to start the game.
Payload: None
Response: None
004(132):Game over stats
Desc: this packet is send in response to the game over packet
it contains information regarding how well each player did.
Payload:
1 # of players sent in this packet (active players)
The way this works is to send every player's info for a given
field. Like every player's score will be sent first, then every
player's grade.
1 First player's player ID
<Other player's IDs>
4 Score
<Other player's scores>
1 Grade
<Other player's Grades>
1 Difficulty (0=beginner, 1=light, etc.)
<Other player's difficulties>
#this next chunk of step types is actually reversed
2 miss
<Other player's misses>
2 boo
<Other player's boos>
2 good (All players)
2 great (All players)
2 perfect (All players)
2 marvelous (All players)
2 ok (All players)
2 max_combo (All players)
NT Player's options
<Other player's options>
005:(133)Scoreboard update
Desc: This will update the client's scoreboard.
Payload:
Size
1 Which section
0: Names
1: Combos
2: Projected Grades
1 # of players to display
If Names, then:
1 Player in first place's index
1 Player in second place's index
...
1 Last player's index
If Combos, then:
2 First player's combo
2 Second Player's combo
...
2 Last player's combo
If Project grades
1 Player 1's grade (in the same format used when reporting projected grades)
1 Player 2's grade
...
1 Last player's projected grade
006:(134)System Message (PLEASE NOTE THIS HAS NOTHING TO DO WITH CLIENT COMMAND 6)
Desc: Send system message to user
Payload:
Size Description
NT Message
007:(135)Chat Message
Desc: Add a chat message to the chat window on some StepMania screens.
Payload:
Size Description
NT Message
008:(136)Tell client to start song/ask if client has song
Desc: The user selected a song on a Net-enabled selection
Size:
1 Usage of message
0: See if client has song
1: See if client has song, if so, scroll to song
2: See if client has song, if so, scroll to song, and play that song
3: Blindly start song
NT Song Title (As gotten by GetTranslitMainTitle)
NT Song Artist (As Gotten by GetTranslitArtist)
NT Song Subtitle (As gotten by GetTranslitSubTitle)
009:(137)Update user list
Desc: This sends all the users currently connected
Size:
1 Max # of players
1 # of players in this packet
1 Player 0's status
NT Player 0's name (if there is no player here... make it a null (""))
1 Player 1's status
NT Player 1's name
...
1 Last player's status
NT Last player's name
Status:
0 Inative (no info on this user yet)
1 Active (you know who it is)
2 In Selection Screen
3 In Options
4 In Evaluation
010:(138)Force change to Networking select music screen.
Size:
NT Set Specified gametype
NT Set Specified style
011:(139)Reserved
012:(140)SMOnline Packet. //SPECIAL CASE!!!
NOTE: The smonline packet is not defined here.
The SMLan packet 12 is a wrapper for the SMOnline packet.
This is so that we can have "protection" of sorts when
it comes to the coding of SMOnline, so we don't have to
use the lower level commands when dealing with SMOnline.
Size:
1 SMOnline command
<VARIABLE> SMOnline data
013:(141)Formatted information packet
Desc: Send formatted information regarding the server back to the player.
NOTE: The purpose of this function is alternatively to be a broadcast
packet. (You can expect it via UDP broadcast)
Size:
NT Server Name
2 Port the server is listening on
2 Number of players connected
014:(142)Attack Client
Size:
1 Player Number
4 Time to Last (in MS)
NT Text describing modifiers.
015:(143) XML reply. Contains XML
Size:
NT XML
----------------------------------------------------------------
Client SMOnline packets:
000: Send Login Information
Size:
1 Player Number
1 Encryption text
0: MD5 hash
1: MD5 ( MD5 hash + salt ) (salt is plain text, base 10 string )
NT Username
NT Password
Note: The client is not permitted to use method (1) for authentication
if the salt it received from the server is 0
001: User asks to enter room
Size:
1 Enter/Exit?
0: User wishes to exit room
1: User wishes to enter room
NT Room Name (Used when entering rooms)
NT Password (Empty if password not used)
002: Create a new Room
Size:
1 Room Type
0: Normal room (has sub rooms)
1: Game room (no sub rooms)
NT Room Title
NT Room Description
NT Room Password (blank if no password)
003: Requests Room Info
Size:
NT Room Name
Server SMOnline packets:
000: Login Response
1 Approval Status
0: Approved
1: Approval Failed
NT Login response (plain text)
001: Room Update (Changing rooms)
Size:
1 Type of update
0: Change Room Title
1: Update List of other rooms (or games)
If Room Title Update:
NT Room Title
NT Room Description
1 Type of room:
0: Chat room
1: Game room
1 Allows creation of sub room.
0: Does not allow creation of subrooms
1: Allows creation of subrooms
If Room List Update:
1 Number of rooms
NT Room1 Title
NT Room1 Description
NT Room2 Title
NT Room2 Description
...
NT RoomN Title
NT RoomN Description
Room Status appended for reverse compatibility
1 Room1 Status
0: Normal Room
1: Unused
2: Room in game
3: First stage of song selection has been done
4: Second stage of song selection has been done
1 Room2 Status
...
1 RoomN Status
Room Flags appended for reverse compatibility
1 Room1 Flags
bit 0: Passworded if true
1 Room2 Status
...
1 RoomN Status
002: Request general information from server.
1 Format for stats
0: Normal unformatted stats
003: Room Info
Size:
NT Last Song Title
NT Last Song Subtitle
NT Last Song Artist
1 Num Players
1 Max Players
NT Player1 Name
...
NT PlayerN Name
File diff suppressed because it is too large Load Diff
+33 -33
View File
@@ -1,34 +1,34 @@
SMXML Control Format | Informal and Unofficial Specification
____________________________________________________________
There is no formal DTD for SMXML as of this writing, so we can only go on the
example file and comments written about the format from developers.
Chris Danford writes[1]:
"I've been finishing a new in-game download system. The goal is to:
- Have as few user clicks as possible to install a package (or many packages)
- Have one cross-platform method of installing packages
The new file association - .smxml - contains control data that StepMania will use
on launch. The file format currently supports one or more packages to install."
The canonical sample SMXML file[2] looks like this:
<SMXML>
<Credentials>
<Username>chrisdanford</Username>
<PasswordToken>#&DJASDJ#$&$JSD</PasswordToken>
</Credentials>
<Install>
<URL>http://stepmaniam3.com/sm/data/files/Songs_DJMcFox_PlagueMixOne.smzip</URL>
</Install>
<Install>
<URL>http://stepmaniam3.com/sm/data/files/Songs_DJMcFox_PlagueMixTwo.smzip</URL>
</Install>
</SMXML>
The Credentials section seems to be optional, but is useful to know about:
"In the future, it might also be used to pass login credentials or other tokens
from the web site to StepMania for things like in-game uploads (instead of going
to stepmaniashare.com)"[1]
__________________________________________________________
[1] http://www.stepmania.com/forums/showthread.php?t=24203
SMXML Control Format | Informal and Unofficial Specification
____________________________________________________________
There is no formal DTD for SMXML as of this writing, so we can only go on the
example file and comments written about the format from developers.
Chris Danford writes[1]:
"I've been finishing a new in-game download system. The goal is to:
- Have as few user clicks as possible to install a package (or many packages)
- Have one cross-platform method of installing packages
The new file association - .smxml - contains control data that StepMania will use
on launch. The file format currently supports one or more packages to install."
The canonical sample SMXML file[2] looks like this:
<SMXML>
<Credentials>
<Username>chrisdanford</Username>
<PasswordToken>#&DJASDJ#$&$JSD</PasswordToken>
</Credentials>
<Install>
<URL>http://stepmaniam3.com/sm/data/files/Songs_DJMcFox_PlagueMixOne.smzip</URL>
</Install>
<Install>
<URL>http://stepmaniam3.com/sm/data/files/Songs_DJMcFox_PlagueMixTwo.smzip</URL>
</Install>
</SMXML>
The Credentials section seems to be optional, but is useful to know about:
"In the future, it might also be used to pass login credentials or other tokens
from the web site to StepMania for things like in-game uploads (instead of going
to stepmaniashare.com)"[1]
__________________________________________________________
[1] http://www.stepmania.com/forums/showthread.php?t=24203
[2] http://www.stepmania.com/test.smxml
+13 -13
View File
@@ -1,14 +1,14 @@
Code that uses ScreenTextEntry::TextEntry()
-------------------------------------------
RoomWheel.cpp
ScreenEdit.cpp
ScreenEditMenu.cpp
ScreenNetRoom.cpp
ScreenNetworkOptions.cpp
ScreenOptionsCourseOverview.cpp
ScreenOptionsManageCourses.cpp
ScreenOptionsManageEditSteps.cpp
ScreenOptionsManageProfiles.cpp
ScreenOptionsReviewWorkout.cpp
ScreenPackages.cpp
Code that uses ScreenTextEntry::TextEntry()
-------------------------------------------
RoomWheel.cpp
ScreenEdit.cpp
ScreenEditMenu.cpp
ScreenNetRoom.cpp
ScreenNetworkOptions.cpp
ScreenOptionsCourseOverview.cpp
ScreenOptionsManageCourses.cpp
ScreenOptionsManageEditSteps.cpp
ScreenOptionsManageProfiles.cpp
ScreenOptionsReviewWorkout.cpp
ScreenPackages.cpp
ScreenTestFonts.cpp
+16 -16
View File
@@ -1,17 +1,17 @@
warps are purple in the editor btw
beat 445.500 = 107.02325 seconds
----------------------------------
beat 453.72919 = 107.04103 seconds
00:03.145: ==NotesLoSM negbpm==
00:03.145: fnextposbeat = 449.500000, fnextposbpm = 47.419998,
00:03.145: fdelta = 4.040333, fwarpto = 453.540344
00:47.228: ==TimingData Delta as NoteRows==
00:47.228: fDeltaBeat = 4.000000 (beat)
00:47.228: fDeltaBeat = (NextBPMSeg 0.790333 - abs(fBPS 0.750000)) + (nextStartRow 21576 - thisRow 21384)
00:47.228: ==TimingData Delta as Beats==
00:47.228: fDeltaBeat = 4.000000 (beat)
warps are purple in the editor btw
beat 445.500 = 107.02325 seconds
----------------------------------
beat 453.72919 = 107.04103 seconds
00:03.145: ==NotesLoSM negbpm==
00:03.145: fnextposbeat = 449.500000, fnextposbpm = 47.419998,
00:03.145: fdelta = 4.040333, fwarpto = 453.540344
00:47.228: ==TimingData Delta as NoteRows==
00:47.228: fDeltaBeat = 4.000000 (beat)
00:47.228: fDeltaBeat = (NextBPMSeg 0.790333 - abs(fBPS 0.750000)) + (nextStartRow 21576 - thisRow 21384)
00:47.228: ==TimingData Delta as Beats==
00:47.228: fDeltaBeat = 4.000000 (beat)
00:47.228: fDeltaBeat = (NextBPMSeg 0.790333 - abs(fBPS 0.750000)) + (nextStartRow 21576 - thisRow 21384)
+131 -131
View File
@@ -1,132 +1,132 @@
HOW 2 UZE EZSOKETS BY FWEEM INC
Hey there. ezsockets is the socket library used in StepMania. If you are going to
develop any extended network functionality, it would be good to know about
ezsockets. This is by no means an exhaustive guide, as it just covers what's
contained in the header, as well as what that code does.
Section 1: low level commands===================================================
These are typically used for connecting to the server, according to a cursory
glance at ScreenPackages code.
=="Crating" a socket== (lol typos in the comments)
There are three functions here, each with different arguments (yay overloading).
All of them return a bool.
bool create(int Protocol, int Type);
This shows what's needed to make a socket. Consult the internet for complete
documentation as to possible values, but here are some ones to know:
[Protocol]
TCP = IPPROTO_TCP
UDP = IPPROTO_UDP
Raw sockets = IPPROTO_RAW (though "Protocol" is used in the code. Raw sockets
are not supported on Xbox)
bool create();
Creates a socket using (IPPROTO_TCP, SOCK_STREAM) as the parameters.
bool create(int Protocol);
This picks the right Type for you based on what Protocol you choose.
TCP uses SOCK_STREAM, UDP uses SOCK_DGRAM for the Type value.
==Binding Sockets to a Local Port==
bool bind(unsigned short port);
==Listening==
bool listen()
==Accepting==
bool accept(EzSockets &socket);
If it's not blocking and you can't read it, this will return false.
Other than that... ??
==Connecting to Server==
bool connect(const string& host, unsigned short port);
Connects to the server at host using port.
==Closing/Killing Sockets==
void close();
Sets the state to disconnected, sets the buffers to empty strings,
then closes the socket.
==Checking Socket Status==
bool check();
"see if socket has been created". It checks (sock != INVALID_SOCKET) on the
Xbox and (sock > SOCKET_NONE) on every other platform.
bool CanRead();
Returns true if you can read from the socket.
bool DataAvailable() { return ( ( inBuffer.length()>0 ) || CanRead() ); }
Yeah that's it in a nutshell. If the input buffer has data or you can read,
there's data available.
bool IsError();
Returns true if there's an error.
bool CanWrite();
Returns true if you can write to the socket.
==???==
long uAddr();
void update();
Section 2: Higher Level Commands================================================
These are higher level, since they assume you've already gotten the socket up
and running (see check() in Section 1).
//Raw data system
void SendData(const string& outData);
void SendData(const char *data, unsigned int bytes);
Send off some data that's either a string or a char buffer + num bytes.
int ReadData(char *data, unsigned int bytes);
Reads data, returns number of bytes read.
int PeekData(char *data, unsigned int bytes);
Peeks at the data, returns number of bytes read.
//Packet system (for structures and classes)
void SendPack(const char *data, unsigned int bytes);
int ReadPack(char *data, unsigned int max);
int PeekPack(char *data, unsigned int max);
Similar to the raw data system above, but... you guessed it, for structures and classes.
//String (Flash) system / Null-terminated strings
void SendStr(const string& data, char delim = '\0');
int ReadStr(string& data, char delim = '\0');
int PeekStr(string& data, char delim = '\0');
Similar to above, with null terminated strings.
Section 3: putting it all together==============================================
okay i didn't test this; this is based on ScreenPackages code (specifically
ScreenPackages::EnterURL()), which assumes you have a private EzSockets object
named m_wSocket.
{
// defaults
RString sProto;
RString sServer;
int iPort=80;
RString sAddress;
m_wSocket.create(); // will create a TCP socket
m_wSocket.blocking = true; // you want to set this so that nothing else can use this socket and fuck things up
m_wSocket.connect( sServer, (short)iPort ); // connect uses an unsigned short, so a cast is needed. (int was used because of other code) check if this returns true/false, pls
// makin' headers (using SendData with raw data; http 1.0 in this case)
RString Header="";
Header = "GET "+sAddress+" HTTP/1.0\r\n";
Header+= "Host: " + Server + "\r\n";
Header+= "Connection: closed\r\n\r\n";
m_wSocket.SendData( Header.c_str(), Header.length() );
m_wSocket.blocking = false; // once you're done, you don't need to have the socket blocking anymore
// some other code can go here...
m_wSocket.close(); // and if you're done, you can close the socket.
HOW 2 UZE EZSOKETS BY FWEEM INC
Hey there. ezsockets is the socket library used in StepMania. If you are going to
develop any extended network functionality, it would be good to know about
ezsockets. This is by no means an exhaustive guide, as it just covers what's
contained in the header, as well as what that code does.
Section 1: low level commands===================================================
These are typically used for connecting to the server, according to a cursory
glance at ScreenPackages code.
=="Crating" a socket== (lol typos in the comments)
There are three functions here, each with different arguments (yay overloading).
All of them return a bool.
bool create(int Protocol, int Type);
This shows what's needed to make a socket. Consult the internet for complete
documentation as to possible values, but here are some ones to know:
[Protocol]
TCP = IPPROTO_TCP
UDP = IPPROTO_UDP
Raw sockets = IPPROTO_RAW (though "Protocol" is used in the code. Raw sockets
are not supported on Xbox)
bool create();
Creates a socket using (IPPROTO_TCP, SOCK_STREAM) as the parameters.
bool create(int Protocol);
This picks the right Type for you based on what Protocol you choose.
TCP uses SOCK_STREAM, UDP uses SOCK_DGRAM for the Type value.
==Binding Sockets to a Local Port==
bool bind(unsigned short port);
==Listening==
bool listen()
==Accepting==
bool accept(EzSockets &socket);
If it's not blocking and you can't read it, this will return false.
Other than that... ??
==Connecting to Server==
bool connect(const string& host, unsigned short port);
Connects to the server at host using port.
==Closing/Killing Sockets==
void close();
Sets the state to disconnected, sets the buffers to empty strings,
then closes the socket.
==Checking Socket Status==
bool check();
"see if socket has been created". It checks (sock != INVALID_SOCKET) on the
Xbox and (sock > SOCKET_NONE) on every other platform.
bool CanRead();
Returns true if you can read from the socket.
bool DataAvailable() { return ( ( inBuffer.length()>0 ) || CanRead() ); }
Yeah that's it in a nutshell. If the input buffer has data or you can read,
there's data available.
bool IsError();
Returns true if there's an error.
bool CanWrite();
Returns true if you can write to the socket.
==???==
long uAddr();
void update();
Section 2: Higher Level Commands================================================
These are higher level, since they assume you've already gotten the socket up
and running (see check() in Section 1).
//Raw data system
void SendData(const string& outData);
void SendData(const char *data, unsigned int bytes);
Send off some data that's either a string or a char buffer + num bytes.
int ReadData(char *data, unsigned int bytes);
Reads data, returns number of bytes read.
int PeekData(char *data, unsigned int bytes);
Peeks at the data, returns number of bytes read.
//Packet system (for structures and classes)
void SendPack(const char *data, unsigned int bytes);
int ReadPack(char *data, unsigned int max);
int PeekPack(char *data, unsigned int max);
Similar to the raw data system above, but... you guessed it, for structures and classes.
//String (Flash) system / Null-terminated strings
void SendStr(const string& data, char delim = '\0');
int ReadStr(string& data, char delim = '\0');
int PeekStr(string& data, char delim = '\0');
Similar to above, with null terminated strings.
Section 3: putting it all together==============================================
okay i didn't test this; this is based on ScreenPackages code (specifically
ScreenPackages::EnterURL()), which assumes you have a private EzSockets object
named m_wSocket.
{
// defaults
RString sProto;
RString sServer;
int iPort=80;
RString sAddress;
m_wSocket.create(); // will create a TCP socket
m_wSocket.blocking = true; // you want to set this so that nothing else can use this socket and fuck things up
m_wSocket.connect( sServer, (short)iPort ); // connect uses an unsigned short, so a cast is needed. (int was used because of other code) check if this returns true/false, pls
// makin' headers (using SendData with raw data; http 1.0 in this case)
RString Header="";
Header = "GET "+sAddress+" HTTP/1.0\r\n";
Header+= "Host: " + Server + "\r\n";
Header+= "Connection: closed\r\n\r\n";
m_wSocket.SendData( Header.c_str(), Header.length() );
m_wSocket.blocking = false; // once you're done, you don't need to have the socket blocking anymore
// some other code can go here...
m_wSocket.close(); // and if you're done, you can close the socket.
}
+25 -25
View File
@@ -1,26 +1,26 @@
Notable StepMania CVS commit logs
--------------------------------------------------------------------------------
http://sourceforge.net/mailarchive/forum.php?thread_name=E1ICWkp-00073O-Ay%40mail.sourceforge.net&forum_name=stepmania-cvs
"Any given step can continue the combo, maintain the combo, break the combo, or
outright miss. Those that break the combo aren't misses and shouldn't increase
the miss counter but they should break the combo."
Yeah right it doesn't seem to do that...
--------------------------------------------------------------------------------
http://sourceforge.net/mailarchive/message.php?msg_id=E1FWjDl-0000Ob-IY%40mail.sourceforge.net
"remove unfinished, crufty multiplayer stuff"
+
http://sourceforge.net/mailarchive/message.php?msg_id=E1FWjpV-0007eC-2G%40mail.sourceforge.net
"remove unfinished multiplayer stuff"
Some of the multiplayer stuff was later re-assembled but I think some of the
pieces are missing.
http://sourceforge.net/mailarchive/message.php?msg_id=E1HbPRZ-0003kC-8h%40mail.sourceforge.net
"We have two ways of only showing songs in roulette: unlocks and "#SELECTABLE".
I'm not sure if this feature is worth keeping, but there definitely doesn't
need to be two ways to do it. Remove #SELECTABLE:ROULETTE."
________________________________________________________________________________
Viewing old source code:
http://stepmania.cvs.sourceforge.net/stepmania/stepmania/src/
Notable StepMania CVS commit logs
--------------------------------------------------------------------------------
http://sourceforge.net/mailarchive/forum.php?thread_name=E1ICWkp-00073O-Ay%40mail.sourceforge.net&forum_name=stepmania-cvs
"Any given step can continue the combo, maintain the combo, break the combo, or
outright miss. Those that break the combo aren't misses and shouldn't increase
the miss counter but they should break the combo."
Yeah right it doesn't seem to do that...
--------------------------------------------------------------------------------
http://sourceforge.net/mailarchive/message.php?msg_id=E1FWjDl-0000Ob-IY%40mail.sourceforge.net
"remove unfinished, crufty multiplayer stuff"
+
http://sourceforge.net/mailarchive/message.php?msg_id=E1FWjpV-0007eC-2G%40mail.sourceforge.net
"remove unfinished multiplayer stuff"
Some of the multiplayer stuff was later re-assembled but I think some of the
pieces are missing.
http://sourceforge.net/mailarchive/message.php?msg_id=E1HbPRZ-0003kC-8h%40mail.sourceforge.net
"We have two ways of only showing songs in roulette: unlocks and "#SELECTABLE".
I'm not sure if this feature is worth keeping, but there definitely doesn't
need to be two ways to do it. Remove #SELECTABLE:ROULETTE."
________________________________________________________________________________
Viewing old source code:
http://stepmania.cvs.sourceforge.net/stepmania/stepmania/src/
put a filename at the end of it.
+37 -37
View File
@@ -1,38 +1,38 @@
as found by cppcheck against normal sm4svn source (as of 20090527), so
line numbers will be different in sm-ssc for some of these.
==================================================================================
[.\ActorFrameTexture.h:38]: (all) Memory leak: ActorFrameTexture::m_pRenderTarget
[.\AdjustSync.h:16]: (all) Memory leak: AdjustSync::s_pTimingDataOriginal
[.\AutoKeysounds.h:32]: (all) Memory leak: AutoKeysounds::m_pSharedSound
[.\Font.cpp:748]: (all) Memory leak: pPage
[.\GameSoundManager.cpp:267]: (all) Memory leak: pSound
[.\LifeMeterTime.h:40]: (all) Memory leak: LifeMeterTime::m_pStream
[.\MusicWheelItem.h:55]: (all) Memory leak: MusicWheelItem::m_pTextSectionCount
[.\OptionRow.h:131]: (all) Memory leak: OptionRow::m_textTitle
[.\PitchDetectionTestUtil.cpp:928]: (error) Mismatching allocation and deallocation: inarray
[.\PitchDetectionTestUtil.cpp:968]: (error) Mismatching allocation and deallocation: a
[.\RageFile.cpp:377]: (all) Memory leak: pFile
[.\RageFileDriverDeflate.cpp:533]: (all) Memory leak: mem
[.\RageSoundReader_ChannelSplit.h:57]: (all) Memory leak: RageSoundSplitter::m_pImpl
[.\RageSoundReader_PitchChange.h:25]: (all) Memory leak: RageSoundReader_PitchChange::m_pSpeedChange
[.\RageSoundReader_PitchChange.h:26]: (all) Memory leak: RageSoundReader_PitchChange::m_pResample
[.\RageThreads.cpp:141]: (all) Memory leak: pLock
[.\archutils\Unix\CrashHandlerChild.cpp:290]: (error) Resource leak: tty
[.\crypto\CryptRSA.cpp:447]: (error) Memory leak: rsa
as found by cppcheck against normal sm4svn source (as of 20090527), so
line numbers will be different in sm-ssc for some of these.
==================================================================================
[.\ActorFrameTexture.h:38]: (all) Memory leak: ActorFrameTexture::m_pRenderTarget
[.\AdjustSync.h:16]: (all) Memory leak: AdjustSync::s_pTimingDataOriginal
[.\AutoKeysounds.h:32]: (all) Memory leak: AutoKeysounds::m_pSharedSound
[.\Font.cpp:748]: (all) Memory leak: pPage
[.\GameSoundManager.cpp:267]: (all) Memory leak: pSound
[.\LifeMeterTime.h:40]: (all) Memory leak: LifeMeterTime::m_pStream
[.\MusicWheelItem.h:55]: (all) Memory leak: MusicWheelItem::m_pTextSectionCount
[.\OptionRow.h:131]: (all) Memory leak: OptionRow::m_textTitle
[.\PitchDetectionTestUtil.cpp:928]: (error) Mismatching allocation and deallocation: inarray
[.\PitchDetectionTestUtil.cpp:968]: (error) Mismatching allocation and deallocation: a
[.\RageFile.cpp:377]: (all) Memory leak: pFile
[.\RageFileDriverDeflate.cpp:533]: (all) Memory leak: mem
[.\RageSoundReader_ChannelSplit.h:57]: (all) Memory leak: RageSoundSplitter::m_pImpl
[.\RageSoundReader_PitchChange.h:25]: (all) Memory leak: RageSoundReader_PitchChange::m_pSpeedChange
[.\RageSoundReader_PitchChange.h:26]: (all) Memory leak: RageSoundReader_PitchChange::m_pResample
[.\RageThreads.cpp:141]: (all) Memory leak: pLock
[.\archutils\Unix\CrashHandlerChild.cpp:290]: (error) Resource leak: tty
[.\crypto\CryptRSA.cpp:447]: (error) Memory leak: rsa
[.\smpackage\ZipArchive\Linux\ZipPlatform.cpp:87]: (style) Found 'mktemp'. You should use 'mkstemp' instead
+79 -79
View File
@@ -1,80 +1,80 @@
okay what we should probabably do for rival data is fuck up stats somehow.
Here's what rival data should have, taken from Stats.xml
==GeneralData==
This section holds very BASIC identifying and general information.
<GeneralData>
<DisplayName>AJ</DisplayName>
<Guid>5ece7871bd060600</Guid>
<LastPlayedMachineGuid>faeae5b0da56509c</LastPlayedMachineGuid>
<LastPlayedDate>2008-07-06</LastPlayedDate>
</GeneralData>
==SongScores==
Where song scores are held. Each song has its own entry in here.
<Song Dir='Songs/Dance Dance Revolution 6th Mix -Max-/Do It Right/'>
<Steps Difficulty='Hard' StepsType='dance-single'>
<HighScoreList>
<NumTimesPlayed>2</NumTimesPlayed>
<LastPlayed>2008-02-08</LastPlayed>
<HighGrade>Tier02</HighGrade>
<HighScore>
<Grade>Tier02</Grade>
<PercentDP>0.952000</PercentDP>
<Modifiers>3x, Overhead, delta</Modifiers>
<DateTime>2008-02-08 17:12:08</DateTime>
<PlayerGuid>5ece7871bd060600</PlayerGuid>
<MachineGuid>faeae5b0da56509c</MachineGuid>
<TapNoteScores>
<HitMine>0</HitMine>
<AvoidMine>0</AvoidMine>
<CheckpointMiss>0</CheckpointMiss>
<Miss>0</Miss>
<W5>0</W5>
<W4>0</W4>
<W3>0</W3>
<W2>41</W2>
<W1>244</W1>
<CheckpointHit>0</CheckpointHit>
</TapNoteScores>
<HoldNoteScores>
<LetGo>0</LetGo>
<Held>0</Held>
</HoldNoteScores>
</HighScore>
<HighScore>
<Grade>Tier03</Grade>
<PercentDP>0.942600</PercentDP>
<Modifiers>3x, delta</Modifiers>
<DateTime>2008-02-08 17:08:17</DateTime>
<PlayerGuid>5ece7871bd060600</PlayerGuid>
<MachineGuid>faeae5b0da56509c</MachineGuid>
<TapNoteScores>
<HitMine>0</HitMine>
<AvoidMine>0</AvoidMine>
<CheckpointMiss>0</CheckpointMiss>
<Miss>0</Miss>
<W5>0</W5>
<W4>1</W4>
<W3>0</W3>
<W2>46</W2>
<W1>238</W1>
<CheckpointHit>0</CheckpointHit>
</TapNoteScores>
<HoldNoteScores>
<LetGo>0</LetGo>
<Held>0</Held>
</HoldNoteScores>
</HighScore>
</HighScoreList>
</Steps>
okay what we should probabably do for rival data is fuck up stats somehow.
Here's what rival data should have, taken from Stats.xml
==GeneralData==
This section holds very BASIC identifying and general information.
<GeneralData>
<DisplayName>AJ</DisplayName>
<Guid>5ece7871bd060600</Guid>
<LastPlayedMachineGuid>faeae5b0da56509c</LastPlayedMachineGuid>
<LastPlayedDate>2008-07-06</LastPlayedDate>
</GeneralData>
==SongScores==
Where song scores are held. Each song has its own entry in here.
<Song Dir='Songs/Dance Dance Revolution 6th Mix -Max-/Do It Right/'>
<Steps Difficulty='Hard' StepsType='dance-single'>
<HighScoreList>
<NumTimesPlayed>2</NumTimesPlayed>
<LastPlayed>2008-02-08</LastPlayed>
<HighGrade>Tier02</HighGrade>
<HighScore>
<Grade>Tier02</Grade>
<PercentDP>0.952000</PercentDP>
<Modifiers>3x, Overhead, delta</Modifiers>
<DateTime>2008-02-08 17:12:08</DateTime>
<PlayerGuid>5ece7871bd060600</PlayerGuid>
<MachineGuid>faeae5b0da56509c</MachineGuid>
<TapNoteScores>
<HitMine>0</HitMine>
<AvoidMine>0</AvoidMine>
<CheckpointMiss>0</CheckpointMiss>
<Miss>0</Miss>
<W5>0</W5>
<W4>0</W4>
<W3>0</W3>
<W2>41</W2>
<W1>244</W1>
<CheckpointHit>0</CheckpointHit>
</TapNoteScores>
<HoldNoteScores>
<LetGo>0</LetGo>
<Held>0</Held>
</HoldNoteScores>
</HighScore>
<HighScore>
<Grade>Tier03</Grade>
<PercentDP>0.942600</PercentDP>
<Modifiers>3x, delta</Modifiers>
<DateTime>2008-02-08 17:08:17</DateTime>
<PlayerGuid>5ece7871bd060600</PlayerGuid>
<MachineGuid>faeae5b0da56509c</MachineGuid>
<TapNoteScores>
<HitMine>0</HitMine>
<AvoidMine>0</AvoidMine>
<CheckpointMiss>0</CheckpointMiss>
<Miss>0</Miss>
<W5>0</W5>
<W4>1</W4>
<W3>0</W3>
<W2>46</W2>
<W1>238</W1>
<CheckpointHit>0</CheckpointHit>
</TapNoteScores>
<HoldNoteScores>
<LetGo>0</LetGo>
<Held>0</Held>
</HoldNoteScores>
</HighScore>
</HighScoreList>
</Steps>
</Song>
+11 -11
View File
@@ -1,12 +1,12 @@
[as taken from src/ProductInfo.h]
Version info displayed to the user.
These are the 'official' version designations:
* "experimental: pre-release versions
* "private beta v0.0": hmm, think about it for a second there.
==Public versions below this line==
* "v0.0 alpha #": Alpha versions (bug squashing, polishing until we reach beta)
* "v0.0 beta #": Beta versions (bug squashing, _focus_ is on high priority bugs)
* "v0.0 rc#": Release Candidates (if there are no problems, move on to final)
[as taken from src/ProductInfo.h]
Version info displayed to the user.
These are the 'official' version designations:
* "experimental: pre-release versions
* "private beta v0.0": hmm, think about it for a second there.
==Public versions below this line==
* "v0.0 alpha #": Alpha versions (bug squashing, polishing until we reach beta)
* "v0.0 beta #": Beta versions (bug squashing, _focus_ is on high priority bugs)
* "v0.0 rc#": Release Candidates (if there are no problems, move on to final)
* "v0.0": Final Releases
+170 -170
View File
@@ -1,170 +1,170 @@
The following license applies to most of the sm-ssc additions:
sm-ssc is copyright © AJ Kelly, Midiman, shakesoda (referred to as
"the spinal shark collective" hereafter), and other contributors.
All rights reserved.
"sm-ssc" is defined as the changes made to StepMania that do not make their
way back into the main StepMania repository for various reasons.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, and/or sell copies of the Software, and to permit persons to
whom the Software is furnished to do so, provided that the above
copyright notice(s) and this permission notice appear in all copies of
the Software and that both the above copyright notice(s) and this
permission notice appear in supporting documentation.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
The rest of the codebase is then licensed as follows:
******************************************************************************
StepMania is (c) Chris Danford, the StepMania development team, et al.
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, and/or sell copies of the Software, and to permit persons to
whom the Software is furnished to do so, provided that the above
copyright notice(s) and this permission notice appear in all copies of
the Software and that both the above copyright notice(s) and this
permission notice appear in supporting documentation.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
******************************************************************************
RageSurface_Load_GIF contains code from Xpaint under the following license:
Copyright 1990, 1991, 1993 David Koblas.
Copyright 1996 Torsten Martinsen.
Permission to use, copy, modify, and distribute this software
and its documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice appear in all
copies and that both that copyright notice and this permission
notice appear in supporting documentation. This software is
provided "as is" without express or implied warranty.
******************************************************************************
Code in src/crypto/ is under the following permissive license:
PuTTY is copyright 1997-2001 Simon Tatham.
Portions copyright Robert de Bath, Joris van Rantwijk, Delian
Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas Barry,
Justin Bradford, and CORE SDI S.A.
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
******************************************************************************
Code in RageSurfaceUtilsPalettize.cpp is under the following permissive
license:
Copyright (C) 1989, 1991 by Jef Poskanzer.
Copyright (C) 1997, 2000, 2002 by Greg Roelofs; based on an idea by
Stefan Schneider.
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted, provided
that the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation. This software is provided "as is" without express or
implied warranty.
******************************************************************************
PCRE is distributed under the 3-clause BSD license:
Written by: Philip Hazel <ph10@cam.ac.uk>
Copyright (c) 1997-2003 University of Cambridge
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
******************************************************************************
The MAD library (included with most Windows binary distributions), and
interface code in RageSoundReader_MP3, is under the GPL, available in
Copying.MAD. Support for this library can be disabled at compile-time.
******************************************************************************
NotesLoaderMidi contains code from STK under the following license:
Copyright 2003 Gary P. Scavone
LEGAL AND ETHICAL:
This software was designed and created to be made publicly available for
free, primarily for academic purposes, so if you use it, pass it on with
this documentation, and for free.
On April 19 2007, StepMania was granted an MIT license by Gary Scavone
for any STK code on the condition that all of the the STK
credits/disclaimers/copyrights from the README are retained in the
source code and in the project documentation.
The following license applies to most of the sm-ssc additions:
sm-ssc is copyright © AJ Kelly, Midiman, shakesoda (referred to as
"the spinal shark collective" hereafter), and other contributors.
All rights reserved.
"sm-ssc" is defined as the changes made to StepMania that do not make their
way back into the main StepMania repository for various reasons.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, and/or sell copies of the Software, and to permit persons to
whom the Software is furnished to do so, provided that the above
copyright notice(s) and this permission notice appear in all copies of
the Software and that both the above copyright notice(s) and this
permission notice appear in supporting documentation.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
The rest of the codebase is then licensed as follows:
******************************************************************************
StepMania is (c) Chris Danford, the StepMania development team, et al.
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, and/or sell copies of the Software, and to permit persons to
whom the Software is furnished to do so, provided that the above
copyright notice(s) and this permission notice appear in all copies of
the Software and that both the above copyright notice(s) and this
permission notice appear in supporting documentation.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
******************************************************************************
RageSurface_Load_GIF contains code from Xpaint under the following license:
Copyright 1990, 1991, 1993 David Koblas.
Copyright 1996 Torsten Martinsen.
Permission to use, copy, modify, and distribute this software
and its documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice appear in all
copies and that both that copyright notice and this permission
notice appear in supporting documentation. This software is
provided "as is" without express or implied warranty.
******************************************************************************
Code in src/crypto/ is under the following permissive license:
PuTTY is copyright 1997-2001 Simon Tatham.
Portions copyright Robert de Bath, Joris van Rantwijk, Delian
Delchev, Andreas Schultz, Jeroen Massar, Wez Furlong, Nicolas Barry,
Justin Bradford, and CORE SDI S.A.
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation files
(the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge,
publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so,
subject to the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE
FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
******************************************************************************
Code in RageSurfaceUtilsPalettize.cpp is under the following permissive
license:
Copyright (C) 1989, 1991 by Jef Poskanzer.
Copyright (C) 1997, 2000, 2002 by Greg Roelofs; based on an idea by
Stefan Schneider.
Permission to use, copy, modify, and distribute this software and its
documentation for any purpose and without fee is hereby granted, provided
that the above copyright notice appear in all copies and that both that
copyright notice and this permission notice appear in supporting
documentation. This software is provided "as is" without express or
implied warranty.
******************************************************************************
PCRE is distributed under the 3-clause BSD license:
Written by: Philip Hazel <ph10@cam.ac.uk>
Copyright (c) 1997-2003 University of Cambridge
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the University of Cambridge nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
******************************************************************************
The MAD library (included with most Windows binary distributions), and
interface code in RageSoundReader_MP3, is under the GPL, available in
Copying.MAD. Support for this library can be disabled at compile-time.
******************************************************************************
NotesLoaderMidi contains code from STK under the following license:
Copyright 2003 Gary P. Scavone
LEGAL AND ETHICAL:
This software was designed and created to be made publicly available for
free, primarily for academic purposes, so if you use it, pass it on with
this documentation, and for free.
On April 19 2007, StepMania was granted an MIT license by Gary Scavone
for any STK code on the condition that all of the the STK
credits/disclaimers/copyrights from the README are retained in the
source code and in the project documentation.
+1997 -1997
View File
File diff suppressed because it is too large Load Diff
+692 -692
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+322 -322
View File
@@ -1,323 +1,323 @@
..: HOW TO READ A .BMS/.BME WITH A NOTEPAD AND A BRAIN :..
..: Tutorial v1.1 by Jack A. Trades :..
~ v1.1 differences
~1 Updated BPM Change method for over 255 and/or decimal BPM usage.
~2 Spelling/word errors fixed.
~3 Added a new KEYLOCATION variable, to go with the ~1 update.
!TIP!
This tutorial is best viewed in fixed-width fonts, like Lucida Console or Courier New. It's also best viewed when Word Wrap feature is enabled, so if you need to copy and paste the entire tutorial to a temporary Notepad, then you may do so. You can always get the .rtf version if that's a hassle.
!NOTE!
This tutorial is intended for the creation/viewing/translation (what the hell?) of a .bms/.bme for any beatmania game. I will not include any other function that might also function in other BEMANI games such as DDR arrows or whatever else that a .bms/.bme can do. BEATMANIA ONLY PLZTHXBYE.
!!DISCLAIMER!!
This tutorial is created entirely from my knowledge and experience of .bms/.bme. I am not responsible for any loss of work, destruction of property, or loss of sanity when you are deciphering your own .bms/.bme and using this tutorial as your guide. Do not bug me if you somehow burned your computer or threw your cat out of the balcony. I don't want to hear it, except the cat part. I'll be sure to call Humane Society on that one.
So you want to read a BMS, eh? Well then, read on and I'll show what little bits of pieces of a .bms/.bme stand for, for I had no life, and I deciphered almost each of the mechanics a BMS/BME can have.
A BMS have two parts: HEADER and MAIN DATA FIELD. Without each other, they're useless, basically.
*----------HEADER
There are three sections of the header: BASIC, EXTENSION, and the third section that I like to call ASSIGNMENT.
• BASIC is the heart and soul of the .bms/.bme, where it tells the simulator (and you) what the hell is the song about. Title of the song, artist name, genre, BPM, play mode, and play level is specified here.
• EXTENSION is the optional header that can contain tags you can put as cosmetics, basically.
• ASSIGNMENT is the last, but not least, section of the header. This is where the life of keysounds and background animations (hereon called as "bga") begin. You can specify as many as 255 keysound tags and 255 bga tags so the simulator knows what file to play at where and when.
We will begin by explaining each available tags for BASIC header. Notice that lines that begin with *--- are my comments in the header section, as to not confuse you in an actual .bms/.bme.
*---BASIC HEADER
#PLAYER #
*---specifies player amount (options are 1 or 2). Use your logic; if it's 5/7-keys, use #PLAYER 1. If it's 10/14-keys, use #PLAYER 2.
#GENRE [x]
*---specifies the genre [x] when the song is currently highlighted.
#TITLE [x]
*---specifies the title [x] when the song is currently highlighted.
#ARTIST [x]
*---specifies the artist [x] when the song is currently highlighted.
#BPM ###
*---specifies ### ( 0 to 999 ) as the first (or only) BPM value of the song.
#PLAYLEVEL ##
*---specifies # ( 0 to 9 ) as the amount of difficulty (stars) of the song. Some simulators, from my experience, can support values above 9, but let's not be that stupid, shall we?
#MIDIFILE xxx.mid
*---This tag is optional if a bgm .wav/.mp3 already exists. Specifies the MIDI file to be played at the beginning of the song. MIDI file must be in the same directory where your .bms/.bme exists.
*---EXTENSION HEADER
#RANK #
*---specifies # ( 0 to 3, where 0 is Very Hard, 1 is Hard, 2 is Normal, and 3 is Easy) as the "rank" of the song. I don't know the exact function, but I don't think it'll tell the simulator to change the judge setting.
#TOTAL ###
*---I'm not quite sure about this, but I think this specifies the maximum notes you can get in this song. So values from 0 to 9999 works, I guess.
#VOLWAV ???
*---I don't know the actual specifier, but I have a hunch this tells the simulator to decrease or increase the volume of the bgm with/out keysounds.
#STAGEFILE xxx.yyy
*---specifies the "preview" graphic of the song. Think backgrounds in DDR. This will be shown after you choose the song, during the loading of keysounds and bganimations, if available, and will disappear when the song starts. xxx.yyy specifies the filename and filetype respectively. I think you can also use directory command (Using ..\..\hi.jpg may tell the simulator to use the file hi.jpg two directories above the directory where this .bms/.bme exist) but I haven't tested it.
%EMAIL [x]
*---a comment header; you can enter your e-mail address, if desired.
%URL [x]
*---a comment header; you can enter your website url address, if desired.
*---ASSIGNMENT HEADER
#WAV** xxx.yyy
*---this is where you specify the keysound file to be stored into a local variable by the simulator, where it will be able to be called upon during the gameplay of the song, and where ** is a two-digit hex value, xxx is the filename, and yyy is the filetype (commonly used are either WAV or MP3 files).
*---In Layman's terms, this is where you'll give the simulator a cardboard sign that says a two-digit number (or letter. explanation later...) and tell it to play SUCH AND SUCH file whenever you tell it to. So, an example would be:
*---#WAV01 kickdrum.wav
*---This means that whenever there's a section in the .bms/.bme that asks for a 01 in the keysound section, the simulator will then play the file kickdrum.wav, under two conditions: (1) IF AND ONLY IF the player actually presses the key, or (2) IF AND ONLY IF the digit called is in the Always-autoplay section.
*---Confused with those new vocabularies? Read on and you'll understand what the hell I'm babbling.
*---The **, or the two-digit number (or letter), ranges from 00 to FF. If you haven't noticed, it's the range of a 2-byte hex value. This means that you can specify up to 255 _different_ keysound files for the simulator to memorize. To assign more variables, just make a new line with changed variable number and filename. Example:
*---#WAV01 kickdrum.wav
*---#WAV02 hi-hats.wav
#BMP** xxx.yyy
*---The #BMP tag has the same idea as the #WAV tag, and also the same usage. The only difference is that the variables will be called in different sections. See the Main Data Field for further explanation.
*---HUGE NOTE, AS IN READ THE BELOW COMMENT BEFORE YOU GO ON
*---HUGE NOTE, AS IN READ THE BELOW COMMENT BEFORE YOU GO ON
*---HUGE NOTE, AS IN READ THE BELOW COMMENT BEFORE YOU GO ON
*---You do NOT need to specify every single variable. That means stop typing 500 lines of specifying nothing. Any unspecified variables will be assumed as "blanks" by the simulator, and when it is called, the simulator will do nothing, if it's a keysound, or the simulator will stop any animation previously and display nothing, if it's a bga.
*----------MAIN DATA FIELD
_THIS_ is the fun part. This section is where all of the keysounds are specified in bits and pieces of measures of the music, and _THIS_ is where you must act like a detective and decipher what the hell each line stands for. Thankfully, I have come with aid. And chips. And guacamole dip.
BACK TO THE POINT
Many of you will see jumbles of nothing but digits in a normal .bms/.bme file, but do you ever wonder how does it work? I'm sure you do, because if you've never wondered so, you won't be reading through here. Or to here, even.
So we will begin, with the explanation. I'll have fun 'splaining as I will 'yping.
'ey! 'ccent 're 'ool! 'nd 'nintelligible 'oo!!! 'o 'ffense.
So here you are, wandering around the main data field, and you see numbers like this.
#00412:00000000000000005F0000001A000000E3
and something like that repeated differently about 3000 times.
Let's begin understanding each section by breaking down the given example line. Obviously you should already understand the #. All codes begin with #. Duh.
# 004 12 :00000000000000005F0000001A000000E3
^
|
|
This is your _Measure #_ . Obviously it ranges from Measure 1 (000) to Measure 1000 (999), but what song have 1000 measures? Hopefully you're not making a .bms/.bme to a nonstop megamix. Anyway, this tells the simulator what's going on in such measure. In this example, there are...12...thing...with a colon and many zeroes and 5F and 1A and E3 here and there in measure 5....interesting. Don't worry; you'll understand those things soon.
Speaking of soon, we're moving right along to the next part. Boy was that quick or what?
# 004 12 :00000000000000005F0000001A000000E3
^
|
|
This is what I like to call KEY LOCATION variable, where it tells the simulator to put those...zeroes...and 5F...and the rest of the garbage into a variable of digit "12."
That didn't make a lot of sense, did it? Of course not. It didn't to me at first, until I deciphered the possible variables of key locations. Below is the list of the KEY LOCATION and its variable two-digit number.
KEYLOCATION - ACTUAL LOCATION/FUNCTION
======================================
11 - White key 1 (Most left)
12 - Blue key 1 (Most left)
13 - White key 2 (Second from the left)
14 - Blue key 2 (Center)
15 - White key 3 (Second from the right)
18 - Blue key 3 (Most right)
19 - White key 4 (Most right)
16 - Scratch (The big circle thing that makes wiki wiki wiki wik wik sound)
17 - •unknown function currently•
04 - BGA
07 - •unknown function currently•
06 - MISS BGA
01 - Always Autoplay
03 - BPM Change
08 - "Advanced" BPM Change
So in the above example, the code 00000000000000005F0000001A000000E3 will all be executed solely for the Blue key 1.
"BUT JACK A. TRADES, I WANNA KNOW HOW THOSE NUMBERS WORK AND WHAT ARE THEY ACTUALLY!?!??!?!/1/1/131'31'3nklnalndkland"
Let's stop the question and start looking at the example below.
# 004 12 :00000000000000005F0000001A000000E3
^ ^
--------------------------------
|
|
_NOT_ simply put, they are the codes that tell the simulator to call up all of the specified variables in a single measure. I lost you, didn't I?
Simply put, in this example, the simulator is told to call the following variables: 00 (8 times), 5F, 00 (3 times), 1A, 00 (3 times), and E3. That means the simulator will first find what you have specified earlier in the ASSIGNMENT HEADER, follow your command, and open/play that file for you at that point of time.
But how should this help you in terms of music? How can you specify exact call locations for the simulator, like a kick drum every beat in a measure, or a hi-hats for every-other-eighth-beat in a measure? This is where the (other) fun part comes in.
The amount of digits available will determine what kind of a note each double-digit is. I lost you again, didn't I?
For (another?) example, if you put a line of code such as this instead of the given example above:
#00412:5F
You're telling the simulator to play the 5F keysound whenever the player presses the blue key 1 at the first beat of measure 5.
HOLY CRAP HOW DID I KNOW THAT!?
Well, if you've studied music, and understand what the hell I was saying earlier, then you must know you only specified one digit for the measure, and that means the simulator will assume that double-digit as a whole note. Remember: 4 beats equal a measure, and a whole note = 4 beats.
So if you specify this instead:
#00412:5F005F00
The simulator will assume each double-digit as _quarter note_ and do the polka. I mean, do its thing. Play 5F in the first beat of the measure, play 00 in the second beat, play 5F in the third and finally play 00 in the fourth.
If I specify:
#00412:001A001A001A001A
I'm telling the simulator to play the 1A in every other sixteenth notes. Get the picture?
¤ THE AMOUNT OF DOUBLE DIGITS AvAILABLE IN THE LINE OF CODE SPECIFIES THE TYPE OF NOTE EACH ARE ¤
If there is one double-digit, it is a whole note.
If there are two double-digits, each double-digit is a half note.
If there are four double-digits, each double-digit is a quarter note.
If there are eight double-digits, each double-digit is a eighth note.
If there are sixteen double-digits, each double-digit is a sixteenth note.
If there are twelve double-digits, each double-digit is a twelveth note.
If there are thirty two double-digits, each double-digit is a thirty-second note.
ET CETERA
The highest note type a simulator can take, usually, is a 192nd note. If you go beyond that, something is wrong with you or the song. Probably you, but you never know.
So let's recap! What does this code actually tell you?
#00412:00000000000000005F0000001A000000E3
• At measure 5 ( #004 = MEASURE #5 ),
• The following variables are to be called in the Blue Key 1 section ( #xxx12 = Blue Key 1 ):
• 00,00,00,00,00,00,00,00,5F,00,00,00,1A,00,00,00,E3
• Where each note is assumed as (in this strange case) a seventeenth note.
• Therefore, the simulator must play the keysound of variable 00 in the first seventeenth note, then another 00 in the second seventeenth note, etc.
And you're done! See, that wasn't so hard, was it? But you think I'm forgetting something. Actually, two things. Well, I'm not, so shut up. That code always apply to everything you see in the KEYLOCATION table, including BGA and Always Autoplay.
The difference in the BGA, however, is that the simulator will load the graphics of the specified variables. So, if you've specified #BMP01 neh.bmp, and you want to call the graphic in a note, then the simulator will _NOT_ play the keysound for 01, but it will instead load the neh.bmp file.
The other and my last point that you think I've forgotten is the actual explanation of the other KEYLOCATION functions. I'll put the table below again for your convenience.
KEYLOCATION - ACTUAL LOCATION/FUNCTION
======================================
11 - White key 1 (Most left)
12 - Blue key 1 (Most left)
13 - White key 2 (Second from the left)
14 - Blue key 2 (Center)
15 - White key 3 (Second from the right)
18 - Blue key 3 (Most right)
19 - White key 4 (Most right)
16 - Scratch (The big circle thing that makes wiki wiki wiki wik wik sound)
17 - •unknown function currently•
04 - BGA
07 - •unknown function currently•
06 - MISS BGA
01 - Always Autoplay
03 - BPM Change
08 - "Extended" BPM Change
So what's 17 and 07 all about? I sure as hell don't know. Perhaps if you know, you would help me out with this tutorial. C'mon; I typed everything you see here, from my brain, in one single session.
Never mind that for now. What's MISS BGA, Always Autoplay, and BPM, you ask?
MISS BGA is where you can specify any custom animations you have when the player is currently missing the notes he's playing. If you want an absolute, easy example, find and download onoken - P8107 bms file with the background, and just miss a couple of notes (or the whole song and failing it, like I did!). You'll see that onoken has incorporated a custom MISS animation.
Of course, if you don't have the patience to make one, you can always specify a single image that has the word MISS in bold, or something. Preferably red, you know.
But nevertheless, to specify them is the exact same as how you would specify BGA or keysounds, but the only hassle is you have to copy and paste the same exact line for each measure you have.
This is also true for my next topic: Always Autoplay. Mostly used in [L7] and usually in [7] keysound files, this baby will make sure any sound (or annoying noises) will always be played even if the player just sits there and watches himself plummet to a Game Over screen. Or something. The usage is a bit different, however. Remember that ¤ THE AMOUNT OF DOUBLE DIGITS AvAILABLE IN THE LINE OF CODE SPECIFIES THE TYPE OF NOTE EACH ARE ¤ rule? Well, it applies to every code you can see, even those beyond the horizon.
So what do you have to do when you want to have two, three, or even four or more keysounds to play at the same exact time? Specify a new line, with different codes! Example is below:
#00001:01
#00001:02
#00001:03
This tells the simulator to play keysounds 01, 02, and 03 at the first note in measure 1. Simple, no?
But when you blame me for forgetting things, you are right for one thing, but ONLY one thing. I forgot to mention the BPM. That lil' bugger is used when you want to suddenly change the BPM value of the song. The usage is still the same, with a little variation.
#01103:96
The lil' code above this paragraph tells the simulator to change the BPm at measure 12 to 150 BPM. So how did I get 150 from 96? Some weird formula like standard deviation of the population mean in a binomial distribution?
Heck no, I got 150 because 96 is the hex value of 150. Let me remind you that 2-byte hex value only goes up to 255 in decimal, so in short, if you're trying to create a .bms/.bme for MaxX Unlimited, where the BPM changes from 300 to 280 to 300 to 150 to 320, we might have a problem. How would you specify a BPM value over 255?
[credit goes to pukpuk/2220 for finding the method originally and jammitch for pointing me to the solution]
You can specify your BPM in the ASSIGNMENT header, as you may recall. The process is the same; the code tag is the only one different. So if you want to specify a BPM of 320, put:
#BPM01 320
And call it in the main data field like:
#00408:01
This will call the BPM Change of 01 in measure 5, and thus changing the song's BPM to 320.
So if you want multiple BPM changes:
#01103:96AFC8E1
This tells the simulator to change the BPM to 150 at the first quarter note of Measure 12, to 175 at second quarter note, 200 at third, and 225 and fourth.
And with that, I conclude this tutorial. Hopefully I have made a tutorial that can actually help you read .bms/.bme more intelligently, and not think of egyptian inscriptions when you see those codes. Until next time, I am Jack A. Trades.
..: HOW TO READ A .BMS/.BME WITH A NOTEPAD AND A BRAIN :..
..: Tutorial v1.1 by Jack A. Trades :..
~ v1.1 differences
~1 Updated BPM Change method for over 255 and/or decimal BPM usage.
~2 Spelling/word errors fixed.
~3 Added a new KEYLOCATION variable, to go with the ~1 update.
!TIP!
This tutorial is best viewed in fixed-width fonts, like Lucida Console or Courier New. It's also best viewed when Word Wrap feature is enabled, so if you need to copy and paste the entire tutorial to a temporary Notepad, then you may do so. You can always get the .rtf version if that's a hassle.
!NOTE!
This tutorial is intended for the creation/viewing/translation (what the hell?) of a .bms/.bme for any beatmania game. I will not include any other function that might also function in other BEMANI games such as DDR arrows or whatever else that a .bms/.bme can do. BEATMANIA ONLY PLZTHXBYE.
!!DISCLAIMER!!
This tutorial is created entirely from my knowledge and experience of .bms/.bme. I am not responsible for any loss of work, destruction of property, or loss of sanity when you are deciphering your own .bms/.bme and using this tutorial as your guide. Do not bug me if you somehow burned your computer or threw your cat out of the balcony. I don't want to hear it, except the cat part. I'll be sure to call Humane Society on that one.
So you want to read a BMS, eh? Well then, read on and I'll show what little bits of pieces of a .bms/.bme stand for, for I had no life, and I deciphered almost each of the mechanics a BMS/BME can have.
A BMS have two parts: HEADER and MAIN DATA FIELD. Without each other, they're useless, basically.
*----------HEADER
There are three sections of the header: BASIC, EXTENSION, and the third section that I like to call ASSIGNMENT.
• BASIC is the heart and soul of the .bms/.bme, where it tells the simulator (and you) what the hell is the song about. Title of the song, artist name, genre, BPM, play mode, and play level is specified here.
• EXTENSION is the optional header that can contain tags you can put as cosmetics, basically.
• ASSIGNMENT is the last, but not least, section of the header. This is where the life of keysounds and background animations (hereon called as "bga") begin. You can specify as many as 255 keysound tags and 255 bga tags so the simulator knows what file to play at where and when.
We will begin by explaining each available tags for BASIC header. Notice that lines that begin with *--- are my comments in the header section, as to not confuse you in an actual .bms/.bme.
*---BASIC HEADER
#PLAYER #
*---specifies player amount (options are 1 or 2). Use your logic; if it's 5/7-keys, use #PLAYER 1. If it's 10/14-keys, use #PLAYER 2.
#GENRE [x]
*---specifies the genre [x] when the song is currently highlighted.
#TITLE [x]
*---specifies the title [x] when the song is currently highlighted.
#ARTIST [x]
*---specifies the artist [x] when the song is currently highlighted.
#BPM ###
*---specifies ### ( 0 to 999 ) as the first (or only) BPM value of the song.
#PLAYLEVEL ##
*---specifies # ( 0 to 9 ) as the amount of difficulty (stars) of the song. Some simulators, from my experience, can support values above 9, but let's not be that stupid, shall we?
#MIDIFILE xxx.mid
*---This tag is optional if a bgm .wav/.mp3 already exists. Specifies the MIDI file to be played at the beginning of the song. MIDI file must be in the same directory where your .bms/.bme exists.
*---EXTENSION HEADER
#RANK #
*---specifies # ( 0 to 3, where 0 is Very Hard, 1 is Hard, 2 is Normal, and 3 is Easy) as the "rank" of the song. I don't know the exact function, but I don't think it'll tell the simulator to change the judge setting.
#TOTAL ###
*---I'm not quite sure about this, but I think this specifies the maximum notes you can get in this song. So values from 0 to 9999 works, I guess.
#VOLWAV ???
*---I don't know the actual specifier, but I have a hunch this tells the simulator to decrease or increase the volume of the bgm with/out keysounds.
#STAGEFILE xxx.yyy
*---specifies the "preview" graphic of the song. Think backgrounds in DDR. This will be shown after you choose the song, during the loading of keysounds and bganimations, if available, and will disappear when the song starts. xxx.yyy specifies the filename and filetype respectively. I think you can also use directory command (Using ..\..\hi.jpg may tell the simulator to use the file hi.jpg two directories above the directory where this .bms/.bme exist) but I haven't tested it.
%EMAIL [x]
*---a comment header; you can enter your e-mail address, if desired.
%URL [x]
*---a comment header; you can enter your website url address, if desired.
*---ASSIGNMENT HEADER
#WAV** xxx.yyy
*---this is where you specify the keysound file to be stored into a local variable by the simulator, where it will be able to be called upon during the gameplay of the song, and where ** is a two-digit hex value, xxx is the filename, and yyy is the filetype (commonly used are either WAV or MP3 files).
*---In Layman's terms, this is where you'll give the simulator a cardboard sign that says a two-digit number (or letter. explanation later...) and tell it to play SUCH AND SUCH file whenever you tell it to. So, an example would be:
*---#WAV01 kickdrum.wav
*---This means that whenever there's a section in the .bms/.bme that asks for a 01 in the keysound section, the simulator will then play the file kickdrum.wav, under two conditions: (1) IF AND ONLY IF the player actually presses the key, or (2) IF AND ONLY IF the digit called is in the Always-autoplay section.
*---Confused with those new vocabularies? Read on and you'll understand what the hell I'm babbling.
*---The **, or the two-digit number (or letter), ranges from 00 to FF. If you haven't noticed, it's the range of a 2-byte hex value. This means that you can specify up to 255 _different_ keysound files for the simulator to memorize. To assign more variables, just make a new line with changed variable number and filename. Example:
*---#WAV01 kickdrum.wav
*---#WAV02 hi-hats.wav
#BMP** xxx.yyy
*---The #BMP tag has the same idea as the #WAV tag, and also the same usage. The only difference is that the variables will be called in different sections. See the Main Data Field for further explanation.
*---HUGE NOTE, AS IN READ THE BELOW COMMENT BEFORE YOU GO ON
*---HUGE NOTE, AS IN READ THE BELOW COMMENT BEFORE YOU GO ON
*---HUGE NOTE, AS IN READ THE BELOW COMMENT BEFORE YOU GO ON
*---You do NOT need to specify every single variable. That means stop typing 500 lines of specifying nothing. Any unspecified variables will be assumed as "blanks" by the simulator, and when it is called, the simulator will do nothing, if it's a keysound, or the simulator will stop any animation previously and display nothing, if it's a bga.
*----------MAIN DATA FIELD
_THIS_ is the fun part. This section is where all of the keysounds are specified in bits and pieces of measures of the music, and _THIS_ is where you must act like a detective and decipher what the hell each line stands for. Thankfully, I have come with aid. And chips. And guacamole dip.
BACK TO THE POINT
Many of you will see jumbles of nothing but digits in a normal .bms/.bme file, but do you ever wonder how does it work? I'm sure you do, because if you've never wondered so, you won't be reading through here. Or to here, even.
So we will begin, with the explanation. I'll have fun 'splaining as I will 'yping.
'ey! 'ccent 're 'ool! 'nd 'nintelligible 'oo!!! 'o 'ffense.
So here you are, wandering around the main data field, and you see numbers like this.
#00412:00000000000000005F0000001A000000E3
and something like that repeated differently about 3000 times.
Let's begin understanding each section by breaking down the given example line. Obviously you should already understand the #. All codes begin with #. Duh.
# 004 12 :00000000000000005F0000001A000000E3
^
|
|
This is your _Measure #_ . Obviously it ranges from Measure 1 (000) to Measure 1000 (999), but what song have 1000 measures? Hopefully you're not making a .bms/.bme to a nonstop megamix. Anyway, this tells the simulator what's going on in such measure. In this example, there are...12...thing...with a colon and many zeroes and 5F and 1A and E3 here and there in measure 5....interesting. Don't worry; you'll understand those things soon.
Speaking of soon, we're moving right along to the next part. Boy was that quick or what?
# 004 12 :00000000000000005F0000001A000000E3
^
|
|
This is what I like to call KEY LOCATION variable, where it tells the simulator to put those...zeroes...and 5F...and the rest of the garbage into a variable of digit "12."
That didn't make a lot of sense, did it? Of course not. It didn't to me at first, until I deciphered the possible variables of key locations. Below is the list of the KEY LOCATION and its variable two-digit number.
KEYLOCATION - ACTUAL LOCATION/FUNCTION
======================================
11 - White key 1 (Most left)
12 - Blue key 1 (Most left)
13 - White key 2 (Second from the left)
14 - Blue key 2 (Center)
15 - White key 3 (Second from the right)
18 - Blue key 3 (Most right)
19 - White key 4 (Most right)
16 - Scratch (The big circle thing that makes wiki wiki wiki wik wik sound)
17 - •unknown function currently•
04 - BGA
07 - •unknown function currently•
06 - MISS BGA
01 - Always Autoplay
03 - BPM Change
08 - "Advanced" BPM Change
So in the above example, the code 00000000000000005F0000001A000000E3 will all be executed solely for the Blue key 1.
"BUT JACK A. TRADES, I WANNA KNOW HOW THOSE NUMBERS WORK AND WHAT ARE THEY ACTUALLY!?!??!?!/1/1/131'31'3nklnalndkland"
Let's stop the question and start looking at the example below.
# 004 12 :00000000000000005F0000001A000000E3
^ ^
--------------------------------
|
|
_NOT_ simply put, they are the codes that tell the simulator to call up all of the specified variables in a single measure. I lost you, didn't I?
Simply put, in this example, the simulator is told to call the following variables: 00 (8 times), 5F, 00 (3 times), 1A, 00 (3 times), and E3. That means the simulator will first find what you have specified earlier in the ASSIGNMENT HEADER, follow your command, and open/play that file for you at that point of time.
But how should this help you in terms of music? How can you specify exact call locations for the simulator, like a kick drum every beat in a measure, or a hi-hats for every-other-eighth-beat in a measure? This is where the (other) fun part comes in.
The amount of digits available will determine what kind of a note each double-digit is. I lost you again, didn't I?
For (another?) example, if you put a line of code such as this instead of the given example above:
#00412:5F
You're telling the simulator to play the 5F keysound whenever the player presses the blue key 1 at the first beat of measure 5.
HOLY CRAP HOW DID I KNOW THAT!?
Well, if you've studied music, and understand what the hell I was saying earlier, then you must know you only specified one digit for the measure, and that means the simulator will assume that double-digit as a whole note. Remember: 4 beats equal a measure, and a whole note = 4 beats.
So if you specify this instead:
#00412:5F005F00
The simulator will assume each double-digit as _quarter note_ and do the polka. I mean, do its thing. Play 5F in the first beat of the measure, play 00 in the second beat, play 5F in the third and finally play 00 in the fourth.
If I specify:
#00412:001A001A001A001A
I'm telling the simulator to play the 1A in every other sixteenth notes. Get the picture?
¤ THE AMOUNT OF DOUBLE DIGITS AvAILABLE IN THE LINE OF CODE SPECIFIES THE TYPE OF NOTE EACH ARE ¤
If there is one double-digit, it is a whole note.
If there are two double-digits, each double-digit is a half note.
If there are four double-digits, each double-digit is a quarter note.
If there are eight double-digits, each double-digit is a eighth note.
If there are sixteen double-digits, each double-digit is a sixteenth note.
If there are twelve double-digits, each double-digit is a twelveth note.
If there are thirty two double-digits, each double-digit is a thirty-second note.
ET CETERA
The highest note type a simulator can take, usually, is a 192nd note. If you go beyond that, something is wrong with you or the song. Probably you, but you never know.
So let's recap! What does this code actually tell you?
#00412:00000000000000005F0000001A000000E3
• At measure 5 ( #004 = MEASURE #5 ),
• The following variables are to be called in the Blue Key 1 section ( #xxx12 = Blue Key 1 ):
• 00,00,00,00,00,00,00,00,5F,00,00,00,1A,00,00,00,E3
• Where each note is assumed as (in this strange case) a seventeenth note.
• Therefore, the simulator must play the keysound of variable 00 in the first seventeenth note, then another 00 in the second seventeenth note, etc.
And you're done! See, that wasn't so hard, was it? But you think I'm forgetting something. Actually, two things. Well, I'm not, so shut up. That code always apply to everything you see in the KEYLOCATION table, including BGA and Always Autoplay.
The difference in the BGA, however, is that the simulator will load the graphics of the specified variables. So, if you've specified #BMP01 neh.bmp, and you want to call the graphic in a note, then the simulator will _NOT_ play the keysound for 01, but it will instead load the neh.bmp file.
The other and my last point that you think I've forgotten is the actual explanation of the other KEYLOCATION functions. I'll put the table below again for your convenience.
KEYLOCATION - ACTUAL LOCATION/FUNCTION
======================================
11 - White key 1 (Most left)
12 - Blue key 1 (Most left)
13 - White key 2 (Second from the left)
14 - Blue key 2 (Center)
15 - White key 3 (Second from the right)
18 - Blue key 3 (Most right)
19 - White key 4 (Most right)
16 - Scratch (The big circle thing that makes wiki wiki wiki wik wik sound)
17 - •unknown function currently•
04 - BGA
07 - •unknown function currently•
06 - MISS BGA
01 - Always Autoplay
03 - BPM Change
08 - "Extended" BPM Change
So what's 17 and 07 all about? I sure as hell don't know. Perhaps if you know, you would help me out with this tutorial. C'mon; I typed everything you see here, from my brain, in one single session.
Never mind that for now. What's MISS BGA, Always Autoplay, and BPM, you ask?
MISS BGA is where you can specify any custom animations you have when the player is currently missing the notes he's playing. If you want an absolute, easy example, find and download onoken - P8107 bms file with the background, and just miss a couple of notes (or the whole song and failing it, like I did!). You'll see that onoken has incorporated a custom MISS animation.
Of course, if you don't have the patience to make one, you can always specify a single image that has the word MISS in bold, or something. Preferably red, you know.
But nevertheless, to specify them is the exact same as how you would specify BGA or keysounds, but the only hassle is you have to copy and paste the same exact line for each measure you have.
This is also true for my next topic: Always Autoplay. Mostly used in [L7] and usually in [7] keysound files, this baby will make sure any sound (or annoying noises) will always be played even if the player just sits there and watches himself plummet to a Game Over screen. Or something. The usage is a bit different, however. Remember that ¤ THE AMOUNT OF DOUBLE DIGITS AvAILABLE IN THE LINE OF CODE SPECIFIES THE TYPE OF NOTE EACH ARE ¤ rule? Well, it applies to every code you can see, even those beyond the horizon.
So what do you have to do when you want to have two, three, or even four or more keysounds to play at the same exact time? Specify a new line, with different codes! Example is below:
#00001:01
#00001:02
#00001:03
This tells the simulator to play keysounds 01, 02, and 03 at the first note in measure 1. Simple, no?
But when you blame me for forgetting things, you are right for one thing, but ONLY one thing. I forgot to mention the BPM. That lil' bugger is used when you want to suddenly change the BPM value of the song. The usage is still the same, with a little variation.
#01103:96
The lil' code above this paragraph tells the simulator to change the BPm at measure 12 to 150 BPM. So how did I get 150 from 96? Some weird formula like standard deviation of the population mean in a binomial distribution?
Heck no, I got 150 because 96 is the hex value of 150. Let me remind you that 2-byte hex value only goes up to 255 in decimal, so in short, if you're trying to create a .bms/.bme for MaxX Unlimited, where the BPM changes from 300 to 280 to 300 to 150 to 320, we might have a problem. How would you specify a BPM value over 255?
[credit goes to pukpuk/2220 for finding the method originally and jammitch for pointing me to the solution]
You can specify your BPM in the ASSIGNMENT header, as you may recall. The process is the same; the code tag is the only one different. So if you want to specify a BPM of 320, put:
#BPM01 320
And call it in the main data field like:
#00408:01
This will call the BPM Change of 01 in measure 5, and thus changing the song's BPM to 320.
So if you want multiple BPM changes:
#01103:96AFC8E1
This tells the simulator to change the BPM to 150 at the first quarter note of Measure 12, to 175 at second quarter note, 200 at third, and 225 and fourth.
And with that, I conclude this tutorial. Hopefully I have made a tutorial that can actually help you read .bms/.bme more intelligently, and not think of egyptian inscriptions when you see those codes. Until next time, I am Jack A. Trades.
~ let empathy fill the void ~
+16 -16
View File
@@ -1,17 +1,17 @@
BM98Data_format_specification.html = http://www.sun-inet.or.jp/~yaneurao/bm98/bmsformat.html
BM98FinalSecret.html = http://www.sun-inet.or.jp/~yaneurao/bm98/bm98secret.html (Japanese)
tmp.txt = http://unhappyangel.at.infoseek.co.jp/bms/tmp.txt
BMS_Reading_Tutorial.txt = http://www.angelfire.com/ga4/jackatrades606606/BMS_Reading_Tutorial.txt
[BMS Dialects]
Drum BMS: http://wiki.bms.ms/Drum_BMS:Spec (Japanese)
DDR BMS
* http://wiki.bms.ms/DDR_BMS:Spec (Japanese)
* http://www.mni.ne.jp/~asuma/dde/explain.html (Japanese)
* http://homepage1.nifty.com/nickle/ex_format.html (Japanese)
[not in repository but good reading]
http://fileformats.wikia.com/wiki/Be-Music_Script
http://nvyu.net/rdm/rby_ex.php (warning: Korean language material)
http://wiki.bms.ms/Bms:Spec
BM98Data_format_specification.html = http://www.sun-inet.or.jp/~yaneurao/bm98/bmsformat.html
BM98FinalSecret.html = http://www.sun-inet.or.jp/~yaneurao/bm98/bm98secret.html (Japanese)
tmp.txt = http://unhappyangel.at.infoseek.co.jp/bms/tmp.txt
BMS_Reading_Tutorial.txt = http://www.angelfire.com/ga4/jackatrades606606/BMS_Reading_Tutorial.txt
[BMS Dialects]
Drum BMS: http://wiki.bms.ms/Drum_BMS:Spec (Japanese)
DDR BMS
* http://wiki.bms.ms/DDR_BMS:Spec (Japanese)
* http://www.mni.ne.jp/~asuma/dde/explain.html (Japanese)
* http://homepage1.nifty.com/nickle/ex_format.html (Japanese)
[not in repository but good reading]
http://fileformats.wikia.com/wiki/Be-Music_Script
http://nvyu.net/rdm/rby_ex.php (warning: Korean language material)
http://wiki.bms.ms/Bms:Spec
http://wiki.bms.ms/index.php?title=Bms:Format&oldid=1615 (last good revision)

Before

Width:  |  Height:  |  Size: 865 B

After

Width:  |  Height:  |  Size: 849 B

+186 -186
View File
@@ -1,187 +1,187 @@
BMS Format Specification(Remake version.)
Written in June 28th 2003.
original document written by Urao Yane.
edited by U(uhangel4u@yahoo.co.jp)
"BMS" means a Be-Music Source file. A file which has BMS suffix is regarded as the BMS file.
This file format was produced by Urao Yane and NBK in 1998.and It revised sometime.
And I adopted this file format to BM98, Delight Delight Reduplication, MixWaver, nazoBMPlay and so on.
Now,anyone can use this format freely.
BM98 Drink Edition
http://www5c.biglobe.ne.jp/~kbs/bm98/ (Japanese)
Delight Delight Reduplicaton
http://nickle.hey.to/ (Japanese)
MixWaver
http://hello.to/mixwaver/ (Korean)
nazoBMPlay
http://www.nothing.sh/nazobmplay/ (Japanese)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
<Command Line>
The line begining at '#' is the command line. All the rest are ignored (use for comments).
And this BMS file is compiled at runtime , so you can order any lines freely.
And there is no difference in the command line between using a capital letter or not.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
<Header>
#PLAYER [1-4]
#PLAYER 1
This data is for Single Play.
#PLAYER 2
This data is for Two Players.
#PLAYER 3
This data is for Double Play.
#PLAYER 4
This data is for Two Players.(Players will plays same sequence)
#GENRE xxxxxxxx
Definition of Genre.
#TITLE xxxxxxxx
Definition of Title.
#ARTIST xxxxxxxx
Definition of Artist.
#BPM xxx
Definition of BPM.(Beats Per Minite) at the top of music. default : 130 value type : double.
#MIDIFILE xxxxxxx.mid
Background music by MIDI.but,It's not recommend.
#PLAYLEVEL x
Information of Game Level for player.
#RANK [0-3]
judgement level.
x = 0 :very hard, 1: hard, 2: normal, 3: easy default : 2
#VOLWAV xxx
relative volume control (percentage)
#TOTAL xxx
increments of Groove Gauge
ex.
#TOTAL 120
It means when all sequence was played over great, Groove Gauge's value is 120%
#WAVxx yyyyyyyy.wav(or .mp3)
definition of Wave Data. xx : 01 to FZ(01-09-0A-0Z-10-1Z...) , yyyyyyyy.wav : wave file name
When use mp3 files,you need mp3 CODEC.
e.g.
#WAV01 HOUSE01.WAV // assign HOUSE01.WAV to 01 wav
#WAV02 HOUSE02.WAV // assign HOUSE02.WAV to 02 wav
#WAVFZ HOUSE03.mp3 // assign HOUSE03.mp3 to FZ wav
#BMPxx yyyyyyyy.bmp(or gif,jpg,png)
definition of Bitmap file. xx : 01 to FF(Hex) , yyyyyyyy.bmp : bitmap file name
Bitmap size must be 256 * 256.(max color 65536)
If you use "gif or jpg or png", with Susie Plug-in.
gif : ifgif.spi jpg : ifjpg.spi png : ifpng.spi
About Susie Plug-ins : http://www.digitalpad.co.jp/~takechin/
e.g.
#BMP01 HOUSE01.BMP // assign HOUSE01.BMP to 01 bitmap
#BMP02 HOUSE02.BMP // assign HOUSE02.BMP to 02 bitmap
#BMPEE HOUSE03.PNG // assign HOUSE03.PNG to EE bitmap
#StageFile xxxx.bmp(or gif,jpg,png)
Show assigned Picture when loading bitmaps,wavs and compiling bms.
#BPMxx yyy
Use to change BPM(Beats Per Minite). xx : 01 to ff(Hex)
But ,the bitmap defined by #BMP00 is something special.
This bitmap shows when a player do a poor play.
#STOPxx yyy
Use to stop sequence. xx : 01 to ff(Hex)
yyy : a quarter note = 48
an eighth note = 24
a whole note = 192
note / n = 192/n
#CDDA xx
Audio cds Track No.
#BackBMP xxxx.bmp(or gif,jpg,png)
Set BackGround Picture.(size:640*480)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// a sample of random loading function
#random 2 // create a random number (1 or 2)
#if 1 // if the number was equal to 1 then...
#00111:31313131 // this is effective...
#endif
#if 2 // if the number was equal to 2 then...
#00113:32003232 // this is effective
#endif
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
<Channel Messages>
#aaabb:cccccccc
aaa: track number (from 000 to 999)
bb : channel number where you want to send message.(from 00 to FF)
cccccccc : <message>
<a brief Channel Number>
01 : BGM(background music by WAVE)
02 : shortening note.
03 : changing a Tempo[1-255]
04 : BGA(background animation)
06 : changing Poor-bitmap
07 : BGA Layer.
08 : Extended BPM(Use assigned of #BPMxx)
09 : Stop the sequence(Use assigned of #STOPxx)
11 to 19 : Object Channel of 1 player side
21 to 29 : Object Channel of 2 player side
31 to 39 : Can't show Object Channel of 1 player side
41 to 49 : Can't show Object Channel of 2 player side
51 to 59 : Long note Object Channel of 1 player side
61 to 69 : Long note Object Channel of 2 player side
<Example>
#00211:03030303
This means 4 objects at the left of 1 player side in 002 track.
This object is assigned to wave No.03 which was defined by #WAV03 xxxx.wav.
And this 4 objects are arranged evenly in this track.
Please try the following patterns.
#00211:0303030303
#00211:0303000303
#00211:010101
#00211:00020202
P.S.
#00202:0.5 : Track2 have Half length.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
This document and this format is free!
I hope the day will come when my BMS format will use all over the world.
BMS Format Specification(Remake version.)
Written in June 28th 2003.
original document written by Urao Yane.
edited by U(uhangel4u@yahoo.co.jp)
"BMS" means a Be-Music Source file. A file which has BMS suffix is regarded as the BMS file.
This file format was produced by Urao Yane and NBK in 1998.and It revised sometime.
And I adopted this file format to BM98, Delight Delight Reduplication, MixWaver, nazoBMPlay and so on.
Now,anyone can use this format freely.
BM98 Drink Edition
http://www5c.biglobe.ne.jp/~kbs/bm98/ (Japanese)
Delight Delight Reduplicaton
http://nickle.hey.to/ (Japanese)
MixWaver
http://hello.to/mixwaver/ (Korean)
nazoBMPlay
http://www.nothing.sh/nazobmplay/ (Japanese)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
<Command Line>
The line begining at '#' is the command line. All the rest are ignored (use for comments).
And this BMS file is compiled at runtime , so you can order any lines freely.
And there is no difference in the command line between using a capital letter or not.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
<Header>
#PLAYER [1-4]
#PLAYER 1
This data is for Single Play.
#PLAYER 2
This data is for Two Players.
#PLAYER 3
This data is for Double Play.
#PLAYER 4
This data is for Two Players.(Players will plays same sequence)
#GENRE xxxxxxxx
Definition of Genre.
#TITLE xxxxxxxx
Definition of Title.
#ARTIST xxxxxxxx
Definition of Artist.
#BPM xxx
Definition of BPM.(Beats Per Minite) at the top of music. default : 130 value type : double.
#MIDIFILE xxxxxxx.mid
Background music by MIDI.but,It's not recommend.
#PLAYLEVEL x
Information of Game Level for player.
#RANK [0-3]
judgement level.
x = 0 :very hard, 1: hard, 2: normal, 3: easy default : 2
#VOLWAV xxx
relative volume control (percentage)
#TOTAL xxx
increments of Groove Gauge
ex.
#TOTAL 120
It means when all sequence was played over great, Groove Gauge's value is 120%
#WAVxx yyyyyyyy.wav(or .mp3)
definition of Wave Data. xx : 01 to FZ(01-09-0A-0Z-10-1Z...) , yyyyyyyy.wav : wave file name
When use mp3 files,you need mp3 CODEC.
e.g.
#WAV01 HOUSE01.WAV // assign HOUSE01.WAV to 01 wav
#WAV02 HOUSE02.WAV // assign HOUSE02.WAV to 02 wav
#WAVFZ HOUSE03.mp3 // assign HOUSE03.mp3 to FZ wav
#BMPxx yyyyyyyy.bmp(or gif,jpg,png)
definition of Bitmap file. xx : 01 to FF(Hex) , yyyyyyyy.bmp : bitmap file name
Bitmap size must be 256 * 256.(max color 65536)
If you use "gif or jpg or png", with Susie Plug-in.
gif : ifgif.spi jpg : ifjpg.spi png : ifpng.spi
About Susie Plug-ins : http://www.digitalpad.co.jp/~takechin/
e.g.
#BMP01 HOUSE01.BMP // assign HOUSE01.BMP to 01 bitmap
#BMP02 HOUSE02.BMP // assign HOUSE02.BMP to 02 bitmap
#BMPEE HOUSE03.PNG // assign HOUSE03.PNG to EE bitmap
#StageFile xxxx.bmp(or gif,jpg,png)
Show assigned Picture when loading bitmaps,wavs and compiling bms.
#BPMxx yyy
Use to change BPM(Beats Per Minite). xx : 01 to ff(Hex)
But ,the bitmap defined by #BMP00 is something special.
This bitmap shows when a player do a poor play.
#STOPxx yyy
Use to stop sequence. xx : 01 to ff(Hex)
yyy : a quarter note = 48
an eighth note = 24
a whole note = 192
note / n = 192/n
#CDDA xx
Audio cds Track No.
#BackBMP xxxx.bmp(or gif,jpg,png)
Set BackGround Picture.(size:640*480)
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// a sample of random loading function
#random 2 // create a random number (1 or 2)
#if 1 // if the number was equal to 1 then...
#00111:31313131 // this is effective...
#endif
#if 2 // if the number was equal to 2 then...
#00113:32003232 // this is effective
#endif
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
<Channel Messages>
#aaabb:cccccccc
aaa: track number (from 000 to 999)
bb : channel number where you want to send message.(from 00 to FF)
cccccccc : <message>
<a brief Channel Number>
01 : BGM(background music by WAVE)
02 : shortening note.
03 : changing a Tempo[1-255]
04 : BGA(background animation)
06 : changing Poor-bitmap
07 : BGA Layer.
08 : Extended BPM(Use assigned of #BPMxx)
09 : Stop the sequence(Use assigned of #STOPxx)
11 to 19 : Object Channel of 1 player side
21 to 29 : Object Channel of 2 player side
31 to 39 : Can't show Object Channel of 1 player side
41 to 49 : Can't show Object Channel of 2 player side
51 to 59 : Long note Object Channel of 1 player side
61 to 69 : Long note Object Channel of 2 player side
<Example>
#00211:03030303
This means 4 objects at the left of 1 player side in 002 track.
This object is assigned to wave No.03 which was defined by #WAV03 xxxx.wav.
And this 4 objects are arranged evenly in this track.
Please try the following patterns.
#00211:0303030303
#00211:0303000303
#00211:010101
#00211:00020202
P.S.
#00202:0.5 : Track2 have Half length.
-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
This document and this format is free!
I hope the day will come when my BMS format will use all over the world.
Urao Yane

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 4.9 KiB

+310 -310
View File
@@ -1,311 +1,311 @@
This text was taken from Dance With Intensity's README file, accessed online at
http://dwi.ddruk.com/readme.php#4
It has been reformatted to fit 80 characters in a line, except when necessary.
-------------------------------------------------------------------------------
4. DWI FILE FORMAT
Steps
DWI uses step-files that are similar to the ".MSD" file format. However, there
are new additions and some tags are treated slightly differently, so the
extension was changed to avoid confusion. DWI files with these new additions
will not work properly in other simulators.
Step-patterns are defined in the same way as .MSD files - use the numeric
keypad as a reference for most patterns:
7=U+L 8=U 9=U+R
4=L 6=R
1=D+L 2=D 3=D+R
(U+D = A and L+R = B)
A '0' indicates no step. Each character defaults to one 1/8 of a beat. Surround
a series of characters with the following brackets to change the rate at which
the steps come:
(...) = 1/16 steps
[...] = 1/24 steps
{...} = 1/64 steps
`...' = 1/192 steps
6-panel (Solo) mode uses additional characters:
-\---- = C
----/- = D
L\---- = E
-\D--- = F
-\-U-- = G
-\---R = H
L---/- = I
--D-/- = J
---U/- = K
----/R = L
-\--/- = M
To do more than 2 panels at a time, you can join codes together with the "<..>"
object, and they will all count as the same beat. So, to do a jump that involves
Left, Right, Up-Left, and Up-Right, you could do:
-\--/- = M
L----R = B
======
L\--/R = <MB> (or <LE>, <IH>, <46M>, etc.)
MSD files from other simulators will work with DWI, with a change in the 'GAP'
value being the only change usually necessary. DWI calculates the 'GAP' value
differently than other simulators that use the MSD format.
DWI does not support the BMS file format. There is a utility available that can
convert any BMS file into DWI format. Each song only requires one DWI file for
all of its steps, so if you are converting BMS files please remember that all
the different difficulties of step patterns will be contained in the same DWI
file.
Hold Arrows
In the DWI file format a hold arrow is signified with the ! symbol. The string
8!8 will begin an 'up' hold arrow, and the arrow will be released the next time
the program encounters an 'up' arrow: by itself or combined with another arrow
(7, 8, 9, A, etc.) The characters 7!4 would show both 'up' and 'left' arrows but
only the left arrow would be held. The format could best be described as
"show!hold".
Tags
These tags should be in every DWI file:
#TITLE:...; title of the song.
#ARTIST:...; artist of the song.
#GAP:...; number of milliseconds that pass before the program starts counting beats. Used to sync the steps to the music.
#BPM:...; BPM of the music
Additionally, the following tags can be given:
#DISPLAYTITLE:...; provides an alternate version of the song name that can also include special characters.
#DISPLAYARTIST:...; provides an alternate version of the artist name that can also include special characters.
Special Characters are denoted by giving filenames in curly-brackets.
eg. #DISPLAYTITLE:The {kanji.png} Song;
The extra character files should be 50 pixels high and be black-and-white.
The baseline for the font should be 34 pixels from the top.
#DISPLAYBPM:...; tells DWI to display the BPM on the song select screen in a user-defined way. Options can be:
* - BPM cycles randomly
a - BPM stays set at 'a' value (no cycling)
a..b - BPM cycles between 'a' and 'b' values
#FILE:...; path to the music file to play (eg. /music/mysongs/abc.mp3 )
(NB: if the file is not found, a .wav or .mp3 file in the same folder as the DWI file is used)
#MD5:...; an MD5 string for the music file. Helps ensure that same music file is used on all systems.
#FREEZE:...; a value of the format "BBB=sss". Indicates that at 'beat' "BBB", the motion of the arrows should stop for "sss" milliseconds. Turn on beat-display in the System menu to help determine what values to use. Multiple freezes can be given by separating them with commas.
#CHANGEBPM:...; a value of the format "BBB=nnn". Indicates that at 'beat' "BBB", the speed of the arrows will change to reflect a new BPM of "nnn". Multiple BPM changes can be given by separating them with commas.
#STATUS:...; can be "NEW" or "NORMAL". Changes the display of songs on the song-select screen.
#GENRE:...; a genre to assign to the song if "sort by Genre" is selected in the System Options. Multiple Genres can be given by separating them with commas.
#CDTITLE:...; points to a small graphic file (64x40) that will display in the song selection screen in the bottom right of the background, showing which CD the song is from. The colour of the pixel in the upper-left will be made transparent.
#SAMPLESTART:...; the time in the music file that the preview music should start at the song-select screen. Can be given in Milliseconds (eg. 5230), Seconds (eg. 5.23), or minutes (eg. 0:05.23). Prefix the number with a "+" to factor in the GAP value.
#SAMPLELENGTH:...; how long to play the preview music for at the song-select screen. Can be in milliseconds, seconds, or minutes.
#RANDSEED:x; provide a number that will influence what AVIs DWI picks and their order. Will be the same animation each time if AVI filenames and count doesn't change (default is random each time).
#RANDSTART:x; tells DWI what beat to start the animations on. Default is 32.
#RANDFOLDER:...; tells DWI to look in another folder when choosing AVIs, allowing 'themed' folders.
#RANDLIST:...; a list of comma-separated filenames to use in the folder.
Each pattern of steps for different modes have the same basic format:
#SINGLE:BASIC:X:...;
^ ^ ^ ^
| | | + step patterns. In doubles, the left pad's steps are given first,
| | | then the right pad's, separated by a colon (:).
| | |
| | + difficulty rating. Should be 1 or higher.
| |
| + Difficulty. Can be one of "BASIC", "ANOTHER", "MANIAC", or "SMANIAC"
|
+ Style. Can be one of "SINGLE", "DOUBLE", "COUPLE", or "SOLO". "COUPLE" is
Battle-mode steps.
Comments can be used by using "//". Everything after this on the same line in
the file will be ignored.
Background Animations, Movies, and Visualizations
DWI allows for background animations using a special script within the
step-file. A script consists of static images, animated images, and/or an AVI
movie. Using the script, you can create a variety of layered effects. A sample
animation is described below:
#BACKGROUND:
M:MOVIE:.\movies\sfx.avi STARTAT:-1.0 LAYER:0;
V:VIS:.\Vis\somevis.svp LAYER:0;
E:FILE:.\anim\equalizer.png ANIMATE:10,33 POSITION:-33,0 SPACING:40,40 LAYER:1;
D:FILE:.\anim\dancer-m1.png ANIMATE:24,66 SIZE:2 MULT:0,0.5,1 SPACING:30,30 LAYER:1;
X:LAYER:1 OFF;
SCRIPT:M.......................
................E...............
D...............X,V...............E...............D...............
X,M...............E...............D...............X,V...............
E...............D...............X,M...............E...............
D...............X,V...............E...............D...............
X,M...............E...............D...............X;
#END;
The first part of the "BACKGROUND" definition defines the effects. Each effect is attributed to a letter or number ("a-z", "A-Z", "1-9"). The format for defining an effect is:
The first four tags cannot be used together...
FILE: path to a file. Either a still image, or an animation (multiple frames of animation are stacked *vertically* in the image).
MOVIE: path to a standard Windows AVI file. Note that the movie won't play unless you have the right codecs installed in Windows. Movies are currently stretched to fill the whole screen.
VIS: path to a Sonique Visualization plug-in (SVP). Visualizations are currently stretched to fill the whole screen and are always put on Layer 0, and no other commands will affect it.
OFF turns off a layer, effectively making it invisible. Will not turn off layer 0.
LAYER:l the layer to use (required):
0 - base layer.
(Image/Movie is always tiled and SPACING is ignored).
1 - overlay layer
2 - overlay layer
3 - overlay layer
STARTAT:t number of seconds into the AVI file to start at. If negative, the movie will wait that many seconds before playing. Can be decimal (eg. 1.3 = 1300ms).
MULT:r,g,b Red, Green, and Blue pixels in the image/movie are tinted by the given amounts. This way the same image/movie can be used multiple times across DWI files and have different colours.
ANIMATE:f,n1,n2,...nF indicates that the FILE contains multiple frames of animation. "f" is the number of frames of animation. Each following value is the number of milliseconds each frame of animation is displayed. If not enough time-values are given, the last given value is used. Ignored for MOVIE type.
MOVE:x,y the image/movie is moved by the given number of pixels every millisecond.
SPACING:x,y images are always tiled if they don't fill up the screen. This tag allows you to add some spacing between the images by the given number of pixels horizontally and vertically (Layer > 0)
SIZE:s multiplies the image size by 's' in both directions. Must be a whole number.
KEEPPOS normally when a new effect is turned on, its position is reset. This tag keeps the layer where it is, useful for keeping images moving smoothly.
KEEPTIME (MOVIEs only) normally when a movie starts, it starts from the beginning or the time given in the "STARTAT" tag. Adding this tag will keep it playing so when that layer is enabled again, it will have kept going.
Following the effect definition, comes the actual animation script. This is a
sequence of characters in a similar way as the step-patterns are given - each
character normally is 1/8 of a beat, though brackets can be used to change the
time-values. In this way, background animations can be syched to the steps.
It is suggested that the steps for "SINGLE:BASIC" are copied to after the
"SCRIPT:" tag, and then the effects be set. In this way one knows that the
script will match the same length of the music.
The animations take effect as that point in the song is reached. Multiple
effects can occur at the same time if they are separated with a comma. A period
(.) means no new effect should take place at that point. A zero (0) turns off
all effects and returns the background to the original graphic.
More Information
Please check our website for more information and links to useful resources.
5. NONSTOP MODE AND CRS FILE FORMAT
DWI uses special CRS files that should be put in subfolders of the "Courses"
directory. Now courses can be shared with others if they have the same files and
directory structure as you.
CRS files are similar to DWI files in structure. The file defines the basic
details about the course, such as its name and which songs should be played.
Currently these tags are supported:
Required tags:
#COURSE:...; the name of the course.
#DISPLAYCOURSE:...; alternate name of course that can include special characters. Similar to #DISPLAYTITLE and #DISPLAYARTIST in DWI files.
#SONG:...; defines a song in the course. This can either be a selection from the Player's Best (or Worst), a Random stage or a predefined stage. The syntax for each is given below:
PLAYER'S BEST/WORST STAGE:
#SONG:BESTx:[BASIC|ANOTHER|MANAIC|SMANIAC];
#SONG:WORSTx:[BASIC|ANOTHER|MANAIC|SMANIAC];
- choose a song with the given index 'x'. So BEST1 is the most popular
song, and WORST5 is the 5th least popular song. If the given
difficulty is not available, DWI will choose the next closest difficulty.
Songs that are equally popular will be put in random order.
RANDOM STAGE:
#SONG:*:[a]|[a..b];
- choose a random song, with a difficulty rating equal to or between 'a' and 'b'.
- if only 'a' is given, 'b' is assumed to be the same as 'a'.
#SONG:*:[BASIC|ANOTHER|MANIAC|SMANAIC];
- choose a random song with a given difficulty level.
#SONG:folder\*:[a]|[a..b]|[BASIC|ANOTHER|MANIAC|SMANIAC];
- choose a random song from a given folder.
DEFINED STAGE:
#SONG:<FOLDER>\<SONG TITLE>:<DIFFICULTY>;
- will use a song from <FOLDER> with the given title.
So to play a song called "My Song", which is in
'./Songs/Default/mysong/mysong.dwi', on MANIAC,
you would say:
#SONG:Default\My Song:MANIAC;
NB: Either the TITLE or folder the DWI file is in can be used.
In addition, modifiers can be defined for each song by adding a list of
comma-separated values to the end of the #SONG line. These modifiers are the
same as listed above, plus
xRANDOM - where 'x' is the number of random effects to apply.
'x' can be 1 to 7.
AWARDx - where 'x' is the number of lives to award after
finishing the stage.
So to play "My Song", Maniac, with 2.0x, Left, Hidden, and with one random
effect, use:
#SONG:Default\My Song:MANIAC:2.0x,LEFT,HIDDEN,1RANDOM;
Optional tags:
#REPEAT:...; can be "YES" or "NO". If set, starts course over from the beginning after last song.
#COMBO:PERFECT; during play, the combo counter will only go up if a "PERFECT" is made.
#COMBOMODE:1; sets how much is added to the combo counter for jumps. Can be 1 or 2.
#LIVES:4; sets the number of 'lives' given to each player at the start of game play. After each stage is cleared, a given number of lives is added, either by a value specified by the "AWARDx" tag in the CRS file, or using the scale below:
Song was 6 feet or less - 1 life.
Song was 7 or 8 feet - 2 lives.
Song was 9 feet or more - 3 lives.
At the course selection screen, courses that have songs without steps for the
current style (SINGLE, DOUBLE, etc) will be filtered out. Courses are loaded
when DWI starts.
6. LRC (LYRICS) FILE FORMAT
DWI can display lyrics during a song if it finds a .LRC file in the same folder
as the step-file. The file should have the same file-base as the .DWI file -
so, for example, if your DWI file is called "mysong.dwi", the lyrics file should
be called "mysong.lrc".
This file is a simple text-file that tells the program what text to display and
when. It can also define the colour the text is displayed in.
Each line starts with a tag in the format [xxxxxx]. Currently, these tags are
supported:
[COLOUR] Sets the colour for the following text. After the tag, a colour value is given in hex (ie. yellow would be 0xFFFF00). Up to 10 colour values can be given, separated by commas.
[offset:xxxx] Makes timestamps following this tag have their times adjusted by 'xxxx' milliseconds. Use to fine-tune timings for lyrics.
[MM:SS.ss] Sets a time.
The text following the tag will be shown on the screen after this
time has passed, replacing any text that was there before. To clear text,
provide just a tag with no text after it.
A line-break can be defined using the pipe "|" symbol.
A new colour can be selected from the defined colours by using "{cX}", where
"X" is a number from 0 to 9.
Sample LRC file:
[0:00.00]aye-aye-aye|aye-aye-aye|aye-aye-aye
[0:05.30]Where's my samurai?
[0:07.00]
[COLOUR]0xffff00
[0:13.50]I've been searching for a man
[0:16.00]All across Japan.
This text was taken from Dance With Intensity's README file, accessed online at
http://dwi.ddruk.com/readme.php#4
It has been reformatted to fit 80 characters in a line, except when necessary.
-------------------------------------------------------------------------------
4. DWI FILE FORMAT
Steps
DWI uses step-files that are similar to the ".MSD" file format. However, there
are new additions and some tags are treated slightly differently, so the
extension was changed to avoid confusion. DWI files with these new additions
will not work properly in other simulators.
Step-patterns are defined in the same way as .MSD files - use the numeric
keypad as a reference for most patterns:
7=U+L 8=U 9=U+R
4=L 6=R
1=D+L 2=D 3=D+R
(U+D = A and L+R = B)
A '0' indicates no step. Each character defaults to one 1/8 of a beat. Surround
a series of characters with the following brackets to change the rate at which
the steps come:
(...) = 1/16 steps
[...] = 1/24 steps
{...} = 1/64 steps
`...' = 1/192 steps
6-panel (Solo) mode uses additional characters:
-\---- = C
----/- = D
L\---- = E
-\D--- = F
-\-U-- = G
-\---R = H
L---/- = I
--D-/- = J
---U/- = K
----/R = L
-\--/- = M
To do more than 2 panels at a time, you can join codes together with the "<..>"
object, and they will all count as the same beat. So, to do a jump that involves
Left, Right, Up-Left, and Up-Right, you could do:
-\--/- = M
L----R = B
======
L\--/R = <MB> (or <LE>, <IH>, <46M>, etc.)
MSD files from other simulators will work with DWI, with a change in the 'GAP'
value being the only change usually necessary. DWI calculates the 'GAP' value
differently than other simulators that use the MSD format.
DWI does not support the BMS file format. There is a utility available that can
convert any BMS file into DWI format. Each song only requires one DWI file for
all of its steps, so if you are converting BMS files please remember that all
the different difficulties of step patterns will be contained in the same DWI
file.
Hold Arrows
In the DWI file format a hold arrow is signified with the ! symbol. The string
8!8 will begin an 'up' hold arrow, and the arrow will be released the next time
the program encounters an 'up' arrow: by itself or combined with another arrow
(7, 8, 9, A, etc.) The characters 7!4 would show both 'up' and 'left' arrows but
only the left arrow would be held. The format could best be described as
"show!hold".
Tags
These tags should be in every DWI file:
#TITLE:...; title of the song.
#ARTIST:...; artist of the song.
#GAP:...; number of milliseconds that pass before the program starts counting beats. Used to sync the steps to the music.
#BPM:...; BPM of the music
Additionally, the following tags can be given:
#DISPLAYTITLE:...; provides an alternate version of the song name that can also include special characters.
#DISPLAYARTIST:...; provides an alternate version of the artist name that can also include special characters.
Special Characters are denoted by giving filenames in curly-brackets.
eg. #DISPLAYTITLE:The {kanji.png} Song;
The extra character files should be 50 pixels high and be black-and-white.
The baseline for the font should be 34 pixels from the top.
#DISPLAYBPM:...; tells DWI to display the BPM on the song select screen in a user-defined way. Options can be:
* - BPM cycles randomly
a - BPM stays set at 'a' value (no cycling)
a..b - BPM cycles between 'a' and 'b' values
#FILE:...; path to the music file to play (eg. /music/mysongs/abc.mp3 )
(NB: if the file is not found, a .wav or .mp3 file in the same folder as the DWI file is used)
#MD5:...; an MD5 string for the music file. Helps ensure that same music file is used on all systems.
#FREEZE:...; a value of the format "BBB=sss". Indicates that at 'beat' "BBB", the motion of the arrows should stop for "sss" milliseconds. Turn on beat-display in the System menu to help determine what values to use. Multiple freezes can be given by separating them with commas.
#CHANGEBPM:...; a value of the format "BBB=nnn". Indicates that at 'beat' "BBB", the speed of the arrows will change to reflect a new BPM of "nnn". Multiple BPM changes can be given by separating them with commas.
#STATUS:...; can be "NEW" or "NORMAL". Changes the display of songs on the song-select screen.
#GENRE:...; a genre to assign to the song if "sort by Genre" is selected in the System Options. Multiple Genres can be given by separating them with commas.
#CDTITLE:...; points to a small graphic file (64x40) that will display in the song selection screen in the bottom right of the background, showing which CD the song is from. The colour of the pixel in the upper-left will be made transparent.
#SAMPLESTART:...; the time in the music file that the preview music should start at the song-select screen. Can be given in Milliseconds (eg. 5230), Seconds (eg. 5.23), or minutes (eg. 0:05.23). Prefix the number with a "+" to factor in the GAP value.
#SAMPLELENGTH:...; how long to play the preview music for at the song-select screen. Can be in milliseconds, seconds, or minutes.
#RANDSEED:x; provide a number that will influence what AVIs DWI picks and their order. Will be the same animation each time if AVI filenames and count doesn't change (default is random each time).
#RANDSTART:x; tells DWI what beat to start the animations on. Default is 32.
#RANDFOLDER:...; tells DWI to look in another folder when choosing AVIs, allowing 'themed' folders.
#RANDLIST:...; a list of comma-separated filenames to use in the folder.
Each pattern of steps for different modes have the same basic format:
#SINGLE:BASIC:X:...;
^ ^ ^ ^
| | | + step patterns. In doubles, the left pad's steps are given first,
| | | then the right pad's, separated by a colon (:).
| | |
| | + difficulty rating. Should be 1 or higher.
| |
| + Difficulty. Can be one of "BASIC", "ANOTHER", "MANIAC", or "SMANIAC"
|
+ Style. Can be one of "SINGLE", "DOUBLE", "COUPLE", or "SOLO". "COUPLE" is
Battle-mode steps.
Comments can be used by using "//". Everything after this on the same line in
the file will be ignored.
Background Animations, Movies, and Visualizations
DWI allows for background animations using a special script within the
step-file. A script consists of static images, animated images, and/or an AVI
movie. Using the script, you can create a variety of layered effects. A sample
animation is described below:
#BACKGROUND:
M:MOVIE:.\movies\sfx.avi STARTAT:-1.0 LAYER:0;
V:VIS:.\Vis\somevis.svp LAYER:0;
E:FILE:.\anim\equalizer.png ANIMATE:10,33 POSITION:-33,0 SPACING:40,40 LAYER:1;
D:FILE:.\anim\dancer-m1.png ANIMATE:24,66 SIZE:2 MULT:0,0.5,1 SPACING:30,30 LAYER:1;
X:LAYER:1 OFF;
SCRIPT:M.......................
................E...............
D...............X,V...............E...............D...............
X,M...............E...............D...............X,V...............
E...............D...............X,M...............E...............
D...............X,V...............E...............D...............
X,M...............E...............D...............X;
#END;
The first part of the "BACKGROUND" definition defines the effects. Each effect is attributed to a letter or number ("a-z", "A-Z", "1-9"). The format for defining an effect is:
The first four tags cannot be used together...
FILE: path to a file. Either a still image, or an animation (multiple frames of animation are stacked *vertically* in the image).
MOVIE: path to a standard Windows AVI file. Note that the movie won't play unless you have the right codecs installed in Windows. Movies are currently stretched to fill the whole screen.
VIS: path to a Sonique Visualization plug-in (SVP). Visualizations are currently stretched to fill the whole screen and are always put on Layer 0, and no other commands will affect it.
OFF turns off a layer, effectively making it invisible. Will not turn off layer 0.
LAYER:l the layer to use (required):
0 - base layer.
(Image/Movie is always tiled and SPACING is ignored).
1 - overlay layer
2 - overlay layer
3 - overlay layer
STARTAT:t number of seconds into the AVI file to start at. If negative, the movie will wait that many seconds before playing. Can be decimal (eg. 1.3 = 1300ms).
MULT:r,g,b Red, Green, and Blue pixels in the image/movie are tinted by the given amounts. This way the same image/movie can be used multiple times across DWI files and have different colours.
ANIMATE:f,n1,n2,...nF indicates that the FILE contains multiple frames of animation. "f" is the number of frames of animation. Each following value is the number of milliseconds each frame of animation is displayed. If not enough time-values are given, the last given value is used. Ignored for MOVIE type.
MOVE:x,y the image/movie is moved by the given number of pixels every millisecond.
SPACING:x,y images are always tiled if they don't fill up the screen. This tag allows you to add some spacing between the images by the given number of pixels horizontally and vertically (Layer > 0)
SIZE:s multiplies the image size by 's' in both directions. Must be a whole number.
KEEPPOS normally when a new effect is turned on, its position is reset. This tag keeps the layer where it is, useful for keeping images moving smoothly.
KEEPTIME (MOVIEs only) normally when a movie starts, it starts from the beginning or the time given in the "STARTAT" tag. Adding this tag will keep it playing so when that layer is enabled again, it will have kept going.
Following the effect definition, comes the actual animation script. This is a
sequence of characters in a similar way as the step-patterns are given - each
character normally is 1/8 of a beat, though brackets can be used to change the
time-values. In this way, background animations can be syched to the steps.
It is suggested that the steps for "SINGLE:BASIC" are copied to after the
"SCRIPT:" tag, and then the effects be set. In this way one knows that the
script will match the same length of the music.
The animations take effect as that point in the song is reached. Multiple
effects can occur at the same time if they are separated with a comma. A period
(.) means no new effect should take place at that point. A zero (0) turns off
all effects and returns the background to the original graphic.
More Information
Please check our website for more information and links to useful resources.
5. NONSTOP MODE AND CRS FILE FORMAT
DWI uses special CRS files that should be put in subfolders of the "Courses"
directory. Now courses can be shared with others if they have the same files and
directory structure as you.
CRS files are similar to DWI files in structure. The file defines the basic
details about the course, such as its name and which songs should be played.
Currently these tags are supported:
Required tags:
#COURSE:...; the name of the course.
#DISPLAYCOURSE:...; alternate name of course that can include special characters. Similar to #DISPLAYTITLE and #DISPLAYARTIST in DWI files.
#SONG:...; defines a song in the course. This can either be a selection from the Player's Best (or Worst), a Random stage or a predefined stage. The syntax for each is given below:
PLAYER'S BEST/WORST STAGE:
#SONG:BESTx:[BASIC|ANOTHER|MANAIC|SMANIAC];
#SONG:WORSTx:[BASIC|ANOTHER|MANAIC|SMANIAC];
- choose a song with the given index 'x'. So BEST1 is the most popular
song, and WORST5 is the 5th least popular song. If the given
difficulty is not available, DWI will choose the next closest difficulty.
Songs that are equally popular will be put in random order.
RANDOM STAGE:
#SONG:*:[a]|[a..b];
- choose a random song, with a difficulty rating equal to or between 'a' and 'b'.
- if only 'a' is given, 'b' is assumed to be the same as 'a'.
#SONG:*:[BASIC|ANOTHER|MANIAC|SMANAIC];
- choose a random song with a given difficulty level.
#SONG:folder\*:[a]|[a..b]|[BASIC|ANOTHER|MANIAC|SMANIAC];
- choose a random song from a given folder.
DEFINED STAGE:
#SONG:<FOLDER>\<SONG TITLE>:<DIFFICULTY>;
- will use a song from <FOLDER> with the given title.
So to play a song called "My Song", which is in
'./Songs/Default/mysong/mysong.dwi', on MANIAC,
you would say:
#SONG:Default\My Song:MANIAC;
NB: Either the TITLE or folder the DWI file is in can be used.
In addition, modifiers can be defined for each song by adding a list of
comma-separated values to the end of the #SONG line. These modifiers are the
same as listed above, plus
xRANDOM - where 'x' is the number of random effects to apply.
'x' can be 1 to 7.
AWARDx - where 'x' is the number of lives to award after
finishing the stage.
So to play "My Song", Maniac, with 2.0x, Left, Hidden, and with one random
effect, use:
#SONG:Default\My Song:MANIAC:2.0x,LEFT,HIDDEN,1RANDOM;
Optional tags:
#REPEAT:...; can be "YES" or "NO". If set, starts course over from the beginning after last song.
#COMBO:PERFECT; during play, the combo counter will only go up if a "PERFECT" is made.
#COMBOMODE:1; sets how much is added to the combo counter for jumps. Can be 1 or 2.
#LIVES:4; sets the number of 'lives' given to each player at the start of game play. After each stage is cleared, a given number of lives is added, either by a value specified by the "AWARDx" tag in the CRS file, or using the scale below:
Song was 6 feet or less - 1 life.
Song was 7 or 8 feet - 2 lives.
Song was 9 feet or more - 3 lives.
At the course selection screen, courses that have songs without steps for the
current style (SINGLE, DOUBLE, etc) will be filtered out. Courses are loaded
when DWI starts.
6. LRC (LYRICS) FILE FORMAT
DWI can display lyrics during a song if it finds a .LRC file in the same folder
as the step-file. The file should have the same file-base as the .DWI file -
so, for example, if your DWI file is called "mysong.dwi", the lyrics file should
be called "mysong.lrc".
This file is a simple text-file that tells the program what text to display and
when. It can also define the colour the text is displayed in.
Each line starts with a tag in the format [xxxxxx]. Currently, these tags are
supported:
[COLOUR] Sets the colour for the following text. After the tag, a colour value is given in hex (ie. yellow would be 0xFFFF00). Up to 10 colour values can be given, separated by commas.
[offset:xxxx] Makes timestamps following this tag have their times adjusted by 'xxxx' milliseconds. Use to fine-tune timings for lyrics.
[MM:SS.ss] Sets a time.
The text following the tag will be shown on the screen after this
time has passed, replacing any text that was there before. To clear text,
provide just a tag with no text after it.
A line-break can be defined using the pipe "|" symbol.
A new colour can be selected from the defined colours by using "{cX}", where
"X" is a number from 0 to 9.
Sample LRC file:
[0:00.00]aye-aye-aye|aye-aye-aye|aye-aye-aye
[0:05.30]Where's my samurai?
[0:07.00]
[COLOUR]0xffff00
[0:13.50]I've been searching for a man
[0:16.00]All across Japan.
...etc...
+4 -4
View File
@@ -1,5 +1,5 @@
ksf-format.txt = http://kai.vm.bytemark.co.uk/svn/pydance/trunk/pydance/docs/ksf-format.txt
[not in repository but good reading]
http://worldance.us/foro/archive/index.php?t-1647.html (Spanish; Direct Move KSF)
ksf-format.txt = http://kai.vm.bytemark.co.uk/svn/pydance/trunk/pydance/docs/ksf-format.txt
[not in repository but good reading]
http://worldance.us/foro/archive/index.php?t-1647.html (Spanish; Direct Move KSF)
http://www.ph-online.net/html/ph_newspage_v3_09.html ("Explanation of KSF Pump It Up Step Format" by Turkeyslam)
+157 -157
View File
@@ -1,157 +1,157 @@
Documentation on the KSF Format
-------------------------------
The KSF format is designed for representing steps for 5 panel diagonal
dancing games, such as Pump It Up. It was originally used in the Kick It Up
simulator, but can also be parsed by other programs. However, this seems
to be the only actual format description available.
The intention of this document is not to encourage creation of KSF files.
I believe the format to be broken, and provide this reference only for
people wishing to implement legacy file readers. Any new 5 panel dancing
patterns should use a well-defined format such as .dance or .sm.
Directory Layout
----------------
KSF filenames are case-insensitive.
A KSF directory contains the following files:
- At least one file matching *.KSF, containing the step data.
- A file named SONG.MP3, SONG.WAV, or SONG.OGG.
- A file named INTRO.MP3, INTRO.WAV, or INTRO.OGG, containing a sound clip,
used to preview the song in song selectors.
- Disc.bmp, a 300x200 image used in song selectors.
- Back.bmp or Title.bmp, a 640x480 image used as a background during the song.
KSF directories may not have a special naming format, but some simulators
will use the directory name to get the artist and title name, if it's not
available in the KSF files themseleves. The format is "Title",
"Title - Artist", or "Title - Artist - Difficulty". Difficulty can be
ignored here, as it can be gotten from the KSF filename. Using the path
name to determine the metadata for the song should only be used if it's
not available in #TITLE.
Concievably other audio or image formats could be used. None have been
seen in the wild.
KSF Filenames
-------------
KSF filenames describe the game type and difficulty. Each file holds the
data for only one level of difficulty. There are two possible forms of
the name: *<gametype>*.ksf, or *<difficulty>_<playernumber>*.ksf.
The first type is used for double mode, and half-double mode. Double.ksf
contains the steps for "Double" mode, where one player uses both paths.
Stepmania supports Halfdouble.ksf, which ignores the outer 4 panels.
The latter type is used for single ("unison", which is not the same
as Dance Dance Revolution's Unison mode in early mixes) steps, where both
players have the same steps, and couple steps, where players have different
ones. If the player number is 1, they are single steps; if it's 2, they're
couple steps. Difficulty is a difficulty name.
KSF Headers
-----------
The basic KSF format is similar to DWI, SM, and MSD. Metadata is given
in the format of:
#TAGNAME:VALUE;
The exception being the #STEPS tag, which has a newline between the ":"
and the first line of steps, and ends in "2222222222222" on a line by
itself instead of ";".
KSF files seem to use CRLF (Windows-style) line termination. The vast
majority of KSF files are in CP942/KSC 5601 encoding, but some are
in EUC-KR. If ASCII alternatives are needed for these encodings, the
path name must be checked as above.
Common headers in KSF files are as follows:
#TITLE: The artist and title of the song, and sometimes the difficulty.
These are separated by " - "s, so the format is either "Title",
"Artist - Title", or "Artist - Title - Difficulty". Information missing
from this line can be filled in via path or file names.
#BPM: The BPM of the song. This is analogous to the BPM value for every other
dance format.
#STARTTIME: The time into the song to offset events, in centiseconds. This
is the opposite of .dance's gap and .sm's offset, and the same as .dwi's
gap (although they use different units).
#TICKCOUNT: Each step line specifies 1/TICKCOUNT beats. That is, if
TICKCOUNT is 1, each line is the equivalent of a 'q' in .dance. If it's
2, each line is the same as a normal length note in DWI (an 'e' in .dance).
#STEP: Until a line of "2222222222222" is encountered, each line after this
one represents a set of steps.
Step Lines
----------
Each line in the step section represents one "line" of steps, like SM
or .dance. Each line is 13 digits long; in single (unison) modes, only the
first 5 are used; in couple and double, the first 10 are used.
The order of the steps is Down Left, Up Left, Center, Up Right, Down Right.
The second player's (or second pad in double) steps are the same order,
but in positions 6-10 instead of 1-5.
A 0 in a position indicates no step. A 1 indicates a regular step. A 4
indicates a hold, for as long as a 4 is found in that column. The hold
ends on the beat of the last 4, not on the first 0.
Some files have been seen with repeated '1's in this manner as well;
it is unknown if any dance simulator supports this use of KSF, and since
a perfectly good non-ambiguous means of representing holds is available,
its use is not recommended.
A 2 (or a line of 13 2s) indicates the end of the step pattern.
BPM Changes
-----------
BPM changes are handled by header values; they are specified by a pair
of values #BPMx and #BUNKIx, where x is an integer. An example is:
#BPM:146.10;
#BPM2:180.20;
#BPM3:195.00;
#TICKCOUNT:2;
#STARTTIME:0;
#BUNKI:4200;
#BUNKI2:10000;
BPMn+1 starts at the time specified in centiseconds by BUNKIn (where n
is omitted if it is 1). In the above, 42 seconds (4200 centiseconds)
into the song, the BPM changes from its initial 146.1 to 180.2, and
then 100 seconds into the song, from 180.2 to 195.
BUNKIs can be a decimal value.
Syntax Exceptions
-----------------
Unlike DWI files, KSF files seem to have few exceptions or violations of
their syntax in the files seen in the wild. This may be because the format
is so mind-numbingly stupid.
Still Unknown
-------------
Some files contain a #STARTTIMEx (like #BPMx or #BUNKIx).
KSF step lines are 13 digits wide; only 10 digits appear to specify steps,
but the last 3 are not always 0. They probably represent something.
Author
------
This document was written by Joe Wreschnig <piman@debian.org>. It is
released into the public domain.
Changes
-------
2003.08.15
- Initial check in / release.
Acknowledgements
----------------
This document is based primarily off of extensive work done by Matt Reppert.
The Stepmania KSF loader source code (src/NotesLoaderKSF.cpp) also proved
useful in verifying some information.
Documentation on the KSF Format
-------------------------------
The KSF format is designed for representing steps for 5 panel diagonal
dancing games, such as Pump It Up. It was originally used in the Kick It Up
simulator, but can also be parsed by other programs. However, this seems
to be the only actual format description available.
The intention of this document is not to encourage creation of KSF files.
I believe the format to be broken, and provide this reference only for
people wishing to implement legacy file readers. Any new 5 panel dancing
patterns should use a well-defined format such as .dance or .sm.
Directory Layout
----------------
KSF filenames are case-insensitive.
A KSF directory contains the following files:
- At least one file matching *.KSF, containing the step data.
- A file named SONG.MP3, SONG.WAV, or SONG.OGG.
- A file named INTRO.MP3, INTRO.WAV, or INTRO.OGG, containing a sound clip,
used to preview the song in song selectors.
- Disc.bmp, a 300x200 image used in song selectors.
- Back.bmp or Title.bmp, a 640x480 image used as a background during the song.
KSF directories may not have a special naming format, but some simulators
will use the directory name to get the artist and title name, if it's not
available in the KSF files themseleves. The format is "Title",
"Title - Artist", or "Title - Artist - Difficulty". Difficulty can be
ignored here, as it can be gotten from the KSF filename. Using the path
name to determine the metadata for the song should only be used if it's
not available in #TITLE.
Concievably other audio or image formats could be used. None have been
seen in the wild.
KSF Filenames
-------------
KSF filenames describe the game type and difficulty. Each file holds the
data for only one level of difficulty. There are two possible forms of
the name: *<gametype>*.ksf, or *<difficulty>_<playernumber>*.ksf.
The first type is used for double mode, and half-double mode. Double.ksf
contains the steps for "Double" mode, where one player uses both paths.
Stepmania supports Halfdouble.ksf, which ignores the outer 4 panels.
The latter type is used for single ("unison", which is not the same
as Dance Dance Revolution's Unison mode in early mixes) steps, where both
players have the same steps, and couple steps, where players have different
ones. If the player number is 1, they are single steps; if it's 2, they're
couple steps. Difficulty is a difficulty name.
KSF Headers
-----------
The basic KSF format is similar to DWI, SM, and MSD. Metadata is given
in the format of:
#TAGNAME:VALUE;
The exception being the #STEPS tag, which has a newline between the ":"
and the first line of steps, and ends in "2222222222222" on a line by
itself instead of ";".
KSF files seem to use CRLF (Windows-style) line termination. The vast
majority of KSF files are in CP942/KSC 5601 encoding, but some are
in EUC-KR. If ASCII alternatives are needed for these encodings, the
path name must be checked as above.
Common headers in KSF files are as follows:
#TITLE: The artist and title of the song, and sometimes the difficulty.
These are separated by " - "s, so the format is either "Title",
"Artist - Title", or "Artist - Title - Difficulty". Information missing
from this line can be filled in via path or file names.
#BPM: The BPM of the song. This is analogous to the BPM value for every other
dance format.
#STARTTIME: The time into the song to offset events, in centiseconds. This
is the opposite of .dance's gap and .sm's offset, and the same as .dwi's
gap (although they use different units).
#TICKCOUNT: Each step line specifies 1/TICKCOUNT beats. That is, if
TICKCOUNT is 1, each line is the equivalent of a 'q' in .dance. If it's
2, each line is the same as a normal length note in DWI (an 'e' in .dance).
#STEP: Until a line of "2222222222222" is encountered, each line after this
one represents a set of steps.
Step Lines
----------
Each line in the step section represents one "line" of steps, like SM
or .dance. Each line is 13 digits long; in single (unison) modes, only the
first 5 are used; in couple and double, the first 10 are used.
The order of the steps is Down Left, Up Left, Center, Up Right, Down Right.
The second player's (or second pad in double) steps are the same order,
but in positions 6-10 instead of 1-5.
A 0 in a position indicates no step. A 1 indicates a regular step. A 4
indicates a hold, for as long as a 4 is found in that column. The hold
ends on the beat of the last 4, not on the first 0.
Some files have been seen with repeated '1's in this manner as well;
it is unknown if any dance simulator supports this use of KSF, and since
a perfectly good non-ambiguous means of representing holds is available,
its use is not recommended.
A 2 (or a line of 13 2s) indicates the end of the step pattern.
BPM Changes
-----------
BPM changes are handled by header values; they are specified by a pair
of values #BPMx and #BUNKIx, where x is an integer. An example is:
#BPM:146.10;
#BPM2:180.20;
#BPM3:195.00;
#TICKCOUNT:2;
#STARTTIME:0;
#BUNKI:4200;
#BUNKI2:10000;
BPMn+1 starts at the time specified in centiseconds by BUNKIn (where n
is omitted if it is 1). In the above, 42 seconds (4200 centiseconds)
into the song, the BPM changes from its initial 146.1 to 180.2, and
then 100 seconds into the song, from 180.2 to 195.
BUNKIs can be a decimal value.
Syntax Exceptions
-----------------
Unlike DWI files, KSF files seem to have few exceptions or violations of
their syntax in the files seen in the wild. This may be because the format
is so mind-numbingly stupid.
Still Unknown
-------------
Some files contain a #STARTTIMEx (like #BPMx or #BUNKIx).
KSF step lines are 13 digits wide; only 10 digits appear to specify steps,
but the last 3 are not always 0. They probably represent something.
Author
------
This document was written by Joe Wreschnig <piman@debian.org>. It is
released into the public domain.
Changes
-------
2003.08.15
- Initial check in / release.
Acknowledgements
----------------
This document is based primarily off of extensive work done by Matt Reppert.
The Stepmania KSF loader source code (src/NotesLoaderKSF.cpp) also proved
useful in verifying some information.
+66 -66
View File
@@ -1,67 +1,67 @@
Used by Pocket DDR (http://www.stepmania.com/forums/showthread.php?t=6621).
Basically a compressed version of a .SM that includes the banner and background
in the file as well.
{Banner}
{Background}
{SDF data}
When running SM2SDF.exe with /log, the process looks like this:
-------------------------------------------------
SM 2 SCF Converter v.1.0 by Robot2037
-------------------------------------------------
SM File: test.sm
Loading file test.sm...done.
[LOG] parsing SM file
[LOG] songTitle = test song
[LOG] songSubTitle = a remix
[LOG] songArtist = kurt angle!
[LOG] songCredits = aj jelly
[LOG] songBanner = ssc-banner.png
[LOG] songBackground = ssc-bg.png
[LOG] songOffset = -0.060
[LOG] songBPMs = 0.000=93.810;
[LOG] songStops = ;
[LOG] parsing stepcharts
[LOG] difficulty 0 stepchart found, step difficulty = 2
[LOG] difficulty 1 stepchart found, step difficulty = 4
[LOG] difficulty 2 stepchart found, step difficulty = 6
[LOG] difficulty 3 stepchart found, step difficulty = 10
converting...
[LOG] converting song properties
[LOG] converting BPMs
[LOG] converting stops
[LOG] converting offset
[LOG] converting stepcharts
[LOG] converting stepchart 0
[LOG] converting done
[LOG] converting stepchart 1
[LOG] converting done
[LOG] converting stepchart 2
[LOG] converting done
[LOG] converting stepchart 3
[LOG] converting done
compressing stepchart 0 [ 576 -> 39 ]
compressing stepchart 1 [ 576 -> 71 ]
compressing stepchart 2 [ 576 -> 167 ]
compressing stepchart 3 [ 576 -> 233 ]
Converting image ssc-bg.png...done.
Converting image ssc-banner.png...done.
Writing file test.sdf...done.
test_sm2sdf.sm is the equivalent of test.sm in the above example.
test.sdf is the output file, with two BPMs.
test-1bpm.sdf is an output file with only one BPM change (and a changed offset).
the two images are included as well.
--------------------------------------------------------------------------------
A cursory glance at the steps part of the .SDF shows this:
0x00-0x04: [000204060A]
0x05-0x??: Title (first byte is number of characters/length of string)
then Subtitle, Artist, and Credit follow the same pattern.
That's followed by the Offset. +1.000 = 0x0003E8. -0.060 = 0x01003C.
I think they call this binary coded decimal.
After that is the number of BPMs, presumably followed by those BPMs.
0x0007D0=0x0A2C2B == #BPMS:2.000=666.667;
Used by Pocket DDR (http://www.stepmania.com/forums/showthread.php?t=6621).
Basically a compressed version of a .SM that includes the banner and background
in the file as well.
{Banner}
{Background}
{SDF data}
When running SM2SDF.exe with /log, the process looks like this:
-------------------------------------------------
SM 2 SCF Converter v.1.0 by Robot2037
-------------------------------------------------
SM File: test.sm
Loading file test.sm...done.
[LOG] parsing SM file
[LOG] songTitle = test song
[LOG] songSubTitle = a remix
[LOG] songArtist = kurt angle!
[LOG] songCredits = aj jelly
[LOG] songBanner = ssc-banner.png
[LOG] songBackground = ssc-bg.png
[LOG] songOffset = -0.060
[LOG] songBPMs = 0.000=93.810;
[LOG] songStops = ;
[LOG] parsing stepcharts
[LOG] difficulty 0 stepchart found, step difficulty = 2
[LOG] difficulty 1 stepchart found, step difficulty = 4
[LOG] difficulty 2 stepchart found, step difficulty = 6
[LOG] difficulty 3 stepchart found, step difficulty = 10
converting...
[LOG] converting song properties
[LOG] converting BPMs
[LOG] converting stops
[LOG] converting offset
[LOG] converting stepcharts
[LOG] converting stepchart 0
[LOG] converting done
[LOG] converting stepchart 1
[LOG] converting done
[LOG] converting stepchart 2
[LOG] converting done
[LOG] converting stepchart 3
[LOG] converting done
compressing stepchart 0 [ 576 -> 39 ]
compressing stepchart 1 [ 576 -> 71 ]
compressing stepchart 2 [ 576 -> 167 ]
compressing stepchart 3 [ 576 -> 233 ]
Converting image ssc-bg.png...done.
Converting image ssc-banner.png...done.
Writing file test.sdf...done.
test_sm2sdf.sm is the equivalent of test.sm in the above example.
test.sdf is the output file, with two BPMs.
test-1bpm.sdf is an output file with only one BPM change (and a changed offset).
the two images are included as well.
--------------------------------------------------------------------------------
A cursory glance at the steps part of the .SDF shows this:
0x00-0x04: [000204060A]
0x05-0x??: Title (first byte is number of characters/length of string)
then Subtitle, Artist, and Credit follow the same pattern.
That's followed by the Offset. +1.000 = 0x0003E8. -0.060 = 0x01003C.
I think they call this binary coded decimal.
After that is the number of BPMs, presumably followed by those BPMs.
0x0007D0=0x0A2C2B == #BPMS:2.000=666.667;
I'm just not sure how they're picking the places to store the decimal.
File diff suppressed because it is too large Load Diff
+337 -337
View File
@@ -1,337 +1,337 @@
The "Dance" Format
------------------
The goals of this format are easy parsability, easy human readability,
brevity, and disambiguity.
Generic Information
-------------------
All strings are case-sensitive. Filenames are case-sensitive. The
directory separator is '/' regardless of the platform. All text
is encoded in UTF-8. Byte-order marking is not allowed.
Enhanced Backus-Naur Form (ENBF) Specification
----------------------------------------------
This is purely the grammar. A semantic explanation is below.
Although this is given as a CFG specification, .dance is designed to be
parsed by a table-based DFA (as in pydance's fileparsers.py)
Primitives:
<String> ::= a sequence of characters
<Float> ::= 0.0 to Inf, decimal value
<NegInt> ::= 0 | -1 | -2 | -3 ...
<PosInt> ::= 0 | 1 | 2 | 3 ...
Almost primitives:
<Whitespace> ::= (" " | "\t")+
<Newline> ::= "\n" | "\r\n" | "\r"
<LongString> ::= <String> (<Whitespace> <String>)*
<EndToken> ::= "end" <Newline>
<Int> ::= <NegInt> | <PosInt>
<Comment> ::= [("#" <LongString>) | <Whitespace>] <Newline>
Basic Structure:
<File> ::= <Metadata> [<TextSection>+] <StepSection>+
Metadata Storage:
<Metadata> ::= (<Comment> | <MetadataLine>)+ <EndToken>
<MetadataLine> ::= (<Filename> | <Title> | <Subtitle> | <Artist> | <Mix> |
<BPM> | <Offset> | <BG> | <Banner> | <Preview> |
<Checksum> | <StartAt> | <EndAt> | <Author> | <CDTitle> |
<RevisionDate> | <Valid> | <Movie>) <Newline>
<Filename> ::= "filename" <Whitespace> <LongString>
<Title> ::= "title" <Whitespace> <LongString>
<Subtitle> ::= "subtitle" <Whitespace> <LongString>
<Artist> ::= "artist" <Whitespace> <LongString>
<Mix> ::= "mix" <Whitespace> <LongString>
<BPM> ::= "bpm" <Whitespace> <Float>
<BPMDisplay> :: "bpmdisplay" ((<Whitespace> <Float>)+ | "*")
<Gap> ::= "gap" <Whitespace> <Int>
<StartAt> ::= "startat" <Whitespace> <Float>
<EndAt> ::= "endat" <Whitespace> <Float>
<BG> ::= "background" <Whitespace> <LongString>
<Banner> ::= "banner" <Whitespace> <LongString>
<Banner> ::= "cdtitle" <Whitespace> <LongString>
<Preview> :: "preview" <Whitespace> <Float> <Whitespace> <Float>
<Checksum> ::= "md5sum" <Whitespace> <String>
<Author> ::= "author" <Whitespace> <LongString>
<Movie> ::= "movie" <Whitespace> <LongString>
<RevisionDate> ::= "revision" <Whitespace> <LongString>
<Valid> ::= "valid" <Whitespace> 1 | 0
Text Sections:
<TextSection> ::= [<Description>] [<Lyrics>]
<Lyrics> ::= "LYRICS" <Newline> (<LyricLine>)+ <EndToken>
<LyricLine> ::= <Float> <Whitespace> <PosInt> <Whitespace> <LongString> <Newline>
<Description> ::= "DESCRIPTION" <Newline> (<LongString> <Newline>)+ <EndToken>
Step Sections:
<StepSection> ::= <GameMode> <Difficulty> <Sequence>+ <EndToken>
<GameMode> ::= <String> <Newline>
<Difficulty> ::= <String> <Whitespace> <PosInt> <Newline>
<Sequence> ::= (<Comment> | <Buttons> | <Command>) <Newline>
Note Sequences:
<Buttons> ::= <NoteType> (<Whitespace> <ButtonPresses>)+
<NoteType> ::= "u" | "n" | "x" | "t" | "f" | "s" | "w" | "e" | "q" | "h" | "o"
<ButtonPresses> ::= (0 | 1 | 3 | 5 | 7)+
Song Commands:
<Command> ::= <ChangeBPM> | <Ready> | <Wait> | <Stop> | <Delay> | <Lyric>
<ChangeBPM> ::= "B" <Whitespace> <Float>
<Ready> ::= "R"
<Wait> ::= "W" <Whitespace> <Float>
<Stop> ::= "S" <Whitespace> <Float>
<Delay> ::= "D" <Whitespace> <Float>
<Lyric> ::= "L" <Whitespace> <Float> <Whitespace> <PosInt> <Whitespace>
<LongString>
Informal & Semantic Description
-------------------------------
The dance format is basically the step format, but generalized, smaller,
and more readable. A script to convert .step files to .dance files is
forthcoming.
A simple file might look like:
filename asong.ogg
title A Song
subtitle Crazy Mix
artist Someone
# This is a comment
end
DESCRIPTION
This is an example song.
It's pretty uninteresting.
end
SINGLE
BASIC 0
q 1010
# This is another comment.
q 0101
q 3030
q 1010
end
Metadata Section:
The metadata section of the song is the first section, and contains
important data about the file. An explanation of the keys follow:
'filename': The filename of the audio file to play.
'title': The name of the song. This should not include "Foo Mix".
'subtitle': "Foo Mix", "Crazy Version", whatever. Default none.
'artist': The name of the artist(s) and any remixers.
'bpm': The beats per minute of the song.
'gap': The millisecond offset into the song at which the arrows should
start. If the first beat is 0.3 seconds into the song, for example,
this should be -300. This can be negative. Default 0.
'bpmdisplay': A whitespace-separated list of floats, which will be
cycled through on the song selector's BPM display. If
not present this defaults to the BPM if the song. If "*",
the BPM is displayed as constantly changing.
'background': A background image (to display while the song is playing).
Default none.
'banner': A banner for the song (to display in the song select). Default none.
'cdtitle': A small (64x40) image to use as a CD title. Default none. This
path should either be relative to a special CD title directory,
or to the directory the file is in.
'preview': An offset to seconds to start a song preview at, and a length to
play the preview. Default 45.0 and 10.0.
'startat', 'endat': Start and end the music at these positions in seconds.
offset and the steps are then relative to the startat
position. Default 0.0 and the length of the song.
'md5sum': If present, the MD5 checksum of the 'filename' file. If it's
present and the file doesn't match, a warning can be issued.
'author': The person who wrote this file. Default none.
'revision': The date of the last revision of this file, in YYYY.MM.DD format.
Defaults to "1970.01.01".
'movie': The filename of a background movie; defaults to none.
'valid': If not true, this song should be not selected using in random play
modes (e.g., it's not finished, hasn't been timed, etc). Default 1.
The 'filename', 'title', 'artist', and 'bpm' keys are mandatory.
Note that songs in this format will *NOT* have any files autodetected. If
you want them to be found, explicitly state them in the file.
The metadata section, like all sections, must end with "end" on a line
by itself.
Text Sections:
There are two "text" sections in dance files; these are essentially
extended metadata sections.
The DESCRIPTION section contains a description of the song. The format
roughly follows the DPKG description format: All lines of text start
with a space. Whitespace, including newlines, is ignored. A period ('.')
on a line by itself (with a space before it!) is to be interpreted as a
paragraph separator. An 'end' token on a single line, with no space before
it, ends the description.
The LYRICS section contains lyric timing information. The format
of each line is, an integer, a float, and then a string. The integer
specifies the lyric "channel"; lyrics in the same channel should overwrite
each other, appear in the same place on the screen, etc. The float is the
time into the song during which the lyric should appear, irrespective
of the 'gap' value.
Step Sections:
The meat of the file is in the step sections, which actually describe
the game-related stuff. A step section is started as soon as an unknown
section token is encounter (i.e. currently not LYRICS or DESCRIPTION).
This first token is then taken as the "game mode". The two tokens on the
next line are the difficulty name and rating number.
Then, until the "end" token, there are lines describing the steps. These
may be either a command, or a set of buttons to press. The "base" is 'q',
the quarter note, which represents one beat in the song.
o Whole note (4 on-beat arrows)
h 1/2 note
q 1/4 note
e 1/8 note
w 1/12 note
s 1/16 note
f 1/24 note
t 1/32 note
u 1/48 note
x 1/64 note
n 1/192 note
After the note comes a string of buttons. All these strings should be
the same length across game modes. Example strings might "1001" or "0030".
0 No button at this time
1 A regular press at this time
3 This button must be pressed here and held down until a 1 is encounted
5 A secret step at this time.
7 A secret step and hold at this time.
(Note - With bitwise &,
num & 1 => pressed here,
num & 2 => hold here,
num & 4 => this is a secret note.
This correspondance is not necesarily guaranateed to be true for all
future additions to the .dance format, but will be maintained if possible.)
Possible commands are:
B <Float> Change the BPM of the song to this number at this point.
R "Ready? Go!" graphics/sound, if any.
W <Float> Wait this many seconds before the next event.
S <Float> Stop scrolling for this many seconds before the next event.
D <Float> The same as a sequence of 0 note strings for this many beats.
L <PosInt> <LongString> Display some lyrics at this point.
Failing Gracefully
------------------
Often, your parsers may come across tokens they don't know; maybe because
someone made an invalid file, or because the parser doesn't support all
of this format (or an old version of this format). If this is a section
token, this isn't a big problem; jump to the next end token and keep
going. Metadata tokens are equally easy to skip.
Tokens in steps are more complicated. In general, you should treat
them as comments, treat unknown note types as 0s, and hope for the
best.
Bad files shouldn't make your parser crash. It should return an error to
the program, which behaves accordingly.
Future Extensions
-----------------
If this format is found to be inadaquate, the following extensions
may be added:
New metadata keys. This would be a new line in the metadata section.
It is unlikely such a line would be mandatory, since current songs
work fine without them.
New note types and commands. These would be new lowercase or uppercase
single characters in the song section.
Standard Game Modes
-------------------
SINGLE - Normal single player with up, down, left, and right, or versus
mode, if no VERSUS is found.
VERSUS - Two players, both with the same steps.
COUPLE - Two players with different steps.
DOUBLE - Doubles, one player on both pads.
5PANEL - Diagonal directions, and the center, for one player.
5VERSUS, 5COUPLE, 5DOUBLE - Similar to the 4 panel relationships.
6PANEL, 6VERSUS, 6DOUBLE, 6COUPLE: Up left, up right, up, down, left,
and right.
8PANEL, etc: All directions except center.
9PANEL, etc: All directions including center.
3PANEL, etc: Up left, down, and up right.
Changes:
--------
2004.03.01
- Version 1.2, released with pydance 1.0.
- Add 9 panel game mode.
2004.01.16
- Include comments in the example.
2003.12.23
- 3 panel modes.
- bpmdisplay metadata key.
2003.12.22
- 'cdtitle' metadata line.
2003.08.15
- Specify note types more exactly.
- Fix the broken DESCRIPTION in the example.
- Remove obsolete notes about the pydance implementation.
- Add more game modes to the list (especially of note is VERSUS).
2003.07.30
- Fix example of 'gap' attribute (-300 instead of 300).
- Fix nonsensical hold arrow example.
2003.06.29
- Fix a typo ("::" => "::=").
2003.06.27
- Add EBNF for COUPLE-style modes (spaces in Buttons)
2003.06.26
- Add a missing newline to LyricLine.
- Add (currently unexplained) BACKGROUNDS section.
2003.06.03
- Version 1.1
- Add 192nd notes with 'n', 48th with 'u'.
2003.06.01
- Version 1.0
- No more I command.
2003.05.23:
- Started changes.
- v1.0 draft preparation.
- Need to explain the I command.
The "Dance" Format
------------------
The goals of this format are easy parsability, easy human readability,
brevity, and disambiguity.
Generic Information
-------------------
All strings are case-sensitive. Filenames are case-sensitive. The
directory separator is '/' regardless of the platform. All text
is encoded in UTF-8. Byte-order marking is not allowed.
Enhanced Backus-Naur Form (ENBF) Specification
----------------------------------------------
This is purely the grammar. A semantic explanation is below.
Although this is given as a CFG specification, .dance is designed to be
parsed by a table-based DFA (as in pydance's fileparsers.py)
Primitives:
<String> ::= a sequence of characters
<Float> ::= 0.0 to Inf, decimal value
<NegInt> ::= 0 | -1 | -2 | -3 ...
<PosInt> ::= 0 | 1 | 2 | 3 ...
Almost primitives:
<Whitespace> ::= (" " | "\t")+
<Newline> ::= "\n" | "\r\n" | "\r"
<LongString> ::= <String> (<Whitespace> <String>)*
<EndToken> ::= "end" <Newline>
<Int> ::= <NegInt> | <PosInt>
<Comment> ::= [("#" <LongString>) | <Whitespace>] <Newline>
Basic Structure:
<File> ::= <Metadata> [<TextSection>+] <StepSection>+
Metadata Storage:
<Metadata> ::= (<Comment> | <MetadataLine>)+ <EndToken>
<MetadataLine> ::= (<Filename> | <Title> | <Subtitle> | <Artist> | <Mix> |
<BPM> | <Offset> | <BG> | <Banner> | <Preview> |
<Checksum> | <StartAt> | <EndAt> | <Author> | <CDTitle> |
<RevisionDate> | <Valid> | <Movie>) <Newline>
<Filename> ::= "filename" <Whitespace> <LongString>
<Title> ::= "title" <Whitespace> <LongString>
<Subtitle> ::= "subtitle" <Whitespace> <LongString>
<Artist> ::= "artist" <Whitespace> <LongString>
<Mix> ::= "mix" <Whitespace> <LongString>
<BPM> ::= "bpm" <Whitespace> <Float>
<BPMDisplay> :: "bpmdisplay" ((<Whitespace> <Float>)+ | "*")
<Gap> ::= "gap" <Whitespace> <Int>
<StartAt> ::= "startat" <Whitespace> <Float>
<EndAt> ::= "endat" <Whitespace> <Float>
<BG> ::= "background" <Whitespace> <LongString>
<Banner> ::= "banner" <Whitespace> <LongString>
<Banner> ::= "cdtitle" <Whitespace> <LongString>
<Preview> :: "preview" <Whitespace> <Float> <Whitespace> <Float>
<Checksum> ::= "md5sum" <Whitespace> <String>
<Author> ::= "author" <Whitespace> <LongString>
<Movie> ::= "movie" <Whitespace> <LongString>
<RevisionDate> ::= "revision" <Whitespace> <LongString>
<Valid> ::= "valid" <Whitespace> 1 | 0
Text Sections:
<TextSection> ::= [<Description>] [<Lyrics>]
<Lyrics> ::= "LYRICS" <Newline> (<LyricLine>)+ <EndToken>
<LyricLine> ::= <Float> <Whitespace> <PosInt> <Whitespace> <LongString> <Newline>
<Description> ::= "DESCRIPTION" <Newline> (<LongString> <Newline>)+ <EndToken>
Step Sections:
<StepSection> ::= <GameMode> <Difficulty> <Sequence>+ <EndToken>
<GameMode> ::= <String> <Newline>
<Difficulty> ::= <String> <Whitespace> <PosInt> <Newline>
<Sequence> ::= (<Comment> | <Buttons> | <Command>) <Newline>
Note Sequences:
<Buttons> ::= <NoteType> (<Whitespace> <ButtonPresses>)+
<NoteType> ::= "u" | "n" | "x" | "t" | "f" | "s" | "w" | "e" | "q" | "h" | "o"
<ButtonPresses> ::= (0 | 1 | 3 | 5 | 7)+
Song Commands:
<Command> ::= <ChangeBPM> | <Ready> | <Wait> | <Stop> | <Delay> | <Lyric>
<ChangeBPM> ::= "B" <Whitespace> <Float>
<Ready> ::= "R"
<Wait> ::= "W" <Whitespace> <Float>
<Stop> ::= "S" <Whitespace> <Float>
<Delay> ::= "D" <Whitespace> <Float>
<Lyric> ::= "L" <Whitespace> <Float> <Whitespace> <PosInt> <Whitespace>
<LongString>
Informal & Semantic Description
-------------------------------
The dance format is basically the step format, but generalized, smaller,
and more readable. A script to convert .step files to .dance files is
forthcoming.
A simple file might look like:
filename asong.ogg
title A Song
subtitle Crazy Mix
artist Someone
# This is a comment
end
DESCRIPTION
This is an example song.
It's pretty uninteresting.
end
SINGLE
BASIC 0
q 1010
# This is another comment.
q 0101
q 3030
q 1010
end
Metadata Section:
The metadata section of the song is the first section, and contains
important data about the file. An explanation of the keys follow:
'filename': The filename of the audio file to play.
'title': The name of the song. This should not include "Foo Mix".
'subtitle': "Foo Mix", "Crazy Version", whatever. Default none.
'artist': The name of the artist(s) and any remixers.
'bpm': The beats per minute of the song.
'gap': The millisecond offset into the song at which the arrows should
start. If the first beat is 0.3 seconds into the song, for example,
this should be -300. This can be negative. Default 0.
'bpmdisplay': A whitespace-separated list of floats, which will be
cycled through on the song selector's BPM display. If
not present this defaults to the BPM if the song. If "*",
the BPM is displayed as constantly changing.
'background': A background image (to display while the song is playing).
Default none.
'banner': A banner for the song (to display in the song select). Default none.
'cdtitle': A small (64x40) image to use as a CD title. Default none. This
path should either be relative to a special CD title directory,
or to the directory the file is in.
'preview': An offset to seconds to start a song preview at, and a length to
play the preview. Default 45.0 and 10.0.
'startat', 'endat': Start and end the music at these positions in seconds.
offset and the steps are then relative to the startat
position. Default 0.0 and the length of the song.
'md5sum': If present, the MD5 checksum of the 'filename' file. If it's
present and the file doesn't match, a warning can be issued.
'author': The person who wrote this file. Default none.
'revision': The date of the last revision of this file, in YYYY.MM.DD format.
Defaults to "1970.01.01".
'movie': The filename of a background movie; defaults to none.
'valid': If not true, this song should be not selected using in random play
modes (e.g., it's not finished, hasn't been timed, etc). Default 1.
The 'filename', 'title', 'artist', and 'bpm' keys are mandatory.
Note that songs in this format will *NOT* have any files autodetected. If
you want them to be found, explicitly state them in the file.
The metadata section, like all sections, must end with "end" on a line
by itself.
Text Sections:
There are two "text" sections in dance files; these are essentially
extended metadata sections.
The DESCRIPTION section contains a description of the song. The format
roughly follows the DPKG description format: All lines of text start
with a space. Whitespace, including newlines, is ignored. A period ('.')
on a line by itself (with a space before it!) is to be interpreted as a
paragraph separator. An 'end' token on a single line, with no space before
it, ends the description.
The LYRICS section contains lyric timing information. The format
of each line is, an integer, a float, and then a string. The integer
specifies the lyric "channel"; lyrics in the same channel should overwrite
each other, appear in the same place on the screen, etc. The float is the
time into the song during which the lyric should appear, irrespective
of the 'gap' value.
Step Sections:
The meat of the file is in the step sections, which actually describe
the game-related stuff. A step section is started as soon as an unknown
section token is encounter (i.e. currently not LYRICS or DESCRIPTION).
This first token is then taken as the "game mode". The two tokens on the
next line are the difficulty name and rating number.
Then, until the "end" token, there are lines describing the steps. These
may be either a command, or a set of buttons to press. The "base" is 'q',
the quarter note, which represents one beat in the song.
o Whole note (4 on-beat arrows)
h 1/2 note
q 1/4 note
e 1/8 note
w 1/12 note
s 1/16 note
f 1/24 note
t 1/32 note
u 1/48 note
x 1/64 note
n 1/192 note
After the note comes a string of buttons. All these strings should be
the same length across game modes. Example strings might "1001" or "0030".
0 No button at this time
1 A regular press at this time
3 This button must be pressed here and held down until a 1 is encounted
5 A secret step at this time.
7 A secret step and hold at this time.
(Note - With bitwise &,
num & 1 => pressed here,
num & 2 => hold here,
num & 4 => this is a secret note.
This correspondance is not necesarily guaranateed to be true for all
future additions to the .dance format, but will be maintained if possible.)
Possible commands are:
B <Float> Change the BPM of the song to this number at this point.
R "Ready? Go!" graphics/sound, if any.
W <Float> Wait this many seconds before the next event.
S <Float> Stop scrolling for this many seconds before the next event.
D <Float> The same as a sequence of 0 note strings for this many beats.
L <PosInt> <LongString> Display some lyrics at this point.
Failing Gracefully
------------------
Often, your parsers may come across tokens they don't know; maybe because
someone made an invalid file, or because the parser doesn't support all
of this format (or an old version of this format). If this is a section
token, this isn't a big problem; jump to the next end token and keep
going. Metadata tokens are equally easy to skip.
Tokens in steps are more complicated. In general, you should treat
them as comments, treat unknown note types as 0s, and hope for the
best.
Bad files shouldn't make your parser crash. It should return an error to
the program, which behaves accordingly.
Future Extensions
-----------------
If this format is found to be inadaquate, the following extensions
may be added:
New metadata keys. This would be a new line in the metadata section.
It is unlikely such a line would be mandatory, since current songs
work fine without them.
New note types and commands. These would be new lowercase or uppercase
single characters in the song section.
Standard Game Modes
-------------------
SINGLE - Normal single player with up, down, left, and right, or versus
mode, if no VERSUS is found.
VERSUS - Two players, both with the same steps.
COUPLE - Two players with different steps.
DOUBLE - Doubles, one player on both pads.
5PANEL - Diagonal directions, and the center, for one player.
5VERSUS, 5COUPLE, 5DOUBLE - Similar to the 4 panel relationships.
6PANEL, 6VERSUS, 6DOUBLE, 6COUPLE: Up left, up right, up, down, left,
and right.
8PANEL, etc: All directions except center.
9PANEL, etc: All directions including center.
3PANEL, etc: Up left, down, and up right.
Changes:
--------
2004.03.01
- Version 1.2, released with pydance 1.0.
- Add 9 panel game mode.
2004.01.16
- Include comments in the example.
2003.12.23
- 3 panel modes.
- bpmdisplay metadata key.
2003.12.22
- 'cdtitle' metadata line.
2003.08.15
- Specify note types more exactly.
- Fix the broken DESCRIPTION in the example.
- Remove obsolete notes about the pydance implementation.
- Add more game modes to the list (especially of note is VERSUS).
2003.07.30
- Fix example of 'gap' attribute (-300 instead of 300).
- Fix nonsensical hold arrow example.
2003.06.29
- Fix a typo ("::" => "::=").
2003.06.27
- Add EBNF for COUPLE-style modes (spaces in Buttons)
2003.06.26
- Add a missing newline to LyricLine.
- Add (currently unexplained) BACKGROUNDS section.
2003.06.03
- Version 1.1
- Add 192nd notes with 'n', 48th with 'u'.
2003.06.01
- Version 1.0
- No more I command.
2003.05.23:
- Started changes.
- v1.0 draft preparation.
- Need to explain the I command.
+23 -23
View File
@@ -1,24 +1,24 @@
Miscellaneous Simfile Formats without directories
-------------------------------------------------------------------------------
[MSD]
Along with BMS, the grand daddy of simfile formats.
http://doremi.kalin.to/ddr/msd_format.html
[PMS]
It's pretty much like BMS. If you really need documentation,
see src/NotesLoaderPMS.cpp I guess. I'm not going to make a folder for it when
it's a BMS derivative :x.
[KMS]
Like BMS but for Keyboardmania? See http://wiki.bms.ms/KMS:Spec
[GDA]
Like BMS but for Session (Guitar Freaks/drummania). See http://wiki.bms.ms/GDA:Spec
[pydance]
They call it ".dance". I call it ARGH. See dance-spec.txt for the info.
src: http://kai.vm.bytemark.co.uk/svn/pydance/trunk/pydance/docs/dance-spec.txt
[D2R, SLO]
Obscure old Japanese formats.
Miscellaneous Simfile Formats without directories
-------------------------------------------------------------------------------
[MSD]
Along with BMS, the grand daddy of simfile formats.
http://doremi.kalin.to/ddr/msd_format.html
[PMS]
It's pretty much like BMS. If you really need documentation,
see src/NotesLoaderPMS.cpp I guess. I'm not going to make a folder for it when
it's a BMS derivative :x.
[KMS]
Like BMS but for Keyboardmania? See http://wiki.bms.ms/KMS:Spec
[GDA]
Like BMS but for Session (Guitar Freaks/drummania). See http://wiki.bms.ms/GDA:Spec
[pydance]
They call it ".dance". I call it ARGH. See dance-spec.txt for the info.
src: http://kai.vm.bytemark.co.uk/svn/pydance/trunk/pydance/docs/dance-spec.txt
[D2R, SLO]
Obscure old Japanese formats.
src: http://web.archive.org/web/20040205071612/http://paramax.hypermart.net/
+46 -46
View File
@@ -1,47 +1,47 @@
$INFORMATION:maintitle:subtitle:artist:genre:credit;
$TRANSLITS:main:sub:artist;
$GRAPHICS:banner:background:disc:cdtitle;
$MUSIC:music-file:base-track:intro-file:lyrics;
// should be used if a intro file is not defined
$SAMPLEPREVIEW:start:length;
$DISPLAYBPM:[from:to]|[one]|[show yes/no];
$BGCHANGES:
beat=file:p,r,o,p,s
;
$FGCHANGES:;
$KEYSOUNDS:;
// cache tags here
$CACHE:
firstbeat:
lastbeat:
songfilename:
hasmusic:
hasbanner
;
// note data
#NOTEDATA#
$META:
STEPSTYPE=stepstype:
DIFFICULTY=difficulty:
DESCRIPTION=description:
METER=meter:
RADARVALUES=r,a,d,a,r,v,a,l,u,e,s;
$TIMINGDATA:
BPM=bpms:
SPEED=speed:
STOPS=stops:
DELAYS=delays:
TIMESIGNATURES=timesigs;
$NOTES:
00000
00000
00000
00000
,
00000
00000
00000
00000
$INFORMATION:maintitle:subtitle:artist:genre:credit;
$TRANSLITS:main:sub:artist;
$GRAPHICS:banner:background:disc:cdtitle;
$MUSIC:music-file:base-track:intro-file:lyrics;
// should be used if a intro file is not defined
$SAMPLEPREVIEW:start:length;
$DISPLAYBPM:[from:to]|[one]|[show yes/no];
$BGCHANGES:
beat=file:p,r,o,p,s
;
$FGCHANGES:;
$KEYSOUNDS:;
// cache tags here
$CACHE:
firstbeat:
lastbeat:
songfilename:
hasmusic:
hasbanner
;
// note data
#NOTEDATA#
$META:
STEPSTYPE=stepstype:
DIFFICULTY=difficulty:
DESCRIPTION=description:
METER=meter:
RADARVALUES=r,a,d,a,r,v,a,l,u,e,s;
$TIMINGDATA:
BPM=bpms:
SPEED=speed:
STOPS=stops:
DELAYS=delays:
TIMESIGNATURES=timesigs;
$NOTES:
00000
00000
00000
00000
,
00000
00000
00000
00000
;
+58 -58
View File
@@ -1,59 +1,59 @@
// sm-ssc step chart/msd5 hacky file format doc.
// based off of .sm, which was based off of DWI's modified MSD format.
#TITLE:;
#SUBTITLE:;
#ARTIST:;
#TITLETRANSLIT:;
#SUBTITLETRANSLIT:;
#ARTISTTRANSLIT:;
#GENRE:;
#CREDIT:;
#BANNER:;
#BACKGROUND:;
#LYRICSPATH:;
#CDTITLE:;
#MUSIC:;
#INSTRUMENTTRACK:;
#MUSICLENGTH:;
#OFFSET:;
#STOPS:;
#DELAYS:;
#BPMS:;
#TIMESIGNATURES:;
#LASTBEATHINT:;
#SAMPLESTART:;
#SAMPLELENGTH:;
#DISPLAYBPM:[xxx][xxx:xxx]|[*];
#SELECTABLE:;
#BGCHANGES:;
#FGCHANGES:;
#KEYSOUNDS:;
#ATTACKS:;
// stored in cache
#FIRSTBEAT:; // calculated
#LASTBEAT:; // calculated
#SONGFILENAME:;
#MUSICBYTES:; // ignored by loader
#HASMUSIC:;
#HASBANNER:;
// begin
#NOTEDATA# // marks a new note data section
// information from #NOTES moved here
#STEPSTYPE:;
#DESCRIPTION:;
#DIFFICULTY:;
#METER:;
#RADARVALUES:;
#CREDIT:;
// steps-based timingdata
#STOPS:;
#DELAYS:;
#BPMS:;
#TIMESIGNATURES:;
#LASTBEATHINT:;
// actual step data
// sm-ssc step chart/msd5 hacky file format doc.
// based off of .sm, which was based off of DWI's modified MSD format.
#TITLE:;
#SUBTITLE:;
#ARTIST:;
#TITLETRANSLIT:;
#SUBTITLETRANSLIT:;
#ARTISTTRANSLIT:;
#GENRE:;
#CREDIT:;
#BANNER:;
#BACKGROUND:;
#LYRICSPATH:;
#CDTITLE:;
#MUSIC:;
#INSTRUMENTTRACK:;
#MUSICLENGTH:;
#OFFSET:;
#STOPS:;
#DELAYS:;
#BPMS:;
#TIMESIGNATURES:;
#LASTBEATHINT:;
#SAMPLESTART:;
#SAMPLELENGTH:;
#DISPLAYBPM:[xxx][xxx:xxx]|[*];
#SELECTABLE:;
#BGCHANGES:;
#FGCHANGES:;
#KEYSOUNDS:;
#ATTACKS:;
// stored in cache
#FIRSTBEAT:; // calculated
#LASTBEAT:; // calculated
#SONGFILENAME:;
#MUSICBYTES:; // ignored by loader
#HASMUSIC:;
#HASBANNER:;
// begin
#NOTEDATA# // marks a new note data section
// information from #NOTES moved here
#STEPSTYPE:;
#DESCRIPTION:;
#DIFFICULTY:;
#METER:;
#RADARVALUES:;
#CREDIT:;
// steps-based timingdata
#STOPS:;
#DELAYS:;
#BPMS:;
#TIMESIGNATURES:;
#LASTBEATHINT:;
// actual step data
#NOTES:;
+5 -5
View File
@@ -1,5 +1,5 @@
<html>
<body>
This is a dummy file, installed by the StepMania installer; it will be overwitten the first time machine stats are saved.
</body>
</html>
<html>
<body>
This is a dummy file, installed by the StepMania installer; it will be overwitten the first time machine stats are saved.
</body>
</html>
+144 -144
View File
@@ -1,145 +1,145 @@
[Noteskin Elements Reference]
{ Taps }
button Tap Note
button Tap Mine
button Tap Lift
button Tap Fake
{ holds }
--active--
button Hold Head Active
button Hold Topcap Active
button Hold Body Active
button Hold Bottomcap Active
button Hold Tail Active
--inactive--
button Hold Head Inactive
button Hold Topcap Inactive
button Hold Body Inactive
button Hold Bottomcap Inactive
button Hold Tail Inactive
{ rolls }
--active--
button Roll Head Active
button Roll Topcap Active
button Roll Body Active
button Roll Bottomcap Active
button Roll Tail Active
--inactive--
button Roll Head Inactive
button Roll Topcap Inactive
button Roll Body Inactive
button Roll Bottomcap Inactive
button Roll Tail Inactive
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{ button }
--dance--
Left
Right
Up
Down
UpLeft
UpRight
--pump--
UpLeft
UpRight
Center
DownLeft
DownRight
--kb7--
Key1
Key2
Key3
Key4
Key5
Key6
Key7
--ez2--
FootUpLeft
FootUpRight
FootDown
HandUpLeft
HandUpRight
HandLrLeft
HandLrRight
--para--
Left
UpLeft
Up
UpRight
Right
--ds3ddx--
HandLeft
FootDownLeft
FootUpLeft
HandUp
HandDown
FootUpRight
FootDownRight
HandRight
--beat--
Key1
Key2
Key3
Key4
Key5
Key6
Key7
Scratch up
Scratch down
--maniax--
HandUpLeft
HandUpRight
HandLrLeft
HandLrRight
--techno--
Left
Right
Up
Down
UpLeft
UpRight
Center
DownLeft
DownRight
--popn--
Left White
Left Yellow
Left Green
Left Blue
Red
Right Blue
Right Green
Right Yellow
Right White
--guitar-- (not enabled yet)
Fret1
Fret2
Fret3
Fret4
Fret5
--lights-- (rofl)
MarqueeUpLeft
MarqueeUpRight
MarqueeLrLeft
MarqueeLrRight
ButtonsLeft
ButtonsRight
BassLeft
[Noteskin Elements Reference]
{ Taps }
button Tap Note
button Tap Mine
button Tap Lift
button Tap Fake
{ holds }
--active--
button Hold Head Active
button Hold Topcap Active
button Hold Body Active
button Hold Bottomcap Active
button Hold Tail Active
--inactive--
button Hold Head Inactive
button Hold Topcap Inactive
button Hold Body Inactive
button Hold Bottomcap Inactive
button Hold Tail Inactive
{ rolls }
--active--
button Roll Head Active
button Roll Topcap Active
button Roll Body Active
button Roll Bottomcap Active
button Roll Tail Active
--inactive--
button Roll Head Inactive
button Roll Topcap Inactive
button Roll Body Inactive
button Roll Bottomcap Inactive
button Roll Tail Inactive
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
{ button }
--dance--
Left
Right
Up
Down
UpLeft
UpRight
--pump--
UpLeft
UpRight
Center
DownLeft
DownRight
--kb7--
Key1
Key2
Key3
Key4
Key5
Key6
Key7
--ez2--
FootUpLeft
FootUpRight
FootDown
HandUpLeft
HandUpRight
HandLrLeft
HandLrRight
--para--
Left
UpLeft
Up
UpRight
Right
--ds3ddx--
HandLeft
FootDownLeft
FootUpLeft
HandUp
HandDown
FootUpRight
FootDownRight
HandRight
--beat--
Key1
Key2
Key3
Key4
Key5
Key6
Key7
Scratch up
Scratch down
--maniax--
HandUpLeft
HandUpRight
HandLrLeft
HandLrRight
--techno--
Left
Right
Up
Down
UpLeft
UpRight
Center
DownLeft
DownRight
--popn--
Left White
Left Yellow
Left Green
Left Blue
Red
Right Blue
Right Green
Right Yellow
Right White
--guitar-- (not enabled yet)
Fret1
Fret2
Fret3
Fret4
Fret5
--lights-- (rofl)
MarqueeUpLeft
MarqueeUpRight
MarqueeLrLeft
MarqueeLrRight
ButtonsLeft
ButtonsRight
BassLeft
BassRight
+208 -208
View File
@@ -1,209 +1,209 @@
A list of screen messages that can be used with
SCREENMAN:GetTopScreen():PostScreenMessage('SM_*', delaySeconds).
Duplicate screen messages may appear; the below lists include both
AutoScreenMessage()s and any messages that appear in
Screen*::HandleScreenMessage(const ScreenMessage SM).
Consider this a list of messages that screens can reply to.
[ScreenMessage]
SM_Invalid
SM_None
SM_MenuTimer Timer = 00
SM_DoneFadingIn Plays after sorting by draworder [ScreenWithMenuElements::BeginScreen()]
SM_BeginFadingOut Begins a fadeout?
SM_GoToNextScreen Goes to next screen?
SM_GoToPrevScreen Goes to prev screen?
SM_GainFocus
SM_LoseFocus
SM_Pause try it on Gameplay... :)
SM_Success
SM_Failure
[Inventory]
SM_BattleDamageLevel1
SM_BattleDamageLevel2
SM_BattleDamageLevel3
[Player]
SM_100Combo
SM_200Combo
SM_300Combo
SM_400Combo
SM_500Combo
SM_600Combo
SM_700Combo
SM_800Combo
SM_900Combo
SM_1000Combo
SM_ComboStopped
SM_ComboContinuing
[ScorekeeperNormal]
SM_PlayToasty what do you think it does
[ScreenAttract]
SM_GoToStartScreen
[ScreenGameplay]
SM_NotesEnded
SM_BeginFailed
SM_LeaveGameplay
SM_PlayGo
SM_LoadNextSong
SM_StartLoadingNextSong
SM_DoPrevScreen
SM_DoNextScreen
SM_StartHereWeGo
SM_StopHereWeGo
SM_BattleTrickLevel1
SM_BattleTrickLevel2
SM_BattleTrickLevel3
-- from elsewhere ----------
SM_PlayToasty
SM_100Combo - SM_1000Combo
[ScreenOptions]
SM_ExportOptions
[MusicWheel]
SM_SongChanged
SM_SortOrderChanging
SM_SortOrderChanged
[NetworkSyncManager]
SM_AddToChat
SM_ChangeSong
SM_GotEval
SM_UsersUpdate
SM_SMOnlinePack
[RoomInfoDisplay]
SM_RoomInfoRetract
SM_RoomInfoDeploy
[RoomWheel]
SM_BackFromRoomName
SM_RoomInfoRetract
SM_RoomInfoDeploy
[ScreenEdit]
SM_UpdateTextInfo
SM_BackFromMainMenu
SM_BackFromAreaMenu
SM_BackFromStepsInformation
SM_BackFromOptions
SM_BackFromSongInformation
SM_BackFromBGChange
SM_BackFromInsertTapAttack
SM_BackFromInsertTapAttackPlayerOptions
SM_BackFromInsertCourseAttack
SM_BackFromInsertCourseAttackPlayerOptions
SM_BackFromCourseModeMenu
SM_DoRevertToLastSave
SM_DoRevertFromDisk
SM_BackFromBPMChange
SM_BackFromStopChange
SM_DoSaveAndExit
SM_DoExit
SM_SaveSuccessful
SM_SaveFailed
[ScreenEditMenu]
SM_RefreshSelector
SM_BackFromEditDescription
[ScreenEvaluation]
SM_PlayCheer
SM_AddBonus
[ScreenMiniMenu]
SM_GoToOK
SM_GoToCancel
[ScreenNetEvaluation]
SM_GotEval
[ScreenNetRoom]
SM_SMOnlinePack
SM_BackFromRoomName
SM_BackFromRoomDesc
SM_BackFromRoomPass
SM_BackFromReqPass
SM_RoomInfoRetract
SM_RoomInfoDeploy
[ScreenNetSelectBase]
SM_AddToChat
SM_UsersUpdate
SM_SMOnlinePack
[ScreenNetSelectMusic]
SM_NoSongs
SM_ChangeSong
SM_SMOnlinePack
SM_SetWheelSong
SM_RefreshWheelLocation
SM_SongChanged
SM_UsersUpdate
SM_BackFromPlayerOptions
[ScreenNetworkOptions]
SM_DoneConnecting
[ScreenOptionsEditCourse]
SM_BackFromContextMenu
[ScreenOptionsEditCourseEntry]
SM_BackFromCoursePlayerOptions
[ScreenOptionsManageCourses]
SM_BackFromEnterNameForNew
SM_BackFromRename
SM_BackFromContextMenu
[ScreenOptionsManageEditSteps]
SM_BackFromRename
SM_BackFromDelete
SM_BackFromContextMenu
[ScreenOptionsManageProfiles]
SM_BackFromEnterNameForNew
SM_BackFromRename
SM_BackFromDeleteConfirm
SM_BackFromClearConfirm
SM_BackFromContextMenu
[ScreenOptionsManageWorkouts]
[ScreenOptionsReviewWorkout]
[ScreenPackages]
[ScreenRanking]
[ScreenSelectMaster]
[ScreenSelectMusic]
SM_AllowOptionsMenuRepeat
SM_SongChanged
SM_SortOrderChanging
SM_SortOrderChanged
[ScreenSMOnlineLogin]
SM_SMOnlinePack
SM_PasswordDone
SM_NoProfilesDefined
SM_GoToNextScreen
[ScreenSplash]
SM_PrepScreen
[ScreenStage]
SM_PrepScreen
[ScreenTestFonts]
SM_ChangeText
[WheelBase]
A list of screen messages that can be used with
SCREENMAN:GetTopScreen():PostScreenMessage('SM_*', delaySeconds).
Duplicate screen messages may appear; the below lists include both
AutoScreenMessage()s and any messages that appear in
Screen*::HandleScreenMessage(const ScreenMessage SM).
Consider this a list of messages that screens can reply to.
[ScreenMessage]
SM_Invalid
SM_None
SM_MenuTimer Timer = 00
SM_DoneFadingIn Plays after sorting by draworder [ScreenWithMenuElements::BeginScreen()]
SM_BeginFadingOut Begins a fadeout?
SM_GoToNextScreen Goes to next screen?
SM_GoToPrevScreen Goes to prev screen?
SM_GainFocus
SM_LoseFocus
SM_Pause try it on Gameplay... :)
SM_Success
SM_Failure
[Inventory]
SM_BattleDamageLevel1
SM_BattleDamageLevel2
SM_BattleDamageLevel3
[Player]
SM_100Combo
SM_200Combo
SM_300Combo
SM_400Combo
SM_500Combo
SM_600Combo
SM_700Combo
SM_800Combo
SM_900Combo
SM_1000Combo
SM_ComboStopped
SM_ComboContinuing
[ScorekeeperNormal]
SM_PlayToasty what do you think it does
[ScreenAttract]
SM_GoToStartScreen
[ScreenGameplay]
SM_NotesEnded
SM_BeginFailed
SM_LeaveGameplay
SM_PlayGo
SM_LoadNextSong
SM_StartLoadingNextSong
SM_DoPrevScreen
SM_DoNextScreen
SM_StartHereWeGo
SM_StopHereWeGo
SM_BattleTrickLevel1
SM_BattleTrickLevel2
SM_BattleTrickLevel3
-- from elsewhere ----------
SM_PlayToasty
SM_100Combo - SM_1000Combo
[ScreenOptions]
SM_ExportOptions
[MusicWheel]
SM_SongChanged
SM_SortOrderChanging
SM_SortOrderChanged
[NetworkSyncManager]
SM_AddToChat
SM_ChangeSong
SM_GotEval
SM_UsersUpdate
SM_SMOnlinePack
[RoomInfoDisplay]
SM_RoomInfoRetract
SM_RoomInfoDeploy
[RoomWheel]
SM_BackFromRoomName
SM_RoomInfoRetract
SM_RoomInfoDeploy
[ScreenEdit]
SM_UpdateTextInfo
SM_BackFromMainMenu
SM_BackFromAreaMenu
SM_BackFromStepsInformation
SM_BackFromOptions
SM_BackFromSongInformation
SM_BackFromBGChange
SM_BackFromInsertTapAttack
SM_BackFromInsertTapAttackPlayerOptions
SM_BackFromInsertCourseAttack
SM_BackFromInsertCourseAttackPlayerOptions
SM_BackFromCourseModeMenu
SM_DoRevertToLastSave
SM_DoRevertFromDisk
SM_BackFromBPMChange
SM_BackFromStopChange
SM_DoSaveAndExit
SM_DoExit
SM_SaveSuccessful
SM_SaveFailed
[ScreenEditMenu]
SM_RefreshSelector
SM_BackFromEditDescription
[ScreenEvaluation]
SM_PlayCheer
SM_AddBonus
[ScreenMiniMenu]
SM_GoToOK
SM_GoToCancel
[ScreenNetEvaluation]
SM_GotEval
[ScreenNetRoom]
SM_SMOnlinePack
SM_BackFromRoomName
SM_BackFromRoomDesc
SM_BackFromRoomPass
SM_BackFromReqPass
SM_RoomInfoRetract
SM_RoomInfoDeploy
[ScreenNetSelectBase]
SM_AddToChat
SM_UsersUpdate
SM_SMOnlinePack
[ScreenNetSelectMusic]
SM_NoSongs
SM_ChangeSong
SM_SMOnlinePack
SM_SetWheelSong
SM_RefreshWheelLocation
SM_SongChanged
SM_UsersUpdate
SM_BackFromPlayerOptions
[ScreenNetworkOptions]
SM_DoneConnecting
[ScreenOptionsEditCourse]
SM_BackFromContextMenu
[ScreenOptionsEditCourseEntry]
SM_BackFromCoursePlayerOptions
[ScreenOptionsManageCourses]
SM_BackFromEnterNameForNew
SM_BackFromRename
SM_BackFromContextMenu
[ScreenOptionsManageEditSteps]
SM_BackFromRename
SM_BackFromDelete
SM_BackFromContextMenu
[ScreenOptionsManageProfiles]
SM_BackFromEnterNameForNew
SM_BackFromRename
SM_BackFromDeleteConfirm
SM_BackFromClearConfirm
SM_BackFromContextMenu
[ScreenOptionsManageWorkouts]
[ScreenOptionsReviewWorkout]
[ScreenPackages]
[ScreenRanking]
[ScreenSelectMaster]
[ScreenSelectMusic]
SM_AllowOptionsMenuRepeat
SM_SongChanged
SM_SortOrderChanging
SM_SortOrderChanged
[ScreenSMOnlineLogin]
SM_SMOnlinePack
SM_PasswordDone
SM_NoProfilesDefined
SM_GoToNextScreen
[ScreenSplash]
SM_PrepScreen
[ScreenStage]
SM_PrepScreen
[ScreenTestFonts]
SM_ChangeText
[WheelBase]
SM_SongChanged
+16 -16
View File
@@ -1,17 +1,17 @@
-- how to connect to a server with the new ScreenTextEntry Lua bindings
-- (this is the base code; I'll come up with a full tutorial later.)
SCREENMAN:AddNewScreenToTop("ScreenTextEntry");
local serverSettings = {
Question = "Connect to server:",
MaxInputLength = 255,
OnOK = function(answer)
if IsNetConnected() then
-- close connection before connecting to new server
CloseConnection()
end
-- connect to server
ConnectToServer(answer)
end,
};
-- how to connect to a server with the new ScreenTextEntry Lua bindings
-- (this is the base code; I'll come up with a full tutorial later.)
SCREENMAN:AddNewScreenToTop("ScreenTextEntry");
local serverSettings = {
Question = "Connect to server:",
MaxInputLength = 255,
OnOK = function(answer)
if IsNetConnected() then
-- close connection before connecting to new server
CloseConnection()
end
-- connect to server
ConnectToServer(answer)
end,
};
SCREENMAN:GetTopScreen():Load(serverSettings);
+88 -88
View File
@@ -1,88 +1,88 @@
ThemePrefs, v0.7
----------------
ThemePrefs is a system for handling theme-specific preferences in a standard,
efficient, and predictable way. All you do, basically, is declare a table of
preferences and options and use GetThemePref(name) to get your preference
values as needed. This system will handle all disk I/O as well.
Additionally, it can work in combination with ThemePrefsRows to generate
OptionsRows for all preferences, saving you (most of) the trouble with
integrating it into your theme. More on that later.
The prefs are written, using IniFile, into Save/ThemePrefs.ini, written under
the section corresponding to your theme name (if ThemeInfo exists, it will
use the Name field listed there; otherwise, it will use the folder name).
----------------------
Section 1: Declaration
----------------------
To declare preferences for your theme to use, make a table with named
tables in it; its name is used for the preference, and the tables hold
the options for that preference. All you need to know for now is that
Default is required; for more options, check ThemePrefsRows.
After the table is declared, pass it to the function ThemePrefs.InitAll().
(If you're planning not to use any OptionsRows at all, you can just use
ThemePrefs.Init() to save some processing time, but seriously give the
ThemePrefsRows system a look before you disregard it.)
[code]
local Prefs =
{
BoolPref = { Default = false },
IntPref = { Default = 3 },
}
ThemePrefs.InitAll( Prefs )
[/code]
If your theme is "default", this will generate a ThemePrefs.ini like so:
[default]
BoolPref=false
IntPref=3
----------------
Section 2: Usage
----------------
You can access the value with ThemePrefs.Get(name) or GetThemePref(name):
both calls work identically. The return type will be based on whatever you set
it to, but the subsystem will always try number, then bool, then string, in
that order. Use true and false for bools, not 1 and 0.
For example, if you wanted to branch something in the metrics based on
the value of BoolPref (which is a boolean), you could use the following:
NextScreen=GetThemePref('BoolPref') and "ScreenTrue" or "ScreenFalse"
If you want to set a preference value for some reason, you can use either
ThemePrefs.Set(name, value) or SetThemePref(name, value), but the point of
this API is to simplify and standardize prefs handling, so you really should
not need it. (Use ThemePrefsRows instead.)
-----------------------
Section 3: Localization
-----------------------
ThemePrefs has two strings that can be localized, to be placed under
[ThemePrefs] in the appropriate language INI.
IniFileMissing - displayed when IniFile.lua is not found, which means
ThemePrefs cannot be loaded from or written to disk
UnknownPreference - displayed when an attempt is made to read or write
a preference that does not exist in the system. Uses %s for the
name of the unknown preference.
---------------------
Section 4: Disclaimer
---------------------
Though this is working fine so far, it is still experimental! If you run
into problems, or have suggestions, comments, questions, etc., please talk
to "vyhd" in #sm-ssc on irc.badnik.net, as it's his code to maintain; he
hates subjecting other people to his code (and occasionally vice versa),
but will gladly address concerns that come up.
ThemePrefs, v0.7
----------------
ThemePrefs is a system for handling theme-specific preferences in a standard,
efficient, and predictable way. All you do, basically, is declare a table of
preferences and options and use GetThemePref(name) to get your preference
values as needed. This system will handle all disk I/O as well.
Additionally, it can work in combination with ThemePrefsRows to generate
OptionsRows for all preferences, saving you (most of) the trouble with
integrating it into your theme. More on that later.
The prefs are written, using IniFile, into Save/ThemePrefs.ini, written under
the section corresponding to your theme name (if ThemeInfo exists, it will
use the Name field listed there; otherwise, it will use the folder name).
----------------------
Section 1: Declaration
----------------------
To declare preferences for your theme to use, make a table with named
tables in it; its name is used for the preference, and the tables hold
the options for that preference. All you need to know for now is that
Default is required; for more options, check ThemePrefsRows.
After the table is declared, pass it to the function ThemePrefs.InitAll().
(If you're planning not to use any OptionsRows at all, you can just use
ThemePrefs.Init() to save some processing time, but seriously give the
ThemePrefsRows system a look before you disregard it.)
[code]
local Prefs =
{
BoolPref = { Default = false },
IntPref = { Default = 3 },
}
ThemePrefs.InitAll( Prefs )
[/code]
If your theme is "default", this will generate a ThemePrefs.ini like so:
[default]
BoolPref=false
IntPref=3
----------------
Section 2: Usage
----------------
You can access the value with ThemePrefs.Get(name) or GetThemePref(name):
both calls work identically. The return type will be based on whatever you set
it to, but the subsystem will always try number, then bool, then string, in
that order. Use true and false for bools, not 1 and 0.
For example, if you wanted to branch something in the metrics based on
the value of BoolPref (which is a boolean), you could use the following:
NextScreen=GetThemePref('BoolPref') and "ScreenTrue" or "ScreenFalse"
If you want to set a preference value for some reason, you can use either
ThemePrefs.Set(name, value) or SetThemePref(name, value), but the point of
this API is to simplify and standardize prefs handling, so you really should
not need it. (Use ThemePrefsRows instead.)
-----------------------
Section 3: Localization
-----------------------
ThemePrefs has two strings that can be localized, to be placed under
[ThemePrefs] in the appropriate language INI.
IniFileMissing - displayed when IniFile.lua is not found, which means
ThemePrefs cannot be loaded from or written to disk
UnknownPreference - displayed when an attempt is made to read or write
a preference that does not exist in the system. Uses %s for the
name of the unknown preference.
---------------------
Section 4: Disclaimer
---------------------
Though this is working fine so far, it is still experimental! If you run
into problems, or have suggestions, comments, questions, etc., please talk
to "vyhd" in #sm-ssc on irc.badnik.net, as it's his code to maintain; he
hates subjecting other people to his code (and occasionally vice versa),
but will gladly address concerns that come up.
+145 -145
View File
@@ -1,145 +1,145 @@
ThemePrefsRows, v0.5
--------------------
ThemePrefsRows is an optional system that works with ThemePrefs to generate
Lua-based OptionsRows for every preference used in the system. All you do is
declare a table of preferences and pass it to ThemePrefs.InitAll(), which will
also initialize ThemePrefs. Note that you do need to add an entry for each
preference in [OptionTitles] and [OptionExplanations] to give the row its name
and describe what it does; I hope to find a (clean) way to do it from Lua.
----------------------
Section 1: Declaration
----------------------
Declaring preferences is the same basic concept as ThemePrefs; see that doc
for the basics. So I'll go into the stuff that's important to this API.
As mentioned in ThemePrefs, the table contains options. The possible options
and their types are outlaid here. (The pref's type is defined by Default.)
Default: whatever the value is set to by default. For sanity's sake, you
should have this in your Choices table.
Choices (table): an indexed array containing all the possible OptionsRow
choices. If you're using a Values table, the array values should be
strings. If not, you can use any type that can cast to a string.
Values (table): indexed array of the pref's type containing the value used when
the Choices entry with the same index is chosen in the row. If that
confused you, don't worry: it'll make more sense in the example.
This is optional, if your pref type can cast to strings.
Params (table): optional modifications to the OptionsRow. I'll cover this in
more detail in a later section. You probably won't need it.
To make this clearer, have an example of a valid prefs table:
[code]
local prefs =
{
BoolPref =
{
Default = false,
Choices = { "On", "Off" },
Values = { true, false },
},
IntPref =
{
Default = 3,
Choices = { 1, 2, 3, 4, 5 },
Params = { SelectType = "ShowOneInRow" }
}
}
ThemePrefs.InitAll( prefs )
[/code]
So when "On" is selected, BoolPref will be set to true, and selecting "Off"
will set it false. Simple enough, yeah? This will scale to any type you like.
Enumerations, strings, whatever.
-----------------
Section 2: Params
-----------------
We did promise a more in-depth look at Params, so here it is.
The following arguments and values are currently accepted for Params:
LayoutType (string): "ShowAllInRow" (default), "ShowOneInRow".
ExportOnChange (bool): currently disabled in the source, but available to
set in case it's enabled later. If true, the Save function (which
handles actually setting the preference) is called whenever a value
is changed rather than when the screen changes.
EnabledForPlayers (function): has 'self' as an argument, returns a table of
PlayerNumbers who are allowed to select stuff. Not important yet.
ReloadRowMessages (table): contains an indexed array of strings. Whenever
any of the messages in this table are broadcast, the Load function
(which loads the list of possible options and sets the selected
value/s) is called again.
LoadSelections (function): takes self, list, pn, overrides the default
function. This is advanced usage, so you should probably know
what you're doing to use it. Probably unnecessary.
SaveSelections (function): takes self, list, pn, and overrides the default
function. This is advanced as well, for the same reasons. Fortunately,
you probably won't need it.
----------------
Section 3: Usage
----------------
To get the OptionsRow for the preference you want, use ThemePrefRow(name)
or ThemePrefsRows.GetRow(name); they're the same function. You'd use this
as, for example in the metrics:
Line1="lua,ThemePrefRow('BoolPref')"
Unfortunately, you do need to do some more work with the Language INIs too.
For each declared preference, you need an entry under [OptionTitles] for its
title and an entry under [OptionExplanations] for its description. The key for
both is the name of the preference. With the above example, that'd be e.g.
[OptionTitles]
(...)
BoolPref=BoolPref
IntPref=IntPref
[OptionExplanations]
(...)
BoolPref=Toggles a simple boolean preference between true and false.
IntPref=Sets an integer value between 1 and 5.
-----------------------
Section 4: Localization
-----------------------
ThemePrefsRows has three themable strings:
NoDefaultInValues - if the default value isn't actually in choices or values,
this is displayed. Takes %s for the affected preference's name.
TypeMismatch - if the default type and a value type mismatch, this is shown.
Takes %s, %d, and %s for the default's type, the index of the
mismatching value, and the value's type respectively.
ChoicesSizeMismatch - if the Choices and Values arrays have different
lengths, this is displayed. Takes %d and %d for the size of
Choices and Values, respectively.
---------------------
Section 5: Disclaimer
---------------------
This isn't as tested as I'd like. For this version, it remains experimental.
Quite experimental. If you run into problems, please let me know so I can
fix them.
Please direct all questions, comments, complaints, bug reports, etc. to "vyhd"
in #sm-ssc on irc.badnik.net or whatever other form of communication you like.
ThemePrefsRows, v0.5
--------------------
ThemePrefsRows is an optional system that works with ThemePrefs to generate
Lua-based OptionsRows for every preference used in the system. All you do is
declare a table of preferences and pass it to ThemePrefs.InitAll(), which will
also initialize ThemePrefs. Note that you do need to add an entry for each
preference in [OptionTitles] and [OptionExplanations] to give the row its name
and describe what it does; I hope to find a (clean) way to do it from Lua.
----------------------
Section 1: Declaration
----------------------
Declaring preferences is the same basic concept as ThemePrefs; see that doc
for the basics. So I'll go into the stuff that's important to this API.
As mentioned in ThemePrefs, the table contains options. The possible options
and their types are outlaid here. (The pref's type is defined by Default.)
Default: whatever the value is set to by default. For sanity's sake, you
should have this in your Choices table.
Choices (table): an indexed array containing all the possible OptionsRow
choices. If you're using a Values table, the array values should be
strings. If not, you can use any type that can cast to a string.
Values (table): indexed array of the pref's type containing the value used when
the Choices entry with the same index is chosen in the row. If that
confused you, don't worry: it'll make more sense in the example.
This is optional, if your pref type can cast to strings.
Params (table): optional modifications to the OptionsRow. I'll cover this in
more detail in a later section. You probably won't need it.
To make this clearer, have an example of a valid prefs table:
[code]
local prefs =
{
BoolPref =
{
Default = false,
Choices = { "On", "Off" },
Values = { true, false },
},
IntPref =
{
Default = 3,
Choices = { 1, 2, 3, 4, 5 },
Params = { SelectType = "ShowOneInRow" }
}
}
ThemePrefs.InitAll( prefs )
[/code]
So when "On" is selected, BoolPref will be set to true, and selecting "Off"
will set it false. Simple enough, yeah? This will scale to any type you like.
Enumerations, strings, whatever.
-----------------
Section 2: Params
-----------------
We did promise a more in-depth look at Params, so here it is.
The following arguments and values are currently accepted for Params:
LayoutType (string): "ShowAllInRow" (default), "ShowOneInRow".
ExportOnChange (bool): currently disabled in the source, but available to
set in case it's enabled later. If true, the Save function (which
handles actually setting the preference) is called whenever a value
is changed rather than when the screen changes.
EnabledForPlayers (function): has 'self' as an argument, returns a table of
PlayerNumbers who are allowed to select stuff. Not important yet.
ReloadRowMessages (table): contains an indexed array of strings. Whenever
any of the messages in this table are broadcast, the Load function
(which loads the list of possible options and sets the selected
value/s) is called again.
LoadSelections (function): takes self, list, pn, overrides the default
function. This is advanced usage, so you should probably know
what you're doing to use it. Probably unnecessary.
SaveSelections (function): takes self, list, pn, and overrides the default
function. This is advanced as well, for the same reasons. Fortunately,
you probably won't need it.
----------------
Section 3: Usage
----------------
To get the OptionsRow for the preference you want, use ThemePrefRow(name)
or ThemePrefsRows.GetRow(name); they're the same function. You'd use this
as, for example in the metrics:
Line1="lua,ThemePrefRow('BoolPref')"
Unfortunately, you do need to do some more work with the Language INIs too.
For each declared preference, you need an entry under [OptionTitles] for its
title and an entry under [OptionExplanations] for its description. The key for
both is the name of the preference. With the above example, that'd be e.g.
[OptionTitles]
(...)
BoolPref=BoolPref
IntPref=IntPref
[OptionExplanations]
(...)
BoolPref=Toggles a simple boolean preference between true and false.
IntPref=Sets an integer value between 1 and 5.
-----------------------
Section 4: Localization
-----------------------
ThemePrefsRows has three themable strings:
NoDefaultInValues - if the default value isn't actually in choices or values,
this is displayed. Takes %s for the affected preference's name.
TypeMismatch - if the default type and a value type mismatch, this is shown.
Takes %s, %d, and %s for the default's type, the index of the
mismatching value, and the value's type respectively.
ChoicesSizeMismatch - if the Choices and Values arrays have different
lengths, this is displayed. Takes %d and %d for the size of
Choices and Values, respectively.
---------------------
Section 5: Disclaimer
---------------------
This isn't as tested as I'd like. For this version, it remains experimental.
Quite experimental. If you run into problems, please let me know so I can
fix them.
Please direct all questions, comments, complaints, bug reports, etc. to "vyhd"
in #sm-ssc on irc.badnik.net or whatever other form of communication you like.
+44 -44
View File
@@ -1,45 +1,45 @@
[sm-ssc v1.0 public beta 2 | last update 2010/apr 11]
This is a list of all the known Actor classes in sm-ssc. You can use these by
prefixing "Def." on the end of the name (e.g. Def.PaneDisplay).
Actor
ActorFrame
ActorFrameTexture
ActorMultiTexture
ActorProxy
ActorScroller
Banner
BGAnimation
BitmapText
BPMDisplay
ComboGraph
ControllerStateDisplay
CourseContentsList
DeviceList
DifficultyIcon
DynamicActorScroller
FadingBanner
GradeDisplay
GraphDisplay
GrooveRadar
HelpDisplay
HoldJudgment
InputList
MemoryCardDisplay
MeterDisplay
Model
ModIconRow
PaneDisplay
PercentageDisplay
Quad
RollingNumbers
ScoreDisplayAliveTime
ScoreDisplayCalories
SongBPMDisplay
SongMeterDisplay
Sound
Sprite
StepsDisplay
StepsDisplayList
TextBanner
[sm-ssc v1.0 public beta 2 | last update 2010/apr 11]
This is a list of all the known Actor classes in sm-ssc. You can use these by
prefixing "Def." on the end of the name (e.g. Def.PaneDisplay).
Actor
ActorFrame
ActorFrameTexture
ActorMultiTexture
ActorProxy
ActorScroller
Banner
BGAnimation
BitmapText
BPMDisplay
ComboGraph
ControllerStateDisplay
CourseContentsList
DeviceList
DifficultyIcon
DynamicActorScroller
FadingBanner
GradeDisplay
GraphDisplay
GrooveRadar
HelpDisplay
HoldJudgment
InputList
MemoryCardDisplay
MeterDisplay
Model
ModIconRow
PaneDisplay
PercentageDisplay
Quad
RollingNumbers
ScoreDisplayAliveTime
ScoreDisplayCalories
SongBPMDisplay
SongMeterDisplay
Sound
Sprite
StepsDisplay
StepsDisplayList
TextBanner
WorkoutGraph
+60 -60
View File
@@ -1,61 +1,61 @@
sm-ssc Conditional Music/Sounds [v0001 | 2010/03/23 | written by AJ]
--------------------------------------------------------------------
Conditional Music/Sounds allows a themer to use Lua scripts to determine what
sound is played. This can be useful for many reasons, mainly to give a theme
some extra flavor. It can be used (along with UserPreferences+EnvUtils2) to
mimic beatmania IIDX's BGM selection ability (also seen in various k//eternal
themes for StepMania 3.9 via an external program).
This is a feature that will lock your theme to sm-ssc, since StepMania 4 does
not support it. If you care about having an easily-portable theme, conditional
music/sounds won't really help. However, it is a nice feature to have.
Implementing conditional music/sounds in sm-ssc requires the following:
* multiple sound files in Themes/{yourtheme}/Sounds/
* A Lua script that returns the path to one of these sounds, wrapped in a
THEME:GetPathS().
The canonical example is the one used to test the code in the first place.
This is a Lua script.
[code]
-- given two audio files _agB.(mp3/ogg/wav) and _agA.(mp3/ogg/wav), this will
-- return a random sound.
local a = math.random(50);
local ret;
if a % 2 == 0 then
ret = "_agB";
else
ret = "_agA";
end;
-- THEME:GetPathS() has to be used here since the script doesn't know where it is.
return THEME:GetPathS("",ret);
[/code]
Of course, this file could be simplified, but since only two choices were
available at the time, there was no need. Unfortunately, that means a lot of
possible edge cases exist where problems could arise.
For example: it's currently unknown if you can use EnvUtils or UserPreferences
to set the song.
This example uses a different song each month.
[code]
local songs = {
"neatsong1", -- January
"neatsong2", -- February
"neatsong3", -- March
"joke", -- April
"fiesta", -- May
"anothersong", -- June
"airsong", -- July
"earthsong", -- August
"watersong", -- September
"spooky", -- October
"firesong", -- November
"holidays", -- December
};
-- MonthOfYear starts at 0. Lua arrays are 1-indexed, so fix the value
local curMonth = MonthOfYear()+1;
return THEME:GetPathS("",songs[curMonth]);
sm-ssc Conditional Music/Sounds [v0001 | 2010/03/23 | written by AJ]
--------------------------------------------------------------------
Conditional Music/Sounds allows a themer to use Lua scripts to determine what
sound is played. This can be useful for many reasons, mainly to give a theme
some extra flavor. It can be used (along with UserPreferences+EnvUtils2) to
mimic beatmania IIDX's BGM selection ability (also seen in various k//eternal
themes for StepMania 3.9 via an external program).
This is a feature that will lock your theme to sm-ssc, since StepMania 4 does
not support it. If you care about having an easily-portable theme, conditional
music/sounds won't really help. However, it is a nice feature to have.
Implementing conditional music/sounds in sm-ssc requires the following:
* multiple sound files in Themes/{yourtheme}/Sounds/
* A Lua script that returns the path to one of these sounds, wrapped in a
THEME:GetPathS().
The canonical example is the one used to test the code in the first place.
This is a Lua script.
[code]
-- given two audio files _agB.(mp3/ogg/wav) and _agA.(mp3/ogg/wav), this will
-- return a random sound.
local a = math.random(50);
local ret;
if a % 2 == 0 then
ret = "_agB";
else
ret = "_agA";
end;
-- THEME:GetPathS() has to be used here since the script doesn't know where it is.
return THEME:GetPathS("",ret);
[/code]
Of course, this file could be simplified, but since only two choices were
available at the time, there was no need. Unfortunately, that means a lot of
possible edge cases exist where problems could arise.
For example: it's currently unknown if you can use EnvUtils or UserPreferences
to set the song.
This example uses a different song each month.
[code]
local songs = {
"neatsong1", -- January
"neatsong2", -- February
"neatsong3", -- March
"joke", -- April
"fiesta", -- May
"anothersong", -- June
"airsong", -- July
"earthsong", -- August
"watersong", -- September
"spooky", -- October
"firesong", -- November
"holidays", -- December
};
-- MonthOfYear starts at 0. Lua arrays are 1-indexed, so fix the value
local curMonth = MonthOfYear()+1;
return THEME:GetPathS("",songs[curMonth]);
[/code]
+25 -25
View File
@@ -1,26 +1,26 @@
SM4 Font .ini values
[common]
CapitalsOnly - If set to 1, lowercase letters are drawn with uppercase letters instead.
RightToLeft - Font should be rendered as right to left.
DefaultStrokeColor - Sets default stroke color. (e.g. #00000000)
[main]
import - Imports a font page into the current font.
(per-page)
DrawExtraPixelsLeft - How many pixels to draw to the left of a character.
DrawExtraPixelsRight - How many pixels to draw to the right of a character.
AddToAllWidths - Adds x amount of pixels to all widths.
ScaleAllWidthsBy - Scales widths by the factor specified.
LineSpacing - Modifies line spacing.
Top - Specifies the top of the character. (in pixels)
Baseline - Specifies the baseline of the character. (in pixels)
DefaultWidth - Default width for a glyph.
AdvanceExtraPixels - Rudimentary way to control letter spacing
TextureHints - An alternative to throwing the TextureHints in the filename.
(general commands)
MAP - Maps a keyword to a frame number. (e.g. map up=0)
RANGE - Defines a Unicode range to use.
SM4 Font .ini values
[common]
CapitalsOnly - If set to 1, lowercase letters are drawn with uppercase letters instead.
RightToLeft - Font should be rendered as right to left.
DefaultStrokeColor - Sets default stroke color. (e.g. #00000000)
[main]
import - Imports a font page into the current font.
(per-page)
DrawExtraPixelsLeft - How many pixels to draw to the left of a character.
DrawExtraPixelsRight - How many pixels to draw to the right of a character.
AddToAllWidths - Adds x amount of pixels to all widths.
ScaleAllWidthsBy - Scales widths by the factor specified.
LineSpacing - Modifies line spacing.
Top - Specifies the top of the character. (in pixels)
Baseline - Specifies the baseline of the character. (in pixels)
DefaultWidth - Default width for a glyph.
AdvanceExtraPixels - Rudimentary way to control letter spacing
TextureHints - An alternative to throwing the TextureHints in the filename.
(general commands)
MAP - Maps a keyword to a frame number. (e.g. map up=0)
RANGE - Defines a Unicode range to use.
LINE - (e.g. Line 1=ABCDEFGH)
+61 -61
View File
@@ -1,62 +1,62 @@
all the known gamecommands (pre-sm-ssc)
"style"
"playmode"
"difficulty"
"announcer" {m_sAnnouncer = sValue;}
"name" {m_sName = sValue;}
"text" {m_sText = sValue;}
"mod" {m_sPreferredModifiers += sValue;}
"stagemod" {m_sStageModifiers += sValue;}
"lua"
"screen" {m_sScreen = sValue;}
"song"
"steps"
"course"
"trail"
"setenv" {
if( cmd.m_vsArgs.size() == 3 )
m_SetEnv[ cmd.m_vsArgs[1] ] = cmd.m_vsArgs[2]; }
"songgroup" {m_sSongGroup = sValue;}
"sort"
{
m_SortOrder = StringToSortOrder( sValue );
if( m_SortOrder == SortOrder_Invalid )
{
m_sInvalidReason = ssprintf( "SortOrder \"%s\" is not valid.", sValue.c_str() );
m_bInvalid |= true;
}
}
"weight" {m_iWeightPounds = atoi( sValue );}
"goalcalories" {m_iGoalCalories = atoi( sValue );}
"goaltype" {m_GoalType = StringToGoalType( sValue );}
"profileid" {m_sProfileID = sValue;}
"url" {m_sUrl = sValue;}
"sound" {m_sSoundPath = sValue;}
"preparescreen" {m_vsScreensToPrepare.push_back( sValue );}
"insertcredit" {m_bInsertCredit = true;}
"clearcredits" {m_bClearCredits = true;}
"stopmusic" {m_bStopMusic = true;}
all the known gamecommands (pre-sm-ssc)
"style"
"playmode"
"difficulty"
"announcer" {m_sAnnouncer = sValue;}
"name" {m_sName = sValue;}
"text" {m_sText = sValue;}
"mod" {m_sPreferredModifiers += sValue;}
"stagemod" {m_sStageModifiers += sValue;}
"lua"
"screen" {m_sScreen = sValue;}
"song"
"steps"
"course"
"trail"
"setenv" {
if( cmd.m_vsArgs.size() == 3 )
m_SetEnv[ cmd.m_vsArgs[1] ] = cmd.m_vsArgs[2]; }
"songgroup" {m_sSongGroup = sValue;}
"sort"
{
m_SortOrder = StringToSortOrder( sValue );
if( m_SortOrder == SortOrder_Invalid )
{
m_sInvalidReason = ssprintf( "SortOrder \"%s\" is not valid.", sValue.c_str() );
m_bInvalid |= true;
}
}
"weight" {m_iWeightPounds = atoi( sValue );}
"goalcalories" {m_iGoalCalories = atoi( sValue );}
"goaltype" {m_GoalType = StringToGoalType( sValue );}
"profileid" {m_sProfileID = sValue;}
"url" {m_sUrl = sValue;}
"sound" {m_sSoundPath = sValue;}
"preparescreen" {m_vsScreensToPrepare.push_back( sValue );}
"insertcredit" {m_bInsertCredit = true;}
"clearcredits" {m_bClearCredits = true;}
"stopmusic" {m_bStopMusic = true;}
"applydefaultoptions" {m_bApplyDefaultOptions = true;}
+131 -131
View File
@@ -1,132 +1,132 @@
Scripts included with sm-ssc's fallback theme
---------------------------------------------
(as of sm-ssc v1.0 beta 2, this document is out of date.
Please see hierarchy.txt referenced below for an up-to-date look at the script
execution order/prefixes. This document will be updated again soon)
As a StepMania fork focused on themers, sm-ssc is going to be a bit different
than a normal StepMania 4 setup. The fallback theme includes a number of scripts
you won't find in the SM4 default theme. This file is meant to be an overview of
what happens in the scripts; it does not go in depth with any of them. Please
see the documentation included in the scripts as comments, as well as any text
files for the more sufficiently advanced scripts.
For an explanation of why the scripts are named with numbers at the beginning,
see hierarchy.txt in Themes/_fallback/Scripts/ for more information.
==00 init.lua== (StepMania 4)
Always executed first, this file does the following:
* replaces Lua's Uppercase function with StepMania's (which is always UTF8)
* alias Trace, Warn, and print
* creates convienence aliases PLAYER_1, PLAYER_2, and NUM_PLAYERS
* creates find_last(text) function for strings.
==01 alias.lua== (sm-ssc)
This file is used to create aliases for functions. Usually, it's used for making
case-sensitive commands case-insensitive without having to make source code
edits to accomplish the same thing.
==01 base.lua== (StepMania 4)
* overrides loadfile to use StepMania's.
* overrides dofile to use SM's loadfile.
* creates a function ivalues(t), which is like pairs but returns only values.
==01 compat.lua== (sm-ssc)
sm-ssc compatibility helpers. Since sm-ssc renames and deprecates some features,
this file is used to help ease the transition of themes that still use the old
commands.
==02 CustomSpeedMods.lua== (sm-ssc)
This version of AJ Kelly's CustomSpeedMods is for sm-ssc, since it allows for
reading in of both player and machine slots, as well as merging of the speed
mods of all three (if applicable). By including this in _fallback, every sm-ssc
theme has access to custom speed mods from the start.
To use CustomSpeedMods in your theme, find [ScreenPlayerOptions] in the metrics,
find "list,Speed" and replace it with "lua,SpeedMods()".
==02 EnvUtils2.lua== (sm-ssc)
EnvUtils2 provides the getenv(name) and setenv(name,value) commands.
==02 HSV.lua== (sm-ssc)
[to be written]
==02 ProductivityHelpers.lua== (sm-ssc)
This file is the sm-ssc edition of ProductivityHelpers. It shouldn't be used
with any newly created regular SM4 themes, just sm-ssc ones.
* provides the Blend alias, allowing for commands like blend,Blend.Add; etc.
* provides the Health alias, which provides a mapping to various HealthState
enums.
* CenterX, CenterY, xy (set both the x and y coords in one command)
* MaskSource and MaskDest commands for easier masking.
Various others are included, see the file for more information.
==02 UserPreferences2.lua== (sm-ssc)
[to be written]
==03 FileUtils.lua== (sm-ssc)
FileUtils is used to read and write files with minimal effort.
* File.Read(path) reads in the file at path.
* File.Write(path,buf) writes the contents of buf to the file at path.
If either of the two error out/don't work, check the log for the reason why.
==03 WidescreenHelpers.lua== (sm-ssc)
[to be written]
==Actor.lua== (StepMania 4)
[to be written]
==ActorDef.lua== (StepMania 4)
[to be written]
==Branches.lua== (sm-ssc)
sm-ssc's branch system is slightly different than the one in StepMania 4.
Instead of having multiple functions, all the branches are contained within a
single table, Branch. All the branches are members of this table, so you'll see
things like
NextScreen=Branch.PlayerOptions()
in the theme.
==Colors.lua== (StepMania 4)
[to be written]
==DateTime.lua== (sm-ssc)
freem, inc.'s DateTime class only exists to provide two commands at the moment:
* Date.Today() - returns today's date as YYYYMMDD.
* Time.Now() - returns the current time in 24 hour format as HH:MM:SS.
Eventually, this class may grow bigger.
==Debug.lua== (StepMania 4)
[to be written]
==Enum.lua== (StepMania 4)
[to be written]
==HelpDisplay.lua== (StepMania 4)
[to be written]
==Lyrics.lua== (StepMania 4)
[to be written]
==OptionsMenu.lua== (StepMania 4)
[to be written]
==Other.lua== (StepMania 4)
[to be written]
==Serialize.lua== (StepMania 4)
[to be written]
==Sound.lua== (StepMania 4)
[to be written]
==Sprite.lua== (StepMania 4)
[to be written]
==StageMods.lua== (StepMania 4)
[to be written]
==Utilities.lua== (StepMania 4)
Scripts included with sm-ssc's fallback theme
---------------------------------------------
(as of sm-ssc v1.0 beta 2, this document is out of date.
Please see hierarchy.txt referenced below for an up-to-date look at the script
execution order/prefixes. This document will be updated again soon)
As a StepMania fork focused on themers, sm-ssc is going to be a bit different
than a normal StepMania 4 setup. The fallback theme includes a number of scripts
you won't find in the SM4 default theme. This file is meant to be an overview of
what happens in the scripts; it does not go in depth with any of them. Please
see the documentation included in the scripts as comments, as well as any text
files for the more sufficiently advanced scripts.
For an explanation of why the scripts are named with numbers at the beginning,
see hierarchy.txt in Themes/_fallback/Scripts/ for more information.
==00 init.lua== (StepMania 4)
Always executed first, this file does the following:
* replaces Lua's Uppercase function with StepMania's (which is always UTF8)
* alias Trace, Warn, and print
* creates convienence aliases PLAYER_1, PLAYER_2, and NUM_PLAYERS
* creates find_last(text) function for strings.
==01 alias.lua== (sm-ssc)
This file is used to create aliases for functions. Usually, it's used for making
case-sensitive commands case-insensitive without having to make source code
edits to accomplish the same thing.
==01 base.lua== (StepMania 4)
* overrides loadfile to use StepMania's.
* overrides dofile to use SM's loadfile.
* creates a function ivalues(t), which is like pairs but returns only values.
==01 compat.lua== (sm-ssc)
sm-ssc compatibility helpers. Since sm-ssc renames and deprecates some features,
this file is used to help ease the transition of themes that still use the old
commands.
==02 CustomSpeedMods.lua== (sm-ssc)
This version of AJ Kelly's CustomSpeedMods is for sm-ssc, since it allows for
reading in of both player and machine slots, as well as merging of the speed
mods of all three (if applicable). By including this in _fallback, every sm-ssc
theme has access to custom speed mods from the start.
To use CustomSpeedMods in your theme, find [ScreenPlayerOptions] in the metrics,
find "list,Speed" and replace it with "lua,SpeedMods()".
==02 EnvUtils2.lua== (sm-ssc)
EnvUtils2 provides the getenv(name) and setenv(name,value) commands.
==02 HSV.lua== (sm-ssc)
[to be written]
==02 ProductivityHelpers.lua== (sm-ssc)
This file is the sm-ssc edition of ProductivityHelpers. It shouldn't be used
with any newly created regular SM4 themes, just sm-ssc ones.
* provides the Blend alias, allowing for commands like blend,Blend.Add; etc.
* provides the Health alias, which provides a mapping to various HealthState
enums.
* CenterX, CenterY, xy (set both the x and y coords in one command)
* MaskSource and MaskDest commands for easier masking.
Various others are included, see the file for more information.
==02 UserPreferences2.lua== (sm-ssc)
[to be written]
==03 FileUtils.lua== (sm-ssc)
FileUtils is used to read and write files with minimal effort.
* File.Read(path) reads in the file at path.
* File.Write(path,buf) writes the contents of buf to the file at path.
If either of the two error out/don't work, check the log for the reason why.
==03 WidescreenHelpers.lua== (sm-ssc)
[to be written]
==Actor.lua== (StepMania 4)
[to be written]
==ActorDef.lua== (StepMania 4)
[to be written]
==Branches.lua== (sm-ssc)
sm-ssc's branch system is slightly different than the one in StepMania 4.
Instead of having multiple functions, all the branches are contained within a
single table, Branch. All the branches are members of this table, so you'll see
things like
NextScreen=Branch.PlayerOptions()
in the theme.
==Colors.lua== (StepMania 4)
[to be written]
==DateTime.lua== (sm-ssc)
freem, inc.'s DateTime class only exists to provide two commands at the moment:
* Date.Today() - returns today's date as YYYYMMDD.
* Time.Now() - returns the current time in 24 hour format as HH:MM:SS.
Eventually, this class may grow bigger.
==Debug.lua== (StepMania 4)
[to be written]
==Enum.lua== (StepMania 4)
[to be written]
==HelpDisplay.lua== (StepMania 4)
[to be written]
==Lyrics.lua== (StepMania 4)
[to be written]
==OptionsMenu.lua== (StepMania 4)
[to be written]
==Other.lua== (StepMania 4)
[to be written]
==Serialize.lua== (StepMania 4)
[to be written]
==Sound.lua== (StepMania 4)
[to be written]
==Sprite.lua== (StepMania 4)
[to be written]
==StageMods.lua== (StepMania 4)
[to be written]
==Utilities.lua== (StepMania 4)
[to be written]
+157 -157
View File
@@ -1,158 +1,158 @@
This file contains a list of messages that are used by certain actors.
The parameters are included within (), and will sometimes have the proper
type. (wip document lol)
================================================================================
GhostArrowRow
ColumnJudgmentMessage(
tns TapNoteScore
tns HoldNoteScore
bool Bright
)
===========================================
CourseContentsList
SetSongMessage(
PlayerNumber
Song
Steps
Difficulty
Meter
Number
Modifiers
Secret
)
===========================================
DifficultyMeter
SetMessage(
Steps
Trail
Meter
StepsType
Difficulty
IsCourseDifficulty
EditDescription
)
===========================================
EditMenu
SetMessage( Song )
===========================================
GameSoundManager
CrossedBeat( Beat )
===========================================
GameState
MessageIDToString(Message_PlayerJoined)Message( Player )
MessageIDToString(Message_PlayerUnjoined)Message( Player )
===========================================
LifeMeterBar
LifeChangedMessage(
Player
LifeMeter
)
===========================================
LifeMeterTime
LifeChangedMessage(
Player
TapNoteScore
HoldNoteScore
OldLife
Difference
LifeMeter
)
===========================================
MusicWheelItem
SetMessage(
Song
Course
Index
HasFocus
SongGroup
)
SetGradeMessage(
PlayerNumber
Grade
NumTimesPlayed
)
===========================================
NoteDisplay
SetAttackMessage( "Modifiers" )
===========================================
OptionRow
RefreshMessage( GameCommand )
===========================================
Player
TransformMessage(
Player
MultiPlayer
iEnabledPlayerIndex
iNumEnabledPlayers
bPlayerUsingBothSides
bReverse
bCentered
)
ComboChangedMessage(
Player
OldCombo
OldMissCombo
PlayerState
PlayerStageStats
)
StepMessage( PlayerNumber, MultiPlayer )
JudgmentMessage(
Player
MultiPlayer
TapNoteScore
Early
TapNoteOffset
HoldNoteScore
)
ComboMessage(
Combo
Misses
FullComboW1
FullComboW2
FullComboW3
)
===========================================
ScoreKeeper*
ScoreChangedMessage( PlayerNumber, MultiPlayer )
===========================================
ScreenContinue
HurryTimerMessage( PlayerNumber )
===========================================
ScreenGameplay
HealthStateChangedMessage(
PlayerNumber
HealthState
)
PlayerFailedMessage( PlayerNumber )
===========================================
ScreenManager
HideSystemMessage()
RefreshCreditText()
SystemMessageMessage( Message, NoAnimate )
===========================================
ScreenWithMenuElements
This file contains a list of messages that are used by certain actors.
The parameters are included within (), and will sometimes have the proper
type. (wip document lol)
================================================================================
GhostArrowRow
ColumnJudgmentMessage(
tns TapNoteScore
tns HoldNoteScore
bool Bright
)
===========================================
CourseContentsList
SetSongMessage(
PlayerNumber
Song
Steps
Difficulty
Meter
Number
Modifiers
Secret
)
===========================================
DifficultyMeter
SetMessage(
Steps
Trail
Meter
StepsType
Difficulty
IsCourseDifficulty
EditDescription
)
===========================================
EditMenu
SetMessage( Song )
===========================================
GameSoundManager
CrossedBeat( Beat )
===========================================
GameState
MessageIDToString(Message_PlayerJoined)Message( Player )
MessageIDToString(Message_PlayerUnjoined)Message( Player )
===========================================
LifeMeterBar
LifeChangedMessage(
Player
LifeMeter
)
===========================================
LifeMeterTime
LifeChangedMessage(
Player
TapNoteScore
HoldNoteScore
OldLife
Difference
LifeMeter
)
===========================================
MusicWheelItem
SetMessage(
Song
Course
Index
HasFocus
SongGroup
)
SetGradeMessage(
PlayerNumber
Grade
NumTimesPlayed
)
===========================================
NoteDisplay
SetAttackMessage( "Modifiers" )
===========================================
OptionRow
RefreshMessage( GameCommand )
===========================================
Player
TransformMessage(
Player
MultiPlayer
iEnabledPlayerIndex
iNumEnabledPlayers
bPlayerUsingBothSides
bReverse
bCentered
)
ComboChangedMessage(
Player
OldCombo
OldMissCombo
PlayerState
PlayerStageStats
)
StepMessage( PlayerNumber, MultiPlayer )
JudgmentMessage(
Player
MultiPlayer
TapNoteScore
Early
TapNoteOffset
HoldNoteScore
)
ComboMessage(
Combo
Misses
FullComboW1
FullComboW2
FullComboW3
)
===========================================
ScoreKeeper*
ScoreChangedMessage( PlayerNumber, MultiPlayer )
===========================================
ScreenContinue
HurryTimerMessage( PlayerNumber )
===========================================
ScreenGameplay
HealthStateChangedMessage(
PlayerNumber
HealthState
)
PlayerFailedMessage( PlayerNumber )
===========================================
ScreenManager
HideSystemMessage()
RefreshCreditText()
SystemMessageMessage( Message, NoAnimate )
===========================================
ScreenWithMenuElements
SetHelpTextMessage( Text )
+49 -49
View File
@@ -1,50 +1,50 @@
Recommended Practices when theming for sm-ssc
---------------------------------------------
1) Use the --theme= command line parameter to switch between themes quickly.
This way, you don't have to deal with the theme switch and all the possible
nonsense errors that might come up (due to you having a different amount of
song group colors, timer warning states, etc.), and you can quickly switch
themes if you work on many of them at once.
2) If you want to create a theme that targets both regular StepMania 4 and
sm-ssc, there are a few precautions to take care of.
2a) First, decide if you want to develop it on sm-ssc first or SM4 first. It is
usually easier to deal with making the theme in normal SM4 and using _portKit-SM4
to get the theme running up in sm-ssc.
If you do decide to make the theme for sm-ssc first, be prepared to fill in a lot
of files that sm-ssc _fallback makes empty for you, as the metrics, graphics, and
BGAnimations from SM4's default theme will be loaded instead of sm-ssc's _fallback.
2b) sm-ssc's _fallback theme defines a variable, SSC, like so:
[code]SSC = (ProductID() == "sm-ssc");[/code]
This will return true if it's sm-ssc, or false if it's SM4.
You should define this in a script (00 themeInfo.lua is a good place), so that
SM4 will be able to recognize it.
With this "SSC guard" in place, you can now wrap things in "if SSC then"
statements if they won't work on SM4. You can also provide alternatives if the
player isn't using sm-ssc, since sometimes SM4 will have an approximation or
alternate way to get the data.
3) When dealing with frame size errors or theme code errors, don't just hide the
dialog and pretend they don't exist. Good themers fix these problems instead of
releasing the theme and saying "oh, just play it in fullscreen mode".
If you have hidden the error dialogs, you'll need to modify Preferences.ini.
Find the IgnoredDialogs= line and remove everything after the = sign. You will
now recieve the error messages in windowed mode again.
4) While this is a SSC-specific practice, having a themeInfo file set up in
your theme's Scripts directory is a good way to store information about the
theme (e.g. version number, date, product code, etc.)
An example of a themeInfo script:
[code]
themeInfo = {
Name = "your theme's name",
Version = "v1.0", -- typically a float or string. floats are easier to compare.
Date = "20100426 1115",
};
Recommended Practices when theming for sm-ssc
---------------------------------------------
1) Use the --theme= command line parameter to switch between themes quickly.
This way, you don't have to deal with the theme switch and all the possible
nonsense errors that might come up (due to you having a different amount of
song group colors, timer warning states, etc.), and you can quickly switch
themes if you work on many of them at once.
2) If you want to create a theme that targets both regular StepMania 4 and
sm-ssc, there are a few precautions to take care of.
2a) First, decide if you want to develop it on sm-ssc first or SM4 first. It is
usually easier to deal with making the theme in normal SM4 and using _portKit-SM4
to get the theme running up in sm-ssc.
If you do decide to make the theme for sm-ssc first, be prepared to fill in a lot
of files that sm-ssc _fallback makes empty for you, as the metrics, graphics, and
BGAnimations from SM4's default theme will be loaded instead of sm-ssc's _fallback.
2b) sm-ssc's _fallback theme defines a variable, SSC, like so:
[code]SSC = (ProductID() == "sm-ssc");[/code]
This will return true if it's sm-ssc, or false if it's SM4.
You should define this in a script (00 themeInfo.lua is a good place), so that
SM4 will be able to recognize it.
With this "SSC guard" in place, you can now wrap things in "if SSC then"
statements if they won't work on SM4. You can also provide alternatives if the
player isn't using sm-ssc, since sometimes SM4 will have an approximation or
alternate way to get the data.
3) When dealing with frame size errors or theme code errors, don't just hide the
dialog and pretend they don't exist. Good themers fix these problems instead of
releasing the theme and saying "oh, just play it in fullscreen mode".
If you have hidden the error dialogs, you'll need to modify Preferences.ini.
Find the IgnoredDialogs= line and remove everything after the = sign. You will
now recieve the error messages in windowed mode again.
4) While this is a SSC-specific practice, having a themeInfo file set up in
your theme's Scripts directory is a good way to store information about the
theme (e.g. version number, date, product code, etc.)
An example of a themeInfo script:
[code]
themeInfo = {
Name = "your theme's name",
Version = "v1.0", -- typically a float or string. floats are easier to compare.
Date = "20100426 1115",
};
[/code]
+225 -225
View File
@@ -1,226 +1,226 @@
How to Theme for sm-ssc: THE DOC.
________________________________________________________________________________
Table of Contents
i. Introduction
ii. Requirements
----------------
1. Introduction to Concepts
1. The Raw Elements
1. Metrics
2. BGAnimations
3. Graphics
4. Fonts
5. Sounds
6. Languages
7. Scripts
8. Other
2. Screens, Classes, Managers and more
2. Elements in Detail
1. Metrics and Languages
2. BGAnimations
3. Graphics
4. Fonts
5. Sounds
6. Scripts
X. Making Your First sm-ssc Theme
1. Setup
2.
________________________________________________________________________________
i. Introduction
________________________________________________________________________________
ii. Requirements
In order to follow along with this guide, you will need the following:
* sm-ssc (our fork of StepMania 4)
* A decent text editor (syntax highlighting is a plus)
* A decent graphics editor (for any graphics changes you want to make)
* A decent sound editor (in case you want to edit sounds)
Some of these may not apply to you (e.g. you may just want to learn how to
do BGAnimations in Lua and what the differences in the metrics are).
That's fine. :)
Other recommended utilities will be introduced throughout this guide; they are
not required if you do not wish to use them.
________________________________________________________________________________
1. Introduction to Concepts
If you are familiar with theming for another version of StepMania already, you
can skim this section to see what differences exist between that version and
sm-ssc.
--------------------------------------------------------------------------------
1.1 The Raw Elements
A StepMania theme is comprised of multiple parts. Some of these parts are more
important than others. This section briefly introduces each of the elements,
explaining what they do and why they're important.
More in-depth descriptions will come with each chapter.
1.1.1 Metrics
The metrics (metrics.ini) contain the core elements of a theme. Most everything
that has to do with StepMania's built-in types and elements will be found here.
1.1.2 BGAnimations
BGAnimations are used to decorate screens. In SM4, they use Lua for BGAnims,
which allows for some amazing stuff if done right. This guide won't delve too
deeply into abusing BGAnimations for fun and profit (via custom coded elements),
but it will be brought up later.
1.1.3 Graphics
Graphics are simply that. They go along with the metrics, but can also be
called from BGAnimations. Some graphics can be replaced with Lua files for more
complex creations.
1.1.4 Fonts
Fonts are used to draw text to the Screen. They can consist of a normal page
and a stroke page, as well as the special numbers and alternate characters
pages.
One of the problems with SM Fonts is that they require a program to generate the
required format. Both known programs are Windows-only, hindering those
developing StepMania themes on Mac and Linux (unless some sort of virtualization
solution is used).
When you make a non-text font, you only have the choice of an image editor.
Hope it has a customizable grid! (This is where Paint Shop Pro 7 beats any
version of Photoshop.)
1.1.5 Sounds
The Sounds folder contains both sounds that play during the use of StepMania,
as well as any music your theme contains.
1.1.6 Languages
Languages are where Strings that appear in the theme should be defined. Each
language is represented by a two letter code, with the following examples from
the default theme:
en - English
es - Spanish (Espanol)
fr - French (Francais)
it - Italian(o)
de - German (Deutsch)
1.1.7 Scripts
Lua Scripts were introduced in StepMania 4 (really "3.95", if you want to get
technical). If you've come from theming an earlier version where they didn't
exist (3.9), this folder might take some getting used to. This directory holds
Lua scripts that are loaded on startup. Some scripts lay down the theming
foundation, meaning that if you're crazy enough, you can rewrite everything.
If you're capable of that, though, you probably don't need to read this guide. :)
1.1.8 Other
The Other folder contains miscellaneous things. You generally won't need to
worry about this folder unless you need to edit some uncommon files.
________________________________________________________________________________
2. Elements in Detail
Unless you are a very fast learner and can learn by looking at other people's
code, you are probably wanting to know more about the elements in detail.
2.1 Metrics and Languages ______________________________________________________
These two are grouped together since they both use ini files. This means the
layout of the file will contain groups, keys, and values.
[Group]
Key=Value
{ caption: Example of various .ini elements }
In StepMania, most groups are Screens.
The Languages folder contains strings that StepMania displays when your theme
is used. Chances are, if you want to edit the text of something, there's an
entry for it in one of the Language files (en.ini, usually).
By leaving out a key in your custom language, you tell StepMania to look in
the default language (typically en.ini)
2.2. BGAnimations ______________________________________________________________
Easily where you'll be spending the most time when making a theme, the
BGAnimations provide a way for you to customize various theme parts.
There are multiple names StepMania recognizes for BGAnimation folders. Some
screens won't support all of these.
================================================================================
ScreenExample in - Played when the screen is transitioning in.
ScreenExample background - Background of the screen.
ScreenExample underlay - Shows over the background, but under decorations and overlay.
ScreenExample decorations - Newly added in StepMania 4 alphas.
ScreenExample overlay - Shows over everything, usually.
ScreenExample out - Played when the screen is transitioning out.
ScreenExample cancel - Played when the screen is canceled.
================================================================================
In StepMania 4 alphas and sm-ssc, BGAnimations are done with Lua.
A sample Lua BGAnimation follows:
=[begin code example]===========================================================
return Def.ActorFrame{
Def.Quad{
InitCommand=cmd(FullScreen;diffuse,color("#FFFFFF");diffusebottomedge,color("#AAAAAA"););
};
};
=[end code example]=============================================================
This will make a Quad (an untextured square) that fills the screen and fades from
white to light grey. It is best used as a background. You can try this example
out yourself by making a new folder in the Themes directory and putting this code
in ScreenTitleMenu background.lua;
The folder setup would end up like so:
sm-ssc/
Themes/
MyCoolTheme/
BGAnimations/
ScreenTitleMenu background.lua
Now open up sm-ssc and change the theme (or pass in --theme="MyCoolTheme",
replacing "MyCoolTheme" with your theme's folder name), and head to the title menu.
2.3. Graphics __________________________________________________________________
The Graphics folder contains various files StepMania calls on. For example, the
header and footer are found here, along with Common window icon and others.
The Graphics folder is also where Decorations expects to find files to load when
you use StandardDecorationFromFileOptional([MetricsName],[Filename]).
2.4. Fonts _____________________________________________________________________
StepMania fonts are a combination of images containing various characters, and
an ini file that defines the font metrics, such as spacing, character widths,
character mappings, and so on.
Fonts are typically generated with Texture Font Generator (which is included
with sm-ssc) or Bitmap Font Builder, both programs being Windows only. If you
aren't on Windows, your choices are then limited to whatever image editor you
can find (typically Photoshop or The GIMP).
fontini.txt in the ThemerDocs folder contains a list of all the known
font .ini values. The file is reprinted here:
================================================================================
[common]
CapitalsOnly - If set to 1, lowercase letters are drawn with uppercase letters instead.
RightToLeft - If set to 1, font will be rendered as right to left.
DefaultStrokeColor - Sets default stroke color. (e.g. #00000000)
[main]
import - Imports a font page into the current font.
(per-page)
DrawExtraPixelsLeft - How many pixels to draw to the left of a character.
DrawExtraPixelsRight - How many pixels to draw to the right of a character.
AddToAllWidths - Adds x amount of pixels to all widths.
ScaleAllWidthsBy - Scales widths by the factor specified.
LineSpacing - Modifies line spacing.
Top - Specifies the top of the character. (in pixels)
Baseline - Specifies the baseline of the character. (in pixels)
DefaultWidth - Default width for a glyph.
AdvanceExtraPixels - Rudimentary way to control letter spacing
TextureHints - An alternative to throwing the TextureHints in the filename.
(general commands)
MAP - Maps a keyword to a frame number. (e.g. map up=0)
RANGE - Defines a Unicode range to use.
LINE - (e.g. Line 1=ABCDEFGH)
================================================================================
2.5. Sounds ____________________________________________________________________
sm-ssc can load Lua files as music, allowing for conditional music/sounds.
conditional_music.txt in the ThemerDocs folder explains it in more detail with
code examples.
2.6. Scripts ___________________________________________________________________
Scripts allow you to define functions which can then be referenced in Metrics
and BGAnimations. Scripts can also store values and do other nice things, some
How to Theme for sm-ssc: THE DOC.
________________________________________________________________________________
Table of Contents
i. Introduction
ii. Requirements
----------------
1. Introduction to Concepts
1. The Raw Elements
1. Metrics
2. BGAnimations
3. Graphics
4. Fonts
5. Sounds
6. Languages
7. Scripts
8. Other
2. Screens, Classes, Managers and more
2. Elements in Detail
1. Metrics and Languages
2. BGAnimations
3. Graphics
4. Fonts
5. Sounds
6. Scripts
X. Making Your First sm-ssc Theme
1. Setup
2.
________________________________________________________________________________
i. Introduction
________________________________________________________________________________
ii. Requirements
In order to follow along with this guide, you will need the following:
* sm-ssc (our fork of StepMania 4)
* A decent text editor (syntax highlighting is a plus)
* A decent graphics editor (for any graphics changes you want to make)
* A decent sound editor (in case you want to edit sounds)
Some of these may not apply to you (e.g. you may just want to learn how to
do BGAnimations in Lua and what the differences in the metrics are).
That's fine. :)
Other recommended utilities will be introduced throughout this guide; they are
not required if you do not wish to use them.
________________________________________________________________________________
1. Introduction to Concepts
If you are familiar with theming for another version of StepMania already, you
can skim this section to see what differences exist between that version and
sm-ssc.
--------------------------------------------------------------------------------
1.1 The Raw Elements
A StepMania theme is comprised of multiple parts. Some of these parts are more
important than others. This section briefly introduces each of the elements,
explaining what they do and why they're important.
More in-depth descriptions will come with each chapter.
1.1.1 Metrics
The metrics (metrics.ini) contain the core elements of a theme. Most everything
that has to do with StepMania's built-in types and elements will be found here.
1.1.2 BGAnimations
BGAnimations are used to decorate screens. In SM4, they use Lua for BGAnims,
which allows for some amazing stuff if done right. This guide won't delve too
deeply into abusing BGAnimations for fun and profit (via custom coded elements),
but it will be brought up later.
1.1.3 Graphics
Graphics are simply that. They go along with the metrics, but can also be
called from BGAnimations. Some graphics can be replaced with Lua files for more
complex creations.
1.1.4 Fonts
Fonts are used to draw text to the Screen. They can consist of a normal page
and a stroke page, as well as the special numbers and alternate characters
pages.
One of the problems with SM Fonts is that they require a program to generate the
required format. Both known programs are Windows-only, hindering those
developing StepMania themes on Mac and Linux (unless some sort of virtualization
solution is used).
When you make a non-text font, you only have the choice of an image editor.
Hope it has a customizable grid! (This is where Paint Shop Pro 7 beats any
version of Photoshop.)
1.1.5 Sounds
The Sounds folder contains both sounds that play during the use of StepMania,
as well as any music your theme contains.
1.1.6 Languages
Languages are where Strings that appear in the theme should be defined. Each
language is represented by a two letter code, with the following examples from
the default theme:
en - English
es - Spanish (Espanol)
fr - French (Francais)
it - Italian(o)
de - German (Deutsch)
1.1.7 Scripts
Lua Scripts were introduced in StepMania 4 (really "3.95", if you want to get
technical). If you've come from theming an earlier version where they didn't
exist (3.9), this folder might take some getting used to. This directory holds
Lua scripts that are loaded on startup. Some scripts lay down the theming
foundation, meaning that if you're crazy enough, you can rewrite everything.
If you're capable of that, though, you probably don't need to read this guide. :)
1.1.8 Other
The Other folder contains miscellaneous things. You generally won't need to
worry about this folder unless you need to edit some uncommon files.
________________________________________________________________________________
2. Elements in Detail
Unless you are a very fast learner and can learn by looking at other people's
code, you are probably wanting to know more about the elements in detail.
2.1 Metrics and Languages ______________________________________________________
These two are grouped together since they both use ini files. This means the
layout of the file will contain groups, keys, and values.
[Group]
Key=Value
{ caption: Example of various .ini elements }
In StepMania, most groups are Screens.
The Languages folder contains strings that StepMania displays when your theme
is used. Chances are, if you want to edit the text of something, there's an
entry for it in one of the Language files (en.ini, usually).
By leaving out a key in your custom language, you tell StepMania to look in
the default language (typically en.ini)
2.2. BGAnimations ______________________________________________________________
Easily where you'll be spending the most time when making a theme, the
BGAnimations provide a way for you to customize various theme parts.
There are multiple names StepMania recognizes for BGAnimation folders. Some
screens won't support all of these.
================================================================================
ScreenExample in - Played when the screen is transitioning in.
ScreenExample background - Background of the screen.
ScreenExample underlay - Shows over the background, but under decorations and overlay.
ScreenExample decorations - Newly added in StepMania 4 alphas.
ScreenExample overlay - Shows over everything, usually.
ScreenExample out - Played when the screen is transitioning out.
ScreenExample cancel - Played when the screen is canceled.
================================================================================
In StepMania 4 alphas and sm-ssc, BGAnimations are done with Lua.
A sample Lua BGAnimation follows:
=[begin code example]===========================================================
return Def.ActorFrame{
Def.Quad{
InitCommand=cmd(FullScreen;diffuse,color("#FFFFFF");diffusebottomedge,color("#AAAAAA"););
};
};
=[end code example]=============================================================
This will make a Quad (an untextured square) that fills the screen and fades from
white to light grey. It is best used as a background. You can try this example
out yourself by making a new folder in the Themes directory and putting this code
in ScreenTitleMenu background.lua;
The folder setup would end up like so:
sm-ssc/
Themes/
MyCoolTheme/
BGAnimations/
ScreenTitleMenu background.lua
Now open up sm-ssc and change the theme (or pass in --theme="MyCoolTheme",
replacing "MyCoolTheme" with your theme's folder name), and head to the title menu.
2.3. Graphics __________________________________________________________________
The Graphics folder contains various files StepMania calls on. For example, the
header and footer are found here, along with Common window icon and others.
The Graphics folder is also where Decorations expects to find files to load when
you use StandardDecorationFromFileOptional([MetricsName],[Filename]).
2.4. Fonts _____________________________________________________________________
StepMania fonts are a combination of images containing various characters, and
an ini file that defines the font metrics, such as spacing, character widths,
character mappings, and so on.
Fonts are typically generated with Texture Font Generator (which is included
with sm-ssc) or Bitmap Font Builder, both programs being Windows only. If you
aren't on Windows, your choices are then limited to whatever image editor you
can find (typically Photoshop or The GIMP).
fontini.txt in the ThemerDocs folder contains a list of all the known
font .ini values. The file is reprinted here:
================================================================================
[common]
CapitalsOnly - If set to 1, lowercase letters are drawn with uppercase letters instead.
RightToLeft - If set to 1, font will be rendered as right to left.
DefaultStrokeColor - Sets default stroke color. (e.g. #00000000)
[main]
import - Imports a font page into the current font.
(per-page)
DrawExtraPixelsLeft - How many pixels to draw to the left of a character.
DrawExtraPixelsRight - How many pixels to draw to the right of a character.
AddToAllWidths - Adds x amount of pixels to all widths.
ScaleAllWidthsBy - Scales widths by the factor specified.
LineSpacing - Modifies line spacing.
Top - Specifies the top of the character. (in pixels)
Baseline - Specifies the baseline of the character. (in pixels)
DefaultWidth - Default width for a glyph.
AdvanceExtraPixels - Rudimentary way to control letter spacing
TextureHints - An alternative to throwing the TextureHints in the filename.
(general commands)
MAP - Maps a keyword to a frame number. (e.g. map up=0)
RANGE - Defines a Unicode range to use.
LINE - (e.g. Line 1=ABCDEFGH)
================================================================================
2.5. Sounds ____________________________________________________________________
sm-ssc can load Lua files as music, allowing for conditional music/sounds.
conditional_music.txt in the ThemerDocs folder explains it in more detail with
code examples.
2.6. Scripts ___________________________________________________________________
Scripts allow you to define functions which can then be referenced in Metrics
and BGAnimations. Scripts can also store values and do other nice things, some
of which is outside of the scope of this guide.
+378 -378
View File
@@ -1,379 +1,379 @@
sm-ssc Beginner's Guide
Written and edited by the spinal shark collective
--------------------------------------------------------------------------------
Table of Contents
1 Introduction
2 StepMania
2.1. Terms and Concepts
2.1.1 Notable StepMania Versions
2.1.2 StepMania Components
2.2 StepMania Configuration
2.2.1 Frequently Asked Questions that can be
Solved by Changing the Configuration
2.3. Installing Content
2.3.1 Installing Song Files
2.3.2 Installing Noteskins/New Gametypes
2.3.3 Installing Themes
3. sm-ssc
================================================================================
Chapter 1: Introduction
================================================================================
Welcome to the sm-ssc Beginner's Guide. This guide is primarily meant for people
who do not have any previous experience with StepMania, but also includes
information on how sm-ssc differs from StepMania. If you already know what
StepMania is, and the basics of adding things to an install, you can skip ahead
to Chapter 3: sm-ssc. Otherwise, read on.
================================================================================
Chapter 2: StepMania
================================================================================
StepMania is an open-source rhythm game/engine, used by many projects, both
commercial and free. It is the software from which sm-ssc is derived, and as
a result, must be learned before using sm-ssc if you're not already familiar
with how it works.
Some of the things an average sm-ssc user is expected to know includes the
meanings/"proper names" of certain things, as well as how to install content
and configure the program to suit your playing style.
--------------------------------------------------------------------------------
2.1: Terms and Concepts
--------------------------------------------------------------------------------
Like many other video games, StepMania has a rich lexicon of words which may
confuse others. The most important of the terms has to do with versions of
StepMania, as backwards compatibility is pretty much nonexistent between major
versions.
--------------------------------------------------------------------------------
2.1.1: Notable StepMania Versions
--------------------------------------------------------------------------------
Knowing the versions of StepMania is helpful, as it will help you deduce what
you can and can not install. (Most songs are version-agnostic, though the
background animations may not be. Themes, Noteskins, etc. are tied to
specific versions.)
* StepMania 3.9
StepMania 3.9 is currently considered the stable version of StepMania. It dates
back to 2005, and is the version for which the bulk of content is produced.
* StepMania 3.9 Plus/StepMania 3.9 Plus Redux
3.9 Plus/Redux is a fork of StepMania 3.9 that adds features from
later StepMania versions (such as rolls), as well as new features.
* StepMania 3.95/StepMania Online
Generally, when people talk about this version, they refer to a CVS build of
StepMania from around June-August 2006. It was not an officially supported
build of StepMania.
* OpenITG
OpenITG is a fork of the StepMania CVS code from around the time In The Groove 2
was released. OpenITG's goal is to produce a replacement executable for ITG2
machines with enhanced features, though it can also be used at home as well.
* StepMania 4.0 CVS
This term is used to describe versions of StepMania 4 that appeared after "3.95"
up until January 2008, when the last build that could be categorized as "CVS"
was released.
* StepMania 4.0 SVN/alpha
The current development version of StepMania. This is the version that sm-ssc
is forked off of. If you wish to port something to sm-ssc, it had better work
for this version first, unless you like working hard to port the theme past
various generations and default theme assumptions.
--------------------------------------------------------------------------------
2.1.2: StepMania Components
--------------------------------------------------------------------------------
Despite the title, this is a bit more broader-reaching, as it covers terms that
you may see in StepMania communities and online.
--------------------------------------------------------------------------------
* Courses
Courses exist in many different forms, but in general, they take you through
multiple songs without a break in-between. There are multiple types of courses:
* Nonstop Courses
Nonstop courses use the regular lifebar and typically have 4 songs per
course, though this isn't always the case. It is the easiest of the
course modes.
* Oni/Challenge Courses
The Oni/challenge courses are quite difficult, usually giving you 4 lives
over multiple songs. If you get less than a Great, you lose a life. Once
you lose all your lives, the game is over.
* Survival Courses
Survival courses go by time. Each step judgment is worth something on the
timer, with most of the values being negative by default. If you run out of
time before you complete the course, the game is over.
* Endless Courses
Endless courses are like the name suggests. They don't end until you fail or
decide to quit. Like Nonstop courses, they have a normal lifebar as well.
--------------------------------------------------------------------------------
* Event Mode
Typically used during events, this disables the concept of stages and lets you
play songs until you decide to stop. It is quite useful in Home Mode, and this
guide recommends you enable it.
* Gametypes
Gametypes are the different game modes StepMania can play. They generally
change things like number of default receptors, number of judgments, and more.
Gametypes are directly related to noteskins and unrelated to the different
play modes (Normal, Nonstop, Challenge, and so on).
Examples of gametypes include "dance", "pump", "beat", "techno", and so on.
* NoteSkins
NoteSkins are the appearance of the notes. Most noteskins are bound to certain
gametypes, though some noteskins are easily adapted for other gametypes.
* Pack/packs
A pack is a group of songs for StepMania. The term originated from the
community of StepMania keyboard creators, and can be seen prominently in
certain release names, such as Community Keyboard Mega Pack (CKMP).
When used as a single word question, e.g. "packs?", it is a request for what
packs you have installed.
* Songs
StepMania songs contain a few files, but mainly the steps (.sm, .dwi, .ksf,
.bms, among many other formats) and song file itself (.mp3, .ogg, .wav). In
order to get the most out of StepMania, you'll need to know all about songs
and how to install them.
* Themes
Themes are skins for StepMania. They change the look and feel, and in post-3.9
versions, can also change elements of gameplay (scoring, grading) as well.
--------------------------------------------------------------------------------
2.2: StepMania Configuration
or "How to use the Options Menu"
--------------------------------------------------------------------------------
Learning how to properly configure StepMania can save you headaches.
Most themes will have the Options menu in plain sight on the Title Menu.
From there, it depends on which version of StepMania you have, as the options
menus were re-shuffled around for the StepMania 4 alphas.
The typical StepMania 3.9 Options Menu:
* Appearance Options
* Background Options
* Bookkeeping
* Center Image
* Coin Options
* Config Key/Joy Mappings
* Input Options
* Gameplay Options
* Graphic Options
* Machine Options
* Sound Options
* Profile Options
* Other Options
* Reload Songs/Courses
* Test Input
The StepMania 4.0 alpha 4 Options Menu:
* Config Key/Joy Mappings
* Test Input
* Appearance Options
* Graphics/Sound Options
* Advanced Options
* Network Options
* Profiles
* Reload Songs/Courses
sm-ssc changes this up again, making the "Options" item on the Title Menu go
to System Direction (mostly-used options), leaving the normal options menu to
the Scroll Lock key. Blame Midiman. :)
--------------------------------------------------------------------------------
2.2.1: Frequently Asked Questions that can be Solved by Changing the Configuration
--------------------------------------------------------------------------------
With that in mind, it's time to answer some questions using this knowledge.
Q: How do I disable the menu timer?
A: Where you go depends on the version of StepMania you use.
[3.9] Machine Options
[4.0 alphas] Advanced Options
It will be the first option on each.
Q: How do I play forever, without game overs?
A: Turn on Event Mode. Where you go depends on the version of StepMania you use.
[3.9] Coin Options
[4.0 alphas] Advanced Options, a bit down the page.
Q: What the heck is this thing that says "Toasty" and how do I get rid of it?
A: It's a reference to Mortal Kombat 2, where Dan Forden would pop out from
the side of the screen randomly after an uppercut.
In order to get a Toasty in StepMania, one must get a 250 combo without any
Greats. The number 250 is a reference to how many VS games of MK2 you had to
play before you could play Pong.
As for turning it off, turn Easter Eggs off.
It appears in different locations between StepMania versions:
[3.9] Gameplay Options
[4.0 alphas] Advanced Options, a bit down the page.
--------------------------------------------------------------------------------
2.3: Installing Content
--------------------------------------------------------------------------------
This is the most important section you will read, as all the time that you spend
not playing with StepMania will be adding/removing things to it. Well, not
completely, as you have other things to do.
Before we touch on the specifics, there are a few skills you should learn.
* Mac Users of StepMania 4.0
Most of the game content is packaged in a file called StepMania.smzip. This has
the pros of not cluttering things up, but the con is that people don't know
where to put things.
Wherever you have StepMania installed, make the following folders:
* Songs
* Themes
* Noteskins
(and the various gametype folders, which are optional. You need at least one
non-lights gametype in order to play.)
* Noteskins/dance
* Noteskins/pump
* Noteskins/para
* Noteskins/techno
* Noteskins/beat
* Noteskins/popn
* Noteskins/ez2
* Announcers
(but at this point, no SM4 announcers have been released)
* Packages
(optional, but recommended)
and then you can follow the rest of this guide.
* Not on Windows and want to deal with .smzip files?
There are multiple ways to deal this.
1) Put the SMZip file in the Packages folder.
2) Rename the file to have an extension of .zip and extract in the root
StepMania folder.
3) Pass the smzip's filename to StepMania on the command line/terminal.
Dragging and dropping the .smzip may or may not work; we have not tested it.
Also, this may or may not exist in your version of StepMania.
--------------------------------------------------------------------------------
2.3.1: Installing Song Files
--------------------------------------------------------------------------------
Song files are distributed in many ways. The concept of packs was explained
above, in which multiple songs are included in one archive.
For .smzip files, the section "Not on Windows and want to deal with .smzip
files?" details all possible ways of installing .smzip files, but the most
common ways are as follows:
1) For operating systems with a filetype handler (Windows), you can double
click on the .smzip file and the StepMania tools will handle it.
2) Putting the .smzip file in the Packages folder, where it will be automatically
read by StepMania.
If it's not a .smzip file, you'll have to do some detective work.
Open up the song archive and see how the files are laid out.
The easiest single song installs will have a folder structure similar to this:
Group Name\
Song Name\
song file.sm
song file.ogg/mp3
song file-bg.png
song file-bn.png
With a setup like this, you can just extract it to the Songs folder with
directory structure intact.
Sometimes, simfile authors don't package their file with a group name,
leaving you with a file structure like this:
Song Name\
song file.sm
song file.ogg/mp3
song file-bg.png
song file-bn.png
You will need to extract this into a song group folder that exists already.
An uncommon setup will only include the song files, without any folders at all.
These need to be put into the {Group Name}\{Song Name}\ folder in order to work.
For packs, you follow the same logic. If there are multiple song folders, but no
group folder, you will have to make a group folder. (Flightmix 4 is an example
of a pack that exhibits this behavior.)
Overall, the setup should look something like this:
StepMania\
Songs\
Song Group 1\
Song Group 2\
Song Group 3\
Song Group 4\
Example Song\
Example Song.sm
Example Song.mp3/ogg
Example Song-bn.png
Example Song-bg.png
--------------------------------------------------------------------------------
2.3.2: Installing Noteskins/New Gametypes
--------------------------------------------------------------------------------
NoteSkins change the appearance of the arrows. They are also linked with getting
other gametypes supported in StepMania.
The noteskin installation process looks something like this:
StepMania\
NoteSkins\
(gametype)\
(noteskin for gametype)\
default\
(gametype2)\
default\
"gametype"/"gametype2" etc. can be any one of the following:
dance (typically 4 panels)
pump (typically 5 panels)
para (5 receptors)
techno (4, 5, and 8 panel modes)
beat (5 and 7 key modes with a turntable on each)
popn (5 and 9 line modes)
kb7 (6 or 7 keys depending on when you try to use it)
--------------------------------------------------------------------------------
2.3.3: Installing Themes
--------------------------------------------------------------------------------
Depending on if the theme is packaged in a SMZip or not, you have a few options.
If it is in a .smzip, you can put it in the Packages directory:
StepMania/
Packages/
MyTheme.smzip
and StepMania will automatically read it.
On Windows, you can double click on the .smzip file to install it in your user
packages directory. THIS IS NOT RECOMMENDED BECAUSE IT CAUSES CONFUSION.
Since .smzip files are really .zip files, you could also extract them in the
StepMania root folder.
If the themer has not packaged the theme in a .smzip, then you have to look
inside the archive to see how the directory layout looks.
1) Themes folder
If it has a themes folder when you open it up, extract in the StepMania root
folder, like you would a .smzip file.
2) Theme name as a folder
This one will have to be extracted in the Themes directory. You will get a
new folder with the files.
3) A bunch of folders + metrics.ini
The themer was lazy; you're going to have to make a folder in the Themes
directory and extract the theme in there.
When in doubt, read any documentation that comes with the theme for proper
installation instructions.
================================================================================
Chapter 3: sm-ssc
================================================================================
sm-ssc is a fork of the current StepMania codebase. It is focused on adding
features for theming, but also tries to make the process of dealing with
sm-ssc Beginner's Guide
Written and edited by the spinal shark collective
--------------------------------------------------------------------------------
Table of Contents
1 Introduction
2 StepMania
2.1. Terms and Concepts
2.1.1 Notable StepMania Versions
2.1.2 StepMania Components
2.2 StepMania Configuration
2.2.1 Frequently Asked Questions that can be
Solved by Changing the Configuration
2.3. Installing Content
2.3.1 Installing Song Files
2.3.2 Installing Noteskins/New Gametypes
2.3.3 Installing Themes
3. sm-ssc
================================================================================
Chapter 1: Introduction
================================================================================
Welcome to the sm-ssc Beginner's Guide. This guide is primarily meant for people
who do not have any previous experience with StepMania, but also includes
information on how sm-ssc differs from StepMania. If you already know what
StepMania is, and the basics of adding things to an install, you can skip ahead
to Chapter 3: sm-ssc. Otherwise, read on.
================================================================================
Chapter 2: StepMania
================================================================================
StepMania is an open-source rhythm game/engine, used by many projects, both
commercial and free. It is the software from which sm-ssc is derived, and as
a result, must be learned before using sm-ssc if you're not already familiar
with how it works.
Some of the things an average sm-ssc user is expected to know includes the
meanings/"proper names" of certain things, as well as how to install content
and configure the program to suit your playing style.
--------------------------------------------------------------------------------
2.1: Terms and Concepts
--------------------------------------------------------------------------------
Like many other video games, StepMania has a rich lexicon of words which may
confuse others. The most important of the terms has to do with versions of
StepMania, as backwards compatibility is pretty much nonexistent between major
versions.
--------------------------------------------------------------------------------
2.1.1: Notable StepMania Versions
--------------------------------------------------------------------------------
Knowing the versions of StepMania is helpful, as it will help you deduce what
you can and can not install. (Most songs are version-agnostic, though the
background animations may not be. Themes, Noteskins, etc. are tied to
specific versions.)
* StepMania 3.9
StepMania 3.9 is currently considered the stable version of StepMania. It dates
back to 2005, and is the version for which the bulk of content is produced.
* StepMania 3.9 Plus/StepMania 3.9 Plus Redux
3.9 Plus/Redux is a fork of StepMania 3.9 that adds features from
later StepMania versions (such as rolls), as well as new features.
* StepMania 3.95/StepMania Online
Generally, when people talk about this version, they refer to a CVS build of
StepMania from around June-August 2006. It was not an officially supported
build of StepMania.
* OpenITG
OpenITG is a fork of the StepMania CVS code from around the time In The Groove 2
was released. OpenITG's goal is to produce a replacement executable for ITG2
machines with enhanced features, though it can also be used at home as well.
* StepMania 4.0 CVS
This term is used to describe versions of StepMania 4 that appeared after "3.95"
up until January 2008, when the last build that could be categorized as "CVS"
was released.
* StepMania 4.0 SVN/alpha
The current development version of StepMania. This is the version that sm-ssc
is forked off of. If you wish to port something to sm-ssc, it had better work
for this version first, unless you like working hard to port the theme past
various generations and default theme assumptions.
--------------------------------------------------------------------------------
2.1.2: StepMania Components
--------------------------------------------------------------------------------
Despite the title, this is a bit more broader-reaching, as it covers terms that
you may see in StepMania communities and online.
--------------------------------------------------------------------------------
* Courses
Courses exist in many different forms, but in general, they take you through
multiple songs without a break in-between. There are multiple types of courses:
* Nonstop Courses
Nonstop courses use the regular lifebar and typically have 4 songs per
course, though this isn't always the case. It is the easiest of the
course modes.
* Oni/Challenge Courses
The Oni/challenge courses are quite difficult, usually giving you 4 lives
over multiple songs. If you get less than a Great, you lose a life. Once
you lose all your lives, the game is over.
* Survival Courses
Survival courses go by time. Each step judgment is worth something on the
timer, with most of the values being negative by default. If you run out of
time before you complete the course, the game is over.
* Endless Courses
Endless courses are like the name suggests. They don't end until you fail or
decide to quit. Like Nonstop courses, they have a normal lifebar as well.
--------------------------------------------------------------------------------
* Event Mode
Typically used during events, this disables the concept of stages and lets you
play songs until you decide to stop. It is quite useful in Home Mode, and this
guide recommends you enable it.
* Gametypes
Gametypes are the different game modes StepMania can play. They generally
change things like number of default receptors, number of judgments, and more.
Gametypes are directly related to noteskins and unrelated to the different
play modes (Normal, Nonstop, Challenge, and so on).
Examples of gametypes include "dance", "pump", "beat", "techno", and so on.
* NoteSkins
NoteSkins are the appearance of the notes. Most noteskins are bound to certain
gametypes, though some noteskins are easily adapted for other gametypes.
* Pack/packs
A pack is a group of songs for StepMania. The term originated from the
community of StepMania keyboard creators, and can be seen prominently in
certain release names, such as Community Keyboard Mega Pack (CKMP).
When used as a single word question, e.g. "packs?", it is a request for what
packs you have installed.
* Songs
StepMania songs contain a few files, but mainly the steps (.sm, .dwi, .ksf,
.bms, among many other formats) and song file itself (.mp3, .ogg, .wav). In
order to get the most out of StepMania, you'll need to know all about songs
and how to install them.
* Themes
Themes are skins for StepMania. They change the look and feel, and in post-3.9
versions, can also change elements of gameplay (scoring, grading) as well.
--------------------------------------------------------------------------------
2.2: StepMania Configuration
or "How to use the Options Menu"
--------------------------------------------------------------------------------
Learning how to properly configure StepMania can save you headaches.
Most themes will have the Options menu in plain sight on the Title Menu.
From there, it depends on which version of StepMania you have, as the options
menus were re-shuffled around for the StepMania 4 alphas.
The typical StepMania 3.9 Options Menu:
* Appearance Options
* Background Options
* Bookkeeping
* Center Image
* Coin Options
* Config Key/Joy Mappings
* Input Options
* Gameplay Options
* Graphic Options
* Machine Options
* Sound Options
* Profile Options
* Other Options
* Reload Songs/Courses
* Test Input
The StepMania 4.0 alpha 4 Options Menu:
* Config Key/Joy Mappings
* Test Input
* Appearance Options
* Graphics/Sound Options
* Advanced Options
* Network Options
* Profiles
* Reload Songs/Courses
sm-ssc changes this up again, making the "Options" item on the Title Menu go
to System Direction (mostly-used options), leaving the normal options menu to
the Scroll Lock key. Blame Midiman. :)
--------------------------------------------------------------------------------
2.2.1: Frequently Asked Questions that can be Solved by Changing the Configuration
--------------------------------------------------------------------------------
With that in mind, it's time to answer some questions using this knowledge.
Q: How do I disable the menu timer?
A: Where you go depends on the version of StepMania you use.
[3.9] Machine Options
[4.0 alphas] Advanced Options
It will be the first option on each.
Q: How do I play forever, without game overs?
A: Turn on Event Mode. Where you go depends on the version of StepMania you use.
[3.9] Coin Options
[4.0 alphas] Advanced Options, a bit down the page.
Q: What the heck is this thing that says "Toasty" and how do I get rid of it?
A: It's a reference to Mortal Kombat 2, where Dan Forden would pop out from
the side of the screen randomly after an uppercut.
In order to get a Toasty in StepMania, one must get a 250 combo without any
Greats. The number 250 is a reference to how many VS games of MK2 you had to
play before you could play Pong.
As for turning it off, turn Easter Eggs off.
It appears in different locations between StepMania versions:
[3.9] Gameplay Options
[4.0 alphas] Advanced Options, a bit down the page.
--------------------------------------------------------------------------------
2.3: Installing Content
--------------------------------------------------------------------------------
This is the most important section you will read, as all the time that you spend
not playing with StepMania will be adding/removing things to it. Well, not
completely, as you have other things to do.
Before we touch on the specifics, there are a few skills you should learn.
* Mac Users of StepMania 4.0
Most of the game content is packaged in a file called StepMania.smzip. This has
the pros of not cluttering things up, but the con is that people don't know
where to put things.
Wherever you have StepMania installed, make the following folders:
* Songs
* Themes
* Noteskins
(and the various gametype folders, which are optional. You need at least one
non-lights gametype in order to play.)
* Noteskins/dance
* Noteskins/pump
* Noteskins/para
* Noteskins/techno
* Noteskins/beat
* Noteskins/popn
* Noteskins/ez2
* Announcers
(but at this point, no SM4 announcers have been released)
* Packages
(optional, but recommended)
and then you can follow the rest of this guide.
* Not on Windows and want to deal with .smzip files?
There are multiple ways to deal this.
1) Put the SMZip file in the Packages folder.
2) Rename the file to have an extension of .zip and extract in the root
StepMania folder.
3) Pass the smzip's filename to StepMania on the command line/terminal.
Dragging and dropping the .smzip may or may not work; we have not tested it.
Also, this may or may not exist in your version of StepMania.
--------------------------------------------------------------------------------
2.3.1: Installing Song Files
--------------------------------------------------------------------------------
Song files are distributed in many ways. The concept of packs was explained
above, in which multiple songs are included in one archive.
For .smzip files, the section "Not on Windows and want to deal with .smzip
files?" details all possible ways of installing .smzip files, but the most
common ways are as follows:
1) For operating systems with a filetype handler (Windows), you can double
click on the .smzip file and the StepMania tools will handle it.
2) Putting the .smzip file in the Packages folder, where it will be automatically
read by StepMania.
If it's not a .smzip file, you'll have to do some detective work.
Open up the song archive and see how the files are laid out.
The easiest single song installs will have a folder structure similar to this:
Group Name\
Song Name\
song file.sm
song file.ogg/mp3
song file-bg.png
song file-bn.png
With a setup like this, you can just extract it to the Songs folder with
directory structure intact.
Sometimes, simfile authors don't package their file with a group name,
leaving you with a file structure like this:
Song Name\
song file.sm
song file.ogg/mp3
song file-bg.png
song file-bn.png
You will need to extract this into a song group folder that exists already.
An uncommon setup will only include the song files, without any folders at all.
These need to be put into the {Group Name}\{Song Name}\ folder in order to work.
For packs, you follow the same logic. If there are multiple song folders, but no
group folder, you will have to make a group folder. (Flightmix 4 is an example
of a pack that exhibits this behavior.)
Overall, the setup should look something like this:
StepMania\
Songs\
Song Group 1\
Song Group 2\
Song Group 3\
Song Group 4\
Example Song\
Example Song.sm
Example Song.mp3/ogg
Example Song-bn.png
Example Song-bg.png
--------------------------------------------------------------------------------
2.3.2: Installing Noteskins/New Gametypes
--------------------------------------------------------------------------------
NoteSkins change the appearance of the arrows. They are also linked with getting
other gametypes supported in StepMania.
The noteskin installation process looks something like this:
StepMania\
NoteSkins\
(gametype)\
(noteskin for gametype)\
default\
(gametype2)\
default\
"gametype"/"gametype2" etc. can be any one of the following:
dance (typically 4 panels)
pump (typically 5 panels)
para (5 receptors)
techno (4, 5, and 8 panel modes)
beat (5 and 7 key modes with a turntable on each)
popn (5 and 9 line modes)
kb7 (6 or 7 keys depending on when you try to use it)
--------------------------------------------------------------------------------
2.3.3: Installing Themes
--------------------------------------------------------------------------------
Depending on if the theme is packaged in a SMZip or not, you have a few options.
If it is in a .smzip, you can put it in the Packages directory:
StepMania/
Packages/
MyTheme.smzip
and StepMania will automatically read it.
On Windows, you can double click on the .smzip file to install it in your user
packages directory. THIS IS NOT RECOMMENDED BECAUSE IT CAUSES CONFUSION.
Since .smzip files are really .zip files, you could also extract them in the
StepMania root folder.
If the themer has not packaged the theme in a .smzip, then you have to look
inside the archive to see how the directory layout looks.
1) Themes folder
If it has a themes folder when you open it up, extract in the StepMania root
folder, like you would a .smzip file.
2) Theme name as a folder
This one will have to be extracted in the Themes directory. You will get a
new folder with the files.
3) A bunch of folders + metrics.ini
The themer was lazy; you're going to have to make a folder in the Themes
directory and extract the theme in there.
When in doubt, read any documentation that comes with the theme for proper
installation instructions.
================================================================================
Chapter 3: sm-ssc
================================================================================
sm-ssc is a fork of the current StepMania codebase. It is focused on adding
features for theming, but also tries to make the process of dealing with
StepMania a little easier.
+16 -16
View File
@@ -1,17 +1,17 @@
[IMPORTANT INSTALL NOTE]
If you are using Windows Vista or Windows 7, please do not install StepMania SSC into the Program Files directory.
[Using Google Chrome?]
If you are using Google Chrome as your primary web browser, you will have to perform some extra steps to get stepmania:// URI handling to work:
Find yout user data
Windows XP: C:\Documents and Settings\<USERNAME>\Local Settings\Application Data\Google\Chrome\User Data
Windows Vista/7: C:\Users\<USERNAME>\AppData\Local\Google\Chrome\User Data
Add your protocol to the 'Local State' file under the 'protocol_handler' section, as such:
"protocol_handler": {
"excluded_schemes": {
...
"stepmania": false,
...
[IMPORTANT INSTALL NOTE]
If you are using Windows Vista or Windows 7, please do not install StepMania SSC into the Program Files directory.
[Using Google Chrome?]
If you are using Google Chrome as your primary web browser, you will have to perform some extra steps to get stepmania:// URI handling to work:
Find yout user data
Windows XP: C:\Documents and Settings\<USERNAME>\Local Settings\Application Data\Google\Chrome\User Data
Windows Vista/7: C:\Users\<USERNAME>\AppData\Local\Google\Chrome\User Data
Add your protocol to the 'Local State' file under the 'protocol_handler' section, as such:
"protocol_handler": {
"excluded_schemes": {
...
"stepmania": false,
...
}
+147 -147
View File
@@ -1,148 +1,148 @@
sm-ssc credits (in no particular order)
---------------------------------------
* "Programming" is used in regards to the sm-ssc project.
* If you have any corrections to this list, let us know (via forums or IRC).
==the spinal shark collective==
AJ Kelly
* Main programming
* UserPreferences and some other Lua scripts
* Some small theme edits here and there
* Noteskins (retro, retrobar*)
* Windows project file maintainer
Midiman
* Did most of the work on _fallback and default themes
* Some programming
* Noteskins (midi-*)
shakesoda
* Programming
* Noteskins (delta, gamma, port of orbital to kb7)
* Theme edits
* Mac OS X primary maintainer
==sm-ssc Team==
(in no particular order)
Aldo_MX
* Code (Pump it Up delays, among others), ideas, and support.
cerbo
* [SongManager] SetPreferredSongs() and SetPreferredCourses() Lua bindings
Daisuke Master
* Programming
* Pump/simple and Pump/complex noteskins
* /Docs/Themerdocs/Noteskin elements Reference.txt
* Taking advantage of sm-ssc's new features :)
FSX
* Various fixes. (see Changelog_sm-ssc.txt for more details)
Nicole Reid (okeeblow)
* Tested building sm-ssc on FreeBSD, provided fixes.
Wolfman
* [Player] PercentUntilColorCombo metric
* Mac OS X maintainer
* Various fixes/changes. (see Changelog_sm-ssc.txt for more details)
==other contributors==
(in no particular order, aside from having SM team at the top)
StepMania Team
* Keeping StepMania 5 alive with changes, and providing a nice codebase for
us to work with.
Kaox
* Pump/default noteskin
cesarmades
* Pump/cmd-* noteskins
David Santamaría Rogado (howl)
* Various patches (see Changelog_sm-ssc.txt for more details and links)
Kita K./D. Trucks
* sm-ssc default theme music
kurisu
* Dance-threepanel gametype code (3.9; re-adapted for sm-ssc)
v1toko
* Lead coder of StepNXA, which is where we got the original XMode code from.
Macgravel
* Orbular noteskin (the default kb7 noteskin)
theDtTvB
* Keysound patch (http://share11.appspot.com/20421)
[This patch is currently causing crashes for us, sadly.]
sy567
* Small beginner helper fix
(http://www.stepmania.com/forums/showpost.php?p=158721&postcount=12)
galopin
* Pump it Up Exceed PlayStation 2 USB dance mat support patch
(stepmania-devs mailing list 20091213 11:27 -0800 [Pacific Standard Time])
Henke37
* [MovieTexture_FFMpeg] Stutter fix
(http://www.pasteall.org/11353/diff)
corec
* [ArchHooks_Unix, MovieTexture_FFMpeg] Make sm-ssc work with system's FFMpeg.
(http://github.com/corec/cc-overlay/blob/master/games-arcade/sm-ssc/files/sm-ssc-ffmpeg-fixes-01.patch)
* [InputMapper] Enabling upper diagonal keys for Positive Gaming Impact dance mat
(http://ssc.ajworld.net/sm-ssc/bugtracker/view.php?id=137)
gholms
* Make autogen.sh look for automake 1.11
(http://ssc.ajworld.net/sm-ssc/bugtracker/view.php?id=140)
juanelote
* [SongManager] GetSongGroupByIndex function
* [MusicWheel] JumpToNextGroup/JumpToPrevGroup logic modifications
NitroX72
* Pump/frame noteskin
Tatsh
* A patch to fix building with system ffmpeg
(http://ssc.ajworld.net/sm-ssc/bugtracker/view.php?id=218)
==the beta testers==
[SSC Beta Testing Team]
KeithD
tweak/tweak62
[Friends of the Devs]
And4713
HankPeters
okeeblow
kdaymea
taiyal
[Members of Team Step Masters (http://www.team-stepmasters.net/foro/)]
Daisuke Master
Nueel/emmanuel virus
Fye
Bijou
Nek0
Jib
Robe
Urqui
h4m573r
Torta
[Private Beta Wave 1.x Testers]
FSX
Sniper257
Wolfman2000
NitroX72
Wanny
Tio
Cerbo
sm-ssc credits (in no particular order)
---------------------------------------
* "Programming" is used in regards to the sm-ssc project.
* If you have any corrections to this list, let us know (via forums or IRC).
==the spinal shark collective==
AJ Kelly
* Main programming
* UserPreferences and some other Lua scripts
* Some small theme edits here and there
* Noteskins (retro, retrobar*)
* Windows project file maintainer
Midiman
* Did most of the work on _fallback and default themes
* Some programming
* Noteskins (midi-*)
shakesoda
* Programming
* Noteskins (delta, gamma, port of orbital to kb7)
* Theme edits
* Mac OS X primary maintainer
==sm-ssc Team==
(in no particular order)
Aldo_MX
* Code (Pump it Up delays, among others), ideas, and support.
cerbo
* [SongManager] SetPreferredSongs() and SetPreferredCourses() Lua bindings
Daisuke Master
* Programming
* Pump/simple and Pump/complex noteskins
* /Docs/Themerdocs/Noteskin elements Reference.txt
* Taking advantage of sm-ssc's new features :)
FSX
* Various fixes. (see Changelog_sm-ssc.txt for more details)
Nicole Reid (okeeblow)
* Tested building sm-ssc on FreeBSD, provided fixes.
Wolfman
* [Player] PercentUntilColorCombo metric
* Mac OS X maintainer
* Various fixes/changes. (see Changelog_sm-ssc.txt for more details)
==other contributors==
(in no particular order, aside from having SM team at the top)
StepMania Team
* Keeping StepMania 5 alive with changes, and providing a nice codebase for
us to work with.
Kaox
* Pump/default noteskin
cesarmades
* Pump/cmd-* noteskins
David Santamaría Rogado (howl)
* Various patches (see Changelog_sm-ssc.txt for more details and links)
Kita K./D. Trucks
* sm-ssc default theme music
kurisu
* Dance-threepanel gametype code (3.9; re-adapted for sm-ssc)
v1toko
* Lead coder of StepNXA, which is where we got the original XMode code from.
Macgravel
* Orbular noteskin (the default kb7 noteskin)
theDtTvB
* Keysound patch (http://share11.appspot.com/20421)
[This patch is currently causing crashes for us, sadly.]
sy567
* Small beginner helper fix
(http://www.stepmania.com/forums/showpost.php?p=158721&postcount=12)
galopin
* Pump it Up Exceed PlayStation 2 USB dance mat support patch
(stepmania-devs mailing list 20091213 11:27 -0800 [Pacific Standard Time])
Henke37
* [MovieTexture_FFMpeg] Stutter fix
(http://www.pasteall.org/11353/diff)
corec
* [ArchHooks_Unix, MovieTexture_FFMpeg] Make sm-ssc work with system's FFMpeg.
(http://github.com/corec/cc-overlay/blob/master/games-arcade/sm-ssc/files/sm-ssc-ffmpeg-fixes-01.patch)
* [InputMapper] Enabling upper diagonal keys for Positive Gaming Impact dance mat
(http://ssc.ajworld.net/sm-ssc/bugtracker/view.php?id=137)
gholms
* Make autogen.sh look for automake 1.11
(http://ssc.ajworld.net/sm-ssc/bugtracker/view.php?id=140)
juanelote
* [SongManager] GetSongGroupByIndex function
* [MusicWheel] JumpToNextGroup/JumpToPrevGroup logic modifications
NitroX72
* Pump/frame noteskin
Tatsh
* A patch to fix building with system ffmpeg
(http://ssc.ajworld.net/sm-ssc/bugtracker/view.php?id=218)
==the beta testers==
[SSC Beta Testing Team]
KeithD
tweak/tweak62
[Friends of the Devs]
And4713
HankPeters
okeeblow
kdaymea
taiyal
[Members of Team Step Masters (http://www.team-stepmasters.net/foro/)]
Daisuke Master
Nueel/emmanuel virus
Fye
Bijou
Nek0
Jib
Robe
Urqui
h4m573r
Torta
[Private Beta Wave 1.x Testers]
FSX
Sniper257
Wolfman2000
NitroX72
Wanny
Tio
Cerbo
Daisuke Master
+813 -813
View File
File diff suppressed because it is too large Load Diff
+16 -16
View File
@@ -1,17 +1,17 @@
Some other rhythm game simulators are open source.
Here's where to find code.
--------------------------------------------------------------------------------
Delight Delight Reduplication [Boost Software License]
http://sourceforge.jp/projects/delight/svn/view/trunk/src/?root=delight
Direct Move [unknown license]
http://zsoo.net/38
pydance [see http://kai.vm.bytemark.co.uk/svn/pydance/trunk/pydance/LICENSE]
http://kai.vm.bytemark.co.uk/svn/pydance/trunk/pydance/
be-pachi music [MIT license]
http://x-raise.cjb.net/bpm.html
marfitude [GPL license]
Some other rhythm game simulators are open source.
Here's where to find code.
--------------------------------------------------------------------------------
Delight Delight Reduplication [Boost Software License]
http://sourceforge.jp/projects/delight/svn/view/trunk/src/?root=delight
Direct Move [unknown license]
http://zsoo.net/38
pydance [see http://kai.vm.bytemark.co.uk/svn/pydance/trunk/pydance/LICENSE]
http://kai.vm.bytemark.co.uk/svn/pydance/trunk/pydance/
be-pachi music [MIT license]
http://x-raise.cjb.net/bpm.html
marfitude [GPL license]
http://www.erestar.net/games/marfitude/
+207 -207
View File
@@ -1,208 +1,208 @@
-- steps.lua: rough rough draft. Please don't use until finalized.
-- ver 20100116
-- shakesoda is going to be making this more generic for use in rhythm.
local MetaTags = {
Title = {"Dyamite Rave","(transliteration)"},
Subtitle = {"Down Bird Sota Mix","(transliteration)"},
Artist = {"NAOKI","(transliteration)"},
Genre = {"Scouse House","(transliteration)"},
License = "CC-BY-NC",
URL = "http://shakesoda.org/"
}
--[[
If an int is used in a field that expects a time of some sort, it is
assumed to use beats. If it's a float, it assumes seconds instead.
]]
local CacheData {
HasAttacks = true,
HasBanner = true,
HasBackground = true,
HasKeysounds = true,
HasLyrics = true,
HasMusic = true,
SongFileNames = "path/from/song/folder",
LongestChartLength = 220.000 -- use this to thwart the ogg length patch
}
local MetaData = {
Attacks = {
-- start = length, startup time, mod string
0 = { 10, 1.0, "mod,50% reverse" },
10 = { 5, 1.0, "mod,70% boost" }
},
BannerPath = { "banner.png" }, -- can be an image, video, or lua
Background = { -- background changes.
Path = "background.png",
Animation = { -- can have as many changes as needed
--[[
startTime = { path, rate, offset, commands }
Any ommitted arguments will default to nil, except for rate, which would use 1.0
]]
0 = {"path/to/bga", 1.0, 0.000, 0, cmd(rainbow) },
0 = {"path/to/bga2", 1.0, 0.000, 0, cmd(thump) }
},
},
--[[
-- #BGCHANGES2:32.000=flash=1.000=0=0=1=====,
BackgroundChanges2 = {
32.000 = { "flash", 1.000, 0, 0, 1, [unk], [unk], [unk], [unk], [unk] };
},
]]
BPMs = { 0.000 = 280.000 },
CDTitle = "",
DisplayBPM = { 150, 300 }, -- can be either an array of two values to cycle or 'Random'
FormatRevision = 2,
InstrumentTracks = {
-- guitar hero/rock band
Guitar = "guitar.ogg",
Rhythm = "rhythm.ogg",
Bass = "bass.ogg",
-- dj hero
LeftDeck = "left.ogg",
RightDeck = "right.ogg",
},
Keysounds = {}, -- I forget exactly how the SM format does this, but it'll be similar here.
LeadOut = 3,
Warps = { 5 = 4, 10 = 4 },
LyricsPath = "Dynamite Rave.lrc",
Offset = 0.014,
Overlay = {}, -- same as Background, but without path.
PreviewMusic = { 50.000, 60.000 },
Selectable = true,
Stops = { 156.000 = 0.540 },
TimeSignatures = { 0.000 = "4/4" }
}
local NoteCharts = {
{
ChartRevison = 20,
BPMs = { 0.000 = 140.000 }, -- override
Description = "Z. Nard", -- usually the chart author or "Copied from *"
Difficulty = 'Hard', -- "invalid" names will be assumed to be edits.
EditName = '', -- valid for all charts, typically only shows for edits.
Meter = '100', -- value clamped between 1 and 100, scaled to whatever works theme-side.
RadarValues = {
-- may not be 100%; won't be commented/linebroken in actual file
Stream = 0.931,
Voltage = 1.000,
Air = 0.439,
Freeze = 0.174,
Chaos = 0.156,
},
Stats = { -- will probably have more i.e. fakes, lifts.
Total = 645,
Jumps = 48,
Holds = 19,
Mines = 3,
Hands = 0,
Rolls = 0
},
StepsType = 'Dance_Single',
Stops = { 140.000 = 0.860 }, -- override
TimeSignatures = { 0.000 = "4/4" }, -- override
NoteData = {
{ -- measure 1
-- row level
--{ column level }, works like this:
{ 0,0,0,0 },
{ 0,0,0,0 },
{ 0,0,0,0 },
{ 0,0,0,1 = { SomeFunction(), 'TNS_GreaterThan', 'TapNoteScore_W5' } } -- example of assigning a function to a note.
},
{ -- measure 2
-- row level
--{ column level } or in other words
{ 0,0,0,0 },
{ 0,0,0,0 },
{ 0,0,0,0 },
{ 0,0,0,0 }
}
}
},
-- second example chart
{
ChartRevison = 5,
BPMs = { 0.000 = 140.000 },
Description = "B. McLargeHuge",
Difficulty = 'Expert',
EditName = '',
Meter = '60',
RadarValues = {
Stream = 0.931,
Voltage = 1.000,
Air = 0.439,
Freeze = 0.174,
Chaos = 0.156,
},
Stats = {
Total = 16,
Jumps = 0,
Holds = 0,
Mines = 16,
Hands = 0,
Rolls = 0
},
StepsType = 'Dance_Single',
NoteData = {
{ { 1,0,0,0 }, { 0,0,0,0 }, { 0,0,0,0 }, { 0,0,0,'m' }, },
{ { 0,1,0,0 }, { 0,0,0,0 }, { 0,0,0,0 }, { 0,0,'m',0 }, },
{ { 0,0,1,0 }, { 0,0,0,0 }, { 0,0,0,0 }, { 0,'m',0,0 }, },
{ { 0,0,0,1 }, { 0,0,0,0 }, { 0,0,0,0 }, { 'm',0,0,0 }, },
{ { 0,0,0,0 }, { 1,0,0,0 }, { 0,0,0,'m' }, { 0,0,0,0 }, },
{ { 0,0,0,0 }, { 0,1,0,0 }, { 0,0,'m',0 }, { 0,0,0,0 }, },
{ { 0,0,0,0 }, { 0,0,1,0 }, { 0,'m',0,0 }, { 0,0,0,0 }, },
{ { 0,0,0,0 }, { 0,0,0,1 }, { 'm',0,0,0 }, { 0,0,0,0 }, },
{ { 0,0,0,0 }, { 0,0,0,'m' }, { 1,0,0,0 }, { 0,0,0,0 }, },
{ { 0,0,0,0 }, { 0,0,'m',0 }, { 0,1,0,0 }, { 0,0,0,0 }, },
{ { 0,0,0,0 }, { 0,'m',0,0 }, { 0,0,1,0 }, { 0,0,0,0 }, },
{ { 0,0,0,0 }, { 'm',0,0,0 }, { 0,0,0,1 }, { 0,0,0,0 }, },
{ { 0,0,0,'m' }, { 0,0,0,0 }, { 0,0,0,0 }, { 1,0,0,0 }, },
{ { 0,0,'m',0 }, { 0,0,0,0 }, { 0,0,0,0 }, { 0,1,0,0 }, },
{ { 0,'m',0,0 }, { 0,0,0,0 }, { 0,0,0,0 }, { 0,0,1,0 }, },
{ { 'm',0,0,0 }, { 0,0,0,0 }, { 0,0,0,0 }, { 0,0,0,1 }, }
}
}
}
local EditCharts = {
{
-- todo: uh..... (this is the internal version of the edits.)
-- should be like NoteData but with fewer available overrides.
}
}
-- this is a work in progress format. expect things to change as better ideas come about.
-- this isn't how steps currently work internally. that can be dealt with.
--[[
Below is a minimal example file.
Just about every value that can be calculated or defaulted to something
reasonable has been omitted, and much extra whitespace reduced.
]]
MetaTags = {
Title = {"Black Lawn Finale", "long wait FINALLY"},
Artist = {"The Flashbulb", "teh falshbald"}
}
MetaData = {
BannerPath = { "banner.png" },
Background = { Path = "background.png" },
BPMs = { 0.000 = 280.000 },
FormatRevision = 1,
Offset = 0.028
}
NoteCharts = {
{
Description = "S. Slabrock",
Difficulty = 'Difficulty_Medium',
Meter = '50',
StepsType = 'StepsType_Dance_Single',
NoteData = {
{{0,0,0,0},{0,0,1,0},{0,0,0,0},{0,0,0,1}}, -- measure of 4ths
{{0,1,0,0},{0,0,0,0},{0,1,0,0},{0,0,0,1},{0,0,0,0},{0,0,0,1},{0,0,0,0},{0,0,0,1}} -- measure of 8ths
}
}
-- steps.lua: rough rough draft. Please don't use until finalized.
-- ver 20100116
-- shakesoda is going to be making this more generic for use in rhythm.
local MetaTags = {
Title = {"Dyamite Rave","(transliteration)"},
Subtitle = {"Down Bird Sota Mix","(transliteration)"},
Artist = {"NAOKI","(transliteration)"},
Genre = {"Scouse House","(transliteration)"},
License = "CC-BY-NC",
URL = "http://shakesoda.org/"
}
--[[
If an int is used in a field that expects a time of some sort, it is
assumed to use beats. If it's a float, it assumes seconds instead.
]]
local CacheData {
HasAttacks = true,
HasBanner = true,
HasBackground = true,
HasKeysounds = true,
HasLyrics = true,
HasMusic = true,
SongFileNames = "path/from/song/folder",
LongestChartLength = 220.000 -- use this to thwart the ogg length patch
}
local MetaData = {
Attacks = {
-- start = length, startup time, mod string
0 = { 10, 1.0, "mod,50% reverse" },
10 = { 5, 1.0, "mod,70% boost" }
},
BannerPath = { "banner.png" }, -- can be an image, video, or lua
Background = { -- background changes.
Path = "background.png",
Animation = { -- can have as many changes as needed
--[[
startTime = { path, rate, offset, commands }
Any ommitted arguments will default to nil, except for rate, which would use 1.0
]]
0 = {"path/to/bga", 1.0, 0.000, 0, cmd(rainbow) },
0 = {"path/to/bga2", 1.0, 0.000, 0, cmd(thump) }
},
},
--[[
-- #BGCHANGES2:32.000=flash=1.000=0=0=1=====,
BackgroundChanges2 = {
32.000 = { "flash", 1.000, 0, 0, 1, [unk], [unk], [unk], [unk], [unk] };
},
]]
BPMs = { 0.000 = 280.000 },
CDTitle = "",
DisplayBPM = { 150, 300 }, -- can be either an array of two values to cycle or 'Random'
FormatRevision = 2,
InstrumentTracks = {
-- guitar hero/rock band
Guitar = "guitar.ogg",
Rhythm = "rhythm.ogg",
Bass = "bass.ogg",
-- dj hero
LeftDeck = "left.ogg",
RightDeck = "right.ogg",
},
Keysounds = {}, -- I forget exactly how the SM format does this, but it'll be similar here.
LeadOut = 3,
Warps = { 5 = 4, 10 = 4 },
LyricsPath = "Dynamite Rave.lrc",
Offset = 0.014,
Overlay = {}, -- same as Background, but without path.
PreviewMusic = { 50.000, 60.000 },
Selectable = true,
Stops = { 156.000 = 0.540 },
TimeSignatures = { 0.000 = "4/4" }
}
local NoteCharts = {
{
ChartRevison = 20,
BPMs = { 0.000 = 140.000 }, -- override
Description = "Z. Nard", -- usually the chart author or "Copied from *"
Difficulty = 'Hard', -- "invalid" names will be assumed to be edits.
EditName = '', -- valid for all charts, typically only shows for edits.
Meter = '100', -- value clamped between 1 and 100, scaled to whatever works theme-side.
RadarValues = {
-- may not be 100%; won't be commented/linebroken in actual file
Stream = 0.931,
Voltage = 1.000,
Air = 0.439,
Freeze = 0.174,
Chaos = 0.156,
},
Stats = { -- will probably have more i.e. fakes, lifts.
Total = 645,
Jumps = 48,
Holds = 19,
Mines = 3,
Hands = 0,
Rolls = 0
},
StepsType = 'Dance_Single',
Stops = { 140.000 = 0.860 }, -- override
TimeSignatures = { 0.000 = "4/4" }, -- override
NoteData = {
{ -- measure 1
-- row level
--{ column level }, works like this:
{ 0,0,0,0 },
{ 0,0,0,0 },
{ 0,0,0,0 },
{ 0,0,0,1 = { SomeFunction(), 'TNS_GreaterThan', 'TapNoteScore_W5' } } -- example of assigning a function to a note.
},
{ -- measure 2
-- row level
--{ column level } or in other words
{ 0,0,0,0 },
{ 0,0,0,0 },
{ 0,0,0,0 },
{ 0,0,0,0 }
}
}
},
-- second example chart
{
ChartRevison = 5,
BPMs = { 0.000 = 140.000 },
Description = "B. McLargeHuge",
Difficulty = 'Expert',
EditName = '',
Meter = '60',
RadarValues = {
Stream = 0.931,
Voltage = 1.000,
Air = 0.439,
Freeze = 0.174,
Chaos = 0.156,
},
Stats = {
Total = 16,
Jumps = 0,
Holds = 0,
Mines = 16,
Hands = 0,
Rolls = 0
},
StepsType = 'Dance_Single',
NoteData = {
{ { 1,0,0,0 }, { 0,0,0,0 }, { 0,0,0,0 }, { 0,0,0,'m' }, },
{ { 0,1,0,0 }, { 0,0,0,0 }, { 0,0,0,0 }, { 0,0,'m',0 }, },
{ { 0,0,1,0 }, { 0,0,0,0 }, { 0,0,0,0 }, { 0,'m',0,0 }, },
{ { 0,0,0,1 }, { 0,0,0,0 }, { 0,0,0,0 }, { 'm',0,0,0 }, },
{ { 0,0,0,0 }, { 1,0,0,0 }, { 0,0,0,'m' }, { 0,0,0,0 }, },
{ { 0,0,0,0 }, { 0,1,0,0 }, { 0,0,'m',0 }, { 0,0,0,0 }, },
{ { 0,0,0,0 }, { 0,0,1,0 }, { 0,'m',0,0 }, { 0,0,0,0 }, },
{ { 0,0,0,0 }, { 0,0,0,1 }, { 'm',0,0,0 }, { 0,0,0,0 }, },
{ { 0,0,0,0 }, { 0,0,0,'m' }, { 1,0,0,0 }, { 0,0,0,0 }, },
{ { 0,0,0,0 }, { 0,0,'m',0 }, { 0,1,0,0 }, { 0,0,0,0 }, },
{ { 0,0,0,0 }, { 0,'m',0,0 }, { 0,0,1,0 }, { 0,0,0,0 }, },
{ { 0,0,0,0 }, { 'm',0,0,0 }, { 0,0,0,1 }, { 0,0,0,0 }, },
{ { 0,0,0,'m' }, { 0,0,0,0 }, { 0,0,0,0 }, { 1,0,0,0 }, },
{ { 0,0,'m',0 }, { 0,0,0,0 }, { 0,0,0,0 }, { 0,1,0,0 }, },
{ { 0,'m',0,0 }, { 0,0,0,0 }, { 0,0,0,0 }, { 0,0,1,0 }, },
{ { 'm',0,0,0 }, { 0,0,0,0 }, { 0,0,0,0 }, { 0,0,0,1 }, }
}
}
}
local EditCharts = {
{
-- todo: uh..... (this is the internal version of the edits.)
-- should be like NoteData but with fewer available overrides.
}
}
-- this is a work in progress format. expect things to change as better ideas come about.
-- this isn't how steps currently work internally. that can be dealt with.
--[[
Below is a minimal example file.
Just about every value that can be calculated or defaulted to something
reasonable has been omitted, and much extra whitespace reduced.
]]
MetaTags = {
Title = {"Black Lawn Finale", "long wait FINALLY"},
Artist = {"The Flashbulb", "teh falshbald"}
}
MetaData = {
BannerPath = { "banner.png" },
Background = { Path = "background.png" },
BPMs = { 0.000 = 280.000 },
FormatRevision = 1,
Offset = 0.028
}
NoteCharts = {
{
Description = "S. Slabrock",
Difficulty = 'Difficulty_Medium',
Meter = '50',
StepsType = 'StepsType_Dance_Single',
NoteData = {
{{0,0,0,0},{0,0,1,0},{0,0,0,0},{0,0,0,1}}, -- measure of 4ths
{{0,1,0,0},{0,0,0,0},{0,1,0,0},{0,0,0,1},{0,0,0,0},{0,0,0,1},{0,0,0,0},{0,0,0,1}} -- measure of 8ths
}
}
}
+12 -12
View File
@@ -1,12 +1,12 @@
[as taken from src/ProductInfo.h] (before doxygen)
Version info displayed to the user.
These are the 'official' version designations:
* "experimental: pre-release versions
* "private beta v0.0": hmm, think about it for a second there.
==Public versions below this line==
* "v0.0 alpha #": Alpha versions (bug squashing, polishing until we reach beta)
* "v0.0 beta #": Beta versions (bug squashing, _focus_ is on high priority bugs)
* "v0.0 rc#": Release Candidates (if there are no problems, move on to final)
* "v0.0": Final Releases
[as taken from src/ProductInfo.h] (before doxygen)
Version info displayed to the user.
These are the 'official' version designations:
* "experimental: pre-release versions
* "private beta v0.0": hmm, think about it for a second there.
==Public versions below this line==
* "v0.0 alpha #": Alpha versions (bug squashing, polishing until we reach beta)
* "v0.0 beta #": Beta versions (bug squashing, _focus_ is on high priority bugs)
* "v0.0 rc#": Release Candidates (if there are no problems, move on to final)
* "v0.0": Final Releases
+46 -46
View File
@@ -1,47 +1,47 @@
[Settings]
NumFields=5
[Field 1]
Type=Button
Flags=NOTIFY
Text=&Install
Left=160
Right=-10
Top=50
Bottom=70
[Field 2]
Type=Button
Flags=NOTIFY
Text=&Play
Left=160
Right=-10
Top=30
Bottom=50
[Field 3]
Type=Button
Flags=NOTIFY
Text=&Re-Install
Left=160
Right=-10
Top=60
Bottom=80
[Field 4]
Type=Link
Text=http://www.urlhere.com
State=http://www.urlhere.com
Left=160
Right=-10
Top=130
Bottom=140
[Field 5]
Type=Bitmap
Text=custom.bmp
Flags=TRANSPARENT
Left=0
Right=150
Top=0
[Settings]
NumFields=5
[Field 1]
Type=Button
Flags=NOTIFY
Text=&Install
Left=160
Right=-10
Top=50
Bottom=70
[Field 2]
Type=Button
Flags=NOTIFY
Text=&Play
Left=160
Right=-10
Top=30
Bottom=50
[Field 3]
Type=Button
Flags=NOTIFY
Text=&Re-Install
Left=160
Right=-10
Top=60
Bottom=80
[Field 4]
Type=Link
Text=http://www.urlhere.com
State=http://www.urlhere.com
Left=160
Right=-10
Top=130
Bottom=140
[Field 5]
Type=Bitmap
Text=custom.bmp
Flags=TRANSPARENT
Left=0
Right=150
Top=0
Bottom=120
+35 -35
View File
@@ -1,35 +1,35 @@
## Need 1.7 for subdir support. (Well, 1.4 doesn't work, I don't know if anything between does.)
AUTOMAKE_OPTIONS = 1.7 foreign
SUBDIRS = src
ACLOCAL_AMFLAGS = -I autoconf/m4
## Black magic (read: sed) for getting the product ID as defined in code, not by the autotools.
## Quotes are making vim's highlighting of this even worse, so just escape everything,
## including the escapes. Make it lowercase to match ArchHooks::MountInitialFileSystems().
productID := $(shell sed -nr /define\\s+PRODUCT_ID_BARE/\{s/.*define\\s+PRODUCT_ID_BARE\\s+\(.+\)/\\1/\;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/\;p\;q\} $(srcdir)/src/ProductInfo.h)
installFiles = src/stepmania
if HAVE_GTK
installFiles += src/GtkModule.so
endif
.PHONY: SMData
SMData:
$(srcdir)/Utils/CreatePackage.pl $(srcdir) .
dist-hook: SMData
mkdir -p $(distdir)/Packages
cp GameData.smzip $(distdir)/Packages
mkdir -p $(distdir)/Docs
cp $(srcdir)/Docs/Licenses.txt $(distdir)/Docs
cp $(srcdir)/Utils/build.sh $(distdir)
install-data-hook: $(top_srcdir)/Packages/GameData.smzip
mkdir -p "$(DESTDIR)$(bindir)/$(productID)/Packages"
$(INSTALL) $(installFiles) "$(DESTDIR)$(bindir)/$(productID)"
$(INSTALL_DATA) $(top_srcdir)/Packages/GameData.smzip "$(DESTDIR)$(bindir)/$(productID)/Packages"
uninstall-hook:
rm -f "$(DESTDIR)$(bindir)/$(productID)/stepmania"
rm -f "$(DESTDIR)$(bindir)/$(productID)/GtkModule.so"
rm -f "$(DESTDIR)$(bindir)/$(productID)/Packages/GameData.smzip"
## Need 1.7 for subdir support. (Well, 1.4 doesn't work, I don't know if anything between does.)
AUTOMAKE_OPTIONS = 1.7 foreign
SUBDIRS = src
ACLOCAL_AMFLAGS = -I autoconf/m4
## Black magic (read: sed) for getting the product ID as defined in code, not by the autotools.
## Quotes are making vim's highlighting of this even worse, so just escape everything,
## including the escapes. Make it lowercase to match ArchHooks::MountInitialFileSystems().
productID := $(shell sed -nr /define\\s+PRODUCT_ID_BARE/\{s/.*define\\s+PRODUCT_ID_BARE\\s+\(.+\)/\\1/\;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/\;p\;q\} $(srcdir)/src/ProductInfo.h)
installFiles = src/stepmania
if HAVE_GTK
installFiles += src/GtkModule.so
endif
.PHONY: SMData
SMData:
$(srcdir)/Utils/CreatePackage.pl $(srcdir) .
dist-hook: SMData
mkdir -p $(distdir)/Packages
cp GameData.smzip $(distdir)/Packages
mkdir -p $(distdir)/Docs
cp $(srcdir)/Docs/Licenses.txt $(distdir)/Docs
cp $(srcdir)/Utils/build.sh $(distdir)
install-data-hook: $(top_srcdir)/Packages/GameData.smzip
mkdir -p "$(DESTDIR)$(bindir)/$(productID)/Packages"
$(INSTALL) $(installFiles) "$(DESTDIR)$(bindir)/$(productID)"
$(INSTALL_DATA) $(top_srcdir)/Packages/GameData.smzip "$(DESTDIR)$(bindir)/$(productID)/Packages"
uninstall-hook:
rm -f "$(DESTDIR)$(bindir)/$(productID)/stepmania"
rm -f "$(DESTDIR)$(bindir)/$(productID)/GtkModule.so"
rm -f "$(DESTDIR)$(bindir)/$(productID)/Packages/GameData.smzip"
+12 -12
View File
@@ -1,12 +1,12 @@
return Def.ActorFrame {
-- We want this under the noteskin, so that we it looks like a laser (?)
LoadActor( NOTESKIN:GetPath("", "_Tap Receptor"), NOTESKIN:LoadActor( Var "Button", "KeypressBlock" ) ) .. {
InitCommand=cmd(vertalign,top;zoomx,0);
-- Press/Lift allows this to appear and disappear
PressCommand=cmd(zoomx,0;linear,0.02;zoomx,1);
LiftCommand=cmd(zoomx,1;linear,0.14;zoomx,0);
};
-- Overlay the receptor.
LoadActor( NOTESKIN:GetPath("", "_Tap Receptor"), NOTESKIN:LoadActor( Var "Button", "Go Receptor" ) );
};
return Def.ActorFrame {
-- We want this under the noteskin, so that we it looks like a laser (?)
LoadActor( NOTESKIN:GetPath("", "_Tap Receptor"), NOTESKIN:LoadActor( Var "Button", "KeypressBlock" ) ) .. {
InitCommand=cmd(vertalign,top;zoomx,0);
-- Press/Lift allows this to appear and disappear
PressCommand=cmd(zoomx,0;linear,0.02;zoomx,1);
LiftCommand=cmd(zoomx,1;linear,0.14;zoomx,0);
};
-- Overlay the receptor.
LoadActor( NOTESKIN:GetPath("", "_Tap Receptor"), NOTESKIN:LoadActor( Var "Button", "Go Receptor" ) );
};
+6 -6
View File
@@ -1,7 +1,7 @@
return Def.ActorFrame {
Def.Sprite {
Texture=NOTESKIN:GetPath( '_down', 'tap note' );
Frames = Sprite.LinearFrames( 4, 1 );
};
return Def.ActorFrame {
Def.Sprite {
Texture=NOTESKIN:GetPath( '_down', 'tap note' );
Frames = Sprite.LinearFrames( 4, 1 );
};
};
+105 -105
View File
@@ -1,105 +1,105 @@
local ret = ... or {};
ret.RedirTable =
{
Up = "Down",
Down = "Down",
Left = "Down",
Right = "Down",
UpLeft = "Down",
UpRight = "Down",
};
local OldRedir = ret.Redir;
ret.Redir = function(sButton, sElement)
sButton, sElement = OldRedir(sButton, sElement);
-- Instead of separate hold heads, use the tap note graphics.
--[[if sElement == "Hold Head Inactive" or
sElement == "Hold Head Active" or
sElement == "Roll Head Inactive" or
sElement == "Roll Head Active"
then
sElement = "Tap Note";
end
]]
sButton = ret.RedirTable[sButton];
return sButton, sElement;
end
-- To have separate graphics for each hold part:
--[[
local OldRedir = ret.Redir;
ret.Redir = function(sButton, sElement)
-- Redirect non-hold, non-roll parts.
if string.find(sElement, "hold") then
return sButton, sElement;
end
return OldRedir(sButton, sElement);
end
]]
local OldFunc = ret.Load;
function ret.Load()
local t = OldFunc();
-- The main "Explosion" part just loads other actors; don't rotate
-- it. The "Hold Explosion" part should not be rotated.
if Var "Element" == "Explosion" or
Var "Element" == "Roll Explosion" or
Var "Element" == "Hold Explosion" then
t.BaseRotationZ = nil;
end
return t;
end
ret.PartsToRotate =
{
["Go Receptor"] = true,
["Ready Receptor"] = true,
["Tap Explosion Bright"] = true,
["Tap Explosion Dim"] = true,
["Tap Note"] = true,
["Hold Bottom Cap Active"] = true,
["Hold Bottom Cap Inactive"] = true,
["Hold Head Active"] = true,
["Hold Head Inactive"] = true,
["Roll Head Active"] = true,
["Roll Head Inactive"] = true,
};
ret.Rotate =
{
Up = 180,
Down = 0,
Left = 90,
Right = -90,
UpLeft = 135,
UpRight = 225,
};
--
-- If a derived skin wants to have separate UpLeft graphics,
-- use this:
--
-- ret.RedirTable.UpLeft = "UpLeft";
-- ret.RedirTable.UpRight = "UpLeft";
-- ret.Rotate.UpLeft = 0;
-- ret.Rotate.UpRight = 90;
--
ret.Blank =
{
["Hold Topcap Active"] = true,
["Hold Topcap Inactive"] = true,
["Roll Topcap Active"] = true,
["Roll Topcap Inactive"] = true,
["Hold Tail Active"] = true,
["Hold Tail Inactive"] = true,
["Roll Tail Active"] = true,
["Roll Tail Inactive"] = true,
};
return ret;
local ret = ... or {};
ret.RedirTable =
{
Up = "Down",
Down = "Down",
Left = "Down",
Right = "Down",
UpLeft = "Down",
UpRight = "Down",
};
local OldRedir = ret.Redir;
ret.Redir = function(sButton, sElement)
sButton, sElement = OldRedir(sButton, sElement);
-- Instead of separate hold heads, use the tap note graphics.
--[[if sElement == "Hold Head Inactive" or
sElement == "Hold Head Active" or
sElement == "Roll Head Inactive" or
sElement == "Roll Head Active"
then
sElement = "Tap Note";
end
]]
sButton = ret.RedirTable[sButton];
return sButton, sElement;
end
-- To have separate graphics for each hold part:
--[[
local OldRedir = ret.Redir;
ret.Redir = function(sButton, sElement)
-- Redirect non-hold, non-roll parts.
if string.find(sElement, "hold") then
return sButton, sElement;
end
return OldRedir(sButton, sElement);
end
]]
local OldFunc = ret.Load;
function ret.Load()
local t = OldFunc();
-- The main "Explosion" part just loads other actors; don't rotate
-- it. The "Hold Explosion" part should not be rotated.
if Var "Element" == "Explosion" or
Var "Element" == "Roll Explosion" or
Var "Element" == "Hold Explosion" then
t.BaseRotationZ = nil;
end
return t;
end
ret.PartsToRotate =
{
["Go Receptor"] = true,
["Ready Receptor"] = true,
["Tap Explosion Bright"] = true,
["Tap Explosion Dim"] = true,
["Tap Note"] = true,
["Hold Bottom Cap Active"] = true,
["Hold Bottom Cap Inactive"] = true,
["Hold Head Active"] = true,
["Hold Head Inactive"] = true,
["Roll Head Active"] = true,
["Roll Head Inactive"] = true,
};
ret.Rotate =
{
Up = 180,
Down = 0,
Left = 90,
Right = -90,
UpLeft = 135,
UpRight = 225,
};
--
-- If a derived skin wants to have separate UpLeft graphics,
-- use this:
--
-- ret.RedirTable.UpLeft = "UpLeft";
-- ret.RedirTable.UpRight = "UpLeft";
-- ret.Rotate.UpLeft = 0;
-- ret.Rotate.UpRight = 90;
--
ret.Blank =
{
["Hold Topcap Active"] = true,
["Hold Topcap Inactive"] = true,
["Roll Topcap Active"] = true,
["Roll Topcap Inactive"] = true,
["Hold Tail Active"] = true,
["Hold Tail Inactive"] = true,
["Roll Tail Active"] = true,
["Roll Tail Inactive"] = true,
};
return ret;
+76 -76
View File
@@ -1,77 +1,77 @@
[Global]
[NoteDisplay]
TapNoteAnimationIsVivid=0
DrawHoldHeadForTapsOnSameRow=0
TapNoteAnimationLength=2
TapAdditionAnimationLength=4
TapMineAnimationLength=1
TapLiftAnimationLength=4
HoldHeadAnimationLength=1 // doesn't matter. Only 1 frame anyway.
HoldTopCapAnimationLength=1 // doesn't matter. Only 1 frame anyway.
HoldBottomCapAnimationLength=1 // doesn't matter. Only 1 frame anyway.
HoldBodyAnimationLength=1 // doesn't matter. Only 1 frame anyway.
HoldTailAnimationLength=1 // doesn't matter. Only 1 frame anyway.
HoldHeadAnimationIsNoteColor=0
HoldTopCapAnimationIsNoteColor=0
HoldBodyAnimationIsNoteColor=0
HoldBottomCapAnimationIsNoteColor=0
HoldTailAnimationIsNoteColor=0
HoldLetGoGrayPercent=0.25
HoldHeadIsAboveWavyParts=0
HoldTailIsAboveWavyParts=0
StartDrawingHoldBodyOffsetFromHead=0
StopDrawingHoldBodyOffsetFromTail=0 // top of tail
ReverseDrawOrder=1101
TapNoteAdditionTextureCoordOffsetX=0.5
TapNoteAdditionTextureCoordOffsetY=0
FlipHeadAndTailWhenReverse=1
FlipHoldBodyWhenReverse=1
TopHoldAnchorWhenReverse=1
TapNoteNoteColorTextureCoordSpacingX=0
TapNoteNoteColorTextureCoordSpacingY=0
HoldHeadNoteColorTextureCoordSpacingX=0
HoldHeadNoteColorTextureCoordSpacingY=0
[GhostArrowDim]
HitMineCommand=blend,"BlendMode_Add";diffuse,1,1,1,1;zoom,1;rotationz,0;linear,0.3;rotationz,90;linear,0.3;rotationz,180;diffusealpha,0
W5Command=diffuse,0.8,0.0,0.6,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W4Command=diffuse,0.3,0.8,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W3Command=diffuse,0.0,1.0,0.4,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W2Command=diffuse,1.0,1.0,0.3,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W1Command=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.2;zoom,1.5;decelerate,0.1;zoom,1.5;diffusealpha,0
HeldCommand=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
[GhostArrowBright]
NoneCommand=
HitMineCommand=blend,"BlendMode_Add";diffuse,1,1,1,1;zoom,1;rotationz,0;linear,0.3;rotationz,90;linear,0.3;rotationz,180;diffusealpha,0
AvoidMineCommand=
MissCommand=
W5Command=diffuse,0.8,0.0,0.6,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W4Command=diffuse,0.3,0.8,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W3Command=diffuse,0.0,1.0,0.4,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W2Command=diffuse,1.0,1.0,0.3,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W1Command=diffuse,0.8,0.0,0.6,1;zoom,1;linear,0.2;zoom,1.5;decelerate,0.1;zoom,1.5;diffusealpha,0
HeldCommand=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
[ReceptorArrow]
InitCommand=effectclock,'beat';diffuseramp;effectcolor1,color("0.5,0.5,0.5,1");effectcolor2,color("1,1,1,1");
NoneCommand=zoom,1.1;linear,0.06;diffusealpha,0;linear,0.06;zoom,1.0;diffuse,0.3,0.8,1.0,1
HitMineCommand=
AvoidMineCommand=
MissCommand=
W5Command=stoptweening;zoom,1.25;linear,0.11;zoom,1
W4Command=stoptweening;zoom,1.25;linear,0.11;zoom,1
W3Command=stoptweening;zoom,1.25;linear,0.11;zoom,1
W2Command=stoptweening;zoom,1.25;linear,0.11;zoom,1
W1Command=stoptweening;zoom,1.25;linear,0.11;zoom,1
PressCommand=
[Global]
[NoteDisplay]
TapNoteAnimationIsVivid=0
DrawHoldHeadForTapsOnSameRow=0
TapNoteAnimationLength=2
TapAdditionAnimationLength=4
TapMineAnimationLength=1
TapLiftAnimationLength=4
HoldHeadAnimationLength=1 // doesn't matter. Only 1 frame anyway.
HoldTopCapAnimationLength=1 // doesn't matter. Only 1 frame anyway.
HoldBottomCapAnimationLength=1 // doesn't matter. Only 1 frame anyway.
HoldBodyAnimationLength=1 // doesn't matter. Only 1 frame anyway.
HoldTailAnimationLength=1 // doesn't matter. Only 1 frame anyway.
HoldHeadAnimationIsNoteColor=0
HoldTopCapAnimationIsNoteColor=0
HoldBodyAnimationIsNoteColor=0
HoldBottomCapAnimationIsNoteColor=0
HoldTailAnimationIsNoteColor=0
HoldLetGoGrayPercent=0.25
HoldHeadIsAboveWavyParts=0
HoldTailIsAboveWavyParts=0
StartDrawingHoldBodyOffsetFromHead=0
StopDrawingHoldBodyOffsetFromTail=0 // top of tail
ReverseDrawOrder=1101
TapNoteAdditionTextureCoordOffsetX=0.5
TapNoteAdditionTextureCoordOffsetY=0
FlipHeadAndTailWhenReverse=1
FlipHoldBodyWhenReverse=1
TopHoldAnchorWhenReverse=1
TapNoteNoteColorTextureCoordSpacingX=0
TapNoteNoteColorTextureCoordSpacingY=0
HoldHeadNoteColorTextureCoordSpacingX=0
HoldHeadNoteColorTextureCoordSpacingY=0
[GhostArrowDim]
HitMineCommand=blend,"BlendMode_Add";diffuse,1,1,1,1;zoom,1;rotationz,0;linear,0.3;rotationz,90;linear,0.3;rotationz,180;diffusealpha,0
W5Command=diffuse,0.8,0.0,0.6,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W4Command=diffuse,0.3,0.8,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W3Command=diffuse,0.0,1.0,0.4,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W2Command=diffuse,1.0,1.0,0.3,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W1Command=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.2;zoom,1.5;decelerate,0.1;zoom,1.5;diffusealpha,0
HeldCommand=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
[GhostArrowBright]
NoneCommand=
HitMineCommand=blend,"BlendMode_Add";diffuse,1,1,1,1;zoom,1;rotationz,0;linear,0.3;rotationz,90;linear,0.3;rotationz,180;diffusealpha,0
AvoidMineCommand=
MissCommand=
W5Command=diffuse,0.8,0.0,0.6,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W4Command=diffuse,0.3,0.8,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W3Command=diffuse,0.0,1.0,0.4,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W2Command=diffuse,1.0,1.0,0.3,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
W1Command=diffuse,0.8,0.0,0.6,1;zoom,1;linear,0.2;zoom,1.5;decelerate,0.1;zoom,1.5;diffusealpha,0
HeldCommand=diffuse,1.0,1.0,1.0,1;zoom,1;linear,0.06;zoom,1.1;linear,0.06;diffusealpha,0
[ReceptorArrow]
InitCommand=effectclock,'beat';diffuseramp;effectcolor1,color("0.5,0.5,0.5,1");effectcolor2,color("1,1,1,1");
NoneCommand=zoom,1.1;linear,0.06;diffusealpha,0;linear,0.06;zoom,1.0;diffuse,0.3,0.8,1.0,1
HitMineCommand=
AvoidMineCommand=
MissCommand=
W5Command=stoptweening;zoom,1.25;linear,0.11;zoom,1
W4Command=stoptweening;zoom,1.25;linear,0.11;zoom,1
W3Command=stoptweening;zoom,1.25;linear,0.11;zoom,1
W2Command=stoptweening;zoom,1.25;linear,0.11;zoom,1
W1Command=stoptweening;zoom,1.25;linear,0.11;zoom,1
PressCommand=
LiftCommand=
@@ -1 +1 @@
Common Tap Explosion Dim
Common Tap Explosion Dim

Some files were not shown because too many files have changed in this diff Show More