add default character so Rave/Battle is playable without character models
This commit is contained in:
@@ -122,7 +122,10 @@ bool BeginnerHelper::CanUse()
|
||||
|
||||
if( GAMESTATE->m_CurGame != GAME_DANCE )
|
||||
return false;
|
||||
if( GAMESTATE->m_pCharacters.size() == 0 )
|
||||
|
||||
vector<Character*> apCharacters;
|
||||
GAMESTATE->GetCharacters( apCharacters );
|
||||
if( apCharacters.size() == 0 )
|
||||
return false;
|
||||
|
||||
switch (GAMESTATE->m_CurStyle)
|
||||
|
||||
@@ -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)); }
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<NUM_PLAYERS; p++ )
|
||||
@@ -727,3 +727,31 @@ bool GameState::ShowMarvelous() const
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void GameState::GetCharacters( vector<Character*> apCharactersOut )
|
||||
{
|
||||
for( unsigned i=0; i<m_pCharacters.size(); i++ )
|
||||
if( m_pCharacters[i]->m_sName.CompareNoCase("default")!=0 )
|
||||
apCharactersOut.push_back( m_pCharacters[i] );
|
||||
}
|
||||
|
||||
Character* GameState::GetRandomCharacter()
|
||||
{
|
||||
vector<Character*> apCharacters;
|
||||
GetCharacters( apCharacters );
|
||||
if( apCharacters.size() )
|
||||
return m_pCharacters[rand()%apCharacters.size()];
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Character* GameState::GetDefaultCharacter()
|
||||
{
|
||||
for( unsigned i=0; i<m_pCharacters.size(); i++ )
|
||||
{
|
||||
if( m_pCharacters[i]->m_sName.CompareNoCase("default")==0 )
|
||||
return m_pCharacters[i];
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -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<Character*> apCharactersOut );
|
||||
Character* GameState::GetRandomCharacter();
|
||||
Character* GameState::GetDefaultCharacter();
|
||||
|
||||
PlayerController m_PlayerController[NUM_PLAYERS];
|
||||
|
||||
@@ -234,7 +230,9 @@ public:
|
||||
void AdjustFailType();
|
||||
|
||||
// character stuff
|
||||
vector<Character*> m_pCharacters;
|
||||
private:
|
||||
vector<Character*> m_pCharacters;
|
||||
public:
|
||||
Character* m_pCurCharacters[NUM_PLAYERS];
|
||||
|
||||
void ReloadCharacters();
|
||||
|
||||
@@ -154,6 +154,7 @@ void PlayerMinus::Load( PlayerNumber pn, NoteData* pNoteData, LifeMeter* pLM, Co
|
||||
for( int al=0; al<NUM_ATTACK_LEVELS; al++ )
|
||||
{
|
||||
Character *ch = GAMESTATE->m_pCurCharacters[m_PlayerNumber];
|
||||
ASSERT( ch );
|
||||
CString* asAttacks = ch->m_sAttacks[al];
|
||||
for( int att = 0; att < NUM_ATTACKS_PER_LEVEL; ++att )
|
||||
{
|
||||
|
||||
@@ -104,7 +104,9 @@ ScreenHowToPlay::ScreenHowToPlay() : ScreenAttract("ScreenHowToPlay")
|
||||
}
|
||||
|
||||
// Display random character
|
||||
if( USECHARACTER && GAMESTATE->m_pCharacters.size() && HaveAllCharAnimations() )
|
||||
vector<Character*> apCharacters;
|
||||
GAMESTATE->GetCharacters( apCharacters );
|
||||
if( USECHARACTER && apCharacters.size() && HaveAllCharAnimations() )
|
||||
{
|
||||
Character* rndchar = GAMESTATE->GetRandomCharacter();
|
||||
|
||||
|
||||
@@ -176,9 +176,11 @@ void ScreenPlayerOptions::ImportOptions()
|
||||
//
|
||||
m_OptionRow[PO_CHARACTER].choices.clear();
|
||||
m_OptionRow[PO_CHARACTER].choices.push_back( "OFF" );
|
||||
for( i=0; i<GAMESTATE->m_pCharacters.size(); i++ )
|
||||
vector<Character*> apCharacters;
|
||||
GAMESTATE->GetCharacters( apCharacters );
|
||||
for( i=0; i<apCharacters.size(); i++ )
|
||||
{
|
||||
CString s = GAMESTATE->m_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; i<GAMESTATE->m_pCharacters.size(); i++ )
|
||||
if( GAMESTATE->m_pCurCharacters[p] == GAMESTATE->m_pCharacters[i] )
|
||||
vector<Character*> apCharacters;
|
||||
GAMESTATE->GetCharacters( apCharacters );
|
||||
for( i=0; i<apCharacters.size(); i++ )
|
||||
if( GAMESTATE->m_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<Character*> apCharacters;
|
||||
GAMESTATE->GetCharacters( apCharacters );
|
||||
GAMESTATE->m_pCurCharacters[p] = apCharacters[choice];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Character*> 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<Character*> 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; i<MAX_CHAR_ICONS_TO_SHOW; i++ )
|
||||
{
|
||||
c++;
|
||||
wrap( c, GAMESTATE->m_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<Character*> 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; p<NUM_PLAYERS; p++ )
|
||||
{
|
||||
Character* pChar = GAMESTATE->m_pCharacters[ m_iSelectedCharacter[p] ];
|
||||
vector<Character*> apCharacters;
|
||||
GAMESTATE->GetCharacters( apCharacters );
|
||||
Character* pChar = apCharacters[ m_iSelectedCharacter[p] ];
|
||||
GAMESTATE->m_pCurCharacters[p] = pChar;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user