Fixed endless courses to make them repick on repeats and not crash after repeating.
This commit is contained in:
+6
-2
@@ -404,6 +404,9 @@ bool Course::GetTrailUnsorted( StepsType st, CourseDifficulty cd, Trail &trail )
|
|||||||
trail.Init();
|
trail.Init();
|
||||||
|
|
||||||
// XXX: Why are beginner and challenge excluded here? -Wolfman2000
|
// XXX: Why are beginner and challenge excluded here? -Wolfman2000
|
||||||
|
// No idea, probably an obsolete design decision from ITG, removing
|
||||||
|
// exclusion here, but there's some other area that prevents it too. -Kyz
|
||||||
|
/*
|
||||||
switch( cd )
|
switch( cd )
|
||||||
{
|
{
|
||||||
case Difficulty_Beginner:
|
case Difficulty_Beginner:
|
||||||
@@ -412,6 +415,7 @@ bool Course::GetTrailUnsorted( StepsType st, CourseDifficulty cd, Trail &trail )
|
|||||||
return false;
|
return false;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// Construct a new Trail, add it to the cache, then return it.
|
// Construct a new Trail, add it to the cache, then return it.
|
||||||
// Different seed for each course, but the same for the whole round:
|
// Different seed for each course, but the same for the whole round:
|
||||||
@@ -848,9 +852,9 @@ bool Course::CourseHasBestOrWorst() const
|
|||||||
{
|
{
|
||||||
FOREACH_CONST( CourseEntry, m_vEntries, e )
|
FOREACH_CONST( CourseEntry, m_vEntries, e )
|
||||||
{
|
{
|
||||||
if( e->iChooseIndex == SongSort_MostPlays && e->iChooseIndex != -1 )
|
if( e->songSort == SongSort_MostPlays && e->iChooseIndex != -1 )
|
||||||
return true;
|
return true;
|
||||||
if( e->iChooseIndex == SongSort_FewestPlays && e->iChooseIndex != -1 )
|
if( e->songSort == SongSort_FewestPlays && e->iChooseIndex != -1 )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2109,6 +2109,11 @@ Difficulty GameState::GetHardestStepsDifficulty() const
|
|||||||
return dc;
|
return dc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GameState::SetNewStageSeed()
|
||||||
|
{
|
||||||
|
m_iStageSeed= rand();
|
||||||
|
}
|
||||||
|
|
||||||
bool GameState::IsEventMode() const
|
bool GameState::IsEventMode() const
|
||||||
{
|
{
|
||||||
return m_bTemporaryEventMode || PREFSMAN->m_bEventMode;
|
return m_bTemporaryEventMode || PREFSMAN->m_bEventMode;
|
||||||
|
|||||||
@@ -117,6 +117,8 @@ public:
|
|||||||
int m_iGameSeed, m_iStageSeed;
|
int m_iGameSeed, m_iStageSeed;
|
||||||
RString m_sStageGUID;
|
RString m_sStageGUID;
|
||||||
|
|
||||||
|
void SetNewStageSeed();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Determine if a second player can join in at this time.
|
* @brief Determine if a second player can join in at this time.
|
||||||
* @return true if a player can still enter the game, false otherwise. */
|
* @return true if a player can still enter the game, false otherwise. */
|
||||||
|
|||||||
@@ -2618,6 +2618,72 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM )
|
|||||||
pi->m_pLifeMeter->OnSongEnded();
|
pi->m_pLifeMeter->OnSongEnded();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If this is a repeating course, and we're at the end of it, repick and
|
||||||
|
// add new songs to the players' step and song queues.
|
||||||
|
if(GAMESTATE->IsCourseMode() && GAMESTATE->m_pCurCourse &&
|
||||||
|
GAMESTATE->m_pCurCourse->m_bRepeat &&
|
||||||
|
GAMESTATE->GetCourseSongIndex() >= (int)m_apSongsQueue.size()-1)
|
||||||
|
{
|
||||||
|
Course* course= GAMESTATE->m_pCurCourse;
|
||||||
|
ASSERT(course != NULL);
|
||||||
|
// Need to store these so they can be used to refetch the players'
|
||||||
|
// trails after they're invalidated.
|
||||||
|
vector<StepsType> trail_sts;
|
||||||
|
vector<CourseDifficulty> trail_cds;
|
||||||
|
FOREACH_EnabledPlayerInfo(m_vPlayerInfo, pi)
|
||||||
|
{
|
||||||
|
Trail* trail= GAMESTATE->m_pCurTrail[pi->GetStepsAndTrailIndex()];
|
||||||
|
ASSERT(trail != NULL);
|
||||||
|
trail_sts.push_back(trail->m_StepsType);
|
||||||
|
trail_cds.push_back(trail->m_CourseDifficulty);
|
||||||
|
}
|
||||||
|
// Set a new stage seed so the order will be different.
|
||||||
|
GAMESTATE->SetNewStageSeed();
|
||||||
|
course->InvalidateTrailCache();
|
||||||
|
course->RegenerateNonFixedTrails();
|
||||||
|
size_t info_id= 0; // Can't use the player number in the playerinfo
|
||||||
|
// because it won't match up in 2-player.
|
||||||
|
FOREACH_EnabledPlayerInfo(m_vPlayerInfo, pi)
|
||||||
|
{
|
||||||
|
Trail* trail= course->GetTrail(trail_sts[info_id], trail_cds[info_id]);
|
||||||
|
ASSERT(trail != NULL);
|
||||||
|
GAMESTATE->m_pCurTrail[pi->m_pn].Set(trail);
|
||||||
|
++info_id;
|
||||||
|
}
|
||||||
|
PlayerNumber master_pn = GAMESTATE->GetMasterPlayerNumber();
|
||||||
|
Trail *master_trail= GAMESTATE->m_pCurTrail[master_pn];
|
||||||
|
ASSERT(master_trail != NULL);
|
||||||
|
FOREACH_CONST(TrailEntry, master_trail->m_vEntries, entry)
|
||||||
|
{
|
||||||
|
ASSERT(entry->pSong != NULL);
|
||||||
|
m_apSongsQueue.push_back(entry->pSong);
|
||||||
|
STATSMAN->m_CurStageStats.m_vpPossibleSongs.push_back(entry->pSong);
|
||||||
|
}
|
||||||
|
FOREACH_EnabledPlayerInfo(m_vPlayerInfo, pi)
|
||||||
|
{
|
||||||
|
Trail* trail= GAMESTATE->m_pCurTrail[pi->GetStepsAndTrailIndex()];
|
||||||
|
ASSERT(trail != NULL);
|
||||||
|
FOREACH_CONST(TrailEntry, trail->m_vEntries, entry)
|
||||||
|
{
|
||||||
|
ASSERT(entry->pSteps != NULL);
|
||||||
|
pi->m_vpStepsQueue.push_back(entry->pSteps);
|
||||||
|
AttackArray a;
|
||||||
|
entry->GetAttackArray(a);
|
||||||
|
pi->m_asModifiersQueue.push_back(a);
|
||||||
|
pi->GetPlayerStageStats()->m_vpPossibleSteps.push_back(entry->pSteps);
|
||||||
|
}
|
||||||
|
// In a survival course, override stored mods
|
||||||
|
if(course->GetCourseType() == COURSE_TYPE_SURVIVAL &&
|
||||||
|
SURVIVAL_MOD_OVERRIDE)
|
||||||
|
{
|
||||||
|
pi->GetPlayerState()->m_PlayerOptions.FromString(ModsLevel_Stage,
|
||||||
|
"clearall," + CommonMetrics::DEFAULT_NOTESKIN_NAME.GetValue() +
|
||||||
|
"," + CommonMetrics::DEFAULT_MODIFIERS.GetValue());
|
||||||
|
pi->GetPlayerState()->RebuildPlayerOptionsFromActiveAttacks();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GAMESTATE->m_bLoadingNextSong = true;
|
GAMESTATE->m_bLoadingNextSong = true;
|
||||||
MESSAGEMAN->Broadcast( "BeforeLoadingNextCourseSong" );
|
MESSAGEMAN->Broadcast( "BeforeLoadingNextCourseSong" );
|
||||||
m_NextSong.Reset();
|
m_NextSong.Reset();
|
||||||
|
|||||||
Reference in New Issue
Block a user