diff --git a/stepmania/src/BeginnerHelper.cpp b/stepmania/src/BeginnerHelper.cpp index a388723e60..1d3aa14ba5 100644 --- a/stepmania/src/BeginnerHelper.cpp +++ b/stepmania/src/BeginnerHelper.cpp @@ -122,7 +122,10 @@ bool BeginnerHelper::CanUse() if( GAMESTATE->m_CurGame != GAME_DANCE ) return false; - if( GAMESTATE->m_pCharacters.size() == 0 ) + + vector apCharacters; + GAMESTATE->GetCharacters( apCharacters ); + if( apCharacters.size() == 0 ) return false; switch (GAMESTATE->m_CurStyle) diff --git a/stepmania/src/Character.cpp b/stepmania/src/Character.cpp index fdf6127bcc..131af6e111 100644 --- a/stepmania/src/Character.cpp +++ b/stepmania/src/Character.cpp @@ -52,7 +52,15 @@ CString GetRandomFileInDir( CString sDir ) } -CString Character::GetModelPath() { return m_sCharDir + "model.txt"; } +CString Character::GetModelPath() +{ + CString s = m_sCharDir + "model.txt"; + if( DoesFileExist(s) ) + return s; + else + return ""; +} + CString Character::GetRestAnimationPath() { return DerefRedir(GetRandomFileInDir(m_sCharDir + "Rest" SLASH)); } CString Character::GetWarmUpAnimationPath() { return DerefRedir(GetRandomFileInDir(m_sCharDir + "WarmUp" SLASH)); } CString Character::GetDanceAnimationPath() { return DerefRedir(GetRandomFileInDir(m_sCharDir + "Dance" SLASH)); } diff --git a/stepmania/src/DancingCharacters.cpp b/stepmania/src/DancingCharacters.cpp index f5f92ef865..f99de1d3c0 100644 --- a/stepmania/src/DancingCharacters.cpp +++ b/stepmania/src/DancingCharacters.cpp @@ -53,6 +53,9 @@ DancingCharacters::DancingCharacters() if( !pChar ) continue; + if( pChar->GetModelPath().empty() ) + continue; + if( GAMESTATE->GetNumPlayersEnabled()==2 ) m_Character[p].SetX( MODEL_X_TWO_PLAYERS[p] ); else diff --git a/stepmania/src/GameState.cpp b/stepmania/src/GameState.cpp index 2a18f2a34b..95b63e31be 100644 --- a/stepmania/src/GameState.cpp +++ b/stepmania/src/GameState.cpp @@ -113,7 +113,7 @@ void GameState::Reset() if( PREFSMAN->m_ShowDancingCharacters == PrefsManager::CO_RANDOM) m_pCurCharacters[p] = GetRandomCharacter(); else - m_pCurCharacters[p] = NULL; + m_pCurCharacters[p] = GetDefaultCharacter(); } for( p=0; p apCharactersOut ) +{ + for( unsigned i=0; im_sName.CompareNoCase("default")!=0 ) + apCharactersOut.push_back( m_pCharacters[i] ); +} + +Character* GameState::GetRandomCharacter() +{ + vector apCharacters; + GetCharacters( apCharacters ); + if( apCharacters.size() ) + return m_pCharacters[rand()%apCharacters.size()]; + else + return NULL; +} + +Character* GameState::GetDefaultCharacter() +{ + for( unsigned i=0; im_sName.CompareNoCase("default")==0 ) + return m_pCharacters[i]; + } + + return NULL; +} diff --git a/stepmania/src/GameState.h b/stepmania/src/GameState.h index 3482c44366..ba45ffc3e4 100644 --- a/stepmania/src/GameState.h +++ b/stepmania/src/GameState.h @@ -96,13 +96,9 @@ public: return true; return false; } - Character* GameState::GetRandomCharacter() - { - if( m_pCharacters.size() ) - return m_pCharacters[rand()%m_pCharacters.size()]; - else - return NULL; - } + void GetCharacters( vector apCharactersOut ); + Character* GameState::GetRandomCharacter(); + Character* GameState::GetDefaultCharacter(); PlayerController m_PlayerController[NUM_PLAYERS]; @@ -234,7 +230,9 @@ public: void AdjustFailType(); // character stuff - vector m_pCharacters; + private: + vector m_pCharacters; + public: Character* m_pCurCharacters[NUM_PLAYERS]; void ReloadCharacters(); diff --git a/stepmania/src/Player.cpp b/stepmania/src/Player.cpp index ac83288c55..01fa250843 100644 --- a/stepmania/src/Player.cpp +++ b/stepmania/src/Player.cpp @@ -154,6 +154,7 @@ void PlayerMinus::Load( PlayerNumber pn, NoteData* pNoteData, LifeMeter* pLM, Co for( int al=0; alm_pCurCharacters[m_PlayerNumber]; + ASSERT( ch ); CString* asAttacks = ch->m_sAttacks[al]; for( int att = 0; att < NUM_ATTACKS_PER_LEVEL; ++att ) { diff --git a/stepmania/src/ScreenHowToPlay.cpp b/stepmania/src/ScreenHowToPlay.cpp index 3c9e0d1dc3..d315a0cd29 100644 --- a/stepmania/src/ScreenHowToPlay.cpp +++ b/stepmania/src/ScreenHowToPlay.cpp @@ -104,7 +104,9 @@ ScreenHowToPlay::ScreenHowToPlay() : ScreenAttract("ScreenHowToPlay") } // Display random character - if( USECHARACTER && GAMESTATE->m_pCharacters.size() && HaveAllCharAnimations() ) + vector apCharacters; + GAMESTATE->GetCharacters( apCharacters ); + if( USECHARACTER && apCharacters.size() && HaveAllCharAnimations() ) { Character* rndchar = GAMESTATE->GetRandomCharacter(); diff --git a/stepmania/src/ScreenPlayerOptions.cpp b/stepmania/src/ScreenPlayerOptions.cpp index 61cb5e6172..57b1de6a1d 100644 --- a/stepmania/src/ScreenPlayerOptions.cpp +++ b/stepmania/src/ScreenPlayerOptions.cpp @@ -176,9 +176,11 @@ void ScreenPlayerOptions::ImportOptions() // m_OptionRow[PO_CHARACTER].choices.clear(); m_OptionRow[PO_CHARACTER].choices.push_back( "OFF" ); - for( i=0; im_pCharacters.size(); i++ ) + vector apCharacters; + GAMESTATE->GetCharacters( apCharacters ); + for( i=0; im_pCharacters[i]->m_sName; + CString s = apCharacters[i]->m_sName; s.MakeUpper(); m_OptionRow[PO_CHARACTER].choices.push_back( s ); } @@ -293,8 +295,10 @@ void ScreenPlayerOptions::ImportOptions() m_iSelectedOption[p][PO_PERSPECTIVE] = n; } - for( i=0; im_pCharacters.size(); i++ ) - if( GAMESTATE->m_pCurCharacters[p] == GAMESTATE->m_pCharacters[i] ) + vector apCharacters; + GAMESTATE->GetCharacters( apCharacters ); + for( i=0; im_pCurCharacters[p] == apCharacters[i] ) m_iSelectedOption[p][PO_CHARACTER] = i+1; /* Why do this? We don't want to erase if we back out. */ @@ -430,7 +434,9 @@ void ScreenPlayerOptions::ExportOptions() else { int choice = m_iSelectedOption[p][PO_CHARACTER] - 1; - GAMESTATE->m_pCurCharacters[p] = GAMESTATE->m_pCharacters[choice]; + vector apCharacters; + GAMESTATE->GetCharacters( apCharacters ); + GAMESTATE->m_pCurCharacters[p] = apCharacters[choice]; } } } diff --git a/stepmania/src/ScreenSelectCharacter.cpp b/stepmania/src/ScreenSelectCharacter.cpp index 08fec27a42..8786b67e53 100644 --- a/stepmania/src/ScreenSelectCharacter.cpp +++ b/stepmania/src/ScreenSelectCharacter.cpp @@ -71,17 +71,6 @@ ScreenSelectCharacter::ScreenSelectCharacter() : Screen("ScreenSelectCharacter") // case PLAY_MODE_BATTLE: case PLAY_MODE_RAVE: - // - // The case of disallowing the playing of Rave/Battle mode when there - // are no characters should be handled by ScreenSelectXxx consulting - // GAMESTATE->IsPlayable(), and not here. - // - // if( GAMESTATE->m_pCharacters.empty() ) - // { - // SCREENMAN->Prompt( SM_GoToPrevScreen, "No characters are installed.\n\nAt least one character must be installed\nto play this mode." ); - // return; - //} - ASSERT( !GAMESTATE->m_pCharacters.empty() ); break; // @@ -89,8 +78,9 @@ ScreenSelectCharacter::ScreenSelectCharacter() : Screen("ScreenSelectCharacter") // characters or if this screen should be hidden // default: - if( GAMESTATE->m_pCharacters.empty() || - PREFSMAN->m_ShowDancingCharacters != PrefsManager::CO_SELECT ) + vector apCharacters; + GAMESTATE->GetCharacters( apCharacters ); + if( apCharacters.empty() || PREFSMAN->m_ShowDancingCharacters != PrefsManager::CO_SELECT ) { HandleScreenMessage( SM_GoToNextScreen ); return; @@ -278,7 +268,9 @@ void ScreenSelectCharacter::AfterValueChange( PlayerNumber pn ) case CHOOSING_CPU_CHARACTER: case CHOOSING_HUMAN_CHARACTER: { - Character* pChar = GAMESTATE->m_pCharacters[ m_iSelectedCharacter[pnAffected] ]; + vector apCharacters; + GAMESTATE->GetCharacters( apCharacters ); + Character* pChar = apCharacters[ m_iSelectedCharacter[pnAffected] ]; m_sprCard[pnAffected].UnloadTexture(); m_sprCard[pnAffected].Load( pChar->GetCardPath() ); @@ -288,13 +280,13 @@ void ScreenSelectCharacter::AfterValueChange( PlayerNumber pn ) m_AttackIcons[pnAffected][i][j].Load( pnAffected, pChar->m_sAttacks[i][j] ); int c = m_iSelectedCharacter[pnAffected] - MAX_CHAR_ICONS_TO_SHOW/2; - wrap( c, GAMESTATE->m_pCharacters.size() ); + wrap( c, apCharacters.size() ); for( unsigned i=0; im_pCharacters.size() ); - Character* pCharacter = GAMESTATE->m_pCharacters[c]; + wrap( c, apCharacters.size() ); + Character* pCharacter = apCharacters[c]; Banner &banner = m_sprIcons[pnAffected][i]; banner.LoadIconFromCharacter( pCharacter ); float fX = (pnAffected==PLAYER_1) ? 320-ICON_WIDTH : 320+ICON_WIDTH; @@ -340,8 +332,10 @@ void ScreenSelectCharacter::Move( PlayerNumber pn, int deltaValue ) { case CHOOSING_CPU_CHARACTER: case CHOOSING_HUMAN_CHARACTER: - m_iSelectedCharacter[pnAffected] = (m_iSelectedCharacter[pnAffected]+deltaValue)+GAMESTATE->m_pCharacters.size(); - m_iSelectedCharacter[pnAffected] %= GAMESTATE->m_pCharacters.size(); + vector apCharacters; + GAMESTATE->GetCharacters( apCharacters ); + m_iSelectedCharacter[pnAffected] += deltaValue; + wrap( m_iSelectedCharacter[pnAffected], apCharacters.size() ); AfterValueChange(pn); m_soundChange.PlayRandom(); break; @@ -378,7 +372,9 @@ void ScreenSelectCharacter::MenuStart( PlayerNumber pn ) { for( int p=0; pm_pCharacters[ m_iSelectedCharacter[p] ]; + vector apCharacters; + GAMESTATE->GetCharacters( apCharacters ); + Character* pChar = apCharacters[ m_iSelectedCharacter[p] ]; GAMESTATE->m_pCurCharacters[p] = pChar; } diff --git a/stepmania/src/StepMania.RC b/stepmania/src/StepMania.RC index 66202df741..782c695bd4 100644 --- a/stepmania/src/StepMania.RC +++ b/stepmania/src/StepMania.RC @@ -79,7 +79,7 @@ IDD_OK DIALOG DISCARDABLE 0, 0, 318, 87 STYLE DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | WS_CAPTION CAPTION "StepMania" FONT 8, "MS Shell Dlg" -BEGIN +BEGIN DEFPUSHBUTTON "OK",IDOK,131,66,50,14 CONTROL "&Don't display this message",IDC_HUSH,"Button", BS_AUTOCHECKBOX | WS_TABSTOP,211,67,100,10