added menu to editor

This commit is contained in:
Chris Danford
2002-08-17 06:44:04 +00:00
parent 84df8103d4
commit 4558db37bb
20 changed files with 1201 additions and 541 deletions
+273 -4
View File
@@ -51,8 +51,25 @@ Table of Contents
************************************************************
StepMania game system is capable of playing many game types. Currently, it
supports games Dance Dance Revolution and Pump It Up, with future support for EZ
2 Dancer, BeatMania, Guitar Freaks, DrumMania, Para Para Paradise and more.
supports games similar to Dance Dance Revolution, Pump It Up, and EZ 2
Dancer. In the future, it will support games similar to BeatMania, Guitar
Freaks, DrumMania, Para Para Paradise and more.
StepMania is a rhythm game. Arrows pointing in different directions scroll
up from the bottom of the screen, and the player must hit the corresponding
direction in time to the music. The game can be played with your hands on
the keyboard, but the real fun comes when the arrows are registered by dancing
on a sensor-laden mat. The game is very similar to Konami's Dance Dance
Revolution and Andamiro's Pump It Up games, but while those play only their
own songs, StepMania can play any song that includes a step file.
In Stepmania most popular mode, "dance", the player uses four arrows - up,
down, left, and right - , similar to Konami's Dance Dance Revolution series
of games. In "pump" mode, the player must deal with and five direction of
steps - ala Andamiro's Pump it Up games.
Later versions of StepMania will support steps similar to Amuseworld's
EZ2Dancer games, as well as any that there is a sizable demand for.
************************************************************
@@ -61,7 +78,7 @@ supports games Dance Dance Revolution and Pump It Up, with future support for EZ
* Windows 98, Windows ME, Windows 2000, or Windows XP
* Pentium II, Pentium III, Celeron, Athlon, or compatible processor, 266MHz
minimum (400 MHz highly recommended)
minimum (400 MHz recommended)
* 64 MB of RAM
* Video card that supports High Color (16-bit color) and has 16MB video RAM
* DirectX 8.1 compatible video card with drivers
@@ -116,6 +133,254 @@ In gameplay:
* Hold Escape = abort playing
************************************************************
6. Playing the Game
************************************************************
This section primarily covers StepMania's most popular game type, "dance".
The various games supported by StepMania are similar, and much of this
information applies to other games too.
Title Menu screen: At the title screen are a series of options.
* Game Start:
Begin playing the game and go to the Style Select screen. Make sure
you've configured your keyboard or dance pad before chosing this
option.
* Switch Game:
Allows you to chose between the various games supported by StepMania
(dance, pump, ez2, etc).
* Config Key/Joy:
This is where you go to assign key presses or pad presses. You'll
want to use this screen before playing.
* Game Options:
This is you can adjust properties of the game, like difficulty
and number of stages.
* Game Options:
This is you can adjust graphic detail and other settings that
the performance of the game.
* Appearance Options:
Here, you can customize the appearance of StepMania by chosing the
announcer, theme, and note skin.
* Edit/Record/Synch:
In this mode, you can edit songs and step patterns, or create your
own step patterns from scratch.
* Exit:
Exits the program.
* At the upper-left corner is the total number of songs found when
StepMania perused your songs foler on startup.
* At the upper-right is your version of StepMania.
Config Key/Joy screen:
This menu allows you to map up to 2 keyboard/joystick buttons to each
function in the game. The third column is the default key mapping, and
cannot be changed. However, you can override a default keyboard key by
simply assigning it to another function. The mappings for player 1 are
on the left half of the screen, and the mapping for player 2 are on right
half.
Appearance Options screen:
* Display:
Toggles between Fullscreen mode, in which StepMania is the only
program visible and takes up the entire screen, and Windowed mode,
in which StepMania runs in a window and can be moved about on your
desktop and minimized or maximized, much like any other window.
Many users have found that one mode or the other is more efficient
and produces a smoother game. This varies depending on memory and
video functionality.
* Display Res:
This switches between various standard resolutions of the screen.
A higher number of pixels implies a sharper image, but requires more
computer power.
* Texture Res:
Adjusts the resolution (pixel density) of video textures used in the
game. More detail requires a more powerful computer.
* Refresh Rate:
Sets the number of times that the screen will be redrawn in 1 second.
Note that this setting will only have an effect in Fullscreen mode.
'Default' uses the system default refresh rate (60Hz on most computers).
* Ignore JoyAxes:
Many dance mat drivers (if you're using a dance mat) map the arrows
as directions on a joystick axis. A joystick cannot, logically, be
in more than one place at a time, such as left but also right. In
the game, it is possible to hit two directions at once (in fact,
required at times) and switching this setting to 'on' will make
StepMania ignore the joystick requirement so that your dance mat
will correctly register two arrows at once. See section in the README
"Connecting Dance Pads" for more information on what adapters to use.
* Menu Buttons:
Toggles whether or not the menus will respond to the gameplay buttons.
If not, dedicated buttons for menu navigation will be required.
* Show FPS:
Displays the current frames-per-second in the upper right side of the
screen.
* BG Mode:
This controls the state of the background behind the arrows.
OFF - Only the background graphic of the song is displayed.
ANIMATIONS - Along with the background graphic, animated graphics
(found in the BGAnimations folder) will dance around behind the
arrows. Keep in mind that the animation files are small graphics,
and must be loaded on the fly. On slower computers, this will
cause jumpiness during the song. If this is a problem, try
changing to Visualizations or even off.
VISUALIZATIONS - Along with the background graphic, movies (found in
the Visualizations folder) will be played. The default StepMania
Visualizations pack (available at www.stepmania.com) contains
swirling and twisting effects, but in theory any AVI or MPEG video
can be used. You must have the DivX codec installed on your
computer for this to work. Keep in mind that DivX decoding is
processor-intensive, and will decrease the framerate. Slower
computers will have a hard time playing StepMania AND decoding
DivX backgrounds.
RANDOM MOVIES - Movie files from the "RandomMovies" folder will be
played as the background for the song.
Sample animations, visualizations, and random movies can be found at
www.stepmania.com.
* BG Brightness:
Adjusts the brightness level of the backgrounds. Since the
backgrounds and the arrows are both brightly colored, darkening the
backgrounds makes the arrows more visible.
* Menu Timer:
Toggles whether or not StepMania will place a time limit on using any
given menu. This limit is usually in the upper-right corner of the
screen.
* Event Mode:
If set to ON, there is no limit to the number of songs played. The
player goes back to the Select Music screen even after failing a song,
and continues to do so until they press Esc to move back a menu. If
set to OFF, the game will end after a number of songs specified in
'Arcade stages', the next option down.
* Arcade Stages:
If Event Mode is OFF, this is the number of songs that can
successfully be cleared before the game over screen is displayed.
* Judge Difficulty:
How accurate the player must be in stepping to get a better score for
the step. A higher number means they must be closer to the actual
timing of the arrow. Those of you who try to get all 'perfect' steps
will have a monster of a time with this setting all the way up.
* Life Difficulty:
How difficult it is to keep the life meter at the top of the screen
up. The higher this number, the less it will increase for precise
steps, and the more it will decrease for poorly timed steps.
* Auto Play:
The game will play as normal, but will hit all the arrows of its own
accord, without the player's input. It also will get a perfect on
every step. This will be saved as a high score for the song.
Appearance Options Menu:
* Announcer:
Select from the installed Announcer packs. Get more at
www.stepmania.com.
* Theme:
Select from installed Theme packs. Themes change the look of Stepmania.
Get more at www.stepmania.com.
* Note Skin:
Change the appearance of the arrows in the game by selecting from the
available packs.
Announcer, theme, and note skin packs can be dowloaded from
www.stepmania.com.
Song Options Menu
Upon selecting a song, the words 'Press NEXT for options' will appear on the screen. If you press the 'next' button (enter by default) you will come to the Song Options menu, which contains a variety of settings for changing the way the song and arrows are played.
Speed: The stream of arrows can be stretched out so that it comes faster, but the arrows are more spaced out. It can be left at 1x (normal speed) or stretched by multiples of .5, .75, 1.5, 2, 3, 5, or even 8 times the original speed.
Effect: Each of the effects changes the arrows themselves in some way, usually in such a way as to make them more obscure. Consider these challenege modes.
Off - No effect, normal arrow scrolling.
Boost - Also known as 'parabolic' in some circles, this makes the arrows start up slowly and accelerate towards the top.
Wave - Arrows alternately speed up and slow down.
Drunk - Arrows sway back and forth as they scroll.
Dizzy - Arrows spin as they scroll.
Space - Similar to the scrolling effect in the Star Wars intros, arrows scroll away from the player.
Mini - Arrows are really small.
Appear: These change the visibility of the arrows.
Visible - Normal arrow visibility.
Hidden - Arrows disappear before they reach the top.
Sudden - Arrows are invisible until close to the top.
Stealth - Arrows are completely invisible. The only way to get them is to either memorize the song, watch another player perform the same song at the same time as you on the same difficulty setting, or be really really lucky.
Turn: These rotate the arrows. The arrows will show up on screen in their rotated positions.
Off - Normal arrows, unchanged from how they are in the step file
Mirror - Steps are rotated 180 degrees. Up becomes a down.
Left - Steps are rotated 90 degrees left. Up becomes a left.
Right - Steps are rotated 90 degrees right. Up becomes a right.
Shuffle - All steps in the step file are randomly shuffled.
Little: Removes any arrows that aren't on the quarter beats.
Scroll: BY reversing the scroll, the arrows will scroll from the top down instead of from the bottom up.
Color: Changes the arrow colors.
Vivid - Arrows cycle colors, and off-beat arrows are at different parts of the cycle so as to be easily identifiable.
Note - Off-beat arrows are a different color from on-beat arrows, but colors do not cycle.
Flat - Off-beat arrows are the same color as on-beat arrows
Plain - Same as flat, with the addition that notes do not cycle colors.
Holds: If this is set to OFF, there will only be a normal arrow in place of any hold arrows that may appear. Some players don't like hold arrows.
Dark: This removes the grey arrows from the top of the screen, so that the player can't use them as a reference as to when to hit the proper arrow.
Life Type: Switch between BAR, where there is a meter that can be increased with accurate steps and decreased with poor steps, and BATTERY, where the player gets a set number of batteries, similar to 'lives' in most games, which are removed as they player misses steps.
Bar Drain: Functional only if Life Type is set to BAR. Switch between three ways the life meter can function.
Normal - Perfect and Great steps increase the bar, any others decrease it.
No Recover: Same as Normal but it can only go down, not up. Perfects and Greats leave it in place.
Sudden Death - Any step score other than Great or Perfect will automatically fail.
Bat. Lives: Functional only when Life Type is set to BATTERY. This sets the number of batteries the player gets.
Fail: If you fail by missing enough steps, this is when the song ends.
Arcade - Song will end as soon as you fail it.
End of Song - As the name implies, you will not fail out until the music end. You miss every step and the song will keep playing until it's finished.
Off - You cannot fail the song.
Assist: Makes a 'clap' sound every time you are supposed to hit an arrow, to help the player acquaint his or herself with the song's rhythmic structure.
Rate: This is the percent of normal speed that the song plays at. Any song can be speeded up or slowed down as much as 30%. This setting is not to correct a song that is misaligned to its steps, as the steps are also sped up or slowed down at the same rate that the song is.
Select Style screen: This is the screen where you choose your style of play.
* Single:
One player, playing on one four-panel pad. Second player need not apply.
* Versus:
Two players each with their own respective 4-panel pad and set of arrows.
Each player can choose their own difficulty, and each has their own set
of arrows to follow. At the end of the song each player will recieve a
separate grade. There is no interaction between players other than
comparing grades and, if you have dance mats, the possibility of crashing
into each other during play :-)
* Double:
Same as single, except that one player uses both player's pads, and must
contend with 8 arrows now instead of only four. The step listings for
doubles mode are separate from single or versus. Only files containing
such a set of steps will be displayed.
* Couple:
Very similar to versus, except that each player has a different set of
steps, and each player must choose the same skill level. Often stepfile
authors use this mode to choreograph a patern between the two players.
* Solo:
One player plays on six panels. Like double, this uses a different step
chart than single or versus or double does, and only files containing
that set of steps will be displayed.
************************************************************
6. How StepMania Loads Songs
************************************************************
@@ -851,6 +1116,9 @@ BUG FIX: Autoplay no longer misses the first step if it lies on beat 0.
NEW FEATURE: Support for holds notes in KSF.
CHANGE: KSF title discovery will use song foler name if KSF file contains foreign
characters.
BUG FIX: Stepping before start of a note at beat 0 no longer results in a BAD.
BUG FIX: Editor now works with dance-couple note patterns
BUG FIX: Lead-in/lead-out time added to Play and Record in editor.
------------------------CVS after 3.00 beta 5----------------
OPTIMIZATION: Much faster song loading.
@@ -1274,9 +1542,10 @@ Bug fix: Good and Boo arrows not being drawn.
************************************************************
Thanks to:
Warrior Bob (Dave H) for helping with the readme!
Dj Slash & Tony Thai for the caution graphic
Kyle "KeeL" Ward for his awesome menu music (www.ampcast.com/keel)
Gotetsu for being a utility player
Gotetsu for helping track down bugs and other various tasks
************************************************************
End of document
+94 -39
View File
@@ -23,24 +23,15 @@ GameManager* GAMEMAN = NULL; // global and accessable from anywhere in our progr
const int DANCE_COL_SPACING = 64;
const int DANCE_6PANEL_VERSUS_COL_SPACING = 54;
// <<<<<<< GameManager.cpp
// const int PUMP_COL_SPACING = 60;
const int PUMP_COL_SPACING = 50;
const int EZ2_COL_SPACING = 46;
const int EZ2_DOUBLE_ADJUST = 150;
// =======
const int PUMP_COL_SPACING = 50;
//const int EZ2_COL_SPACING = 50;
//
// Important: Every game must define the buttons: "Start", "Back", "MenuLeft", and "MenuRight"
//
// >>>>>>> 1.24
GameDef g_GameDefs[NUM_GAMES] =
{
{ // GAME_DANCE
@@ -289,12 +280,14 @@ GameDef g_GameDefs[NUM_GAMES] =
StyleDef g_StyleDefs[NUM_STYLES] =
{
{ // STYLE_DANCE_SINGLE
GAME_DANCE, // m_Game
"dance-single", // m_szName
NOTES_TYPE_DANCE_SINGLE, // m_NotesType
StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType
{ 160, 480 }, // m_iCenterX
4, // m_iColsPerPlayer
GAME_DANCE, // m_Game
true, // m_bUsedForGameplay
true, // m_bUsedForEdit
"dance-single", // m_szName
NOTES_TYPE_DANCE_SINGLE, // m_NotesType
StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType
{ 160, 480 }, // m_iCenterX
4, // m_iColsPerPlayer
{ // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER];
{ // PLAYER_1
{ TRACK_1, GAME_CONTROLLER_1, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*1.5f },
@@ -314,12 +307,14 @@ StyleDef g_StyleDefs[NUM_STYLES] =
},
},
{ // STYLE_DANCE_VERSUS
GAME_DANCE, // m_Game
"dance-versus", // m_szName
NOTES_TYPE_DANCE_SINGLE, // m_NotesType
StyleDef::TWO_PLAYERS_TWO_CREDITS, // m_StyleType
{ 160, 480 }, // m_iCenterX
4, // m_iColsPerPlayer
GAME_DANCE, // m_Game
true, // m_bUsedForGameplay
false, // m_bUsedForEdit
"dance-versus", // m_szName
NOTES_TYPE_DANCE_SINGLE, // m_NotesType
StyleDef::TWO_PLAYERS_TWO_CREDITS, // m_StyleType
{ 160, 480 }, // m_iCenterX
4, // m_iColsPerPlayer
{ // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER];
{ // PLAYER_1
{ TRACK_1, GAME_CONTROLLER_1, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*1.5f },
@@ -339,12 +334,14 @@ StyleDef g_StyleDefs[NUM_STYLES] =
},
},
{ // STYLE_DANCE_DOUBLE
GAME_DANCE, // m_Game
"dance-double", // m_szName
NOTES_TYPE_DANCE_DOUBLE, // m_NotesType
StyleDef::ONE_PLAYER_TWO_CREDITS, // m_StyleType
{ 320, 320 }, // m_iCenterX
8, // m_iColsPerPlayer
GAME_DANCE, // m_Game
true, // m_bUsedForGameplay
true, // m_bUsedForEdit
"dance-double", // m_szName
NOTES_TYPE_DANCE_DOUBLE, // m_NotesType
StyleDef::ONE_PLAYER_TWO_CREDITS, // m_StyleType
{ 320, 320 }, // m_iCenterX
8, // m_iColsPerPlayer
{ // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER];
{ // PLAYER_1
{ TRACK_1, GAME_CONTROLLER_1, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*3.5f },
@@ -373,6 +370,8 @@ StyleDef g_StyleDefs[NUM_STYLES] =
},
{ // StyleDef
GAME_DANCE, // m_Game
true, // m_bUsedForGameplay
false, // m_bUsedForEdit
"dance-couple", // m_szName
NOTES_TYPE_DANCE_COUPLE, // m_NotesType
StyleDef::TWO_PLAYERS_TWO_CREDITS, // m_StyleType
@@ -386,10 +385,10 @@ StyleDef g_StyleDefs[NUM_STYLES] =
{ TRACK_4, GAME_CONTROLLER_1, DANCE_BUTTON_RIGHT, +DANCE_COL_SPACING*1.5f },
},
{ // PLAYER_2
{ TRACK_1, GAME_CONTROLLER_2, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*1.5f },
{ TRACK_2, GAME_CONTROLLER_2, DANCE_BUTTON_DOWN, -DANCE_COL_SPACING*0.5f },
{ TRACK_3, GAME_CONTROLLER_2, DANCE_BUTTON_UP, +DANCE_COL_SPACING*0.5f },
{ TRACK_4, GAME_CONTROLLER_2, DANCE_BUTTON_RIGHT, +DANCE_COL_SPACING*1.5f },
{ TRACK_5, GAME_CONTROLLER_2, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*1.5f },
{ TRACK_6, GAME_CONTROLLER_2, DANCE_BUTTON_DOWN, -DANCE_COL_SPACING*0.5f },
{ TRACK_7, GAME_CONTROLLER_2, DANCE_BUTTON_UP, +DANCE_COL_SPACING*0.5f },
{ TRACK_8, GAME_CONTROLLER_2, DANCE_BUTTON_RIGHT, +DANCE_COL_SPACING*1.5f },
},
},
{ // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER];
@@ -398,6 +397,8 @@ StyleDef g_StyleDefs[NUM_STYLES] =
},
{ // STYLE_DANCE_SOLO
GAME_DANCE, // m_Game
true, // m_bUsedForGameplay
true, // m_bUsedForEdit
"dance-solo", // m_szName
NOTES_TYPE_DANCE_SOLO, // m_NotesType
StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType
@@ -425,6 +426,41 @@ StyleDef g_StyleDefs[NUM_STYLES] =
0,1,2,3,4,5
},
},
{ // STYLE_DANCE_DOUBLE
GAME_DANCE, // m_Game
false, // m_bUsedForGameplay
true, // m_bUsedForEdit
"dance-edit-couple", // m_szName
NOTES_TYPE_DANCE_COUPLE, // m_NotesType
StyleDef::ONE_PLAYER_TWO_CREDITS, // m_StyleType
{ 320, 320 }, // m_iCenterX
8, // m_iColsPerPlayer
{ // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER];
{ // PLAYER_1
{ TRACK_1, GAME_CONTROLLER_1, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*3.5f },
{ TRACK_2, GAME_CONTROLLER_1, DANCE_BUTTON_DOWN, -DANCE_COL_SPACING*2.5f },
{ TRACK_3, GAME_CONTROLLER_1, DANCE_BUTTON_UP, -DANCE_COL_SPACING*1.5f },
{ TRACK_4, GAME_CONTROLLER_1, DANCE_BUTTON_RIGHT, -DANCE_COL_SPACING*0.5f },
{ TRACK_5, GAME_CONTROLLER_2, DANCE_BUTTON_LEFT, +DANCE_COL_SPACING*0.5f },
{ TRACK_6, GAME_CONTROLLER_2, DANCE_BUTTON_DOWN, +DANCE_COL_SPACING*1.5f },
{ TRACK_7, GAME_CONTROLLER_2, DANCE_BUTTON_UP, +DANCE_COL_SPACING*2.5f },
{ TRACK_8, GAME_CONTROLLER_2, DANCE_BUTTON_RIGHT, +DANCE_COL_SPACING*3.5f },
},
{ // PLAYER_2
{ TRACK_1, GAME_CONTROLLER_1, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*3.5f },
{ TRACK_2, GAME_CONTROLLER_1, DANCE_BUTTON_DOWN, -DANCE_COL_SPACING*2.5f },
{ TRACK_3, GAME_CONTROLLER_1, DANCE_BUTTON_UP, -DANCE_COL_SPACING*1.5f },
{ TRACK_4, GAME_CONTROLLER_1, DANCE_BUTTON_RIGHT, -DANCE_COL_SPACING*0.5f },
{ TRACK_5, GAME_CONTROLLER_2, DANCE_BUTTON_LEFT, +DANCE_COL_SPACING*0.5f },
{ TRACK_6, GAME_CONTROLLER_2, DANCE_BUTTON_DOWN, +DANCE_COL_SPACING*1.5f },
{ TRACK_7, GAME_CONTROLLER_2, DANCE_BUTTON_UP, +DANCE_COL_SPACING*2.5f },
{ TRACK_8, GAME_CONTROLLER_2, DANCE_BUTTON_RIGHT, +DANCE_COL_SPACING*3.5f },
},
},
{ // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER];
0,1,2,3,4,5,6,7
},
},
/* { // STYLE_DANCE_SOLO_VERSUS
"dance-solo-versus", // m_szName
NOTES_TYPE_DANCE_SOLO, // m_NotesType
@@ -452,9 +488,11 @@ StyleDef g_StyleDefs[NUM_STYLES] =
{ // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER];
0,5,1,4,2,3 // outside in
},
},
*/ { // PUMP_STYLE_SINGLE
}, */
{ // PUMP_STYLE_SINGLE
GAME_PUMP, // m_Game
false, // m_bUsedForGameplay
false, // m_bUsedForEdit
"pump-single", // m_szName
NOTES_TYPE_PUMP_SINGLE, // m_NotesType
StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType
@@ -482,6 +520,8 @@ StyleDef g_StyleDefs[NUM_STYLES] =
},
{ // PUMP_STYLE_VERSUS
GAME_PUMP, // m_Game
false, // m_bUsedForGameplay
false, // m_bUsedForEdit
"pump-versus", // m_szName
NOTES_TYPE_PUMP_SINGLE, // m_NotesType
StyleDef::TWO_PLAYERS_TWO_CREDITS, // m_StyleType
@@ -509,6 +549,8 @@ StyleDef g_StyleDefs[NUM_STYLES] =
},
{ // PUMP_STYLE_DOUBLE
GAME_PUMP, // m_Game
false, // m_bUsedForGameplay
false, // m_bUsedForEdit
"pump-double", // m_szName
NOTES_TYPE_PUMP_DOUBLE, // m_NotesType
StyleDef::ONE_PLAYER_TWO_CREDITS, // m_StyleType
@@ -548,6 +590,8 @@ StyleDef g_StyleDefs[NUM_STYLES] =
{ // EZ2_STYLE_SINGLE
GAME_EZ2, // m_Game
false, // m_bUsedForGameplay
false, // m_bUsedForEdit
"ez2-single", // m_szName
NOTES_TYPE_EZ2_SINGLE, // m_NotesType
StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType
@@ -575,6 +619,8 @@ StyleDef g_StyleDefs[NUM_STYLES] =
},
{ // EZ2_STYLE_SINGLE_HARD
GAME_EZ2, // m_Game
false, // m_bUsedForGameplay
false, // m_bUsedForEdit
"ez2-single-hard", // m_szName
NOTES_TYPE_EZ2_SINGLE_HARD, // m_NotesType
StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType
@@ -602,6 +648,8 @@ StyleDef g_StyleDefs[NUM_STYLES] =
},
{ // EZ2_STYLE_DOUBLE
GAME_EZ2, // m_Game
false, // m_bUsedForGameplay
false, // m_bUsedForEdit
"ez2-double", // m_szName
NOTES_TYPE_EZ2_DOUBLE, // m_NotesType
StyleDef::ONE_PLAYER_TWO_CREDITS, // m_StyleType
@@ -639,6 +687,8 @@ StyleDef g_StyleDefs[NUM_STYLES] =
},
{ // EZ2_STYLE_REAL
GAME_EZ2, // m_Game
false, // m_bUsedForGameplay
false, // m_bUsedForEdit
"ez2-real", // m_szName
NOTES_TYPE_EZ2_REAL, // m_NotesType
StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType
@@ -670,6 +720,8 @@ StyleDef g_StyleDefs[NUM_STYLES] =
},
{ // EZ2_STYLE_SINGLE_VERSUS
GAME_EZ2, // m_Game
false, // m_bUsedForGameplay
false, // m_bUsedForEdit
"ez2-single-versus", // m_szName
NOTES_TYPE_EZ2_SINGLE, // m_NotesType
StyleDef::TWO_PLAYERS_TWO_CREDITS, // m_StyleType
@@ -697,6 +749,8 @@ StyleDef g_StyleDefs[NUM_STYLES] =
},
{ // EZ2_STYLE_SINGLE_VERSUS
GAME_EZ2, // m_Game
false, // m_bUsedForGameplay
false, // m_bUsedForEdit
"ez2-single-hard-versus", // m_szName
NOTES_TYPE_EZ2_SINGLE_HARD, // m_NotesType
StyleDef::TWO_PLAYERS_TWO_CREDITS, // m_StyleType
@@ -722,9 +776,10 @@ StyleDef g_StyleDefs[NUM_STYLES] =
2,0,4,1,3 // This should be from back to front: Down, UpLeft, UpRight, Upper Left Hand, Upper Right Hand
},
},
{ // EZ2_STYLE_REAL_VERSUS
GAME_EZ2, // m_Game
false, // m_bUsedForGameplay
false, // m_bUsedForEdit
"ez2-real-versus", // m_szName
NOTES_TYPE_EZ2_REAL, // m_NotesType
StyleDef::TWO_PLAYERS_TWO_CREDITS, // m_StyleType
@@ -774,19 +829,19 @@ StyleDef* GameManager::GetStyleDefForStyle( Style s )
return &g_StyleDefs[ s ];
}
Style GameManager::GetStyleThatPlaysNotesType( NotesType nt )
Style GameManager::GetEditStyleThatPlaysNotesType( NotesType nt )
{
for( int i=0; i<NUM_STYLES; i++ )
if( g_StyleDefs[i].m_NotesType == nt )
if( g_StyleDefs[i].m_NotesType == nt && g_StyleDefs[i].m_bUsedForEdit )
return (Style)i;
return STYLE_NONE;
}
void GameManager::GetStylesForGame( Game game, CArray<Style,Style>& aStylesAddTo )
void GameManager::GetGameplayStylesForGame( Game game, CArray<Style,Style>& aStylesAddTo )
{
for( int s=0; s<NUM_STYLES; s++ )
if( g_StyleDefs[s].m_Game == game )
if( g_StyleDefs[s].m_Game == game && g_StyleDefs[s].m_bUsedForGameplay )
aStylesAddTo.Add( (Style)s );
}
+3 -4
View File
@@ -24,10 +24,9 @@ public:
GameDef* GetGameDefForGame( Game g );
StyleDef* GetStyleDefForStyle( Style s );
Style GetStyleThatPlaysNotesType( NotesType nt );
void GetStylesForGame( Game game, CArray<Style,Style>& aStylesAddTo );
void GetNotesTypesForGame( Game game, CArray<NotesType,NotesType>& aNotesTypeAddTo );
void GetGameplayStylesForGame( Game game, CArray<Style,Style>& aStylesAddTo ); // do not include edit-specific
void GetNotesTypesForGame( Game game, CArray<NotesType,NotesType>& aNotesTypeAddTo ); // only look at edit-specific styles
Style GetEditStyleThatPlaysNotesType( NotesType nt );
// void GetGameNames( CStringArray &AddTo );
// bool DoesGameExist( CString sGameName );
+1 -1
View File
@@ -259,7 +259,7 @@ void NoteData::AddHoldNote( HoldNote add )
void NoteData::RemoveHoldNote( int iHoldIndex )
{
ASSERT( iHoldIndex > 0 && iHoldIndex < m_iNumHoldNotes );
ASSERT( iHoldIndex >= 0 && iHoldIndex < m_iNumHoldNotes );
HoldNote& hn = m_HoldNotes[iHoldIndex];
+4 -2
View File
@@ -194,8 +194,10 @@ void NoteField::DrawPrimitives()
//
// Draw measure bars
//
for( float b=fFirstBeatToDraw; b<=fLastBeatToDraw; b+=1 )
DrawMeasureBar( int(b) );
int iFirstMeasureToDraw = int(fFirstBeatToDraw)/BEATS_PER_MEASURE;
int iLastMeasureToDraw = (int(fLastBeatToDraw)/BEATS_PER_MEASURE)+1;
for( i=iFirstMeasureToDraw; i<=fLastBeatToDraw; i++ )
DrawMeasureBar( i );
//
// BPM text
+118
View File
@@ -585,6 +585,124 @@ void Notes::WriteSMNotesTag( FILE* fp )
fprintf( fp, "%s;\n", m_sSMNoteData );
}
struct DWICharLookup {
char c;
bool bCol[6];
};
char NotesToDWIChar( bool bCol1, bool bCol2, bool bCol3, bool bCol4, bool bCol5, bool bCol6 )
{
const DWICharLookup lookup[] = {
{ '0', 0, 0, 0, 0, 0, 0 },
{ '1', 0, 1, 1, 0, 0, 0 },
{ '2', 0, 0, 1, 0, 0, 0 },
{ '3', 0, 0, 1, 0, 1, 0 },
{ '4', 0, 1, 0, 0, 0, 0 },
{ '6', 0, 0, 0, 0, 1, 0 },
{ '7', 0, 1, 0, 1, 0, 0 },
{ '8', 0, 0, 0, 1, 0, 0 },
{ '9', 0, 0, 0, 1, 1, 0 },
{ 'A', 0, 0, 1, 1, 0, 0 },
{ 'B', 0, 1, 0, 0, 1, 0 },
{ 'C', 0, 1, 0, 0, 0, 0 },
{ 'D', 0, 0, 0, 0, 1, 0 },
{ 'E', 1, 1, 0, 0, 0, 0 },
{ 'F', 0, 1, 1, 0, 0, 0 },
{ 'G', 0, 1, 0, 1, 0, 0 },
{ 'H', 0, 1, 0, 0, 0, 1 },
{ 'I', 1, 0, 0, 0, 1, 0 },
{ 'J', 0, 0, 1, 0, 1, 0 },
{ 'K', 0, 0, 0, 1, 1, 0 },
{ 'L', 0, 0, 0, 0, 1, 1 },
{ 'M', 0, 1, 0, 0, 1, 0 },
};
const int iNumLookups = sizeof(lookup) / sizeof(DWICharLookup);
for( int i=0; i<iNumLookups; i++ )
{
const DWICharLookup& l = lookup[i];
if( l.bCol[0] && bCol1, l.bCol[1] && bCol2, l.bCol[2] && bCol3, l.bCol[3] && bCol4, l.bCol[4] && bCol5, l.bCol[5] && bCol6 )
return l.c;
}
ASSERT(0);
return '0';
}
char NotesToDWIChar( bool bCol1, bool bCol2, bool bCol3, bool bCol4 )
{
return NotesToDWIChar( 0, bCol1, bCol2, bCol3, bCol4, 0 );
}
CString NotesToDWIString( int iNoteCol1, int iNoteCol2, int iNoteCol3, int iNoteCol4, int iNoteCol5, int iNoteCol6 )
{
char cShow = NotesToDWIChar( iNoteCol1!=0, iNoteCol2!=0, iNoteCol3!=0, iNoteCol4!=0, iNoteCol5!=0, iNoteCol6!=0 );
char cHold = NotesToDWIChar( iNoteCol1==2, iNoteCol2==2, iNoteCol3==2, iNoteCol4==2, iNoteCol5==2, iNoteCol6==2 );
if( cHold != '0' )
return ssprintf( "%c!%c", cShow, cHold );
else
return cShow;
}
CString NotesToDWIString( int iNoteCol1, int iNoteCol2, int iNoteCol3, int iNoteCol4 )
{
return NotesToDWIString( 0, iNoteCol1, iNoteCol2, iNoteCol3, iNoteCol4, 0 );
}
void Notes::WriteDWINotesTag( FILE* fp )
{
switch( m_NotesType )
{
case NOTES_TYPE_DANCE_SINGLE: fprintf( fp, "#SINGLE:" ); break;
case NOTES_TYPE_DANCE_COUPLE: fprintf( fp, "#COUPLE:" ); break;
case NOTES_TYPE_DANCE_DOUBLE: fprintf( fp, "#DOUBLE:" ); break;
case NOTES_TYPE_DANCE_SOLO: fprintf( fp, "#SOLO:" ); break;
default: return; // not a type supported by DWI
}
switch( m_DifficultyClass )
{
case CLASS_EASY: fprintf( fp, "BASIC:" ); break;
case CLASS_MEDIUM: fprintf( fp, "ANOTHER:" ); break;
case CLASS_HARD: fprintf( fp, "MANIAC:" ); break;
default: ASSERT(0); return;
}
fprintf( fp, "%d:\n", m_iMeter );
NoteData notedata;
this->GetNoteData( &notedata );
notedata.ConvertHoldNotesTo2sAnd3s();
fprintf( fp, "<" ); // begin a 48th note series
for( int r=0; r<notedata.GetLastRow(); r++ )
{
switch( m_NotesType )
{
case NOTES_TYPE_DANCE_SINGLE:
case NOTES_TYPE_DANCE_COUPLE:
case NOTES_TYPE_DANCE_DOUBLE:
fprintf( fp, NotesToDWIString( notedata.m_TapNotes[0][r], notedata.m_TapNotes[1][r], notedata.m_TapNotes[2][r], notedata.m_TapNotes[3][r] ) );
break;
case NOTES_TYPE_DANCE_SOLO:
fprintf( fp, NotesToDWIString( notedata.m_TapNotes[0][r], notedata.m_TapNotes[1][r], notedata.m_TapNotes[2][r], notedata.m_TapNotes[3][r], notedata.m_TapNotes[4][r], notedata.m_TapNotes[5][r] ) );
break;
default: return; // not a type supported by DWI
}
}
fprintf( fp, "<" ); // end a 48th note series
if( m_NotesType == NOTES_TYPE_DANCE_COUPLE || m_NotesType == NOTES_TYPE_DANCE_DOUBLE )
{
fprintf( fp, ":" );
fprintf( fp, "<" ); // begin a 48th note series
for( int r=0; r<notedata.GetLastRow(); r++ )
fprintf( fp, NotesToDWIString( notedata.m_TapNotes[4][r], notedata.m_TapNotes[5][r], notedata.m_TapNotes[6][r], notedata.m_TapNotes[7][r] ) );
}
fprintf( fp, ">" ); // end series
}
void Notes::SetNoteData( NoteData* pNewNoteData )
{
ASSERT( pNewNoteData->m_iNumTracks == NotesTypeToNumTracks(m_NotesType) );
+1
View File
@@ -42,6 +42,7 @@ public:
CString sNoteDataOut
);
void WriteSMNotesTag( FILE* fp );
void WriteDWINotesTag( FILE* fp );
public:
NotesType m_NotesType;
+4 -6
View File
@@ -302,15 +302,12 @@ void Player::Step( int col )
int iCurrentIndexEarlier = iIndexStartLookingAt - delta;
int iCurrentIndexLater = iIndexStartLookingAt + delta;
// silly check to make sure we don't go out of bounds
iCurrentIndexEarlier = clamp( iCurrentIndexEarlier, 0, MAX_TAP_NOTE_ROWS-1 );
iCurrentIndexLater = clamp( iCurrentIndexLater, 0, MAX_TAP_NOTE_ROWS-1 );
////////////////////////////
// check the step to the left of iIndexStartLookingAt
////////////////////////////
//LOG->Trace( "Checking Notes[%d]", iCurrentIndexEarlier );
if( m_TapNotes[col][iCurrentIndexEarlier] != '0' && // there is a note here
if( iCurrentIndexEarlier >= 0 &&
m_TapNotes[col][iCurrentIndexEarlier] != '0' && // there is a note here
m_TapNoteScores[col][iCurrentIndexEarlier] == TNS_NONE ) // this note doesn't have a score
{
iIndexOverlappingNote = iCurrentIndexEarlier;
@@ -322,7 +319,8 @@ void Player::Step( int col )
// check the step to the right of iIndexStartLookingAt
////////////////////////////
//LOG->Trace( "Checking Notes[%d]", iCurrentIndexLater );
if( m_TapNotes[col][iCurrentIndexLater] != '0' && // there is a note here
if( iCurrentIndexLater >= 0 &&
m_TapNotes[col][iCurrentIndexLater] != '0' && // there is a note here
m_TapNoteScores[col][iCurrentIndexLater] == TNS_NONE ) // this note doesn't have a score
{
iIndexOverlappingNote = iCurrentIndexLater;
+5 -1
View File
@@ -22,9 +22,13 @@ PrefsManager* PREFSMAN = NULL; // global and accessable from anywhere in our pro
PrefsManager::PrefsManager()
{
#ifdef _DEBUG
m_bWindowed = true;
#else
m_bWindowed = false;
#endif
m_iDisplayResolution = 640;
m_iTextureResolution = 512;
m_iTextureResolution = 1024;
m_iRefreshRate = 0;
m_bIgnoreJoyAxes = false;
m_bOnlyDedicatedMenuButtons = false;
File diff suppressed because it is too large Load Diff
+12 -4
View File
@@ -22,6 +22,9 @@
#include "SnapDisplay.h"
const int NUM_MENU_ITEMS = 19;
class ScreenEdit : public Screen
{
public:
@@ -31,6 +34,7 @@ public:
virtual void DrawPrimitives();
virtual void Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI );
void InputEdit( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI );
void InputMenu( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI );
void InputRecord( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI );
void InputPlay( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI );
virtual void HandleScreenMessage( const ScreenMessage SM );
@@ -39,9 +43,10 @@ public:
protected:
void OnSnapModeChange();
void MenuItemGainFocus( int iItemIndex );
void MenuItemLoseFocus( int iItemIndex );
enum EditMode { MODE_EDITING, MODE_RECORDING, MODE_PLAYING };
enum EditMode { MODE_EDITING, MODE_MENU, MODE_RECORDING, MODE_PLAYING };
EditMode m_EditMode;
Song* m_pSong;
@@ -55,6 +60,7 @@ protected:
BitmapText m_textInfo; // status information that changes
BitmapText m_textHelp;
BitmapText m_textShortcuts;
// keep track of where we are and what we're doing
float m_fTrailingBeat; // this approaches GAMESTATE->m_fSongBeat, which is the actual beat
@@ -71,7 +77,6 @@ protected:
// for MODE_RECORD
Quad m_rectRecordBack;
NoteField m_NoteFieldRecord;
GrayArrowRow m_GrayArrowRowRecord;
@@ -81,8 +86,11 @@ protected:
// for MODE_RECORD and MODE_PLAY
Quad m_rectRecordBack;
RageSoundStream m_soundMusic;
bool m_bLayingAHold[MAX_NOTE_TRACKS];
int m_iMenuSelection;
BitmapText m_textMenu[NUM_MENU_ITEMS];
};
+2 -2
View File
@@ -179,7 +179,7 @@ void ScreenEditMenu::HandleScreenMessage( const ScreenMessage SM )
// Set the current Style, then let ScreenEdit infer the desired
// NotesType from that Style.
NotesType nt = GetSelectedNotesType();
Style style = GAMEMAN->GetStyleThatPlaysNotesType( nt );
Style style = GAMEMAN->GetEditStyleThatPlaysNotesType( nt );
GAMESTATE->m_CurStyle = style;
GAMESTATE->m_CurGame = GAMEMAN->GetStyleDefForStyle(style)->m_Game;
@@ -358,7 +358,7 @@ void ScreenEditMenu::MenuStart( const PlayerNumber p )
// find the first style that matches this notes type
GameDef* pGameDef = GAMESTATE->GetCurrentGameDef();
GAMESTATE->m_CurStyle = GAMEMAN->GetStyleThatPlaysNotesType( GetSelectedNotesType() );
GAMESTATE->m_CurStyle = GAMEMAN->GetEditStyleThatPlaysNotesType( GetSelectedNotesType() );
GAMESTATE->m_pCurNotes[PLAYER_1] = GetSelectedNotes();
m_soundSelect.PlayRandom();
+1 -1
View File
@@ -53,7 +53,7 @@ ScreenSelectStyle::ScreenSelectStyle()
GAMESTATE->m_CurStyle = STYLE_NONE;
GAMESTATE->m_bPlayersCanJoin = true;
GAMEMAN->GetStylesForGame( GAMESTATE->m_CurGame, m_aPossibleStyles );
GAMEMAN->GetGameplayStylesForGame( GAMESTATE->m_CurGame, m_aPossibleStyles );
m_iSelection = 0;
for( int i=0; i<m_aPossibleStyles.GetSize(); i++ )
+12 -4
View File
@@ -16,7 +16,6 @@
#include "ScreenMapInstruments.h"
#include "ScreenGraphicOptions.h"
#include "ScreenGameOptions.h"
#include "ScreenEdit.h"
#include "GameConstantsAndTypes.h"
#include "RageUtil.h"
#include "StepMania.h"
@@ -91,12 +90,21 @@ ScreenTitleMenu::ScreenTitleMenu()
}
if( !THEME->DoesThemeExist( THEME->GetCurThemeName() ) )
{
CStringArray asThemeNames;
THEME->GetThemeNamesForCurGame( asThemeNames );
THEME->SwitchTheme( asThemeNames[0] );
CString sGameName = GAMESTATE->GetCurrentGameDef()->m_szName;
if( THEME->DoesThemeExist( sGameName ) )
{
THEME->SwitchTheme( sGameName );
}
else
{
CStringArray asThemeNames;
THEME->GetThemeNamesForCurGame( asThemeNames );
THEME->SwitchTheme( asThemeNames[0] );
}
}
m_sprBG.Load( THEME->GetPathTo("Graphics","title menu background") );
m_sprBG.StretchTo( CRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT) );
this->AddSubActor( &m_sprBG );
+1 -1
View File
@@ -36,7 +36,7 @@ SnapDisplay::SnapDisplay()
m_iNumCols = 0;
}
void SnapDisplay::Load()
void SnapDisplay::Load( PlayerNumber pn )
{
m_iNumCols = GAMESTATE->GetCurrentStyleDef()->m_iColsPerPlayer;
+1 -1
View File
@@ -24,7 +24,7 @@ class SnapDisplay : public ActorFrame
public:
SnapDisplay();
void Load();
void Load( PlayerNumber pn );
bool PrevSnapMode();
bool NextSnapMode();
+49
View File
@@ -1315,6 +1315,55 @@ void Song::SaveToSMFile( CString sPath )
fclose( fp );
}
void Song::SaveToSMAndDWIFile()
{
LOG->Trace( "Song::SaveToSMAndDWIFile()" );
SaveToSMFile();
CString sPath = GetSongFilePath();
sPath.Replace( ".sm", ".dwi" );
FILE* fp = fopen( sPath, "w" );
if( fp == NULL )
throw RageException( "Error opening song file '%s' for writing.", sPath );
fprintf( fp, "#TITLE:%s;\n", GetFullTitle() );
fprintf( fp, "#ARTIST:%s;\n", m_sArtist );
ASSERT( m_BPMSegments[0].m_fStartBeat == 0 );
fprintf( fp, "#BPM:%.2f;\n", m_BPMSegments[0].m_fBPM );
fprintf( fp, "#GAP:%d;\n", -roundf( m_fBeat0OffsetInSeconds*1000 ) );
fprintf( fp, "#FREEZE:" );
for( int i=0; i<m_StopSegments.GetSize(); i++ )
{
StopSegment &fs = m_StopSegments[i];
fprintf( fp, "%.2f=%.2f", BeatToNoteRow( fs.m_fStartBeat ) / ELEMENTS_PER_BEAT * 4.0f, roundf(fs.m_fStopSeconds*1000) );
if( i != m_StopSegments.GetSize()-1 )
fprintf( fp, "," );
}
fprintf( fp, ";\n" );
fprintf( fp, "#CHANGEBPM:" );
for( i=1; i<m_BPMSegments.GetSize(); i++ )
{
BPMSegment &bs = m_BPMSegments[i];
fprintf( fp, "%.2f=%.2f", BeatToNoteRow( bs.m_fStartBeat ) / ELEMENTS_PER_BEAT * 4.0f, bs.m_fBPM );
if( i != m_BPMSegments.GetSize()-1 )
fprintf( fp, "," );
}
fprintf( fp, ";\n" );
//
// Save all Notes for this file
//
for( i=0; i<m_apNotes.GetSize(); i++ )
m_apNotes[i]->WriteDWINotesTag( fp );
fclose( fp );
}
Grade Song::GetGradeForDifficultyClass( NotesType nt, DifficultyClass dc )
{
CArray<Notes*, Notes*> aNotes;
+1
View File
@@ -17,6 +17,7 @@ enum Style
STYLE_DANCE_DOUBLE,
STYLE_DANCE_COUPLE,
STYLE_DANCE_SOLO,
STYLE_DANCE_EDIT_COUPLE,
STYLE_PUMP_SINGLE,
STYLE_PUMP_VERSUS,
STYLE_PUMP_DOUBLE,
+5 -3
View File
@@ -35,10 +35,12 @@ class GameDef;
class StyleDef
{
public:
Game m_Game; // Game this style is active under
Game m_Game; // Which Game is this Style used with?
bool m_bUsedForGameplay; // Can be used only for gameplay?
bool m_bUsedForEdit; // Can be used for editing?
char m_szName[60];
NotesType m_NotesType; // the notes format that this style reads.
// For example, the "dance versus" reads the Notes with the tag "dance-single".
NotesType m_NotesType; // the notes format that this style reads.
// For example, the "dance versus" reads the Notes with the tag "dance-single".
enum StyleType
{
ONE_PLAYER_ONE_CREDIT, // e.g. single
+1
View File
@@ -57,6 +57,7 @@ public:
void TidyUpData(); // call after loading to clean up invalid data
void SaveToSMFile( CString sPath = "" ); // no path means save to SongFilePath
void SaveToSMAndDWIFile(); // saves SM, then saves DWI so that the SM is the master copy and NoteTypes not supported by DWI are not lost
void SaveToCacheFile();
CString GetSongFilePath();