Initial commit.

This commit is contained in:
AJ Kelly
2010-01-26 21:00:30 -06:00
parent 80057f53cd
commit 3e51544930
4074 changed files with 588945 additions and 543956 deletions
+1 -1
View File
@@ -1 +1 @@
Place announcer folders in this directory.
Place announcer folders in this directory.
+1 -1
View File
@@ -1 +1 @@
Place BGAnimation folders in here.
Place BGAnimation folders in here.
+1 -2
View File
@@ -1,5 +1,4 @@
return Def.Quad
{
return Def.Quad{
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;zoomtowidth,SCREEN_WIDTH;zoomtoheight,SCREEN_HEIGHT);
GainFocusCommand=cmd(diffusealpha,1.0;accelerate,0.6;diffusealpha,0);
}
+1 -2
View File
@@ -1,5 +1,4 @@
return Def.Quad
{
return Def.Quad{
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;zoomtowidth,SCREEN_WIDTH;zoomtoheight,SCREEN_HEIGHT);
GainFocusCommand=cmd(diffuse,color("#FFFFA0");accelerate,0.6;diffusealpha,0);
}
+10 -10
View File
@@ -1,10 +1,10 @@
local Color = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;diffuse,Color;effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
local Color = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;diffuse,Color;effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+16 -16
View File
@@ -1,16 +1,16 @@
local Color = color(Var "Color1");
local a = LoadActor(Var "File1") .. {
OnCommand=cmd(zoomtowidth,SCREEN_WIDTH/2;zoomtoheight,SCREEN_HEIGHT/2;diffuse,Color;effectclock,"music");
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;
local Color = color(Var "Color1");
local a = LoadActor(Var "File1") .. {
OnCommand=cmd(zoomtowidth,SCREEN_WIDTH/2;zoomtoheight,SCREEN_HEIGHT/2;diffuse,Color;effectclock,"music");
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 @@
local Color = color(Var "Color1");
local a = LoadActor(Var "File2") .. {
OnCommand=cmd(zoomtowidth,SCREEN_WIDTH/2;zoomtoheight,SCREEN_HEIGHT/2;diffuse,Color;effectclock,"music");
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;
local Color = color(Var "Color1");
local a = LoadActor(Var "File2") .. {
OnCommand=cmd(zoomtowidth,SCREEN_WIDTH/2;zoomtoheight,SCREEN_HEIGHT/2;diffuse,Color;effectclock,"music");
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 @@
local Color = color(Var "Color1");
local a = LoadActor(Var "File1") .. {
OnCommand=cmd(zoomtowidth,SCREEN_WIDTH/2;zoomtoheight,SCREEN_HEIGHT/2;diffuse,Color;zoomx,self:GetZoomX()*-1;zoomy,self:GetZoomY()*-1;effectclock,"music");
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;
local Color = color(Var "Color1");
local a = LoadActor(Var "File1") .. {
OnCommand=cmd(zoomtowidth,SCREEN_WIDTH/2;zoomtoheight,SCREEN_HEIGHT/2;diffuse,Color;zoomx,self:GetZoomX()*-1;zoomy,self:GetZoomY()*-1;effectclock,"music");
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
View File
@@ -0,0 +1,16 @@
local Color1 = color(Var "Color1");
local Color2 = color(Var "Color2");
local t = Def.ActorFrame {
Def.Sprite {
OnCommand=cmd(x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;zoomtowidth,SCREEN_WIDTH;zoomtoheight,SCREEN_HEIGHT;diffuse,Color1;effectclock,"music");
};
LoadActor(Var "File1") .. {
OnCommand=cmd(blend,"BlendMode_Add";x,SCREEN_CENTER_X;y,SCREEN_CENTER_Y;zoomtowidth,SCREEN_WIDTH;zoomtoheight,SCREEN_HEIGHT;diffuse,Color2;effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+10 -10
View File
@@ -1,10 +1,10 @@
local Color = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(scale_or_crop_background;diffuse,Color;loop,false;effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
local Color = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(scale_or_crop_background;diffuse,Color;loop,false;effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+11 -11
View File
@@ -1,11 +1,11 @@
local Color = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(scale_or_crop_background;diffuse,Color;effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
local Color = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(scale_or_crop_background;diffuse,Color;effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+12 -12
View File
@@ -1,12 +1,12 @@
-- Align left when cropping to 4:3.
local Color = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(horizalign,left;scaletocover,0,0,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,color(Color);effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
-- Align left when cropping to 4:3.
local Color = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(horizalign,left;scaletocover,0,0,SCREEN_WIDTH,SCREEN_HEIGHT;diffuse,color(Color);effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+11 -11
View File
@@ -1,11 +1,11 @@
local Color = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(scale_or_crop_background;diffuse,Color;pause;effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
local Color = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(scale_or_crop_background;diffuse,Color;pause;effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+12 -12
View File
@@ -1,12 +1,12 @@
local Color = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(scale_or_crop_background;diffuse,Color;position,0;effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
local Color = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(scale_or_crop_background;diffuse,Color;position,0;effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
+13 -13
View File
@@ -1,13 +1,13 @@
-- upper left corner
local Color = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(diffuse,Color;effectclock,"music");
GainFocusCommand=cmd(play);
LoseFocusCommand=cmd(pause);
};
};
return t;
-- upper left corner
local Color = color(Var "Color1");
local t = Def.ActorFrame {
LoadActor(Var "File1") .. {
OnCommand=cmd(diffuse,Color;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"
/>
+5 -5
View File
@@ -1,5 +1,5 @@
DWI-style CDTiltes 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.
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.
+21
View File
@@ -0,0 +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
copyright, yeah?
+10 -10
View File
@@ -1,10 +1,10 @@
[Character]
Level1Attack1=1.5x
Level1Attack2=hidden
Level1Attack3=reverse
Level2Attack1=2x
Level2Attack2=sudden
Level2Attack3=expand
Level3Attack1=3x
Level3Attack2=boost
Level3Attack3=brake
[Character]
Level1Attack1=1.5x
Level1Attack2=hidden
Level1Attack3=reverse
Level2Attack1=dizzy
Level2Attack2=sudden
Level2Attack3=expand
Level3Attack1=0.5x
Level3Attack2=drunk
Level3Attack3=brake
Binary file not shown.

After

Width:  |  Height:  |  Size: 107 B

@@ -1,6 +1,5 @@
#COURSE:Players Best 1-4;
#SONG:BEST1:Medium;
#SONG:BEST2:Medium;
#SONG:BEST3:Medium;
#SONG:BEST4:Medium;
#COURSE:Most Played 01-04;
#SONG:BEST1:Medium;
#SONG:BEST2:Medium;
#SONG:BEST3:Medium;
#SONG:BEST4:Medium;
Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

@@ -1,5 +1,5 @@
#COURSE:Players Best 5-8;
#SONG:BEST5:Medium;
#SONG:BEST6:Medium;
#SONG:BEST7:Medium;
#SONG:BEST8:Medium;
#COURSE:Most Played 05-08;
#SONG:BEST5:Medium;
#SONG:BEST6:Medium;
#SONG:BEST7:Medium;
#SONG:BEST8:Medium;
Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

@@ -1,5 +1,5 @@
#COURSE:Players Best 9-12;
#SONG:BEST9:Medium;
#SONG:BEST10:Medium;
#SONG:BEST11:Medium;
#SONG:BEST12:Medium;
#COURSE:Most Played 09-12;
#SONG:BEST9:Medium;
#SONG:BEST10:Medium;
#SONG:BEST11:Medium;
#SONG:BEST12:Medium;
Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

@@ -1,5 +1,5 @@
#COURSE:Players Best 13-16;
#SONG:BEST13:Medium;
#SONG:BEST14:Medium;
#SONG:BEST15:Medium;
#SONG:BEST16:Medium;
#COURSE:Most Played 13-16;
#SONG:BEST13:Medium;
#SONG:BEST14:Medium;
#SONG:BEST15:Medium;
#SONG:BEST16:Medium;
Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

-7
View File
@@ -1,7 +0,0 @@
#COURSE:All Challenge;
#LIVES:4;
#SONG:*:CHALLENGE;
#SONG:*:CHALLENGE;
#SONG:*:CHALLENGE;
#SONG:*:CHALLENGE;
#SONG:*:CHALLENGE;
-5
View File
@@ -1,5 +0,0 @@
#COURSE:All Music Random;
#SONG:*:Medium:;
#SONG:*:Medium:;
#SONG:*:Medium:;
#SONG:*:Medium:;
-10
View File
@@ -1,10 +0,0 @@
#COURSE:End of the Road;
#LIVES:4;
#SONG:*:7..7:1.5x,reverse;
#SONG:*:7..7:expand;
#SONG:*:8..8:0.25x;
#SONG:*:8..8:hidden,boost;
#SONG:*:9..9:3.0x,dark,reverse;
#SONG:*:9..9:land,big,supershuffle;
#SONG:*:10..10:1.2xmusic,dizzy,drunk;
#SONG:*:10..10:tornado,shuffle,dark;
-5
View File
@@ -1,5 +0,0 @@
#COURSE:Players Worst;
#SONG:WORST1:Medium;
#SONG:WORST2:Medium;
#SONG:WORST3:Medium;
#SONG:WORST4:Medium;
-6
View File
@@ -1,6 +0,0 @@
#COURSE:Random Caprice;
#SONG:*:ANOTHER:showcourse;
#SONG:*:ANOTHER:showcourse;
#SONG:*:ANOTHER:showcourse;
#SONG:*:ANOTHER:showcourse;
-7
View File
@@ -1,7 +0,0 @@
#COURSE:Stamina Tester Random;
#LIVES:4;
#SONG:*:9..10;
#SONG:*:9..10;
#SONG:*:9..10;
#SONG:*:9..10;
#SONG:*:9..10;
@@ -1,66 +0,0 @@
#COURSE:StepMix Survival;
#METER:Regular:13;
#GAINSECONDS:90;
#MODS:
TIME=0.008:END=30.865:MODS=3.3x,Hidden,50% HiddenOffset,50% Sudden:
TIME=30.865:END=37.722:MODS=1.1x,*1.1 Brake:
TIME=37.722:END=91.3:MODS=*1.1 2.2x:
TIME=37.722:END=56.586:MODS=*.2 20% Expand:
TIME=56.586:END=75.443:MODS=*.2 40% Expand:
TIME=75.443:END=91.3:MODS=*.2 80% Expand:
TIME=91.3:END=120.5:MODS=*3.3 3.3x,*3.3 Hidden,50% HiddenOffset,*3.3 50% Sudden,*3.3 -60% Expand;
#SONG:*:HARD:;
#GAINSECONDS:50;
#MODS:
TIME=0:END=118.5:MODS=2x:
TIME=12.986:END=35.980:MODS=Hallway,Boomerang:
TIME=35.980:END=47.477:MODS=*5 120% Wave:
TIME=47.477:END=58.974:MODS=*5 5% Flip,*5 -50% Tiny,*5 1.75x,*5 no Wave:
TIME=58.974:END=70.471:MODS=*5 10% Flip,*5 -100% Tiny,*5 1.5x:
TIME=70.471:END=81.968:MODS=*5 15% Flip,*5 -150% Tiny,*5 1.25x:
TIME=81.968:END=93.465:MODS=*5 20% Flip,*5 -200% Tiny,*5 1x:
TIME=93.465:END=96:MODS=*5 no Flip,*5 no Tiny,*5 2x:
TIME=93.465:END=104.962:MODS=*5 120% Wave:
TIME=104.962:END=118.5:MODS=*0.15 Distant, *0.15 200% Tiny,*5 no Wave;
#SONG:*:HARD:;
#GAINSECONDS:50;
#MODS:
TIME=0.420:END=103.576:MODS=2x:
TIME=0.420:END=6.325:MODS=*5 10% Beat:
TIME=6.325:END=12.23:MODS=*5 20% Beat:
TIME=12.13:END=18.135:MODS=*5 30% Beat:
TIME=18.135:END=32.899:MODS=*5 40% Beat:
TIME=32.899:END=38.804:MODS=*5 50% Beat:
TIME=38.804:END=44.709:MODS=*5 60% Beat:
TIME=44.709:END=50.614:MODS=*5 70% Beat:
TIME=50.614:END=56.519:MODS=*5 80% Beat:
TIME=56.519:END=62.425:MODS=*5 90% Beat:
TIME=62.425:END=68.330:MODS=*5 Beat:
TIME=68.330:END=74.235:MODS=*5 120% Beat:
TIME=74.235:END=80.140:MODS=*5 140% Beat:
TIME=80.140:END=86.045:MODS=*5 160% Beat:
TIME=86.045:END=91.950:MODS=*5 180% Beat:
TIME=91.950:END=97.855:MODS=*5 200% Beat:
TIME=97.855:END=103.576:MODS=*.25 no Beat:;
#SONG:*:HARD:;
#GAINSECONDS:70;
#MODS:
TIME=0:END=109.399:MODS=2.25x:
TIME=4.462:END=71.262:MODS=25% Flip,-25% Invert:
TIME=31.262:LEN=1.6:MODS=nojumps:
TIME=32.862:END=39.262:MODS=noholds:
TIME=58.862:END=71.262:MODS=noholds,nojumps:
TIME=71.262:END=82.464:MODS=*1.25 Flip:
TIME=82.464:END=109.399:MODS=25% Flip,25% Invert:
TIME=96.599:LEN=12.8:MODS=nojumps;
#SONG:*:HARD:;
#GAINSECONDS:70;
#MODS:
TIME=0:END=118.366:MODS=2.5x,Blind:
TIME=5.122:END=35.545:MODS=*5 Alternate:
TIME=35.545:END=49.066:MODS=*5 no Alternate,*5 Split:
TIME=49.066:END=76.108:MODS=*5 no Split,*5 Alternate,*5 Reverse:
TIME=76.108:END=89.629:MODS=*5 no Alternate,*5 Split,*5 Reverse:
TIME=89.629:LEN=1:MODS=*5 no Split,*5 no Reverse:
TIME=103.152:END=118.366:MODS=*.125 125% Centered,*.125 1x,*.075 Stealth,*.075 Dark:;
#SONG:*:EXPERT:;
@@ -1,5 +0,0 @@
#COURSE:Tortoise and the Hare;
#SONG:*:Medium:0.8xmusic;
#SONG:*:Medium:1.1xmusic;
#SONG:*:Medium:1.3xmusic;
#SONG:*:Medium:1.5xmusic;
-5
View File
@@ -1,5 +0,0 @@
#COURSE:Tricky Random;
#SONG:*:Medium:1.5x,reverse;
#SONG:*:Medium:expand;
#SONG:*:Medium:0.25x,dark;
#SONG:*:Medium:sudden,land;
+3 -1
View File
@@ -1 +1,3 @@
Place CRS and course banner files here.
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
+2 -2
View File
@@ -1,2 +1,2 @@
#P1#
#P2#
#P1#
#P2#
+24
View File
@@ -0,0 +1,24 @@
varying vec2 texCoords;
varying vec3 normal, viewVector;
varying vec4 lightVector, lightColor;
uniform sampler2D Texture1;
void main(void)
{
float intensity = dot(normal, lightVector.xyz);
float fresnel = pow(1.0 - dot(viewVector, normal), 5.0);
fresnel = fresnel < 0.5 ? 0.0 : 0.4;
float shade = 1.0;
if( intensity > 0.35 )
shade = clamp(1.0 * intensity + 0.4, 0.0, 1.0);
else
shade = clamp(0.85 * intensity + 0.25, 0.4, 0.6);
shade = clamp(shade - fresnel, 0.3, 1.0);
vec4 vcol = gl_FrontMaterial.diffuse;
vec4 tex = texture2D(Texture1, texCoords);
gl_FragColor = lightColor * vec4(tex.rgb * shade, 1.0);
}
+16
View File
@@ -0,0 +1,16 @@
varying vec3 normal, viewVector;
varying vec4 lightVector, lightColor;
varying vec2 texCoords;
void main(void)
{
texCoords = gl_MultiTexCoord0.st;
vec4 objectPos = gl_ModelViewMatrix * gl_Vertex;
normal = gl_NormalMatrix * gl_Normal;
lightVector = normalize(gl_LightSource[0].position);
lightColor = gl_LightSource[0].diffuse;
viewVector = normalize(vec3(0) - objectPos.xyz);
gl_Position = ftransform();
}
+65 -65
View File
@@ -1,65 +1,65 @@
uniform sampler2D Texture1;
uniform sampler2D Texture2;
vec4 ApplyBurn( vec4 over, vec4 under, float fill )
{
vec3 NeutralColor = vec3(1,1,1);
over.rgb = mix( NeutralColor, over.rgb, fill );
vec4 ret;
ret.rgb = (over.rgb + under.rgb - 1.0);
ret.rgb /= max(over.rgb, 0.000001);
ret.rgb *= over.a*under.a;
ret = clamp( ret, 0.0, 1.0 );
ret.a = over.a * under.a;
return ret;
}
void main(void)
{
vec4 under = texture2DProj( Texture1, gl_TexCoord[0] );
vec4 over = texture2DProj( Texture2, gl_TexCoord[0] );
vec4 ret = ApplyBurn( over, under, gl_Color.a );
ret.rgb += (1.0 - over.a) * under.rgb * under.a;
ret.a += (1.0 - over.a) * under.a;
over.a *= gl_Color.a;
ret.rgb += (1.0 - under.a) * over.rgb * over.a;
ret.a += (1.0 - under.a) * over.a;
ret.rgb /= ret.a;
gl_FragColor = ret;
return;
}
/*
* Copyright (c) 2007 Glenn Maynard
* 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.
*/
uniform sampler2D Texture1;
uniform sampler2D Texture2;
vec4 ApplyBurn( vec4 over, vec4 under, float fill )
{
vec3 NeutralColor = vec3(1,1,1);
over.rgb = mix( NeutralColor, over.rgb, fill );
vec4 ret;
ret.rgb = (over.rgb + under.rgb - 1.0);
ret.rgb /= max(over.rgb, 0.000001);
ret.rgb *= over.a*under.a;
ret = clamp( ret, 0.0, 1.0 );
ret.a = over.a * under.a;
return ret;
}
void main(void)
{
vec4 under = texture2DProj( Texture1, gl_TexCoord[0] );
vec4 over = texture2DProj( Texture2, gl_TexCoord[0] );
vec4 ret = ApplyBurn( over, under, gl_Color.a );
ret.rgb += (1.0 - over.a) * under.rgb * under.a;
ret.a += (1.0 - over.a) * under.a;
over.a *= gl_Color.a;
ret.rgb += (1.0 - under.a) * over.rgb * over.a;
ret.a += (1.0 - under.a) * over.a;
ret.rgb /= ret.a;
gl_FragColor = ret;
return;
}
/*
* Copyright (c) 2007 Glenn Maynard
* 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.
*/
+66 -66
View File
@@ -1,66 +1,66 @@
uniform sampler2D Texture1;
uniform sampler2D Texture2;
vec4 ApplyDodge( vec4 over, vec4 under, float fill )
{
vec3 NeutralColor = vec3(0,0,0);
over.rgb = mix( NeutralColor, over.rgb, fill );
vec4 ret;
ret.rgb = under.rgb;
ret.rgb /= max(1.0-over.rgb, 0.000001);
ret.rgb = min(ret.rgb, 1.0);
ret.rgb *= over.a*under.a;
// ret = clamp( ret, 0.0, 1.0 );
ret.a = over.a * under.a;
return ret;
}
void main(void)
{
vec4 under = texture2DProj( Texture1, gl_TexCoord[0] );
vec4 over = texture2DProj( Texture2, gl_TexCoord[0] );
vec4 ret = ApplyDodge( over, under, gl_Color.a );
ret.rgb += (1.0 - over.a) * under.rgb * under.a;
ret.a += (1.0 - over.a) * under.a;
over.a *= gl_Color.a;
ret.rgb += (1.0 - under.a) * over.rgb * over.a;
ret.a += (1.0 - under.a) * over.a;
ret.rgb /= ret.a;
gl_FragColor = ret;
return;
}
/*
* Copyright (c) 2007 Glenn Maynard
* 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.
*/
uniform sampler2D Texture1;
uniform sampler2D Texture2;
vec4 ApplyDodge( vec4 over, vec4 under, float fill )
{
vec3 NeutralColor = vec3(0,0,0);
over.rgb = mix( NeutralColor, over.rgb, fill );
vec4 ret;
ret.rgb = under.rgb;
ret.rgb /= max(1.0-over.rgb, 0.000001);
ret.rgb = min(ret.rgb, 1.0);
ret.rgb *= over.a*under.a;
// ret = clamp( ret, 0.0, 1.0 );
ret.a = over.a * under.a;
return ret;
}
void main(void)
{
vec4 under = texture2DProj( Texture1, gl_TexCoord[0] );
vec4 over = texture2DProj( Texture2, gl_TexCoord[0] );
vec4 ret = ApplyDodge( over, under, gl_Color.a );
ret.rgb += (1.0 - over.a) * under.rgb * under.a;
ret.a += (1.0 - over.a) * under.a;
over.a *= gl_Color.a;
ret.rgb += (1.0 - under.a) * over.rgb * over.a;
ret.a += (1.0 - under.a) * over.a;
ret.rgb /= ret.a;
gl_FragColor = ret;
return;
}
/*
* Copyright (c) 2007 Glenn Maynard
* 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.
*/
+92 -92
View File
@@ -1,92 +1,92 @@
uniform sampler2D Texture1;
uniform sampler2D Texture2;
vec4 ApplyVividLight( vec4 over, vec4 under, float fill )
{
vec3 NeutralColor = vec3(.5,.5,.5);
over.rgb = mix( NeutralColor, over.rgb, fill );
over.rgb -= 0.5;
over.rgb *= 2.0;
vec4 ret;
ret.rgb = under.rgb;
ret.rgb += min(over.rgb, 0.0);
ret.rgb /= max(1.0-abs(over.rgb), 0.000001);
ret.rgb *= under.a;
ret = clamp( ret, 0.0, 1.0 );
ret.rgb *= over.a;
ret.a = over.a * under.a;
return ret;
}
vec4 ApplyHardMix( vec4 over, vec4 under, float fill )
{
vec4 ret = ApplyVividLight( over, under, gl_Color.a );
/* ret is premultiplied. Undo this, so we have a
* 0..1 range for color. */
ret.rgb /= ret.a;
fill *= fill;
/* Posterize, with a threshold based on fill. This is a rough
* approximation. */
float low = 0.5-(1.0-fill)*0.5;
float high = 0.5+(1.0-fill)*0.5+0.00001;
ret.rgb = (ret.rgb - low) / (high - low);
ret = clamp( ret, 0.0, 1.0 );
/* Premultiply it, for the rest of the calculation. */
ret.rgb *= ret.a;
return ret;
}
void main(void)
{
vec4 under = texture2DProj( Texture1, gl_TexCoord[0] );
vec4 over = texture2DProj( Texture2, gl_TexCoord[0] );
vec4 ret = ApplyHardMix( over, under, gl_Color.a );
ret.rgb += (1.0 - over.a) * under.rgb * under.a;
ret.a += (1.0 - over.a) * under.a;
over.a *= gl_Color.a;
ret.rgb += (1.0 - under.a) * over.rgb * over.a;
ret.a += (1.0 - under.a) * over.a;
ret.rgb /= ret.a;
gl_FragColor = ret;
return;
}
/*
* Copyright (c) 2007 Glenn Maynard
* 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.
*/
uniform sampler2D Texture1;
uniform sampler2D Texture2;
vec4 ApplyVividLight( vec4 over, vec4 under, float fill )
{
vec3 NeutralColor = vec3(.5,.5,.5);
over.rgb = mix( NeutralColor, over.rgb, fill );
over.rgb -= 0.5;
over.rgb *= 2.0;
vec4 ret;
ret.rgb = under.rgb;
ret.rgb += min(over.rgb, 0.0);
ret.rgb /= max(1.0-abs(over.rgb), 0.000001);
ret.rgb *= under.a;
ret = clamp( ret, 0.0, 1.0 );
ret.rgb *= over.a;
ret.a = over.a * under.a;
return ret;
}
vec4 ApplyHardMix( vec4 over, vec4 under, float fill )
{
vec4 ret = ApplyVividLight( over, under, gl_Color.a );
/* ret is premultiplied. Undo this, so we have a
* 0..1 range for color. */
ret.rgb /= ret.a;
fill *= fill;
/* Posterize, with a threshold based on fill. This is a rough
* approximation. */
float low = 0.5-(1.0-fill)*0.5;
float high = 0.5+(1.0-fill)*0.5+0.00001;
ret.rgb = (ret.rgb - low) / (high - low);
ret = clamp( ret, 0.0, 1.0 );
/* Premultiply it, for the rest of the calculation. */
ret.rgb *= ret.a;
return ret;
}
void main(void)
{
vec4 under = texture2DProj( Texture1, gl_TexCoord[0] );
vec4 over = texture2DProj( Texture2, gl_TexCoord[0] );
vec4 ret = ApplyHardMix( over, under, gl_Color.a );
ret.rgb += (1.0 - over.a) * under.rgb * under.a;
ret.a += (1.0 - over.a) * under.a;
over.a *= gl_Color.a;
ret.rgb += (1.0 - under.a) * over.rgb * over.a;
ret.a += (1.0 - under.a) * over.a;
ret.rgb /= ret.a;
gl_FragColor = ret;
return;
}
/*
* Copyright (c) 2007 Glenn Maynard
* 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.
*/
+67
View File
@@ -0,0 +1,67 @@
uniform sampler2D Texture1;
uniform sampler2D Texture2;
vec4 ApplyOverlay( vec4 over, vec4 under, float fill )
{
// we want to compare against black for the alpha pass, I think...
vec3 NeutralColor = vec3(0.5,0.5,0.5);
over.rgb = mix( NeutralColor, over.rgb, fill );
vec4 ret;
ret.rgb = under.rgb * over.rgb * 2.0;
ret.rgb = min(ret.rgb, 1.0);
ret.rgb *= over.a * under.a;
ret.a = over.a * under.a;
return ret;
}
void main(void)
{
// creates two vec4s that represent the two textures.
vec4 under = texture2DProj( Texture1, gl_TexCoord[0] );
vec4 over = texture2DProj( Texture2, gl_TexCoord[0] );
// the return value is also a vec4.
vec4 ret = ApplyOverlay( over, under, gl_Color.a );
// glenn does some math here that I don't understand just yet.
ret.rgb += (1.0 - over.a) * under.rgb * under.a;
ret.a += (1.0 - over.a) * under.a;
over.a *= gl_Color.a;
ret.rgb += (1.0 - under.a) * over.rgb * over.a;
ret.a += (1.0 - under.a) * over.a;
// this is unpremultiply though:
ret.rgb /= ret.a;
gl_FragColor = ret;
return;
}
/*
* Copyright (c) 2009 AJ Kelly
* 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.
*/
+66
View File
@@ -0,0 +1,66 @@
uniform sampler2D Texture1;
uniform sampler2D Texture2;
vec4 ApplyScreen( vec4 over, vec4 under, float fill )
{
vec3 NeutralColor = vec3(0.5,0.5,0.5);
over.rgb = mix( NeutralColor, over.rgb, fill );
vec4 ret;
ret.rgb = (1.0 - ((1.0 - under.rgb) * (1.0 - over.rgb)));
ret.rgb = min(ret.rgb, 1.0);
ret.rgb *= over.a * under.a;
ret.a = over.a * under.a;
return ret;
}
void main(void)
{
// creates two vec4s that represent the two textures.
vec4 under = texture2DProj( Texture1, gl_TexCoord[0] );
vec4 over = texture2DProj( Texture2, gl_TexCoord[0] );
// the return value is also a vec4.
vec4 ret = ApplyScreen( over, under, gl_Color.a );
// glenn does some math here that I haven't put the time in to understand yet.
ret.rgb += (1.0 - over.a) * under.rgb * under.a;
ret.a += (1.0 - over.a) * under.a;
over.a *= gl_Color.a;
ret.rgb += (1.0 - under.a) * over.rgb * over.a;
ret.a += (1.0 - under.a) * over.a;
// this is unpremultiply though:
ret.rgb /= ret.a;
gl_FragColor = ret;
return;
}
/*
* Copyright (c) 2009 AJ Kelly
* 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.
*/
+11 -11
View File
@@ -1,11 +1,11 @@
attribute vec4 TextureMatrixScale;
void main(void)
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
vec4 multiplied_tex_coord = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_TexCoord[0] = (multiplied_tex_coord * TextureMatrixScale) +
(gl_MultiTexCoord0 * (vec4(1)-TextureMatrixScale));
gl_FrontColor = gl_Color;
}
attribute vec4 TextureMatrixScale;
void main(void)
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
vec4 multiplied_tex_coord = gl_TextureMatrix[0] * gl_MultiTexCoord0;
gl_TexCoord[0] = (multiplied_tex_coord * TextureMatrixScale) +
(gl_MultiTexCoord0 * (vec4(1)-TextureMatrixScale));
gl_FrontColor = gl_Color;
}
+37 -37
View File
@@ -1,37 +1,37 @@
uniform sampler2D Texture1;
void main(void)
{
vec4 ret = texture2DProj( Texture1, gl_TexCoord[0] );
if( ret.a != 0.0 )
ret.rgb /= ret.a;
gl_FragColor = ret;
return;
}
/*
* Copyright (c) 2007 Glenn Maynard
* 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.
*/
uniform sampler2D Texture1;
void main(void)
{
vec4 ret = texture2DProj( Texture1, gl_TexCoord[0] );
if( ret.a != 0.0 )
ret.rgb /= ret.a;
gl_FragColor = ret;
return;
}
/*
* Copyright (c) 2007 Glenn Maynard
* 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.
*/
+69 -69
View File
@@ -1,69 +1,69 @@
uniform sampler2D Texture1;
uniform sampler2D Texture2;
vec4 ApplyVividLight( vec4 over, vec4 under, float fill )
{
vec3 NeutralColor = vec3(.5,.5,.5);
over.rgb = mix( NeutralColor, over.rgb, fill );
over.rgb -= 0.5;
over.rgb *= 2.0;
vec4 ret;
ret.rgb = under.rgb;
ret.rgb += min(over.rgb, 0.0);
ret.rgb /= max(1.0-abs(over.rgb), 0.000001);
ret.rgb *= under.a;
ret = clamp( ret, 0.0, 1.0 );
ret.rgb *= over.a;
ret.a = over.a * under.a;
return ret;
}
void main(void)
{
vec4 under = texture2DProj( Texture1, gl_TexCoord[0] );
vec4 over = texture2DProj( Texture2, gl_TexCoord[0] );
vec4 ret = ApplyVividLight( over, under, gl_Color.a );
ret.rgb += (1.0 - over.a) * under.rgb * under.a;
ret.a += (1.0 - over.a) * under.a;
over.a *= gl_Color.a;
ret.rgb += (1.0 - under.a) * over.rgb * over.a;
ret.a += (1.0 - under.a) * over.a;
ret.rgb /= ret.a;
gl_FragColor = ret;
return;
}
/*
* Copyright (c) 2007 Glenn Maynard
* 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.
*/
uniform sampler2D Texture1;
uniform sampler2D Texture2;
vec4 ApplyVividLight( vec4 over, vec4 under, float fill )
{
vec3 NeutralColor = vec3(.5,.5,.5);
over.rgb = mix( NeutralColor, over.rgb, fill );
over.rgb -= 0.5;
over.rgb *= 2.0;
vec4 ret;
ret.rgb = under.rgb;
ret.rgb += min(over.rgb, 0.0);
ret.rgb /= max(1.0-abs(over.rgb), 0.000001);
ret.rgb *= under.a;
ret = clamp( ret, 0.0, 1.0 );
ret.rgb *= over.a;
ret.a = over.a * under.a;
return ret;
}
void main(void)
{
vec4 under = texture2DProj( Texture1, gl_TexCoord[0] );
vec4 over = texture2DProj( Texture2, gl_TexCoord[0] );
vec4 ret = ApplyVividLight( over, under, gl_Color.a );
ret.rgb += (1.0 - over.a) * under.rgb * under.a;
ret.a += (1.0 - over.a) * under.a;
over.a *= gl_Color.a;
ret.rgb += (1.0 - under.a) * over.rgb * over.a;
ret.a += (1.0 - under.a) * over.a;
ret.rgb /= ret.a;
gl_FragColor = ret;
return;
}
/*
* Copyright (c) 2007 Glenn Maynard
* 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.
*/
+94 -94
View File
@@ -1,94 +1,94 @@
uniform sampler2D Texture1;
uniform sampler2D Texture2;
uniform int TextureWidth;
/*
* Convert from YUYV422 to RGB.
*
* This is used by MovieTexture_Generic. The input texture is TextureWidth
* texels wide, the output texture is TextureWidth*2 texels wide, and texels
* are aligned. We can use this to determine if the fragment we're generating
* is even or odd.
*/
void main(void)
{
vec4 tex = gl_TexCoord[0];
float fRealWidth = float(TextureWidth);
float fU = tex.x;
/* Scale U to [0.25,fRealWidth+0.25]. */
fU *= fRealWidth;
/* Scale the U texture coordinate to the size of the destination texture,
* [0.5,fDestWidth+0.5]. */
fU *= 2.0;
/* Texture coordinates are center-aligned; an exact sample lies at 0.5,
* not 0. Shift U from [0.5,fDestWidth+0.5] to [0,fDestWidth]. */
fU -= 0.5;
/* If this is an odd fragment, fOdd is 1. */
float fOdd = mod(fU+0.0001, 2.0);
/* Align fU to an even coordinate. */
fU -= fOdd;
/* Scale U back. Because fU is aligned to an even coordinate, this
* will always be an exact sample. */
fU += 0.5;
fU /= 2.0;
fU /= fRealWidth;
tex.x = fU;
vec4 yuyv = texture2D( Texture1, tex.xy );
vec3 yuv;
if( fOdd <= 0.5 )
yuv = yuyv.rga;
else
yuv = yuyv.bga;
yuv -= vec3(16.0/255.0, 128.0/255.0, 128.0/255.0);
mat3 conv = mat3(
// Y U (Cb) V (Cr)
1.1643, 0.000, 1.5958, // R
1.1643, -0.39173, -0.81290, // G
1.1643, 2.017, 0.000); // B
gl_FragColor.r=dot(yuv,conv[0]);
gl_FragColor.g=dot(yuv,conv[1]);
gl_FragColor.b=dot(yuv,conv[2]);
gl_FragColor.a = 1.0;
/* Why doesn't this work? */
// gl_FragColor.rgb = yuv * conv;
// gl_FragColor.a = 1.0;
}
/*
* Copyright (c) 2007 Glenn Maynard
* 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.
*/
uniform sampler2D Texture1;
uniform sampler2D Texture2;
uniform int TextureWidth;
/*
* Convert from YUYV422 to RGB.
*
* This is used by MovieTexture_Generic. The input texture is TextureWidth
* texels wide, the output texture is TextureWidth*2 texels wide, and texels
* are aligned. We can use this to determine if the fragment we're generating
* is even or odd.
*/
void main(void)
{
vec4 tex = gl_TexCoord[0];
float fRealWidth = float(TextureWidth);
float fU = tex.x;
/* Scale U to [0.25,fRealWidth+0.25]. */
fU *= fRealWidth;
/* Scale the U texture coordinate to the size of the destination texture,
* [0.5,fDestWidth+0.5]. */
fU *= 2.0;
/* Texture coordinates are center-aligned; an exact sample lies at 0.5,
* not 0. Shift U from [0.5,fDestWidth+0.5] to [0,fDestWidth]. */
fU -= 0.5;
/* If this is an odd fragment, fOdd is 1. */
float fOdd = mod(fU+0.0001, 2.0);
/* Align fU to an even coordinate. */
fU -= fOdd;
/* Scale U back. Because fU is aligned to an even coordinate, this
* will always be an exact sample. */
fU += 0.5;
fU /= 2.0;
fU /= fRealWidth;
tex.x = fU;
vec4 yuyv = texture2D( Texture1, tex.xy );
vec3 yuv;
if( fOdd <= 0.5 )
yuv = yuyv.rga;
else
yuv = yuyv.bga;
yuv -= vec3(16.0/255.0, 128.0/255.0, 128.0/255.0);
mat3 conv = mat3(
// Y U (Cb) V (Cr)
1.1643, 0.000, 1.5958, // R
1.1643, -0.39173, -0.81290, // G
1.1643, 2.017, 0.000); // B
gl_FragColor.r=dot(yuv,conv[0]);
gl_FragColor.g=dot(yuv,conv[1]);
gl_FragColor.b=dot(yuv,conv[2]);
gl_FragColor.a = 1.0;
/* Why doesn't this work? */
// gl_FragColor.rgb = yuv * conv;
// gl_FragColor.a = 1.0;
}
/*
* Copyright (c) 2007 Glenn Maynard
* 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.
*/
+439 -421
View File
@@ -1,421 +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.
#
# 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="革命" />
<!-- 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" />
<!-- Fix up hacked titles: -->
<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="くにたけみゆき" />
<!-- TM: -->
<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="今堀恒雄" />
<!-- TM2: -->
<!-- http://www.web-konami.com/products/ps2/castlevania/ -->
<Translation ArtistFrom="(Michuri Yamane)|(Yamane Michuri)" ArtistTransTo="Michiru Yamane" ArtistTo="山根ミチル" />
<!-- TM3: -->
<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="守永初美" />
<!-- TM4: -->
<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="자우림" />
<!-- TM4+: -->
<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="さくら" />
<!-- TM5: -->
<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: -->
<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="ゾベッカ" />
<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. ☺" />
<!-- 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}" />
</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>
BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 20 KiB

-90
View File
@@ -1,90 +0,0 @@
[this is an alternate, separate system from "ConditionalBGA"]
Conditionals allow enabling BGAs or portions of BGAs based on a boolean
expression.
* Quick start
To only show a BGA on Wednesday:
[BGAnimation]
Condition=Weekday() == 3
[Layer1]
File=star
Command=x,100;y,200
...
To only between 10pm and 3am, use this Condition= line:
Condition=Hour() > 22 or Hour() < 3
Only if there are at least 2 stages left:
Condition=NumStagesLeft() >= 2
Don't show in demo or jukebox mode:
Condition=not IsDemonstration()
Only show if the current song is "Happy Birthday":
Condition=CurSong() == Song("Happy Birthday")
Only display the layer on even days:
math.mod(DayOfMonth(), 2) == 0
Only display the layer on odd days:
math.mod(DayOfMonth(), 2) == 0
Only display on April Fools:
Condition=MonthOfYear() == 4 and DayOfMonth() == 1
Only display on the final stage:
Condition=IsFinalStage()
Only if the "reverse" modifier is in use by player 1:
Condition=UsingModifier(1, "reverse")
Only if the "reverse" modifier is in use by player 1 or 2:
Condition=UsingModifier(1, "reverse") or UsingModifier(2, "reverse")
Only if either player got an AAA or better:
GetBestGrade() <= Grade("AAA")
* Advanced use
This can be applied to a single layer of a BGAnimation, by putting
the conditional in the appropriate [Layer] section.
[Layer1]
File=stage1
Condition=StageIndex() == 0
[Layer2]
File=stage2
Condition=StageIndex() == 1
[Layer3]
File=extra_stage
Condition=IsExtraStage()
* Complete function list:
MonthOfYear() month of year (1..12)
DayOfMonth() day of the month (1..31)
Hour() hours past midnight (0..23)
Minute() minutes after the hour (0..59)
Second() seconds after the minute (0..59)
Year() year (eg. 2004)
Weekday() days since Sunday (0..6)
DayOfYear() the number of days since January 1 (0..365)
StageStats info:
GetBestGrade() best grade of any active player (AAAA is 0, AAA is 1, etc)
GetWorstGrade() worst grade of any active player
OnePassed() returns true if either player passed
FullCombo(pn) returns true if player "pn" (0 or 1) got a full combo
MaxCombo(pn) returns the given player's max combo
GetGrade(pn) returns the given player's grade
Grade(grade) returns the grade number for a given string
OneGotGrade(pn,n)
-79
View File
@@ -1,79 +0,0 @@
*** EXPLANATION ***
BMA is merely a container. It is very expandable, though the
file table could definately use a facelift. Have fun.
Anything not specified in the file is considered null, and can
be used for any purpose (considering those area are not read,
so custom tags could be added after the main header but before
the file table.)
*** SOURCE HEADERS AND DEFINITIONS ***
Make sure you use these typedefs:
TypeDef Unsigned Char Int8;
TypeDef Signed Short Int16;
TypeDef Signed Int Int32;
And constants:
Const BlockSize = 4096;
And these libraries:
ZLib
*** HEADER ***
(hex)
Location Type Desc
---------------------------------------------------------------
00 String(6) "BAMarc"
06 Int16 0xFFFF, identifier
08 Int16 Version #, always 1 for now
0A Int16 Entry count
0C Int8 Entry Table Block
0D Int8 First File Block
0E Int16 Reserved
10 Int8 Creator's name length
11 String(31) Creator's name
30 Int8 Description length
31 String(63) Description
*** FILE TABLE ***
(at file offset: EntryTableBlock*BlockSize)
(hex)
Location Type Desc
---------------------------------------------------------------
00 Int32 File length, in bytes
04 Int16 File offset, in blocks
06 Int8 Filename length
07 Int8 File flags:
& 0x01 = unused
& 0x02 = unused
& 0x04 = unused
& 0x08 = unused
& 0x10 = unused
& 0x20 = ZLib compressed
& 0x40 = unused
& 0x80 = unused
08 String(24) Filename
*** FILE ***
The file's true offset is at (FileOffsetBlock*BlockSize) in the
file. If a file is ZLIB compressed, there will be an extra
string at the end of the chunk, in ASCII, that contains the
uncompressed file size in bytes.
OGG audio is not compressed in these files because they can be
loaded directly into memory and played by a sound library.
-=- Created by SaxxonPike, 2004-2005 -=-
+839
View File
@@ -0,0 +1,839 @@
sm-ssc Changelog
________________________________________________________________________________
The sm-ssc changelog mainly deals with source code-related changes, as theme
changes happen at a rapid pace.
Changes are grouped by date.
Not all changes are documented, for various reasons.
(Some changes were later reverted, other changes relate to things that aren't
supported but exist anyways.)
_____________________________________________________________________________
sm-ssc Private Beta Wave 1.4 | 20100125
---------------------------------------
20100125
--------
* Catching up with StepMania 4 SVN. All code by Glenn Maynard.
* r28254 (GameConstantsAndTypes.h GameManager.cpp): routine style for pump
* r28255 Steps.cpp: fix routine special case so it works in all styles
* r28256 ScoreKeeper.cpp: support ScoreKeeperShared in
ScoreKeeper::MakeScoreKeeper
* r28257 ScreenGameplayShared.cpp: update old ScreenGameplayShared code
to mostly use PlayerInfo::Load; fixes some stuff but still not right
20100124
--------
* [Player] new ScoreMissedHoldsAndRolls metric (FSX)
* [Song] add GetFirstBeat and GetLastBeat Lua bindings
* Make RandomBackgroundMode use BGMODE_RANDOMMOVIES by default
20100122
--------
* Add support for Pump It Up delays with #DELAYS tag in .sm files & treating all
stops in .KSF files as delays.
* Use RollingNumbers methods in ScreenNetEvaluation now that ScreenEvaluation
uses them, as opposed to settext (which caused a few visual issues).
* [ScreenEvaluation] add SongOptions as a metric-able item.
20100119
--------
* Make FGAnimations (#FGCHANGES:) work again. (hopefully; it semeed to work
using a test file.)
20100118
--------
mostly [ScreenNetSelectBase] related changes:
* remove some now-unused metrics (namely ChatInputBoxWidth/Height and
ChatOutputBoxWidth/Height).
* Rename "Meter" to "StepsDisplay"
* RoomWheel now uses a MusicWheel-like setup for items (NormalPart/ColorPart)
instead of a single bar graphic.
20100117
--------
* [ScreenNetSelectBase] Sprite -> AutoActor for chat boxes, un-hardcode some
commands on items to allow for better theming.
* Disable Control+Letter "sort by title" shortcut in course mode.
20100116
--------
* Pump-Doubles has better (more accurate?) spacing between the two sides
* Enable saving replays. The replay data format will likely change over time,
and there is currently no mechanism to replay the data back as another player.
20100114
--------
* add GAMESTATE:GetHardestStepsDifficulty() Lua binding
* Don't complain about #SELECTABLE:Roulette; even though it's not implemented
for some reason.
20100112
--------
* Added more milestones (25, 50, 250)
* {issue 73} If the wheel is locked, don't accept Ctrl+Letter to sort
* [NotesLoaderKSF] implement DirectMove |E| type (DelayBeat)
20100111
--------
* [CourseLoaderCRS.cpp] add GRADEBEST and GRADEWORST to possible values.
20100107
--------
* [GameConstantsAndTypes.h] bump MAX_METER from 13 to 20.
* [MemoryCardManager] add GetName(pn) Lua binding. Returns the name of the device.
sm-ssc Private Beta Wave 1.3 | 20100106
---------------------------------------
20100105
--------
* [LifeMeterBattery] Instead of using various hardcoded values, make them metrics.
BatteryBlinkTime (float), BatteryP*X/Y and NumLivesP*X/Y metrics added.
* [GameSoundManager] use the sound's fade in and out times instead of the
hardcoded fade in (1.5sec) and out (0.3sec) times.
20100101
--------
* [GrooveRadar] run commands on RadarValueMapP* so we can color it again
* [Song.cpp] Make AutoGen on Pump a bit more bearable by only AutoGenerating
Medium difficulty for HalfDoubles steps.
20091229
--------
* [GameState] new Lua bindings: JoinPlayer(pn), UnjoinPlayer(pn), and
GetSongPercent(fBeat)
20091227
--------
* [ScreenSelectMusic] Allow un-selecting the song if two part selection is
enabled (press back). Only works if all human players have not chosen steps
yet. (If a player has chosen steps and the other wants to change the song,
the other player has to cancel his step selection.)
* [NoteSkinManager] New Lua binding NOTESKIN:DoesNoteSkinExist(sName) for
finding if the specified noteskin exists in the current gametype.
20091226
--------
* New Lua binding: NOTESKIN:GetNoteSkinNames(), which returns a table of all
noteskins for the current gametype.
20091225
--------
* New Lua bindings for Profile: GetTotalSessions(), GetTotalSessionSeconds(),
GetTotalGameplaySeconds()
20091221
--------
* Support "converge" as an alias for "centered" since some courses use it.
20091220
--------
* [EditMenu] new metric TextBannerType
* Fixed issue 38 (Servers line in ScreenNetworkOptions)
20091219
--------
* Make it possible to change the alpha of the center of the groove radar [shakesoda]
* [ScreenSelectMusic] make profile load with late join on. [AJ]
* Fix OS hotkey issues by invalidating input on ScreenEdit while meta keys
(cmd or winkey) are being held. [shakesoda]
sm-ssc Private Beta Wave 1.2 | 20091219
---------------------------------------
Theme-related additions/bugfixes aren't listed here, usually.
20091218
--------
* Fix bug in GAMESTATE:GetCurrentSteps(pn) where it didn't bother trying to
return the player's actual steps before trying to do:
(1) SongUtil::GetOneSteps( p->m_pCurSong.Get(), GAMESTATE->GetCurrentStyle()->m_StepsType, GAMESTATE->m_PreferredDifficulty[pn] );
(2) SongUtil::GetOneSteps( p->m_pCurSong.Get(), GAMESTATE->GetCurrentStyle()->m_StepsType, GAMESTATE->GetClosestShownDifficulty(pn) );
And with AutoSetStyle on, how the hell is it going to know the style with
those two SongUtil things in the way? By moving the player's steps to the
top, that fixes the problem. -aj
20091217
--------
* Make DeviceList on ScreenTestInput metricable
(commands only, X and Y are elusive for some reason.)
20091215
--------
* Fix option underlines diffusing color when they should just be diffusing alpha.
* [ScreenOptions] new Lua binding: AllAreOnLastRow()
* [ScreenSelectMaster] add DoSwitchAnyways [shakesoda]
20091214
--------
* new Course Lua bindings: IsNonstop(), IsOni(), HasBanner()
20091213
--------
* Support Pump it Up Exceed PS2 USB mat [galopin]
(see stepmania-devs mailing list 20091213 11:27 -0800 [Pacific Standard Time])
20091212
--------
* (smpackage) sm4svn r28243: "fix for FlushDirCache" [Chris Danford]
* Fix Beginner Helper rest location [sy567]
(see http://www.stepmania.com/forums/showpost.php?p=158721&postcount=12)
20091211
--------
Cel shader update [shakesoda]
20091209
--------
[StepsDisplay] StepsType is an AutoActor now (was Sprite)
================================================================================
sm-ssc Private Beta Wave 1.1 | 20091208
--------------------------------------------------------------------------------
Theme-related bugfixes aren't listed here, usually.
See the sm-ssc bugtracker at http://ssc.ajworld.net/sm-ssc/bugtracker/ for more
information on bugs, feature requests, and the status of both.
In addition to the bugfixes, the following changes have been made:
20091208
--------
Refresh the metrics when changing the gametype. Fixes an issue where changing
the gametype causes the DifficultyList/StepsDisplayList to not show anything.
20091207
--------
* [Character.cpp] fix GetModelPath() Lua binding.
* [Sprite.cpp] add GetState() and GetNumStates() Lua bindings.
20091206
--------
Implement a patch to support modern versions of ffmpeg.
(See http://www.stepmania.com/forums/showthread.php?t=21434 for more info.)
Petr Baudis (3):
video.m4: Add libswscale checks.
MovieTexture_FFMpeg: Port img_convert to libswscale method.
MovieTexture_Theora: Port img_convert to libswscale method.
David Santamaría Rogado (howl) (12):
video.m4: Simplify FFMpeg checks.
ArchHooks_Unix: Correct ffmpeg include.
MovieTexture_FFMpeg: Add and correct ffmpeg necessary includes.
MovieTexture_FFMpeg: Replace avcodec_build() with avcodec_version(), avcodec_build() now doesn't exists and avcodec_version() has always return the same value of avcodec_build().
MovieTexture_FFMpeg: Replace avcodec::offset_t type with int64_t type to complain the new FFMpeg API .
MovieTexture_FFMpeg: Corrected seek component of RageProtocol to complain the new FFMpeg, if not videos with malformed headers fails to play.
MovieTexture_FFMpeg: Fix compilation warning of RageProtocol.
MovieTexture_FFMpeg: Add destruction conditions for swscale context to avoid possible crashes.
MovieTexture_FFMpeg: Add initialization conditions for swscale context to avoid possible unused memory if there is no garbage collector and improve performance.
MovieTexture_Theora: Add and correct ffmpeg necessary includes.
MovieTexture_Theora: Add destruction conditions for swscale context to avoid possible crashes.
MovieTexture_Theora: Add initialization conditions for swscale context to avoid possible unused memory if there is no garbage collector and improve performance.
20091205
--------
* [Player.cpp/.h] new metric: ComboUnderField. It should be true by default if
you want to match how StepMania 4 does it. [AJ]
20091204
--------
* Fix a sm-ssc bug where you couldn't change course difficulties.
20091203
--------
* Two new GameCommands:
* fademusic,fVolume,fDuration (though I wish fDuration was how long to fade the
music for; instead the fade lengths are consts in GameSoundManager.)
* pushscreen,sScreenName (though it doesn't push screens like I had thought it
would. maybe I'm doing it wrong.) [AJ]
20091202
--------
* Profile name max length changed from 12 to 32 characters. [AJ]
* Modified character camera values. [shakesoda]
20091201
--------
* [ScreenSelectMusic] new metric SamplePreviewMusicMode, which has one of two
possible values as of r127. 'SamplePreviewMusicMode_Normal' is business as
usual (sample music plays), while 'SampleMusicPreviewMode_ScreenMusic'
disables song samples, using /{theme}/Sounds/ScreenSelectMusic loop music.*
as the file to play. No, this doesn't support Lua music yet. [AJ]
================================================================================
sm-ssc Private Beta Wave 1 | 20091201
--------------------------------------------------------------------------------
The list below comprises sm-ssc Private Beta Wave 1's changes. Some of the
changes are from baseline StepMania 4 SVN, in order to keep compatibility.
20091130
--------
* [StepMania.cpp] (any)Shift+F2 = reload metrics only.
F2 = reload metrics and textures.
* [Course.cpp] GetPlayMode() and GetCourseType() return actual enums now,
instead of numbers.
* Add improved cel shading for people with GLSL support. [shakesoda]
20091129
--------
* [TimingData] add GetActualBPM() Lua binding that returns a table holding the
min and max BPMs, in that order.
20091127
--------
* Disable color keying banners (it's 2009, I don't think anyone is using the
old rotated banners anymore. -aj) [shakesoda]
* Add OptionsListTimeout metric. [shakesoda]
20091126 (SSC turkey day)
-------------------------
* [Song] new Lua bindings: NormallyDisplayed(), GetStepsSeconds()
* Themes will load Lua scripts from subdirectories first now.
20091122
--------
* [ArchHooks_Unix] Follow user's system language as default.
[David Santamaría Rogado (howl)]
See http://www.stepmania.com/forums/showthread.php?t=21471 for more info.
20091120
--------
* Fixed a crash with lifemultipliers > 1.0 in debug builds
20091117
--------
* F2 reloads metrics again, just like in StepMania 3.9. (This is probably one
of those changes that won't get backported to baseline StepMania...)
* [ScoreKeeperNormal] version 0.5 of ToastyTriggersAt added; only allows for
one value, unlike 3.9+ (which used a String with multiple values). The final
version will use a Lua table, similar to [MusicWheel] SortOrders.
20091116
--------
* [Character] new Lua bindings: GetModelPath(), GetRestAnimationPath(),
GetWarmUpAnimationPath(), GetDanceAnimationPath()
* [CharacterManager] GetRandomCharacter() Lua binding added
* [RageFileManager] GetDirListing(sPath,bOnlyDirs,bPathToo) Lua binding added
* [CharacterManager] GetAllCharacters() Lua binding added.
20091115
--------
* Prevent focus lost at Fullscreen on X11, fix windowed->fullscreen resolution
changes so that they save [David Santamaría Rogado (howl)]
(http://www.stepmania.com/forums/showthread.php?t=21430)
20091114
--------
* Add support for .oga and .ogv files. [David Santamaría Rogado (howl)]
(http://pastie.org/698741)
20091113
--------
* sm4svn r28233 [Glenn Maynard]:
"Fix ThemeMetric<EnumType> gives the first value of the enum when the theme
metric is nil, instead of EnumType_INVALID.
This happened because ThemeMetric was setting the value to its default,
eg. EnumType(), when LuaHelpers::FromStack returned false.
This behavior doesn't make sense in the general case, since EnumType() results
in an arbitrary value (the first one) rather than Invalid. Every FromStack
function sets a reasonable default on invalid data, anyway, and only RageColor
and enums can return false in any case.
This fixes CustomDifficulty when CourseType = nil."
* Fix a crash in StepsDisplay that allows Course mode to at least run.
20091111
--------
* MusicWheelItem SetMessage has a new param, Type (string that returns the
item type).
* Add sort songs by most recently played. (not feature-complete yet.)
20091103 to 20091109
--------------------
* Changes from SM4SVN:
* r28211: [HighScore.cpp] "logic fixup" [Glenn Maynard]
* r28215: "default to showing backgrounds in editor" [Chris Danford]
* r28217: "Fix crash on reload metrics due to faulty FlushDirCache logic."
[Steve Checkoway], implemented along with code that was originally submitted
as r076 but removed. See this fix log to figure out why we'd bother. :)
* r28218: "crash handler is crashing in 2.6.31 in GetBacktrace, causing a
recursive crash handler crash that we aren't handling, leading to recursion"
[Glenn Maynard]
* r28219: "add 'DIRRO' driver for read-only access" [Glenn Maynard]
* r28220: "fix confusing comment. Escaping doesn't affect this; commas aren't
escaped, since they're split from the value itself, long after MsdFile is
loaded." [Glenn Maynard] (We'll be keeping the 1,1,1,1 colors in sm-ssc, and
may provide a compatibility script for SM4SVN, so be on the lookout.)
* r28221: "allow overriding, like PRODUCT_ID" [Glenn Maynard]
* r28222-28223: "adding support for pms files" [GRIM657]
* The pulseaudio patch [David Santamaría Rogado (howl), OndÅ™ej HoÅ¡ek, Damien Thébault]
(see http://www.stepmania.com/forums/showthread.php?t=21348)
* Greg Nadja's OpenGL/Windows patch
* Load Splash.png instead of an .xpm [David Santamaría Rogado (howl)]
(http://www.stepmania.com/forums/showpost.php?p=157340&postcount=3)
* sm-ssc Changes:
* [ScreenSelectMusic.cpp] Add SelectMenuInputMessage, has params Player and
Button. Broadcast messages when holding select and a button other than Select
is pushed.
* Windowed mode is now the default display mode.
* [HighScore.cpp] new Lua bindings:
* GetModifiers()
* GetTapNoteScore(TapNoteScore)
* GetHoldNoteScore(HoldNoteScore)
* GetRadarValues()
* [ProfileManager.cpp] added IsSongNew(Song) Lua binding
r088 | 20091101 12:19:47
------------------------
* SM4SVN r28203-28208, all by Glenn Maynard.
* r28203: "skip exporting round data when nothing was played (no taps, no holds)"
* r28204: "fix signatures not being written" (we had this already)
* r28205: "don't fail if there's no course; just hide"
* r28206: "move course rename and delete into Overview"
* r28208: "disable rename and delete for courses that havn't been saved yet"
r28207 was a theme edit.
20091029
--------
sm4svn r28202: helper for cycling through an enum [Glenn Maynard]
20091028
--------
sm4svn r28201: "refactor RageInput to not call GetDevicesAndDescriptions
constantly; it can be slightly complex and get called thousands of
times a second" [Glenn Maynard]
20091027
--------
* SM4SVN r28198-28200
* r28198: Fix GetFileSizeInBytes to return an int instead of unsigned.
"this returns -1 on error (this should actually be 64-bit,
but that's a bigger change)" [Glenn Maynard]
* r28199: The official log is as follows:
"Hack to get the decorations to be deleted. Fixes crashes,
but probably not the best way to go about this."
In addition to doing this, it adds GetChildren() to ActorFrame in the
code itself. (It already existed in Lua, I just felt like pointing
this out. :D) [Steve Checkoway]
* r28200: The official log is as follows:
"Do not use an AutoActor to keep track of the children."
However, this also fixes the hack in r28200. [Steve Checkoway]
* Allow for Codes on ScreenGameplay. [shakesoda]
* New Lua bindings for ScreenGameplay:
* PauseGame(bool) - Pauses/unpauses the game.
* IsPaused() - returns true or false depending on if the game is paused or not.
20091015
--------
* Support loading Lua scripts from subdirectories of the Scripts folder,
to allow for better organization. The scripts in the root Scripts folder
will run first, then any Lua scripts in subdirectories of the Scripts folder
will be run. It currently only works with one folder depth, for example:
Scripts/subfolder/script.lua.
This is not likely to be changed. If you can see a possible need for paths
like Scripts/subfolder/subfolder2/script.lua, please make a Feature Request
ticket on the bugtracker at http://ssc.ajworld.net/sm-ssc/bugtracker/ with
an explanation of what you have in mind.
20091012
--------
* Change BitmapText defaults to no stroke + no shadow.
* Added DefaultTheme preference in order to fix crashes.
(sm-ssc's fallback theme is _fallback [and therefore normally unselectable].)
20091005
--------
* [NotesLoaderSM.cpp] Changes based on SM4SVN r28197 [Archer]
20091002
--------
* Event Mode turned on by default, as it should be. :)
(sm-ssc is a home mode-based version of StepMania.)
20090925
--------
* SM4SVN r28192-28196.
* r28192: HexToBinary for RString -> RString. [Glenn Maynard]
* r28193: show all songs in EditCourse, not just preferred songs [Chris Danford]
* r28194: [ScreenDebugOverlay] Glenn made this themeable in SM4SVN, finally
catching up. This means we've had to rename a few things:
* DebugMenuHeader -> HeaderText
* PageName -> PageText
ButtonText and FunctionText were added, as well.
The font names remain the same, only the metrics change.
(Can you believe they're still using Common normal as the font?)
* r28195,28196: fix ComboChanged message sent when m_bSendJudgmentAndComboMessages
is false, fix doing unnecessary work in multiplayer [Glenn Maynard]
20090920
--------
* [StepsDisplay] Fixed it so it actually shows up again.
20090919
--------
Happy talk like k//eternal day!
* [Font.cpp] Don't show strokes by default.
* [NoteDisplay] fRotation -> fRotationZ in anticipation of multiple rotation mods.
* [PaneDisplay] changed one thing that used a goto; doesn't use it anymore. seems to work for me, though I'm not 100% sure.
* [ThemeManager] don't reload Lua scripts when you reload the metrics.
This is a temporary fix, and may be deemed safe at some point in the future.
20090914
--------
(SM4SVN r28189)
* SM4SVN r28190,28191 (25 files worth). This was later reverted, as it caused
reloading the metrics to crash. Since sm-ssc is primarily for themers, this is a
dealbreaker. A lot of things were unofficially added to sm-ssc at this point:
* [ActorFrame] Added RemoveAllChildren() and RemoveChild(sName) bindings.
These are not guaranteed to work. Don't use them. They are very dangerous.
* [IniFile] added Lua's '--' syntax for commenting (along with '//' and '#',
which were already supported).
* New blend modes Modulate (subject to renaming later) and AlphaMultiply.
* [RageUtil] Added various bindings for formatting time that were already built
into StepMania: SecondsToHHMMSS, SecondsToMMSSMsMs, SecondsToMMSSMsMsMs,
SecondsToMSS, SecondsToMMSS. All bindings take in a float (number of seconds).
* [RageUtil] Added IsHexVal(string) binding.
* Added groups to sort length (based on BPM ranges), so the songs no longer
show up without groups.
20090913
--------
(SM4SVN r28180-28185)
20090913
--------
* Added WeightedMultiply and InvertDest blend modes to Direct3D.
20090912
--------
* Change decorations draw order so it breaks things less.
20090911
--------
* "hidden" removed from Actor commands. It was deprecated.
A compatibility alias was added to replicate its functionality. However, this
will not work with NoteSkins, so be sure to make sure to check them for the
use of hidden.
Handy replacement guide:
hidden,true / hidden,1 = visible,false
hidden,false / hidden,0 = visible,true
20090907
--------
* Add Sprite:CropTo() function + Lua binding.
20090906
--------
* Base theme changed from "default" to "_fallback".
As a result, all themes will fallback on _fallback instead of default.
20090905
--------
* add URLEncode Lua binding to RageUtil.
* [ScreenWithMenuElements.cpp, ThemeManager.cpp] Load and parse Lua as music.
This makes conditional music possible.
20090904
--------
* Change many things on ScreenEdit to go 5 decimal places instead of 3.
* Beginnings of Xbox controller mappings for edit mode (currently untested)
20090903
--------
* Binding naming format changed for BPM bindings. Always uses all caps BPM.
Changes in the codebase due to this:
* [Song] HasSignificantBpmChangesOrStops -> HasSignificantBPMChangesOrStops
* [TimingData] HasBpmChanges -> HasBPMChanges
* [TimingData] New bindings. (GetStops, GetBPMsAndTimes)
* [ScreenPackages] attempt to not call MoveLeft by duplicating code.
Seemed to work okay.
20090831
--------
* ScreenPackages changes:
* Backgrounds from Sprites to AutoActors (Lua can be used now).
* DefaultUrl metric added.
* [ActorScroller] Make naming of commands consistent (some were all lowercase,
some were CamelCase), all are now CamelCase.
20090828
--------
* Added ScreenGameplay:GetPlayerInfo(PlayerNumber) Lua binding
20090827
--------
* Added LifeChanged message to LifeMeterBattery, meaning certain hackily-coded
custom life meters by a certain SSC member can work in Oni mode again. ;)
* MAX_EDIT_STEPS_SIZE_BYTES changed from 30KB to 60KB.
* Added --theme= and --language= command line options.
20090826
--------
* SSE2 build configuration added to Visual Studio 2008 project file.
* new Lua bindings for WheelBase: IsSettled(), IsLocked()
20090822
--------
* Add Beginner meter sort.
* [CommandLineActions] Implement --version command line argument.
Prints out the version of sm-ssc. Please build sm-ssc with HAVE_VERSION_TIME
if possible for compatibility with all possible sm-ssc themes.
20090821
--------
(SM4SVN r28172-28174)
20090810
--------
* [GameCommand.cpp] add GetUrl() Lua binding.
* [GameManager.cpp] add IsGameEnabled(Game) Lua binding.
* [GrooveRadar] name m_GrooveRadarValueMap "RadarValueMap(P1/P2)"
(commands untested); new todo note in header file
* [ScoreDisplayOni.cpp] give it a name ("ScoreDisplayOni Numbers") and run
commands. (untested)
* removing player color diffuse commands, in the hopes this can be replicated
using Lua commands.
[GrooveRadar.cpp, ScoreDisplayLifeTime.cpp, ScreenSelectMusic.cpp]
20090810
--------
(SM4SVN r28170: vdl's fixes for Xbox building; he says they should be tested.)
20090815
--------
* add THEME:GetPathO() Lua binding
20090810
--------
(SM4SVN r28140-r28166; code changes only)
20090808
--------
(SM4SVN r28135, r28137, r28138)
* Lossless screenshots now save as PNG.
* Conversion of decorations to not be children of the screen; they load in
a similar fashion to overlay/underlay, but still using LoadB so everything
works correctly. (Tested against SM4 default theme for compatibility.)
20090729
--------
* add GetRotationX, GetRotationZ commands to Actor
* add urlnoexit game command, which won't exit upon loading the browser.
* add OldHealthState to HealthStateChanged message on ScreenGameplay
20090726
--------
* (untested) GrooveRadar plays commands on the frame now, allowing for
customized in and out transitions, using TweenOnScreen/TweenOffScreen Commands.
* add PlayerController enum binding
* add PlayerState:GetPlayerController() [untested]
20090725
--------
ScreenDebugOverlay changes:
* add OnCommand, X, Y to Debug Header
* add GainFocus/LoseFocus commands to page names
* add LineOnColor/LineOffColor
20090724
--------
* Add StartRoulette and StartRandom messages to MusicWheel.
* Fix default stroke color and shadow length. (BitmapText)
20090719
--------
* patch by theDtTvB: http://share11.appspot.com/20421
(some parts relating to Player.cpp were later reverted; will be reimplemented)
* Add SetPref to GameCommands.
20090718
--------
* New ThemeManager Lua bindings:
* GetCurrentThemeDirectory
* ReloadMetrics
* Added more internal font mappings: auxc, auxd, auxz, auxwhite, auxblack,
auxlb, auxrb, auxlt, auxrt
* Add conf,PercentageScoring.
20090712
--------
* ActorScroller: add GetNumItems binding.
* ThemeManager: add bindings for GetThemeDisplayName() and
GetThemeDisplayAuthor() (for the current theme only).
20090711
--------
* Fixes songs with only Edit steps from crashing.
* Lights fix from ???
* Add GAMESTATE:IsBattleMode() binding.
20090708
--------
* (sync with SM4SVN: LightsManager.cpp, ScreenGameplay.cpp)
20090707
--------
* Add GetProfileDir() binding to ProfileManager.
* Added ProfileSlotNames enum.
* Add broadcasted message "SongChosen" on ScreenSelectMusic.
20090626
--------
* Allow meters to go up to 20 in Edit Mode.
20090623
--------
* Added io, os, and packages to Lua bindings. They are disabled for now.
* Fix instance in ScreenSelectMaster where hitting Up wouldn't count as going
backwards.
20090617
--------
* Add Overlay shader. [AJ]
20090615
--------
(sync with SM4SVN)
More Lua bindings:
* PlayerStageStats:FullComboOfScore(tns)
* RageFileManager is now accessible through FILEMAN with these bindings:
* FILEMAN:DoesFileExist(path)
* FILEMAN:GetHashForFile(path)
* Add bindings to Song:
* GetSongFilePath
* GetMusicPath
* GetCDTitlePath
* GetLyricsPath
* IsEnabled
* HasStepsType
* HasMusic
* HasBanner
* HasBackground
* HasCDTitle
* HasBGChanges
* HasLyrics
* GetBPMAtBeat
* GetBeatFromElapsedTime
* GetElapsedTimeFromBeat
* HasSignificantBpmChangesOrStops
* HasEdits
* IsEasy
* Add bindings to Steps:
* IsAnEdit
* IsAPlayerEdit
* GetHash
* disabled stub for GetSMNoteData (untested)
20090612
--------
* Work-in-progress bindings for ActorSound:
* pause
* stop
* Work-in-progress bindings for RageSound:
* volume
* SetStopMode
20090529
--------
(sync with SM4SVN: Archer adding 5:4 support)
20090527
--------
Add three new Lua bindings to RageFile:
* GetError
* ClearError
* AtEOF
20090525
--------
(sync with SM4SVN)
* [Actor.cpp] add GetDiffuse() Lua binding
20090523
--------
* Add glowramp to Actor
20090518
--------
* (changes from SM4SVN: Frieza and Wolfman [OnlyPreferredDifficulties])
20090517
--------
* New RageFile bindings: Seek, Tell
* Added more internal font mappings: auxa, auxb, auxy, auxl, auxr
20090513
--------
ActorScroller changes:
* Can now actually set size of the mask with SetMask
* Add more Lua bindings:
* SetNumItemsToDraw
* GetFullScrollLengthSeconds
* GetCurrentItem
* GetDestinationItem
20090509
--------
* Add skewy to valid Actor commands.
20090505
--------
(SM4SVN: ComboMultiplier by Frieza in ScoreKeeperNormal + r28060, r28061)
20090502
--------
(changes from SM4SVN: ScreenSelect* changes by Frieza)
* Make ScreenDebugOverlay use its own fonts, namely:
* ScreenDebugOverlay header
* ScreenDebugOverlay page
* ScreenDebugOverlay line
* Add GetServerName() binding to NetworkSyncManager.
* Add GetText() binding to BPMDisplay.
* add MD5 String/File and SHA1 String hashing via Lua:
* CRYPTMAN:MD5String(str)
* CRYPTMAN:MD5File(path)
* CRYPTMAN:SHA1String(str)
* Add more Lua bindings to PlayerStageStats:
* GetCurrentMissCombo
* GetCurrentPossibleDancePoints
* GetAliveSeconds
* Add GetThemeAuthor() to ThemeManager.
* Add bindings to Song:
* GetDisplaySubTitle
* GetTranslitSubTitle
20090501
--------
(changes from SM4SVN: tons of changes by Frieza)
20090425
--------
(changes from SM4SVN: GameManager.cpp, RollingNumbers.cpp)
20090419
--------
* Make some crash explanations more detailed. Changed files include:
* Actor.cpp - PercentThroughEffect, PercentBetweenColors, DeltaTime
* Attack.cpp
* GameManager.cpp
* GameState.cpp
* InputFilter.cpp
* NoteData.cpp
* Add new Lua bindings to TimingData: HasBpmChanges, GetBpms, GetStops.
20090418
--------
* Project begins.
* Remove ScreenEz2SelectPlayer, which only the Xbox project still referenced.
_____________________________________________________________________________
+47
View File
@@ -0,0 +1,47 @@
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 the fuck 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) There are no other rules (yet).
+61
View File
@@ -0,0 +1,61 @@
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.
* listen
usage: --listen
Sets up a server, waiting for someone to connect. StepMania cannot connect to
itself, so it's unknown what this option is really for. This option may be
removed in future sm-ssc releases if it is deemed pointless.
--------------------------------------------------------------------------------
[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.
+17
View File
@@ -0,0 +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.
Please define HAVE_VERSION_INFO if you can when building sm-ssc.
-194
View File
@@ -1,194 +0,0 @@
********************************
Conditional BGA System.
********************************
--------------
Description
--------------
The conditional bga system will search for a .ini file in a theme
folder which will contain a series of BGA names and conditions upon
which they may be shown.
--------------
Filenames
--------------
Currently the following .ini names possible are:
ScreenEvaluation* ConditionalBGA.ini (will appear on the evaluation screen backgrounds)
--------------
Structure
--------------
[BGAName To Load]
Conditiontype:Condition
--------------
Conditions
--------------
SongTitle:
enter the name of a song title. be aware -- if you have multiples of a song with the
same name then you may want to enter more information like the artist and even song
foot ratings.
Example-
SongTitle:Paranoia Survivor Max
this will show the BGA only if PSM is available.
SongArtist:
enter the name of an artist, any song which matches the artist name will display the bga.
Example-
SongArtist:Naoki
all songs where the artist is Naoki will show the BGA
Clear:
clear will show the bga under one of four conditions:
* true - this will show if the song was cleared
* false - this will show if the song was failed
* fullcombo - this will show if the song was full comboed
* brokencombo - this will show if the song was cleared but not fullcomboed
Example-
Clear:fullcombo
this will only show if one of the players fullcomboed the song.
ModDisallow:
moddisallow will ensure that the bga is NOT displayed if any of the players
have the option. At the time of writing (11/feb/2004) not all mods have been
supported, but certainly things like little are not available (ideal if you
want somebody to get a rewarding bga for clearing a hard song in heavy, but dont
want them getting it via using a mod like little).
You may specify multiple mods by seperating them with commas (,)
Example-
ModDisallow:little,nojumps,noholds
the bga will only show provided little, nojumps and noholds are not selected by any
player.
Grade:
grade will compare a players grade with their current grade if they have one
so you could have it display a BGA if a player AAA'd a track. You may seperate
grades via commas (,) which will indicate a grade history with the latest stage
being at the end of the list.
Example-
Grade:AAA,AAA,AAA
the above will show the bga only if the player has passed at least 3 stages and
one of the players got a AAA on each stage.
SongMonth:
the bga will only display if the current month matches. Months range from 0-11 with
0 being janurary and 11 being december.
Example-
SongMonth:2
the bga will only appear if its march.
SongDay:
the bga will only appear on a day in the month
Example-
SongDay:10
the bga only appears if it is the 10th day in the month.
Style:
the bga will only appear if the specified style is available. you can specify multiple
style by seperating them with commas (,)
Example-
Style:double,single
this will display the BGA only if the style is in double or single.
SongRating:
the bga will only show if one of the players is in a difficulty matching that specified
you may specify multiple ratings by seperating them with a comma (,)
Example-
SongRating:heavy,light
this will show the bga only if a player played heavy or light notes.
SongDifficulty:
if a player was playing a song with a footrating specified then the bg will display
you can seperate difficulties with commas (,) you can specify ranges like the following:
1-3 this is the same as writing 1,2,3 also you may check for ratings and greater for
example: 9+ will check for all catastrophic songs.
Example-
SongDifficulty:SongDifficulty:1-3,5,9+
this will show the bga if the songs difficulty is 1,2,3,5,9(and onwards)
------------------
Overriding
------------------
If there are several bga's listed in a file, and the conditons specified are met
for more than one bga, the one listed nearest to the end of the file will have priority.
------------------
Mixing Conditions
------------------
All conditions are mixable, for instance you may check if a song is in Expert AND if its
title is G2.
-----------------
Examples
-----------------
//AAA three tracks in a row (your 3rd evaluation screen will have this)
[ScreenEvaluationStage AAA3]
Grade:AAA,AAA,AAA
// clear G2 in maniac
[ScreenEvaluationStage G2]
SongTitle:g2
SongRating:Heavy
Clear:true
ModDisallow:little,nojumps,noholds
// full combo sweet in heavy on the 15th march
[ScreenEvaluationStage 1503]
SongTitle:sweet
SongArtist:dj evil
SongRating:Heavy
SongDay:15
SongMonth:2 // months range from 0 - 11
Clear:maxcombo
-----------------
Version History
-----------------
11/feb/2004
Initial Version, Support for SongTitle,SongArtist,SongRating,
SongDay,SongMonth,Clear,Grade,ModDisallow,Style and SongDifficulty.
------------
Contact
------------
This feature was initially created by:
frieza [letters_q (at) hotmail.com]
and is maintained by:
frieza [letters_q (at) hotmail.com]
+340 -340
View File
@@ -1,340 +1,340 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Library General
Public License instead of this License.
+36
View File
@@ -0,0 +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;
+23
View File
@@ -0,0 +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
break things.
+170 -142
View File
@@ -1,142 +1,170 @@
The following license applies to most of the StepMania codebase:
******************************************************************************
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.
+1765
View File
File diff suppressed because it is too large Load Diff
+188 -185
View File
@@ -1,185 +1,188 @@
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.stepmania.com"
xmlns="http://www.stepmania.com"
elementFormDefault="qualified">
<xs:element name="Lua">
<xs:complexType>
<xs:all>
<xs:element name="Singletons" type="Singletons" />
<xs:element name="Classes" type="Classes" />
<xs:element name="Namespaces" type="Namespaces" />
<xs:element name="GlobalFunctions" type="GlobalFunctions" />
<xs:element name="Enums" type="Enums" />
<xs:element name="Constants" type="Constants" />
<xs:element name="Date" type="xs:date" />
<xs:element name="Version" type="xs:string" />
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="Documentation">
<xs:complexType>
<xs:all>
<xs:element name="Classes" type="Classes" />
<xs:element name="Namespaces" type="Namespaces" />
<xs:element name="GlobalFunctions" type="GlobalFunctions" />
<xs:element name="Enums" type="Enums" />
</xs:all>
</xs:complexType>
</xs:element>
<xs:simpleType name="Identifier">
<xs:restriction base="xs:string">
<!-- Not totally valid since the following are not valid
identifiers in Lua.
and break do else elseif
end false for function if
in local nil not or
repeat return then true until
while
-->
<xs:pattern value="[a-zA-Z_][a-zA-Z0-9_]*" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="IdentifierOrTable">
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z_][a-zA-Z0-9_]*|\{[a-zA-Z_][a-zA-Z0-9_]*\}" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="IdentifierOrNonemptyString">
<xs:restriction base="xs:string">
<!-- XXX: Doesn't support double quoted strings. -->
<xs:pattern value="[a-zA-Z_][a-zA-Z0-9_]*|'[^']+'" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="IdentifierStringOrNumber">
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z_][a-zA-Z0-9_]*|'[^']+'|[0-9]+" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ArgumentList">
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse" />
<!-- ((IdentifierOrTable Identifier(, IdentifierOrTable Identifier)*(, ...)?)|...)? -->
<xs:pattern value="((([a-zA-Z_][a-zA-Z0-9_]*|\{[a-zA-Z_][a-zA-Z0-9_]*\}) [a-zA-Z_][a-zA-Z0-9_]*( ?, ?([a-zA-Z_][a-zA-Z0-9_]*|\{[a-zA-Z_][a-zA-Z0-9_]*\}) [a-zA-Z_][a-zA-Z0-9_]*)*)( ?, ?\.\.\.)?|\.\.\.)?" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="Singletons">
<xs:sequence>
<xs:element name="Singleton" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" type="Identifier" use="required" />
<xs:attribute name="class" type="Identifier" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:group name="DocumentationGroup">
<xs:sequence>
<xs:choice>
<xs:element name="Link" type="Link" />
<!-- HTML elements we want to let through. -->
<xs:element name="code" />
<xs:element name="br" />
</xs:choice>
</xs:sequence>
</xs:group>
<xs:complexType name="Description" mixed="true">
<xs:group ref="DocumentationGroup" minOccurs="0" maxOccurs="unbounded"/>
</xs:complexType>
<xs:complexType name="Classes">
<xs:sequence>
<xs:element name="Class" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Description" type="Description"
minOccurs="0" maxOccurs="1" />
<xs:element name="Function" type="Function"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="name" type="Identifier" use="required" />
<xs:attribute name="base" type="Identifier" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Namespaces">
<xs:sequence>
<xs:element name="Namespace" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Description" type="Description"
minOccurs="0" maxOccurs="1" />
<xs:element name="Function" type="Function"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="name" type="Identifier" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="GlobalFunctions">
<xs:sequence>
<xs:element name="Function" type="Function"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Function" mixed="true">
<xs:group ref="DocumentationGroup" minOccurs="0" maxOccurs="unbounded" />
<xs:attribute name="name" type="Identifier" use="required" />
<xs:attribute name="return" type="IdentifierOrTable" use="optional" />
<xs:attribute name="arguments" type="ArgumentList" use="optional" />
</xs:complexType>
<xs:complexType name="Link" mixed="true">
<xs:group ref="DocumentationGroup" minOccurs="0" maxOccurs="unbounded"/>
<xs:attribute name="function" type="Identifier" use="optional" />
<xs:attribute name="class" type="Identifier" use="optional" />
</xs:complexType>
<xs:complexType name="Enums">
<xs:sequence>
<xs:element name="Enum" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Description" type="Description"
minOccurs="0" maxOccurs="1" />
<xs:element name="EnumValue" type="Constant"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="name" type="Identifier" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Constants">
<xs:sequence>
<xs:element name="Constant" type="Constant"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Constant">
<xs:attribute name="name" type="IdentifierOrNonemptyString" use="required" />
<xs:attribute name="value" type="IdentifierStringOrNumber" use="required" />
</xs:complexType>
</xs:schema>
<!-- vim: set tw=0: -->
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.stepmania.com"
xmlns="http://www.stepmania.com"
elementFormDefault="qualified">
<xs:element name="Lua">
<xs:complexType>
<xs:all>
<xs:element name="Singletons" type="Singletons" />
<xs:element name="Classes" type="Classes" />
<xs:element name="Namespaces" type="Namespaces" />
<xs:element name="GlobalFunctions" type="GlobalFunctions" />
<xs:element name="Enums" type="Enums" />
<xs:element name="Constants" type="Constants" />
<xs:element name="Date" type="xs:date" />
<xs:element name="Version" type="xs:string" />
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="Documentation">
<xs:complexType>
<xs:all>
<xs:element name="Classes" type="Classes" />
<xs:element name="Namespaces" type="Namespaces" />
<xs:element name="GlobalFunctions" type="GlobalFunctions" />
<xs:element name="Enums" type="Enums" />
</xs:all>
</xs:complexType>
</xs:element>
<xs:simpleType name="Identifier">
<xs:restriction base="xs:string">
<!-- Not totally valid since the following are not valid
identifiers in Lua.
and break do else elseif
end false for function if
in local nil not or
repeat return then true until
while
-->
<xs:pattern value="[a-zA-Z_][a-zA-Z0-9_]*" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="IdentifierOrTable">
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z_][a-zA-Z0-9_]*|\{[a-zA-Z_][a-zA-Z0-9_]*\}" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="IdentifierOrNonemptyString">
<xs:restriction base="xs:string">
<!-- XXX: Doesn't support double quoted strings. -->
<xs:pattern value="[a-zA-Z_][a-zA-Z0-9_]*|'[^']+'" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="IdentifierStringOrNumber">
<xs:restriction base="xs:string">
<xs:pattern value="[a-zA-Z_][a-zA-Z0-9_]*|'[^']+'|[0-9]+" />
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="ArgumentList">
<xs:restriction base="xs:string">
<xs:whiteSpace value="collapse" />
<!-- ((IdentifierOrTable Identifier(, IdentifierOrTable Identifier)*(, ...)?)|...)? -->
<xs:pattern value="((([a-zA-Z_][a-zA-Z0-9_]*|\{[a-zA-Z_][a-zA-Z0-9_]*\}) [a-zA-Z_][a-zA-Z0-9_]*( ?, ?([a-zA-Z_][a-zA-Z0-9_]*|\{[a-zA-Z_][a-zA-Z0-9_]*\}) [a-zA-Z_][a-zA-Z0-9_]*)*)( ?, ?\.\.\.)?|\.\.\.)?" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="Singletons">
<xs:sequence>
<xs:element name="Singleton" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" type="Identifier" use="required" />
<xs:attribute name="class" type="Identifier" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:group name="DocumentationGroup">
<xs:sequence>
<xs:choice>
<xs:element name="Link" type="Link" />
<!-- HTML elements we want to let through. -->
<xs:element name="code" />
<xs:element name="br" />
</xs:choice>
</xs:sequence>
</xs:group>
<xs:complexType name="Description" mixed="true">
<xs:group ref="DocumentationGroup" minOccurs="0" maxOccurs="unbounded"/>
</xs:complexType>
<xs:complexType name="Classes">
<xs:sequence>
<xs:element name="Class" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Description" type="Description"
minOccurs="0" maxOccurs="1" />
<xs:element name="Function" type="Function"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="name" type="Identifier" use="required" />
<xs:attribute name="base" type="Identifier" use="optional" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Namespaces">
<xs:sequence>
<xs:element name="Namespace" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Description" type="Description"
minOccurs="0" maxOccurs="1" />
<xs:element name="Function" type="Function"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="name" type="Identifier" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="GlobalFunctions">
<xs:sequence>
<xs:element name="Function" type="Function"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Function" mixed="true">
<xs:group ref="DocumentationGroup" minOccurs="0" maxOccurs="unbounded" />
<xs:attribute name="name" type="Identifier" use="required" />
<xs:attribute name="renamed" type="Identifier" use="optional" />
<xs:attribute name="sm-ssc" type="Identifier" use="optional" />
<xs:attribute name="theme" type="Identifier" use="optional" />
<xs:attribute name="return" type="IdentifierOrTable" use="optional" />
<xs:attribute name="arguments" type="ArgumentList" use="optional" />
</xs:complexType>
<xs:complexType name="Link" mixed="true">
<xs:group ref="DocumentationGroup" minOccurs="0" maxOccurs="unbounded"/>
<xs:attribute name="function" type="Identifier" use="optional" />
<xs:attribute name="class" type="Identifier" use="optional" />
</xs:complexType>
<xs:complexType name="Enums">
<xs:sequence>
<xs:element name="Enum" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:sequence>
<xs:element name="Description" type="Description"
minOccurs="0" maxOccurs="1" />
<xs:element name="EnumValue" type="Constant"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
<xs:attribute name="name" type="Identifier" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<xs:complexType name="Constants">
<xs:sequence>
<xs:element name="Constant" type="Constant"
minOccurs="0" maxOccurs="unbounded" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="Constant">
<xs:attribute name="name" type="IdentifierOrNonemptyString" use="required" />
<xs:attribute name="value" type="IdentifierStringOrNumber" use="required" />
</xs:complexType>
</xs:schema>
<!-- vim: set tw=0: -->
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 124 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 B

+30 -30
View File
@@ -1,30 +1,30 @@
Bits of possibly less-than-obvious advice:
archutils/ contains arch-specific code. This should contain code
shared by more than one arch/ driver.
arch/ contains drivers for specific features that can be better
implemented nonportably. Most drivers (all except sound) contain
default, portable implementations, so StepMania should work mostly
out-of-the-box on platforms that are supported by the supporting
libraries (particularly SDL); only a sound driver needs to be
written.
Avoid accessing other singleton classes from singleton destructors. That
introduces dependencies on the order of destruction, and can cause problems
if one of the singletons throws an exception.
This kills VC:
template<class T> static void YY( T opt ) { }
enum { A } a;
enum { A1 } b;
void XX() { YY(a); YY(b); }
foo.obj : fatal error LNK1179: invalid or corrupt file: duplicate COMDAT '?YY@@YAXW4__unnamed@@@Z'
It mangles the template incorrectly. Solution: don't use anonymous
enums as template parameters; give them a name.
Bits of possibly less-than-obvious advice:
archutils/ contains arch-specific code. This should contain code
shared by more than one arch/ driver.
arch/ contains drivers for specific features that can be better
implemented nonportably. Most drivers (all except sound) contain
default, portable implementations, so StepMania should work mostly
out-of-the-box on platforms that are supported by the supporting
libraries (particularly SDL); only a sound driver needs to be
written.
Avoid accessing other singleton classes from singleton destructors. That
introduces dependencies on the order of destruction, and can cause problems
if one of the singletons throws an exception.
This kills VC:
template<class T> static void YY( T opt ) { }
enum { A } a;
enum { A1 } b;
void XX() { YY(a); YY(b); }
foo.obj : fatal error LNK1179: invalid or corrupt file: duplicate COMDAT '?YY@@YAXW4__unnamed@@@Z'
It mangles the template incorrectly. Solution: don't use anonymous
enums as template parameters; give them a name.
+455 -455
View File
@@ -1,455 +1,455 @@
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
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.
----------------------------------------------------------------
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
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.
----------------------------------------------------------------
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
@@ -0,0 +1,159 @@
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=x-sjis">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>BM98Data_format_specification</title>
</head>
<body bgcolor="#F1DBC0">
<p><font color="#008080" size="3" face="MS Sans Serif"><strong>BMS
Format Specification</strong></font></p>
<p align="right">written by Urao Yane(yaneurao@sun-inet.or.jp)</p>
<p>&quot;BMS&quot; 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 I adopted this file
format to BM98. Now,anyone can use this format freely.</p>
<p>-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-</p>
<p><font color="#008080">&lt;Command Line&gt;</font></p>
<p>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.</p>
<p>-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-</p>
<p><font color="#008080">&lt;Header&gt;</font></p>
<p>#PLAYER 1<br>
This data is for Single Play.</p>
<p>#PLAYER 2<br>
This data is for Two Play.</p>
<p>#PLAYER 3<br>
This data is for Double Play.</p>
<p>#GENRE xxxxxxxx<br>
Definition of Genre.</p>
<p>#TITLE xxxxxxxx<br>
Definition of Title.</p>
<p>#ARTIST xxxxxxxx<br>
Definition of Artist.</p>
<p>#BPM xxx<br>
Definition of BPM.(Beat Per Minite) at the top of music. default
: 130</p>
<p>#MIDIFILE xxxxxxx.mid<br>
Background music by MIDI.</p>
<p>#PLAYLEVEL x<br>
Information of Game Level for player.</p>
<p>#RANK x<br>
judgement level.<br>
x = 0 :very hard, 1: hard, 2: normal, 3: easy</p>
<p>@</p>
<p>#VOLWAV xxx<br>
relative volume control (percentage)</p>
<p>#WAVxx yyyyyyyy.wav<br>
definition of Wave Data. xx : 01 to FF (Hex) , yyyyyyyy.wav :
wave file name</p>
<p>e.g.<br>
#WAV01 HOUSE01.WAV // assign HOUSE01.WAV to 01 wav<br>
#WAV02 HOUSE02.WAV // assign HOUSE02.WAV to 02 wav<br>
#WAVFF HOUSE03.WAV // assign HOUSE03.WAV to FF wav</p>
<p>#BMPxx yyyyyyyy.bmp<br>
definition of Bitmap file. xx : 01 to FF(Hex) , yyyyyyyy.bmp :
bitmap file name<br>
Bitmap size must be 256 * 256.(max color 65536)</p>
<p>e.g.<br>
#BMP01 HOUSE01.BMP // assign HOUSE01.BMP to 01 bitmap<br>
#BMP02 HOUSE02.BMP // assign HOUSE02.BMP to 02 bitmap<br>
#BMPEE HOUSE03.BMP // assign HOUSE03.BMP to EE bitmap<br>
</p>
<p>But ,the bitmap defined by #BMP00 is something special.<br>
This bitmap shows when a player do a poor play.</p>
<p>-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-</p>
<p>// a sample of random loading function</p>
<p>#random 2 // create a random number (1 or 2)</p>
<p>#if 1 // if the number was equal to 1 then...<br>
#00111:31313131 // this is effective...<br>
#endif</p>
<p>#if 2 // if the number was equal to 2 then...<br>
#00113:32003232 // this is effective<br>
#endif</p>
<p>-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-</p>
<p><font color="#008080">&lt;Channel Messages&gt;</font></p>
<p>#aaabb:cccccccc</p>
<p>aaa: track number (from 000 to 999)<br>
bb : channel number where you want to send message.(from 00 to
FF)<br>
cccccccc : &lt;message&gt;</p>
<p><font color="#008080">&lt;a brief Channel Number&gt;</font></p>
<p>01 : BGM(background music by WAVE)<br>
03 : changing a Tempo<br>
04 : BGA(background animation)<br>
06 : changing Poor-bitmap<br>
11 to 17 : Object Channel of 1 player side<br>
21 to 27 : Object Channel of 2 player side<br>
</p>
<p><font color="#008080">&lt;Example&gt;</font></p>
<p>#00211:03030303<br>
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 <font color="#FF0000"><em>evenly</em></font>
in this track.</p>
<p>Please try the following patterns.</p>
<p>#00211:0303030303</p>
<p>#00211:0303000303</p>
<p>#00211:010101<br>
#00211:00020202</p>
<p>-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-</p>
<p>This document and this format is <font color="#FF0000">free</font>!<br>
I hope the day will come when my BMS format will use all over the
world.</p>
<p align="right">Urao Yane</p>
<p><a href="http://www.sun-inet.or.jp/~yaneurao/">back to my
homepage</a></p>
</body>
</html>
@@ -0,0 +1,564 @@
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=x-sjis">
<meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
<title>BM98FinalSecret</title>
</head>
<body bgcolor="#F1DBC0">
<p><font color="#008080" size="4" face="DFPPOP体"><strong>BM98FinalSecret</strong></font></p>
<p>BM98最後の秘密とは、Extended
Character機能、すなわち、ゲーム中のキャラクターすべてをBMSファイル側で変更する機能である。</p>
<p>ただし、この機能は、拡張し納得のいくものになり次第、公開しようと思っていたのだが、いろいろ事情があって、BM98そのものの開発をうち切ることになり、日の目を見ることのなくなった機能である。</p>
<p>そこで、この機能を使った曲の、BMRの方での動作は保証できない。あくまでBM98ver3.18用として認識していただきたい。また、それ以降のバージョンで、きくちゃんによるものは、ビットマップファイルが書き換えられているので、このテキストの内容の限りではない。</p>
<p>また、基本的にBM98について、やねうらおは一切サポートしないと言っているの同様、ここの内容についても、一切サポートしないので、質問メールは勘弁してほしい。</p>
<p>それから、スプライトナンバー等、BM98固有の定数が出てくるが、これらは、BMRとは一切無縁である。</p>
<p> </p>
<p> </p>
<p>まず、この機能のことをヘルプでも少し触れているので、それを抜粋する。</p>
<p>--------------------------------------------------</p>
<p>Extended Character (BM98 v3.18以降) <非公開機能></p>
<p>以下は、やねうらおのメモだとお考えください(笑)</p>
<p>・ゲーム中の任意のスプライトをユーザー定義する機能。</p>
<p>#ExtChr &lt;SpriteNo.&gt; &lt;BMPNo.&gt;</p>
<p>&lt;start_x&gt; &lt;start_y&gt; &lt;end_x&gt; &lt;end_y&gt;</p>
<p>{ &lt;offset_x&gt; &lt;offset_y&gt; { &lt;x&gt; &lt;y&gt; } } </p>
<p>通例、これとExtended Object機能とを併用して使う。</p>
<p>スプライトNo.とキャラクタNo.とは意味が違う。--------------------------------------------------</p>
<p>また、Extended Object機能と併用して使うと書いてあるが、そいつは、どこにあるかというと、チャンネルナンバー05番のところにちゃっかり書いてある。</p>
<p>--------------------------------------------------</p>
<p>05   [Extended Object] <非公開機能></p>
<p>  落下してくるオブジェを別のキャラクターナンバーのものにすり替える機能。この行の下にある行のオブジェに順番に割り振られる。</p>
<p>--------------------------------------------------</p>
<p>このチャンネルナンバーの次の行に書いてあるオブジェ配置データに対して、こいつが有効であることはわかるが、キャラクターとして何をどう書けば良いのか、それがまったくもって不明確である。</p>
<p>実を言うと、やねうらおもよくは覚えていない(笑)</p>
<p>なんか、あのときは、坂本龍一の曲をモチーフに、自分なりに編曲を行なっていて、そのとき1オクターブのピアノ鍵盤が出てるBMSファイルを作るつもりで、こんな機能をつけた覚えだけはある。</p>
<p>そんなわけで、ちょっとソーステキストを覗いてみよう。</p>
<p><font face="MS ゴシック">int ExtChr[] = {<br>
0,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,<br>
// 0x ユーザー定義可能部分<br>
976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,<br>
// 1x  ユーザー定義可能部分<br>
992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,<br>
// 2x ユーザー定義可能部分<br>
1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,<br>
// 3x<br>
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,<br>
// 4x<br>
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,<br>
// 5x<br>
941,942,943,944,945,946,947,948,949,950,951, 0, 0, 0, 0, 0,<br>
// 6x 金色オブジェ5パターン 赤 緑 灰 黒BM98金色(新オブジェ)<br>
730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,<br>
// 7x 金A B C D E F G H I J K L M N O P <br>
746,747,748,749,750,751,752,753,754,755,760,761,762,763,764,765,<br>
// 8x Q R S T U V W X Y Z a b c d e f<br>
766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,<br>
// 9x g h i j k l m n o p q r s t u v<br>
782,783,784,785,790,791,792,793,794,795, 0, 0, 0, 0, 0, 0,<br>
// ax w x y z - &quot; ! ? &amp; .<br>
800,801,805,806,807,808,810,811,812,910,911,912,913,940, 0, 0,<br>
// bx BM レコードSong SP DP BPM ヒト ★ ☆ 1P 2P 1Pd
2Pd 坂田<br>
850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,<br>
// cx 白A B C D E F G H I J K L M N O P <br>
866,867,868,869,870,871,872,873,874,875,876,877,878,879,890,891,<br>
// dx Q R S T U V W X Y Z / . ! % @ ?<br>
720,721,722,723,724,725,726,727,728,729, 0, 0, 0, 0, 0, 0,<br>
// ex 金0 1 2 3 4 5 6 7 8 9<br>
880,881,882,883,884,885,886,887,888,889, 0, 0, 0, 0, 0, 0<br>
// fx 白0 1 2 3 4 5 6 7 8 9<br>
};<br>
</font></p>
<p><font face="MS ゴシック">ちゅーことで、05チャンネルにデータを送信することで、01~FFまで、255種類のキャラクタを表示させるができるわけだが、それが何番のスプライトに対応するものであるかは、この表を見れば一目瞭然だ。(ただし、やねうらおにのみ:笑)</font></p>
<p><font face="MS ゴシック">たとえば、キャラクタナンバー01は、スプライトナンバー961である。(ユーザー定義可能部分)<br>
また、キャラクターナンバー50は、スプライトナンバー941であり、それは金色オブジェである。<br>
はたまた、キャラクターナンバーD2は、スプライトナンバー867であり、それは、Rという白い文字である。</font></p>
<p><font face="MS ゴシック">というようになっている。ということで、実は、第5チャンネルだけで、拡張キャラクタとして、文字などをオブジェとして落下させることができる。</font></p>
<p><font face="MS ゴシック">さらに、ここで、問題となるのは、スプライトナンバー961~1023がユーザー定義可能部分として解放されていることである。ここに来て、さきほどの</font></p>
<p>#ExtChr &lt;SpriteNo.&gt; &lt;BMPNo.&gt; &lt;start_x&gt;
&lt;start_y&gt; &lt;end_x&gt; &lt;end_y&gt; { &lt;offset_x&gt;
&lt;offset_y&gt; { &lt;x&gt; &lt;y&gt; } } </p>
<p><font face="MS ゴシック">が初めて意味を持つ。{
}の部分は省略可能ということ。</font></p>
<p><font face="MS ゴシック">#ExtChr 961 1 0 0 99 99</font></p>
<p><font face="MS ゴシック">などとすれば、スプライトナンバー961を、ビットマップナンバー1(これは、#bmpで定義したときのビットマップナンバー)の(0,0)から(99,99)の100×100ドットの部分として定義するという意味である。これにより、ユーザーで用意した任意のビットマップの特定の部分をユーザースプライトとして定義することが可能となり、それをさきほどのExtended
Objectで表示することが可能だというわけだ。(といま思い出した:笑)</font></p>
<p>そして、&lt;offset_x&gt; &lt;offset_y&gt;をオプションで指定できるが、これは、オブジェ位置を調整するためにある。</p>
<p>たとえば、オブジェを表示するとき、オブジェ高さを表示段階で参照して、そのオブジェの下面にプレイポイントが来るようにするのは、あまり洗練されたプログラムではないとやねうらおは考えたわけだ。このころ、ぽっぷんの移植のことが少し頭にあったので、オブジェクトの下面がプレイポイントでないこともありうることを多少意識もしていたのだ。</p>
<p>そこで、オフセットを持たせることにした。たとえば、(-5,-10)のオフセットを持つスプライトに対しては、(100,120)の座標に表示しなさい、と命令しても(95,110)の座標に表示されるわけである。このようにすることによって、内部的には、(100,120)の座標で管理できる。すなわち、プレイポイントに表示するように指示しておけば、それのスプライト表示の段階で、適切なオフセットを得て、適切な位置に表示されるという仕組みである。</p>
<p>ただ、そのことに気づいたのは、ver3.16あたりなので、スクラッチは実はオフセットを持っていなかった。(と思う) それの調整を行なうためにも、このオフセット値は重要である。</p>
<p>最後のオプションのX,Yだが、この指定があると、画面上の、その座標位置にそのスプライトを配置するのである。鍵盤のデザインを変更したり、DanceDanceRevolutionのようにぺたんと大きな矢印を用意したりすることの可能だ。また、いま定義されているスプライトを上から定義して、画面外に追い出し、表示されないようにすることもできる。</p>
<p> </p>
<p>わくわくしてきたところで、どのスプライトナンバーが何であるのか、その割付を完全に知りたいと思う人もいるだろう。そうでなければ、いまある鍵盤を別のキャラクタに再定義してしまうというようなことができないからである。</p>
<p>そこで、以下には、スプライト定義のためのルーチンをそのまま抜粋する。メモのようにして、何番が何であるか記されている。ただし、dynamicと書いてある部分は、動的に変更されるから、こいつを変えても無駄である。また、スプライトは、原則的に0~511までが表示されるもので、あと512~1023は、非表示であって、実行段階で、10番のスプライトは513番のスプライトをコピーせよ!などとして、10番にスプライト特性情報を持ってきて、10番のスプライトを画面表示することにより、513番のスプライトを画面表示することにしてある。このようにすることにより、一種類のスプライトを複数個表示したりすることが簡単になるし、何より管理の手間が楽になる。</p>
<p>しかし、増やしすぎて、512個では足りなくなったため、ネオン表示用に1024~1087を使っていたような気もする。(なんかダサイなあ...)</p>
<p>まあ、このへんは突貫工事なので深くはつっこまないように(笑)</p>
<p> </p>
<p>void DefSpriteGames(void) //
ゲーム画面のためのスプライト初期化<br>
{<br>
int i;<br>
for(i=0;i&lt;512*2+64;i++) {<br>
ySpriteMove(i,-10000,-10000); // 全クリア<br>
ySpriteVisible(i,true);<br>
} <br>
<br>
// 00 - 11 : (dynamic sprite) Greatの爆発アニメ用<br>
// 12-75 : Score表示用 (61-76 : AutoPlay表示用)<br>
// 71-75 : (dup.) CPU % 負荷率表示用<br>
<br>
// 77-79 : 空きのはず..<br>
<br>
// 80,81,82,83,84,85,86,87,88 : 1P側の鍵盤フラッシュ&スクラッチ<br>
// 89,90,91,92,93,94,95,96,97 : 2P側の鍵盤フラッシュ&スクラッチ<br>
<br>
// kazu:光っているキーボードの個別パーツ。<br>
yDefSprite(80,112,1,123,25); // 1(上部)<br>
ySpriteMove(80,SCR1P1+1,SCRDWN3-1);<br>
yDefSprite(81,112,26,133,46); // 1(下部)<br>
ySpriteMove(81,SCR1P1+1,SCRDWN3+25-1);<br>
<br>
yDefSprite(82,124,1,140,25); // <br>
ySpriteMove(82,SCR1P2+2,SCRDWN3);<br>
<br>
yDefSprite(83,141,1,146,25); // 3(上部)<br>
ySpriteMove(83,SCR1P3+8,SCRDWN3-1);<br>
yDefSprite(84,133,26,154,46); // 3(下部)<br>
ySpriteMove(84,SCR1P3+1,SCRDWN3+25-1);<br>
<br>
yDefSprite(85,147,1,163-1,25); // <br>
ySpriteMove(85,SCR1P4+4,SCRDWN3);<br>
<br>
yDefSprite(86,164-2,1,175,25); // 5(上部)<br>
ySpriteMove(86,SCR1P5+9,SCRDWN3-1);<br>
yDefSprite(87,154,26,175,46); // 5(下部)<br>
ySpriteMove(87,SCR1P5+1,SCRDWN3+25-1);<br>
<br>
yDefSprite(88,177,2,210,46); // スクラッチ<br>
ySpriteMove(88,SCR1P6+2,SCRDWN3);<br>
<br>
for(i=80;i&lt;=88;i++){<br>
ySpriteCopy(i+9,i); // かしこいなー俺:p<br>
ySpriteAdd(i+9,SCROFS,0); // スプライト相対移動<br>
}<br>
<br>
// 98,99 : 画面下のキーボード(赤ライン除く)<br>
yDefSprite(98,1,1+5,100,89); // for 1P
ノーマルキーボード(全体。スクラッチ含む)<br>
ySpriteCopy(99,98); // for 2P<br>
<br>
// 100-309 : (dynamic sprite) ノート。1画面同時数200という制限はここから来る<br>
<br>
// 310,311 : 1P &amp; 2P &quot;Great / Good / Bad / Poor &quot;<br>
// NoteSprite.h
あっちゃで使うから、これ、使っちゃダメよん。<br>
<br>
// 312-315 : &quot;1P&quot;,&quot;2P&quot;<br>
<br>
// 316 - 325 : 縦小節線 (こっちの方が優先か...)<br>
for(i=0;i&lt;10;i++){<br>
yDefSprite(316+i,64,91,64,91+(SCRDWN&gt;&gt;1)-1);<br>
}<br>
ySpriteMove(316,SCR1P3,0); // もう移動しといちゃえ!<br>
ySpriteMove(317,SCR1P5,0); // もう移動しといちゃえ!<br>
ySpriteMove(318,SCR1P6,0); // もう移動しといちゃえ!<br>
ySpriteMove(319,SCR1P3,SCRDWN&gt;&gt;1); //
もう移動しといちゃえ!<br>
ySpriteMove(320,SCR1P5,SCRDWN&gt;&gt;1); //
もう移動しといちゃえ!<br>
ySpriteMove(321,SCR1P6,SCRDWN&gt;&gt;1); //
もう移動しといちゃえ!<br>
<br>
// 322-7 : 2P用縦小節線<br>
<br>
// 328-330 : CPU負荷率<br>
<br>
// 331-430 : (dynamic sprite) Voltage Meter<br>
<br>
// 431,432,433,434,435,436 : 1P
キーを叩いたときの赤の縦ライン<br>
// 437,438,439,440,441,442 : 2P
キーを叩いたときの赤の縦ライン<br>
for(i=431;i&lt;=442;i++){<br>
if (i==436 || i==442) {<br>
yDefSprite(i,65,91,99,91+160-1); // スクラッチライン<br>
} else {<br>
yDefSprite(i,65,91,84,91+160-1); // <br>
}<br>
ySpriteVisible(i,false); //
ディフォルトでは不可視やろ?<br>
}<br>
ySpriteMove(431,SCR1P1+1,0);<br>
ySpriteMove(432,SCR1P2+1,0);<br>
ySpriteMove(433,SCR1P3+1,0);<br>
ySpriteMove(434,SCR1P4+1,0);<br>
ySpriteMove(435,SCR1P5+1,0);<br>
ySpriteMove(436,SCR1P6+1,0);<br>
for(i=0;i&lt;6;i++){<br>
ySpriteCopy(437+i,431+i);<br>
ySpriteAdd(437+i,SCROFS,0);<br>
} <br>
<br>
for(i=0;i&lt;12;i++){<br>
ySpriteCopy(443+i,431+i);<br>
ySpriteAdd(443+i,0,SCRDWN&gt;&gt;1);<br>
}<br>
<br>
// 455-497 : for displaying debug message(dup.)<br>
// (455-486) : 画面フレーム他(定義は、BGScr.cpp)<br>
// (487-497) : INSERT COIN &amp; CREDITS 0/2<br>
<br>
// 498-499 : 1P/2Pの下の赤ライン<br>
yDefSprite(498,1,1,100,5); // for 1P
ノーマルキーボード(全体。スクラッチ含む)<br>
// defined BGScr.cpp<br>
<br>
// 500-506 : FPSの表示用<br>
<br>
// 507 BM<br>
yDefSprite(507,340,345,426,374); //
BM98タイトルロゴ・小<br>
<br>
// 508-511<br>
yDefSprite(508,174,48,176,52); // 右向き三角マーク<br>
yDefSprite(509,178,48,180,52); // 左向き三角マーク<br>
ySpriteCopy(510,509);<br>
ySpriteCopy(511,510);<br>
<br>
/* <br>
(117,1,121,73) // 小節左サイドの線<br>
(239,1,247,73) // 小節右サイドの線<br>
*/<br>
<br>
// 513-1023 : free セコイことを言わずに豪快に使おう!<br>
for(i=0;i&lt;4;i++){<br>
yDefSprite(513+i,112,48+i*6,131,52+i*6); // 白オブジェ<br>
yDefSprite(523+i,133,48+i*6,152,52+i*6); // 黒オブジェ <br>
yDefSprite(533+i,147,147+i*6,180,151+i*6); // スクラッチ<br>
}<br>
yDefSprite(513+4,208,48,230,53); //
白オブジェのびよーん<br>
ySpriteOffset(513+4,-1,-1); // センタリング!<br>
yDefSprite(513+5,207,48,231,54); //
白オブジェのびよーん<br>
ySpriteOffset(513+5,-2,-2);<br>
<br>
yDefSprite(523+4,208,56,230,61); //
黒オブジェのびよーん <br>
ySpriteOffset(523+4,-1,-1);<br>
yDefSprite(523+5,207,56,231,62); //
黒オブジェのびよーん <br>
ySpriteOffset(523+5,-2,-2);<br>
<br>
yDefSprite(533+4,147,171,180,179); //
スクラッチのびよーん(1)<br>
yDefSprite(533+5,147,181,180,190); //
スクラッチのびよーん(2)<br>
<br>
// フリーゾーン(1拍分)<br>
yDefSprite(543,112,102,145,145-4);<br>
yDefSprite(544,147,102,180,145-4);<br>
yDefSprite(545,182,102,215,145-4);<br>
yDefSprite(546,112,147,145,190-4);<br>
yDefSprite(547,182,147,219,190); // びよーん BM98v3.16<br>
// ySpriteOffset(547,-2,0);<br>
yDefSprite(548,182,147,219,190); // びよーん BM98v3.16<br>
// ySpriteOffset(548,-2,0);<br>
<br>
yDefSprite(553,245,108,307,121); // GREAT<br>
yDefSprite(554,245,123,307,136); // GOOD<br>
yDefSprite(555,245,138,307,151); // BAD<br>
yDefSprite(556,245,153,307,166); // POOR<br>
<br>
yDefSprite(557,1,267,100,267); // 横小節線<br>
// ySetSpriteSize(557,120,1);<br>
<br>
// 赤文字<br>
for(i=0;i&lt;=9;i++){<br>
yDefSprite(560+i,245+i*12,168,255+i*12,183); // 0-9<br>
}<br>
<br>
yDefSprite(581,154,48,157,64); // ゲージ・緑(暗)<br>
yDefSprite(582,159,48,162,64); // ゲージ・緑(明)<br>
yDefSprite(583,164,48,167,64); // ゲージ・赤(暗)<br>
yDefSprite(584,169,48,172,64); // ゲージ・赤(明)<br>
<br>
for(i=0;i&lt;4;i++){<br>
yDefSprite(700+i,112+i*30,72,140+i*30,100); // GREAT爆発アニメ<br>
}<br>
<br>
// 0-9 , A-Z , a-z ...<br>
// 金色の文字<br>
yDefSprite(720,245,89,257,106); // 0<br>
yDefSprite(721,259,89,265,106); // 1<br>
yDefSprite(722,267,89,279,106); // 2<br>
yDefSprite(723,281,89,293,106); // 3<br>
yDefSprite(724,295,89,309,106); // 4<br>
yDefSprite(725,311,89,323,106); // 5<br>
yDefSprite(726,325,89,337,106); // 6<br>
yDefSprite(727,339,89,351,106); // 7<br>
yDefSprite(728,353,89,365,106); // 8<br>
yDefSprite(729,367,89,379,106); // 9<br>
<br>
yDefSprite(730,245,1,257,18); // A<br>
yDefSprite(731,259,1,271,18); // B<br>
yDefSprite(732,273,1,285,18); // C<br>
yDefSprite(733,287,1,299,18); // D<br>
yDefSprite(734,301,1,311,18); // E<br>
yDefSprite(735,313,1,323,18); // F<br>
yDefSprite(736,325,1,337,18); // G<br>
yDefSprite(737,339,1,351,18); // H<br>
yDefSprite(738,353,1,357,18); // I<br>
yDefSprite(739,359,1,371,18); // J<br>
yDefSprite(740,373,1,387,18); // K<br>
yDefSprite(741,389,1,399,18); // L<br>
yDefSprite(742,401,1,421,18); // M<br>
yDefSprite(743,245,20,259,37); // N<br>
yDefSprite(744,261,20,273,37); // O<br>
yDefSprite(745,275,20,287,37); // P<br>
yDefSprite(746,289,20,301,39); // Q<br>
yDefSprite(747,303,20,315,37); // R<br>
yDefSprite(748,317,20,327,37); // S<br>
yDefSprite(749,329,20,341,37); // T<br>
yDefSprite(750,343,20,355,37); // U<br>
yDefSprite(751,357,20,369,37); // V<br>
yDefSprite(752,371,20,391,37); // W<br>
yDefSprite(753,393,20,405,37); // X<br>
yDefSprite(754,407,20,419,37); // Y<br>
yDefSprite(755,245,41,257,58); // Z<br>
<br>
yDefSprite(760,259,41,271,58); // a<br>
yDefSprite(761,273,41,285,58); // b<br>
yDefSprite(762,287,41,297,58); // c<br>
yDefSprite(763,299,41,311,58); // d<br>
yDefSprite(764,313,41,325,58); // e<br>
yDefSprite(765,327,41,337,58); // f<br>
yDefSprite(766,339,41,351,62); // g<br>
yDefSprite(767,353,41,365,58); // h<br>
yDefSprite(768,367,41,371,58); // i<br>
yDefSprite(769,373,41,383,62); // j<br>
yDefSprite(770,385,41,398,58); // k<br>
yDefSprite(771,400,41,404,58); // l<br>
yDefSprite(772,406,41,426,58); // m<br>
yDefSprite(773,245,64,257,81); // n<br>
yDefSprite(774,259,64,271,81); // o<br>
yDefSprite(775,273,64,285,85); // p<br>
yDefSprite(776,287,64,299,85); // q<br>
yDefSprite(777,301,64,311,81); // r<br>
yDefSprite(778,313,64,323,81); // s<br>
yDefSprite(779,325,64,333,81); // t<br>
yDefSprite(780,335,64,347,81); // u<br>
yDefSprite(781,349,64,361,81); // v<br>
yDefSprite(782,363,64,383,81); // w<br>
yDefSprite(783,385,64,397,81); // x<br>
yDefSprite(784,399,64,411,87); // y<br>
yDefSprite(785,413,64,425,81); // z<br>
<br>
yDefSprite(790,381,89,391,106); // -<br>
yDefSprite(791,393,89,399,106); // &quot;<br>
yDefSprite(792,401,89,405,106); // !<br>
yDefSprite(793,407,89,419,106); // ?<br>
yDefSprite(794,309,108,325,125); // &amp;<br>
yDefSprite(795,327,108,331,125); // .<br>
<br>
yDefSprite(800,201,229,426,314); //
BM98タイトルロゴ・大<br>
yDefSprite(801,1,269,181,385); // レコード盤<br>
<br>
yDefSprite(805,183,316,426,343); // 「SONG SELECT」タイトル<br>
yDefSprite(806,183,345,338,364); // for Single Play<br>
yDefSprite(807,183,366,338,385); // for Double Play<br>
yDefSprite(808,309,127,385,156); // Auto BMP counter!<br>
<br>
yDefSprite(810,112,192,164,244); // ヒト<br>
yDefSprite(811,166+23,192+9,192+23,218+9); //
★(中身塗りつぶし)<br>
yDefSprite(812,194+23,192+9,220+23,218+9); //
☆(中身空洞)<br>
<br>
yDefSprite(820,182,48,185,51); //
リザルト表示用・赤い四角<br>
yDefSprite(821,187,48,190,51); //
リザルト表示用・緑色四角<br>
yDefSprite(822,182,102,186,105); //
リザルト表示用・ボーダ<br>
// スクラッチオブジェから借用:p<br>
<br>
yDefSprite(830,102,1,105,89); // 左側用・小<br>
yDefSprite(831,107,1,110,89); // 右側用・小<br>
yDefSprite(832,102,91,105,266); // 左側用・大(1)<br>
yDefSprite(833,107,91,110,266); // 右側用・大(1)<br>
// yDefSprite(834,245,203,420,206); // 上側用・大<br>
// yDefSprite(835,245,208,420,211); // 下側用・大<br>
yDefSprite(834,245,203,245+120-1,206); // 上側用・大<br>
yDefSprite(835,245,208,245+120-1,211); // 下側用・大<br>
yDefSprite(836,387,135,402,150); // 左上コーナー<br>
yDefSprite(837,387,152,402,167); // 右上コーナー<br>
yDefSprite(838,387,169,402,184); // 左下コーナー<br>
yDefSprite(839,387,186,402,201); // 右下コーナー<br>
yDefSprite(840,102,91,105,91+140-1); // 左側用・大(2)<br>
yDefSprite(841,107,91,110,91+140-1); // 右側用・大(2)<br>
<br>
yDefSprite(842,102,91,105,266-10); // 左側用・大(3) for
result<br>
yDefSprite(843,107,91,110,266-10); // 右側用・大(3)<br>
<br>
// 白いアルファベット<br>
yDefSprite(850,1,91,9,108); // A<br>
yDefSprite(851,11,91,19,108); // B<br>
yDefSprite(852,21,91,29,108); // C<br>
yDefSprite(853,31,91,39,108); // D<br>
yDefSprite(854,41,91,48,108); // E<br>
yDefSprite(855,1,110,9,127); // F<br>
yDefSprite(856,11,110,19,127); // G<br>
yDefSprite(857,21,110,29,127); // H<br>
yDefSprite(858,31,110,33,127); // I<br>
yDefSprite(859,35,110,43,127); // J<br>
yDefSprite(860,45,110,53,127); // K<br>
yDefSprite(861,1,129,9,146); // L<br>
yDefSprite(862,11,129,21,146); // M<br>
yDefSprite(863,23,129,31,146); // N<br>
yDefSprite(864,33,129,41,146); // O<br>
yDefSprite(865,43,129,51,146); // P<br>
yDefSprite(866,1,148,9,165); // Q<br>
yDefSprite(867,11,148,19,165); // R<br>
yDefSprite(868,21,148,29,165); // S<br>
yDefSprite(869,31,148,39,165); // T<br>
yDefSprite(870,41,148,49,165); // U<br>
yDefSprite(871,1,167,9,184); // V<br>
yDefSprite(872,11,167,21,184); // W<br>
yDefSprite(873,23,167,31,184); // X<br>
yDefSprite(874,33,167,41,184); // Y<br>
yDefSprite(875,43,167,51,184); // Z<br>
yDefSprite(876,1,186,9,203); // &quot;/&quot;<br>
yDefSprite(877,11,186,13,203); // &quot;.&quot;<br>
yDefSprite(878,15,186,17,203); // &quot;!&quot;<br>
yDefSprite(879,19,186,27,203); // &quot;%&quot;<br>
yDefSprite(880,1,205,8,222); // 0<br>
yDefSprite(881,10,205,14,222); // 1<br>
yDefSprite(882,16,205,23,222); // 2<br>
yDefSprite(883,25,205,32,222); // 3<br>
yDefSprite(884,34,205,41,222); // 4<br>
yDefSprite(885,43,205,50,222); // 5<br>
yDefSprite(886,1,224,8,241); // 6<br>
yDefSprite(887,10,224,17,241); // 7<br>
yDefSprite(888,19,224,26,241); // 8<br>
yDefSprite(889,28,224,35,241); // 9<br>
<br>
// added by BM98v3.16<br>
yDefSprite(890,53,167,061,184); // @<br>
yDefSprite(891,29,186,37,203); // ?<br>
yDefSprite(892,39,186,41,203); // :<br>
yDefSprite(893,43,186,45,203); // ;<br>
yDefSprite(894,47,186,51,203); // [<br>
yDefSprite(895,53,186,57,203); // ]<br>
yDefSprite(896,52,205,60,222); // ^<br>
yDefSprite(897,37,224,40,241); // (<br>
yDefSprite(898,42,224,45,241); // )<br>
yDefSprite(899,47,224,51,241); // &quot;<br>
yDefSprite(900,53,224,54,241); // '<br>
yDefSprite(901,56,224,57,241); // |<br>
yDefSprite(902,59,224,61,243); // ,<br>
yDefSprite(903,1 ,243, 9,260); // _<br>
yDefSprite(904,11,243,19,260); // ~<br>
yDefSprite(905,21,243,28,260); // =<br>
yDefSprite(906,30,243,37,260); // -<br>
yDefSprite(907,39,243,47,260); // +<br>
yDefSprite(908,49,243,56,260); // *<br>
<br>
yDefSprite(910,245,185,270,201); // 1P<br>
yDefSprite(911,272,185,297,201); // 2P<br>
yDefSprite(912,299,185,324,201); // 暗い表示の「1P」<br>
yDefSprite(913,326,185,351,201); // 暗い表示の「2P」<br>
<br>
// ネオン系 B:Blue R:Red D:Dark T:Top C:Center B:Bottom<br>
for(i=0;i&lt;9;i++){<br>
yDefSprite(920+i,428,1+i*41,458,40+i*41);<br>
// RT,RC,RB,BT,BC,BB,DT,DC,DB<br>
}<br>
<br>
// 赤文字の小さいの(BPM用)<br>
yDefSprite(930,317,213,323,227); // 0<br>
for(i=931;i&lt;=939;i++){<br>
yDefSprite(i,245+(i-931)*8,213,251+(i-931)*8,227);<br>
}<br>
<br>
yDefSprite(940,112,246,157,267); // sakata<br>
<br>
for(i=0;i&lt;3;i++){<br>
yDefSprite(941+i,175,54+i*6,194,58+i*6); // 金色オブジェ<br>
}<br>
yDefSprite(944,154,66,173,70);<br>
yDefSprite(945,207,64,231,70);<br>
<br>
for(i=0;i&lt;6;i++){<br>
yDefSprite(946+i,166,192+i*6,185,196+i*6);<br>
// 946 赤・947 緑・948 灰・949 くろ・950 bm98・ 951金色<br>
}<br>
<br>
}</p>
<p> </p>
<p>基本的に、BMRでも、Extended Object/Chracterの機能は持たせるつもりではいるが、もうちょっと洗練されたものにする予定でいる。</p>
<p>なお、ここにある機能を使うと、曲データとして、BM98曲データフォーマットに準拠したものではなくなるため、他のBM98用のビュアー等で見ることができなくなることを、あらかじめお断りしておく。</p>
<p>以上。</p>
<p> </p>
<p><a href="http://www.sun-inet.or.jp/~yaneurao/">戻る</a></p>
</body>
</html>
@@ -0,0 +1,326 @@
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fmodern\fprq1\fcharset0 Lucida Console;}}
{\*\generator Msftedit 5.41.15.1503;}\viewkind4\uc1\pard\f0\fs20 ..: HOW TO READ A .BMS/.BME WITH A NOTEPAD AND A BRAIN :..\par
..: Tutorial v1.1 by Jack A. Trades :..\par
\par
~ v1.1 differences\par
~1 Updated BPM Change method for over 255 and/or decimal BPM usage.\par
~2 Spelling/word errors fixed.\par
~3 Added a new KEYLOCATION variable, to go with the ~1 update.\par
\par
!TIP!\par
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.\par
\par
!NOTE!\par
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.\par
\par
!!DISCLAIMER!!\par
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.\par
\par
\par
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.\par
\par
\par
A BMS have two parts: HEADER and MAIN DATA FIELD. Without each other, they're useless, basically.\par
\par
\par
\par
\par
*----------HEADER\par
\par
There are three sections of the header: BASIC, EXTENSION, and the third section that I like to call ASSIGNMENT. \par
\par
\bullet 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.\par
\bullet EXTENSION is the optional header that can contain tags you can put as cosmetics, basically.\par
\bullet 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.\par
\par
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.\par
\par
*---BASIC HEADER\par
\par
\par
\par
#PLAYER #\par
*---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.\par
\par
#GENRE [x]\par
*---specifies the genre [x] when the song is currently highlighted.\par
\par
#TITLE [x]\par
*---specifies the title [x] when the song is currently highlighted.\par
\par
#ARTIST [x]\par
*---specifies the artist [x] when the song is currently highlighted.\par
\par
#BPM ###\par
*---specifies ### ( 0 to 999 ) as the first (or only) BPM value of the song.\par
\par
#PLAYLEVEL ##\par
*---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?\par
\par
#MIDIFILE xxx.mid\par
*---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.\par
\par
\par
\par
*---EXTENSION HEADER\par
\par
\par
\par
#RANK #\par
*---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.\par
\par
#TOTAL ###\par
*---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.\par
\par
#VOLWAV ???\par
*---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.\par
\par
#STAGEFILE xxx.yyy\par
*---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.\par
\par
%EMAIL [x]\par
*---a comment header; you can enter your e-mail address, if desired.\par
\par
%URL [x]\par
*---a comment header; you can enter your website url address, if desired.\par
\par
\par
\par
*---ASSIGNMENT HEADER\par
\par
\par
\par
#WAV** xxx.yyy\par
\par
*---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). \par
*---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:\par
\par
*---#WAV01 kickdrum.wav\par
\par
*---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.\par
\par
*---Confused with those new vocabularies? Read on and you'll understand what the hell I'm babbling.\par
\par
*---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:\par
\par
*---#WAV01 kickdrum.wav\par
*---#WAV02 hi-hats.wav\par
\par
#BMP** xxx.yyy\par
\par
*---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.\par
\par
*---HUGE NOTE, AS IN READ THE BELOW COMMENT BEFORE YOU GO ON\par
*---HUGE NOTE, AS IN READ THE BELOW COMMENT BEFORE YOU GO ON\par
*---HUGE NOTE, AS IN READ THE BELOW COMMENT BEFORE YOU GO ON\par
\par
*---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.\par
\par
\par
*----------MAIN DATA FIELD\par
\par
_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.\par
\par
BACK TO THE POINT\par
\par
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.\par
\par
So we will begin, with the explanation. I'll have fun 'splaining as I will 'yping.\par
'ey! 'ccent 're 'ool! 'nd 'nintelligible 'oo!!! 'o 'ffense.\par
\par
\par
\par
So here you are, wandering around the main data field, and you see numbers like this.\par
\par
#00412:00000000000000005F0000001A000000E3\par
\par
and something like that repeated differently about 3000 times.\par
\par
Let's begin understanding each section by breaking down the given example line. Obviously you should already understand the #. All codes begin with #. Duh.\par
\par
# 004 12 :00000000000000005F0000001A000000E3\par
^\par
|\par
|\par
\par
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.\par
\par
Speaking of soon, we're moving right along to the next part. Boy was that quick or what?\par
\par
\par
# 004 12 :00000000000000005F0000001A000000E3\par
^\par
|\par
|\par
\par
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."\par
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.\par
\par
\par
KEYLOCATION - ACTUAL LOCATION/FUNCTION\par
======================================\par
11 - White key 1 (Most left)\par
12 - Blue key 1 (Most left)\par
13 - White key 2 (Second from the left)\par
14 - Blue key 2 (Center)\par
15 - White key 3 (Second from the right)\par
18 - Blue key 3 (Most right)\par
19 - White key 4 (Most right)\par
16 - Scratch (The big circle thing that makes wiki wiki wiki wik wik sound)\par
17 - \bullet unknown function currently\bullet\par
04 - BGA\par
07 - \bullet unknown function currently\bullet\par
06 - MISS BGA\par
01 - Always Autoplay\par
03 - BPM Change\par
08 - "Advanced" BPM Change\par
\par
\par
So in the above example, the code 00000000000000005F0000001A000000E3 will all be executed solely for the Blue key 1.\par
\par
\par
"BUT JACK A. TRADES, I WANNA KNOW HOW THOSE NUMBERS WORK AND WHAT ARE THEY ACTUALLY!?!??!?!/1/1/131'31'3nklnalndkland"\par
\par
Let's stop the question and start looking at the example below.\par
\par
# 004 12 :00000000000000005F0000001A000000E3\par
^ ^\par
--------------------------------\par
|\par
|\par
\par
_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?\par
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.\par
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.\par
\par
The amount of digits available will determine what kind of a note each double-digit is. I lost you again, didn't I?\par
\par
For (another?) example, if you put a line of code such as this instead of the given example above:\par
\par
#00412:5F\par
\par
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.\par
\par
HOLY CRAP HOW DID I KNOW THAT!?\par
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.\par
\par
So if you specify this instead:\par
\par
#00412:5F005F00\par
\par
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.\par
\par
If I specify:\par
\par
#00412:001A001A001A001A\par
\par
I'm telling the simulator to play the 1A in every other sixteenth notes. Get the picture?\par
\par
\'a4 THE AMOUNT OF DOUBLE DIGITS AvAILABLE IN THE LINE OF CODE SPECIFIES THE TYPE OF NOTE EACH ARE \'a4\par
\par
If there is one double-digit, it is a whole note.\par
If there are two double-digits, each double-digit is a half note.\par
If there are four double-digits, each double-digit is a quarter note.\par
If there are eight double-digits, each double-digit is a eighth note.\par
If there are sixteen double-digits, each double-digit is a sixteenth note.\par
If there are twelve double-digits, each double-digit is a twelveth note.\par
If there are thirty two double-digits, each double-digit is a thirty-second note.\par
ET CETERA\par
\par
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.\par
\par
\par
So let's recap! What does this code actually tell you?\par
\par
#00412:00000000000000005F0000001A000000E3\par
\par
\bullet At measure 5 ( #004 = MEASURE #5 ),\par
\bullet The following variables are to be called in the Blue Key 1 section ( #xxx12 = Blue Key 1 ):\par
\bullet 00,00,00,00,00,00,00,00,5F,00,00,00,1A,00,00,00,E3\par
\bullet Where each note is assumed as (in this strange case) a seventeenth note.\par
\bullet Therefore, the simulator must play the keysound of variable 00 in the first seventeenth note, then another 00 in the second seventeenth note, etc.\par
\par
\par
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.\par
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.\par
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.\par
\par
\par
\par
KEYLOCATION - ACTUAL LOCATION/FUNCTION\par
======================================\par
11 - White key 1 (Most left)\par
12 - Blue key 1 (Most left)\par
13 - White key 2 (Second from the left)\par
14 - Blue key 2 (Center)\par
15 - White key 3 (Second from the right)\par
18 - Blue key 3 (Most right)\par
19 - White key 4 (Most right)\par
16 - Scratch (The big circle thing that makes wiki wiki wiki wik wik sound)\par
17 - \bullet unknown function currently\bullet\par
04 - BGA\par
07 - \bullet unknown function currently\bullet\par
06 - MISS BGA\par
01 - Always Autoplay\par
03 - BPM Change\par
08 - "Extended" BPM Change\par
\par
\par
\par
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.\par
\par
Never mind that for now. What's MISS BGA, Always Autoplay, and BPM, you ask?\par
\par
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.\par
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.\par
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.\par
\par
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 \'a4 THE AMOUNT OF DOUBLE DIGITS AvAILABLE IN THE LINE OF CODE SPECIFIES THE TYPE OF NOTE EACH ARE \'a4 rule? Well, it applies to every code you can see, even those beyond the horizon.\par
\par
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:\par
\par
#00001:01\par
#00001:02\par
#00001:03\par
\par
This tells the simulator to play keysounds 01, 02, and 03 at the first note in measure 1. Simple, no?\par
\par
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.\par
\par
#01103:96\par
\par
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?\par
\par
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?\par
\par
[credit goes to pukpuk/2220 for finding the method originally and jammitch for pointing me to the solution]\par
\par
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:\par
\par
#BPM01 320\par
\par
And call it in the main data field like:\par
\par
#00408:01\par
\par
This will call the BPM Change of 01 in measure 5, and thus changing the song's BPM to 320.\par
\par
\par
So if you want multiple BPM changes:\par
\par
#01103:96AFC8E1\par
\par
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.\par
\par
\par
\par
\par
\par
\par
\par
\par
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.\par
\par
~ let empathy fill the void ~\par
}
@@ -0,0 +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.
~ let empathy fill the void ~
+17
View File
@@ -0,0 +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
http://wiki.bms.ms/index.php?title=Bms:Format&oldid=1615 (last good revision)

After

Width:  |  Height:  |  Size: 865 B

+187
View File
@@ -0,0 +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.
Urao Yane

After

Width:  |  Height:  |  Size: 4.9 KiB

+311
View File
@@ -0,0 +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.
...etc...
File diff suppressed because it is too large Load Diff
+5
View File
@@ -0,0 +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)
http://www.ph-online.net/html/ph_newspage_v3_09.html ("Explanation of KSF Pump It Up Step Format" by Turkeyslam)
+157
View File
@@ -0,0 +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.
+11
View File
@@ -0,0 +1,11 @@
This folder contains information on various simfile formats that exist.
BMS: Be-Music Script, typically used for beatmania files.
DWI: Son of MSD, created for the Dance With Intensity simulator.
KSF: Another son of MSD, created for the Kick it Up simulator, with extensions
added by Direct Move.
SDF: .sm derivative used in Pocket DDR.
misc.txt describes some formats that don't have directories.
PMS: Like BMS but for pop'n music.
Dance: pydance format; see dance-spec.txt for more information.
+67
View File
@@ -0,0 +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;
I'm just not sure how they're picking the places to store the decimal.
Binary file not shown.

After

Width:  |  Height:  |  Size: 97 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 B

Binary file not shown.
Binary file not shown.
+651
View File
@@ -0,0 +1,651 @@
#TITLE:test song;
#SUBTITLE:a remix;
#ARTIST:kurt angle!;
#TITLETRANSLIT:{ignored by sm2sdf};
#SUBTITLETRANSLIT:{ignored by sm2sdf};
#ARTISTTRANSLIT:{ignored by sm2sdf};
#GENRE:{ignored by sm2sdf};
#CREDIT:aj jelly;
#BANNER:ssc-banner.png;
#BACKGROUND:ssc-bg.png;
#LYRICSPATH:{ignored by sm2sdf};
#CDTITLE:{ignored by sm2sdf};
#MUSIC:{ignored by sm2sdf};
#OFFSET:-0.060;
#SAMPLESTART:{ignored by sm2sdf};
#SAMPLELENGTH:{ignored by sm2sdf};
#SELECTABLE:YES;
#BPMS:0.000=93.810,5.000=187.62;
#STOPS:;
#TIMESIGNATURES:{ignored by sm2sdf};
#BGCHANGES:{ignored by sm2sdf};
#KEYSOUNDS:{ignored by sm2sdf};
//---------------dance-single - ----------------
#NOTES:
dance-single:
:
Beginner:
1:
0.035,0.034,0.000,0.000,0.000,5.000,0.000,0.000,0.000,0.000,0.000,0.035,0.034,0.000,0.000,0.000,5.000,0.000,0.000,0.000,0.000,0.000:
1000
0000
0000
0000
,
0000
0000
0000
0000
,
0001
0000
0000
0000
,
0000
0000
0000
0000
,
1000
0000
0000
0000
,
0000
0000
0000
0000
,
0001
0000
0000
0000
,
1000
0000
0000
0000
;
//---------------dance-single - Copied from----------------
#NOTES:
dance-single:
Copied from:
Easy:
2:
0.063,0.039,0.000,0.000,0.000,9.000,0.000,0.000,0.000,0.000,0.000,0.063,0.039,0.000,0.000,0.000,9.000,0.000,0.000,0.000,0.000,0.000:
1000
0000
0000
0000
,
0001
0000
0000
0000
,
1000
0000
0000
0000
,
0001
0000
0000
0000
,
1000
0000
0000
0000
,
0001
0000
0000
0000
,
1000
0000
0000
0000
,
0001
0000
0000
0000
,
1000
0000
0000
0000
;
//---------------dance-single - ----------------
#NOTES:
dance-single:
:
Medium:
4:
0.119,0.078,0.000,0.000,0.000,17.000,0.000,0.000,0.000,0.000,0.000,0.119,0.078,0.000,0.000,0.000,17.000,0.000,0.000,0.000,0.000,0.000:
1000
0000
0010
0000
,
0100
0000
0001
0000
,
1000
0000
0100
0000
,
1000
0000
0001
0000
,
0100
0000
0010
0000
,
1000
0000
0001
0000
,
0010
0000
0001
0000
,
0100
0000
0001
0000
,
1000
0000
0000
0000
;
//---------------dance-single - Copied from----------------
#NOTES:
dance-single:
Copied from:
Hard:
6:
0.286,0.195,0.390,0.781,0.000,17.000,8.000,16.000,0.000,8.000,0.000,0.286,0.195,0.390,0.781,0.000,17.000,8.000,16.000,0.000,8.000,0.000:
1000
0000
2020
0000
,
3130
0000
0202
0000
,
1303
0000
0220
0000
,
1330
0000
0202
0000
,
1303
0000
2020
0000
,
3031
0000
0202
0000
,
0313
0000
2002
0000
,
3103
0000
0202
0000
,
1303
0000
0000
0000
;
//---------------dance-single - ----------------
#NOTES:
dance-single:
:
Challenge:
10:
0.425,0.293,0.195,0.000,0.390,57.000,4.000,0.000,0.000,0.000,0.000,0.425,0.293,0.195,0.000,0.390,57.000,4.000,0.000,0.000,0.000,0.000:
// measure 1
1000
0000
0000
0001
0000
0000
1000
0100
0000
0000
1000
0000
0010
0000
0001
0000
, // measure 2
0100
0000
0000
0001
0000
0000
1000
0100
0000
0000
0001
0000
0100
0000
0010
0000
, // measure 3
1001
0000
0000
1000
0000
0000
0001
0010
0000
0000
0001
0000
0100
0000
1000
0000
, // measure 4
0010
0000
0000
1000
0000
0000
0001
0010
0000
0000
1000
0000
0010
0000
0100
0000
, // measure 5
1010
0000
0000
0001
0000
0000
1000
0100
0000
0000
1000
0000
0010
0000
0001
0000
, // measure 6
0100
0000
0000
0001
0000
0000
1000
0100
0000
0000
0001
0000
0100
0000
0010
0000
, // measure 7
1001
0000
0000
1000
0000
0000
0001
0010
0000
0000
0001
0000
0100
0000
1000
0000
, // measure 8
0010
0000
0000
1000
0000
0000
0001
0010
0000
0000
1000
0000
0010
0000
0100
0000
, // measure 9
1010
0000
0000
0000
;
//---------------dance-single - ----------------
#NOTES:
dance-single:
:
Edit:
13:
1.000,0.736,0.000,0.000,1.000,152.000,0.000,0.000,0.000,0.000,0.000,1.000,0.736,0.000,0.000,1.000,152.000,0.000,0.000,0.000,0.000,0.000:
1000
0000
0100
0000
0010
0000
0001
0000
1000
0000
0100
0000
0010
0000
0001
0000
1000
0000
0100
0000
0010
0000
0001
0000
1000
0100
1000
0001
1000
0100
1000
0000
,
0001
0000
0010
0000
0100
0000
1000
0000
0001
0000
0010
0000
0100
0000
1000
0000
0001
0000
0010
0000
0100
0000
1000
0000
0001
0010
0001
1000
0001
0010
0001
0000
,
1000
0000
0100
0000
0010
0000
0001
0000
1000
0000
0100
0000
0010
0000
0001
0000
1000
0000
0100
0000
0010
0000
0001
0000
1000
0100
1000
0001
1000
0100
1000
0000
,
0001
0000
0010
0000
0100
0000
1000
0000
0001
0000
0010
0000
0100
0000
1000
0000
0001
0000
0010
0000
0100
0000
1000
0000
0001
0010
0001
1000
0001
0010
0001
0000
,
1000
0000
0100
0000
0010
0000
0001
0000
1000
0000
0100
0000
0010
0000
0001
0000
1000
0000
0100
0000
0010
0000
0001
0000
1000
0100
1000
0001
1000
0100
1000
0000
,
0001
0000
0010
0000
0100
0000
1000
0000
0001
0000
0010
0000
0100
0000
1000
0000
0001
0000
0010
0000
0100
0000
1000
0000
0001
0010
0001
1000
0001
0010
0001
0000
,
1000
0000
0100
0000
0010
0000
0001
0000
1000
0000
0100
0000
0010
0000
0001
0000
1000
0000
0100
0000
0010
0000
0001
0000
1000
0100
1000
0001
1000
0100
1000
0000
,
0001
0000
0010
0000
0100
0000
1000
0000
0001
0000
0010
0000
0100
0000
1000
0000
0001
0000
0010
0000
0100
0000
1000
0000
0001
0010
0001
1000
0001
0010
0001
0000
;
+337
View File
@@ -0,0 +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.
+24
View File
@@ -0,0 +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.
src: http://web.archive.org/web/20040205071612/http://paramax.hypermart.net/
+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>

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