From 761cb4e2575243c6b070cea1fbd470fdcbfc94dc Mon Sep 17 00:00:00 2001 From: Andrew Livy Date: Thu, 4 Dec 2003 04:28:19 +0000 Subject: [PATCH] Pop'n Music Theme Changes Themers can optionally enable an All Character / 2D only Character select on the mode select screen (pop'n support) --- stepmania/Themes/default/metrics.ini | 8 ++ stepmania/src/Character.cpp | 20 +++ stepmania/src/Character.h | 4 + stepmania/src/ScreenCredits.cpp | 1 + stepmania/src/ScreenSelect.h | 2 +- stepmania/src/ScreenSelectMode.cpp | 199 ++++++++++++++++++++++++++- stepmania/src/ScreenSelectMode.h | 18 ++- stepmania/src/ScreenSelectMusic.cpp | 3 + 8 files changed, 252 insertions(+), 3 deletions(-) diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index 62b91d17cd..f6fb513545 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -238,6 +238,14 @@ GuideOffCommand=bouncebegin,0.5;addy,400 ChoiceListHighlightOffCommand=linear,0.5;diffusealpha,0;glow,1,1,1,0 ChoiceListFrameOffCommand=linear,0.5;diffusealpha,0;glow,1,1,1,0 UseModeSpecificBGAnims=0 +EnableCharSelect=0 +Only2DChars=0 +CharacterIconP1Y=240 +CharacterIconP1X=320 +CharacterIconP2Y=240 +CharacterIconP2X=320 +CharacterIconP1OffCommand=linear,0.3;diffusealpha,0;sleep,10 +CharacterIconP2OffCommand=linear,0.3;diffusealpha,0;sleep,10 [ScreenStyleSplash] NextScreen=ScreenSelectGroup diff --git a/stepmania/src/Character.cpp b/stepmania/src/Character.cpp index a6d1c9d368..5923ff50ad 100644 --- a/stepmania/src/Character.cpp +++ b/stepmania/src/Character.cpp @@ -142,3 +142,23 @@ CString Character::GetHeadPath() const return as[0]; } +bool Character::Has2DElems() +{ + if( DoesFileExist(m_sCharDir + SLASH + "2DFail" + SLASH + "BGAnimation.ini") ) // check 2D Idle BGAnim exists + return true; + if( DoesFileExist(m_sCharDir + SLASH + "2DFever" + SLASH + "BGAnimation.ini") ) // check 2D Idle BGAnim exists + return true; + if( DoesFileExist(m_sCharDir + SLASH + "2DGood" + SLASH + "BGAnimation.ini") ) // check 2D Idle BGAnim exists + return true; + if( DoesFileExist(m_sCharDir + SLASH + "2DMiss" + SLASH + "BGAnimation.ini") ) // check 2D Idle BGAnim exists + return true; + if( DoesFileExist(m_sCharDir + SLASH + "2DWin" + SLASH + "BGAnimation.ini") ) // check 2D Idle BGAnim exists + return true; + if( DoesFileExist(m_sCharDir + SLASH + "2DWinFever" + SLASH + "BGAnimation.ini") ) // check 2D Idle BGAnim exists + return true; + if( DoesFileExist(m_sCharDir + SLASH + "2DGreat" + SLASH + "BGAnimation.ini") ) // check 2D Idle BGAnim exists + return true; + if( DoesFileExist(m_sCharDir + SLASH + "2DIdle" + SLASH + "BGAnimation.ini") ) // check 2D Idle BGAnim exists + return true; + return false; +} \ No newline at end of file diff --git a/stepmania/src/Character.h b/stepmania/src/Character.h index cb7de66da6..378dcc4e8b 100644 --- a/stepmania/src/Character.h +++ b/stepmania/src/Character.h @@ -30,10 +30,14 @@ public: CString GetWarmUpAnimationPath() const; CString GetDanceAnimationPath() const; CString GetSongSelectIconPath() const; + bool Has2DElems(); + CString m_sCharDir; CString m_sName; + + // All the stuff below will be filled in if this character is playable in Rave mode bool m_bUsableInRave; diff --git a/stepmania/src/ScreenCredits.cpp b/stepmania/src/ScreenCredits.cpp index 45e0d2d50f..e7d5ed8c7a 100644 --- a/stepmania/src/ScreenCredits.cpp +++ b/stepmania/src/ScreenCredits.cpp @@ -140,6 +140,7 @@ static const CreditLine CREDIT_LINES[] = {0,"Random Hajile"}, // sent me 3DDX stuff - friez {0,"Chocobo Ghost"}, // sent me ez2 stuff - friez {0,"Tyma"}, // sent me popnmusic stuff - friez + {0,"Deluxe"}, // para para noteskins - friez {0,"Lagged"}, {0,"The Melting Pot"}, {0,"DDRJamz Global BBS"}, diff --git a/stepmania/src/ScreenSelect.h b/stepmania/src/ScreenSelect.h index af95132c05..f15c1cf4de 100644 --- a/stepmania/src/ScreenSelect.h +++ b/stepmania/src/ScreenSelect.h @@ -33,7 +33,7 @@ public: virtual void HandleScreenMessage( const ScreenMessage SM ); virtual void MenuBack( PlayerNumber pn ); - + protected: virtual int GetSelectionIndex( PlayerNumber pn ) = 0; diff --git a/stepmania/src/ScreenSelectMode.cpp b/stepmania/src/ScreenSelectMode.cpp index cbf360142c..56a2c21e63 100644 --- a/stepmania/src/ScreenSelectMode.cpp +++ b/stepmania/src/ScreenSelectMode.cpp @@ -33,6 +33,8 @@ Chris Danford #define GUIDE_Y THEME->GetMetricF("ScreenSelectMode", "GuideY") #define USECONFIRM THEME->GetMetricI("ScreenSelectMode","UseConfirm") #define USE_MODE_SPECIFIC_BGS THEME->GetMetricI("ScreenSelectMode", "UseModeSpecificBGAnims") +#define ENABLE_CHAR_SELECT THEME->GetMetricB("ScreenSelectMode","EnableCharSelect") +#define ONLY_2D_CHARS THEME->GetMetricB("ScreenSelectMode","Only2DChars") /************************************ ScreenSelectMode (Constructor) @@ -41,6 +43,14 @@ Desc: Sets up the screen display ScreenSelectMode::ScreenSelectMode( CString sClassName ) : ScreenSelect( sClassName ) { + m_b2DAvailable = m_bCharsAvailable = false; + + for(int pn=0;pnGetPathToG("ScreenSelectMode list frame")); m_ChoiceListFrame.SetXY( SCROLLING_LIST_X, SCROLLING_LIST_Y); @@ -72,7 +82,35 @@ ScreenSelectMode::ScreenSelectMode( CString sClassName ) : ScreenSelect( sClassN this->AddChild( &m_Backgrounds[i] ); }*/ } - + + // check for character availability + vector apCharacters; + if(ENABLE_CHAR_SELECT) + { + GAMESTATE->GetCharacters( apCharacters ); + + for(int i=0; iHas2DElems()) + { + CString mpath = apCharacters[i]->GetSongSelectIconPath(); + LOG->Trace("Char: %d, %s, 2D: true",i,mpath.c_str()); + m_b2DAvailable = true; + } + else + { + CString mpath = apCharacters[i]->GetSongSelectIconPath(); + LOG->Trace("Char: %d, %s, 2D: false",i,mpath.c_str()); + } + } + } + for(pn=0;pnGetPathToG("ScreenSelectMode nochar") ); + } + // m_ScrollingList.UseSpriteType(BANNERTYPE); m_ScrollingList.SetXY( SCROLLING_LIST_X, SCROLLING_LIST_Y ); m_ScrollingList.SetSpacing( ELEM_SPACING ); @@ -216,12 +254,52 @@ void ScreenSelectMode::HandleScreenMessage( const ScreenMessage SM ) case SM_MenuTimer: { m_bSelected = true; + SetCharacters(); } break; } ScreenSelect::HandleScreenMessage(SM); } +void ScreenSelectMode::SetCharacters() +{ + vector apCharactersToUse; + if(ENABLE_CHAR_SELECT && m_bCharsAvailable) + { + if(ONLY_2D_CHARS && m_b2DAvailable) + { + vector apCharacters; + GAMESTATE->GetCharacters( apCharacters ); + for(int i=0; iHas2DElems()) + { + apCharactersToUse.push_back(apCharacters[i]); + } + } + } + } + else if(m_bCharsAvailable) + { + GAMESTATE->GetCharacters( apCharactersToUse ); + } + } + for(int pn=0; pnIsPlayerEnabled(pn)) + { + if(ENABLE_CHAR_SELECT && m_iCurrentChar[pn] != -1) + { + Character* pChar = apCharactersToUse[m_iCurrentChar[pn]]; + GAMESTATE->m_pCurCharacters[pn] = pChar; + } + } + + } +} + void ScreenSelectMode::MenuStart( PlayerNumber pn ) { if(!m_bSelected && USECONFIRM == 1) @@ -232,10 +310,13 @@ void ScreenSelectMode::MenuStart( PlayerNumber pn ) return; } m_soundStart.Play(); + SetCharacters(); OFF_COMMAND( m_ScrollingList ); OFF_COMMAND( m_Guide ); OFF_COMMAND( m_ChoiceListHighlight ); OFF_COMMAND( m_ChoiceListFrame ); + for(int i=0; iPostMessageToTopScreen( SM_AllDoneChoosing, 0.5f ); } @@ -259,5 +340,121 @@ void ScreenSelectMode::Update( float fDelta ) // } }*/ + for(int pn=0; pnIsPlayerEnabled(pn)) + { + if(ENABLE_CHAR_SELECT) + { + m_CurChar[pn].Draw(); + } + } + } +} + +// todo: optimize the following - Frieza + +void ScreenSelectMode::MenuUp(PlayerNumber pn) +{ + vector apCharactersToUse; + if(ENABLE_CHAR_SELECT && m_bCharsAvailable) + { + if(ONLY_2D_CHARS && m_b2DAvailable) + { + vector apCharacters; + GAMESTATE->GetCharacters( apCharacters ); + for(int i=0; iHas2DElems()) + { + apCharactersToUse.push_back(apCharacters[i]); + } + } + } + } + else if(m_bCharsAvailable) + { + GAMESTATE->GetCharacters( apCharactersToUse ); + } + } + + m_CurChar[pn].UnloadTexture(); + if(ENABLE_CHAR_SELECT && m_bCharsAvailable) + { + if(m_iCurrentChar[pn] <= -1) + m_iCurrentChar[pn] = apCharactersToUse.size() -1; + else + m_iCurrentChar[pn]--; // set to no character + + if(m_iCurrentChar[pn] != -1) + { + if(apCharactersToUse[m_iCurrentChar[pn]]->GetSongSelectIconPath() != "") + m_CurChar[pn].Load( apCharactersToUse[m_iCurrentChar[pn]]->GetSongSelectIconPath() ); + else + m_CurChar[pn].Load( THEME->GetPathToG("ScreenSelectMode chariconmissing") ); + } + else + m_CurChar[pn].Load( THEME->GetPathToG("ScreenSelectMode nochar") ); + } +} + +void ScreenSelectMode::MenuDown(PlayerNumber pn) +{ + vector apCharactersToUse; + if(ENABLE_CHAR_SELECT && m_bCharsAvailable) + { + if(ONLY_2D_CHARS && m_b2DAvailable) + { + vector apCharacters; + GAMESTATE->GetCharacters( apCharacters ); + for(int i=0; iHas2DElems()) + { + apCharactersToUse.push_back(apCharacters[i]); + } + } + } + } + else if(m_bCharsAvailable) + { + GAMESTATE->GetCharacters( apCharactersToUse ); + } + } + + m_CurChar[pn].UnloadTexture(); + if(ENABLE_CHAR_SELECT && m_bCharsAvailable) + { + if(m_iCurrentChar[pn] < apCharactersToUse.size() - 1 || m_iCurrentChar[pn] == -1) + m_iCurrentChar[pn]++; + else + m_iCurrentChar[pn] = -1; // set to no character + if(m_iCurrentChar[pn] != -1) + { + if(apCharactersToUse[m_iCurrentChar[pn]]->GetSongSelectIconPath() != "") + m_CurChar[pn].Load( apCharactersToUse[m_iCurrentChar[pn]]->GetSongSelectIconPath() ); + else + m_CurChar[pn].Load( THEME->GetPathToG("ScreenSelectMode chariconmissing") ); + } + else + m_CurChar[pn].Load( THEME->GetPathToG("ScreenSelectMode nochar") ); + } +} diff --git a/stepmania/src/ScreenSelectMode.h b/stepmania/src/ScreenSelectMode.h index c01231c38b..b62404b128 100644 --- a/stepmania/src/ScreenSelectMode.h +++ b/stepmania/src/ScreenSelectMode.h @@ -4,8 +4,10 @@ Desc: The "Style Select Screen" for Ez2dancer Copyright (c): Andrew Livy *********************************/ - +#ifndef __SCREEN_SELECT_MODE_H +#define __SCREEN_SELECT_MODE_H /* Includes */ + #include "ScreenSelect.h" #include "Background.h" #include "Screen.h" @@ -18,6 +20,7 @@ Andrew Livy #include "BitmapText.h" #include "RandomSample.h" #include "BGAnimationLayer.h" +#include "Character.h" /* Class Definition */ @@ -30,12 +33,16 @@ public: virtual ~ScreenSelectMode(); // Destructor virtual void MenuLeft( PlayerNumber pn ); virtual void MenuRight( PlayerNumber pn ); + virtual void MenuUp(PlayerNumber pn ); + virtual void MenuDown(PlayerNumber pn); virtual void MenuStart( PlayerNumber pn ); virtual void Update( float fDelta ); + virtual void DrawPrimitives(); virtual void HandleScreenMessage( const ScreenMessage SM ); protected: virtual int GetSelectionIndex( PlayerNumber pn ); virtual void UpdateSelectableChoices(); + void SetCharacters(); void ChangeBGA(); int m_iNumChoices; int m_iSelectableChoices[MAX_ELEMS]; @@ -49,7 +56,16 @@ protected: Sprite m_ChoiceListHighlight; Sprite m_sprJoinMessage[NUM_PLAYERS]; Sprite m_sprJoinFrame[NUM_PLAYERS]; + Sprite m_CurChar[NUM_PLAYERS]; + int m_iCurrentChar[NUM_PLAYERS]; Sprite m_Guide; vector m_Backgrounds; bool m_bSelected; + bool m_b2DAvailable; + bool m_bCharsAvailable; + +// private: +// vector m_Characters; }; + +#endif \ No newline at end of file diff --git a/stepmania/src/ScreenSelectMusic.cpp b/stepmania/src/ScreenSelectMusic.cpp index 2edb56dee2..1f761d6a0d 100644 --- a/stepmania/src/ScreenSelectMusic.cpp +++ b/stepmania/src/ScreenSelectMusic.cpp @@ -101,6 +101,7 @@ ScreenSelectMusic::ScreenSelectMusic( CString sClassName ) : Screen( sClassName m_Menu.Load( "ScreenSelectMusic" ); this->AddChild( &m_Menu ); + // pop'n music has this under the songwheel... for( p=0; pm_pCurCharacters[p]; @@ -110,6 +111,8 @@ ScreenSelectMusic::ScreenSelectMusic( CString sClassName ) : Screen( sClassName this->AddChild( &m_sprCharacterIcon[p] ); } + + m_MusicWheelUnder.Load( THEME->GetPathToG("ScreenSelectMusic wheel under") ); m_MusicWheelUnder->SetName( "WheelUnder" ); SET_XY( m_MusicWheelUnder );