From 7c1bfb3a0d1a14bf87e7777be65cc4f8c4ba263e Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Tue, 13 Aug 2002 23:26:46 +0000 Subject: [PATCH] big checkin - new noteskin format and XY positioning. I probably broke a lot of things. --- stepmania/src/AnnouncerManager.cpp | 8 +- stepmania/src/AnnouncerManager.h | 4 +- stepmania/src/ArrowEffects.cpp | 17 +- stepmania/src/ArrowEffects.h | 23 +- stepmania/src/BPMDisplay.cpp | 4 +- stepmania/src/Background.cpp | 8 +- stepmania/src/Banner.cpp | 16 +- stepmania/src/Banner.h | 10 +- stepmania/src/BannerWithFrame.cpp | 2 +- stepmania/src/BitmapText.cpp | 11 +- stepmania/src/BitmapText.h | 3 +- stepmania/src/Combo.cpp | 4 +- stepmania/src/CourseContentsFrame.cpp | 8 +- stepmania/src/CroppedSprite.cpp | 19 + stepmania/src/CroppedSprite.h | 33 +- stepmania/src/DifficultyIcon.h | 2 +- stepmania/src/FadingBanner.cpp | 73 +++ stepmania/src/FadingBanner.h | 35 ++ stepmania/src/Font.cpp | 58 ++ stepmania/src/Font.h | 1 + stepmania/src/FontManager.cpp | 15 +- stepmania/src/FontManager.h | 8 +- stepmania/src/FootMeter.cpp | 2 +- stepmania/src/Game.h | 20 + stepmania/src/GameConstantsAndTypes.cpp | 88 +-- stepmania/src/GameConstantsAndTypes.h | 303 +--------- stepmania/src/GameDef.cpp | 26 +- stepmania/src/GameDef.h | 6 +- stepmania/src/GameManager.cpp | 191 ++++--- stepmania/src/GameManager.h | 12 +- stepmania/src/GameState.cpp | 17 +- stepmania/src/GameState.h | 5 +- stepmania/src/GhostArrowRow.cpp | 6 +- stepmania/src/GradeDisplay.cpp | 4 +- stepmania/src/GrayArrowRow.cpp | 3 +- stepmania/src/GrooveRadar.cpp | 4 +- stepmania/src/HoldJudgement.cpp | 11 +- stepmania/src/IniFile.cpp | 10 +- stepmania/src/InputMapper.cpp | 19 +- stepmania/src/InputMapper.h | 3 +- stepmania/src/Judgement.cpp | 5 +- stepmania/src/LifeMeterBar.cpp | 19 +- stepmania/src/LifeMeterBattery.cpp | 12 +- stepmania/src/MenuElements.cpp | 38 +- stepmania/src/MenuElements.h | 3 - stepmania/src/MenuTimer.cpp | 6 +- stepmania/src/MusicSortDisplay.cpp | 2 +- stepmania/src/MusicStatusDisplay.cpp | 7 +- stepmania/src/MusicWheel.cpp | 260 +++------ stepmania/src/MusicWheel.h | 16 +- stepmania/src/NoteData.cpp | 144 +++-- stepmania/src/NoteData.h | 20 +- stepmania/src/NoteDataWithScoring.cpp | 5 +- stepmania/src/NoteDisplay.cpp | 665 ++++++++++++++++++++++ stepmania/src/NoteDisplay.h | 43 ++ stepmania/src/NoteField.cpp | 177 +++--- stepmania/src/NoteField.h | 22 +- stepmania/src/NoteTypes.cpp | 72 +++ stepmania/src/NoteTypes.h | 85 +++ stepmania/src/Notes.cpp | 4 +- stepmania/src/OptionsCursor.cpp | 76 +++ stepmania/src/OptionsCursor.h | 33 ++ stepmania/src/Player.cpp | 55 +- stepmania/src/Player.h | 1 - stepmania/src/RageBitmapTexture.cpp | 13 +- stepmania/src/RageBitmapTexture.h | 1 + stepmania/src/RageDisplay.cpp | 125 ++++ stepmania/src/RageDisplay.h | 33 +- stepmania/src/RageInput.cpp | 34 +- stepmania/src/RageMovieTexture.cpp | 7 + stepmania/src/RageMovieTexture.h | 10 +- stepmania/src/ScoreDisplayNormal.cpp | 4 +- stepmania/src/ScoreDisplayOni.cpp | 2 +- stepmania/src/Screen.cpp | 2 +- stepmania/src/ScreenAppearanceOptions.cpp | 8 +- stepmania/src/ScreenCaution.cpp | 31 +- stepmania/src/ScreenCaution.h | 3 +- stepmania/src/ScreenEdit.cpp | 107 ++-- stepmania/src/ScreenEdit.h | 7 +- stepmania/src/ScreenEditMenu.cpp | 46 +- stepmania/src/ScreenEditMenu.h | 11 +- stepmania/src/ScreenEvaluation.cpp | 201 +++++-- stepmania/src/ScreenEz2SelectPlayer.cpp | 59 +- stepmania/src/ScreenEz2SelectStyle.cpp | 79 ++- stepmania/src/ScreenGameOver.cpp | 2 +- stepmania/src/ScreenGameplay.cpp | 336 +++++++---- stepmania/src/ScreenGameplay.h | 5 +- stepmania/src/ScreenGraphicOptions.cpp | 180 ++++++ stepmania/src/ScreenGraphicOptions.h | 32 ++ stepmania/src/ScreenManager.cpp | 66 ++- stepmania/src/ScreenManager.h | 5 +- stepmania/src/ScreenMusicScroll.cpp | 34 +- stepmania/src/ScreenOptions.cpp | 287 ++++------ stepmania/src/ScreenOptions.h | 36 +- stepmania/src/ScreenPlayerOptions.cpp | 7 +- stepmania/src/ScreenPrompt.cpp | 12 +- stepmania/src/ScreenSandbox.cpp | 33 +- stepmania/src/ScreenSandbox.h | 4 +- stepmania/src/ScreenSelectCourse.cpp | 18 +- stepmania/src/ScreenSelectDifficulty.cpp | 240 ++++---- stepmania/src/ScreenSelectGame.cpp | 39 +- stepmania/src/ScreenSelectGroup.cpp | 292 +++++----- stepmania/src/ScreenSelectGroup.h | 20 +- stepmania/src/ScreenSelectMusic.cpp | 336 +++++++++-- stepmania/src/ScreenSelectMusic.h | 44 +- stepmania/src/ScreenSelectStyle.cpp | 168 ++++-- stepmania/src/ScreenSelectStyle.h | 3 + stepmania/src/ScreenSongOptions.cpp | 5 +- stepmania/src/ScreenStage.cpp | 213 +++++-- stepmania/src/ScreenStage.h | 16 +- stepmania/src/ScreenTitleMenu.cpp | 241 +++----- stepmania/src/ScreenTitleMenu.h | 2 +- stepmania/src/ScrollBar.cpp | 11 +- stepmania/src/SnapDisplay.cpp | 79 +++ stepmania/src/SnapDisplay.h | 42 ++ stepmania/src/Song.cpp | 9 +- stepmania/src/Sprite.cpp | 9 +- stepmania/src/StageBox.cpp | 6 +- stepmania/src/StepMania.cpp | 9 +- stepmania/src/StepMania.dsp | 64 ++- stepmania/src/StepMania.vcproj | 58 +- stepmania/src/Style.h | 32 ++ stepmania/src/StyleDef.cpp | 4 +- stepmania/src/StyleDef.h | 9 +- stepmania/src/TextBanner.cpp | 18 +- stepmania/src/TextBanner.h | 23 +- stepmania/src/ThemeManager.cpp | 615 +++++++++++++------- stepmania/src/ThemeManager.h | 110 ++-- stepmania/src/TipDisplay.cpp | 2 +- stepmania/src/TransitionBackWipe.cpp | 2 +- stepmania/src/TransitionKeepAlive.cpp | 2 +- stepmania/src/TransitionOniFade.cpp | 2 +- stepmania/src/TransitionStarWipe.cpp | 12 +- 133 files changed, 4813 insertions(+), 2626 deletions(-) create mode 100644 stepmania/src/FadingBanner.cpp create mode 100644 stepmania/src/FadingBanner.h create mode 100644 stepmania/src/Game.h create mode 100644 stepmania/src/NoteDisplay.cpp create mode 100644 stepmania/src/NoteDisplay.h create mode 100644 stepmania/src/NoteTypes.cpp create mode 100644 stepmania/src/NoteTypes.h create mode 100644 stepmania/src/OptionsCursor.cpp create mode 100644 stepmania/src/OptionsCursor.h create mode 100644 stepmania/src/ScreenGraphicOptions.cpp create mode 100644 stepmania/src/ScreenGraphicOptions.h create mode 100644 stepmania/src/SnapDisplay.cpp create mode 100644 stepmania/src/SnapDisplay.h create mode 100644 stepmania/src/Style.h diff --git a/stepmania/src/AnnouncerManager.cpp b/stepmania/src/AnnouncerManager.cpp index 06c35768ce..4ef962fea1 100644 --- a/stepmania/src/AnnouncerManager.cpp +++ b/stepmania/src/AnnouncerManager.cpp @@ -159,8 +159,8 @@ CString AnnouncerManager::GetPathTo( AnnouncerElement ae, CString sAnnouncerName case ANNOUNCER_STAGE_4: sAssetDir = "stage 4"; break; case ANNOUNCER_STAGE_5: sAssetDir = "stage 5"; break; case ANNOUNCER_STAGE_FINAL: sAssetDir = "stage final"; break; - case ANNOUNCER_STAGE_EXTRA: sAssetDir = "stage extra"; break; - case ANNOUNCER_STAGE_ANOTHER_EXTRA: sAssetDir = "stage another extra"; break; + case ANNOUNCER_STAGE_EXTRA1: sAssetDir = "stage extra1"; break; + case ANNOUNCER_STAGE_EXTRA2: sAssetDir = "stage extra2"; break; case ANNOUNCER_STAGE_ONI: sAssetDir = "stage oni"; break; case ANNOUNCER_STAGE_ENDLESS: sAssetDir = "stage endless"; break; case ANNOUNCER_TITLE_MENU_ATTRACT: sAssetDir = "title menu attract"; break; @@ -169,5 +169,7 @@ CString AnnouncerManager::GetPathTo( AnnouncerElement ae, CString sAnnouncerName default: ASSERT(0); // Unhandled Announcer element } - return GetAnnouncerDirFromName( sAnnouncerName ) + sAssetDir; + CString sFullDir = GetAnnouncerDirFromName( sAnnouncerName ) + sAssetDir; + ASSERT( DoesFileExist(sFullDir) ); // the announcer directory doesn't exist. Did we type the name wrong above? + return sFullDir; } diff --git a/stepmania/src/AnnouncerManager.h b/stepmania/src/AnnouncerManager.h index 7faff381cd..21e54c77b2 100644 --- a/stepmania/src/AnnouncerManager.h +++ b/stepmania/src/AnnouncerManager.h @@ -81,8 +81,8 @@ enum AnnouncerElement { ANNOUNCER_STAGE_4, ANNOUNCER_STAGE_5, ANNOUNCER_STAGE_FINAL, - ANNOUNCER_STAGE_EXTRA, - ANNOUNCER_STAGE_ANOTHER_EXTRA, + ANNOUNCER_STAGE_EXTRA1, + ANNOUNCER_STAGE_EXTRA2, ANNOUNCER_STAGE_ONI, ANNOUNCER_STAGE_ENDLESS, ANNOUNCER_TITLE_MENU_ATTRACT, diff --git a/stepmania/src/ArrowEffects.cpp b/stepmania/src/ArrowEffects.cpp index 2055100020..aa3f2d5486 100644 --- a/stepmania/src/ArrowEffects.cpp +++ b/stepmania/src/ArrowEffects.cpp @@ -9,20 +9,21 @@ Chris Danford ----------------------------------------------------------------------------- */ + #include "ArrowEffects.h" #include "Notes.h" -#include "ColorNote.h" #include "GameConstantsAndTypes.h" #include "GameManager.h" #include "GameState.h" #include "RageException.h" #include "RageTimer.h" +#include "NoteDisplay.h" -float ArrowGetYOffset( const PlayerNumber pn, float fStepIndex ) +float ArrowGetYOffset2( const PlayerNumber pn, float fNoteBeat ) { float fSongBeat = GAMESTATE->m_fSongBeat; - float fBeatsUntilStep = NoteRowToBeat( fStepIndex ) - fSongBeat; + float fBeatsUntilStep = fNoteBeat - fSongBeat; float fYOffset = fBeatsUntilStep * ARROW_GAP; switch( GAMESTATE->m_PlayerOptions[pn].m_EffectType ) { @@ -36,7 +37,7 @@ float ArrowGetYOffset( const PlayerNumber pn, float fStepIndex ) return fYOffset; } -float ArrowGetXPos( const PlayerNumber pn, int iColNum, float fYOffset ) +float ArrowGetXPos2( const PlayerNumber pn, int iColNum, float fYPos ) { float fSongBeat = GAMESTATE->m_fSongBeat; float fPixelOffsetFromCenter = GAMESTATE->GetCurrentStyleDef()->m_ColumnInfo[PLAYER_1][iColNum].fXOffset; @@ -44,7 +45,7 @@ float ArrowGetXPos( const PlayerNumber pn, int iColNum, float fYOffset ) switch( GAMESTATE->m_PlayerOptions[pn].m_EffectType ) { case PlayerOptions::EFFECT_DRUNK: - fPixelOffsetFromCenter += cosf( TIMER->GetTimeSinceStart() + iColNum*0.2f + fYOffset*6/SCREEN_HEIGHT) * ARROW_SIZE*0.5f; + fPixelOffsetFromCenter += cosf( TIMER->GetTimeSinceStart() + iColNum*0.2f + fYPos*6/SCREEN_HEIGHT) * ARROW_SIZE*0.5f; break; } return fPixelOffsetFromCenter; @@ -85,10 +86,10 @@ float ArrowGetAlpha( const PlayerNumber pn, float fYPos ) fAlpha = 1; break; case PlayerOptions::APPEARANCE_HIDDEN: - fAlpha = ((bReverse?-fYPos:fYPos)-100)/200; + fAlpha = ((bReverse?-fYPos:fYPos)-100)/100; break; case PlayerOptions::APPEARANCE_SUDDEN: - fAlpha = ((SCREEN_HEIGHT-(bReverse?-fYPos:fYPos))-260)/200; + fAlpha = ((SCREEN_HEIGHT-(bReverse?-fYPos:fYPos))-260)/100; break; case PlayerOptions::APPEARANCE_STEALTH: fAlpha = 0; @@ -138,7 +139,7 @@ float ArrowGetAlpha( const PlayerNumber pn, float fYPos ) else if( bReverse && fYPos > 0 ) fAlpha = 1; - return fAlpha; + return clamp( fAlpha, 0, 1 ); }; diff --git a/stepmania/src/ArrowEffects.h b/stepmania/src/ArrowEffects.h index c020a8c74b..a8ab261cda 100644 --- a/stepmania/src/ArrowEffects.h +++ b/stepmania/src/ArrowEffects.h @@ -1,3 +1,4 @@ +#pragma once /* ----------------------------------------------------------------------------- File: ArrowEffects.h @@ -9,24 +10,18 @@ ----------------------------------------------------------------------------- */ -#ifndef _ArrowEffects_H_ -#define _ArrowEffects_H_ - #include "GameConstantsAndTypes.h" #include "StyleDef.h" +const int ARROW_SIZE = 64; +const float ARROW_GAP = ARROW_SIZE;// + 2; + // fYOffset is a vertical position in pixels relative to the center. // (positive if has not yet been stepped on, negative if has already passed). // The ArrowEffect is applied in this stage. -float ArrowGetYOffset( const PlayerNumber pn, float fStepIndex ); - - -// fXPos is a horizontal position in pixels relative to the center of the field. -// This depends on the column of the arrow and possibly the Arrow effect and -// fYOffset (in the case of EFFECT_DRUNK). -float ArrowGetXPos( const PlayerNumber pn, int iCol, float fYOffset ); +float ArrowGetYOffset2( const PlayerNumber pn, float fNoteBeat ); // fRotation is Z rotation of an arrow. This will depend on the column of @@ -41,9 +36,13 @@ float ArrowGetRotation( const PlayerNumber pn, int iCol, float fYOffset ); float ArrowGetYPos( const PlayerNumber pn, float fYOffset ); +// fXPos is a horizontal position in pixels relative to the center of the field. +// This depends on the column of the arrow and possibly the Arrow effect and +// fYPos (in the case of EFFECT_DRUNK). +float ArrowGetXPos2( const PlayerNumber pn, int iCol, float fYPos ); + + // fAlpha is the transparency of the arrow. It depends on fYPos and the // ArrowAppearance. float ArrowGetAlpha( const PlayerNumber pn, float fYPos ); - -#endif diff --git a/stepmania/src/BPMDisplay.cpp b/stepmania/src/BPMDisplay.cpp index a406a2c877..08255f2277 100644 --- a/stepmania/src/BPMDisplay.cpp +++ b/stepmania/src/BPMDisplay.cpp @@ -26,7 +26,7 @@ BPMDisplay::BPMDisplay() m_rectFrame.SetZoomX( 120 ); m_rectFrame.SetZoomY( 40 ); - m_textBPM.Load( THEME->GetPathTo(FONT_HEADER1) ); + m_textBPM.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textBPM.TurnShadowOff(); m_textBPM.SetXY( CENTER_X, SCREEN_HEIGHT - 50 ); //m_textBPM.SetSequence( ssprintf("999") ); @@ -35,7 +35,7 @@ BPMDisplay::BPMDisplay() m_textBPM.SetDiffuseColorTopEdge( D3DXCOLOR(1,1,0,1) ); // yellow m_textBPM.SetDiffuseColorBottomEdge( D3DXCOLOR(1,0.5f,0,1) ); // orange - m_textLabel.Load( THEME->GetPathTo(FONT_HEADER1) ); + m_textLabel.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textLabel.TurnShadowOff(); m_textLabel.SetXY( 34, 2 ); m_textLabel.SetText( "BPM" ); diff --git a/stepmania/src/Background.cpp b/stepmania/src/Background.cpp index 9855d757f1..48ddf2cd87 100644 --- a/stepmania/src/Background.cpp +++ b/stepmania/src/Background.cpp @@ -59,10 +59,10 @@ Background::Background() m_sprDanger.SetZoom( 2 ); m_sprDanger.SetEffectWagging(); - m_sprDanger.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_DANGER_TEXT) ); + m_sprDanger.Load( THEME->GetPathTo("Graphics","gameplay danger text") ); m_sprDanger.SetXY( CENTER_X, CENTER_Y ); - m_sprDangerBackground.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_DANGER_BACKGROUND) ); + m_sprDangerBackground.Load( THEME->GetPathTo("Graphics","gameplay danger background") ); m_sprDangerBackground.StretchTo( CRect(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); m_quadBGBrightness.StretchTo( CRect(SCREEN_LEFT, SCREEN_TOP, SCREEN_RIGHT, SCREEN_BOTTOM) ); @@ -100,7 +100,7 @@ bool Background::LoadFromSong( Song* pSong, bool bDisableVisualizations ) else m_BackgroundMode = MODE_ANIMATIONS; - m_sprSongBackground.Load( pSong->HasBackground() ? pSong->GetBackgroundPath() : THEME->GetPathTo(GRAPHIC_FALLBACK_BACKGROUND), true, 4, 0, true ); + m_sprSongBackground.Load( pSong->HasBackground() ? pSong->GetBackgroundPath() : THEME->GetPathTo("Graphics","fallback background"), true, 4, 0, true ); m_sprSongBackground.StretchTo( CRect(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); @@ -112,7 +112,7 @@ bool Background::LoadFromSong( Song* pSong, bool bDisableVisualizations ) case MODE_MOVIE_BG: m_sprMovieBackground.Load( pSong->GetMovieBackgroundPath() ); m_sprMovieBackground.StretchTo( CRect(SCREEN_LEFT+10,SCREEN_TOP+16,SCREEN_RIGHT-10,SCREEN_BOTTOM-16) ); - m_sprMovieBackground.SetZoomY( m_sprMovieBackground.GetZoomY()*-1 ); + m_sprMovieBackground.SetZoomY( m_sprMovieBackground.GetZoomY() ); m_sprMovieBackground.StopAnimating( ); break; case MODE_MOVIE_VIS: diff --git a/stepmania/src/Banner.cpp b/stepmania/src/Banner.cpp index d019962a58..7418c5f3ec 100644 --- a/stepmania/src/Banner.cpp +++ b/stepmania/src/Banner.cpp @@ -50,10 +50,10 @@ bool Banner::LoadFromSong( Song* pSong ) // NULL means no song Sprite::TurnShadowOff(); - if( pSong == NULL ) Banner::Load( THEME->GetPathTo(GRAPHIC_FALLBACK_BANNER) ); + if( pSong == NULL ) Banner::Load( THEME->GetPathTo("Graphics","fallback banner") ); else if( pSong->HasBanner() ) Banner::Load( pSong->GetBannerPath() ); // else if( pSong->HasBackground() ) Banner::Load( pSong->GetBackgroundPath() ); - else Banner::Load( THEME->GetPathTo(GRAPHIC_FALLBACK_BANNER) ); + else Banner::Load( THEME->GetPathTo("Graphics","fallback banner") ); return true; } @@ -64,10 +64,12 @@ bool Banner::LoadFromGroup( CString sGroupName ) CString sGroupBannerPath = SONGMAN->GetGroupBannerPath( sGroupName ); - if( sGroupBannerPath != "" ) + if( sGroupName == "ALL MUSIC" ) + Banner::Load( THEME->GetPathTo("Graphics","all music banner") ); + else if( sGroupBannerPath != "" ) Banner::Load( sGroupBannerPath ); else - Banner::Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SECTION_BANNER) ); + Banner::Load( THEME->GetPathTo("Graphics","select music section banner") ); return true; } @@ -78,16 +80,16 @@ bool Banner::LoadFromCourse( Course* pCourse ) // NULL means no course Sprite::TurnShadowOff(); - if( pCourse == NULL ) Banner::Load( THEME->GetPathTo(GRAPHIC_FALLBACK_BANNER) ); + if( pCourse == NULL ) Banner::Load( THEME->GetPathTo("Graphics","fallback banner") ); else if( pCourse->m_sBannerPath != "" ) Banner::Load( pCourse->m_sBannerPath ); - else Banner::Load( THEME->GetPathTo(GRAPHIC_FALLBACK_BANNER) ); + else Banner::Load( THEME->GetPathTo("Graphics","fallback banner") ); return true; } bool Banner::LoadRoulette() { - Banner::Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_ROULETTE_BANNER), false, 0, 0, false, false ); + Banner::Load( THEME->GetPathTo("Graphics","select music roulette banner"), false, 0, 0, false, false ); m_bScrolling = true; return true; diff --git a/stepmania/src/Banner.h b/stepmania/src/Banner.h index fb5146f85a..59671b1f52 100644 --- a/stepmania/src/Banner.h +++ b/stepmania/src/Banner.h @@ -3,7 +3,7 @@ ----------------------------------------------------------------------------- File: Banner.h - Desc: The song's banner displayed in SelectSong. + Desc: The song's banner displayed in SelectSong. Must call SetCroppedSize. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Chris Danford @@ -12,11 +12,6 @@ #include "CroppedSprite.h" #include "Song.h" - - -const float BANNER_WIDTH = 286; -const float BANNER_HEIGHT = 92; - class Course; @@ -27,9 +22,6 @@ public: { m_bScrolling = false; m_fPercentScrolling = 0; - - m_fCropWidth = BANNER_WIDTH; - m_fCropHeight = BANNER_HEIGHT; }; virtual bool Load( CString sFilePath, bool bForceReload = false, int iMipMaps = 0, int iAlphaBits = 0, bool bDither = false, bool bStretch = false ); diff --git a/stepmania/src/BannerWithFrame.cpp b/stepmania/src/BannerWithFrame.cpp index eb5e07083e..ca22027182 100644 --- a/stepmania/src/BannerWithFrame.cpp +++ b/stepmania/src/BannerWithFrame.cpp @@ -20,7 +20,7 @@ BannerWithFrame::BannerWithFrame() { - m_sprBannerFrame.Load( THEME->GetPathTo(GRAPHIC_EVALUATION_BANNER_FRAME) ); + m_sprBannerFrame.Load( THEME->GetPathTo("Graphics","evaluation banner frame") ); m_Banner.SetCroppedSize( m_sprBannerFrame.GetUnzoomedWidth()-6, m_sprBannerFrame.GetUnzoomedHeight()-6 ); this->AddSubActor( &m_Banner ); diff --git a/stepmania/src/BitmapText.cpp b/stepmania/src/BitmapText.cpp index 2c15c85460..d6a76aa32f 100644 --- a/stepmania/src/BitmapText.cpp +++ b/stepmania/src/BitmapText.cpp @@ -16,6 +16,7 @@ #include "RageLog.h" #include "RageException.h" #include "RageTimer.h" +#include "PrefsManager.h" @@ -59,12 +60,12 @@ BitmapText::~BitmapText() FONT->UnloadFont( m_pFont->m_sFontFilePath ); } -bool BitmapText::Load( const CString &sFontFilePath ) +bool BitmapText::LoadFromFont( CString sFontFilePath ) { LOG->Trace( "BitmapText::LoadFromFontName(%s)", sFontFilePath ); // load font - m_pFont = FONT->LoadFont( sFontFilePath ); + m_pFont = FONT->LoadFont( sFontFilePath, "" ); return true; } @@ -134,6 +135,12 @@ void BitmapText::SetText( CString sText ) // draw text at x, y using colorTop blended down to colorBottom, with size multiplied by scale void BitmapText::DrawPrimitives() { + // offset so that pixels are aligned to texels + if( PREFSMAN->m_iDisplayResolution == 320 ) + DISPLAY->TranslateLocal( -1, -1, 0 ); + else + DISPLAY->TranslateLocal( -0.5f, -0.5f, 0 ); + if( m_iNumLines == 0 ) return; diff --git a/stepmania/src/BitmapText.h b/stepmania/src/BitmapText.h index 1e3b5082c8..78c96ca71b 100644 --- a/stepmania/src/BitmapText.h +++ b/stepmania/src/BitmapText.h @@ -27,7 +27,8 @@ public: ~BitmapText(); - bool Load( const CString &sFontName ); + bool LoadFromFont( CString sFontName ); + bool LoadFromTextureAndChars( CString sTexturePath, CString sChars ); void SetText( CString sText ); int GetWidestLineWidthInSourcePixels() { return m_iWidestLineWidth; }; diff --git a/stepmania/src/Combo.cpp b/stepmania/src/Combo.cpp index 85c379abe2..66f8723e05 100644 --- a/stepmania/src/Combo.cpp +++ b/stepmania/src/Combo.cpp @@ -21,13 +21,13 @@ Combo::Combo() m_iCurCombo = 0; m_iMaxCombo = 0; - m_sprCombo.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_COMBO) ); + m_sprCombo.Load( THEME->GetPathTo("Graphics", "gameplay combo") ); m_sprCombo.TurnShadowOn(); m_sprCombo.StopAnimating(); m_sprCombo.SetX( 40 ); m_sprCombo.SetZoom( 1.0f ); - m_textComboNumber.Load( THEME->GetPathTo(FONT_COMBO_NUMBERS) ); + m_textComboNumber.LoadFromFont( THEME->GetPathTo("Fonts","combo numbers") ); m_textComboNumber.TurnShadowOn(); m_textComboNumber.SetHorizAlign( Actor::align_right ); m_textComboNumber.SetX( -0 ); diff --git a/stepmania/src/CourseContentsFrame.cpp b/stepmania/src/CourseContentsFrame.cpp index 1acd343877..1881b93556 100644 --- a/stepmania/src/CourseContentsFrame.cpp +++ b/stepmania/src/CourseContentsFrame.cpp @@ -38,10 +38,10 @@ const float CONTENTS_BAR_HEIGHT = 44; CourseContentDisplay::CourseContentDisplay() { - m_sprFrame.Load( THEME->GetPathTo(GRAPHIC_SELECT_COURSE_CONTENT_BAR) ); + m_sprFrame.Load( THEME->GetPathTo("Graphics","select course content bar") ); this->AddSubActor( &m_sprFrame ); - m_textNumber.Load( THEME->GetPathTo(FONT_HEADER2) ); + m_textNumber.LoadFromFont( THEME->GetPathTo("Fonts","Header2") ); m_textNumber.SetXY( NUMBER_X, NUMBER_Y ); m_textNumber.TurnShadowOff(); this->AddSubActor( &m_textNumber ); @@ -49,12 +49,12 @@ CourseContentDisplay::CourseContentDisplay() m_TextBanner.SetXY( TEXT_BANNER_X, TEXT_BANNER_Y ); this->AddSubActor( &m_TextBanner ); - m_textFoot.Load( THEME->GetPathTo(FONT_METER) ); + m_textFoot.LoadFromFont( THEME->GetPathTo("Fonts","meter") ); m_textFoot.SetXY( FOOT_X, FOOT_Y ); m_textFoot.TurnShadowOff(); this->AddSubActor( &m_textFoot ); - m_textDifficultyNumber.Load( THEME->GetPathTo(FONT_NORMAL) ); + m_textDifficultyNumber.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textDifficultyNumber.SetXY( DIFFICULTY_X, DIFFICULTY_Y ); m_textDifficultyNumber.SetZoom( 0.8f ); m_textDifficultyNumber.TurnShadowOff(); diff --git a/stepmania/src/CroppedSprite.cpp b/stepmania/src/CroppedSprite.cpp index 4395d85511..30432f286c 100644 --- a/stepmania/src/CroppedSprite.cpp +++ b/stepmania/src/CroppedSprite.cpp @@ -16,6 +16,25 @@ #include "RageBitmapTexture.h" +CroppedSprite::CroppedSprite() +{ + m_fCropWidth = m_fCropHeight = 100; +} + +bool CroppedSprite::Load( CString sFilePath, bool bForceReload, int iMipMaps, int iAlphaBits, bool bDither, bool bStretch ) +{ + Sprite::Load( sFilePath, bForceReload, iMipMaps, iAlphaBits, bDither, bStretch ); + CropToSize( m_fCropWidth, m_fCropHeight ); + + return true; +} + +void CroppedSprite::SetCroppedSize( float fWidth, float fHeight ) +{ + m_fCropWidth = fWidth; + m_fCropHeight = fHeight; +} + void CroppedSprite::CropToSize( float fWidth, float fHeight ) { m_fCropWidth = fWidth; diff --git a/stepmania/src/CroppedSprite.h b/stepmania/src/CroppedSprite.h index 696fe8c6b0..b2b3b9e447 100644 --- a/stepmania/src/CroppedSprite.h +++ b/stepmania/src/CroppedSprite.h @@ -1,16 +1,15 @@ +#pragma once /* ----------------------------------------------------------------------------- - File: CroppedSprite.h + Class: CroppedSprite - Desc: The song's CroppedSprite displayed in SelectSong. + Desc: The a bitmap that is cropped and zoomed to fill a box. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford ----------------------------------------------------------------------------- */ -#ifndef _CroppedSprite_H_ -#define _CroppedSprite_H_ - #include "Sprite.h" #include "Song.h" @@ -19,24 +18,10 @@ class CroppedSprite : public Sprite { public: - CroppedSprite() - { - m_fCropWidth = m_fCropHeight = 100; - }; + CroppedSprite(); - bool Load( CString sFilePath, bool bForceReload = false, int iMipMaps = 4, int iAlphaBits = 4, bool bDither = false, bool bStretch = false ) - { - Sprite::Load( sFilePath, bForceReload, iMipMaps, iAlphaBits, bDither, bStretch ); - CropToSize( m_fCropWidth, m_fCropHeight ); - - return true; - } - - void SetCroppedSize( float fWidth, float fHeight ) - { - m_fCropWidth = fWidth; - m_fCropHeight = fHeight; - } + bool Load( CString sFilePath, bool bForceReload = false, int iMipMaps = 4, int iAlphaBits = 4, bool bDither = false, bool bStretch = false ); + void SetCroppedSize( float fWidth, float fHeight ); protected: void CropToSize( float fWidth, float fHeight ); @@ -44,7 +29,3 @@ protected: float m_fCropWidth, m_fCropHeight; }; - - - -#endif \ No newline at end of file diff --git a/stepmania/src/DifficultyIcon.h b/stepmania/src/DifficultyIcon.h index c5e4f37a9e..952b5551bb 100644 --- a/stepmania/src/DifficultyIcon.h +++ b/stepmania/src/DifficultyIcon.h @@ -22,7 +22,7 @@ class DifficultyIcon : public Sprite public: DifficultyIcon() { - Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_DIFFICULTY_ICONS) ); + Load( THEME->GetPathTo("Graphics","select music difficulty icons") ); StopAnimating(); SetFromNotes( NULL ); diff --git a/stepmania/src/FadingBanner.cpp b/stepmania/src/FadingBanner.cpp new file mode 100644 index 0000000000..640c50c95e --- /dev/null +++ b/stepmania/src/FadingBanner.cpp @@ -0,0 +1,73 @@ +#include "stdafx.h" +/* +----------------------------------------------------------------------------- + Class: FadingBanner + + Desc: See header. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + +#include "FadingBanner.h" +#include "RageUtil.h" +#include "GameConstantsAndTypes.h" +#include "PrefsManager.h" +#include "RageLog.h" +#include "PrefsManager.h" +#include "GameState.h" + + +FadingBanner::FadingBanner() +{ + // these guys get loaded on the Set* methods + this->AddSubActor( &m_Banner[0] ); + this->AddSubActor( &m_Banner[1] ); +} + +void FadingBanner::SetCroppedSize( float fWidth, float fHeight ) +{ + m_Banner[0].SetCroppedSize( fWidth, fHeight ); + m_Banner[1].SetCroppedSize( fWidth, fHeight ); +} + +void FadingBanner::Update( float fDeltaTime ) +{ + ActorFrame::Update( fDeltaTime ); + +} + +void FadingBanner::BeforeChange() +{ + // move the back banner to the front in preparation for a cross fade + if( m_Banner[0].GetTexturePath() != "" ) + { + m_Banner[1].Load( m_Banner[0].GetTexturePath() ); + m_Banner[1].SetScrolling( m_Banner[0].IsScrolling() ); + } + + m_Banner[1].SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); + m_Banner[1].BeginTweening( 0.25f ); // fade out + m_Banner[1].SetTweenDiffuseColor( D3DXCOLOR(1,1,1,0) ); + +} + +void FadingBanner::SetFromSong( Song* pSong ) +{ + ASSERT( pSong != NULL ); + BeforeChange(); + m_Banner[0].LoadFromSong( pSong ); +} + +void FadingBanner::SetFromGroup( const CString &sGroupName ) +{ + BeforeChange(); + m_Banner[0].LoadFromGroup( sGroupName ); +} + +void FadingBanner::SetRoulette() +{ + BeforeChange(); + m_Banner[0].LoadRoulette(); +} \ No newline at end of file diff --git a/stepmania/src/FadingBanner.h b/stepmania/src/FadingBanner.h new file mode 100644 index 0000000000..b2518cd786 --- /dev/null +++ b/stepmania/src/FadingBanner.h @@ -0,0 +1,35 @@ +#pragma once +/* +----------------------------------------------------------------------------- + Class: FadingBanner + + Desc: Fades between two banners. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + +#include "Banner.h" +#include "ActorFrame.h" + + +class FadingBanner : public ActorFrame +{ +public: + FadingBanner(); + + void SetCroppedSize( float fWidth, float fHeight ); + + void Update( float fDeltaTime ); + + void SetFromSong( Song* pSong ); + void SetFromGroup( const CString &sGroupName ); + void SetRoulette(); + //void SetFromTexture( const CString &sTexturePath ); + +protected: + void BeforeChange(); + + Banner m_Banner[2]; // front and back +}; diff --git a/stepmania/src/Font.cpp b/stepmania/src/Font.cpp index 97ed6b8fee..4f21c98492 100644 --- a/stepmania/src/Font.cpp +++ b/stepmania/src/Font.cpp @@ -131,7 +131,11 @@ Font::Font( const CString &sFontFilePath ) m_sFontFilePath, asCharWidths.GetSize(), m_pTexture->GetNumFrames() ); for( int i=0; iTrace( "Font::LoadFromFontName(%s)", sFontFilePath ); + int i; + for( i=0; iLoadTexture( m_sTexturePath ); + assert( m_pTexture != NULL ); + + + // + // find out what characters are in this font + // + // sanity check + if( sCharacters.GetLength() != m_pTexture->GetNumFrames() ) + throw RageException( "The characters in '%s' does not match the number of frames in the texture." + "The font has %d frames, and the texture has %d frames.", + m_sFontFilePath, sCharacters.GetLength(), m_pTexture->GetNumFrames() ); + + // set the char to frame number map + for( i=0; iGetNumFrames(); i++ ) + m_iFrameNoToWidth[i] = m_pTexture->GetSourceFrameWidth(); +} + + Font::~Font() { if( m_pTexture != NULL ) diff --git a/stepmania/src/Font.h b/stepmania/src/Font.h index c6d0c792d9..67040e9caf 100644 --- a/stepmania/src/Font.h +++ b/stepmania/src/Font.h @@ -21,6 +21,7 @@ protected: public: Font( const CString &sFontPath ); + Font( const CString &sTexturePath, const CString& sChars ); ~Font(); int GetLineWidthInSourcePixels( LPCTSTR szLine, int iLength ); diff --git a/stepmania/src/FontManager.cpp b/stepmania/src/FontManager.cpp index fb79ed4b4c..82db3636f1 100644 --- a/stepmania/src/FontManager.cpp +++ b/stepmania/src/FontManager.cpp @@ -51,9 +51,9 @@ FontManager::~FontManager() //----------------------------------------------------------------------------- // Load/Unload textures from disk //----------------------------------------------------------------------------- -Font* FontManager::LoadFont( CString sFontFilePath ) +Font* FontManager::LoadFont( CString sFontOrTextureFilePath, CString sChars ) { - sFontFilePath.MakeLower(); + sFontOrTextureFilePath.MakeLower(); // LOG->Trace( "FontManager::LoadFont(%s).", sFontFilePath ); @@ -65,7 +65,7 @@ Font* FontManager::LoadFont( CString sFontFilePath ) Font* pFont = NULL; - if( m_mapPathToFont.Lookup( sFontFilePath, pFont ) ) // if the texture already exists in the map + if( m_mapPathToFont.Lookup( sFontOrTextureFilePath, pFont ) ) // if the texture already exists in the map { // LOG->Trace( ssprintf("FontManager: The Font '%s' now has %d references.", sFontFilePath, pFont->m_iRefCount) ); pFont->m_iRefCount++; @@ -73,13 +73,16 @@ Font* FontManager::LoadFont( CString sFontFilePath ) else // the texture is not already loaded { CString sDrive, sDir, sFName, sExt; - splitpath( FALSE, sFontFilePath, sDrive, sDir, sFName, sExt ); + splitpath( FALSE, sFontOrTextureFilePath, sDrive, sDir, sFName, sExt ); - pFont = (Font*) new Font( sFontFilePath ); + if( sChars == "" ) + pFont = (Font*) new Font( sFontOrTextureFilePath ); + else + pFont = (Font*) new Font( sFontOrTextureFilePath, sChars ); // LOG->Trace( "FontManager: Loading '%s' from disk.", sFontFilePath); - m_mapPathToFont.SetAt( sFontFilePath, pFont ); + m_mapPathToFont.SetAt( sFontOrTextureFilePath, pFont ); } return pFont; diff --git a/stepmania/src/FontManager.h b/stepmania/src/FontManager.h index afddea7596..f7a1b9bd46 100644 --- a/stepmania/src/FontManager.h +++ b/stepmania/src/FontManager.h @@ -1,3 +1,4 @@ +#pragma once /* ----------------------------------------------------------------------------- Class: FontManager @@ -9,10 +10,6 @@ ----------------------------------------------------------------------------- */ -#ifndef _FontManager_H_ -#define _FontManager_H_ - - #include "Font.h" @@ -25,7 +22,7 @@ public: FontManager(); ~FontManager(); - Font* LoadFont( CString sFontPath ); + Font* LoadFont( CString sFontOrTextureFilePath, CString sChars ); bool IsFontLoaded( CString sFontPath ); void UnloadFont( CString sFontPath ); @@ -36,4 +33,3 @@ protected: extern FontManager* FONT; // global and accessable from anywhere in our program -#endif diff --git a/stepmania/src/FootMeter.cpp b/stepmania/src/FootMeter.cpp index 0a97afd402..1dc653d95a 100644 --- a/stepmania/src/FootMeter.cpp +++ b/stepmania/src/FootMeter.cpp @@ -19,7 +19,7 @@ FootMeter::FootMeter() { - Load( THEME->GetPathTo(FONT_METER) ); + LoadFromFont( THEME->GetPathTo("Fonts","meter") ); SetFromNotes( NULL ); } diff --git a/stepmania/src/Game.h b/stepmania/src/Game.h new file mode 100644 index 0000000000..97409e3d63 --- /dev/null +++ b/stepmania/src/Game.h @@ -0,0 +1,20 @@ +#pragma once +/* +----------------------------------------------------------------------------- + File: Game + + Desc: . + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + +enum Game +{ + GAME_DANCE, // Dance Dance Revolution + GAME_PUMP, // Pump It Up + GAME_EZ2, // Ez2dancer + NUM_GAMES, // leave this at the end + GAME_INVALID, +}; diff --git a/stepmania/src/GameConstantsAndTypes.cpp b/stepmania/src/GameConstantsAndTypes.cpp index d9d6c5682d..3e7758891d 100644 --- a/stepmania/src/GameConstantsAndTypes.cpp +++ b/stepmania/src/GameConstantsAndTypes.cpp @@ -13,60 +13,6 @@ #include "GameConstantsAndTypes.h" -D3DXCOLOR NoteTypeToColor( NoteType nt ) -{ - switch( nt ) - { - case NOTE_4TH: return D3DXCOLOR(1,0,0,1); // red - case NOTE_8TH: return D3DXCOLOR(0,0,1,1); // blue - case NOTE_12TH: return D3DXCOLOR(1,0,1,1); // purple - case NOTE_16TH: return D3DXCOLOR(1,1,0,1); // yellow - default: ASSERT( false ); return D3DXCOLOR(1,1,1,1); - } -}; - -float NoteTypeToBeat( NoteType nt ) -{ - switch( nt ) - { - case NOTE_4TH: return 1.0f; // quarter notes - case NOTE_8TH: return 1.0f/2; // eighth notes - case NOTE_12TH: return 1.0f/3; // triplets - case NOTE_16TH: return 1.0f/4; // sixteenth notes - default: ASSERT( false ); return 0; - } -}; - -NoteType GetNoteType( int iNoteIndex ) -{ - if( iNoteIndex % (ELEMENTS_PER_MEASURE/4) == 0) - return NOTE_4TH; - else if( iNoteIndex % (ELEMENTS_PER_MEASURE/8) == 0) - return NOTE_8TH; - else if( iNoteIndex % (ELEMENTS_PER_MEASURE/12) == 0) - return NOTE_12TH; - else if( iNoteIndex % (ELEMENTS_PER_MEASURE/16) == 0) - return NOTE_16TH; -// ASSERT(0); - return NOTE_INVALID; -}; - -bool IsNoteOfType( int iNoteIndex, NoteType t ) -{ - return GetNoteType(iNoteIndex) == t; -}; - -D3DXCOLOR GetNoteColorFromIndex( int iStepIndex ) -{ - for( int t=0; tGetCurrentStyleDef()->m_NotesType - or - - GAMEMAN->GetStyleDefForStyle(style)->m_NotesType - I'll add a new method to GAMEMAN called GetStyleThatPlaysNotesType(): - Style s = GAMEMAN->GetStyleThatPlaysNotesType( nt ); - -//////////////////////////////// -// NotesType/Style conversions -//////////////////////////////// - -// Dro Kulix: This part really is necessary. -// Several subroutines call for conversions between -// NotesType and Style, both ways. It would make -// things a bit easier to keep them central. - -// The next two functions have self-explanatory -// names, NotesTypeToStyle(nt) and -// StyleToNotesType(s). - -// Both of these functions involve a tedious -// switch-based one-to-one mapping between -// NotesTypes and Styles. I have written a -// Perl script which will actually write both -// of the functions for you. All you need to do -// is keep updated the list of Styles and -// NotesTypes near the beginning of the script. - -// If you need a copy of Perl for Win32, -// http://www.activeperl.com/Products/ActivePerl/ -// will suit nicely. - -/* - -Begin Perl file -> - -# StyleNotesType.pl - -# Perl script to write StyleToNotesType and -# NotesTypeToStyle functions for StepMania. - -# Usage: perl StyleNotesType.pl > code.txt -# (outputs C++ functions to file code.txt) - -# Keep the following list updated to produce -# correct code. - -# First column is Styles, second is NotesTypes. - -# These mapping sequences only make the first possible -# mapping. That is, STYLE_DANCE_SINGLE will map to -# NOTES_TYPE_DANCE_SINGLE, and STYLE_DANCE_VERSUS will -# map to NOTES_TYPE_DANCE_SINGLE, but -# NOTES_TYPE_DANCE_SINGLE will only map to -# STYLE_DANCE_SINGLE. - -my @Types = qw[ - DANCE_SINGLE DANCE_SINGLE - DANCE_VERSUS DANCE_SINGLE - DANCE_DOUBLE DANCE_DOUBLE - DANCE_COUPLE DANCE_COUPLE - DANCE_SOLO DANCE_SOLO - PUMP_SINGLE PUMP_SINGLE - PUMP_VERSUS PUMP_SINGLE - PUMP_DOUBLE PUMP_DOUBLE - EZ2_SINGLE EZ2_SINGLE - EZ2_DOUBLE EZ2_DOUBLE - EZ2_REAL EZ2_REAL - EZ2_SINGLE_VERSUS EZ2_SINGLE_VERSUS - EZ2_REAL_VERSUS EZ2_REAL_VERSUS - NONE INVALID -]; - - - -my %StyleToNotesType = (); -{ - my @tmpTypes = @Types; - # Map Style to NotesType - while (@tmpTypes) { - my $key = shift(@tmpTypes); - my $value = shift(@tmpTypes); - if (!exists($StyleToNotesType{$key})) { - $StyleToNotesType{$key} = $value; - } - } -} - -my %NotesTypeToStyle = (); -{ - my @tmpTypes = @Types; - # Map NotesType to Style - while (@tmpTypes) { - my $value = shift(@tmpTypes); - my $key = shift(@tmpTypes); - if (!exists($NotesTypeToStyle{$key})) { - $NotesTypeToStyle{$key} = $value; - } - } -} - -# Produce NotesTypeToStyle -print " -// -// NotesTypeToStyle(nt): Converts nt to a Style -// -inline Style NotesTypeToStyle ( NotesType nt ) -{ - switch ( nt ) - { -"; - -foreach (sort keys %NotesTypeToStyle) { - my $key = "NOTES_TYPE_$_"; - my $value = 'STYLE_' . $NotesTypeToStyle{$_}; - print "\t\tcase $key:\treturn $value;\n"; -} - -print "\t\tdefault:\treturn STYLE_NONE; - } -} -"; - -# Produce StyleToNotesType -print " -// -// StyleToNotesType(s): Converts s to a NotesType -// -inline NotesType StyleToNotesType ( Style s ) -{ - switch ( s ) - { -"; - -foreach (sort keys %StyleToNotesType) { - my $key = "STYLE_$_"; - my $value = 'NOTES_TYPE_' . $StyleToNotesType{$_}; - print "\t\tcase $key:\treturn $value;\n"; -} - -print "\t\tdefault:\treturn NOTES_TYPE_INVALID; - } -} -"; - -# Finished. - -<- End of Perl file -*/ - -/* -// -// NotesTypeToStyle(nt): Converts nt to a Style -// -inline Style NotesTypeToStyle ( NotesType nt ) -{ - switch ( nt ) - { - case NOTES_TYPE_DANCE_COUPLE: return STYLE_DANCE_COUPLE; - case NOTES_TYPE_DANCE_DOUBLE: return STYLE_DANCE_DOUBLE; - case NOTES_TYPE_DANCE_SINGLE: return STYLE_DANCE_SINGLE; - case NOTES_TYPE_DANCE_SOLO: return STYLE_DANCE_SOLO; - case NOTES_TYPE_EZ2_DOUBLE: return STYLE_EZ2_DOUBLE; - case NOTES_TYPE_EZ2_REAL: return STYLE_EZ2_REAL; - case NOTES_TYPE_EZ2_REAL_VERSUS: return STYLE_EZ2_REAL_VERSUS; - case NOTES_TYPE_EZ2_SINGLE: return STYLE_EZ2_SINGLE; - case NOTES_TYPE_EZ2_SINGLE_HARD: return STYLE_EZ2_SINGLE_HARD; - case NOTES_TYPE_EZ2_SINGLE_VERSUS: return STYLE_EZ2_SINGLE_VERSUS; - case NOTES_TYPE_EZ2_SINGLE_HARD_VERSUS: return STYLE_EZ2_SINGLE_HARD_VERSUS; - case NOTES_TYPE_INVALID: return STYLE_NONE; - case NOTES_TYPE_PUMP_DOUBLE: return STYLE_PUMP_DOUBLE; - case NOTES_TYPE_PUMP_SINGLE: return STYLE_PUMP_SINGLE; - default: return STYLE_NONE; - } -} - -// -// StyleToNotesType(s): Converts s to a NotesType -// -inline NotesType StyleToNotesType ( Style s ) -{ - switch ( s ) - { - case STYLE_DANCE_COUPLE: return NOTES_TYPE_DANCE_COUPLE; - case STYLE_DANCE_DOUBLE: return NOTES_TYPE_DANCE_DOUBLE; - case STYLE_DANCE_SINGLE: return NOTES_TYPE_DANCE_SINGLE; - case STYLE_DANCE_SOLO: return NOTES_TYPE_DANCE_SOLO; - case STYLE_DANCE_VERSUS: return NOTES_TYPE_DANCE_SINGLE; - case STYLE_EZ2_DOUBLE: return NOTES_TYPE_EZ2_DOUBLE; - case STYLE_EZ2_REAL: return NOTES_TYPE_EZ2_REAL; - case STYLE_EZ2_REAL_VERSUS: return NOTES_TYPE_EZ2_REAL_VERSUS; - case STYLE_EZ2_SINGLE: return NOTES_TYPE_EZ2_SINGLE; - case STYLE_EZ2_SINGLE_HARD: return NOTES_TYPE_EZ2_SINGLE_HARD; - case STYLE_EZ2_SINGLE_VERSUS: return NOTES_TYPE_EZ2_SINGLE_VERSUS; - case STYLE_EZ2_SINGLE_HARD_VERSUS: return NOTES_TYPE_EZ2_SINGLE_HARD_VERSUS; - case STYLE_NONE: return NOTES_TYPE_INVALID; - case STYLE_PUMP_DOUBLE: return NOTES_TYPE_PUMP_DOUBLE; - case STYLE_PUMP_SINGLE: return NOTES_TYPE_PUMP_SINGLE; - case STYLE_PUMP_VERSUS: return NOTES_TYPE_PUMP_SINGLE; - default: return NOTES_TYPE_INVALID; - } -} - -*/ - - /////////////////////////// // Scoring stuff /////////////////////////// diff --git a/stepmania/src/GameDef.cpp b/stepmania/src/GameDef.cpp index eaeeb279fb..4dfa08ac2e 100644 --- a/stepmania/src/GameDef.cpp +++ b/stepmania/src/GameDef.cpp @@ -27,15 +27,15 @@ CString GameDef::ElementToGraphicSuffix( const SkinElement gbg ) switch( gbg ) { - case GRAPHIC_NOTE_COLOR_PART: sAssetPath = "note color part"; break; - case GRAPHIC_NOTE_GRAY_PART: sAssetPath = "note gray part"; break; + case GRAPHIC_TAP_PARTS: sAssetPath = "tap parts"; break; + case GRAPHIC_HOLD_PARTS: sAssetPath = "hold parts"; break; case GRAPHIC_RECEPTOR: sAssetPath = "receptor"; break; case GRAPHIC_HOLD_EXPLOSION: sAssetPath = "hold explosion"; break; case GRAPHIC_TAP_EXPLOSION_BRIGHT: sAssetPath = "tap explosion bright"; break; case GRAPHIC_TAP_EXPLOSION_DIM: sAssetPath = "tap explosion dim"; break; default: - throw RageException( ssprintf("Unhandled StyleElement %d", gbg) ); + ASSERT(0); // invalid SkinElement } return sAssetPath; @@ -56,6 +56,7 @@ CString GameDef::GetPathToGraphic( const CString sSkinName, const CString sButto if( arrayPossibleFileNames.GetSize() > 0 ) return sSkinDir + arrayPossibleFileNames[0]; + ASSERT(0); throw RageException( "The game button graphic '%s%s %s' is missing.", sSkinDir, sButtonName, sGraphicSuffix ); return ""; } @@ -86,6 +87,9 @@ void GameDef::GetTapTweenColors( const CString sSkinName, const CString sButtonN aTapColorsOut.Add( color ); } while( bSuccess ); + if( aTapColorsOut.GetSize() == 0 ) + aTapColorsOut.Add( D3DXCOLOR(1,1,1,1) ); + fclose( fp ); return; } @@ -173,17 +177,17 @@ MenuInput GameDef::GameInputToMenuInput( GameInput GameI ) { PlayerNumber pn; - StyleDef::StyleType type = StyleDef::TWO_PLAYERS_USE_TWO_SIDES; + StyleDef::StyleType type = StyleDef::TWO_PLAYERS_TWO_CREDITS; if( GAMESTATE->m_CurStyle != STYLE_NONE ) type = GAMESTATE->GetCurrentStyleDef()->m_StyleType; switch( type ) { - case StyleDef::ONE_PLAYER_USES_ONE_SIDE: - case StyleDef::TWO_PLAYERS_USE_TWO_SIDES: + case StyleDef::ONE_PLAYER_ONE_CREDIT: + case StyleDef::TWO_PLAYERS_TWO_CREDITS: pn = (PlayerNumber)GameI.controller; break; - case StyleDef::ONE_PLAYER_USES_TWO_SIDES: - pn = GAMESTATE->m_MasterPlayerNumber; + case StyleDef::ONE_PLAYER_TWO_CREDITS: + pn = GAMESTATE->m_bIsJoined[PLAYER_1] ? PLAYER_1 : PLAYER_2; break; default: ASSERT(0); // invalid m_StyleType @@ -213,12 +217,12 @@ void GameDef::MenuInputToGameInput( MenuInput MenuI, GameInput GameIout[4] ) int iNumSidesUsing = 1; switch( GAMESTATE->GetCurrentStyleDef()->m_StyleType ) { - case StyleDef::ONE_PLAYER_USES_ONE_SIDE: - case StyleDef::TWO_PLAYERS_USE_TWO_SIDES: + case StyleDef::ONE_PLAYER_ONE_CREDIT: + case StyleDef::TWO_PLAYERS_TWO_CREDITS: controller[0] = (GameController)MenuI.player; iNumSidesUsing = 1; break; - case StyleDef::ONE_PLAYER_USES_TWO_SIDES: + case StyleDef::ONE_PLAYER_TWO_CREDITS: controller[0] = GAME_CONTROLLER_1; controller[1] = GAME_CONTROLLER_2; iNumSidesUsing = 2; diff --git a/stepmania/src/GameDef.h b/stepmania/src/GameDef.h index 1591c78a7e..76607df3c1 100644 --- a/stepmania/src/GameDef.h +++ b/stepmania/src/GameDef.h @@ -20,8 +20,8 @@ const int MAX_STYLES_PER_GAME = 10; enum SkinElement { - GRAPHIC_NOTE_COLOR_PART, - GRAPHIC_NOTE_GRAY_PART, + GRAPHIC_TAP_PARTS, + GRAPHIC_HOLD_PARTS, GRAPHIC_RECEPTOR, GRAPHIC_TAP_EXPLOSION_BRIGHT, GRAPHIC_TAP_EXPLOSION_DIM, @@ -60,7 +60,7 @@ public: int m_iNumControllers; int m_iButtonsPerController; char m_szButtonNames[MAX_GAME_BUTTONS][60]; // The name used by the button graphics system. e.g. "left", "right", "middle C", "snare" - char m_szButtonDescriptions[MAX_GAME_BUTTONS][60]; // just a longer name shown in the mapping screen + char m_szSecondaryFunction[MAX_GAME_BUTTONS][60]; // displayed on the mapping screen GameButton m_DedicatedMenuButton[NUM_MENU_BUTTONS]; GameButton m_SecondaryMenuButton[NUM_MENU_BUTTONS]; int m_iDefaultKeyboardKey[MAX_GAME_CONTROLLERS][MAX_GAME_BUTTONS]; // default keyboard keys only have an effect the current game is this game diff --git a/stepmania/src/GameManager.cpp b/stepmania/src/GameManager.cpp index 13b9be65c4..bcb5b430c6 100644 --- a/stepmania/src/GameManager.cpp +++ b/stepmania/src/GameManager.cpp @@ -62,19 +62,19 @@ GameDef g_GameDefs[NUM_GAMES] = "MenuUp", "MenuDown", }, - { // m_szButtonDescriptions - "Left (MenuLeft)", - "Right (MenuRight)", - "Up (MenuUp)", - "Down (MenuDown)", - "UpLeft", - "UpRight", - "Start", - "Back", - "MenuLeft (dedicated)", - "MenuRight (dedicated)", - "MenuUp (dedicated)", - "MenuDown (dedicated)", + { // m_szSecondaryFunction + "(MenuLeft)", + "(MenuRight)", + "(MenuUp)", + "(MenuDown)", + "", + "", + "", + "", + "(dedicated)", + "(dedicated)", + "(dedicated)", + "(dedicated)", }, { // m_DedicatedMenuButton DANCE_BUTTON_MENULEFT, // MENU_BUTTON_LEFT @@ -141,18 +141,18 @@ GameDef g_GameDefs[NUM_GAMES] = "MenuUp", "MenuDown", }, - { // m_szButtonDescriptions - "UpLeft (MenuLeft)", - "UpRight (MenuRight)", - "Center (Start)", - "DownLeft (MenuUp)", - "DownRight (MenuDown)", - "Start (dedicated)", - "Back", - "MenuLeft (dedicated)", - "MenuRight (dedicated)", - "MenuUp (dedicated)", - "MenuDown (dedicated)", + { // m_szSecondaryFunction + "(MenuLeft)", + "(MenuRight)", + "(Start)", + "(MenuUp)", + "(MenuDown)", + "(dedicated)", + "", + "(dedicated)", + "(dedicated)", + "(dedicated)", + "(dedicated)", }, { // m_DedicatedMenuButton PUMP_BUTTON_MENULEFT, // MENU_BUTTON_LEFT @@ -219,20 +219,20 @@ GameDef g_GameDefs[NUM_GAMES] = "MenuUp", "MenuDown", }, - { // m_szButtonDescriptions - "FootUpLeft (MenuUp)", - "FootUpRight (MenuDown)", - "FootDown (Start)", - "HandUpLeft (MenuLeft)", - "HandUpRight (MenuRight)", - "HandLrLeft", - "HandLrRight", - "Start (dedicated)", - "Back", - "MenuLeft (dedicated)", - "MenuRight (dedicated)", - "MenuUp (dedicated)", - "MenuDown (dedicated)", + { // m_szSecondaryFunction + "(MenuUp)", + "(MenuDown)", + "(Start)", + "(MenuLeft)", + "(MenuRight)", + "", + "", + "(dedicated)", + "", + "(dedicated)", + "(dedicated)", + "(dedicated)", + "(dedicated)", }, { // m_DedicatedMenuButton EZ2_BUTTON_MENULEFT, // MENU_BUTTON_LEFT @@ -289,9 +289,10 @@ GameDef g_GameDefs[NUM_GAMES] = StyleDef g_StyleDefs[NUM_STYLES] = { { // STYLE_DANCE_SINGLE + GAME_DANCE, // m_Game "dance-single", // m_szName NOTES_TYPE_DANCE_SINGLE, // m_NotesType - StyleDef::ONE_PLAYER_USES_ONE_SIDE, // m_StyleType + StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType { 160, 480 }, // m_iCenterX 4, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; @@ -313,11 +314,12 @@ StyleDef g_StyleDefs[NUM_STYLES] = }, }, { // STYLE_DANCE_VERSUS - "dance-versus", // m_szName - NOTES_TYPE_DANCE_SINGLE, // m_NotesType - StyleDef::TWO_PLAYERS_USE_TWO_SIDES, // m_StyleType - { 160, 480 }, // m_iCenterX - 4, // m_iColsPerPlayer + GAME_DANCE, // m_Game + "dance-versus", // m_szName + NOTES_TYPE_DANCE_SINGLE, // m_NotesType + StyleDef::TWO_PLAYERS_TWO_CREDITS, // m_StyleType + { 160, 480 }, // m_iCenterX + 4, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; { // PLAYER_1 { TRACK_1, GAME_CONTROLLER_1, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*1.5f }, @@ -337,11 +339,12 @@ StyleDef g_StyleDefs[NUM_STYLES] = }, }, { // STYLE_DANCE_DOUBLE - "dance-double", // m_szName - NOTES_TYPE_DANCE_DOUBLE, // m_NotesType - StyleDef::ONE_PLAYER_USES_TWO_SIDES, // m_StyleType - { 320, 320 }, // m_iCenterX - 8, // m_iColsPerPlayer + GAME_DANCE, // m_Game + "dance-double", // m_szName + NOTES_TYPE_DANCE_DOUBLE, // m_NotesType + StyleDef::ONE_PLAYER_TWO_CREDITS, // m_StyleType + { 320, 320 }, // m_iCenterX + 8, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; { // PLAYER_1 { TRACK_1, GAME_CONTROLLER_1, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*3.5f }, @@ -369,11 +372,12 @@ StyleDef g_StyleDefs[NUM_STYLES] = }, }, { // StyleDef - "dance-couple", // m_szName - NOTES_TYPE_DANCE_SINGLE, // m_NotesType - StyleDef::TWO_PLAYERS_USE_TWO_SIDES, // m_StyleType - { 160, 480 }, // m_iCenterX - 4, // m_iColsPerPlayer + GAME_DANCE, // m_Game + "dance-couple", // m_szName + NOTES_TYPE_DANCE_SINGLE, // m_NotesType + StyleDef::TWO_PLAYERS_TWO_CREDITS, // m_StyleType + { 160, 480 }, // m_iCenterX + 4, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; { // PLAYER_1 { TRACK_1, GAME_CONTROLLER_1, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*1.5f }, @@ -393,10 +397,11 @@ StyleDef g_StyleDefs[NUM_STYLES] = }, }, { // STYLE_DANCE_SOLO + GAME_DANCE, // m_Game "dance-solo", // m_szName NOTES_TYPE_DANCE_SOLO, // m_NotesType - StyleDef::ONE_PLAYER_USES_ONE_SIDE, // m_StyleType - { 240, 400 }, // m_iCenterX + StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType + { 320, 320 }, // m_iCenterX 6, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; { // PLAYER_1 @@ -423,7 +428,7 @@ StyleDef g_StyleDefs[NUM_STYLES] = /* { // STYLE_DANCE_SOLO_VERSUS "dance-solo-versus", // m_szName NOTES_TYPE_DANCE_SOLO, // m_NotesType - StyleDef::ONE_PLAYER_USES_ONE_SIDE, // m_StyleType + StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType { 160, 480 }, // m_iCenterX 6, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; @@ -449,9 +454,10 @@ StyleDef g_StyleDefs[NUM_STYLES] = }, }, */ { // PUMP_STYLE_SINGLE + GAME_PUMP, // m_Game "pump-single", // m_szName NOTES_TYPE_PUMP_SINGLE, // m_NotesType - StyleDef::ONE_PLAYER_USES_ONE_SIDE, // m_StyleType + StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType { 160, 480 }, // m_iCenterX 5, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; @@ -475,9 +481,10 @@ StyleDef g_StyleDefs[NUM_STYLES] = }, }, { // PUMP_STYLE_VERSUS + GAME_PUMP, // m_Game "pump-versus", // m_szName NOTES_TYPE_PUMP_SINGLE, // m_NotesType - StyleDef::TWO_PLAYERS_USE_TWO_SIDES, // m_StyleType + StyleDef::TWO_PLAYERS_TWO_CREDITS, // m_StyleType { 160, 480 }, // m_iCenterX 5, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; @@ -501,9 +508,10 @@ StyleDef g_StyleDefs[NUM_STYLES] = }, }, { // PUMP_STYLE_DOUBLE + GAME_PUMP, // m_Game "pump-double", // m_szName - NOTES_TYPE_PUMP_SINGLE, // m_NotesType - StyleDef::ONE_PLAYER_USES_TWO_SIDES, // m_StyleType + NOTES_TYPE_PUMP_DOUBLE, // m_NotesType + StyleDef::ONE_PLAYER_TWO_CREDITS, // m_StyleType { 160, 480 }, // m_iCenterX 10, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; @@ -539,9 +547,10 @@ StyleDef g_StyleDefs[NUM_STYLES] = { // EZ2_STYLE_SINGLE + GAME_EZ2, // m_Game "ez2-single", // m_szName NOTES_TYPE_EZ2_SINGLE, // m_NotesType - StyleDef::ONE_PLAYER_USES_ONE_SIDE, // m_StyleType + StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType { 160, 480 }, // m_iCenterX 5, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; @@ -565,9 +574,10 @@ StyleDef g_StyleDefs[NUM_STYLES] = }, }, { // EZ2_STYLE_SINGLE_HARD + GAME_EZ2, // m_Game "ez2-single-hard", // m_szName NOTES_TYPE_EZ2_SINGLE_HARD, // m_NotesType - StyleDef::ONE_PLAYER_USES_ONE_SIDE, // m_StyleType + StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType { 160, 480 }, // m_iCenterX 5, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; @@ -591,9 +601,10 @@ StyleDef g_StyleDefs[NUM_STYLES] = }, }, { // EZ2_STYLE_DOUBLE + GAME_EZ2, // m_Game "ez2-double", // m_szName NOTES_TYPE_EZ2_DOUBLE, // m_NotesType - StyleDef::ONE_PLAYER_USES_TWO_SIDES, // m_StyleType + StyleDef::ONE_PLAYER_TWO_CREDITS, // m_StyleType { 160, 480 }, // m_iCenterX 10, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; @@ -627,9 +638,10 @@ StyleDef g_StyleDefs[NUM_STYLES] = }, }, { // EZ2_STYLE_REAL + GAME_EZ2, // m_Game "ez2-real", // m_szName NOTES_TYPE_EZ2_REAL, // m_NotesType - StyleDef::ONE_PLAYER_USES_ONE_SIDE, // m_StyleType + StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType { 160, 480 }, // m_iCenterX 7, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; @@ -657,9 +669,10 @@ StyleDef g_StyleDefs[NUM_STYLES] = }, }, { // EZ2_STYLE_SINGLE_VERSUS + GAME_EZ2, // m_Game "ez2-single-versus", // m_szName NOTES_TYPE_EZ2_SINGLE, // m_NotesType - StyleDef::TWO_PLAYERS_USE_TWO_SIDES, // m_StyleType + StyleDef::TWO_PLAYERS_TWO_CREDITS, // m_StyleType { 160, 480 }, // m_iCenterX 5, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; @@ -683,9 +696,10 @@ StyleDef g_StyleDefs[NUM_STYLES] = }, }, { // EZ2_STYLE_SINGLE_VERSUS + GAME_EZ2, // m_Game "ez2-single-hard-versus", // m_szName NOTES_TYPE_EZ2_SINGLE_HARD, // m_NotesType - StyleDef::TWO_PLAYERS_USE_TWO_SIDES, // m_StyleType + StyleDef::TWO_PLAYERS_TWO_CREDITS, // m_StyleType { 160, 480 }, // m_iCenterX 5, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; @@ -710,9 +724,10 @@ StyleDef g_StyleDefs[NUM_STYLES] = }, { // EZ2_STYLE_REAL_VERSUS + GAME_EZ2, // m_Game "ez2-real-versus", // m_szName NOTES_TYPE_EZ2_REAL, // m_NotesType - StyleDef::TWO_PLAYERS_USE_TWO_SIDES, // m_StyleType + StyleDef::TWO_PLAYERS_TWO_CREDITS, // m_StyleType { 160, 480 }, // m_iCenterX 7, // m_iColsPerPlayer { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; @@ -768,18 +783,38 @@ Style GameManager::GetStyleThatPlaysNotesType( NotesType nt ) return STYLE_NONE; } -void GameManager::GetGameNames( CStringArray &AddTo ) +void GameManager::GetStylesForGame( Game game, CArray& aStylesAddTo ) { - for( int i=0; i& aNotesTypeAddTo ) +{ + for( int nt=0; ntGetCurrentGameDef()->GetSkinNames( AddTo ); } +void GameManager::GetNoteSkinNames( Game game, CStringArray &AddTo ) +{ + GetGameDefForGame(game)->GetSkinNames( AddTo ); +} + bool GameManager::DoesNoteSkinExist( CString sSkinName ) { CStringArray asSkinNames; @@ -838,3 +873,15 @@ void GameManager::GetHoldTweenColors( const int col, CArray CString sButtonName = pGameDef->m_szButtonNames[GI.button]; pGameDef->GetHoldTweenColors( m_sCurNoteSkin, sButtonName, aHoldTweenColorsAddTo ); } + +void GameManager::GetEnabledGames( CArray& aGamesOut ) +{ + for( int g=0; g 0 ) + aGamesOut.Add( game ); + } +} diff --git a/stepmania/src/GameManager.h b/stepmania/src/GameManager.h index b41a0cc9cb..08ee4e15a1 100644 --- a/stepmania/src/GameManager.h +++ b/stepmania/src/GameManager.h @@ -12,6 +12,8 @@ */ #include "GameDef.h" #include "StyleDef.h" +#include "Style.h" +#include "Game.h" class GameManager @@ -24,8 +26,11 @@ public: Style GetStyleThatPlaysNotesType( NotesType nt ); - void GetGameNames( CStringArray &AddTo ); - bool DoesGameExist( CString sGameName ); + void GetStylesForGame( Game game, CArray& aStylesAddTo ); + void GetNotesTypesForGame( Game game, CArray& aNotesTypeAddTo ); + +// void GetGameNames( CStringArray &AddTo ); +// bool DoesGameExist( CString sGameName ); void GetNoteSkinNames( CStringArray &AddTo ); // looks up current Game in GAMESTATE bool DoesNoteSkinExist( CString sSkinName ); // looks up current Game in GAMESTATE @@ -36,7 +41,10 @@ public: void GetTapTweenColors( const int col, CArray &aTapTweenColorsAddTo ); // looks in GAMESTATE for the current Style void GetHoldTweenColors( const int col, CArray &aHoldTweenColorsAddTo ); // looks in GAMESTATE for the current Style + void GetEnabledGames( CArray& aGamesOut ); + protected: + void GetNoteSkinNames( Game game, CStringArray &AddTo ); CString m_sCurNoteSkin; diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 318500e83a..fb32d7d880 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -36,7 +36,9 @@ void GameState::Reset() int p; m_CurStyle = STYLE_NONE; - m_MasterPlayerNumber = PLAYER_INVALID; + m_bPlayersCanJoin = false; + for( int i=0; i<2; i++ ) + m_bIsJoined[i] = false; m_sPreferredGroup = ""; for( p=0; pm_StyleType == StyleDef::TWO_PLAYERS_USE_TWO_SIDES ); + switch( GetCurrentStyleDef()->m_StyleType ) + { + case StyleDef::TWO_PLAYERS_TWO_CREDITS: + return true; + case StyleDef::ONE_PLAYER_ONE_CREDIT: + case StyleDef::ONE_PLAYER_TWO_CREDITS: + return m_bIsJoined[pn]; + default: + ASSERT(0); + return false; + } } float GameState::GetElapsedSeconds() diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index d81afa2b36..a5efc19428 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -13,6 +13,8 @@ #include "GameConstantsAndTypes.h" #include "PlayerOptions.h" #include "SongOptions.h" +#include "Game.h" +#include "Style.h" class Song; @@ -34,7 +36,8 @@ public: // Game m_CurGame; Style m_CurStyle; - PlayerNumber m_MasterPlayerNumber; + bool m_bPlayersCanJoin; // true if it's not too late for a player to join + bool m_bIsJoined[2]; // left side, and right side GameDef* GetCurrentGameDef(); StyleDef* GetCurrentStyleDef(); diff --git a/stepmania/src/GhostArrowRow.cpp b/stepmania/src/GhostArrowRow.cpp index 7693d12b02..b4bcc7e650 100644 --- a/stepmania/src/GhostArrowRow.cpp +++ b/stepmania/src/GhostArrowRow.cpp @@ -1,11 +1,12 @@ #include "stdafx.h" /* ----------------------------------------------------------------------------- - File: GhostArrowRow.h + Class: GhostArrowRow Desc: A graphic displayed in the GhostArrowRow during Dancing. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford ----------------------------------------------------------------------------- */ @@ -13,7 +14,6 @@ #include "RageUtil.h" #include "GameConstantsAndTypes.h" #include "PrefsManager.h" -#include "ColorNote.h" #include "ArrowEffects.h" #include "GameManager.h" #include "GameState.h" @@ -62,7 +62,7 @@ void GhostArrowRow::DrawPrimitives() { for( int c=0; cGetPathTo(GRAPHIC_EVALUATION_GRADES) ); + Load( THEME->GetPathTo("Graphics","evaluation grades") ); StopAnimating(); m_fTimeLeftInScroll = 0; diff --git a/stepmania/src/GrayArrowRow.cpp b/stepmania/src/GrayArrowRow.cpp index 9251718d8c..7de7eec1d8 100644 --- a/stepmania/src/GrayArrowRow.cpp +++ b/stepmania/src/GrayArrowRow.cpp @@ -14,7 +14,6 @@ #include "RageUtil.h" #include "GameConstantsAndTypes.h" #include "PrefsManager.h" -#include "ColorNote.h" #include "ArrowEffects.h" #include "GameManager.h" #include "GameState.h" @@ -59,7 +58,7 @@ void GrayArrowRow::DrawPrimitives() for( int c=0; cGetPathTo(GRAPHIC_SELECT_MUSIC_RADAR_WORDS) ); + m_sprRadarLabels[c].Load( THEME->GetPathTo("Graphics","select music radar words") ); m_sprRadarLabels[c].StopAnimating(); m_sprRadarLabels[c].SetState( c ); m_sprRadarLabels[c].SetXY( fX, fY ); @@ -90,7 +90,7 @@ void GrooveRadar::TweenOffScreen() GrooveRadar::GrooveRadarValueMap::GrooveRadarValueMap() { - m_sprRadarBase.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_RADAR_BASE) ); + m_sprRadarBase.Load( THEME->GetPathTo("Graphics","select music radar base") ); this->AddSubActor( &m_sprRadarBase ); for( int p=0; pGetMetricF("HoldJudgement","DisplayTime") HoldJudgement::HoldJudgement() { m_fDisplayCountdown = 0; - m_sprJudgement.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_JUDGEMENT) ); + m_sprJudgement.Load( THEME->GetPathTo("Graphics","gameplay hold judgement") ); m_sprJudgement.StopAnimating(); m_sprJudgement.TurnShadowOn(); this->AddSubActor( &m_sprJudgement ); @@ -51,8 +52,8 @@ void HoldJudgement::SetHoldJudgement( HoldNoteScore hns ) switch( hns ) { case HNS_NONE: m_sprJudgement.SetState( 0 ); break; - case HNS_OK: m_sprJudgement.SetState( 7 ); break; - case HNS_NG: m_sprJudgement.SetState( 8 ); break; + case HNS_OK: m_sprJudgement.SetState( 0 ); break; + case HNS_NG: m_sprJudgement.SetState( 1 ); break; default: ASSERT( false ); } diff --git a/stepmania/src/IniFile.cpp b/stepmania/src/IniFile.cpp index 9bece009dc..42de33586c 100644 --- a/stepmania/src/IniFile.cpp +++ b/stepmania/src/IniFile.cpp @@ -74,9 +74,13 @@ bool IniFile::ReadFile() } else //if a value { - valuename = line.Left(line.Find("=")); - value = line.Right(line.GetLength()-valuename.GetLength()-1); - SetValue(keyname,valuename,value); + int iEqualIndex = line.Find("="); + if( iEqualIndex != -1 ) + { + valuename = line.Left(iEqualIndex); + value = line.Right(line.GetLength()-valuename.GetLength()-1); + SetValue(keyname,valuename,value); + } } } } diff --git a/stepmania/src/InputMapper.cpp b/stepmania/src/InputMapper.cpp index 07d804a79c..0ff4d1ea8f 100644 --- a/stepmania/src/InputMapper.cpp +++ b/stepmania/src/InputMapper.cpp @@ -38,25 +38,24 @@ void InputMapper::ClearAllMappings() m_GItoDI[i][j][k].MakeInvalid(); } -void InputMapper::ClearDefaultMappings() +void InputMapper::AddDefaultMappingsForCurrentGameIfUnmapped() { - // default mappings are in the third slot + // Clear default mappings. Default mappings are in the third slot. for( int i=0; iGetCurrentGameDef(); for( int c=0; cm_iButtonsPerController; b++ ) { int key = pGameDef->m_iDefaultKeyboardKey[c][b]; + if( key == -1 ) // "no key" marker" + continue; DeviceInput DeviceI( DEVICE_KEYBOARD, key ); GameInput GameI( (GameController)c, (GameButton)b ); - if( key != -1 && !IsMapped(DeviceI) ) + if( !IsMapped(DeviceI) ) // if this key isn't already being used by another user-made mapping SetInputMap( DeviceI, GameI, 2 ); } } @@ -71,9 +70,8 @@ void InputMapper::ReadMappingsFromDisk() CString sPath = GAMESTATE->GetCurrentGameDef()->m_szName + CString("Map.ini"); IniFile ini; ini.SetPath( sPath ); - if( !ini.ReadFile() ) { + if( !ini.ReadFile() ) LOG->Warn( "could not input mapping file '%s'.", sPath ); - } IniFile::key* pKey = ini.GetKey( "Input" ); @@ -100,8 +98,7 @@ void InputMapper::ReadMappingsFromDisk() } } - ClearDefaultMappings(); - AddDefaultMappingsForCurrentGame(); + AddDefaultMappingsForCurrentGameIfUnmapped(); } diff --git a/stepmania/src/InputMapper.h b/stepmania/src/InputMapper.h index 776702a3b8..50c3e541a1 100644 --- a/stepmania/src/InputMapper.h +++ b/stepmania/src/InputMapper.h @@ -33,13 +33,12 @@ public: void SaveMappingsToDisk(); void ClearAllMappings(); - void ClearDefaultMappings(); void SetInputMap( DeviceInput DeviceI, GameInput GameI, int iSlotIndex ); void ClearFromInputMap( DeviceInput DeviceI ); void ClearFromInputMap( GameInput GameI, int iSlotIndex ); - void AddDefaultMappingsForCurrentGame(); + void AddDefaultMappingsForCurrentGameIfUnmapped(); bool IsMapped( DeviceInput DeviceI ); bool IsMapped( GameInput GameI ); diff --git a/stepmania/src/Judgement.cpp b/stepmania/src/Judgement.cpp index 80681743c1..93f878634a 100644 --- a/stepmania/src/Judgement.cpp +++ b/stepmania/src/Judgement.cpp @@ -22,7 +22,7 @@ const float JUDGEMENT_DISPLAY_TIME = 0.8f; Judgement::Judgement() { m_fDisplayCountdown = 0; - m_sprJudgement.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_JUDGEMENT) ); + m_sprJudgement.Load( THEME->GetPathTo("Graphics","gameplay judgement") ); m_sprJudgement.StopAnimating(); m_sprJudgement.TurnShadowOn(); this->AddSubActor( &m_sprJudgement ); @@ -60,6 +60,8 @@ void Judgement::SetJudgement( TapNoteScore score ) default: ASSERT( false ); } + // Chris: Resize the graphic file itself if you want the size different for Ez2. + /* if ( GAMESTATE->m_CurGame == GAME_EZ2 ) // Resize Judgement graphics for Ez2. { m_sprJudgement.SetHeight( 22.0f * 2.1f ); @@ -70,6 +72,7 @@ void Judgement::SetJudgement( TapNoteScore score ) m_sprJudgement.SetWidth( 143.0f * 2.8f ); } } + */ m_fDisplayCountdown = JUDGEMENT_DISPLAY_TIME; diff --git a/stepmania/src/LifeMeterBar.cpp b/stepmania/src/LifeMeterBar.cpp index 5dbf224fc6..258b63e98c 100644 --- a/stepmania/src/LifeMeterBar.cpp +++ b/stepmania/src/LifeMeterBar.cpp @@ -16,18 +16,13 @@ #include "RageTimer.h" #include "GameState.h" -const int NUM_LIFE_STREAM_SECTIONS = 3; -const float LIFE_STREAM_SECTION_WIDTH = 1.0f/NUM_LIFE_STREAM_SECTIONS; -const float METER_WIDTH = 258; -const float METER_HEIGHT = 20; - -const float DANGER_THRESHOLD = 0.4f; +#define METER_WIDTH THEME->GetMetricF("LifeMeterBar","MeterWidth") +#define METER_HEIGHT THEME->GetMetricF("LifeMeterBar","MeterHeight") +#define DANGER_THRESHOLD THEME->GetMetricF("LifeMeterBar","DangerThreshold") const float FAIL_THRESHOLD = 0; - - LifeMeterBar::LifeMeterBar() { switch( GAMESTATE->m_SongOptions.m_DrainType ) @@ -48,13 +43,13 @@ LifeMeterBar::LifeMeterBar() m_quadBlackBackground.SetZoomY( METER_HEIGHT ); m_frame.AddSubActor( &m_quadBlackBackground ); - m_sprStreamNormal.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_LIFEMETER_STREAM_NORMAL) ); + m_sprStreamNormal.Load( THEME->GetPathTo("Graphics","gameplay lifemeter stream normal") ); m_frame.AddSubActor( &m_sprStreamNormal ); - m_sprStreamHot.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_LIFEMETER_STREAM_HOT) ); + m_sprStreamHot.Load( THEME->GetPathTo("Graphics","gameplay lifemeter stream hot") ); m_frame.AddSubActor( &m_sprStreamHot ); - m_sprFrame.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_LIFEMETER_BAR) ); + m_sprFrame.Load( THEME->GetPathTo("Graphics","gameplay lifemeter bar") ); m_frame.AddSubActor( &m_sprFrame ); this->AddSubActor( &m_frame ); @@ -199,7 +194,7 @@ void LifeMeterBar::Update( float fDeltaTime ) void LifeMeterBar::DrawPrimitives() { - float fPercentRed = IsInDanger() ? sinf( TIMER->GetTimeSinceStart()*D3DX_PI*4 )/2+0.5f : 0; + float fPercentRed = (m_fTrailingLifePercentageGetTimeSinceStart()*D3DX_PI*4 )/2+0.5f : 0; m_quadBlackBackground.SetDiffuseColor( D3DXCOLOR(fPercentRed*0.8f,0,0,1) ); if( !GAMESTATE->IsPlayerEnabled(m_PlayerNumber) ) diff --git a/stepmania/src/LifeMeterBattery.cpp b/stepmania/src/LifeMeterBattery.cpp index 066f5328d2..eb42fd2a22 100644 --- a/stepmania/src/LifeMeterBattery.cpp +++ b/stepmania/src/LifeMeterBattery.cpp @@ -35,8 +35,8 @@ LifeMeterBattery::LifeMeterBattery() m_fBatteryBlinkTime = 0; - m_soundGainLife.Load( THEME->GetPathTo(SOUND_GAMEPLAY_ONI_GAIN_LIFE) ); - m_soundLoseLife.Load( THEME->GetPathTo(SOUND_GAMEPLAY_ONI_LOSE_LIFE) ); + m_soundGainLife.Load( THEME->GetPathTo("Sounds","gameplay oni gain life") ); + m_soundLoseLife.Load( THEME->GetPathTo("Sounds","gameplay oni lose life") ); } void LifeMeterBattery::Load( PlayerNumber pn ) @@ -45,22 +45,22 @@ void LifeMeterBattery::Load( PlayerNumber pn ) bool bPlayerEnabled = GAMESTATE->IsPlayerEnabled(pn); - m_sprFrame.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_LIFEMETER_ONI) ); + m_sprFrame.Load( THEME->GetPathTo("Graphics","gameplay lifemeter oni") ); this->AddSubActor( &m_sprFrame ); - m_sprBattery.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_LIFEMETER_BATTERY) ); + m_sprBattery.Load( THEME->GetPathTo("Graphics","gameplay lifemeter battery") ); m_sprBattery.StopAnimating(); if( bPlayerEnabled ) this->AddSubActor( &m_sprBattery ); - m_textNumLives.Load( THEME->GetPathTo(FONT_HEADER1) ); + m_textNumLives.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textNumLives.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); // pink m_textNumLives.SetZoom( 1.1f ); m_textNumLives.TurnShadowOff(); if( bPlayerEnabled ) this->AddSubActor( &m_textNumLives ); - m_textPercent.Load( THEME->GetPathTo(FONT_SCORE_NUMBERS) ); + m_textPercent.LoadFromFont( THEME->GetPathTo("Fonts","score numbers") ); m_textPercent.TurnShadowOff(); m_textPercent.SetZoom( 0.7f ); m_textPercent.SetText( "00.0" ); diff --git a/stepmania/src/MenuElements.cpp b/stepmania/src/MenuElements.cpp index b4895d0938..e0bed0b4ae 100644 --- a/stepmania/src/MenuElements.cpp +++ b/stepmania/src/MenuElements.cpp @@ -33,8 +33,6 @@ const float STYLE_ICON_LOCAL_Y = 6; const float TIMER_LOCAL_X = 270; const float TIMER_LOCAL_Y = 0; -const float CREDIT_X[NUM_PLAYERS] = {160,480}; -const float CREDIT_Y[NUM_PLAYERS] = {SCREEN_BOTTOM-8, SCREEN_BOTTOM-8}; MenuElements::MenuElements() @@ -49,8 +47,6 @@ MenuElements::MenuElements() this->AddSubActor( &m_frameTopBar ); this->AddSubActor( &m_frameBottomBar ); this->AddSubActor( &m_textHelp ); - for( int p=0; pAddSubActor( &m_textCreditInfo[p] ); m_KeepAlive.SetZ( -2 ); m_KeepAlive.SetOpened(); @@ -77,7 +73,7 @@ void MenuElements::Load( CString sBackgroundPath, CString sTopEdgePath, CString m_sprTopEdge.Load( sTopEdgePath ); m_sprTopEdge.TurnShadowOff(); - m_sprStyleIcon.Load( THEME->GetPathTo(GRAPHIC_MENU_STYLE_ICONS) ); + m_sprStyleIcon.Load( THEME->GetPathTo("Graphics","menu style icons") ); m_sprStyleIcon.StopAnimating(); m_sprStyleIcon.SetXY( STYLE_ICON_LOCAL_X, STYLE_ICON_LOCAL_Y ); m_sprStyleIcon.SetZ( -1 ); @@ -99,7 +95,7 @@ void MenuElements::Load( CString sBackgroundPath, CString sTopEdgePath, CString m_frameBottomBar.SetZ( -1 ); - m_sprBottomEdge.Load( THEME->GetPathTo(GRAPHIC_MENU_BOTTOM_EDGE) ); + m_sprBottomEdge.Load( THEME->GetPathTo("Graphics","menu bottom edge") ); m_sprBottomEdge.TurnShadowOff(); m_textHelp.SetXY( HELP_X, HELP_Y ); @@ -110,28 +106,9 @@ void MenuElements::Load( CString sBackgroundPath, CString sTopEdgePath, CString //m_textHelp.SetText( sHelpText ); m_textHelp.SetZoom( 0.5f ); - for( int p=0; pGetPathTo(FONT_NORMAL) ); - m_textCreditInfo[p].SetXY( CREDIT_X[p], CREDIT_Y[p] ); - m_textCreditInfo[p].SetZ( -1 ); - - if( GAMESTATE->m_CurStyle == STYLE_NONE ) - m_textCreditInfo[p].SetText( "PRESS START" ); - else if( GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) ) - m_textCreditInfo[p].SetText( "" ); - else // not enabled - m_textCreditInfo[p].SetText( "NOT PRESENT" ); - - - m_textCreditInfo[p].SetZoom( 0.5f ); - m_textCreditInfo[p].SetDiffuseColor( D3DXCOLOR(0,0,0,1) ); - m_textCreditInfo[p].TurnShadowOff(); - } - - m_soundSwoosh.Load( THEME->GetPathTo(SOUND_MENU_SWOOSH) ); - m_soundBack.Load( THEME->GetPathTo(SOUND_MENU_BACK) ); + m_soundSwoosh.Load( THEME->GetPathTo("Sounds","menu swoosh") ); + m_soundBack.Load( THEME->GetPathTo("Sounds","menu back") ); m_frameTopBar.SetXY( CENTER_X, m_sprTopEdge.GetZoomedHeight()/2 ); @@ -233,9 +210,6 @@ void MenuElements::DrawTopLayer() m_frameTopBar.Draw(); m_frameBottomBar.Draw(); m_textHelp.Draw(); - for( int p=0; pGetPathTo(FONT_TIMER_NUMBERS) ); + m_textDigit1.LoadFromFont( THEME->GetPathTo("Fonts","timer numbers") ); m_textDigit1.TurnShadowOff(); m_textDigit1.SetXY( -18, 0 ); this->AddSubActor( &m_textDigit1 ); - m_textDigit2.Load( THEME->GetPathTo(FONT_TIMER_NUMBERS) ); + m_textDigit2.LoadFromFont( THEME->GetPathTo("Fonts","timer numbers") ); m_textDigit2.TurnShadowOff(); m_textDigit2.SetXY( +18, 0 ); this->AddSubActor( &m_textDigit2 ); - m_soundBeep.Load( THEME->GetPathTo(SOUND_MENU_TIMER) ); + m_soundBeep.Load( THEME->GetPathTo("Sounds","menu timer") ); } diff --git a/stepmania/src/MusicSortDisplay.cpp b/stepmania/src/MusicSortDisplay.cpp index 55f3da86bf..7348f2a72f 100644 --- a/stepmania/src/MusicSortDisplay.cpp +++ b/stepmania/src/MusicSortDisplay.cpp @@ -21,7 +21,7 @@ MusicSortDisplay::MusicSortDisplay() { - Load( THEME->GetPathTo(GRAPHIC_MUSIC_SORT_ICONS) ); + Load( THEME->GetPathTo("Graphics","music sort icons") ); StopAnimating(); TurnShadowOff(); //SetXY( ON_SCREEN_X, ON_SCREEN_Y ); diff --git a/stepmania/src/MusicStatusDisplay.cpp b/stepmania/src/MusicStatusDisplay.cpp index cbcc74dc2b..da80535330 100644 --- a/stepmania/src/MusicStatusDisplay.cpp +++ b/stepmania/src/MusicStatusDisplay.cpp @@ -1,11 +1,12 @@ #include "stdafx.h" /* ----------------------------------------------------------------------------- - File: MusicStatusDisplay.h + Class: MusicStatusDisplay - Desc: A graphic displayed in the MusicStatusDisplay during Dancing. + Desc: See header. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford ----------------------------------------------------------------------------- */ @@ -20,7 +21,7 @@ MusicStatusDisplay::MusicStatusDisplay() { - Load( THEME->GetPathTo(GRAPHIC_MUSIC_STATUS_ICONS) ); + Load( THEME->GetPathTo("Graphics","music status icons") ); StopAnimating(); SetType( TYPE_NONE ); diff --git a/stepmania/src/MusicWheel.cpp b/stepmania/src/MusicWheel.cpp index df87249d10..0eb5861934 100644 --- a/stepmania/src/MusicWheel.cpp +++ b/stepmania/src/MusicWheel.cpp @@ -21,49 +21,52 @@ #include "GameConstantsAndTypes.h" #include "GameState.h" - -const float FADE_TIME = 1.0f; - -const float SWITCH_MUSIC_TIME = 0.10f; -const float SAMPLE_MUSIC_DELAY = 0.20f; -const float ROULETTE_SWITCH_MUSIC_TIME = SWITCH_MUSIC_TIME/2; -const int ROULETTE_SWITCHES_IN_SLOWING_DOWN = 5; - -const float LOCKED_WHEEL_INITIAL_VELOCITY = 7; - -const float SORT_ICON_ON_SCREEN_X = -140; -const float SORT_ICON_ON_SCREEN_Y = -180; - -const float SORT_ICON_OFF_SCREEN_X = SORT_ICON_ON_SCREEN_X; -const float SORT_ICON_OFF_SCREEN_Y = SORT_ICON_ON_SCREEN_Y - 64; +// WheelItem stuff +#define ICON_X THEME->GetMetricF("WheelItem","IconX") +#define SONG_NAME_X THEME->GetMetricF("WheelItem","SongNameX") +#define SECTION_NAME_X THEME->GetMetricF("WheelItem","SectionNameX") +#define SECTION_ZOOM THEME->GetMetricF("WheelItem","SectionZoom") +#define ROULETTE_X THEME->GetMetricF("WheelItem","RouletteX") +#define ROULETTE_ZOOM THEME->GetMetricF("WheelItem","RouletteZoom") +#define COURSE_X THEME->GetMetricF("WheelItem","CourseX") +#define COURSE_ZOOM THEME->GetMetricF("WheelItem","CourseZoom") +#define GRADE_P1_X THEME->GetMetricF("WheelItem","GradeP1X") +#define GRADE_P2_X THEME->GetMetricF("WheelItem","GradeP2Y") -const float SCORE_X = 58; -const float SCORE_Y[NUM_PLAYERS] = { -40, 40 }; +// MusicWheel stuff +#define FADE_SECONDS THEME->GetMetricF("MusicWheel","FadeSeconds") +#define SWITCH_SECONDS THEME->GetMetricF("MusicWheel","SwitchSeconds") +#define SAMPLE_MUSIC_DELAY THEME->GetMetricF("MusicWheel","SampleMusicDelay") +#define ROULETTE_SWITCH_SECONDS THEME->GetMetricF("MusicWheel","RouletteSwitchSeconds") +#define ROULETTE_SLOW_DOWN_SWITCHES THEME->GetMetricI("MusicWheel","RouletteSlowDownSwitches") +#define LOCKED_INITIAL_VELOCITY THEME->GetMetricF("MusicWheel","LockedInitialVelocity") +#define SCROLL_BAR_X THEME->GetMetricF("MusicWheel","ScrollBarX") +#define SECTION_COLOR_1 THEME->GetMetricC("MusicWheel","SectionColor1") +#define SECTION_COLOR_2 THEME->GetMetricC("MusicWheel","SectionColor2") +#define SECTION_COLOR_3 THEME->GetMetricC("MusicWheel","SectionColor3") +#define SECTION_COLOR_4 THEME->GetMetricC("MusicWheel","SectionColor4") +#define SECTION_COLOR_5 THEME->GetMetricC("MusicWheel","SectionColor5") +#define SECTION_COLOR_6 THEME->GetMetricC("MusicWheel","SectionColor6") +#define SECTION_COLOR_7 THEME->GetMetricC("MusicWheel","SectionColor7") +const int NUM_SECTION_COLORS = 7; -const float SCROLLBAR_X = 150; - -D3DXCOLOR COLOR_SECTION_TEXT = D3DXCOLOR(1,1,0.3f,1); - - -D3DXCOLOR SECTION_COLORS[] = { - D3DXCOLOR( 0.9f, 0.0f, 0.2f, 1 ), // red - D3DXCOLOR( 0.6f, 0.0f, 0.4f, 1 ), // pink - D3DXCOLOR( 0.2f, 0.1f, 0.3f, 1 ), // purple - D3DXCOLOR( 0.0f, 0.4f, 0.8f, 1 ), // sky blue - D3DXCOLOR( 0.0f, 0.6f, 0.6f, 1 ), // sea green - D3DXCOLOR( 0.0f, 0.6f, 0.2f, 1 ), // green - D3DXCOLOR( 0.8f, 0.6f, 0.0f, 1 ), // orange -}; -const int NUM_SECTION_COLORS = sizeof(SECTION_COLORS)/sizeof(D3DXCOLOR); - - - -inline D3DXCOLOR GetNextSectionColor() -{ +D3DXCOLOR SECTION_COLORS( int i ) { + switch( i ) { + case 0: return SECTION_COLOR_1; + case 1: return SECTION_COLOR_2; + case 2: return SECTION_COLOR_3; + case 3: return SECTION_COLOR_4; + case 4: return SECTION_COLOR_5; + case 5: return SECTION_COLOR_6; + case 6: return SECTION_COLOR_7; + default: ASSERT(0); return D3DXCOLOR(1,1,1,1); + } +} +inline D3DXCOLOR GetNextSectionColor() { static int i=0; i = i % NUM_SECTION_COLORS; - return SECTION_COLORS[i++]; + return SECTION_COLORS(i++); } @@ -76,54 +79,47 @@ WheelItemData::WheelItemData( WheelItemType wit, Song* pSong, const CString &sSe m_color = color; } - WheelItemDisplay::WheelItemDisplay() { m_fPercentGray = 0; - m_MusicStatusDisplay.SetXY( -136, 0 ); + m_MusicStatusDisplay.SetXY( ICON_X, 0 ); m_TextBanner.SetHorizAlign( align_left ); - m_TextBanner.SetXY( -30, 0 ); + m_TextBanner.SetXY( SONG_NAME_X, 0 ); - m_sprSongBar.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SONG_BAR) ); + m_sprSongBar.Load( THEME->GetPathTo("Graphics","select music song bar") ); m_sprSongBar.SetXY( 0, 0 ); - m_sprSectionBar.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SECTION_BAR) ); + m_sprSectionBar.Load( THEME->GetPathTo("Graphics","select music section bar") ); m_sprSectionBar.SetXY( 0, 0 ); - m_textSectionName.Load( THEME->GetPathTo(FONT_HEADER1) ); + m_textSectionName.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textSectionName.TurnShadowOff(); - m_textSectionName.SetHorizAlign( align_left ); m_textSectionName.SetVertAlign( align_middle ); - m_textSectionName.SetXY( m_sprSectionBar.GetX() - m_sprSectionBar.GetUnzoomedWidth()/2 + 30, 0 ); - m_textSectionName.SetZoom( 1.0f ); + m_textSectionName.SetXY( SECTION_NAME_X, 0 ); + m_textSectionName.SetZoom( SECTION_ZOOM ); - - m_textRoulette.Load( THEME->GetPathTo(FONT_TEXT_BANNER) ); + m_textRoulette.LoadFromFont( THEME->GetPathTo("Fonts","text banner") ); m_textRoulette.TurnShadowOff(); m_textRoulette.SetText( "ROULETTE" ); m_textRoulette.TurnRainbowOn(); - m_textRoulette.SetZoom( 1.3f ); - m_textRoulette.SetHorizAlign( align_left ); - m_textRoulette.SetXY( -120, 0 ); + m_textRoulette.SetZoom( ROULETTE_ZOOM ); + m_textRoulette.SetXY( ROULETTE_X, 0 ); for( int p=0; pGetPathTo(GRAPHIC_SELECT_MUSIC_SMALL_GRADES) ); + m_GradeDisplay[p].Load( THEME->GetPathTo("Graphics","select music small grades 1x7") ); m_GradeDisplay[p].SetZoom( 1.0f ); - m_GradeDisplay[p].SetXY( 86.0f + p*26.0f, 0 ); + m_GradeDisplay[p].SetXY( p==PLAYER_1 ? GRADE_P1_X : GRADE_P2_X, 0 ); } - m_textCourse.Load( THEME->GetPathTo(FONT_TEXT_BANNER) ); + m_textCourse.LoadFromFont( THEME->GetPathTo("Fonts","text banner") ); m_textCourse.TurnShadowOff(); - m_textCourse.SetText( "ROULETTE" ); - m_textCourse.TurnRainbowOn(); - m_textCourse.SetZoom( 1.3f ); + m_textCourse.SetZoom( COURSE_ZOOM ); m_textCourse.SetHorizAlign( align_left ); - m_textCourse.SetXY( -120, 0 ); - + m_textCourse.SetXY( COURSE_X, 0 ); } @@ -296,54 +292,24 @@ MusicWheel::MusicWheel() { LOG->Trace( "MusicWheel::MusicWheel()" ); - // for debugging if( GAMESTATE->m_CurStyle == STYLE_NONE ) GAMESTATE->m_CurStyle = STYLE_DANCE_SINGLE; - - m_frameOverlay.SetXY( 0, 0 ); - - for( int p=0; pIsPlayerEnabled((PlayerNumber)p) ) - continue; // skip - - m_sprHighScoreFrame[p].Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SCORE_FRAME) ); - m_sprHighScoreFrame[p].SetXY( SCORE_X, SCORE_Y[p] ); - m_frameOverlay.AddSubActor( &m_sprHighScoreFrame[p] ); - - m_HighScore[p].SetXY( SCORE_X, SCORE_Y[p]*0.97f ); - m_HighScore[p].SetZoom( 0.6f ); - m_HighScore[p].SetDiffuseColor( PlayerToColor(p) ); - m_frameOverlay.AddSubActor( &m_HighScore[p] ); - } - - m_sprHighScoreFrame[1].SetZoomY( -1 ); // flip vertically - - - m_sprSelectionOverlay.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SONG_HIGHLIGHT) ); + m_sprSelectionOverlay.Load( THEME->GetPathTo("Graphics","select music song highlight") ); m_sprSelectionOverlay.SetXY( 0, 0 ); m_sprSelectionOverlay.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); m_sprSelectionOverlay.SetEffectGlowing( 1.0f, D3DXCOLOR(1,1,1,0.4f), D3DXCOLOR(1,1,1,1) ); - m_frameOverlay.AddSubActor( &m_sprSelectionOverlay ); + AddSubActor( &m_sprSelectionOverlay ); - m_MusicSortDisplay.SetXY( SORT_ICON_ON_SCREEN_X, SORT_ICON_ON_SCREEN_Y ); - m_MusicSortDisplay.SetEffectGlowing( 1.0f ); - m_frameOverlay.AddSubActor( &m_MusicSortDisplay ); - - this->AddSubActor( &m_frameOverlay ); - - - m_ScrollBar.SetX( SCROLLBAR_X ); + m_ScrollBar.SetX( SCROLL_BAR_X ); this->AddSubActor( &m_ScrollBar ); - - m_soundChangeMusic.Load( THEME->GetPathTo(SOUND_SELECT_MUSIC_CHANGE_MUSIC), 16 ); - m_soundChangeSort.Load( THEME->GetPathTo(SOUND_SELECT_MUSIC_CHANGE_SORT) ); - m_soundExpand.Load( THEME->GetPathTo(SOUND_SELECT_MUSIC_SECTION_EXPAND) ); - m_soundStart.Load( THEME->GetPathTo(SOUND_MENU_START) ); - m_soundLocked.Load( THEME->GetPathTo(SOUND_SELECT_MUSIC_WHEEL_LOCKED) ); + m_soundChangeMusic.Load( THEME->GetPathTo("Sounds","select music change music"), 16 ); + m_soundChangeSort.Load( THEME->GetPathTo("Sounds","select music change sort") ); + m_soundExpand.Load( THEME->GetPathTo("Sounds","select music section expand") ); + m_soundStart.Load( THEME->GetPathTo("Sounds","menu start") ); + m_soundLocked.Load( THEME->GetPathTo("Sounds","select music wheel locked") ); m_fTimeLeftBeforePlayMusicSample = 0; @@ -354,18 +320,10 @@ MusicWheel::MusicWheel() arraySongs.Copy( SONGMAN->m_pSongs ); SortSongPointerArrayByGroup( arraySongs ); - - - m_SortOrder = GAMESTATE->m_SongSortOrder; - m_MusicSortDisplay.Set( m_SortOrder ); - m_MusicSortDisplay.SetXY( SORT_ICON_ON_SCREEN_X, SORT_ICON_ON_SCREEN_Y ); - - m_sExpandedSectionName = ""; m_iSelection = 0; - m_WheelState = STATE_SELECTING_MUSIC; m_fTimeLeftInState = 0; m_fPositionOffsetFromSelection = 0; @@ -456,7 +414,11 @@ MusicWheel::MusicWheel() MusicWheel::~MusicWheel() { - GAMESTATE->m_SongSortOrder = m_SortOrder; +} + +CArray& MusicWheel::GetCurWheelItemDatas() +{ + return m_WheelItemDatas[GAMESTATE->m_SongSortOrder]; } void MusicWheel::BuildWheelItemDatas( CArray &arrayWheelItemDatas, SongSortOrder so, bool bRoulette ) @@ -543,7 +505,7 @@ void MusicWheel::BuildWheelItemDatas( CArray &arr continue; if( sThisSection != sLastSection) // new section, make a section item { - colorSection = (so==SORT_GROUP) ? SONGMAN->GetGroupColor(pSong->m_sGroupName) : SECTION_COLORS[iSectionColorIndex]; + colorSection = (so==SORT_GROUP) ? SONGMAN->GetGroupColor(pSong->m_sGroupName) : SECTION_COLORS(iSectionColorIndex); iSectionColorIndex = (iSectionColorIndex+1) % NUM_SECTION_COLORS; arrayWheelItemDatas.Add( WheelItemData(TYPE_SECTION, NULL, sThisSection, NULL, colorSection) ); sLastSection = sThisSection; @@ -625,7 +587,7 @@ void MusicWheel::BuildWheelItemDatas( CArray &arr if( arrayWheelItemDatas.GetSize() == 0 ) { - arrayWheelItemDatas.Add( WheelItemData(TYPE_SECTION, NULL, "EMPTY", NULL, D3DXCOLOR(1,0,0,1)) ); + arrayWheelItemDatas.Add( WheelItemData(TYPE_SECTION, NULL, "- EMPTY -", NULL, D3DXCOLOR(1,0,0,1)) ); } else if( GAMESTATE->m_PlayMode == PLAY_MODE_ARCADE && !bRoulette ) { @@ -655,12 +617,12 @@ float MusicWheel::GetBannerAlpha( float fPosOffsetsFromMiddle ) if( m_WheelState == STATE_FLYING_OFF_BEFORE_NEXT_SORT || m_WheelState == STATE_TWEENING_OFF_SCREEN ) { - return m_fTimeLeftInState / FADE_TIME; + return m_fTimeLeftInState / FADE_SECONDS; } else if( m_WheelState == STATE_FLYING_ON_AFTER_NEXT_SORT || m_WheelState == STATE_TWEENING_ON_SCREEN ) { - return 1 - (m_fTimeLeftInState / FADE_TIME); + return 1 - (m_fTimeLeftInState / FADE_SECONDS); } else if( m_WheelState == STATE_WAITING_OFF_SCREEN ) { @@ -729,9 +691,6 @@ void MusicWheel::NotesChanged( PlayerNumber pn ) // update grade graphics and to Song* pSong = GAMESTATE->m_pCurSong; Notes* m_pNotes = GAMESTATE->m_pCurNotes[ pn ]; - if( m_pNotes ) - m_HighScore[pn].SetScore( (float)m_pNotes->m_iTopScore ); - for( int i=0; i NUM_SORT_ORDERS-1 ) - m_SortOrder = (SongSortOrder)0; - m_sExpandedSectionName = GetSectionNameFromSongAndSort( pPrevSelectedSong, m_SortOrder ); + GAMESTATE->m_SongSortOrder = SongSortOrder( (GAMESTATE->m_SongSortOrder+1) % NUM_SORT_ORDERS ); + m_sExpandedSectionName = GetSectionNameFromSongAndSort( pPrevSelectedSong, GAMESTATE->m_SongSortOrder ); //RebuildWheelItems(); - m_MusicSortDisplay.Set( m_SortOrder ); - m_MusicSortDisplay.BeginTweening( FADE_TIME, TWEEN_BIAS_BEGIN ); - m_MusicSortDisplay.SetTweenXY( SORT_ICON_ON_SCREEN_X, SORT_ICON_ON_SCREEN_Y ); - - m_iSelection = 0; if( pPrevSelectedSong != NULL ) // the previous selected item was a song @@ -948,7 +900,7 @@ void MusicWheel::Update( float fDeltaTime ) { m_fPositionOffsetFromSelection = clamp( m_fPositionOffsetFromSelection, -0.3f, +0.3f ); - float fSpringForce = - m_fPositionOffsetFromSelection*LOCKED_WHEEL_INITIAL_VELOCITY; + float fSpringForce = - m_fPositionOffsetFromSelection * LOCKED_INITIAL_VELOCITY; m_fLockedWheelVelocity += fSpringForce; float fDrag = -m_fLockedWheelVelocity * fDeltaTime*4; @@ -967,9 +919,9 @@ void MusicWheel::Update( float fDeltaTime ) // "rotate" wheel toward selected song float fSpinSpeed; if( m_WheelState == STATE_ROULETTE_SPINNING ) - fSpinSpeed = 1.0f/ROULETTE_SWITCH_MUSIC_TIME; + fSpinSpeed = 1.0f/ROULETTE_SWITCH_SECONDS; else - fSpinSpeed = 0.6f + fabsf(m_fPositionOffsetFromSelection)/SWITCH_MUSIC_TIME; + fSpinSpeed = 0.6f + fabsf(m_fPositionOffsetFromSelection)/SWITCH_SECONDS; if( m_fPositionOffsetFromSelection > 0 ) { @@ -997,7 +949,7 @@ void MusicWheel::PrevMusic( bool bSendSongChangedMessage ) { if( m_WheelState == STATE_LOCKED ) { - m_fLockedWheelVelocity = LOCKED_WHEEL_INITIAL_VELOCITY; + m_fLockedWheelVelocity = LOCKED_INITIAL_VELOCITY; m_soundLocked.Play(); return; } @@ -1042,7 +994,7 @@ void MusicWheel::NextMusic( bool bSendSongChangedMessage ) { if( m_WheelState == STATE_LOCKED ) { - m_fLockedWheelVelocity = -LOCKED_WHEEL_INITIAL_VELOCITY; + m_fLockedWheelVelocity = -LOCKED_INITIAL_VELOCITY; m_soundLocked.Play(); return; } @@ -1102,13 +1054,11 @@ void MusicWheel::NextSort() } m_soundChangeSort.Play(); - m_MusicSortDisplay.BeginTweening( FADE_TIME, TWEEN_BIAS_END ); - m_MusicSortDisplay.SetTweenXY( SORT_ICON_OFF_SCREEN_X, SORT_ICON_OFF_SCREEN_Y ); TweenOffScreen(); m_WheelState = STATE_FLYING_OFF_BEFORE_NEXT_SORT; - m_fTimeLeftInState = FADE_TIME; + m_fTimeLeftInState = FADE_SECONDS; } bool MusicWheel::Select() // return true of a playable item was chosen @@ -1118,7 +1068,7 @@ bool MusicWheel::Select() // return true of a playable item was chosen if( m_WheelState == STATE_ROULETTE_SPINNING ) { m_WheelState = STATE_ROULETTE_SLOWING_DOWN; - m_iSwitchesLeftInSpinDown = ROULETTE_SWITCHES_IN_SLOWING_DOWN/2+1 + rand()%(ROULETTE_SWITCHES_IN_SLOWING_DOWN/2); + m_iSwitchesLeftInSpinDown = ROULETTE_SLOW_DOWN_SWITCHES/2+1 + rand()%(ROULETTE_SLOW_DOWN_SWITCHES/2); m_fTimeLeftInState = 0.1f; return false; } @@ -1157,9 +1107,7 @@ bool MusicWheel::Select() // return true of a playable item was chosen case TYPE_ROULETTE: m_soundExpand.Play(); m_WheelState = STATE_ROULETTE_SPINNING; - m_SortOrder = SORT_GROUP; - m_MusicSortDisplay.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); - m_MusicSortDisplay.SetEffectNone(); + GAMESTATE->m_SongSortOrder = SORT_GROUP; BuildWheelItemDatas( m_WheelItemDatas[SORT_GROUP], SORT_GROUP, true ); return false; @@ -1173,24 +1121,17 @@ bool MusicWheel::Select() // return true of a playable item was chosen void MusicWheel::TweenOnScreen() { m_WheelState = STATE_TWEENING_ON_SCREEN; - m_fTimeLeftInState = FADE_TIME; - - - m_MusicSortDisplay.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); - m_MusicSortDisplay.BeginTweening( FADE_TIME ); - m_MusicSortDisplay.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,1) ); - + m_fTimeLeftInState = FADE_SECONDS; float fX, fY; fX = GetBannerX(0); fY = GetBannerY(0); - m_frameOverlay.SetXY( fX+320, fY ); - m_frameOverlay.BeginTweeningQueued( 0.5f ); // sleep - m_frameOverlay.BeginTweeningQueued( 0.4f, Actor::TWEEN_BIAS_BEGIN ); - m_frameOverlay.SetTweenX( fX ); - + m_sprSelectionOverlay.SetXY( fX+320, fY ); + m_sprSelectionOverlay.BeginTweeningQueued( 0.5f ); // sleep + m_sprSelectionOverlay.BeginTweeningQueued( 0.4f, Actor::TWEEN_BIAS_BEGIN ); + m_sprSelectionOverlay.SetTweenX( fX ); fX = m_ScrollBar.GetX(); @@ -1218,29 +1159,16 @@ void MusicWheel::TweenOnScreen() void MusicWheel::TweenOffScreen() { m_WheelState = STATE_TWEENING_OFF_SCREEN; - m_fTimeLeftInState = FADE_TIME; - - - m_MusicSortDisplay.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); - m_MusicSortDisplay.SetEffectNone(); - m_MusicSortDisplay.BeginTweening( FADE_TIME ); - m_MusicSortDisplay.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,0) ); - - - for( int p=0; p m_WheelItemDatas[NUM_SORT_ORDERS]; - CArray &GetCurWheelItemDatas() { return m_WheelItemDatas[m_SortOrder]; }; + CArray &GetCurWheelItemDatas(); WheelItemDisplay m_WheelItemDisplays[NUM_WHEEL_ITEMS_TO_DRAW]; diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index 9e4799199d..a1453477a2 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -176,8 +176,10 @@ void NoteData::ClearRange( int iNoteIndexBegin, int iNoteIndexEnd ) for( iIndexRead = 0; iIndexRead < iOrigNumHoldNotes; iIndexRead++ ) { HoldNote &hn = m_HoldNotes[iIndexRead]; - if( (hn.m_iStartIndex >= iNoteIndexBegin && hn.m_iStartIndex <= iNoteIndexEnd) || - (hn.m_iEndIndex >= iNoteIndexBegin && hn.m_iEndIndex <= iNoteIndexEnd) ) // overlap (kinda) + int iHoldStartIndex = BeatToNoteRow( hn.m_fStartBeat ); + int iHoldEndIndex = BeatToNoteRow( hn.m_fEndBeat ); + if( (iHoldStartIndex >= iNoteIndexBegin && iHoldStartIndex <= iNoteIndexEnd) || + (iHoldEndIndex >= iNoteIndexBegin && iHoldEndIndex <= iNoteIndexEnd) ) // overlap (kinda) { ; // do nothing } @@ -227,63 +229,64 @@ void NoteData::AddHoldNote( HoldNote add ) { HoldNote &other = m_HoldNotes[i]; if( add.m_iTrack == other.m_iTrack && // the notes correspond - other.m_iStartIndex <= add.m_iEndIndex && - other.m_iEndIndex >= add.m_iStartIndex ) // these HoldNotes overlap (this isn't entirely correct!) + other.m_fStartBeat <= add.m_fEndBeat && + other.m_fEndBeat >= add.m_fStartBeat ) // these HoldNotes overlap (this isn't entirely correct!) { - add.m_iStartIndex = min(add.m_iStartIndex, other.m_iStartIndex); - add.m_iEndIndex = max(add.m_iEndIndex, other.m_iEndIndex); + add.m_fStartBeat = min(add.m_fStartBeat, other.m_fStartBeat); + add.m_fEndBeat = max(add.m_fEndBeat, other.m_fEndBeat); // delete this HoldNote for( int j=i; j 0 && index < m_iNumHoldNotes ); + ASSERT( iHoldIndex > 0 && iHoldIndex < m_iNumHoldNotes ); + + HoldNote& hn = m_HoldNotes[iHoldIndex]; + + int iHoldStartIndex = BeatToNoteRow(hn.m_fStartBeat); + int iHoldEndIndex = BeatToNoteRow(hn.m_fEndBeat); // delete a tap note at the start of this hold - HoldNote &hn = m_HoldNotes[index]; - m_TapNotes[hn.m_iTrack][hn.m_iStartIndex] = '0'; + m_TapNotes[hn.m_iTrack][iHoldStartIndex] = '0'; // remove from list - for( int j=index; j=iOldestIndexFoundSoFar; i-- ) // iterate back to front + for( i=MAX_TAP_NOTE_ROWS-1; i>=0; i-- ) // iterate back to front { if( !IsRowEmpty(i) ) { - iOldestIndexFoundSoFar = i; + fOldestBeatFoundSoFar = NoteRowToBeat(i); break; } } for( i=0; i iOldestIndexFoundSoFar ) - iOldestIndexFoundSoFar = m_HoldNotes[i].m_iEndIndex; + if( m_HoldNotes[i].m_fEndBeat > fOldestBeatFoundSoFar ) + fOldestBeatFoundSoFar = m_HoldNotes[i].m_fEndBeat; } - return iOldestIndexFoundSoFar; -} - -float NoteData::GetLastBeat() -{ - return NoteRowToBeat( GetLastRow() ); + return fOldestBeatFoundSoFar; } int NoteData::GetNumTapNotes( const float fStartBeat, const float fEndBeat ) @@ -356,13 +360,9 @@ int NoteData::GetNumTapNotes( const float fStartBeat, const float fEndBeat ) int iEndIndex = BeatToNoteRow( fEndBeat ); for( int i=iStartIndex; iGetPathTo(GRAPHIC_COLOR_ARROW_GRAY_PART) ); +// m_sprTapParts.Load( THEME->GetPathTo(GRAPHIC_COLOR_ARROW_COLOR_PART) ); + +} + + +void NoteDisplay::Load( int iColNum, PlayerNumber pn ) +{ + m_PlayerNumber = pn; + + CString sPath; + + sPath = GAMEMAN->GetPathTo(iColNum, GRAPHIC_TAP_PARTS); + m_sprTapParts.Load( sPath ); + if( m_sprTapParts.GetNumStates() % 2 != 0 ) + throw RageException( "Tap Parts '%s' must have an even number of frames.", sPath ); + + sPath = GAMEMAN->GetPathTo(iColNum, GRAPHIC_HOLD_PARTS); + m_sprHoldParts.Load( sPath ); + if( m_sprHoldParts.GetNumStates() != 16 ) + throw RageException( "Hold Parts '%s' must have 16 frames.", sPath ); + + m_sprTapParts.StopAnimating(); + m_sprTapParts.TurnShadowOff(); + m_sprHoldParts.StopAnimating(); + m_sprHoldParts.TurnShadowOff(); + m_colorTapTweens.RemoveAll(); + GAMEMAN->GetTapTweenColors( iColNum, m_colorTapTweens ); +} + + +int NoteDisplay::GetTapGrayFrameNo( const float fNoteBeat ) +{ + const int iNumGrayPartFrames = m_sprTapParts.GetNumStates()/2; + + const float fSongBeat = GAMESTATE->m_fSongBeat; + const float fPercentIntoBeat = fSongBeat - (int)fSongBeat; + int iFrameNo = int(fPercentIntoBeat * iNumGrayPartFrames) % iNumGrayPartFrames; + if( iFrameNo < 0 ) + iFrameNo += iNumGrayPartFrames; + + return iFrameNo * 2; +} + +int NoteDisplay::GetTapColorFrameNo( const float fNoteBeat ) +{ + return GetTapGrayFrameNo(fNoteBeat) + 1; +} + +void NoteDisplay::GetTapEdgeColors( const float fNoteBeat, D3DXCOLOR &colorLeadingOut, D3DXCOLOR &colorTrailingOut ) +{ +// Chris: If EZ2 doesn't use these values, it can just ignore them. +// +// Andy: +// if (GAMESTATE->m_CurGame == GAME_EZ2) +// { +// return; // Get out of this, as it breaks EZ2, and besides, Ez2 doesn't use COLOR ARROWS +// } + + //////////////////////////////////////////////////////////// + // ADDED 2-14-2002 - BrianB + // + // This section has been added for the different arrow + // display types: + // + // Note: Each note has a different color, but does not tween + // Flat: Each note has the same color, and does tween + // Plain: Each note has the same color, but does not tween + // + //////////////////////////////////////////////////////////// + + const PlayerOptions::ColorType ct = GAMESTATE->m_PlayerOptions[m_PlayerNumber].m_ColorType; + const float fNotePercentIntoBeat = fNoteBeat - (int)fNoteBeat; + const float fSongBeat = GAMESTATE->m_fSongBeat; + float fPercentThroughColors = fmodf( fSongBeat, (float)BEATS_PER_MEASURE ) / BEATS_PER_MEASURE; + + switch( ct ) + { + case PlayerOptions::COLOR_VIVID: + case PlayerOptions::COLOR_NOTE: + fPercentThroughColors += fNotePercentIntoBeat; + break; + } + if( fPercentThroughColors < 0 ) + fPercentThroughColors += 1; + else + fPercentThroughColors -= (int)fPercentThroughColors; + + + + float fPercentThroughColorsLeading; // fill these in below + float fPercentThroughColorsTrailing; + switch( ct ) + { + case PlayerOptions::COLOR_VIVID: + case PlayerOptions::COLOR_NOTE: + case PlayerOptions::COLOR_FLAT: + // use different edge colors so that the arrows look more colorful + fPercentThroughColorsLeading = fPercentThroughColors; + fPercentThroughColorsTrailing = fmodf( fPercentThroughColors + 0.20f, 1 ); + break; + case PlayerOptions::COLOR_PLAIN: + // use same colors for both edges, making it look "plain" + fPercentThroughColorsLeading = fPercentThroughColors; + fPercentThroughColorsTrailing = fPercentThroughColors; + break; + default: + ASSERT(0); + } + + + if( ct == PlayerOptions::COLOR_NOTE ) + { + D3DXCOLOR color = GetNoteColorFromBeat( fNoteBeat ); + colorLeadingOut = color; + colorTrailingOut = color; + + // add a little bit of white so the note doesn't look so plain + colorLeadingOut.r += 0.3f * fabsf( fPercentThroughColorsLeading - 0.5f ); + colorLeadingOut.g += 0.3f * fabsf( fPercentThroughColorsLeading - 0.5f ); + colorLeadingOut.b += 0.3f * fabsf( fPercentThroughColorsLeading - 0.5f ); + colorTrailingOut.r += 0.3f * fabsf( fPercentThroughColorsTrailing - 0.5f ); + colorTrailingOut.g += 0.3f * fabsf( fPercentThroughColorsTrailing - 0.5f ); + colorTrailingOut.b += 0.3f * fabsf( fPercentThroughColorsTrailing - 0.5f ); + return; + } + + float fLeadingColorIndex = fPercentThroughColorsLeading * m_colorTapTweens.GetSize(); + float fTrailingColorIndex = fPercentThroughColorsTrailing* m_colorTapTweens.GetSize(); + + float fLeadingColorWeightOf2 = fLeadingColorIndex - int(fLeadingColorIndex); + int iLeadingColor1 = int(fLeadingColorIndex); + int iLeadingColor2 = (iLeadingColor1 + 1) % m_colorTapTweens.GetSize(); + colorLeadingOut = m_colorTapTweens[iLeadingColor1] * (1-fLeadingColorWeightOf2) + m_colorTapTweens[iLeadingColor2] * fLeadingColorWeightOf2; + + float fTrailingColorWeightOf2 = fTrailingColorIndex - int(fTrailingColorIndex); + int iTrailingColor1 = int(fTrailingColorIndex); + int iTrailingColor2 = (iTrailingColor1 + 1) % m_colorTapTweens.GetSize(); + colorTrailingOut = m_colorTapTweens[iTrailingColor1] * (1-fTrailingColorWeightOf2) + m_colorTapTweens[iTrailingColor2] * fTrailingColorWeightOf2; +} + +/* +D3DXCOLOR NoteDisplay::GetHoldColor( const float fY, const float fYTop, const float fYBottom ) +{ + if( fY == fYTop ) + return m_colorHoldTweens[0]; + + float fDistFromEnd = fYBottom - fY; + float fArrowSizesFromEnd = fDistFromEnd / (float)ARROW_SIZE; + float fPercentThroughColors = fmodf( fArrowSizesFromEnd, 2 ) / 2.0f; + float fIndex = fPercentThroughColors * (m_colorHoldTweens.GetSize()-1); + float fWeightOf2 = fIndex - int(fIndex); + int iColor1 = int(fIndex); + int iColor2 = (iColor1+1) % m_colorHoldTweens.GetSize(); + return m_colorHoldTweens[iColor1] * (1-fWeightOf2) + m_colorHoldTweens[iColor2] * fWeightOf2; +} +*/ + +float NoteDisplay::GetAddAlpha( float fDiffuseAlpha, float fPercentFadeToFail ) +{ + if( fPercentFadeToFail != -1 ) + return 1-fPercentFadeToFail; + + float fDistFromCenter = fabsf( 0.5f - fDiffuseAlpha ); + return clamp( 1-fDistFromCenter*2, 0, 1 ); +} + + +/* +void NoteDisplay::DrawList( int iCount, NoteDisplayInstance cni[], bool bDrawAddPass ) +{ + int iNumV; + + LPDIRECT3DVERTEXBUFFER8 pVB = DISPLAY->GetVertexBuffer(); + RAGEVERTEX* v; + + LPDIRECT3DDEVICE8 pd3dDevice = DISPLAY->GetDevice(); + + pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); + pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); + + pd3dDevice->SetVertexShader( D3DFVF_RAGEVERTEX ); + pd3dDevice->SetStreamSource( 0, pVB, sizeof(RAGEVERTEX) ); + + + const float fGrayWidth = m_sprHoldParts.GetUnzoomedWidth(); + const float fGrayHeight = m_sprHoldParts.GetUnzoomedHeight(); + const float fColorWidth = m_sprTapParts.GetUnzoomedWidth(); + const float fColorHeight = m_sprTapParts.GetUnzoomedHeight(); + + RageTexture* pGrayTexture = m_sprHoldParts.GetTexture(); + RageTexture* pColorTexture = m_sprTapParts.GetTexture(); + + // + // Draw gray parts diffuse pass + // + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + + pd3dDevice->SetTexture( 0, pGrayTexture->GetD3DTexture() ); + + pVB->Lock( 0, 0, (BYTE**)&v, 0 ); + + iNumV = 0; + for( int i=0; ifX; + const float fY = pCNI->fY; + const float fRotation = pCNI->fRotation; + D3DXVECTOR3 vecPoints[4]; // top left, bottom left, top right, bottom right + + + // + // Set vertex positions + // + vecPoints[0] = D3DXVECTOR3( -fGrayWidth/2, -fGrayHeight/2, 0 ); // top left + vecPoints[1] = D3DXVECTOR3( -fGrayWidth/2, +fGrayHeight/2, 0 ); // bottom left + vecPoints[2] = D3DXVECTOR3( +fGrayWidth/2, -fGrayHeight/2, 0 ); // top right + vecPoints[3] = D3DXVECTOR3( +fGrayWidth/2, +fGrayHeight/2, 0 ); // bottom right + + if( fRotation != 0 ) + { + D3DXMATRIX matRotation; + D3DXMatrixRotationZ( &matRotation, fRotation ); + + for( int j=0; j<4; j++ ) + D3DXVec3TransformCoord( &vecPoints[j], &vecPoints[j], &matRotation ); + } + for( int j=0; j<4; j++ ) + { + vecPoints[j].x += fX; + vecPoints[j].y += fY; + } + + // first triangle + v[iNumV++].p = vecPoints[0]; // top left + v[iNumV++].p = vecPoints[1]; // bottom left + v[iNumV++].p = vecPoints[2]; // top right + // 2nd triangle + v[iNumV++].p = vecPoints[2]; // top right + v[iNumV++].p = vecPoints[1]; // bottom left + v[iNumV++].p = vecPoints[3]; // bottom right + + // + // set texture coordinates + // + iNumV -= 6; + + FRECT* pTexCoordRect = pGrayTexture->GetTextureCoordRect( pCNI->iGrayPartFrameNo ); + + v[iNumV++].t = D3DXVECTOR2( pTexCoordRect->left, pTexCoordRect->top ); // top left + v[iNumV++].t = D3DXVECTOR2( pTexCoordRect->left, pTexCoordRect->bottom ); // bottom left + v[iNumV++].t = D3DXVECTOR2( pTexCoordRect->right, pTexCoordRect->top ); // top right + v[iNumV++].t = v[iNumV-1].t; // top right + v[iNumV++].t = v[iNumV-3].t; // bottom left + v[iNumV++].t = D3DXVECTOR2( pTexCoordRect->right, pTexCoordRect->bottom ); // bottom right + + // + // set vertex colors + // + iNumV -= 6; + + D3DXCOLOR colorGrayPart(1,1,1,pCNI->fAlpha); + + v[iNumV++].color = colorGrayPart; // top left + v[iNumV++].color = colorGrayPart; // bottom left + v[iNumV++].color = colorGrayPart; // top right + v[iNumV++].color = colorGrayPart; // top right + v[iNumV++].color = colorGrayPart; // bottom left + v[iNumV++].color = colorGrayPart; // bottom right + + } + ASSERT( iNumV == iCount*6 ); // two triangles for each note + + pVB->Unlock(); + + pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, iNumV/3 ); + + + // + // Draw gray parts add pass + // + if( bDrawAddPass ) + { + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + + pVB->Lock( 0, 0, (BYTE**)&v, 0 ); + + + iNumV = 0; + for( int i=0; ifAddAlpha); + + // + // set vertex colors + // + v[iNumV++].color = colorAdd; // top left + v[iNumV++].color = colorAdd; // bottom left + v[iNumV++].color = colorAdd; // top right + v[iNumV++].color = colorAdd; // top right + v[iNumV++].color = colorAdd; // bottom left + v[iNumV++].color = colorAdd; // bottom right + + } + ASSERT( iNumV == iCount*6 ); // two triangles for each note + + pVB->Unlock(); + + pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, iNumV/3 ); + } + + + + + + + + + // + // Draw color parts diffuse pass + // + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + + pd3dDevice->SetTexture( 0, pColorTexture->GetD3DTexture() ); + + pVB->Lock( 0, 0, (BYTE**)&v, 0 ); + + iNumV = 0; + for( i=0; ifX; + const float fY = pCNI->fY; + const float fRotation = pCNI->fRotation; + D3DXVECTOR3 vecPoints[4]; // top left, bottom left, top right, bottom right + + // + // Set vertex positions + // + vecPoints[0] = D3DXVECTOR3( -fColorWidth/2, -fColorHeight/2, 0 ); // top left + vecPoints[1] = D3DXVECTOR3( -fColorWidth/2, +fColorHeight/2, 0 ); // bottom left + vecPoints[2] = D3DXVECTOR3( +fColorWidth/2, -fColorHeight/2, 0 ); // top right + vecPoints[3] = D3DXVECTOR3( +fColorWidth/2, +fColorHeight/2, 0 ); // bottom right + + if( fRotation != 0 ) + { + D3DXMATRIX matRotation; + D3DXMatrixRotationZ( &matRotation, fRotation ); + + for( int j=0; j<4; j++ ) + D3DXVec3TransformCoord( &vecPoints[j], &vecPoints[j], &matRotation ); + } + for( int j=0; j<4; j++ ) + { + vecPoints[j].x += fX; + vecPoints[j].y += fY; + } + + // first triangle + v[iNumV++].p = vecPoints[0]; // top left + v[iNumV++].p = vecPoints[1]; // bottom left + v[iNumV++].p = vecPoints[2]; // top right + // 2nd triangle + v[iNumV++].p = vecPoints[2]; // top right + v[iNumV++].p = vecPoints[1]; // bottom left + v[iNumV++].p = vecPoints[3]; // bottom right + + // + // set texture coordinates + // + iNumV -= 6; + + FRECT* pTexCoordRect = pColorTexture->GetTextureCoordRect( pCNI->iColorPartFrameNo ); + + v[iNumV++].t = D3DXVECTOR2( pTexCoordRect->left, pTexCoordRect->top ); // top left + v[iNumV++].t = D3DXVECTOR2( pTexCoordRect->left, pTexCoordRect->bottom ); // bottom left + v[iNumV++].t = D3DXVECTOR2( pTexCoordRect->right, pTexCoordRect->top ); // top right + v[iNumV++].t = v[iNumV-1].t; // top right + v[iNumV++].t = v[iNumV-3].t; // bottom left + v[iNumV++].t = D3DXVECTOR2( pTexCoordRect->right, pTexCoordRect->bottom ); // bottom right + + // + // set vertex colors + // + iNumV -= 6; + + D3DXCOLOR colorLeadingEdge = D3DXCOLOR(pCNI->colorLeadingEdge); + D3DXCOLOR colorTrailingEdge = D3DXCOLOR(pCNI->colorTrailingEdge); + + colorLeadingEdge.a = pCNI->fAlpha; + colorTrailingEdge.a = pCNI->fAlpha; + + v[iNumV++].color = colorLeadingEdge; // top left + v[iNumV++].color = colorTrailingEdge; // bottom left + v[iNumV++].color = colorLeadingEdge; // top right + v[iNumV++].color = v[iNumV-1].color; // top right + v[iNumV++].color = v[iNumV-3].color; // bottom left + v[iNumV++].color = colorTrailingEdge; // bottom right + + } + ASSERT( iNumV == iCount*6 ); // two triangles for each note + + pVB->Unlock(); + + pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, iNumV/3 ); + + + // + // Draw Color parts add pass + // + if( bDrawAddPass ) + { + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); + + pVB->Lock( 0, 0, (BYTE**)&v, 0 ); + + + iNumV = 0; + for( int i=0; ifAddAlpha); + + // + // set vertex colors + // + v[iNumV++].color = colorAdd; // top left + v[iNumV++].color = colorAdd; // bottom left + v[iNumV++].color = colorAdd; // top right + v[iNumV++].color = colorAdd; // top right + v[iNumV++].color = colorAdd; // bottom left + v[iNumV++].color = colorAdd; // bottom right + + } + ASSERT( iNumV == iCount*6 ); // two triangles for each note + + pVB->Unlock(); + + pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, iNumV/3 ); + } +} +*/ + + +void NoteDisplay::DrawHold( const HoldNote& hn, const bool bActive, const float fLife, const float fPercentFadeToFail ) +{ + const int iCol = hn.m_iTrack; + const float fStartYOffset = ArrowGetYOffset2( m_PlayerNumber, hn.m_fStartBeat ); + const float fStartYPos = ArrowGetYPos( m_PlayerNumber, fStartYOffset ); + const float fEndYOffset = ArrowGetYOffset2( m_PlayerNumber, hn.m_fEndBeat ); + const float fEndYPos = ArrowGetYPos( m_PlayerNumber, fEndYOffset ); + + // draw from bottom to top + const float fFrameWidth = m_sprHoldParts.GetUnzoomedWidth(); + const float fFrameHeight = m_sprHoldParts.GetUnzoomedHeight(); + const float fBodyHeight = fFrameHeight*4; + + const float fYHead = min(fStartYPos, fEndYPos); // stop drawing here + const float fYTail = max(fStartYPos, fEndYPos); // the center the tail + + const float fYTailTop = fYTail-fFrameHeight/2; + const float fYTailBottom = fYTail+fFrameHeight/2; + + const float fYBodyTop = fYHead; // middle of head + const float fYBodyBottom = fYTailTop; // top of tail + + const int fYStep = 8; // draw a segment every 8 pixels // this requires that the texture dimensions be a multiple of 8 + + DISPLAY->SetBlendModeNormal(); + DISPLAY->SetColorTextureMultDiffuse(); + DISPLAY->SetAlphaTextureMultDiffuse(); + DISPLAY->SetTexture( m_sprHoldParts.GetTexture() ); + + // + // Draw the tail + // + float fY; + for( fY=max(fYTailTop,fYHead); fYAddQuad( + D3DXVECTOR3(fXTopLeft-0.5f, fYTop-0.5f, 0), colorDiffuseTop, D3DXVECTOR2(fTexCoordLeft, fTexCoordTop), colorAddTop, // top-left + D3DXVECTOR3(fXTopRight-0.5f, fYTop-0.5f, 0), colorDiffuseTop, D3DXVECTOR2(fTexCoordRight, fTexCoordTop), colorAddTop, // top-right + D3DXVECTOR3(fXBottomLeft-0.5f, fYBottom-0.5f,0), colorDiffuseBottom, D3DXVECTOR2(fTexCoordLeft, fTexCoordBottom), colorAddBottom, // bottom-left + D3DXVECTOR3(fXBottomRight-0.5f,fYBottom-0.5f,0), colorDiffuseBottom, D3DXVECTOR2(fTexCoordRight, fTexCoordBottom), colorAddBottom ); // bottom-right + } + + // + // Draw the body + // + for( fY=fYBodyTop; fYAddQuad( + D3DXVECTOR3(fXTopLeft-0.5f, fYTop-0.5f, 0), colorDiffuseTop, D3DXVECTOR2(fTexCoordLeft, fTexCoordTop), colorAddTop, // top-left + D3DXVECTOR3(fXTopRight-0.5f, fYTop-0.5f, 0), colorDiffuseTop, D3DXVECTOR2(fTexCoordRight, fTexCoordTop), colorAddTop, // top-right + D3DXVECTOR3(fXBottomLeft-0.5f, fYBottom-0.5f,0), colorDiffuseBottom, D3DXVECTOR2(fTexCoordLeft, fTexCoordBottom), colorAddBottom, // bottom-left + D3DXVECTOR3(fXBottomRight-0.5f,fYBottom-0.5f,0), colorDiffuseBottom, D3DXVECTOR2(fTexCoordRight, fTexCoordBottom), colorAddBottom ); // bottom-right + } + + DISPLAY->FlushQueue(); + + + // + // Draw head + // + { + fY = fYHead; + const float fX = ArrowGetXPos2( m_PlayerNumber, iCol, fY ); + const float fAlpha = ArrowGetAlpha( m_PlayerNumber, fY ); + const float fAddAlpha = GetAddAlpha( fAlpha, fPercentFadeToFail ); + const float fColorScale = SCALE(fLife,0,1,0.5f,1); + const D3DXCOLOR colorDiffuse= D3DXCOLOR(fColorScale,fColorScale,fColorScale,fAlpha); + const D3DXCOLOR colorAdd = D3DXCOLOR(1,1,1,fAddAlpha); + + m_sprHoldParts.SetState( bActive?1:0 ); + m_sprHoldParts.SetXY( fX, fY ); + m_sprHoldParts.SetDiffuseColor( colorDiffuse ); + m_sprHoldParts.SetAddColor( colorAdd ); + m_sprHoldParts.Draw(); + } +} + +void NoteDisplay::DrawTap( const int iCol, const float fBeat, const bool bUseHoldColor, const float fPercentFadeToFail ) +{ + const float fYOffset = ArrowGetYOffset2( m_PlayerNumber, fBeat ); + const float fYPos = ArrowGetYPos( m_PlayerNumber, fYOffset ); + const float fRotation = ArrowGetRotation( m_PlayerNumber, iCol, fYOffset ); + const float fXPos = ArrowGetXPos2( m_PlayerNumber, iCol, fYPos ); + const float fAlpha = ArrowGetAlpha( m_PlayerNumber, fYPos ); + const float fAddAlpha = GetAddAlpha( fAlpha, fPercentFadeToFail ); + const int iGrayPartFrameNo = GetTapGrayFrameNo( fBeat ); + const int iColorPartFrameNo = GetTapColorFrameNo( fBeat ); + + D3DXCOLOR colorGrayPart = D3DXCOLOR(1,1,1,1); + D3DXCOLOR colorLeadingEdge; + D3DXCOLOR colorTrailingEdge; + if( bUseHoldColor ) + colorLeadingEdge = colorTrailingEdge = D3DXCOLOR(0,1,0,1); // HACK: green. + else + GetTapEdgeColors( fBeat, colorLeadingEdge, colorTrailingEdge ); + colorGrayPart.a *= fAlpha; + colorLeadingEdge.a *= fAlpha; + colorTrailingEdge.a *= fAlpha; + + m_sprTapParts.SetXY( fXPos, fYPos ); + m_sprTapParts.SetRotation( fRotation ); + m_sprTapParts.SetAddColor( D3DXCOLOR(1,1,1,fAddAlpha) ); + + // + // draw gray part + // + m_sprTapParts.SetState( iGrayPartFrameNo ); + m_sprTapParts.SetDiffuseColor( colorGrayPart ); + m_sprTapParts.Draw(); + + // + // draw color part + // + m_sprTapParts.SetState( iColorPartFrameNo ); + m_sprTapParts.SetDiffuseColorTopEdge( colorLeadingEdge ); + m_sprTapParts.SetDiffuseColorBottomEdge( colorTrailingEdge ); + m_sprTapParts.Draw(); +} \ No newline at end of file diff --git a/stepmania/src/NoteDisplay.h b/stepmania/src/NoteDisplay.h new file mode 100644 index 0000000000..a07f0cedcd --- /dev/null +++ b/stepmania/src/NoteDisplay.h @@ -0,0 +1,43 @@ +#pragma once +/* +----------------------------------------------------------------------------- + Class: NoteDisplay + + Desc: Draws TapNotes and HoldNotes. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Brian Bugh + Ben Nordstrom + Chris Danford +----------------------------------------------------------------------------- +*/ + +#include "Sprite.h" +#include "NoteTypes.h" + + +class NoteDisplay +{ +public: + NoteDisplay(); + + void Load( int iColNum, PlayerNumber pn ); + + void DrawTap( const int iCol, const float fBeat, const bool bUseHoldColor, const float fPercentFadeToFail ); + void DrawHold( const HoldNote& hn, const bool bActive, const float fLife, const float fPercentFadeToFail ); + +protected: + int GetTapGrayFrameNo( const float fNoteBeat ); + int GetTapColorFrameNo( const float fNoteBeat ); + void GetTapEdgeColors( const float fNoteBeat, D3DXCOLOR &colorLeadingOut, D3DXCOLOR &colorTrailingOut ); +// D3DXCOLOR GetHoldColor( const float fY, const float fYTop, const float fYBottom ); + float GetAddAlpha( float DiffuseAlpha, const float fPercentFadeToFail ); + + PlayerNumber m_PlayerNumber; // to look up PlayerOptions + + Sprite m_sprTapParts; // for now, must be an even number of frames + Sprite m_sprHoldParts; // for now, must be 16 frames + + CArray m_colorTapTweens; +// CArray m_colorHoldTweens; +}; diff --git a/stepmania/src/NoteField.cpp b/stepmania/src/NoteField.cpp index fbef7a188d..66777c4c22 100644 --- a/stepmania/src/NoteField.cpp +++ b/stepmania/src/NoteField.cpp @@ -30,7 +30,7 @@ NoteField::NoteField() { m_rectMeasureBar.TurnShadowOff(); - m_textMeasureNumber.Load( THEME->GetPathTo(FONT_NORMAL) ); + m_textMeasureNumber.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textMeasureNumber.SetZoom( 1.0f ); m_rectMarkerBar.TurnShadowOff(); @@ -59,11 +59,9 @@ void NoteField::Load( NoteData* pNoteData, PlayerNumber pn, int iPixelsToDrawBeh this->CopyAll( pNoteData ); - // init arrow rotations and X positions + // init note displays for( int c=0; cm_PlayerOptions[m_PlayerNumber].m_fArrowScrollSpeed); const float fBeatsToDrawAhead = m_iPixelsToDrawAhead * (1/(float)ARROW_SIZE) * (1/GAMESTATE->m_PlayerOptions[m_PlayerNumber].m_fArrowScrollSpeed); - const int iIndexFirstArrowToDraw = max( 0, BeatToNoteRow( fSongBeat - fBeatsToDrawBehind ) ); - const int iIndexLastArrowToDraw = BeatToNoteRow( fSongBeat + fBeatsToDrawAhead ); + const float fFirstBeatToDraw = max( 0, fSongBeat - fBeatsToDrawBehind ); + const float fLastBeatToDraw = fSongBeat + fBeatsToDrawAhead; + const int iFirstIndexToDraw = BeatToNoteRow(fFirstBeatToDraw); + const int iLastIndexToDraw = BeatToNoteRow(fLastBeatToDraw); //LOG->Trace( "Drawing elements %d through %d", iIndexFirstArrowToDraw, iIndexLastArrowToDraw ); if( GAMESTATE->m_bEditing ) { + int i; + // // Draw measure bars // - for( int i=iIndexFirstArrowToDraw; i<=iIndexLastArrowToDraw; i++ ) - { - if( i % ELEMENTS_PER_MEASURE == 0 ) - DrawMeasureBar( i, i / ELEMENTS_PER_MEASURE + 1 ); - } + for( float b=fFirstBeatToDraw; b<=fLastBeatToDraw; b+=1 ) + DrawMeasureBar( int(b) ); // // BPM text // CArray &aBPMSegments = GAMESTATE->m_pCurSong->m_BPMSegments; for( i=0; i &aStopSegments = GAMESTATE->m_pCurSong->m_StopSegments; for( i=0; i iIndexLastArrowToDraw ) ) + if( !( fFirstBeatToDraw <= hn.m_fEndBeat && hn.m_fEndBeat <= fLastBeatToDraw || + fFirstBeatToDraw <= hn.m_fStartBeat && hn.m_fStartBeat <= fLastBeatToDraw || + hn.m_fStartBeat < fFirstBeatToDraw && hn.m_fEndBeat > fLastBeatToDraw ) ) { continue; // skip } - // If this note was in the past and has life > 0, then it was completed and don't draw it! - if( hn.m_iEndIndex < BeatToNoteRow(fSongBeat) && fLife > 0 && m_bIsHoldingHoldNote[i] ) - continue; // skip + m_NoteDisplay[c].DrawHold( hn, bIsHoldingNote, fLife, m_fPercentFadeToFail ); +// // If this note was in the past and has life > 0, then it was completed and don't draw it! +// if( hn.m_iEndIndex < BeatToNoteRow(fSongBeat) && fLife > 0 && m_bIsHoldingHoldNote[i] ) +// continue; // skip - const int iCol = hn.m_iTrack; - const float fHoldNoteLife = m_fHoldNoteLife[i]; - const bool bActive = m_bIsHoldingHoldNote[i]; // hack: added -1 because hn.m_iStartIndex changes as note is held - + /* // parts of the hold const float fStartDrawingAtBeat = froundf( (float)hn.m_iStartIndex, ROWS_BETWEEN_HOLD_BITS/GAMESTATE->m_PlayerOptions[m_PlayerNumber].m_fArrowScrollSpeed ); for( float j=fStartDrawingAtBeat; @@ -321,52 +294,44 @@ void NoteField::DrawPrimitives() CreateHoldNoteInstance( instances[iCount++], bActive, (float)j, hn, fHoldNoteLife ); } + */ } - const bool bDrawAddPass = GAMESTATE->m_PlayerOptions[m_PlayerNumber].m_AppearanceType != PlayerOptions::APPEARANCE_VISIBLE; - if( iCount > 0 ) - m_ColorNote[c].DrawList( iCount, instances, bDrawAddPass ); +// const bool bDrawAddPass = GAMESTATE->m_PlayerOptions[m_PlayerNumber].m_AppearanceType != PlayerOptions::APPEARANCE_VISIBLE; +// if( iCount > 0 ) +// m_ColorNote[c].DrawList( iCount, instances, bDrawAddPass ); - iCount = 0; // reset count +// iCount = 0; // reset count /////////////////////////////////// // Draw all TapNotes in this column /////////////////////////////////// - for( i=iIndexFirstArrowToDraw; i<=iIndexLastArrowToDraw; i++ ) // for each row + for( i=iFirstIndexToDraw; i<=iLastIndexToDraw; i++ ) // for each row { - if( m_TapNotes[c][i] == '0' ) - continue; // no note here + if( m_TapNotes[c][i] == '0' ) // no note here + continue; // skip - // See if there is a hold step that begins on this beat. - bool bHoldNoteOnThisBeat = false; - float fHoldLife = -1; - for( int j=0; j 0 ) - m_ColorNote[c].DrawList( iCount, instances, bDrawAddPass ); + + m_NoteDisplay[c].DrawTap( c, NoteRowToBeat(i), bHoldNoteBeginsOnThisBeat, m_fPercentFadeToFail ); + } } } diff --git a/stepmania/src/NoteField.h b/stepmania/src/NoteField.h index 4847a2d37b..1a3eefa306 100644 --- a/stepmania/src/NoteField.h +++ b/stepmania/src/NoteField.h @@ -17,11 +17,11 @@ #include "BitmapText.h" #include "PrefsManager.h" #include "StyleDef.h" -#include "ColorNote.h" #include "BitmapText.h" #include "Quad.h" #include "ArrowEffects.h" #include "NoteDataWithScoring.h" +#include "NoteDisplay.h" class NoteField : public NoteDataWithScoring, public ActorFrame @@ -31,22 +31,22 @@ public: virtual void Update( float fDeltaTime ); virtual void DrawPrimitives(); - void Load( NoteData* pNoteData, PlayerNumber pn, int iPixelsToDrawBehind, int iPixelsToDrawAhead ); - void RemoveTapNoteRow( int iIndex ); + void Load( NoteData* pNoteData, PlayerNumber pn, int iPixelsToDrawBehind, int iPixelsToDrawAhead ); + void RemoveTapNoteRow( int iIndex ); - bool m_bIsHoldingHoldNote[MAX_HOLD_NOTES]; // hack: Need this to prevent hold note jitter + bool m_bIsHoldingHoldNote[MAX_HOLD_NOTES]; // hack: Need this to know when to "light up" the center of hold notes float m_fBeginMarker, m_fEndMarker; // only used with MODE_EDIT void FadeToFail(); protected: - inline void CreateTapNoteInstance( ColorNoteInstance &cni, const int iCol, const float fIndex, const bool bUseHoldNoteBeginColor = false ); - inline void CreateHoldNoteInstance( ColorNoteInstance &cni, const bool bActive, const float fIndex, const HoldNote &hn, const float fHoldNoteLife ); - inline void DrawMeasureBar( const int iIndex, const int iMeasureNo ); - inline void DrawMarkerBar( const int iIndex ); - inline void DrawBPMText( const int iIndex, const float fBPM ); - inline void DrawFreezeText( const int iIndex, const float fBPM ); +// inline void CreateTapNoteInstance( ColorNoteInstance &cni, const int iCol, const float fIndex, const bool bUseHoldNoteBeginColor = false ); +// inline void CreateHoldNoteInstance( ColorNoteInstance &cni, const bool bActive, const float fIndex, const HoldNote &hn, const float fHoldNoteLife ); + inline void DrawMeasureBar( const int iMeasureIndex ); + inline void DrawMarkerBar( const float fBeat ); + inline void DrawBPMText( const float fBeat, const float fBPM ); + inline void DrawFreezeText( const float fBeat, const float fBPM ); float m_fPercentFadeToFail; // -1 of not fading to fail @@ -55,7 +55,7 @@ protected: int m_iPixelsToDrawAhead; // color arrows - ColorNote m_ColorNote[MAX_NOTE_TRACKS]; + NoteDisplay m_NoteDisplay[MAX_NOTE_TRACKS]; // used in MODE_EDIT Quad m_rectMeasureBar; diff --git a/stepmania/src/NoteTypes.cpp b/stepmania/src/NoteTypes.cpp new file mode 100644 index 0000000000..65f383eaef --- /dev/null +++ b/stepmania/src/NoteTypes.cpp @@ -0,0 +1,72 @@ +#include "stdafx.h" +/* +----------------------------------------------------------------------------- + File: NoteTypes.cpp + + Desc: + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ +#include "NoteTypes.h" + + +D3DXCOLOR NoteTypeToColor( NoteType nt ) +{ + switch( nt ) + { + case NOTE_4TH: return D3DXCOLOR(1,0,0,1); // red + case NOTE_8TH: return D3DXCOLOR(0,0,1,1); // blue + case NOTE_12TH: return D3DXCOLOR(1,0,1,1); // purple + case NOTE_16TH: return D3DXCOLOR(1,1,0,1); // yellow + default: ASSERT( false ); return D3DXCOLOR(1,1,1,1); + } +}; + +float NoteTypeToBeat( NoteType nt ) +{ + switch( nt ) + { + case NOTE_4TH: return 1.0f; // quarter notes + case NOTE_8TH: return 1.0f/2; // eighth notes + case NOTE_12TH: return 1.0f/3; // triplets + case NOTE_16TH: return 1.0f/4; // sixteenth notes + default: ASSERT( false ); return 0; + } +} + +NoteType GetNoteType( int iNoteIndex ) +{ + if( iNoteIndex % (ELEMENTS_PER_MEASURE/4) == 0) + return NOTE_4TH; + else if( iNoteIndex % (ELEMENTS_PER_MEASURE/8) == 0) + return NOTE_8TH; + else if( iNoteIndex % (ELEMENTS_PER_MEASURE/12) == 0) + return NOTE_12TH; + else if( iNoteIndex % (ELEMENTS_PER_MEASURE/16) == 0) + return NOTE_16TH; +// ASSERT(0); + return NOTE_INVALID; +}; + +bool IsNoteOfType( int iNoteIndex, NoteType t ) +{ + return GetNoteType(iNoteIndex) == t; +} + +D3DXCOLOR GetNoteColorFromIndex( int iIndex ) +{ + for( int t=0; tWarn( "Encountered invalid DWI note characer '%c'", c ); + note1Out = DANCE_NOTE_NONE; note2Out = DANCE_NOTE_NONE; break; } switch( i ) diff --git a/stepmania/src/OptionsCursor.cpp b/stepmania/src/OptionsCursor.cpp new file mode 100644 index 0000000000..a379c28d8e --- /dev/null +++ b/stepmania/src/OptionsCursor.cpp @@ -0,0 +1,76 @@ +#include "stdafx.h" +/* +----------------------------------------------------------------------------- + Class: OptionsCursor + + Desc: A graphic displayed in the OptionsCursor during Dancing. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + +#include "OptionsCursor.h" +#include "RageUtil.h" +#include "GameConstantsAndTypes.h" +#include "PrefsManager.h" +#include "ThemeManager.h" + + +OptionsCursor::OptionsCursor() +{ + this->AddSubActor( &m_sprMiddle ); + this->AddSubActor( &m_sprLeft ); + this->AddSubActor( &m_sprRight ); +} + +void OptionsCursor::Load( PlayerNumber pn, bool bUnderline ) +{ + CString sFileName = bUnderline ? "options underline" : "options cursor"; + CString sPath = THEME->GetPathTo( "Graphics", sFileName ); + + m_sprLeft.Load( sPath ); + m_sprMiddle.Load( sPath ); + m_sprRight.Load( sPath ); + + m_sprLeft.StopAnimating(); + m_sprMiddle.StopAnimating(); + m_sprRight.StopAnimating(); + + int iBaseFrameNo; + switch( pn ) + { + case PLAYER_1: iBaseFrameNo = 0; break; + case PLAYER_2: iBaseFrameNo = 3; break; + default: ASSERT(0); break; + } + m_sprLeft.SetState( iBaseFrameNo+0 ); + m_sprMiddle.SetState( iBaseFrameNo+1 ); + m_sprRight.SetState( iBaseFrameNo+2 ); +} + +void OptionsCursor::SetBarWidth( int iWidth ) +{ + TweenBarWidth( iWidth, 0.001f ); +} + +void OptionsCursor::TweenBarWidth( int iNewWidth ) +{ + TweenBarWidth( iNewWidth, 0.2f ); +} + +void OptionsCursor::TweenBarWidth( int iNewWidth, float fTweenTime ) +{ + if( iNewWidth%2 == 1 ) + iNewWidth++; // round up to nearest even number + float fFrameWidth = m_sprLeft.GetUnzoomedWidth(); + + m_sprLeft.BeginTweening( fTweenTime ); + m_sprMiddle.BeginTweening( fTweenTime ); + m_sprRight.BeginTweening( fTweenTime ); + + m_sprMiddle.SetTweenZoomX( iNewWidth/(float)fFrameWidth ); + + m_sprLeft.SetTweenX( -iNewWidth/2 - fFrameWidth/2 ); + m_sprRight.SetTweenX( +iNewWidth/2 + fFrameWidth/2 ); +} \ No newline at end of file diff --git a/stepmania/src/OptionsCursor.h b/stepmania/src/OptionsCursor.h new file mode 100644 index 0000000000..df1e602168 --- /dev/null +++ b/stepmania/src/OptionsCursor.h @@ -0,0 +1,33 @@ +#pragma once +/* +----------------------------------------------------------------------------- + Class: OptionsCursor + + Desc: A graphic displayed in the OptionsCursor during Dancing. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + +#include "Sprite.h" +#include "ActorFrame.h" +#include "GameConstantsAndTypes.h" + + +class OptionsCursor : public ActorFrame +{ +public: + OptionsCursor(); + + void Load( PlayerNumber pn, bool bUnderline ); + void SetBarWidth( int iWidth ); + void TweenBarWidth( int iNewWidth ); + +protected: + void TweenBarWidth( int iNewWidth, float fTweenTime ); + + Sprite m_sprLeft; + Sprite m_sprMiddle; + Sprite m_sprRight; +}; diff --git a/stepmania/src/Player.cpp b/stepmania/src/Player.cpp index f9727ccf76..4bafaa1386 100644 --- a/stepmania/src/Player.cpp +++ b/stepmania/src/Player.cpp @@ -80,7 +80,7 @@ void Player::Load( PlayerNumber pn, NoteData* pNoteData, LifeMeter* pLM, ScoreDi m_iNumTapNotes = pNoteData->GetNumTapNotes(); m_iTapNotesHit = 0; - m_iMeter = GAMESTATE->m_pCurNotes[m_PlayerNumber]->m_iMeter; + m_iMeter = GAMESTATE->m_pCurNotes[m_PlayerNumber] ? GAMESTATE->m_pCurNotes[m_PlayerNumber]->m_iMeter : 5; @@ -95,8 +95,8 @@ void Player::Load( PlayerNumber pn, NoteData* pNoteData, LifeMeter* pLM, ScoreDi if( GAMESTATE->m_PlayerOptions[pn].m_bLittle ) this->MakeLittle(); - int iPixelsToDrawBefore = 64; - int iPixelsToDrawAfter = 320; + int iPixelsToDrawBefore = 96; + int iPixelsToDrawAfter = 384; switch( GAMESTATE->m_PlayerOptions[pn].m_EffectType ) { case PlayerOptions::EFFECT_MINI: iPixelsToDrawBefore *= 2; iPixelsToDrawAfter *= 2; break; @@ -152,40 +152,40 @@ void Player::Update( float fDeltaTime ) HoldNote &hn = m_HoldNotes[i]; HoldNoteScore &hns = m_HoldNoteScores[i]; float &fLife = m_fHoldNoteLife[i]; + int iHoldStartIndex = BeatToNoteRow(hn.m_fStartBeat); + int iHoldEndIndex = BeatToNoteRow(hn.m_fEndBeat); + + m_NoteField.m_bIsHoldingHoldNote[i] = false; // set host flag so NoteField can do intelligent drawing + if( hns != HNS_NONE ) // if this HoldNote already has a result continue; // we don't need to update the logic for this one - float fStartBeat = NoteRowToBeat( (float)hn.m_iStartIndex ); - float fEndBeat = NoteRowToBeat( (float)hn.m_iEndIndex ); - const StyleInput StyleI( m_PlayerNumber, hn.m_iTrack ); const GameInput GameI = GAMESTATE->GetCurrentStyleDef()->StyleInputToGameInput( StyleI ); - - // update the life - if( fStartBeat < fSongBeat && fSongBeat < fEndBeat ) // if the song beat is in the range of this hold + if( hn.m_fStartBeat < fSongBeat && fSongBeat < hn.m_fEndBeat ) // if the song beat is in the range of this hold { const bool bIsHoldingButton = INPUTMAPPER->IsButtonDown( GameI ) || PREFSMAN->m_bAutoPlay || GAMESTATE->m_bDemonstration; // if they got a bad score or haven't stepped on the corresponding tap yet - const bool bSteppedOnTapNote = m_TapNoteScores[hn.m_iTrack][hn.m_iStartIndex] != TNS_NONE && - m_TapNoteScores[hn.m_iTrack][hn.m_iStartIndex] != TNS_MISS; + const TapNoteScore tns = m_TapNoteScores[hn.m_iTrack][iHoldStartIndex]; + const bool bSteppedOnTapNote = tns != TNS_NONE && tns != TNS_MISS; // did they step on the start of this hold? - m_NoteField.m_bIsHoldingHoldNote[i] = bIsHoldingButton && bSteppedOnTapNote; + m_NoteField.m_bIsHoldingHoldNote[i] = bIsHoldingButton && bSteppedOnTapNote; // set host flag so NoteField can do intelligent drawing - if( bIsHoldingButton && bSteppedOnTapNote ) + if( bSteppedOnTapNote && bIsHoldingButton ) { // Increase life fLife += fDeltaTime/HOLD_ARROW_NG_TIME; fLife = min( fLife, 1 ); // clamp - m_NoteField.m_HoldNotes[i].m_iStartIndex = BeatToNoteRow( fSongBeat ); // move the start of this Hold + m_NoteField.m_HoldNotes[i].m_fStartBeat = fSongBeat; // move the start of this Hold m_GhostArrowRow.HoldNote( hn.m_iTrack ); // update the "electric ghost" effect } else { - if( fSongBeat-fStartBeat > GetMaxBeatDifference() ) + if( fSongBeat-hn.m_fStartBeat > GetMaxBeatDifference() ) { // Decrease life fLife -= fDeltaTime/HOLD_ARROW_NG_TIME; @@ -206,7 +206,7 @@ void Player::Update( float fDeltaTime ) } // check for OK - if( fSongBeat > fEndBeat ) // if this HoldNote is in the past + if( fSongBeat > hn.m_fEndBeat ) // if this HoldNote is in the past { // At this point fLife > 0, or else we would have marked it NG above fLife = 1; @@ -379,18 +379,19 @@ void Player::OnRowDestroyed( int col, int iIndexThatWasSteppedOn ) score = min( score, m_TapNoteScores[t][iIndexThatWasSteppedOn] ); // remove this row from the NoteField - bool bHoldNoteOnThisBeat = false; - for( int j=0; j dwMaxSize || ddii.Height > dwMaxSize; -/* // HACK: On a Voodoo3 and Win98, D3DXCreateTextureFromFileEx sometimes fails for no good reason. // So, we'll try the call 2x in a row in case the first one fails -*/ - // I'm taking out the Savage hack because it's causing problems. Tough luck for them. I think - // the problem can be worked around by setting MaxTextureSize to 512. for( int i=0; i<2; i++ ) { if( FAILED( hr = D3DXCreateTextureFromFileEx( @@ -162,7 +163,7 @@ void RageBitmapTexture::Create( D3DPOOL_MANAGED, // which memory pool (bStretch ? D3DX_FILTER_BOX : D3DX_FILTER_NONE) | (bDither ? D3DX_FILTER_DITHER : 0), // filter D3DX_FILTER_BOX | (bDither ? D3DX_FILTER_DITHER : 0), // mip filter - 0, // no color key + D3DCOLOR_ARGB(255,255,0,255), // pink color key &ddii, // struct to fill with source image info NULL, // no palette &m_pd3dTexture ) ) ) diff --git a/stepmania/src/RageBitmapTexture.h b/stepmania/src/RageBitmapTexture.h index 51d7cd7695..210bcd5194 100644 --- a/stepmania/src/RageBitmapTexture.h +++ b/stepmania/src/RageBitmapTexture.h @@ -11,6 +11,7 @@ */ #include "RageDisplay.h" +#include "RageTexture.h" #include #include diff --git a/stepmania/src/RageDisplay.cpp b/stepmania/src/RageDisplay.cpp index 0dd278660d..9041073b0b 100644 --- a/stepmania/src/RageDisplay.cpp +++ b/stepmania/src/RageDisplay.cpp @@ -16,6 +16,7 @@ #include "RageLog.h" #include "RageTimer.h" #include "RageException.h" +#include "RageTexture.h" RageDisplay* DISPLAY = NULL; @@ -35,6 +36,7 @@ RageDisplay::RageDisplay( HWND hWnd ) m_iFramesRenderedSinceLastCheck = 0; m_fFPS = 0; + m_iNumVerts = 0; try { @@ -427,3 +429,126 @@ void RageDisplay::ReleaseVertexBuffer() SAFE_RELEASE( m_pVB ); } +void RageDisplay::AddTriangle( + const D3DXVECTOR3& p0, const D3DCOLOR& c0, const D3DXVECTOR2& t0, const D3DCOLOR& a0, + const D3DXVECTOR3& p1, const D3DCOLOR& c1, const D3DXVECTOR2& t1, const D3DCOLOR& a1, + const D3DXVECTOR3& p2, const D3DCOLOR& c2, const D3DXVECTOR2& t2, const D3DCOLOR& a2 ) +{ + ASSERT( m_iNumVerts < MAX_NUM_VERTICIES-3 ); + m_vertQueue[m_iNumVerts].p = p0; + m_vertQueue[m_iNumVerts].color = c0; + m_vertQueue[m_iNumVerts].t = t0; + m_addColors[m_iNumVerts] = a0; + m_iNumVerts++; + m_vertQueue[m_iNumVerts].p = p1; + m_vertQueue[m_iNumVerts].color = c1; + m_vertQueue[m_iNumVerts].t = t1; + m_addColors[m_iNumVerts] = a1; + m_iNumVerts++; + m_vertQueue[m_iNumVerts].p = p2; + m_vertQueue[m_iNumVerts].color = c2; + m_vertQueue[m_iNumVerts].t = t2; + m_addColors[m_iNumVerts] = a2; + m_iNumVerts++; + + if( m_iNumVerts > MAX_NUM_VERTICIES-4 ) + FlushQueue(); +} + +void RageDisplay::AddQuad( + const D3DXVECTOR3 &p0, const D3DCOLOR& c0, const D3DXVECTOR2& t0, const D3DCOLOR& a0, // upper-left + const D3DXVECTOR3 &p1, const D3DCOLOR& c1, const D3DXVECTOR2& t1, const D3DCOLOR& a1, // upper-right + const D3DXVECTOR3 &p2, const D3DCOLOR& c2, const D3DXVECTOR2& t2, const D3DCOLOR& a2, // lower-left + const D3DXVECTOR3 &p3, const D3DCOLOR& c3, const D3DXVECTOR2& t3, const D3DCOLOR& a3 ) // lower-right +{ + // trangles must be in clockwise order + AddTriangle( + p0, c0, t0, a0, // upper-left + p2, c2, t2, a1, // lower-left + p3, c3, t3, a2 ); // lower-right + + AddTriangle( + p0, c0, t0, a0, // upper-left + p3, c3, t3, a1, // lower-right + p1, c1, t1, a2 ); // upper-right +} + +void RageDisplay::FlushQueue() +{ + if( m_iNumVerts == 0 ) + return; + ASSERT( (m_iNumVerts % 3) == 0 ); + RAGEVERTEX* v; + + // + // draw diffuse pass + // + m_pVB->Lock( 0, 0, (BYTE**)&v, 0 ); + memcpy( v, m_vertQueue, sizeof(RAGEVERTEX)*m_iNumVerts ); + m_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, m_iNumVerts/3 ); + m_pVB->Unlock(); + + // + // draw add pass + // + bool bAnyVertsHaveAdd = false; + for( int i=0; i>24 != 0 ) // if there is any alpha + bAnyVertsHaveAdd = true; + + if( bAnyVertsHaveAdd ) + { + SetColorTextureMultDiffuse(); + SetColorDiffuse(); + m_pVB->Lock( 0, 0, (BYTE**)&v, 0 ); + for( int i=0; iDrawPrimitive( D3DPT_TRIANGLELIST, 0, m_iNumVerts/3 ); + m_pVB->Unlock(); + } + + m_iNumVerts = 0; +} + +void RageDisplay::SetTexture( RageTexture* pTexture ) +{ + m_pd3dDevice->SetTexture( 0, pTexture->GetD3DTexture() ); +} +void RageDisplay::SetColorTextureMultDiffuse() +{ + m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE ); +} +void RageDisplay::SetColorDiffuse() +{ + m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); + m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE ); + m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG2 ); +} +void RageDisplay::SetAlphaTextureMultDiffuse() +{ + m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); + m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE ); + m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE ); +} +void RageDisplay::SetBlendModeNormal() +{ + m_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); + m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); +} +void RageDisplay::SetBlendModeAdd() +{ + m_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_ONE ); + m_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE ); +} +void RageDisplay::EnableZBuffer() +{ + m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE ); + m_pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, TRUE ); +} +void RageDisplay::DisableZBuffer() +{ + m_pd3dDevice->SetRenderState( D3DRS_ZENABLE, FALSE ); + m_pd3dDevice->SetRenderState( D3DRS_ZWRITEENABLE, FALSE ); +} \ No newline at end of file diff --git a/stepmania/src/RageDisplay.h b/stepmania/src/RageDisplay.h index 251665adf3..101f0eb655 100644 --- a/stepmania/src/RageDisplay.h +++ b/stepmania/src/RageDisplay.h @@ -14,7 +14,7 @@ class RageDisplay; -#include "RageTexture.h" +class RageTexture; #include // A structure for our custom vertex type. We added texture coordinates @@ -30,7 +30,7 @@ struct RAGEVERTEX const int MAX_NUM_QUADS = 2048; -const int MAX_NUM_INDICIES = MAX_NUM_QUADS*3; // two triangles per quad +//const int MAX_NUM_INDICIES = MAX_NUM_QUADS*3; // two triangles per quad const int MAX_NUM_VERTICIES = MAX_NUM_QUADS*4; // 4 verticies per quad @@ -183,6 +183,35 @@ private: float m_fLastUpdateTime; int m_iFramesRenderedSinceLastCheck; float m_fFPS; + + + // + // Render Queue stuff + // +protected: + RAGEVERTEX m_vertQueue[MAX_NUM_VERTICIES]; + D3DCOLOR m_addColors[MAX_NUM_VERTICIES]; + int m_iNumVerts; + +public: + void AddTriangle( + const D3DXVECTOR3& p0, const D3DCOLOR& c0, const D3DXVECTOR2& t0, const D3DCOLOR& a0, + const D3DXVECTOR3& p1, const D3DCOLOR& c1, const D3DXVECTOR2& t1, const D3DCOLOR& a1, + const D3DXVECTOR3& p2, const D3DCOLOR& c2, const D3DXVECTOR2& t2, const D3DCOLOR& a2 ); + void AddQuad( + const D3DXVECTOR3 &p0, const D3DCOLOR& c0, const D3DXVECTOR2& t0, const D3DCOLOR& a0, // upper-left + const D3DXVECTOR3 &p1, const D3DCOLOR& c1, const D3DXVECTOR2& t1, const D3DCOLOR& a1, // upper-right + const D3DXVECTOR3 &p2, const D3DCOLOR& c2, const D3DXVECTOR2& t2, const D3DCOLOR& a2, // lower-left + const D3DXVECTOR3 &p3, const D3DCOLOR& c3, const D3DXVECTOR2& t3, const D3DCOLOR& a3 );// lower-right + void FlushQueue(); + void SetTexture( RageTexture* pTexture ); + void SetColorTextureMultDiffuse(); + void SetColorDiffuse(); + void SetAlphaTextureMultDiffuse(); + void SetBlendModeNormal(); + void SetBlendModeAdd(); + void EnableZBuffer(); + void DisableZBuffer(); }; diff --git a/stepmania/src/RageInput.cpp b/stepmania/src/RageInput.cpp index 3fb8a5f64e..16ce3f1481 100644 --- a/stepmania/src/RageInput.cpp +++ b/stepmania/src/RageInput.cpp @@ -47,7 +47,7 @@ CString DeviceInput::GetDescription() case DEVICE_JOY2: case DEVICE_JOY3: case DEVICE_JOY4: - sReturn = ssprintf("Joystick %d: ", device - DEVICE_JOY1 + 1 ); + sReturn = ssprintf("Joy%d ", device - DEVICE_JOY1 + 1 ); switch( button ) { @@ -84,7 +84,7 @@ CString DeviceInput::GetDescription() break; case DEVICE_KEYBOARD: // keyboard - sReturn = "Keyboard: "; + sReturn = "Key "; switch( button ) { @@ -101,7 +101,7 @@ CString DeviceInput::GetDescription() case DIK_0: sReturn += "0"; break; case DIK_MINUS: sReturn += "Minus"; break; case DIK_EQUALS: sReturn += "Equals"; break; - case DIK_BACK: sReturn += "Backspace"; break; + case DIK_BACK: sReturn += "Backsp"; break; case DIK_TAB: sReturn += "Tab"; break; // why? case DIK_BACK: sReturn += "Backspace"; break; case DIK_Q: sReturn += "Q"; break; @@ -127,11 +127,11 @@ CString DeviceInput::GetDescription() case DIK_J: sReturn += "J"; break; case DIK_K: sReturn += "K"; break; case DIK_L: sReturn += "L"; break; - case DIK_SEMICOLON: sReturn += "Semicolon"; break; - case DIK_APOSTROPHE:sReturn += "Apostroph"; break; + case DIK_SEMICOLON: sReturn += "Semicln"; break; + case DIK_APOSTROPHE:sReturn += "Apostro"; break; case DIK_GRAVE: sReturn += "Grave"; break; case DIK_LSHIFT: sReturn += "LShift"; break; - case DIK_BACKSLASH: sReturn += "Backslash"; break; + case DIK_BACKSLASH: sReturn += "Backslsh"; break; case DIK_Z: sReturn += "Z"; break; case DIK_X: sReturn += "X"; break; case DIK_C: sReturn += "C"; break; @@ -142,11 +142,11 @@ CString DeviceInput::GetDescription() case DIK_COMMA: sReturn += "Comma"; break; case DIK_PERIOD: sReturn += "Period"; break; case DIK_SLASH: sReturn += "Slash"; break; - case DIK_RSHIFT: sReturn += "R Shift"; break; - case DIK_MULTIPLY: sReturn += "Multiply"; break; - case DIK_LMENU: sReturn += "Left Menu"; break; + case DIK_RSHIFT: sReturn += "RShift"; break; + case DIK_MULTIPLY: sReturn += "Mult"; break; + case DIK_LMENU: sReturn += "LMenu"; break; case DIK_SPACE: sReturn += "Space"; break; - case DIK_CAPITAL: sReturn += "Caps Lock"; break; + case DIK_CAPITAL: sReturn += "CapsLk"; break; case DIK_F1: sReturn += "F1"; break; case DIK_F2: sReturn += "F2"; break; case DIK_F3: sReturn += "F3"; break; @@ -172,22 +172,22 @@ CString DeviceInput::GetDescription() case DIK_NUMPAD3: sReturn += "NumPad3"; break; case DIK_NUMPAD0: sReturn += "NumPad0"; break; case DIK_DECIMAL: sReturn += "Decimal"; break; - case DIK_RMENU: sReturn += "Right Alt"; break; + case DIK_RMENU: sReturn += "RightAlt"; break; case DIK_PAUSE: sReturn += "Pause"; break; case DIK_HOME: sReturn += "Home"; break; case DIK_UP: sReturn += "Up"; break; - case DIK_PRIOR: sReturn += "Page Up"; break; + case DIK_PRIOR: sReturn += "PageUp"; break; case DIK_LEFT: sReturn += "Left"; break; case DIK_RIGHT: sReturn += "Right"; break; case DIK_END: sReturn += "End"; break; case DIK_DOWN: sReturn += "Down"; break; - case DIK_NEXT: sReturn += "Page Down"; break; + case DIK_NEXT: sReturn += "PageDn"; break; case DIK_INSERT: sReturn += "Insert"; break; case DIK_DELETE: sReturn += "Delete"; break; - case DIK_LWIN: sReturn += "Left Win"; break; - case DIK_RWIN: sReturn += "Right Win"; break; - case DIK_APPS: sReturn += "App Menu"; break; - case DIK_NUMPADENTER: sReturn += "NumPadEnter"; break; + case DIK_LWIN: sReturn += "LeftWin"; break; + case DIK_RWIN: sReturn += "RightWin"; break; + case DIK_APPS: sReturn += "AppMenu"; break; + case DIK_NUMPADENTER: sReturn += "PadEnter"; break; default: sReturn += "Unknown Key"; break; } diff --git a/stepmania/src/RageMovieTexture.cpp b/stepmania/src/RageMovieTexture.cpp index 44614d0fe4..bd9e9d30b1 100644 --- a/stepmania/src/RageMovieTexture.cpp +++ b/stepmania/src/RageMovieTexture.cpp @@ -262,6 +262,13 @@ RageMovieTexture::RageMovieTexture( Create(); CreateFrameRects(); + // flip all frame rects because movies are upside down + for( int i=0; i //#include #include @@ -123,6 +120,3 @@ protected: CTextureRenderer *m_pCTR; // DShow Texture renderer }; - - -#endif \ No newline at end of file diff --git a/stepmania/src/ScoreDisplayNormal.cpp b/stepmania/src/ScoreDisplayNormal.cpp index 077c55d346..11f27280a4 100644 --- a/stepmania/src/ScoreDisplayNormal.cpp +++ b/stepmania/src/ScoreDisplayNormal.cpp @@ -26,7 +26,7 @@ ScoreDisplayNormal::ScoreDisplayNormal() LOG->Trace( "ScoreDisplayNormal::ScoreDisplayNormal()" ); // init the text - Load( THEME->GetPathTo(FONT_SCORE_NUMBERS) ); + LoadFromFont( THEME->GetPathTo("Fonts","score numbers") ); TurnShadowOff(); m_fScore = 0; @@ -35,7 +35,7 @@ ScoreDisplayNormal::ScoreDisplayNormal() CString s; for( int i=0; iTrace( "ScoreDisplayOni::ScoreDisplayOni()" ); // init the text - Load( THEME->GetPathTo(FONT_SCORE_NUMBERS) ); + LoadFromFont( THEME->GetPathTo("Fonts","score numbers") ); TurnShadowOff(); } diff --git a/stepmania/src/Screen.cpp b/stepmania/src/Screen.cpp index b6b0cd208b..a0e8c69030 100644 --- a/stepmania/src/Screen.cpp +++ b/stepmania/src/Screen.cpp @@ -75,7 +75,7 @@ void Screen::Input( const DeviceInput& DeviceI, const InputEventType type, const void Screen::SendScreenMessage( ScreenMessage SM, float fDelay ) { - assert( fDelay >= 0.0 ); + ASSERT( fDelay >= 0.0 ); QueuedScreenMessage QSM; QSM.SM = SM; diff --git a/stepmania/src/ScreenAppearanceOptions.cpp b/stepmania/src/ScreenAppearanceOptions.cpp index 1329d83ca7..9488e84bb7 100644 --- a/stepmania/src/ScreenAppearanceOptions.cpp +++ b/stepmania/src/ScreenAppearanceOptions.cpp @@ -44,8 +44,9 @@ OptionLineData g_AppearanceOptionsLines[NUM_APPEARANCE_OPTIONS_LINES] = { ScreenAppearanceOptions::ScreenAppearanceOptions() : ScreenOptions( - THEME->GetPathTo(GRAPHIC_PLAYER_OPTIONS_BACKGROUND), - THEME->GetPathTo(GRAPHIC_PLAYER_OPTIONS_TOP_EDGE) + THEME->GetPathTo("Graphics","appearance options background"), + THEME->GetPathTo("Graphics","appearance options page"), + THEME->GetPathTo("Graphics","appearance options top edge") ) { LOG->Trace( "ScreenAppearanceOptions::ScreenAppearanceOptions()" ); @@ -152,6 +153,9 @@ void ScreenAppearanceOptions::ExportOptions() int iSelectedSkin = m_iSelectedOption[0][AO_SKIN]; CString sNewSkin = m_OptionLineData[AO_SKIN].szOptionsText[iSelectedSkin]; GAMEMAN->SwitchNoteSkin( sNewSkin ); + + PREFSMAN->SaveGamePrefsToDisk(); + PREFSMAN->SaveGlobalPrefsToDisk(); } void ScreenAppearanceOptions::GoToPrevState() diff --git a/stepmania/src/ScreenCaution.cpp b/stepmania/src/ScreenCaution.cpp index 8a4a72414d..e448aabdf1 100644 --- a/stepmania/src/ScreenCaution.cpp +++ b/stepmania/src/ScreenCaution.cpp @@ -1,11 +1,12 @@ #include "stdafx.h" /* ----------------------------------------------------------------------------- - File: ScreenCaution.h + Class: ScreenCaution -Desc: Screen that displays while resources are being loaded. + Desc: Screen that displays while resources are being loaded. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford ----------------------------------------------------------------------------- */ @@ -13,9 +14,14 @@ Desc: Screen that displays while resources are being loaded. #include "ScreenCaution.h" #include "GameConstantsAndTypes.h" #include "ScreenSelectStyle.h" +#include "ScreenEZ2SelectStyle.h" #include "RageTextureManager.h" #include "PrefsManager.h" #include "AnnouncerManager.h" +#include "GameState.h" + + +#define USE_NORMAL_OR_EZ2_SELECT_STYLE THEME->GetMetricB("Screens","UseNormalOrEZ2SelectStyle") const ScreenMessage SM_DoneOpening = ScreenMessage(SM_User-7); @@ -25,8 +31,10 @@ const ScreenMessage SM_GoToSelectMusic = ScreenMessage(SM_User-9); ScreenCaution::ScreenCaution() { - m_sprCaution.Load( THEME->GetPathTo(GRAPHIC_CAUTION) ); - m_sprCaution.StretchTo( CRect(0,0,640,480) ); + GAMESTATE->m_bPlayersCanJoin = true; + + m_sprCaution.Load( THEME->GetPathTo("Graphics","caution") ); + m_sprCaution.StretchTo( CRect(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); this->AddSubActor( &m_sprCaution ); m_Wipe.OpenWipingRight( SM_DoneOpening ); @@ -57,13 +65,24 @@ void ScreenCaution::HandleScreenMessage( const ScreenMessage SM ) SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_CAUTION) ); break; case SM_GoToSelectMusic: - SCREENMAN->SetNewScreen( new ScreenSelectStyle ); + if( USE_NORMAL_OR_EZ2_SELECT_STYLE ) + SCREENMAN->SetNewScreen( new ScreenEz2SelectStyle ); + else + SCREENMAN->SetNewScreen( new ScreenSelectStyle ); break; } } void ScreenCaution::MenuStart( const PlayerNumber p ) { - if( !m_Wipe.IsClosing() ) + if( p != PLAYER_INVALID && !GAMESTATE->m_bIsJoined[p] ) + { + GAMESTATE->m_bIsJoined[p] = true; + SOUND->PlayOnceStreamed( THEME->GetPathTo("Sounds","menu start") ); + SCREENMAN->RefreshCreditsMessages(); + return; // don't fall though + } + + if( !m_Wipe.IsOpening() && !m_Wipe.IsClosing() ) m_Wipe.CloseWipingRight( SM_GoToSelectMusic ); } diff --git a/stepmania/src/ScreenCaution.h b/stepmania/src/ScreenCaution.h index 8371565b5d..dc09696369 100644 --- a/stepmania/src/ScreenCaution.h +++ b/stepmania/src/ScreenCaution.h @@ -1,10 +1,11 @@ /* ----------------------------------------------------------------------------- - File: ScreenCaution.h + Class: ScreenCaution Desc: Screen that displays while SelectSong is being loaded. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford ----------------------------------------------------------------------------- */ diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index 0fee8a239a..c6060051ba 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -96,6 +96,9 @@ ScreenEdit::ScreenEdit() if( m_pNotes == NULL ) { m_pNotes = new Notes; + m_pNotes->m_DifficultyClass = CLASS_MEDIUM; + m_pNotes->m_NotesType = GAMESTATE->GetCurrentStyleDef()->m_NotesType; + m_pNotes->m_sDescription = "Untitled"; // Dro Kulix: If m_pNotes->m_NotesType is not changed here, // the edit mode is somehow stuck only being able to edit // the first four columns of a (NEW) sequence. @@ -110,7 +113,6 @@ ScreenEdit::ScreenEdit() // GAMEMAN->m_CurStyle is set to the target game style // of the current edit. Naturally, this is where we'll // want to extract the NotesType for a (NEW) sequence. - m_pNotes->m_NotesType = GAMESTATE->GetCurrentStyleDef()->m_NotesType; m_pSong->m_apNotes.Add( m_pNotes ); } @@ -131,13 +133,13 @@ ScreenEdit::ScreenEdit() GAMESTATE->m_PlayerOptions[PLAYER_1].m_fArrowScrollSpeed = 1; GAMESTATE->m_PlayerOptions[PLAYER_1].m_ColorType = PlayerOptions::COLOR_NOTE; - m_sprBackground.Load( THEME->GetPathTo( GRAPHIC_EDIT_BACKGROUND ) ); + m_sprBackground.Load( THEME->GetPathTo("Graphics","edit background") ); m_sprBackground.StretchTo( CRect(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); - m_GranularityIndicator.SetXY( EDIT_X, EDIT_GRAY_Y ); - m_GranularityIndicator.Load(); - m_GranularityIndicator.SetZoom( 0.5f ); + m_SnapDisplay.SetXY( EDIT_X, EDIT_GRAY_Y ); + m_SnapDisplay.Load(); + m_SnapDisplay.SetZoom( 0.5f ); m_GrayArrowRowEdit.SetXY( EDIT_X, EDIT_GRAY_Y ); m_GrayArrowRowEdit.Load( PLAYER_1 ); @@ -165,7 +167,7 @@ ScreenEdit::ScreenEdit() m_Fade.SetClosed(); - m_textInfo.Load( THEME->GetPathTo(FONT_NORMAL) ); + m_textInfo.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textInfo.SetXY( INFO_X, INFO_Y ); m_textInfo.SetHorizAlign( Actor::align_right ); m_textInfo.SetVertAlign( Actor::align_top ); @@ -173,7 +175,7 @@ ScreenEdit::ScreenEdit() m_textInfo.SetShadowLength( 2 ); //m_textInfo.SetText(); // set this below every frame - m_textHelp.Load( THEME->GetPathTo(FONT_NORMAL) ); + m_textHelp.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textHelp.SetXY( HELP_X, HELP_Y ); m_textHelp.SetHorizAlign( Actor::align_left ); m_textHelp.SetZoom( 0.5f ); @@ -181,14 +183,13 @@ ScreenEdit::ScreenEdit() m_textHelp.SetText( HELP_TEXT ); - m_soundChangeLine.Load( THEME->GetPathTo(SOUND_EDIT_CHANGE_LINE), 10 ); - m_soundChangeSnap.Load( THEME->GetPathTo(SOUND_EDIT_CHANGE_SNAP) ); - m_soundMarker.Load( THEME->GetPathTo(SOUND_EDIT_CHANGE_SNAP) ); - m_soundInvalid.Load( THEME->GetPathTo(SOUND_MENU_INVALID) ); + m_soundChangeLine.Load( THEME->GetPathTo("Sounds","edit change line"), 10 ); + 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_soundMusic.Load( m_pSong->GetMusicPath(), true ); // enable accurate sync - m_soundMusic.SetPlaybackRate( 0.5f ); m_Fade.OpenWipingRight(); @@ -235,7 +236,7 @@ void ScreenEdit::Update( float fDeltaTime ) } m_sprBackground.Update( fDeltaTime ); - m_GranularityIndicator.Update( fDeltaTime ); + m_SnapDisplay.Update( fDeltaTime ); m_GrayArrowRowEdit.Update( fDeltaTime ); m_NoteFieldEdit.Update( fDeltaTime ); m_Fade.Update( fDeltaTime ); @@ -296,7 +297,7 @@ void ScreenEdit::Update( float fDeltaTime ) CString sNoteType; - switch( m_GranularityIndicator.GetSnapMode() ) + switch( m_SnapDisplay.GetSnapMode() ) { case NOTE_4TH: sNoteType = "quarter notes"; break; case NOTE_8TH: sNoteType = "eighth notes"; break; @@ -341,7 +342,7 @@ void ScreenEdit::Update( float fDeltaTime ) void ScreenEdit::DrawPrimitives() { m_sprBackground.Draw(); - m_GranularityIndicator.Draw(); + m_SnapDisplay.Draw(); m_GrayArrowRowEdit.Draw(); m_textHelp.Draw(); @@ -370,6 +371,22 @@ void ScreenEdit::DrawPrimitives() m_Player.Draw(); } + if( m_EditMode == MODE_RECORDING ) + { + /* + for( int t=0; tGetCurrentStyleDef()->m_iColsPerPlayer; t++ ) + { + if( m_bLayingAHold[t] ) + { + bool bHoldingButton = false; + for( int p=0; pIsButtonDown( StyleInput(PlayerInput(p), t) ); + if( bHoldingButton + } + } + */ + } + Screen::DrawPrimitives(); } @@ -410,7 +427,8 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ break; // We only care about first presses int iCol = DeviceI.button - DIK_1; - const int iNoteIndex = BeatToNoteRow( GAMESTATE->m_fSongBeat ); + const float fSongBeat = GAMESTATE->m_fSongBeat; + const int iSongIndex = BeatToNoteRow( fSongBeat ); if( iCol >= m_NoteFieldEdit.m_iNumTracks ) // this button is not in the range of columns for this StyleDef break; @@ -421,7 +439,7 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ { HoldNote &hn = m_NoteFieldEdit.m_HoldNotes[i]; if( iCol == hn.m_iTrack && // the notes correspond - iNoteIndex >= hn.m_iStartIndex && iNoteIndex <= hn.m_iEndIndex ) // the cursor lies within this HoldNote + fSongBeat >= hn.m_fStartBeat && fSongBeat <= hn.m_fEndBeat ) // the cursor lies within this HoldNote { m_NoteFieldEdit.RemoveHoldNote( i ); bRemovedAHoldNote = true; @@ -432,10 +450,10 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ if( !bRemovedAHoldNote ) { // We didn't remove a HoldNote, so the user wants to add or delete a TapNote - if( m_NoteFieldEdit.m_TapNotes[iCol][iNoteIndex] == '0' ) - m_NoteFieldEdit.m_TapNotes[iCol][iNoteIndex] = '1'; + if( m_NoteFieldEdit.m_TapNotes[iCol][iSongIndex] == '0' ) + m_NoteFieldEdit.m_TapNotes[iCol][iSongIndex] = '1'; else - m_NoteFieldEdit.m_TapNotes[iCol][iNoteIndex] = '0'; + m_NoteFieldEdit.m_TapNotes[iCol][iSongIndex] = '0'; } } break; @@ -460,7 +478,7 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ pNotes->SetNoteData( (NoteData*)&m_NoteFieldEdit ); GAMESTATE->m_pCurSong->SaveToSMFile(); - SOUND->PlayOnceStreamed( THEME->GetPathTo(SOUND_EDIT_SAVE) ); + SOUND->PlayOnceStreamed( THEME->GetPathTo("Sounds","edit save") ); } break; case DIK_UP: @@ -473,7 +491,7 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ { case DIK_UP: case DIK_DOWN: - fBeatsToMove = NoteTypeToBeat( m_GranularityIndicator.GetSnapMode() ); + fBeatsToMove = NoteTypeToBeat( m_SnapDisplay.GetSnapMode() ); if( DeviceI.button == DIK_UP ) fBeatsToMove *= -1; break; @@ -484,8 +502,8 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ fBeatsToMove *= -1; } - const int iStartIndex = BeatToNoteRow(GAMESTATE->m_fSongBeat); - const int iEndIndex = BeatToNoteRow(GAMESTATE->m_fSongBeat + fBeatsToMove); + const float fStartBeat = GAMESTATE->m_fSongBeat; + const float fEndBeat = GAMESTATE->m_fSongBeat + fBeatsToMove; // check to see if they're holding a button for( int col=0; colm_fSongBeat += fBeatsToMove; GAMESTATE->m_fSongBeat = clamp( GAMESTATE->m_fSongBeat, 0, MAX_BEATS-1 ); - GAMESTATE->m_fSongBeat = froundf( GAMESTATE->m_fSongBeat, NoteTypeToBeat(m_GranularityIndicator.GetSnapMode()) ); + GAMESTATE->m_fSongBeat = froundf( GAMESTATE->m_fSongBeat, NoteTypeToBeat(m_SnapDisplay.GetSnapMode()) ); m_soundChangeLine.Play(); } break; @@ -519,11 +537,11 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ m_soundChangeLine.Play(); break; case DIK_RIGHT: - m_GranularityIndicator.PrevSnapMode(); + m_SnapDisplay.PrevSnapMode(); OnSnapModeChange(); break; case DIK_LEFT: - m_GranularityIndicator.NextSnapMode(); + m_SnapDisplay.NextSnapMode(); OnSnapModeChange(); break; case DIK_RETURN: @@ -624,18 +642,20 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ m_soundMusic.SetPositionSeconds( fElapsedSeconds ); m_soundMusic.Play(); m_soundMusic.SetPlaybackRate( GAMESTATE->m_SongOptions.m_fMusicRate ); + for( int i=0; im_SongOptions.m_fMusicRate == 1.0f ) GAMESTATE->m_SongOptions.m_fMusicRate = 0.9f; - else if( GAMESTATE->m_SongOptions.m_fMusicRate == 0.9f ) GAMESTATE->m_SongOptions.m_fMusicRate = 0.8f; - else if( GAMESTATE->m_SongOptions.m_fMusicRate == 0.8f ) GAMESTATE->m_SongOptions.m_fMusicRate = 0.7f; - else if( GAMESTATE->m_SongOptions.m_fMusicRate == 0.7f ) GAMESTATE->m_SongOptions.m_fMusicRate = 1.5f; - else if( GAMESTATE->m_SongOptions.m_fMusicRate == 1.5f ) GAMESTATE->m_SongOptions.m_fMusicRate = 1.4f; - else if( GAMESTATE->m_SongOptions.m_fMusicRate == 1.4f ) GAMESTATE->m_SongOptions.m_fMusicRate = 1.3f; - else if( GAMESTATE->m_SongOptions.m_fMusicRate == 1.3f ) GAMESTATE->m_SongOptions.m_fMusicRate = 1.2f; - else if( GAMESTATE->m_SongOptions.m_fMusicRate == 1.2f ) GAMESTATE->m_SongOptions.m_fMusicRate = 1.1f; - else if( GAMESTATE->m_SongOptions.m_fMusicRate == 1.1f ) GAMESTATE->m_SongOptions.m_fMusicRate = 1.0f; + else if( GAMESTATE->m_SongOptions.m_fMusicRate == 0.9f ) GAMESTATE->m_SongOptions.m_fMusicRate = 0.8f; + else if( GAMESTATE->m_SongOptions.m_fMusicRate == 0.8f ) GAMESTATE->m_SongOptions.m_fMusicRate = 0.7f; + else if( GAMESTATE->m_SongOptions.m_fMusicRate == 0.7f ) GAMESTATE->m_SongOptions.m_fMusicRate = 1.5f; + else if( GAMESTATE->m_SongOptions.m_fMusicRate == 1.5f ) GAMESTATE->m_SongOptions.m_fMusicRate = 1.4f; + else if( GAMESTATE->m_SongOptions.m_fMusicRate == 1.4f ) GAMESTATE->m_SongOptions.m_fMusicRate = 1.3f; + else if( GAMESTATE->m_SongOptions.m_fMusicRate == 1.3f ) GAMESTATE->m_SongOptions.m_fMusicRate = 1.2f; + else if( GAMESTATE->m_SongOptions.m_fMusicRate == 1.2f ) GAMESTATE->m_SongOptions.m_fMusicRate = 1.1f; + else if( GAMESTATE->m_SongOptions.m_fMusicRate == 1.1f ) GAMESTATE->m_SongOptions.m_fMusicRate = 1.0f; break; case DIK_INSERT: case DIK_DELETE: @@ -877,14 +897,11 @@ void ScreenEdit::InputRecord( const DeviceInput& DeviceI, const InputEventType t m_pSong->GetBeatAndBPSFromElapsedTime( fHoldStartSeconds, fStartBeat, fThrowAway, bFreeze ); m_pSong->GetBeatAndBPSFromElapsedTime( fHoldEndSeconds, fEndBeat, fThrowAway, bFreeze ); - const int iStartIndex = BeatToNoteRow(fStartBeat) - 1; - const int iEndIndex = BeatToNoteRow(fEndBeat); - // create a new hold note HoldNote newHN; newHN.m_iTrack = iCol; - newHN.m_iStartIndex = iStartIndex; - newHN.m_iEndIndex = iEndIndex; + newHN.m_fStartBeat = fStartBeat; + newHN.m_fEndBeat = fEndBeat; m_NoteFieldRecord.AddHoldNote( newHN ); m_NoteFieldRecord.SnapToNearestNoteType( NOTE_12TH, NOTE_16TH, max(0,GAMESTATE->m_fSongBeat-2), GAMESTATE->m_fSongBeat+2); @@ -906,7 +923,7 @@ void ScreenEdit::InputPlay( const DeviceInput& DeviceI, const InputEventType typ m_EditMode = MODE_EDITING; m_soundMusic.Stop(); - GAMESTATE->m_fSongBeat = froundf( GAMESTATE->m_fSongBeat, NoteTypeToBeat(m_GranularityIndicator.GetSnapMode()) ); + GAMESTATE->m_fSongBeat = froundf( GAMESTATE->m_fSongBeat, NoteTypeToBeat(m_SnapDisplay.GetSnapMode()) ); break; } } @@ -934,7 +951,7 @@ void ScreenEdit::TransitionToEditFromRecord() m_NoteFieldEdit.CopyRange( (NoteData*)&m_NoteFieldRecord, iNoteIndexBegin, iNoteIndexEnd, iNoteIndexBegin ); - GAMESTATE->m_fSongBeat = froundf( GAMESTATE->m_fSongBeat, NoteTypeToBeat(m_GranularityIndicator.GetSnapMode()) ); + GAMESTATE->m_fSongBeat = froundf( GAMESTATE->m_fSongBeat, NoteTypeToBeat(m_SnapDisplay.GetSnapMode()) ); } @@ -957,7 +974,7 @@ void ScreenEdit::OnSnapModeChange() { m_soundChangeSnap.Play(); - NoteType nt = m_GranularityIndicator.GetSnapMode(); + NoteType nt = m_SnapDisplay.GetSnapMode(); int iStepIndex = BeatToNoteRow( GAMESTATE->m_fSongBeat ); int iElementsPerNoteType = BeatToNoteRow( NoteTypeToBeat(nt) ); int iStepIndexHangover = iStepIndex % iElementsPerNoteType; diff --git a/stepmania/src/ScreenEdit.h b/stepmania/src/ScreenEdit.h index e8fcdd8ed1..3047dd5b0e 100644 --- a/stepmania/src/ScreenEdit.h +++ b/stepmania/src/ScreenEdit.h @@ -19,7 +19,7 @@ #include "RageMusic.h" #include "MotionBlurSprite.h" #include "Background.h" -#include "GranularityIndicator.h" +#include "SnapDisplay.h" class ScreenEdit : public Screen @@ -50,7 +50,7 @@ protected: Sprite m_sprBackground; NoteField m_NoteFieldEdit; - GranularityIndicator m_GranularityIndicator; + SnapDisplay m_SnapDisplay; GrayArrowRow m_GrayArrowRowEdit; BitmapText m_textInfo; // status information that changes @@ -77,11 +77,12 @@ protected: // for MODE_PLAY - Player m_Player; + Player m_Player; // for MODE_RECORD and MODE_PLAY RageSoundStream m_soundMusic; + bool m_bLayingAHold[MAX_NOTE_TRACKS]; }; diff --git a/stepmania/src/ScreenEditMenu.cpp b/stepmania/src/ScreenEditMenu.cpp index 3bf5126114..c619a7fb86 100644 --- a/stepmania/src/ScreenEditMenu.cpp +++ b/stepmania/src/ScreenEditMenu.cpp @@ -1,11 +1,12 @@ #include "stdafx.h" /* ----------------------------------------------------------------------------- - File: ScreenEditMenu.h + Class: ScreenEditMenu Desc: The main title screen and menu. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford ----------------------------------------------------------------------------- */ @@ -32,6 +33,9 @@ const float GROUP_Y = CENTER_Y - 160; const float SONG_BANNER_X = CENTER_X; const float SONG_BANNER_Y = CENTER_Y - 80; +const float SONG_BANNER_WIDTH = 286; +const float SONG_BANNER_HEIGHT = 92; + const float ARROWS_X[2] = { SONG_BANNER_X - 200, SONG_BANNER_X + 200 }; const float ARROWS_Y[2] = { SONG_BANNER_Y, SONG_BANNER_Y }; @@ -63,38 +67,40 @@ ScreenEditMenu::ScreenEditMenu() m_SelectedRow = ROW_GROUP; SONGMAN->GetGroupNames( m_sGroups ); + GAMEMAN->GetNotesTypesForGame( GAMESTATE->m_CurGame, m_NotesTypes ); m_iSelectedGroup = 0; m_iSelectedSong = 0; - m_CurNotesType = NOTES_TYPE_DANCE_SINGLE; + m_iSelectedNotesType = 0; m_iSelectedNotes = 0; - m_textGroup.Load( THEME->GetPathTo(FONT_HEADER1) ); + m_textGroup.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textGroup.SetXY( GROUP_X, GROUP_Y ); m_textGroup.SetDiffuseColor( D3DXCOLOR(0.7f,0.7f,0.7f,1) ); this->AddSubActor( &m_textGroup ); m_Banner.SetXY( SONG_BANNER_X, SONG_BANNER_Y ); + m_Banner.SetCroppedSize( SONG_BANNER_WIDTH, SONG_BANNER_HEIGHT ); this->AddSubActor( &m_Banner ); m_TextBanner.SetXY( SONG_TEXT_BANNER_X, SONG_TEXT_BANNER_Y ); this->AddSubActor( &m_TextBanner ); - m_sprArrowLeft.Load( THEME->GetPathTo(GRAPHIC_ARROWS_LEFT) ); + m_sprArrowLeft.Load( THEME->GetPathTo("Graphics","edit menu left") ); m_sprArrowLeft.SetXY( ARROWS_X[0], ARROWS_Y[0] ); m_sprArrowLeft.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); this->AddSubActor( &m_sprArrowLeft ); - m_sprArrowRight.Load( THEME->GetPathTo(GRAPHIC_ARROWS_RIGHT) ); + m_sprArrowRight.Load( THEME->GetPathTo("Graphics","edit menu right") ); m_sprArrowRight.SetXY( ARROWS_X[1], ARROWS_Y[1] ); m_sprArrowRight.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); this->AddSubActor( &m_sprArrowRight ); - m_textNotesType.Load( THEME->GetPathTo(FONT_HEADER1) ); + m_textNotesType.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textNotesType.SetXY( GAME_STYLE_X, GAME_STYLE_Y ); m_textNotesType.SetDiffuseColor( D3DXCOLOR(0.7f,0.7f,0.7f,1) ); this->AddSubActor( &m_textNotesType ); - m_textNotes.Load( THEME->GetPathTo(FONT_HEADER1) ); + m_textNotes.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textNotes.SetXY( STEPS_X, STEPS_Y ); m_textNotes.SetDiffuseColor( D3DXCOLOR(0.7f,0.7f,0.7f,1) ); this->AddSubActor( &m_textNotes ); @@ -104,15 +110,15 @@ ScreenEditMenu::ScreenEditMenu() OnGroupChange(); - m_textExplanation.Load( THEME->GetPathTo(FONT_NORMAL) ); + m_textExplanation.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textExplanation.SetXY( EXPLANATION_X, EXPLANATION_Y ); m_textExplanation.SetText( EXPLANATION_TEXT ); m_textExplanation.SetZoom( 0.7f ); this->AddSubActor( &m_textExplanation ); m_Menu.Load( - THEME->GetPathTo(GRAPHIC_EDIT_BACKGROUND), - THEME->GetPathTo(GRAPHIC_EDIT_TOP_EDGE), + THEME->GetPathTo("Graphics","edit background"), + THEME->GetPathTo("Graphics","edit top edge"), ssprintf("%c %c change line %c %c change value START to continue", char(3), char(4), char(1), char(2) ), false, false, 40 ); @@ -123,10 +129,10 @@ ScreenEditMenu::ScreenEditMenu() this->AddSubActor( &m_Fade); - m_soundChangeMusic.Load( THEME->GetPathTo(SOUND_SELECT_MUSIC_CHANGE_MUSIC) ); - m_soundSelect.Load( THEME->GetPathTo(SOUND_MENU_START) ); + m_soundChangeMusic.Load( THEME->GetPathTo("Sounds","select music change music") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); - MUSIC->Load( THEME->GetPathTo(SOUND_MENU_MUSIC) ); + MUSIC->Load( THEME->GetPathTo("Sounds","edit menu music") ); MUSIC->Play( true ); @@ -175,7 +181,7 @@ void ScreenEditMenu::HandleScreenMessage( const ScreenMessage SM ) NotesType nt = GetSelectedNotesType(); Style style = GAMEMAN->GetStyleThatPlaysNotesType( nt ); GAMESTATE->m_CurStyle = style; - GAMESTATE->m_CurGame = StyleToGame(style); + GAMESTATE->m_CurGame = GAMEMAN->GetStyleDefForStyle(style)->m_Game; SCREENMAN->SetNewScreen( new ScreenEdit ); break; @@ -231,7 +237,7 @@ void ScreenEditMenu::OnSongChange() void ScreenEditMenu::OnNotesTypeChange() { - m_CurNotesType = (NotesType)clamp( m_CurNotesType, 0, NUM_NOTES_TYPES ); + m_iSelectedNotesType = clamp( m_iSelectedNotesType, 0, m_NotesTypes.GetSize()-1 ); m_textNotesType.SetText( NotesTypeToString( GetSelectedNotesType() ) ); @@ -252,7 +258,7 @@ void ScreenEditMenu::OnStepsChange() if( GetSelectedNotes() == NULL ) m_textNotes.SetText( "(NEW)" ); else - m_textNotes.SetText( GetSelectedNotes()->m_sDescription ); + m_textNotes.SetText( GetSelectedNotes()->m_sDescription!="" ? GetSelectedNotes()->m_sDescription : "[no name]" ); } @@ -293,9 +299,9 @@ void ScreenEditMenu::MenuLeft( const PlayerNumber p ) OnSongChange(); break; case ROW_NOTES_TYPE: - if( m_CurNotesType == 0 ) // can't go left any further + if( m_iSelectedNotesType == 0 ) // can't go left any further return; - m_CurNotesType = NotesType( m_CurNotesType-1 ); + m_iSelectedNotesType--; OnNotesTypeChange(); break; case ROW_STEPS: @@ -326,9 +332,9 @@ void ScreenEditMenu::MenuRight( const PlayerNumber p ) OnSongChange(); break; case ROW_NOTES_TYPE: - if( m_CurNotesType == NUM_NOTES_TYPES-1 ) // can't go right any further + if( m_iSelectedNotesType == m_NotesTypes.GetSize()-1 ) // can't go right any further return; - m_CurNotesType = NotesType( m_CurNotesType+1 ); + m_iSelectedNotesType++; OnNotesTypeChange(); break; case ROW_STEPS: diff --git a/stepmania/src/ScreenEditMenu.h b/stepmania/src/ScreenEditMenu.h index 0e481586c6..f7c8c0d7b5 100644 --- a/stepmania/src/ScreenEditMenu.h +++ b/stepmania/src/ScreenEditMenu.h @@ -1,16 +1,16 @@ /* ----------------------------------------------------------------------------- - File: ScreenEditMenu.h + Class: ScreenEditMenu - Desc: The main title screen and menu. + Desc: See header. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford ----------------------------------------------------------------------------- */ #include "Screen.h" #include "Sprite.h" -#include "ColorNote.h" #include "BitmapText.h" #include "TransitionFade.h" #include "RandomSample.h" @@ -43,7 +43,7 @@ private: CString GetSelectedGroup() { return m_sGroups[m_iSelectedGroup]; }; Song* GetSelectedSong() { return m_pSongs[m_iSelectedSong]; }; - NotesType GetSelectedNotesType() { return m_CurNotesType; }; + NotesType GetSelectedNotesType() { return m_NotesTypes[m_iSelectedNotesType]; }; Notes* GetSelectedNotes() { return m_pNotess[m_iSelectedNotes]; }; void MenuUp( const PlayerNumber p ); @@ -70,7 +70,8 @@ private: Sprite m_sprArrowLeft; Sprite m_sprArrowRight; - NotesType m_CurNotesType; // index into enum GameMode + CArray m_NotesTypes; + int m_iSelectedNotesType; // index into m_NotesTypes BitmapText m_textNotesType; CArray m_pNotess; diff --git a/stepmania/src/ScreenEvaluation.cpp b/stepmania/src/ScreenEvaluation.cpp index 7283245a35..60536cf748 100644 --- a/stepmania/src/ScreenEvaluation.cpp +++ b/stepmania/src/ScreenEvaluation.cpp @@ -26,35 +26,67 @@ #include "ScreenSelectCourse.h" -const float BANNER_X = CENTER_X; -const float BANNER_Y = SCREEN_TOP + 100; - -const float STAGE_X = BANNER_X; -const float STAGE_Y = BANNER_Y-40; - -const float GRADE_X[NUM_PLAYERS] = { CENTER_X-226, CENTER_X+226 }; -const float GRADE_Y = BANNER_Y; - -const float JUDGE_LABELS_X = CENTER_X; -const float JUDGE_NUMBERS_X[NUM_PLAYERS]= { CENTER_X-88, CENTER_X+88 }; -const float JUDGE_NUMBERS_X_EZ2[NUM_PLAYERS]= { CENTER_X-88, CENTER_X+68 }; -const float JUDGE_START_Y = CENTER_Y - 70; -const float JUDGE_SPACING = 32; -const float JUDGE_EZ2_COOL_Y = CENTER_Y - 80; - -const float SCORE_LABEL_X = CENTER_X; -const float SCORE_DISPLAY_X[NUM_PLAYERS]= { CENTER_X-170, CENTER_X+170 }; -const float SCORE_Y = CENTER_Y + 140; - -const float BONUS_FRAME_X[NUM_PLAYERS] = { CENTER_X-220, CENTER_X+220 }; -const float BONUS_FRAME_Y = CENTER_Y+10; - -const float NEW_RECORD_X[NUM_PLAYERS] = { SCORE_DISPLAY_X[0], SCORE_DISPLAY_X[1] }; -const float NEW_RECORD_Y = SCORE_Y - 20; - -const float TRY_EXTRA_STAGE_X = CENTER_X; -const float TRY_EXTRA_STAGE_Y = SCREEN_BOTTOM - 60; +#define BANNER_X THEME->GetMetricF("Evaluation","BannerX") +#define BANNER_Y THEME->GetMetricF("Evaluation","BannerY") +#define STAGE_X THEME->GetMetricF("Evaluation","StageX") +#define STAGE_Y THEME->GetMetricF("Evaluation","StageY") +#define GRADE_P1_X THEME->GetMetricF("Evaluation","GradeP1X") +#define GRADE_P2_X THEME->GetMetricF("Evaluation","GradeP2X") +#define GRADE_Y THEME->GetMetricF("Evaluation","GradeY") +#define JUDGE_LABELS_X THEME->GetMetricF("Evaluation","JudgeLabelsX") +#define JUDGE_NUMBERS_P1_X THEME->GetMetricF("Evaluation","JudgeNumbersP1X") +#define JUDGE_NUMBERS_P2_X THEME->GetMetricF("Evaluation","JudgeNumbersP2X") +#define JUDGE_START_Y THEME->GetMetricF("Evaluation","JudgeStartY") +#define JUDGE_SPACING_Y THEME->GetMetricF("Evaluation","JudgeSpacingY") +#define SCORE_LABELS_X THEME->GetMetricF("Evaluation","ScoreLabelsX") +#define SCORE_NUMBERS_P1_X THEME->GetMetricF("Evaluation","ScoreNumbersP1X") +#define SCORE_NUMBERS_P2_X THEME->GetMetricF("Evaluation","ScoreNumbersP2X") +#define SCORE_Y THEME->GetMetricF("Evaluation","ScoreY") +#define BONUS_P1_X THEME->GetMetricF("Evaluation","BonusP1X") +#define BONUS_P2_X THEME->GetMetricF("Evaluation","BonusP2X") +#define BONUS_Y THEME->GetMetricF("Evaluation","BonusY") +#define NEW_RECORD_P1_X THEME->GetMetricF("Evaluation","NewRecordP1X") +#define NEW_RECORD_P2_X THEME->GetMetricF("Evaluation","NewRecordP2X") +#define NEW_RECORD_Y THEME->GetMetricF("Evaluation","NewRecordY") +#define TRY_EXTRA_STAGE_X THEME->GetMetricF("Evaluation","TryExtraStageX") +#define TRY_EXTRA_STAGE_Y THEME->GetMetricF("Evaluation","TryExtraStageY") +#define TIMER_SECONDS THEME->GetMetricI("Evaluation","TimerSeconds") +float GRADE_X( int p ) { + switch( p ) { + case PLAYER_1: return GRADE_P1_X; + case PLAYER_2: return GRADE_P2_X; + default: ASSERT(0); return 0; + } +} +float JUDGE_NUMBERS_X( int p ) { + switch( p ) { + case PLAYER_1: return JUDGE_NUMBERS_P1_X; + case PLAYER_2: return JUDGE_NUMBERS_P2_X; + default: ASSERT(0); return 0; + } +} +float SCORE_NUMBERS_X( int p ) { + switch( p ) { + case PLAYER_1: return SCORE_NUMBERS_P1_X; + case PLAYER_2: return SCORE_NUMBERS_P2_X; + default: ASSERT(0); return 0; + } +} +float BONUS_X( int p ) { + switch( p ) { + case PLAYER_1: return BONUS_P1_X; + case PLAYER_2: return BONUS_P2_X; + default: ASSERT(0); return 0; + } +} +float NEW_RECORD_X( int p ) { + switch( p ) { + case PLAYER_1: return NEW_RECORD_P1_X; + case PLAYER_2: return NEW_RECORD_P2_X; + default: ASSERT(0); return 0; + } +} const ScreenMessage SM_GoToSelectMusic = ScreenMessage(SM_User+1); const ScreenMessage SM_GoToSelectCourse = ScreenMessage(SM_User+2); @@ -127,6 +159,8 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) /////////////////////////// // Andy: // Fake COOL! / GOOD / OOPS for Ez2dancer using the DDR Rankings. +/* Todo: Accomodate this using theme metrics + if( GAMESTATE->m_CurGame == GAME_EZ2 ) { for( int p=0; pm_CurGame != GAME_EZ2 ) { + */ switch( m_ResultMode ) { case RM_ARCADE_STAGE: @@ -150,7 +187,7 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) m_BannerWithFrame[0].SetXY( BANNER_X, BANNER_Y ); this->AddSubActor( &m_BannerWithFrame[0] ); - m_textStage.Load( THEME->GetPathTo(FONT_HEADER1) ); + m_textStage.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textStage.TurnShadowOff(); m_textStage.SetXY( STAGE_X, STAGE_Y ); m_textStage.SetZoom( 0.5f ); @@ -186,7 +223,9 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) this->AddSubActor( &m_BannerWithFrame[0] ); break; } + /* } + */ @@ -194,34 +233,40 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) // Init graphic elements ////////////////////////// m_Menu.Load( - THEME->GetPathTo(GRAPHIC_EVALUATION_BACKGROUND), - m_ResultMode==RM_ARCADE_SUMMARY ? THEME->GetPathTo(GRAPHIC_EVALUATION_SUMMARY_TOP_EDGE) : THEME->GetPathTo(GRAPHIC_EVALUATION_TOP_EDGE), + THEME->GetPathTo("Graphics","evaluation background"), + THEME->GetPathTo("Graphics",m_ResultMode==RM_ARCADE_SUMMARY?"evaluation summary top edge":"evaluation top edge"), "Press START to continue", - false, true, 40 + false, true, TIMER_SECONDS ); this->AddSubActor( &m_Menu ); for( l=0; lm_CurGame != GAME_EZ2) { - m_sprJudgeLabels[l].Load( THEME->GetPathTo(GRAPHIC_EVALUATION_JUDGE_LABELS) ); + */ + m_sprJudgeLabels[l].Load( THEME->GetPathTo("Graphics","evaluation judge labels") ); m_sprJudgeLabels[l].StopAnimating(); m_sprJudgeLabels[l].SetState( l ); - m_sprJudgeLabels[l].SetXY( JUDGE_LABELS_X, JUDGE_START_Y + l*JUDGE_SPACING ); + m_sprJudgeLabels[l].SetXY( JUDGE_LABELS_X, JUDGE_START_Y + l*JUDGE_SPACING_Y ); m_sprJudgeLabels[l].SetZoom( 1.0f ); this->AddSubActor( &m_sprJudgeLabels[l] ); + /* } + */ - for( int p=0; pGetPathTo(FONT_SCORE_NUMBERS) ); + m_textJudgeNumbers[l][p].LoadFromFont( THEME->GetPathTo("Fonts","score numbers") ); m_textJudgeNumbers[l][p].TurnShadowOff(); - m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X[p], JUDGE_START_Y + l*JUDGE_SPACING ); + m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X(p), JUDGE_START_Y + l*JUDGE_SPACING_Y ); m_textJudgeNumbers[l][p].SetZoom( 0.7f ); m_textJudgeNumbers[l][p].SetDiffuseColor( PlayerToColor(p) ); +/* + TODO: This should somehow be accomodated with a switch in the theme metric file. // RE-ARRANGE the scoreboard for EZ2Dancer Scoring @@ -252,27 +297,29 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) m_textJudgeNumbers[l][p].SetXY( JUDGE_NUMBERS_X_EZ2[p]+40, JUDGE_EZ2_COOL_Y + 180); } } - +*/ this->AddSubActor( &m_textJudgeNumbers[l][p] ); } } - if (GAMESTATE->m_CurGame != GAME_EZ2) +/* if (GAMESTATE->m_CurGame != GAME_EZ2) { - m_sprScoreLabel.Load( THEME->GetPathTo(GRAPHIC_EVALUATION_SCORE_LABELS) ); +*/ + m_sprScoreLabel.Load( THEME->GetPathTo("Graphics","evaluation score labels") ); m_sprScoreLabel.SetState( m_ResultMode==RM_ONI ? 1 : 0 ); m_sprScoreLabel.StopAnimating(); - m_sprScoreLabel.SetXY( SCORE_LABEL_X, SCORE_Y ); + m_sprScoreLabel.SetXY( SCORE_LABELS_X, SCORE_Y ); m_sprScoreLabel.SetZoom( 1.0f ); this->AddSubActor( &m_sprScoreLabel ); - } +/* } +*/ for( p=0; pIsPlayerEnabled( (PlayerNumber)p ) || GAMESTATE->m_CurGame == GAME_EZ2 ) + if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) ) // || GAMESTATE->m_CurGame == GAME_EZ2 ) // If EZ2 wants to hide this graphic, place it somewhere off screen using theme metrics continue; // skip - m_ScoreDisplay[p].SetXY( SCORE_DISPLAY_X[p], SCORE_Y ); + m_ScoreDisplay[p].SetXY( SCORE_NUMBERS_X(p), SCORE_Y ); m_ScoreDisplay[p].SetZoomY( 0.9f ); m_ScoreDisplay[p].SetDiffuseColor( PlayerToColor(p) ); this->AddSubActor( &m_ScoreDisplay[p] ); @@ -346,12 +393,16 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) m_ScoreDisplay[p].SetScore( fScore[p] ); } + /* + TODO: Accomodate this with a theme metric + // SNEAKY! We take the max combo, and put it into element 5, because Ez2dancer // doesn't care for OK's and plus this text element is already nicely aligned =) if (GAMESTATE->m_CurGame == GAME_EZ2) { m_textJudgeNumbers[5][p].SetText( ssprintf("%4d", iMaxCombo[p]) ); } + */ m_BonusInfoFrame[p].SetBonusInfo( (PlayerNumber)p, fPossibleRadarValues[p], fActualRadarValues[p], iMaxCombo[p] ); m_StageBox[p].SetStageInfo( (PlayerNumber)p, GAMESTATE->m_iSongsBeforeFail[p] ); @@ -416,21 +467,24 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) if( !GAMESTATE->IsPlayerEnabled( (PlayerNumber)p ) ) continue; // skip +/* Chris: If you don't want EZ2 to have a grade frame, then make a theme that has a 1x1 transparent graphic for the grade frame. + if ( GAMESTATE->m_CurGame != GAME_EZ2) { - m_sprGradeFrame[p].Load( THEME->GetPathTo(GRAPHIC_EVALUATION_GRADE_FRAME) ); +*/ + m_sprGradeFrame[p].Load( THEME->GetPathTo("Graphics","evaluation grade frame") ); m_sprGradeFrame[p].StopAnimating(); m_sprGradeFrame[p].SetState( p ); - m_sprGradeFrame[p].SetXY( GRADE_X[p], GRADE_Y ); + m_sprGradeFrame[p].SetXY( GRADE_X(p), GRADE_Y ); this->AddSubActor( &m_sprGradeFrame[p] ); - } - +/* } +*/ switch( m_ResultMode ) { case RM_ONI: { - m_textOniPercent[p].Load( THEME->GetPathTo(FONT_HEADER1) ); - m_textOniPercent[p].SetXY( GRADE_X[p], GRADE_Y ); + m_textOniPercent[p].LoadFromFont( THEME->GetPathTo("Fonts","header1") ); + m_textOniPercent[p].SetXY( GRADE_X(p), GRADE_Y ); m_textOniPercent[p].SetShadowLength( 2 ); m_textOniPercent[p].SetZoomX( 1.3f ); m_textOniPercent[p].SetZoomY( 2.5f ); @@ -441,22 +495,27 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) m_textOniPercent[p].SetText( ssprintf("%.1f%%", fPercentDancePoints*100) ); this->AddSubActor( &m_textOniPercent[p] ); - m_StageBox[p].SetXY( BONUS_FRAME_X[p], BONUS_FRAME_Y ); + m_StageBox[p].SetXY( BONUS_X(p), BONUS_Y ); this->AddSubActor( &m_StageBox[p] ); } break; case RM_ARCADE_STAGE: case RM_ARCADE_SUMMARY: + /* + Todo: Accomodate this in theme metrics + if (GAMESTATE->m_CurGame != GAME_EZ2 ) { - m_Grades[p].SetXY( GRADE_X[p], GRADE_Y ); + */ + m_Grades[p].SetXY( GRADE_X(p), GRADE_Y ); m_Grades[p].SetZ( -2 ); m_Grades[p].SetZoom( 1.0f ); m_Grades[p].SetEffectGlowing( 1.0f ); m_Grades[p].SpinAndSettleOn( grade[p] ); - m_BonusInfoFrame[p].SetXY( BONUS_FRAME_X[p], BONUS_FRAME_Y ); + m_BonusInfoFrame[p].SetXY( BONUS_X(p), BONUS_Y ); this->AddSubActor( &m_BonusInfoFrame[p] ); + /* } else // Ez2dancer Style Grade Display. { @@ -475,19 +534,22 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) m_Grades[p].SetTweenZoom( 2 ); } + */ this->AddSubActor( &m_Grades[p] ); break; } +/* Chris: If EZ2 wants to hide these things, place them off screen using theme metrics + if ( GAMESTATE->m_CurGame == GAME_EZ2) continue; - +*/ m_bNewRecord[p] = false; if( m_bNewRecord[p] ) { - m_textNewRecord[p].Load( THEME->GetPathTo(FONT_HEADER1) ); - m_textNewRecord[p].SetXY( NEW_RECORD_X[p], NEW_RECORD_Y ); + m_textNewRecord[p].LoadFromFont( THEME->GetPathTo("Fonts","header1") ); + m_textNewRecord[p].SetXY( NEW_RECORD_X(p), NEW_RECORD_Y ); m_textNewRecord[p].SetShadowLength( 2 ); m_textNewRecord[p].SetText( "IT'S A NEW RECORD!" ); m_textNewRecord[p].SetZoom( 0.5f ); @@ -495,11 +557,11 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) this->AddSubActor( &m_textNewRecord[p] ); } } - + if( m_bTryExtraStage ) { - m_textTryExtraStage.Load( THEME->GetPathTo(FONT_HEADER1) ); + m_textTryExtraStage.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textTryExtraStage.SetXY( TRY_EXTRA_STAGE_X, TRY_EXTRA_STAGE_Y ); if( GAMESTATE->IsExtraStage() ) m_textTryExtraStage.SetText( "Try Another Extra Stage!" ); @@ -509,7 +571,7 @@ ScreenEvaluation::ScreenEvaluation( bool bSummary ) m_textTryExtraStage.SetEffectGlowing( 1.0f ); this->AddSubActor( &m_textTryExtraStage ); - SOUND->PlayOnceStreamed( THEME->GetPathTo(SOUND_EVALUATION_EXTRA_STAGE) ); + SOUND->PlayOnceStreamed( THEME->GetPathTo("Sounds","evaluation extra stage") ); } else { @@ -579,14 +641,19 @@ void ScreenEvaluation::TweenOnScreen() for( i=0; im_CurGame != GAME_EZ2) { + */ fOriginalY = m_sprJudgeLabels[i].GetY(); m_sprJudgeLabels[i].SetY( fOriginalY + SCREEN_HEIGHT ); m_sprJudgeLabels[i].BeginTweeningQueued( 0.2f + 0.1f*i ); m_sprJudgeLabels[i].BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_BEGIN ); m_sprJudgeLabels[i].SetTweenY( fOriginalY ); + /* } + */ for( int p=0; pm_CurGame != GAME_EZ2) { - + */ fOriginalY = m_sprScoreLabel.GetY(); m_sprScoreLabel.SetY( fOriginalY + SCREEN_HEIGHT ); m_sprScoreLabel.BeginTweeningQueued( 0.8f + 0.1f*i ); @@ -645,7 +714,9 @@ void ScreenEvaluation::TweenOnScreen() m_textTryExtraStage.BeginTweening( MENU_ELEMENTS_TWEEN_TIME ); m_textTryExtraStage.SetTweenZoomY( 0 ); + /* } + */ } void ScreenEvaluation::TweenOffScreen() @@ -663,11 +734,15 @@ void ScreenEvaluation::TweenOffScreen() for( i=0; im_CurGame != GAME_EZ2) { + */ m_sprJudgeLabels[i].BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_END ); m_sprJudgeLabels[i].SetTweenZoomY( 0 ); + /* } + */ for( int p=0; pm_CurGame != GAME_EZ2) { + */ m_sprScoreLabel.BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_END ); m_sprScoreLabel.SetTweenZoomY( 0 ); @@ -687,7 +764,9 @@ void ScreenEvaluation::TweenOffScreen() m_ScoreDisplay[p].BeginTweeningQueued( MENU_ELEMENTS_TWEEN_TIME, Actor::TWEEN_BIAS_END ); m_ScoreDisplay[p].SetTweenZoomY( 0 ); } + /* } + */ for( p=0; pm_iCurrentStageIndex == PREFSMAN->m_iNumArcadeStages-1 ) m_Menu.TweenOffScreenToMenu( SM_GoToFinalEvaluation ); - else if( m_ResultMode == RM_ARCADE_STAGE && GAMESTATE->m_iCurrentStageIndex != PREFSMAN->m_iNumArcadeStages-1 ) + else if( m_ResultMode == RM_ARCADE_STAGE && GAMESTATE->m_iCurrentStageIndex < PREFSMAN->m_iNumArcadeStages-1 ) m_Menu.TweenOffScreenToMenu( SM_GoToSelectMusic ); else m_Menu.TweenOffScreenToBlack( SM_GoToMusicScroll, false ); diff --git a/stepmania/src/ScreenEz2SelectPlayer.cpp b/stepmania/src/ScreenEz2SelectPlayer.cpp index 2cf27c2864..098c301a31 100644 --- a/stepmania/src/ScreenEz2SelectPlayer.cpp +++ b/stepmania/src/ScreenEz2SelectPlayer.cpp @@ -1,3 +1,4 @@ +#include "stdafx.h" /**************************************** ScreenEzSelectPlayer,cpp Desc: See Header @@ -7,7 +8,6 @@ Andrew Livy /* Includes */ -#include "stdafx.h" #include "ScreenEz2SelectPlayer.h" #include "ScreenManager.h" #include "PrefsManager.h" @@ -21,6 +21,7 @@ Andrew Livy #include "GameManager.h" #include "RageLog.h" #include "AnnouncerManager.h" +#include "ScreenSelectStyle.h" #include "ScreenEz2SelectStyle.h" #include "GameState.h" #include "RageException.h" @@ -30,6 +31,9 @@ Andrew Livy const ScreenMessage SM_GoToPrevState = ScreenMessage(SM_User + 1); const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User + 2); + +#define USE_NORMAL_OR_EZ2_SELECT_STYLE THEME->GetMetricB("Screens","UseNormalOrEZ2SelectStyle") + const float TWEEN_TIME = 0.35f; const D3DXCOLOR OPT_NOT_SELECTED = D3DXCOLOR(0.3f,0.3f,0.3f,1); const D3DXCOLOR OPT_SELECTED = D3DXCOLOR(1.0f,1.0f,1.0f,1); @@ -47,6 +51,8 @@ const float OPT_Y[NUM_EZ2_GRAPHICS] = { CENTER_Y+115, }; // tells us the default Y position + + float ez2_lasttimercheck[2]; int ez2_bounce=0; // used for the bouncing of the '1p' and '2p' images int ez2_direct=0; // direction of the bouncing of the '1p' and '2p' images @@ -63,52 +69,44 @@ ScreenEz2SelectPlayer::ScreenEz2SelectPlayer() ez2_lasttimercheck[1] = 0.0f; m_iSelectedStyle=3; // by bbf: frieza, was this supposed to be 3 ? GAMESTATE->m_CurStyle = STYLE_NONE; - GAMESTATE->m_MasterPlayerNumber = PLAYER_INVALID; +// GAMESTATE->m_MasterPlayerNumber = PLAYER_INVALID; // Load in the sprites we will be working with. for( int i=0; iGetPathTo(GRAPHIC_SELECT_DIFFICULTY_HARD_PICTURE); - break; - case 1: - sPadGraphicPath = THEME->GetPathTo(GRAPHIC_SELECT_DIFFICULTY_HARD_PICTURE); - break; - case 2: - sPadGraphicPath = THEME->GetPathTo(GRAPHIC_SELECT_DIFFICULTY_MEDIUM_PICTURE); - break; - case 3: - sPadGraphicPath = THEME->GetPathTo(GRAPHIC_SELECT_DIFFICULTY_EASY_PICTURE); - break; + case 0: sOptFileName = "select difficulty hard picture"; break; + case 1: sOptFileName = "select difficulty hard picture"; break; + case 2: sOptFileName = "select difficulty medium picture"; break; + case 3: sOptFileName = "select difficulty easy picture"; break; } - m_sprOpt[i].Load( sPadGraphicPath ); + m_sprOpt[i].Load( THEME->GetPathTo("Graphics",sOptFileName) ); m_sprOpt[i].SetXY( OPT_X[i], OPT_Y[i] ); - m_sprOpt[i].SetZoom( 1 ); this->AddSubActor( &m_sprOpt[i] ); } m_Menu.Load( - THEME->GetPathTo(GRAPHIC_SELECT_STYLE_BACKGROUND), - THEME->GetPathTo(GRAPHIC_SELECT_STYLE_TOP_EDGE), + THEME->GetPathTo("Graphics","select style background"), + THEME->GetPathTo("Graphics","select style top edge"), ssprintf("Press %c on the pad you wish to play on", char(4) ), false, true, 40 ); this->AddSubActor( &m_Menu ); - m_soundChange.Load( THEME->GetPathTo(SOUND_SELECT_STYLE_CHANGE) ); - m_soundSelect.Load( THEME->GetPathTo(SOUND_MENU_START) ); - m_soundInvalid.Load( THEME->GetPathTo(SOUND_MENU_INVALID) ); + m_soundChange.Load( THEME->GetPathTo("Sounds","select style change") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); + m_soundInvalid.Load( THEME->GetPathTo("Sounds","menu invalid") ); -// SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_STYLE_INTRO) ); + /* Chris: If EZ2 doesn't use this sound, make a theme that overrides is with a silent sound file */ + SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_STYLE_INTRO) ); if( !MUSIC->IsPlaying() ) { - MUSIC->Load( THEME->GetPathTo(SOUND_MENU_MUSIC) ); + MUSIC->Load( THEME->GetPathTo("Sounds","select player music") ); MUSIC->Play( true ); } @@ -184,17 +182,17 @@ void ScreenEz2SelectPlayer::DrawPrimitives() if (m_iSelectedStyle == 0) // only the left pad was selected { - GAMESTATE->m_MasterPlayerNumber = PLAYER_1; +// GAMESTATE->m_MasterPlayerNumber = PLAYER_1; GAMESTATE->m_CurStyle = STYLE_EZ2_SINGLE; } else if (m_iSelectedStyle == 1) // only the right pad was selected { - GAMESTATE->m_MasterPlayerNumber = PLAYER_2; +// GAMESTATE->m_MasterPlayerNumber = PLAYER_2; GAMESTATE->m_CurStyle = STYLE_EZ2_SINGLE; } else // they both selected { - GAMESTATE->m_MasterPlayerNumber = PLAYER_1; +// GAMESTATE->m_MasterPlayerNumber = PLAYER_1; GAMESTATE->m_CurStyle = STYLE_EZ2_SINGLE_VERSUS; } @@ -242,7 +240,10 @@ void ScreenEz2SelectPlayer::HandleScreenMessage( const ScreenMessage SM ) SCREENMAN->SetNewScreen( new ScreenTitleMenu ); break; case SM_GoToNextState: - SCREENMAN->SetNewScreen( new ScreenEz2SelectStyle ); + if( USE_NORMAL_OR_EZ2_SELECT_STYLE ) + SCREENMAN->SetNewScreen( new ScreenEz2SelectStyle ); + else + SCREENMAN->SetNewScreen( new ScreenSelectStyle ); break; } } @@ -293,7 +294,7 @@ void ScreenEz2SelectPlayer::MenuStart( PlayerNumber p ) // if( GAMESTATE->m_MasterPlayerNumber != PLAYER_2 && GAMESTATE->m_MasterPlayerNumber != PLAYER_1 ) if (m_iSelectedStyle == 3) { - GAMESTATE->m_MasterPlayerNumber = p; +// GAMESTATE->m_MasterPlayerNumber = p; if (p == PLAYER_1) { diff --git a/stepmania/src/ScreenEz2SelectStyle.cpp b/stepmania/src/ScreenEz2SelectStyle.cpp index 114ab12a1b..5bfb27804e 100644 --- a/stepmania/src/ScreenEz2SelectStyle.cpp +++ b/stepmania/src/ScreenEz2SelectStyle.cpp @@ -112,6 +112,10 @@ const float OPT_YP[NUM_EZ2P_GRAPHICS] = { CENTER_Y+115, }; // tells us the default Y position + +#define SKIP_SELECT_DIFFICULTY THEME->GetMetricB("Screens","SkipSelectDifficulty") + + float ez2p_lasttimercheck[2]; int ez2p_bounce=0; // used for the bouncing of the '1p' and '2p' images int ez2p_direct=0; // direction of the bouncing of the '1p' and '2p' images @@ -127,18 +131,11 @@ ScreenEz2SelectStyle::ScreenEz2SelectStyle() m_iSelectedStyle=0; ez2p_lasttimercheck[0] = TIMER->GetTimeSinceStart(); -// Load in the sprites we will be working with. + + // Load in the sprites we will be working with. for( int i=0; iGetPathTo(te) ); + m_sprBackground[i].Load( THEME->GetPathTo("Graphics",ssprintf("select style preview game %d style %d",GAMESTATE->m_CurGame,i)) ); m_sprBackground[i].SetXY( CENTER_X, CENTER_Y ); m_sprBackground[i].SetZoom( 1 ); this->AddSubActor( &m_sprBackground[i] ); @@ -146,15 +143,7 @@ ScreenEz2SelectStyle::ScreenEz2SelectStyle() for( i=0; iGetPathTo(te) ); + m_sprOpt[i].Load( THEME->GetPathTo("Graphics",ssprintf("select style info game %d style %d",GAMESTATE->m_CurGame,i)) ); m_sprOpt[i].SetXY( OPT_X[i], OPT_Y[i] ); m_sprOpt[i].SetZoom( 1 ); this->AddSubActor( &m_sprOpt[i] ); @@ -162,50 +151,47 @@ ScreenEz2SelectStyle::ScreenEz2SelectStyle() for( i=0; iGetPathTo(GRAPHIC_SELECT_DIFFICULTY_HARD_PICTURE); - break; - case 1: - sPadGraphicPath = THEME->GetPathTo(GRAPHIC_SELECT_DIFFICULTY_HARD_PICTURE); - break; - case 2: - sPadGraphicPath = THEME->GetPathTo(GRAPHIC_SELECT_DIFFICULTY_MEDIUM_PICTURE); - break; - case 3: - sPadGraphicPath = THEME->GetPathTo(GRAPHIC_SELECT_DIFFICULTY_EASY_PICTURE); - break; + case 0: sPlyFileName = "select difficulty hard picture"; break; + case 1: sPlyFileName = "select difficulty hard picture"; break; + case 2: sPlyFileName = "select difficulty medium picture"; break; + case 3: sPlyFileName = "select difficulty easy picture"; break; } - m_sprPly[i].Load( sPadGraphicPath ); + m_sprPly[i].Load( THEME->GetPathTo("Graphics",sPlyFileName) ); m_sprPly[i].SetXY( OPT_XP[i], OPT_YP[i] ); m_sprPly[i].SetZoom( 1 ); this->AddSubActor( &m_sprPly[i] ); } m_Menu.Load( - THEME->GetPathTo(GRAPHIC_SELECT_STYLE_BACKGROUND), - THEME->GetPathTo(GRAPHIC_SELECT_STYLE_TOP_EDGE), + THEME->GetPathTo("Graphics","select style background"), + THEME->GetPathTo("Graphics","select style top edge"), ssprintf("Use %c %c to select, then press START", char(1), char(2) ), false, true, 40 ); this->AddSubActor( &m_Menu ); - m_soundChange.Load( THEME->GetPathTo(SOUND_SELECT_STYLE_CHANGE) ); - m_soundSelect.Load( THEME->GetPathTo(SOUND_MENU_START) ); - m_soundInvalid.Load( THEME->GetPathTo(SOUND_MENU_INVALID) ); + m_soundChange.Load( THEME->GetPathTo("Sounds","select style change") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); + m_soundInvalid.Load( THEME->GetPathTo("Sounds","menu invalid") ); -// SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_STYLE_INTRO) ); + /* Chris: if EZ2 shouldn't play a sound here, then make a slient sound file. */ + SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_STYLE_INTRO) ); if( !MUSIC->IsPlaying() ) { - MUSIC->Load( THEME->GetPathTo(SOUND_MUSIC_SCROLL_MUSIC) ); + MUSIC->Load( THEME->GetPathTo("Sounds","select style music") ); MUSIC->Play( true ); } - if ( GAMESTATE->m_MasterPlayerNumber == PLAYER_1 && GAMESTATE->m_CurStyle == STYLE_EZ2_SINGLE) //if p1 already selected hide graphic. + /* + TODO: Get all the EZ2 specific stuff out of here + */ + + if ( GAMESTATE->m_bIsJoined[PLAYER_1] && GAMESTATE->m_CurStyle == STYLE_EZ2_SINGLE) //if p1 already selected hide graphic. { m_iSelectedPlayer = 0; m_sprPly[1].BeginTweening( 0 ); @@ -213,7 +199,7 @@ ScreenEz2SelectStyle::ScreenEz2SelectStyle() m_sprPly[2].BeginTweening( 0 ); m_sprPly[2].SetTweenZoomY( 0 ); } - else if ( GAMESTATE->m_MasterPlayerNumber == PLAYER_2 && GAMESTATE->m_CurStyle == STYLE_EZ2_SINGLE) //if p2 already selected hide graphic. + else if ( GAMESTATE->m_bIsJoined[PLAYER_2] && GAMESTATE->m_CurStyle == STYLE_EZ2_SINGLE) //if p2 already selected hide graphic. { m_iSelectedPlayer = 1; m_sprPly[3].BeginTweening( 0 ); @@ -343,7 +329,7 @@ void ScreenEz2SelectStyle::HandleScreenMessage( const ScreenMessage SM ) else // club { GAMESTATE->m_CurStyle = STYLE_EZ2_DOUBLE; - GAMESTATE->m_MasterPlayerNumber = PLAYER_1; +// GAMESTATE->m_MasterPlayerNumber = PLAYER_1; } } @@ -357,7 +343,10 @@ void ScreenEz2SelectStyle::HandleScreenMessage( const ScreenMessage SM ) SCREENMAN->SetNewScreen( new ScreenTitleMenu ); break; case SM_GoToNextState: - SCREENMAN->SetNewScreen( new ScreenSelectGroup ); + if( SKIP_SELECT_DIFFICULTY ) + SCREENMAN->SetNewScreen( new ScreenSelectGroup ); + else + SCREENMAN->SetNewScreen( new ScreenSelectDifficulty ); break; } } @@ -736,7 +725,7 @@ void ScreenEz2SelectStyle::MenuStart( PlayerNumber p ) { GAMESTATE->m_CurStyle = STYLE_EZ2_DOUBLE; GAMESTATE->m_CurStyle = STYLE_EZ2_DOUBLE; - GAMESTATE->m_MasterPlayerNumber = PLAYER_1; +// GAMESTATE->m_MasterPlayerNumber = PLAYER_1; //m_soundInvalid.PlayRandom(); //return; } diff --git a/stepmania/src/ScreenGameOver.cpp b/stepmania/src/ScreenGameOver.cpp index 4022ea3dea..f64b0335e7 100644 --- a/stepmania/src/ScreenGameOver.cpp +++ b/stepmania/src/ScreenGameOver.cpp @@ -31,7 +31,7 @@ ScreenGameOver::ScreenGameOver() { m_bClosing = false; - m_sprGameOver.Load( THEME->GetPathTo(GRAPHIC_GAME_OVER) ); + m_sprGameOver.Load( THEME->GetPathTo("Graphics","game over") ); m_sprGameOver.SetXY( CENTER_X, CENTER_Y ); this->AddSubActor( &m_sprGameOver ); diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index bb9f1e8fd6..10ff140ed4 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -36,38 +36,141 @@ // Defines // -const float LIFE_LOCAL_X[NUM_PLAYERS] = { -180, +180 }; -const float LIFE_LOCAL_Y[NUM_PLAYERS] = { -8, -8 }; +#define TOP_FRAME_X THEME->GetMetricF("Gameplay","TopFrameX") +#define TOP_FRAME_Y THEME->GetMetricF("Gameplay","TopFrameY") +#define TOP_FRAME_EXTRA_Y THEME->GetMetricF("Gameplay","TopFrameExtraY") +#define BOTTOM_FRAME_X THEME->GetMetricF("Gameplay","BottomFrameX") +#define BOTTOM_FRAME_Y THEME->GetMetricF("Gameplay","BottomFrameY") +#define BOTTOM_FRAME_EXTRA_Y THEME->GetMetricF("Gameplay","BottomFrameExtraY") +#define MIDDLE_FRAME_X THEME->GetMetricF("Gameplay","MiddleFrameX") +#define MIDDLE_FRAME_Y THEME->GetMetricF("Gameplay","MiddleFrameY") +#define LIFE_P1_X THEME->GetMetricF("Gameplay","LifeP1X") +#define LIFE_P1_Y THEME->GetMetricF("Gameplay","LifeP1Y") +#define LIFE_P1_EXTRA_Y THEME->GetMetricF("Gameplay","LifeP1ExtraY") +#define LIFE_P2_X THEME->GetMetricF("Gameplay","LifeP2X") +#define LIFE_P2_Y THEME->GetMetricF("Gameplay","LifeP2Y") +#define LIFE_P2_EXTRA_Y THEME->GetMetricF("Gameplay","LifeP2ExtraY") +#define STAGE_X THEME->GetMetricF("Gameplay","StageX") +#define STAGE_Y THEME->GetMetricF("Gameplay","StageY") +#define STAGE_EXTRA_Y THEME->GetMetricF("Gameplay","StageExtraY") +#define SONG_NUMBER_P1_X THEME->GetMetricF("Gameplay","SongNumberP1X") +#define SONG_NUMBER_P1_Y THEME->GetMetricF("Gameplay","SongNumberP1Y") +#define SONG_NUMBER_P1_EXTRA_Y THEME->GetMetricF("Gameplay","SongNumberP1ExtraY") +#define SONG_NUMBER_P2_X THEME->GetMetricF("Gameplay","SongNumberP2X") +#define SONG_NUMBER_P2_Y THEME->GetMetricF("Gameplay","SongNumberP2Y") +#define SONG_NUMBER_P2_EXTRA_Y THEME->GetMetricF("Gameplay","SongNumberP2ExtraY") +#define SCORE_P1_X THEME->GetMetricF("Gameplay","ScoreP1X") +#define SCORE_P1_Y THEME->GetMetricF("Gameplay","ScoreP1Y") +#define SCORE_P1_EXTRA_Y THEME->GetMetricF("Gameplay","ScoreP1ExtraY") +#define SCORE_P2_X THEME->GetMetricF("Gameplay","ScoreP2X") +#define SCORE_P2_Y THEME->GetMetricF("Gameplay","ScoreP2Y") +#define SCORE_P2_EXTRA_Y THEME->GetMetricF("Gameplay","ScoreP2ExtraY") +#define PLAYER_OPTIONS_P1_X THEME->GetMetricF("Gameplay","PlayerOptionsP1X") +#define PLAYER_OPTIONS_P1_Y THEME->GetMetricF("Gameplay","PlayerOptionsP1Y") +#define PLAYER_OPTIONS_P1_EXTRA_Y THEME->GetMetricF("Gameplay","PlayerOptionsP1ExtraY") +#define PLAYER_OPTIONS_P2_X THEME->GetMetricF("Gameplay","PlayerOptionsP2X") +#define PLAYER_OPTIONS_P2_Y THEME->GetMetricF("Gameplay","PlayerOptionsP2Y") +#define PLAYER_OPTIONS_P2_EXTRA_Y THEME->GetMetricF("Gameplay","PlayerOptionsP2ExtraY") +#define SONG_OPTIONS_X THEME->GetMetricF("Gameplay","SongOptionsX") +#define SONG_OPTIONS_Y THEME->GetMetricF("Gameplay","SongOptionsY") +#define SONG_OPTIONS_EXTRA_Y THEME->GetMetricF("Gameplay","SongOptionsExtraY") +#define DIFFICULTY_P1_X THEME->GetMetricF("Gameplay","DifficultyP1X") +#define DIFFICULTY_P1_Y THEME->GetMetricF("Gameplay","DifficultyP1Y") +#define DIFFICULTY_P1_REVERSE_Y THEME->GetMetricF("Gameplay","DifficultyP1ReverseY") +#define DIFFICULTY_P1_EXTRA_Y THEME->GetMetricF("Gameplay","DifficultyP1ExtraY") +#define DIFFICULTY_P1_EXTRA_REVERSE_Y THEME->GetMetricF("Gameplay","DifficultyP1ExtraReverseY") +#define DIFFICULTY_P2_X THEME->GetMetricF("Gameplay","DifficultyP2X") +#define DIFFICULTY_P2_Y THEME->GetMetricF("Gameplay","DifficultyP2Y") +#define DIFFICULTY_P2_REVERSE_Y THEME->GetMetricF("Gameplay","DifficultyP2ReverseY") +#define DIFFICULTY_P2_EXTRA_Y THEME->GetMetricF("Gameplay","DifficultyP2ExtraY") +#define DIFFICULTY_P2_EXTRA_REVERSE_Y THEME->GetMetricF("Gameplay","DifficultyP2ExtraReverseY") +#define DEBUG_X THEME->GetMetricF("Gameplay","DebugX") +#define DEBUG_Y THEME->GetMetricF("Gameplay","DebugY") +#define SURVIVE_TIME_X THEME->GetMetricF("Gameplay","SurviveTimeX") +#define SURVIVE_TIME_Y THEME->GetMetricF("Gameplay","SurviveTimeY") +#define SECONDS_BETWEEN_COMMENTS THEME->GetMetricF("Gameplay","SecondsBetweenComments") +#define DEMONSTRATION_SECONDS THEME->GetMetricF("Gameplay","DemonstrationSeconds") -const float STAGE_NUMBER_LOCAL_X = 0; -const float STAGE_NUMBER_LOCAL_Y = +20; -const float STAGE_NUMBER_LOCALEZ2_Y = -30; - -const float SONG_NUMBER_LOCAL_X[NUM_PLAYERS] = { STAGE_NUMBER_LOCAL_X-20, STAGE_NUMBER_LOCAL_X+20 }; -const float SONG_NUMBER_LOCAL_Y[NUM_PLAYERS] = { STAGE_NUMBER_LOCAL_Y, STAGE_NUMBER_LOCAL_Y }; - - -const float SCORE_LOCAL_X[NUM_PLAYERS] = { -214, +214 }; -const float SCORE_LOCAL_Y[NUM_PLAYERS] = { -6, -6 }; - -const float SCORE_LOCALEZ2_X[NUM_PLAYERS] = { -240, +240 }; -const float SCORE_LOCALEZ2_Y[NUM_PLAYERS] = { -32, -32 }; - -const float PLAYER_OPTIONS_LOCAL_X[NUM_PLAYERS] = { -0, +0 }; -const float PLAYER_OPTIONS_LOCAL_Y[NUM_PLAYERS] = { -12, +2 }; - -const float DIFFICULTY_X[NUM_PLAYERS] = { SCREEN_LEFT+60, SCREEN_RIGHT-60 }; -const float DIFFICULTY_Y[NUM_PLAYERS] = { SCREEN_BOTTOM-70, SCREEN_BOTTOM-70 }; - -const float DEBUG_X = CENTER_X; -const float DEBUG_Y = CENTER_Y-70; - -const float SURVIVE_TIME_X = CENTER_X; -const float SURVIVE_TIME_Y = CENTER_Y+100; - -const float TIME_BETWEEN_DANCING_COMMENTS = 13; - -const float DEMONSTRATION_TIME = 30; +float LIFE_X( int p ) { + switch( p ) { + case PLAYER_1: return LIFE_P1_X; + case PLAYER_2: return LIFE_P2_X; + default: ASSERT(0); return 0; + } +} +float LIFE_Y( int p, bool bExtra ) { + switch( p ) { + case PLAYER_1: return bExtra ? LIFE_P1_EXTRA_Y : LIFE_P1_Y; + case PLAYER_2: return bExtra ? LIFE_P2_EXTRA_Y : LIFE_P2_Y; + default: ASSERT(0); return 0; + } +} +float SONG_NUMBER_X( int p ) { + switch( p ) { + case PLAYER_1: return SONG_NUMBER_P1_X; + case PLAYER_2: return SONG_NUMBER_P2_X; + default: ASSERT(0); return 0; + } +} +float SONG_NUMBER_Y( int p, bool bExtra ) { + switch( p ) { + case PLAYER_1: return bExtra ? SONG_NUMBER_P1_EXTRA_Y : SONG_NUMBER_P1_Y; + case PLAYER_2: return bExtra ? SONG_NUMBER_P2_EXTRA_Y : SONG_NUMBER_P2_Y; + default: ASSERT(0); return 0; + } +} +float SCORE_X( int p ) { + switch( p ) { + case PLAYER_1: return SCORE_P1_X; + case PLAYER_2: return SCORE_P2_X; + default: ASSERT(0); return 0; + } +} +float SCORE_Y( int p, bool bExtra ) { + switch( p ) { + case PLAYER_1: return bExtra ? SCORE_P1_EXTRA_Y : SCORE_P1_Y; + case PLAYER_2: return bExtra ? SCORE_P2_EXTRA_Y : SCORE_P2_Y; + default: ASSERT(0); return 0; + } +} +float DIFFICULTY_X( int p ) { + switch( p ) { + case PLAYER_1: return DIFFICULTY_P1_X; + case PLAYER_2: return DIFFICULTY_P2_X; + default: ASSERT(0); return 0; + } +} +float DIFFICULTY_Y( int p, bool bReverse, bool bExtra ) { + switch( p ) { + case PLAYER_1: + if( bExtra && bReverse ) return DIFFICULTY_P1_EXTRA_REVERSE_Y; + if( !bExtra && bReverse ) return DIFFICULTY_P1_REVERSE_Y; + if( bExtra && !bReverse ) return DIFFICULTY_P1_EXTRA_Y; + if( !bExtra && !bReverse ) return DIFFICULTY_P1_Y; + else ASSERT(0); + case PLAYER_2: + if( bExtra && bReverse ) return DIFFICULTY_P2_EXTRA_REVERSE_Y; + if( !bExtra && bReverse ) return DIFFICULTY_P2_REVERSE_Y; + if( bExtra && !bReverse ) return DIFFICULTY_P2_EXTRA_Y; + if( !bExtra && !bReverse ) return DIFFICULTY_P2_Y; + else ASSERT(0); + } + ASSERT(0); return 0; +} +float PLAYER_OPTIONS_X( int p ) { + switch( p ) { + case PLAYER_1: return PLAYER_OPTIONS_P1_X; + case PLAYER_2: return PLAYER_OPTIONS_P2_X; + default: ASSERT(0); return 0; + } +} +float PLAYER_OPTIONS_Y( int p, bool bExtra ) { + switch( p ) { + case PLAYER_1: return bExtra ? PLAYER_OPTIONS_P1_EXTRA_Y : PLAYER_OPTIONS_P1_Y; + case PLAYER_2: return bExtra ? PLAYER_OPTIONS_P2_EXTRA_Y : PLAYER_OPTIONS_P2_Y; + default: ASSERT(0); return 0; + } +} // received while STATE_DANCING @@ -99,6 +202,12 @@ ScreenGameplay::ScreenGameplay() GAMESTATE->ResetStageStatistics(); // clear values + const bool bExtra = GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2(); + const bool bReverse[NUM_PLAYERS] = { + GAMESTATE->m_PlayerOptions[0].m_bReverseScroll, + GAMESTATE->m_PlayerOptions[1].m_bReverseScroll + }; + // Update possible dance points for( int p=0; pAddSubActor( &m_Player[p] ); - m_sprOniGameOver[p].Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_ONI_GAMEOVER) ); + m_sprOniGameOver[p].Load( THEME->GetPathTo("Graphics","gameplay oni gameover") ); m_sprOniGameOver[p].SetX( fPlayerX ); m_sprOniGameOver[p].SetY( SCREEN_TOP - m_sprOniGameOver[p].GetZoomedHeight()/2 ); m_sprOniGameOver[p].SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); // 0 alpha so we don't waste time drawing while not visible @@ -170,10 +279,9 @@ ScreenGameplay::ScreenGameplay() this->AddSubActor( &m_OniFade ); - ////////////////////////////////// - // Add all Actors to m_frameTop - ////////////////////////////////// - this->AddSubActor( &m_frameTop ); + m_sprMiddleFrame.Load( THEME->GetPathTo("Graphics","Gameplay Middle Frame") ); + m_sprMiddleFrame.SetXY( MIDDLE_FRAME_X, MIDDLE_FRAME_Y ); + for( p=0; pLoad( (PlayerNumber)p ); - m_pLifeMeter[p]->SetXY( LIFE_LOCAL_X[p], LIFE_LOCAL_Y[p] ); - m_frameTop.AddSubActor( m_pLifeMeter[p] ); + m_pLifeMeter[p]->SetXY( LIFE_X(p), LIFE_Y(p,bExtra) ); + this->AddSubActor( m_pLifeMeter[p] ); + + /* + Chris: EZ2 should change positions via Theme metrics if( GAMESTATE->m_CurGame == GAME_EZ2 ) { @@ -201,51 +312,41 @@ ScreenGameplay::ScreenGameplay() m_pScoreDisplay[p]->SetDiffuseColor( PlayerToColor(p) ); m_frameTop.AddSubActor( m_pScoreDisplay[p] ); } + */ } // TopFrame goes above LifeMeter - m_sprTopFrame.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_TOP_FRAME) ); - m_frameTop.AddSubActor( &m_sprTopFrame ); + m_sprTopFrame.Load( THEME->GetPathTo("Graphics",bExtra?"gameplay extra top frame":"gameplay top frame") ); + m_sprTopFrame.SetXY( TOP_FRAME_X, bExtra ? TOP_FRAME_EXTRA_Y : TOP_FRAME_Y ); + this->AddSubActor( &m_sprTopFrame ); - m_frameTop.SetXY( CENTER_X, SCREEN_TOP + m_sprTopFrame.GetZoomedHeight()/2 ); - m_textStageNumber.Load( THEME->GetPathTo(FONT_HEADER2) ); + m_textStageNumber.LoadFromFont( THEME->GetPathTo("Fonts","Header2") ); m_textStageNumber.TurnShadowOff(); - m_textStageNumber.SetXY( STAGE_NUMBER_LOCAL_X, STAGE_NUMBER_LOCAL_Y ); + m_textStageNumber.SetXY( STAGE_X, bExtra ? STAGE_EXTRA_Y : STAGE_Y ); m_textStageNumber.SetText( GAMESTATE->GetStageText() ); m_textStageNumber.SetDiffuseColor( GAMESTATE->GetStageColor() ); for( p=0; pGetPathTo(FONT_HEADER2) ); + m_textCourseSongNumber[p].LoadFromFont( THEME->GetPathTo("Fonts","Header2") ); m_textCourseSongNumber[p].TurnShadowOff(); - m_textCourseSongNumber[p].SetXY( SONG_NUMBER_LOCAL_X[p], SONG_NUMBER_LOCAL_Y[p] ); + m_textCourseSongNumber[p].SetXY( SONG_NUMBER_X(p), SONG_NUMBER_Y(p,bExtra) ); m_textCourseSongNumber[p].SetText( "" ); m_textCourseSongNumber[p].SetDiffuseColor( D3DXCOLOR(0.8f,0.8f,1,1) ); // light blue } - if( GAMESTATE->m_CurGame == GAME_EZ2 ) - { - m_textStageNumber.SetXY( STAGE_NUMBER_LOCAL_X, STAGE_NUMBER_LOCALEZ2_Y ); - } - else - { - m_textStageNumber.SetXY( STAGE_NUMBER_LOCAL_X, STAGE_NUMBER_LOCAL_Y ); - } - m_textStageNumber.SetText( GAMESTATE->GetStageText() ); - m_textStageNumber.SetDiffuseColor( GAMESTATE->GetStageColor() ); - switch( GAMESTATE->m_PlayMode ) { case PLAY_MODE_ARCADE: - m_frameTop.AddSubActor( &m_textStageNumber ); + this->AddSubActor( &m_textStageNumber ); break; case PLAY_MODE_ONI: case PLAY_MODE_ENDLESS: for( p=0; pIsPlayerEnabled(p) ) - m_frameTop.AddSubActor( &m_textCourseSongNumber[p] ); + this->AddSubActor( &m_textCourseSongNumber[p] ); break; default: ASSERT(0); // invalid GameMode @@ -255,12 +356,13 @@ ScreenGameplay::ScreenGameplay() ////////////////////////////////// // Add all Actors to m_frameBottom ////////////////////////////////// - this->AddSubActor( &m_frameBottom ); + m_sprBottomFrame.Load( THEME->GetPathTo("Graphics",bExtra?"gameplay extra bottom frame":"gameplay bottom frame") ); + m_sprBottomFrame.SetXY( BOTTOM_FRAME_X, bExtra ? BOTTOM_FRAME_EXTRA_Y : BOTTOM_FRAME_Y ); + this->AddSubActor( &m_sprBottomFrame ); - m_sprBottomFrame.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_BOTTOM_FRAME) ); - m_frameBottom.AddSubActor( &m_sprBottomFrame ); - m_frameBottom.SetXY( CENTER_X, SCREEN_BOTTOM - m_sprBottomFrame.GetZoomedHeight()/2 ); + /* + Chris: Change this position using theme metrics if( GAMESTATE->m_CurGame != GAME_EZ2 ) { @@ -268,13 +370,16 @@ ScreenGameplay::ScreenGameplay() m_frameBottom.AddSubActor( &m_sprBottomFrame ); m_frameBottom.SetXY( CENTER_X, SCREEN_BOTTOM - m_sprBottomFrame.GetZoomedHeight()/2 ); } - + */ for( p=0; pm_CurGame != GAME_EZ2 ) { + */ switch( GAMESTATE->m_PlayMode ) { case PLAY_MODE_ARCADE: @@ -289,36 +394,47 @@ ScreenGameplay::ScreenGameplay() } m_pScoreDisplay[p]->Init( (PlayerNumber)p ); - m_pScoreDisplay[p]->SetXY( SCORE_LOCAL_X[p], SCORE_LOCAL_Y[p] ); + m_pScoreDisplay[p]->SetXY( SCORE_X(p), SCORE_Y(p,bExtra) ); m_pScoreDisplay[p]->SetZoom( 0.8f ); m_pScoreDisplay[p]->SetDiffuseColor( PlayerToColor(p) ); - m_frameBottom.AddSubActor( m_pScoreDisplay[p] ); + this->AddSubActor( m_pScoreDisplay[p] ); + /* } + */ - m_textPlayerOptions[p].Load( THEME->GetPathTo(FONT_NORMAL) ); + m_textPlayerOptions[p].LoadFromFont( THEME->GetPathTo("Fonts","normal") ); if( !GAMESTATE->IsPlayerEnabled(PlayerNumber(p)) ) continue; + /* Chris: EZ2 should control this with theme metrics + if( GAMESTATE->m_CurGame != GAME_EZ2 ) - { - m_pScoreDisplay[p]->SetXY( SCORE_LOCAL_X[p], SCORE_LOCAL_Y[p] ); + { + */ + m_pScoreDisplay[p]->SetXY( SCORE_X(p), SCORE_Y(p,bExtra) ); m_pScoreDisplay[p]->SetZoom( 0.8f ); m_pScoreDisplay[p]->SetDiffuseColor( PlayerToColor(p) ); - m_frameBottom.AddSubActor( m_pScoreDisplay[p] ); + this->AddSubActor( m_pScoreDisplay[p] ); // } - // m_textPlayerOptions[p].Load( THEME->GetPathTo(FONT_NORMAL) ); - + m_textPlayerOptions[p].LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textPlayerOptions[p].TurnShadowOff(); - m_textPlayerOptions[p].SetXY( PLAYER_OPTIONS_LOCAL_X[p], PLAYER_OPTIONS_LOCAL_Y[p] ); + m_textPlayerOptions[p].SetXY( PLAYER_OPTIONS_X(p), PLAYER_OPTIONS_Y(p,bExtra) ); m_textPlayerOptions[p].SetZoom( 0.5f ); m_textPlayerOptions[p].SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); m_textPlayerOptions[p].SetText( GAMESTATE->m_PlayerOptions[p].GetString() ); - m_frameBottom.AddSubActor( &m_textPlayerOptions[p] ); - } + this->AddSubActor( &m_textPlayerOptions[p] ); + //} } + m_textSongOptions.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); + m_textSongOptions.TurnShadowOff(); + m_textSongOptions.SetXY( SONG_OPTIONS_X, bExtra?SONG_OPTIONS_EXTRA_Y:SONG_OPTIONS_Y ); + m_textSongOptions.SetZoom( 0.5f ); + m_textSongOptions.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); + m_textSongOptions.SetText( GAMESTATE->m_SongOptions.GetString() ); + this->AddSubActor( &m_textSongOptions ); // Get the current StyleDef definition (used below) @@ -353,18 +469,12 @@ ScreenGameplay::ScreenGameplay() } */ // HOW I THINK IT SHOULD BE FIXED: - if( GAMESTATE->m_CurGame != GAME_EZ2 ) - { - float fDifficultyY = DIFFICULTY_Y[p]; - if( GAMESTATE->m_PlayerOptions[p].m_bReverseScroll ) - fDifficultyY = SCREEN_HEIGHT - DIFFICULTY_Y[p] -10; // HACK: move difficulty banner up 10 if reverse - m_DifficultyBanner[p].SetXY( DIFFICULTY_X[p], fDifficultyY ); - this->AddSubActor( &m_DifficultyBanner[p] ); - } + m_DifficultyBanner[p].SetXY( DIFFICULTY_X(p), DIFFICULTY_Y(p,bReverse[p],bExtra) ); + this->AddSubActor( &m_DifficultyBanner[p] ); } - m_textDebug.Load( THEME->GetPathTo(FONT_NORMAL) ); + m_textDebug.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textDebug.SetXY( DEBUG_X, DEBUG_Y ); m_textDebug.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); this->AddSubActor( &m_textDebug ); @@ -374,22 +484,22 @@ ScreenGameplay::ScreenGameplay() m_StarWipe.SetClosed(); this->AddSubActor( &m_StarWipe ); - m_sprReady.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_READY) ); + m_sprReady.Load( THEME->GetPathTo("Graphics","gameplay ready") ); m_sprReady.SetXY( CENTER_X, CENTER_Y ); m_sprReady.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); this->AddSubActor( &m_sprReady ); - m_sprHereWeGo.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_HERE_WE_GO) ); + m_sprHereWeGo.Load( THEME->GetPathTo("Graphics","gameplay here we go") ); m_sprHereWeGo.SetXY( CENTER_X, CENTER_Y ); m_sprHereWeGo.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); this->AddSubActor( &m_sprHereWeGo ); - m_sprCleared.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_CLEARED) ); + m_sprCleared.Load( THEME->GetPathTo("Graphics","gameplay cleared") ); m_sprCleared.SetXY( CENTER_X, CENTER_Y ); m_sprCleared.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); this->AddSubActor( &m_sprCleared ); - m_sprFailed.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_FAILED) ); + m_sprFailed.Load( THEME->GetPathTo("Graphics","gameplay failed") ); m_sprFailed.SetXY( CENTER_X, CENTER_Y ); m_sprFailed.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); this->AddSubActor( &m_sprFailed ); @@ -400,7 +510,7 @@ ScreenGameplay::ScreenGameplay() m_quadDemonstrationBox.StretchTo( CRect(SCREEN_LEFT, int(CENTER_Y-60), SCREEN_RIGHT, int(CENTER_Y+60)) ); this->AddSubActor( &m_quadDemonstrationBox ); - m_sprDemonstration.Load( THEME->GetPathTo(GRAPHIC_GAMEPLAY_DEMONSTRATION) ); + m_sprDemonstration.Load( THEME->GetPathTo("Graphics","gameplay demonstration") ); m_sprDemonstration.SetXY( CENTER_X, CENTER_Y ); m_sprDemonstration.SetEffectBlinking(); this->AddSubActor( &m_sprDemonstration ); @@ -412,7 +522,7 @@ ScreenGameplay::ScreenGameplay() this->AddSubActor( &m_Fade ); - m_textSurviveTime.Load( THEME->GetPathTo(FONT_HEADER1) ); + m_textSurviveTime.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textSurviveTime.TurnShadowOff(); m_textSurviveTime.SetXY( SURVIVE_TIME_X, SURVIVE_TIME_Y ); m_textSurviveTime.SetText( "" ); @@ -423,8 +533,8 @@ ScreenGameplay::ScreenGameplay() if( !GAMESTATE->m_bDemonstration ) // don't load sounds if just playing demonstration { - m_soundFail.Load( THEME->GetPathTo(SOUND_GAMEPLAY_FAILED) ); - m_soundOniDie.Load( THEME->GetPathTo(SOUND_GAMEPLAY_ONI_DIE) ); + m_soundFail.Load( THEME->GetPathTo("Sounds","gameplay failed") ); + m_soundOniDie.Load( THEME->GetPathTo("Sounds","gameplay oni die") ); m_announcerReady.Load( ANNOUNCER->GetPathTo(ANNOUNCER_GAMEPLAY_READY) ); if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) m_announcerHereWeGo.Load( ANNOUNCER->GetPathTo(ANNOUNCER_GAMEPLAY_HERE_WE_GO_EXTRA) ); @@ -449,7 +559,7 @@ ScreenGameplay::ScreenGameplay() m_announcerComboStopped.Load( ANNOUNCER->GetPathTo(ANNOUNCER_GAMEPLAY_COMBO_STOPPED) ); } - m_soundAssistTick.Load( THEME->GetPathTo(SOUND_GAMEPLAY_ASSIST_TICK) ); + m_soundAssistTick.Load( THEME->GetPathTo("Sounds","gameplay assist tick") ); LoadNextSong( true ); @@ -460,7 +570,7 @@ ScreenGameplay::ScreenGameplay() m_StarWipe.SetOpened(); m_DancingState = STATE_DANCING; m_soundMusic.Play(); - this->SendScreenMessage( SM_BeginFadingToTitleMenu, DEMONSTRATION_TIME ); + this->SendScreenMessage( SM_BeginFadingToTitleMenu, DEMONSTRATION_SECONDS ); } else { @@ -724,7 +834,7 @@ void ScreenGameplay::Update( float fDeltaTime ) m_fTimeLeftBeforeDancingComment -= fDeltaTime; if( m_fTimeLeftBeforeDancingComment <= 0 ) { - m_fTimeLeftBeforeDancingComment = TIME_BETWEEN_DANCING_COMMENTS; // reset for the next comment + m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS; // reset for the next comment @@ -815,11 +925,13 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ if( GAMESTATE->m_bDemonstration ) { - if( MenuI.button == MENU_BUTTON_START ) + if( MenuI.button == MENU_BUTTON_START && !m_Fade.IsClosing() ) { m_soundMusic.Stop(); - SOUND->PlayOnceStreamed( THEME->GetPathTo(SOUND_INSERT_COIN) ); - m_Fade.CloseWipingRight( SM_GoToTitleMenu ); + SOUND->PlayOnceStreamed( THEME->GetPathTo("Sounds","insert coin") ); + ::Sleep( 1000 ); // do a little pause, like the arcade does + this->SendScreenMessage( SM_GoToTitleMenu, 0 ); +// m_Fade.CloseWipingRight( SM_GoToTitleMenu ); } return; // don't fall through below } @@ -903,7 +1015,7 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ (DeviceI.device!=DEVICE_KEYBOARD && type==IET_FAST_REPEAT) ) { m_DancingState = STATE_OUTRO; - SOUND->PlayOnceStreamed( THEME->GetPathTo(SOUND_MENU_BACK) ); + SOUND->PlayOnceStreamed( THEME->GetPathTo("Sounds","menu back") ); m_soundMusic.Stop(); this->ClearMessageQueue(); m_Fade.CloseWipingLeft( SM_SaveChangedBeforeGoingBack ); @@ -1095,7 +1207,8 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) } else { - m_StarWipe.CloseWipingRight( SM_ShowCleared ); + m_StarWipe.CloseWipingRight( SM_None ); + this->SendScreenMessage( SM_ShowCleared, 1 ); SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_GAMEPLAY_CLEARED) ); } } @@ -1114,77 +1227,77 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) if( m_fTimeLeftBeforeDancingComment < 12 ) { m_announcer100Combo.PlayRandom(); - m_fTimeLeftBeforeDancingComment = TIME_BETWEEN_DANCING_COMMENTS; + m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS; } break; case SM_200Combo: if( m_fTimeLeftBeforeDancingComment < 12 ) { m_announcer200Combo.PlayRandom(); - m_fTimeLeftBeforeDancingComment = TIME_BETWEEN_DANCING_COMMENTS; + m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS; } break; case SM_300Combo: if( m_fTimeLeftBeforeDancingComment < 12 ) { m_announcer300Combo.PlayRandom(); - m_fTimeLeftBeforeDancingComment = TIME_BETWEEN_DANCING_COMMENTS; + m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS; } break; case SM_400Combo: if( m_fTimeLeftBeforeDancingComment < 12 ) { m_announcer400Combo.PlayRandom(); - m_fTimeLeftBeforeDancingComment = TIME_BETWEEN_DANCING_COMMENTS; + m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS; } break; case SM_500Combo: if( m_fTimeLeftBeforeDancingComment < 12 ) { m_announcer500Combo.PlayRandom(); - m_fTimeLeftBeforeDancingComment = TIME_BETWEEN_DANCING_COMMENTS; + m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS; } break; case SM_600Combo: if( m_fTimeLeftBeforeDancingComment < 12 ) { m_announcer600Combo.PlayRandom(); - m_fTimeLeftBeforeDancingComment = TIME_BETWEEN_DANCING_COMMENTS; + m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS; } break; case SM_700Combo: if( m_fTimeLeftBeforeDancingComment < 12 ) { m_announcer700Combo.PlayRandom(); - m_fTimeLeftBeforeDancingComment = TIME_BETWEEN_DANCING_COMMENTS; + m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS; } break; case SM_800Combo: if( m_fTimeLeftBeforeDancingComment < 12 ) { m_announcer800Combo.PlayRandom(); - m_fTimeLeftBeforeDancingComment = TIME_BETWEEN_DANCING_COMMENTS; + m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS; } break; case SM_900Combo: if( m_fTimeLeftBeforeDancingComment < 12 ) { m_announcer900Combo.PlayRandom(); - m_fTimeLeftBeforeDancingComment = TIME_BETWEEN_DANCING_COMMENTS; + m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS; } break; case SM_1000Combo: if( m_fTimeLeftBeforeDancingComment < 12 ) { m_announcer1000Combo.PlayRandom(); - m_fTimeLeftBeforeDancingComment = TIME_BETWEEN_DANCING_COMMENTS; + m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS; } break; case SM_ComboStopped: if( m_fTimeLeftBeforeDancingComment < 12 ) { m_announcerComboStopped.PlayRandom(); - m_fTimeLeftBeforeDancingComment = TIME_BETWEEN_DANCING_COMMENTS; + m_fTimeLeftBeforeDancingComment = SECONDS_BETWEEN_COMMENTS; } break; @@ -1235,6 +1348,7 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) case SM_BeginFailed: m_DancingState = STATE_OUTRO; m_soundMusic.Pause(); + m_StarWipe.SetTransitionTime( 1.5f ); m_StarWipe.CloseWipingRight( SM_None ); int p; for( p=0; p +#include "RageTextureManager.h" +#include "RageUtil.h" +#include "RageMusic.h" +#include "ScreenManager.h" +#include "PrefsManager.h" +#include "ScreenOptions.h" +#include "ScreenTitleMenu.h" +#include "GameConstantsAndTypes.h" +#include "StepMania.h" +#include "PrefsManager.h" +#include "RageLog.h" + + + +enum { + GO_WINDOWED = 0, + GO_DISPLAY_RESOLUTION, + GO_TEXTURE_RESOLUTION, + GO_REFRESH_RATE, + GO_SHOWFPS, + GO_BGMODE, + GO_BGBRIGHTNESS, + NUM_GRAPHIC_OPTIONS_LINES +}; +OptionLineData g_GraphicOptionsLines[NUM_GRAPHIC_OPTIONS_LINES] = { + { "Display", 2, {"FULLSCREEN", "WINDOWED"} }, + { "Display Res", 7, {"320","400","512","640","800","1024","1280"} }, + { "Texture Res", 3, {"256","512","1024"} }, + { "Refresh Rate", 10, {"DEFAULT","60","70","72","75","80","85","90","100","120"} }, + { "Show FPS", 2, {"OFF","ON"} }, + { "BG Mode", 4, {"OFF","ANIMATIONS","VISUALIZATIONS","RANDOM MOVIES"} }, + { "BG Brightness", 5, {"20%","40%","60%","80%","100%"} }, +}; + +ScreenGraphicOptions::ScreenGraphicOptions() : + ScreenOptions( + THEME->GetPathTo("Graphics","graphic options background"), + THEME->GetPathTo("Graphics","graphic options page"), + THEME->GetPathTo("Graphics","graphic options top edge") + ) +{ + LOG->Trace( "ScreenGraphicOptions::ScreenGraphicOptions()" ); + + Init( + INPUTMODE_BOTH, + g_GraphicOptionsLines, + NUM_GRAPHIC_OPTIONS_LINES + ); + m_Menu.StopTimer(); +} + +void ScreenGraphicOptions::ImportOptions() +{ + m_iSelectedOption[0][GO_WINDOWED] = PREFSMAN->m_bWindowed ? 1:0; + + switch( PREFSMAN->m_iDisplayResolution ) + { + case 320: m_iSelectedOption[0][GO_DISPLAY_RESOLUTION] = 0; break; + case 400: m_iSelectedOption[0][GO_DISPLAY_RESOLUTION] = 1; break; + case 512: m_iSelectedOption[0][GO_DISPLAY_RESOLUTION] = 2; break; + case 640: m_iSelectedOption[0][GO_DISPLAY_RESOLUTION] = 3; break; + case 800: m_iSelectedOption[0][GO_DISPLAY_RESOLUTION] = 4; break; + case 1024: m_iSelectedOption[0][GO_DISPLAY_RESOLUTION] = 5; break; + case 1280: m_iSelectedOption[0][GO_DISPLAY_RESOLUTION] = 6; break; + default: m_iSelectedOption[0][GO_DISPLAY_RESOLUTION] = 3; break; + } + + switch( PREFSMAN->m_iTextureResolution ) + { + case 256: m_iSelectedOption[0][GO_TEXTURE_RESOLUTION] = 0; break; + case 512: m_iSelectedOption[0][GO_TEXTURE_RESOLUTION] = 1; break; + case 1024: m_iSelectedOption[0][GO_TEXTURE_RESOLUTION] = 2; break; + default: m_iSelectedOption[0][GO_TEXTURE_RESOLUTION] = 1; break; + } + + switch( PREFSMAN->m_iRefreshRate ) + { + case 0: m_iSelectedOption[0][GO_REFRESH_RATE] = 0; break; + case 60: m_iSelectedOption[0][GO_REFRESH_RATE] = 1; break; + case 70: m_iSelectedOption[0][GO_REFRESH_RATE] = 2; break; + case 72: m_iSelectedOption[0][GO_REFRESH_RATE] = 3; break; + case 75: m_iSelectedOption[0][GO_REFRESH_RATE] = 4; break; + case 80: m_iSelectedOption[0][GO_REFRESH_RATE] = 5; break; + case 85: m_iSelectedOption[0][GO_REFRESH_RATE] = 6; break; + case 90: m_iSelectedOption[0][GO_REFRESH_RATE] = 7; break; + case 100: m_iSelectedOption[0][GO_REFRESH_RATE] = 8; break; + case 120: m_iSelectedOption[0][GO_REFRESH_RATE] = 9; break; + default: m_iSelectedOption[0][GO_REFRESH_RATE] = 0; break; + } + + m_iSelectedOption[0][GO_SHOWFPS] = PREFSMAN->m_bShowFPS ? 1:0; + m_iSelectedOption[0][GO_BGMODE] = PREFSMAN->m_BackgroundMode; + + if( PREFSMAN->m_fBGBrightness == 0.2f ) m_iSelectedOption[0][GO_BGBRIGHTNESS] = 0; + else if( PREFSMAN->m_fBGBrightness == 0.4f ) m_iSelectedOption[0][GO_BGBRIGHTNESS] = 1; + else if( PREFSMAN->m_fBGBrightness == 0.6f ) m_iSelectedOption[0][GO_BGBRIGHTNESS] = 2; + else if( PREFSMAN->m_fBGBrightness == 0.8f ) m_iSelectedOption[0][GO_BGBRIGHTNESS] = 3; + else if( PREFSMAN->m_fBGBrightness == 1.0f ) m_iSelectedOption[0][GO_BGBRIGHTNESS] = 4; + else m_iSelectedOption[0][GO_BGBRIGHTNESS] = 2; +} + +void ScreenGraphicOptions::ExportOptions() +{ + PREFSMAN->m_bWindowed = m_iSelectedOption[0][GO_WINDOWED] == 1; + + switch( m_iSelectedOption[0][GO_DISPLAY_RESOLUTION] ) + { + case 0: PREFSMAN->m_iDisplayResolution = 320; break; + case 1: PREFSMAN->m_iDisplayResolution = 400; break; + case 2: PREFSMAN->m_iDisplayResolution = 512; break; + case 3: PREFSMAN->m_iDisplayResolution = 640; break; + case 4: PREFSMAN->m_iDisplayResolution = 800; break; + case 5: PREFSMAN->m_iDisplayResolution = 1024; break; + case 6: PREFSMAN->m_iDisplayResolution = 1280; break; + default: ASSERT(0); PREFSMAN->m_iDisplayResolution = 640; break; + } + + switch( m_iSelectedOption[0][GO_TEXTURE_RESOLUTION] ) + { + case 0: PREFSMAN->m_iTextureResolution = 256; break; + case 1: PREFSMAN->m_iTextureResolution = 512; break; + case 2: PREFSMAN->m_iTextureResolution = 1024; break; + default: ASSERT(0); PREFSMAN->m_iTextureResolution = 512; break; + } + + switch( m_iSelectedOption[0][GO_REFRESH_RATE] ) + { + case 0: PREFSMAN->m_iRefreshRate = 0; break; + case 1: PREFSMAN->m_iRefreshRate = 60; break; + case 2: PREFSMAN->m_iRefreshRate = 70; break; + case 3: PREFSMAN->m_iRefreshRate = 72; break; + case 4: PREFSMAN->m_iRefreshRate = 75; break; + case 5: PREFSMAN->m_iRefreshRate = 80; break; + case 6: PREFSMAN->m_iRefreshRate = 85; break; + case 7: PREFSMAN->m_iRefreshRate = 90; break; + case 8: PREFSMAN->m_iRefreshRate = 100; break; + case 9: PREFSMAN->m_iRefreshRate = 120; break; + default: ASSERT(0); PREFSMAN->m_iRefreshRate = 0; break; + } + + PREFSMAN->m_bShowFPS = m_iSelectedOption[0][GO_SHOWFPS] == 1; + PREFSMAN->m_BackgroundMode = PrefsManager::BackgroundMode( m_iSelectedOption[0][GO_BGMODE] ); + + switch( m_iSelectedOption[0][GO_BGBRIGHTNESS] ) + { + case 0: PREFSMAN->m_fBGBrightness = 0.2f; break; + case 1: PREFSMAN->m_fBGBrightness = 0.4f; break; + case 2: PREFSMAN->m_fBGBrightness = 0.6f; break; + case 3: PREFSMAN->m_fBGBrightness = 0.8f; break; + case 4: PREFSMAN->m_fBGBrightness = 1.0f; break; + default: ASSERT(0); + } +} + +void ScreenGraphicOptions::GoToPrevState() +{ + SCREENMAN->SetNewScreen( new ScreenTitleMenu ); + PREFSMAN->SaveGlobalPrefsToDisk(); + ApplyGraphicOptions(); +} + +void ScreenGraphicOptions::GoToNextState() +{ + GoToPrevState(); +} + diff --git a/stepmania/src/ScreenGraphicOptions.h b/stepmania/src/ScreenGraphicOptions.h new file mode 100644 index 0000000000..740047a7c8 --- /dev/null +++ b/stepmania/src/ScreenGraphicOptions.h @@ -0,0 +1,32 @@ +/* +----------------------------------------------------------------------------- + Class: ScreenGraphicOptions + + Desc: Change video-related options. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + +#include "Screen.h" +#include "ScreenOptions.h" +#include "Sprite.h" +#include "BitmapText.h" +#include "RandomSample.h" +#include "TransitionFade.h" +#include "Quad.h" + + +class ScreenGraphicOptions : public ScreenOptions +{ +public: + ScreenGraphicOptions(); + +private: + void ImportOptions(); + void ExportOptions(); + + void GoToNextState(); + void GoToPrevState(); +}; diff --git a/stepmania/src/ScreenManager.cpp b/stepmania/src/ScreenManager.cpp index ccaa66c59e..1df429c8f2 100644 --- a/stepmania/src/ScreenManager.cpp +++ b/stepmania/src/ScreenManager.cpp @@ -1,11 +1,12 @@ #include "stdafx.h" /* ----------------------------------------------------------------------------- - File: ScreenManager.h + Class: ScreenManager - Desc: Manages the game windows. + Desc: See header. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford ----------------------------------------------------------------------------- */ @@ -14,21 +15,54 @@ #include "GameConstantsAndTypes.h" #include "PrefsManager.h" #include "RageLog.h" +#include "GameState.h" ScreenManager* SCREENMAN = NULL; // global and accessable from anywhere in our program +#define FPS_X THEME->GetMetricF("Other","FPSX") +#define FPS_Y THEME->GetMetricF("Other","FPSY") +#define CREDITS_P1_X THEME->GetMetricF("Other","CreditsP1X") +#define CREDITS_P1_Y THEME->GetMetricF("Other","CreditsP1Y") +#define CREDITS_P2_X THEME->GetMetricF("Other","CreditsP2X") +#define CREDITS_P2_Y THEME->GetMetricF("Other","CreditsP2Y") + +float CREDITS_X( int p ) { + switch( p ) { + case PLAYER_1: return CREDITS_P1_X; + case PLAYER_2: return CREDITS_P2_X; + default: ASSERT(0); return 0; + } +} +float CREDITS_Y( int p ) { + switch( p ) { + case PLAYER_1: return CREDITS_P1_Y; + case PLAYER_2: return CREDITS_P2_Y; + default: ASSERT(0); return 0; + } +} + + ScreenManager::ScreenManager() { - m_textFPS.Load( THEME->GetPathTo(FONT_NORMAL) ); - m_textFPS.SetXY( SCREEN_WIDTH-35, 15 ); + m_textFPS.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); + m_textFPS.SetXY( FPS_X, FPS_Y ); m_textFPS.SetZ( -2 ); m_textFPS.SetZoom( 0.5f ); m_textFPS.SetShadowLength( 2 ); - m_textSystemMessage.Load( THEME->GetPathTo(FONT_NORMAL) ); + for( int p=0; pGetPathTo("Fonts","normal") ); + m_textCreditInfo[p].SetXY( CREDITS_X(p), CREDITS_Y(p) ); + m_textCreditInfo[p].SetZoom( 0.5f ); + m_textCreditInfo[p].SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); + m_textCreditInfo[p].SetShadowLength( 2 ); + } + + m_textSystemMessage.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textSystemMessage.SetHorizAlign( Actor::align_left ); m_textSystemMessage.SetVertAlign( Actor::align_bottom ); m_textSystemMessage.SetXY( 5.0f, 10.0f ); @@ -55,6 +89,8 @@ void ScreenManager::Update( float fDeltaTime ) { m_textSystemMessage.Update( fDeltaTime ); m_textFPS.Update( fDeltaTime ); + for( int p=0; pGetFPS()) ); m_textFPS.Draw(); } + for( int p=0; pTrace( "WARNING: Didn't find an empty system messages slot." ); } +/* +void ScreenManager::OverrideCreditsMessage( PlayerNumber p, CString sNewString ) +{ + m_textCreditInfo[p].SetText( sNewString ); +} +*/ +void ScreenManager::RefreshCreditsMessages() +{ + // update joined + for( int p=0; pm_bIsJoined[p] ) m_textCreditInfo[p].SetText( "" ); + else if( GAMESTATE->m_bPlayersCanJoin ) m_textCreditInfo[p].SetText( "PRESS START" ); + else m_textCreditInfo[p].SetText( "CREDIT(s) 0 / 0" ); + } +} \ No newline at end of file diff --git a/stepmania/src/ScreenManager.h b/stepmania/src/ScreenManager.h index 35018c3b7b..d991a98792 100644 --- a/stepmania/src/ScreenManager.h +++ b/stepmania/src/ScreenManager.h @@ -3,7 +3,7 @@ ----------------------------------------------------------------------------- Class: ScreenManager - Desc: Manages the game windows. + Desc: Manager/container for Screens. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. Chris Danford @@ -40,6 +40,8 @@ public: void SendMessageToTopScreen( ScreenMessage SM, float fDelay ); +// void OverrideCreditsMessage( PlayerNumber p, CString sNewString ); + void RefreshCreditsMessages(); private: CArray m_ScreenStack; @@ -47,6 +49,7 @@ private: BitmapText m_textFPS; BitmapText m_textSystemMessage; + BitmapText m_textCreditInfo[NUM_PLAYERS]; }; diff --git a/stepmania/src/ScreenMusicScroll.cpp b/stepmania/src/ScreenMusicScroll.cpp index a527cb6004..81701dcbb4 100644 --- a/stepmania/src/ScreenMusicScroll.cpp +++ b/stepmania/src/ScreenMusicScroll.cpp @@ -62,8 +62,8 @@ const CString CREDIT_LINES[] = "PROGRAMMING:", "Chris Danford", "Lord Frieza (Andrew Livy)", - "Dro Kulix (Peter S. May)", "Bruno Figueiredo", + "Dro Kulix (Peter S. May)", "Mantis (Ben Nordstrom)", "Parasyte (Chris Gomez)", "dirkthedaring (Michael Patterson)", @@ -99,14 +99,16 @@ const CString CREDIT_LINES[] = "Mark 'Foobly' Verrey", "Mandarin Blue", "Anne Kiel", - "BeMaNiFiNiNaTiC (Jeremy)", + "BeMaNiFiNiNaTiC (Jeremy Hine)", "Garett Sakamoto", + "SailorBob", + "AngelTK {Kenny Lai}", + "Gotetsu", "Illusionz - Issaquah, WA", "Quarters - Kirkland, WA", "Segapark - Bournemouth, UK", "Pier Amusements - Bournemouth, UK", "Westcliff Amusements - Bournemouth, UK", - "SailorBob", "Naoki", "Konami Computer Entertainment Japan", "", @@ -128,7 +130,7 @@ ScreenMusicScroll::ScreenMusicScroll() int i; - m_sprBackground.Load( THEME->GetPathTo(GRAPHIC_MUSIC_SCROLL_BACKGROUND) ); + m_sprBackground.Load( THEME->GetPathTo("Graphics","music scroll background") ); m_sprBackground.StretchTo( CRect(SCREEN_LEFT,SCREEN_TOP,SCREEN_RIGHT,SCREEN_BOTTOM) ); this->AddSubActor( &m_sprBackground ); @@ -142,7 +144,7 @@ ScreenMusicScroll::ScreenMusicScroll() for( i=0; iGetPathTo(FONT_NORMAL) ); + m_textLines[m_iNumLines].LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textLines[m_iNumLines].SetText( pSong->GetFullTitle() ); m_textLines[m_iNumLines].SetDiffuseColor( SONGMAN->GetGroupColor(pSong->m_sGroupName) ); @@ -151,7 +153,7 @@ ScreenMusicScroll::ScreenMusicScroll() for( i=0; iGetPathTo(FONT_NORMAL) ); + m_textLines[m_iNumLines].LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textLines[m_iNumLines].SetText( CREDIT_LINES[i] ); // this->AddSubActor( &m_textLines[m_iNumLines] ); @@ -171,24 +173,12 @@ ScreenMusicScroll::ScreenMusicScroll() this->AddSubActor( &m_Fade ); - if ( GAMESTATE->m_CurGame != GAME_EZ2 ) - { - m_soundMusic.Load( THEME->GetPathTo(SOUND_MUSIC_SCROLL_MUSIC) ); - } - else - { - m_soundMusic.Load( THEME->GetPathTo(SOUND_MENU_PROMPT) ); // yes, yes, hack hack hack. What can I do huh? re-write thememanager? hahaha. - } + m_soundMusic.Load( THEME->GetPathTo("Sounds","music scroll music") ); + m_soundMusic.Play( true ); + + SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_MUSIC_SCROLL) ); m_Fade.OpenWipingRight(); - if ( GAMESTATE->m_CurGame != GAME_EZ2 ) - { - m_soundMusic.Play( true ); - } - else - { - m_soundMusic.Play( false ); - } } diff --git a/stepmania/src/ScreenOptions.cpp b/stepmania/src/ScreenOptions.cpp index 8c1de27326..1f515df01c 100644 --- a/stepmania/src/ScreenOptions.cpp +++ b/stepmania/src/ScreenOptions.cpp @@ -21,6 +21,7 @@ #include "PrefsManager.h" #include "GameConstantsAndTypes.h" #include "RageLog.h" +#include "GameState.h" @@ -39,13 +40,13 @@ const ScreenMessage SM_GoToPrevState = ScreenMessage(SM_User-5); const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User-6); -ScreenOptions::ScreenOptions( CString sBackgroundPath, CString sTopEdgePath ) +ScreenOptions::ScreenOptions( CString sBackgroundPath, CString sPagePath, CString sTopEdgePath ) { LOG->Trace( "ScreenOptions::ScreenOptions()" ); - m_SoundChangeCol.Load( THEME->GetPathTo(SOUND_OPTION_CHANGE_COL) ); - m_SoundChangeRow.Load( THEME->GetPathTo(SOUND_OPTION_CHANGE_ROW) ); - m_SoundNext.Load( THEME->GetPathTo(SOUND_MENU_START) ); + m_SoundChangeCol.Load( THEME->GetPathTo("Sounds","option change col") ); + m_SoundChangeRow.Load( THEME->GetPathTo("Sounds","option change row") ); + m_SoundNext.Load( THEME->GetPathTo("Sounds","menu start") ); m_Menu.Load( sBackgroundPath, @@ -54,40 +55,30 @@ ScreenOptions::ScreenOptions( CString sBackgroundPath, CString sTopEdgePath ) false, true, 40 ); this->AddSubActor( &m_Menu ); - m_Menu.TweenOnScreenFromBlack( SM_None ); - // init row numbers and element colors + // add everything to m_framePage so we can animate everything at once + this->AddSubActor( &m_framePage ); + + m_sprPage.Load( sPagePath ); + m_sprPage.SetXY( CENTER_X, CENTER_Y ); + m_framePage.AddSubActor( &m_sprPage ); + + for( int p=0; pAddSubActor( &m_SelectionHighlight[p] ); for( int l=0; lAddSubActor( &m_OptionUnderline[p][l] ); - } } - // add sub actors - for( int i=0; iAddSubActor( &m_textOptionLineTitles[i] ); - - for( int j=0; jAddSubActor( &m_textOptions[i][j] ); // this array has to be big enough to hold all of the options - } - } - - + m_Menu.TweenOnScreenFromBlack( SM_None ); m_Wipe.OpenWipingRight(SM_None); this->AddSubActor( &m_Wipe ); + + m_framePage.SetX( SCREEN_LEFT-SCREEN_WIDTH ); + m_framePage.BeginTweening( 0.3f, Actor::TWEEN_BIAS_BEGIN ); + m_framePage.SetTweenX( 0 ); } void ScreenOptions::Init( InputMode im, OptionLineData optionLineData[], int iNumOptionLines ) @@ -101,6 +92,43 @@ void ScreenOptions::Init( InputMode im, OptionLineData optionLineData[], int iNu this->ImportOptions(); + if( m_InputMode == INPUTMODE_BOTH ) + { + for( int l=0; lIsPlayerEnabled(p) ) + continue; // skip + + for( int l=0; lGetPathTo(FONT_HEADER2) ); + title.LoadFromFont( THEME->GetPathTo("Fonts","Header2") ); title.SetText( optline.szTitle ); title.SetXY( LABELS_X, fY ); title.SetZoom( 0.7f ); title.SetVertAlign( Actor::align_middle ); - this->AddSubActor( &title ); + m_framePage.AddSubActor( &title ); // init all text in this line and count the width of the line float fX = ITEMS_START_X; // indent 70 pixels @@ -157,12 +177,12 @@ void ScreenOptions::InitOptionsText() { BitmapText &option = m_textOptions[i][j]; - option.Load( THEME->GetPathTo(FONT_NORMAL) ); + option.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); option.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); option.SetText( optline.szOptionsText[j] ); option.SetZoom( 0.5f ); option.SetShadowLength( 2 ); - this->AddSubActor( &option ); + m_framePage.AddSubActor( &option ); // set the XY position of each item in the line float fItemWidth = option.GetWidestLineWidthInSourcePixels() * option.GetZoomX(); @@ -171,19 +191,6 @@ void ScreenOptions::InitOptionsText() fX += fItemWidth/2 + ITEM_GAP_X; } } - - for( int p=0; p PLAYER_1 && m_InputMode != INPUTMODE_2PLAYERS ) - continue; // skip - - Quad &highlight = m_SelectionHighlight[p]; - - for( int i=0; i PLAYER_1 && m_InputMode != INPUTMODE_2PLAYERS ) - continue; // skip - for( int i=0; i PLAYER_1 && m_InputMode != INPUTMODE_2PLAYERS ) - continue; // skip - int i=m_iCurrentRow[p]; - Quad &highlight = m_SelectionHighlight[p]; + OptionsCursor &highlight = m_Highlight[p]; - float fWidth, fX, fY; - GetWidthXY( (PlayerNumber)p, i, fWidth, fX, fY ); - float fHeight = HIGHLIGHT_HEIGHT; - - highlight.SetZoomX( fWidth ); - highlight.SetZoomY( fHeight ); - highlight.SetXY( fX, fY ); + int iWidth, iX, iY; + GetWidthXY( (PlayerNumber)p, i, iWidth, iX, iY ); + highlight.SetBarWidth( iWidth ); + highlight.SetXY( (float)iX, (float)iY ); } } @@ -239,16 +234,13 @@ void ScreenOptions::TweenHighlight( PlayerNumber player_no ) // Set the position of the highlight showing the current option the user is changing. int iCurRow = m_iCurrentRow[player_no]; - Quad &highlight = m_SelectionHighlight[player_no]; - - float fWidth, fX, fY; - GetWidthXY( player_no, iCurRow, fWidth, fX, fY ); - float fHeight = HIGHLIGHT_HEIGHT; + OptionsCursor &highlight = m_Highlight[player_no]; + int iWidth, iX, iY; + GetWidthXY( player_no, iCurRow, iWidth, iX, iY ); highlight.BeginTweening( 0.2f ); - highlight.SetTweenZoomX( fWidth ); - highlight.SetTweenZoomY( fHeight ); - highlight.SetTweenXY( fX, fY ); + highlight.TweenBarWidth( iWidth ); + highlight.SetTweenXY( (float)iX, (float)iY ); } void ScreenOptions::Update( float fDeltaTime ) @@ -317,109 +309,82 @@ void ScreenOptions::MenuStart( const PlayerNumber p ) m_SoundNext.PlayRandom(); m_Wipe.CloseWipingRight( SM_GoToNextState ); + + m_framePage.BeginTweening( 0.3f, Actor::TWEEN_BIAS_END ); + m_framePage.SetTweenX( SCREEN_RIGHT ); } -void ScreenOptions::MenuLeft( const PlayerNumber p ) +void ScreenOptions::MenuLeft( const PlayerNumber pn ) { - PlayerNumber pn = p; - - switch( m_InputMode ) + for( int p=0; pGetPathTo(GRAPHIC_PLAYER_OPTIONS_BACKGROUND), - THEME->GetPathTo(GRAPHIC_PLAYER_OPTIONS_TOP_EDGE) + THEME->GetPathTo("Graphics","player options background"), + THEME->GetPathTo("Graphics","player options page"), + THEME->GetPathTo("Graphics","player options top edge") ) { LOG->Trace( "ScreenPlayerOptions::ScreenPlayerOptions()" ); Init( - INPUTMODE_2PLAYERS, + INPUTMODE_PLAYERS, g_PlayerOptionsLines, NUM_PLAYER_OPTIONS_LINES ); diff --git a/stepmania/src/ScreenPrompt.cpp b/stepmania/src/ScreenPrompt.cpp index a07775ab06..65efcc2e6c 100644 --- a/stepmania/src/ScreenPrompt.cpp +++ b/stepmania/src/ScreenPrompt.cpp @@ -41,7 +41,7 @@ ScreenPrompt::ScreenPrompt( ScreenMessage SM_SendWhenDone, CString sText, Prompt m_Fade.CloseWipingRight(); this->AddSubActor( &m_Fade ); - m_textQuestion.Load( THEME->GetPathTo(FONT_NORMAL) ); + m_textQuestion.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textQuestion.SetText( sText ); m_textQuestion.SetXY( QUESTION_X, QUESTION_Y ); this->AddSubActor( &m_textQuestion ); @@ -49,8 +49,8 @@ ScreenPrompt::ScreenPrompt( ScreenMessage SM_SendWhenDone, CString sText, Prompt m_rectAnswerBox.SetDiffuseColor( D3DXCOLOR(0.5f,0.5f,1.0f,0.7f) ); this->AddSubActor( &m_rectAnswerBox ); - m_textAnswer[0].Load( THEME->GetPathTo(FONT_HEADER1) ); - m_textAnswer[1].Load( THEME->GetPathTo(FONT_HEADER1) ); + m_textAnswer[0].LoadFromFont( THEME->GetPathTo("Fonts","header1") ); + m_textAnswer[1].LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textAnswer[0].SetY( PROMPT_Y ); m_textAnswer[1].SetY( PROMPT_Y ); this->AddSubActor( &m_textAnswer[0] ); @@ -77,6 +77,8 @@ ScreenPrompt::ScreenPrompt( ScreenMessage SM_SendWhenDone, CString sText, Prompt m_rectAnswerBox.SetZoomY( 30 ); m_textAnswer[m_bAnswer].SetEffectGlowing(); + + SOUND->PlayOnceStreamed( THEME->GetPathTo("Sounds","menu prompt") ); } void ScreenPrompt::Update( float fDeltaTime ) @@ -134,7 +136,7 @@ void ScreenPrompt::MenuRight( const PlayerNumber p ) m_rectAnswerBox.SetTweenXY( m_textAnswer[m_bAnswer].GetX(), m_textAnswer[m_bAnswer].GetY() ); m_rectAnswerBox.SetTweenZoomX( m_textAnswer[m_bAnswer].GetWidestLineWidthInSourcePixels()+10.0f ); - SOUND->PlayOnceStreamed( THEME->GetPathTo(SOUND_EDIT_CHANGE_LINE) ); + SOUND->PlayOnceStreamed( THEME->GetPathTo("Sounds","edit change line") ); } void ScreenPrompt::MenuStart( const PlayerNumber p ) @@ -154,7 +156,7 @@ void ScreenPrompt::MenuStart( const PlayerNumber p ) m_textAnswer[1].BeginTweening( 0.2f ); m_textAnswer[1].SetTweenDiffuseColor( D3DXCOLOR(1,1,1,0) ); - SOUND->PlayOnceStreamed( THEME->GetPathTo(SOUND_MENU_START) ); + SOUND->PlayOnceStreamed( THEME->GetPathTo("Sounds","menu start") ); if( m_bAnswer ) m_pOnYes(); diff --git a/stepmania/src/ScreenSandbox.cpp b/stepmania/src/ScreenSandbox.cpp index 2c121f2703..651313d2a0 100644 --- a/stepmania/src/ScreenSandbox.cpp +++ b/stepmania/src/ScreenSandbox.cpp @@ -22,26 +22,18 @@ ScreenSandbox::ScreenSandbox() { -// m_text.Load( THEME->GetPathTo(FONT_NORMAL) ); - m_text.SetXY( CENTER_X, CENTER_Y ); - CStringArray as; - as.Add( "Testing... Attention please." ); - m_text.SetTips( as ); - m_text.SetXY( CENTER_X, CENTER_Y ); - this->AddSubActor( &m_text ); + m_spr.Load( THEME->GetPathTo("Graphics","title menu logo game 0") ); + m_spr.SetXY( CENTER_X, CENTER_Y ); + this->AddSubActor( &m_spr ); - m_Menu.Load( - THEME->GetPathTo(GRAPHIC_SELECT_STYLE_BACKGROUND), - THEME->GetPathTo(GRAPHIC_SELECT_STYLE_TOP_EDGE), - ssprintf("Use %c %c to select, then press START", char(1), char(2) ), - false, true, 40 - ); - this->AddSubActor( &m_Menu ); - m_Menu.TweenOnScreenFromBlack( SM_None ); - - m_sound.Load( THEME->GetPathTo(SOUND_MENU_MUSIC) ); - m_sound.SetPositionSeconds( -10 ); - m_sound.Play(); +// m_Menu.Load( +// THEME->GetPathTo(GRAPHIC_SELECT_STYLE_BACKGROUND), +// THEME->GetPathTo(GRAPHIC_SELECT_STYLE_TOP_EDGE), +// ssprintf("Use %c %c to select, then press START", char(1), char(2) ), +// false, true, 40 +// ); +// this->AddSubActor( &m_Menu ); +// m_Menu.TweenOnScreenFromBlack( SM_None ); //this->AddSubActor( &m_spr ); } @@ -50,14 +42,11 @@ ScreenSandbox::ScreenSandbox() void ScreenSandbox::Update( float fDeltaTime ) { Screen::Update( fDeltaTime ); - m_sound.Update( fDeltaTime ); } void ScreenSandbox::DrawPrimitives() { - m_Menu.DrawBottomLayer(); Screen::DrawPrimitives(); - m_Menu.DrawTopLayer(); } void ScreenSandbox::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ) diff --git a/stepmania/src/ScreenSandbox.h b/stepmania/src/ScreenSandbox.h index 9b6b22110a..20920beebe 100644 --- a/stepmania/src/ScreenSandbox.h +++ b/stepmania/src/ScreenSandbox.h @@ -30,8 +30,6 @@ public: virtual void Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ); virtual void HandleScreenMessage( const ScreenMessage SM ); - TipDisplay m_text; - MenuElements m_Menu; - RageSoundStream m_sound; + Sprite m_spr; }; diff --git a/stepmania/src/ScreenSelectCourse.cpp b/stepmania/src/ScreenSelectCourse.cpp index c85d80de78..d73aa427fa 100644 --- a/stepmania/src/ScreenSelectCourse.cpp +++ b/stepmania/src/ScreenSelectCourse.cpp @@ -55,18 +55,18 @@ ScreenSelectCourse::ScreenSelectCourse() { LOG->Trace( "ScreenSelectCourse::ScreenSelectCourse()" ); - if( !MUSIC->IsPlaying() ) + if( !MUSIC->IsPlaying() || MUSIC->GetLoadedFilePath() != THEME->GetPathTo("Sounds","select course music") ) { - MUSIC->Load( THEME->GetPathTo(SOUND_MENU_MUSIC) ); - MUSIC->Play(true); + MUSIC->Load( THEME->GetPathTo("Sounds","select course music") ); + MUSIC->Play( true ); } m_bMadeChoice = false; m_bGoToOptions = false; m_Menu.Load( - THEME->GetPathTo(GRAPHIC_SELECT_COURSE_BACKGROUND), - THEME->GetPathTo(GRAPHIC_SELECT_COURSE_TOP_EDGE), + THEME->GetPathTo("Graphics","select course background"), + THEME->GetPathTo("Graphics","select course top edge"), ssprintf("%c or %c change course then press START", char(1), char(2)), false, true, 60 ); @@ -81,7 +81,7 @@ ScreenSelectCourse::ScreenSelectCourse() m_MusicWheel.SetXY( WHEEL_X, WHEEL_Y ); this->AddSubActor( &m_MusicWheel ); - m_textHoldForOptions.Load( THEME->GetPathTo(FONT_STAGE) ); + m_textHoldForOptions.LoadFromFont( THEME->GetPathTo("Fonts","Stage") ); m_textHoldForOptions.SetXY( CENTER_X, CENTER_Y ); m_textHoldForOptions.SetText( "press START again for options" ); m_textHoldForOptions.SetZoom( 1 ); @@ -90,8 +90,8 @@ ScreenSelectCourse::ScreenSelectCourse() this->AddSubActor( &m_textHoldForOptions ); - m_soundSelect.Load( THEME->GetPathTo(SOUND_MENU_START) ); - m_soundChangeNotes.Load( THEME->GetPathTo(SOUND_SELECT_MUSIC_CHANGE_NOTES) ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); + m_soundChangeNotes.Load( THEME->GetPathTo("Sounds","select music change notes") ); SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_COURSE_INTRO) ); @@ -154,7 +154,7 @@ void ScreenSelectCourse::Input( const DeviceInput& DeviceI, const InputEventType { m_bGoToOptions = true; m_textHoldForOptions.SetText( "Entering Options..." ); - SOUND->PlayOnceStreamed( THEME->GetPathTo(SOUND_MENU_START) ); + SOUND->PlayOnceStreamed( THEME->GetPathTo("Sounds","menu start") ); return; } diff --git a/stepmania/src/ScreenSelectDifficulty.cpp b/stepmania/src/ScreenSelectDifficulty.cpp index af85298a63..75d4ad4b30 100644 --- a/stepmania/src/ScreenSelectDifficulty.cpp +++ b/stepmania/src/ScreenSelectDifficulty.cpp @@ -9,7 +9,6 @@ ----------------------------------------------------------------------------- */ - #include "ScreenSelectDifficulty.h" #include "ScreenManager.h" #include "PrefsManager.h" @@ -24,54 +23,103 @@ #include "GameState.h" -const float MORE_ARROWS_X[NUM_PAGES] = { SCREEN_RIGHT-60, SCREEN_WIDTH + SCREEN_LEFT+60}; -const float MORE_ARROWS_Y[NUM_PAGES] = { CENTER_Y-150, CENTER_Y-150 }; -const float EXPLANATION_X[NUM_PAGES] = { CENTER_X - 150, SCREEN_WIDTH + CENTER_X + 150 }; -const float EXPLANATION_Y[NUM_PAGES] = { CENTER_Y - 170, CENTER_Y - 170 }; -const float EXPLANATION_OFF_SCREEN_X[NUM_PAGES] = { EXPLANATION_X[0]-400, EXPLANATION_X[1]+400 }; -const float EXPLANATION_OFF_SCREEN_Y[NUM_PAGES] = { EXPLANATION_Y[0], EXPLANATION_Y[1] }; - -const float DIFFICULTY_ITEM_X[NUM_DIFFICULTY_ITEMS] = { - CENTER_X-200, // easy - CENTER_X, // medium - CENTER_X+200, // hard - SCREEN_WIDTH+CENTER_X-100, // Oni, page 2 - SCREEN_WIDTH+CENTER_X+100, // Endless, page 2 -}; -// these sprites are bottom aligned! -const float DIFFICULTY_ITEM_Y[NUM_DIFFICULTY_ITEMS] = { - CENTER_Y-40, - CENTER_Y-60, - CENTER_Y-40, - CENTER_Y-60, - CENTER_Y-60, -}; - -const float DIFFICULTY_ARROW_Y[NUM_DIFFICULTY_ITEMS] = { - DIFFICULTY_ITEM_Y[0]+205, - DIFFICULTY_ITEM_Y[1]+205, - DIFFICULTY_ITEM_Y[2]+205, - DIFFICULTY_ITEM_Y[3]+205, - DIFFICULTY_ITEM_Y[4]+205, -}; -const float DIFFICULTY_ARROW_X[NUM_DIFFICULTY_ITEMS][NUM_PLAYERS] = { - { DIFFICULTY_ITEM_X[0]-40, DIFFICULTY_ITEM_X[0]+40 }, - { DIFFICULTY_ITEM_X[1]-40, DIFFICULTY_ITEM_X[1]+40 }, - { DIFFICULTY_ITEM_X[2]-40, DIFFICULTY_ITEM_X[2]+40 }, - { DIFFICULTY_ITEM_X[3]-40, DIFFICULTY_ITEM_X[3]+40 }, - { DIFFICULTY_ITEM_X[4]-40, DIFFICULTY_ITEM_X[4]+40 }, -}; - - -const float ARROW_SHADOW_OFFSET = 10; - const float LOCK_INPUT_TIME = 0.30f; // lock input while waiting for tweening to complete -const ScreenMessage SM_GoToPrevState = ScreenMessage(SM_User + 1); -const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User + 2); -const ScreenMessage SM_StartTweeningOffScreen = ScreenMessage(SM_User + 3); -const ScreenMessage SM_StartFadingOut = ScreenMessage(SM_User + 4); +#define MORE_PAGE1_X THEME->GetMetricF("SelectDifficulty","MorePage1X") +#define MORE_PAGE1_Y THEME->GetMetricF("SelectDifficulty","MorePage1Y") +#define MORE_PAGE2_X THEME->GetMetricF("SelectDifficulty","MorePage2X") +#define MORE_PAGE2_Y THEME->GetMetricF("SelectDifficulty","MorePage2Y") +#define EXPLANATION_PAGE1_X THEME->GetMetricF("SelectDifficulty","ExplanationPage1X") +#define EXPLANATION_PAGE1_Y THEME->GetMetricF("SelectDifficulty","ExplanationPage1Y") +#define EXPLANATION_PAGE2_X THEME->GetMetricF("SelectDifficulty","ExplanationPage2X") +#define EXPLANATION_PAGE2_Y THEME->GetMetricF("SelectDifficulty","ExplanationPage2Y") +#define EASY_X THEME->GetMetricF("SelectDifficulty","EasyX") +#define EASY_Y THEME->GetMetricF("SelectDifficulty","EasyY") +#define MEDIUM_X THEME->GetMetricF("SelectDifficulty","MediumX") +#define MEDIUM_Y THEME->GetMetricF("SelectDifficulty","MediumY") +#define HARD_X THEME->GetMetricF("SelectDifficulty","HardX") +#define HARD_Y THEME->GetMetricF("SelectDifficulty","HardY") +#define ONI_X THEME->GetMetricF("SelectDifficulty","OniX") +#define ONI_Y THEME->GetMetricF("SelectDifficulty","OniY") +#define ENDLESS_X THEME->GetMetricF("SelectDifficulty","EndlessX") +#define ENDLESS_Y THEME->GetMetricF("SelectDifficulty","EndlessY") +#define ARROW_OFFSET_P1_X THEME->GetMetricF("SelectDifficulty","ArrowOffsetP1X") +#define ARROW_OFFSET_P1_Y THEME->GetMetricF("SelectDifficulty","ArrowOffsetP1Y") +#define ARROW_OFFSET_P2_X THEME->GetMetricF("SelectDifficulty","ArrowOffsetP2X") +#define ARROW_OFFSET_P2_Y THEME->GetMetricF("SelectDifficulty","ArrowOffsetP2Y") +#define ARROW_SHADOW_LENGTH_X THEME->GetMetricF("SelectDifficulty","ArrowShadowLengthX") +#define ARROW_SHADOW_LENGTH_Y THEME->GetMetricF("SelectDifficulty","ArrowShadowLengthY") + + +float MORE_X( int iIndex ) { + switch( iIndex ) { + case 0: return MORE_PAGE1_X; + case 1: return MORE_PAGE2_X; + default: ASSERT(0); return 0; + } +} +float MORE_Y( int iIndex ) { + switch( iIndex ) { + case 0: return MORE_PAGE1_Y; + case 1: return MORE_PAGE2_Y; + default: ASSERT(0); return 0; + } +} +float EXPLANATION_X( int iIndex ) { + switch( iIndex ) { + case 0: return EXPLANATION_PAGE1_X; + case 1: return EXPLANATION_PAGE2_X; + default: ASSERT(0); return 0; + } +} +float EXPLANATION_Y( int iIndex ) { + switch( iIndex ) { + case 0: return EXPLANATION_PAGE1_Y; + case 1: return EXPLANATION_PAGE2_Y; + default: ASSERT(0); return 0; + } +} +float ITEM_X( int iItemIndex ) { + switch( iItemIndex ) { + case 0: return EASY_X; + case 1: return MEDIUM_X; + case 2: return HARD_X; + case 3: return ONI_X; + case 4: return ENDLESS_X; + default: ASSERT(0); return 0; + } +} +float ITEM_Y( int iItemIndex ) { + switch( iItemIndex ) { + case 0: return EASY_Y; + case 1: return MEDIUM_Y; + case 2: return HARD_Y; + case 3: return ONI_Y; + case 4: return ENDLESS_Y; + default: ASSERT(0); return 0; + } +} +float ARROW_X( int iItemIndex, int p ) { + switch( p ) { + case PLAYER_1: return ITEM_X(iItemIndex) + ARROW_OFFSET_P1_X; + case PLAYER_2: return ITEM_X(iItemIndex) + ARROW_OFFSET_P2_X; + default: ASSERT(0); return 0; + } +} +float ARROW_Y( int iItemIndex, int p ) { + switch( p ) { + case PLAYER_1: return ITEM_Y(iItemIndex) + ARROW_OFFSET_P1_Y; + case PLAYER_2: return ITEM_Y(iItemIndex) + ARROW_OFFSET_P2_Y; + default: ASSERT(0); return 0; + } +} + + +const ScreenMessage SM_GoToPrevState = ScreenMessage(SM_User + 1); +const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User + 2); +const ScreenMessage SM_StartTweeningOffScreen = ScreenMessage(SM_User + 3); +const ScreenMessage SM_StartFadingOut = ScreenMessage(SM_User + 4); ScreenSelectDifficulty::ScreenSelectDifficulty() @@ -80,13 +128,14 @@ ScreenSelectDifficulty::ScreenSelectDifficulty() // Reset the current PlayMode GAMESTATE->m_PlayMode = PLAY_MODE_INVALID; + GAMESTATE->m_bPlayersCanJoin = false; int p; m_Menu.Load( - THEME->GetPathTo(GRAPHIC_SELECT_DIFFICULTY_BACKGROUND) , - THEME->GetPathTo(GRAPHIC_SELECT_DIFFICULTY_TOP_EDGE), + THEME->GetPathTo("Graphics","select difficulty background"), + THEME->GetPathTo("Graphics","select difficulty top edge"), ssprintf("Use %c %c to select, then press START", char(1), char(2)), false, true, 40 ); @@ -95,24 +144,24 @@ ScreenSelectDifficulty::ScreenSelectDifficulty() for( int d=0; dGetPathTo(te_picture) ); - m_sprPicture[d].SetXY( DIFFICULTY_ITEM_X[d], DIFFICULTY_ITEM_Y[d] ); + m_sprPicture[d].Load( THEME->GetPathTo("Graphics",sPictureFile) ); + m_sprPicture[d].SetXY( ITEM_X(d), ITEM_Y(d) ); m_sprPicture[d].SetVertAlign( align_bottom ); m_sprPicture[d].TurnShadowOff(); m_framePages.AddSubActor( &m_sprPicture[d] ); - m_sprHeader[d].Load( THEME->GetPathTo(te_header) ); - m_sprHeader[d].SetXY( DIFFICULTY_ITEM_X[d], DIFFICULTY_ITEM_Y[d] ); + m_sprHeader[d].Load( THEME->GetPathTo("Graphics",sHeaderFile) ); + m_sprHeader[d].SetXY( ITEM_X(d), ITEM_Y(d) ); m_sprHeader[d].SetVertAlign( align_top ); m_sprHeader[d].TurnShadowOff(); m_framePages.AddSubActor( &m_sprHeader[d] ); @@ -120,12 +169,12 @@ ScreenSelectDifficulty::ScreenSelectDifficulty() for( p=0; pGetPathTo( p==0 ? GRAPHIC_ARROWS_RIGHT : GRAPHIC_ARROWS_LEFT ) ); - m_sprMoreArrows[p].SetXY( MORE_ARROWS_X[p], MORE_ARROWS_Y[p] ); + m_sprMoreArrows[p].Load( THEME->GetPathTo("Graphics", p==0 ? "select difficulty more page1" : "select difficulty more page2" ) ); + m_sprMoreArrows[p].SetXY( MORE_X(p), MORE_Y(p) ); m_framePages.AddSubActor( &m_sprMoreArrows[p] ); - m_sprExplanation[p].Load( THEME->GetPathTo(GRAPHIC_SELECT_DIFFICULTY_EXPLANATION) ); - m_sprExplanation[p].SetXY( EXPLANATION_X[p], EXPLANATION_Y[p] ); + m_sprExplanation[p].Load( THEME->GetPathTo("Graphics", "select difficulty explanation") ); + m_sprExplanation[p].SetXY( EXPLANATION_X(p), EXPLANATION_Y(p) ); m_sprExplanation[p].StopAnimating(); m_sprExplanation[p].SetState( p ); m_framePages.AddSubActor( &m_sprExplanation[p] ); @@ -140,14 +189,14 @@ ScreenSelectDifficulty::ScreenSelectDifficulty() if( !GAMESTATE->IsPlayerEnabled((PlayerNumber)p) ) continue; - m_sprArrowShadow[p].Load( THEME->GetPathTo(GRAPHIC_SELECT_DIFFICULTY_ARROWS) ); + m_sprArrowShadow[p].Load( THEME->GetPathTo("Graphics", "select difficulty arrows") ); m_sprArrowShadow[p].StopAnimating(); m_sprArrowShadow[p].SetState( p ); m_sprArrowShadow[p].TurnShadowOff(); m_sprArrowShadow[p].SetDiffuseColor( D3DXCOLOR(0,0,0,0.6f) ); m_framePages.AddSubActor( &m_sprArrowShadow[p] ); - m_sprArrow[p].Load( THEME->GetPathTo(GRAPHIC_SELECT_DIFFICULTY_ARROWS) ); + m_sprArrow[p].Load( THEME->GetPathTo("Graphics", "select difficulty arrows") ); m_sprArrow[p].StopAnimating(); m_sprArrow[p].SetState( p ); m_sprArrow[p].TurnShadowOff(); @@ -155,29 +204,28 @@ ScreenSelectDifficulty::ScreenSelectDifficulty() m_sprArrow[p].SetEffectGlowing(); m_framePages.AddSubActor( &m_sprArrow[p] ); - m_sprOK[p].Load( THEME->GetPathTo(GRAPHIC_SELECT_DIFFICULTY_OK) ); + m_sprOK[p].Load( THEME->GetPathTo("Graphics", "select difficulty ok") ); m_framePages.AddSubActor( &m_sprOK[p] ); } this->AddSubActor( &m_framePages ); - m_soundChange.Load( THEME->GetPathTo(SOUND_SELECT_DIFFICULTY_CHANGE) ); - m_soundSelect.Load( THEME->GetPathTo(SOUND_MENU_START) ); + m_soundChange.Load( THEME->GetPathTo("Sounds", "select difficulty change") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds", "menu start") ); m_bPlayedChallengeSound = false; SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_DIFFICULTY_INTRO) ); - - if( !MUSIC->IsPlaying() ) - { - MUSIC->Load( THEME->GetPathTo(SOUND_MENU_MUSIC) ); - MUSIC->Play( true ); - } - m_Menu.TweenOnScreenFromMenu( SM_None ); TweenOnScreen(); + if( !MUSIC->IsPlaying() || MUSIC->GetLoadedFilePath() != THEME->GetPathTo("Sounds","select difficulty music") ) + { + MUSIC->Load( THEME->GetPathTo("Sounds","select difficulty music") ); + MUSIC->Play( true ); + } + m_fLockInputTime = LOCK_INPUT_TIME; } @@ -352,12 +400,12 @@ void ScreenSelectDifficulty::ChangeTo( const PlayerNumber pn, int iSelectionWas, if( bSelectedSomethingOnPage2 || bChangedPagesFrom2To1 || p==pn ) { m_sprArrow[p].BeginTweening( 0.2f, bChangedPages ? TWEEN_LINEAR : TWEEN_BIAS_BEGIN ); - m_sprArrow[p].SetTweenX( DIFFICULTY_ARROW_X[m_iSelection[p]][p] - ARROW_SHADOW_OFFSET ); - m_sprArrow[p].SetTweenY( DIFFICULTY_ARROW_Y[m_iSelection[p]] - ARROW_SHADOW_OFFSET ); + m_sprArrow[p].SetTweenX( ARROW_X(m_iSelection[p],(PlayerNumber)p) - ARROW_SHADOW_LENGTH_X ); + m_sprArrow[p].SetTweenY( ARROW_Y(m_iSelection[p],(PlayerNumber)p) - ARROW_SHADOW_LENGTH_Y ); m_sprArrowShadow[p].BeginTweening( 0.2f, bChangedPages ? TWEEN_LINEAR : TWEEN_BIAS_BEGIN ); - m_sprArrowShadow[p].SetTweenX( DIFFICULTY_ARROW_X[m_iSelection[p]][p] ); - m_sprArrowShadow[p].SetTweenY( DIFFICULTY_ARROW_Y[m_iSelection[p]] ); + m_sprArrowShadow[p].SetTweenX( ARROW_X(m_iSelection[p],(PlayerNumber)p) ); + m_sprArrowShadow[p].SetTweenY( ARROW_Y(m_iSelection[p],(PlayerNumber)p) ); } } @@ -396,11 +444,11 @@ void ScreenSelectDifficulty::MenuStart( PlayerNumber pn ) m_sprArrow[pn].BeginTweeningQueued( 0.2f ); m_sprArrow[pn].BeginTweeningQueued( 0.2f ); - m_sprArrow[pn].SetTweenX( DIFFICULTY_ARROW_X[iSelection][pn] ); - m_sprArrow[pn].SetTweenY( DIFFICULTY_ARROW_Y[iSelection] ); + m_sprArrow[pn].SetTweenX( ARROW_X(iSelection, pn) ); + m_sprArrow[pn].SetTweenY( ARROW_Y(iSelection, pn) ); - m_sprOK[pn].SetX( DIFFICULTY_ARROW_X[iSelection][pn] ); - m_sprOK[pn].SetY( DIFFICULTY_ARROW_Y[iSelection] ); + m_sprOK[pn].SetX( ARROW_X(iSelection, pn) ); + m_sprOK[pn].SetY( ARROW_Y(iSelection, pn) ); m_sprOK[pn].SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); m_sprOK[pn].SetZoom( 2 ); @@ -433,9 +481,9 @@ void ScreenSelectDifficulty::TweenOffScreen() for( p=0; pGetPathTo(GRAPHIC_PLAYER_OPTIONS_BACKGROUND), - THEME->GetPathTo(GRAPHIC_PLAYER_OPTIONS_TOP_EDGE) + THEME->GetPathTo("Graphics","select game background"), + THEME->GetPathTo("Graphics","select game page"), + THEME->GetPathTo("Graphics","select game top edge") ) { LOG->Trace( "ScreenSelectGame::ScreenSelectGame()" ); + // // populate g_SelectGameLines - CStringArray arrayGameNames; - GAMEMAN->GetGameNames( arrayGameNames ); - for( int i=0; iGetGameNames( arrayGameNames ); + CArray aGames; + GAMEMAN->GetEnabledGames( aGames ); + for( int i=0; iGetGameDefForGame(game)->m_szName; + strcpy( g_SelectGameLines[0].szOptionsText[i], sGameName ); + } + g_SelectGameLines[0].iNumOptions = i; Init( - INPUTMODE_P1_ONLY, + INPUTMODE_BOTH, g_SelectGameLines, NUM_SELECT_GAME_LINES ); @@ -84,7 +86,12 @@ void ScreenSelectGame::ExportOptions() PREFSMAN->SaveGamePrefsToDisk(); // Switch the current style to the frist style of the selected game - Game game = (Game)m_iSelectedOption[0][SG_GAME]; + int iSelection = m_iSelectedOption[0][SG_GAME]; + + CArray aGames; + GAMEMAN->GetEnabledGames( aGames ); + Game game = aGames[iSelection]; + GAMESTATE->m_CurGame = game; PREFSMAN->ReadGamePrefsFromDisk(); INPUTMAPPER->ReadMappingsFromDisk(); diff --git a/stepmania/src/ScreenSelectGroup.cpp b/stepmania/src/ScreenSelectGroup.cpp index f1b72093da..604d18b72f 100644 --- a/stepmania/src/ScreenSelectGroup.cpp +++ b/stepmania/src/ScreenSelectGroup.cpp @@ -25,25 +25,32 @@ #include "GameState.h" -const float GROUP_INFO_FRAME_X = SCREEN_LEFT + 180; -const float GROUP_INFO_FRAME_Y = SCREEN_TOP + 160; +#define FRAME_X THEME->GetMetricF("SelectGroup","FrameX") +#define FRAME_Y THEME->GetMetricF("SelectGroup","FrameY") +#define BANNER_X THEME->GetMetricF("SelectGroup","BannerX") +#define BANNER_Y THEME->GetMetricF("SelectGroup","BannerY") +#define BANNER_WIDTH THEME->GetMetricF("SelectGroup","BannerWidth") +#define BANNER_HEIGHT THEME->GetMetricF("SelectGroup","BannerHeight") +#define NUMBER_X THEME->GetMetricF("SelectGroup","NumberX") +#define NUMBER_Y THEME->GetMetricF("SelectGroup","NumberY") +#define EXPLANATION_X THEME->GetMetricF("SelectGroup","ExplanationX") +#define EXPLANATION_Y THEME->GetMetricF("SelectGroup","ExplanationY") +#define BUTTON_X THEME->GetMetricF("SelectGroup","ButtonX") +#define BUTTON_SELECTED_X THEME->GetMetricF("SelectGroup","ButtonSelectedX") +#define BUTTON_START_Y THEME->GetMetricF("SelectGroup","ButtonStartY") +#define BUTTON_SPACING_Y THEME->GetMetricF("SelectGroup","ButtonSpacingY") +#define CONTENTS_X THEME->GetMetricF("SelectGroup","ContentsX") +#define CONTENTS_Y THEME->GetMetricF("SelectGroup","ContentsY") +#define TITLES_START_X THEME->GetMetricF("SelectGroup","TitlesStartX") +#define TITLES_SPACING_X THEME->GetMetricF("SelectGroup","TitlesSpacingX") +#define TITLES_START_Y THEME->GetMetricF("SelectGroup","TitlesStartY") +#define TITLES_COLUMNS THEME->GetMetricI("SelectGroup","TitlesColumns") +#define TITLES_ROWS THEME->GetMetricI("SelectGroup","TitlesRows") -const float EXPLANATION_X = SCREEN_LEFT + 110; -const float EXPLANATION_Y = SCREEN_TOP + 65; - -const float BUTTON_X = SCREEN_RIGHT - 135; -const float BUTTON_SELECTED_X = BUTTON_X - 30; -const float BUTTON_START_Y = SCREEN_TOP + 65; -const float BUTTON_GAP_Y = 26; - -const float CONTENTS_X = CENTER_X; -const float CONTENTS_START_Y = SCREEN_TOP + SCREEN_HEIGHT*3/5 - 15; - -const int TITLES_PER_COLUMN = 10; const ScreenMessage SM_GoToPrevState = ScreenMessage(SM_User + 1); const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User + 2); -const ScreenMessage SM_StartFadingOut = ScreenMessage(SM_User + 3); +const ScreenMessage SM_StartFadingOut = ScreenMessage(SM_User + 3); ScreenSelectGroup::ScreenSelectGroup() @@ -187,35 +194,45 @@ ScreenSelectGroup::ScreenSelectGroup() m_bChosen = false; m_Menu.Load( - THEME->GetPathTo(GRAPHIC_SELECT_GROUP_BACKGROUND) , - THEME->GetPathTo(GRAPHIC_SELECT_GROUP_TOP_EDGE), + THEME->GetPathTo("Graphics","select group background") , + THEME->GetPathTo("Graphics","select group top edge"), ssprintf("Use %c %c to select, then press START", char(1), char(2)), false, true, 40 ); this->AddSubActor( &m_Menu ); - m_sprExplanation.Load( THEME->GetPathTo(GRAPHIC_SELECT_GROUP_EXPLANATION) ); + m_sprExplanation.Load( THEME->GetPathTo("Graphics","select group explanation") ); m_sprExplanation.SetXY( EXPLANATION_X, EXPLANATION_Y ); this->AddSubActor( &m_sprExplanation ); - m_GroupInfoFrame.SetXY( GROUP_INFO_FRAME_X, GROUP_INFO_FRAME_Y ); - this->AddSubActor( &m_GroupInfoFrame ); + // these guys get loaded SetSong and TweenToSong + m_Banner.SetXY( BANNER_X, BANNER_Y ); + m_Banner.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); + this->AddSubActor( &m_Banner ); - m_sprContentsHeader.Load( THEME->GetPathTo(GRAPHIC_SELECT_GROUP_CONTENTS_HEADER) ); - m_sprContentsHeader.SetVertAlign( Actor::align_top ); - m_sprContentsHeader.SetXY( CONTENTS_X, CONTENTS_START_Y ); - this->AddSubActor( &m_sprContentsHeader ); + m_sprFrame.Load( THEME->GetPathTo("Graphics","select group info frame") ); + m_sprFrame.SetXY( FRAME_X, FRAME_Y ); + this->AddSubActor( &m_sprFrame ); - for( i=0; iGetPathTo("Fonts","header1") ); + m_textNumber.SetXY( NUMBER_X, NUMBER_Y ); + m_textNumber.SetHorizAlign( Actor::align_right ); + m_textNumber.TurnShadowOff(); + this->AddSubActor( &m_textNumber ); + + m_sprContents.Load( THEME->GetPathTo("Graphics","select group contents header") ); + m_sprContents.SetXY( CONTENTS_X, CONTENTS_Y ); + this->AddSubActor( &m_sprContents ); + + for( i=0; iGetPathTo(FONT_NORMAL) ); - m_textContents[i].SetXY( fX, CONTENTS_START_Y+15 ); - m_textContents[i].SetHorizAlign( Actor::align_left ); - m_textContents[i].SetVertAlign( Actor::align_bottom ); - m_textContents[i].SetZoom( 0.5f ); - m_textContents[i].SetShadowLength( 2 ); - this->AddSubActor( &m_textContents[i] ); + m_textTitles[i].LoadFromFont( THEME->GetPathTo("Fonts","normal") ); + m_textTitles[i].SetXY( TITLES_START_X + i*TITLES_SPACING_X, TITLES_START_Y ); + m_textTitles[i].SetHorizAlign( Actor::align_left ); + m_textTitles[i].SetVertAlign( Actor::align_bottom ); + m_textTitles[i].SetZoom( 0.5f ); + m_textTitles[i].SetShadowLength( 2 ); + this->AddSubActor( &m_textTitles[i] ); } @@ -224,56 +241,23 @@ ScreenSelectGroup::ScreenSelectGroup() { CString sGroupName = m_arrayGroupNames[i]; - m_sprGroupButton[i].Load( THEME->GetPathTo(GRAPHIC_SELECT_GROUP_BUTTON) ); - m_sprGroupButton[i].SetXY( BUTTON_X, BUTTON_START_Y + BUTTON_GAP_Y*i ); - this->AddSubActor( &m_sprGroupButton[i] ); + m_sprButton[i].Load( THEME->GetPathTo("Graphics","select group button") ); + m_sprButton[i].SetXY( BUTTON_X, BUTTON_START_Y + i*BUTTON_SPACING_Y ); + this->AddSubActor( &m_sprButton[i] ); - m_textGroup[i].Load( THEME->GetPathTo(FONT_NORMAL) ); - m_textGroup[i].SetXY( BUTTON_X, BUTTON_START_Y + BUTTON_GAP_Y*i ); - m_textGroup[i].SetText( SONGMAN->ShortenGroupName( sGroupName ) ); - m_textGroup[i].SetZoom( 0.8f ); - m_textGroup[i].SetShadowLength( 2 ); + m_textLabel[i].LoadFromFont( THEME->GetPathTo("Fonts","normal") ); + m_textLabel[i].SetXY( BUTTON_X, BUTTON_START_Y + i*BUTTON_SPACING_Y ); + m_textLabel[i].SetText( SONGMAN->ShortenGroupName( sGroupName ) ); + m_textLabel[i].SetZoom( 0.8f ); + m_textLabel[i].SetShadowLength( 2 ); - if( i == 0 ) m_textGroup[i].TurnRainbowOn(); - else m_textGroup[i].SetDiffuseColor( SONGMAN->GetGroupColor(sGroupName) ); + if( i == 0 ) m_textLabel[i].TurnRainbowOn(); + else m_textLabel[i].SetDiffuseColor( SONGMAN->GetGroupColor(sGroupName) ); - this->AddSubActor( &m_textGroup[i] ); + this->AddSubActor( &m_textLabel[i] ); } - // - // Generate what text will show in the contents for each group - // - /* - for( i=0; i arraySongs; - const CString &sCurGroupName = m_arrayGroupNames[i]; - - if( i == 0 ) arraySongs.Copy( SONGMAN->m_pSongs ); - else SONGMAN->GetSongsInGroup( sCurGroupName, arraySongs ); - - m_iNumSongsInGroup[i] = arraySongs.GetSize(); - - SortSongPointerArrayByTitle( arraySongs ); - - for( int c=0; cGetFullTitle() + "\n"; - } - } - m_sContentsText[i][c] = sText; - } - } - */ // // Generate what text will show in the contents for each group @@ -290,15 +274,15 @@ ScreenSelectGroup::ScreenSelectGroup() SortSongPointerArrayByTitle( *p_arraySongs ); - for( int c=0; cGetSize() ) { - if( j == NUM_CONTENTS_COLUMNS * TITLES_PER_COLUMN - 1 ) - sText += ssprintf( "%d more.....", p_arraySongs->GetSize() - NUM_CONTENTS_COLUMNS * TITLES_PER_COLUMN - 1 ); + if( j == TITLES_COLUMNS * TITLES_ROWS - 1 ) + sText += ssprintf( "%d more.....", p_arraySongs->GetSize() - TITLES_COLUMNS * TITLES_ROWS - 1 ); else sText += (*p_arraySongs)[j]->GetFullTitle() + "\n"; } @@ -307,16 +291,16 @@ ScreenSelectGroup::ScreenSelectGroup() } } - m_soundChange.Load( THEME->GetPathTo(SOUND_SELECT_GROUP_CHANGE) ); - m_soundSelect.Load( THEME->GetPathTo(SOUND_MENU_START) ); + m_soundChange.Load( THEME->GetPathTo("Sounds","select group change") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_GROUP_INTRO) ); - if( !MUSIC->IsPlaying() ) + if( !MUSIC->IsPlaying() || MUSIC->GetLoadedFilePath() != THEME->GetPathTo("Sounds","select group music") ) { - MUSIC->Load( THEME->GetPathTo(SOUND_MENU_MUSIC) ); - MUSIC->Play( true ); + MUSIC->Load( THEME->GetPathTo("Sounds","select group music") ); + MUSIC->Play( true ); } m_Menu.TweenOnScreenFromMenu( SM_None ); @@ -389,42 +373,44 @@ void ScreenSelectGroup::BeforeChange() { int iSel = m_iSelection; - m_sprGroupButton[iSel].BeginTweening( 0.2f ); - m_sprGroupButton[iSel].SetTweenX( BUTTON_X ); - m_sprGroupButton[iSel].SetEffectNone(); + m_sprButton[iSel].BeginTweening( 0.2f ); + m_sprButton[iSel].SetTweenX( BUTTON_X ); + m_sprButton[iSel].SetEffectNone(); - m_textGroup[iSel].BeginTweening( 0.2f ); - m_textGroup[iSel].SetTweenX( BUTTON_X ); - m_textGroup[iSel].SetEffectNone(); + m_textLabel[iSel].BeginTweening( 0.2f ); + m_textLabel[iSel].SetTweenX( BUTTON_X ); + m_textLabel[iSel].SetEffectNone(); } void ScreenSelectGroup::AfterChange() { int iSel = m_iSelection; - m_sprGroupButton[iSel].BeginTweening( 0.2f ); - m_sprGroupButton[iSel].SetTweenX( BUTTON_SELECTED_X ); - m_sprGroupButton[iSel].SetEffectGlowing(); + m_sprButton[iSel].BeginTweening( 0.2f ); + m_sprButton[iSel].SetTweenX( BUTTON_SELECTED_X ); + m_sprButton[iSel].SetEffectGlowing(); - m_textGroup[iSel].BeginTweening( 0.2f ); - m_textGroup[iSel].SetTweenX( BUTTON_SELECTED_X ); - m_textGroup[iSel].SetEffectGlowing(); + m_textLabel[iSel].BeginTweening( 0.2f ); + m_textLabel[iSel].SetTweenX( BUTTON_SELECTED_X ); + m_textLabel[iSel].SetEffectGlowing(); - for( int c=0; cGetPathTo(GRAPHIC_ALL_MUSIC_BANNER); + sGroupBannerPath = THEME->GetPathTo("Graphics","all music banner"); else if( SONGMAN->GetGroupBannerPath(sSelectedGroupName) != "" ) sGroupBannerPath = SONGMAN->GetGroupBannerPath(sSelectedGroupName); else - sGroupBannerPath = THEME->GetPathTo(GRAPHIC_FALLBACK_BANNER); + sGroupBannerPath = THEME->GetPathTo("Graphics","fallback banner"); - // There is too much Z-fighting when we rotate this, so fake a rotation with a squash - m_GroupInfoFrame.Set( sGroupBannerPath, m_iNumSongsInGroup[m_iSelection] ); + const int iNumSongs = m_iNumSongsInGroup[m_iSelection]; + m_textNumber.SetText( ssprintf("%d", iNumSongs) ); + + m_Banner.SetFromGroup( sSelectedGroupName ); } @@ -499,39 +485,41 @@ void ScreenSelectGroup::TweenOffScreen() m_sprExplanation.BeginTweeningQueued( 0.5f, TWEEN_BOUNCE_BEGIN ); m_sprExplanation.SetTweenX( EXPLANATION_X-400 ); - m_GroupInfoFrame.BeginTweeningQueued( 0.9f ); - m_GroupInfoFrame.BeginTweeningQueued( 0.5f, TWEEN_BOUNCE_BEGIN ); - m_GroupInfoFrame.SetTweenX( GROUP_INFO_FRAME_X-400 ); - - m_sprContentsHeader.BeginTweeningQueued( 0.7f ); - m_sprContentsHeader.BeginTweeningQueued( 0.5f, TWEEN_BIAS_END ); - m_sprContentsHeader.SetTweenY( CONTENTS_START_Y+400 ); - - int i; - - for( i=0; iBeginTweeningQueued( 0.9f ); + pActorsInGroupInfoFrame[i]->BeginTweeningQueued( 0.5f, TWEEN_BOUNCE_BEGIN ); + pActorsInGroupInfoFrame[i]->SetTweenX( pActorsInGroupInfoFrame[i]->GetX()-400 ); + } + + m_sprContents.BeginTweeningQueued( 0.7f ); + m_sprContents.BeginTweeningQueued( 0.5f, TWEEN_BIAS_END ); + m_sprContents.SetTweenY( CONTENTS_Y+400 ); + for( i=0; iGetX(); + pActorsInGroupInfoFrame[i]->SetX( fOriginalX-400 ); + pActorsInGroupInfoFrame[i]->BeginTweening( 0.5f, TWEEN_BOUNCE_END ); + pActorsInGroupInfoFrame[i]->SetTweenX( fOriginalX ); + } + + m_sprContents.SetY( CONTENTS_Y+400 ); + m_sprContents.BeginTweeningQueued( 0.5f, TWEEN_BIAS_END ); // sleep + m_sprContents.BeginTweeningQueued( 0.5f, TWEEN_BIAS_END ); + m_sprContents.SetTweenY( CONTENTS_Y ); + + for( i=0; iGetMetricF("SelectMusic","BannerFrameX") +#define BANNER_FRAME_Y THEME->GetMetricF("SelectMusic","BannerFrameY") +#define BANNER_X THEME->GetMetricF("SelectMusic","BannerX") +#define BANNER_Y THEME->GetMetricF("SelectMusic","BannerY") +#define BANNER_WIDTH THEME->GetMetricF("SelectMusic","BannerWidth") +#define BANNER_HEIGHT THEME->GetMetricF("SelectMusic","BannerHeight") +#define BPM_X THEME->GetMetricF("SelectMusic","BPMX") +#define BPM_Y THEME->GetMetricF("SelectMusic","BPMY") +#define STAGE_X THEME->GetMetricF("SelectMusic","StageX") +#define STAGE_Y THEME->GetMetricF("SelectMusic","StageY") +#define CD_TITLE_X THEME->GetMetricF("SelectMusic","CDTitleX") +#define CD_TITLE_Y THEME->GetMetricF("SelectMusic","CDTitleY") +#define DIFFICULTY_X THEME->GetMetricF("SelectMusic","DifficultyX") +#define DIFFICULTY_Y THEME->GetMetricF("SelectMusic","DifficultyY") +#define ICON_P1_X THEME->GetMetricF("SelectMusic","IconP1X") +#define ICON_P1_Y THEME->GetMetricF("SelectMusic","IconP1Y") +#define ICON_P2_X THEME->GetMetricF("SelectMusic","IconP2X") +#define ICON_P2_Y THEME->GetMetricF("SelectMusic","IconP2Y") +#define RADAR_X THEME->GetMetricF("SelectMusic","RadarX") +#define RADAR_Y THEME->GetMetricF("SelectMusic","RadarY") +#define SORT_ICON_X THEME->GetMetricF("SelectMusic","SortIconX") +#define SORT_ICON_Y THEME->GetMetricF("SelectMusic","SortIconY") +#define SCORE_P1_X THEME->GetMetricF("SelectMusic","ScoreP1X") +#define SCORE_P1_Y THEME->GetMetricF("SelectMusic","ScoreP1Y") +#define SCORE_P2_X THEME->GetMetricF("SelectMusic","ScoreP2X") +#define SCORE_P2_Y THEME->GetMetricF("SelectMusic","ScoreP2Y") +#define METER_FRAME_X THEME->GetMetricF("SelectMusic","MeterFrameX") +#define METER_FRAME_Y THEME->GetMetricF("SelectMusic","MeterFrameY") +#define METER_P1_X THEME->GetMetricF("SelectMusic","MeterP1X") +#define METER_P1_Y THEME->GetMetricF("SelectMusic","MeterP1Y") +#define METER_P2_X THEME->GetMetricF("SelectMusic","MeterP2X") +#define METER_P2_Y THEME->GetMetricF("SelectMusic","MeterP2Y") +#define WHEEL_X THEME->GetMetricF("SelectMusic","WheelX") +#define WHEEL_Y THEME->GetMetricF("SelectMusic","WheelY") +#define PLAYER_OPTIONS_P1_X THEME->GetMetricF("SelectMusic","PlayerOptionsP1X") +#define PLAYER_OPTIONS_P1_Y THEME->GetMetricF("SelectMusic","PlayerOptionsP1Y") +#define PLAYER_OPTIONS_P2_X THEME->GetMetricF("SelectMusic","PlayerOptionsP2X") +#define PLAYER_OPTIONS_P2_Y THEME->GetMetricF("SelectMusic","PlayerOptionsP2Y") +#define SONG_OPTIONS_X THEME->GetMetricF("SelectMusic","SongOptionsX") +#define SONG_OPTIONS_Y THEME->GetMetricF("SelectMusic","SongOptionsY") const float TWEEN_TIME = 0.5f; +float ICON_X( int p ) { + switch( p ) { + case PLAYER_1: return ICON_P1_X; + case PLAYER_2: return ICON_P2_X; + default: ASSERT(0); return 0; + } +} +float ICON_Y( int p ) { + switch( p ) { + case PLAYER_1: return ICON_P1_Y; + case PLAYER_2: return ICON_P2_Y; + default: ASSERT(0); return 0; + } +} +float HIGH_SCORE_X( int p ) { + switch( p ) { + case PLAYER_1: return SCORE_P1_X; + case PLAYER_2: return SCORE_P2_X; + default: ASSERT(0); return 0; + } +} +float HIGH_SCORE_Y( int p ) { + switch( p ) { + case PLAYER_1: return SCORE_P1_Y; + case PLAYER_2: return SCORE_P2_Y; + default: ASSERT(0); return 0; + } +} +float METER_X( int p ) { + switch( p ) { + case PLAYER_1: return METER_P1_X; + case PLAYER_2: return METER_P2_X; + default: ASSERT(0); return 0; + } +} +float METER_Y( int p ) { + switch( p ) { + case PLAYER_1: return METER_P1_Y; + case PLAYER_2: return METER_P2_Y; + default: ASSERT(0); return 0; + } +} +#define PLAYER_OPTIONS_X(p) ( p==PLAYER_1 ? PLAYER_OPTIONS_P1_X : PLAYER_OPTIONS_P2_X ) + +float PLAYER_OPTIONS_Y( int p ) { + switch( p ) { + case PLAYER_1: return PLAYER_OPTIONS_P1_Y; + case PLAYER_2: return PLAYER_OPTIONS_P2_Y; + default: ASSERT(0); return 0; + } +} const ScreenMessage SM_GoToPrevState = ScreenMessage(SM_User+1); const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User+2); @@ -73,44 +144,85 @@ ScreenSelectMusic::ScreenSelectMusic() int p; m_Menu.Load( - THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_BACKGROUND), - THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_TOP_EDGE), + THEME->GetPathTo("Graphics","select music background"), + THEME->GetPathTo("Graphics","select music top edge"), ssprintf("%c or %c change music Hold %c and %c then press START to change sort\n%c%c easier difficulty %c%c harder difficulty", char(1), char(2), char(1), char(2), char(3), char(3), char(4), char(4) ), false, true, 60 ); this->AddSubActor( &m_Menu ); - m_SongInfoFrame.SetXY( SONG_INFO_FRAME_X, SONG_INFO_FRAME_Y ); - this->AddSubActor( &m_SongInfoFrame ); + // these guys get loaded SetSong and TweenToSong + m_Banner.SetXY( BANNER_X, BANNER_Y ); + m_Banner.SetCroppedSize( BANNER_WIDTH, BANNER_HEIGHT ); + this->AddSubActor( &m_Banner ); - m_sprDifficultyFrame.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_DIFFICULTY_FRAME) ); + m_sprBannerFrame.Load( THEME->GetPathTo("Graphics","select music info frame") ); + m_sprBannerFrame.SetXY( BANNER_FRAME_X, BANNER_FRAME_Y ); + this->AddSubActor( &m_sprBannerFrame ); + + m_BPMDisplay.SetXY( BPM_X, BPM_Y ); + m_BPMDisplay.SetZoomX( 1.0f ); + this->AddSubActor( &m_BPMDisplay ); + + m_textStage.LoadFromFont( THEME->GetPathTo("Fonts","Header2") ); + m_textStage.TurnShadowOff(); + m_textStage.SetZoomX( 1.0f ); + m_textStage.SetXY( STAGE_X, STAGE_Y ); + m_textStage.SetText( GAMESTATE->GetStageText() ); + m_textStage.SetDiffuseColor( GAMESTATE->GetStageColor() ); + this->AddSubActor( &m_textStage ); + + m_sprCDTitle.Load( THEME->GetPathTo("Graphics","fallback cd title") ); + m_sprCDTitle.TurnShadowOff(); + m_sprCDTitle.SetXY( CD_TITLE_X, CD_TITLE_Y ); + this->AddSubActor( &m_sprCDTitle ); + + m_sprDifficultyFrame.Load( THEME->GetPathTo("Graphics","select music difficulty frame") ); m_sprDifficultyFrame.SetXY( DIFFICULTY_X, DIFFICULTY_Y ); this->AddSubActor( &m_sprDifficultyFrame ); for( p=0; pAddSubActor( &m_DifficultyIcon[p] ); } m_GrooveRadar.SetXY( RADAR_X, RADAR_Y ); this->AddSubActor( &m_GrooveRadar ); - m_textSongOptions.Load( THEME->GetPathTo(FONT_NORMAL) ); - m_textSongOptions.SetXY( RADAR_X, RADAR_Y ); + m_textSongOptions.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); + m_textSongOptions.SetXY( SONG_OPTIONS_X, SONG_OPTIONS_Y ); m_textSongOptions.SetZoom( 0.5f ); - m_textSongOptions.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); + if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) + m_textSongOptions.SetEffectCamelion( 2.5f, D3DXCOLOR(1,0,0,1), D3DXCOLOR(1,1,1,1) ); // blink red + m_textSongOptions.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); // white this->AddSubActor( &m_textSongOptions ); - m_sprMeterFrame.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_METER_FRAME) ); + for( p=0; pIsPlayerEnabled(p) ) + continue; + + m_textPlayerOptions[p].LoadFromFont( THEME->GetPathTo("Fonts","normal") ); + m_textPlayerOptions[p].SetXY( PLAYER_OPTIONS_X(p), PLAYER_OPTIONS_Y(p) ); + m_textPlayerOptions[p].SetZoom( 0.5f ); + m_textPlayerOptions[p].SetHorizAlign( p==PLAYER_1 ? Actor::align_left : Actor::align_right ); + m_textPlayerOptions[p].SetVertAlign( Actor::align_middle ); + if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) + m_textPlayerOptions[p].SetEffectCamelion( 2.5f, D3DXCOLOR(1,0,0,1), D3DXCOLOR(1,1,1,1) ); // blink red + m_textPlayerOptions[p].SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); // white + this->AddSubActor( &m_textPlayerOptions[p] ); + } + + m_sprMeterFrame.Load( THEME->GetPathTo("Graphics","select music meter frame") ); m_sprMeterFrame.SetXY( METER_FRAME_X, METER_FRAME_Y ); this->AddSubActor( &m_sprMeterFrame ); for( p=0; pGetPathTo(FONT_METER) ); - m_FootMeter[p].SetXY( METER_X[p], METER_Y[p] ); + m_FootMeter[p].LoadFromFont( THEME->GetPathTo("Fonts","meter") ); + m_FootMeter[p].SetXY( METER_X(p), METER_Y(p) ); m_FootMeter[p].SetShadowLength( 2 ); this->AddSubActor( &m_FootMeter[p] ); } @@ -118,7 +230,30 @@ ScreenSelectMusic::ScreenSelectMusic() m_MusicWheel.SetXY( WHEEL_X, WHEEL_Y ); this->AddSubActor( &m_MusicWheel ); - m_textHoldForOptions.Load( THEME->GetPathTo(FONT_STAGE) ); + for( p=0; pIsPlayerEnabled((PlayerNumber)p) ) + continue; // skip + + m_sprHighScoreFrame[p].Load( THEME->GetPathTo("Graphics","select music score frame") ); + m_sprHighScoreFrame[p].StopAnimating(); + m_sprHighScoreFrame[p].SetState( p ); + m_sprHighScoreFrame[p].SetXY( HIGH_SCORE_X(p), HIGH_SCORE_Y(p) ); + this->AddSubActor( &m_sprHighScoreFrame[p] ); + + m_HighScore[p].SetXY( HIGH_SCORE_X(p), HIGH_SCORE_Y(p) ); + m_HighScore[p].SetZoom( 0.6f ); + m_HighScore[p].SetDiffuseColor( PlayerToColor(p) ); + this->AddSubActor( &m_HighScore[p] ); + } + + m_MusicSortDisplay.SetXY( SORT_ICON_X, SORT_ICON_Y ); + m_MusicSortDisplay.SetEffectGlowing( 1.0f ); + m_MusicSortDisplay.Set( GAMESTATE->m_SongSortOrder ); + this->AddSubActor( &m_MusicSortDisplay ); + + + m_textHoldForOptions.LoadFromFont( THEME->GetPathTo("Fonts","stage") ); m_textHoldForOptions.SetXY( CENTER_X, CENTER_Y ); m_textHoldForOptions.SetText( "press START again for options" ); m_textHoldForOptions.SetZoom( 1 ); @@ -128,9 +263,9 @@ ScreenSelectMusic::ScreenSelectMusic() this->AddSubActor( &m_textHoldForOptions ); - m_soundSelect.Load( THEME->GetPathTo(SOUND_MENU_START) ); - m_soundChangeNotes.Load( THEME->GetPathTo(SOUND_SELECT_MUSIC_CHANGE_NOTES) ); - m_soundLocked.Load( THEME->GetPathTo(SOUND_SELECT_MUSIC_WHEEL_LOCKED) ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); + m_soundChangeNotes.Load( THEME->GetPathTo("Sounds","select music change notes") ); + m_soundLocked.Load( THEME->GetPathTo("Sounds","select music wheel locked") ); SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_MUSIC_INTRO) ); @@ -162,9 +297,16 @@ void ScreenSelectMusic::TweenOnScreen() { float fOriginalZoomY; - m_SongInfoFrame.SetXY( SONG_INFO_FRAME_X - 400, SONG_INFO_FRAME_Y ); - m_SongInfoFrame.BeginTweening( TWEEN_TIME, Actor::TWEEN_BIAS_END ); - m_SongInfoFrame.SetTweenXY( SONG_INFO_FRAME_X, SONG_INFO_FRAME_Y ); + Actor* pActorsInGroupInfoFrame[] = { &m_sprBannerFrame, &m_Banner, &m_BPMDisplay, &m_textStage, &m_sprCDTitle }; + const int iNumActorsInGroupInfoFrame = sizeof(pActorsInGroupInfoFrame) / sizeof(Actor*); + int i; + for( i=0; iGetX(); + pActorsInGroupInfoFrame[i]->SetX( fOriginalX-400 ); + pActorsInGroupInfoFrame[i]->BeginTweening( TWEEN_TIME, TWEEN_BOUNCE_END ); + pActorsInGroupInfoFrame[i]->SetTweenX( fOriginalX ); + } fOriginalZoomY = m_sprDifficultyFrame.GetZoomY(); m_sprDifficultyFrame.BeginTweening( TWEEN_TIME ); @@ -176,11 +318,16 @@ void ScreenSelectMusic::TweenOnScreen() m_GrooveRadar.TweenOnScreen(); + fOriginalZoomY = m_textSongOptions.GetZoomY(); m_textSongOptions.BeginTweening( TWEEN_TIME ); - m_textSongOptions.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,1) ); + m_textSongOptions.SetTweenZoomY( fOriginalZoomY ); for( int p=0; pGetX(); + pActorsInScore[i]->SetX( fOriginalX+400 ); + pActorsInScore[i]->BeginTweening( TWEEN_TIME, TWEEN_BIAS_END ); + pActorsInScore[i]->SetTweenX( fOriginalX ); + } + m_MusicWheel.TweenOnScreen(); } void ScreenSelectMusic::TweenOffScreen() { - m_SongInfoFrame.BeginTweening( TWEEN_TIME, Actor::TWEEN_BOUNCE_END ); - m_SongInfoFrame.SetTweenXY( SONG_INFO_FRAME_X - 400, SONG_INFO_FRAME_Y ); + Actor* pActorsInGroupInfoFrame[] = { &m_sprBannerFrame, &m_Banner, &m_BPMDisplay, &m_textStage, &m_sprCDTitle }; + const int iNumActorsInGroupInfoFrame = sizeof(pActorsInGroupInfoFrame) / sizeof(Actor*); + int i; + for( i=0; iBeginTweeningQueued( TWEEN_TIME, TWEEN_BOUNCE_BEGIN ); + pActorsInGroupInfoFrame[i]->SetTweenX( pActorsInGroupInfoFrame[i]->GetX()-400 ); + } m_sprDifficultyFrame.BeginTweening( TWEEN_TIME ); m_sprDifficultyFrame.SetTweenZoomY( 0 ); @@ -207,10 +374,13 @@ void ScreenSelectMusic::TweenOffScreen() m_GrooveRadar.TweenOffScreen(); m_textSongOptions.BeginTweening( TWEEN_TIME ); - m_textSongOptions.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,0) ); + m_textSongOptions.SetTweenZoomY( 0 ); for( int p=0; pBeginTweening( TWEEN_TIME, TWEEN_BIAS_BEGIN ); + pActorsInScore[i]->SetTweenX( pActorsInScore[i]->GetX()+400 ); + } + m_MusicWheel.TweenOffScreen(); } +void ScreenSelectMusic::Update( float fDeltaTime ) +{ + Screen::Update( fDeltaTime ); + + float fNewRotation = m_sprCDTitle.GetRotationY()+D3DX_PI*fDeltaTime/2; + fNewRotation = fmodf( fNewRotation, D3DX_PI*2 ); + m_sprCDTitle.SetRotationY( fNewRotation ); + if( fNewRotation > D3DX_PI/2 && fNewRotation <= D3DX_PI*3.0f/2 ) + m_sprCDTitle.SetDiffuseColor( D3DXCOLOR(0.2f,0.2f,0.2f,1) ); + else + m_sprCDTitle.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); +} + const GameButton DANCE_EASIER_DIFFICULTY_PATTERN[] = { DANCE_BUTTON_UP, DANCE_BUTTON_UP }; const int DANCE_EASIER_DIFFICULTY_PATTERN_SIZE = sizeof(DANCE_EASIER_DIFFICULTY_PATTERN) / sizeof(GameButton); @@ -247,7 +443,7 @@ void ScreenSelectMusic::Input( const DeviceInput& DeviceI, const InputEventType { m_bGoToOptions = true; m_textHoldForOptions.SetText( "Entering Options..." ); - SOUND->PlayOnceStreamed( THEME->GetPathTo(SOUND_MENU_START) ); + SOUND->PlayOnceStreamed( THEME->GetPathTo("Sounds","menu start") ); return; } @@ -401,7 +597,15 @@ void ScreenSelectMusic::MenuStart( const PlayerNumber p ) if( GAMESTATE->IsExtraStage() || GAMESTATE->IsExtraStage2() ) m_soundLocked.Play(); else + { + m_MusicSortDisplay.SetDiffuseColor( D3DXCOLOR(1,1,1,0) ); + m_MusicSortDisplay.SetState( GAMESTATE->m_SongSortOrder ); + m_MusicSortDisplay.BeginTweening( 0.3f ); // sleep + m_MusicSortDisplay.BeginTweeningQueued( 0.3f ); // fade in + m_MusicSortDisplay.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); + m_MusicWheel.NextSort(); + } return; } @@ -494,6 +698,17 @@ void ScreenSelectMusic::AfterNotesChange( const PlayerNumber p ) GAMESTATE->m_pCurNotes[p] = pNotes; +// m_BPMDisplay.SetZoomY( 0 ); +// m_BPMDisplay.BeginTweening( 0.2f ); +// m_BPMDisplay.SetTweenZoomY( 1.2f ); + + DifficultyClass dc = GAMESTATE->m_PreferredDifficultyClass[p]; + Song* pSong = GAMESTATE->m_pCurSong; + Notes* m_pNotes = GAMESTATE->m_pCurNotes[p]; + + if( m_pNotes ) + m_HighScore[p].SetScore( (float)m_pNotes->m_iTopScore ); + m_DifficultyIcon[p].SetFromNotes( pNotes ); m_FootMeter[p].SetFromNotes( pNotes ); m_GrooveRadar.SetFromNotes( p, pNotes ); @@ -512,18 +727,31 @@ void ScreenSelectMusic::AfterMusicChange() case TYPE_SECTION: { CString sGroup = m_MusicWheel.GetSelectedSection(); - m_SongInfoFrame.SetFromGroup( sGroup ); // if this isn't a group, it'll default to the fallback banner for( int p=0; pGetNotesThatMatch( GAMESTATE->GetCurrentStyleDef()->m_NotesType, m_arrayNotes ); SortNotesArrayByDifficulty( m_arrayNotes ); - m_SongInfoFrame.SetFromSong( pSong ); + + m_Banner.SetFromSong( pSong ); + + float fMinBPM, fMaxBPM; + pSong->GetMinMaxBPM( fMinBPM, fMaxBPM ); + m_BPMDisplay.SetBPMRange( fMinBPM, fMaxBPM ); + + if( pSong->HasCDTitle() ) + m_sprCDTitle.Load( pSong->GetCDTitlePath() ); + else + m_sprCDTitle.Load( THEME->GetPathTo("Graphics","fallback cd title") ); for( int p=0; pIsPlayerEnabled( PlayerNumber(p) ) ) @@ -537,7 +765,9 @@ void ScreenSelectMusic::AfterMusicChange() } break; case TYPE_ROULETTE: - m_SongInfoFrame.SetRoulette(); + m_Banner.SetRoulette(); + m_BPMDisplay.SetBPMRange( 0, 0 ); + m_sprCDTitle.UnloadTexture(); break; } @@ -570,10 +800,18 @@ void ScreenSelectMusic::PlayMusicSample() void ScreenSelectMusic::UpdateOptionsDisplays() { for( int p=0; pIsPlayerEnabled(p) ) - m_Menu.OverrideCreditsMessage( (PlayerNumber)p, GAMESTATE->m_PlayerOptions[p].GetString() ); + { + CString s = GAMESTATE->m_PlayerOptions[p].GetString(); + s.Replace( ", ", "\n" ); + m_textPlayerOptions[p].SetText( s ); + } + } - m_textSongOptions.SetText( GAMESTATE->m_SongOptions.GetString() ); + CString s = GAMESTATE->m_SongOptions.GetString(); + s.Replace( ", ", "\n" ); + m_textSongOptions.SetText( s ); } diff --git a/stepmania/src/ScreenSelectMusic.h b/stepmania/src/ScreenSelectMusic.h index 26ec05bd6c..0a63ee1400 100644 --- a/stepmania/src/ScreenSelectMusic.h +++ b/stepmania/src/ScreenSelectMusic.h @@ -16,7 +16,8 @@ #include "GameConstantsAndTypes.h" #include "MusicWheel.h" #include "Banner.h" -#include "SongInfoFrame.h" +#include "FadingBanner.h" +#include "BPMDisplay.h" #include "MenuElements.h" #include "GrooveRadar.h" #include "DifficultyIcon.h" @@ -31,6 +32,7 @@ public: virtual void DrawPrimitives(); + virtual void Update( float fDeltaTime ); virtual void Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ); virtual void HandleScreenMessage( const ScreenMessage SM ); @@ -53,26 +55,34 @@ protected: void UpdateOptionsDisplays(); CArray m_arrayNotes; - int m_iSelection[NUM_PLAYERS]; + int m_iSelection[NUM_PLAYERS]; - MenuElements m_Menu; + MenuElements m_Menu; - SongInfoFrame m_SongInfoFrame; - Sprite m_sprDifficultyFrame; - DifficultyIcon m_DifficultyIcon[NUM_PLAYERS]; - GrooveRadar m_GrooveRadar; - BitmapText m_textSongOptions; - Sprite m_sprMeterFrame; - FootMeter m_FootMeter[NUM_PLAYERS]; - MusicWheel m_MusicWheel; + Sprite m_sprBannerFrame; + FadingBanner m_Banner; + BPMDisplay m_BPMDisplay; + BitmapText m_textStage; + Sprite m_sprCDTitle; + Sprite m_sprDifficultyFrame; + DifficultyIcon m_DifficultyIcon[NUM_PLAYERS]; + GrooveRadar m_GrooveRadar; + BitmapText m_textPlayerOptions[NUM_PLAYERS]; + BitmapText m_textSongOptions; + Sprite m_sprMeterFrame; + FootMeter m_FootMeter[NUM_PLAYERS]; + MusicSortDisplay m_MusicSortDisplay; + Sprite m_sprHighScoreFrame[NUM_PLAYERS]; + ScoreDisplayNormal m_HighScore[NUM_PLAYERS]; + MusicWheel m_MusicWheel; - bool m_bMadeChoice; - bool m_bGoToOptions; - BitmapText m_textHoldForOptions; + bool m_bMadeChoice; + bool m_bGoToOptions; + BitmapText m_textHoldForOptions; - RageSoundSample m_soundSelect; - RageSoundSample m_soundChangeNotes; - RageSoundSample m_soundLocked; + RageSoundSample m_soundSelect; + RageSoundSample m_soundChangeNotes; + RageSoundSample m_soundLocked; }; diff --git a/stepmania/src/ScreenSelectStyle.cpp b/stepmania/src/ScreenSelectStyle.cpp index f64f01304f..970444f65d 100644 --- a/stepmania/src/ScreenSelectStyle.cpp +++ b/stepmania/src/ScreenSelectStyle.cpp @@ -19,6 +19,7 @@ #include "ScreenCaution.h" #include "GameConstantsAndTypes.h" #include "PrefsManager.h" +#include "ScreenSelectGroup.h" #include "ScreenSelectDifficulty.h" #include "ScreenSandbox.h" #include "GameManager.h" @@ -27,19 +28,18 @@ #include "GameState.h" -const float ICONS_START_X = SCREEN_LEFT + 60; -const float ICONS_SPACING_X = 76; -const float ICON_Y = SCREEN_TOP + 100; - -const float EXPLANATION_X = SCREEN_RIGHT - 160; -const float EXPLANATION_Y = CENTER_Y-70; - -const float INFO_X = SCREEN_RIGHT - 160; -const float INFO_Y = CENTER_Y+40; - -const float PREVIEW_X = SCREEN_LEFT + 160; -const float PREVIEW_Y = CENTER_Y; +#define ICONS_START_X THEME->GetMetricF("SelectStyle","IconsStartX") +#define ICONS_SPACING_X THEME->GetMetricF("SelectStyle","IconsSpacingX") +#define ICONS_START_Y THEME->GetMetricF("SelectStyle","IconsStartY") +#define ICONS_SPACING_Y THEME->GetMetricF("SelectStyle","IconsSpacingY") +#define EXPLANATION_X THEME->GetMetricF("SelectStyle","ExplanationX") +#define EXPLANATION_Y THEME->GetMetricF("SelectStyle","ExplanationY") +#define INFO_X THEME->GetMetricF("SelectStyle","InfoX") +#define INFO_Y THEME->GetMetricF("SelectStyle","InfoY") +#define PREVIEW_X THEME->GetMetricF("SelectStyle","PreviewX") +#define PREVIEW_Y THEME->GetMetricF("SelectStyle","PreviewY") +#define SKIP_SELECT_DIFFICULTY THEME->GetMetricB("Screens","SkipSelectDifficulty") const ScreenMessage SM_GoToPrevState = ScreenMessage(SM_User + 1); const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User + 2); @@ -49,31 +49,26 @@ ScreenSelectStyle::ScreenSelectStyle() { LOG->Trace( "ScreenSelectStyle::ScreenSelectStyle()" ); - // Reset the current style and game GAMESTATE->m_CurStyle = STYLE_NONE; + GAMESTATE->m_bPlayersCanJoin = true; - - for( int s=0; sm_CurGame ) // games match - m_aPossibleStyles.Add( style ); - } - + GAMEMAN->GetStylesForGame( GAMESTATE->m_CurGame, m_aPossibleStyles ); m_iSelection = 0; for( int i=0; iGetPathTo(GRAPHIC_SELECT_STYLE_ICONS) ); + m_sprIcon[i].Load( THEME->GetPathTo("Graphics","select style icons") ); m_sprIcon[i].StopAnimating(); m_sprIcon[i].SetState( i ); - m_sprIcon[i].SetXY( ICONS_START_X + ICONS_SPACING_X*i, ICON_Y ); + m_sprIcon[i].SetXY( ICONS_START_X + i*ICONS_SPACING_X, ICONS_START_Y + i*ICONS_SPACING_Y ); this->AddSubActor( &m_sprIcon[i] ); } - m_sprExplanation.Load( THEME->GetPathTo(GRAPHIC_SELECT_STYLE_EXPLANATION) ); + UpdateEnabledDisabled(); + + m_sprExplanation.Load( THEME->GetPathTo("Graphics","select style explanation") ); m_sprExplanation.SetXY( EXPLANATION_X, EXPLANATION_Y ); this->AddSubActor( &m_sprExplanation ); @@ -87,35 +82,30 @@ ScreenSelectStyle::ScreenSelectStyle() // Load dummy Sprites for( i=0; iGetPathTo(te) ); - - te = (ThemeElement)(GRAPHIC_SELECT_STYLE_INFO_0+i); - m_sprDummyInfo[i].Load( THEME->GetPathTo(te) ); + m_sprDummyPreview[i].Load( THEME->GetPathTo("Graphics",ssprintf("select style preview game %d style %d",GAMESTATE->m_CurGame,i)) ); + m_sprDummyInfo[i].Load( THEME->GetPathTo("Graphics",ssprintf("select style info game %d style %d",GAMESTATE->m_CurGame,i)) ); } m_Menu.Load( - THEME->GetPathTo(GRAPHIC_SELECT_STYLE_BACKGROUND), - THEME->GetPathTo(GRAPHIC_SELECT_STYLE_TOP_EDGE), + THEME->GetPathTo("Graphics","select style background"), + THEME->GetPathTo("Graphics","select style top edge"), ssprintf("Use %c %c to select, then press START", char(1), char(2) ), false, true, 40 ); this->AddSubActor( &m_Menu ); - m_soundChange.Load( THEME->GetPathTo(SOUND_SELECT_STYLE_CHANGE) ); - m_soundSelect.Load( THEME->GetPathTo(SOUND_MENU_START) ); + m_soundChange.Load( THEME->GetPathTo("Sounds","select style change") ); + m_soundSelect.Load( THEME->GetPathTo("Sounds","menu start") ); SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_SELECT_STYLE_INTRO) ); - if( !MUSIC->IsPlaying() ) + if( !MUSIC->IsPlaying() || MUSIC->GetLoadedFilePath() != THEME->GetPathTo("Sounds","select style music") ) { - MUSIC->Load( THEME->GetPathTo(SOUND_MENU_MUSIC) ); - MUSIC->Play( true ); + MUSIC->Load( THEME->GetPathTo("Sounds","select style music") ); + MUSIC->Play( true ); } AfterChange(); @@ -160,7 +150,10 @@ void ScreenSelectStyle::HandleScreenMessage( const ScreenMessage SM ) SCREENMAN->SetNewScreen( new ScreenTitleMenu ); break; case SM_GoToNextState: - SCREENMAN->SetNewScreen( new ScreenSelectDifficulty ); + if( SKIP_SELECT_DIFFICULTY ) + SCREENMAN->SetNewScreen( new ScreenSelectGroup ); + else + SCREENMAN->SetNewScreen( new ScreenSelectDifficulty ); break; } } @@ -174,11 +167,8 @@ void ScreenSelectStyle::AfterChange() { m_sprIcon[m_iSelection].SetEffectGlowing(); - ThemeElement te; - // Tween Preview - te = (ThemeElement)(GRAPHIC_SELECT_STYLE_PREVIEW_0+m_iSelection); - m_sprPreview.Load( THEME->GetPathTo(te) ); + m_sprPreview.Load( THEME->GetPathTo("Graphics",ssprintf("select style preview game %d style %d",GAMESTATE->m_CurGame,m_iSelection)) ); m_sprPreview.StopTweening(); m_sprPreview.SetAddColor( D3DXCOLOR(1,1,1,0) ); @@ -199,8 +189,7 @@ void ScreenSelectStyle::AfterChange() // Tween Info - te = (ThemeElement)(GRAPHIC_SELECT_STYLE_INFO_0+m_iSelection); - m_sprInfo.Load( THEME->GetPathTo(te) ); + m_sprInfo.Load( THEME->GetPathTo("Graphics",ssprintf("select style info game %d style %d",GAMESTATE->m_CurGame,m_iSelection)) ); m_sprInfo.StopTweening(); m_sprInfo.SetZoomY( 0 ); m_sprInfo.BeginTweeningQueued( 0.5f, Actor::TWEEN_BOUNCE_END ); @@ -209,11 +198,22 @@ void ScreenSelectStyle::AfterChange() void ScreenSelectStyle::MenuLeft( const PlayerNumber p ) { - if( m_iSelection == 0 ) // can't go left any further + // search for a style to the left of the current selection that is enabled + int iSwitchToStyleIndex = -1; // -1 means none found + for( int i=m_iSelection-1; i>=0; i-- ) + { + if( IsEnabled(i) ) + { + iSwitchToStyleIndex = i; + break; + } + } + + if( iSwitchToStyleIndex == -1 ) return; BeforeChange(); - m_iSelection--; + m_iSelection = iSwitchToStyleIndex; m_soundChange.PlayRandom(); AfterChange(); } @@ -221,19 +221,37 @@ void ScreenSelectStyle::MenuLeft( const PlayerNumber p ) void ScreenSelectStyle::MenuRight( const PlayerNumber p ) { - if( m_iSelection == m_aPossibleStyles.GetSize()-1 ) // can't go right any further + // search for a style to the right of the current selection that is enabled + int iSwitchToStyleIndex = -1; // -1 means none found + for( int i=m_iSelection+1; im_MasterPlayerNumber = p; + if( p!=PLAYER_INVALID && !GAMESTATE->m_bIsJoined[p] ) + { + SOUND->PlayOnceStreamed( THEME->GetPathTo("Sounds","menu start") ); + GAMESTATE->m_bIsJoined[p] = true; + SCREENMAN->RefreshCreditsMessages(); + UpdateEnabledDisabled(); + return; // don't fall through + } + GAMESTATE->m_CurStyle = GetSelectedStyle(); AnnouncerElement ae; @@ -319,3 +337,51 @@ void ScreenSelectStyle::TweenOnScreen() m_sprInfo.SetTweenZoomY( fOriginalZoom ); */ } + +bool ScreenSelectStyle::IsEnabled( int iStyleIndex ) +{ + Style style = m_aPossibleStyles[iStyleIndex]; + + int iNumSidesJoined = 0; + for( int c=0; c<2; c++ ) + if( GAMESTATE->m_bIsJoined[c] ) + iNumSidesJoined++; // left side, and right side + + switch( GAMEMAN->GetStyleDefForStyle(style)->m_StyleType ) + { + case StyleDef::ONE_PLAYER_ONE_CREDIT: return iNumSidesJoined==1; + case StyleDef::ONE_PLAYER_TWO_CREDITS: return iNumSidesJoined==2; + case StyleDef::TWO_PLAYERS_TWO_CREDITS: return iNumSidesJoined==2; + default: ASSERT(0); return false; + } +} + +void ScreenSelectStyle::UpdateEnabledDisabled() +{ + int i; + for( i=0; iGetPathTo(GRAPHIC_SONG_OPTIONS_BACKGROUND), - THEME->GetPathTo(GRAPHIC_SONG_OPTIONS_TOP_EDGE) + THEME->GetPathTo("Graphics","song options background"), + THEME->GetPathTo("Graphics","song options page"), + THEME->GetPathTo("Graphics","song options top edge") ) { LOG->Trace( "ScreenSongOptions::ScreenSongOptions()" ); diff --git a/stepmania/src/ScreenStage.cpp b/stepmania/src/ScreenStage.cpp index d5b890c4d4..95ce77d216 100644 --- a/stepmania/src/ScreenStage.cpp +++ b/stepmania/src/ScreenStage.cpp @@ -31,6 +31,15 @@ const ScreenMessage SM_StartFadingOut = ScreenMessage(SM_User + 1); const ScreenMessage SM_DoneFadingIn = ScreenMessage(SM_User + 2); const ScreenMessage SM_GoToNextState = ScreenMessage(SM_User + 3); +enum StageType +{ + TYPE_NORMAL, + TYPE_FINAL, + TYPE_EXTRA1, + TYPE_EXTRA2, + TYPE_ONI, + TYPE_ENDLESS +}; ScreenStage::ScreenStage() { @@ -38,79 +47,174 @@ ScreenStage::ScreenStage() m_pNextScreen = NULL; - m_textStage.Load( THEME->GetPathTo(FONT_STAGE) ); - m_textStage.TurnShadowOff(); - if( GAMESTATE->m_PlayMode == PLAY_MODE_ONI ) + for( int i=0; i<4; i++ ) { - m_textStage.SetText( "Nonstop Challenge" ); - m_textStage.SetDiffuseColor( D3DXCOLOR(0.8f,0.8f,1,1) ); // light blue - SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_ONI) ); + m_sprNumbers[i].Load( THEME->GetPathTo("Graphics","stage numbers") ); + m_sprNumbers[i].StopAnimating(); } - else if( GAMESTATE->m_PlayMode == PLAY_MODE_ENDLESS ) - { - m_textStage.SetText( "Endless Challenge" ); - m_textStage.SetDiffuseColor( D3DXCOLOR(0.8f,0.8f,1,1) ); // light blue - SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_ENDLESS) ); - } - else if( GAMESTATE->IsExtraStage() ) - { - m_textStage.SetText( "Extra Stage" ); - m_textStage.SetDiffuseColor( D3DXCOLOR(1,0.1f,0.1f,1) ); // red - SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_EXTRA) ); - } - else if( GAMESTATE->IsExtraStage2() ) - { - m_textStage.SetText( "Another Extra Stage" ); // red - m_textStage.SetDiffuseColor( D3DXCOLOR(1,0.1f,0.1f,1) ); - SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_ANOTHER_EXTRA) ); - } - else if( GAMESTATE->IsFinalStage() ) - { - m_textStage.SetText( "Final Stage" ); - m_textStage.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); - SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_FINAL) ); - } - else - { - m_textStage.SetText( GAMESTATE->GetStageText() + " Stage" ); - m_textStage.SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); + m_sprStage.Load( THEME->GetPathTo("Graphics","stage stage") ); // we may load a different graphic into here later + const float fStageHeight = m_sprStage.GetUnzoomedHeight(); - const int iStageNo = GAMESTATE->GetStageIndex()+1; - switch( iStageNo ) + const float fStageOffScreenY = CENTER_Y+fStageHeight; + + m_quadMask.SetDiffuseColor( D3DXCOLOR(0,0,0,0) ); + m_quadMask.StretchTo( CRect(SCREEN_LEFT, roundf(fStageOffScreenY-fStageHeight/2), SCREEN_RIGHT, roundf(fStageOffScreenY+fStageHeight/2)) ); + m_quadMask.SetZ( -1 ); // important: fill Z buffer with values that will cause subsequent draws to fail the Z test + + m_frameStage.SetXY( CENTER_X, fStageOffScreenY ); + m_frameStage.BeginTweening(0.8f, Actor::TWEEN_BIAS_BEGIN ); + m_frameStage.SetTweenY( CENTER_Y ); + + + StageType stage_type; + if( GAMESTATE->m_PlayMode == PLAY_MODE_ONI ) stage_type = TYPE_ONI; + else if( GAMESTATE->m_PlayMode == PLAY_MODE_ENDLESS ) stage_type = TYPE_ENDLESS; + else if( GAMESTATE->IsExtraStage() ) stage_type = TYPE_EXTRA1; + else if( GAMESTATE->IsExtraStage2() ) stage_type = TYPE_EXTRA2; + else if( GAMESTATE->IsFinalStage() ) stage_type = TYPE_FINAL; + else stage_type = TYPE_NORMAL; + + + switch( stage_type ) + { + case TYPE_NORMAL: { - case 1: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_1) ); break; - case 2: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_2) ); break; - case 3: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_3) ); break; - case 4: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_4) ); break; - case 5: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_5) ); break; - default: ; break; // play nothing + const int iStageNo = GAMESTATE->GetStageIndex()+1; + switch( iStageNo ) + { + case 1: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_1) ); break; + case 2: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_2) ); break; + case 3: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_3) ); break; + case 4: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_4) ); break; + case 5: SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_5) ); break; + default: ; break; // play nothing + } } + break; + case TYPE_FINAL: + SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_FINAL) ); + break; + case TYPE_EXTRA1: + SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_EXTRA1) ); + break; + case TYPE_EXTRA2: + SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_EXTRA2) ); + break; + case TYPE_ONI: + SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_ONI) ); + break; + case TYPE_ENDLESS: + SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_STAGE_ENDLESS) ); + break; + default: + ASSERT(0); } + switch( stage_type ) + { + case TYPE_NORMAL: + { + const int iStageNo = GAMESTATE->GetStageIndex()+1; + CString sStageNo = ssprintf("%d", iStageNo); - m_textStage.SetXY( CENTER_X, CENTER_Y ); - m_textStage.SetZoomX( 2 ); - m_textStage.SetZoomY( 0 ); - m_textStage.SetDiffuseColor( D3DXCOLOR(0,0,0,1) ); - m_textStage.BeginTweening( 0.5f ); - m_textStage.SetTweenZoom( 2 ); - m_textStage.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,1) ); - this->AddSubActor( &m_textStage ); + // Set frame of numbers + int i; + for( i=0; iSendScreenMessage( SM_DoneFadingIn, 0.6f ); + // Set frame of suffix + int iIndexOfSuffix = sStageNo.GetLength(); + if( ( (iStageNo/10) % 10 ) == 1 ) // in the teens (e.g. 19, 213) + m_sprNumbers[iIndexOfSuffix].SetState( 13 ); // th + else // not in the teens + { + const int iLastDigit = iStageNo%10; + switch( iLastDigit ) + { + case 1: m_sprNumbers[iIndexOfSuffix].SetState( 10 ); break; // st + case 2: m_sprNumbers[iIndexOfSuffix].SetState( 11 ); break; // nd + case 3: m_sprNumbers[iIndexOfSuffix].SetState( 12 ); break; // rd + default: m_sprNumbers[iIndexOfSuffix].SetState( 13 ); break; // th + } + } + + // Set X positions + const float fFrameWidth = m_sprNumbers[0].GetUnzoomedWidth(); + const int iNumChars = iIndexOfSuffix+1; + const float fTotalCharsWidth = m_sprNumbers[0].GetUnzoomedWidth(); + const float fSpaceBetweenNumsAndStage = fFrameWidth; + const float fStageWidth = m_sprStage.GetUnzoomedWidth(); + const float fTotalWidth = fTotalCharsWidth + fSpaceBetweenNumsAndStage + fStageWidth; + const float fCharsCenterX = -fTotalWidth/2.0f + fTotalCharsWidth/2.0f; + const float fStageCenterX = +fTotalWidth/2.0f - fStageWidth/2.0f; + + for( i=0; iGetPathTo("Graphics","stage final") ); + m_frameStage.AddSubActor( &m_sprStage ); + break; + case TYPE_EXTRA1: + m_sprStage.Load( THEME->GetPathTo("Graphics","stage extra1") ); + m_frameStage.AddSubActor( &m_sprStage ); + break; + case TYPE_EXTRA2: + m_sprStage.Load( THEME->GetPathTo("Graphics","stage extra2") ); + m_frameStage.AddSubActor( &m_sprStage ); + break; + case TYPE_ONI: + m_sprStage.Load( THEME->GetPathTo("Graphics","stage oni") ); + m_frameStage.AddSubActor( &m_sprStage ); + break; + case TYPE_ENDLESS: + m_sprStage.Load( THEME->GetPathTo("Graphics","stage endless") ); + m_frameStage.AddSubActor( &m_sprStage ); + break; + default: + ASSERT(0); + } + + m_Fade.SetOpened(); + + this->SendScreenMessage( SM_DoneFadingIn, 1.0f ); this->SendScreenMessage( SM_StartFadingOut, 1.2f ); } +void ScreenStage::Update( float fDeltaTime ) +{ + Screen::Update( fDeltaTime ); + + m_quadMask.Update( fDeltaTime ); + m_frameStage.Update( fDeltaTime ); + m_Fade.Update( fDeltaTime ); +} + +void ScreenStage::DrawPrimitives() +{ + DISPLAY->EnableZBuffer(); + m_quadMask.Draw(); + m_frameStage.Draw(); + DISPLAY->DisableZBuffer(); + m_Fade.Draw(); +} void ScreenStage::HandleScreenMessage( const ScreenMessage SM ) { switch( SM ) { case SM_StartFadingOut: - m_textStage.BeginTweening( 0.8f ); - m_textStage.SetTweenDiffuseColor( D3DXCOLOR(1,1,1,0) ); - this->SendScreenMessage( SM_GoToNextState, 0.8f ); + m_Fade.CloseWipingRight( SM_GoToNextState ); break; case SM_DoneFadingIn: m_pNextScreen = new ScreenGameplay; @@ -120,4 +224,3 @@ void ScreenStage::HandleScreenMessage( const ScreenMessage SM ) break; } } - diff --git a/stepmania/src/ScreenStage.h b/stepmania/src/ScreenStage.h index a472eeecbf..b1c7b3af5c 100644 --- a/stepmania/src/ScreenStage.h +++ b/stepmania/src/ScreenStage.h @@ -10,7 +10,9 @@ */ #include "Screen.h" -#include "BitmapText.h" +#include "ActorFrame.h" +#include "Actor.h" +#include "TransitionFade.h" class ScreenStage : public Screen @@ -18,12 +20,20 @@ class ScreenStage : public Screen public: ScreenStage(); + virtual void Update( float fDeltaTime ); + virtual void DrawPrimitives(); virtual void HandleScreenMessage( const ScreenMessage SM ); private: - bool m_bTryExtraStage; - BitmapText m_textStage; + ActorFrame m_frameStage; + Sprite m_sprNumbers[4]; // up to 3 numbers and suffix + Sprite m_sprStage; // "Stage" + + Quad m_quadMask; // write this into ZBuffer as a mask + + TransitionFade m_Fade; + Screen* m_pNextScreen; }; diff --git a/stepmania/src/ScreenTitleMenu.cpp b/stepmania/src/ScreenTitleMenu.cpp index fde87915b2..1768511085 100644 --- a/stepmania/src/ScreenTitleMenu.cpp +++ b/stepmania/src/ScreenTitleMenu.cpp @@ -14,6 +14,7 @@ #include "ScreenManager.h" #include "ScreenCaution.h" #include "ScreenMapInstruments.h" +#include "ScreenGraphicOptions.h" #include "ScreenGameOptions.h" #include "ScreenEdit.h" #include "GameConstantsAndTypes.h" @@ -33,38 +34,36 @@ #include "ScreenGameplay.h" -// -// Defines specific to ScreenTitleMenu -// - const CString CHOICE_TEXT[ScreenTitleMenu::NUM_TITLE_MENU_CHOICES] = { "GAME START", "SWITCH GAME", "CONFIG KEY/JOY", "GAME OPTIONS", + "GRAPHIC OPTIONS", "APPEARANCE OPTIONS", "EDIT/RECORD/SYNCH", "EXIT", }; -const float CHOICES_START_Y = 62; -const float CHOICES_GAP_Y = 52; +#define CHOICES_X THEME->GetMetricF("TitleMenu","ChoicesX") +#define CHOICES_START_Y THEME->GetMetricF("TitleMenu","ChoicesStartY") +#define CHOICES_SPACING_Y THEME->GetMetricF("TitleMenu","ChoicesSpacingY") +#define HELP_X THEME->GetMetricF("TitleMenu","HelpX") +#define HELP_Y THEME->GetMetricF("TitleMenu","HelpY") +#define LOGO_X THEME->GetMetricF("TitleMenu","LogoX") +#define LOGO_Y THEME->GetMetricF("TitleMenu","LogoY") +#define VERSION_X THEME->GetMetricF("TitleMenu","VersionX") +#define VERSION_Y THEME->GetMetricF("TitleMenu","VersionY") +#define SONGS_X THEME->GetMetricF("TitleMenu","SongsX") +#define SONGS_Y THEME->GetMetricF("TitleMenu","SongsY") +#define COLOR_NOT_SELECTED THEME->GetMetricC("TitleMenu","ColorNotSelected") +#define COLOR_SELECTED THEME->GetMetricC("TitleMenu","ColorSelected") -const float HELP_X = CENTER_X; -const float HELP_Y = SCREEN_HEIGHT-55; +#define USE_CAUTION_OR_SELECT_PLAYER THEME->GetMetricB("Screens","UseCautionOrSelectPlayer") -//const CString EZ2_ANNOUNCER_NAME = "ez2"; const ScreenMessage SM_PlayAttract = ScreenMessage(SM_User+1); -const ScreenMessage SM_GoToCaution = ScreenMessage(SM_User+2); -const ScreenMessage SM_GoToSelectStyle = ScreenMessage(SM_User+3); -const ScreenMessage SM_GoToSelectGame = ScreenMessage(SM_User+4); -const ScreenMessage SM_GoToMapInstruments = ScreenMessage(SM_User+5); -const ScreenMessage SM_GoToGameOptions = ScreenMessage(SM_User+6); -const ScreenMessage SM_GoToAppearanceOptions= ScreenMessage(SM_User+7); -const ScreenMessage SM_GoToEdit = ScreenMessage(SM_User+10); -const ScreenMessage SM_DoneOpening = ScreenMessage(SM_User+11); -const ScreenMessage SM_GoToEz2 = ScreenMessage(SM_User+12); +const ScreenMessage SM_GoToNextScreen = ScreenMessage(SM_User+12); const ScreenMessage SM_FadeToDemonstration = ScreenMessage(SM_User+13); const ScreenMessage SM_GoToDemonstration = ScreenMessage(SM_User+14); @@ -82,130 +81,73 @@ ScreenTitleMenu::ScreenTitleMenu() GAMESTATE->Reset(); PREFSMAN->ReadGamePrefsFromDisk(); INPUTMAPPER->ReadMappingsFromDisk(); + GAMESTATE->m_bPlayersCanJoin = true; - m_sprBG.Load( THEME->GetPathTo(GRAPHIC_TITLE_MENU_BACKGROUND) ); + m_sprBG.Load( THEME->GetPathTo("Graphics","title menu background") ); m_sprBG.StretchTo( CRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT) ); - m_sprBG.SetDiffuseColor( D3DXCOLOR(0.6f,0.6f,0.6f,1) ); - m_sprBG.TurnShadowOff(); this->AddSubActor( &m_sprBG ); - m_sprLogo.Load( THEME->GetPathTo(GRAPHIC_TITLE_MENU_LOGO) ); - m_sprLogo.SetXY( CENTER_X, CENTER_Y ); + m_sprLogo.Load( THEME->GetPathTo("Graphics",ssprintf("title menu logo game %d",GAMESTATE->m_CurGame)) ); + m_sprLogo.SetXY( LOGO_X, LOGO_Y ); m_sprLogo.SetAddColor( D3DXCOLOR(1,1,1,1) ); m_sprLogo.SetZoomY( 0 ); - m_sprLogo.BeginTweeningQueued( 0.5f ); + m_sprLogo.BeginTweeningQueued( 0.5f ); // sleep m_sprLogo.BeginTweeningQueued( 0.5f, Actor::TWEEN_BOUNCE_END ); m_sprLogo.SetEffectGlowing(1, D3DXCOLOR(1,1,1,0.1f), D3DXCOLOR(1,1,1,0.3f) ); m_sprLogo.SetTweenZoom( 1 ); this->AddSubActor( &m_sprLogo ); - m_textHelp.Load( THEME->GetPathTo(FONT_NORMAL) ); + m_textHelp.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textHelp.SetText( ssprintf("Use %c %c to select, then press START", char(3), char(4)) ); - m_textHelp.SetXY( CENTER_X, SCREEN_BOTTOM - 30 ); + m_textHelp.SetXY( HELP_X, HELP_Y ); m_textHelp.SetZoom( 0.5f ); m_textHelp.SetEffectBlinking(); m_textHelp.SetShadowLength( 2 ); this->AddSubActor( &m_textHelp ); - m_textVersion.Load( THEME->GetPathTo(FONT_NORMAL) ); - m_textVersion.SetHorizAlign( Actor::align_right ); - m_textVersion.SetText( "v3.0 beta 5" ); + m_textVersion.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); + m_textVersion.SetText( "v3.0 beta 6" ); m_textVersion.SetDiffuseColor( D3DXCOLOR(0.6f,0.6f,0.6f,1) ); // light gray - m_textVersion.SetXY( SCREEN_RIGHT-16, SCREEN_BOTTOM-20 ); + m_textVersion.SetXY( VERSION_X, VERSION_Y ); m_textVersion.SetZoom( 0.5f ); + m_textVersion.SetShadowLength( 2 ); this->AddSubActor( &m_textVersion ); - m_textSongs.Load( THEME->GetPathTo(FONT_NORMAL) ); + m_textSongs.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textSongs.SetHorizAlign( Actor::align_left ); m_textSongs.SetText( ssprintf("Found %d Songs", SONGMAN->m_pSongs.GetSize()) ); m_textSongs.SetDiffuseColor( D3DXCOLOR(0.6f,0.6f,0.6f,1) ); // light gray - m_textSongs.SetXY( SCREEN_LEFT+16, SCREEN_HEIGHT-20 ); + m_textSongs.SetXY( SONGS_X, SONGS_Y ); m_textSongs.SetZoom( 0.5f ); + m_textSongs.SetShadowLength( 2 ); this->AddSubActor( &m_textSongs ); for( int i=0; i< NUM_TITLE_MENU_CHOICES; i++ ) { - m_textChoice[i].Load( THEME->GetPathTo(FONT_HEADER1) ); + m_textChoice[i].LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textChoice[i].SetText( CHOICE_TEXT[i] ); - m_textChoice[i].SetXY( CENTER_X, CHOICES_START_Y + i*CHOICES_GAP_Y ); + m_textChoice[i].SetXY( CHOICES_X, CHOICES_START_Y + i*CHOICES_SPACING_Y ); m_textChoice[i].SetShadowLength( 5 ); this->AddSubActor( &m_textChoice[i] ); } m_Fade.SetClosed(); - m_Fade.OpenWipingRight( SM_DoneOpening ); + m_Fade.OpenWipingRight( SM_None ); this->AddSubActor( &m_Fade ); - /* - - // Chris: - // I'm removing this now that announcer prefs are saved per Game. - - // LEAVE THIS HERE! ITS ESSENTIAL - // I know you're a fan of removing my code, but if this isn't here - // the Ez2dancer announcer will be the default (as it loads in alphabetical order, and ez2dancer - // is the last announcer (E follows D)) - // so just leave it yeah? - // I don't wanna fix this a 3rd TIME!! - // - Andy. - - if( GAMESTATE->m_CurGame != GAME_EZ2 ) - PREFSMAN->m_sAnnouncer = ""; - - - // if (GAMEMAN->m_CurGame != GAME_EZ2) - //{ - // ANNOUNCER->SwitchAnnouncer( "default" ); - //} - - // Dear Andy: - // The above code breaks the program by making the announcer unswitchable. - // This is probably the wrong place for such a code change anyway. - // Cheers - // -- dro kulix - - // Dear dro kulix: - // Good call, actually, I made this change when announcer switching wasn't possible. - // or rather, announcer switching WASN'T possible from the title menu (it used to be - // in song options) - // but since it is now changed before we get here, - // care needs to be taken to ensure the player can still switch. - - // However, your commenting code is still not that brill either ;) Brings back the first bug - // (if we last played ez2dancer and then came back into the game ez2dancer - // default announcer loads for DDR). However, here's a different approach for you. - - // If we start the game and find that we're playing something other than ez2dancer AND - // the current announcer is ez2 then we change it to the default announcer and specify announcer - // check as 1. This'll stay like this for the rest of the program, meaning should they - // REALLY want to play ez2dancer sounds during a game of DDR, they're free to do so. - // It just really bugs me when I see "SMMAX" and the sound "EZ2DANCER!" blares through my speakers ;) - - // When other gametypes are implemented, this may or may not have to be extended to ensure we - // don't hear "YEAH! I KNOW YOU CAN!" for pump or "AVEX AND KONAMI UNITE IN YOUR DANCE" for para e.t.c. - - static int announcercheck=0; - - if( GAMESTATE->m_CurGame != GAME_EZ2 && PREFSMAN->m_sAnnouncer == "ez2" && announcercheck == 0) - { - ANNOUNCER->SwitchAnnouncer( "default" ); - announcercheck = 1; - } - - */ SOUND->PlayOnceStreamedFromDir( ANNOUNCER->GetPathTo(ANNOUNCER_TITLE_MENU_GAME_NAME) ); m_soundAttract.Load( ANNOUNCER->GetPathTo(ANNOUNCER_TITLE_MENU_ATTRACT) ); - m_soundChange.Load( THEME->GetPathTo(SOUND_TITLE_MENU_CHANGE) ); - m_soundSelect.Load( THEME->GetPathTo(SOUND_MENU_START) ); - m_soundInvalid.Load( THEME->GetPathTo(SOUND_MENU_INVALID) ); + 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_TitleMenuChoice = CHOICE_GAME_START; @@ -242,31 +184,38 @@ void ScreenTitleMenu::HandleScreenMessage( const ScreenMessage SM ) case SM_PlayAttract: m_soundAttract.PlayRandom(); break; - case SM_DoneOpening: - break; - case SM_GoToCaution: - SCREENMAN->SetNewScreen( new ScreenCaution ); - break; - case SM_GoToSelectStyle: - SCREENMAN->SetNewScreen( new ScreenSelectStyle ); - break; - case SM_GoToSelectGame: - SCREENMAN->SetNewScreen( new ScreenSelectGame ); - break; - case SM_GoToMapInstruments: - SCREENMAN->SetNewScreen( new ScreenMapInstruments ); - break; - case SM_GoToGameOptions: - SCREENMAN->SetNewScreen( new ScreenGameOptions ); - break; - case SM_GoToAppearanceOptions: - SCREENMAN->SetNewScreen( new ScreenAppearanceOptions ); - break; - case SM_GoToEdit: - SCREENMAN->SetNewScreen( new ScreenEditMenu ); - break; - case SM_GoToEz2: - SCREENMAN->SetNewScreen( new ScreenEz2SelectPlayer ); + case SM_GoToNextScreen: + switch( m_TitleMenuChoice ) + { + case CHOICE_GAME_START: + if( USE_CAUTION_OR_SELECT_PLAYER ) + SCREENMAN->SetNewScreen( new ScreenEz2SelectPlayer ); + else + SCREENMAN->SetNewScreen( new ScreenCaution ); + break; + case CHOICE_SELECT_GAME: + SCREENMAN->SetNewScreen( new ScreenSelectGame ); + break; + case CHOICE_MAP_INSTRUMENTS: + SCREENMAN->SetNewScreen( new ScreenMapInstruments ); + break; + case CHOICE_GAME_OPTIONS: + SCREENMAN->SetNewScreen( new ScreenGameOptions ); + break; + case CHOICE_GRAPHIC_OPTIONS: + SCREENMAN->SetNewScreen( new ScreenGraphicOptions ); + break; + case CHOICE_APPEARANCE_OPTIONS: + SCREENMAN->SetNewScreen( new ScreenAppearanceOptions ); + break; + case CHOICE_EDIT: + SCREENMAN->SetNewScreen( new ScreenEditMenu ); + break; + case CHOICE_EXIT: + default: + ASSERT(0); // should never get here + break; + } break; case SM_FadeToDemonstration: { @@ -293,6 +242,9 @@ void ScreenTitleMenu::HandleScreenMessage( const ScreenMessage SM ) Song* pSong = SONGMAN->m_pSongs[ rand()%SONGMAN->m_pSongs.GetSize() ]; for( int j=0; j<3; j++ ) // try 3 times { + if( pSong->m_apNotes.GetSize() == 0 ) + continue; + Notes* pNotes = pSong->m_apNotes[ rand()%pSong->m_apNotes.GetSize() ]; if( pNotes->m_NotesType == GAMESTATE->GetCurrentStyleDef()->m_NotesType ) { @@ -327,13 +279,14 @@ found_song_and_notes: GAMESTATE->m_PlayerOptions[p].m_AppearanceType = PlayerOptions::APPEARANCE_HIDDEN; if( RandomFloat(0,1)>0.9f ) GAMESTATE->m_PlayerOptions[p].m_AppearanceType = PlayerOptions::APPEARANCE_SUDDEN; - if( RandomFloat(0,1)>0.8f ) + if( RandomFloat(0,1)>0.7f ) GAMESTATE->m_PlayerOptions[p].m_bReverseScroll = true; if( RandomFloat(0,1)>0.9f ) GAMESTATE->m_PlayerOptions[p].m_bDark = true; } } GAMESTATE->m_SongOptions.m_LifeType = SongOptions::LifeType(rand()%SongOptions::NUM_LIFE_TYPES); + GAMESTATE->m_SongOptions.m_FailType = SongOptions::FAIL_OFF; GAMESTATE->m_bDemonstration = true; m_Fade.CloseWipingRight( SM_GoToDemonstration ); @@ -354,8 +307,6 @@ void ScreenTitleMenu::LoseFocus( int iChoiceIndex ) m_soundChange.PlayRandom(); m_textChoice[iChoiceIndex].SetEffectNone(); - m_textChoice[iChoiceIndex].SetAddColor( D3DXCOLOR(0,0,0,0) ); - m_textChoice[iChoiceIndex].SetDiffuseColor( D3DXCOLOR(1,1,1,1) ); m_textChoice[iChoiceIndex].BeginTweening( 0.3f ); m_textChoice[iChoiceIndex].SetTweenZoom( 0.9f ); @@ -363,10 +314,13 @@ void ScreenTitleMenu::LoseFocus( int iChoiceIndex ) void ScreenTitleMenu::GainFocus( int iChoiceIndex ) { - m_textChoice[iChoiceIndex].SetDiffuseColor( D3DXCOLOR(0.5f,1,0.5f,1) ); m_textChoice[iChoiceIndex].BeginTweening( 0.3f ); m_textChoice[iChoiceIndex].SetTweenZoom( 1.2f ); - m_textChoice[iChoiceIndex].SetEffectCamelion( 2.5f, D3DXCOLOR(0.5f,1,0.5f,1), D3DXCOLOR(0.3f,0.6f,0.3f,1) ); + D3DXCOLOR color1, color2; + color1 = COLOR_SELECTED; + color2 = color1 * 0.5f; + color2.a = 1; + m_textChoice[iChoiceIndex].SetEffectCamelion( 2.5f, color1, color2 ); } void ScreenTitleMenu::MenuUp( const PlayerNumber p ) @@ -397,39 +351,22 @@ void ScreenTitleMenu::MenuDown( const PlayerNumber p ) void ScreenTitleMenu::MenuStart( const PlayerNumber p ) { - GAMESTATE->m_MasterPlayerNumber = p; + GAMESTATE->m_bIsJoined[p] = true; + + GAMESTATE->m_bPlayersCanJoin = false; + switch( m_TitleMenuChoice ) { case CHOICE_GAME_START: - if( GAMESTATE->m_CurGame == GAME_EZ2 ) - { - m_soundSelect.PlayRandom(); - m_Fade.CloseWipingRight( SM_GoToEz2 ); - } - else - { - m_soundSelect.PlayRandom(); - m_Fade.CloseWipingRight( SM_GoToCaution ); - } - return; case CHOICE_SELECT_GAME: - // m_soundInvalid.PlayRandom(); - m_soundSelect.PlayRandom(); - m_Fade.CloseWipingRight( SM_GoToSelectGame ); - return; case CHOICE_MAP_INSTRUMENTS: - m_soundSelect.PlayRandom(); - m_Fade.CloseWipingRight( SM_GoToMapInstruments ); - return; case CHOICE_GAME_OPTIONS: - m_soundSelect.PlayRandom(); - m_Fade.CloseWipingRight( SM_GoToGameOptions ); - return; + case CHOICE_GRAPHIC_OPTIONS: case CHOICE_APPEARANCE_OPTIONS: m_soundSelect.PlayRandom(); - m_Fade.CloseWipingRight( SM_GoToAppearanceOptions ); - return; + m_Fade.CloseWipingRight( SM_GoToNextScreen ); + break; case CHOICE_EDIT: if( SONGMAN->m_pSongs.GetSize() == 0 ) { @@ -438,9 +375,9 @@ void ScreenTitleMenu::MenuStart( const PlayerNumber p ) else { m_soundSelect.PlayRandom(); - m_Fade.CloseWipingRight( SM_GoToEdit ); + m_Fade.CloseWipingRight( SM_GoToNextScreen ); } - return; + break; /* case CHOICE_HELP: m_soundSelect.PlayRandom(); PREFSMAN->m_bWindowed = false; @@ -465,6 +402,6 @@ void ScreenTitleMenu::MenuStart( const PlayerNumber p ) void ScreenTitleMenu::MenuBack( const PlayerNumber p ) { - //m_Fade.CloseWipingLeft( SM_GoToIntroCovers ); + this->SendScreenMessage( SM_FadeToDemonstration, 0 ); } diff --git a/stepmania/src/ScreenTitleMenu.h b/stepmania/src/ScreenTitleMenu.h index 8066f83128..646ab838e7 100644 --- a/stepmania/src/ScreenTitleMenu.h +++ b/stepmania/src/ScreenTitleMenu.h @@ -11,7 +11,6 @@ #include "Screen.h" #include "Sprite.h" -#include "ColorNote.h" #include "BitmapText.h" #include "TransitionFade.h" #include "RandomSample.h" @@ -33,6 +32,7 @@ public: CHOICE_SELECT_GAME, CHOICE_MAP_INSTRUMENTS, CHOICE_GAME_OPTIONS, + CHOICE_GRAPHIC_OPTIONS, CHOICE_APPEARANCE_OPTIONS, CHOICE_EDIT, CHOICE_EXIT, diff --git a/stepmania/src/ScrollBar.cpp b/stepmania/src/ScrollBar.cpp index e91fac5df7..4bbde20ab9 100644 --- a/stepmania/src/ScrollBar.cpp +++ b/stepmania/src/ScrollBar.cpp @@ -19,25 +19,25 @@ const float BAR_HEIGHT = 376; ScrollBar::ScrollBar() { - m_sprBackground.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SCROLLBAR) ); + m_sprBackground.Load( THEME->GetPathTo("Graphics","select music scrollbar") ); m_sprBackground.StopAnimating(); m_sprBackground.SetState( 1 ); m_sprBackground.SetZoomY( BAR_HEIGHT/m_sprBackground.GetUnzoomedHeight() ); this->AddSubActor( &m_sprBackground ); - m_sprTopButton.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SCROLLBAR) ); + m_sprTopButton.Load( THEME->GetPathTo("Graphics","select music scrollbar") ); m_sprTopButton.StopAnimating(); m_sprTopButton.SetState( 0 ); m_sprTopButton.SetY( -BAR_HEIGHT/2 ); this->AddSubActor( &m_sprTopButton ); - m_sprBottomButton.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SCROLLBAR) ); + m_sprBottomButton.Load( THEME->GetPathTo("Graphics","select music scrollbar") ); m_sprBottomButton.StopAnimating(); m_sprBottomButton.SetState( 2 ); m_sprBottomButton.SetY( BAR_HEIGHT/2 ); this->AddSubActor( &m_sprBottomButton ); - m_sprScrollThumb.Load( THEME->GetPathTo(GRAPHIC_SELECT_MUSIC_SCROLLBAR) ); + m_sprScrollThumb.Load( THEME->GetPathTo("Graphics","select music scrollbar") ); m_sprScrollThumb.StopAnimating(); m_sprScrollThumb.SetState( 3 ); m_sprScrollThumb.SetY( CENTER_Y ); @@ -48,5 +48,6 @@ void ScrollBar::SetPercentage( float fPercentageFromTop ) { if( fPercentageFromTop < 0 ) fPercentageFromTop += 1; fPercentageFromTop = fmodf( fPercentageFromTop, 1 ); - m_sprScrollThumb.SetY( -BAR_HEIGHT/2+16 + fPercentageFromTop*(BAR_HEIGHT-32) ); + float fY = -BAR_HEIGHT/2+16 + fPercentageFromTop*(BAR_HEIGHT-32); + m_sprScrollThumb.SetY( (float)roundf(fY) ); } diff --git a/stepmania/src/SnapDisplay.cpp b/stepmania/src/SnapDisplay.cpp new file mode 100644 index 0000000000..759222bc1f --- /dev/null +++ b/stepmania/src/SnapDisplay.cpp @@ -0,0 +1,79 @@ +#include "stdafx.h" +/* +----------------------------------------------------------------------------- + Class: SnapDisplay + + Desc: A graphic displayed in the SnapDisplay during edit. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + +#include "SnapDisplay.h" +#include "RageUtil.h" +#include "GameConstantsAndTypes.h" +#include "PrefsManager.h" +#include "ArrowEffects.h" +#include "GameManager.h" +#include "GameState.h" + + +SnapDisplay::SnapDisplay() +{ + for( int i=0; i<2; i++ ) + { + m_sprIndicators[i].Load( THEME->GetPathTo("Graphics","edit snap indicator") ); + this->AddSubActor( &m_sprIndicators[i] ); + } + + m_NoteType = NOTE_4TH; + D3DXCOLOR color = NoteTypeToColor( m_NoteType ); + + for( i=0; i<2; i++ ) + m_sprIndicators[i].SetDiffuseColor( color ); + + m_iNumCols = 0; +} + +void SnapDisplay::Load() +{ + m_iNumCols = GAMESTATE->GetCurrentStyleDef()->m_iColsPerPlayer; + + m_sprIndicators[0].StopTweening(); + m_sprIndicators[1].StopTweening(); + m_sprIndicators[0].SetX( -ARROW_SIZE * (m_iNumCols/2 + 0.5f) ); + m_sprIndicators[1].SetX( ARROW_SIZE * (m_iNumCols/2 + 0.5f) ); +} + +bool SnapDisplay::PrevSnapMode() +{ + if( m_NoteType == 0 ) + return false; + m_NoteType = NoteType(m_NoteType-1); + + SnapModeChanged(); + return true; +} + +bool SnapDisplay::NextSnapMode() +{ + if( m_NoteType == NUM_NOTE_TYPES-1 ) + return false; + m_NoteType = NoteType(m_NoteType+1); + + SnapModeChanged(); + return true; +} + + +void SnapDisplay::SnapModeChanged() +{ + D3DXCOLOR color = NoteTypeToColor( m_NoteType ); + + for( int i=0; i<2; i++ ) + { + m_sprIndicators[i].BeginTweening( 0.3f ); + m_sprIndicators[i].SetTweenDiffuseColor( color ); + } +} diff --git a/stepmania/src/SnapDisplay.h b/stepmania/src/SnapDisplay.h new file mode 100644 index 0000000000..eb114d8561 --- /dev/null +++ b/stepmania/src/SnapDisplay.h @@ -0,0 +1,42 @@ +#pragma once +/* +----------------------------------------------------------------------------- + Class: SnapDisplay + + Desc: Graphics on ends of receptors on Edit screen that show the current snap type. + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + +#include "GrayArrow.h" +#include "ActorFrame.h" +#include "StyleDef.h" +#include "GameConstantsAndTypes.h" +#include "Sprite.h" +#include "StyleDef.h" + + + +class SnapDisplay : public ActorFrame +{ +public: + SnapDisplay(); + + void Load(); + + bool PrevSnapMode(); + bool NextSnapMode(); + + NoteType GetSnapMode() { return m_NoteType; }; + +protected: + int m_iNumCols; + + void SnapModeChanged(); + + NoteType m_NoteType; // snap to this note type + Sprite m_sprIndicators[2]; // left and right side +}; + diff --git a/stepmania/src/Song.cpp b/stepmania/src/Song.cpp index b9ee51e173..a27495f371 100644 --- a/stepmania/src/Song.cpp +++ b/stepmania/src/Song.cpp @@ -994,7 +994,14 @@ bool Song::LoadFromKSFDir( CString sDir ) LOG->Trace( "Unexpected value named '%s'", sValueName ); } - m_sMusicFile = "song.mp3"; + // search for music with song in the file name + CStringArray arrayPossibleMusic; + GetDirListing( m_sSongDir + CString("song.mp3"), arrayPossibleMusic ); + GetDirListing( m_sSongDir + CString("song.ogg"), arrayPossibleMusic ); + GetDirListing( m_sSongDir + CString("song.wav"), arrayPossibleMusic ); + + if( arrayPossibleMusic.GetSize() > 0 ) // we found a match + m_sMusicFile = arrayPossibleMusic[0]; return TRUE; } diff --git a/stepmania/src/Sprite.cpp b/stepmania/src/Sprite.cpp index 0b8755a8ca..abd3a9a319 100644 --- a/stepmania/src/Sprite.cpp +++ b/stepmania/src/Sprite.cpp @@ -76,12 +76,12 @@ bool Sprite::LoadFromSpriteFile( CString sSpritePath, bool bForceReload, int iMi IniFile ini; ini.SetPath( m_sSpritePath ); if( !ini.ReadFile() ) - throw RageException( ssprintf("Error opening Sprite file '%s'.", m_sSpritePath) ); + throw RageException( "Error opening Sprite file '%s'.", m_sSpritePath ); CString sTextureFile; ini.GetValue( "Sprite", "Texture", sTextureFile ); if( sTextureFile == "" ) - throw RageException( ssprintf("Error reading value 'Texture' from %s.", m_sSpritePath) ); + throw RageException( "Error reading value 'Texture' from %s.", m_sSpritePath ); CString sTexturePath = sFontDir + sTextureFile; // save the path of the new texture @@ -191,7 +191,10 @@ void Sprite::Update( float fDeltaTime ) void Sprite::DrawPrimitives() { // offset so that pixels are aligned to texels - DISPLAY->TranslateLocal( -0.5f, -0.5f, 0 ); + if( PREFSMAN->m_iDisplayResolution == 320 ) + DISPLAY->TranslateLocal( -1, -1, 0 ); + else + DISPLAY->TranslateLocal( -0.5f, -0.5f, 0 ); if( m_pTexture == NULL ) return; diff --git a/stepmania/src/StageBox.cpp b/stepmania/src/StageBox.cpp index c2699c003d..f7ac7a74f6 100644 --- a/stepmania/src/StageBox.cpp +++ b/stepmania/src/StageBox.cpp @@ -27,7 +27,7 @@ StageBox::StageBox() { this->AddSubActor( &m_sprBox ); - m_textNumber.Load( THEME->GetPathTo(FONT_HEADER1) ); + m_textNumber.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textNumber.TurnShadowOff(); m_textNumber.SetHorizAlign( Actor::align_right ); m_textNumber.SetVertAlign( Actor::align_top ); @@ -35,7 +35,7 @@ StageBox::StageBox() m_textNumber.SetXY( NUMBER_X, NUMBER_Y ); this->AddSubActor( &m_textNumber ); - m_textST.Load( THEME->GetPathTo(FONT_HEADER1) ); + m_textST.LoadFromFont( THEME->GetPathTo("Fonts","header1") ); m_textST.TurnShadowOff(); m_textST.SetHorizAlign( Actor::align_left ); m_textST.SetVertAlign( Actor::align_top ); @@ -46,7 +46,7 @@ StageBox::StageBox() void StageBox::SetStageInfo( PlayerNumber p, int iNumStagesCompleted ) { - m_sprBox.Load( THEME->GetPathTo(p==PLAYER_1 ? GRAPHIC_EVALUATION_STAGE_FRAME_P1 : GRAPHIC_EVALUATION_STAGE_FRAME_P2) ); + m_sprBox.Load( THEME->GetPathTo("Graphics",p==PLAYER_1?"evaluation stage frame p1":"evaluation stage frame p2") ); m_sprBox.StopAnimating(); m_textNumber.SetText( ssprintf("%2d", iNumStagesCompleted) ); diff --git a/stepmania/src/StepMania.cpp b/stepmania/src/StepMania.cpp index 16068abd21..cb240b393b 100644 --- a/stepmania/src/StepMania.cpp +++ b/stepmania/src/StepMania.cpp @@ -57,7 +57,6 @@ #include "ScreenSandbox.h" #include "ScreenTitleMenu.h" -#include "ScreenLoading.h" #include "dxerr8.h" @@ -576,15 +575,10 @@ LRESULT CALLBACK WndProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) return 0; case IDM_CHANGEDETAIL: if( PREFSMAN->m_iDisplayResolution != 640 ) - { PREFSMAN->m_iDisplayResolution = 640; - PREFSMAN->m_iTextureResolution = 512; - } else - { PREFSMAN->m_iDisplayResolution = 400; - PREFSMAN->m_iTextureResolution = 256; - } + ApplyGraphicOptions(); return 0; case IDM_EXIT: @@ -696,7 +690,6 @@ HRESULT CreateObjects( HWND hWnd ) //SCREENMAN->SetNewScreen( new ScreenAttractLogo ); SCREENMAN->SetNewScreen( new ScreenTitleMenu ); - //SCREENMAN->SetNewScreen( new ScreenLoading ); //SCREENMAN->SetNewScreen( new ScreenSandbox ); //SCREENMAN->SetNewScreen( new ScreenEvaluation(true) ); //SCREENMAN->SetNewScreen( new ScreenSelectDifficulty ); diff --git a/stepmania/src/StepMania.dsp b/stepmania/src/StepMania.dsp index af38391005..f801b995ea 100644 --- a/stepmania/src/StepMania.dsp +++ b/stepmania/src/StepMania.dsp @@ -260,6 +260,10 @@ SOURCE=.\Grade.h # End Source File # Begin Source File +SOURCE=.\HoldNote.h +# End Source File +# Begin Source File + SOURCE=.\NoteData.cpp # End Source File # Begin Source File @@ -284,6 +288,14 @@ SOURCE=.\Notes.h # End Source File # Begin Source File +SOURCE=.\NoteTypes.cpp +# End Source File +# Begin Source File + +SOURCE=.\NoteTypes.h +# End Source File +# Begin Source File + SOURCE=.\PadInput.h # End Source File # Begin Source File @@ -592,6 +604,14 @@ SOURCE=.\DifficultyIcon.h # End Source File # Begin Source File +SOURCE=.\FadingBanner.cpp +# End Source File +# Begin Source File + +SOURCE=.\FadingBanner.h +# End Source File +# Begin Source File + SOURCE=.\FootMeter.cpp # End Source File # Begin Source File @@ -608,14 +628,6 @@ SOURCE=.\GradeDisplay.h # End Source File # Begin Source File -SOURCE=.\GranularityIndicator.cpp -# End Source File -# Begin Source File - -SOURCE=.\GranularityIndicator.h -# End Source File -# Begin Source File - SOURCE=.\GrooveRadar.cpp # End Source File # Begin Source File @@ -672,6 +684,14 @@ SOURCE=.\MusicWheel.h # End Source File # Begin Source File +SOURCE=.\OptionsCursor.cpp +# End Source File +# Begin Source File + +SOURCE=.\OptionsCursor.h +# End Source File +# Begin Source File + SOURCE=.\ScrollBar.cpp # End Source File # Begin Source File @@ -680,6 +700,14 @@ SOURCE=.\ScrollBar.h # End Source File # Begin Source File +SOURCE=.\SnapDisplay.cpp +# End Source File +# Begin Source File + +SOURCE=.\SnapDisplay.h +# End Source File +# Begin Source File + SOURCE=.\SongInfoFrame.cpp # End Source File # Begin Source File @@ -740,14 +768,6 @@ SOURCE=.\BackgroundAnimation.h # End Source File # Begin Source File -SOURCE=.\ColorNote.cpp -# End Source File -# Begin Source File - -SOURCE=.\ColorNote.h -# End Source File -# Begin Source File - SOURCE=.\Combo.cpp # End Source File # Begin Source File @@ -868,6 +888,14 @@ SOURCE=.\MotionBlurSprite.h # End Source File # Begin Source File +SOURCE=.\NoteDisplay.cpp +# End Source File +# Begin Source File + +SOURCE=.\NoteDisplay.h +# End Source File +# Begin Source File + SOURCE=.\NoteField.cpp # End Source File # Begin Source File @@ -1000,11 +1028,11 @@ SOURCE=.\ScreenGameplay.h # End Source File # Begin Source File -SOURCE=.\ScreenLoading.cpp +SOURCE=.\ScreenGraphicOptions.cpp # End Source File # Begin Source File -SOURCE=.\ScreenLoading.h +SOURCE=.\ScreenGraphicOptions.h # End Source File # Begin Source File diff --git a/stepmania/src/StepMania.vcproj b/stepmania/src/StepMania.vcproj index 01be931ce4..d5df7dc782 100644 --- a/stepmania/src/StepMania.vcproj +++ b/stepmania/src/StepMania.vcproj @@ -216,10 +216,10 @@ RelativePath="ScreenGameplay.h"> + RelativePath="ScreenGraphicOptions.cpp"> + RelativePath="ScreenGraphicOptions.h"> @@ -302,12 +302,6 @@ - - - - @@ -342,6 +336,9 @@ + + @@ -384,6 +381,12 @@ + + + + @@ -426,6 +429,9 @@ + + @@ -592,6 +598,12 @@ + + + + @@ -604,12 +616,6 @@ - - - - @@ -652,12 +658,24 @@ + + + + + + + + @@ -704,12 +722,6 @@ - - - - @@ -800,6 +812,12 @@ + + + + diff --git a/stepmania/src/Style.h b/stepmania/src/Style.h new file mode 100644 index 0000000000..31623f0896 --- /dev/null +++ b/stepmania/src/Style.h @@ -0,0 +1,32 @@ +#pragma once +/* +----------------------------------------------------------------------------- + File: Style + + Desc: . + + Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford +----------------------------------------------------------------------------- +*/ + +enum Style +{ + STYLE_DANCE_SINGLE, + STYLE_DANCE_VERSUS, + STYLE_DANCE_DOUBLE, + STYLE_DANCE_COUPLE, + STYLE_DANCE_SOLO, + STYLE_PUMP_SINGLE, + STYLE_PUMP_VERSUS, + STYLE_PUMP_DOUBLE, + STYLE_EZ2_SINGLE, + STYLE_EZ2_SINGLE_HARD, + STYLE_EZ2_DOUBLE, + STYLE_EZ2_REAL, + STYLE_EZ2_SINGLE_VERSUS, + STYLE_EZ2_SINGLE_HARD_VERSUS, + STYLE_EZ2_REAL_VERSUS, + NUM_STYLES, // leave this at the end + STYLE_NONE, +}; diff --git a/stepmania/src/StyleDef.cpp b/stepmania/src/StyleDef.cpp index 3361598a38..4c4f690665 100644 --- a/stepmania/src/StyleDef.cpp +++ b/stepmania/src/StyleDef.cpp @@ -1,18 +1,18 @@ #include "stdafx.h" /* ----------------------------------------------------------------------------- - File: StyleDef.cpp + Class: StyleDef Desc: A data structure that holds the definition of a GameMode. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford ----------------------------------------------------------------------------- */ #include "StyleDef.h" #include "RageLog.h" #include "RageUtil.h" - #include "GameDef.h" #include "IniFile.h" diff --git a/stepmania/src/StyleDef.h b/stepmania/src/StyleDef.h index 2324027139..6eed2fdf47 100644 --- a/stepmania/src/StyleDef.h +++ b/stepmania/src/StyleDef.h @@ -24,7 +24,7 @@ #include "NoteData.h" #include "StyleInput.h" #include "GameInput.h" -#include "MenuInput.h" +#include "Game.h" const int MAX_COLS_PER_PLAYER = MAX_NOTE_TRACKS; @@ -35,14 +35,15 @@ class GameDef; class StyleDef { public: + Game m_Game; // Game this style is active under char m_szName[60]; NotesType m_NotesType; // the notes format that this style reads. // For example, the "dance versus" reads the Notes with the tag "dance-single". enum StyleType { - ONE_PLAYER_USES_ONE_SIDE, // e.g. single - TWO_PLAYERS_USE_TWO_SIDES, // e.g. versus - ONE_PLAYER_USES_TWO_SIDES, // e.g. double + ONE_PLAYER_ONE_CREDIT, // e.g. single + TWO_PLAYERS_TWO_CREDITS, // e.g. versus + ONE_PLAYER_TWO_CREDITS, // e.g. double }; StyleType m_StyleType; // Defines how many players are allowed to play this Style. int m_iCenterX[NUM_PLAYERS]; // center of the player diff --git a/stepmania/src/TextBanner.cpp b/stepmania/src/TextBanner.cpp index 073a421995..df8e3f768e 100644 --- a/stepmania/src/TextBanner.cpp +++ b/stepmania/src/TextBanner.cpp @@ -1,26 +1,30 @@ #include "stdafx.h" /* ----------------------------------------------------------------------------- - File: TextBanner.h + Class: TextBanner - Desc: The song's TextBanner displayed in SelectSong. + Desc: See header. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford ----------------------------------------------------------------------------- */ -#include "RageUtil.h" - #include "TextBanner.h" +#include "RageUtil.h" +#include "Song.h" #include "PrefsManager.h" +const float TEXT_BANNER_WIDTH = 180; +const float TEXT_BANNER_HEIGHT = 40; + TextBanner::TextBanner() { - m_textTitle.Load( THEME->GetPathTo(FONT_TEXT_BANNER) ); - m_textSubTitle.Load( THEME->GetPathTo(FONT_TEXT_BANNER) ); - m_textArtist.Load( THEME->GetPathTo(FONT_TEXT_BANNER) ); + m_textTitle.LoadFromFont( THEME->GetPathTo("Fonts","text banner") ); + m_textSubTitle.LoadFromFont( THEME->GetPathTo("Fonts","text banner") ); + m_textArtist.LoadFromFont( THEME->GetPathTo("Fonts","text banner") ); m_textTitle.SetX( -TEXT_BANNER_WIDTH/2 ); m_textSubTitle.SetX( -TEXT_BANNER_WIDTH/2 ); diff --git a/stepmania/src/TextBanner.h b/stepmania/src/TextBanner.h index 64385dd5bd..24d61de63f 100644 --- a/stepmania/src/TextBanner.h +++ b/stepmania/src/TextBanner.h @@ -1,26 +1,18 @@ +#pragma once /* ----------------------------------------------------------------------------- - File: TextBanner.h + Class: TextBanner - Desc: The song's TextBanner displayed in SelectSong. + Desc: Shows song title, subtitle, and artist/. Displayed on the MusicWheel. Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved. + Chris Danford ----------------------------------------------------------------------------- */ -#ifndef _TextBanner_H_ -#define _TextBanner_H_ - - #include "ActorFrame.h" -#include "Song.h" #include "BitmapText.h" -#include "Quad.h" - - -const float TEXT_BANNER_WIDTH = 180; -const float TEXT_BANNER_HEIGHT = 40; - +class Song; class TextBanner : public ActorFrame { @@ -31,8 +23,3 @@ public: private: BitmapText m_textTitle, m_textSubTitle, m_textArtist; }; - - - - -#endif \ No newline at end of file diff --git a/stepmania/src/ThemeManager.cpp b/stepmania/src/ThemeManager.cpp index c4f853d933..98320f66c0 100644 --- a/stepmania/src/ThemeManager.cpp +++ b/stepmania/src/ThemeManager.cpp @@ -16,6 +16,7 @@ #include "RageException.h" #include "GameState.h" #include "GameDef.h" +#include "IniFile.h" ThemeManager* THEME = NULL; // global object accessable from anywhere in the program @@ -26,6 +27,11 @@ const CString THEMES_DIR = "Themes\\"; ThemeManager::ThemeManager() { + m_pIniMetrics = new IniFile; + m_iHashForCurThemeMetrics = -99; // garbage value that will never match a real hash + m_iHashForBaseThemeMetrics = -99; // garbage value that will never match a real hash + + m_sCurThemeName = BASE_THEME_NAME; // Use te base theme for now. It's up to PrefsManager to change this. CStringArray arrayThemeNames; @@ -36,6 +42,11 @@ ThemeManager::ThemeManager() // AssertThemeIsComplete( arrayThemeNames[i] ); } +ThemeManager::~ThemeManager() +{ + delete m_pIniMetrics; +} + void ThemeManager::GetAllThemeNames( CStringArray& AddTo ) { GetDirListing( THEMES_DIR+"\\*", AddTo, true ); @@ -89,6 +100,17 @@ void ThemeManager::SwitchTheme( CString sThemeName ) m_sCurThemeName = BASE_THEME_NAME; else m_sCurThemeName = sThemeName; + + // update hashes for metrics files + m_iHashForCurThemeMetrics = GetHashForFile( GetMetricsPathFromName(m_sCurThemeName) ); + m_iHashForBaseThemeMetrics = GetHashForFile( GetMetricsPathFromName(BASE_THEME_NAME) ); + + // read new metrics. First read base metrics, then read cur theme's metrics, overriding base theme + m_pIniMetrics->Reset(); + m_pIniMetrics->SetPath( GetMetricsPathFromName(BASE_THEME_NAME) ); + m_pIniMetrics->ReadFile(); + m_pIniMetrics->SetPath( GetMetricsPathFromName(m_sCurThemeName) ); + m_pIniMetrics->ReadFile(); } CString ThemeManager::GetThemeDirFromName( CString sThemeName ) @@ -101,192 +123,212 @@ CString ThemeManager::GetPathTo( ThemeElement te ) return GetPathTo( te, m_sCurThemeName ); } +CString ThemeManager::GetPathTo( ThemeElement te, CString sThemeName ) // deprecated +{ + return ""; +} +/* CString ThemeManager::GetPathTo( ThemeElement te, CString sThemeName ) { - CString sAssetPrefix; // fill this in below + CString sAssetCategory+"\\"+sFileName; // fill this in below switch( te ) { - case GRAPHIC_ALL_MUSIC_BANNER: sAssetPrefix = "Graphics\\all music banner"; break; - case GRAPHIC_ARROWS_LEFT: sAssetPrefix = "Graphics\\arrows left 1x4"; break; - case GRAPHIC_ARROWS_RIGHT: sAssetPrefix = "Graphics\\arrows right 1x4"; break; - case GRAPHIC_EXPLANATION_ARCADE: sAssetPrefix = "Graphics\\explanation arcade"; break; - case GRAPHIC_EXPLANATION_ONI: sAssetPrefix = "Graphics\\explanation oni"; break; - case GRAPHIC_CAUTION: sAssetPrefix = "Graphics\\Caution"; break; - case GRAPHIC_DANCER_P1: sAssetPrefix = "Graphics\\dancer p1"; break; - case GRAPHIC_DANCER_P2: sAssetPrefix = "Graphics\\dancer p2"; break; - case GRAPHIC_EDIT_BACKGROUND: sAssetPrefix = "Graphics\\edit background"; break; - case GRAPHIC_EDIT_TOP_EDGE: sAssetPrefix = "Graphics\\edit top edge"; break; - case GRAPHIC_EDIT_SNAP_INDICATOR: sAssetPrefix = "Graphics\\edit snap indicator"; break; - case GRAPHIC_FALLBACK_BACKGROUND: sAssetPrefix = "Graphics\\Fallback Background"; break; - case GRAPHIC_FALLBACK_BANNER: sAssetPrefix = "Graphics\\Fallback Banner"; break; - case GRAPHIC_FALLBACK_CD_TITLE: sAssetPrefix = "Graphics\\Fallback CD Title"; break; - case GRAPHIC_GAME_OPTIONS_BACKGROUND: sAssetPrefix = "Graphics\\game options background"; break; - case GRAPHIC_GAME_OPTIONS_TOP_EDGE: sAssetPrefix = "Graphics\\game options top edge"; break; - case GRAPHIC_GAME_OVER: sAssetPrefix = "Graphics\\game over"; break; - case GRAPHIC_GAMEPLAY_BOTTOM_FRAME: sAssetPrefix = "Graphics\\gameplay bottom frame"; break; - case GRAPHIC_GAMEPLAY_CLEARED: sAssetPrefix = "Graphics\\gameplay cleared"; break; - case GRAPHIC_GAMEPLAY_CLOSING_STAR: sAssetPrefix = "Graphics\\gameplay closing star"; break; - case GRAPHIC_GAMEPLAY_COMBO: sAssetPrefix = "Graphics\\gameplay combo"; break; - case GRAPHIC_GAMEPLAY_DANGER_BACKGROUND: sAssetPrefix = "Graphics\\gameplay danger background"; break; - case GRAPHIC_GAMEPLAY_DANGER_TEXT: sAssetPrefix = "Graphics\\gameplay danger text"; break; - case GRAPHIC_GAMEPLAY_DIFFICULTY_BANNER_ICONS: sAssetPrefix = "Graphics\\gameplay difficulty banner icons";break; - case GRAPHIC_GAMEPLAY_DIFFICULTY_BANNER_FRAME: sAssetPrefix = "Graphics\\gameplay difficulty banner frame";break; - case GRAPHIC_GAMEPLAY_DEMONSTRATION: sAssetPrefix = "Graphics\\gameplay demonstration"; break; - case GRAPHIC_GAMEPLAY_FAILED: sAssetPrefix = "Graphics\\gameplay failed"; break; - case GRAPHIC_GAMEPLAY_HERE_WE_GO: sAssetPrefix = "Graphics\\gameplay here we go"; break; - case GRAPHIC_GAMEPLAY_JUDGEMENT: sAssetPrefix = "Graphics\\gameplay judgement 1x9"; break; - case GRAPHIC_GAMEPLAY_OPENING_STAR: sAssetPrefix = "Graphics\\gameplay opening star"; break; - case GRAPHIC_GAMEPLAY_READY: sAssetPrefix = "Graphics\\gameplay Ready"; break; - case GRAPHIC_GAMEPLAY_TOP_FRAME: sAssetPrefix = "Graphics\\gameplay top frame"; break; - case GRAPHIC_GAMEPLAY_LIFEMETER_BAR: sAssetPrefix = "Graphics\\gameplay lifemeter bar"; break; - case GRAPHIC_GAMEPLAY_LIFEMETER_ONI: sAssetPrefix = "Graphics\\gameplay lifemeter oni"; break; - case GRAPHIC_GAMEPLAY_LIFEMETER_BATTERY: sAssetPrefix = "Graphics\\gameplay lifemeter battery 1x4"; break; - case GRAPHIC_GAMEPLAY_LIFEMETER_STREAM_NORMAL: sAssetPrefix = "Graphics\\gameplay lifemeter stream normal";break; - case GRAPHIC_GAMEPLAY_LIFEMETER_STREAM_HOT: sAssetPrefix = "Graphics\\gameplay lifemeter stream hot"; break; - case GRAPHIC_GAMEPLAY_ONI_GAMEOVER: sAssetPrefix = "Graphics\\gameplay oni gameover"; break; - case GRAPHIC_LOADING: sAssetPrefix = "Graphics\\loading"; break; - case GRAPHIC_KEEP_ALIVE: sAssetPrefix = "Graphics\\keep alive"; break; - case GRAPHIC_MAP_CONTROLLERS_BACKGROUND: sAssetPrefix = "Graphics\\map controllers background"; break; - case GRAPHIC_MAP_CONTROLLERS_TOP_EDGE: sAssetPrefix = "Graphics\\map controllers top edge"; break; - case GRAPHIC_MENU_BOTTOM_EDGE: sAssetPrefix = "Graphics\\menu bottom edge"; break; - case GRAPHIC_MENU_STYLE_ICONS: sAssetPrefix = "Graphics\\menu style icons"; break; - case GRAPHIC_MUSIC_SCROLL_BACKGROUND: sAssetPrefix = "Graphics\\music scroll background"; break; - case GRAPHIC_MUSIC_SORT_ICONS: sAssetPrefix = "Graphics\\music sort icons 1x4"; break; - case GRAPHIC_MUSIC_STATUS_ICONS: sAssetPrefix = "Graphics\\music status icons 1x4"; break; - case GRAPHIC_PAD_DOUBLE: sAssetPrefix = "Graphics\\Pad double"; break; - case GRAPHIC_PAD_SINGLE: sAssetPrefix = "Graphics\\Pad single"; break; - case GRAPHIC_PAD_SOLO: sAssetPrefix = "Graphics\\Pad solo"; break; - case GRAPHIC_PLAYER_OPTIONS_BACKGROUND: sAssetPrefix = "Graphics\\player options background"; break; - case GRAPHIC_PLAYER_OPTIONS_TOP_EDGE: sAssetPrefix = "Graphics\\player options top edge"; break; - case GRAPHIC_EVALUATION_BACKGROUND: sAssetPrefix = "Graphics\\evaluation background"; break; - case GRAPHIC_EVALUATION_BANNER_FRAME: sAssetPrefix = "Graphics\\evaluation banner frame"; break; - case GRAPHIC_EVALUATION_BONUS_FRAME_P1: sAssetPrefix = "Graphics\\evaluation bonus frame p1"; break; - case GRAPHIC_EVALUATION_BONUS_FRAME_P2: sAssetPrefix = "Graphics\\evaluation bonus frame p2"; break; - case GRAPHIC_EVALUATION_STAGE_FRAME_P1: sAssetPrefix = "Graphics\\evaluation stage frame p1"; break; - case GRAPHIC_EVALUATION_STAGE_FRAME_P2: sAssetPrefix = "Graphics\\evaluation stage frame p2"; break; - case GRAPHIC_EVALUATION_GRADE_FRAME: sAssetPrefix = "Graphics\\evaluation grade frame 1x2"; break; - case GRAPHIC_EVALUATION_GRADES: sAssetPrefix = "Graphics\\evaluation grades 1x7"; break; - case GRAPHIC_EVALUATION_JUDGE_LABELS: sAssetPrefix = "Graphics\\evaluation judge labels 1x6"; break; - case GRAPHIC_EVALUATION_SCORE_LABELS: sAssetPrefix = "Graphics\\evaluation score labels 1x2"; break; - case GRAPHIC_EVALUATION_SUMMARY_TOP_EDGE: sAssetPrefix = "Graphics\\evaluation summary top edge"; break; - case GRAPHIC_EVALUATION_TOP_EDGE: sAssetPrefix = "Graphics\\evaluation top edge"; break; - case GRAPHIC_SELECT_COURSE_INFO_FRAME: sAssetPrefix = "Graphics\\select course info frame"; break; - case GRAPHIC_SELECT_COURSE_TOP_EDGE: sAssetPrefix = "Graphics\\select course top edge"; break; - case GRAPHIC_SELECT_COURSE_BACKGROUND: sAssetPrefix = "Graphics\\select course background"; break; - case GRAPHIC_SELECT_COURSE_CONTENT_BAR: sAssetPrefix = "Graphics\\select course content bar"; break; - case GRAPHIC_SELECT_DIFFICULTY_ARROWS: sAssetPrefix = "Graphics\\select difficulty arrows 1x2"; break; - case GRAPHIC_SELECT_DIFFICULTY_BACKGROUND: sAssetPrefix = "Graphics\\select difficulty background"; break; - case GRAPHIC_SELECT_DIFFICULTY_EASY_HEADER: sAssetPrefix = "Graphics\\select difficulty easy header"; break; - case GRAPHIC_SELECT_DIFFICULTY_EASY_PICTURE: sAssetPrefix = "Graphics\\select difficulty easy picture"; break; - case GRAPHIC_SELECT_DIFFICULTY_EXPLANATION: sAssetPrefix = "Graphics\\select difficulty explanation"; break; - case GRAPHIC_SELECT_DIFFICULTY_HARD_HEADER: sAssetPrefix = "Graphics\\select difficulty hard header"; break; - case GRAPHIC_SELECT_DIFFICULTY_HARD_PICTURE: sAssetPrefix = "Graphics\\select difficulty hard picture"; break; - case GRAPHIC_SELECT_DIFFICULTY_MEDIUM_HEADER: sAssetPrefix = "Graphics\\select difficulty medium header"; break; - case GRAPHIC_SELECT_DIFFICULTY_MEDIUM_PICTURE: sAssetPrefix = "Graphics\\select difficulty medium picture";break; - case GRAPHIC_SELECT_DIFFICULTY_ONI_HEADER: sAssetPrefix = "Graphics\\select difficulty oni header"; break; - case GRAPHIC_SELECT_DIFFICULTY_ONI_PICTURE: sAssetPrefix = "Graphics\\select difficulty oni picture"; break; - case GRAPHIC_SELECT_DIFFICULTY_ENDLESS_HEADER: sAssetPrefix = "Graphics\\select difficulty endless header"; break; - case GRAPHIC_SELECT_DIFFICULTY_ENDLESS_PICTURE: sAssetPrefix = "Graphics\\select difficulty endless picture"; break; - case GRAPHIC_SELECT_DIFFICULTY_OK: sAssetPrefix = "Graphics\\select difficulty ok"; break; - case GRAPHIC_SELECT_DIFFICULTY_TOP_EDGE: sAssetPrefix = "Graphics\\select difficulty top edge"; break; - case GRAPHIC_SELECT_GAME_BACKGROUND: sAssetPrefix = "Graphics\\select game background"; break; - case GRAPHIC_SELECT_GAME_TOP_EDGE: sAssetPrefix = "Graphics\\select game top edge"; break; - case GRAPHIC_SELECT_GROUP_BACKGROUND: sAssetPrefix = "Graphics\\select group background"; break; - case GRAPHIC_SELECT_GROUP_BUTTON: sAssetPrefix = "Graphics\\select group button"; break; - case GRAPHIC_SELECT_GROUP_CONTENTS_HEADER: sAssetPrefix = "Graphics\\select group contents header"; break; - case GRAPHIC_SELECT_GROUP_EXPLANATION: sAssetPrefix = "Graphics\\select group explanation"; break; - case GRAPHIC_SELECT_GROUP_INFO_FRAME: sAssetPrefix = "Graphics\\select group info frame"; break; - case GRAPHIC_SELECT_GROUP_TOP_EDGE: sAssetPrefix = "Graphics\\select group top edge"; break; - case GRAPHIC_SELECT_MUSIC_BACKGROUND: sAssetPrefix = "Graphics\\select music background"; break; - case GRAPHIC_SELECT_MUSIC_DIFFICULTY_ICONS: sAssetPrefix = "Graphics\\select music difficulty icons"; break; - case GRAPHIC_SELECT_MUSIC_DIFFICULTY_FRAME: sAssetPrefix = "Graphics\\select music difficulty frame"; break; - case GRAPHIC_SELECT_MUSIC_INFO_FRAME: sAssetPrefix = "Graphics\\select music info frame"; break; - case GRAPHIC_SELECT_MUSIC_METER_FRAME: sAssetPrefix = "Graphics\\select music meter frame"; break; - case GRAPHIC_SELECT_MUSIC_RADAR_BASE: sAssetPrefix = "Graphics\\select music radar base"; break; - case GRAPHIC_SELECT_MUSIC_RADAR_WORDS: sAssetPrefix = "Graphics\\select music radar words 1x5"; break; - case GRAPHIC_SELECT_MUSIC_ROULETTE_BANNER: sAssetPrefix = "Graphics\\select music roulette banner"; break; - case GRAPHIC_SELECT_MUSIC_SCROLLBAR: sAssetPrefix = "Graphics\\select music scrollbar"; break; - case GRAPHIC_SELECT_MUSIC_SCORE_FRAME: sAssetPrefix = "Graphics\\select music score frame"; break; - case GRAPHIC_SELECT_MUSIC_SECTION_BANNER: sAssetPrefix = "Graphics\\select music section banner"; break; - case GRAPHIC_SELECT_MUSIC_SECTION_BAR: sAssetPrefix = "Graphics\\select music section bar"; break; - case GRAPHIC_SELECT_MUSIC_SMALL_GRADES: sAssetPrefix = "Graphics\\select music small grades 1x7"; break; - case GRAPHIC_SELECT_MUSIC_SONG_BAR: sAssetPrefix = "Graphics\\select music song bar"; break; - case GRAPHIC_SELECT_MUSIC_SONG_HIGHLIGHT: sAssetPrefix = "Graphics\\select music song highlight"; break; - case GRAPHIC_SELECT_MUSIC_TOP_EDGE: sAssetPrefix = "Graphics\\select music top edge"; break; - case GRAPHIC_SELECT_MUSIC_LONG_BALLOON: sAssetPrefix = "Graphics\\select music long balloon"; break; - case GRAPHIC_SELECT_MUSIC_MARATHON_BALLOON: sAssetPrefix = "Graphics\\select music marathon balloon"; break; - case GRAPHIC_SELECT_STYLE_BACKGROUND: sAssetPrefix = "Graphics\\select Style background"; break; - case GRAPHIC_SELECT_STYLE_EXPLANATION: sAssetPrefix = "Graphics\\select Style explanation"; break; - case GRAPHIC_SELECT_STYLE_TOP_EDGE: sAssetPrefix = "Graphics\\select Style top edge"; break; - case GRAPHIC_SELECT_STYLE_ICONS: sAssetPrefix = "Graphics\\select Style icons"; break; - case GRAPHIC_SELECT_STYLE_INFO_0: sAssetPrefix = "Graphics\\select style info 0"; break; - case GRAPHIC_SELECT_STYLE_INFO_1: sAssetPrefix = "Graphics\\select style info 1"; break; - case GRAPHIC_SELECT_STYLE_INFO_2: sAssetPrefix = "Graphics\\select style info 2"; break; - case GRAPHIC_SELECT_STYLE_INFO_3: sAssetPrefix = "Graphics\\select style info 3"; break; - case GRAPHIC_SELECT_STYLE_INFO_4: sAssetPrefix = "Graphics\\select style info 4"; break; - case GRAPHIC_SELECT_STYLE_INFO_5: sAssetPrefix = "Graphics\\select style info 5"; break; - case GRAPHIC_SELECT_STYLE_PREVIEW_0: sAssetPrefix = "Graphics\\select style preview 0"; break; - case GRAPHIC_SELECT_STYLE_PREVIEW_1: sAssetPrefix = "Graphics\\select style preview 1"; break; - case GRAPHIC_SELECT_STYLE_PREVIEW_2: sAssetPrefix = "Graphics\\select style preview 2"; break; - case GRAPHIC_SELECT_STYLE_PREVIEW_3: sAssetPrefix = "Graphics\\select style preview 3"; break; - case GRAPHIC_SELECT_STYLE_PREVIEW_4: sAssetPrefix = "Graphics\\select style preview 4"; break; - case GRAPHIC_SELECT_STYLE_PREVIEW_5: sAssetPrefix = "Graphics\\select style preview 5"; break; - case GRAPHIC_SONG_OPTIONS_BACKGROUND: sAssetPrefix = "Graphics\\song options background"; break; - case GRAPHIC_SONG_OPTIONS_TOP_EDGE: sAssetPrefix = "Graphics\\song options top edge"; break; - case GRAPHIC_TITLE_MENU_BACKGROUND: sAssetPrefix = "Graphics\\title menu background"; break; - case GRAPHIC_TITLE_MENU_LOGO: sAssetPrefix = "Graphics\\title menu logo"; break; + case GRAPHIC_ALL_MUSIC_BANNER: sAssetCategory+"\\"+sFileName = "Graphics\\all music banner"; break; + case GRAPHIC_ARROWS_LEFT: sAssetCategory+"\\"+sFileName = "Graphics\\arrows left 1x4"; break; + case GRAPHIC_ARROWS_RIGHT: sAssetCategory+"\\"+sFileName = "Graphics\\arrows right 1x4"; break; + case GRAPHIC_CAUTION: sAssetCategory+"\\"+sFileName = "Graphics\\Caution"; break; + case GRAPHIC_EDIT_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\edit background"; break; + case GRAPHIC_EDIT_TOP_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\edit top edge"; break; + case GRAPHIC_EDIT_SNAP_INDICATOR: sAssetCategory+"\\"+sFileName = "Graphics\\edit snap indicator"; break; + case GRAPHIC_FALLBACK_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\Fallback Background"; break; + case "Graphics","fallback banner": sAssetCategory+"\\"+sFileName = "Graphics\\Fallback Banner"; break; + case "Graphics","fallback cd title": sAssetCategory+"\\"+sFileName = "Graphics\\Fallback CD Title"; break; + case GRAPHIC_OPTIONS_CURSOR: sAssetCategory+"\\"+sFileName = "Graphics\\options cursor"; break; + case GRAPHIC_OPTIONS_UNDERLINE: sAssetCategory+"\\"+sFileName = "Graphics\\options underline"; break; + case GRAPHIC_GAME_OPTIONS_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\game options background"; break; + case GRAPHIC_GAME_OPTIONS_TOP_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\game options top edge"; break; + case GRAPHIC_GAME_OVER: sAssetCategory+"\\"+sFileName = "Graphics\\game over"; break; + case GRAPHIC_GAMEPLAY_BOTTOM_FRAME: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay bottom frame"; break; + case GRAPHIC_GAMEPLAY_CLEARED: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay cleared"; break; + case GRAPHIC_GAMEPLAY_CLOSING_STAR: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay closing star"; break; + case GRAPHIC_GAMEPLAY_COMBO: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay combo"; break; + case GRAPHIC_GAMEPLAY_DANGER_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay danger background"; break; + case GRAPHIC_GAMEPLAY_DANGER_TEXT: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay danger text"; break; + case GRAPHIC_GAMEPLAY_DIFFICULTY_BANNERS: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay difficulty banners"; break; + case GRAPHIC_GAMEPLAY_DEMONSTRATION: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay demonstration"; break; + case GRAPHIC_GAMEPLAY_FAILED: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay failed"; break; + case GRAPHIC_GAMEPLAY_HERE_WE_GO: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay here we go"; break; + case GRAPHIC_GAMEPLAY_HOLD_JUDGEMENT: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay hold judgement 1x2"; break; + case GRAPHIC_GAMEPLAY_JUDGEMENT: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay judgement 1x5"; break; + case GRAPHIC_GAMEPLAY_OPENING_STAR: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay opening star"; break; + case GRAPHIC_GAMEPLAY_READY: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay Ready"; break; + case GRAPHIC_GAMEPLAY_MIDDLE_FRAME: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay middle frame"; break; + case GRAPHIC_GAMEPLAY_TOP_FRAME: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay top frame"; break; + case GRAPHIC_GAMEPLAY_LIFEMETER_BAR: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay lifemeter bar"; break; + case GRAPHIC_GAMEPLAY_LIFEMETER_ONI: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay lifemeter oni"; break; + case GRAPHIC_GAMEPLAY_LIFEMETER_BATTERY: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay lifemeter battery 1x4"; break; + case GRAPHIC_GAMEPLAY_LIFEMETER_STREAM_NORMAL: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay lifemeter stream normal";break; + case GRAPHIC_GAMEPLAY_LIFEMETER_STREAM_HOT: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay lifemeter stream hot"; break; + case GRAPHIC_GAMEPLAY_ONI_GAMEOVER: sAssetCategory+"\\"+sFileName = "Graphics\\gameplay oni gameover"; break; + case GRAPHIC_GRAPHIC_OPTIONS_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\graphic options background"; break; + case GRAPHIC_GRAPHIC_OPTIONS_TOP_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\graphic options top edge"; break; + case GRAPHIC_KEEP_ALIVE: sAssetCategory+"\\"+sFileName = "Graphics\\keep alive"; break; + case GRAPHIC_MAP_CONTROLLERS_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\map controllers background"; break; + case GRAPHIC_MAP_CONTROLLERS_TOP_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\map controllers top edge"; break; + case GRAPHIC_MENU_BOTTOM_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\menu bottom edge"; break; + case GRAPHIC_MENU_STYLE_ICONS: sAssetCategory+"\\"+sFileName = "Graphics\\menu style icons"; break; + case GRAPHIC_MUSIC_SCROLL_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\music scroll background"; break; + case GRAPHIC_MUSIC_SORT_ICONS: sAssetCategory+"\\"+sFileName = "Graphics\\music sort icons 1x4"; break; + case GRAPHIC_MUSIC_STATUS_ICONS: sAssetCategory+"\\"+sFileName = "Graphics\\music status icons 1x4"; break; + case GRAPHIC_PLAYER_OPTIONS_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\player options background"; break; + case GRAPHIC_PLAYER_OPTIONS_TOP_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\player options top edge"; break; + case GRAPHIC_EVALUATION_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\evaluation background"; break; + case GRAPHIC_EVALUATION_BANNER_FRAME: sAssetCategory+"\\"+sFileName = "Graphics\\evaluation banner frame"; break; + case GRAPHIC_EVALUATION_BONUS_FRAME_P1: sAssetCategory+"\\"+sFileName = "Graphics\\evaluation bonus frame p1"; break; + case GRAPHIC_EVALUATION_BONUS_FRAME_P2: sAssetCategory+"\\"+sFileName = "Graphics\\evaluation bonus frame p2"; break; + case GRAPHIC_EVALUATION_STAGE_FRAME_P1: sAssetCategory+"\\"+sFileName = "Graphics\\evaluation stage frame p1"; break; + case GRAPHIC_EVALUATION_STAGE_FRAME_P2: sAssetCategory+"\\"+sFileName = "Graphics\\evaluation stage frame p2"; break; + case GRAPHIC_EVALUATION_GRADE_FRAME: sAssetCategory+"\\"+sFileName = "Graphics\\evaluation grade frame 1x2"; break; + case GRAPHIC_EVALUATION_GRADES: sAssetCategory+"\\"+sFileName = "Graphics\\evaluation grades 1x7"; break; + case GRAPHIC_EVALUATION_JUDGE_LABELS: sAssetCategory+"\\"+sFileName = "Graphics\\evaluation judge labels 1x6"; break; + case GRAPHIC_EVALUATION_SCORE_LABELS: sAssetCategory+"\\"+sFileName = "Graphics\\evaluation score labels 1x2"; break; + case GRAPHIC_EVALUATION_SUMMARY_TOP_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\evaluation summary top edge"; break; + case GRAPHIC_EVALUATION_TOP_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\evaluation top edge"; break; + case GRAPHIC_SELECT_COURSE_INFO_FRAME: sAssetCategory+"\\"+sFileName = "Graphics\\select course info frame"; break; + case GRAPHIC_SELECT_COURSE_TOP_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\select course top edge"; break; + case GRAPHIC_SELECT_COURSE_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\select course background"; break; + case GRAPHIC_SELECT_COURSE_CONTENT_BAR: sAssetCategory+"\\"+sFileName = "Graphics\\select course content bar"; break; + case GRAPHIC_SELECT_DIFFICULTY_ARROWS: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty arrows 1x2"; break; + case GRAPHIC_SELECT_DIFFICULTY_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty background"; break; + case GRAPHIC_SELECT_DIFFICULTY_EASY_HEADER: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty easy header"; break; + case GRAPHIC_SELECT_DIFFICULTY_EASY_PICTURE: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty easy picture"; break; + case GRAPHIC_SELECT_DIFFICULTY_EXPLANATION: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty explanation"; break; + case GRAPHIC_SELECT_DIFFICULTY_HARD_HEADER: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty hard header"; break; + case GRAPHIC_SELECT_DIFFICULTY_HARD_PICTURE: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty hard picture"; break; + case GRAPHIC_SELECT_DIFFICULTY_MEDIUM_HEADER: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty medium header"; break; + case GRAPHIC_SELECT_DIFFICULTY_MEDIUM_PICTURE: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty medium picture";break; + case GRAPHIC_SELECT_DIFFICULTY_ONI_HEADER: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty oni header"; break; + case GRAPHIC_SELECT_DIFFICULTY_ONI_PICTURE: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty oni picture"; break; + case GRAPHIC_SELECT_DIFFICULTY_ENDLESS_HEADER: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty endless header"; break; + case GRAPHIC_SELECT_DIFFICULTY_ENDLESS_PICTURE: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty endless picture"; break; + case GRAPHIC_SELECT_DIFFICULTY_OK: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty ok"; break; + case GRAPHIC_SELECT_DIFFICULTY_TOP_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\select difficulty top edge"; break; + case GRAPHIC_SELECT_GAME_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\select game background"; break; + case GRAPHIC_SELECT_GAME_TOP_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\select game top edge"; break; + case GRAPHIC_SELECT_GROUP_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\select group background"; break; + case GRAPHIC_SELECT_GROUP_BUTTON: sAssetCategory+"\\"+sFileName = "Graphics\\select group button"; break; + case GRAPHIC_SELECT_GROUP_CONTENTS_HEADER: sAssetCategory+"\\"+sFileName = "Graphics\\select group contents header"; break; + case GRAPHIC_SELECT_GROUP_EXPLANATION: sAssetCategory+"\\"+sFileName = "Graphics\\select group explanation"; break; + case GRAPHIC_SELECT_GROUP_INFO_FRAME: sAssetCategory+"\\"+sFileName = "Graphics\\select group info frame"; break; + case GRAPHIC_SELECT_GROUP_TOP_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\select group top edge"; break; + case GRAPHIC_SELECT_MUSIC_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\select music background"; break; + case GRAPHIC_SELECT_MUSIC_DIFFICULTY_ICONS: sAssetCategory+"\\"+sFileName = "Graphics\\select music difficulty icons"; break; + case GRAPHIC_SELECT_MUSIC_DIFFICULTY_FRAME: sAssetCategory+"\\"+sFileName = "Graphics\\select music difficulty frame"; break; + case GRAPHIC_SELECT_MUSIC_INFO_FRAME: sAssetCategory+"\\"+sFileName = "Graphics\\select music info frame"; break; + case GRAPHIC_SELECT_MUSIC_METER_FRAME: sAssetCategory+"\\"+sFileName = "Graphics\\select music meter frame"; break; + case GRAPHIC_SELECT_MUSIC_RADAR_BASE: sAssetCategory+"\\"+sFileName = "Graphics\\select music radar base"; break; + case GRAPHIC_SELECT_MUSIC_RADAR_WORDS: sAssetCategory+"\\"+sFileName = "Graphics\\select music radar words 1x5"; break; + case GRAPHIC_SELECT_MUSIC_ROULETTE_BANNER: sAssetCategory+"\\"+sFileName = "Graphics\\select music roulette banner"; break; + case GRAPHIC_SELECT_MUSIC_SCROLLBAR: sAssetCategory+"\\"+sFileName = "Graphics\\select music scrollbar"; break; + case GRAPHIC_SELECT_MUSIC_SCORE_FRAME: sAssetCategory+"\\"+sFileName = "Graphics\\select music score frame"; break; + case GRAPHIC_SELECT_MUSIC_SECTION_BANNER: sAssetCategory+"\\"+sFileName = "Graphics\\select music section banner"; break; + case GRAPHIC_SELECT_MUSIC_SECTION_BAR: sAssetCategory+"\\"+sFileName = "Graphics\\select music section bar"; break; + case GRAPHIC_SELECT_MUSIC_SMALL_GRADES: sAssetCategory+"\\"+sFileName = "Graphics\\select music small grades 1x7"; break; + case GRAPHIC_SELECT_MUSIC_SONG_BAR: sAssetCategory+"\\"+sFileName = "Graphics\\select music song bar"; break; + case GRAPHIC_SELECT_MUSIC_SONG_HIGHLIGHT: sAssetCategory+"\\"+sFileName = "Graphics\\select music song highlight"; break; + case GRAPHIC_SELECT_MUSIC_TOP_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\select music top edge"; break; + case GRAPHIC_SELECT_MUSIC_LONG_BALLOON: sAssetCategory+"\\"+sFileName = "Graphics\\select music long balloon"; break; + case GRAPHIC_SELECT_MUSIC_MARATHON_BALLOON: sAssetCategory+"\\"+sFileName = "Graphics\\select music marathon balloon"; break; + case GRAPHIC_SELECT_STYLE_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\select Style background"; break; + case GRAPHIC_SELECT_STYLE_EXPLANATION: sAssetCategory+"\\"+sFileName = "Graphics\\select Style explanation"; break; + case GRAPHIC_SELECT_STYLE_TOP_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\select Style top edge"; break; + case GRAPHIC_SELECT_STYLE_ICONS: sAssetCategory+"\\"+sFileName = "Graphics\\select Style icons"; break; + case GRAPHIC_SELECT_STYLE_INFO_GAME_0_STYLE_0: sAssetCategory+"\\"+sFileName = "Graphics\\select style info game 0 style 0"; break; + case GRAPHIC_SELECT_STYLE_INFO_GAME_0_STYLE_1: sAssetCategory+"\\"+sFileName = "Graphics\\select style info game 0 style 1"; break; + case GRAPHIC_SELECT_STYLE_INFO_GAME_0_STYLE_2: sAssetCategory+"\\"+sFileName = "Graphics\\select style info game 0 style 2"; break; + case GRAPHIC_SELECT_STYLE_INFO_GAME_0_STYLE_3: sAssetCategory+"\\"+sFileName = "Graphics\\select style info game 0 style 3"; break; + case GRAPHIC_SELECT_STYLE_INFO_GAME_0_STYLE_4: sAssetCategory+"\\"+sFileName = "Graphics\\select style info game 0 style 4"; break; + case GRAPHIC_SELECT_STYLE_INFO_GAME_1_STYLE_0: sAssetCategory+"\\"+sFileName = "Graphics\\select style info game 1 style 0"; break; + case GRAPHIC_SELECT_STYLE_INFO_GAME_1_STYLE_1: sAssetCategory+"\\"+sFileName = "Graphics\\select style info game 1 style 1"; break; + case GRAPHIC_SELECT_STYLE_INFO_GAME_1_STYLE_2: sAssetCategory+"\\"+sFileName = "Graphics\\select style info game 1 style 2"; break; + case GRAPHIC_SELECT_STYLE_INFO_GAME_2_STYLE_0: sAssetCategory+"\\"+sFileName = "Graphics\\select style info game 2 style 0"; break; + case GRAPHIC_SELECT_STYLE_INFO_GAME_2_STYLE_1: sAssetCategory+"\\"+sFileName = "Graphics\\select style info game 2 style 1"; break; + case GRAPHIC_SELECT_STYLE_INFO_GAME_2_STYLE_2: sAssetCategory+"\\"+sFileName = "Graphics\\select style info game 2 style 2"; break; + case GRAPHIC_SELECT_STYLE_INFO_GAME_2_STYLE_3: sAssetCategory+"\\"+sFileName = "Graphics\\select style info game 2 style 3"; break; + case GRAPHIC_SELECT_STYLE_PREVIEW_GAME_0_STYLE_0: sAssetCategory+"\\"+sFileName = "Graphics\\select style preview game 0 style 0"; break; + case GRAPHIC_SELECT_STYLE_PREVIEW_GAME_0_STYLE_1: sAssetCategory+"\\"+sFileName = "Graphics\\select style preview game 0 style 1"; break; + case GRAPHIC_SELECT_STYLE_PREVIEW_GAME_0_STYLE_2: sAssetCategory+"\\"+sFileName = "Graphics\\select style preview game 0 style 2"; break; + case GRAPHIC_SELECT_STYLE_PREVIEW_GAME_0_STYLE_3: sAssetCategory+"\\"+sFileName = "Graphics\\select style preview game 0 style 3"; break; + case GRAPHIC_SELECT_STYLE_PREVIEW_GAME_0_STYLE_4: sAssetCategory+"\\"+sFileName = "Graphics\\select style preview game 0 style 4"; break; + case GRAPHIC_SELECT_STYLE_PREVIEW_GAME_1_STYLE_0: sAssetCategory+"\\"+sFileName = "Graphics\\select style preview game 1 style 0"; break; + case GRAPHIC_SELECT_STYLE_PREVIEW_GAME_1_STYLE_1: sAssetCategory+"\\"+sFileName = "Graphics\\select style preview game 1 style 1"; break; + case GRAPHIC_SELECT_STYLE_PREVIEW_GAME_1_STYLE_2: sAssetCategory+"\\"+sFileName = "Graphics\\select style preview game 1 style 2"; break; + case GRAPHIC_SELECT_STYLE_PREVIEW_GAME_2_STYLE_0: sAssetCategory+"\\"+sFileName = "Graphics\\select style preview game 2 style 0"; break; + case GRAPHIC_SELECT_STYLE_PREVIEW_GAME_2_STYLE_1: sAssetCategory+"\\"+sFileName = "Graphics\\select style preview game 2 style 1"; break; + case GRAPHIC_SELECT_STYLE_PREVIEW_GAME_2_STYLE_2: sAssetCategory+"\\"+sFileName = "Graphics\\select style preview game 2 style 2"; break; + case GRAPHIC_SELECT_STYLE_PREVIEW_GAME_2_STYLE_3: sAssetCategory+"\\"+sFileName = "Graphics\\select style preview game 2 style 3"; break; + case GRAPHIC_SONG_OPTIONS_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\song options background"; break; + case GRAPHIC_SONG_OPTIONS_TOP_EDGE: sAssetCategory+"\\"+sFileName = "Graphics\\song options top edge"; break; + case GRAPHIC_STAGE_ENDLESS: sAssetCategory+"\\"+sFileName = "Graphics\\stage endless"; break; + case GRAPHIC_STAGE_EXTRA1: sAssetCategory+"\\"+sFileName = "Graphics\\stage extra1"; break; + case GRAPHIC_STAGE_EXTRA2: sAssetCategory+"\\"+sFileName = "Graphics\\stage extra2"; break; + case GRAPHIC_STAGE_FINAL: sAssetCategory+"\\"+sFileName = "Graphics\\stage final"; break; + case GRAPHIC_STAGE_NUMBERS: sAssetCategory+"\\"+sFileName = "Graphics\\stage numbers"; break; + case GRAPHIC_STAGE_ONI: sAssetCategory+"\\"+sFileName = "Graphics\\stage oni"; break; + case GRAPHIC_STAGE_STAGE: sAssetCategory+"\\"+sFileName = "Graphics\\stage stage"; break; + case GRAPHIC_TITLE_MENU_BACKGROUND: sAssetCategory+"\\"+sFileName = "Graphics\\title menu background"; break; + case GRAPHIC_TITLE_MENU_LOGO_GAME_0: sAssetCategory+"\\"+sFileName = "Graphics\\title menu logo game 0"; break; + case GRAPHIC_TITLE_MENU_LOGO_GAME_1: sAssetCategory+"\\"+sFileName = "Graphics\\title menu logo game 1"; break; + case GRAPHIC_TITLE_MENU_LOGO_GAME_2: sAssetCategory+"\\"+sFileName = "Graphics\\title menu logo game 2"; break; - case SOUND_ATTRACT_INSERT_COIN: sAssetPrefix = "Sounds\\attract insert coin"; break; - case SOUND_EDIT_CHANGE_BPM: sAssetPrefix = "Sounds\\edit change bpm"; break; - case SOUND_EDIT_CHANGE_FREEZE: sAssetPrefix = "Sounds\\edit change freeze"; break; - case SOUND_EDIT_CHANGE_LINE: sAssetPrefix = "Sounds\\edit change line"; break; - case SOUND_EDIT_CHANGE_SNAP: sAssetPrefix = "Sounds\\edit change snap"; break; - case SOUND_EDIT_SAVE: sAssetPrefix = "Sounds\\edit save"; break; - case SOUND_EVALUATION_EXTRA_STAGE: sAssetPrefix = "Sounds\\evaluation extra stage"; break; - case SOUND_GAMEPLAY_ASSIST_TICK: sAssetPrefix = "Sounds\\gameplay assist tick"; break; - case SOUND_GAMEPLAY_FAILED: sAssetPrefix = "Sounds\\gameplay failed"; break; - case SOUND_GAMEPLAY_ONI_GAIN_LIFE: sAssetPrefix = "Sounds\\gameplay oni gain life"; break; - case SOUND_GAMEPLAY_ONI_LOSE_LIFE: sAssetPrefix = "Sounds\\gameplay oni lose life"; break; - case SOUND_GAMEPLAY_ONI_DIE: sAssetPrefix = "Sounds\\gameplay oni die"; break; - case SOUND_INSERT_COIN: sAssetPrefix = "Sounds\\insert coin"; break; - case SOUND_MENU_BACK: sAssetPrefix = "Sounds\\menu back"; break; - case SOUND_MENU_EXPLANATION_SWOOSH: sAssetPrefix = "Sounds\\menu explanation swoosh"; break; - case SOUND_MENU_INVALID: sAssetPrefix = "Sounds\\menu invalid"; break; - case SOUND_MENU_MUSIC: sAssetPrefix = "Sounds\\menu music"; break; - case SOUND_MENU_PROMPT: sAssetPrefix = "Sounds\\menu prompt"; break; - case SOUND_MENU_START: sAssetPrefix = "Sounds\\menu start"; break; - case SOUND_MENU_SWOOSH: sAssetPrefix = "Sounds\\menu swoosh"; break; - case SOUND_MENU_TIMER: sAssetPrefix = "Sounds\\menu timer"; break; - case SOUND_MUSIC_SCROLL_MUSIC: sAssetPrefix = "Sounds\\music scroll music"; break; - case SOUND_OPTION_CHANGE_COL: sAssetPrefix = "Sounds\\option change col"; break; - case SOUND_OPTION_CHANGE_ROW: sAssetPrefix = "Sounds\\option change row"; break; - case SOUND_SELECT_DIFFICULTY_CHANGE: sAssetPrefix = "Sounds\\select difficulty change"; break; - case SOUND_SELECT_GROUP_CHANGE: sAssetPrefix = "Sounds\\select group change"; break; - case SOUND_SELECT_MUSIC_SECTION_EXPAND: sAssetPrefix = "Sounds\\select music section expand"; break; - case SOUND_SELECT_MUSIC_CHANGE_MUSIC: sAssetPrefix = "Sounds\\select music change music"; break; - case SOUND_SELECT_MUSIC_CHANGE_OPTIONS: sAssetPrefix = "Sounds\\select music change options"; break; - case SOUND_SELECT_MUSIC_CHANGE_SORT: sAssetPrefix = "Sounds\\select music change sort"; break; - case SOUND_SELECT_MUSIC_CHANGE_NOTES: sAssetPrefix = "Sounds\\select music change notes"; break; - case SOUND_SELECT_MUSIC_WHEEL_LOCKED: sAssetPrefix = "Sounds\\select music wheel locked"; break; - case SOUND_SELECT_STYLE_CHANGE: sAssetPrefix = "Sounds\\select style change"; break; - case SOUND_TITLE_MENU_CHANGE: sAssetPrefix = "Sounds\\title menu change"; break; + case SOUND_ATTRACT_INSERT_COIN: sAssetCategory+"\\"+sFileName = "Sounds\\attract insert coin"; break; + case SOUND_EDIT_CHANGE_BPM: sAssetCategory+"\\"+sFileName = "Sounds\\edit change bpm"; break; + case SOUND_EDIT_CHANGE_FREEZE: sAssetCategory+"\\"+sFileName = "Sounds\\edit change freeze"; break; + case SOUND_EDIT_CHANGE_LINE: sAssetCategory+"\\"+sFileName = "Sounds\\edit change line"; break; + case SOUND_EDIT_CHANGE_SNAP: sAssetCategory+"\\"+sFileName = "Sounds\\edit change snap"; break; + case SOUND_EDIT_SAVE: sAssetCategory+"\\"+sFileName = "Sounds\\edit save"; break; + case SOUND_EVALUATION_EXTRA_STAGE: sAssetCategory+"\\"+sFileName = "Sounds\\evaluation extra stage"; break; + case SOUND_GAMEPLAY_ASSIST_TICK: sAssetCategory+"\\"+sFileName = "Sounds\\gameplay assist tick"; break; + case SOUND_GAMEPLAY_FAILED: sAssetCategory+"\\"+sFileName = "Sounds\\gameplay failed"; break; + case SOUND_GAMEPLAY_ONI_GAIN_LIFE: sAssetCategory+"\\"+sFileName = "Sounds\\gameplay oni gain life"; break; + case SOUND_GAMEPLAY_ONI_LOSE_LIFE: sAssetCategory+"\\"+sFileName = "Sounds\\gameplay oni lose life"; break; + case SOUND_GAMEPLAY_ONI_DIE: sAssetCategory+"\\"+sFileName = "Sounds\\gameplay oni die"; break; + case SOUND_INSERT_COIN: sAssetCategory+"\\"+sFileName = "Sounds\\insert coin"; break; + case "Sounds","menu back": sAssetCategory+"\\"+sFileName = "Sounds\\menu back"; break; + case SOUND_MENU_INVALID: sAssetCategory+"\\"+sFileName = "Sounds\\menu invalid"; break; + case SOUND_MENU_MUSIC: sAssetCategory+"\\"+sFileName = "Sounds\\menu music"; break; + case SOUND_MENU_PROMPT: sAssetCategory+"\\"+sFileName = "Sounds\\menu prompt"; break; + case "Sounds","menu start": sAssetCategory+"\\"+sFileName = "Sounds\\menu start"; break; + case SOUND_MENU_SWOOSH: sAssetCategory+"\\"+sFileName = "Sounds\\menu swoosh"; break; + case SOUND_MENU_TIMER: sAssetCategory+"\\"+sFileName = "Sounds\\menu timer"; break; + case SOUND_MUSIC_SCROLL_MUSIC: sAssetCategory+"\\"+sFileName = "Sounds\\music scroll music"; break; + case SOUND_OPTION_CHANGE_COL: sAssetCategory+"\\"+sFileName = "Sounds\\option change col"; break; + case SOUND_OPTION_CHANGE_ROW: sAssetCategory+"\\"+sFileName = "Sounds\\option change row"; break; + case SOUND_SELECT_DIFFICULTY_CHANGE: sAssetCategory+"\\"+sFileName = "Sounds\\select difficulty change"; break; + case SOUND_SELECT_GROUP_CHANGE: sAssetCategory+"\\"+sFileName = "Sounds\\select group change"; break; + case SOUND_SELECT_MUSIC_SECTION_EXPAND: sAssetCategory+"\\"+sFileName = "Sounds\\select music section expand"; break; + case SOUND_SELECT_MUSIC_CHANGE_MUSIC: sAssetCategory+"\\"+sFileName = "Sounds\\select music change music"; break; + case SOUND_SELECT_MUSIC_CHANGE_OPTIONS: sAssetCategory+"\\"+sFileName = "Sounds\\select music change options"; break; + case SOUND_SELECT_MUSIC_CHANGE_SORT: sAssetCategory+"\\"+sFileName = "Sounds\\select music change sort"; break; + case SOUND_SELECT_MUSIC_CHANGE_NOTES: sAssetCategory+"\\"+sFileName = "Sounds\\select music change notes"; break; + case SOUND_SELECT_MUSIC_WHEEL_LOCKED: sAssetCategory+"\\"+sFileName = "Sounds\\select music wheel locked"; break; + case SOUND_SELECT_STYLE_CHANGE: sAssetCategory+"\\"+sFileName = "Sounds\\select style change"; break; + case SOUND_TITLE_MENU_CHANGE: sAssetCategory+"\\"+sFileName = "Sounds\\title menu change"; break; - case FONT_HEADER1: sAssetPrefix = "Fonts\\Header1"; break; - case FONT_HEADER2: sAssetPrefix = "Fonts\\Header2"; break; - case FONT_NORMAL: sAssetPrefix = "Fonts\\Normal"; break; - case FONT_ITALIC: sAssetPrefix = "Fonts\\Italic"; break; - case FONT_COMBO_NUMBERS: sAssetPrefix = "Fonts\\Combo Numbers"; break; - case FONT_METER: sAssetPrefix = "Fonts\\Meter"; break; - case FONT_SCORE_NUMBERS: sAssetPrefix = "Fonts\\Score Numbers"; break; - case FONT_TIMER_NUMBERS: sAssetPrefix = "Fonts\\Timer Numbers"; break; - case FONT_TEXT_BANNER: sAssetPrefix = "Fonts\\Text Banner"; break; - case FONT_STAGE: sAssetPrefix = "Fonts\\stage"; break; + case "Fonts","header1": sAssetCategory+"\\"+sFileName = "Fonts\\Header1"; break; + case "Fonts","Header2": sAssetCategory+"\\"+sFileName = "Fonts\\Header2"; break; + case "Fonts","normal": sAssetCategory+"\\"+sFileName = "Fonts\\Normal"; break; + case FONT_ITALIC: sAssetCategory+"\\"+sFileName = "Fonts\\Italic"; break; + case FONT_COMBO_NUMBERS: sAssetCategory+"\\"+sFileName = "Fonts\\Combo Numbers"; break; + case "Fonts","meter": sAssetCategory+"\\"+sFileName = "Fonts\\Meter"; break; + case "Fonts","score numbers": sAssetCategory+"\\"+sFileName = "Fonts\\Score Numbers"; break; + case "Fonts","timer numbers": sAssetCategory+"\\"+sFileName = "Fonts\\Timer Numbers"; break; + case "Fonts","text banner": sAssetCategory+"\\"+sFileName = "Fonts\\Text Banner"; break; + case FONT_STAGE: sAssetCategory+"\\"+sFileName = "Fonts\\stage"; break; default: ASSERT(0); // Unhandled theme element } - - CStringArray asPossibleElementFilePaths; CString sCurrentThemeDir = GetThemeDirFromName( sThemeName ); CString sDefaultThemeDir = GetThemeDirFromName( BASE_THEME_NAME ); @@ -294,37 +336,37 @@ CString ThemeManager::GetPathTo( ThemeElement te, CString sThemeName ) /////////////////////////////////////// // Search both the current theme and the default theme dirs for this element /////////////////////////////////////// - if( -1 != sAssetPrefix.Find("Graphics\\") ) + if( -1 != sAssetCategory+"\\"+sFileName.Find("Graphics\\") ) { - GetDirListing( sCurrentThemeDir + sAssetPrefix + "*.sprite", asPossibleElementFilePaths, false, true ); - GetDirListing( sCurrentThemeDir + sAssetPrefix + "*.png", asPossibleElementFilePaths, false, true ); - GetDirListing( sCurrentThemeDir + sAssetPrefix + "*.jpg", asPossibleElementFilePaths, false, true ); - GetDirListing( sCurrentThemeDir + sAssetPrefix + "*.bmp", asPossibleElementFilePaths, false, true ); - GetDirListing( sCurrentThemeDir + sAssetPrefix + "*.gif", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + "*.sprite", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + "*.png", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + "*.jpg", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + "*.bmp", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + "*.gif", asPossibleElementFilePaths, false, true ); - GetDirListing( sDefaultThemeDir + sAssetPrefix + "*.sprite", asPossibleElementFilePaths, false, true ); - GetDirListing( sDefaultThemeDir + sAssetPrefix + "*.png", asPossibleElementFilePaths, false, true ); - GetDirListing( sDefaultThemeDir + sAssetPrefix + "*.jpg", asPossibleElementFilePaths, false, true ); - GetDirListing( sDefaultThemeDir + sAssetPrefix + "*.bmp", asPossibleElementFilePaths, false, true ); - GetDirListing( sDefaultThemeDir + sAssetPrefix + "*.gif", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + "*.sprite", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + "*.png", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + "*.jpg", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + "*.bmp", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + "*.gif", asPossibleElementFilePaths, false, true ); } - else if( -1 != sAssetPrefix.Find("Sounds\\") ) + else if( -1 != sAssetCategory+"\\"+sFileName.Find("Sounds\\") ) { - GetDirListing( sCurrentThemeDir + sAssetPrefix + ".set", asPossibleElementFilePaths, false, true ); - GetDirListing( sCurrentThemeDir + sAssetPrefix + ".mp3", asPossibleElementFilePaths, false, true ); - GetDirListing( sCurrentThemeDir + sAssetPrefix + ".ogg", asPossibleElementFilePaths, false, true ); - GetDirListing( sCurrentThemeDir + sAssetPrefix + ".wav", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + ".set", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + ".mp3", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + ".ogg", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + ".wav", asPossibleElementFilePaths, false, true ); - GetDirListing( sDefaultThemeDir + sAssetPrefix + ".set", asPossibleElementFilePaths, false, true ); - GetDirListing( sDefaultThemeDir + sAssetPrefix + ".mp3", asPossibleElementFilePaths, false, true ); - GetDirListing( sDefaultThemeDir + sAssetPrefix + ".ogg", asPossibleElementFilePaths, false, true ); - GetDirListing( sDefaultThemeDir + sAssetPrefix + ".wav", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + ".set", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + ".mp3", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + ".ogg", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + ".wav", asPossibleElementFilePaths, false, true ); } - else if( -1 != sAssetPrefix.Find("Fonts\\") ) + else if( -1 != sAssetCategory+"\\"+sFileName.Find("Fonts\\") ) { - GetDirListing( sCurrentThemeDir + sAssetPrefix + ".font", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + ".font", asPossibleElementFilePaths, false, true ); - GetDirListing( sDefaultThemeDir + sAssetPrefix + ".font", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + ".font", asPossibleElementFilePaths, false, true ); } else { @@ -334,11 +376,184 @@ CString ThemeManager::GetPathTo( ThemeElement te, CString sThemeName ) if( asPossibleElementFilePaths.GetSize() > 0 ) return asPossibleElementFilePaths[0]; else + { + ASSERT(0); throw RageException( "Theme element '%s' could not be found in '%s' or '%s'.", - sAssetPrefix, + sAssetCategory+"\\"+sFileName, GetThemeDirFromName(m_sCurThemeName), GetThemeDirFromName(BASE_THEME_NAME) ); + } + + return ""; +} +*/ + +CString ThemeManager::GetPathTo( CString sAssetCategory, CString sFileName ) +{ + sAssetCategory.MakeLower(); + sFileName.MakeLower(); + + const CString sCurrentThemeDir = GetThemeDirFromName( m_sCurThemeName ); + const CString sDefaultThemeDir = GetThemeDirFromName( BASE_THEME_NAME ); + + CStringArray asPossibleElementFilePaths; + + // look for a redirect + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + "*.redir", asPossibleElementFilePaths, false, true ); + if( asPossibleElementFilePaths.GetSize() > 0 ) + { + CStdioFile file; + file.Open( asPossibleElementFilePaths[0], CFile::modeRead ); + CString sLine; + file.ReadString( sLine ); + } + + + /////////////////////////////////////// + // Search both the current theme and the default theme dirs for this element + /////////////////////////////////////// + if( sAssetCategory == "graphics" ) + { + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + "*.sprite", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + "*.png", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + "*.jpg", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + "*.bmp", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + "*.gif", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + "*.redir", asPossibleElementFilePaths, false, true ); + + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + "*.sprite", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + "*.png", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + "*.jpg", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + "*.bmp", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + "*.gif", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + "*.redir", asPossibleElementFilePaths, false, true ); + } + else if( sAssetCategory == "sounds" ) + { + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + ".set", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + ".mp3", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + ".ogg", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + ".wav", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + ".redir", asPossibleElementFilePaths, false, true ); + + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + ".set", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + ".mp3", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + ".ogg", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + ".wav", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + ".redir", asPossibleElementFilePaths, false, true ); + } + else if( sAssetCategory == "fonts" ) + { + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + ".font", asPossibleElementFilePaths, false, true ); + GetDirListing( sCurrentThemeDir + sAssetCategory+"\\"+sFileName + ".redir", asPossibleElementFilePaths, false, true ); + + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + ".font", asPossibleElementFilePaths, false, true ); + GetDirListing( sDefaultThemeDir + sAssetCategory+"\\"+sFileName + ".redir", asPossibleElementFilePaths, false, true ); + } + else + { + ASSERT(0); // Unknown theme asset category; + } + + + if( asPossibleElementFilePaths.GetSize() == 0 ) + { + ASSERT(0); + throw RageException( "Theme element '%s' could not be found in '%s' or '%s'.", + sAssetCategory+"\\"+sFileName, + GetThemeDirFromName(m_sCurThemeName), + GetThemeDirFromName(BASE_THEME_NAME) ); + } + else + { + asPossibleElementFilePaths[0].MakeLower(); + if( asPossibleElementFilePaths[0].GetLength() > 5 && asPossibleElementFilePaths[0].Right(5) == "redir" ) // this is a redirect file + { + CString sRedirFilePath = asPossibleElementFilePaths[0]; + + CString sDir, sFName, sExt; + splitrelpath( sRedirFilePath, sDir, sFName, sExt ); + + CStdioFile file; + file.Open( sRedirFilePath, CFile::modeRead ); + CString sNewFileName; + file.ReadString( sNewFileName ); + CString sNewFilePath = sDir+"\\"+sNewFileName; + if( sNewFileName == "" || !DoesFileExist(sNewFilePath) ) + { + ASSERT(0); + throw RageException( "The redirect '%s' points to the file '%s', which does not exist. Verify that this redirect is correct.", sRedirFilePath, sNewFilePath ); + } + else + return sNewFilePath; + } + else + { + return asPossibleElementFilePaths[0]; + } + } return ""; } + +CString ThemeManager::GetMetricsPathFromName( CString sThemeName ) +{ + return GetThemeDirFromName( sThemeName ) + "metrics.ini"; +} + +CString ThemeManager::GetMetric( CString sScreenName, CString sValueName ) +{ + CString sCurMetricPath = GetMetricsPathFromName(m_sCurThemeName); + CString sDefaultMetricPath = GetMetricsPathFromName(BASE_THEME_NAME); + + // is our metric cache out of date? + if( m_iHashForCurThemeMetrics != GetHashForFile(sCurMetricPath) || + m_iHashForBaseThemeMetrics != GetHashForFile(sDefaultMetricPath) ) + { + SwitchTheme(m_sCurThemeName); // force a reload of the metrics cache + } + + CString sValue; + if( m_pIniMetrics->GetValue(sScreenName,sValueName,sValue) ) + return sValue; + + ASSERT(0); + throw RageException( "Theme metric '%s : %s' could not be found in '%s' or '%s'.", + sScreenName, + sValueName, + sCurMetricPath, + sDefaultMetricPath + ); +} + +int ThemeManager::GetMetricI( CString sScreenName, CString sValueName ) +{ + return atoi( GetMetric(sScreenName,sValueName) ); +} + +float ThemeManager::GetMetricF( CString sScreenName, CString sValueName ) +{ + return (float)atof( GetMetric(sScreenName,sValueName) ); +} + +bool ThemeManager::GetMetricB( CString sScreenName, CString sValueName ) +{ + return atoi( GetMetric(sScreenName,sValueName) ) != 0; +} + +D3DXCOLOR ThemeManager::GetMetricC( CString sScreenName, CString sValueName ) +{ + float r=1,b=1,g=1,a=1; // initialize in case sscanf fails + CString sValue = GetMetric(sScreenName,sValueName); + char szValue[40]; + strcpy( szValue, sValue ); + int result = sscanf( szValue, "%f,%f,%f,%f", &r, &g, &b, &a ); + if( result != 4 ) + { + LOG->Warn( "The color value '%s' for theme metric '%s : %s' is invalid.", szValue, sScreenName, sValueName ); + ASSERT(0); + } + + return D3DXCOLOR(r,g,b,a); +} diff --git a/stepmania/src/ThemeManager.h b/stepmania/src/ThemeManager.h index e3d1cd74a0..5eec1928ad 100644 --- a/stepmania/src/ThemeManager.h +++ b/stepmania/src/ThemeManager.h @@ -12,25 +12,26 @@ */ #include "RageUtil.h" +#include "D3DX8Math.h" // for D3DXCOLOR +class IniFile; enum ThemeElement { +/* GRAPHIC_ALL_MUSIC_BANNER, GRAPHIC_ARROWS_LEFT, GRAPHIC_ARROWS_RIGHT, - GRAPHIC_EXPLANATION_ARCADE, - GRAPHIC_EXPLANATION_ONI, GRAPHIC_CAUTION, GRAPHIC_GAMEPLAY_CLOSING_STAR, - GRAPHIC_DANCER_P1, - GRAPHIC_DANCER_P2, GRAPHIC_EDIT_BACKGROUND, GRAPHIC_EDIT_TOP_EDGE, GRAPHIC_EDIT_SNAP_INDICATOR, GRAPHIC_MUSIC_SCROLL_BACKGROUND, GRAPHIC_FALLBACK_BACKGROUND, - GRAPHIC_FALLBACK_BANNER, - GRAPHIC_FALLBACK_CD_TITLE, + "Graphics","fallback banner", + "Graphics","fallback cd title", + GRAPHIC_OPTIONS_CURSOR, + GRAPHIC_OPTIONS_UNDERLINE, GRAPHIC_GAME_OPTIONS_BACKGROUND, GRAPHIC_GAME_OPTIONS_TOP_EDGE, GRAPHIC_GAME_OVER, @@ -40,20 +41,23 @@ enum ThemeElement { GRAPHIC_GAMEPLAY_DANGER_TEXT, GRAPHIC_GAMEPLAY_DEMONSTRATION, GRAPHIC_GAMEPLAY_FAILED, + GRAPHIC_GAMEPLAY_HOLD_JUDGEMENT, GRAPHIC_GAMEPLAY_JUDGEMENT, GRAPHIC_GAMEPLAY_READY, GRAPHIC_GAMEPLAY_HERE_WE_GO, GRAPHIC_GAMEPLAY_BOTTOM_FRAME, - GRAPHIC_GAMEPLAY_DIFFICULTY_BANNER_ICONS, - GRAPHIC_GAMEPLAY_DIFFICULTY_BANNER_FRAME, + GRAPHIC_GAMEPLAY_DIFFICULTY_BANNERS, GRAPHIC_GAMEPLAY_TOP_FRAME, + GRAPHIC_GAMEPLAY_MIDDLE_FRAME, GRAPHIC_GAMEPLAY_LIFEMETER_BAR, GRAPHIC_GAMEPLAY_LIFEMETER_ONI, GRAPHIC_GAMEPLAY_LIFEMETER_BATTERY, GRAPHIC_GAMEPLAY_LIFEMETER_STREAM_NORMAL, GRAPHIC_GAMEPLAY_LIFEMETER_STREAM_HOT, GRAPHIC_GAMEPLAY_ONI_GAMEOVER, - GRAPHIC_LOADING, + GRAPHIC_GAMEPLAY_OPENING_STAR, + GRAPHIC_GRAPHIC_OPTIONS_BACKGROUND, + GRAPHIC_GRAPHIC_OPTIONS_TOP_EDGE, GRAPHIC_KEEP_ALIVE, GRAPHIC_MAP_CONTROLLERS_BACKGROUND, GRAPHIC_MAP_CONTROLLERS_TOP_EDGE, @@ -61,10 +65,6 @@ enum ThemeElement { GRAPHIC_MENU_STYLE_ICONS, GRAPHIC_MUSIC_SORT_ICONS, GRAPHIC_MUSIC_STATUS_ICONS, - GRAPHIC_GAMEPLAY_OPENING_STAR, - GRAPHIC_PAD_DOUBLE, - GRAPHIC_PAD_SINGLE, - GRAPHIC_PAD_SOLO, GRAPHIC_PLAYER_OPTIONS_BACKGROUND, GRAPHIC_PLAYER_OPTIONS_TOP_EDGE, GRAPHIC_EVALUATION_BACKGROUND, @@ -128,22 +128,43 @@ enum ThemeElement { GRAPHIC_SELECT_STYLE_TOP_EDGE, GRAPHIC_SELECT_STYLE_EXPLANATION, GRAPHIC_SELECT_STYLE_ICONS, - GRAPHIC_SELECT_STYLE_INFO_0, - GRAPHIC_SELECT_STYLE_INFO_1, - GRAPHIC_SELECT_STYLE_INFO_2, - GRAPHIC_SELECT_STYLE_INFO_3, - GRAPHIC_SELECT_STYLE_INFO_4, - GRAPHIC_SELECT_STYLE_INFO_5, - GRAPHIC_SELECT_STYLE_PREVIEW_0, - GRAPHIC_SELECT_STYLE_PREVIEW_1, - GRAPHIC_SELECT_STYLE_PREVIEW_2, - GRAPHIC_SELECT_STYLE_PREVIEW_3, - GRAPHIC_SELECT_STYLE_PREVIEW_4, - GRAPHIC_SELECT_STYLE_PREVIEW_5, + GRAPHIC_SELECT_STYLE_INFO_GAME_0_STYLE_0, + GRAPHIC_SELECT_STYLE_INFO_GAME_0_STYLE_1, + GRAPHIC_SELECT_STYLE_INFO_GAME_0_STYLE_2, + GRAPHIC_SELECT_STYLE_INFO_GAME_0_STYLE_3, + GRAPHIC_SELECT_STYLE_INFO_GAME_0_STYLE_4, + GRAPHIC_SELECT_STYLE_INFO_GAME_1_STYLE_0, + GRAPHIC_SELECT_STYLE_INFO_GAME_1_STYLE_1, + GRAPHIC_SELECT_STYLE_INFO_GAME_1_STYLE_2, + GRAPHIC_SELECT_STYLE_INFO_GAME_2_STYLE_0, + GRAPHIC_SELECT_STYLE_INFO_GAME_2_STYLE_1, + GRAPHIC_SELECT_STYLE_INFO_GAME_2_STYLE_2, + GRAPHIC_SELECT_STYLE_INFO_GAME_2_STYLE_3, + GRAPHIC_SELECT_STYLE_PREVIEW_GAME_0_STYLE_0, + GRAPHIC_SELECT_STYLE_PREVIEW_GAME_0_STYLE_1, + GRAPHIC_SELECT_STYLE_PREVIEW_GAME_0_STYLE_2, + GRAPHIC_SELECT_STYLE_PREVIEW_GAME_0_STYLE_3, + GRAPHIC_SELECT_STYLE_PREVIEW_GAME_0_STYLE_4, + GRAPHIC_SELECT_STYLE_PREVIEW_GAME_1_STYLE_0, + GRAPHIC_SELECT_STYLE_PREVIEW_GAME_1_STYLE_1, + GRAPHIC_SELECT_STYLE_PREVIEW_GAME_1_STYLE_2, + GRAPHIC_SELECT_STYLE_PREVIEW_GAME_2_STYLE_0, + GRAPHIC_SELECT_STYLE_PREVIEW_GAME_2_STYLE_1, + GRAPHIC_SELECT_STYLE_PREVIEW_GAME_2_STYLE_2, + GRAPHIC_SELECT_STYLE_PREVIEW_GAME_2_STYLE_3, GRAPHIC_SONG_OPTIONS_BACKGROUND, GRAPHIC_SONG_OPTIONS_TOP_EDGE, + GRAPHIC_STAGE_ENDLESS, + GRAPHIC_STAGE_EXTRA1, + GRAPHIC_STAGE_EXTRA2, + GRAPHIC_STAGE_FINAL, + GRAPHIC_STAGE_NUMBERS, + GRAPHIC_STAGE_ONI, + GRAPHIC_STAGE_STAGE, GRAPHIC_TITLE_MENU_BACKGROUND, - GRAPHIC_TITLE_MENU_LOGO, + GRAPHIC_TITLE_MENU_LOGO_GAME_0, + GRAPHIC_TITLE_MENU_LOGO_GAME_1, + GRAPHIC_TITLE_MENU_LOGO_GAME_2, SOUND_ATTRACT_INSERT_COIN, SOUND_EDIT_CHANGE_BPM, @@ -158,12 +179,11 @@ enum ThemeElement { SOUND_GAMEPLAY_ONI_GAIN_LIFE, SOUND_GAMEPLAY_ONI_LOSE_LIFE, SOUND_GAMEPLAY_ONI_DIE, - SOUND_MENU_BACK, - SOUND_MENU_EXPLANATION_SWOOSH, + "Sounds","menu back", SOUND_MENU_INVALID, SOUND_MENU_MUSIC, SOUND_MENU_PROMPT, - SOUND_MENU_START, + "Sounds","menu start", SOUND_MENU_SWOOSH, SOUND_MENU_TIMER, SOUND_MUSIC_SCROLL_MUSIC, @@ -180,26 +200,26 @@ enum ThemeElement { SOUND_SELECT_STYLE_CHANGE, SOUND_TITLE_MENU_CHANGE, - FONT_HEADER1, - FONT_HEADER2, - FONT_NORMAL, + "Fonts","header1", + "Fonts","Header2", + "Fonts","normal", FONT_ITALIC, FONT_COMBO_NUMBERS, - FONT_METER, - FONT_SCORE_NUMBERS, - FONT_TIMER_NUMBERS, - FONT_TEXT_BANNER, + "Fonts","meter", + "Fonts","score numbers", + "Fonts","timer numbers", + "Fonts","text banner", FONT_STAGE, - +*/ NUM_THEME_ELEMENTS // leave this at the end }; - class ThemeManager { public: ThemeManager(); + ~ThemeManager(); void GetThemeNamesForCurGame( CStringArray& AddTo ); bool DoesThemeExist( CString sThemeName ); @@ -208,16 +228,28 @@ public: CString GetCurThemeName() { return m_sCurThemeName; }; CString GetPathTo( ThemeElement te ); // looks up the current theme in PREFSMAN + CString GetPathTo( CString sAssetCategory, CString sFileName ); // looks up the current theme in PREFSMAN + + CString GetMetric( CString sScreenName, CString sValueName ); + int GetMetricI( CString sScreenName, CString sValueName ); + float GetMetricF( CString sScreenName, CString sValueName ); + bool GetMetricB( CString sScreenName, CString sValueName ); + D3DXCOLOR GetMetricC( CString sScreenName, CString sValueName ); protected: void GetAllThemeNames( CStringArray& AddTo ); CString GetPathTo( ThemeElement te, CString sThemeName ); - static CString GetThemeDirFromName( CString sAnnouncerName ); + static CString GetThemeDirFromName( CString sThemeName ); CString GetElementDir( CString sThemeName ); + static CString GetMetricsPathFromName( CString sThemeName ); CString m_sCurThemeName; + + IniFile* m_pIniMetrics; // make this a pointer so we don't have to include IniFile in this header! + int m_iHashForCurThemeMetrics; + int m_iHashForBaseThemeMetrics; }; diff --git a/stepmania/src/TipDisplay.cpp b/stepmania/src/TipDisplay.cpp index 581bdb10a8..9c1e4c9a43 100644 --- a/stepmania/src/TipDisplay.cpp +++ b/stepmania/src/TipDisplay.cpp @@ -23,7 +23,7 @@ TipDisplay::TipDisplay() { LOG->Trace( "TipDisplay::TipDisplay()" ); - m_textTip.Load( THEME->GetPathTo(FONT_NORMAL) ); + m_textTip.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textTip.SetEffectBlinking(); m_textTip.TurnShadowOff(); this->AddSubActor( &m_textTip ); diff --git a/stepmania/src/TransitionBackWipe.cpp b/stepmania/src/TransitionBackWipe.cpp index 5a477a615c..519bf97fc6 100644 --- a/stepmania/src/TransitionBackWipe.cpp +++ b/stepmania/src/TransitionBackWipe.cpp @@ -23,7 +23,7 @@ TransitionBackWipe::TransitionBackWipe() { - m_soundBack.Load( THEME->GetPathTo(SOUND_MENU_BACK) ); + m_soundBack.Load( THEME->GetPathTo("Sounds","menu back") ); } void TransitionBackWipe::DrawPrimitives() diff --git a/stepmania/src/TransitionKeepAlive.cpp b/stepmania/src/TransitionKeepAlive.cpp index 3c828c9dcf..908dc753d7 100644 --- a/stepmania/src/TransitionKeepAlive.cpp +++ b/stepmania/src/TransitionKeepAlive.cpp @@ -21,7 +21,7 @@ const float KEEP_ALIVE_BACKWARD_TRANSITION_TIME = 0.4f; TransitionKeepAlive::TransitionKeepAlive() { - m_sprLogo.Load( THEME->GetPathTo(GRAPHIC_KEEP_ALIVE) ); + m_sprLogo.Load( THEME->GetPathTo("Graphics","keep alive") ); m_sprLogo.SetXY( CENTER_X, CENTER_Y ); m_rect.StretchTo( CRect(0,0,SCREEN_WIDTH,SCREEN_HEIGHT) ); diff --git a/stepmania/src/TransitionOniFade.cpp b/stepmania/src/TransitionOniFade.cpp index af6ec7efb1..d26d2a3673 100644 --- a/stepmania/src/TransitionOniFade.cpp +++ b/stepmania/src/TransitionOniFade.cpp @@ -26,7 +26,7 @@ TransitionOniFade::TransitionOniFade() m_quadStrip.StretchTo( CRect(SCREEN_LEFT, int(CENTER_Y-30), SCREEN_RIGHT, int(CENTER_Y+30)) ); - m_textSongInfo.Load( THEME->GetPathTo(FONT_NORMAL) ); + m_textSongInfo.LoadFromFont( THEME->GetPathTo("Fonts","normal") ); m_textSongInfo.TurnShadowOff(); m_textSongInfo.SetZoom( 0.5f ); m_textSongInfo.SetXY( CENTER_X, CENTER_Y ); diff --git a/stepmania/src/TransitionStarWipe.cpp b/stepmania/src/TransitionStarWipe.cpp index 32428604b3..76cea6e57c 100644 --- a/stepmania/src/TransitionStarWipe.cpp +++ b/stepmania/src/TransitionStarWipe.cpp @@ -18,7 +18,7 @@ TransitionStarWipe::TransitionStarWipe() { - m_fTransitionTime = m_fTransitionTime * 1.5f; + m_fTransitionTime = m_fTransitionTime * 4; } TransitionStarWipe::~TransitionStarWipe() @@ -75,7 +75,7 @@ void TransitionStarWipe::DrawPrimitives() m_sprStar.Draw(); int x_rect_leading_edge = x + ( bIsAnEvenRow ? - m_iStarWidth/2 : m_iStarWidth/2 ); - int x_rect_trailing_edge = ( bIsAnEvenRow ? 0 : SCREEN_WIDTH ); + int x_rect_trailing_edge = ( bIsAnEvenRow ? 0-1 : SCREEN_WIDTH+1 ); int y_top = y - m_iStarHeight/2; int y_bot = y + m_iStarHeight/2+1; m_rect.StretchTo( CRect(x_rect_leading_edge, y_top, x_rect_trailing_edge, y_bot) ); @@ -88,25 +88,25 @@ void TransitionStarWipe::DrawPrimitives() void TransitionStarWipe::OpenWipingRight( ScreenMessage send_when_done ) { Transition::OpenWipingRight( send_when_done ); - LoadNewStarSprite( THEME->GetPathTo(GRAPHIC_GAMEPLAY_CLOSING_STAR) ); + LoadNewStarSprite( THEME->GetPathTo("Graphics","gameplay closing star") ); } void TransitionStarWipe::OpenWipingLeft( ScreenMessage send_when_done ) { Transition::OpenWipingLeft( send_when_done ); - LoadNewStarSprite( THEME->GetPathTo(GRAPHIC_GAMEPLAY_CLOSING_STAR) ); + LoadNewStarSprite( THEME->GetPathTo("Graphics","gameplay closing star") ); } void TransitionStarWipe::CloseWipingRight(ScreenMessage send_when_done ) { Transition::CloseWipingRight( send_when_done ); - LoadNewStarSprite( THEME->GetPathTo(GRAPHIC_GAMEPLAY_OPENING_STAR) ); + LoadNewStarSprite( THEME->GetPathTo("Graphics","gameplay opening star") ); } void TransitionStarWipe::CloseWipingLeft( ScreenMessage send_when_done ) { Transition::CloseWipingLeft( send_when_done ); - LoadNewStarSprite( THEME->GetPathTo(GRAPHIC_GAMEPLAY_OPENING_STAR) ); + LoadNewStarSprite( THEME->GetPathTo("Graphics","gameplay opening star") ); } void TransitionStarWipe::LoadNewStarSprite( CString sFileName )