From 31aa613295717ce521bf39d42574536f2537a0d0 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sun, 9 Mar 2003 00:55:49 +0000 Subject: [PATCH] Cleanup of theme element names Renamed ScreenSelectMax* back to their old names Replaced all hard-coded transitions with TransitionBGAnimations --- .../BGAnimations/ScreenEditMenu in.redir | 1 + .../BGAnimations/ScreenEditMenu out.redir | 1 + .../ScreenMapControllers in.redir | 1 + .../ScreenMapControllers out.redir | 1 + .../ScreenPlayerOptions background.redir | 1 + .../BGAnimations/ScreenPlayerOptions in.redir | 1 + .../ScreenSelectDifficulty in.redir | 1 + .../ScreenSelectDifficulty out.redir | 1 + .../BGAnimations/ScreenSelectGame in.redir | 1 + .../BGAnimations/ScreenSelectGroup in.redir | 1 + .../BGAnimations/ScreenSelectGroup out.redir | 1 + .../BGAnimations/ScreenSelectMusic in.redir | 1 + .../BGAnimations/ScreenSelectMusic out.redir | 1 + .../BGAnimations/ScreenSelectStyle out.redir | 1 + .../BGAnimations/ScreenSongOptions in.redir | 1 + .../BGAnimations/ScreenSongOptions out.redir | 1 + .../default/Fonts/GroupList label.redir | 1 + .../default/Graphics/BPMDisplay label.png | Bin 0 -> 915 bytes .../Themes/default/Graphics/Banner abc.png | Bin 0 -> 36518 bytes .../default/Graphics/Banner roulette.png | Bin 0 -> 31130 bytes .../default/Graphics/EditMenu Left 1x4.png | Bin 0 -> 5598 bytes .../default/Graphics/EditMenu Right 1x4.png | Bin 0 -> 5532 bytes .../default/Graphics/GrooveRadar base.png | Bin 0 -> 26800 bytes .../Graphics/GrooveRadar labels 1x5.png | Bin 0 -> 14718 bytes .../Graphics/LifeMeterBar extra frame.png | Bin 0 -> 7472 bytes .../Graphics/LifeMeterBar extra normal.png | Bin 0 -> 2419 bytes .../default/Graphics/LifeMeterBar frame.png | Bin 0 -> 7472 bytes .../default/Graphics/LifeMeterBar hot.png | Bin 0 -> 2058 bytes .../default/Graphics/LifeMeterBar normal.png | Bin 0 -> 2135 bytes .../Graphics/LifeMeterBattery frame.png | Bin 0 -> 1843 bytes .../Graphics/LifeMeterBattery lives 1x4.png | Bin 0 -> 2025 bytes .../Graphics/MenuElements icon couple 2x1.png | Bin 0 -> 2360 bytes .../Graphics/MenuElements icon double 2x1.png | Bin 0 -> 2386 bytes .../Graphics/MenuElements icon single 2x1.png | Bin 0 -> 2329 bytes .../Graphics/MenuElements icon solo 2x1.png | Bin 0 -> 2482 bytes .../Graphics/MenuElements icon versus 2x1.png | Bin 0 -> 2360 bytes .../default/Graphics/MusicWheel highlight.png | Bin 0 -> 1212 bytes .../Graphics/MusicWheelItem section.png | Bin 0 -> 20997 bytes .../default/Graphics/MusicWheelItem song.png | Bin 0 -> 15523 bytes .../default/Graphics/NoteField bars 1x4.png | Bin 0 -> 969 bytes .../ScreenEvaluation judge labels 1x8.png | Bin 0 -> 3621 bytes .../Graphics/ScreenGameplay life frame.png | Bin 0 -> 9083 bytes .../Graphics/ScreenGameplay oni gameover.png | Bin 0 -> 7352 bytes .../Graphics/ScreenInstructions header.redir | 1 + .../default/Graphics/ScreenLogo ds3ddx.png | Bin 0 -> 58837 bytes .../default/Graphics/ScreenLogo ez2.png | Bin 0 -> 18585 bytes .../ScreenMapControllers header.redir | 1 + .../default/Graphics/ScreenOptions bullet.png | Bin 0 -> 669 bytes .../Graphics/ScreenPlayerOptions header.redir | 1 + .../Graphics/ScreenRanking bullets 1x5.png | Bin 0 -> 4035 bytes .../ScreenSelectCourse banner frame.png | Bin 0 -> 7188 bytes .../ScreenSelectCourse explanation.png | Bin 0 -> 6215 bytes .../ScreenSelectDifficulty cursor 2x1.png | Bin 0 -> 7832 bytes ...ScreenSelectDifficulty explanation 1x2.png | Bin 0 -> 3952 bytes .../ScreenSelectDifficulty more page1 1x4.png | Bin 0 -> 5539 bytes .../ScreenSelectDifficulty more page2 1x4.png | Bin 0 -> 5591 bytes .../ScreenSelectDifficulty ok 2x1.png | Bin 0 -> 4324 bytes .../ScreenSelectDifficulty shadow 2x1.png | Bin 0 -> 839 bytes .../Graphics/ScreenSelectGame header.redir | 1 + .../Graphics/ScreenSelectGroup contents.png | Bin 0 -> 2636 bytes .../ScreenSelectGroup explanation.png | Bin 0 -> 3234 bytes .../Graphics/ScreenSelectGroup frame.png | Bin 0 -> 16483 bytes .../Graphics/ScreenSelectGroup header.png | Bin 0 -> 6279 bytes .../ScreenSelectMusic fallback cdtitle.png | Bin 0 -> 7455 bytes .../ScreenSelectMusicEz2 difficulty frame.png | Bin 0 -> 778 bytes ...eenSelectMusicEz2 difficultyratingicon.png | Bin 0 -> 143 bytes .../ScreenSelectMusicEz2 infoframe.png | Bin 0 -> 143 bytes .../ScreenSelectMusicEz2 mirroricon.png | Bin 0 -> 1038 bytes .../ScreenSelectMusicEz2 shuffleicon.png | Bin 0 -> 1030 bytes .../ScreenSelectMusicEz2 speedicon.png | Bin 0 -> 1116 bytes .../Graphics/ScreenSelectPlayer header.png | Bin 0 -> 3845 bytes .../ScreenSelectStyle explanation.png | Bin 0 -> 1727 bytes .../Graphics/ScreenSelectStyle warning.png | Bin 0 -> 4667 bytes .../Graphics/ScreenSongOptions header.redir | 1 + .../default/Graphics/ScrollBar parts 1x3.png | Bin 0 -> 964 bytes .../default/Graphics/ScrollBar thumb.png | Bin 0 -> 172 bytes .../Graphics/WheelNotifyIcon icons 4x2.png | Bin 0 -> 6107 bytes .../default/Graphics/_shared footer.png | Bin 0 -> 6291 bytes .../default/Graphics/_shared menu header.png | Bin 0 -> 3640 bytes .../default/Sounds/ScreenCompany music.ogg | Bin 0 -> 64600 bytes .../default/Sounds/ScreenGameOver music.redir | 1 + .../Sounds/ScreenHowToPlay music.redir | 1 + .../Sounds/ScreenInstructions music.redir | 1 + .../Sounds/ScreenIntroMovie music.redir | 1 + .../Sounds/ScreenJukeboxMenu music.redir | 1 + .../Sounds/ScreenSelectDifficulty music.redir | 1 + .../Sounds/ScreenSelectGroup music.redir | 1 + .../Sounds/ScreenSelectMusic locked.redir | 1 + .../Sounds/ScreenSelectStyle music.redir | 1 + .../default/Sounds/ScreenUnlock music.redir | 1 + stepmania/Themes/default/metrics.ini | 195 ++++---- stepmania/src/Actor.cpp | 14 +- stepmania/src/BPMDisplay.cpp | 4 +- stepmania/src/Background.cpp | 2 +- stepmania/src/Banner.cpp | 22 +- stepmania/src/Banner.h | 1 + stepmania/src/BannerWithFrame.cpp | 2 +- stepmania/src/Combo.cpp | 6 +- stepmania/src/CourseContentsList.h | 2 +- stepmania/src/CourseEntryDisplay.h | 2 +- .../{FootMeter.cpp => DifficultyMeter.cpp} | 20 +- .../src/{FootMeter.h => DifficultyMeter.h} | 16 +- stepmania/src/EditMenu.cpp | 6 +- stepmania/src/EditMenu.h | 6 +- stepmania/src/GameState.cpp | 6 +- stepmania/src/GameState.h | 2 +- stepmania/src/GradeDisplay.cpp | 2 +- stepmania/src/GrooveRadar.cpp | 4 +- stepmania/src/GroupList.cpp | 4 +- stepmania/src/HoldJudgment.cpp | 73 ++- stepmania/src/HoldJudgment.h | 6 +- stepmania/src/Judgment.cpp | 130 ++--- stepmania/src/Judgment.h | 7 +- stepmania/src/JukeboxMenu.h | 1 - stepmania/src/LifeMeterBar.cpp | 6 +- stepmania/src/LifeMeterBattery.cpp | 23 +- stepmania/src/MenuElements.cpp | 321 +++--------- stepmania/src/MenuElements.h | 44 +- stepmania/src/MenuTimer.cpp | 13 +- stepmania/src/MusicSortDisplay.cpp | 2 +- stepmania/src/MusicWheel.cpp | 12 +- stepmania/src/MusicWheel.h | 2 +- stepmania/src/MusicWheelItem.cpp | 20 +- stepmania/src/MusicWheelItem.h | 6 +- stepmania/src/NoteField.cpp | 2 +- stepmania/src/OptionIcon.cpp | 4 +- stepmania/src/OptionsCursor.cpp | 2 +- stepmania/src/Player.cpp | 6 +- stepmania/src/ScoreDisplayNormal.cpp | 2 +- stepmania/src/Screen.cpp | 12 +- stepmania/src/ScreenAlbums.h | 2 +- stepmania/src/ScreenAppearanceOptions.cpp | 12 +- stepmania/src/ScreenAttract.cpp | 84 ++-- stepmania/src/ScreenAttract.h | 16 +- stepmania/src/ScreenCaution.cpp | 14 +- stepmania/src/ScreenCompany.h | 2 +- stepmania/src/ScreenDemonstration.cpp | 156 +----- stepmania/src/ScreenDemonstration.h | 10 +- stepmania/src/ScreenEdit.cpp | 15 +- stepmania/src/ScreenEdit.h | 1 - stepmania/src/ScreenEditMenu.cpp | 33 +- stepmania/src/ScreenEditMenu.h | 9 +- stepmania/src/ScreenEvaluation.cpp | 37 +- stepmania/src/ScreenEz2SelectMusic.cpp | 52 +- stepmania/src/ScreenEz2SelectMusic.h | 4 +- stepmania/src/ScreenEz2SelectPlayer.cpp | 33 +- stepmania/src/ScreenGameOver.cpp | 4 +- stepmania/src/ScreenGameplay.cpp | 469 +++++++----------- stepmania/src/ScreenGameplay.h | 28 +- stepmania/src/ScreenGameplayOptions.cpp | 10 +- stepmania/src/ScreenGraphicOptions.cpp | 10 +- stepmania/src/ScreenHowToPlay.h | 2 +- stepmania/src/ScreenInputOptions.cpp | 10 +- stepmania/src/ScreenInstructions.cpp | 63 +-- stepmania/src/ScreenIntroMovie.h | 2 +- stepmania/src/ScreenJukebox.cpp | 24 +- stepmania/src/ScreenJukebox.h | 9 +- stepmania/src/ScreenJukeboxMenu.cpp | 26 +- stepmania/src/ScreenJukeboxMenu.h | 9 +- stepmania/src/ScreenLogo.cpp | 36 +- stepmania/src/ScreenMachineOptions.cpp | 10 +- stepmania/src/ScreenManager.cpp | 40 +- stepmania/src/ScreenMapControllers.cpp | 12 +- stepmania/src/ScreenMemoryCard.h | 2 +- stepmania/src/ScreenMiniMenu.cpp | 2 +- stepmania/src/ScreenMusicScroll.cpp | 2 +- stepmania/src/ScreenNameEntry.cpp | 6 +- stepmania/src/ScreenOptions.cpp | 36 +- stepmania/src/ScreenOptions.h | 2 +- stepmania/src/ScreenOptionsMenu.cpp | 12 +- stepmania/src/ScreenPlayerOptions.cpp | 6 +- stepmania/src/ScreenPrompt.cpp | 6 +- stepmania/src/ScreenRanking.cpp | 16 +- stepmania/src/ScreenSelect.cpp | 284 ++++------- stepmania/src/ScreenSelect.h | 2 - stepmania/src/ScreenSelectCourse.cpp | 40 +- ...axType2.cpp => ScreenSelectDifficulty.cpp} | 131 +++-- ...ectMaxType2.h => ScreenSelectDifficulty.h} | 12 +- stepmania/src/ScreenSelectDifficultyEX.cpp | 52 +- stepmania/src/ScreenSelectGame.cpp | 20 +- stepmania/src/ScreenSelectGroup.cpp | 60 +-- stepmania/src/ScreenSelectMode.cpp | 36 +- stepmania/src/ScreenSelectMusic.cpp | 69 ++- stepmania/src/ScreenSelectMusic.h | 4 +- ...lectMaxType1.cpp => ScreenSelectStyle.cpp} | 118 +++-- ...enSelectMaxType1.h => ScreenSelectStyle.h} | 13 +- stepmania/src/ScreenSelectStyle5th.cpp | 25 +- stepmania/src/ScreenSongOptions.cpp | 6 +- stepmania/src/ScreenSoundOptions.cpp | 8 +- stepmania/src/ScreenStage.cpp | 18 +- stepmania/src/ScreenTextEntry.cpp | 2 +- stepmania/src/ScreenTitleMenu.cpp | 246 +++++---- stepmania/src/ScreenTitleMenu.h | 15 +- stepmania/src/ScreenUnlock.h | 2 +- stepmania/src/ScreenWarning.h | 2 +- stepmania/src/ScrollBar.cpp | 10 +- stepmania/src/SmallGradeDisplay.cpp | 2 +- stepmania/src/SnapDisplay.cpp | 2 +- stepmania/src/StepMania.cpp | 50 +- stepmania/src/StepMania.dsp | 80 +-- stepmania/src/StepMania.vcproj | 24 +- stepmania/src/Style.h | 24 - stepmania/src/ThemeManager.cpp | 6 +- stepmania/src/TransitionBGAnimation.cpp | 7 + stepmania/src/TransitionBGAnimation.h | 5 +- ...cStatusDisplay.cpp => WheelNotifyIcon.cpp} | 14 +- ...MusicStatusDisplay.h => WheelNotifyIcon.h} | 10 +- 207 files changed, 1529 insertions(+), 2246 deletions(-) create mode 100644 stepmania/Themes/default/BGAnimations/ScreenEditMenu in.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenEditMenu out.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenMapControllers in.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenMapControllers out.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenPlayerOptions background.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenPlayerOptions in.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenSelectDifficulty in.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenSelectDifficulty out.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenSelectGame in.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenSelectGroup in.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenSelectGroup out.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenSelectMusic in.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenSelectMusic out.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenSelectStyle out.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenSongOptions in.redir create mode 100644 stepmania/Themes/default/BGAnimations/ScreenSongOptions out.redir create mode 100644 stepmania/Themes/default/Fonts/GroupList label.redir create mode 100644 stepmania/Themes/default/Graphics/BPMDisplay label.png create mode 100644 stepmania/Themes/default/Graphics/Banner abc.png create mode 100644 stepmania/Themes/default/Graphics/Banner roulette.png create mode 100644 stepmania/Themes/default/Graphics/EditMenu Left 1x4.png create mode 100644 stepmania/Themes/default/Graphics/EditMenu Right 1x4.png create mode 100644 stepmania/Themes/default/Graphics/GrooveRadar base.png create mode 100644 stepmania/Themes/default/Graphics/GrooveRadar labels 1x5.png create mode 100644 stepmania/Themes/default/Graphics/LifeMeterBar extra frame.png create mode 100644 stepmania/Themes/default/Graphics/LifeMeterBar extra normal.png create mode 100644 stepmania/Themes/default/Graphics/LifeMeterBar frame.png create mode 100644 stepmania/Themes/default/Graphics/LifeMeterBar hot.png create mode 100644 stepmania/Themes/default/Graphics/LifeMeterBar normal.png create mode 100644 stepmania/Themes/default/Graphics/LifeMeterBattery frame.png create mode 100644 stepmania/Themes/default/Graphics/LifeMeterBattery lives 1x4.png create mode 100644 stepmania/Themes/default/Graphics/MenuElements icon couple 2x1.png create mode 100644 stepmania/Themes/default/Graphics/MenuElements icon double 2x1.png create mode 100644 stepmania/Themes/default/Graphics/MenuElements icon single 2x1.png create mode 100644 stepmania/Themes/default/Graphics/MenuElements icon solo 2x1.png create mode 100644 stepmania/Themes/default/Graphics/MenuElements icon versus 2x1.png create mode 100644 stepmania/Themes/default/Graphics/MusicWheel highlight.png create mode 100644 stepmania/Themes/default/Graphics/MusicWheelItem section.png create mode 100644 stepmania/Themes/default/Graphics/MusicWheelItem song.png create mode 100644 stepmania/Themes/default/Graphics/NoteField bars 1x4.png create mode 100644 stepmania/Themes/default/Graphics/ScreenEvaluation judge labels 1x8.png create mode 100644 stepmania/Themes/default/Graphics/ScreenGameplay life frame.png create mode 100644 stepmania/Themes/default/Graphics/ScreenGameplay oni gameover.png create mode 100644 stepmania/Themes/default/Graphics/ScreenInstructions header.redir create mode 100644 stepmania/Themes/default/Graphics/ScreenLogo ds3ddx.png create mode 100644 stepmania/Themes/default/Graphics/ScreenLogo ez2.png create mode 100644 stepmania/Themes/default/Graphics/ScreenMapControllers header.redir create mode 100644 stepmania/Themes/default/Graphics/ScreenOptions bullet.png create mode 100644 stepmania/Themes/default/Graphics/ScreenPlayerOptions header.redir create mode 100644 stepmania/Themes/default/Graphics/ScreenRanking bullets 1x5.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectCourse banner frame.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectCourse explanation.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectDifficulty cursor 2x1.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectDifficulty explanation 1x2.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectDifficulty more page1 1x4.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectDifficulty more page2 1x4.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectDifficulty ok 2x1.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectDifficulty shadow 2x1.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectGame header.redir create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectGroup contents.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectGroup explanation.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectGroup frame.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectGroup header.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectMusic fallback cdtitle.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectMusicEz2 difficulty frame.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectMusicEz2 difficultyratingicon.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectMusicEz2 infoframe.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectMusicEz2 mirroricon.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectMusicEz2 shuffleicon.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectMusicEz2 speedicon.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectPlayer header.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectStyle explanation.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectStyle warning.png create mode 100644 stepmania/Themes/default/Graphics/ScreenSongOptions header.redir create mode 100644 stepmania/Themes/default/Graphics/ScrollBar parts 1x3.png create mode 100644 stepmania/Themes/default/Graphics/ScrollBar thumb.png create mode 100644 stepmania/Themes/default/Graphics/WheelNotifyIcon icons 4x2.png create mode 100644 stepmania/Themes/default/Graphics/_shared footer.png create mode 100644 stepmania/Themes/default/Graphics/_shared menu header.png create mode 100644 stepmania/Themes/default/Sounds/ScreenCompany music.ogg create mode 100644 stepmania/Themes/default/Sounds/ScreenGameOver music.redir create mode 100644 stepmania/Themes/default/Sounds/ScreenHowToPlay music.redir create mode 100644 stepmania/Themes/default/Sounds/ScreenInstructions music.redir create mode 100644 stepmania/Themes/default/Sounds/ScreenIntroMovie music.redir create mode 100644 stepmania/Themes/default/Sounds/ScreenJukeboxMenu music.redir create mode 100644 stepmania/Themes/default/Sounds/ScreenSelectDifficulty music.redir create mode 100644 stepmania/Themes/default/Sounds/ScreenSelectGroup music.redir create mode 100644 stepmania/Themes/default/Sounds/ScreenSelectMusic locked.redir create mode 100644 stepmania/Themes/default/Sounds/ScreenSelectStyle music.redir create mode 100644 stepmania/Themes/default/Sounds/ScreenUnlock music.redir rename stepmania/src/{FootMeter.cpp => DifficultyMeter.cpp} (77%) rename stepmania/src/{FootMeter.h => DifficultyMeter.h} (66%) rename stepmania/src/{ScreenSelectMaxType2.cpp => ScreenSelectDifficulty.cpp} (69%) rename stepmania/src/{ScreenSelectMaxType2.h => ScreenSelectDifficulty.h} (88%) rename stepmania/src/{ScreenSelectMaxType1.cpp => ScreenSelectStyle.cpp} (59%) rename stepmania/src/{ScreenSelectMaxType1.h => ScreenSelectStyle.h} (83%) rename stepmania/src/{MusicStatusDisplay.cpp => WheelNotifyIcon.cpp} (85%) rename stepmania/src/{MusicStatusDisplay.h => WheelNotifyIcon.h} (84%) diff --git a/stepmania/Themes/default/BGAnimations/ScreenEditMenu in.redir b/stepmania/Themes/default/BGAnimations/ScreenEditMenu in.redir new file mode 100644 index 0000000000..3c553c7cd9 --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenEditMenu in.redir @@ -0,0 +1 @@ +_fade in with sound \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenEditMenu out.redir b/stepmania/Themes/default/BGAnimations/ScreenEditMenu out.redir new file mode 100644 index 0000000000..5ffda2b1ba --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenEditMenu out.redir @@ -0,0 +1 @@ +_fade out with sound \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenMapControllers in.redir b/stepmania/Themes/default/BGAnimations/ScreenMapControllers in.redir new file mode 100644 index 0000000000..0f6547301b --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenMapControllers in.redir @@ -0,0 +1 @@ +_options to options \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenMapControllers out.redir b/stepmania/Themes/default/BGAnimations/ScreenMapControllers out.redir new file mode 100644 index 0000000000..0f6547301b --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenMapControllers out.redir @@ -0,0 +1 @@ +_options to options \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenPlayerOptions background.redir b/stepmania/Themes/default/BGAnimations/ScreenPlayerOptions background.redir new file mode 100644 index 0000000000..76edcea756 --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenPlayerOptions background.redir @@ -0,0 +1 @@ +_shared background \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenPlayerOptions in.redir b/stepmania/Themes/default/BGAnimations/ScreenPlayerOptions in.redir new file mode 100644 index 0000000000..d2902773d0 --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenPlayerOptions in.redir @@ -0,0 +1 @@ +_fade in \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenSelectDifficulty in.redir b/stepmania/Themes/default/BGAnimations/ScreenSelectDifficulty in.redir new file mode 100644 index 0000000000..20f5042bcb --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenSelectDifficulty in.redir @@ -0,0 +1 @@ +_menu in \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenSelectDifficulty out.redir b/stepmania/Themes/default/BGAnimations/ScreenSelectDifficulty out.redir new file mode 100644 index 0000000000..dbd8790a88 --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenSelectDifficulty out.redir @@ -0,0 +1 @@ +_menu out \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenSelectGame in.redir b/stepmania/Themes/default/BGAnimations/ScreenSelectGame in.redir new file mode 100644 index 0000000000..d2902773d0 --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenSelectGame in.redir @@ -0,0 +1 @@ +_fade in \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenSelectGroup in.redir b/stepmania/Themes/default/BGAnimations/ScreenSelectGroup in.redir new file mode 100644 index 0000000000..20f5042bcb --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenSelectGroup in.redir @@ -0,0 +1 @@ +_menu in \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenSelectGroup out.redir b/stepmania/Themes/default/BGAnimations/ScreenSelectGroup out.redir new file mode 100644 index 0000000000..dbd8790a88 --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenSelectGroup out.redir @@ -0,0 +1 @@ +_menu out \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenSelectMusic in.redir b/stepmania/Themes/default/BGAnimations/ScreenSelectMusic in.redir new file mode 100644 index 0000000000..20f5042bcb --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenSelectMusic in.redir @@ -0,0 +1 @@ +_menu in \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenSelectMusic out.redir b/stepmania/Themes/default/BGAnimations/ScreenSelectMusic out.redir new file mode 100644 index 0000000000..b8a32d0947 --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenSelectMusic out.redir @@ -0,0 +1 @@ +_fade out \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenSelectStyle out.redir b/stepmania/Themes/default/BGAnimations/ScreenSelectStyle out.redir new file mode 100644 index 0000000000..dbd8790a88 --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenSelectStyle out.redir @@ -0,0 +1 @@ +_menu out \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenSongOptions in.redir b/stepmania/Themes/default/BGAnimations/ScreenSongOptions in.redir new file mode 100644 index 0000000000..d2902773d0 --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenSongOptions in.redir @@ -0,0 +1 @@ +_fade in \ No newline at end of file diff --git a/stepmania/Themes/default/BGAnimations/ScreenSongOptions out.redir b/stepmania/Themes/default/BGAnimations/ScreenSongOptions out.redir new file mode 100644 index 0000000000..b8a32d0947 --- /dev/null +++ b/stepmania/Themes/default/BGAnimations/ScreenSongOptions out.redir @@ -0,0 +1 @@ +_fade out \ No newline at end of file diff --git a/stepmania/Themes/default/Fonts/GroupList label.redir b/stepmania/Themes/default/Fonts/GroupList label.redir new file mode 100644 index 0000000000..31dcc35bf5 --- /dev/null +++ b/stepmania/Themes/default/Fonts/GroupList label.redir @@ -0,0 +1 @@ +normal diff --git a/stepmania/Themes/default/Graphics/BPMDisplay label.png b/stepmania/Themes/default/Graphics/BPMDisplay label.png new file mode 100644 index 0000000000000000000000000000000000000000..1d26f388767563c171831e4ade52d689c00e7769 GIT binary patch literal 915 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�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 literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/EditMenu Left 1x4.png b/stepmania/Themes/default/Graphics/EditMenu Left 1x4.png new file mode 100644 index 0000000000000000000000000000000000000000..493d7d60832af4b2068fd5c827dfbc86a1c75257 GIT binary patch literal 5598 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 E0V~`h{{R30 literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/EditMenu Right 1x4.png b/stepmania/Themes/default/Graphics/EditMenu Right 1x4.png new file mode 100644 index 0000000000000000000000000000000000000000..0d853e1b53a5a4f4f4e16a0a55728fc2eee8d832 GIT binary patch literal 5532 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 literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/GrooveRadar labels 1x5.png b/stepmania/Themes/default/Graphics/GrooveRadar labels 1x5.png new file mode 100644 index 0000000000000000000000000000000000000000..b8a27b467ae1a0536393fccf7eb36c70fe3385b8 GIT binary patch literal 14718 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 E7g5I5GXMYp literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/LifeMeterBar extra frame.png b/stepmania/Themes/default/Graphics/LifeMeterBar extra frame.png new file mode 100644 index 0000000000000000000000000000000000000000..13e66069b48f7290b22a9e275a69849992fc43e7 GIT binary patch literal 7472 zcmV-09na#4P)004R=004l4008;_004mK004C`008P>0026d000+nm#LZ50011j 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 literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/LifeMeterBar frame.png b/stepmania/Themes/default/Graphics/LifeMeterBar frame.png new file mode 100644 index 0000000000000000000000000000000000000000..13e66069b48f7290b22a9e275a69849992fc43e7 GIT binary patch literal 7472 zcmV-09na#4P)004R=004l4008;_004mK004C`008P>0026d000+nm#LZ50011j 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 VXD+%zZh1lpnQ7UnM^eO!{{pE{zy<&S literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/LifeMeterBar normal.png b/stepmania/Themes/default/Graphics/LifeMeterBar normal.png new file mode 100644 index 0000000000000000000000000000000000000000..ac8ed3801a740056b1fdcd3dd4ff074d2cfffe97 GIT binary patch literal 2135 zcmV-d2&ngoP)004R=004l4008;_004mK004C`008P>0026d000+nm#LZ5000N# zNklhiEfAIAI@xg-+ zKjUXU_{@I~9z1;T;DZkzJpACniw7S(eDUDH%LfnM`TF4Di6ibUwrxC z!FZiV;L9%_j$^-g@$x&*{o>_=FTP`4yt&?7^UD_x#&Peur+2J}xNg4BXX>x>i5Yv5 z`|#lh4+!Fezxw*SE0GWZK@e%5V}3qf0YE}}rTj$@I8Iup%idwW699tiEMiEad`r!P)-kr2#{Dy{sqq=Nr^0;>AjN+K$D6rf^V^KgwV%GR zFr&(juN%CK9>0^jkGl{|6TI-d? zRU9}o87(nzelotLi!%VoOo1gRn#a@9ry^5E(w;vF7AdlbR!Oy<9fXKJJ1*)^IhHH< z840`GBQrb6uJ4Wx9DgUAKaJPA2nZA ztuq6m8mM4{;sOzu#q4k=icD`2UGq-GI#hKqAW94qiU_xsfUyG%L$~@(k4#!6j9RGy z#0tLZ`>b@X;cy+WX+LrMY$g<@JB;fd%&Jk!U^TotnG9bbO9vwW>VhmDeOn1Y)_wY> z(^9sqsLQ}wL@5&?7T4*N0SO`p$nqGMqqmi|rJ6Cq;4H@zJxO!Fv}G?OzOZ|$z$I`9 z*6W=mU`8e*?b7PCM-3W-nk*r+hLutEsI!_s4G+mmfHJEXeG^B?pqyoJmM9i{BF8Rl zm1M&J6%VRGkDmYdKXAc6ECCj8s@Rad^m#pGya-O89dJ`>n8EY`cQ)+woC`Es0$OII zt=FPfP9xQ9eaI1F!x__=SRa|XxCAUPXs)h8&JQ`&>65U`qXy%9yp-soSPr)EbYIE@00*^@V+&m&QTR3SN6M@(; zfbWahA|h4ns$N<_ohf$yPpu9QSGPx1nB>lA00VVXqhLgFml_QA3r$8YO(on-12ck) zoNt_5RWVzenQ|=Yn!YM>Hr0^R8OVymVCr6?bEfYY{z%cPbs+7nEXq#-Oe<;Dt{6Il z<3d_D@>&{5EtT%*?rhA-3S=*-Uai$@t)~oCeJNM9HZat9z^|)W$&!jQEa8az*~L|+ zdKeBZt2+emrGbi6S!BGd!)jGeRD4E2Y zJ5CZu>SuAbO{HY-KWwNbGX*bZ0p8n>6qwC_{X&jrWa6OA7UtlsWH0Bb1C&%z&XHX# znl;&K)*5PI=Zrk)`0Ur=p+}Ksf@;wj zyQ&~lQhXA-Y*!mQUu=RIx!eKfE(NQhAhe7}(Dip=7DeJv!vN-N)hD?rj2D&wngqke zq7##Q{oDKVl4Ss^&AXDAV_&{@0S-iy<~ABphBy8zHPfhMh&%cv1)rqhYf@)UtH~+Ly(aB>|c&_RUW>B#)By1B$P$+X-6rQ$q)$>H8wiw7|7>gD#p;g z89)V*qi5q%|7i8N4_@|`3%B85M2F2tR+%3tXpH;K_+aWT`lha+J{>ek%`amTUFa|t z#5#L$9R^?->m1XzaM~+la5g_E2X{D(aLIs}QL6xfDv}b8UgagBD2g0IB1=wWWeIE= zHFuxt%1&u3&k=cQy6er&AP3koVa7?=Np~+NB124lDkSHAj#JvIl1o`XlTFSlXc||h z^3^V-&lA?7@C)RtGZ2nxDDhMm`<$%8c){-!*T<07~ar62->A+ z+OP>-#XGPKp9Ai#-ts3a+fYkmqUO?^C4l!z!Az9w(f5;ERh4cvO9GbhKo}h;D%C~( zA^?ShR~c4jSsq!!VUE!=oejHC2koCI^NyMzP}lxlK=5+5<`22g`g=Xl*3WH!;CV`$ zS~WcDHp?84&llDi^j*B&6u~*ATuOwEdKcHB17Ngf7*HmZZf*xdF&5sE@No=l7fp(? z)_VHfHWX#3la3)fwm8-H(htx+6;iv+8&#|tQaT||36B03%YQ!+^e=xU#cy$f*(v}4 N002ovPDHLkV1ju4^8x?> literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/LifeMeterBattery frame.png b/stepmania/Themes/default/Graphics/LifeMeterBattery frame.png new file mode 100644 index 0000000000000000000000000000000000000000..92525ad0d30c0f67402904030efd4dad582a9c7c GIT binary patch literal 1843 zcmV-32h8}1P)i6MkFq&z^mkqBks!Ce8lFGaGsk4++% zLa2~%1*sB&Km-ir+JHh(zytpP|AOb6onvPwJ)2z&KP>f9^{Ln0)7_PR^ZGkIyW2Bh z&AvD{&fV&?1wnk7#~kUnMq8Slh%cpdNvqTD_BidOKBO{RaZ9>gIwnzSLW#$z)zR=c z6R2-T+0E2MGs-*S(72K2Ltjo*P+0}luh6ya(Ep9Jz$o?HM(CJk4Jhp#WHsDI+5$kw zOBIaml=6fUIv>S!K0?5*ri)tAZH3M0#^W|Bk1J|Um#mbR(_-TE6gFj8O^7R$j>}jJ zsH~tdBhIw0KQ@T~|AUG&9w`RB%2nK4i_44!MTPT@Z)6< zoFiCh7>4N*MlRk`vElOH)-#R2K|P6$Bsv#pRde=AD+>+7FkQ!h3CZot>mS5^-+0F> zHqx!s`G%V;Gz`OZEdyVFt7R>T&Dkarn-*DY07k4u7`0KyCNZN4=*N!il%8V$N#*Px zrZb{@BaB&s;P@ILem6qm9@(mSeYstiHme^@-X3CG)lS-uFr4(G?{tia97z9vgf@=; z;~aNg4S!kdmCtMd5_ch_6x&HIIUVx_!cz{kL_Fyg8fi=$u0DvBS2T7Knxt$2E(Kj4p5R~zMrcI-W1(RJ zVTnW-mV_{kRtRaX@L+n5KTf*qN!*6eZz_pRZ|}Gg^Uf@(ZT_8-Z_~ZjtbBx-3bPbu z7AUC43V1~mtk8)3$3nvdqE}yp8CeL6ix5663f`*eP}`aH6H=Q(ghhq2Rm(Do8M`pD zSFCqjL#KaUUEKJm4PaR=!pc$~tK2eDdWGA^N;glIV1-8HKlUACMpQQhYbrt(P123! z;lrjf#Y$8tme@w=q_x`k)?NK47GP%yf@>c_jsZ~_bmyQ5MrcI-W1(Tpcy=&N*c}L^ z2N2u`LbGZ*)OKe5gxaQfzhYG=Uw#l_XQ4K}rF9QTXbyaXaP+W`Die-XQllsiieQ9B zWvLGy*gK+IALSxP2g(NtBLZdC46lzU4Udi7& z1$*lx@*fKgqbGtc+M`AylocXW)5X5}&_h}^eW;823BlGJ*0nWoqSA2dq<)A~V!&9o zkM1Ei>>w5H!9miQ(1`rULcllD;UeO z+z6|w@w5e`#w<1gg+}B*78*v+pdkoLcOtBDhcTt334(Gd{>Nk*zTTc!fMQ5g<`(#v zlSeimVS$S}Nkxd}iDN1>BLA__Fe;Hz2)2bZr)WOSDF|O?=gVm0pqQUugkaCY$mkcn zV;vm#LB0Hgy%Z7-i8mFryt>I!&1aL%mg`LU3Ssm@zulUQep98ue=IbNN?%&dIJWv? zBV5sI##D;+RATaGjOsa_#u@1yYuwHwtK}^S!ET;%?D5ZArAJ3(@@F<8p%M9yg@*C2 zW}*?sEeWrUlL0qXDi>8LJ$5~I>*YX;#rMNr-=<2blAaVpUc=>|PbLz+L>Tct|65*yZk_#NjrSJCRsW@ZZmr8PuwckmFmS%evpj=NG~)Z|FO_8(S7K`Jdfgm z;$!kIIWGRMRnuM7PbhZy8if8C7}4!TWw*9P8|%>bRvqzw@D&FD!!TV)zgHc1J3h*j z9m6n87xBFF<5T=_a)x0Z8ETFI|lVHoC-FvR)MnFY1CQUbm}&g!}}n_r2`uf*k7 h;_@qTALT1?{{wy|0AToxvH<`9002ovPDHLkV1jF9W{v;= literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/LifeMeterBattery lives 1x4.png b/stepmania/Themes/default/Graphics/LifeMeterBattery lives 1x4.png new file mode 100644 index 0000000000000000000000000000000000000000..cf7a1ec56fe4bc551e3fc10dc98235ebdef16f79 GIT binary patch literal 2025 zcmV004R=004l4008;_004mK004C`008P>0026d000+nm#LZ5000Mc zNkl}C|(3h5vZKR=0SkQC%q+no&?@= zubJ?k1q3*_<8KUrF%SWv+>c}&3NWEuZ@j-4f7js%KIiULFm@j@Ls@uN7V9f!1i}=1 z-Ie!ko&#t+>E#Kz;$AcU{?L$d0*t<5i3P#3Vok2woNoTc{0V@F$8fm3KSXt+!Xc8K zw?Npiv8?FJ{TcydUIu8adiOKn-|j`To_;_kvOr(ygANm4F{dwM4_M=5^NhJ9f8`Ns zc&W)U+a5Y30?8g4lu%`vu7K0$1IGLWpmEImEbw>tf|;Zr5X}rQk6iYXs?0IFryR37KJNo%jsP`a5m*40fHJTw&&x7afs%Z#3>4*l0Vt7omy7{u zyxXes1SNN=?(Kz!+%3oKS$qz2P`FtIDuAOFT9|TQma!nu9JvkzNPsGZI|buzJ7z^f zPGV%Y?~`4w$XHWjQLY_%UsmkUApV!H12oRH=2+RALhx=nX0PE;V_A09hJyw}1LVka z%a)?NE6I74f70Vu0F)`Y_4?%Q0dnV#*$M+r#QLzP0H`T&%1S?~Dts#HEXkZc=Bw@( z%zEQo%W)sC2YV{2Gjq(&#*W!(YQhX7i?nQ5R3TAOU^ue)iqeguY~dx|azAJO41i(B z%xHYOmBVL_HWT-Bef{i%QwG1gJ#yINQ&h#UG z?5>*Yjo-EAc#y!Y?OZ$D@7G5Z`3Q&BtwLtBC49DX%z_;|X0K4;0gNnuQ7y8n*iur@ zOTv({(vMucL6`A1ECv=?-~hX}Cfy&^qwQLRSvqFR0MSDkO7@I|sU^ps_suCu4 zrvKsv_wy!doNJYMh`zg2-}Am>PB~`3-xMmlam?CN9kVxaC{Pg)Dv7M3t5B;OP9m$! ztC_Yr?>=tMh!!kRVw@(&>?z>sxFoMAA+@Qsq849MA!J!IpP1!ko)IDa1czwPf*rGR z%;p$#iUrY(iV{;Rq}7B*Scd3AOdtQ@4fiwV!^XR<9EOQ|UwvlA^(-8-=b7hGmek^_ ziOf+-RHC}xC~m2PdJOoMgv!Izxso==?Db8hw=TXaiAvOp=|Z9k)yE~i>mC(L@*rz& zy*|_b56{9eJ4=B{yx2;jbIq%gd|uwoPhp0g$#s4f-_^L5IcAw-mN{m7<(SoZg7+y> zW_^l9k*ufsTYEA02le~+lVkQQd1=~4GRKjex>z5neoXge;r?*Uz9Ge0krhrdm)I1& zX+y=3Kz+^@pTnK{Av<-JEhezdy^7{IPFI&L?U&D ziOo#bNPT5zcl@4alsab5Q|HmCArdCitbU>A2hCuYfD3;00000NkvXX Hu0mjfnl#u7 literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/MenuElements icon couple 2x1.png b/stepmania/Themes/default/Graphics/MenuElements icon couple 2x1.png new file mode 100644 index 0000000000000000000000000000000000000000..8352997180b8ca406fa531b1c96c2c4babd63ba4 GIT binary patch literal 2360 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 literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/MenuElements icon single 2x1.png b/stepmania/Themes/default/Graphics/MenuElements icon single 2x1.png new file mode 100644 index 0000000000000000000000000000000000000000..c2c44d9076f437c1d0f3080503925abedf847bf5 GIT binary patch literal 2329 zcmWkwX;>5I7M?7G03S;#g&8iI0aQSv4x$C67=l3YDOIetf>@cbB-kQ~Py~x4ArgeL z3nf(0pw=sj8U;~r>17~c5fZ_=R4P{zK&WCRpt1>>=KeV6ea^4*K4*JRUikLUtSy}^ zAqcYG78>-W2@_2QGZ`k&ehfRAfG*^H!GoadT|Q>{FHJF$8XS?j>yRMzDE~-2#EUx= z6OV2?$QQNBM0zj>{0ouA?kmMi$VI+bClmdIf?A(lx>gLi9u+ym2b-XK~ zQD-(}ya+6=-T--lRIosbA5gnj5hJ~ZcOR?XW=DdB&LrmGqMK4a@tqSR~6GN_Yl{oSp_xxphY{n>znKfF=uVkr~!!TVkN`B}CnuBD>uoRu8 z0k4$|+;IE@qkFFsVq6sA>P6`ZU38!fqT5;R{CbfjZ4+GkLPG?Hcb)_RL+ISj0L)(E z^4|7KEgB4O_+9++>?MrOM2B1pEa06S4$+k@2fchWs$V=578Z7Xk{5*2wzA}%#3U`L zNfKyhU!Vb?o&)MjE~#uG>PfS@tZ-%m^9aH%mj;XGI}D6{^eM_*LHJh+yLqjF?J?s}y%9zt z73;~;X9$5U(9TgzdA_yqp{+iJNN-;7!VpY4%-(m7`fR;z^ge$2)aXi;`tf)0fYuql zb2l9h(D!QEx(qMI_sEcc{p6i#oU7)Edn$Q*gO*kg@{XH@zctlx0vwI5hJF?;^LY22 z{4;wG%aP^jh_l)ZzCap@J z2scsguF7`>GGcQfyY6J%vB@*~Eq$}9faw%5M2)0AYQx*Z9rqA+FNZpa4vkr1wBjcb z7x`qVzdGD2>$ zd-SvUjJ4q_nPN(wqj&W1KQ4@$owItflKRPqi~wyGe zuE{NKxmF>PLaJ$D=89Ies=)oLx@k%Pbc5I&MGQ@>qg`qXYRY3hPwX5#M!7=i0B%b7 z#JDghX_{nHSPV;vs4oWGnt96}=yjDRkVdKfslWW)m06)R(`-~MSMYo2^(pdN{sKGF zg|@_d3GIT}$%nN%f&Y_>{%)6&sjq%5JR#s->TjhVcvxEzs=)CWJY@Vh9}<)#HTsI* zpOL$)^ro5?_s%cOdKlS~^+PA>w$kRc9oh)_nS&kse=`qR+>y}0-e8zy*L_7la3G6( zU!k{Eaz=(@V{v|9Hy)-)S`^~^$)n4Io?edzg8^TpCfS5G)UX_E2)hqcQoa9%r!e0w zG(q2Gus9bYIlc7H*SW9A#Z&r;>s+A7F0(+z==V=&TJ|8LNs(5G>36&gDL)1tvqmdK zB8>C2sZ{@WWfY-2ireXT3GK&(bjReF<}f02{ztvGavbb=Qxh+5iC-<1)|z2ucZp$6 zwQ~Wueyuq+qVf1fWln~O9`v-*Z4Z*h>DQu(3bn!(_&bD`D=Dk1zAHxF)NfWRZ7#{8 z#Zs62njBtebtP-ywc{`!pEI7)_m2&N-bywe(Q92lG13l?NRCw@t-~Jy5Y@Zhc~i=1 zzI!;iLkz{xbNsO~-s5vlG{5t!XnuZf*g2T!j*K*VHEh{c6ve4H;C=_N^tb?IP>_@3Uiuc*|HUvj{M!SLTMV6bo& zqo{-{lCU}ngKrR_)wC~fxHVBhsd!Kt*fwdQ`94w6^t?D)NpTO& z%{6ywJK?kfh3o>wKhG8S z^Pm@NJ03WPq&A$TeBQveXN7?R^$2EahHINch#~Wj;%IKGHq%#-llok=IM0Zz!7Q0M z@7duG7r4HE!Ti>)4ogo5(ilG*9F}P!oE$vV;4_9e{5{aEJIL=LRG##g=e@kW2Sn3n z_|Kob2NVC@zqHUcTeoj=yV`m-3NB&@5okq-bhs%fKVlcB&&KA7a!g+ta2Gny! u-p!_qQoJ>)D&2G@yo#C}WeyM%gWQ+AkZrUn?=t;1(6-?1LDvHD?0*1cWhCAJ literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/MenuElements icon solo 2x1.png b/stepmania/Themes/default/Graphics/MenuElements icon solo 2x1.png new file mode 100644 index 0000000000000000000000000000000000000000..f3fb83b7ea98cabf84f7042cc24ed1f3954a5a8d GIT binary patch literal 2482 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 Ef_6o=RR910 literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/MusicWheelItem song.png b/stepmania/Themes/default/Graphics/MusicWheelItem song.png new file mode 100644 index 0000000000000000000000000000000000000000..0465b715161e4791629532009c2c4624f9f67208 GIT binary patch literal 15523 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 literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenEvaluation judge labels 1x8.png b/stepmania/Themes/default/Graphics/ScreenEvaluation judge labels 1x8.png new file mode 100644 index 0000000000000000000000000000000000000000..56f504873da43afefbb457a4d3a82e224ff704fc GIT binary patch literal 3621 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 Tno!Pv9>CVh$+FV?M%=#u525zq literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenGameplay life frame.png b/stepmania/Themes/default/Graphics/ScreenGameplay life frame.png new file mode 100644 index 0000000000000000000000000000000000000000..2fae31996483f5d21bc597b9f109023b96efc323 GIT binary patch literal 9083 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

A&z3y`$#B`$(;0{{c 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 US@I_I-y0F2B(Ek{BV!)+e>=>~HUIzs literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenInstructions header.redir b/stepmania/Themes/default/Graphics/ScreenInstructions header.redir new file mode 100644 index 0000000000..843d326fc0 --- /dev/null +++ b/stepmania/Themes/default/Graphics/ScreenInstructions header.redir @@ -0,0 +1 @@ +_shared menu header.png \ No newline at end of file diff --git a/stepmania/Themes/default/Graphics/ScreenLogo ds3ddx.png b/stepmania/Themes/default/Graphics/ScreenLogo ds3ddx.png new file mode 100644 index 0000000000000000000000000000000000000000..4d0c2eb871f5e1e0a0f652c694bc1c0106666b6d GIT binary patch literal 58837 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

  • Q0Y7~e9Ad_aOt3HP?3neNJPOxy}IMB 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 IyxYV70o!K=!vFvP literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenLogo ez2.png b/stepmania/Themes/default/Graphics/ScreenLogo ez2.png new file mode 100644 index 0000000000000000000000000000000000000000..0343b277cf41e8f068117ffde5abb3fd02902192 GIT binary patch literal 18585 zcmXt9WmH^Cvn9BDfMCJhHMqM4cejDT-3jjQ?gWCnySqbhX95Iwe{;WkU;UVKX00=) zyQ`|Z_TJqS@m*001rZ++0s;a>Mp|420^(C6`2GhxEcny3EL#SAfwmM;5P^WGi}iU? zP6B@?F_l(PfPnC#1V0x90rB(!zW#xLaAkpjI5C2N;7x;oz_m{+&scN|~5o-9{oF%)QPf$g9&WdD0$-^bhbN4Zg7U?!`n zq>o@&#ywT%UdOB2ET9( zeUwvY8U8V+kXhkwpQqcu4KuK0MeH;DstLJk@?UD@iU0Y{Ue9Gtf;wJuw?8C_3?&vr z2JrC;5`rSS2}EMLbkWCQHrV*j)7<1V`*Y^nCcL1TQxMHCHy_ z19H62+w4TcNgER><#hga&E@d+$NK{VwD_4OXgUXrEUxG6%w9Xz{pm36MGz-P@)1=C z4jFI9jfm9G?fnU4=`E0%gZ@t#J@MQ(9Hnp|$^2YFIqp>A#POO3b&;Rxk50AFaZ>R# z3@*01QWj?V72(0bkK&K!vR(6_a>{mH*6x49z4ZX+0Pnd4vbAyof4}=gGHua@2acQQ z|Ke&apUxuU|Gbb_kB;wHSy9uilSHL}D9$w4_W16)qK})NtjKr9!EKicbanafC$@V2 zZ+E#G_~-p_Uwv56`#1ozy>I7J+}nhIygA6I#Mrp?V*ZVRAF0QA8z|TnyJ|sd>6f~1 zlKcoN(Jej5y9JwO=Y_9Ix5aJWf@f}P{C_?jVkT7or8cHA>BFCU4{BI!kWw-9bT_ zySYiL1^x)jjoCi05=R9TCS`H`^Dg}$Ie{`q6d=&AhUxj_>F4cc7M6?0JF?X-AF0n} zwcE6})IJ=VT0+OUO3HW&m>g8oM+aBtC26_1< zO7}~@n-yGu0alYV zJ{uxuX}e~z*ay8F!xTD=TJ6|>k{5@!M7cRgY;P!Uw*yQ>`W-4#VRy@QeL1c!MsP%DE7KythX+%!4w)i28C8SSBSj=_ z>x&tLzPjJ2Q#s`y92G^cpjQbfIMl|FrGJ{E=38q5x^IZGf7_2{=g9x~Q7moZbJKp} zW+)<{S&}UHXGMa~z+VQ=QhsqREtJmGL5fJ{xxjCuT_THbaqe9s&f0L|*V;mTWYGB9 z>1%h7Eeg?zj*`?%b7Jl(NXsF1skyiA_tuCBlJQG1?&2ir1i`i8f6HorhX{-Q?dn~d zTpClrn2E>THNI|7W;Y>^+KZ*)(%jPpo#_#_Isc~q$+EOib9w3AW)^TgbLsgxLu75W zII`PH#bBGO>fqI2?nzr&h@)n&m$Z3#$)#A8$ov*a-t}B4W_|H39fZElPvjiS*CI!d z()t%teF|o!D2M-_p3oPc&kW;fndF>2>N`tSY>QlRy{ znK|-V=>XBGwNjMq+EQa+b7R>r=AR17%?}{!E-?dL{N&~4(2~ZcfS}Nlrp>2^Y01OQ znR7b>8KI_%a?>{*`hC~1#UrJO#>K6<+!jOi4nCwm)fF|3|4T2&`XZSms>lscbmNQA z`&C@^%iQ4aY5p7e6efM0{gJpCQR2JPMdcP9&c>&dt8tdqh}Ud(b$lM-unw;I^VF1E z--hw$Qe|3OJ3Sq_XSd~PPWq-_nn1=HebI@p-r{-7KGO8W^rfz@a;+3Co1`uFM5neb zrd34NAL+3ufAXVSs4Plv!lv2FjZxIw?qxac7sdZwjTD`*8MJ0?bw3kJ0axowcpEQv zs3P>7r#MZRIp$xKgx*|Q&MUni&I`328%n1Z>kR~Kvw4=LL|y7;`@GpxSp8aK?*N5g zb=4h5D+ArQnD)`tX{#zUMQ@1dE6k$=7ZY2y7oDe0fPgn0uR?2W6dFx=tZ|&V`plum zHb2_1McLyHDsv*0in2W3#re9Q?a~*WUz~(^LD~XGUz)lqe#ma9^!`^|6bo{aNgI8h zuFXlqKzaTKQ<v5H=`jpCQCopS!U24|zpXXfW;NTa7P_7;TWw|YoUBwg<+-s59sCjEcGk4=%c;$2t?p6mc)(K#SDe`)+;+o(=y*=cTSsHTU10(kWojh?P?g=R z+Pbs0y4oA!b@>xdHj+Rt)o3w=kK$dJ7MjfTOUatQ*miIcKW*V*ivHB71AiRvx|QR_ zHf=VRH+2mT%ByV7mbyV44f9n7SVF(hgMg?z^tHT(aP|}z5`(GTb6{w9>$LKl| zVYB1y)dQN5+Xck>9e;NEf+D#|ns^#4j)h$5Pos2(^pNZ=u|{Np8p=`~%bLT3Ablhh z(RFU;NJ#+=i6Q&Wt$$-L;ZR#(`6m0>)o9L}y7A}y0q$nupSP-tll9WW4VPC&l<{A- z0k2-}_cl*N6`EDca%WkmMJGdqNLBJw1?sbNicKl3*0s7g@w@SByKM`cH5dDIew*t5 zfug|u-LS73<)ROOiA7qWmQu)?*tt2uDu1d*un*=)n=H8BbqTobZWRDo-1f`r?g9L^0{43+D&4L@p;MTF=!W}ZKYRMN*b}yk-Ly~-bxL9nC-jg z6ypTMjJImX5}c%bZ+N+w>wnma%0jOVGzlZ)SWy-6E!YfF5`SlPdjGpd(Hw=h_C+oMX*ue~RBu4|x5%-OG-UoEVI zb2%4B{mwQC5w#%2@pRTAnZDAGG3!rn0918JYC?h|WX4qsXN4y4px4i$kjNj;e|-cB(K24lhQz=FBoJLV-V>amqel+CrOE!H5XxU z0zNnOsJjxKE(?3PCa>#EREg>G8}fk^RsF*#YPz4TTNqbXE%O-NFj@~&b=9hLIPZ=Z zsF936)2a+^eoVPY(P}nl|4T`-4_bfrPFXvC20};RMW*teiZb8h)H` zX}*JLP^BDmm)gUYcg@LS`MzD$!2P#fl#F9lnFp+Y)0dhxlf$O0gQ-i}-p#sP%y|o( ztXkF$Kc&f^j{z&~sO9R*snaO8Z)+)QEdH??+*Oq*cXHOAQ(^jYHrjV^cOf?&>sCE} zR_+8DL@|Gw4Y{0=GIV&k%91!-E5$6>8@<+8n+v*R1bUjdlcW! z%Fme~|K7PRYg^{jsKGdCU98eELP>_%S62BYb3w3t=`eUba7U&UfBt6zW1jFd(% zowpb)jXzF6-vFR+1Nr zyd2!l^j}uqMwu2=Q|fFI*igSNw_q8}K1@}#!_04U!yMjqnTGgo2j^ichDHADvDX-4 zoD^JZOJ##~UCg~Azw_%Mj+M9%U)yp_%B}vR<<5+Zls(C6HBTY%Iy+DuH5WAtCQBCo zqn3MSBb)A<1#4(H%O{RSg!GJ!6^()};kKaI?~!k)AW-c{%3M)`sq50xJJ-?%qp@2{ zS)p$gX)WDz9T*7O7)pilEiH6cqck?FnkranscuGX6r{Eo{PY__1YY%?^WL7X%ank6 zdMP>7}1?|sAc|jGD)K*9`%ia=o^V| zH%DXC-2v=8pD63a$DF^9tt{}G`JzN}_*tNKUxtXniYFp#;=N=_}#LYr382i}<_3=OcN)Jn= zSImHm+Z9){_h_uq!>NRslV5U7%QgOY^#8~p_*@Lh*pLCs)%v==xzag@|2egP2#L8f zAB@r3a`@Vt>}yzq;H;m+jdi}+#2=yksfO`ww?5vXzP-vfz}GJ-T-)|+FaT;WGm+kb z1)MWzlZ_zvP1iJCRmo7Yt6HbS@v;BP|2Rb5te^Ft*#bv|qqfv3wd?CB&f5E;?$K~t z;6GG+Mu+WW61;TN|5q1fitM+$?c`6oU(RnN7^Aae353!?X!Vpx z=Q1WnTKXc>?5-zjEzCu@1^*};`1~HV|NlN{#H1N8*Aft&52%J+7=u=H;oUyU>9@+t?eR9l1b_sL34&B;fJK01 z9#HnaTd$>nq3e=5LX~DXiwalmiuQNhQp(08JdUT}Z@+VQ=cK;6js*|rLIhQ8{FGI4O!zz0j2eL3;la$us|d-(I=bD z_9or<=!%5N;oX6-5q(RV>I5LJXToSxZ2&c&k`(bpX_g%r6k!n5bY4fwq1(iRmg;zw zG0DP_5pvwOJlik(kzB!Y&uJ#G+7ThbcBu=(>S!i!d($f?1e-AhxAt+g(*y|tkyR>= z*mi8HpG*V~lJtIPZD?wg_kO)<3rK*w+?~ha&m0ep>B-M^2M!g+=i>hPm`oW$LC5qB z^iWdDQJCu=fZ28jguU2anD3?XUsei()WDP&q~rPae7DdrBUk|j-PW&dh>}!lOe<^y*8E8<*J3@7=k9(Q;oB& zE?ucr6*24vyoG2lB*tL|mr7JuJ_57ySTC{!*p9+)I3) zx4V^14?$y$N-pq})c(O2UyRCrtkYy&(kZy*|KSUkMn_y@LOZ^y6W5`}k<2TFh#LWk)q;Ju^z3 zaaY&lUR3HL14E(FU^s?0*GO=5pq7e(BL`bDZ5LSFNnjM#Wn2CtcrJf7=1j;-b;ieV z_Kn7ths5?bbJZ5TZikz?Tc#r0`TW~X-tV#)@_-?9?mJcn zUOqSmhR(iamfhoP5qK2-*UJHIS$Ao!a?P4tN{*<-{hJvf_w~8-->WFx8#`34;<0E% zkY9Gu$7`GBg~Rl`_+a%wpH+ZiHadR0=y5@%s81Zv^1m+P)i%vZ7bjsC9cO2Glz^aY zrOIRjhf$|cvD^vwFnI3e-X>X|z`Dh`83Ef+`Ig2#& zgKq#FEdvLCu=b5Z6`hw)CK1_s$bSgsGQs_4yXV94izx#~J6sNSaI@!v1vh2(83M1{ z-#?|%&Ns)w|5RIN(6k*Fk=6e0iqaW&lSXlZs=gAV2CqJ!zR+*0R2eQX5NJX9y!=H6 ztExQwr$j7wi=;bJDS0g>TxIGJ@1Wakk@XKJNc;+XO?W%(lcV~5&ztx47W<3kt?%Eh zqq-OsB}tf9k&{&*7@9%3-sfpbfb^DP6Q=>}odjOR?+Ib?iX?9Yz)(EoO$HibDx9EM zGREv@BnAkx-KxX0ybLfsCoof6LW@`+o3R;^8H$}#}hI2!g)ph*nAbruQY07bbxUHIJjnNUs zC64+gjLdAUR~!>hJMfiAuF51Nl1VxJR0(deT7O-^cto@}@E{YTxG_DFkbvm4^4M~W z+F{XsmgL6LE?#Hkb3t&z=vCgwEA@IF_eGEVF`M1qREnm-ajJNFce2(~!dXbVk_(sd z`FajC1H(05!5mY>y=*9+!(5~7y2g65o!m?R=FnGWxAoR^WD!5itg+~dk~@-Eu!c^; z9n)nz5W3dPczQ$J!Aj4whzO+}ebycST$31Dono*?(siUImeeA9ah`nSPtWKY-96Kt zCio%py!ga3^7LW`VlP^jd(#N%Hhfsfi_0JihRx_sqC!zZCE_hsuh3{4$Eq6meiV*% zLp;fkShHd^UmQWni4@f-3J~zVciHDDEwHg5U*%`#vfug(`|kK9g+W_oB8_=QbtNt( z@cYzWA|Hc5(^`O-S`lGkW}|lIVSN9*{`{J6Iin9(kWRBEQT^$4iRr3uCa-9a$M#m@ z`^6r3)5odhs81B>;-^fIc_)&_sFqeSPeI-1fI0cG)|+1evJU~?iNuzzVmE8Qd+dAG z)xPBn%ZB~V)yrz3&ey^7xv?Wjntk60{kEKGojKh%hH%v8V%n5k^6kVb9hk z5F77Nzv+IDyKrydT^Lu@L&wc{N}2m~%|O@>Dm(FOgwKD$%9m>kCn@nr(++AR z7aJQ}EV+}-@7g{EG0JsXU@_&i51^WkpeIIysFtm40`I7; zPW>{U7P|j!`b(umcD(PIBq(i~mEu=C3_(pf!zns5Qnkw7w%_ys=n>VN#SF>$0z5~m zsg!d6Rs&C92WBwNzEK${XrtVvl%rd3F#8IvwgWDA`n>ics5kbVnVMN-@4u{6YA;j; z9lQroL1Aozp3r&ok;A?Tm59RXQ9B2JSgx0-A$T1T=W@n=^%E4@;qyuJ(#)logrI%9 z)vE$msSS{X2-i$5W_r2mPr54jv(uU$K}A5Tme<1xQBo%=F@M?FdP|24;a~Ylltg*a zN>Znf>iphKnH=$Ql@bnz9pR}g?wL(Qn0|hr$4i94!KPreYNQr@@RrjC@G5CZa$Km6 zK6oKc=-s2gPT%-6J1KA1pBseo!M!q4NUj{B0@w2prAwa!7c#f0qBg1E!_4oR_b_B& z6X))`Q8hN9SgVD>^_M;DQUp&JnL+Z%kzro9&L@Qa@05W(MMACqa8=93Nh;)l3m280 zE51O(gZ{Bfi4r;${K7v2ndo+j$PTi@c5%L1BVqfKS(?FQj^SsHX%<;)W{X3oHrlnF z?bF?Y-8w|s0^TShrgp}h18?(Gz94Rc1ijZ5DU%dp4rf@aTlWwjh-p))Y#^Ts)bgdp zy#;BscNGwvkT#(1iVh6Hvsc)@^C~nMl}URv|3sl=*~MyuRE1`ZTN5{N z=h&=V>Y&M4wY**&w)Hpym``MdEcU|{2gZ}#%mGz90ZD1ln31DBAMY={%UF5a9qu)! zp`vn95RW+r@~~9Sym24rh}s%5BQt_2TeqXk{qqH9pD#%H`uHV0g;(=YV`?@2xVP7YM zo(c=+x|erm`eB-<%}_Njk|E$vJpJxW7$~i>KaptXX||r3{UE6$SQ5YOcyzL#GlvfS zx6s>d5`ij-Zw4wZ`j@;ZCbB3B&PtkkJfX)OD57r;JCCjsm`Gm&0Xxa~;ugOops<2? zX)r%^KOJQ;Xc+Rd?R%lSwaV8y1u+QclIrpm-=x<|SYK;j2TQ^pjdy9s#YH`h(^pU4 z4TbjxV*lPg-dw%#5=5#em3ctR!!3UcPQ_T01jHJ1Grb`h!m;KR!Iu!2x0Et7K$C_tZ?T9=|@C7&Kz=P`P2IQV4)|X@2t2nHxP<)<2y4dQytb8Og6}V=(+cqK+wixVO@`s zV-51lS?rj_NkMe)@assTNW+~RP69I(hR6W4X!s7>9&a>|CULfw1iTpRGm$lBk%0Ce zI|;k(8H9z*VCQa#_S_hxIe2?Oht7kz5eUV$Ji(?pt}kp)9PhD)q3s{uF)~=xB`N9w zm*U2zD-JaQMthsA%ovZ0CW*#bSV3ei*b11dm80$xwNJr{mP17C@ayE2k=a`vJ6=BC+oui|yHuG=-84PvNY0*cDw7 z8|W%(b@E+h{l;bIkW0D}l23&TAp!YiP(vyhCw#$Kpc5^ZJ=|Sklt$20aHcK(s|W2R zszV++$2b%y`fz^maIBe4PpmNLVeE<4@XERg)bbkg5CwMz=5zu~>mGi2zV{hUF|(}@ z4K&yK=`+6H;ccim@lE;yVf6d3W)6-lNcf?lq9$6se>i?zy1#GVGDS;3{>*X9DFBC-iL<M7SOZA74DwEuU-#VVO!Nlpq~ZGnFc*6!dB#&2PZ4SM9IoI|RNlaf z-6ld90W20Dpn|1QEf>LV+J(U0HbKWH)dy`Pm%c>FWE66AV^Q!K#yQkeeEvJfrJjAq z8JBymaTg0S))o4W?3GhO;#4?QjvZ758#_(jJ(L_AH`xUYH-2CiWAfio-gx#_7*CB! zbL>E~%8S4FctTqB!$D!LIrPDyXzTDe47AXE&?2yS+TM-vkrJ5j&OW_^@sIr7TE8=0 zG}bf}vbd&TM#!DR#-eL*9#HD|^fJ;bw0N?&wd~LdlX9??*MPms>6$Z z?-Ac8#o*^+M6Sc(em!pi2-AvmP-EdL4K$W7=wWi80`toq$9x)0L5L6PgdcSXBwawoEEOlwAVle5*Oz`|IM2DX!xY(wX+<&cy;~}KNKOi> z(#P?kzk8(P!QH=_ekLek6dD$!c7~>>3%?HN53Ub+AQ|1cDL!iG4V;dd%q(We1W?Q= zLyZwi(kpPv6JZ5-j3y`FljJzeUSe=~7?|XQK~pZXWc2SojPM?2Q~2Z$UbShBh#dC@ zmKa2Ps8#|ch#w;ct|oCAwDJ+Ks9I-!0Cx$qk(g!JW^mj3u3m?6Jc(NskLBbF3HALP zl-M*q{3zPR1KW8LHNPJ{@tc#=yr6$(i!VhCW-$?nqg5?!m0>k-bjOC=!r-*HI!^-) z-R&rv8=WOw2FsI=4a~5MQDt3(p=mt|u%fW?D#w86xIvIj5 zDM}o#<`l$l=IsxKU*M!>r!`RL^~ztB9_ zcX>6S62P|JY`>m6>ub_f*J3#9E@87YBkYh=pN+*Tm8cyqhC*|I-VbW&^P2-RFVi1+Y^0JfQVxKn{$!eOds!1jvUjc`f~XU zHah@0|2~T{$tyw+dSrnxp=f{}&rjUCq$#{AEX*zDgC@h0%%eXI7Sm2L;n%?=86b~R zvKkCi2=~sh+ao`4Mj8QC2@&fGU_@m33E2{*Eo1NJJ!l4LzQJa~+Kr2M7^PQ=G=`W@ zq_$-u<5P|dcVW@{4L_8*QEzh1K||p%lvkL!?!rd%;|?|eSD4%rcBzK?Ws7lwEv=?Q z_!wH+Lw($5G5Xg<`HZO7YwE5n=c7*dJMac@sbKmhrETJPbjpJ+C~gI7BglH`?A^5p=coXJBDf`&OV~7P5KPH zKq73bWM!e2pj$ZXgIMRdCsx`G8NdJ{Dy>oiQ;>|2`aH&ttkr+EEYLzF6v)j$!l5yp zL;%Jz`wPItmT?ExdmYNDh^3KWXx&UEtDGnE9qJrJ zPrHE??90Dv{emiZUSdeuq?FaLWNIT};J>=-HU?lSJd#U4$P-%BhC@a^FiRoCgcwD# zx7AG|IW%dnb$yS+nh3Fs%spNQoH&x?s=-^q!?;r{Yx3h#33};Z4RvVX2o>Yn2F|m= zJAY+lZZ1nbd_dvxYqLBuqtV#epFlGn03^%ltiF;)?f^HN zOF8||z)@iQko-$=_Ldf&XZ&i!ez1tG6?zH1Q;gJkYA!r2SytDcxxw9!#V44iMoiZk z6+&XhfjOUQ@d!*>(gxw+(7X+PfL9uZkcm;j?)AVK`V6KB`Oc6S4ZlyUh$wtNbtjsM z8|tKkEVM}*L7So;Uc5`=mJ3DxEF*;64;j-nV1me4R|0h4I;l^hvtsO2)RFd(4n!$( zzyUO(A(m?%C0nU&5-&4aQ@(8TDcqeEk~@_f(IndIg$NEtDkKtDhG%eMzYkjbkFow6 zzHrk0M9FVOwU01kBDdlt2`sWpaLN51SIpNlPFUYR(FEd@enyxVTc%GPdFhLc z4PCeEn!0mBr;j3>G_~fAaZDbkn(P*YM!1BWEF=k8V-Y&%^deB1*{6;|QyEkd8z}5e z!W}K{jUExFVj5iSGh%a zEb`4)kg^`>;p_E*jEaiA$)!*?4a#eUWykF?(t)T*uiY{-r>)^X7Ea%DEH%K2q>OD z8KXMJX9s-XI+5eW&?mY0)teZ(GZ4c=Au(w?71>2M>(?>JBz20mvp&Rx>`=0NgUv{U zHjQZ8@iH$IbxNiRPD-J5I%vI3FM7=0Hf@uibp6hZ+h}iQ^r>4Hzh3fJ4+9LJ0-xDq zv2*325QV!!r+472h|fK|0z*3BOSRvrY50&y0URaA9wZM>El#-ki?3uWk12|Y24G8M zltClu=u+fY`&j%v0bGnrTEd@!O!&R)eu8BAiJw|QEYXG`r|v)BrYQ-bz0ki%Dni_~ zUzuc%k_+P6qo4P69IOyUhKCdIa8RpU zDZpKj;3JKgL5kVQdrZ2|Z;WXThAFP`iTAmpulEW>lzdM9-KyAF1y<=sIt8gt2+zL;)|u&DIXRR|Vt)Rh`iA&PGIzg&|Gz z((BDZMCH4siseXqR#u?}72sY(I>deaW+)_QvX`&7Er`mNC2r2h*_!0<@vSjGwO@SO zw$@@RX=cNA)5Ke%@2PumN5)^c!in|wnSD7*DoSKJWHG( zj^>&oZAi{!|Kloqhyah+Pmb-fIDs-F@{?44d^)G?{1bZ?>H%TF9N9QDx+lOuhvtY? z+ZW#D_1TAM?pB+Mfe8l8GPo%saMrrK-P4R5u2^O2!UG3W((&TSZJSLP5l4~w!fW$8 ze>nXB=-?el5XP9;kFHFBZ0}k7=?2_m{0aMGm#|kC{}#+SqLiOU*Lv05J|E3mWRFq# zd{xhd1U#^Pu=ahp>EIh)u11&Qi;9#-~zKAusI|LULu#{ano4M!X5&WeK-EX zBdSc(@=A;$Af8l}tzOgbWUSOhrnU(tkCAYij>7f?HU5?6_GxTWQjs+SR^*qUqWhY0 znf!u1Py&(l$k6H`rD~8lV_hI$ZFtyen5lK<#?Wkv93j^ew&hOd|76M-*NQ7Wh`JH8 zDc|B9#x2+_WDg9fo@#~as{9K5sg4CQiJt>nzTO-1N}quW{*zM>wtR^or$hS1;M$%7 z_IutMM__UtB9j6Y)f)CPp&fIh4o>0ck}mqbGeYMg)AHggZTG|i)=cmKu+cmc)D%LQXWyU`2z3AWf#K`Ks z%V8)eU`Sz5X1mm*WZM1AY~+o?%f%9w{?&s;>vtu}LJ|jcB7VAa9qbJoKtFN2`qYD^ zHuberDOb*niV6r(vRsqc#~!QkJv&llG~|1P;TKp^Qf?VTG(>)m$`B7&NV`D~lv+=! z1L(&X0WV4(QY=y$y|6lnw!*(RTMk%Rryy!GoVFs*Sake4=-2a7Vx%hc;TRlm;jCVP z@TNfB7!56S@%llF_G?qR8&Q@!gx(@jOeq%a(7KHn2E=eWjaTFtBw%u?03mK-=`gCo zkQ~9jmQSvR)`sPyrThjmH&PBv?V|@*JlzcC^4`HmEyZeBxMgN#hvR^s)v#On2Y$IS z;ypd^gmC}3X+CTlrh@i{&*NRBzV;Fxo&RA0pVr_Nneo2UKO6U(t*`LMCv6T@ew?{` z(g~TJ>qvEfNhgF;&Qbg!=Uw+&#Q}oM5y&gh=$S`&6s)5Vmj6Wc`3qrM+Yz@W1kVq) zpp?)kMw&9y7!cV(*BmchrVZEl=P^FNQzTEcU{x|WeQ)XCq-~5iEQDkrtcQTTxKmcX zQ3j?0Wy8=C^Jawz^*;b;$PB+$E}B0BC8DJy_^|jyqKKH%ZuCyX$XJAFgxXPqwZhqJf^QB)Kq+W)Wf+eub6iFEBP7;Ya?Kvj$ z@5Co>(yrjeDDR8)2K_Mm&*mAm%w< zeCb1Kcph_OwJjf|3H~i@`f~~~DKi-P^)?>EZcvbn_?z%lntGpgcehs_PDU-y`W7Y?gx_gAJ@mN-#pNT;fH%n$P zKcT``hwHyNguxwKh>gW;w=$JKJbdn+NlW~}AC5ig5%K-})qnuV#0TfNme0p}AU;Lh zlvW4J)D7U%_cjkBdm)FbCp2MmigcCz29rUIpm%9jo%AA{aRhZOlHS8{C}K0B$NQj#Q)o?|x8p2jT=f;ML}ssayzW z6;$v|vtC1+e1whwguc46DsNT|bQuV3)z|A}tNRW}jA2jY2qxQip9{lnOzg9Sy$Qi{ zLI=X3L8S7n+O(b?Cx6wp0SXJKe@7xswG7Gkk2ga{r?@#=wamRc>pxt@>WG!Uxd$Gz z*-Huvv8^9bBceIJx{$FSz#z(167@UM7L~m;RmQs-=n~Hbj8NPQTX@7fMV2K}aRd%h z1q8xiuc9%8AIWi%nL)J~mpd>d@}fg)u}}!*AJ*48EWnJhh*gl6O2QUv_J~0fMWsSm zHr{%Rtv!ZnSH{QDqL9Rf{^)DJ5o-l7p_9YpxAr{>K1`=_p%V&T0U+1SJQ5Ej*4Q+v zw;xx>1?Jg-qR?veFya~`eGp-IX@@&FHfB+Y9@u6g`;szlP-00O;uhxL0|LD{I)5j( z1{tRDI_L0;ZCJxoR1$}$w1HsW^IXN;Y~v-T>gow1FyOT9J&0c|&@dOSbRVZSs2wTh z^<`9a&<|nf$EpLI@CQ}JBCuo;aU9$Np7xh~zSWySw(WBlLs>};@5^`46)jpWcjhEg z!^c1)((S~-CFkK|szP1Tb3i~3^ivoF)Pnka!GHOw9*gE0hAy4uHOSF;L^28}62K#i zTe5~_x6l-bA!Fc0pw63ZgD3Po0%y3&fEld+&D z4wAeL&is~()~T1I{d4{a;J)-8^<8x@n{W~VUdW(J!R+r3=tQ$5i}WO#uYN5H@GG$j zN~-LdulFM2ZK5Q*bPpYV4nd|RFl~}1t#cbeT7!e)frM!DSEqIq4Kp=O<7<(X0zu)l z1y|m-TJ5Vme>nD5Hp35zw|5sP(IATf0(kA^RWFEDM*{hpi4-PH02^`e2 zL|6P3hTA7X0U&s^zA7oI8evb0sX!+akAkMRI+$h)FRv8E_yOX+<0nTHtFB-dg4Aw8EKdpbvXAjS#B-7I(c)j+&1HO?PWNZ*u zqKWc}G>=3iKa7(0GfDat78jFeNKkU%tpUg=oP`k+qL3blMG2}{)m>FAu#`*`(;v*Z zF$|-m0FOSbXJhe5)Ss%OP@&|-W3hnLwtE_jv#baMaea4}fwbD;OGmJuq!5KzQNx!A zp^#7}FwT-D3$$Po;gO+{4<=o`n>xs7O`q>4yT(#WN(ZF4L0U=NBilUS;|g_4B2t{o0*%0dO!jCamE_J2Mq{-GKGqST@P!sFic42TW zRtqWCNZzA#$1m!-+GFG8(TmflwO3a;YrAE-k?zRPvZf3UJ4zo2k7iV6Y6XWn^y!CG zaBPU~yGLS;;SI7yN&+^hmq{GOsEi+dh3N+0{tz1@LVI5A?$`sk;tdWA?BU6zF;T)Y z8?`jZjs&&E;=gJPAe@te;u{E0%eQ~UbEde=NQ8|NyNBEC9nC5(w(*c$3TCt*A_#xTHQJeB# z=ARZSn#C83F$-enkg)RIuHa;E_mkkv*hjFrD!X zck^@2c44iXGd_Kp^n~`Rq^NXoFig;wx^&1FhxO#9FgAlrfT83_#;M$vp3$I#N2Hvt z$;xrF5J|>a-dW?M=5ms>07@v!Ab|?zWu?O5 z>?epJz`ShOElqPBcBeHOY>Y{dNssOLrfNY2~mv4dH%dXaI&h6F17L(9ki3reJdIt3bgXM~?@jH$M znYZ<>#y#d=Eiu1JYQX`&z}7&AZC0W5pLIW+;CNtY7pd-vY%B0`pNf`hdpr!5sSK^NWcwxSY&B?Er>B1s{{rai9f#|@vR#L1i1bo!sSgTY*#jRHYr!a`)$*&3k=dbcOvQSzZ zTJ5Lz=761F2T_FseRVoK2fuww7J=&4bI$5CI4eUUBg`fD^ors@P$!foAEI2aomj&$ ziB7SnX5iZWq4iOA(FdT;lZi_@GuoPr**zWZ>Qfyi27&KXn30 z6dq;YB+3!iUEL`Eh6@cp4ReNV=7zicC;xan=6VFQq&#;*6dFuDxDk`B$5pb>012h? z#BI;m^_7YN#9%vqx6!f5%;8Qc0K8`AcP|v5b^e`8nBj}kDFhsXPfjWyGRwlM#@7z~ z_3+0(j5F<3G=p5lGWoEOY;zD~b`3i9bLyr&j-i7{GacN?%_5ql*PJS+@3Vu{fL@yt z?F?P@Y)}5o;yMMd1c4G_VtAMGdrckvoa0?PvM&J56P2q4n0;=o;YMCpO0qKk5&->*Traqa(rdo~TS2{+ zA59G?=uq}>I5U~s^WDWu*zqL8o!l^byW04n%ui~LxjhMwIWSp`qj|N4mKgxNo|k)F zp%-mWproK#_8^|rBRxp8B06FeHDyx~$7L)Uvw_)ZqKO_F4mKgpXDu+!k0~4~v?@Gy zK<@RF_Ln3l3zz32!(v?yWD&q7)u;M`Z_w&$v1fp-D~352co!-i9+5w0Oj%mb5CH7e z?=22*V$r4mh@kV-N$qy^@F^Sk87F94j#HUa(+xAZ|j;=iqVIkPI`ImdEqg4-zg({CmjMRlb zC5RNGPqq#L^O%Drv92d~ObTr9sT`{-$MP1+2q?QJ>Ux&)7l2Jr7d(_PN}n-8f$^mg zNu`4@ot7@)LM!Y3SsLt<@!M{FNGIJwS)<=2lgJ(+Flx8)JL7`h9s|FBiQX5BRAEoNGPBx)nG*liFAq+> zHziF@jvmLZI4k}K+lSN(EsjFvzjqEhB92Km=_QSk3Nr5+~ zb*I7U+W162HOjm=9yRMVzS-FO2@OC%>n?g8Z`TuCR7mN12)Ma&C# zII&aG*Zo`zpJUTZuYKLfti*-n_r9=vqh$_q-6&appE;Rwe)pP#go(xYy;eLUepAqm zD~+|v^CfnU;z2x~`m)^hl%@+vM)ITCG@i^rkw<=U^f(UAojWT|XH@gLIjU zkZP0KsbNd=4IwwjKOsV8_AumMs2z?medwYY)9>1>g_?^Bk=?o-2-cGj1C{ z*TUywHKRsI`Moa^IAZNUz&+z0^m8oMU62m;C}e)`nPYpo_52Q=7w?dJ;aJJehh$n+ zF^_rX9E0#hGS|WPN#2Ro%axD{@)56sSNx0b2Dy%C-UtW{%h)7_P}iI12n`{N>m*&e zMcZLVZVnbTr5CsZjdH@zB1MY0TKdU4NO;PwK_{0~ciKpFK$u)lx(wXVl!>6MPAt7^Id9e=71g3HErTaijBfUA6t0i4WcJAL~N8$tRAF{%QMjE8!}uHxx5@T=1l*aYHv=ze|vxh*h>1r)fs zfM*TJFLjVql)2MwS`KQBQ0jM_Rl=7y}m<&l;urvP&;h)hbopzOE=3Io0qN7bf>bH~@jp zy)qX_m_y$1uKny+n5x0<48+-)Ymv!D<~^jcIWzZ94A>-XQGW+FD6iF_;diBJYxqOs zg;K0Z7Y~A7iLGz(&Kk+ZF0qual5#Qo7#L?JOj0_$UK8TS)wgf68 zvlv+n#ICqrvT{;!y{Q60RZ@a+Ss6jevqn%-bCXWjno5w-Mx2#T>hC zP%21FA@FV9iC0!E>Fbew?80jcP0b}qQV=2W4Knj+d*CUcB+OpixW>q#^TdMtKS>C&D_X6D&)9-cY# zh?-5FZ7SC{*`d4x)+f(CT6VO#9%K)#tw_G09D-yUo;Ox&ve!cAA_$fI1d{YvGm+N= zxrWa{-Y;^5L=on7qVEAB3*U&CpUlI|qVBv!XaII*k)sXdWO{zGg{Y}WNU^Xm^9g~4 zfS{f++5*BA6(kM*mjYArkR7d{%+3?I(s;JHDT5$Ulo{N7SmwD=2|&0*Ns+1u`EU1 zWGUe;W#Z%&F>%aQv+kn`+PF&9Yw;2q$y!~GcVTA0IR zzw%6(-#k}huc^2ejzgU!a)CNG;+FBQhxjk?c&-IGljyoCR;-vSqcR&(pOTkwN?yBQ z3kwSi3kyqV78Vv37M9Q~EG#T6EG(f}SXfwCSXe@{u&}VOu&{(?VPRomVF}H`!otGB k!V;Q=g@uKMMULYC0brAtzw5pcMgRZ+07*qoM6N<$f_|XpdH?_b literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenMapControllers header.redir b/stepmania/Themes/default/Graphics/ScreenMapControllers header.redir new file mode 100644 index 0000000000..843d326fc0 --- /dev/null +++ b/stepmania/Themes/default/Graphics/ScreenMapControllers header.redir @@ -0,0 +1 @@ +_shared menu header.png \ No newline at end of file diff --git a/stepmania/Themes/default/Graphics/ScreenOptions bullet.png b/stepmania/Themes/default/Graphics/ScreenOptions bullet.png new file mode 100644 index 0000000000000000000000000000000000000000..eaccc1275eedae1a98de31fcd94d53a940e4ef22 GIT binary patch literal 669 zcmV;O0%HA%P)yu}&v_q3>F8E0)&Os088Qva`yfCG+-pJ{Kn*uQ z8svHzAQ{dy0aRTOWfUL+X5j>Cy$Fz^6F^vm9K8Uont~2W9O*%TcsSGvARIyE&j3Ym z>89|~uf*m;V9p?b;DR2A6&2!O)1a^j)(D}@00A&*65#6x;?F3v@DNQfvjBcD$o%G; z!Y=q}3knz^dYRvQRA{qM|MAMGbPje1(`h^qrkDYqM1^Q*fh&ogc!6n1*O`PfGCiQG zfE~#p*@H5gcj%PAEmn5#o|4X4aH*PNX#l+O5b$==|&mD%I-Vcp^Y53(m+ z0*&vBMFAY1ocCgx)x+_B^njL)dc*nGJ)llZag5h}OeD_(JaHQgf($5yCRl?DxRYF> z?2RY}66u0k4SjT1bopu-hC?BgLo*#F8$Me5-;Z`$TH`d9P9Hbub`pv+egBUe{&pYm zr@Q>DmlH~clgz#RUPvo2K#!4lx;2|VPQ^0p z_i#v#>0#0ad2Zi>%-3-Mb=48G;Z@ohv*}jF+T`8=%rM#rfRTZS00000NkvXXu0mjf D(iR@W literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenPlayerOptions header.redir b/stepmania/Themes/default/Graphics/ScreenPlayerOptions header.redir new file mode 100644 index 0000000000..0b81245246 --- /dev/null +++ b/stepmania/Themes/default/Graphics/ScreenPlayerOptions header.redir @@ -0,0 +1 @@ +_shared options header.png \ No newline at end of file diff --git a/stepmania/Themes/default/Graphics/ScreenRanking bullets 1x5.png b/stepmania/Themes/default/Graphics/ScreenRanking bullets 1x5.png new file mode 100644 index 0000000000000000000000000000000000000000..a8e92045d31050f98a553bbb718ecf5091a62042 GIT binary patch literal 4035 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 p_+eF5fygsifvyuUSg<+_ zHsuO~>14uSqJEjhS-mjW!F)3#f_>*C&~2%gYx}B4w0br&u3x)X7{v z@Rhbtv1Sr`6ttyK3AV3dqzP#RqHzN4Ry)!jKyoW-o}D`R{tkKqSc)N1La-&=kF!2-1zz{Y!0PRkys$~bz-ci zM2Pia+-R<8#c0mX=G5GD#n_g?PI_}*R6>U82gwR4QMYh|?VQD`i(xNzG#YjWcWSP_ zWN+1^OuF~Ht=z7BA6Yh^6u%wn*Ce-B)%hT!U4e_0=oX)2YHiS8CS zHy>D!m2G+P=f>v9gy(iYTzV^DBDmQA!`J8;f0X*6@9kJuvB9sI`*S=8HR5*P;p+HAXp1A@*Gp&AUUZeLe3g1CaAl^(xM*q6v27 z)3=jfZk~H5Bh|r76INUwX>gs~z;tYOw`&ybn-Q7`2s=K8J*XXTwa-#b=B z5mJML=fb9|Rnj99l0}$jOV;sXDZmoTfNHZEExCBy>F2_ZI*fG<+smxnCMoj}U;S1O za?Se2^TR;Zpm|Y&Av>W&pS+@jtABq7iM(u!+84a`a0k1(fC|0c2b3AeO9500xEZ$8 z6RS#J8tfsw_4vS8C~39IzB(N>Kr8F3|K-ru3zn)wFn`Xz7!hd|voe#aypQ^t-TkBhj6kpA2O4Hs}5<3{|UL+>A?H zX+)}RZ~M&;ZB2)E7j&&eF3LpMMQ;qe7L3&(4X2?7`d^s(>Tt%qL;Uxm;Xkv zc`o&}$+umHCYw3a#F zy!fkEYAbTeLO*k@^;laszhC>t7UymE$7#(!t3gwGdM*Gx3U4T$q$HZ6bS3U7xvCVE5cBuStFBkm&2~ z&b4BPD;cIy;^}(hmrn^347@0ao8QRv5J)o;AGqvDfcg@_K)8*3OUK z@sfq(2erIe zZ1cDrxFMlky_AP2L=XkUY2`+y>Z3+QgmxcxIzYvy;SpRoX3GWXZ~ggzMXdkPU{zE| zW04Lb)kD#>2u=RP*NNd`@EY>Doki-P8L9~;DF6@tctA(%7PE>U{Ae`6!%(H0@Di=# zjG0xcckZCciog?Dq7X3`5TL;gr2tRNE-<3`DOq?&ZSkJ_KRWwD0j%#avA_r78PjQP znnLSm7`#Nz`U5@&$WRvAtAu*5&Em5dk$`(*dYN;dcYe9ZAP&*x5YriL;nZX(nFW=h z4#e6Pve-SL$OQIteeW_98vfV_lZL!drxd(jtVh2!{mYh zf(Xey50p_;r_2V7ykptspfNU$S!D@cI1uR5iPfDN-53AtAH{v(!b$y*GVUMh^+jd# z_tM+K>9(0|`w90#Z5*p*;ov1{d-cU~)Hy5gDP=~Po((5wT@oO$`B@K*CY)tFAcP>a zT9vTAjavF&t-%)N+?P!Zj!6&%&yrVb_s@M(rI(?f(U}1vA5z#o{ia}Z*^w3sSZ*{i zfjKFH^UJM5lf60jR62gv2GKjTEP^n-3I1sm&`ORdKv25#_}qpFxx(n;fLZv?zKil| z7f%%RtbV_@`qvZ`K#UEwpej(|1n*fHtv&!E(sFv+xoQuI+AdI@#hyJ9+|Xu~)^-lF z7);OI0K7ID+M10_kscxl!xXZMv~TA~74?$J3aTFOD1*8Wz0xoLkP}9<92K9@W{mZ1 zT^7#;(i_kM! z$S8jomu#(xcweSUf6EIp9-HYR5vuf?ysVOgCDadS9+2m&Nxz5mvmVzhqjuQnr37A< z(gwg^LzP!VmCV-_X=Pv$H+}?6-{h#6#r8{A-ff3c|6XK$Vqdx$_)TRly^UUqI+_lM zgY%)ekF|~_^=rR4)voUQlyafaN&1-Gv8Gdw5gVNYZxk#Vv5RRC^Vr@~qHj&x$3!bawV<#PyqcWHA=A6&B zul9Psu%+iQ$AloBIBNMbCOphceM$)vH1hbc`s1X2`hI})*uwm3{$$((ZbnT~B??($ z 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 aL=N(Hnn_8AiT`^O11fJcUw@akjQk&E2$;wK literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenSelectDifficulty explanation 1x2.png b/stepmania/Themes/default/Graphics/ScreenSelectDifficulty explanation 1x2.png new file mode 100644 index 0000000000000000000000000000000000000000..a345eb6de7ce791f2853d66c5daafd1ae8d0cb16 GIT binary patch literal 3952 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 literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenSelectDifficulty more page2 1x4.png b/stepmania/Themes/default/Graphics/ScreenSelectDifficulty more page2 1x4.png new file mode 100644 index 0000000000000000000000000000000000000000..a00e814f9e57bb58e43b7fde61ba3328d46b8ea2 GIT binary patch literal 5591 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 Uki9KJ=>Px#07*qoM6N<$f{9fZHvj+t literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenSelectGroup frame.png b/stepmania/Themes/default/Graphics/ScreenSelectGroup frame.png new file mode 100644 index 0000000000000000000000000000000000000000..e14b54ed759e978298fadebaf4a48f736f2fce5a GIT binary patch literal 16483 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 literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenSelectGroup header.png b/stepmania/Themes/default/Graphics/ScreenSelectGroup header.png new file mode 100644 index 0000000000000000000000000000000000000000..dec6c546f03c68d764188a3e3274e58e4d8f13c7 GIT binary patch literal 6279 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 literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenSelectMusicEz2 infoframe.png b/stepmania/Themes/default/Graphics/ScreenSelectMusicEz2 infoframe.png new file mode 100644 index 0000000000000000000000000000000000000000..418a2e884b1dc43917dab3a613558d559660d6cc GIT binary patch literal 143 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1|;Q0k8}bl&H|6fVg?3oArNM~bhqvgP>{XE z)7O>#GNTj&ufV6pCeA=1(Gu5)66d1S#FEVXJcW?V+*Agj0!eXm1EZbBGl2?tJzX3_ hBrYfa`2XLYnStXE)4$jAg6e@144$rjF6*2UngCWsB!B<_ literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenSelectMusicEz2 mirroricon.png b/stepmania/Themes/default/Graphics/ScreenSelectMusicEz2 mirroricon.png new file mode 100644 index 0000000000000000000000000000000000000000..40538c2dc9f941a65e435ed6cb7fbe8cefc675f1 GIT binary patch literal 1038 zcmV+p1o8WcP)_rZJOpt4hs^7VOQ6+XsyK<^F_fkT`oqCFFb3c>pF>| z$dqO2D_VpgZ(T$A*5fn+I66gBk?`J?v?4xO2eaPSjHryIj6*MR9824_i!ppR+kM{` z%)(tgX`1SXFl^lxn9NipYL)P3`hYF?+G3iR+1B-E4mf3a+rs6IP#{C^;N0`h> z(Yv;?|7cUWNZ(a*J{>PgX$ih_7zV-nFYS4re;*7Ld!;Mqwtc~As$u5%qLf02?RL9p zD~jTE7+zL+c3(~vVJaz$Y@v8f9xaroU=9-u%h^h_1|hCtirm3?o@f1r_047@hr_{^ zyyr503+4!A!SshThP7A_qxt9~Bw_L_wMywHytu07IvtmNk5<#uFiE@K$0hGw!R&Us z)o}!)|8PHf3x-zVDq7te02ww8rYZ|LpU0}*3aOJSxjURi@py#Mk{7v=}Tls^qd{xgim7ThJ+Y7aO-g@CI56U@M@YlDEMmeR)m7)JL?kV1)>>Rp2K zQI;V8b@?u15oONum_9Hz-DZ8S!*r=toSc>T2PJ)~>8`6 z+*tq68I)J9Y+#klS5jp@6gyvGa>Z$y{f1fKEe!i$HB2^=Hh!o<3fS_q1kLr71bdzP zN@rJ+2TG^@Rs%ruT}&mRM8jV$&#|3t^F1v>5c}ndKR-qO0IO+mEqhF&MgRZ+07*qo IM6N<$f=zedi2wiq literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenSelectMusicEz2 shuffleicon.png b/stepmania/Themes/default/Graphics/ScreenSelectMusicEz2 shuffleicon.png new file mode 100644 index 0000000000000000000000000000000000000000..4d867a73ba5a9eeccacef33f12094ffe1f710f7f GIT binary patch literal 1030 zcmV+h1o``kP)BP%PB$Vy~oWo2b#WyIz*38du}W?*;weRl>zlbm~VUv0ElETXEa z=9|r?Sg+Szk|gqPir({-Wm&A0ilW(UHjm@DE{Z})DTAd)`ia=_SJr8oMx|-mmt~nm z`YHhV>D62L%>|SOs)3Pw37VvLEgGfLqf&9H)KcrPu)^n+9$O!j+MkptQ2d#cqg&L~SIkl$wh%)!;E)ngF+@6@jq!06G;j5#y*7+*$EASGGXvSJ@ zt1y^N^#Pcw`P49Jm1bGe_njeHXf=3NwH>)@bwkG1yT1CI6A zFvw0j_OUggU$vL)?1wc@{MI~k1tacc;{5uakh1U+44TcSFt?y4BNs4}gbNB4355S!BOnzVMei}u&DVkmXNf;X;5A%!HMqstK z!jQ0hjgu!C*st2m1MoAUotc{R>>Bb-poLy;uFiEPuuzf?MoyjI?tgv+GxR5!sY`WO z%RDq%UjY^!!SsO*Ilgl*wUdkL?z&B2EIS#i+>5LcOxwvpbIy5cO2++s!NTr)Zvlsp z&W&IRSD_ng8T<{W1_otV!+{a0o1+Jl9OSuAAvf%-v$3XYu-#;QhfSTs!f3!nbItiB0QX%QOE^D53E=%+#y!GdO{_Bb;>jqn@L^Vk zu?(940|=8aH=5woeC9uXz)|7{z%cFr2S1W#4es@wnRS@!j`p076!&>BsdnJ3zW5A_ zFxl^0>Ezf5apS^PY za~xIoxEyS^+ZLFZ_annQ7d`kdq^c^l-|w@CH%7du(LlUGl9($<(xnthBy&$h8p$k~ zORc43Em}#viQMgW=Xs1X=DuSQK!!J0{P|zx4~~mPVIklct^fc407*qoM6N<$g1_eH ANdN!< literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenSelectMusicEz2 speedicon.png b/stepmania/Themes/default/Graphics/ScreenSelectMusicEz2 speedicon.png new file mode 100644 index 0000000000000000000000000000000000000000..8c3fae701ab4f43fa36bff9c07f9b9e10101e6f2 GIT binary patch literal 1116 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 Ix^2Y&0Kl2;djJ3c literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenSelectStyle explanation.png b/stepmania/Themes/default/Graphics/ScreenSelectStyle explanation.png new file mode 100644 index 0000000000000000000000000000000000000000..8e4db12d8782a2e46c5a1bb0f94829252f174160 GIT binary patch literal 1727 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 literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/ScreenSongOptions header.redir b/stepmania/Themes/default/Graphics/ScreenSongOptions header.redir new file mode 100644 index 0000000000..0b81245246 --- /dev/null +++ b/stepmania/Themes/default/Graphics/ScreenSongOptions header.redir @@ -0,0 +1 @@ +_shared options header.png \ No newline at end of file diff --git a/stepmania/Themes/default/Graphics/ScrollBar parts 1x3.png b/stepmania/Themes/default/Graphics/ScrollBar parts 1x3.png new file mode 100644 index 0000000000000000000000000000000000000000..77d8842770d185203f66aa6050cadc7a2c9f9af9 GIT binary patch literal 964 zcmV;#13UbQP)004R=004l4008;_004mK004C`008P>0026d000+nm#LZ50009| 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 Fe*kxD06qW! literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/_shared footer.png b/stepmania/Themes/default/Graphics/_shared footer.png new file mode 100644 index 0000000000000000000000000000000000000000..d6c8fbbeda93c47fe21a4e3829dbc4c9d09c7a2a GIT binary patch literal 6291 zcmd^j=Tnn!(DhA82qd9Oi4;Ma^j?%+q&F#wAPPSaP?`#ebOjYD3JQqyCMZ$`5kYAJ zfH815|@P__A2O00F3}p@c?-dAQJ%6B5=F_9N~fO8Q=iJKqE4e78pr*Mlz0xyvRgZWG3O5 zkFd-~1ZMgYguDcy5up@3^xqG-isH^9|HQ57#EM-LzTvw%ST7WnJTm(P@K*Ivm1%QGDC^&#L z2OMKg`ivlvk+#4{#WGT`jNk$j4bMcKXCh&kKs+-I$4pyfCND69I0#69P_YmS7DAeZ z(D6_@0ZLndf;bl1A`1n_LdLKhVOS1lSwI|&iiMHqVBiufoxn=Pu^nO9=ma*$U(w#P!~B5<~YG+ZaRU7g5@PG@`B5JbOPTYhL5x; z04}5GcodZ&^baEh5=6ii5s)ATu82`_Cn!ZHNRja};Ib^8C`%#AgR6@46%{g38C=n% zuj_-e05}hTC(B|1+6+KD$!8hCc}DPLUo0~?2LUlq+B_7*u!6H}AO;RDz-bsb9m`I| zaDX^2>MTEfL1<^<44t4z!6<@6Rd7ii#B0)tI#i-DeZ`)>=8ocLqp$m+_~G=;n4|6Q zv`HrFG>4|9rka|Xs;a7rii(nwlDxdUtgNiGw6vt8q`0`asHmujh=`Do5DJCj<>lq! z;o;`y=HlYw5)nCae@|MbJh>EU9y z(Tbt1~sFJsnoMs-2Q zFBEv;6-eZkd9stEmF*){NTTG|4pahL$!vowNlHe{=);+(T)#TN_^1qH)18}upw+oi zWe*eb^#KPrSsak5YNIV5bgmd#3qd{d^%8?g$TgzsN|}Z{r>&GxDc7KB2NrQgl8N?w z>g;BO##-$_sc?zvmNTt)!d~M~f0mXnEDOwLEW2;^)i3Y6rjYFgaSVDm3th)2_A*R( z=oc*7ZXioj`w$f>sxzx9!`4Q9XkupN3lo59%V%8{(zrG{aNr@pRrTzZ>~N9at(T|= z3`5tpU}eg>(n6B`KEFAI(At|kzo1mY;IH3rOeL}dQcqb5`dY0UORsNoLX?qGg{LaV z>$e&@mbx1T#wzQ7KHL&?90bN3XJ{Ff84?Qfo=go+#m&r_Ub0CytyrDfGs6YlGSc3N?WbtPTL%A%#}ytK zw}8{k{)W~J{?qz4RqDCSzWx=KR@3CBu{rMH6dUwg!vv!g%Z7(+Hb2kqShzi6aec*g z&i!F-cB3g9^HXHs;3?o1D-xlcrdS{x*kJ`+xCANXaWRG$ei?ku@Sb-nDb?jH^nK}G zK(HaB(3!Rq_2qkRi#1tT%&*Df`VYOG!(ZsEBgGUgdIF}j6R!QY^7r|6RS;1Wf+f4Uvhmh8hC8w zVL9q`%OhZ8&*0n)WaO{fzCSHcr&EVwwL780EV&iD`Kc*0QBRxE&a)d#^1?OX=$FZFF$TnR3z2tU8NHyk!R(Pn10 zyO_>bf>0>wC+DT;3v}40B$O<;KFKe3X#DfF^JPzmbL4dX126ua)Ejg?pf9qd(TTX# zLBXc~(|bTQ*LYu`P2hA;Cx-*w(#cdeR*mg}5to}yKWM-+_T9l9&EUSjvnKv3aR1U- ze}<2IH)oK;(6Lu(B?x~b)I&bxB~90M$k>k>KHz4TNNpiPQP95zVxcI|^=JInNH`kh zmSAE8l-!!i8D%j#=L5&?6HZsf9~8#3x#&D8{BK^B@?dPhpp;J|LWblJ!fs}|PP?9tpYAfKelLz>OJz9I zi_6}d;~!~18jo*S=Af%?4`xoU;Al<4TTxk@W8Y3`BPM-PwjJ;y(@qC0OmnivX&j;)D&Un7mS z5Eg8Co_pA)zr>5jJ&^rT)&DhF?Ue>+bEKaay1v@1cHR5IO7GV5TAh05lGjW4vPk^* z%rZONSL`}+IX$_<^qE+kYm7L$weGyhc0!>JgW?e_nWKO`m2Al)(x~-!^f-uaCQ>9> z3E5O-H;?B<7DRML{g~2E#1>o#CuVP(aZgqF(O1*crP(z#4KZp_Grl%K zHP%8gd!5vy!|iP{X*1sAXuM7hGPP+l(Y9f5PHMsjod*b@E>}iUd*yQx?5{^2v|jLe z>>C_ZrfrjWU*Lza^<$io@s-t6b#Bf7MK?pY(x={xugMPYCBwovD;Ym0dL!YKpb<8~ z#xUVTYv;Vs*ifJK60td{DegI`)S7|H?}^?;n6*o{N1ny6jA5e9uy-87Uc`eTos`X^ zIFv4!BWZtm(u4dQr0|c1hdyfl6h8jyN}N0SpTVSG>~>;$^!yn;D{1~Tec;EC8_ zAzf>`b+wwJNT--b^(nW|j8`0@44Pu?K7Ubp^Q|`a(nMC_`SF;@iDM5xyNGKA2Njr+ z_gT4OA%XL`cW}s$aop0uLWh5!d@uKaTt!XKLQeI%Cs*36zYtLE`GHS1H`cp45vtR} z&(2$5p%?EJL*KEHlfK}!&zf&$ZyQ<{Fp|L#KuCBt=O(vTv~fOkH|BTtO9Cmpg-_~U zx{%<+kDG~-oZ>v>E>7zD`^(zo#bebWJ%DR%MnSn=bnk@R!Ua1 zqZ`HZFaDEl?P(0u$>JHuw_Kn94a&qtFWK-mR+8nBBmA00QQ7w)y z4QEuEWF^d*gBzv=N_NP5UxLG{_*dITS~Y(MEeOR=!WBPNe|~YHW2RMf@n08qJmcPz zbIYRI!tZa`btpYDwSH$ee0|&o;5a`f#-uzTbFZ-LNdr)G(*_DRKI8hB%Evp-W+8oV&)77E=(sd&w8FQv*hi@jHU}aF5r3a1b)ft9Q{mOIm#C$e zpO9W2trjc~*(2Z{1q9vlbFkpsUinYAqgB zxn9e0#`=kG_9Tv5n?FP@cu31DS1=@ZiCTZ>C@=G@?lKL0Gm%|0dLQFDG;Bgdnv?e^TR%Pq z@~pN{J?eb=<+he_g`PR*8;g*;ya%M)3M21gT&fmvgkA@ITyDZdP35U8@*@YA+g|9S z1zj9VUmphi?}Mkh*zhfdPc@B6iArD{TA&tj6_*8L<9%;u zrnb@9G1j#^1*$F)fPvw-z6bpIJj*D2D#c~)$VX33EJFA_&!z#IRUf?z)h6@2Ao^VI znN=CsWt7aWdlLL5mIE;6o(BBdr6uSRe#>X@%*7j{&`8^O*iX0UzSV<%O3aIIulK9I z1eJ3Yr?@B1glYuKeM)B-Sv~Nhy(3Pmj1{*t6)a8&eTUIxMjSA`9}E`9UKp7KMy*C) zB=B3C#jyN$nG&nx#%&OcIy};8jx=xZv#klX4gA&fp!U$`W;k}#PskA$Rp~qAs86eg z4&T^yxTs%L)!4RoJ9BhNF?OLkWnztB=}gkvN@Y%X$G`NVk4{A&(O;kUZT~Vb&#LXp zpnElF+QpRGw(Xj4g2!KV=d)gaP#2J;@jNQ%BG;Lq{)#?j!RXFGeNBbU>v7{rGlJRq z+uV~{PAob{@~MGSyuQTFiMdsa{9AnEyL1_=uz550nLDWlJJQESiN(2xH=E9Qt?u<# zf1V#t8&*hNe*HBn>O!APRubZjt<~MT+{@JTfXyq7n|A4xFJjUYVZ1WGi)TL_Bn{m& zIX(ZS-Su)x`}kIMcGhm!_=LEs(tl%brDZW^>n)SZKVN$+L|daqpO!<5<0~(II;<-y zx)?GNbUGL5JGA>M7Ta!kWc5R;xr8#9qEPzH%dE%hd7bk%;dc}~3AJRl;k>SA`_s(XWL$_iWi3 z%=<3C`RsEG(w;+p^(DG9NX{!L=HY4d0G{`0x1)|;y~44DpcZ1jZ4iAxjwWA|FJ*xu zAE;CC=9`DfpQp0-o~%TcLh40G%Wp$UB14S4=8FoasEcLwYDFFom@;)LW1&^y(biw~ zSs8IH5@ystwZ!fP+Vjj_Jou;2n=+{2JvDr>DNSRyuak5=QNOL3ToIv+3^@I;$H7p= zLEx@ZiD*_q_xx~qf^uA6oy8uzr}vlU@K^5K=(zBNA?6}%bI9$M3J6T`9)Xvk{+J9FG5;9sFxUV_Bx02gp4O7K^ zW?%I~UAZ1n`P|60DlTFszvkO7AK8C*kJ55-gwDB)K0Z6$P~*I(TT{&a&Az=p^NyE0_|tf5SStTC%_5o4TKR31P;0=qZ_hnhqVu z;=&ZUlQ36O!dPz8&2O2jONY))N7^pCCvBPRcn8buGkTZn-u{>u`g^?!-J!2thISKe*BS2V>-cWAj4S#R9=LhWUee-EpG}-z z|Hk^-_y}#!@HeLAJIecZ&r2r0pRK~TAERXgGfE>-Pmji#qQB+Vl=@Fk#kPi*cjB^% z2A^u6N`DlRo$Cz#IcDFfqWh!mYZ*HP7O3G3p?&h6T9F~lAz9M6<$B#$_L$7m$^X_! zcY7CREwk>HwK44-4A7pkO;!pJLfHgM;-faU^Vr9Rv67nU{s0q#<|-VIRB{Lxe&E6Q z-tm+_CBHI3VAd%EjN!H zTjo5#6F|^tqkCE+L!3lPsvn|d3afZBkUz8Zgg0F#hji2RZ^-ys$_>;nueD?C%`4FmM_9Pvr>D6M7e5$YkyK9% zfbQhyFtIYY-jmVzTlCqiH(;ZA*&;IV_IaMEUl&4qxC6s`ja(edy*_dtzIgx3^P#JI zWlvsjd4~O3mbzwksBph0xkd|hzhx|ixyi0%g#QC4XwxYG literal 0 HcmV?d00001 diff --git a/stepmania/Themes/default/Graphics/_shared menu header.png b/stepmania/Themes/default/Graphics/_shared menu header.png new file mode 100644 index 0000000000000000000000000000000000000000..21026e183855c7e19e8829f5924dee6b4147256f GIT binary patch literal 3640 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 U3RZKMF(18F#0MKm23~lJ&(MSNU03i43 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 0 ); + time = max( time, 0 ); + ASSERT( m_TweenStates.size() < 50 ); // there's no reason for the number of tweens to ever go this large // add a new TweenState to the tail, and initialize it @@ -551,8 +553,7 @@ void Actor::Fade( float fSleepSeconds, CString sFadeString, float fFadeSeconds, void Actor::Command( CString sCommandString ) { - // add a snap tween in case the user forgets to use a tween as the first command -// BeginTweening( 0.0001f, TWEEN_LINEAR ); + // OPTIMIZATION OPPORTUNITY: sCommandString could be parsed much more efficiently. CStringArray asCommands; split( sCommandString, ";", asCommands, true ); @@ -623,8 +624,13 @@ void Actor::Command( CString sCommandString ) else if( sName=="additiveblend" ) EnableAdditiveBlend( iParam(0)!=0 ); else { - LOG->Warn( "Unrecognized command name '%s' in command string '%s'.", sName.GetString(), sCommandString.GetString() ); - ASSERT(0); + CString sError = ssprintf( "Unrecognized command name '%s' in command string '%s'.", sName.GetString(), sCommandString.GetString() ); + LOG->Warn( sError ); +#if defined(WIN32) // XXX arch? + if( DISPLAY->IsWindowed() ) + MessageBox(NULL, sError, "Actor::Command", MB_OK); +#endif + } } } diff --git a/stepmania/src/BPMDisplay.cpp b/stepmania/src/BPMDisplay.cpp index 78bc542108..6df694f3a6 100644 --- a/stepmania/src/BPMDisplay.cpp +++ b/stepmania/src/BPMDisplay.cpp @@ -29,13 +29,13 @@ BPMDisplay::BPMDisplay() m_fTimeLeftInState = 0; m_bExtraStage = GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2(); - m_textBPM.LoadFromNumbers( THEME->GetPathTo("Numbers","select music bpm numbers") ); + m_textBPM.LoadFromNumbers( THEME->GetPathTo("Numbers","BPMDisplay numbers") ); m_textBPM.EnableShadow( false ); m_textBPM.SetHorizAlign( Actor::align_right ); m_textBPM.SetDiffuse( NORMAL_COLOR ); m_textBPM.SetXY( 0, 0 ); - m_sprLabel.Load( THEME->GetPathTo("Graphics","select music bpm label") ); + m_sprLabel.Load( THEME->GetPathTo("Graphics","BPMDisplay label") ); m_sprLabel.EnableShadow( false ); m_sprLabel.SetDiffuse( NORMAL_COLOR ); m_sprLabel.SetHorizAlign( Actor::align_left ); diff --git a/stepmania/src/Background.cpp b/stepmania/src/Background.cpp index e9a21b3126..5550379b31 100644 --- a/stepmania/src/Background.cpp +++ b/stepmania/src/Background.cpp @@ -154,7 +154,7 @@ void Background::LoadFromSong( Song* pSong ) const float fXZoom = RECT_BACKGROUND.GetWidth() / (float)SCREEN_WIDTH; const float fYZoom = RECT_BACKGROUND.GetHeight() / (float)SCREEN_HEIGHT; - const CString sSongBackgroundPath = pSong->HasBackground() ? pSong->GetBackgroundPath() : THEME->GetPathTo("Graphics","fallback background"); + const CString sSongBackgroundPath = pSong->HasBackground() ? pSong->GetBackgroundPath() : THEME->GetPathTo("Graphics","Background fallback"); // // Load the static background that will before notes start and after notes end diff --git a/stepmania/src/Banner.cpp b/stepmania/src/Banner.cpp index 804ee2c63a..dfd573625c 100644 --- a/stepmania/src/Banner.cpp +++ b/stepmania/src/Banner.cpp @@ -76,24 +76,22 @@ void Banner::LoadFromSong( Song* pSong ) // NULL means no song m_bScrolling = false; } +void Banner::LoadAllMusic() +{ + Load( THEME->GetPathTo("Graphics","Banner all") ); + m_bScrolling = false; +} + void Banner::LoadFromGroup( CString sGroupName ) { CString sGroupBannerPath = SONGMAN->GetGroupBannerPath( sGroupName ); - - if( sGroupName == GROUP_ALL_MUSIC ) - Load( THEME->GetPathTo("Graphics","all music banner") ); - else if( sGroupBannerPath != "" ) - Load( sGroupBannerPath ); - else - LoadFallback(); - + if( sGroupBannerPath != "" ) Load( sGroupBannerPath ); + else LoadFallback(); m_bScrolling = false; } void Banner::LoadFromCourse( Course* pCourse ) // NULL means no course { - Sprite::EnableShadow( false ); - if( pCourse == NULL ) LoadFallback(); else if( pCourse->m_sBannerPath != "" ) Load( pCourse->m_sBannerPath ); else LoadFallback(); @@ -103,12 +101,12 @@ void Banner::LoadFromCourse( Course* pCourse ) // NULL means no course void Banner::LoadFallback() { - Load( THEME->GetPathTo("Graphics","fallback banner") ); + Load( THEME->GetPathTo("Graphics","Banner fallback") ); } void Banner::LoadRoulette() { - RageTextureID ID(THEME->GetPathTo("Graphics","select music roulette banner")); + RageTextureID ID(THEME->GetPathTo("Graphics","Banner roulette")); ID.iMipMaps = 0; Load( ID ); m_bScrolling = true; diff --git a/stepmania/src/Banner.h b/stepmania/src/Banner.h index 61f2da0708..40ba3344f8 100644 --- a/stepmania/src/Banner.h +++ b/stepmania/src/Banner.h @@ -27,6 +27,7 @@ public: virtual void Update( float fDeltaTime ); void LoadFromSong( Song* pSong ); // NULL means no song + void LoadAllMusic(); void LoadFromGroup( CString sGroupName ); void LoadFromCourse( Course* pCourse ); void LoadRoulette(); diff --git a/stepmania/src/BannerWithFrame.cpp b/stepmania/src/BannerWithFrame.cpp index 54eaa88a65..0aabf05a8f 100644 --- a/stepmania/src/BannerWithFrame.cpp +++ b/stepmania/src/BannerWithFrame.cpp @@ -21,7 +21,7 @@ BannerWithFrame::BannerWithFrame() { - m_sprBannerFrame.Load( THEME->GetPathTo("Graphics","evaluation banner frame") ); + m_sprBannerFrame.Load( THEME->GetPathTo("Graphics","BannerWithFrame frame") ); m_Banner.SetCroppedSize( m_sprBannerFrame.GetUnzoomedWidth()-6, m_sprBannerFrame.GetUnzoomedHeight()-6 ); this->AddChild( &m_Banner ); diff --git a/stepmania/src/Combo.cpp b/stepmania/src/Combo.cpp index ba5cefaf0d..40294e3320 100644 --- a/stepmania/src/Combo.cpp +++ b/stepmania/src/Combo.cpp @@ -53,7 +53,7 @@ Combo::Combo() Reset(); - m_sprCombo.Load( THEME->GetPathTo("Graphics", "gameplay combo label") ); + m_sprCombo.Load( THEME->GetPathTo("Graphics", "Combo label") ); m_sprCombo.EnableShadow( true ); m_sprCombo.StopAnimating(); m_sprCombo.SetXY( LABEL_X, LABEL_Y ); @@ -61,7 +61,7 @@ Combo::Combo() m_sprCombo.SetVertAlign( (Actor::VertAlign)(int)LABEL_VERT_ALIGN ); this->AddChild( &m_sprCombo ); - m_textComboNumber.LoadFromNumbers( THEME->GetPathTo("Numbers","gameplay combo numbers") ); + m_textComboNumber.LoadFromNumbers( THEME->GetPathTo("Numbers","Combo numbers") ); m_textComboNumber.EnableShadow( true ); m_textComboNumber.SetXY( NUMBER_X, NUMBER_Y ); m_textComboNumber.SetHorizAlign( (Actor::HorizAlign)(int)NUMBER_HORIZ_ALIGN ); @@ -95,7 +95,7 @@ void Combo::SetScore( TapNoteScore score, int iNumNotesInThisRow, Inventory* pIn case TNS_PERFECT: m_iCurComboOfPerfects += iNumNotesInThisRow; - if( rand() < 0.1f && m_iCurComboOfPerfects>=150 && (m_iCurComboOfPerfects%150)==0 && !GAMESTATE->m_bDemonstration ) + if( rand() < 0.1f && m_iCurComboOfPerfects>=150 && (m_iCurComboOfPerfects%150)==0 && !GAMESTATE->m_bDemonstrationOrJukebox ) SCREENMAN->SendMessageToTopScreen( SM_BeginToasty, 0 ); break; default: diff --git a/stepmania/src/CourseContentsList.h b/stepmania/src/CourseContentsList.h index 88485153e3..8401f14933 100644 --- a/stepmania/src/CourseContentsList.h +++ b/stepmania/src/CourseContentsList.h @@ -11,7 +11,7 @@ ----------------------------------------------------------------------------- */ -#include "FootMeter.h" +#include "DifficultyMeter.h" #include "BitmapText.h" #include "TextBanner.h" #include "ActorFrame.h" diff --git a/stepmania/src/CourseEntryDisplay.h b/stepmania/src/CourseEntryDisplay.h index 9dbdf66c57..abe5030b95 100644 --- a/stepmania/src/CourseEntryDisplay.h +++ b/stepmania/src/CourseEntryDisplay.h @@ -11,12 +11,12 @@ ----------------------------------------------------------------------------- */ -#include "FootMeter.h" #include "BitmapText.h" #include "TextBanner.h" #include "ActorFrame.h" #include "Sprite.h" #include "Quad.h" +#include "GameConstantsAndTypes.h" class Course; class Song; struct Notes; diff --git a/stepmania/src/FootMeter.cpp b/stepmania/src/DifficultyMeter.cpp similarity index 77% rename from stepmania/src/FootMeter.cpp rename to stepmania/src/DifficultyMeter.cpp index 4a039e1327..417081bafa 100644 --- a/stepmania/src/FootMeter.cpp +++ b/stepmania/src/DifficultyMeter.cpp @@ -1,7 +1,7 @@ #include "global.h" /* ----------------------------------------------------------------------------- - Class: FootMeter + Class: DifficultyMeter Desc: See header. @@ -10,7 +10,7 @@ ----------------------------------------------------------------------------- */ -#include "FootMeter.h" +#include "DifficultyMeter.h" #include "RageUtil.h" #include "GameConstantsAndTypes.h" #include "PrefsManager.h" @@ -23,19 +23,19 @@ const int NUM_FEET_IN_METER = 10; const int GLOW_IF_METER_GREATER_THAN = 9; -FootMeter::FootMeter() +DifficultyMeter::DifficultyMeter() { - BitmapText::LoadFromTextureAndChars( THEME->GetPathTo("Graphics","select music meter 2x1"), "10" ); + BitmapText::LoadFromTextureAndChars( THEME->GetPathTo("Graphics","DifficultyMeter bar 2x1"), "10" ); SetFromNotes( NULL ); } -void FootMeter::SetFromNotes( Notes* pNotes ) +void DifficultyMeter::SetFromNotes( Notes* pNotes ) { if( pNotes != NULL ) { SetDiffuse( RageColor(1,1,1,1) ); - SetNumFeet( pNotes->GetMeter() ); + SetMeter( pNotes->GetMeter() ); if( pNotes->GetMeter() > GLOW_IF_METER_GREATER_THAN ) this->SetEffectGlowShift(); else @@ -47,18 +47,18 @@ void FootMeter::SetFromNotes( Notes* pNotes ) { this->SetEffectNone(); SetDiffuse( RageColor(0.8f,0.8f,0.8f,1) ); - SetNumFeet( 0 ); + SetMeter( 0 ); } } -void FootMeter::SetNumFeet( int iNumFeet ) +void DifficultyMeter::SetMeter( int iMeter ) { CString sNewText; int f; for( f=0; fGetPathTo("Graphics",ssprintf("edit menu %s",(i==0?"left":"right"))) ); + m_sprArrows[i].Load( THEME->GetPathTo("Graphics",ssprintf("EditMenu %s",(i==0?"left":"right"))) ); m_sprArrows[i].SetX( ARROWS_X(i) ); this->AddChild( &m_sprArrows[i] ); } @@ -98,8 +98,8 @@ EditMenu::EditMenu() this->AddChild( &m_SourceMeter ); - m_soundChangeRow.Load( THEME->GetPathTo("sounds","edit menu row") ); - m_soundChangeValue.Load( THEME->GetPathTo("sounds","edit menu value") ); + m_soundChangeRow.Load( THEME->GetPathTo("sounds","EditMenu row") ); + m_soundChangeValue.Load( THEME->GetPathTo("sounds","EditMenu value") ); // fill in data structures diff --git a/stepmania/src/EditMenu.h b/stepmania/src/EditMenu.h index 14824cc5e3..2496edaeb0 100644 --- a/stepmania/src/EditMenu.h +++ b/stepmania/src/EditMenu.h @@ -16,7 +16,7 @@ #include "Banner.h" #include "TextBanner.h" #include "GameConstantsAndTypes.h" -#include "FootMeter.h" +#include "DifficultyMeter.h" #include "RandomSample.h" @@ -109,8 +109,8 @@ private: Banner m_GroupBanner; Banner m_SongBanner; TextBanner m_SongTextBanner; - FootMeter m_Meter; - FootMeter m_SourceMeter; + DifficultyMeter m_Meter; + DifficultyMeter m_SourceMeter; CStringArray m_sGroups; vector m_NotesTypes; diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index e1bb53c76d..08ac30c6c5 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -74,7 +74,7 @@ void GameState::Reset() m_SongSortOrder = SORT_GROUP; m_PlayMode = PLAY_MODE_INVALID; m_bEditing = false; - m_bDemonstration = false; + m_bDemonstrationOrJukebox = false; m_bJukeboxUsesModifiers = false; m_iCurrentStageIndex = 0; m_bAllow2ndExtraStage = true; @@ -181,7 +181,7 @@ bool GameState::IsExtraStage2() CString GameState::GetStageText() { - if( m_bDemonstration ) return STAGE_TEXT_DEMO; + if( m_bDemonstrationOrJukebox ) return STAGE_TEXT_DEMO; else if( IsFinalStage() ) return STAGE_TEXT_FINAL; else if( IsExtraStage() ) return STAGE_TEXT_EXTRA1; else if( IsExtraStage2() ) return STAGE_TEXT_EXTRA2; @@ -210,7 +210,7 @@ CString GameState::GetStageText() RageColor GameState::GetStageColor() { - if( m_bDemonstration ) return STAGE_COLOR_DEMO; + if( m_bDemonstrationOrJukebox ) return STAGE_COLOR_DEMO; else if( m_PlayMode==PLAY_MODE_NONSTOP ) return STAGE_COLOR_NONSTOP; else if( m_PlayMode==PLAY_MODE_ONI ) return STAGE_COLOR_ONI; else if( m_PlayMode==PLAY_MODE_ENDLESS ) return STAGE_COLOR_ENDLESS; diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index 652c7e0c89..cc0946cbf1 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -73,7 +73,7 @@ public: Difficulty m_PreferredDifficulty[NUM_PLAYERS]; SongSortOrder m_SongSortOrder; // used by MusicWheel bool m_bEditing; // NoteField does special stuff when this is true - bool m_bDemonstration; // ScreenGameplay does special stuff when this is true + bool m_bDemonstrationOrJukebox; // ScreenGameplay does special stuff when this is true bool m_bJukeboxUsesModifiers; int m_iCurrentStageIndex; // incremented on Eval screen. For a Course, this is always 0 diff --git a/stepmania/src/GradeDisplay.cpp b/stepmania/src/GradeDisplay.cpp index fb739dbc60..4d89b43643 100644 --- a/stepmania/src/GradeDisplay.cpp +++ b/stepmania/src/GradeDisplay.cpp @@ -26,7 +26,7 @@ const float GRADES_TO_SCROLL = NUM_GRADE_FRAMES*4; GradeDisplay::GradeDisplay() { - RageTextureID id( THEME->GetPathTo("Graphics",ssprintf("evaluation grades 1x%d",NUM_GRADE_FRAMES)) ); + RageTextureID id( THEME->GetPathTo("Graphics",ssprintf("GradeDisplay grades 1x%d",NUM_GRADE_FRAMES)) ); id.bStretch = true; Load( id ); StopAnimating(); diff --git a/stepmania/src/GrooveRadar.cpp b/stepmania/src/GrooveRadar.cpp index 9af84f7fde..076d74a0ca 100644 --- a/stepmania/src/GrooveRadar.cpp +++ b/stepmania/src/GrooveRadar.cpp @@ -36,7 +36,7 @@ GrooveRadar::GrooveRadar() for( int c=0; cGetPathTo("Graphics","select music radar labels 1x5") ); + m_sprRadarLabels[c].Load( THEME->GetPathTo("Graphics","GrooveRadar labels 1x5") ); m_sprRadarLabels[c].StopAnimating(); m_sprRadarLabels[c].SetState( c ); m_sprRadarLabels[c].SetXY( LABEL_OFFSET_X(c), LABEL_OFFSET_Y(c) ); @@ -84,7 +84,7 @@ void GrooveRadar::TweenOffScreen() GrooveRadar::GrooveRadarValueMap::GrooveRadarValueMap() { - m_sprRadarBase.Load( THEME->GetPathTo("Graphics","select music radar base") ); + m_sprRadarBase.Load( THEME->GetPathTo("Graphics","GrooveRadar base") ); this->AddChild( &m_sprRadarBase ); for( int p=0; pGetPathTo("Graphics","select group button") ); + m_sprButton[i].Load( THEME->GetPathTo("Graphics","GroupList button") ); m_sprButton[i].SetXY( BUTTON_X, BUTTON_START_Y + i*BUTTON_SPACING_Y ); this->AddChild( &m_sprButton[i] ); this->AddChild( &m_screenLabels[i] ); @@ -30,7 +30,7 @@ void GroupList::DoneAddingGroups() for( i=0; iGetPathTo("Fonts","select group button label") ); + m_screenLabels[i].LoadFromFont( THEME->GetPathTo("Fonts","GroupList label") ); m_screenLabels[i].SetXY( BUTTON_X, BUTTON_START_Y + i*BUTTON_SPACING_Y ); m_screenLabels[i].SetShadowLength( 2 ); diff --git a/stepmania/src/HoldJudgment.cpp b/stepmania/src/HoldJudgment.cpp index 497dc4153a..e80bae4fb4 100644 --- a/stepmania/src/HoldJudgment.cpp +++ b/stepmania/src/HoldJudgment.cpp @@ -17,73 +17,58 @@ #include "ThemeManager.h" -CachedThemeMetric OK_ZOOM_X ("HoldJudgment","OKZoomX"); -CachedThemeMetric OK_ZOOM_Y ("HoldJudgment","OKZoomY"); -CachedThemeMetric TWEEN_SECONDS ("HoldJudgment","TweenSeconds"); -CachedThemeMetric SHOW_SECONDS ("HoldJudgment","ShowSeconds"); +CachedThemeMetric OK_COMMAND ("HoldJudgment","OKCommand"); +CachedThemeMetric NG_COMMAND ("HoldJudgment","NGCommand"); HoldJudgment::HoldJudgment() { - OK_ZOOM_X.Refresh(); - OK_ZOOM_Y.Refresh(); - TWEEN_SECONDS.Refresh(); - SHOW_SECONDS.Refresh(); + OK_COMMAND.Refresh(); + NG_COMMAND.Refresh(); - m_fShowCountdown = 0; - m_sprJudgment.Load( THEME->GetPathTo("Graphics","gameplay hold Judgment 1x2") ); + m_sprJudgment.Load( THEME->GetPathTo("Graphics","HoldJudgment 1x2") ); m_sprJudgment.StopAnimating(); - m_sprJudgment.EnableShadow( true ); + Reset(); this->AddChild( &m_sprJudgment ); } void HoldJudgment::Update( float fDeltaTime ) { ActorFrame::Update( fDeltaTime ); - - m_fShowCountdown -= fDeltaTime; - if( m_fShowCountdown < 0 ) - m_fShowCountdown = 0; } void HoldJudgment::DrawPrimitives() { - if( m_fShowCountdown > 0 ) - { - ActorFrame::DrawPrimitives(); - } + ActorFrame::DrawPrimitives(); +} + +void HoldJudgment::Reset() +{ + m_sprJudgment.SetDiffuse( RageColor(1,1,1,0) ); + m_sprJudgment.SetXY( 0, 0 ); + m_sprJudgment.StopTweening(); + m_sprJudgment.SetEffectNone(); } void HoldJudgment::SetHoldJudgment( HoldNoteScore hns ) { //LOG->Trace( "Judgment::SetJudgment()" ); + Reset(); + switch( hns ) { - case HNS_NONE: m_sprJudgment.SetState( 0 ); break; - case HNS_OK: m_sprJudgment.SetState( 0 ); break; - case HNS_NG: m_sprJudgment.SetState( 1 ); break; - default: ASSERT( false ); - } - - m_fShowCountdown = SHOW_SECONDS; - - if( hns == HNS_NG ) - { - // falling down - m_sprJudgment.StopTweening(); - m_sprJudgment.SetY( -10 ); - m_sprJudgment.SetZoom( 1.0f ); - m_sprJudgment.BeginTweening( SHOW_SECONDS ); - m_sprJudgment.SetTweenY( 10 ); - } - else // hns == HNS_OK - { - // zooming out - m_sprJudgment.StopTweening(); - m_sprJudgment.SetZoomX( OK_ZOOM_X ); - m_sprJudgment.SetZoomY( OK_ZOOM_Y ); - m_sprJudgment.BeginTweening( TWEEN_SECONDS ); - m_sprJudgment.SetTweenZoom( 1.0f ); + case HNS_NONE: + ASSERT(0); + case HNS_OK: + m_sprJudgment.SetState( 0 ); + m_sprJudgment.Command( OK_COMMAND ); + break; + case HNS_NG: + m_sprJudgment.SetState( 1 ); + m_sprJudgment.Command( NG_COMMAND ); + break; + default: + ASSERT(0); } } diff --git a/stepmania/src/HoldJudgment.h b/stepmania/src/HoldJudgment.h index 6eaf6d4a7a..102f9a4cdf 100644 --- a/stepmania/src/HoldJudgment.h +++ b/stepmania/src/HoldJudgment.h @@ -22,13 +22,15 @@ class HoldJudgment : public ActorFrame { public: HoldJudgment(); - void SetHoldJudgment( HoldNoteScore hns ); + virtual void Update( float fDeltaTime ); virtual void DrawPrimitives(); + void Reset(); + void SetHoldJudgment( HoldNoteScore hns ); + protected: Sprite m_sprJudgment; - float m_fShowCountdown; }; #endif diff --git a/stepmania/src/Judgment.cpp b/stepmania/src/Judgment.cpp index 4d136a63a4..6c70e9c1ed 100644 --- a/stepmania/src/Judgment.cpp +++ b/stepmania/src/Judgment.cpp @@ -18,109 +18,81 @@ #include "ThemeManager.h" -CachedThemeMetric WORD_X ("Judgment","WordX"); -CachedThemeMetric WORD_Y ("Judgment","WordY"); -CachedThemeMetric MARVELOUS_ZOOM ("Judgment","MarvelousZoom"); -CachedThemeMetric PERFECT_ZOOM ("Judgment","PerfectZoom"); -CachedThemeMetric GREAT_ZOOM ("Judgment","GreatZoom"); -CachedThemeMetric GOOD_ZOOM ("Judgment","GoodZoom"); -CachedThemeMetric BOO_ZOOM ("Judgment","BooZoom"); -CachedThemeMetric J_TWEEN_SECONDS ("Judgment","TweenSeconds"); -CachedThemeMetric J_SHOW_SECONDS ("Judgment","ShowSeconds"); +CachedThemeMetric MARVELOUS_COMMAND ("Judgment","MarvelousCommand"); +CachedThemeMetric PERFECT_COMMAND ("Judgment","PerfectCommand"); +CachedThemeMetric GREAT_COMMAND ("Judgment","GreatCommand"); +CachedThemeMetric GOOD_COMMAND ("Judgment","GoodCommand"); +CachedThemeMetric BOO_COMMAND ("Judgment","BooCommand"); +CachedThemeMetric MISS_COMMAND ("Judgment","MissCommand"); Judgment::Judgment() { - WORD_X.Refresh(); - WORD_Y.Refresh(); - MARVELOUS_ZOOM.Refresh(); - PERFECT_ZOOM.Refresh(); - GREAT_ZOOM.Refresh(); - GOOD_ZOOM.Refresh(); - BOO_ZOOM.Refresh(); - J_TWEEN_SECONDS.Refresh(); - J_SHOW_SECONDS.Refresh(); + MARVELOUS_COMMAND.Refresh(); + PERFECT_COMMAND.Refresh(); + GREAT_COMMAND.Refresh(); + GOOD_COMMAND.Refresh(); + BOO_COMMAND.Refresh(); + MISS_COMMAND.Refresh(); - m_fShowCountdown = 0; - m_sprJudgment.Load( THEME->GetPathTo("Graphics","gameplay Judgment 1x6") ); - m_sprJudgment.SetXY( WORD_X, WORD_Y ); + m_sprJudgment.Load( THEME->GetPathTo("Graphics","Judgment 1x6") ); m_sprJudgment.StopAnimating(); - m_sprJudgment.EnableShadow( true ); + Reset(); this->AddChild( &m_sprJudgment ); } void Judgment::Update( float fDeltaTime ) { ActorFrame::Update( fDeltaTime ); - - m_fShowCountdown -= fDeltaTime; - if( m_fShowCountdown < 0 ) - m_fShowCountdown = 0; } void Judgment::DrawPrimitives() { - if( m_fShowCountdown > 0 ) - { - ActorFrame::DrawPrimitives(); - } + ActorFrame::DrawPrimitives(); } +void Judgment::Reset() +{ + m_sprJudgment.SetDiffuse( RageColor(1,1,1,0) ); + m_sprJudgment.SetXY( 0, 0 ); + m_sprJudgment.StopTweening(); + m_sprJudgment.SetEffectNone(); +} + void Judgment::SetJudgment( TapNoteScore score ) { //LOG->Trace( "Judgment::SetJudgment()" ); + Reset(); + switch( score ) { - case TNS_MARVELOUS: m_sprJudgment.SetState( 0 ); break; - case TNS_PERFECT: m_sprJudgment.SetState( 1 ); break; - case TNS_GREAT: m_sprJudgment.SetState( 2 ); break; - case TNS_GOOD: m_sprJudgment.SetState( 3 ); break; - case TNS_BOO: m_sprJudgment.SetState( 4 ); break; - case TNS_MISS: m_sprJudgment.SetState( 5 ); break; - default: ASSERT(0); + case TNS_MARVELOUS: + m_sprJudgment.SetState( 0 ); + m_sprJudgment.Command( MARVELOUS_COMMAND ); + break; + case TNS_PERFECT: + m_sprJudgment.SetState( 1 ); + m_sprJudgment.Command( PERFECT_COMMAND ); + break; + case TNS_GREAT: + m_sprJudgment.SetState( 2 ); + m_sprJudgment.Command( GREAT_COMMAND ); + break; + case TNS_GOOD: + m_sprJudgment.SetState( 3 ); + m_sprJudgment.Command( GOOD_COMMAND ); + break; + case TNS_BOO: + m_sprJudgment.SetState( 4 ); + m_sprJudgment.Command( BOO_COMMAND ); + break; + case TNS_MISS: + m_sprJudgment.SetState( 5 ); + m_sprJudgment.Command( MISS_COMMAND ); + break; + default: + ASSERT(0); } - - m_fShowCountdown = J_SHOW_SECONDS; - - m_sprJudgment.SetEffectNone(); - m_sprJudgment.StopTweening(); - - if( score == TNS_MISS ) - { - // falling down - m_sprJudgment.SetY( -20 ); - m_sprJudgment.BeginTweening( J_SHOW_SECONDS ); - m_sprJudgment.SetTweenY( 20 ); - } - else if( score == TNS_BOO ) - { - // vibrate - m_sprJudgment.SetY( 0 ); - m_sprJudgment.SetZoom( 1.0f ); - m_sprJudgment.SetEffectVibrate(); - } - else - { - // zooming out - float fZoom; - switch( score ) - { - case TNS_MARVELOUS: fZoom = MARVELOUS_ZOOM; break; - case TNS_PERFECT: fZoom = PERFECT_ZOOM; break; - case TNS_GREAT: fZoom = GREAT_ZOOM; break; - case TNS_GOOD: fZoom = GOOD_ZOOM; break; - default: ASSERT(0); fZoom = 1; break; - } - m_sprJudgment.SetY( 0 ); - m_sprJudgment.SetZoom( fZoom ); - m_sprJudgment.BeginTweening( J_TWEEN_SECONDS ); - m_sprJudgment.SetTweenZoom( 1 ); - } - - if( score == TNS_MARVELOUS ) - m_sprJudgment.SetEffectGlowBlink(0.05f, RageColor(1,1,1,0), RageColor(1,1,1,0.5f)); - else - m_sprJudgment.SetEffectNone(); } diff --git a/stepmania/src/Judgment.h b/stepmania/src/Judgment.h index 427b125ec8..02387b7d46 100644 --- a/stepmania/src/Judgment.h +++ b/stepmania/src/Judgment.h @@ -23,14 +23,15 @@ class Judgment : public ActorFrame public: Judgment(); virtual ~Judgment() { } - void SetJudgment( TapNoteScore score ); + virtual void Update( float fDeltaTime ); virtual void DrawPrimitives(); - virtual void Reset() { m_fShowCountdown = .0f; } + + void Reset(); + void SetJudgment( TapNoteScore score ); protected: Sprite m_sprJudgment; - float m_fShowCountdown; }; #endif diff --git a/stepmania/src/JukeboxMenu.h b/stepmania/src/JukeboxMenu.h index a77f1dd4aa..3268c388b4 100644 --- a/stepmania/src/JukeboxMenu.h +++ b/stepmania/src/JukeboxMenu.h @@ -15,7 +15,6 @@ #include "Banner.h" #include "TextBanner.h" #include "GameConstantsAndTypes.h" -#include "FootMeter.h" #include "RandomSample.h" #include "Style.h" diff --git a/stepmania/src/LifeMeterBar.cpp b/stepmania/src/LifeMeterBar.cpp index b359fed430..79e94aea1a 100644 --- a/stepmania/src/LifeMeterBar.cpp +++ b/stepmania/src/LifeMeterBar.cpp @@ -58,13 +58,13 @@ public: CString sGraphicPath; - sGraphicPath = ssprintf("gameplay %slifemeter stream normal", bExtra?"extra ":""); + sGraphicPath = ssprintf("LifeMeterBar %snormal", bExtra?"extra ":""); m_sprStreamNormal.Load( THEME->GetPathTo("Graphics", sGraphicPath) ); - sGraphicPath = ssprintf("gameplay %slifemeter stream hot", bExtra?"extra ":""); + sGraphicPath = ssprintf("LifeMeterBar %shot", bExtra?"extra ":""); m_sprStreamHot.Load( THEME->GetPathTo("Graphics", sGraphicPath) ); - sGraphicPath = ssprintf("gameplay %slifemeter bar", bExtra?"extra ":""); + sGraphicPath = ssprintf("LifeMeterBar %sframe", bExtra?"extra ":""); m_sprFrame.Load( THEME->GetPathTo("Graphics", sGraphicPath) ); } diff --git a/stepmania/src/LifeMeterBattery.cpp b/stepmania/src/LifeMeterBattery.cpp index d8d6907cc5..0ac5ce83e5 100644 --- a/stepmania/src/LifeMeterBattery.cpp +++ b/stepmania/src/LifeMeterBattery.cpp @@ -39,8 +39,8 @@ LifeMeterBattery::LifeMeterBattery() m_fBatteryBlinkTime = 0; - m_soundGainLife.Load( THEME->GetPathTo("Sounds","gameplay oni gain life") ); - m_soundLoseLife.Load( THEME->GetPathTo("Sounds","gameplay oni lose life") ); + m_soundGainLife.Load( THEME->GetPathTo("Sounds","LifeMeterBattery gain") ); + m_soundLoseLife.Load( THEME->GetPathTo("Sounds","LifeMeterBattery lose") ); } void LifeMeterBattery::Load( PlayerNumber pn ) @@ -49,34 +49,27 @@ void LifeMeterBattery::Load( PlayerNumber pn ) bool bPlayerEnabled = GAMESTATE->IsPlayerEnabled(pn); - m_sprFrame.Load( THEME->GetPathTo("Graphics","gameplay lifemeter oni") ); + m_sprFrame.Load( THEME->GetPathTo("Graphics","LifeMeterBattery frame") ); this->AddChild( &m_sprFrame ); - m_sprBattery.Load( THEME->GetPathTo("Graphics","gameplay lifemeter battery") ); + m_sprBattery.Load( THEME->GetPathTo("Graphics","LifeMeterBattery lives 1x4") ); m_sprBattery.StopAnimating(); if( bPlayerEnabled ) this->AddChild( &m_sprBattery ); - m_textNumLives.LoadFromNumbers( THEME->GetPathTo("Numbers","gameplay battery life numbers") ); + m_textNumLives.LoadFromNumbers( THEME->GetPathTo("Numbers","LifeMeterBattery life numbers") ); m_textNumLives.SetDiffuse( RageColor(1,1,1,1) ); m_textNumLives.EnableShadow( false ); if( bPlayerEnabled ) this->AddChild( &m_textNumLives ); + m_textPercent.LoadFromNumbers( THEME->GetPathTo("Numbers","LifeMeterBattery percent numbers") ); + m_textPercent.EnableShadow( false ); + m_textPercent.SetZoom( 0.7f ); if(PREFSMAN->m_bDancePointsForOni) - { - m_textPercent.LoadFromNumbers( THEME->GetPathTo("Numbers","gameplay battery dance point numbers") ); - m_textPercent.EnableShadow( false ); - m_textPercent.SetZoom( 0.7f ); m_textPercent.SetText( " " ); - } else - { - m_textPercent.LoadFromNumbers( THEME->GetPathTo("Numbers","gameplay battery percent numbers") ); - m_textPercent.EnableShadow( false ); - m_textPercent.SetZoom( 0.7f ); m_textPercent.SetText( "00.0%" ); - } if( bPlayerEnabled ) this->AddChild( &m_textPercent ); diff --git a/stepmania/src/MenuElements.cpp b/stepmania/src/MenuElements.cpp index b390ba5ecf..6b55507d98 100644 --- a/stepmania/src/MenuElements.cpp +++ b/stepmania/src/MenuElements.cpp @@ -24,263 +24,120 @@ #include "ThemeManager.h" -#define TOP_EDGE_X THEME->GetMetricF("MenuElements","TopEdgeX") -#define TOP_EDGE_Y THEME->GetMetricF("MenuElements","TopEdgeY") -#define BOTTOM_EDGE_X THEME->GetMetricF("MenuElements","BottomEdgeX") -#define BOTTOM_EDGE_Y THEME->GetMetricF("MenuElements","BottomEdgeY") -#define STYLE_ICON_X THEME->GetMetricF("MenuElements","StyleIconX") -#define STYLE_ICON_Y THEME->GetMetricF("MenuElements","StyleIconY") -#define TIMER_X THEME->GetMetricF("MenuElements","TimerX") -#define TIMER_Y THEME->GetMetricF("MenuElements","TimerY") -#define HELP_X THEME->GetMetricF("MenuElements","HelpX") -#define HELP_Y THEME->GetMetricF("MenuElements","HelpY") +#define HEADER_ON_COMMAND THEME->GetMetric("MenuElements","HeaderOnCommand") +#define HEADER_OFF_COMMAND THEME->GetMetric("MenuElements","HeaderOffCommand") +#define FOOTER_ON_COMMAND THEME->GetMetric("MenuElements","FooterOnCommand") +#define FOOTER_OFF_COMMAND THEME->GetMetric("MenuElements","FooterOffCommand") +#define STYLE_ICON_ON_COMMAND THEME->GetMetric("MenuElements","StyleIconOnCommand") +#define STYLE_ICON_OFF_COMMAND THEME->GetMetric("MenuElements","StyleIconOffCommand") +#define TIMER_ON_COMMAND THEME->GetMetric("MenuElements","TimerOnCommand") +#define TIMER_OFF_COMMAND THEME->GetMetric("MenuElements","TimerOffCommand") +#define HELP_ON_COMMAND THEME->GetMetric("MenuElements","HelpOnCommand") +#define HELP_OFF_COMMAND THEME->GetMetric("MenuElements","HelpOffCommand") MenuElements::MenuElements() { - this->AddChild( &m_sprTopEdge ); - this->AddChild( &m_sprStyleIcon ); - this->AddChild( &m_MenuTimer ); - this->AddChild( &m_sprBottomEdge ); - this->AddChild( &m_Background ); - this->AddChild( &m_quadBrightness ); - this->AddChild( &m_textHelp ); - - m_KeepAlive.SetOpened(); - this->AddChild( &m_KeepAlive ); - - m_Wipe.SetOpened(); - this->AddChild( &m_Wipe ); - - this->AddChild( &m_Invisible ); } void MenuElements::StealthTimer( int iActive ) { - m_MenuTimer.StealthTimer( iActive ); // go a bit deeper... get rid of the sound... - if (iActive == 0) // if we wanna hide the timer... + if (iActive == 0) // leave it on screen { - m_MenuTimer.SetXY( TIMER_X, TIMER_Y ); // set it off-screen +// m_MenuTimer.SetXY( MENU_TIMER_X, MENU_TIMER_Y ); // set it on-screen } - else if (iActive == 1) // we wanna hide the timer + else if (iActive == 1) // hide the timer { - m_MenuTimer.SetXY( 999.0f, 999.0f ); // otherwise position it off-screen + // otherwise position it off-screen + m_MenuTimer.StopTweening(); + m_MenuTimer.SetXY( 1000, 1000 ); } - // else... take no action :) } -void MenuElements::Load( CString sBackgroundPath, CString sTopEdgePath, CString sHelpText, bool bShowStyleIcon, bool bTimerEnabled, int iTimerSeconds ) +void MenuElements::Load( CString sClassName, bool bEnableTimer, bool bLoadStyleIcon ) { LOG->Trace( "MenuElements::MenuElements()" ); + ASSERT( this->m_SubActors.empty() ); // don't call Load twice! - if( sBackgroundPath != "" ) - m_Background.LoadFromAniDir( sBackgroundPath ); + m_sClassName = sClassName; - m_quadBrightness.SetDiffuse( RageColor(0,0,0,0) ); - m_quadBrightness.StretchTo( RectI(SCREEN_LEFT, SCREEN_TOP, SCREEN_RIGHT, SCREEN_BOTTOM) ); + m_Background.LoadFromAniDir( THEME->GetPathTo("BGAnimations",m_sClassName+" background") ); + this->AddChild( &m_Background ); - m_sprTopEdge.Load( sTopEdgePath ); - m_sprTopEdge.SetXY( TOP_EDGE_X, TOP_EDGE_Y ); - - m_sprStyleIcon.Load( THEME->GetPathTo("Graphics",ssprintf("menu style icons %s",GAMESTATE->GetCurrentGameDef()->m_szName)) ); - m_sprStyleIcon.StopAnimating(); - m_sprStyleIcon.SetXY( STYLE_ICON_X, STYLE_ICON_Y ); - if( GAMESTATE->m_CurStyle == STYLE_INVALID || !bShowStyleIcon ) - m_sprStyleIcon.SetDiffuse( RageColor(1,1,1,0) ); - else + m_sprHeader.Load( THEME->GetPathTo("Graphics",m_sClassName+" header") ); + m_sprHeader.Command( HEADER_ON_COMMAND ); + this->AddChild( &m_sprHeader ); + + if( bLoadStyleIcon && GAMESTATE->m_CurStyle != STYLE_INVALID ) { - int iRowNum = GetStyleIndexRelativeToGame( GAMESTATE->m_CurGame, GAMESTATE->m_CurStyle ); - m_sprStyleIcon.SetState( iRowNum*2+GAMESTATE->m_MasterPlayerNumber ); + CString sIconFileName = ssprintf("MenuElements icon %s", GAMESTATE->GetCurrentStyleDef()->m_szName ); + m_sprStyleIcon.Load( THEME->GetPathTo("Graphics",sIconFileName) ); + m_sprStyleIcon.StopAnimating(); + m_sprStyleIcon.Command( STYLE_ICON_ON_COMMAND ); + this->AddChild( &m_sprStyleIcon ); } - - m_MenuTimer.SetXY( TIMER_X, TIMER_Y ); - if( !bTimerEnabled || !PREFSMAN->m_bMenuTimer || GAMESTATE->m_bEditing ) + + m_MenuTimer.Command( TIMER_ON_COMMAND ); + if( bEnableTimer && PREFSMAN->m_bMenuTimer && !GAMESTATE->m_bEditing ) + { + m_MenuTimer.SetTimer( THEME->GetMetricI(m_sClassName,"TimerSeconds") ); + } + else { m_MenuTimer.SetTimer( 99 ); m_MenuTimer.Update( 0 ); m_MenuTimer.StopTimer(); } - else - m_MenuTimer.SetTimer( iTimerSeconds ); + this->AddChild( &m_MenuTimer ); - m_sprBottomEdge.Load( THEME->GetPathTo("Graphics","menu bottom edge") ); - m_sprBottomEdge.SetXY( BOTTOM_EDGE_X, BOTTOM_EDGE_Y ); + m_sprFooter.Load( THEME->GetPathTo("Graphics",m_sClassName+" footer") ); + m_sprFooter.Command( FOOTER_ON_COMMAND ); + this->AddChild( &m_sprFooter ); - m_textHelp.SetXY( HELP_X, HELP_Y ); + m_textHelp.Command( HELP_ON_COMMAND ); CStringArray asHelpTips; - split( sHelpText, "\n", asHelpTips ); + split( THEME->GetMetric(m_sClassName,"HelpText"), "\n", asHelpTips ); m_textHelp.SetTips( asHelpTips ); - m_textHelp.SetZoom( 0.5f ); + this->AddChild( &m_textHelp ); - m_soundSwoosh.Load( THEME->GetPathTo("Sounds","menu swoosh") ); - m_soundBack.Load( THEME->GetPathTo("Sounds","menu back") ); + m_In.Load( THEME->GetPathTo("BGAnimations",m_sClassName+" in") ); + this->AddChild( &m_In ); + + m_Out.Load( THEME->GetPathTo("BGAnimations",m_sClassName+" out") ); + this->AddChild( &m_Out ); + + m_Back.Load( THEME->GetPathTo("BGAnimations","Common back") ); + this->AddChild( &m_Back ); + + + m_soundBack.Load( THEME->GetPathTo("Sounds","Common back") ); + + + m_In.StartTransitioning( SM_None ); } -void MenuElements::TweenTopLayerOnScreen(float tm) -{ - if(tm == -1) - tm = MENU_ELEMENTS_TWEEN_TIME; - - vector apActorsInTopFrame; - apActorsInTopFrame.push_back( &m_sprTopEdge ); - apActorsInTopFrame.push_back( &m_sprStyleIcon ); - apActorsInTopFrame.push_back( &m_MenuTimer ); - for( unsigned i=0; iGetX(); - apActorsInTopFrame[i]->SetX( fOriginalX+SCREEN_WIDTH ); - apActorsInTopFrame[i]->BeginTweening( tm, TWEEN_SPRING ); - apActorsInTopFrame[i]->SetTweenX( fOriginalX ); - } - - float fOriginalZoom = m_textHelp.GetZoomY(); - m_textHelp.SetZoomY( 0 ); - m_textHelp.BeginTweening( tm/2 ); - m_textHelp.SetTweenZoomY( fOriginalZoom ); -} - -void MenuElements::TweenOnScreenFromMenu( ScreenMessage smSendWhenDone, bool bLeaveKeepAliveOn ) -{ - TweenTopLayerOnScreen(); - if( !bLeaveKeepAliveOn ) - m_KeepAlive.OpenWipingRight( smSendWhenDone ); - else - m_KeepAlive.SetClosed(); - m_soundSwoosh.Play(); -} - -void MenuElements::TweenTopLayerOffScreen(float tm) -{ -/* - This trick is neat, but there's a problem: fOriginalX may not be the settled - position--we might still be tweening, and if it's a bounce tween, it might be - left of center, which means fOriginalX+SCREEN_WIDTH won't actually take it - completely off-screen. fOriginalX+SCREEN_WIDTH*2 would, but that'd make the - bounce faster. SCREEN_WIDTH+SCREEN_WIDTH/2 would, but ignoring fOriginalX - will make each component tween off at a different rate ... - -glenn - vector apActorsInTopFrame; - apActorsInTopFrame.push_back( &m_sprTopEdge ); - apActorsInTopFrame.push_back( &m_sprStyleIcon ); - apActorsInTopFrame.push_back( &m_MenuTimer ); - for( unsigned i=0; iGetX(); - apActorsInTopFrame[i]->BeginTweening( MENU_ELEMENTS_TWEEN_TIME, TWEEN_BOUNCE_BEGIN ); - apActorsInTopFrame[i]->SetTweenX( fOriginalX+SCREEN_WIDTH ); - } - */ - - if(tm == -1) - tm = MENU_ELEMENTS_TWEEN_TIME; - - m_sprTopEdge.StopTweening(); - m_sprTopEdge.BeginTweening( tm, TWEEN_BOUNCE_BEGIN ); - m_sprTopEdge.SetTweenX( TOP_EDGE_X+SCREEN_WIDTH ); - - m_sprStyleIcon.StopTweening(); - m_sprStyleIcon.BeginTweening( tm, TWEEN_BOUNCE_BEGIN ); - m_sprStyleIcon.SetTweenX( STYLE_ICON_X+SCREEN_WIDTH ); - - m_MenuTimer.StopTweening(); - m_MenuTimer.BeginTweening( tm, TWEEN_BOUNCE_BEGIN ); - m_MenuTimer.SetTweenX( TIMER_X+SCREEN_WIDTH ); - - m_textHelp.StopTweening(); - m_textHelp.BeginTweening( tm/2 ); - m_textHelp.SetTweenZoomY( 0 ); -} - -void MenuElements::TweenOffScreenToMenu( ScreenMessage smSendWhenDone ) -{ - m_MenuTimer.StopTimer(); - TweenTopLayerOffScreen(); - if( !m_KeepAlive.IsClosed() ) - m_KeepAlive.CloseWipingRight( smSendWhenDone ); - else - SCREENMAN->SendMessageToTopScreen( smSendWhenDone, m_KeepAlive.GetTransitionTime() ); - m_soundSwoosh.Play(); -} - -void MenuElements::ImmedOnScreenFromMenu( bool bLeaveKeepAliveOn ) -{ - TweenTopLayerOnScreen(0); - Update(0); - - if( !bLeaveKeepAliveOn ) - m_KeepAlive.SetOpened(); - else - m_KeepAlive.SetClosed(); -} - -void MenuElements::ImmedOffScreenToMenu() -{ - m_MenuTimer.StopTimer(); - m_KeepAlive.SetClosed(); - - /* Remove the top layer immediately. */ - TweenTopLayerOffScreen(0); - - /* We need to do a null update after doing null tweens (tweens with zero time), - * or they'll show up in their default positions for a frame (since screens - * draw once before they're updated for the first time). */ - Update(0); -} - -void MenuElements::TweenBottomLayerOnScreen() -{ - float fOriginalY = m_sprBottomEdge.GetY(); - m_sprBottomEdge.SetY( fOriginalY + 100 ); - m_sprBottomEdge.BeginTweening( MENU_ELEMENTS_TWEEN_TIME/2 ); - m_sprBottomEdge.SetTweenY( fOriginalY ); - - m_quadBrightness.SetDiffuse( RageColor(0,0,0,1) ); - m_quadBrightness.BeginTweening( MENU_ELEMENTS_TWEEN_TIME/2 ); - m_quadBrightness.SetTweenDiffuse( RageColor(0,0,0,0) ); -} - -void MenuElements::TweenBottomLayerOffScreen() -{ - float fOriginalY = m_sprBottomEdge.GetY(); - m_sprBottomEdge.StopTweening(); - m_sprBottomEdge.BeginTweening( MENU_ELEMENTS_TWEEN_TIME/2 ); - m_sprBottomEdge.SetTweenY( fOriginalY + 100 ); - - m_quadBrightness.SetDiffuse( RageColor(0,0,0,0) ); - m_quadBrightness.StopTweening(); - m_quadBrightness.BeginTweening( MENU_ELEMENTS_TWEEN_TIME*3/2.0f ); // sleep - m_quadBrightness.BeginTweening( MENU_ELEMENTS_TWEEN_TIME/2 ); // fade - m_quadBrightness.SetTweenDiffuse( RageColor(0,0,0,1) ); -} - -void MenuElements::TweenOnScreenFromBlack( ScreenMessage smSendWhenDone ) -{ - TweenTopLayerOnScreen(); - TweenBottomLayerOnScreen(); - //m_Wipe.OpenWipingRight( smSendWhenDone ); - m_soundSwoosh.Play(); -} - -void MenuElements::TweenOffScreenToBlack( ScreenMessage smSendWhenDone, bool bPlayBackSound ) +void MenuElements::StartTransitioning( ScreenMessage smSendWhenDone ) { + m_MenuTimer.SetTimer( 0 ); m_MenuTimer.StopTimer(); - if( !bPlayBackSound ) - { - TweenTopLayerOffScreen(); - TweenBottomLayerOffScreen(); - m_Invisible.SetTransitionTime( MENU_ELEMENTS_TWEEN_TIME*2 ); - m_Invisible.CloseWipingRight( smSendWhenDone ); - } - else - { - m_soundBack.Play(); - m_Wipe.CloseWipingLeft( smSendWhenDone ); - } + m_sprHeader.Command( HEADER_OFF_COMMAND ); + m_sprStyleIcon.Command( STYLE_ICON_OFF_COMMAND ); + m_MenuTimer.Command( TIMER_OFF_COMMAND ); + m_sprFooter.Command( FOOTER_OFF_COMMAND ); + m_textHelp.Command( HELP_OFF_COMMAND ); + + m_Out.StartTransitioning( smSendWhenDone ); +} + +void MenuElements::Back( ScreenMessage smSendWhenDone ) +{ + m_Back.StartTransitioning( smSendWhenDone ); + m_soundBack.Play(); } void MenuElements::DrawPrimitives() @@ -292,13 +149,14 @@ void MenuElements::DrawTopLayer() { BeginDraw(); - m_sprTopEdge.Draw(); + m_sprHeader.Draw(); m_sprStyleIcon.Draw(); m_MenuTimer.Draw(); - m_sprBottomEdge.Draw(); + m_sprFooter.Draw(); m_textHelp.Draw(); - m_KeepAlive.Draw(); - m_Wipe.Draw(); + m_In.Draw(); + m_Out.Draw(); + m_Back.Draw(); EndDraw(); } @@ -308,28 +166,11 @@ void MenuElements::DrawBottomLayer() BeginDraw(); m_Background.Draw(); - m_quadBrightness.Draw(); EndDraw(); } -void MenuElements::SetTimer( int iTimerSeconds ) +bool MenuElements::IsTransitioning() { - m_MenuTimer.SetTimer( iTimerSeconds ); + return m_In.IsTransitioning() || m_Out.IsTransitioning() || m_Back.IsTransitioning(); } - -void MenuElements::StartTimer() -{ - m_MenuTimer.StartTimer(); -} - -void MenuElements::StopTimer() -{ - m_MenuTimer.StopTimer(); -} - -void MenuElements::StallTimer() -{ - m_MenuTimer.StallTimer(); -} - diff --git a/stepmania/src/MenuElements.h b/stepmania/src/MenuElements.h index 309533bdf6..fb60f41d8e 100644 --- a/stepmania/src/MenuElements.h +++ b/stepmania/src/MenuElements.h @@ -19,9 +19,7 @@ #include "RandomSample.h" #include "TransitionFade.h" #include "MenuTimer.h" -#include "TransitionFadeWipe.h" -#include "TransitionKeepAlive.h" -#include "TransitionInvisible.h" +#include "TransitionBGAnimation.h" #include "TipDisplay.h" #include "BGAnimation.h" @@ -36,47 +34,33 @@ public: virtual void DrawPrimitives(); - void Load( CString sBackgroundPath, CString sTopEdgePath, CString sHelpText, bool bShowStyleIcon, bool bTimerEnabled, int iTimerSeconds ); - void SetTimer( int iTimerSeconds ); - void StartTimer(); - void StallTimer(); - void StopTimer(); + void Load( CString sClassName, bool bEnableTimer = true, bool bLoadStyleIcon = true ); void StealthTimer( int iActive ); + void DrawTopLayer(); void DrawBottomLayer(); - void TweenOnScreenFromMenu( ScreenMessage smSendWhenDone, bool bLeaveKeepAliveOn = false ); - void TweenOffScreenToMenu( ScreenMessage smSendWhenDone ); - void ImmedOnScreenFromMenu( bool bLeaveKeepAliveOn = false ); - void ImmedOffScreenToMenu(); + void StartTransitioning( ScreenMessage smSendWhenDone ); + void Back( ScreenMessage smSendWhenDone ); + bool IsTransitioning(); - void TweenOnScreenFromBlack( ScreenMessage smSendWhenDone ); - void TweenOffScreenToBlack( ScreenMessage smSendWhenDone, bool bPlayBackSound ); +public: // let owner tinker with these objects - bool IsClosing() { return m_Wipe.IsClosing() || m_KeepAlive.IsClosing() || m_Invisible.IsClosing(); }; + CString m_sClassName; -protected: - void TweenTopLayerOnScreen(float tm=-1); - void TweenTopLayerOffScreen(float tm=-1); + BGAnimation m_Background; - void TweenBottomLayerOnScreen(); - void TweenBottomLayerOffScreen(); - -public: - Sprite m_sprTopEdge; + Sprite m_sprHeader; Sprite m_sprStyleIcon; MenuTimer m_MenuTimer; - Sprite m_sprBottomEdge; - BGAnimation m_Background; - Quad m_quadBrightness; // for darkening the background + Sprite m_sprFooter; TipDisplay m_textHelp; - TransitionFadeWipe m_Wipe; // for going back - TransitionKeepAlive m_KeepAlive; // going back and forward - TransitionInvisible m_Invisible; // for going forward to Menu + TransitionBGAnimation m_In; + TransitionBGAnimation m_Out; + TransitionBGAnimation m_Back; - RageSound m_soundSwoosh; RageSound m_soundBack; }; diff --git a/stepmania/src/MenuTimer.cpp b/stepmania/src/MenuTimer.cpp index 56e665d93c..0d11187f12 100644 --- a/stepmania/src/MenuTimer.cpp +++ b/stepmania/src/MenuTimer.cpp @@ -27,8 +27,8 @@ MenuTimer::MenuTimer() m_fStallSeconds = 0; m_bTimerStopped = false; - m_textDigit1.LoadFromNumbers( THEME->GetPathTo("Numbers","menu timer numbers") ); - m_textDigit2.LoadFromNumbers( THEME->GetPathTo("Numbers","menu timer numbers") ); + m_textDigit1.LoadFromNumbers( THEME->GetPathTo("Numbers","MenuTimer numbers") ); + m_textDigit2.LoadFromNumbers( THEME->GetPathTo("Numbers","MenuTimer numbers") ); m_textDigit1.EnableShadow( false ); m_textDigit2.EnableShadow( false ); @@ -42,7 +42,7 @@ MenuTimer::MenuTimer() this->AddChild( &m_textDigit1 ); this->AddChild( &m_textDigit2 ); - m_soundBeep.Load( THEME->GetPathTo("Sounds","menu timer") ); + m_soundBeep.Load( THEME->GetPathTo("Sounds","MenuTimer tick") ); } void MenuTimer::StealthTimer( int iActive ) @@ -112,7 +112,12 @@ void MenuTimer::Update( float fDeltaTime ) float fRemainder = m_fSecondsLeft - (int)m_fSecondsLeft; float fDistFromNearestNumber = min( fRemainder, 1-fRemainder ); // this is between 0 and 0.5; - if( m_fSecondsLeft < 4.5f ) + if( m_fSecondsLeft == 0 ) + { + m_textDigit1.SetZoomX( 1 ); + m_textDigit2.SetZoomX( 1 ); + } + else if( m_fSecondsLeft < 4.5f ) { m_textDigit1.SetZoomX( min(1, fDistFromNearestNumber*8) ); m_textDigit2.SetZoomX( min(1, fDistFromNearestNumber*8) ); diff --git a/stepmania/src/MusicSortDisplay.cpp b/stepmania/src/MusicSortDisplay.cpp index 2cbf991732..c7b3723e8a 100644 --- a/stepmania/src/MusicSortDisplay.cpp +++ b/stepmania/src/MusicSortDisplay.cpp @@ -21,7 +21,7 @@ MusicSortDisplay::MusicSortDisplay() { - Load( THEME->GetPathTo("Graphics","music sort icons 1x4") ); + Load( THEME->GetPathTo("Graphics","MusicSortDisplay icons 1x4") ); StopAnimating(); } diff --git a/stepmania/src/MusicWheel.cpp b/stepmania/src/MusicWheel.cpp index a135b60e20..e008cccee5 100644 --- a/stepmania/src/MusicWheel.cpp +++ b/stepmania/src/MusicWheel.cpp @@ -77,7 +77,7 @@ MusicWheel::MusicWheel() if( GAMESTATE->m_CurStyle == STYLE_INVALID ) GAMESTATE->m_CurStyle = STYLE_DANCE_SINGLE; - m_sprSelectionOverlay.Load( THEME->GetPathTo("Graphics","select music song highlight") ); + m_sprSelectionOverlay.Load( THEME->GetPathTo("Graphics","MusicWheel highlight") ); m_sprSelectionOverlay.SetXY( 0, 0 ); m_sprSelectionOverlay.SetDiffuse( RageColor(1,1,1,1) ); m_sprSelectionOverlay.SetEffectGlowShift( 1.0f, RageColor(1,1,1,0.4f), RageColor(1,1,1,1) ); @@ -88,11 +88,11 @@ MusicWheel::MusicWheel() this->AddChild( &m_ScrollBar ); /* We play a lot of this one, so precache it. */ - m_soundChangeMusic.Load( THEME->GetPathTo("Sounds","select music change"), true ); - m_soundChangeSort.Load( THEME->GetPathTo("Sounds","select music sort") ); - m_soundExpand.Load( THEME->GetPathTo("Sounds","select music expand") ); - m_soundStart.Load( THEME->GetPathTo("Sounds","menu start") ); - m_soundLocked.Load( THEME->GetPathTo("Sounds","select music locked") ); + m_soundChangeMusic.Load( THEME->GetPathTo("Sounds","MusicWheel change"), true ); + m_soundChangeSort.Load( THEME->GetPathTo("Sounds","MusicWheel sort") ); + m_soundExpand.Load( THEME->GetPathTo("Sounds","MusicWheel expand") ); + m_soundStart.Load( THEME->GetPathTo("Sounds","Common start") ); + m_soundLocked.Load( THEME->GetPathTo("Sounds","MusicWheel locked") ); // init m_mapGroupNameToBannerColor diff --git a/stepmania/src/MusicWheel.h b/stepmania/src/MusicWheel.h index f7087b4aa3..56a5f60882 100644 --- a/stepmania/src/MusicWheel.h +++ b/stepmania/src/MusicWheel.h @@ -21,7 +21,7 @@ #include "SmallGradeDisplay.h" #include "GameConstantsAndTypes.h" #include "MusicSortDisplay.h" -#include "MusicStatusDisplay.h" +#include "WheelNotifyIcon.h" #include "Screen.h" // for ScreenMessage #include "ScoreDisplayNormal.h" #include "ScrollBar.h" diff --git a/stepmania/src/MusicWheelItem.cpp b/stepmania/src/MusicWheelItem.cpp index c8daf94fb1..6b431301c6 100644 --- a/stepmania/src/MusicWheelItem.cpp +++ b/stepmania/src/MusicWheelItem.cpp @@ -48,7 +48,7 @@ WheelItemData::WheelItemData( WheelItemType wit, Song* pSong, const CString &sSe m_sSectionName = sSectionName; m_pCourse = pCourse; m_color = color; - m_Flags = MusicStatusDisplay::Flags(); + m_Flags = WheelNotifyIcon::Flags(); } @@ -57,25 +57,25 @@ WheelItemDisplay::WheelItemDisplay() data = NULL; m_fPercentGray = 0; - m_MusicStatusDisplay.SetXY( ICON_X, 0 ); + m_WheelNotifyIcon.SetXY( ICON_X, 0 ); m_TextBanner.SetHorizAlign( align_left ); m_TextBanner.SetXY( SONG_NAME_X, 0 ); - m_sprSongBar.Load( THEME->GetPathTo("Graphics","select music song bar") ); + m_sprSongBar.Load( THEME->GetPathTo("Graphics","MusicWheelItem song") ); m_sprSongBar.SetXY( 0, 0 ); - m_sprSectionBar.Load( THEME->GetPathTo("Graphics","select music section bar") ); + m_sprSectionBar.Load( THEME->GetPathTo("Graphics","MusicWheelItem section") ); m_sprSectionBar.SetXY( 0, 0 ); - m_textSectionName.LoadFromFont( THEME->GetPathTo("Fonts","musicwheel section") ); + m_textSectionName.LoadFromFont( THEME->GetPathTo("Fonts","MusicWheel section") ); m_textSectionName.EnableShadow( false ); m_textSectionName.SetVertAlign( align_middle ); m_textSectionName.SetXY( SECTION_NAME_X, 0 ); m_textSectionName.SetZoom( SECTION_ZOOM ); - m_textRoulette.LoadFromFont( THEME->GetPathTo("Fonts","musicwheel roulette") ); + m_textRoulette.LoadFromFont( THEME->GetPathTo("Fonts","MusicWheel roulette") ); m_textRoulette.EnableShadow( false ); m_textRoulette.TurnRainbowOn(); m_textRoulette.SetZoom( ROULETTE_ZOOM ); @@ -87,7 +87,7 @@ WheelItemDisplay::WheelItemDisplay() m_GradeDisplay[p].SetXY( GRADE_X(p), 0 ); } - m_textCourse.LoadFromFont( THEME->GetPathTo("Fonts","musicwheel course") ); + m_textCourse.LoadFromFont( THEME->GetPathTo("Fonts","MusicWheel course") ); m_textCourse.EnableShadow( false ); m_textCourse.SetZoom( COURSE_ZOOM ); m_textCourse.SetHorizAlign( align_left ); @@ -145,7 +145,7 @@ void WheelItemDisplay::LoadFromWheelItemData( WheelItemData* pWID ) { m_TextBanner.LoadFromSong( data->m_pSong ); m_TextBanner.SetDiffuse( data->m_color ); - m_MusicStatusDisplay.SetFlags( data->m_Flags ); + m_WheelNotifyIcon.SetFlags( data->m_Flags ); RefreshGrades(); } break; @@ -205,7 +205,7 @@ void WheelItemDisplay::Update( float fDeltaTime ) case TYPE_SONG: { m_sprSongBar.Update( fDeltaTime ); - m_MusicStatusDisplay.Update( fDeltaTime ); + m_WheelNotifyIcon.Update( fDeltaTime ); m_TextBanner.Update( fDeltaTime ); for( int p=0; pGetPathTo("Graphics","edit bars") ); + m_sprBars.Load( THEME->GetPathTo("Graphics","NoteField bars") ); m_sprBars.StopAnimating(); m_fBeginMarker = m_fEndMarker = -1; diff --git a/stepmania/src/OptionIcon.cpp b/stepmania/src/OptionIcon.cpp index 151aaaebf1..a258db0dce 100644 --- a/stepmania/src/OptionIcon.cpp +++ b/stepmania/src/OptionIcon.cpp @@ -25,11 +25,11 @@ OptionIcon::OptionIcon() { - m_spr.Load( THEME->GetPathTo("Graphics","select music option icons 3x2") ); + m_spr.Load( THEME->GetPathTo("Graphics","OptionIcon frame 3x2") ); m_spr.StopAnimating(); this->AddChild( &m_spr ); - m_text.LoadFromFont( THEME->GetPathTo("Fonts","option icons") ); + m_text.LoadFromFont( THEME->GetPathTo("Fonts","OptionIcon") ); m_text.EnableShadow( false ); m_text.SetZoom( TEXT_ZOOM ); m_text.SetXY( TEXT_OFFSET_X, TEXT_OFFSET_Y ); diff --git a/stepmania/src/OptionsCursor.cpp b/stepmania/src/OptionsCursor.cpp index a86eee5428..1b4359a104 100644 --- a/stepmania/src/OptionsCursor.cpp +++ b/stepmania/src/OptionsCursor.cpp @@ -26,7 +26,7 @@ OptionsCursor::OptionsCursor() void OptionsCursor::Load( PlayerNumber pn, bool bUnderline ) { - CString sFileName = bUnderline ? "options underline" : "options cursor"; + CString sFileName = bUnderline ? "OptionsCursor underline" : "OptionsCursor cursor"; CString sPath = THEME->GetPathTo( "Graphics", sFileName ); m_sprLeft.Load( sPath ); diff --git a/stepmania/src/Player.cpp b/stepmania/src/Player.cpp index 2c0ab29f34..bb8bfa8e7a 100644 --- a/stepmania/src/Player.cpp +++ b/stepmania/src/Player.cpp @@ -207,7 +207,7 @@ void Player::Update( float fDeltaTime ) if( hn.fStartBeat < fSongBeat && fSongBeat < hn.fEndBeat ) // if the song beat is in the range of this hold { bool bIsHoldingButton = INPUTMAPPER->IsButtonDown( GameI ); - if( !GAMESTATE->m_bEditing && (PREFSMAN->m_bAutoPlay || GAMESTATE->m_bDemonstration) ) + if( !GAMESTATE->m_bEditing && (PREFSMAN->m_bAutoPlay || GAMESTATE->m_bDemonstrationOrJukebox) ) bIsHoldingButton = true; m_NoteField.m_bIsHoldingHoldNote[i] = bIsHoldingButton && bSteppedOnTapNote; // set host flag so NoteField can do intelligent drawing @@ -390,7 +390,7 @@ void Player::Step( int col ) else if( fSecondsFromPerfect <= PREFSMAN->m_fJudgeWindowBooSeconds ) score = TNS_BOO; else score = TNS_NONE; - if( !GAMESTATE->m_bEditing && (GAMESTATE->m_bDemonstration || PREFSMAN->m_bAutoPlay) ) + if( !GAMESTATE->m_bEditing && (GAMESTATE->m_bDemonstrationOrJukebox || PREFSMAN->m_bAutoPlay) ) score = TNS_MARVELOUS; if( score==TNS_MARVELOUS && !PREFSMAN->m_bMarvelousTiming ) @@ -550,7 +550,7 @@ int Player::UpdateTapNotesMissedOlderThan( float fMissIfOlderThanSeconds ) void Player::CrossedRow( int iNoteRow ) { - if( PREFSMAN->m_bAutoPlay || GAMESTATE->m_bDemonstration ) + if( PREFSMAN->m_bAutoPlay || GAMESTATE->m_bDemonstrationOrJukebox ) { // check to see if there's at the crossed row for( int t=0; tTrace( "ScoreDisplayNormal::ScoreDisplayNormal()" ); // init the text - m_text.LoadFromNumbers( THEME->GetPathTo("Numbers","gameplay score numbers") ); + m_text.LoadFromNumbers( THEME->GetPathTo("Numbers","ScoreDisplayNormal numbers") ); m_text.EnableShadow( false ); m_fScore = 0; diff --git a/stepmania/src/Screen.cpp b/stepmania/src/Screen.cpp index 1728d54b0d..4029a5e9ed 100644 --- a/stepmania/src/Screen.cpp +++ b/stepmania/src/Screen.cpp @@ -145,13 +145,13 @@ void Screen::ClearMessageQueue( const ScreenMessage SM ) #include "ScreenMusicScroll.h" #include "ScreenPlayerOptions.h" #include "ScreenSelectCourse.h" -#include "ScreenSelectMaxType2.h" -#include "ScreenSelectMaxType2EX.h" +#include "ScreenSelectDifficulty.h" +#include "ScreenSelectDifficultyEX.h" #include "ScreenSelectGame.h" #include "ScreenSelectGroup.h" #include "ScreenSelectMusic.h" #include "ScreenSelectStyle5th.h" -#include "ScreenSelectMaxType1.h" +#include "ScreenSelectStyle.h" #include "ScreenSongOptions.h" #include "ScreenSoundOptions.h" #include "ScreenStage.h" @@ -200,13 +200,13 @@ Screen* Screen::Create( CString sClassName ) else if( 0==stricmp(sClassName, "ScreenMusicScroll") ) ret = new ScreenMusicScroll; else if( 0==stricmp(sClassName, "ScreenPlayerOptions") ) ret = new ScreenPlayerOptions; else if( 0==stricmp(sClassName, "ScreenSelectCourse") ) ret = new ScreenSelectCourse; - else if( 0==stricmp(sClassName, "ScreenSelectMaxType2") ) ret = new ScreenSelectMaxType2; - else if( 0==stricmp(sClassName, "ScreenSelectMaxType2EX") ) ret = new ScreenSelectMaxType2EX; + else if( 0==stricmp(sClassName, "ScreenSelectDifficulty") ) ret = new ScreenSelectDifficulty; + else if( 0==stricmp(sClassName, "ScreenSelectDifficultyEX") ) ret = new ScreenSelectDifficultyEX; else if( 0==stricmp(sClassName, "ScreenSelectGame") ) ret = new ScreenSelectGame; else if( 0==stricmp(sClassName, "ScreenSelectGroup") ) ret = new ScreenSelectGroup; else if( 0==stricmp(sClassName, "ScreenSelectMusic") ) ret = new ScreenSelectMusic; else if( 0==stricmp(sClassName, "ScreenSelectStyle5th") ) ret = new ScreenSelectStyle5th; - else if( 0==stricmp(sClassName, "ScreenSelectMaxType1") ) ret = new ScreenSelectMaxType1; + else if( 0==stricmp(sClassName, "ScreenSelectStyle") ) ret = new ScreenSelectStyle; else if( 0==stricmp(sClassName, "ScreenSongOptions") ) ret = new ScreenSongOptions; else if( 0==stricmp(sClassName, "ScreenStage") ) ret = new ScreenStage; else if( 0==stricmp(sClassName, "ScreenTest") ) ret = new ScreenTest; diff --git a/stepmania/src/ScreenAlbums.h b/stepmania/src/ScreenAlbums.h index c2a46e42f8..7a788c573b 100644 --- a/stepmania/src/ScreenAlbums.h +++ b/stepmania/src/ScreenAlbums.h @@ -15,7 +15,7 @@ class ScreenAlbums : public ScreenAttract { public: - ScreenAlbums() : ScreenAttract("ScreenAlbums","albums") { }; + ScreenAlbums() : ScreenAttract("ScreenAlbums") { }; }; diff --git a/stepmania/src/ScreenAppearanceOptions.cpp b/stepmania/src/ScreenAppearanceOptions.cpp index 31b31c6d97..852e4b5b73 100644 --- a/stepmania/src/ScreenAppearanceOptions.cpp +++ b/stepmania/src/ScreenAppearanceOptions.cpp @@ -54,11 +54,7 @@ OptionRowData g_AppearanceOptionsLines[NUM_APPEARANCE_OPTIONS_LINES] = { }; ScreenAppearanceOptions::ScreenAppearanceOptions() : - ScreenOptions( - THEME->GetPathTo("BGAnimations","appearance options"), - THEME->GetPathTo("Graphics","appearance options page"), - THEME->GetPathTo("Graphics","appearance options top edge") - ) + ScreenOptions("ScreenAppearanceOptions",false) { LOG->Trace( "ScreenAppearanceOptions::ScreenAppearanceOptions()" ); @@ -76,10 +72,10 @@ ScreenAppearanceOptions::ScreenAppearanceOptions() : g_AppearanceOptionsLines, NUM_APPEARANCE_OPTIONS_LINES, false ); - m_Menu.SetTimer( 99 ); - m_Menu.StopTimer(); + m_Menu.m_MenuTimer.SetTimer( 99 ); + m_Menu.m_MenuTimer.StopTimer(); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","appearance options music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenAppearanceOptions music") ); } void ScreenAppearanceOptions::ImportOptions() diff --git a/stepmania/src/ScreenAttract.cpp b/stepmania/src/ScreenAttract.cpp index bb4bafdf60..5d2b82f322 100644 --- a/stepmania/src/ScreenAttract.cpp +++ b/stepmania/src/ScreenAttract.cpp @@ -26,37 +26,40 @@ #include "SDL_utils.h" #include "RageSoundManager.h" -#define SECONDS_TO_SHOW THEME->GetMetricF(m_sMetricName,"SecondsToShow") -#define NEXT_SCREEN THEME->GetMetric(m_sMetricName,"NextScreen") +#define NEXT_SCREEN THEME->GetMetric(m_sClassName,"NextScreen") -ScreenAttract::ScreenAttract( CString sMetricName, CString sElementName ) +ScreenAttract::ScreenAttract( CString sClassName ) { - LOG->Trace( "ScreenAttract::ScreenAttract(%s, %s)", sMetricName.c_str(), sElementName.c_str() ); + LOG->Trace( "ScreenAttract::ScreenAttract(%s)", sClassName.c_str() ); GAMESTATE->Reset(); - m_sMetricName = sMetricName; - m_sElementName = sElementName; + m_sClassName = sClassName; // We have to do initialization in the first update because this->GetElementName() won't // work until the object has been fully constructed. - m_Background.LoadFromAniDir( THEME->GetPathTo("BGAnimations",m_sElementName) ); + m_Background.LoadFromAniDir( THEME->GetPathTo("BGAnimations",m_sClassName+" background") ); this->AddChild( &m_Background ); - m_Fade.SetClosed(); - m_Fade.OpenWipingRight( SM_None ); - this->AddChild( &m_Fade ); + m_In.Load( THEME->GetPathTo("BGAnimations","ScreenAttract in") ); + m_In.StartTransitioning(); + this->AddChild( &m_In ); - SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo(m_sElementName) ); + m_Out.Load( THEME->GetPathTo("BGAnimations","ScreenAttract out") ); + this->AddChild( &m_Out ); - m_soundStart.Load( THEME->GetPathTo("Sounds","menu start") ); + SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo(m_sClassName) ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds",m_sElementName + " music") ); // DO loop. -Chris + m_soundStart.Load( THEME->GetPathTo("Sounds","Common start") ); + + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds",m_sClassName + " music") ); // DO loop. -Chris GAMESTATE->m_bPlayersCanJoin = true; - this->SendScreenMessage( SM_BeginFadingOut, SECONDS_TO_SHOW ); + + float fTimeUntilBeginFadingOut = m_Background.GetLengthSeconds() - m_Out.GetLengthSeconds(); + this->SendScreenMessage( SM_BeginFadingOut, fTimeUntilBeginFadingOut ); } @@ -70,12 +73,17 @@ void ScreenAttract::Input( const DeviceInput& DeviceI, const InputEventType type { LOG->Trace( "ScreenAttract::Input()" ); - if(type != IET_FIRST_PRESS) return; // don't care + AttractInput( DeviceI, type, GameI, MenuI, StyleI, m_In.IsTransitioning() || m_Out.IsTransitioning() ); +} +bool ScreenAttract::ChangeCoinModeInput( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ) +{ + if( type != IET_FIRST_PRESS ) + return false; if( DeviceI.device == DEVICE_KEYBOARD && DeviceI.button == SDLK_F3 ) { (int&)PREFSMAN->m_CoinMode = (PREFSMAN->m_CoinMode+1) % PrefsManager::NUM_COIN_MODES; - /*ResetGame(); + /* ResetGame(); This causes problems on ScreenIntroMovie, which results in the movie being restarted and/or becoming out-of-synch -- Miryokuteki */ @@ -88,27 +96,25 @@ void ScreenAttract::Input( const DeviceInput& DeviceI, const InputEventType type } SCREENMAN->RefreshCreditsMessages(); SCREENMAN->SystemMessage( sMessage ); - return; + return true; } + return false; +} + +void ScreenAttract::AttractInput( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI, bool bTransitioning ) +{ + if(type != IET_FIRST_PRESS) + return; // don't care + + ChangeCoinModeInput( DeviceI, type, GameI, MenuI, StyleI ); if( MenuI.IsValid() ) { switch( MenuI.button ) { - case MENU_BUTTON_LEFT: - case MENU_BUTTON_RIGHT: - this->SendScreenMessage( SM_BeginFadingOut, 0 ); - break; - case MENU_BUTTON_COIN: - /* Credit already taken care of.. go forth -- Miryokuteki */ - //Screen::MenuCoin( MenuI.player ); // increment coins, play sound - SOUNDMAN->StopMusic(); - SDL_Delay( 800 ); // do a little pause, like the arcade does - SCREENMAN->SetNewScreen( "ScreenTitleMenu" ); - break; case MENU_BUTTON_START: case MENU_BUTTON_BACK: - + case MENU_BUTTON_COIN: switch( PREFSMAN->m_CoinMode ) { case PrefsManager::COIN_PAY: @@ -118,7 +124,7 @@ void ScreenAttract::Input( const DeviceInput& DeviceI, const InputEventType type case PrefsManager::COIN_FREE: case PrefsManager::COIN_HOME: SOUNDMAN->StopMusic(); - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","insert coin") ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","Common coin") ); SDL_Delay( 800 ); // do a little pause, like the arcade does SCREENMAN->SetNewScreen( "ScreenTitleMenu" ); break; @@ -129,6 +135,20 @@ void ScreenAttract::Input( const DeviceInput& DeviceI, const InputEventType type } } + if( bTransitioning ) + return; + + if( MenuI.IsValid() ) + { + switch( MenuI.button ) + { + case MENU_BUTTON_LEFT: + case MENU_BUTTON_RIGHT: + SCREENMAN->SendMessageToTopScreen( SM_BeginFadingOut, 0 ); + break; + } + } + // Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); } @@ -142,8 +162,8 @@ void ScreenAttract::HandleScreenMessage( const ScreenMessage SM ) switch( SM ) { case SM_BeginFadingOut: - if( !m_Fade.IsClosing() ) - m_Fade.CloseWipingRight( SM_GoToNextScreen ); + if( !m_Out.IsTransitioning() ) + m_Out.StartTransitioning( SM_GoToNextScreen ); break; case SM_GoToNextScreen: /* XXX: Look at the def of the screen we're going to; if it has a diff --git a/stepmania/src/ScreenAttract.h b/stepmania/src/ScreenAttract.h index 0c190b7071..21cd00f346 100644 --- a/stepmania/src/ScreenAttract.h +++ b/stepmania/src/ScreenAttract.h @@ -15,7 +15,7 @@ #include "Screen.h" #include "Sprite.h" #include "BitmapText.h" -#include "TransitionFade.h" +#include "TransitionBGAnimation.h" #include "RandomSample.h" #include "BGAnimation.h" #include "RageTimer.h" @@ -25,21 +25,23 @@ class ScreenAttract : public Screen { public: - ScreenAttract( CString sMetricName, CString sElementName ); + ScreenAttract( CString sClassName ); virtual ~ScreenAttract(); virtual void Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ); + static bool ChangeCoinModeInput( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ); /* return true if CoinMode changed */ + static void AttractInput( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI, bool bTransitioning ); virtual void Update( float fDelta ); virtual void HandleScreenMessage( const ScreenMessage SM ); protected: - CString m_sMetricName; // used to loop up theme metrics - CString m_sElementName; // used to loop up theme elements + CString m_sClassName; // used to loop up theme metrics - BGAnimation m_Background; - TransitionFade m_Fade; - RandomSample m_soundStart; + BGAnimation m_Background; + TransitionBGAnimation m_In; + TransitionBGAnimation m_Out; + RandomSample m_soundStart; }; diff --git a/stepmania/src/ScreenCaution.cpp b/stepmania/src/ScreenCaution.cpp index 83cb2b5d28..d6c234da2b 100644 --- a/stepmania/src/ScreenCaution.cpp +++ b/stepmania/src/ScreenCaution.cpp @@ -36,22 +36,22 @@ ScreenCaution::ScreenCaution() return; } - m_Background.LoadFromAniDir( THEME->GetPathTo("BGAnimations","caution background") ); + m_Background.LoadFromAniDir( THEME->GetPathTo("BGAnimations","ScreenCaution background") ); this->AddChild( &m_Background ); - m_In.Load( THEME->GetPathTo("BGAnimations","caution in") ); + m_In.Load( THEME->GetPathTo("BGAnimations","ScreenCaution in") ); m_In.StartTransitioning( SM_DoneOpening ); this->AddChild( &m_In ); - m_Out.Load( THEME->GetPathTo("BGAnimations","caution out") ); + m_Out.Load( THEME->GetPathTo("BGAnimations","ScreenCaution out") ); this->AddChild( &m_Out ); - m_Back.Load( THEME->GetPathTo("BGAnimations","menu back") ); + m_Back.Load( THEME->GetPathTo("BGAnimations","Common back") ); this->AddChild( &m_Back ); this->SendScreenMessage( SM_StartClosing, 3 ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","caution music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenCaution music") ); } @@ -61,7 +61,7 @@ void ScreenCaution::Input( const DeviceInput& DeviceI, const InputEventType type if( MenuI.IsValid() && pn!=PLAYER_INVALID && !GAMESTATE->m_bSideIsJoined[pn] ) { GAMESTATE->m_bSideIsJoined[pn] = true; - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","menu start") ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","Common start") ); SCREENMAN->RefreshCreditsMessages(); return; // don't fall though } @@ -104,6 +104,6 @@ void ScreenCaution::MenuBack( PlayerNumber pn ) return; this->ClearMessageQueue(); m_Back.StartTransitioning( SM_GoToPrevScreen ); - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","menu back") ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","Common back") ); } diff --git a/stepmania/src/ScreenCompany.h b/stepmania/src/ScreenCompany.h index 0c8d12a208..d351771ea0 100644 --- a/stepmania/src/ScreenCompany.h +++ b/stepmania/src/ScreenCompany.h @@ -15,7 +15,7 @@ class ScreenCompany : public ScreenAttract { public: - ScreenCompany() : ScreenAttract("ScreenCompany","company") { }; + ScreenCompany() : ScreenAttract("ScreenCompany") { }; }; diff --git a/stepmania/src/ScreenDemonstration.cpp b/stepmania/src/ScreenDemonstration.cpp index ac85d06cc0..5c8253564c 100644 --- a/stepmania/src/ScreenDemonstration.cpp +++ b/stepmania/src/ScreenDemonstration.cpp @@ -16,7 +16,7 @@ #include "GameState.h" #include "SongManager.h" #include "StepMania.h" -#include "SDL_utils.h" +#include "ScreenAttract.h" // for AttractInput() #define SECONDS_TO_SHOW THEME->GetMetricF("ScreenDemonstration","SecondsToShow") @@ -24,15 +24,10 @@ const ScreenMessage SM_NotesEnded = ScreenMessage(SM_User+101); // MUST be same as in ScreenGameplay -const ScreenMessage SM_BeginFadingToNextScreen = ScreenMessage(SM_User+1000); -bool SetUpSongOptions() // always return true. +bool PrepareForDemonstration() // always return true. { - // - // Set the current song to prepare for a demonstration - // - switch( GAMESTATE->m_CurGame ) { case GAME_DANCE: GAMESTATE->m_CurStyle = STYLE_DANCE_VERSUS; break; @@ -47,83 +42,10 @@ bool SetUpSongOptions() // always return true. GAMESTATE->m_PlayMode = PLAY_MODE_ARCADE; - // - // Search for a Song and Steps to play during the demo - // - for( int i=0; i<600; i++ ) // try 600 times - { - Song* pSong = SONGMAN->GetRandomSong(); - if( pSong == NULL ) // returns NULL there are no songs - return true; // we need to detect this and abort demonstration later - - if( pSong->m_apNotes.empty() ) - continue; // skip - - if( !pSong->HasMusic() ) - continue; // skip - - vector apNotes; - pSong->GetNotes( apNotes, GAMESTATE->GetCurrentStyleDef()->m_NotesType ); - - if( apNotes.empty() ) - continue; // skip - - // Found something we can use! - Notes* pNotes = apNotes[ rand()%apNotes.size() ]; - - GAMESTATE->m_pCurSong = pSong; - for( int p=0; pm_pCurNotes[p] = pNotes; - - break; // done looking - } - - ASSERT( GAMESTATE->m_pCurSong ); - - GAMESTATE->m_MasterPlayerNumber = PLAYER_1; - - // choose some cool options - int Benchmark = 0; - if(Benchmark) - { - /* Note that you also need to make sure you benchmark with the - * same notes. I use a copy of MaxU with only heavy notes included. */ - for( int p=0; pIsPlayerEnabled(p) ) - continue; - - /* Lots and lots of arrows. This might even bias to arrows a little - * too much. */ - GAMESTATE->m_PlayerOptions[p].Init(); - GAMESTATE->m_PlayerOptions[p].m_fScrollSpeed = .25f; - GAMESTATE->m_PlayerOptions[p].m_fEffects[ PlayerOptions::EFFECT_SPACE ] = 1; - GAMESTATE->m_PlayerOptions[p].m_fEffects[ PlayerOptions::EFFECT_MINI ] = 1; - } - GAMESTATE->m_SongOptions.m_LifeType = SongOptions::LIFE_BATTERY; - GAMESTATE->m_SongOptions.m_FailType = SongOptions::FAIL_OFF; - } - - for( int p=0; pIsPlayerEnabled(p) ) - continue; - - GAMESTATE->m_PlayerOptions[p].Init(); - GAMESTATE->m_PlayerOptions[p].ChooseRandomMofifiers(); - } - - GAMESTATE->m_SongOptions = SongOptions(); - - GAMESTATE->m_SongOptions.m_LifeType = (randomf(0,1)>0.8f) ? SongOptions::LIFE_BATTERY : SongOptions::LIFE_BAR; - GAMESTATE->m_SongOptions.m_FailType = SongOptions::FAIL_OFF; - - GAMESTATE->m_bDemonstration = true; - return true; } -ScreenDemonstration::ScreenDemonstration() : ScreenGameplay(SetUpSongOptions()) // this is a hack to get some code to execute before the ScreenGameplay constructor +ScreenDemonstration::ScreenDemonstration() : ScreenJukebox( PrepareForDemonstration() ) // this is a hack to get some code to execute before the ScreenGameplay constructor { LOG->Trace( "ScreenDemonstration::ScreenDemonstration()" ); @@ -134,41 +56,29 @@ ScreenDemonstration::ScreenDemonstration() : ScreenGameplay(SetUpSongOptions()) } - m_sprDemonstrationOverlay.Load( THEME->GetPathTo("Graphics","demonstration overlay") ); - m_sprDemonstrationOverlay.SetXY( CENTER_X, CENTER_Y ); - this->AddChild( &m_sprDemonstrationOverlay ); + m_Overlay.LoadFromAniDir( THEME->GetPathTo("BGAnimations","ScreenDemonstration overlay") ); + this->AddChild( &m_Overlay ); - m_sprDemonstrationBlink.Load( THEME->GetPathTo("Graphics","demonstration blink") ); - m_sprDemonstrationBlink.SetXY( CENTER_X, CENTER_Y ); - m_sprDemonstrationBlink.SetEffectDiffuseBlink(); - this->AddChild( &m_sprDemonstrationBlink ); + this->MoveToTail( &m_In ); + this->MoveToTail( &m_Out ); - this->MoveToTail( &m_Fade ); - - m_Fade.OpenWipingRight(); - - ClearMessageQueue(); // remove all of the messages set in ScreenGameplay that animate "ready", "here we go", etc. + ClearMessageQueue(); // remove all of the messages set in ScreenGameplay that drive "ready", "go", etc. GAMESTATE->m_bPastHereWeGo = true; - m_StarWipe.SetOpened(); m_DancingState = STATE_DANCING; - this->SendScreenMessage( SM_BeginFadingToNextScreen, SECONDS_TO_SHOW ); + this->SendScreenMessage( SM_BeginFadingOut, SECONDS_TO_SHOW ); } ScreenDemonstration::~ScreenDemonstration() { - GAMESTATE->m_bDemonstration = false; + GAMESTATE->m_bDemonstrationOrJukebox = false; GAMESTATE->Reset(); } void ScreenDemonstration::Update( float fDeltaTime ) { ScreenGameplay::Update( fDeltaTime ); - - // hide status icons - for( int i=0; iTrace( "ScreenDemonstration::Input()" ); - // - // This should be the same as ScreenAttract::Input() - // - - if(type != IET_FIRST_PRESS) return; // don't care - - if( DeviceI.device == DEVICE_KEYBOARD && DeviceI.button == SDLK_F3 ) - { - (int&)PREFSMAN->m_CoinMode = (PREFSMAN->m_CoinMode+1) % PrefsManager::NUM_COIN_MODES; - /*ResetGame(); - This causes problems on ScreenIntroMovie, which results in the - movie being restarted and/or becoming out-of-synch -- Miryokuteki */ - - CString sMessage = "Coin Mode: "; - switch( PREFSMAN->m_CoinMode ) - { - case PrefsManager::COIN_HOME: sMessage += "HOME"; break; - case PrefsManager::COIN_PAY: sMessage += "PAY"; break; - case PrefsManager::COIN_FREE: sMessage += "FREE"; break; - } - SCREENMAN->RefreshCreditsMessages(); - SCREENMAN->SystemMessage( sMessage ); - return; - } - + // Stop music on Start or Coin + // TODO: Change ScreenGameplay to play sound through the global sound object + // so that this don't need to be special cased. if( MenuI.IsValid() ) { switch( MenuI.button ) { - case MENU_BUTTON_LEFT: - case MENU_BUTTON_RIGHT: - if( !m_Fade.IsOpening() && !m_Fade.IsClosing() ) - m_Fade.CloseWipingRight( SM_GoToNextScreen ); - break; case MENU_BUTTON_COIN: - Screen::MenuCoin( MenuI.player ); // increment coins, play sound m_soundMusic.Stop(); - SDL_Delay( 800 ); // do a little pause, like the arcade does - SCREENMAN->SetNewScreen( "ScreenTitleMenu" ); break; case MENU_BUTTON_START: case MENU_BUTTON_BACK: @@ -228,9 +108,6 @@ void ScreenDemonstration::Input( const DeviceInput& DeviceI, const InputEventTyp case PrefsManager::COIN_FREE: case PrefsManager::COIN_HOME: m_soundMusic.Stop(); - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","insert coin") ); - SDL_Delay( 800 ); // do a little pause, like the arcade does - SCREENMAN->SetNewScreen( "ScreenTitleMenu" ); break; default: ASSERT(0); @@ -239,6 +116,7 @@ void ScreenDemonstration::Input( const DeviceInput& DeviceI, const InputEventTyp } } + ScreenAttract::AttractInput( DeviceI, type, GameI, MenuI, StyleI, m_In.IsTransitioning() || m_Out.IsTransitioning() ); } void ScreenDemonstration::HandleScreenMessage( const ScreenMessage SM ) @@ -246,10 +124,8 @@ void ScreenDemonstration::HandleScreenMessage( const ScreenMessage SM ) switch( SM ) { case SM_NotesEnded: - this->SendScreenMessage( SM_BeginFadingToNextScreen, 0 ); - return; - case SM_BeginFadingToNextScreen: - m_Fade.CloseWipingRight( SM_GoToNextScreen ); + case SM_BeginFadingOut: + m_Out.StartTransitioning( SM_GoToNextScreen ); return; case SM_GoToNextScreen: m_soundMusic.Stop(); diff --git a/stepmania/src/ScreenDemonstration.h b/stepmania/src/ScreenDemonstration.h index 722f076821..227544ba53 100644 --- a/stepmania/src/ScreenDemonstration.h +++ b/stepmania/src/ScreenDemonstration.h @@ -9,11 +9,10 @@ ----------------------------------------------------------------------------- */ -#include "ScreenGameplay.h" -#include "Sprite.h" +#include "ScreenJukebox.h" -class ScreenDemonstration : public ScreenGameplay +class ScreenDemonstration : public ScreenJukebox { public: ScreenDemonstration(); @@ -24,10 +23,7 @@ public: virtual void HandleScreenMessage( const ScreenMessage SM ); protected: - Sprite m_sprDemonstrationOverlay; - Sprite m_sprDemonstrationBlink; - - + BGAnimation m_Overlay; }; diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index fd9b0ee51e..887ae6c270 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -224,7 +224,7 @@ ScreenEdit::ScreenEdit() GAMESTATE->m_SongOptions.m_fMusicRate = 1; NOTESKIN->SwitchNoteSkin( PLAYER_1, "note" ); // change noteskin before loading all of the edit Actors - m_BGAnimation.LoadFromAniDir( THEME->GetPathTo("BGAnimations","edit") ); + m_BGAnimation.LoadFromAniDir( THEME->GetPathTo("BGAnimations","ScreenEdit background") ); shiftAnchor = -1; m_SnapDisplay.SetXY( EDIT_X, EDIT_GRAY_Y ); @@ -260,7 +260,7 @@ ScreenEdit::ScreenEdit() m_Fade.SetClosed(); - m_sprHelp.Load( THEME->GetPathTo("Graphics","edit help") ); + m_sprHelp.Load( THEME->GetPathTo("Graphics","ScreenEdit help") ); m_sprHelp.SetHorizAlign( Actor::align_left ); m_sprHelp.SetXY( HELP_X, HELP_Y ); @@ -271,7 +271,7 @@ ScreenEdit::ScreenEdit() m_textHelp.SetZoom( 0.5f ); m_textHelp.SetText( HELP_TEXT ); - m_sprInfo.Load( THEME->GetPathTo("Graphics","edit info") ); + m_sprInfo.Load( THEME->GetPathTo("Graphics","ScreenEdit Info") ); m_sprInfo.SetHorizAlign( Actor::align_right ); m_sprInfo.SetXY( INFO_X, INFO_Y ); @@ -282,16 +282,15 @@ ScreenEdit::ScreenEdit() m_textInfo.SetZoom( 0.5f ); //m_textInfo.SetText(); // set this below every frame - m_soundChangeLine.Load( THEME->GetPathTo("Sounds","edit change line") ); - m_soundChangeSnap.Load( THEME->GetPathTo("Sounds","edit change snap") ); - m_soundMarker.Load( THEME->GetPathTo("Sounds","edit marker") ); - m_soundInvalid.Load( THEME->GetPathTo("Sounds","menu invalid") ); + m_soundChangeLine.Load( THEME->GetPathTo("Sounds","ScreenEdit line") ); + m_soundChangeSnap.Load( THEME->GetPathTo("Sounds","ScreenEdit snap") ); + m_soundMarker.Load( THEME->GetPathTo("Sounds","ScreenEdit marker") ); m_soundMusic.Load(m_pSong->GetMusicPath()); m_soundMusic.SetAccurateSync(true); - m_soundAssistTick.Load( THEME->GetPathTo("Sounds","gameplay assist tick") ); + m_soundAssistTick.Load( THEME->GetPathTo("Sounds","ScreenEdit assist tick") ); m_Fade.OpenWipingRight(); } diff --git a/stepmania/src/ScreenEdit.h b/stepmania/src/ScreenEdit.h index 1c46707aaa..9ee621d135 100644 --- a/stepmania/src/ScreenEdit.h +++ b/stepmania/src/ScreenEdit.h @@ -79,7 +79,6 @@ protected: RageSound m_soundChangeLine; RageSound m_soundChangeSnap; RageSound m_soundMarker; - RageSound m_soundInvalid; TransitionFade m_Fade; diff --git a/stepmania/src/ScreenEditMenu.cpp b/stepmania/src/ScreenEditMenu.cpp index 1f63df8a7f..31a82a024c 100644 --- a/stepmania/src/ScreenEditMenu.cpp +++ b/stepmania/src/ScreenEditMenu.cpp @@ -44,11 +44,7 @@ ScreenEditMenu::ScreenEditMenu() // m_Selector.AllowNewNotes(); this->AddChild( &m_Selector ); - m_Menu.Load( - THEME->GetPathTo("BGAnimations","edit menu"), - THEME->GetPathTo("Graphics","edit menu top edge"), - HELP_TEXT, false, false, 99 - ); + m_Menu.Load( "ScreenEditMenu", false ); this->AddChild( &m_Menu ); @@ -58,15 +54,7 @@ ScreenEditMenu::ScreenEditMenu() m_textExplanation.SetZoom( 0.7f ); this->AddChild( &m_textExplanation ); - m_Fade.SetOpened(); - this->AddChild( &m_Fade); - - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","edit menu music") ); - - m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); - m_soundCreate.Load( THEME->GetPathTo("Sounds","edit menu create") ); - - m_Menu.TweenOnScreenFromBlack( SM_None ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenEditMenu music") ); } @@ -137,7 +125,7 @@ void DeleteCurNotes() void ScreenEditMenu::MenuStart( PlayerNumber pn ) { - if( m_Fade.IsClosing() || m_Fade.IsClosed() ) + if( m_Menu.IsTransitioning() ) return; Song* pSong = m_Selector.GetSelectedSong(); @@ -169,9 +157,8 @@ void ScreenEditMenu::MenuStart( PlayerNumber pn ) // Prepare prepare for ScreenEdit ASSERT( pNotes ); SOUNDMAN->StopMusic(); - m_soundSelect.PlayRandom(); - m_Menu.TweenOffScreenToBlack( SM_GoToNextScreen, false ); - m_Fade.CloseWipingRight( SM_None ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","Common start") ); + m_Menu.StartTransitioning( SM_GoToNextScreen ); break; case EditMenu::ACTION_DELETE: ASSERT( pNotes ); @@ -190,7 +177,7 @@ void ScreenEditMenu::MenuStart( PlayerNumber pn ) pSong->AddNotes( pNewNotes ); SCREENMAN->SystemMessage( "Notes created from copy." ); - m_soundCreate.PlayRandom(); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","ScreenEditMenu create") ); m_Selector.RefreshNotes(); pSong->Save(); } @@ -208,7 +195,7 @@ void ScreenEditMenu::MenuStart( PlayerNumber pn ) pSong->AddNotes( pNewNotes ); SCREENMAN->SystemMessage( "Notes created from AutoGen." ); - m_soundCreate.PlayRandom(); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","ScreenEditMenu create") ); m_Selector.RefreshNotes(); pSong->Save(); } @@ -225,7 +212,7 @@ void ScreenEditMenu::MenuStart( PlayerNumber pn ) pSong->AddNotes( pNewNotes ); SCREENMAN->SystemMessage( "Blank Notes created." ); - m_soundCreate.PlayRandom(); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","ScreenEditMenu create") ); m_Selector.RefreshNotes(); pSong->Save(); } @@ -237,9 +224,7 @@ void ScreenEditMenu::MenuStart( PlayerNumber pn ) void ScreenEditMenu::MenuBack( PlayerNumber pn ) { - m_Menu.TweenOffScreenToBlack( SM_None, true ); + m_Menu.Back( SM_GoToPrevScreen ); SOUNDMAN->StopMusic(); - - m_Fade.CloseWipingLeft( SM_GoToPrevScreen ); } diff --git a/stepmania/src/ScreenEditMenu.h b/stepmania/src/ScreenEditMenu.h index 8ff7020b1d..dccabcdc60 100644 --- a/stepmania/src/ScreenEditMenu.h +++ b/stepmania/src/ScreenEditMenu.h @@ -36,16 +36,11 @@ private: void MenuBack( PlayerNumber pn ); void MenuStart( PlayerNumber pn ); - EditMenu m_Selector; + EditMenu m_Selector; BitmapText m_textExplanation; - MenuElements m_Menu; - - TransitionFade m_Fade; - - RandomSample m_soundSelect; - RandomSample m_soundCreate; + MenuElements m_Menu; }; diff --git a/stepmania/src/ScreenEvaluation.cpp b/stepmania/src/ScreenEvaluation.cpp index a7ff9ce598..9a376f1481 100644 --- a/stepmania/src/ScreenEvaluation.cpp +++ b/stepmania/src/ScreenEvaluation.cpp @@ -209,11 +209,10 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) ////////////////////////// // Init graphic elements ////////////////////////// - m_Menu.Load( - THEME->GetPathTo("BGAnimations","evaluation"), - THEME->GetPathTo("Graphics",m_ResultMode==RM_ARCADE_SUMMARY?"evaluation summary top edge":"evaluation top edge"), - HELP_TEXT, true, true, TIMER_SECONDS - ); + m_Menu.Load( "ScreenEvaluation" ); +// FIXME: +// The header needs to be different depending on the result mode. How can we do this elegantly? +// THEME->GetPathTo("Graphics",m_ResultMode==RM_ARCADE_SUMMARY?"evaluation summary top edge":"evaluation top edge"), this->AddChild( &m_Menu ); int p; @@ -555,12 +554,12 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) break; } - if( bSummary ) - m_Menu.ImmedOnScreenFromMenu(); - else - m_Menu.TweenOnScreenFromBlack( SM_None ); +// if( bSummary ) +// m_Menu.ImmedOnScreenFromMenu(); +// else +// m_Menu.TweenOnScreenFromBlack( SM_None ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","evaluation music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenEvaluation music") ); } @@ -568,7 +567,7 @@ void ScreenEvaluation::TweenOnScreen() { int i, p; - m_Menu.TweenOnScreenFromBlack( SM_None ); +// m_Menu.TweenOnScreenFromBlack( SM_None ); float fOriginalX, fOriginalY; @@ -741,7 +740,7 @@ void ScreenEvaluation::Input( const DeviceInput& DeviceI, const InputEventType t { // LOG->Trace( "ScreenEvaluation::Input()" ); - if( m_Menu.IsClosing() ) + if( m_Menu.IsTransitioning() ) return; Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); @@ -800,19 +799,17 @@ void ScreenEvaluation::MenuStart( PlayerNumber pn ) { TweenOffScreen(); - m_Menu.StopTimer(); - if( PREFSMAN->m_bEventMode ) { switch( GAMESTATE->m_PlayMode ) { case PLAY_MODE_ARCADE: - m_Menu.TweenOffScreenToMenu( SM_GoToSelectMusic ); + m_Menu.StartTransitioning( SM_GoToSelectMusic ); break; case PLAY_MODE_NONSTOP: case PLAY_MODE_ONI: case PLAY_MODE_ENDLESS: - m_Menu.TweenOffScreenToMenu( SM_GoToSelectCourse ); + m_Menu.StartTransitioning( SM_GoToSelectCourse ); break; default: ASSERT(0); @@ -825,7 +822,7 @@ void ScreenEvaluation::MenuStart( PlayerNumber pn ) case RM_ARCADE_STAGE: if( m_bTryExtraStage ) { - m_Menu.TweenOffScreenToMenu( SM_GoToSelectMusic ); + m_Menu.StartTransitioning( SM_GoToSelectMusic ); } else if( GAMESTATE->IsFinalStage() || GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) { @@ -838,14 +835,14 @@ void ScreenEvaluation::MenuStart( PlayerNumber pn ) } else { - m_Menu.TweenOffScreenToMenu( SM_GoToSelectMusic ); + m_Menu.StartTransitioning( SM_GoToSelectMusic ); } break; case RM_ARCADE_SUMMARY: - m_Menu.TweenOffScreenToBlack( SM_GoToGameFinished, false ); + m_Menu.StartTransitioning( SM_GoToGameFinished ); break; case RM_COURSE: - m_Menu.TweenOffScreenToBlack( SM_GoToGameFinished, false ); + m_Menu.StartTransitioning( SM_GoToGameFinished ); break; } } diff --git a/stepmania/src/ScreenEz2SelectMusic.cpp b/stepmania/src/ScreenEz2SelectMusic.cpp index b6a7ddbbe2..ce44e4cb30 100644 --- a/stepmania/src/ScreenEz2SelectMusic.cpp +++ b/stepmania/src/ScreenEz2SelectMusic.cpp @@ -67,22 +67,18 @@ ScreenEz2SelectMusic::ScreenEz2SelectMusic() } - m_Menu.Load( - THEME->GetPathTo("BGAnimations","select music"), - THEME->GetPathTo("Graphics","select music top edge"), - HELP_TEXT, true, true, TIMER_SECONDS - ); + m_Menu.Load("ScreenSelectMusic"); this->AddChild( &m_Menu ); - m_soundMusicChange.Load( THEME->GetPathTo("Sounds","select music change")); - m_soundMusicCycle.Load( THEME->GetPathTo("Sounds","select music cycle")); - m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); + m_soundMusicChange.Load( THEME->GetPathTo("Sounds","ScreenEz2SelectMusic change")); + m_soundMusicCycle.Load( THEME->GetPathTo("Sounds","ScreenEz2SelectMusic cycle")); + m_soundSelect.Load( THEME->GetPathTo("Sounds","Common start") ); - m_ChoiceListFrame.Load( THEME->GetPathTo("Graphics","select mode list frame")); + m_ChoiceListFrame.Load( THEME->GetPathTo("Graphics","ScreenEz2SelectMusic list frame")); m_ChoiceListFrame.SetXY( SCROLLING_LIST_X, SCROLLING_LIST_Y); this->AddChild( &m_ChoiceListFrame ); - m_Guide.Load( THEME->GetPathTo("Graphics","select mode guide")); + m_Guide.Load( THEME->GetPathTo("Graphics","ScreenEz2SelectMusic guide")); m_Guide.SetXY( GUIDE_X, GUIDE_Y ); this->AddChild( &m_Guide ); @@ -95,7 +91,7 @@ ScreenEz2SelectMusic::ScreenEz2SelectMusic() this->AddChild( &m_MusicBannerWheel ); - m_ChoiceListHighlight.Load( THEME->GetPathTo("Graphics","select mode list highlight")); + m_ChoiceListHighlight.Load( THEME->GetPathTo("Graphics","ScreenEz2SelectMusic list highlight")); m_ChoiceListHighlight.SetXY( SCROLLING_LIST_X, SCROLLING_LIST_Y); this->AddChild( &m_ChoiceListHighlight ); @@ -111,17 +107,17 @@ ScreenEz2SelectMusic::ScreenEz2SelectMusic() // m_FootMeter[p].SetShadowLength( 2 ); // this->AddChild( &m_FootMeter[p] ); - m_SpeedIcon[p].Load( THEME->GetPathTo("Graphics","select music speedicon")); + m_SpeedIcon[p].Load( THEME->GetPathTo("Graphics","ScreenEz2SelectMusic speedicon")); m_SpeedIcon[p].SetXY( SPEEDICON_X(p), SPEEDICON_Y(p) ); m_SpeedIcon[p].SetDiffuse( RageColor(0,0,0,0) ); this->AddChild(&m_SpeedIcon[p] ); - m_MirrorIcon[p].Load( THEME->GetPathTo("Graphics","select music mirroricon")); + m_MirrorIcon[p].Load( THEME->GetPathTo("Graphics","ScreenEz2SelectMusic mirroricon")); m_MirrorIcon[p].SetXY( MIRRORICON_X(p), MIRRORICON_Y(p) ); m_MirrorIcon[p].SetDiffuse( RageColor(0,0,0,0) ); this->AddChild(&m_MirrorIcon[p] ); - m_ShuffleIcon[p].Load( THEME->GetPathTo("Graphics","select music shuffleicon")); + m_ShuffleIcon[p].Load( THEME->GetPathTo("Graphics","ScreenEz2SelectMusic shuffleicon")); m_ShuffleIcon[p].SetXY( SHUFFLEICON_X(p), SHUFFLEICON_Y(p) ); m_ShuffleIcon[p].SetDiffuse( RageColor(0,0,0,0) ); this->AddChild(&m_ShuffleIcon[p] ); @@ -131,11 +127,11 @@ ScreenEz2SelectMusic::ScreenEz2SelectMusic() m_iSelection[p] = 0; } - m_InfoFrame.Load( THEME->GetPathTo("Graphics","select music infoframe") ); + m_InfoFrame.Load( THEME->GetPathTo("Graphics","ScreenEz2SelectMusic infoframe") ); m_InfoFrame.SetXY( INFOFRAME_X, INFOFRAME_Y ); this->AddChild( &m_InfoFrame ); - m_PumpDifficultyCircle.Load( THEME->GetPathTo("Graphics","select music pump difficulty circle")); + m_PumpDifficultyCircle.Load( THEME->GetPathTo("Graphics","ScreenEz2SelectMusic difficulty frame")); m_PumpDifficultyCircle.SetXY( PUMP_DIFF_X, PUMP_DIFF_Y ); this->AddChild( &m_PumpDifficultyCircle ); @@ -148,22 +144,20 @@ ScreenEz2SelectMusic::ScreenEz2SelectMusic() m_DifficultyRating.SetY(DIFFICULTYRATING_Y); this->AddChild(&m_DifficultyRating); - m_sprOptionsMessage.Load( THEME->GetPathTo("Graphics","select music options message") ); + m_sprOptionsMessage.Load( THEME->GetPathTo("Graphics","ScreenEz2SelectMusic options message") ); m_sprOptionsMessage.StopAnimating(); m_sprOptionsMessage.SetXY( CENTER_X, CENTER_Y ); m_sprOptionsMessage.SetZoom( 1 ); m_sprOptionsMessage.SetDiffuse( RageColor(1,1,1,0) ); this->AddChild( &m_sprOptionsMessage ); - m_soundOptionsChange.Load( THEME->GetPathTo("Sounds","select music options") ); + m_soundOptionsChange.Load( THEME->GetPathTo("Sounds","ScreenEz2SelectMusic options") ); m_bGoToOptions = false; m_bMadeChoice = false; MusicChanged(); } - - m_Menu.TweenOnScreenFromMenu( SM_None ); } void ScreenEz2SelectMusic::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ) @@ -175,13 +169,13 @@ void ScreenEz2SelectMusic::Input( const DeviceInput& DeviceI, const InputEventTy if( type == IET_RELEASE ) return; // don't care - if( m_Menu.IsClosing() ) return; // ignore + if( m_Menu.IsTransitioning() ) return; // ignore if( !GameI.IsValid() ) return; // don't care if( m_bMadeChoice && !m_bGoToOptions && MenuI.IsValid() && MenuI.button == MENU_BUTTON_START ) { - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","menu start") ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","Common start") ); m_bGoToOptions = true; m_sprOptionsMessage.SetState( 1 ); } @@ -296,7 +290,7 @@ void ScreenEz2SelectMusic::HandleScreenMessage( const ScreenMessage SM ) void ScreenEz2SelectMusic::MenuRight( PlayerNumber pn, const InputEventType type ) { - m_Menu.StallTimer(); + m_Menu.m_MenuTimer.StallTimer(); m_MusicBannerWheel.BannersRight(); MusicChanged(); } @@ -305,7 +299,7 @@ void ScreenEz2SelectMusic::MenuBack( PlayerNumber pn ) { SOUNDMAN->StopMusic(); - m_Menu.TweenOffScreenToBlack( SM_GoToPrevScreen, true ); + m_Menu.Back( SM_GoToPrevScreen ); } @@ -323,7 +317,7 @@ void ScreenEz2SelectMusic::TweenOffScreen() void ScreenEz2SelectMusic::MenuLeft( PlayerNumber pn, const InputEventType type ) { - m_Menu.StallTimer(); + m_Menu.m_MenuTimer.StallTimer(); m_MusicBannerWheel.BannersLeft(); MusicChanged(); } @@ -360,13 +354,7 @@ void ScreenEz2SelectMusic::MenuStart( PlayerNumber pn ) m_sprOptionsMessage.SetTweenDiffuse( RageColor(1,1,1,0) ); m_sprOptionsMessage.SetTweenZoomY( 0 ); - m_Menu.TweenOffScreenToBlack( SM_None, false ); - - m_Menu.StopTimer(); - - this->SendScreenMessage( SM_GoToNextScreen, 2.5f ); - -// SCREENMAN->SetNewScreen( "ScreenStage" ); + m_Menu.StartTransitioning( SM_GoToNextScreen ); } diff --git a/stepmania/src/ScreenEz2SelectMusic.h b/stepmania/src/ScreenEz2SelectMusic.h index 3d82ef8f0e..5c0fec53e7 100644 --- a/stepmania/src/ScreenEz2SelectMusic.h +++ b/stepmania/src/ScreenEz2SelectMusic.h @@ -19,7 +19,7 @@ #include "TipDisplay.h" #include "MusicBannerWheel.h" #include "MenuElements.h" -#include "FootMeter.h" +#include "DifficultyMeter.h" #include "DifficultyRating.h" @@ -69,7 +69,7 @@ protected: MusicBannerWheel m_MusicBannerWheel; MenuElements m_Menu; DifficultyRating m_DifficultyRating; -// FootMeter m_FootMeter[NUM_PLAYERS]; +// DifficultyMeter m_DifficultyMeter[NUM_PLAYERS]; vector m_arrayNotes[NUM_PLAYERS]; int m_iSelection[NUM_PLAYERS]; bool m_bGoToOptions; diff --git a/stepmania/src/ScreenEz2SelectPlayer.cpp b/stepmania/src/ScreenEz2SelectPlayer.cpp index 8602a34c88..8a6dd309fa 100644 --- a/stepmania/src/ScreenEz2SelectPlayer.cpp +++ b/stepmania/src/ScreenEz2SelectPlayer.cpp @@ -55,19 +55,15 @@ ScreenEz2SelectPlayer::ScreenEz2SelectPlayer() LOG->Trace( "ScreenEz2SelectPlayer::ScreenEz2SelectPlayer()" ); - m_Menu.Load( - THEME->GetPathTo("BGAnimations","ez2 select player"), - THEME->GetPathTo("Graphics","select player top edge"), - HELP_TEXT, false, true, TIMER_SECONDS - ); + m_Menu.Load( "ScreenEz2SelectPlayer" ); this->AddChild( &m_Menu ); - m_Background.LoadFromAniDir( THEME->GetPathTo("BGAnimations","ez2 select player") ); + m_Background.LoadFromAniDir( THEME->GetPathTo("BGAnimations","ScreenEz2SelectPlayer background") ); this->AddChild( &m_Background ); // animated background =) for( p=0; pGetPathTo("Graphics","select player join frame 1x2") ); + m_sprJoinFrame[p].Load( THEME->GetPathTo("Graphics","ScreenEz2SelectPlayer join frame 1x2") ); m_sprJoinFrame[p].StopAnimating(); m_sprJoinFrame[p].SetState( p ); m_sprJoinFrame[p].SetXY( JOIN_FRAME_X(p), JOIN_FRAME_Y(p) ); @@ -76,7 +72,7 @@ ScreenEz2SelectPlayer::ScreenEz2SelectPlayer() if( GAMESTATE->m_bSideIsJoined[p] ) m_sprJoinFrame[p].SetZoomY( 0 ); - m_sprJoinMessage[p].Load( THEME->GetPathTo("Graphics","select player join message 2x2") ); + m_sprJoinMessage[p].Load( THEME->GetPathTo("Graphics","ScreenEz2SelectPlayer join message 2x2") ); m_sprJoinMessage[p].StopAnimating(); m_sprJoinMessage[p].SetState( p ); m_sprJoinMessage[p].SetXY( JOIN_MESSAGE_X(p), JOIN_MESSAGE_Y(p) ); @@ -96,14 +92,13 @@ ScreenEz2SelectPlayer::ScreenEz2SelectPlayer() } } - m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","Common start") ); SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select player intro") ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","select player music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenSelectPlayer music") ); TweenOnScreen(); - m_Menu.TweenOnScreenFromBlack( SM_None ); } /************************************ @@ -145,7 +140,7 @@ void ScreenEz2SelectPlayer::Input( const DeviceInput& DeviceI, const InputEventT { LOG->Trace( "ScreenEz2SelectPlayer::Input()" ); - if( m_Menu.IsClosing() ) + if( m_Menu.IsTransitioning() ) return; Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); // default input handler @@ -166,11 +161,11 @@ void ScreenEz2SelectPlayer::HandleScreenMessage( const ScreenMessage SM ) if( GAMESTATE->GetNumSidesJoined() == 0 ) { MenuStart(PLAYER_1); - m_Menu.StopTimer(); + m_Menu.m_MenuTimer.StopTimer(); } TweenOffScreen(); - m_Menu.TweenOffScreenToMenu( SM_GoToNextScreen ); + m_Menu.StartTransitioning( SM_GoToNextScreen ); break; case SM_GoToPrevScreen: SOUNDMAN->StopMusic(); @@ -193,7 +188,7 @@ void ScreenEz2SelectPlayer::MenuBack( PlayerNumber pn ) { SOUNDMAN->StopMusic(); - m_Menu.TweenOffScreenToBlack( SM_GoToPrevScreen, true ); + m_Menu.Back( SM_GoToPrevScreen ); } @@ -238,14 +233,14 @@ void ScreenEz2SelectPlayer::MenuStart( PlayerNumber pn ) if( bBothSidesJoined ) { TweenOffScreen(); - m_Menu.TweenOffScreenToMenu( SM_GoToNextScreen ); + m_Menu.StartTransitioning( SM_GoToNextScreen ); } else { // give the other player a little time to join - m_Menu.SetTimer( 1 ); - m_Menu.StartTimer(); - m_Menu.StealthTimer( SILENT_WAIT ); // do we wanna make the timer 'quiet' ? + m_Menu.m_MenuTimer.SetTimer( 1 ); + m_Menu.m_MenuTimer.StartTimer(); + m_Menu.m_MenuTimer.StealthTimer( SILENT_WAIT ); // do we wanna make the timer 'quiet' ? } } diff --git a/stepmania/src/ScreenGameOver.cpp b/stepmania/src/ScreenGameOver.cpp index c541ffe650..e8498dbb3d 100644 --- a/stepmania/src/ScreenGameOver.cpp +++ b/stepmania/src/ScreenGameOver.cpp @@ -31,13 +31,13 @@ ScreenGameOver::ScreenGameOver() { GAMESTATE->Reset(); - m_Background.LoadFromAniDir( THEME->GetPathTo("BGAnimations","game over") ); + m_Background.LoadFromAniDir( THEME->GetPathTo("BGAnimations","ScreenGameOver background") ); this->AddChild( &m_Background ); m_Fade.OpenWipingRight( SM_None ); this->AddChild( &m_Fade ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","game over music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenGameOver music") ); this->SendScreenMessage( SM_PlayAnnouncer, 0.5 ); this->SendScreenMessage( SM_StartFadingOut, 5 ); diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 00b3824af5..1481b45b68 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -74,38 +74,41 @@ #define STATUS_ICONS_Y THEME->GetMetricF("ScreenGameplay","StatusIconsY") #define SURVIVE_TIME_X THEME->GetMetricF("ScreenGameplay","SurviveTimeX") #define SURVIVE_TIME_Y THEME->GetMetricF("ScreenGameplay","SurviveTimeY") -#define SECONDS_BETWEEN_COMMENTS THEME->GetMetricF("ScreenGameplay","SecondsBetweenComments") -#define TICK_EARLY_SECONDS THEME->GetMetricF("ScreenGameplay","TickEarlySeconds") +CachedThemeMetric SECONDS_BETWEEN_COMMENTS ("ScreenGameplay","SecondsBetweenComments"); +CachedThemeMetric G_TICK_EARLY_SECONDS ("ScreenGameplay","TickEarlySeconds"); -static float g_fTickEarlySecondsCache = 0; // reading directly out of theme metrics is slow + +const ScreenMessage SM_PlayReady = ScreenMessage(SM_User+0); +const ScreenMessage SM_PlayGo = ScreenMessage(SM_User+1); // received while STATE_DANCING -const ScreenMessage SM_NotesEnded = ScreenMessage(SM_User+101); -const ScreenMessage SM_BeginLoadingNextSong = ScreenMessage(SM_User+102); -const ScreenMessage SM_PlayToastySound = ScreenMessage(SM_User+105); +const ScreenMessage SM_NotesEnded = ScreenMessage(SM_User+10); +const ScreenMessage SM_BeginLoadingNextSong = ScreenMessage(SM_User+11); +const ScreenMessage SM_PlayToastySound = ScreenMessage(SM_User+12); // received while STATE_OUTRO -const ScreenMessage SM_ShowCleared = ScreenMessage(SM_User+111); -const ScreenMessage SM_ShowTryExtraStage = ScreenMessage(SM_User+112); -const ScreenMessage SM_SaveChangedBeforeGoingBack = ScreenMessage(SM_User+113); -const ScreenMessage SM_GoToScreenAfterBack = ScreenMessage(SM_User+114); -const ScreenMessage SM_GoToStateAfterCleared= ScreenMessage(SM_User+115); +const ScreenMessage SM_SaveChangedBeforeGoingBack = ScreenMessage(SM_User+20); +const ScreenMessage SM_GoToScreenAfterBack = ScreenMessage(SM_User+21); +const ScreenMessage SM_GoToStateAfterCleared= ScreenMessage(SM_User+22); -const ScreenMessage SM_BeginFailed = ScreenMessage(SM_User+121); -const ScreenMessage SM_ShowFailed = ScreenMessage(SM_User+122); -const ScreenMessage SM_PlayFailComment = ScreenMessage(SM_User+123); -const ScreenMessage SM_GoToScreenAfterFail = ScreenMessage(SM_User+125); +const ScreenMessage SM_BeginFailed = ScreenMessage(SM_User+30); +const ScreenMessage SM_GoToScreenAfterFail = ScreenMessage(SM_User+31); // received while STATE_INTRO -const ScreenMessage SM_StartHereWeGo = ScreenMessage(SM_User+130); -const ScreenMessage SM_StopHereWeGo = ScreenMessage(SM_User+131); +const ScreenMessage SM_StartHereWeGo = ScreenMessage(SM_User+40); +const ScreenMessage SM_StopHereWeGo = ScreenMessage(SM_User+41); ScreenGameplay::ScreenGameplay( bool bDemonstration ) { LOG->Trace( "ScreenGameplay::ScreenGameplay()" ); + + SECONDS_BETWEEN_COMMENTS.Refresh(); + G_TICK_EARLY_SECONDS.Refresh(); + + m_textLyrics.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textLyrics.SetXY( 100,100 ); @@ -126,8 +129,6 @@ ScreenGameplay::ScreenGameplay( bool bDemonstration ) } } - g_fTickEarlySecondsCache = TICK_EARLY_SECONDS; - GAMESTATE->m_CurStageStats = StageStats(); // clear values @@ -235,7 +236,7 @@ ScreenGameplay::ScreenGameplay( bool bDemonstration ) /* Position it in LoadNextSong. */ this->AddChild( &m_ActiveItemList[p] ); - m_sprOniGameOver[p].Load( THEME->GetPathTo("Graphics","gameplay oni gameover") ); + m_sprOniGameOver[p].Load( THEME->GetPathTo("Graphics","ScreenGameplay oni gameover") ); m_sprOniGameOver[p].SetX( fPlayerX ); m_sprOniGameOver[p].SetY( SCREEN_TOP - m_sprOniGameOver[p].GetZoomedHeight()/2 ); m_sprOniGameOver[p].SetDiffuse( RageColor(1,1,1,0) ); // 0 alpha so we don't waste time drawing while not visible @@ -247,19 +248,16 @@ ScreenGameplay::ScreenGameplay( bool bDemonstration ) this->AddChild( &m_OniFade ); - m_sprMiddleFrame.Load( THEME->GetPathTo("Graphics","Gameplay Middle Frame") ); - m_sprMiddleFrame.SetXY( MIDDLE_FRAME_X, MIDDLE_FRAME_Y ); - const bool bExtra = GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2(); // LifeFrame goes below LifeMeter CString sLifeFrameName; if( bExtra ) - sLifeFrameName = "gameplay extra life frame"; + sLifeFrameName = "ScreenGameplay extra life frame"; else if( GAMESTATE->m_SongOptions.m_LifeType == SongOptions::LIFE_BATTERY ) - sLifeFrameName = "gameplay oni life frame"; + sLifeFrameName = "ScreenGameplay oni life frame"; else - sLifeFrameName = "gameplay life frame"; + sLifeFrameName = "ScreenGameplay life frame"; m_sprLifeFrame.Load( THEME->GetPathTo("Graphics",sLifeFrameName) ); m_sprLifeFrame.SetXY( LIFE_FRAME_X, LIFE_FRAME_Y(bExtra) ); this->AddChild( &m_sprLifeFrame ); @@ -322,11 +320,11 @@ ScreenGameplay::ScreenGameplay( bool bDemonstration ) // CString sScoreFrameName; if( bExtra ) - sScoreFrameName = "gameplay extra score frame"; + sScoreFrameName = "ScreenGameplay extra score frame"; else if( GAMESTATE->m_SongOptions.m_LifeType == SongOptions::LIFE_BATTERY ) - sScoreFrameName = "gameplay oni score frame"; + sScoreFrameName = "ScreenGameplay oni score frame"; else - sScoreFrameName = "gameplay score frame"; + sScoreFrameName = "ScreenGameplay score frame"; m_sprScoreFrame.Load( THEME->GetPathTo("Graphics",sScoreFrameName) ); m_sprScoreFrame.SetXY( SCORE_FRAME_X, SCORE_FRAME_Y(bExtra) ); this->AddChild( &m_sprScoreFrame ); @@ -337,7 +335,7 @@ ScreenGameplay::ScreenGameplay( bool bDemonstration ) m_StageName.SetZoom( STAGENAME_ZOOM ); this->AddChild( &m_StageName ); - m_MaxCombo.LoadFromNumbers( THEME->GetPathTo("Numbers","gameplay score numbers") ); + m_MaxCombo.LoadFromNumbers( THEME->GetPathTo("Numbers","ScreenGameplay max combo numbers") ); m_MaxCombo.SetXY( MAXCOMBO_X, MAXCOMBO_Y ); m_MaxCombo.SetZoom( MAXCOMBO_ZOOM ); m_MaxCombo.SetText( ssprintf("%d", m_Player[GAMESTATE->m_MasterPlayerNumber].GetPlayersMaxCombo()) ); /* MAKE THIS WORK FOR BOTH PLAYERS! */ @@ -392,7 +390,7 @@ ScreenGameplay::ScreenGameplay( bool bDemonstration ) if( !GAMESTATE->IsPlayerEnabled(PlayerNumber(p)) ) continue; - m_DifficultyIcon[p].Load( THEME->GetPathTo("graphics","gameplay difficulty icons 2x5") ); + m_DifficultyIcon[p].Load( THEME->GetPathTo("graphics","ScreenGameplay difficulty icons 2x5") ); /* Position it in LoadNextSong. */ this->AddChild( &m_DifficultyIcon[p] ); } @@ -405,120 +403,129 @@ ScreenGameplay::ScreenGameplay( bool bDemonstration ) //this->AddChild( &m_textLyrics ); -- THIS IS NOT DONE YET!! (Miryokuteki) - for( int s=0; sGetPathTo("Graphics",ssprintf("gameplay status icons 1x%d",NUM_STATUS_ICONS)) ); - m_sprStatusIcons[s].StopAnimating(); - m_sprStatusIcons[s].SetState(s); - this->AddChild( &m_sprStatusIcons[s] ); - } - - PositionStatusIcons(); // position them + m_textOptions.LoadFromFont( THEME->GetPathTo("Fonts","header2") ); + this->AddChild( &m_textOptions ); + UpdateOptionsText(); - - m_StarWipe.SetClosed(); - this->AddChild( &m_StarWipe ); - - m_sprReady.Load( THEME->GetPathTo("Graphics","gameplay ready") ); - m_sprReady.SetXY( CENTER_X, CENTER_Y ); - m_sprReady.SetDiffuse( RageColor(1,1,1,0) ); - this->AddChild( &m_sprReady ); - - m_sprHereWeGo.Load( THEME->GetPathTo("Graphics","gameplay here we go") ); - m_sprHereWeGo.SetXY( CENTER_X, CENTER_Y ); - m_sprHereWeGo.SetDiffuse( RageColor(1,1,1,0) ); - this->AddChild( &m_sprHereWeGo ); - - m_sprCleared.Load( THEME->GetPathTo("Graphics","gameplay cleared") ); - m_sprCleared.SetXY( CENTER_X, CENTER_Y ); - m_sprCleared.SetDiffuse( RageColor(1,1,1,0) ); - this->AddChild( &m_sprCleared ); - - m_sprFailed.Load( THEME->GetPathTo("Graphics","gameplay failed") ); - m_sprFailed.SetXY( CENTER_X, CENTER_Y ); - m_sprFailed.SetDiffuse( RageColor(1,1,1,0) ); - this->AddChild( &m_sprFailed ); - - if( GAMESTATE->IsFinalStage() ) - m_sprTryExtraStage.Load( THEME->GetPathTo("Graphics","gameplay try extra stage1") ); - else if( GAMESTATE->IsExtraStage() ) - m_sprTryExtraStage.Load( THEME->GetPathTo("Graphics","gameplay try extra stage2") ); - m_sprTryExtraStage.SetXY( CENTER_X, CENTER_Y ); - m_sprTryExtraStage.SetDiffuse( RageColor(1,1,1,0) ); - this->AddChild( &m_sprTryExtraStage ); - - m_Fade.SetOpened(); - this->AddChild( &m_Fade ); - - m_textSurviveTime.LoadFromFont( THEME->GetPathTo("Fonts","survive time") ); - m_textSurviveTime.EnableShadow( false ); - m_textSurviveTime.SetXY( SURVIVE_TIME_X, SURVIVE_TIME_Y ); - m_textSurviveTime.SetText( "" ); - m_textSurviveTime.SetDiffuse( RageColor(1,1,1,0) ); - this->AddChild( &m_textSurviveTime ); - - - m_sprToasty.Load( THEME->GetPathTo("Graphics","gameplay toasty") ); - m_sprToasty.SetDiffuse( RageColor(1,1,1,0) ); - this->AddChild( &m_sprToasty ); - m_BPMDisplay.SetXY( BPM_X, BPM_Y ); m_BPMDisplay.SetZoom( BPM_ZOOM ); this->AddChild( &m_BPMDisplay ); + m_Inventory.RefreshPossibleItems(); + this->AddChild( &m_Inventory ); + + + + if( !bDemonstration ) // only load if we're going to use it + { + m_Ready.Load( THEME->GetPathTo("BGAnimations","ScreenGameplay ready") ); + this->AddChild( &m_Ready ); + + m_Go.Load( THEME->GetPathTo("BGAnimations","ScreenGameplay go") ); + this->AddChild( &m_Go ); + + m_Cleared.Load( THEME->GetPathTo("BGAnimations","ScreenGameplay cleared") ); + this->AddChild( &m_Cleared ); + + m_Failed.Load( THEME->GetPathTo("BGAnimations","ScreenGameplay failed") ); + this->AddChild( &m_Failed ); + + if( GAMESTATE->IsFinalStage() ) // only load if we're going to use it + m_Extra.Load( THEME->GetPathTo("BGAnimations","ScreenGameplay extra1") ); + if( GAMESTATE->IsExtraStage() ) // only load if we're going to use it + m_Extra.Load( THEME->GetPathTo("BGAnimations","ScreenGameplay extra2") ); + this->AddChild( &m_Extra ); + + m_Toasty.Load( THEME->GetPathTo("BGAnimations","ScreenGameplay toasty") ); + this->AddChild( &m_Toasty ); + + m_Back.Load( THEME->GetPathTo("BGAnimations","Common back") ); + this->AddChild( &m_Back ); + + m_In.Load( THEME->GetPathTo("BGAnimations","ScreenGameplay in") ); + this->AddChild( &m_In ); + + + if( GAMESTATE->IsExtraStage() ) // only load if we're going to use it + { + m_textSurviveTime.LoadFromFont( THEME->GetPathTo("Fonts","survive time") ); + m_textSurviveTime.EnableShadow( false ); + m_textSurviveTime.SetXY( SURVIVE_TIME_X, SURVIVE_TIME_Y ); + m_textSurviveTime.SetText( "" ); + m_textSurviveTime.SetDiffuse( RageColor(1,1,1,0) ); + this->AddChild( &m_textSurviveTime ); + } + } + + /* LoadNextSong first, since that positions some elements which need to be * positioned before we TweenOnScreen. */ LoadNextSong(); TweenOnScreen(); - for( int i=0; i<30; i++ ) - this->SendScreenMessage( ScreenMessage(SM_User+i), i/2.0f ); // Send messages to we can get the introduction rolling - m_soundToasty.Load( THEME->GetPathTo("Sounds","gameplay toasty") ); - - if( !bDemonstration ) // don't load sounds if just playing demonstration + if( !bDemonstration ) // only load if we're going to use it { - m_soundFail.Load( THEME->GetPathTo("Sounds","gameplay failed") ); - m_soundTryExtraStage.Load( THEME->GetPathTo("Sounds","gameplay try extra stage") ); - m_soundOniDie.Load( THEME->GetPathTo("Sounds","gameplay oni die") ); - m_announcerReady.Load( ANNOUNCER->GetPathTo("gameplay ready") ); + m_soundFail.Load( THEME->GetPathTo("Sounds","ScreenGameplay failed") ); + m_soundTryExtraStage.Load( THEME->GetPathTo("Sounds","ScreenGameplay extra") ); + m_soundOniDie.Load( THEME->GetPathTo("Sounds","ScreenGameplay oni die") ); + m_announcerReady.Load( ANNOUNCER->GetPathTo("ScreenGameplay ready") ); if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) - m_announcerHereWeGo.Load( ANNOUNCER->GetPathTo("gameplay here we go extra") ); + m_announcerHereWeGo.Load( ANNOUNCER->GetPathTo("ScreenGameplay here we go extra") ); else if( GAMESTATE->IsFinalStage() ) - m_announcerHereWeGo.Load( ANNOUNCER->GetPathTo("gameplay here we go final") ); + m_announcerHereWeGo.Load( ANNOUNCER->GetPathTo("ScreenGameplay here we go final") ); else - m_announcerHereWeGo.Load( ANNOUNCER->GetPathTo("gameplay here we go normal") ); - m_announcerDanger.Load( ANNOUNCER->GetPathTo("gameplay comment danger") ); - m_announcerGood.Load( ANNOUNCER->GetPathTo("gameplay comment good") ); - m_announcerHot.Load( ANNOUNCER->GetPathTo("gameplay comment hot") ); - m_announcerOni.Load( ANNOUNCER->GetPathTo("gameplay comment oni") ); + m_announcerHereWeGo.Load( ANNOUNCER->GetPathTo("ScreenGameplay here we go normal") ); + m_announcerDanger.Load( ANNOUNCER->GetPathTo("ScreenGameplay comment danger") ); + m_announcerGood.Load( ANNOUNCER->GetPathTo("ScreenGameplay comment good") ); + m_announcerHot.Load( ANNOUNCER->GetPathTo("ScreenGameplay comment hot") ); + m_announcerOni.Load( ANNOUNCER->GetPathTo("ScreenGameplay comment oni") ); - m_announcer100Combo.Load( ANNOUNCER->GetPathTo("gameplay 100 combo") ); - m_announcer200Combo.Load( ANNOUNCER->GetPathTo("gameplay 200 combo") ); - m_announcer300Combo.Load( ANNOUNCER->GetPathTo("gameplay 300 combo") ); - m_announcer400Combo.Load( ANNOUNCER->GetPathTo("gameplay 400 combo") ); - m_announcer500Combo.Load( ANNOUNCER->GetPathTo("gameplay 500 combo") ); - m_announcer600Combo.Load( ANNOUNCER->GetPathTo("gameplay 600 combo") ); - m_announcer700Combo.Load( ANNOUNCER->GetPathTo("gameplay 700 combo") ); - m_announcer800Combo.Load( ANNOUNCER->GetPathTo("gameplay 800 combo") ); - m_announcer900Combo.Load( ANNOUNCER->GetPathTo("gameplay 900 combo") ); - m_announcer1000Combo.Load( ANNOUNCER->GetPathTo("gameplay 1000 combo") ); - m_announcerComboStopped.Load( ANNOUNCER->GetPathTo("gameplay combo stopped") ); + m_announcer100Combo.Load( ANNOUNCER->GetPathTo("ScreenGameplay 100 combo") ); + m_announcer200Combo.Load( ANNOUNCER->GetPathTo("ScreenGameplay 200 combo") ); + m_announcer300Combo.Load( ANNOUNCER->GetPathTo("ScreenGameplay 300 combo") ); + m_announcer400Combo.Load( ANNOUNCER->GetPathTo("ScreenGameplay 400 combo") ); + m_announcer500Combo.Load( ANNOUNCER->GetPathTo("ScreenGameplay 500 combo") ); + m_announcer600Combo.Load( ANNOUNCER->GetPathTo("ScreenGameplay 600 combo") ); + m_announcer700Combo.Load( ANNOUNCER->GetPathTo("ScreenGameplay 700 combo") ); + m_announcer800Combo.Load( ANNOUNCER->GetPathTo("ScreenGameplay 800 combo") ); + m_announcer900Combo.Load( ANNOUNCER->GetPathTo("ScreenGameplay 900 combo") ); + m_announcer1000Combo.Load( ANNOUNCER->GetPathTo("ScreenGameplay 1000 combo") ); + m_announcerComboStopped.Load( ANNOUNCER->GetPathTo("ScreenGameplay combo stopped") ); + m_soundAssistTick.Load( THEME->GetPathTo("Sounds","ScreenGameplay assist tick") ); + m_soundToasty.Load( THEME->GetPathTo("Sounds","ScreenGameplay toasty") ); + } + + // + // Get the transitions rolling + // + if( bDemonstration ) + { + StartPlayingSong( 0, 0 ); // *kick* (no transitions) } else { - StartPlayingSong( 0, 0 ); + float fMinTimeToMusic = m_In.GetLengthSeconds(); // start of m_Ready + float fMinTimeToNotes = fMinTimeToMusic + m_Ready.GetLengthSeconds() + m_Go.GetLengthSeconds()+2; // end of Go + + /* + * Tell the music to start, but don't actually make any noise for + * at least 2.5 (or 1.5) seconds. (This is so we scroll on screen smoothly.) + * + * This is only a minimum: the music might be started later, to meet + * the minimum-time-to-notes value. If you're writing song data, + * and you want to make sure we get ideal timing here, make sure there's + * a bit of space at the beginning of the music with no steps. + */ + + /*float delay =*/ StartPlayingSong( fMinTimeToNotes, fMinTimeToMusic ); + + m_In.StartTransitioning( SM_PlayReady ); } - m_Inventory.RefreshPossibleItems(); - this->AddChild( &m_Inventory ); - - m_iRowLastCrossed = -1; - - m_soundAssistTick.Load( THEME->GetPathTo("Sounds","gameplay assist tick") ); } ScreenGameplay::~ScreenGameplay() @@ -729,7 +736,7 @@ bool ScreenGameplay::IsTimeToPlayTicks() const // will start coming out the speaker. Compensate for this by boosting // fPositionSeconds ahead float fPositionSeconds = GAMESTATE->m_fMusicSeconds; - fPositionSeconds += (SOUNDMAN->GetPlayLatency()+g_fTickEarlySecondsCache) * m_soundMusic.GetPlaybackRate(); + fPositionSeconds += (SOUNDMAN->GetPlayLatency()+(float)G_TICK_EARLY_SECONDS) * m_soundMusic.GetPlaybackRate(); float fSongBeat = GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ); int iRowNow = BeatToNoteRowNotRounded( fSongBeat ); @@ -869,7 +876,7 @@ void ScreenGameplay::Update( float fDeltaTime ) } // - // Check to see if it's time to play a gameplay comment + // Check to see if it's time to play a ScreenGameplay comment // m_fTimeLeftBeforeDancingComment -= fDeltaTime; if( m_fTimeLeftBeforeDancingComment <= 0 ) @@ -936,7 +943,7 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ if( MenuI.IsValid() && MenuI.button == MENU_BUTTON_BACK && m_DancingState != STATE_OUTRO && - !m_Fade.IsClosing() ) + !m_Back.IsTransitioning() ) { if( PREFSMAN->m_bDelayedEscape && type==IET_FIRST_PRESS) { @@ -961,7 +968,7 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ (DeviceI.device!=DEVICE_KEYBOARD && type==IET_FAST_REPEAT) ) { m_DancingState = STATE_OUTRO; - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","menu back") ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","Common back") ); /* Hmm. There are a bunch of subtly different ways we can * tween out: * 1. Keep rendering the song, and keep it moving. This might @@ -976,7 +983,7 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ m_soundMusic.StopPlaying(); this->ClearMessageQueue(); - m_Fade.CloseWipingLeft( SM_SaveChangedBeforeGoingBack ); + m_Back.StartTransitioning( SM_SaveChangedBeforeGoingBack ); return; } } @@ -992,7 +999,7 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ case SDLK_F6: m_bChangedOffsetOrBPM = true; GAMESTATE->m_SongOptions.m_bAutoSync = !GAMESTATE->m_SongOptions.m_bAutoSync; // toggle - PositionStatusIcons(); + UpdateOptionsText(); break; case SDLK_F7: if( GAMESTATE->m_SongOptions.m_AssistType == SongOptions::ASSIST_NONE ) @@ -1009,7 +1016,7 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ break; case SDLK_F8: PREFSMAN->m_bAutoPlay = !PREFSMAN->m_bAutoPlay; - PositionStatusIcons(); + UpdateOptionsText(); break; case SDLK_F9: case SDLK_F10: @@ -1094,35 +1101,17 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ } } -void ScreenGameplay::PositionStatusIcons() +void ScreenGameplay::UpdateOptionsText() { - bool status[NUM_STATUS_ICONS] = { - PREFSMAN->m_bAutoPlay, - GAMESTATE->m_SongOptions.m_bAutoSync - }; + CString sText; - vector vActorsToShow; + if( PREFSMAN->m_bAutoPlay ) + sText += "AutoPlay "; + if( GAMESTATE->m_SongOptions.m_bAutoSync ) + sText += "AutoSync "; - for( int i=0; iSetY( STATUS_ICONS_Y ); - if( vActorsToShow.size()-1 == 0 ) - vActorsToShow[a]->SetX( center_x ); - else - vActorsToShow[a]->SetX( SCALE(a, 0.0f, vActorsToShow.size()-1, left_most_x, right_most_x) ); - } + if( sText.length() > 0 ) + sText.resize( sText.length()-5 ); } void SaveChanges() @@ -1213,93 +1202,18 @@ void ShowSavePrompt( ScreenMessage SM_SendWhenDone ) void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) { - int p; switch( SM ) { - // received while STATE_INTRO - case SM_User+0: - { - m_StarWipe.OpenWipingRight(SM_None); - - /* It may just be me, but having Here We Go start so late into the song - * ruins the rhythm of the announcer. MAX/EX starts Here We Go - * a fixed amount of time after Are You Ready. However, 1-5th - * start HWG a certain amount of time before the notes. - * We may want to metric this, but for now, leave it like MAX/EX. -Chris */ - - /* - * Don't actually reach any notes for at least 5.5 seconds. - * "Here We Go" takes about two seconds, we want a half second or so of - * a clear view, so we don't want any notes for 2.5 seconds, plus three - * seconds until we actually begin the HWG. - */ - const float MinTimeToNotes = 5.5f; - - /* - * Tell the music to start, but don't actually make any noise for - * at least 2.5 (or 1.5) seconds. (This is so we scroll on screen smoothly.) - * - * Use 1.5 seconds to (try to) start when "Ready" is fading in; - * 2.5 for when it's fading out. - * - * The last set of timings was aiming for 1. fade in "Ready", 2. fade - * out "Ready", 3. music starts, 4. fade in "HWG"; the current timing - * is 1. fade in "Ready" and start music, 2. fade out "Ready", 3. fade - * in "HWG". - * - * This is only a minimum: the music might be started later, to meet - * the minimum-time-to-notes value. If you're writing song data, - * and you want to make sure we get ideal timing here, make sure there's - * a bit of space at the beginning of the music with no steps. */ - const float MinTimeToMusic = 1.5f; - - float delay = StartPlayingSong( MinTimeToNotes, MinTimeToMusic ); - - /* Start the Here We Go sequence 2.5 seconds before notes, so we - * have time to fade in and fade out. */ - this->SendScreenMessage( SM_StartHereWeGo, 3.0f ); - // use this for HWG right as the notes are starting - // this->SendScreenMessage( SM_StartHereWeGo, delay - 3.0f ); - delay; /* hush compiler */ - } - break; - case SM_User+1: - break; - case SM_User+2: - m_sprReady.StartFocusing(); - m_announcerReady.PlayRandom(); - break; - case SM_User+3: - break; - case SM_User+4: - m_sprReady.StartBlurring(); - break; - case SM_User+5: + case SM_PlayReady: m_Background.FadeIn(); - break; - case SM_User+6: - break; - case SM_User+7: - break; - case SM_User+8: - break; - case SM_User+9: + m_announcerReady.PlayRandom(); + m_Ready.StartTransitioning( SM_PlayGo ); break; - case SM_StartHereWeGo: - /* We have 2.5 seconds until the notes start. */ - m_sprHereWeGo.StartFocusing(); + case SM_PlayGo: m_announcerHereWeGo.PlayRandom(); + m_Go.StartTransitioning( SM_None ); GAMESTATE->m_bPastHereWeGo = true; - - /* This gives the HWG about a second of screen time. */ - this->SendScreenMessage( SM_StopHereWeGo, 1.5f ); - break; - - case SM_StopHereWeGo: - /* We have one second until the notes start. */ - m_sprHereWeGo.StartBlurring(); - m_DancingState = STATE_DANCING; // STATE CHANGE! Now the user is allowed to press Back break; @@ -1341,25 +1255,29 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) } else // IsLastSong { - if( m_DancingState == STATE_OUTRO ) // gameplay already ended + if( m_DancingState == STATE_OUTRO ) // ScreenGameplay already ended return; // ignore m_DancingState = STATE_OUTRO; if( GAMESTATE->m_SongOptions.m_FailType == SongOptions::FAIL_END_OF_SONG && AllFailedEarlier() ) { this->SendScreenMessage( SM_BeginFailed, 0 ); - return; } - - m_StarWipe.CloseWipingRight( SM_None ); - - // do they deserve an extra stage? - if( GAMESTATE->HasEarnedExtraStage() ) - this->SendScreenMessage( SM_ShowTryExtraStage, 1 ); - else + else // ! failed { - this->SendScreenMessage( SM_ShowCleared, 1 ); - SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("gameplay cleared") ); + // do they deserve an extra stage? + if( GAMESTATE->HasEarnedExtraStage() ) + { + m_Extra.StartTransitioning( SM_GoToStateAfterCleared ); + SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("gameplay extra") ); +// this->SendScreenMessage( SM_ShowTryExtraStage, 1 ); + } + else + { + m_Cleared.StartTransitioning( SM_GoToStateAfterCleared ); + SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("gameplay cleared") ); +// this->SendScreenMessage( SM_ShowCleared, 1 ); + } } } } @@ -1377,20 +1295,8 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) case SM_BeginToasty: if( PREFSMAN->m_bEasterEggs ) { + m_Toasty.StartTransitioning(); m_soundToasty.Play(); - - // set off screen - m_sprToasty.StopTweening(); - m_sprToasty.SetDiffuse( RageColor(1,1,1,1) ); - m_sprToasty.SetX( SCREEN_RIGHT+m_sprToasty.GetUnzoomedWidth()/2 ); - m_sprToasty.SetY( SCREEN_BOTTOM-m_sprToasty.GetUnzoomedHeight()/2 ); - m_sprToasty.BeginTweening( 0.2f, Actor::TWEEN_ACCELERATE ); // slide on - m_sprToasty.SetTweenX( SCREEN_RIGHT-m_sprToasty.GetUnzoomedWidth()/2 ); - m_sprToasty.BeginTweening( 0.6f ); // sleep - m_sprToasty.BeginTweening( 0.3f, Actor::TWEEN_DECELERATE ); // slide off - m_sprToasty.SetTweenX( SCREEN_RIGHT+m_sprToasty.GetUnzoomedWidth()/2 ); - m_sprToasty.BeginTweening( 0.001f ); // fade out - m_sprToasty.SetDiffuse( RageColor(1,1,1,0) ); } break; @@ -1471,9 +1377,9 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS; } break; + - - // received while STATE_OUTRO +/* // received while STATE_OUTRO case SM_ShowCleared: m_sprCleared.BeginTweening(1.0f); m_sprCleared.SetTweenDiffuse( RageColor(1,1,1,1) ); @@ -1482,8 +1388,8 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) m_sprCleared.SetTweenDiffuse( RageColor(1,1,1,0) ); SCREENMAN->SendMessageToTopScreen( SM_GoToStateAfterCleared, 4 ); break; - - case SM_ShowTryExtraStage: +*/ +/* case SM_ShowTryExtraStage: { m_soundTryExtraStage.PlayRandom(); @@ -1513,7 +1419,7 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) SCREENMAN->SendMessageToTopScreen( SM_GoToStateAfterCleared, 5 ); } break; - +*/ case SM_SaveChangedBeforeGoingBack: if( m_bChangedOffsetOrBPM ) { @@ -1522,8 +1428,8 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) } else this->SendScreenMessage( SM_GoToScreenAfterBack, 0 ); - break; + case SM_GoToScreenAfterBack: /* Reset options. (Should this be done in ScreenSelect*?) */ GAMESTATE->RestoreSelectedOptions(); @@ -1540,9 +1446,11 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) case PLAY_MODE_ENDLESS: SCREENMAN->SetNewScreen( "ScreenSelectCourse" ); break; - default: ASSERT(0); + default: + ASSERT(0); } break; + case SM_GoToStateAfterCleared: /* Reset options. (Should this be done in ScreenSelect*?) */ GAMESTATE->RestoreSelectedOptions(); @@ -1556,25 +1464,20 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) SCREENMAN->SetNewScreen( "ScreenEvaluation" ); break; - case SM_BeginFailed: m_DancingState = STATE_OUTRO; m_soundMusic.StopPlaying(); - m_StarWipe.SetTransitionTime( 1.5f ); - m_StarWipe.CloseWipingRight( SM_None ); - for( p=0; pIsPlayerEnabled(p) ) - m_Player[p].FadeToFail(); - - this->SendScreenMessage( SM_ShowFailed, 0.2f ); - break; - case SM_ShowFailed: +// m_Failed.StartTransitioning( SM_ShowFailed ); +// this->SendScreenMessage( SM_GoToScreenAfterFail, 0.2f ); +// SCREENMAN->SendMessageToTopScreen( SM_PlayFailComment, 1.0f ); + m_Failed.StartTransitioning( SM_GoToScreenAfterFail ); m_soundFail.PlayRandom(); - // make the background invisible so we don't waste mem bandwidth drawing it + // make the background invisible so we don't waste power drawing it m_Background.BeginTweening( 1 ); m_Background.SetTweenDiffuse( RageColor(1,1,1,0) ); + /* m_sprFailed.SetZoom( 4 ); m_sprFailed.BeginBlurredTweening( 0.8f, TWEEN_DECELERATE ); m_sprFailed.SetTweenZoom( 0.5f ); // zoom out @@ -1588,7 +1491,7 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) m_sprFailed.BeginTweening( 2 ); // sleep m_sprFailed.BeginTweening( 1 ); m_sprFailed.SetTweenDiffuse( RageColor(1,1,1,0) ); - +*/ // show the survive time if extra stage if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) { @@ -1606,13 +1509,15 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) m_textSurviveTime.SetTweenDiffuse( RageColor(1,1,1,0) ); } - SCREENMAN->SendMessageToTopScreen( SM_PlayFailComment, 1.0f ); - SCREENMAN->SendMessageToTopScreen( SM_GoToScreenAfterFail, 5.0f ); - break; - case SM_PlayFailComment: - SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("gameplay failed") ); + SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("ScreenGameplay failed") ); + +// SCREENMAN->SendMessageToTopScreen( SM_GoToScreenAfterFail, 5.0f ); break; +/* case SM_PlayFailComment: + SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("ScreenGameplay failed") ); + break; +*/ case SM_GoToScreenAfterFail: /* Reset options. (Should this be done in ScreenSelect*?) */ GAMESTATE->RestoreSelectedOptions(); diff --git a/stepmania/src/ScreenGameplay.h b/stepmania/src/ScreenGameplay.h index c5694e8fa7..0f5205acb5 100644 --- a/stepmania/src/ScreenGameplay.h +++ b/stepmania/src/ScreenGameplay.h @@ -13,9 +13,7 @@ #include "Screen.h" #include "Sprite.h" -#include "TransitionFade.h" -#include "TransitionStarWipe.h" -#include "TransitionFadeWipe.h" +#include "TransitionBGAnimation.h" #include "TransitionOniFade.h" #include "BitmapText.h" #include "Player.h" @@ -105,7 +103,6 @@ protected: BitmapText m_textStageNumber; BitmapText m_textCourseSongNumber[NUM_PLAYERS]; - Sprite m_sprMiddleFrame; BPMDisplay m_BPMDisplay; Sprite m_sprScoreFrame; @@ -116,20 +113,19 @@ protected: BitmapText m_textDebug; BitmapText m_textLyrics; -#define NUM_STATUS_ICONS 2 - Sprite m_sprStatusIcons[NUM_STATUS_ICONS]; // shows whether these options are on. - void PositionStatusIcons(); // reposition the three above when the value of one changes + BitmapText m_textOptions; // for AutoPlay, AutoAdjust + void UpdateOptionsText(); BitmapText m_MaxCombo; - TransitionFadeWipe m_Fade; - TransitionStarWipe m_StarWipe; - - FocusingSprite m_sprReady; - FocusingSprite m_sprHereWeGo; - MotionBlurSprite m_sprCleared; - MotionBlurSprite m_sprFailed; - MotionBlurSprite m_sprTryExtraStage; + TransitionBGAnimation m_Ready; + TransitionBGAnimation m_Go; + TransitionBGAnimation m_Cleared; + TransitionBGAnimation m_Failed; + TransitionBGAnimation m_Extra; + TransitionBGAnimation m_Toasty; // easter egg + TransitionBGAnimation m_Back; + TransitionBGAnimation m_In; BitmapText m_textSurviveTime; // only shown in extra stage BitmapText m_StageName; @@ -147,8 +143,6 @@ protected: Sprite m_sprOniGameOver[NUM_PLAYERS]; void ShowOniGameOver( PlayerNumber pn ); - Sprite m_sprToasty; // easter egg - RandomSample m_soundFail; RandomSample m_soundOniDie; RandomSample m_soundTryExtraStage; diff --git a/stepmania/src/ScreenGameplayOptions.cpp b/stepmania/src/ScreenGameplayOptions.cpp index a49425a770..c807db6a9d 100644 --- a/stepmania/src/ScreenGameplayOptions.cpp +++ b/stepmania/src/ScreenGameplayOptions.cpp @@ -50,11 +50,7 @@ OptionRowData g_GameplayOptionsLines[NUM_GAMEPLAY_OPTIONS_LINES] = { }; ScreenGameplayOptions::ScreenGameplayOptions() : - ScreenOptions( - THEME->GetPathTo("BGAnimations","gameplay options"), - THEME->GetPathTo("Graphics","gameplay options page"), - THEME->GetPathTo("Graphics","gameplay options top edge") - ) + ScreenOptions("ScreenGameplayOptions",false) { LOG->Trace( "ScreenGameplayOptions::ScreenGameplayOptions()" ); @@ -72,9 +68,9 @@ ScreenGameplayOptions::ScreenGameplayOptions() : g_GameplayOptionsLines, NUM_GAMEPLAY_OPTIONS_LINES, false ); - m_Menu.StopTimer(); + m_Menu.m_MenuTimer.StopTimer(); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","machine options music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenMachineOptions music") ); } void ScreenGameplayOptions::ImportOptions() diff --git a/stepmania/src/ScreenGraphicOptions.cpp b/stepmania/src/ScreenGraphicOptions.cpp index 398a0640d9..886e387d5e 100644 --- a/stepmania/src/ScreenGraphicOptions.cpp +++ b/stepmania/src/ScreenGraphicOptions.cpp @@ -58,11 +58,7 @@ static const int TextureRes[] = { }; ScreenGraphicOptions::ScreenGraphicOptions() : - ScreenOptions( - THEME->GetPathTo("BGAnimations","graphic options"), - THEME->GetPathTo("Graphics","graphic options page"), - THEME->GetPathTo("Graphics","graphic options top edge") - ) + ScreenOptions("ScreenGraphicOptions",false) { LOG->Trace( "ScreenGraphicOptions::ScreenGraphicOptions()" ); @@ -80,9 +76,9 @@ ScreenGraphicOptions::ScreenGraphicOptions() : g_GraphicOptionsLines, NUM_GRAPHIC_OPTIONS_LINES, false ); - m_Menu.StopTimer(); + m_Menu.m_MenuTimer.StopTimer(); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","graphic options music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenGraphicOptions music") ); } void ScreenGraphicOptions::ImportOptions() diff --git a/stepmania/src/ScreenHowToPlay.h b/stepmania/src/ScreenHowToPlay.h index 3bd5f636d3..de189dfec2 100644 --- a/stepmania/src/ScreenHowToPlay.h +++ b/stepmania/src/ScreenHowToPlay.h @@ -15,7 +15,7 @@ class ScreenHowToPlay : public ScreenAttract { public: - ScreenHowToPlay() : ScreenAttract("ScreenHowToPlay","how to play") {}; + ScreenHowToPlay() : ScreenAttract("ScreenHowToPlay") {}; }; diff --git a/stepmania/src/ScreenInputOptions.cpp b/stepmania/src/ScreenInputOptions.cpp index 33ce40b333..f0a7e8e40d 100644 --- a/stepmania/src/ScreenInputOptions.cpp +++ b/stepmania/src/ScreenInputOptions.cpp @@ -45,11 +45,7 @@ OptionRowData g_InputOptionsLines[NUM_INPUT_OPTIONS_LINES] = { }; ScreenInputOptions::ScreenInputOptions() : - ScreenOptions( - THEME->GetPathTo("BGAnimations","input options"), - THEME->GetPathTo("Graphics","input options page"), - THEME->GetPathTo("Graphics","input options top edge") - ) + ScreenOptions("ScreenInputOptions",false) { LOG->Trace( "ScreenInputOptions::ScreenInputOptions()" ); @@ -67,9 +63,9 @@ ScreenInputOptions::ScreenInputOptions() : g_InputOptionsLines, NUM_INPUT_OPTIONS_LINES, false ); - m_Menu.StopTimer(); + m_Menu.m_MenuTimer.StopTimer(); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","input options music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenInputOptions music") ); } void ScreenInputOptions::ImportOptions() diff --git a/stepmania/src/ScreenInstructions.cpp b/stepmania/src/ScreenInstructions.cpp index a25178e34d..a9b92fbfad 100644 --- a/stepmania/src/ScreenInstructions.cpp +++ b/stepmania/src/ScreenInstructions.cpp @@ -33,25 +33,14 @@ ScreenInstructions::ScreenInstructions() { LOG->Trace( "ScreenInstructions::ScreenInstructions()" ); - - m_Menu.Load( - THEME->GetPathTo("BGAnimations","Instructions"), - THEME->GetPathTo("Graphics","Instructions Top Edge"), - HELP_TEXT, false, true, TIMER_SECONDS - ); - this->AddChild( &m_Menu ); - - - if(!PREFSMAN->m_bInstructions) - { - this->SendScreenMessage( SM_GoToNextScreen, 0 ); - m_Menu.ImmedOffScreenToMenu(); - return; - } - // // Skip this screen unless someone chose easy or beginner // + if( !PREFSMAN->m_bInstructions ) + { + HandleScreenMessage( SM_GoToNextScreen ); + return; + } if( GAMESTATE->m_PlayMode == PLAY_MODE_ARCADE ) { Difficulty easiestDifficulty = (Difficulty)(NUM_DIFFICULTIES-1); @@ -63,37 +52,19 @@ ScreenInstructions::ScreenInstructions() } if( easiestDifficulty > DIFFICULTY_EASY ) { - // skip this screen - this->SendScreenMessage( SM_GoToNextScreen, 0 ); - m_Menu.ImmedOffScreenToMenu(); + HandleScreenMessage( SM_GoToNextScreen ); return; } } - - m_Menu.TweenOnScreenFromMenu( SM_None, true ); + m_Menu.Load("ScreenInstructions"); + this->AddChild( &m_Menu ); CString sHowToPlayPath; - switch( GAMESTATE->m_PlayMode ) - { - case PLAY_MODE_ARCADE: - sHowToPlayPath = THEME->GetPathTo("Graphics","instructions arcade"); - break; - case PLAY_MODE_NONSTOP: - sHowToPlayPath = THEME->GetPathTo("Graphics","instructions nonstop"); - break; - case PLAY_MODE_ONI: - sHowToPlayPath = THEME->GetPathTo("Graphics","instructions oni"); - break; - case PLAY_MODE_ENDLESS: - sHowToPlayPath = THEME->GetPathTo("Graphics","instructions endless"); - break; - case PLAY_MODE_BATTLE: - sHowToPlayPath = THEME->GetPathTo("Graphics","instructions battle"); - break; - default: - ASSERT(0); - } + if( GAMESTATE->m_PlayMode != PLAY_MODE_INVALID ) + sHowToPlayPath = THEME->GetPathTo("Graphics","ScreenInstructions "+PlayModeToString(GAMESTATE->m_PlayMode)) ; + else + RageException::Throw( "The PlayMode has not been set. A theme must set the PlayMode before showing ScreenInstructions." ); m_sprHowToPlay.Load( sHowToPlayPath ); m_sprHowToPlay.SetXY( CENTER_X, CENTER_Y ); @@ -104,7 +75,7 @@ ScreenInstructions::ScreenInstructions() m_sprHowToPlay.BeginTweening( 0.6f, Actor::TWEEN_ACCELERATE ); m_sprHowToPlay.SetTweenX( CENTER_X ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","instructions music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenInstructions music") ); } ScreenInstructions::~ScreenInstructions() @@ -122,13 +93,13 @@ void ScreenInstructions::Update( float fDeltaTime ) void ScreenInstructions::DrawPrimitives() { m_Menu.DrawBottomLayer(); + Screen::DrawPrimitives(); m_Menu.DrawTopLayer(); - Screen::DrawPrimitives(); // draw instructions graphic on top of all the others! } void ScreenInstructions::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ) { - if( m_Menu.IsClosing() ) + if( m_Menu.IsTransitioning() ) return; // default input handler @@ -168,12 +139,12 @@ void ScreenInstructions::HandleScreenMessage( const ScreenMessage SM ) void ScreenInstructions::MenuBack( PlayerNumber pn ) { - m_Menu.TweenOffScreenToBlack( SM_GoToPrevScreen, true ); + m_Menu.Back( SM_GoToPrevScreen ); } void ScreenInstructions::MenuStart( PlayerNumber pn ) { - m_Menu.TweenOffScreenToMenu( SM_GoToNextScreen ); + m_Menu.StartTransitioning( SM_GoToNextScreen ); m_sprHowToPlay.StopTweening(); m_sprHowToPlay.BeginTweening( 0.3f, Actor::TWEEN_DECELERATE ); diff --git a/stepmania/src/ScreenIntroMovie.h b/stepmania/src/ScreenIntroMovie.h index d4dcceee25..09307978ba 100644 --- a/stepmania/src/ScreenIntroMovie.h +++ b/stepmania/src/ScreenIntroMovie.h @@ -16,7 +16,7 @@ class ScreenIntroMovie : public ScreenAttract { public: - ScreenIntroMovie() : ScreenAttract("ScreenIntroMovie","intro movie") { }; + ScreenIntroMovie() : ScreenAttract("ScreenIntroMovie") { }; void Update( float fDelta ); }; diff --git a/stepmania/src/ScreenJukebox.cpp b/stepmania/src/ScreenJukebox.cpp index d6fccfdb6d..d11c1dcce5 100644 --- a/stepmania/src/ScreenJukebox.cpp +++ b/stepmania/src/ScreenJukebox.cpp @@ -113,12 +113,12 @@ bool PrepareForJukebox() // always return true. GAMESTATE->m_SongOptions.m_LifeType = (randomf(0,1)>0.8f) ? SongOptions::LIFE_BATTERY : SongOptions::LIFE_BAR; GAMESTATE->m_SongOptions.m_FailType = SongOptions::FAIL_OFF; - GAMESTATE->m_bDemonstration = true; + GAMESTATE->m_bDemonstrationOrJukebox = true; return true; } -ScreenJukebox::ScreenJukebox() : ScreenGameplay(PrepareForJukebox()) // this is a hack to get some code to execute before the ScreenGameplay constructor +ScreenJukebox::ScreenJukebox( bool bDemonstration ) : ScreenGameplay( PrepareForJukebox() ) // this is a hack to get some code to execute before the ScreenGameplay constructor { LOG->Trace( "ScreenJukebox::ScreenJukebox()" ); @@ -128,13 +128,17 @@ ScreenJukebox::ScreenJukebox() : ScreenGameplay(PrepareForJukebox()) // this is return; } - m_Fade.OpenWipingRight(); + m_In.Load( THEME->GetPathTo("BGAnimations","ScreenDemonstration in") ); + this->AddChild( &m_In ); + m_In.StartTransitioning(); + + m_Out.Load( THEME->GetPathTo("BGAnimations","ScreenDemonstration out") ); + this->AddChild( &m_Out ); ClearMessageQueue(); // remove all of the messages set in ScreenGameplay that animate "ready", "here we go", etc. GAMESTATE->m_bPastHereWeGo = true; - m_StarWipe.SetOpened(); m_DancingState = STATE_DANCING; } @@ -147,10 +151,6 @@ ScreenJukebox::~ScreenJukebox() void ScreenJukebox::Update( float fDeltaTime ) { ScreenGameplay::Update( fDeltaTime ); - - // hide status icons - for( int i=0; iAddChild( &m_Selector ); - m_Menu.Load( - THEME->GetPathTo("BGAnimations","jukebox menu"), - THEME->GetPathTo("Graphics","jukebox menu top edge"), - HELP_TEXT, false, false, 99 - ); + m_Menu.Load( "ScreenJukeboxMenu" ); this->AddChild( &m_Menu ); @@ -56,14 +52,7 @@ ScreenJukeboxMenu::ScreenJukeboxMenu() m_textExplanation.SetZoom( 0.7f ); this->AddChild( &m_textExplanation ); - m_Fade.SetOpened(); - this->AddChild( &m_Fade); - - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","jukebox menu music") ); - - m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); - - m_Menu.TweenOnScreenFromBlack( SM_None ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenJukeboxMenu music") ); } @@ -121,7 +110,7 @@ void ScreenJukeboxMenu::MenuRight( PlayerNumber pn, const InputEventType type ) void ScreenJukeboxMenu::MenuStart( PlayerNumber pn ) { - if( m_Fade.IsClosing() || m_Fade.IsClosed() ) + if( m_Menu.IsTransitioning() ) return; Style style = m_Selector.GetSelectedStyle(); @@ -137,16 +126,13 @@ void ScreenJukeboxMenu::MenuStart( PlayerNumber pn ) SOUNDMAN->StopMusic(); - m_soundSelect.PlayRandom(); - m_Menu.TweenOffScreenToBlack( SM_GoToNextScreen, false ); - m_Fade.CloseWipingRight( SM_None ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","Common start") ); + m_Menu.StartTransitioning( SM_GoToNextScreen ); } void ScreenJukeboxMenu::MenuBack( PlayerNumber pn ) { - m_Menu.TweenOffScreenToBlack( SM_None, true ); + m_Menu.StartTransitioning( SM_GoToPrevScreen ); SOUNDMAN->StopMusic(); - - m_Fade.CloseWipingLeft( SM_GoToPrevScreen ); } diff --git a/stepmania/src/ScreenJukeboxMenu.h b/stepmania/src/ScreenJukeboxMenu.h index 94d91f7d4a..ee534d5a32 100644 --- a/stepmania/src/ScreenJukeboxMenu.h +++ b/stepmania/src/ScreenJukeboxMenu.h @@ -36,16 +36,11 @@ private: void MenuBack( PlayerNumber pn ); void MenuStart( PlayerNumber pn ); - JukeboxMenu m_Selector; + JukeboxMenu m_Selector; BitmapText m_textExplanation; - MenuElements m_Menu; - - TransitionFade m_Fade; - - RandomSample m_soundSelect; - RandomSample m_soundCreate; + MenuElements m_Menu; }; diff --git a/stepmania/src/ScreenLogo.cpp b/stepmania/src/ScreenLogo.cpp index 897c26ee56..5f101f11e3 100644 --- a/stepmania/src/ScreenLogo.cpp +++ b/stepmania/src/ScreenLogo.cpp @@ -17,44 +17,28 @@ #include "RageLog.h" #include "SongManager.h" -#define LOGO_X THEME->GetMetricF("ScreenLogo","LogoX") -#define LOGO_Y THEME->GetMetricF("ScreenLogo","LogoY") -#define VERSION_X THEME->GetMetricF("ScreenLogo","VersionX") -#define VERSION_Y THEME->GetMetricF("ScreenLogo","VersionY") -#define SONGS_X THEME->GetMetricF("ScreenLogo","SongsX") -#define SONGS_Y THEME->GetMetricF("ScreenLogo","SongsY") +#define LOGO_ON_COMMAND THEME->GetMetric("ScreenLogo","LogoOnCommand") +#define VERSION_ON_COMMAND THEME->GetMetric("ScreenLogo","VersionOnCommand") +#define SONGS_ON_COMMAND THEME->GetMetric("ScreenLogo","SongsOnCommand") -ScreenLogo::ScreenLogo() : ScreenAttract("ScreenLogo","logo") +ScreenLogo::ScreenLogo() : ScreenAttract("ScreenLogo") { - m_sprLogo.Load( THEME->GetPathTo("Graphics",ssprintf("logo %s",GAMESTATE->GetCurrentGameDef()->m_szName)) ); - m_sprLogo.SetXY( LOGO_X, LOGO_Y ); - m_sprLogo.SetGlow( RageColor(1,1,1,1) ); - m_sprLogo.SetZoomY( 0 ); - m_sprLogo.StopTweening(); - m_sprLogo.BeginTweening( 0.5f ); // sleep - m_sprLogo.BeginTweening( 0.5f, Actor::TWEEN_BOUNCE_END ); - m_sprLogo.SetEffectGlowShift(2.5f, RageColor(1,1,1,0.1f), RageColor(1,1,1,0.3f) ); - m_sprLogo.SetTweenZoom( 1 ); + m_sprLogo.Load( THEME->GetPathTo("Graphics",ssprintf("ScreenLogo %s",GAMESTATE->GetCurrentGameDef()->m_szName)) ); + m_sprLogo.Command( LOGO_ON_COMMAND ); this->AddChild( &m_sprLogo ); m_textVersion.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textVersion.SetText( "CVS" ); - m_textVersion.SetDiffuse( RageColor(0.6f,0.6f,0.6f,1) ); // light gray - m_textVersion.SetXY( VERSION_X, VERSION_Y ); - m_textVersion.SetZoom( 0.5f ); - m_textVersion.SetShadowLength( 2 ); + m_textVersion.Command( VERSION_ON_COMMAND ); this->AddChild( &m_textVersion ); m_textSongs.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); - m_textSongs.SetHorizAlign( Actor::align_left ); m_textSongs.SetText( ssprintf("%d songs in %d groups, %d courses", SONGMAN->GetNumSongs(), SONGMAN->GetNumGroups(), SONGMAN->GetNumCourses()) ); - m_textSongs.SetDiffuse( RageColor(0.6f,0.6f,0.6f,1) ); // light gray - m_textSongs.SetXY( SONGS_X, SONGS_Y ); - m_textSongs.SetZoom( 0.5f ); - m_textSongs.SetShadowLength( 2 ); + m_textSongs.Command( SONGS_ON_COMMAND ); this->AddChild( &m_textSongs ); - this->MoveToTail( &(ScreenAttract::m_Fade) ); // put it in the back so it covers up the stuff we just added + this->MoveToTail( &m_In ); // put it in the back so it covers up the stuff we just added + this->MoveToTail( &m_Out ); // put it in the back so it covers up the stuff we just added } diff --git a/stepmania/src/ScreenMachineOptions.cpp b/stepmania/src/ScreenMachineOptions.cpp index b3bffc289f..1e7a0d25d5 100644 --- a/stepmania/src/ScreenMachineOptions.cpp +++ b/stepmania/src/ScreenMachineOptions.cpp @@ -52,11 +52,7 @@ OptionRowData g_MachineOptionsLines[NUM_MACHINE_OPTIONS_LINES] = { }; ScreenMachineOptions::ScreenMachineOptions() : - ScreenOptions( - THEME->GetPathTo("BGAnimations","machine options"), - THEME->GetPathTo("Graphics","machine options page"), - THEME->GetPathTo("Graphics","machine options top edge") - ) + ScreenOptions("ScreenMachineOptions",false) { LOG->Trace( "ScreenMachineOptions::ScreenMachineOptions()" ); @@ -74,9 +70,9 @@ ScreenMachineOptions::ScreenMachineOptions() : g_MachineOptionsLines, NUM_MACHINE_OPTIONS_LINES, false ); - m_Menu.StopTimer(); + m_Menu.m_MenuTimer.StopTimer(); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","machine options music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenMachineOptions music") ); } void ScreenMachineOptions::ImportOptions() diff --git a/stepmania/src/ScreenManager.cpp b/stepmania/src/ScreenManager.cpp index 6ca0eae32a..a2a0e27574 100644 --- a/stepmania/src/ScreenManager.cpp +++ b/stepmania/src/ScreenManager.cpp @@ -54,8 +54,8 @@ ScreenManager::ScreenManager() m_textSystemMessage.SetHorizAlign( Actor::align_left ); m_textSystemMessage.SetVertAlign( Actor::align_top ); m_textSystemMessage.SetXY( 4.0f, 4.0f ); - m_textSystemMessage.SetZoom( 0.7f ); -// m_textSystemMessage.SetShadowLength( 2 ); + m_textSystemMessage.SetZoom( 0.8f ); + m_textSystemMessage.SetShadowLength( 2 ); m_textSystemMessage.SetDiffuse( RageColor(1,1,1,0) ); m_textSysTime.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); @@ -74,7 +74,7 @@ ScreenManager::~ScreenManager() EmptyDeleteQueue(); - // delete current states + // delete current Screens for( unsigned i=0; iIsFirstUpdate() ) pScreen->Update( 0 ); @@ -143,9 +144,7 @@ void ScreenManager::Draw() for( unsigned i=0; iDraw(); - - if( m_textSystemMessage.GetDiffuse().a != 0 ) - m_textSystemMessage.Draw(); + m_textSystemMessage.Draw(); if( PREFSMAN && PREFSMAN->m_bShowStats ) { @@ -227,12 +226,23 @@ void ScreenManager::SetNewScreen( CString sClassName ) RageTimer t; + Screen* pOldTopScreen = m_ScreenStack.empty() ? NULL : m_ScreenStack.back(); + // It makes sense that ScreenManager should allocate memory for a new screen since it // deletes it later on. This also convention will reduce includes because screens won't // have to include each other's headers of other screens. Screen* pNewScreen = MakeNewScreen(sClassName); LOG->Trace( "Loaded %s in %f", sClassName.GetString(), t.GetDeltaTime()); + if( pOldTopScreen!=NULL && m_ScreenStack.back()!=pOldTopScreen ) + { + // While constructing this Screen, it's constructor called + // SetNewScreen again! That SetNewScreen Command should + // override this older one. + SAFE_DELETE( pNewScreen ); + return; + } + SetNewScreen( pNewScreen ); /* If this is a system menu, don't let the operator key touch it! @@ -242,8 +252,10 @@ void ScreenManager::SetNewScreen( CString sClassName ) sClassName == "ScreenGraphicOptions" || sClassName == "ScreenGameplayOptions" || sClassName == "ScreenMapControllers" || sClassName == "ScreenPlayerOptions" || sClassName == "ScreenAppearanceOptions" || sClassName == "ScreenEdit" || - sClassName == "ScreenEditMenu" || sClassName == "ScreenSoundOptions") GAMESTATE->m_bIsOnSystemMenu = true; - else GAMESTATE->m_bIsOnSystemMenu = false; + sClassName == "ScreenEditMenu" || sClassName == "ScreenSoundOptions") + GAMESTATE->m_bIsOnSystemMenu = true; + else + GAMESTATE->m_bIsOnSystemMenu = false; } void ScreenManager::AddNewScreenToTop( CString sClassName ) @@ -294,15 +306,15 @@ void ScreenManager::SendMessageToTopScreen( ScreenMessage SM, float fDelay ) void ScreenManager::SystemMessage( CString sMessage ) { - // Look for an open spot m_textSystemMessage.StopTweening(); m_textSystemMessage.SetText( sMessage ); m_textSystemMessage.SetDiffuse( RageColor(1,1,1,1) ); + m_textSystemMessage.SetX( -640 ); + m_textSystemMessage.BeginTweening( 0.3f ); + m_textSystemMessage.SetX( 4 ); m_textSystemMessage.BeginTweening( 5 ); - m_textSystemMessage.BeginTweening( 1 ); + m_textSystemMessage.BeginTweening( 0.3f ); m_textSystemMessage.SetTweenDiffuse( RageColor(1,1,1,0) ); - - LOG->Trace( "WARNING: Didn't find an empty system messages slot." ); } void ScreenManager::RefreshCreditsMessages() @@ -329,9 +341,9 @@ void ScreenManager::RefreshCreditsMessages() case PrefsManager::COIN_PAY: { int Coins = GAMESTATE->m_iCoins % PREFSMAN->m_iCoinsPerCredit; - CString txt = ssprintf("CREDIT(S) %d ", GAMESTATE->m_iCoins / PREFSMAN->m_iCoinsPerCredit); + CString txt = ssprintf("CREDIT(S) %d", GAMESTATE->m_iCoins / PREFSMAN->m_iCoinsPerCredit); if (Coins) - txt += ssprintf(" (%d / %d)", Coins, PREFSMAN->m_iCoinsPerCredit ); + txt += ssprintf(" %d/%d", Coins, PREFSMAN->m_iCoinsPerCredit ); m_textCreditInfo[p].SetText(txt); } break; diff --git a/stepmania/src/ScreenMapControllers.cpp b/stepmania/src/ScreenMapControllers.cpp index 8f1dc14de1..1b1bcbcd33 100644 --- a/stepmania/src/ScreenMapControllers.cpp +++ b/stepmania/src/ScreenMapControllers.cpp @@ -93,15 +93,10 @@ ScreenMapControllers::ScreenMapControllers() m_bWaitingForPress = false; - m_Menu.Load( - THEME->GetPathTo("BGAnimations","map controllers"), - THEME->GetPathTo("Graphics","map controllers top edge"), - HELP_TEXT, false, false, 99 - ); - m_Menu.TweenOnScreenFromBlack( SM_None ); + m_Menu.Load( "ScreenMapControllers", false ); // no timer this->AddChild( &m_Menu ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","map controllers music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenMapControllers music") ); Refresh(); } @@ -240,7 +235,8 @@ void ScreenMapControllers::Input( const DeviceInput& DeviceI, const InputEventTy m_iCurButton++; break; case SDLK_ESCAPE: /* Quit the screen. */ - m_Menu.TweenOffScreenToBlack( SM_GoToNextScreen, true ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","Common start") ); + m_Menu.StartTransitioning( SM_GoToNextScreen ); break; case SDLK_RETURN: /* Change the selection. */ m_bWaitingForPress = true; diff --git a/stepmania/src/ScreenMemoryCard.h b/stepmania/src/ScreenMemoryCard.h index 549e9bfecb..eb9fc1862d 100644 --- a/stepmania/src/ScreenMemoryCard.h +++ b/stepmania/src/ScreenMemoryCard.h @@ -15,7 +15,7 @@ class ScreenMemoryCard : public ScreenAttract { public: - ScreenMemoryCard() : ScreenAttract("ScreenMemoryCard","memory card") { }; + ScreenMemoryCard() : ScreenAttract("ScreenMemoryCard") { }; }; diff --git a/stepmania/src/ScreenMiniMenu.cpp b/stepmania/src/ScreenMiniMenu.cpp index 07798e89af..6974940b35 100644 --- a/stepmania/src/ScreenMiniMenu.cpp +++ b/stepmania/src/ScreenMiniMenu.cpp @@ -212,7 +212,7 @@ void ScreenMiniMenu::MenuStart( PlayerNumber pn ) { m_Fade.OpenWipingRight( SM_GoToOK ); - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","menu start") ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","Common start") ); s_iLastLine = m_iCurLine; COPY( s_iLastAnswers, m_iCurAnswers ); diff --git a/stepmania/src/ScreenMusicScroll.cpp b/stepmania/src/ScreenMusicScroll.cpp index b8e254bab1..3439985c65 100644 --- a/stepmania/src/ScreenMusicScroll.cpp +++ b/stepmania/src/ScreenMusicScroll.cpp @@ -191,7 +191,7 @@ ScreenMusicScroll::ScreenMusicScroll() SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("music scroll") ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","music scroll music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenMusicScroll music") ); m_Fade.OpenWipingRight(); } diff --git a/stepmania/src/ScreenNameEntry.cpp b/stepmania/src/ScreenNameEntry.cpp index 694a1f77fc..bcca12f5bf 100644 --- a/stepmania/src/ScreenNameEntry.cpp +++ b/stepmania/src/ScreenNameEntry.cpp @@ -127,7 +127,7 @@ ScreenNameEntry::ScreenNameEntry() GAMESTATE->m_bPastHereWeGo = true; // enable the gray arrows - m_Background.LoadFromAniDir( THEME->GetPathTo("BGAnimations","name entry") ); + m_Background.LoadFromAniDir( THEME->GetPathTo("BGAnimations","ScreenNameEntry background") ); this->AddChild( &m_Background ); for( int p=0; pAddChild( &m_Fade ); // draw and update this manually too - m_soundStep.Load( THEME->GetPathTo("Sounds","name entry step") ); + m_soundStep.Load( THEME->GetPathTo("Sounds","ScreenNameEntry step") ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","name entry music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenNameEntry music") ); m_fFakeBeat = 0; } diff --git a/stepmania/src/ScreenOptions.cpp b/stepmania/src/ScreenOptions.cpp index d0f5d78f1b..a0b88b7288 100644 --- a/stepmania/src/ScreenOptions.cpp +++ b/stepmania/src/ScreenOptions.cpp @@ -45,26 +45,22 @@ const ScreenMessage SM_PlaySample = ScreenMessage(SM_User-4); const ScreenMessage SM_TweenOffScreen = ScreenMessage(SM_User-7); -ScreenOptions::ScreenOptions( CString sBackgroundPath, CString sPagePath, CString sTopEdgePath ) +ScreenOptions::ScreenOptions( CString sClassName, bool bEnableTimer ) { LOG->Trace( "ScreenOptions::ScreenOptions()" ); - m_SoundChangeCol.Load( THEME->GetPathTo("Sounds","option change col") ); - m_SoundNextRow.Load( THEME->GetPathTo("Sounds","option next row") ); - m_SoundPrevRow.Load( THEME->GetPathTo("Sounds","option prev row") ); - m_SoundStart.Load( THEME->GetPathTo("Sounds","menu start") ); + m_SoundChangeCol.Load( THEME->GetPathTo("Sounds","ScreenOptions change") ); + m_SoundNextRow.Load( THEME->GetPathTo("Sounds","ScreenOptions next") ); + m_SoundPrevRow.Load( THEME->GetPathTo("Sounds","ScreenOptions prev") ); + m_SoundStart.Load( THEME->GetPathTo("Sounds","Common start") ); - m_Menu.Load( - sBackgroundPath, - sTopEdgePath, - HELP_TEXT, false, true, TIMER_SECONDS - ); + m_Menu.Load( sClassName, bEnableTimer, false ); // no style icon this->AddChild( &m_Menu ); // add everything to m_framePage so we can animate everything at once this->AddChild( &m_framePage ); - m_sprPage.Load( sPagePath ); + m_sprPage.Load( THEME->GetPathTo("Graphics",sClassName+" page") ); m_sprPage.SetXY( CENTER_X, CENTER_Y ); m_framePage.AddChild( &m_sprPage ); @@ -76,10 +72,6 @@ ScreenOptions::ScreenOptions( CString sBackgroundPath, CString sPagePath, CStrin m_iSelectedOption[p][l] = 0; } - m_Menu.TweenOnScreenFromBlack( SM_None ); - m_Wipe.OpenWipingRight(SM_None); - this->AddChild( &m_Wipe ); - m_framePage.SetX( SCREEN_LEFT-SCREEN_WIDTH ); m_framePage.BeginTweening( 0.3f, Actor::TWEEN_DECELERATE ); m_framePage.SetTweenX( 0 ); @@ -198,7 +190,7 @@ void ScreenOptions::InitOptionsText() Sprite &arrow = m_sprLineArrows[i]; - arrow.Load( THEME->GetPathTo("Graphics","options arrow") ); + arrow.Load( THEME->GetPathTo("Graphics","ScreenOptions bullet") ); arrow.SetXY( ARROWS_X, fY ); @@ -211,7 +203,7 @@ void ScreenOptions::InitOptionsText() option.LoadFromFont( THEME->GetPathTo("Fonts","option item") ); option.SetText( optline.szOptionsText[j] ); option.SetZoom( ITEMS_ZOOM ); - option.SetShadowLength( 2 ); + option.EnableShadow( false ); // set the XY position of each item in the line float fItemWidth = option.GetWidestLineWidthInSourcePixels() * option.GetZoomX(); @@ -415,7 +407,7 @@ void ScreenOptions::HandleScreenMessage( const ScreenMessage SM ) this->SendScreenMessage( SM_TweenOffScreen, 0 ); break; case SM_GoToPrevScreen: - this->ExportOptions(); +// this->ExportOptions(); // Don't save options if we're going back! this->GoToPrevState(); break; case SM_GoToNextScreen: @@ -423,10 +415,10 @@ void ScreenOptions::HandleScreenMessage( const ScreenMessage SM ) this->GoToNextState(); break; case SM_TweenOffScreen: - m_Menu.TweenOffScreenToBlack( SM_None, false ); + m_Menu.StartTransitioning( SM_GoToNextScreen ); m_SoundStart.Play(); - m_Wipe.CloseWipingRight( SM_GoToNextScreen ); + m_Wipe.CloseWipingRight( ); m_framePage.BeginTweening( 0.3f, Actor::TWEEN_ACCELERATE ); m_framePage.SetTweenX( SCREEN_RIGHT ); @@ -453,9 +445,7 @@ void ScreenOptions::MenuBack( PlayerNumber pn ) { Screen::MenuBack( pn ); - m_Menu.TweenOffScreenToBlack( SM_None, true ); - - m_Wipe.CloseWipingLeft( SM_GoToPrevScreen ); + m_Menu.Back( SM_GoToPrevScreen ); } void ScreenOptions::StartGoToNextState() diff --git a/stepmania/src/ScreenOptions.h b/stepmania/src/ScreenOptions.h index 9065efe479..f9621a9727 100644 --- a/stepmania/src/ScreenOptions.h +++ b/stepmania/src/ScreenOptions.h @@ -45,7 +45,7 @@ enum InputMode class ScreenOptions : public Screen { public: - ScreenOptions( CString sBackgroundPath, CString sPagePath, CString sTopEdgePath ); + ScreenOptions( CString sClassName, bool bEnableTimer ); void Init( InputMode im, OptionRowData OptionRowData[], int iNumOptionLines, bool bUseIcons ); virtual ~ScreenOptions(); virtual void Update( float fDeltaTime ); diff --git a/stepmania/src/ScreenOptionsMenu.cpp b/stepmania/src/ScreenOptionsMenu.cpp index 2b0ddf70af..6c72eb749e 100644 --- a/stepmania/src/ScreenOptionsMenu.cpp +++ b/stepmania/src/ScreenOptionsMenu.cpp @@ -49,11 +49,7 @@ OptionRowData g_OptionsMenuLines[NUM_OPTIONS_MENU_LINES] = { }; ScreenOptionsMenu::ScreenOptionsMenu() : - ScreenOptions( - THEME->GetPathTo("BGAnimations","options menu"), - THEME->GetPathTo("Graphics","options menu page"), - THEME->GetPathTo("Graphics","options menu top edge") - ) + ScreenOptions("ScreenOptionsMenu",false) { LOG->Trace( "ScreenOptionsMenu::ScreenOptionsMenu()" ); @@ -71,10 +67,10 @@ ScreenOptionsMenu::ScreenOptionsMenu() : g_OptionsMenuLines, NUM_OPTIONS_MENU_LINES, false ); - m_Menu.SetTimer( 99 ); - m_Menu.StopTimer(); + m_Menu.m_MenuTimer.SetTimer( 99 ); + m_Menu.m_MenuTimer.StopTimer(); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","options menu music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenOptionsMenu music") ); } /* We depend on the SM options navigation for this screen, not arcade. */ diff --git a/stepmania/src/ScreenPlayerOptions.cpp b/stepmania/src/ScreenPlayerOptions.cpp index 8b4fc2b1b8..e6076063b5 100644 --- a/stepmania/src/ScreenPlayerOptions.cpp +++ b/stepmania/src/ScreenPlayerOptions.cpp @@ -49,11 +49,7 @@ OptionRowData g_PlayerOptionsLines[NUM_PLAYER_OPTIONS_LINES] = { ScreenPlayerOptions::ScreenPlayerOptions() : - ScreenOptions( - THEME->GetPathTo("BGAnimations","player options"), - THEME->GetPathTo("Graphics","player options page"), - THEME->GetPathTo("Graphics","player options top edge") - ) + ScreenOptions("ScreenPlayerOptions",true) { LOG->Trace( "ScreenPlayerOptions::ScreenPlayerOptions()" ); diff --git a/stepmania/src/ScreenPrompt.cpp b/stepmania/src/ScreenPrompt.cpp index 4121f9ec71..ed6d4139eb 100644 --- a/stepmania/src/ScreenPrompt.cpp +++ b/stepmania/src/ScreenPrompt.cpp @@ -79,7 +79,7 @@ ScreenPrompt::ScreenPrompt( ScreenMessage SM_SendWhenDone, CString sText, bool b m_textAnswer[m_bAnswer].SetEffectGlowShift(); - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","menu prompt") ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","ScreenMenuPrompt music.mp3") ); } void ScreenPrompt::Update( float fDeltaTime ) @@ -151,7 +151,7 @@ void ScreenPrompt::MenuRight( PlayerNumber pn ) m_rectAnswerBox.SetTweenXY( m_textAnswer[m_bAnswer].GetX(), m_textAnswer[m_bAnswer].GetY() ); m_rectAnswerBox.SetTweenZoomX( m_textAnswer[m_bAnswer].GetWidestLineWidthInSourcePixels()+10.0f ); - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","edit change line") ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","ScreenPrompt change") ); } void ScreenPrompt::MenuStart( PlayerNumber pn ) @@ -171,7 +171,7 @@ void ScreenPrompt::MenuStart( PlayerNumber pn ) m_textAnswer[1].BeginTweening( 0.2f ); m_textAnswer[1].SetTweenDiffuse( RageColor(1,1,1,0) ); - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","menu start") ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","Common start") ); if( m_bAnswer ) if( m_pOnYes ) diff --git a/stepmania/src/ScreenRanking.cpp b/stepmania/src/ScreenRanking.cpp index 7ddfb71067..b98f8ee8eb 100644 --- a/stepmania/src/ScreenRanking.cpp +++ b/stepmania/src/ScreenRanking.cpp @@ -45,7 +45,7 @@ const ScreenMessage SM_ShowNextPage = (ScreenMessage)(SM_User+67); const ScreenMessage SM_HidePage = (ScreenMessage)(SM_User+68); -ScreenRanking::ScreenRanking() : ScreenAttract("ScreenRanking","ranking") +ScreenRanking::ScreenRanking() : ScreenAttract("ScreenRanking") { m_textCategory.LoadFromFont( THEME->GetPathTo("Fonts","Header2") ); m_textCategory.EnableShadow( false ); @@ -59,7 +59,7 @@ ScreenRanking::ScreenRanking() : ScreenAttract("ScreenRanking","ranking") for( int i=0; iGetPathTo("Graphics",("ranking bullets 1x5")) ); + m_sprBullets[i].Load( THEME->GetPathTo("Graphics",("ScreenRanking bullets 1x5")) ); m_sprBullets[i].SetXY( BULLETS_START_X+LINE_SPACING_X*i, BULLETS_START_Y+LINE_SPACING_Y*i ); m_sprBullets[i].SetDiffuse( RageColor(1,1,1,0) ); m_sprBullets[i].StopAnimating(); @@ -149,7 +149,8 @@ ScreenRanking::ScreenRanking() : ScreenAttract("ScreenRanking","ranking") } } - this->MoveToTail( &m_Fade ); + this->MoveToTail( &m_In ); // put it in the back so it covers up the stuff we just added + this->MoveToTail( &m_Out ); // put it in the back so it covers up the stuff we just added this->ClearMessageQueue( SM_BeginFadingOut ); // ignore ScreenAttract's SecsToShow @@ -160,9 +161,10 @@ void ScreenRanking::HandleScreenMessage( const ScreenMessage SM ) { switch( SM ) { - case SM_BeginFadingOut: - m_Fade.CloseWipingRight(SM_GoToNextScreen); - break; + // redundant +// case SM_BeginFadingOut: +// m_Out.CloseWipingRight(SM_GoToNextScreen); +// break; case SM_ShowNextPage: if( m_vPagesToShow.size() > 0 ) { @@ -173,7 +175,7 @@ void ScreenRanking::HandleScreenMessage( const ScreenMessage SM ) } else { - m_Fade.CloseWipingRight(SM_GoToNextScreen); + m_Out.StartTransitioning(SM_GoToNextScreen); } break; case SM_HidePage: diff --git a/stepmania/src/ScreenSelect.cpp b/stepmania/src/ScreenSelect.cpp index ac8ad008d1..4404481090 100644 --- a/stepmania/src/ScreenSelect.cpp +++ b/stepmania/src/ScreenSelect.cpp @@ -26,14 +26,10 @@ #include "ModeChoice.h" -#define CHOICES_TYPE THEME->GetMetricI(m_sClassName,"ChoicesType") #define CHOICES THEME->GetMetric (m_sClassName,"Choices") #define HELP_TEXT THEME->GetMetric (m_sClassName,"HelpText") #define TIMER_SECONDS THEME->GetMetricI(m_sClassName,"TimerSeconds") -#define NEXT_SCREEN THEME->GetMetric (m_sClassName,"NextScreen") -#define NEXT_SCREEN_ARCADE THEME->GetMetric (m_sClassName,"NextScreenArcade") -#define NEXT_SCREEN_ONI THEME->GetMetric (m_sClassName,"NextScreenOni") -#define NEXT_SCREEN_BATTLE THEME->GetMetric (m_sClassName,"NextScreenBattle") +#define NEXT_SCREEN( choice ) THEME->GetMetric (m_sClassName,ssprintf("NextScreen%d",choice+1)) ScreenSelect::ScreenSelect( CString sClassName ) @@ -42,190 +38,102 @@ ScreenSelect::ScreenSelect( CString sClassName ) m_sClassName = sClassName; - - m_type = (ChoicesType)CHOICES_TYPE; - m_sClassName = sClassName; + GAMESTATE->m_bPlayersCanJoin = false; + // Set this true later if we discover a choice that chooses the Style - GAMESTATE->m_bPlayersCanJoin = (m_type==CHOICES_STYLE)||(m_type==CHOICES_MODE); + CStringArray asChoices; + split( CHOICES, ",", asChoices ); - - switch( m_type ) + for( unsigned c=0; c aStyles; - GAMEMAN->GetStylesForGame( GAMESTATE->m_CurGame, aStyles ); - ASSERT( !aStyles.empty() ); // every game should have at least one Style, or else why have the Game? :-) + CString sBit = asBits[b]; - for( unsigned s=0; sStringToGameType( sBit ); + if( game != GAME_INVALID ) { - Style style = aStyles[s]; - const StyleDef* pStyleDef = GAMEMAN->GetStyleDefForStyle(aStyles[s]); + mc.game = game; + continue; + } - int iNumSidesJoinedToPlay; - switch( pStyleDef->m_StyleType ) - { - case StyleDef::ONE_PLAYER_ONE_CREDIT: iNumSidesJoinedToPlay = 1; break; - case StyleDef::TWO_PLAYERS_TWO_CREDITS: iNumSidesJoinedToPlay = 2; break; - case StyleDef::ONE_PLAYER_TWO_CREDITS: iNumSidesJoinedToPlay = 2; break; - default: ASSERT(0); iNumSidesJoinedToPlay = 1; - } - - ModeChoice mc = { - GAMESTATE->m_CurGame, - style, - PLAY_MODE_INVALID, - DIFFICULTY_INVALID, - "", - iNumSidesJoinedToPlay - }; - strcpy( mc.name, pStyleDef->m_szName ); - m_aModeChoices.push_back( mc ); + Style style = GAMEMAN->GameAndStringToStyle( GAMESTATE->m_CurGame, sBit ); + if( style != STYLE_INVALID ) + { + mc.style = style; + // There is a choices that allows players to choose a style. Allow joining. + GAMESTATE->m_bPlayersCanJoin = true; + continue; + } + + PlayMode pm = StringToPlayMode( sBit ); + if( pm != PLAY_MODE_INVALID ) + { + mc.pm = pm; + continue; + } + + Difficulty dc = StringToDifficulty( sBit ); + if( dc != DIFFICULTY_INVALID ) + { + mc.dc = dc; + continue; + } + + LOG->Warn( "The choice token '%s' is not recognized as a Game, Style, PlayMode, or Difficulty. The choice containing this token will be ignored.", sBit.GetString() ); + bChoiceIsInvalid |= true; + } + + if( mc.style != STYLE_INVALID ) + { + const StyleDef* pStyleDef = GAMEMAN->GetStyleDefForStyle(mc.style); + switch( pStyleDef->m_StyleType ) + { + case StyleDef::ONE_PLAYER_ONE_CREDIT: + mc.numSidesJoinedToPlay = 1; + break; + case StyleDef::TWO_PLAYERS_TWO_CREDITS: + case StyleDef::ONE_PLAYER_TWO_CREDITS: + mc.numSidesJoinedToPlay = 2; + break; + default: + ASSERT(0); } } - break; - case CHOICES_MODE: - { - CStringArray asChoices; - split( CHOICES, ",", asChoices ); - for( unsigned c=0; cm_CurGame, - STYLE_INVALID, - PLAY_MODE_INVALID, - DIFFICULTY_INVALID, - "", - 1 }; - - CStringArray asBits; - split( asChoices[c], "-", asBits ); - - if( asBits.size() != 3 ) - RageException::Throw( - "The mode choice '%s' is invalid. Mode choices must be in the format " - "'style-playmode-difficulty'", asChoices[c].GetString() ); - - mc.game = GAMESTATE->m_CurGame; - - mc.style = GAMEMAN->GameAndStringToStyle( mc.game, asBits[0] ); - if( mc.style == STYLE_INVALID ) - RageException::Throw( - "The specified style '%s' in the mode choice '%s' is invalid.", asBits[0].GetString(), asChoices[c].GetString() ); + if( ! bChoiceIsInvalid ) + m_aModeChoices.push_back( mc ); - mc.pm = StringToPlayMode( asBits[1] ); - if( mc.pm == PLAY_MODE_INVALID ) - RageException::Throw( - "The specified play mode '%s' in the mode choice '%s' is invalid.", asBits[1].GetString(), asChoices[c].GetString() ); - - mc.dc = StringToDifficulty( asBits[2] ); - if( mc.dc == DIFFICULTY_INVALID ) - RageException::Throw( - "The specified difficulty '%s' in the mode choice '%s' is invalid.", asBits[2].GetString(), asChoices[c].GetString() ); - - strcpy( mc.name, asChoices[c] ); - - const StyleDef* pStyleDef = GAMEMAN->GetStyleDefForStyle(mc.style); - switch( pStyleDef->m_StyleType ) - { - case StyleDef::ONE_PLAYER_ONE_CREDIT: - mc.numSidesJoinedToPlay = 1; - break; - case StyleDef::TWO_PLAYERS_TWO_CREDITS: - case StyleDef::ONE_PLAYER_TWO_CREDITS: - mc.numSidesJoinedToPlay = 2; - break; - default: - ASSERT(0); - } - - m_aModeChoices.push_back( mc ); - } - } - break; - case CHOICES_DIFFICULTY: - { - if( GAMESTATE->m_CurStyle == STYLE_INVALID ) - RageException::Throw( "The current Style has not been set. A theme must set the style before it can display a difficulty selection screen." ); - - CStringArray asBits; - split( CHOICES, ",", asBits ); - - unsigned choice; - - for( choice=0; choicem_CurGame, - GAMESTATE->m_CurStyle, - PLAY_MODE_ARCADE, - dc, - "", - GAMESTATE->GetNumSidesJoined() }; - strcpy( mc.name, DifficultyToString(dc) ); - m_aModeChoices.push_back( mc ); - } - else if( pm!=PLAY_MODE_INVALID ) // valid play mode - { - ModeChoice mc = { - GAMESTATE->m_CurGame, - GAMESTATE->m_CurStyle, - pm, - DIFFICULTY_MEDIUM, - "", - GAMESTATE->GetNumSidesJoined() }; - strcpy( mc.name, PlayModeToString(pm) ); - m_aModeChoices.push_back( mc ); - } - else - RageException::Throw( "Invalid Choice%d value '%s'.", choice+1, asBits[choice].GetString() ); - } - } - break; - case CHOICES_GAME: - ASSERT(0); // TODO - break; - } - - - for( unsigned c=0; cGetPathToOptional("BGAnimations",ssprintf("%s %s",m_sClassName.GetString(),m_aModeChoices[c].name)); + + CString sBGAnimationDir = THEME->GetPathToOptional("BGAnimations",ssprintf("%s %s",m_sClassName.GetString(),mc.name)); if( sBGAnimationDir == "" ) - sBGAnimationDir = THEME->GetPathTo("BGAnimations",m_sClassName.GetString()); + sBGAnimationDir = THEME->GetPathTo("BGAnimations",m_sClassName+" background"); m_BGAnimations[c].LoadFromAniDir( sBGAnimationDir ); } - m_Menu.Load( - "", // don't load any BGAnimation. We have our own. - THEME->GetPathTo("Graphics",m_sClassName+" top edge"), - HELP_TEXT, false, true, TIMER_SECONDS - ); + m_Menu.Load( sClassName, true, false ); // don't load any BGAnimation. We have our own. this->AddChild( &m_Menu ); SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo(m_sClassName+" intro") ); SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds",m_sClassName+" music") ); - - switch( m_type ) - { - case CHOICES_STYLE: - case CHOICES_MODE: - // This is probably the first screen in the menu sequence. - m_Menu.TweenOnScreenFromBlack( SM_None ); - break; - case CHOICES_DIFFICULTY: - // This is probably not the first screen in the menu sequence. - m_Menu.TweenOnScreenFromMenu( SM_None ); - break; - } } @@ -255,10 +163,8 @@ void ScreenSelect::Input( const DeviceInput& DeviceI, const InputEventType type, if( MenuI.IsValid() && MenuI.button==MENU_BUTTON_START ) { PlayerNumber pn = MenuI.player; - switch( m_type ) + if( GAMESTATE->m_bPlayersCanJoin ) { - case CHOICES_STYLE: - case CHOICES_MODE: if( pn!=PLAYER_INVALID && !GAMESTATE->m_bSideIsJoined[pn] ) { /* I think JP should allow playing two-pad singleplayer modes (doubles), @@ -271,6 +177,10 @@ void ScreenSelect::Input( const DeviceInput& DeviceI, const InputEventType type, * Also, credit deduction should be handled in StepMania.cpp (along with * the coin logic) using GAMESTATE->m_bPlayersCanJoin, since there * are other screens you can join (eg ScreenCaution). -glenn */ + + /* Joint premium on a DDR machine does allow two player modes with a single + * credit. -Chris */ + if( PREFSMAN->m_CoinMode == PrefsManager::COIN_PAY ) { if( !PREFSMAN->m_bJointPremium ) @@ -287,17 +197,16 @@ void ScreenSelect::Input( const DeviceInput& DeviceI, const InputEventType type, } /* If credits had to be used, it's already taken care of.. add the player */ - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","menu start") ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","Common start") ); GAMESTATE->m_bSideIsJoined[pn] = true; SCREENMAN->RefreshCreditsMessages(); this->UpdateSelectableChoices(); return; } - break; } } - if( m_Menu.IsClosing() ) + if( m_Menu.IsTransitioning() ) return; Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); // default input handler @@ -316,9 +225,8 @@ void ScreenSelect::HandleScreenMessage( const ScreenMessage SM ) GAMESTATE->m_bPlayersCanJoin = false; SCREENMAN->RefreshCreditsMessages(); - m_Menu.StopTimer(); - - m_Menu.TweenOffScreenToMenu( SM_GoToNextScreen ); + if( !m_Menu.IsTransitioning() ) + m_Menu.StartTransitioning( SM_GoToNextScreen ); } break; case SM_MenuTimer: @@ -333,25 +241,9 @@ void ScreenSelect::HandleScreenMessage( const ScreenMessage SM ) SCREENMAN->SetNewScreen( "ScreenTitleMenu" ); break; case SM_GoToNextScreen: - switch( m_type ) { - case CHOICES_STYLE: - // if they only chose a style, then the play mode isn't set. - SCREENMAN->SetNewScreen( NEXT_SCREEN ); - break; - case CHOICES_MODE: - case CHOICES_DIFFICULTY: - // go to a specific screen depending on the play mode - switch( GAMESTATE->m_PlayMode ) - { - case PLAY_MODE_ARCADE: SCREENMAN->SetNewScreen( NEXT_SCREEN_ARCADE ); break; - case PLAY_MODE_NONSTOP: - case PLAY_MODE_ONI: - case PLAY_MODE_ENDLESS: SCREENMAN->SetNewScreen( NEXT_SCREEN_ONI ); break; - case PLAY_MODE_BATTLE: SCREENMAN->SetNewScreen( NEXT_SCREEN_BATTLE ); break; - default: ASSERT(0); - } - break; + int iSelectionIndex = GetSelectionIndex(GAMESTATE->m_MasterPlayerNumber); + SCREENMAN->SetNewScreen( NEXT_SCREEN(iSelectionIndex) ); } break; } @@ -361,5 +253,5 @@ void ScreenSelect::MenuBack( PlayerNumber pn ) { SOUNDMAN->StopMusic(); - m_Menu.TweenOffScreenToBlack( SM_GoToPrevScreen, true ); + m_Menu.Back( SM_GoToPrevScreen ); } diff --git a/stepmania/src/ScreenSelect.h b/stepmania/src/ScreenSelect.h index 60afbf1efa..6a546d68da 100644 --- a/stepmania/src/ScreenSelect.h +++ b/stepmania/src/ScreenSelect.h @@ -39,8 +39,6 @@ protected: virtual int GetSelectionIndex( PlayerNumber pn ) = 0; virtual void UpdateSelectableChoices() = 0; // derived screens must handle this - enum ChoicesType { CHOICES_STYLE, CHOICES_DIFFICULTY, CHOICES_MODE, CHOICES_GAME }; - ChoicesType m_type; CString m_sClassName; MenuElements m_Menu; diff --git a/stepmania/src/ScreenSelectCourse.cpp b/stepmania/src/ScreenSelectCourse.cpp index c52824dfe6..f451b5f5a2 100644 --- a/stepmania/src/ScreenSelectCourse.cpp +++ b/stepmania/src/ScreenSelectCourse.cpp @@ -62,20 +62,16 @@ ScreenSelectCourse::ScreenSelectCourse() CodeDetector::RefreshCacheItems(); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","select course music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenSelectCourse music") ); m_bMadeChoice = false; m_bGoToOptions = false; m_bAllowOptionsMenuRepeat = false; - m_Menu.Load( - THEME->GetPathTo("BGAnimations","select course"), - THEME->GetPathTo("Graphics","select course top edge"), - HELP_TEXT, true, true, TIMER_SECONDS - ); + m_Menu.Load( "ScreenSelectCourse" ); this->AddChild( &m_Menu ); - m_sprExplanation.Load( THEME->GetPathTo("Graphics","select course explanation") ); + m_sprExplanation.Load( THEME->GetPathTo("Graphics","ScreenSelectCourse explanation") ); m_sprExplanation.SetXY( EXPLANATION_X, EXPLANATION_Y ); this->AddChild( &m_sprExplanation ); @@ -83,16 +79,16 @@ ScreenSelectCourse::ScreenSelectCourse() m_Banner.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); this->AddChild( &m_Banner ); - m_sprBannerFrame.Load( THEME->GetPathTo("Graphics","select course banner frame") ); + m_sprBannerFrame.Load( THEME->GetPathTo("Graphics","ScreenSelectCourse banner frame") ); m_sprBannerFrame.SetXY( BANNER_FRAME_X, BANNER_FRAME_Y ); this->AddChild( &m_sprBannerFrame ); - m_textNumSongs.LoadFromFont( THEME->GetPathTo("Fonts","select course num songs") ); + m_textNumSongs.LoadFromFont( THEME->GetPathTo("Fonts","ScreenSelectCourse num songs") ); m_textNumSongs.SetXY( STAGES_X, STAGES_Y ); m_textNumSongs.EnableShadow( false ); this->AddChild( &m_textNumSongs ); - m_textTime.LoadFromFont( THEME->GetPathTo("Fonts","select course total time") ); + m_textTime.LoadFromFont( THEME->GetPathTo("Fonts","ScreenSelectCourse total time") ); m_textTime.SetXY( TIME_X, TIME_Y ); m_textTime.EnableShadow( false ); this->AddChild( &m_textTime ); @@ -108,7 +104,7 @@ ScreenSelectCourse::ScreenSelectCourse() if( !GAMESTATE->IsPlayerEnabled((PlayerNumber)p) ) continue; // skip - m_sprHighScoreFrame[p].Load( THEME->GetPathTo("Graphics","select music score frame") ); + m_sprHighScoreFrame[p].Load( THEME->GetPathTo("Graphics","ScreenSelectCourse score frame") ); m_sprHighScoreFrame[p].StopAnimating(); m_sprHighScoreFrame[p].SetState( p ); m_sprHighScoreFrame[p].SetXY( SCORE_X(p), SCORE_Y(p) ); @@ -120,7 +116,7 @@ ScreenSelectCourse::ScreenSelectCourse() this->AddChild( &m_HighScore[p] ); } - m_sprOptionsMessage.Load( THEME->GetPathTo("Graphics","select music options message 1x2") ); + m_sprOptionsMessage.Load( THEME->GetPathTo("Graphics","ScreenSelectCourse options message 1x2") ); m_sprOptionsMessage.StopAnimating(); m_sprOptionsMessage.SetXY( CENTER_X, CENTER_Y ); m_sprOptionsMessage.SetZoomY( 0 ); @@ -128,20 +124,19 @@ ScreenSelectCourse::ScreenSelectCourse() this->AddChild( &m_sprOptionsMessage ); - m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); - m_soundOptionsChange.Load( THEME->GetPathTo("Sounds","select music options") ); - m_soundChangeNotes.Load( THEME->GetPathTo("Sounds","select music notes") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","Common start") ); + m_soundOptionsChange.Load( THEME->GetPathTo("Sounds","ScreenSelectCourse options") ); + m_soundChangeNotes.Load( THEME->GetPathTo("Sounds","ScreenSelectCourse difficulty") ); SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select course intro") ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","select course music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenSelectCourse music") ); UpdateOptionsDisplays(); AfterCourseChange(); TweenOnScreen(); - m_Menu.TweenOnScreenFromMenu( SM_None ); } @@ -235,11 +230,11 @@ void ScreenSelectCourse::Input( const DeviceInput& DeviceI, InputEventType type, m_bGoToOptions = true; m_sprOptionsMessage.SetState( 1 ); - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","menu start") ); + m_soundSelect.Play(); return; } - if( m_Menu.IsClosing() ) return; // ignore + if( m_Menu.IsTransitioning() ) return; // ignore if( m_bMadeChoice ) return; @@ -354,7 +349,7 @@ void ScreenSelectCourse::MenuStart( PlayerNumber pn ) m_sprOptionsMessage.SetTweenZoomY( 0 ); this->SendScreenMessage( SM_AllowOptionsMenuRepeat, 0.75f ); - m_Menu.TweenOffScreenToBlack( SM_None, false ); + m_Menu.StartTransitioning( SM_GoToNextScreen ); Course* pCourse = m_MusicWheel.GetSelectedCourse(); GAMESTATE->m_pCurCourse = pCourse; @@ -378,11 +373,8 @@ void ScreenSelectCourse::MenuStart( PlayerNumber pn ) // GAMESTATE->m_PlayerOptions[p].FromString( sModifiers ); //GAMESTATE->m_SongOptions.FromString( sModifiers ); - m_Menu.StopTimer(); AdjustOptions(); - this->SendScreenMessage( SM_GoToNextScreen, 2.5f ); - break; } } @@ -392,7 +384,7 @@ void ScreenSelectCourse::MenuBack( PlayerNumber pn ) { SOUNDMAN->StopMusic(); - m_Menu.TweenOffScreenToBlack( SM_GoToPrevScreen, true ); + m_Menu.Back( SM_GoToPrevScreen ); } diff --git a/stepmania/src/ScreenSelectMaxType2.cpp b/stepmania/src/ScreenSelectDifficulty.cpp similarity index 69% rename from stepmania/src/ScreenSelectMaxType2.cpp rename to stepmania/src/ScreenSelectDifficulty.cpp index 0cc5eda1e6..648f08e29a 100644 --- a/stepmania/src/ScreenSelectMaxType2.cpp +++ b/stepmania/src/ScreenSelectDifficulty.cpp @@ -1,7 +1,7 @@ #include "global.h" /* ----------------------------------------------------------------------------- - Class: ScreenSelectMaxType2 + Class: ScreenSelectDifficulty Desc: See header. @@ -10,7 +10,7 @@ ----------------------------------------------------------------------------- */ -#include "ScreenSelectMaxType2.h" +#include "ScreenSelectDifficulty.h" #include "GameManager.h" #include "ThemeManager.h" #include "PrefsManager.h" @@ -20,40 +20,39 @@ #include "ModeChoice.h" -#define NUM_CHOICES_ON_PAGE_1 THEME->GetMetricI("ScreenSelectMaxType2","NumChoicesOnPage1") -#define LOCK_INPUT_SECONDS THEME->GetMetricF("ScreenSelectMaxType2","LockInputSeconds") -#define SLEEP_AFTER_CHOICE_SECONDS THEME->GetMetricF("ScreenSelectMaxType2","SleepAfterChoiceSeconds") -#define SLEEP_AFTER_TWEEN_OFF_SECONDS THEME->GetMetricF("ScreenSelectMaxType2","SleepAfterTweenOffSeconds") -#define MORE_ON_COMMAND( page ) THEME->GetMetric ("ScreenSelectMaxType2",ssprintf("MorePage%dOnCommand",page+1)) -#define MORE_OFF_COMMAND( page ) THEME->GetMetric ("ScreenSelectMaxType2",ssprintf("MorePage%dOffCommand",page+1)) -#define EXPLANATION_ON_COMMAND( page ) THEME->GetMetric ("ScreenSelectMaxType2",ssprintf("ExplanationPage%dOnCommand",page+1)) -#define EXPLANATION_OFF_COMMAND( page ) THEME->GetMetric ("ScreenSelectMaxType2",ssprintf("ExplanationPage%dOffCommand",page+1)) -#define HEADER_ON_COMMAND( page, choice ) THEME->GetMetric ("ScreenSelectMaxType2",ssprintf("HeaderPage%dChoice%dOnCommand",page+1,choice+1)) -#define HEADER_OFF_COMMAND( page, choice ) THEME->GetMetric ("ScreenSelectMaxType2",ssprintf("HeaderPage%dChoice%dOffCommand",page+1,choice+1)) -#define PICTURE_ON_COMMAND( page, choice ) THEME->GetMetric ("ScreenSelectMaxType2",ssprintf("PicturePage%dChoice%dOnCommand",page+1,choice+1)) -#define PICTURE_OFF_COMMAND( page, choice ) THEME->GetMetric ("ScreenSelectMaxType2",ssprintf("PicturePage%dChoice%dOffCommand",page+1,choice+1)) -#define CURSOR_ON_COMMAND THEME->GetMetric ("ScreenSelectMaxType2","CursorOnCommand") -#define CURSOR_CHOOSE_COMMAND THEME->GetMetric ("ScreenSelectMaxType2","CursorChooseCommand") -#define CURSOR_OFF_COMMAND THEME->GetMetric ("ScreenSelectMaxType2","CursorOffCommand") -#define CURSOR_OFFSET_X_FROM_PICTURE( p ) THEME->GetMetricF("ScreenSelectMaxType2",ssprintf("CursorP%dOffsetXFromPicture",p+1)) -#define CURSOR_OFFSET_Y_FROM_PICTURE( p ) THEME->GetMetricF("ScreenSelectMaxType2",ssprintf("CursorP%dOffsetYFromPicture",p+1)) -#define SHADOW_ON_COMMAND THEME->GetMetric ("ScreenSelectMaxType2","ShadowOnCommand") -#define SHADOW_CHOOSE_COMMAND THEME->GetMetric ("ScreenSelectMaxType2","ShadowChooseCommand") -#define SHADOW_OFF_COMMAND THEME->GetMetric ("ScreenSelectMaxType2","ShadowOffCommand") -#define SHADOW_LENGTH_X THEME->GetMetricF("ScreenSelectMaxType2","ShadowLengthX") -#define SHADOW_LENGTH_Y THEME->GetMetricF("ScreenSelectMaxType2","ShadowLengthY") -#define OK_ON_COMMAND THEME->GetMetric ("ScreenSelectMaxType2","OKOnCommand") -#define OK_CHOOSE_COMMAND THEME->GetMetric ("ScreenSelectMaxType2","OKChooseCommand") -#define OK_OFF_COMMAND THEME->GetMetric ("ScreenSelectMaxType2","OKOffCommand") -#define DISABLED_COLOR THEME->GetMetricC("ScreenSelectMaxType2","DisabledColor") +#define NUM_CHOICES_ON_PAGE_1 THEME->GetMetricI("ScreenSelectDifficulty","NumChoicesOnPage1") +#define LOCK_INPUT_SECONDS THEME->GetMetricF("ScreenSelectDifficulty","LockInputSeconds") +#define SLEEP_AFTER_CHOICE_SECONDS THEME->GetMetricF("ScreenSelectDifficulty","SleepAfterChoiceSeconds") +#define SLEEP_AFTER_TWEEN_OFF_SECONDS THEME->GetMetricF("ScreenSelectDifficulty","SleepAfterTweenOffSeconds") +#define MORE_ON_COMMAND( page ) THEME->GetMetric ("ScreenSelectDifficulty",ssprintf("MorePage%dOnCommand",page+1)) +#define MORE_OFF_COMMAND( page ) THEME->GetMetric ("ScreenSelectDifficulty",ssprintf("MorePage%dOffCommand",page+1)) +#define EXPLANATION_ON_COMMAND( page ) THEME->GetMetric ("ScreenSelectDifficulty",ssprintf("ExplanationPage%dOnCommand",page+1)) +#define EXPLANATION_OFF_COMMAND( page ) THEME->GetMetric ("ScreenSelectDifficulty",ssprintf("ExplanationPage%dOffCommand",page+1)) +#define INFO_ON_COMMAND( page, choice ) THEME->GetMetric ("ScreenSelectDifficulty",ssprintf("InfoPage%dChoice%dOnCommand",page+1,choice+1)) +#define INFO_OFF_COMMAND( page, choice ) THEME->GetMetric ("ScreenSelectDifficulty",ssprintf("InfoPage%dChoice%dOffCommand",page+1,choice+1)) +#define PICTURE_ON_COMMAND( page, choice ) THEME->GetMetric ("ScreenSelectDifficulty",ssprintf("PicturePage%dChoice%dOnCommand",page+1,choice+1)) +#define PICTURE_OFF_COMMAND( page, choice ) THEME->GetMetric ("ScreenSelectDifficulty",ssprintf("PicturePage%dChoice%dOffCommand",page+1,choice+1)) +#define CURSOR_ON_COMMAND THEME->GetMetric ("ScreenSelectDifficulty","CursorOnCommand") +#define CURSOR_CHOOSE_COMMAND THEME->GetMetric ("ScreenSelectDifficulty","CursorChooseCommand") +#define CURSOR_OFF_COMMAND THEME->GetMetric ("ScreenSelectDifficulty","CursorOffCommand") +#define CURSOR_OFFSET_X_FROM_PICTURE( p ) THEME->GetMetricF("ScreenSelectDifficulty",ssprintf("CursorP%dOffsetXFromPicture",p+1)) +#define CURSOR_OFFSET_Y_FROM_PICTURE( p ) THEME->GetMetricF("ScreenSelectDifficulty",ssprintf("CursorP%dOffsetYFromPicture",p+1)) +#define SHADOW_ON_COMMAND THEME->GetMetric ("ScreenSelectDifficulty","ShadowOnCommand") +#define SHADOW_CHOOSE_COMMAND THEME->GetMetric ("ScreenSelectDifficulty","ShadowChooseCommand") +#define SHADOW_OFF_COMMAND THEME->GetMetric ("ScreenSelectDifficulty","ShadowOffCommand") +#define SHADOW_LENGTH_X THEME->GetMetricF("ScreenSelectDifficulty","ShadowLengthX") +#define SHADOW_LENGTH_Y THEME->GetMetricF("ScreenSelectDifficulty","ShadowLengthY") +#define OK_ON_COMMAND THEME->GetMetric ("ScreenSelectDifficulty","OKOnCommand") +#define OK_CHOOSE_COMMAND THEME->GetMetric ("ScreenSelectDifficulty","OKChooseCommand") +#define OK_OFF_COMMAND THEME->GetMetric ("ScreenSelectDifficulty","OKOffCommand") +#define DISABLED_COLOR THEME->GetMetricC("ScreenSelectDifficulty","DisabledColor") -ScreenSelectMaxType2::ScreenSelectMaxType2() : ScreenSelect( "ScreenSelectMaxType2" ) +ScreenSelectDifficulty::ScreenSelectDifficulty() : ScreenSelect( "ScreenSelectDifficulty" ) { m_CurrentPage = PAGE_1; - int p; - for( p=0; pGetPathTo("Graphics",sPictureFile) ); m_framePages.AddChild( &m_sprPicture[page][choice] ); - m_sprHeader[page][choice].Load( THEME->GetPathTo("Graphics",sHeaderFile) ); - m_framePages.AddChild( &m_sprHeader[page][choice] ); + m_sprInfo[page][choice].Load( THEME->GetPathTo("Graphics",sInfoFile) ); + m_framePages.AddChild( &m_sprInfo[page][choice] ); } - m_sprMore[page].Load( THEME->GetPathTo("Graphics", ssprintf("ScreenSelectMaxType2 more page%d",page+1) ) ); + m_sprMore[page].Load( THEME->GetPathTo("Graphics", ssprintf("ScreenSelectDifficulty more page%d",page+1) ) ); m_framePages.AddChild( &m_sprMore[page] ); - m_sprExplanation[page].Load( THEME->GetPathTo("Graphics", "ScreenSelectMaxType2 explanation") ); + m_sprExplanation[page].Load( THEME->GetPathTo("Graphics", "ScreenSelectDifficulty explanation") ); m_sprExplanation[page].StopAnimating(); m_sprExplanation[page].SetState( page ); m_framePages.AddChild( &m_sprExplanation[page] ); @@ -101,18 +100,18 @@ ScreenSelectMaxType2::ScreenSelectMaxType2() : ScreenSelect( "ScreenSelectMaxTyp if( !GAMESTATE->IsPlayerEnabled((PlayerNumber)p) ) continue; - m_sprShadow[p].Load( THEME->GetPathTo("Graphics", "ScreenSelectMaxType2 shadow 2x1") ); + m_sprShadow[p].Load( THEME->GetPathTo("Graphics", "ScreenSelectDifficulty shadow 2x1") ); m_sprShadow[p].StopAnimating(); m_sprShadow[p].SetState( p ); m_sprShadow[p].SetDiffuse( RageColor(0,0,0,0.6f) ); m_framePages.AddChild( &m_sprShadow[p] ); - m_sprCursor[p].Load( THEME->GetPathTo("Graphics", "ScreenSelectMaxType2 cursor 2x1") ); + m_sprCursor[p].Load( THEME->GetPathTo("Graphics", "ScreenSelectDifficulty cursor 2x1") ); m_sprCursor[p].StopAnimating(); m_sprCursor[p].SetState( p ); m_framePages.AddChild( &m_sprCursor[p] ); - m_sprOK[p].Load( THEME->GetPathTo("Graphics", "ScreenSelectMaxType2 ok 2x1") ); + m_sprOK[p].Load( THEME->GetPathTo("Graphics", "ScreenSelectDifficulty ok 2x1") ); m_sprOK[p].SetState( p ); m_sprOK[p].StopAnimating(); m_sprOK[p].SetDiffuse( RageColor(1,1,1,0) ); @@ -121,22 +120,22 @@ ScreenSelectMaxType2::ScreenSelectMaxType2() : ScreenSelect( "ScreenSelectMaxTyp this->AddChild( &m_framePages ); - m_soundChange.Load( THEME->GetPathTo("Sounds", "ScreenSelectMaxType2 change") ); - m_soundSelect.Load( THEME->GetPathTo("Sounds", "menu start") ); - m_soundDifficult.Load( ANNOUNCER->GetPathTo("ScreenSelectMaxType2 challenge") ); + m_soundChange.Load( THEME->GetPathTo("Sounds", "ScreenSelectDifficulty change") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds", "Common start") ); + m_soundDifficult.Load( ANNOUNCER->GetPathTo("select difficulty challenge") ); m_fLockInputTime = LOCK_INPUT_SECONDS; TweenOnScreen(); } -void ScreenSelectMaxType2::Update( float fDelta ) +void ScreenSelectDifficulty::Update( float fDelta ) { ScreenSelect::Update( fDelta ); m_fLockInputTime = max( 0, m_fLockInputTime-fDelta ); } -void ScreenSelectMaxType2::HandleScreenMessage( const ScreenMessage SM ) +void ScreenSelectDifficulty::HandleScreenMessage( const ScreenMessage SM ) { ScreenSelect::HandleScreenMessage( SM ); @@ -149,7 +148,7 @@ void ScreenSelectMaxType2::HandleScreenMessage( const ScreenMessage SM ) } } -int ScreenSelectMaxType2::GetSelectionIndex( PlayerNumber pn ) +int ScreenSelectDifficulty::GetSelectionIndex( PlayerNumber pn ) { int index = 0; for( int page=0; pageIsPlayable(m_ModeChoices[page][i]) ) { - m_sprHeader[page][i].SetDiffuse( RageColor(1,1,1,1) ); + m_sprInfo[page][i].SetDiffuse( RageColor(1,1,1,1) ); m_sprPicture[page][i].SetDiffuse( RageColor(1,1,1,1) ); } else { - m_sprHeader[page][i].SetDiffuse( DISABLED_COLOR ); + m_sprInfo[page][i].SetDiffuse( DISABLED_COLOR ); m_sprPicture[page][i].SetDiffuse( DISABLED_COLOR ); } } @@ -189,7 +188,7 @@ void ScreenSelectMaxType2::UpdateSelectableChoices() } } -void ScreenSelectMaxType2::MenuLeft( PlayerNumber pn ) +void ScreenSelectDifficulty::MenuLeft( PlayerNumber pn ) { if( m_fLockInputTime > 0 ) return; @@ -205,7 +204,7 @@ void ScreenSelectMaxType2::MenuLeft( PlayerNumber pn ) } -void ScreenSelectMaxType2::MenuRight( PlayerNumber pn ) +void ScreenSelectDifficulty::MenuRight( PlayerNumber pn ) { if( m_fLockInputTime > 0 ) return; @@ -220,7 +219,7 @@ void ScreenSelectMaxType2::MenuRight( PlayerNumber pn ) ChangeWithinPage( pn, m_iChoiceOnPage[pn]+1, false ); } -void ScreenSelectMaxType2::ChangePage( Page newPage ) +void ScreenSelectDifficulty::ChangePage( Page newPage ) { int p; @@ -251,7 +250,7 @@ void ScreenSelectMaxType2::ChangePage( Page newPage ) m_framePages.SetTweenX( (float)newPage*-SCREEN_WIDTH ); } -void ScreenSelectMaxType2::ChangeWithinPage( PlayerNumber pn, int iNewChoice, bool bChangingPages ) +void ScreenSelectDifficulty::ChangeWithinPage( PlayerNumber pn, int iNewChoice, bool bChangingPages ) { for( int p=0; p 0 ) return; @@ -305,7 +304,7 @@ void ScreenSelectMaxType2::MenuStart( PlayerNumber pn ) if(m_CurrentPage != PAGE_2 || !AnotherPlayerSelected) { - SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo(ssprintf("ScreenSelectMaxType2 comment %s",mc.name)) ); + SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo(ssprintf("ScreenSelectDifficulty comment %s",mc.name)) ); m_soundSelect.Play(); } @@ -329,20 +328,20 @@ void ScreenSelectMaxType2::MenuStart( PlayerNumber pn ) // check to see if everyone has chosen - for( int pl=0; plIsPlayerEnabled((PlayerNumber)pl) && m_bChosen[pl] == false ) + if( GAMESTATE->IsPlayerEnabled((PlayerNumber)p) && m_bChosen[p] == false ) return; } this->SendScreenMessage( SM_BeginFadingOut, SLEEP_AFTER_CHOICE_SECONDS ); // tell our owner it's time to move on } // Err, this breaks back ... -//void ScreenSelectMaxType2::MenuBack( PlayerNumber pn ) +//void ScreenSelectDifficulty::MenuBack( PlayerNumber pn ) //{ //} -void ScreenSelectMaxType2::TweenOnScreen() +void ScreenSelectDifficulty::TweenOnScreen() { unsigned p; @@ -356,8 +355,8 @@ void ScreenSelectMaxType2::TweenOnScreen() for( unsigned c=0; cGetMetricF("ScreenSelectDifficultyEX",ssprintf("CursorOffsetP%dX",p+1)) #define CURSOR_OFFSET_EX_Y( i ) THEME->GetMetricF("ScreenSelectDifficultyEX",ssprintf("CursorOffsetP%dY",i+1)) #define INITIAL_CHOICE THEME->GetMetricI("ScreenSelectDifficultyEX","InitialChoice") -#define HELP_TEXT THEME->GetMetric("ScreenSelectDifficultyEX","HelpText") +#define HELP_TEXT THEME->GetMetric ("ScreenSelectDifficultyEX","HelpText") #define TIMER_SECONDS THEME->GetMetricI("ScreenSelectDifficultyEX","TimerSeconds") -#define NEXT_SCREEN_ARCADE THEME->GetMetric("ScreenSelectDifficultyEX","NextScreenArcade") -#define NEXT_SCREEN_ONI THEME->GetMetric("ScreenSelectDifficultyEX","NextScreenOni") -#define NEXT_SCREEN_BATTLE THEME->GetMetric("ScreenSelectDifficultyEX","NextScreenBattle") +#define NEXT_SCREEN_ARCADE THEME->GetMetric ("ScreenSelectDifficultyEX","NextScreenArcade") +#define NEXT_SCREEN_ONI THEME->GetMetric ("ScreenSelectDifficultyEX","NextScreenOni") +#define NEXT_SCREEN_BATTLE THEME->GetMetric ("ScreenSelectDifficultyEX","NextScreenBattle") const CString CHOICE_TEXT[ScreenSelectDifficultyEX::NUM_CHOICES_EX] = @@ -54,8 +54,6 @@ float CURSOR_EX_X( int p ) { return DIFFICULTY_X(p) + CURSOR_OFFSET_EX_X(p); } float CURSOR_EX_Y( int p ) { return DIFFICULTY_Y(p) + CURSOR_OFFSET_EX_Y(p); } -const ScreenMessage SM_StartTweeningOffScreen = ScreenMessage(SM_User + 3); -const ScreenMessage SM_StartFadingOut = ScreenMessage(SM_User + 4); ScreenSelectDifficultyEX::ScreenSelectDifficultyEX() @@ -66,19 +64,15 @@ ScreenSelectDifficultyEX::ScreenSelectDifficultyEX() GAMESTATE->m_PlayMode = PLAY_MODE_INVALID; - m_Menu.Load( - THEME->GetPathTo("BGAnimations","select difficulty ex"), - THEME->GetPathTo("Graphics","select difficulty ex top edge"), - HELP_TEXT, true, true, TIMER_SECONDS - ); + m_Menu.Load( "SelectDifficultyEx" ); this->AddChild( &m_Menu ); for( unsigned c=0; cIsPlayerEnabled(c) == true ) { - CString sHeaderFile = ssprintf( "select difficulty ex header %s", CHOICE_TEXT[INITIAL_CHOICE].c_str() ); - CString sPictureFile = ssprintf( "select difficulty ex picture %s", CHOICE_TEXT[INITIAL_CHOICE].c_str() ); + CString sHeaderFile = ssprintf( "SelectDifficultyEx header %s", CHOICE_TEXT[INITIAL_CHOICE].c_str() ); + CString sPictureFile = ssprintf( "SelectDifficultyEx picture %s", CHOICE_TEXT[INITIAL_CHOICE].c_str() ); m_sprPicture[c].Load( THEME->GetPathTo("Graphics",sPictureFile) ); m_sprPicture[c].SetVertAlign( align_top ); @@ -101,14 +95,14 @@ ScreenSelectDifficultyEX::ScreenSelectDifficultyEX() if( !GAMESTATE->IsPlayerEnabled((PlayerNumber)p) ) continue; - m_sprCursor[p].Load( THEME->GetPathTo("Graphics", "select difficulty ex cursor 2x1") ); + m_sprCursor[p].Load( THEME->GetPathTo("Graphics", "SelectDifficultyEx cursor 2x1") ); m_sprCursor[p].SetXY( -1600, -1600 ); m_sprCursor[p].StopAnimating(); m_sprCursor[p].SetState( p ); m_sprCursor[p].EnableShadow( false ); m_framePages.AddChild( &m_sprCursor[p] ); - m_sprOK[p].Load( THEME->GetPathTo("Graphics", "select difficulty ex ok 2x1") ); + m_sprOK[p].Load( THEME->GetPathTo("Graphics", "SelectDifficultyEx ok 2x1") ); m_sprOK[p].SetState( p ); m_sprOK[p].StopAnimating(); m_sprOK[p].SetDiffuse( RageColor(1,1,1,0) ); @@ -117,16 +111,15 @@ ScreenSelectDifficultyEX::ScreenSelectDifficultyEX() this->AddChild( &m_framePages ); - m_soundChange.Load( THEME->GetPathTo("Sounds", "select difficulty change") ); - m_soundSelect.Load( THEME->GetPathTo("Sounds", "menu start") ); + m_soundChange.Load( THEME->GetPathTo("Sounds", "SelectDifficultyEx change") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds", "Common start") ); m_soundDifficult.Load( ANNOUNCER->GetPathTo("select difficulty challenge") ); SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select difficulty intro") ); - m_Menu.TweenOnScreenFromMenu( SM_None ); TweenOnScreen(); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","select difficulty music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","SelectDifficultyEx music") ); m_fLockInputTime = LOCK_INPUT_TIME; } @@ -142,7 +135,7 @@ void ScreenSelectDifficultyEX::Input( const DeviceInput& DeviceI, const InputEve { LOG->Trace( "ScreenSelectDifficultyEX::Input()" ); - if( m_Menu.IsClosing() ) + if( m_Menu.IsTransitioning() ) return; if( m_fLockInputTime > 0 ) @@ -218,13 +211,6 @@ void ScreenSelectDifficultyEX::HandleScreenMessage( const ScreenMessage SM ) default: ASSERT(0); } - break; - case SM_StartTweeningOffScreen: - TweenOffScreen(); - this->SendScreenMessage( SM_StartFadingOut, 0.8f ); - break; - case SM_StartFadingOut: - m_Menu.TweenOffScreenToMenu( SM_GoToNextScreen ); break; } } @@ -410,13 +396,15 @@ void ScreenSelectDifficultyEX::MenuStart( PlayerNumber pn ) // check to see if everyone has chosen + bool bAllChosen = true; for( int p=0; pIsPlayerEnabled((PlayerNumber)p) && m_bChosen[p] == false ) - return; + if( GAMESTATE->IsPlayerEnabled((PlayerNumber)p) ) + bAllChosen &= m_bChosen[p]; } - m_Menu.StopTimer(); - this->SendScreenMessage( SM_StartTweeningOffScreen, 0.7f ); + + if( bAllChosen ) + m_Menu.StartTransitioning( SM_GoToNextScreen ); } void ScreenSelectDifficultyEX::ShowSelected( PlayerNumber pv ) @@ -436,7 +424,7 @@ void ScreenSelectDifficultyEX::ShowSelected( PlayerNumber pv ) void ScreenSelectDifficultyEX::MenuBack( PlayerNumber pn ) { - m_Menu.TweenOffScreenToBlack( SM_GoToPrevScreen, true ); + m_Menu.Back( SM_GoToPrevScreen ); } void ScreenSelectDifficultyEX::TweenOffScreen() diff --git a/stepmania/src/ScreenSelectGame.cpp b/stepmania/src/ScreenSelectGame.cpp index ccfe1342f5..9b9a1d2233 100644 --- a/stepmania/src/ScreenSelectGame.cpp +++ b/stepmania/src/ScreenSelectGame.cpp @@ -34,11 +34,7 @@ OptionRowData g_SelectGameLines[NUM_SELECT_GAME_LINES] = ScreenSelectGame::ScreenSelectGame() : - ScreenOptions( - THEME->GetPathTo("BGAnimations","select game"), - THEME->GetPathTo("Graphics","select game page"), - THEME->GetPathTo("Graphics","select game top edge") - ) + ScreenOptions("ScreenSelectGame",false) { LOG->Trace( "ScreenSelectGame::ScreenSelectGame()" ); @@ -55,14 +51,24 @@ ScreenSelectGame::ScreenSelectGame() : g_SelectGameLines[0].iNumOptions = i; + // fill g_InputOptionsLines with explanation text + for( i=0; iGetMetric("ScreenSelectGame",sLineName) ); + } + + Init( INPUTMODE_BOTH, g_SelectGameLines, NUM_SELECT_GAME_LINES, false ); - m_Menu.StopTimer(); + m_Menu.m_MenuTimer.StopTimer(); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","select game music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenSelectGame music") ); } void ScreenSelectGame::ImportOptions() diff --git a/stepmania/src/ScreenSelectGroup.cpp b/stepmania/src/ScreenSelectGroup.cpp index 5f9a518223..6fc551179c 100644 --- a/stepmania/src/ScreenSelectGroup.cpp +++ b/stepmania/src/ScreenSelectGroup.cpp @@ -42,31 +42,23 @@ #define NEXT_SCREEN THEME->GetMetric("ScreenSelectGroup","NextScreen") -const ScreenMessage SM_StartFadingOut = ScreenMessage(SM_User + 3); - - ScreenSelectGroup::ScreenSelectGroup() -{ - +{ LOG->Trace( "ScreenSelectGroup::ScreenSelectGroup()" ); - m_Menu.Load( - THEME->GetPathTo("BGAnimations","select group") , - THEME->GetPathTo("Graphics","select group top edge"), - HELP_TEXT, true, true, TIMER_SECONDS - ); - this->AddChild( &m_Menu ); - - if(!PREFSMAN->m_bShowSelectGroup) + if( !PREFSMAN->m_bShowSelectGroup ) { GAMESTATE->m_sPreferredGroup = GROUP_ALL_MUSIC; - m_Menu.ImmedOffScreenToMenu(); - m_bChosen = true; - this->SendScreenMessage( SM_GoToNextScreen, 0.f ); + HandleScreenMessage( SM_GoToNextScreen ); return; } + + m_Menu.Load( "ScreenSelectGroup" ); + this->AddChild( &m_Menu ); + + unsigned i; int j; @@ -131,7 +123,7 @@ ScreenSelectGroup::ScreenSelectGroup() m_bChosen = false; - m_sprExplanation.Load( THEME->GetPathTo("Graphics","select group explanation") ); + m_sprExplanation.Load( THEME->GetPathTo("Graphics","ScreenSelectGroup explanation") ); m_sprExplanation.SetXY( EXPLANATION_X, EXPLANATION_Y ); this->AddChild( &m_sprExplanation ); @@ -140,17 +132,17 @@ ScreenSelectGroup::ScreenSelectGroup() m_Banner.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); this->AddChild( &m_Banner ); - m_sprFrame.Load( THEME->GetPathTo("Graphics","select group info frame") ); + m_sprFrame.Load( THEME->GetPathTo("Graphics","ScreenSelectGroup frame") ); m_sprFrame.SetXY( FRAME_X, FRAME_Y ); this->AddChild( &m_sprFrame ); - m_textNumber.LoadFromFont( THEME->GetPathTo("Fonts","select group num songs") ); + m_textNumber.LoadFromNumbers( THEME->GetPathTo("Numbers","ScreenSelectGroup numbers") ); m_textNumber.SetXY( NUMBER_X, NUMBER_Y ); m_textNumber.SetHorizAlign( Actor::align_right ); m_textNumber.EnableShadow( false ); this->AddChild( &m_textNumber ); - m_sprContents.Load( THEME->GetPathTo("Graphics","select group contents header") ); + m_sprContents.Load( THEME->GetPathTo("Graphics","ScreenSelectGroup contents") ); m_sprContents.SetXY( CONTENTS_X, CONTENTS_Y ); this->AddChild( &m_sprContents ); @@ -162,14 +154,13 @@ ScreenSelectGroup::ScreenSelectGroup() this->AddChild( &m_GroupList ); - m_soundChange.Load( THEME->GetPathTo("Sounds","select group change") ); - m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); + m_soundChange.Load( THEME->GetPathTo("Sounds","ScreenSelectGroup change") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","Common start") ); SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select group intro") ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","select group music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenSelectGroup music") ); - m_Menu.TweenOnScreenFromMenu( SM_None ); TweenOnScreen(); AfterChange(); m_GroupList.SetSelection(0); @@ -187,7 +178,7 @@ void ScreenSelectGroup::Input( const DeviceInput& DeviceI, const InputEventType { LOG->Trace( "ScreenSelectGroup::Input()" ); - if( m_Menu.IsClosing() || m_bChosen ) + if( m_Menu.IsTransitioning() ) return; Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); // default input handler @@ -213,9 +204,6 @@ void ScreenSelectGroup::HandleScreenMessage( const ScreenMessage SM ) case SM_GoToNextScreen: SCREENMAN->SetNewScreen( NEXT_SCREEN ); break; - case SM_StartFadingOut: - m_Menu.TweenOffScreenToMenu( SM_GoToNextScreen ); - break; } } @@ -228,16 +216,12 @@ void ScreenSelectGroup::AfterChange() CString sGroupBannerPath; if( sSelectedGroupName == GROUP_ALL_MUSIC ) - sGroupBannerPath = THEME->GetPathTo("Graphics","all music banner"); - else if( SONGMAN->GetGroupBannerPath(sSelectedGroupName) != "" ) - sGroupBannerPath = SONGMAN->GetGroupBannerPath(sSelectedGroupName); - else - sGroupBannerPath = THEME->GetPathTo("Graphics","fallback banner"); + m_Banner.LoadAllMusic(); + else + m_Banner.LoadFromGroup( sSelectedGroupName ); const int iNumSongs = m_MusicList.GetNumSongs(); m_textNumber.SetText( ssprintf("%d", iNumSongs) ); - - m_Banner.LoadFromGroup( sSelectedGroupName ); } @@ -291,14 +275,12 @@ void ScreenSelectGroup::MenuStart( PlayerNumber pn ) TweenOffScreen(); - m_Menu.StopTimer(); - - this->SendScreenMessage( SM_StartFadingOut, 0.8f ); + m_Menu.StartTransitioning( SM_GoToNextScreen ); } void ScreenSelectGroup::MenuBack( PlayerNumber pn ) { - m_Menu.TweenOffScreenToBlack( SM_GoToPrevScreen, true ); + m_Menu.Back( SM_GoToPrevScreen ); } void ScreenSelectGroup::TweenOffScreen() diff --git a/stepmania/src/ScreenSelectMode.cpp b/stepmania/src/ScreenSelectMode.cpp index a06ee4a850..263fb91aff 100644 --- a/stepmania/src/ScreenSelectMode.cpp +++ b/stepmania/src/ScreenSelectMode.cpp @@ -63,7 +63,7 @@ ScreenSelectMode::ScreenSelectMode() /*********** TODO: MAKE THIS WORK FOR ALL GAME STYLES! *************/ - m_ChoiceListFrame.Load( THEME->GetPathTo("Graphics","select mode list frame")); + m_ChoiceListFrame.Load( THEME->GetPathTo("Graphics","ScreenSelectMode list frame")); m_ChoiceListFrame.SetXY( SCROLLING_LIST_X, SCROLLING_LIST_Y); this->AddChild( &m_ChoiceListFrame ); @@ -72,7 +72,7 @@ ScreenSelectMode::ScreenSelectMode() m_ScrollingList.SetNumberVisible( 9 ); this->AddChild( &m_ScrollingList ); - m_ChoiceListHighlight.Load( THEME->GetPathTo("Graphics","select mode list highlight")); + m_ChoiceListHighlight.Load( THEME->GetPathTo("Graphics","ScreenSelectMode list highlight")); m_ChoiceListHighlight.SetXY( CENTER_X, SCROLLING_LIST_Y); this->AddChild( &m_ChoiceListHighlight ); @@ -82,7 +82,7 @@ ScreenSelectMode::ScreenSelectMode() for( int p=0; pGetPathTo("Graphics","select player join frame 1x2") ); + m_sprJoinFrame[p].Load( THEME->GetPathTo("Graphics","ScreenSelectMode join frame 1x2") ); m_sprJoinFrame[p].StopAnimating(); m_sprJoinFrame[p].SetState( p ); m_sprJoinFrame[p].SetXY( JOIN_FRAME_X(p), JOIN_FRAME_Y(p) ); @@ -91,7 +91,7 @@ ScreenSelectMode::ScreenSelectMode() if( GAMESTATE->m_bSideIsJoined[p] ) m_sprJoinFrame[p].SetZoomY( 0 ); - m_sprJoinMessage[p].Load( THEME->GetPathTo("Graphics","select player join message 2x2") ); + m_sprJoinMessage[p].Load( THEME->GetPathTo("Graphics","ScreenSelectMode join message 2x2") ); m_sprJoinMessage[p].StopAnimating(); m_sprJoinMessage[p].SetState( p ); m_sprJoinMessage[p].SetXY( JOIN_MESSAGE_X(p), JOIN_MESSAGE_Y(p) ); @@ -112,19 +112,15 @@ ScreenSelectMode::ScreenSelectMode() } - m_Menu.Load( - THEME->GetPathTo("BGAnimations","select style"), - THEME->GetPathTo("Graphics","select style top edge"), - HELP_TEXT, true, true, TIMER_SECONDS - ); + m_Menu.Load( "ScreenSelectMode" ); this->AddChild( &m_Menu ); - m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); - m_soundChange.Load( THEME->GetPathTo("Sounds","select style change"), true ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","Common start") ); + m_soundChange.Load( THEME->GetPathTo("Sounds","ScreenSelectMode change"), true ); - SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select style intro") ); + SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select mode intro") ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","select style music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenSelectMode music") ); RefreshModeChoices(); @@ -135,7 +131,7 @@ ScreenSelectMode::ScreenSelectMode() for( unsigned i=0; iname; - m_Infotext[i].Load( THEME->GetPathTo("Graphics",ssprintf("select mode infotext %s %s", sGameName.GetString(), sChoiceName.GetString())) ); + m_Infotext[i].Load( THEME->GetPathTo("Graphics",ssprintf("ScreenSelectMode infotext %s %s", sGameName.GetString(), sChoiceName.GetString())) ); m_Infotext[i].SetXY( GUIDE_X, GUIDE_Y ); this->AddChild( &m_Infotext[i] ); m_Infotext[i].SetDiffuse( RageColor(0,0,0,0)); @@ -144,8 +140,6 @@ ScreenSelectMode::ScreenSelectMode() AfterChange(); TweenOnScreen(); - m_Menu.TweenOnScreenFromBlack( SM_None ); - } /************************************ @@ -189,7 +183,7 @@ void ScreenSelectMode::Input( const DeviceInput& DeviceI, const InputEventType t { LOG->Trace( "ScreenSelectMode::Input()" ); - if( m_Menu.IsClosing() ) + if( m_Menu.IsTransitioning() ) return; Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); // default input handler @@ -208,10 +202,8 @@ void ScreenSelectMode::HandleScreenMessage( const ScreenMessage SM ) { case SM_MenuTimer: MenuStart( PLAYER_INVALID ); - m_Menu.StopTimer(); - TweenOffScreen(); - m_Menu.TweenOffScreenToMenu( SM_GoToNextScreen ); + m_Menu.StartTransitioning( SM_GoToNextScreen ); break; case SM_GoToPrevScreen: SOUNDMAN->StopMusic(); @@ -292,7 +284,7 @@ void ScreenSelectMode::MenuBack( PlayerNumber pn ) { SOUNDMAN->StopMusic(); - m_Menu.TweenOffScreenToBlack( SM_GoToPrevScreen, true ); + m_Menu.Back( SM_GoToPrevScreen ); } void ScreenSelectMode::AfterChange() @@ -379,7 +371,7 @@ void ScreenSelectMode::MenuStart( PlayerNumber pn ) m_soundSelect.Play(); TweenOffScreen(); - m_Menu.TweenOffScreenToMenu( SM_GoToNextScreen ); + m_Menu.StartTransitioning( SM_GoToNextScreen ); GAMESTATE->m_bPlayersCanJoin = false; SCREENMAN->RefreshCreditsMessages(); } diff --git a/stepmania/src/ScreenSelectMusic.cpp b/stepmania/src/ScreenSelectMusic.cpp index 1e5b860da0..787b05dda0 100644 --- a/stepmania/src/ScreenSelectMusic.cpp +++ b/stepmania/src/ScreenSelectMusic.cpp @@ -94,11 +94,7 @@ ScreenSelectMusic::ScreenSelectMusic() int p; - m_Menu.Load( - THEME->GetPathTo("BGAnimations","select music"), - THEME->GetPathTo("Graphics","select music top edge"), - HELP_TEXT, true, true, TIMER_SECONDS - ); + m_Menu.Load( "ScreenSelectMusic" ); this->AddChild( &m_Menu ); // these guys get loaded SetSong and TweenToSong @@ -106,7 +102,7 @@ ScreenSelectMusic::ScreenSelectMusic() m_Banner.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); this->AddChild( &m_Banner ); - m_sprBannerFrame.Load( THEME->GetPathTo("Graphics","select music banner frame") ); + m_sprBannerFrame.Load( THEME->GetPathTo("Graphics","ScreenSelectMusic banner frame") ); m_sprBannerFrame.SetXY( BANNER_FRAME_X, BANNER_FRAME_Y ); this->AddChild( &m_sprBannerFrame ); @@ -119,7 +115,7 @@ ScreenSelectMusic::ScreenSelectMusic() m_StageDisplay.Refresh(); this->AddChild( &m_StageDisplay ); - m_sprCDTitle.Load( THEME->GetPathTo("Graphics","fallback cd title") ); + m_sprCDTitle.Load( THEME->GetPathTo("Graphics","ScreenSelectMusic fallback cdtitle") ); m_sprCDTitle.EnableShadow( false ); m_sprCDTitle.SetXY( CD_TITLE_X, CD_TITLE_Y ); this->AddChild( &m_sprCDTitle ); @@ -129,17 +125,17 @@ ScreenSelectMusic::ScreenSelectMusic() if( !GAMESTATE->IsPlayerEnabled(p) ) continue; // skip - m_sprDifficultyFrame[p].Load( THEME->GetPathTo("Graphics","select music difficulty frame 2x1") ); + m_sprDifficultyFrame[p].Load( THEME->GetPathTo("Graphics","ScreenSelectMusic difficulty frame 2x1") ); m_sprDifficultyFrame[p].SetXY( DIFFICULTY_FRAME_X(p), DIFFICULTY_FRAME_Y(p) ); m_sprDifficultyFrame[p].StopAnimating(); m_sprDifficultyFrame[p].SetState( p ); this->AddChild( &m_sprDifficultyFrame[p] ); - m_DifficultyIcon[p].Load( THEME->GetPathTo("graphics","select music difficulty icons 1x5") ); + m_DifficultyIcon[p].Load( THEME->GetPathTo("graphics","ScreenSelectMusic difficulty icons 1x5") ); m_DifficultyIcon[p].SetXY( DIFFICULTY_ICON_X(p), DIFFICULTY_ICON_Y(p) ); this->AddChild( &m_DifficultyIcon[p] ); - m_AutoGenIcon[p].Load( THEME->GetPathTo("graphics","select music autogen icon") ); + m_AutoGenIcon[p].Load( THEME->GetPathTo("graphics","ScreenSelectMusic autogen") ); m_AutoGenIcon[p].SetXY( DIFFICULTY_ICON_X(p), DIFFICULTY_ICON_Y(p) ); this->AddChild( &m_AutoGenIcon[p] ); } @@ -168,15 +164,15 @@ ScreenSelectMusic::ScreenSelectMusic() m_OptionIconRow[p].Refresh( (PlayerNumber)p ); this->AddChild( &m_OptionIconRow[p] ); - m_sprMeterFrame[p].Load( THEME->GetPathTo("Graphics","select music meter frame") ); + m_sprMeterFrame[p].Load( THEME->GetPathTo("Graphics","ScreenSelectMusic meter frame") ); m_sprMeterFrame[p].SetXY( METER_FRAME_X(p), METER_FRAME_Y(p) ); m_sprMeterFrame[p].StopAnimating(); m_sprMeterFrame[p].SetState( p ); this->AddChild( &m_sprMeterFrame[p] ); - m_FootMeter[p].SetXY( METER_X(p), METER_Y(p) ); - m_FootMeter[p].SetShadowLength( 2 ); - this->AddChild( &m_FootMeter[p] ); + m_DifficultyMeter[p].SetXY( METER_X(p), METER_Y(p) ); + m_DifficultyMeter[p].SetShadowLength( 2 ); + this->AddChild( &m_DifficultyMeter[p] ); } m_MusicWheel.SetXY( WHEEL_X, WHEEL_Y ); @@ -187,7 +183,7 @@ ScreenSelectMusic::ScreenSelectMusic() if( !GAMESTATE->IsPlayerEnabled((PlayerNumber)p) ) continue; // skip - m_sprHighScoreFrame[p].Load( THEME->GetPathTo("Graphics","select music score frame 1x2") ); + m_sprHighScoreFrame[p].Load( THEME->GetPathTo("Graphics","ScreenSelectMusic score frame 1x2") ); m_sprHighScoreFrame[p].StopAnimating(); m_sprHighScoreFrame[p].SetState( p ); m_sprHighScoreFrame[p].SetXY( SCORE_X(p), SCORE_Y(p) ); @@ -203,7 +199,7 @@ ScreenSelectMusic::ScreenSelectMusic() m_MusicSortDisplay.Set( GAMESTATE->m_SongSortOrder ); this->AddChild( &m_MusicSortDisplay ); - m_sprMarathonBalloon.Load( THEME->GetPathTo("Graphics","select music marathon balloon") ); + m_sprMarathonBalloon.Load( THEME->GetPathTo("Graphics","ScreenSelectMusic marathon") ); m_sprMarathonBalloon.StopAnimating(); m_sprMarathonBalloon.SetXY( BALLOON_X, BALLOON_Y ); m_sprMarathonBalloon.SetZoomY( 0 ); @@ -211,7 +207,7 @@ ScreenSelectMusic::ScreenSelectMusic() m_sprMarathonBalloon.SetEffectBob( 2, RageVector3(0,10,0) ); this->AddChild( &m_sprMarathonBalloon ); - m_sprLongBalloon.Load( THEME->GetPathTo("Graphics","select music long balloon") ); + m_sprLongBalloon.Load( THEME->GetPathTo("Graphics","ScreenSelectMusic long") ); m_sprLongBalloon.StopAnimating(); m_sprLongBalloon.SetXY( BALLOON_X, BALLOON_Y ); m_sprLongBalloon.SetZoomY( 0 ); @@ -219,7 +215,7 @@ ScreenSelectMusic::ScreenSelectMusic() m_sprLongBalloon.SetEffectBob( 2, RageVector3(0,10,0) ); this->AddChild( &m_sprLongBalloon ); - m_sprOptionsMessage.Load( THEME->GetPathTo("Graphics","select music options message") ); + m_sprOptionsMessage.Load( THEME->GetPathTo("Graphics","ScreenSelectMusic options") ); m_sprOptionsMessage.StopAnimating(); m_sprOptionsMessage.SetXY( CENTER_X, CENTER_Y ); m_sprOptionsMessage.SetZoom( 1 ); @@ -227,10 +223,10 @@ ScreenSelectMusic::ScreenSelectMusic() this->AddChild( &m_sprOptionsMessage ); - m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); - m_soundChangeNotes.Load( THEME->GetPathTo("Sounds","select music notes") ); - m_soundOptionsChange.Load( THEME->GetPathTo("Sounds","select music options") ); - m_soundLocked.Load( THEME->GetPathTo("Sounds","select music locked") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","Common start") ); + m_soundChangeNotes.Load( THEME->GetPathTo("Sounds","ScreenSelectMusic notes") ); + m_soundOptionsChange.Load( THEME->GetPathTo("Sounds","ScreenSelectMusic options") ); + m_soundLocked.Load( THEME->GetPathTo("Sounds","ScreenSelectMusic locked") ); SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select music intro") ); @@ -243,7 +239,6 @@ ScreenSelectMusic::ScreenSelectMusic() AfterMusicChange(); TweenOnScreen(); - m_Menu.TweenOnScreenFromMenu( SM_None ); } @@ -290,7 +285,7 @@ void ScreenSelectMusic::TweenOnScreen() m_DifficultyIcon[p].FadeOn( 0, "foldy", TWEEN_TIME ); m_AutoGenIcon[p].FadeOn( 0, "foldy", TWEEN_TIME ); - m_FootMeter[p].FadeOn( 0, "foldy", TWEEN_TIME ); + m_DifficultyMeter[p].FadeOn( 0, "foldy", TWEEN_TIME ); } m_MusicSortDisplay.FadeOn( 0, "fade", TWEEN_TIME ); @@ -333,7 +328,7 @@ void ScreenSelectMusic::TweenOffScreen() m_DifficultyIcon[p].FadeOff( 0, "foldy", TWEEN_TIME ); m_AutoGenIcon[p].FadeOff( 0, "foldy", TWEEN_TIME ); - m_FootMeter[p].FadeOff( 0, "foldy", TWEEN_TIME ); + m_DifficultyMeter[p].FadeOff( 0, "foldy", TWEEN_TIME ); } m_MusicSortDisplay.FadeOff( 0, "fade", TWEEN_TIME ); @@ -462,11 +457,11 @@ void ScreenSelectMusic::Input( const DeviceInput& DeviceI, InputEventType type, m_bGoToOptions = true; m_sprOptionsMessage.SetState( 1 ); - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","menu start") ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","Common start") ); return; } - if( m_Menu.IsClosing() ) return; // ignore + if( m_Menu.IsTransitioning() ) return; // ignore if( m_bMadeChoice ) return; @@ -613,12 +608,12 @@ void ScreenSelectMusic::HandleScreenMessage( const ScreenMessage SM ) if( m_MusicWheel.IsRouletting() ) { MenuStart(PLAYER_INVALID); - m_Menu.SetTimer( 15 ); + m_Menu.m_MenuTimer.SetTimer( 15 ); } else if( m_MusicWheel.GetSelectedType() != TYPE_SONG ) { m_MusicWheel.StartRoulette(); - m_Menu.SetTimer( 15 ); + m_Menu.m_MenuTimer.SetTimer( 15 ); } else { @@ -739,12 +734,8 @@ void ScreenSelectMusic::MenuStart( PlayerNumber pn ) this->SendScreenMessage( SM_AllowOptionsMenuRepeat, 0.75f ); } - m_Menu.TweenOffScreenToBlack( SM_None, false ); - - m_Menu.StopTimer(); + m_Menu.StartTransitioning( SM_GoToNextScreen ); AdjustOptions(); - - this->SendScreenMessage( SM_GoToNextScreen, 2.5f ); break; } case TYPE_SECTION: @@ -776,7 +767,7 @@ void ScreenSelectMusic::MenuBack( PlayerNumber pn ) { SOUNDMAN->StopMusic(); - m_Menu.TweenOffScreenToBlack( SM_GoToPrevScreen, true ); + m_Menu.Back( SM_GoToPrevScreen ); } void ScreenSelectMusic::AfterNotesChange( PlayerNumber pn ) @@ -809,14 +800,14 @@ void ScreenSelectMusic::AfterNotesChange( PlayerNumber pn ) m_AutoGenIcon[pn].SetEffectNone(); m_AutoGenIcon[pn].SetDiffuse( RageColor(1,1,1,0) ); } - m_FootMeter[pn].SetFromNotes( pNotes ); + m_DifficultyMeter[pn].SetFromNotes( pNotes ); m_GrooveRadar.SetFromNotes( pn, pNotes ); m_MusicWheel.NotesChanged( pn ); } void ScreenSelectMusic::AfterMusicChange() { - m_Menu.StallTimer(); + m_Menu.m_MenuTimer.StallTimer(); Song* pSong = m_MusicWheel.GetSelectedSong(); GAMESTATE->m_pCurSong = pSong; @@ -883,7 +874,7 @@ void ScreenSelectMusic::AfterMusicChange() if( pSong->HasCDTitle() ) m_sprCDTitle.Load( pSong->GetCDTitlePath() ); else - m_sprCDTitle.Load( THEME->GetPathTo("Graphics","fallback cd title") ); + m_sprCDTitle.Load( THEME->GetPathTo("Graphics","ScreenSelectMusic fallback cdtitle") ); for( int p=0; pIsPlayerEnabled( PlayerNumber(p) ) ) @@ -956,7 +947,7 @@ void ScreenSelectMusic::PlayMusicSample() 1.5f); /* fade out for 1.5 seconds */ } // else -// SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","select music music") ); +// SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenSelectMusic music") ); } void ScreenSelectMusic::UpdateOptionsDisplays() diff --git a/stepmania/src/ScreenSelectMusic.h b/stepmania/src/ScreenSelectMusic.h index e254fa0de8..306b536abe 100644 --- a/stepmania/src/ScreenSelectMusic.h +++ b/stepmania/src/ScreenSelectMusic.h @@ -20,7 +20,7 @@ #include "MenuElements.h" #include "GrooveRadar.h" #include "DifficultyIcon.h" -#include "FootMeter.h" +#include "DifficultyMeter.h" #include "OptionIconRow.h" #include "StageDisplay.h" @@ -74,7 +74,7 @@ protected: BitmapText m_textSongOptions; OptionIconRow m_OptionIconRow[NUM_PLAYERS]; Sprite m_sprMeterFrame[NUM_PLAYERS]; - FootMeter m_FootMeter[NUM_PLAYERS]; + DifficultyMeter m_DifficultyMeter[NUM_PLAYERS]; MusicSortDisplay m_MusicSortDisplay; Sprite m_sprHighScoreFrame[NUM_PLAYERS]; ScoreDisplayNormal m_HighScore[NUM_PLAYERS]; diff --git a/stepmania/src/ScreenSelectMaxType1.cpp b/stepmania/src/ScreenSelectStyle.cpp similarity index 59% rename from stepmania/src/ScreenSelectMaxType1.cpp rename to stepmania/src/ScreenSelectStyle.cpp index 90ca8159a3..55ff10eac2 100644 --- a/stepmania/src/ScreenSelectMaxType1.cpp +++ b/stepmania/src/ScreenSelectStyle.cpp @@ -1,7 +1,7 @@ #include "global.h" /* ----------------------------------------------------------------------------- - Class: ScreenSelectMaxType1 + Class: ScreenSelectStyle Desc: See header. @@ -10,7 +10,7 @@ ----------------------------------------------------------------------------- */ -#include "ScreenSelectMaxType1.h" +#include "ScreenSelectStyle.h" #include "GameManager.h" #include "ThemeManager.h" #include "PrefsManager.h" @@ -18,20 +18,24 @@ #include "GameState.h" -#define JOINT_PREMIUM_ON_COMMAND THEME->GetMetric ("ScreenSelectMaxType1","JointPremiumOnCommand") -#define JOINT_PREMIUM_OFF_COMMAND THEME->GetMetric ("ScreenSelectMaxType1","JointPremiumOffCommand") -#define ICON_ON_COMMAND( i ) THEME->GetMetric ("ScreenSelectMaxType1",ssprintf("Icon%dOnCommand",i+1)) -#define ICON_OFF_COMMAND( i ) THEME->GetMetric ("ScreenSelectMaxType1",ssprintf("Icon%dOffCommand",i+1)) -#define DISABLED_COLOR THEME->GetMetricC("ScreenSelectMaxType1","DisabledColor") -#define EXPLANATION_ON_COMMAND THEME->GetMetric ("ScreenSelectMaxType1","ExplanationOnCommand") -#define EXPLANATION_OFF_COMMAND THEME->GetMetric ("ScreenSelectMaxType1","ExplanationOffCommand") -#define INFO_ON_COMMAND THEME->GetMetric ("ScreenSelectMaxType1","InfoOnCommand") -#define INFO_OFF_COMMAND THEME->GetMetric ("ScreenSelectMaxType1","InfoOffCommand") -#define PREVIEW_ON_COMMAND THEME->GetMetric ("ScreenSelectMaxType1","PreviewOnCommand") -#define PREVIEW_OFF_COMMAND THEME->GetMetric ("ScreenSelectMaxType1","PreviewOffCommand") +#define JOINT_PREMIUM_ON_COMMAND THEME->GetMetric ("ScreenSelectStyle","JointPremiumOnCommand") +#define JOINT_PREMIUM_OFF_COMMAND THEME->GetMetric ("ScreenSelectStyle","JointPremiumOffCommand") +#define ICON_ON_COMMAND( i ) THEME->GetMetric ("ScreenSelectStyle",ssprintf("Icon%dOnCommand",i+1)) +#define ICON_OFF_COMMAND( i ) THEME->GetMetric ("ScreenSelectStyle",ssprintf("Icon%dOffCommand",i+1)) +#define ICON_GAIN_FOCUS_COMMAND THEME->GetMetric ("ScreenSelectStyle","IconGainFocusCommand") +#define ICON_LOSE_FOCUS_COMMAND THEME->GetMetric ("ScreenSelectStyle","IconLoseFocusCommand") +#define DISABLED_COLOR THEME->GetMetricC("ScreenSelectStyle","DisabledColor") +#define EXPLANATION_ON_COMMAND THEME->GetMetric ("ScreenSelectStyle","ExplanationOnCommand") +#define EXPLANATION_OFF_COMMAND THEME->GetMetric ("ScreenSelectStyle","ExplanationOffCommand") +#define WARNING_ON_COMMAND THEME->GetMetric ("ScreenSelectStyle","WarningOnCommand") +#define WARNING_OFF_COMMAND THEME->GetMetric ("ScreenSelectStyle","WarningOffCommand") +#define INFO_ON_COMMAND THEME->GetMetric ("ScreenSelectStyle","InfoOnCommand") +#define INFO_OFF_COMMAND THEME->GetMetric ("ScreenSelectStyle","InfoOffCommand") +#define PICTURE_ON_COMMAND THEME->GetMetric ("ScreenSelectStyle","PictureOnCommand") +#define PICTURE_OFF_COMMAND THEME->GetMetric ("ScreenSelectStyle","PictureOffCommand") -ScreenSelectMaxType1::ScreenSelectMaxType1() : ScreenSelect( "ScreenSelectMaxType1" ) +ScreenSelectStyle::ScreenSelectStyle() : ScreenSelect( "ScreenSelectStyle" ) { m_iSelection = 0; @@ -40,13 +44,11 @@ ScreenSelectMaxType1::ScreenSelectMaxType1() : ScreenSelect( "ScreenSelectMaxTyp for( i=0; iGetGameDefForGame(mc.game)->m_szName; - // // Load icon // - CString sIconElementName = ssprintf("ScreenSelectMaxType1 icon %s %s", sGameName.GetString(), mc.name ); + CString sIconElementName = ssprintf("ScreenSelectStyle icon %s", mc.name ); CString sIconPath = THEME->GetPathTo("Graphics",sIconElementName); if( sIconPath.empty() ) // element doesn't exist { @@ -63,23 +65,23 @@ ScreenSelectMaxType1::ScreenSelectMaxType1() : ScreenSelect( "ScreenSelectMaxTyp // - // Load preview + // Load Picture // - CString sPreviewElementName = ssprintf("ScreenSelectMaxType1 preview %s %s", sGameName.GetString(), mc.name ); - CString sPreviewPath = THEME->GetPathTo("Graphics",sPreviewElementName); - if( sPreviewPath != "" ) + CString sPictureElementName = ssprintf("ScreenSelectStyle picture %s", mc.name ); + CString sPicturePath = THEME->GetPathTo("Graphics",sPictureElementName); + if( sPicturePath != "" ) { - m_sprPreview[i].Load( sPreviewPath ); -// m_sprPreview[i].Command( PREVIEW_X, PREVIEW_Y ); - m_sprPreview[i].SetDiffuse( RageColor(1,1,1,0) ); - this->AddChild( &m_sprPreview[i] ); + m_sprPicture[i].Load( sPicturePath ); +// m_sprPicture[i].Command( PREVIEW_X, PREVIEW_Y ); + m_sprPicture[i].SetDiffuse( RageColor(1,1,1,0) ); + this->AddChild( &m_sprPicture[i] ); } // // Load info // - CString sInfoElementName = ssprintf("ScreenSelectMaxType1 info %s %s", sGameName.GetString(), mc.name ); + CString sInfoElementName = ssprintf("ScreenSelectStyle info %s", mc.name ); CString sInfoPath = THEME->GetPathTo("Graphics",sInfoElementName); if( sInfoPath != "" ) { @@ -90,29 +92,33 @@ ScreenSelectMaxType1::ScreenSelectMaxType1() : ScreenSelect( "ScreenSelectMaxTyp } } - // fix Z ordering of Preview and Info so that they draw on top + + m_sprWarning.Load( THEME->GetPathTo("Graphics","ScreenSelectStyle warning") ); + this->AddChild( &m_sprWarning ); + + m_sprExplanation.Load( THEME->GetPathTo("Graphics","ScreenSelectStyle explanation") ); + this->AddChild( &m_sprExplanation ); + + + + // fix Z ordering of Picture and Info so that they draw on top for( i=0; im_aModeChoices.size(); i++ ) - this->MoveToTail( &m_sprPreview[i] ); + this->MoveToTail( &m_sprPicture[i] ); for( i=0; im_aModeChoices.size(); i++ ) this->MoveToTail( &m_sprInfo[i] ); this->UpdateSelectableChoices(); - m_sprExplanation.Load( THEME->GetPathTo("Graphics","ScreenSelectMaxType1 explanation") ); -// m_sprExplanation.SetXY( EXPLANATION_X, EXPLANATION_Y ); - this->AddChild( &m_sprExplanation ); - if( PREFSMAN->m_bJointPremium ) { - m_sprJointPremium.Load( THEME->GetPathTo("Graphics","ScreenSelectMaxType1 joint premium") ); -// m_sprJointPremium.SetXY( JOINT_PREMIUM_BANNER_X, JOINT_PREMIUM_BANNER_Y ); + m_sprJointPremium.Load( THEME->GetPathTo("Graphics","ScreenSelectStyle joint premium") ); this->AddChild( &m_sprJointPremium ); } - m_soundChange.Load( THEME->GetPathTo("Sounds","ScreenSelectMaxType1 change") ); - m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); + m_soundChange.Load( THEME->GetPathTo("Sounds","ScreenSelectStyle change") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","Common start") ); // @@ -124,12 +130,13 @@ ScreenSelectMaxType1::ScreenSelectMaxType1() : ScreenSelect( "ScreenSelectMaxTyp m_sprIcon[i].Command( ICON_ON_COMMAND(i) ); } m_sprExplanation.Command( EXPLANATION_ON_COMMAND ); + m_sprWarning.Command( WARNING_ON_COMMAND ); m_sprJointPremium.Command( JOINT_PREMIUM_ON_COMMAND ); - // let AfterChange tween Preview and Info + // let AfterChange tween Picture and Info } -void ScreenSelectMaxType1::MenuLeft( PlayerNumber pn ) +void ScreenSelectStyle::MenuLeft( PlayerNumber pn ) { int iSwitchToIndex = -1; // -1 means none found for( int i=m_iSelection-1; i>=0; i-- ) @@ -150,7 +157,7 @@ void ScreenSelectMaxType1::MenuLeft( PlayerNumber pn ) AfterChange(); } -void ScreenSelectMaxType1::MenuRight( PlayerNumber pn ) +void ScreenSelectStyle::MenuRight( PlayerNumber pn ) { int iSwitchToIndex = -1; // -1 means none found for( unsigned i=m_iSelection+1; iSendMessageToTopScreen( SM_AllDoneChoosing, 0 ); @@ -192,17 +199,18 @@ void ScreenSelectMaxType1::MenuStart( PlayerNumber pn ) m_textIcon[i].Command( ICON_OFF_COMMAND(i) ); } m_sprExplanation.Command( EXPLANATION_OFF_COMMAND ); - m_sprPreview[m_iSelection].Command( PREVIEW_OFF_COMMAND ); + m_sprWarning.Command( WARNING_OFF_COMMAND ); + m_sprPicture[m_iSelection].Command( PICTURE_OFF_COMMAND ); m_sprInfo[m_iSelection].Command( INFO_OFF_COMMAND ); m_sprJointPremium.Command( JOINT_PREMIUM_OFF_COMMAND ); } -int ScreenSelectMaxType1::GetSelectionIndex( PlayerNumber pn ) +int ScreenSelectStyle::GetSelectionIndex( PlayerNumber pn ) { return m_iSelection; } -void ScreenSelectMaxType1::UpdateSelectableChoices() +void ScreenSelectStyle::UpdateSelectableChoices() { unsigned i; /* If a player joins during the tween-in, this diffuse change @@ -244,27 +252,27 @@ void ScreenSelectMaxType1::UpdateSelectableChoices() AfterChange(); } -void ScreenSelectMaxType1::BeforeChange() +void ScreenSelectStyle::BeforeChange() { // dim/hide old selection - m_sprIcon[m_iSelection].SetEffectNone(); - m_textIcon[m_iSelection].SetEffectNone(); - m_sprPreview[m_iSelection].StopTweening(); + m_sprIcon[m_iSelection].Command( ICON_LOSE_FOCUS_COMMAND ); + m_textIcon[m_iSelection].Command( ICON_LOSE_FOCUS_COMMAND ); + m_sprPicture[m_iSelection].StopTweening(); m_sprInfo[m_iSelection].StopTweening(); - m_sprPreview[m_iSelection].SetDiffuse( RageColor(1,1,1,0) ); + m_sprPicture[m_iSelection].SetDiffuse( RageColor(1,1,1,0) ); m_sprInfo[m_iSelection].SetDiffuse( RageColor(1,1,1,0) ); - m_sprPreview[m_iSelection].SetGlow( RageColor(1,1,1,0) ); + m_sprPicture[m_iSelection].SetGlow( RageColor(1,1,1,0) ); m_sprInfo[m_iSelection].SetGlow( RageColor(1,1,1,0) ); } -void ScreenSelectMaxType1::AfterChange() +void ScreenSelectStyle::AfterChange() { - m_sprIcon[m_iSelection].SetEffectGlowShift(); - m_textIcon[m_iSelection].SetEffectGlowShift(); - m_sprPreview[m_iSelection].SetDiffuse( RageColor(1,1,1,1) ); + m_sprIcon[m_iSelection].Command( ICON_GAIN_FOCUS_COMMAND ); + m_textIcon[m_iSelection].Command( ICON_GAIN_FOCUS_COMMAND ); + m_sprPicture[m_iSelection].SetDiffuse( RageColor(1,1,1,1) ); m_sprInfo[m_iSelection].SetDiffuse( RageColor(1,1,1,1) ); - m_sprPreview[m_iSelection].SetZoom( 1 ); + m_sprPicture[m_iSelection].SetZoom( 1 ); m_sprInfo[m_iSelection].SetZoom( 1 ); - m_sprPreview[m_iSelection].Command( PREVIEW_ON_COMMAND ); + m_sprPicture[m_iSelection].Command( PICTURE_ON_COMMAND ); m_sprInfo[m_iSelection].Command( INFO_ON_COMMAND ); } diff --git a/stepmania/src/ScreenSelectMaxType1.h b/stepmania/src/ScreenSelectStyle.h similarity index 83% rename from stepmania/src/ScreenSelectMaxType1.h rename to stepmania/src/ScreenSelectStyle.h index 6a6302b568..d56b067d53 100644 --- a/stepmania/src/ScreenSelectMaxType1.h +++ b/stepmania/src/ScreenSelectStyle.h @@ -1,8 +1,8 @@ -#ifndef ScreenSelectMaxType1_H -#define ScreenSelectMaxType1_H +#ifndef ScreenSelectStyle_H +#define ScreenSelectStyle_H /* ----------------------------------------------------------------------------- - Class: ScreenSelectMaxType1 + Class: ScreenSelectStyle Desc: @@ -19,10 +19,10 @@ #define MAX_MODE_CHOICES 30 -class ScreenSelectMaxType1 : public ScreenSelect +class ScreenSelectStyle : public ScreenSelect { public: - ScreenSelectMaxType1(); + ScreenSelectStyle(); virtual void MenuLeft( PlayerNumber pn ); virtual void MenuRight( PlayerNumber pn ); @@ -39,9 +39,10 @@ protected: // Artists don't make graphics for every single Game, so // have a text representation if textures are missing. BitmapText m_textIcon[MAX_MODE_CHOICES]; - Sprite m_sprPreview[MAX_MODE_CHOICES]; + Sprite m_sprPicture[MAX_MODE_CHOICES]; Sprite m_sprInfo[MAX_MODE_CHOICES]; Sprite m_sprExplanation; + Sprite m_sprWarning; Sprite m_sprJointPremium; RageSound m_soundChange; diff --git a/stepmania/src/ScreenSelectStyle5th.cpp b/stepmania/src/ScreenSelectStyle5th.cpp index a50f8bdefa..d188724a28 100644 --- a/stepmania/src/ScreenSelectStyle5th.cpp +++ b/stepmania/src/ScreenSelectStyle5th.cpp @@ -28,6 +28,8 @@ #define TIMER_SECONDS THEME->GetMetricI("ScreenSelectStyle5th","TimerSeconds") #define NEXT_SCREEN THEME->GetMetric("ScreenSelectStyle5th","NextScreen") +const int NUM_DANCE_STYLES = 5; + const CString DANCE_STYLES[NUM_DANCE_STYLES] = { "single", "versus", @@ -164,23 +166,18 @@ ScreenSelectStyle5th::ScreenSelectStyle5th() m_textExplanation2.SetHorizAlign( BitmapText::align_left ); this->AddChild( &m_textExplanation2 ); - m_Menu.Load( - THEME->GetPathTo("BGAnimations","select style"), - THEME->GetPathTo("Graphics","select style top edge"), - HELP_TEXT, false, true, TIMER_SECONDS - ); + m_Menu.Load( "ScreenSelectStyle5th" ); this->AddChild( &m_Menu ); - m_soundChange.Load( THEME->GetPathTo("Graphics","select style change") ); - m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); + m_soundChange.Load( THEME->GetPathTo("Graphics","ScreenSelectStyle5th change") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","Common start") ); SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select style intro") ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","select style music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenSelectStyle5th music") ); m_soundChange.PlayRandom(); TweenOnScreen(); - m_Menu.TweenOnScreenFromBlack( SM_None ); } @@ -201,7 +198,7 @@ void ScreenSelectStyle5th::Input( const DeviceInput& DeviceI, const InputEventTy { LOG->Trace( "ScreenSelectStyle5th::Input()" ); - if( m_Menu.IsClosing() ) + if( m_Menu.IsTransitioning() ) return; Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); // default input handler @@ -274,8 +271,8 @@ void ScreenSelectStyle5th::MenuStart( PlayerNumber pn ) CString sCurStyleName = GAMESTATE->GetCurrentStyleDef()->m_szName; sCurStyleName.MakeLower(); - if( -1!=sCurStyleName.Find("single") ) SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select style comment single") ); - else if( -1!=sCurStyleName.Find("versus") ) SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select style comment versus") ); + if( -1!=sCurStyleName.Find("single") ) SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("ScreenSelectStyle5th comment single") ); + else if( -1!=sCurStyleName.Find("versus") ) SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("ScreenSelectStyle5th comment versus") ); else if( -1!=sCurStyleName.Find("double") ) SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select style comment double") ); else if( -1!=sCurStyleName.Find("couple") ) SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select style comment couple") ); else if( -1!=sCurStyleName.Find("solo") ) SOUNDMAN->PlayOnceFromDir( ANNOUNCER->GetPathTo("select style comment solo") ); @@ -283,7 +280,7 @@ void ScreenSelectStyle5th::MenuStart( PlayerNumber pn ) this->ClearMessageQueue(); TweenOffScreen(); - m_Menu.TweenOffScreenToMenu( SM_GoToNextScreen ); + m_Menu.StartTransitioning( SM_GoToNextScreen ); m_soundSelect.PlayRandom(); } @@ -291,7 +288,7 @@ void ScreenSelectStyle5th::MenuBack( PlayerNumber pn ) { SOUNDMAN->StopMusic(); - m_Menu.TweenOffScreenToBlack( SM_GoToPrevScreen, true ); + m_Menu.Back( SM_GoToPrevScreen ); } void ScreenSelectStyle5th::BeforeChange() diff --git a/stepmania/src/ScreenSongOptions.cpp b/stepmania/src/ScreenSongOptions.cpp index 607349f124..ac3d86a6b6 100644 --- a/stepmania/src/ScreenSongOptions.cpp +++ b/stepmania/src/ScreenSongOptions.cpp @@ -43,11 +43,7 @@ OptionRowData g_SongOptionsLines[NUM_SONG_OPTIONS_LINES] = { ScreenSongOptions::ScreenSongOptions() : - ScreenOptions( - THEME->GetPathTo("BGAnimations","song options"), - THEME->GetPathTo("Graphics","song options page"), - THEME->GetPathTo("Graphics","song options top edge") - ) + ScreenOptions("ScreenSongOptions",true) { LOG->Trace( "ScreenSongOptions::ScreenSongOptions()" ); diff --git a/stepmania/src/ScreenSoundOptions.cpp b/stepmania/src/ScreenSoundOptions.cpp index 2716c79e82..1948c694be 100644 --- a/stepmania/src/ScreenSoundOptions.cpp +++ b/stepmania/src/ScreenSoundOptions.cpp @@ -33,9 +33,7 @@ OptionRowData g_SoundOptionsLines[NUM_SOUND_OPTIONS_LINES] = { }; ScreenSoundOptions::ScreenSoundOptions() : - ScreenOptions( THEME->GetPathTo("BGAnimations","sound options"), - THEME->GetPathTo("Graphics","sound options page"), - THEME->GetPathTo("Graphics","sound options top edge") ) + ScreenOptions("ScreenSoundOptions",false) { LOG->Trace( "ScreenSoundOptions::ScreenSoundOptions()" ); @@ -49,9 +47,9 @@ ScreenSoundOptions::ScreenSoundOptions() : } Init( INPUTMODE_BOTH, g_SoundOptionsLines, NUM_SOUND_OPTIONS_LINES, false ); - m_Menu.StopTimer(); + m_Menu.m_MenuTimer.StopTimer(); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","sound options music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenSoundOptions music") ); } void ScreenSoundOptions::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ) diff --git a/stepmania/src/ScreenStage.cpp b/stepmania/src/ScreenStage.cpp index 024d8fbc47..27de9c314f 100644 --- a/stepmania/src/ScreenStage.cpp +++ b/stepmania/src/ScreenStage.cpp @@ -110,14 +110,14 @@ ScreenStage::ScreenStage() int i; for( i=0; i<4; i++ ) { - m_sprNumbers[i].Load( THEME->GetPathTo("Graphics","stage parts 5x3") ); + m_sprNumbers[i].Load( THEME->GetPathTo("Graphics","ScreenStage parts 5x3") ); if( g_StageType != STAGE_TYPE_EZ2 ) // DONT DIFFUSE COLORS FOR EZ2. Coz we actually set the color in the .png m_sprNumbers[i].SetDiffuse( GAMESTATE->GetStageColor() ); m_sprNumbers[i].StopAnimating(); } - m_sprStage.Load( THEME->GetPathTo("Graphics","stage stage") ); // we may load a different graphic into here later + m_sprStage.Load( THEME->GetPathTo("Graphics","ScreenStage stage") ); // we may load a different graphic into here later m_sprStage.SetDiffuse( GAMESTATE->GetStageColor() ); @@ -179,22 +179,22 @@ ScreenStage::ScreenStage() } break; case MODE_FINAL: - m_sprStage.Load( THEME->GetPathTo("Graphics","stage final") ); + m_sprStage.Load( THEME->GetPathTo("Graphics","ScreenStage final") ); break; case MODE_EXTRA1: - m_sprStage.Load( THEME->GetPathTo("Graphics","stage extra1") ); + m_sprStage.Load( THEME->GetPathTo("Graphics","ScreenStage extra1") ); break; case MODE_EXTRA2: - m_sprStage.Load( THEME->GetPathTo("Graphics","stage extra2") ); + m_sprStage.Load( THEME->GetPathTo("Graphics","ScreenStage extra2") ); break; case MODE_NONSTOP: - m_sprStage.Load( THEME->GetPathTo("Graphics","stage nonstop") ); + m_sprStage.Load( THEME->GetPathTo("Graphics","ScreenStage nonstop") ); break; case MODE_ONI: - m_sprStage.Load( THEME->GetPathTo("Graphics","stage oni") ); + m_sprStage.Load( THEME->GetPathTo("Graphics","ScreenStage oni") ); break; case MODE_ENDLESS: - m_sprStage.Load( THEME->GetPathTo("Graphics","stage endless") ); + m_sprStage.Load( THEME->GetPathTo("Graphics","ScreenStage endless") ); break; default: ASSERT(0); @@ -221,7 +221,7 @@ ScreenStage::ScreenStage() m_quadMask.SetZ( 1 ); m_frameStage.SetXY( CENTER_X, fStageOffScreenY ); - m_frameStage.BeginTweening(0.8f, Actor::TWEEN_ACCELERATE ); + m_frameStage.BeginTweening(0.8f, Actor::TWEEN_DECELERATE ); m_frameStage.SetTweenY( CENTER_Y ); this->AddChild( &m_quadMask ); // add quad mask before stage so that it will block out the stage sprites diff --git a/stepmania/src/ScreenTextEntry.cpp b/stepmania/src/ScreenTextEntry.cpp index d7dad8059d..d7c6900b71 100644 --- a/stepmania/src/ScreenTextEntry.cpp +++ b/stepmania/src/ScreenTextEntry.cpp @@ -200,7 +200,7 @@ void ScreenTextEntry::MenuStart( PlayerNumber pn ) m_textAnswer.BeginTweening( 0.2f ); m_textAnswer.SetTweenDiffuse( RageColor(1,1,1,0) ); - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","menu start") ); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","Common start") ); if( m_bCancelled ) { if( m_pOnCancel ) m_pOnCancel(); diff --git a/stepmania/src/ScreenTitleMenu.cpp b/stepmania/src/ScreenTitleMenu.cpp index 740948ef5b..09c1c1fb36 100644 --- a/stepmania/src/ScreenTitleMenu.cpp +++ b/stepmania/src/ScreenTitleMenu.cpp @@ -27,40 +27,53 @@ #include "RageSoundManager.h" -#define HELP_X THEME->GetMetricF("ScreenTitleMenu","HelpX") -#define HELP_Y THEME->GetMetricF("ScreenTitleMenu","HelpY") -#define CHOICES_X THEME->GetMetricF("ScreenTitleMenu","ChoicesX") -#define CHOICES_START_Y THEME->GetMetricF("ScreenTitleMenu","ChoicesStartY") -#define CHOICES_SPACING_Y THEME->GetMetricF("ScreenTitleMenu","ChoicesSpacingY") -#define CHOICES_SHADOW_LENGTH THEME->GetMetricF("ScreenTitleMenu","ChoicesShadowLength") -#define COLOR_NOT_SELECTED THEME->GetMetricC("ScreenTitleMenu","ColorNotSelected") -#define COLOR_SELECTED THEME->GetMetricC("ScreenTitleMenu","ColorSelected") -#define ZOOM_NOT_SELECTED THEME->GetMetricF("ScreenTitleMenu","ZoomNotSelected") -#define ZOOM_SELECTED THEME->GetMetricF("ScreenTitleMenu","ZoomSelected") -#define SECONDS_BETWEEN_COMMENTS THEME->GetMetricF("ScreenTitleMenu","SecondsBetweenComments") -#define SECONDS_BETWEEN_JOINT_PREMIUM_SCROLL THEME->GetMetricF("ScreenTitleMenu","SecondsBetweenJointPremiumScroll") -#define SECONDS_BEFORE_ATTRACT THEME->GetMetricF("ScreenTitleMenu","SecondsBeforeAttract") -#define HELP_TEXT_HOME THEME->GetMetric("ScreenTitleMenu","HelpTextHome") -#define HELP_TEXT_PAY THEME->GetMetric("ScreenTitleMenu","HelpTextPay") -#define HELP_TEXT_FREE THEME->GetMetric("ScreenTitleMenu","HelpTextFree") -#define NEXT_SCREEN THEME->GetMetric("ScreenTitleMenu","NextScreen") +#define HELP_X THEME->GetMetricF("ScreenTitleMenu","HelpX") +#define HELP_Y THEME->GetMetricF("ScreenTitleMenu","HelpY") +#define CHOICES_X THEME->GetMetricF("ScreenTitleMenu","ChoicesX") +#define CHOICES_START_Y THEME->GetMetricF("ScreenTitleMenu","ChoicesStartY") +#define CHOICES_SPACING_Y THEME->GetMetricF("ScreenTitleMenu","ChoicesSpacingY") +#define CHOICES_SHADOW_LENGTH THEME->GetMetricF("ScreenTitleMenu","ChoicesShadowLength") +#define COLOR_NOT_SELECTED THEME->GetMetricC("ScreenTitleMenu","ColorNotSelected") +#define COLOR_SELECTED THEME->GetMetricC("ScreenTitleMenu","ColorSelected") +#define ZOOM_NOT_SELECTED THEME->GetMetricF("ScreenTitleMenu","ZoomNotSelected") +#define ZOOM_SELECTED THEME->GetMetricF("ScreenTitleMenu","ZoomSelected") +#define SECONDS_BETWEEN_COMMENTS THEME->GetMetricF("ScreenTitleMenu","SecondsBetweenComments") +#define SECONDS_BEFORE_ATTRACT THEME->GetMetricF("ScreenTitleMenu","SecondsBeforeAttract") +#define HELP_TEXT_HOME THEME->GetMetric("ScreenTitleMenu","HelpTextHome") +#define HELP_TEXT_PAY THEME->GetMetric("ScreenTitleMenu","HelpTextPay") +#define HELP_TEXT_FREE THEME->GetMetric("ScreenTitleMenu","HelpTextFree") +#define NEXT_SCREEN THEME->GetMetric("ScreenTitleMenu","NextScreen") const ScreenMessage SM_PlayComment = ScreenMessage(SM_User+1); const ScreenMessage SM_GoToAttractLoop = ScreenMessage(SM_User+13); -const ScreenMessage SM_ScrollJointPremium = ScreenMessage(SM_User+14); ScreenTitleMenu::ScreenTitleMenu() { LOG->Trace( "ScreenTitleMenu::ScreenTitleMenu()" ); - if( PREFSMAN->m_bJointPremium ) - { - m_sprJointPremiumMsg.Load( THEME->GetPathTo("Graphics","title menu joint premium") ); - this->AddChild( &m_sprJointPremiumMsg ); - m_sprJointPremiumMsg.SetX( SCREEN_RIGHT+m_sprJointPremiumMsg.GetUnzoomedWidth()/2 ); - m_sprJointPremiumMsg.SetY( SCREEN_BOTTOM/2 ); + if( PREFSMAN->m_CoinMode!=PrefsManager::COIN_HOME && PREFSMAN->m_bJointPremium ) + { + m_JointPremium.LoadFromAniDir( THEME->GetPathTo("BGAnimations","ScreenTitleMenu joint premium") ); + this->AddChild( &m_JointPremium ); } + switch( PREFSMAN->m_CoinMode ) + { + case PrefsManager::COIN_HOME: + // do nothing + break; + case PrefsManager::COIN_PAY: + m_CoinMode.LoadFromAniDir( THEME->GetPathTo("BGAnimations","ScreenTitleMenu pay") ); + this->AddChild( &m_CoinMode ); + break; + case PrefsManager::COIN_FREE: + m_CoinMode.LoadFromAniDir( THEME->GetPathTo("BGAnimations","ScreenTitleMenu free") ); + this->AddChild( &m_CoinMode ); + break; + default: + ASSERT(0); + } + m_textHelp.LoadFromFont( THEME->GetPathTo("Fonts","help") ); CString sHelpText; switch( PREFSMAN->m_CoinMode ) @@ -105,9 +118,9 @@ ScreenTitleMenu::ScreenTitleMenu() m_soundAttract.Load( ANNOUNCER->GetPathTo("title menu attract") ); - m_soundChange.Load( THEME->GetPathTo("Sounds","title menu change") ); - m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); - m_soundInvalid.Load( THEME->GetPathTo("Sounds","menu invalid") ); + m_soundChange.Load( THEME->GetPathTo("Sounds","ScreenTitleMenu change") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","Common start") ); + m_soundInvalid.Load( THEME->GetPathTo("Sounds","Common invalid") ); m_Choice = CHOICE_GAME_START; @@ -115,12 +128,12 @@ ScreenTitleMenu::ScreenTitleMenu() LoseFocus( i ); GainFocus( m_Choice ); - SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","title menu music") ); + SOUNDMAN->PlayMusic( THEME->GetPathTo("Sounds","ScreenTitleMenu music") ); this->SendScreenMessage( SM_PlayComment, SECONDS_BETWEEN_COMMENTS); - this->MoveToTail( &(ScreenAttract::m_Fade) ); // put it in the back so it covers up the stuff we just added - this->SendScreenMessage( SM_ScrollJointPremium, 1); + this->MoveToTail( &m_In ); // put it in the back so it covers up the stuff we just added + this->MoveToTail( &m_Out ); // put it in the back so it covers up the stuff we just added } ScreenTitleMenu::~ScreenTitleMenu() @@ -135,133 +148,132 @@ void ScreenTitleMenu::Input( const DeviceInput& DeviceI, const InputEventType ty if( type != IET_FIRST_PRESS ) return; - if( DeviceI.device == DEVICE_KEYBOARD && DeviceI.button == SDLK_F3 ) + + /* If the CoinMode was changed, we need to reload this screen + * so that the right choices will show */ + if( ScreenAttract::ChangeCoinModeInput( DeviceI, type, GameI, MenuI, StyleI ) ) { - /* Coin mode changed.. since this effects how this screen appears, JUST the - screen is just reloaded, not a reset as was before -- Miryokuteki */ - (int&)PREFSMAN->m_CoinMode = (PREFSMAN->m_CoinMode+1) % PrefsManager::NUM_COIN_MODES; - CString sMessage = "Coin Mode: "; - switch( PREFSMAN->m_CoinMode ) - { - case PrefsManager::COIN_HOME: sMessage += "HOME"; break; - case PrefsManager::COIN_PAY: sMessage += "PAY"; break; - case PrefsManager::COIN_FREE: sMessage += "FREE"; break; - } - SCREENMAN->SystemMessage( sMessage ); - SCREENMAN->RefreshCreditsMessages(); - SCREENMAN->SetNewScreen("ScreenTitleMenu"); - return; + SCREENMAN->SetNewScreen( "ScreenTitleMenu" ); } if( !MenuI.IsValid() ) return; - if( PREFSMAN->m_CoinMode==PrefsManager::COIN_HOME && m_Fade.IsClosing() ) - return; - - switch( MenuI.button ) + switch( PREFSMAN->m_CoinMode ) { - case MENU_BUTTON_UP: - switch( PREFSMAN->m_CoinMode ) + case PrefsManager::COIN_HOME: + switch( MenuI.button ) { - case PrefsManager::COIN_HOME: + case MENU_BUTTON_UP: + if( m_In.IsTransitioning() || m_Out.IsTransitioning() ) + break; TimeToDemonstration.GetDeltaTime(); /* Reset the demonstration timer when a key is pressed. */ LoseFocus( m_Choice ); if( m_Choice == 0 ) // wrap around m_Choice = (Choice)((int)NUM_CHOICES); m_Choice = Choice( m_Choice-1 ); - m_soundChange.PlayRandom(); + m_soundChange.Play(); GainFocus( m_Choice ); break; - case PrefsManager::COIN_PAY: - case PrefsManager::COIN_FREE: - return; // ignore - default: - ASSERT(0); - } - break; - case MENU_BUTTON_DOWN: - switch( PREFSMAN->m_CoinMode ) - { - case PrefsManager::COIN_HOME: + case MENU_BUTTON_DOWN: + if( m_In.IsTransitioning() || m_Out.IsTransitioning() ) + break; TimeToDemonstration.GetDeltaTime(); /* Reset the demonstration timer when a key is pressed. */ LoseFocus( m_Choice ); if( m_Choice == (int)ScreenTitleMenu::NUM_CHOICES-1 ) m_Choice = (Choice)-1; // wrap around m_Choice = Choice( m_Choice+1 ); - m_soundChange.PlayRandom(); + m_soundChange.Play(); GainFocus( m_Choice ); break; - case PrefsManager::COIN_PAY: - case PrefsManager::COIN_FREE: - return; // ignore - } - break; - case MENU_BUTTON_BACK: - m_Fade.CloseWipingRight( SM_GoToAttractLoop ); - break; - case MENU_BUTTON_START: - /* If this side is already in, don't re-join (and re-pay!). */ - if(GAMESTATE->m_bSideIsJoined[MenuI.player]) + case MENU_BUTTON_BACK: + if( m_In.IsTransitioning() || m_Out.IsTransitioning() ) + break; + m_Out.StartTransitioning( SM_GoToAttractLoop ); break; - - switch( PREFSMAN->m_CoinMode ) - { - case PrefsManager::COIN_PAY: - if( GAMESTATE->m_iCoins < PREFSMAN->m_iCoinsPerCredit ) - break; // not enough coins - else - GAMESTATE->m_iCoins -= PREFSMAN->m_iCoinsPerCredit; - SCREENMAN->RefreshCreditsMessages(); - // fall through - case PrefsManager::COIN_HOME: - case PrefsManager::COIN_FREE: - GAMESTATE->m_bSideIsJoined[MenuI.player] = true; - GAMESTATE->m_MasterPlayerNumber = MenuI.player; - GAMESTATE->m_bPlayersCanJoin = false; - + case MENU_BUTTON_START: + if( m_In.IsTransitioning() ) + break; + /* break if the choice is invalid */ switch( m_Choice ) { case CHOICE_GAME_START: case CHOICE_SELECT_GAME: - /* At request, moved this into the options/operator menu -- Miryokuteki */ - //case CHOICE_MAP_KEY_JOY: case CHOICE_OPTIONS: #ifdef DEBUG case CHOICE_SANDBOX: #endif - m_soundSelect.PlayRandom(); - m_Fade.CloseWipingRight( SM_GoToNextScreen ); - break; case CHOICE_JUKEBOX: case CHOICE_EDIT: if( SONGMAN->GetNumSongs() == 0 ) { - m_soundInvalid.PlayRandom(); + m_soundInvalid.Play(); SCREENMAN->SystemMessage( "No songs are installed" ); - } - else - { - m_soundSelect.PlayRandom(); - m_Fade.CloseWipingRight( SM_GoToNextScreen ); + break; } break; case CHOICE_EXIT: - m_soundSelect.PlayRandom(); ExitGame(); LOG->Trace("CHOICE_EXIT: shutting down"); return; default: ASSERT(0); } - break; - default: - ASSERT(0); + + /* If this side is already in, don't re-join (and re-pay!). */ + if(GAMESTATE->m_bSideIsJoined[MenuI.player]) + break; + + GAMESTATE->m_bSideIsJoined[MenuI.player] = true; + if( GAMESTATE->m_MasterPlayerNumber == PLAYER_INVALID ) + GAMESTATE->m_MasterPlayerNumber = MenuI.player; + + SCREENMAN->RefreshCreditsMessages(); + + m_soundSelect.Play(); + + if( m_In.IsTransitioning() || m_Out.IsTransitioning() ) + break; + m_Out.StartTransitioning( SM_GoToNextScreen ); + } + break; + case PrefsManager::COIN_PAY: + case PrefsManager::COIN_FREE: + switch( MenuI.button ) + { + case MENU_BUTTON_BACK: + m_Out.StartTransitioning( SM_GoToAttractLoop ); + break; + case MENU_BUTTON_START: + /* If this side is already in, don't re-join (and re-pay!). */ + if(GAMESTATE->m_bSideIsJoined[MenuI.player]) + break; + + /* subtract coins */ + if( PREFSMAN->m_CoinMode == PrefsManager::COIN_PAY ) + if( GAMESTATE->m_iCoins < PREFSMAN->m_iCoinsPerCredit ) + break; // not enough coins + else + GAMESTATE->m_iCoins -= PREFSMAN->m_iCoinsPerCredit; + + GAMESTATE->m_bSideIsJoined[MenuI.player] = true; + if( GAMESTATE->m_MasterPlayerNumber == PLAYER_INVALID ) + GAMESTATE->m_MasterPlayerNumber = MenuI.player; + + SCREENMAN->RefreshCreditsMessages(); + + m_soundSelect.Play(); + + if( m_In.IsTransitioning() || m_Out.IsTransitioning() ) + break; + m_Out.StartTransitioning( SM_GoToNextScreen ); + break; } break; } + - Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); +// Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); } void ScreenTitleMenu::Update( float fDelta ) @@ -271,11 +283,6 @@ void ScreenTitleMenu::Update( float fDelta ) this->SendScreenMessage( SM_GoToAttractLoop, 0 ); TimeToDemonstration.GetDeltaTime(); } - if( PREFSMAN->m_bJointPremium && TimeToJPScroll.PeekDeltaTime() >= SECONDS_BETWEEN_JOINT_PREMIUM_SCROLL ) - { - this->SendScreenMessage( SM_ScrollJointPremium, 0 ); - TimeToJPScroll.GetDeltaTime(); - } Screen::Update(fDelta); } @@ -284,19 +291,6 @@ void ScreenTitleMenu::HandleScreenMessage( const ScreenMessage SM ) { switch( SM ) { - case SM_ScrollJointPremium: - if( PREFSMAN->m_bJointPremium ) - { - m_sprJointPremiumMsg.StopTweening(); - m_sprJointPremiumMsg.SetDiffuse( RageColor(1,1,1,1) ); - - m_sprJointPremiumMsg.SetX( SCREEN_RIGHT+m_sprJointPremiumMsg.GetUnzoomedWidth()/2 ); - m_sprJointPremiumMsg.SetY( SCREEN_BOTTOM/2 ); - - m_sprJointPremiumMsg.BeginTweening( 13.0f, Actor::TWEEN_ACCELERATE ); // slide on - m_sprJointPremiumMsg.SetTweenX( SCREEN_LEFT-m_sprJointPremiumMsg.GetUnzoomedWidth()*2 ); - } - break; case SM_PlayComment: m_soundAttract.PlayRandom(); this->SendScreenMessage( SM_PlayComment, SECONDS_BETWEEN_COMMENTS ); diff --git a/stepmania/src/ScreenTitleMenu.h b/stepmania/src/ScreenTitleMenu.h index e8c3cbcf83..5cde7892d6 100644 --- a/stepmania/src/ScreenTitleMenu.h +++ b/stepmania/src/ScreenTitleMenu.h @@ -13,9 +13,10 @@ #include "Sprite.h" #include "BitmapText.h" #include "TransitionFade.h" -#include "RandomSample.h" +#include "RageSound.h" #include "BGAnimation.h" #include "RageTimer.h" +#include "RandomSample.h" class ScreenTitleMenu : public ScreenLogo @@ -72,15 +73,15 @@ private: BitmapText m_textHelp; BitmapText m_textChoice[NUM_CHOICES]; - Sprite m_sprJointPremiumMsg; - RandomSample m_soundAttract; - RandomSample m_soundChange; - RandomSample m_soundSelect; - RandomSample m_soundInvalid; + RageSound m_soundChange; + RageSound m_soundSelect; + RageSound m_soundInvalid; RageTimer TimeToDemonstration; - RageTimer TimeToJPScroll; + + BGAnimation m_CoinMode; + BGAnimation m_JointPremium; }; diff --git a/stepmania/src/ScreenUnlock.h b/stepmania/src/ScreenUnlock.h index 17e8d7ddd1..8a3012943e 100644 --- a/stepmania/src/ScreenUnlock.h +++ b/stepmania/src/ScreenUnlock.h @@ -15,7 +15,7 @@ class ScreenUnlock : public ScreenAttract { public: - ScreenUnlock() : ScreenAttract("ScreenUnlock","unlock") { }; + ScreenUnlock() : ScreenAttract("ScreenUnlock") { }; }; diff --git a/stepmania/src/ScreenWarning.h b/stepmania/src/ScreenWarning.h index 64f26a6d5b..2513e669f5 100644 --- a/stepmania/src/ScreenWarning.h +++ b/stepmania/src/ScreenWarning.h @@ -15,7 +15,7 @@ class ScreenWarning : public ScreenAttract { public: - ScreenWarning() : ScreenAttract("ScreenWarning","warning") {}; + ScreenWarning() : ScreenAttract("ScreenWarning") {}; }; diff --git a/stepmania/src/ScrollBar.cpp b/stepmania/src/ScrollBar.cpp index cbd7ec01df..a5489f56d6 100644 --- a/stepmania/src/ScrollBar.cpp +++ b/stepmania/src/ScrollBar.cpp @@ -19,25 +19,25 @@ ScrollBar::ScrollBar() { - m_sprBackground.Load( THEME->GetPathTo("Graphics","select music scrollbar parts 1x3") ); + m_sprBackground.Load( THEME->GetPathTo("Graphics","ScrollBar parts 1x3") ); m_sprBackground.StopAnimating(); m_sprBackground.SetState( 1 ); this->AddChild( &m_sprBackground ); - m_sprScrollThumbPart1.Load( THEME->GetPathTo("Graphics","select music scrollbar thumb") ); + m_sprScrollThumbPart1.Load( THEME->GetPathTo("Graphics","ScrollBar thumb") ); m_sprScrollThumbPart1.StopAnimating(); this->AddChild( &m_sprScrollThumbPart1 ); - m_sprScrollThumbPart2.Load( THEME->GetPathTo("Graphics","select music scrollbar thumb") ); + m_sprScrollThumbPart2.Load( THEME->GetPathTo("Graphics","ScrollBar thumb") ); m_sprScrollThumbPart2.StopAnimating(); this->AddChild( &m_sprScrollThumbPart2 ); - m_sprTopButton.Load( THEME->GetPathTo("Graphics","select music scrollbar parts 1x3") ); + m_sprTopButton.Load( THEME->GetPathTo("Graphics","ScrollBar parts 1x3") ); m_sprTopButton.StopAnimating(); m_sprTopButton.SetState( 0 ); this->AddChild( &m_sprTopButton ); - m_sprBottomButton.Load( THEME->GetPathTo("Graphics","select music scrollbar parts 1x3") ); + m_sprBottomButton.Load( THEME->GetPathTo("Graphics","ScrollBar parts 1x3") ); m_sprBottomButton.StopAnimating(); m_sprBottomButton.SetState( 2 ); this->AddChild( &m_sprBottomButton ); diff --git a/stepmania/src/SmallGradeDisplay.cpp b/stepmania/src/SmallGradeDisplay.cpp index faf695094a..9f4b595e56 100644 --- a/stepmania/src/SmallGradeDisplay.cpp +++ b/stepmania/src/SmallGradeDisplay.cpp @@ -25,7 +25,7 @@ const float GRADES_TO_SCROLL = NUM_GRADE_FRAMES*4; SmallGradeDisplay::SmallGradeDisplay() { - Load( THEME->GetPathTo("Graphics","select music small grades 2x9") ); + Load( THEME->GetPathTo("Graphics","SmallGradeDisplay grades 2x9") ); StopAnimating(); SetGrade( PLAYER_1, GRADE_NO_DATA ); diff --git a/stepmania/src/SnapDisplay.cpp b/stepmania/src/SnapDisplay.cpp index 1009532208..4cf5ef1eb8 100644 --- a/stepmania/src/SnapDisplay.cpp +++ b/stepmania/src/SnapDisplay.cpp @@ -25,7 +25,7 @@ SnapDisplay::SnapDisplay() int i; for( i=0; i<2; i++ ) { - m_sprIndicators[i].Load( THEME->GetPathTo("Graphics","edit snap indicator") ); + m_sprIndicators[i].Load( THEME->GetPathTo("Graphics","SnapDisplay icon 6x1") ); ASSERT( m_sprIndicators[i].GetNumStates() == NUM_NOTE_TYPES ); m_sprIndicators[i].StopAnimating(); this->AddChild( &m_sprIndicators[i] ); diff --git a/stepmania/src/StepMania.cpp b/stepmania/src/StepMania.cpp index 05ea6ea5b9..7d52754eb0 100644 --- a/stepmania/src/StepMania.cpp +++ b/stepmania/src/StepMania.cpp @@ -326,18 +326,14 @@ int main(int argc, char* argv[]) ResetGame(); if( DISPLAY->IsSoftwareRenderer() && !PREFSMAN->m_bAllowSoftwareRenderer ) - SCREENMAN->Prompt( - SM_None, - "OpenGL hardware acceleration\n" - "was not detected.\n\n" - "StepMania will use the Microsoft\n" - "software OpenGL renderer.\n" - "However, the game is not playable\n" - "with this software renderer.\n" - "Please install the latest video\n" - "driver from your graphics card vendor\n" - "to enable OpenGL hardware acceleration." - ); + RageException::Throw( + "OpenGL hardware acceleration is not available on your system.\n\n" + "StepMania requires OpenGL hardware acceleration.\n\n" + "Please install the latest video driver from your graphics card vendor " + "to enable OpenGL hardware acceleration.\n\n" + "NO NOT FILE THIS ERROR AS A BUG!\n\n" + "(Advanced: To allow use of the software renderer, set 'AllowSoftwareRenderer=1' " + "in StepMania.ini)" ); /* Run the main loop. */ GameLoop(); @@ -389,10 +385,13 @@ int main(int argc, char* argv[]) * the key should be sent on to screens. */ bool HandleGlobalInputs( DeviceInput DeviceI, InputEventType type, GameInput GameI, MenuInput MenuI, StyleInput StyleI ) { + /* None of the globals keys act on types other than FIRST_PRESS */ + if( type == IET_FIRST_PRESS ) + return false; + switch( MenuI.button ) { case MENU_BUTTON_OPERATOR: - if( type == IET_FIRST_PRESS ) return true; /* Global operator key, to get quick access to the options menu. Don't * do this if we're on a "system menu", which includes the editor @@ -406,28 +405,16 @@ bool HandleGlobalInputs( DeviceInput DeviceI, InputEventType type, GameInput Gam case MENU_BUTTON_COIN: /* Handle a coin insertion. */ - if( GAMESTATE->m_bEditing ) + if( GAMESTATE->m_bEditing ) // no coins while editing break; - if( type == IET_FIRST_PRESS ) return true; - - switch( PREFSMAN->m_CoinMode ) - { - case PrefsManager::COIN_FREE: // fall through - case PrefsManager::COIN_HOME: // fall through - case PrefsManager::COIN_PAY: - GAMESTATE->m_iCoins++; - SCREENMAN->RefreshCreditsMessages(); - SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","insert coin") ); - return true; - default: - ASSERT(0); - return true; - } + GAMESTATE->m_iCoins++; + SCREENMAN->RefreshCreditsMessages(); + SOUNDMAN->PlayOnce( THEME->GetPathTo("Sounds","Common coin") ); + return false; // Attract need to know because they go to TitleMenu on > 1 credit } if(DeviceI == DeviceInput(DEVICE_KEYBOARD, SDLK_F4)) { - if(type != IET_FIRST_PRESS) return true; if( INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, SDLK_RALT)) || INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, SDLK_LALT)) ) { @@ -449,8 +436,6 @@ bool HandleGlobalInputs( DeviceInput DeviceI, InputEventType type, GameInput Gam if(DeviceI == DeviceInput(DEVICE_KEYBOARD, SDLK_F5)) // F5 conflicts with editor and AutoSync { - if(type != IET_FIRST_PRESS) return true; - // pressed F6. Save Screenshot. CString sPath; for( int i=0; i<1000; i++ ) @@ -469,7 +454,6 @@ bool HandleGlobalInputs( DeviceInput DeviceI, InputEventType type, GameInput Gam if( INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, SDLK_RALT)) || INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, SDLK_LALT)) ) { - if(type != IET_FIRST_PRESS) return true; /* alt-enter */ PREFSMAN->m_bWindowed = !PREFSMAN->m_bWindowed; ApplyGraphicOptions(); diff --git a/stepmania/src/StepMania.dsp b/stepmania/src/StepMania.dsp index 24a7713e76..3fb4a56bc3 100644 --- a/stepmania/src/StepMania.dsp +++ b/stepmania/src/StepMania.dsp @@ -1052,6 +1052,14 @@ SOURCE=.\DifficultyIcon.h # End Source File # Begin Source File +SOURCE=.\DifficultyMeter.cpp +# End Source File +# Begin Source File + +SOURCE=.\DifficultyMeter.h +# End Source File +# Begin Source File + SOURCE=.\DifficultyRating.cpp # End Source File # Begin Source File @@ -1076,14 +1084,6 @@ SOURCE=.\FadingBanner.h # End Source File # Begin Source File -SOURCE=.\FootMeter.cpp -# End Source File -# Begin Source File - -SOURCE=.\FootMeter.h -# End Source File -# Begin Source File - SOURCE=.\GradeDisplay.cpp # End Source File # Begin Source File @@ -1156,14 +1156,6 @@ SOURCE=.\MusicSortDisplay.h # End Source File # Begin Source File -SOURCE=.\MusicStatusDisplay.cpp -# End Source File -# Begin Source File - -SOURCE=.\MusicStatusDisplay.h -# End Source File -# Begin Source File - SOURCE=.\MusicWheel.cpp # End Source File # Begin Source File @@ -1258,6 +1250,14 @@ SOURCE=.\TipDisplay.cpp SOURCE=.\TipDisplay.h # End Source File +# Begin Source File + +SOURCE=.\WheelNotifyIcon.cpp +# End Source File +# Begin Source File + +SOURCE=.\WheelNotifyIcon.h +# End Source File # End Group # Begin Group "Actors used in Gameplay" @@ -1797,6 +1797,22 @@ SOURCE=.\ScreenSelectCourse.h # End Source File # Begin Source File +SOURCE=.\ScreenSelectDifficulty.cpp +# End Source File +# Begin Source File + +SOURCE=.\ScreenSelectDifficulty.h +# End Source File +# Begin Source File + +SOURCE=.\ScreenSelectDifficultyEX.cpp +# End Source File +# Begin Source File + +SOURCE=.\ScreenSelectDifficultyEX.h +# End Source File +# Begin Source File + SOURCE=.\ScreenSelectGame.cpp # End Source File # Begin Source File @@ -1813,30 +1829,6 @@ SOURCE=.\ScreenSelectGroup.h # End Source File # Begin Source File -SOURCE=.\ScreenSelectMaxType1.cpp -# End Source File -# Begin Source File - -SOURCE=.\ScreenSelectMaxType1.h -# End Source File -# Begin Source File - -SOURCE=.\ScreenSelectMaxType2.cpp -# End Source File -# Begin Source File - -SOURCE=.\ScreenSelectMaxType2.h -# End Source File -# Begin Source File - -SOURCE=.\ScreenSelectMaxType2EX.cpp -# End Source File -# Begin Source File - -SOURCE=.\ScreenSelectMaxType2EX.h -# End Source File -# Begin Source File - SOURCE=.\ScreenSelectMode.cpp # End Source File # Begin Source File @@ -1853,6 +1845,14 @@ SOURCE=.\ScreenSelectMusic.h # End Source File # Begin Source File +SOURCE=.\ScreenSelectStyle.cpp +# End Source File +# Begin Source File + +SOURCE=.\ScreenSelectStyle.h +# End Source File +# Begin Source File + SOURCE=.\ScreenSelectStyle5th.cpp # End Source File # Begin Source File diff --git a/stepmania/src/StepMania.vcproj b/stepmania/src/StepMania.vcproj index bf39411e41..8438fc465d 100644 --- a/stepmania/src/StepMania.vcproj +++ b/stepmania/src/StepMania.vcproj @@ -387,6 +387,12 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ + + + + @@ -405,18 +411,6 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ - - - - - - - - @@ -429,6 +423,12 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ + + + + diff --git a/stepmania/src/Style.h b/stepmania/src/Style.h index 91eca29e2f..d77e29b546 100644 --- a/stepmania/src/Style.h +++ b/stepmania/src/Style.h @@ -36,29 +36,5 @@ enum Style STYLE_INVALID, }; -const int NUM_DANCE_STYLES = 6; -const int NUM_PUMP_STYLES = 5; -const int NUM_EZ2_STYLES = 5; -const int NUM_PARA_STYLES = 1; -const int NUM_DS3DDX_STYLES = 1; -const int NUM_BM_STYLES = 1; - -// Ugh. This is needed for the style icon. -// TODO: Find a more elegant way to handle this -inline int GetStyleIndexRelativeToGame( int iGameIndex, Style style ) -{ - int iStyleIndex = style; - switch( iGameIndex ) - { - case 0: break; // dance - case 1: iStyleIndex -= NUM_DANCE_STYLES; break; // pump - case 2: iStyleIndex -= NUM_DANCE_STYLES+NUM_PUMP_STYLES; break; // ez2 - case 3: iStyleIndex -= NUM_DANCE_STYLES+NUM_PUMP_STYLES+NUM_EZ2_STYLES; break; // para - case 4: iStyleIndex -= NUM_DANCE_STYLES+NUM_PUMP_STYLES+NUM_EZ2_STYLES+NUM_PARA_STYLES; break; // ds3ddx - case 5: iStyleIndex -= NUM_DANCE_STYLES+NUM_PUMP_STYLES+NUM_EZ2_STYLES+NUM_PARA_STYLES+NUM_DS3DDX_STYLES; break; // bm - default: ASSERT(0); // invalid game index - } - return iStyleIndex; -} #endif diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index f455cc0728..c06f028170 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -151,7 +151,7 @@ try_element_again: #if defined(WIN32) // XXX arch? if( DISPLAY->IsWindowed() ) - if( MessageBox(NULL, message.GetString(), "ThemeManager", MB_RETRYCANCEL ) == IDRETRY) + if( MessageBox(NULL, message, "ThemeManager", MB_RETRYCANCEL ) == IDRETRY) goto try_element_again; #endif RageException::Throw( "%s", message.GetString() ); @@ -233,7 +233,7 @@ try_element_again: return ret; #if defined(DEBUG) && defined(WIN32) - CString sMessage = ssprintf("The theme element %s/%s is missing.",sAssetCategory.GetString(),sFileName.GetString()); + CString sMessage = ssprintf("The theme element '%s/%s' is missing.",sAssetCategory.GetString(),sFileName.GetString()); switch( MessageBox(NULL, sMessage, "ThemeManager", MB_RETRYCANCEL ) ) { case IDRETRY: @@ -301,7 +301,7 @@ try_metric_again: } #if defined(DEBUG) && defined(WIN32) - if( IDRETRY == MessageBox(NULL,ssprintf("The theme metric %s-%s is missing. Correct this and click Retry, or Cancel to break.",sClassName.GetString(),sValueName.GetString()),"ThemeManager",MB_RETRYCANCEL ) ) + if( IDRETRY == MessageBox(NULL,ssprintf("The theme metric '%s-%s' is missing. Correct this and click Retry, or Cancel to break.",sClassName.GetString(),sValueName.GetString()),"ThemeManager",MB_RETRYCANCEL ) ) goto try_metric_again; #endif diff --git a/stepmania/src/TransitionBGAnimation.cpp b/stepmania/src/TransitionBGAnimation.cpp index 27598c5028..f7972e6d9b 100644 --- a/stepmania/src/TransitionBGAnimation.cpp +++ b/stepmania/src/TransitionBGAnimation.cpp @@ -24,6 +24,8 @@ TransitionBGAnimation::TransitionBGAnimation() void TransitionBGAnimation::Load( CString sBGAniDir ) { m_BGAnimation.LoadFromAniDir( sBGAniDir ); + + m_sound.Load( sBGAniDir ); } @@ -56,6 +58,11 @@ void TransitionBGAnimation::StartTransitioning( ScreenMessage send_when_done ) ASSERT( m_State == waiting ); // can't call this more than once m_MessageToSendWhenDone = send_when_done; m_State = transitioning; + m_sound.PlayRandom(); m_fSecsIntoTransition = 0.0; } +float TransitionBGAnimation::GetLengthSeconds() +{ + return m_BGAnimation.GetLengthSeconds(); +} diff --git a/stepmania/src/TransitionBGAnimation.h b/stepmania/src/TransitionBGAnimation.h index 08e92b6aaa..7beff2d12c 100644 --- a/stepmania/src/TransitionBGAnimation.h +++ b/stepmania/src/TransitionBGAnimation.h @@ -14,6 +14,7 @@ #include "Actor.h" #include "BGAnimation.h" #include "ScreenMessage.h" +#include "RandomSample.h" class TransitionBGAnimation : public Actor @@ -26,9 +27,10 @@ public: virtual void Update( float fDeltaTime ); virtual void DrawPrimitives(); - virtual void StartTransitioning( ScreenMessage send_when_done ); + virtual void StartTransitioning( ScreenMessage send_when_done = SM_None ); bool IsTransitioning() { return m_State == transitioning; }; + float GetLengthSeconds(); protected: @@ -41,6 +43,7 @@ protected: BGAnimation m_BGAnimation; + RandomSample m_sound; ScreenMessage m_MessageToSendWhenDone; }; diff --git a/stepmania/src/MusicStatusDisplay.cpp b/stepmania/src/WheelNotifyIcon.cpp similarity index 85% rename from stepmania/src/MusicStatusDisplay.cpp rename to stepmania/src/WheelNotifyIcon.cpp index e0133b6eb3..54eef8e3ba 100644 --- a/stepmania/src/MusicStatusDisplay.cpp +++ b/stepmania/src/WheelNotifyIcon.cpp @@ -1,7 +1,7 @@ #include "global.h" /* ----------------------------------------------------------------------------- - Class: MusicStatusDisplay + Class: WheelNotifyIcon Desc: See header. @@ -10,24 +10,24 @@ ----------------------------------------------------------------------------- */ -#include "MusicStatusDisplay.h" +#include "WheelNotifyIcon.h" #include "RageUtil.h" #include "GameConstantsAndTypes.h" #include "MusicWheel.h" -#include "MusicStatusDisplay.h" +#include "WheelNotifyIcon.h" #include "RageTimer.h" #include #include "ThemeManager.h" -MusicStatusDisplay::MusicStatusDisplay() +WheelNotifyIcon::WheelNotifyIcon() { - Load( THEME->GetPathTo("Graphics","music status icons 4x2") ); + Load( THEME->GetPathTo("Graphics","WheelNotifyIcon icons 4x2") ); StopAnimating(); } -void MusicStatusDisplay::SetFlags( Flags flags ) +void WheelNotifyIcon::SetFlags( Flags flags ) { m_vIconsToShow.clear(); @@ -71,7 +71,7 @@ void MusicStatusDisplay::SetFlags( Flags flags ) Sprite::SetDiffuse( RageColor(1,1,1,1) ); } -void MusicStatusDisplay::DrawPrimitives() +void WheelNotifyIcon::DrawPrimitives() { float fSecondFraction = fmodf(RageTimer::GetTimeSinceStart(), 1 ); if( m_vIconsToShow.size() > 0 ) diff --git a/stepmania/src/MusicStatusDisplay.h b/stepmania/src/WheelNotifyIcon.h similarity index 84% rename from stepmania/src/MusicStatusDisplay.h rename to stepmania/src/WheelNotifyIcon.h index 1eee7da834..ad58a28de6 100644 --- a/stepmania/src/MusicStatusDisplay.h +++ b/stepmania/src/WheelNotifyIcon.h @@ -1,8 +1,8 @@ -#ifndef MUSICSTATUSDISPLAY_H -#define MUSICSTATUSDISPLAY_H +#ifndef WheelNotifyIcon_H +#define WheelNotifyIcon_H /* ----------------------------------------------------------------------------- - Class: MusicStatusDisplay + Class: WheelNotifyIcon Desc: A little graphic to the left of the song's text banner in the MusicWheel. @@ -16,10 +16,10 @@ -class MusicStatusDisplay : public Sprite +class WheelNotifyIcon : public Sprite { public: - MusicStatusDisplay(); + WheelNotifyIcon(); struct Flags {