working on new course edit screens

rename: bRandomize -> bShuffle
This commit is contained in:
Chris Danford
2005-08-01 05:18:24 +00:00
parent 6521e86fc1
commit 162f3c8e04
2 changed files with 59 additions and 15 deletions
+55 -14
View File
@@ -22,6 +22,7 @@
#include "UnlockManager.h"
#include <limits.h>
#include "CourseLoaderCRS.h"
#include "LuaFunctions.h"
static const CString CourseTypeNames[] = {
@@ -33,6 +34,9 @@ static const CString CourseTypeNames[] = {
XToString( CourseType, NUM_CourseType );
XToThemedString( CourseType, NUM_CourseType );
LuaFunction( CourseTypeToThemedString, CourseTypeToThemedString((CourseType) IArg(1)) );
static const CString SongSortNames[] = {
"Randomize",
"MostPlays",
@@ -104,14 +108,39 @@ CourseType Course::GetCourseType() const
return COURSE_TYPE_ENDLESS;
if( m_iLives > 0 )
return COURSE_TYPE_ONI;
FOREACH_CONST( CourseEntry, m_vEntries, e )
{
if( e->fGainSeconds > 0 )
return COURSE_TYPE_SURVIVAL;
}
if( !m_vEntries.empty() && m_vEntries[0].fGainSeconds > 0 )
return COURSE_TYPE_SURVIVAL;
return COURSE_TYPE_NONSTOP;
}
void Course::SetCourseType( CourseType ct )
{
if( GetCourseType() == ct )
return;
m_bRepeat = false;
m_iLives = -1;
if( !m_vEntries.empty() )
m_vEntries[0].fGainSeconds = 0;
switch( ct )
{
default: ASSERT(0);
case COURSE_TYPE_NONSTOP:
break;
case COURSE_TYPE_ONI:
m_iLives = 4;
break;
case COURSE_TYPE_ENDLESS:
m_bRepeat = true;
break;
case COURSE_TYPE_SURVIVAL:
if( !m_vEntries.empty() )
m_vEntries[0].fGainSeconds = 120;
break;
}
}
PlayMode Course::GetPlayMode() const
{
switch( GetCourseType() )
@@ -141,7 +170,7 @@ void Course::Init()
{
m_bIsAutogen = false;
m_bRepeat = false;
m_bRandomize = false;
m_bShuffle = false;
m_iLives = -1;
m_bSortByMeter = false;
m_vEntries.clear();
@@ -164,7 +193,7 @@ void Course::AutogenEndlessFromGroup( CString sGroupName, Difficulty diff )
{
m_bIsAutogen = true;
m_bRepeat = true;
m_bRandomize = true;
m_bShuffle = true;
m_iLives = -1;
FOREACH_Difficulty(dc)
m_iCustomMeter[dc] = -1;
@@ -213,7 +242,7 @@ void Course::AutogenOniFromArtist( CString sArtistName, CString sArtistNameTrans
{
m_bIsAutogen = true;
m_bRepeat = false;
m_bRandomize = true;
m_bShuffle = true;
m_bSortByMeter = true;
m_iLives = 4;
@@ -342,6 +371,11 @@ Trail* Course::GetTrail( StepsType st, CourseDifficulty cd ) const
}
}
return GetTrailForceRegenCache( st, cd );
}
Trail* Course::GetTrailForceRegenCache( StepsType st, CourseDifficulty cd ) const
{
//
// Construct a new Trail, add it to the cache, then return it.
//
@@ -428,7 +462,7 @@ bool Course::GetTrailUnsorted( StepsType st, CourseDifficulty cd, Trail &trail )
RandomGen rnd( GAMESTATE->m_iStageSeed + GetHashForString(m_sMainTitle) );
vector<CourseEntry> tmp_entries;
if( m_bRandomize )
if( m_bShuffle )
{
/* Always randomize the same way per round. Otherwise, the displayed course
* will change every time it's viewed, and the displayed order will have no
@@ -437,7 +471,7 @@ bool Course::GetTrailUnsorted( StepsType st, CourseDifficulty cd, Trail &trail )
random_shuffle( tmp_entries.begin(), tmp_entries.end(), rnd );
}
const vector<CourseEntry> &entries = m_bRandomize? tmp_entries:m_vEntries;
const vector<CourseEntry> &entries = m_bShuffle? tmp_entries:m_vEntries;
/* This can take some time, so don't fill it out unless we need it. */
vector<Song*> vSongsByMostPlayed;
@@ -572,12 +606,14 @@ bool Course::GetTrailUnsorted( StepsType st, CourseDifficulty cd, Trail &trail )
// TODO: Move Course initialization after PROFILEMAN is created
bool bForceSecret = false;
switch( e->songSort )
{
default:
ASSERT(0);
case SongSort_Randomize:
random_shuffle( vpPossibleSongs.begin(), vpPossibleSongs.end(), rnd );
bForceSecret = vpPossibleSongs.size() > 1;
break;
case SongSort_MostPlays:
if( PROFILEMAN )
@@ -667,7 +703,7 @@ bool Course::GetTrailUnsorted( StepsType st, CourseDifficulty cd, Trail &trail )
te.pSteps = pResolvedSteps;
te.Modifiers = e->sModifiers;
te.Attacks = e->attacks;
te.bSecret = e->bSecret;
te.bSecret = e->bSecret || bForceSecret;
te.iLowMeter = iLowMeter;
te.iHighMeter = iHighMeter;
@@ -686,12 +722,12 @@ bool Course::GetTrailUnsorted( StepsType st, CourseDifficulty cd, Trail &trail )
trail.m_vEntries.push_back( te );
}
/* Hack: If any entry was non-FIXED, or m_bRandomize is set, then radar values
/* Hack: If any entry was non-FIXED, or m_bShuffle is set, then radar values
* for this trail will be meaningless as they'll change every time. Pre-cache
* empty data. XXX: How can we do this cleanly, without propagating lots of
* otherwise unnecessary data (course entry types, m_bRandomize) to Trail, or
* otherwise unnecessary data (course entry types, m_bShuffle) to Trail, or
* storing a Course pointer in Trail (yuck)? */
if( !AllSongsAreFixed() || m_bRandomize )
if( !AllSongsAreFixed() || m_bShuffle )
{
trail.m_bRadarValuesCached = true;
trail.m_CachedRadarValues = RadarValues();
@@ -764,6 +800,7 @@ void Course::Invalidate( Song *pStaleSong )
// non-fixed entry. So, regenerating the Trail will force different
// songs to be chosen.
FOREACH_StepsType( st )
{
FOREACH_ShownCourseDifficulty( cd )
{
TrailCache_t::iterator it = m_TrailCache.find( CacheEntry(st, cd) );
@@ -774,6 +811,7 @@ void Course::Invalidate( Song *pStaleSong )
if( GetTrail( st, cd )->ContainsSong( pStaleSong ) )
m_TrailCache.erase( it );
}
}
}
void Course::RegenerateNonFixedTrails()
@@ -973,6 +1011,7 @@ public:
static int GetDisplayFullTitle( T* p, lua_State *L ) { lua_pushstring(L, p->GetDisplayFullTitle() ); return 1; }
static int GetTranslitFullTitle( T* p, lua_State *L ) { lua_pushstring(L, p->GetTranslitFullTitle() ); return 1; }
static int HasMods( T* p, lua_State *L ) { lua_pushboolean(L, p->HasMods() ); return 1; }
static int GetCourseType( T* p, lua_State *L ) { lua_pushnumber(L, p->GetCourseType() ); return 1; }
static void Register(lua_State *L)
{
@@ -980,6 +1019,8 @@ public:
ADD_METHOD( GetDisplayFullTitle )
ADD_METHOD( GetTranslitFullTitle )
ADD_METHOD( HasMods )
ADD_METHOD( GetCourseType )
Luna<T>::Register( L );
}
};
+4 -1
View File
@@ -119,7 +119,7 @@ public:
CString m_sGroupName;
bool m_bRepeat; // repeat after last song? "Endless"
bool m_bRandomize; // play the songs in a random order
bool m_bShuffle; // play the songs in a random order
int m_iLives; // -1 means use bar life meter
int m_iCustomMeter[NUM_DIFFICULTIES]; // -1 = no meter specified
bool m_bSortByMeter;
@@ -141,6 +141,7 @@ public:
// Dereferences course_entries and returns only the playable Songs and Steps
Trail* GetTrail( StepsType st, CourseDifficulty cd=DIFFICULTY_MEDIUM ) const;
Trail* GetTrailForceRegenCache( StepsType st, CourseDifficulty cd=DIFFICULTY_MEDIUM ) const;
void GetTrails( vector<Trail*> &AddTo, StepsType st ) const;
void GetAllTrails( vector<Trail*> &AddTo ) const;
float GetMeter( StepsType st, CourseDifficulty cd=DIFFICULTY_MEDIUM ) const;
@@ -157,6 +158,7 @@ public:
bool IsOni() const { return GetPlayMode() == PLAY_MODE_ONI; }
bool IsEndless() const { return GetPlayMode() == PLAY_MODE_ENDLESS; }
CourseType GetCourseType() const;
void SetCourseType( CourseType ct );
PlayMode GetPlayMode() const;
bool IsFixed() const;
@@ -198,6 +200,7 @@ public:
bool GetTrailUnsorted( StepsType st, CourseDifficulty cd, Trail &trail ) const;
bool GetTrailSorted( StepsType st, CourseDifficulty cd, Trail &trail ) const;
bool IsAnEdit() const { return m_LoadedFromProfile != PROFILE_SLOT_INVALID; }
ProfileSlot m_LoadedFromProfile; // PROFILE_SLOT_INVALID if wasn't loaded from a profile
typedef pair<StepsType,Difficulty> CacheEntry;