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 )
|
if( GAMESTATE->m_CurGame != GAME_DANCE )
|
||||||
return false;
|
return false;
|
||||||
if( GAMESTATE->m_pCharacters.size() == 0 )
|
|
||||||
|
vector<Character*> apCharacters;
|
||||||
|
GAMESTATE->GetCharacters( apCharacters );
|
||||||
|
if( apCharacters.size() == 0 )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
switch (GAMESTATE->m_CurStyle)
|
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::GetRestAnimationPath() { return DerefRedir(GetRandomFileInDir(m_sCharDir + "Rest" SLASH)); }
|
||||||
CString Character::GetWarmUpAnimationPath() { return DerefRedir(GetRandomFileInDir(m_sCharDir + "WarmUp" SLASH)); }
|
CString Character::GetWarmUpAnimationPath() { return DerefRedir(GetRandomFileInDir(m_sCharDir + "WarmUp" SLASH)); }
|
||||||
CString Character::GetDanceAnimationPath() { return DerefRedir(GetRandomFileInDir(m_sCharDir + "Dance" SLASH)); }
|
CString Character::GetDanceAnimationPath() { return DerefRedir(GetRandomFileInDir(m_sCharDir + "Dance" SLASH)); }
|
||||||
|
|||||||
@@ -53,6 +53,9 @@ DancingCharacters::DancingCharacters()
|
|||||||
if( !pChar )
|
if( !pChar )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if( pChar->GetModelPath().empty() )
|
||||||
|
continue;
|
||||||
|
|
||||||
if( GAMESTATE->GetNumPlayersEnabled()==2 )
|
if( GAMESTATE->GetNumPlayersEnabled()==2 )
|
||||||
m_Character[p].SetX( MODEL_X_TWO_PLAYERS[p] );
|
m_Character[p].SetX( MODEL_X_TWO_PLAYERS[p] );
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -113,7 +113,7 @@ void GameState::Reset()
|
|||||||
if( PREFSMAN->m_ShowDancingCharacters == PrefsManager::CO_RANDOM)
|
if( PREFSMAN->m_ShowDancingCharacters == PrefsManager::CO_RANDOM)
|
||||||
m_pCurCharacters[p] = GetRandomCharacter();
|
m_pCurCharacters[p] = GetRandomCharacter();
|
||||||
else
|
else
|
||||||
m_pCurCharacters[p] = NULL;
|
m_pCurCharacters[p] = GetDefaultCharacter();
|
||||||
}
|
}
|
||||||
|
|
||||||
for( p=0; p<NUM_PLAYERS; p++ )
|
for( p=0; p<NUM_PLAYERS; p++ )
|
||||||
@@ -727,3 +727,31 @@ bool GameState::ShowMarvelous() const
|
|||||||
|
|
||||||
return false;
|
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 true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
Character* GameState::GetRandomCharacter()
|
void GetCharacters( vector<Character*> apCharactersOut );
|
||||||
{
|
Character* GameState::GetRandomCharacter();
|
||||||
if( m_pCharacters.size() )
|
Character* GameState::GetDefaultCharacter();
|
||||||
return m_pCharacters[rand()%m_pCharacters.size()];
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
PlayerController m_PlayerController[NUM_PLAYERS];
|
PlayerController m_PlayerController[NUM_PLAYERS];
|
||||||
|
|
||||||
@@ -234,7 +230,9 @@ public:
|
|||||||
void AdjustFailType();
|
void AdjustFailType();
|
||||||
|
|
||||||
// character stuff
|
// character stuff
|
||||||
vector<Character*> m_pCharacters;
|
private:
|
||||||
|
vector<Character*> m_pCharacters;
|
||||||
|
public:
|
||||||
Character* m_pCurCharacters[NUM_PLAYERS];
|
Character* m_pCurCharacters[NUM_PLAYERS];
|
||||||
|
|
||||||
void ReloadCharacters();
|
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++ )
|
for( int al=0; al<NUM_ATTACK_LEVELS; al++ )
|
||||||
{
|
{
|
||||||
Character *ch = GAMESTATE->m_pCurCharacters[m_PlayerNumber];
|
Character *ch = GAMESTATE->m_pCurCharacters[m_PlayerNumber];
|
||||||
|
ASSERT( ch );
|
||||||
CString* asAttacks = ch->m_sAttacks[al];
|
CString* asAttacks = ch->m_sAttacks[al];
|
||||||
for( int att = 0; att < NUM_ATTACKS_PER_LEVEL; ++att )
|
for( int att = 0; att < NUM_ATTACKS_PER_LEVEL; ++att )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -104,7 +104,9 @@ ScreenHowToPlay::ScreenHowToPlay() : ScreenAttract("ScreenHowToPlay")
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Display random character
|
// 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();
|
Character* rndchar = GAMESTATE->GetRandomCharacter();
|
||||||
|
|
||||||
|
|||||||
@@ -176,9 +176,11 @@ void ScreenPlayerOptions::ImportOptions()
|
|||||||
//
|
//
|
||||||
m_OptionRow[PO_CHARACTER].choices.clear();
|
m_OptionRow[PO_CHARACTER].choices.clear();
|
||||||
m_OptionRow[PO_CHARACTER].choices.push_back( "OFF" );
|
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();
|
s.MakeUpper();
|
||||||
m_OptionRow[PO_CHARACTER].choices.push_back( s );
|
m_OptionRow[PO_CHARACTER].choices.push_back( s );
|
||||||
}
|
}
|
||||||
@@ -293,8 +295,10 @@ void ScreenPlayerOptions::ImportOptions()
|
|||||||
m_iSelectedOption[p][PO_PERSPECTIVE] = n;
|
m_iSelectedOption[p][PO_PERSPECTIVE] = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
for( i=0; i<GAMESTATE->m_pCharacters.size(); i++ )
|
vector<Character*> apCharacters;
|
||||||
if( GAMESTATE->m_pCurCharacters[p] == GAMESTATE->m_pCharacters[i] )
|
GAMESTATE->GetCharacters( apCharacters );
|
||||||
|
for( i=0; i<apCharacters.size(); i++ )
|
||||||
|
if( GAMESTATE->m_pCurCharacters[p] == apCharacters[i] )
|
||||||
m_iSelectedOption[p][PO_CHARACTER] = i+1;
|
m_iSelectedOption[p][PO_CHARACTER] = i+1;
|
||||||
|
|
||||||
/* Why do this? We don't want to erase if we back out. */
|
/* Why do this? We don't want to erase if we back out. */
|
||||||
@@ -430,7 +434,9 @@ void ScreenPlayerOptions::ExportOptions()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
int choice = m_iSelectedOption[p][PO_CHARACTER] - 1;
|
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_BATTLE:
|
||||||
case PLAY_MODE_RAVE:
|
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;
|
break;
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -89,8 +78,9 @@ ScreenSelectCharacter::ScreenSelectCharacter() : Screen("ScreenSelectCharacter")
|
|||||||
// characters or if this screen should be hidden
|
// characters or if this screen should be hidden
|
||||||
//
|
//
|
||||||
default:
|
default:
|
||||||
if( GAMESTATE->m_pCharacters.empty() ||
|
vector<Character*> apCharacters;
|
||||||
PREFSMAN->m_ShowDancingCharacters != PrefsManager::CO_SELECT )
|
GAMESTATE->GetCharacters( apCharacters );
|
||||||
|
if( apCharacters.empty() || PREFSMAN->m_ShowDancingCharacters != PrefsManager::CO_SELECT )
|
||||||
{
|
{
|
||||||
HandleScreenMessage( SM_GoToNextScreen );
|
HandleScreenMessage( SM_GoToNextScreen );
|
||||||
return;
|
return;
|
||||||
@@ -278,7 +268,9 @@ void ScreenSelectCharacter::AfterValueChange( PlayerNumber pn )
|
|||||||
case CHOOSING_CPU_CHARACTER:
|
case CHOOSING_CPU_CHARACTER:
|
||||||
case CHOOSING_HUMAN_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].UnloadTexture();
|
||||||
m_sprCard[pnAffected].Load( pChar->GetCardPath() );
|
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] );
|
m_AttackIcons[pnAffected][i][j].Load( pnAffected, pChar->m_sAttacks[i][j] );
|
||||||
|
|
||||||
int c = m_iSelectedCharacter[pnAffected] - MAX_CHAR_ICONS_TO_SHOW/2;
|
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++ )
|
for( unsigned i=0; i<MAX_CHAR_ICONS_TO_SHOW; i++ )
|
||||||
{
|
{
|
||||||
c++;
|
c++;
|
||||||
wrap( c, GAMESTATE->m_pCharacters.size() );
|
wrap( c, apCharacters.size() );
|
||||||
Character* pCharacter = GAMESTATE->m_pCharacters[c];
|
Character* pCharacter = apCharacters[c];
|
||||||
Banner &banner = m_sprIcons[pnAffected][i];
|
Banner &banner = m_sprIcons[pnAffected][i];
|
||||||
banner.LoadIconFromCharacter( pCharacter );
|
banner.LoadIconFromCharacter( pCharacter );
|
||||||
float fX = (pnAffected==PLAYER_1) ? 320-ICON_WIDTH : 320+ICON_WIDTH;
|
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_CPU_CHARACTER:
|
||||||
case CHOOSING_HUMAN_CHARACTER:
|
case CHOOSING_HUMAN_CHARACTER:
|
||||||
m_iSelectedCharacter[pnAffected] = (m_iSelectedCharacter[pnAffected]+deltaValue)+GAMESTATE->m_pCharacters.size();
|
vector<Character*> apCharacters;
|
||||||
m_iSelectedCharacter[pnAffected] %= GAMESTATE->m_pCharacters.size();
|
GAMESTATE->GetCharacters( apCharacters );
|
||||||
|
m_iSelectedCharacter[pnAffected] += deltaValue;
|
||||||
|
wrap( m_iSelectedCharacter[pnAffected], apCharacters.size() );
|
||||||
AfterValueChange(pn);
|
AfterValueChange(pn);
|
||||||
m_soundChange.PlayRandom();
|
m_soundChange.PlayRandom();
|
||||||
break;
|
break;
|
||||||
@@ -378,7 +372,9 @@ void ScreenSelectCharacter::MenuStart( PlayerNumber pn )
|
|||||||
{
|
{
|
||||||
for( int p=0; p<NUM_PLAYERS; p++ )
|
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;
|
GAMESTATE->m_pCurCharacters[p] = pChar;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user