save radar values in Catalog.xml

change Course to have the same title names as Song
This commit is contained in:
Chris Danford
2004-07-11 10:02:38 +00:00
parent 501917fd63
commit 3d1bb5b97a
13 changed files with 105 additions and 55 deletions
+10 -3
View File
@@ -50,7 +50,10 @@ void SaveCatalogXml()
StepsID stepsID; StepsID stepsID;
stepsID.FromSteps( pSteps ); stepsID.FromSteps( pSteps );
pSongNode->AppendChild( stepsID.CreateNode() ); XNode* pStepsIDNode = stepsID.CreateNode();
pSongNode->AppendChild( pStepsIDNode );
pStepsIDNode->AppendChild( pSteps->GetRadarValues().CreateNode() );
} }
} }
@@ -68,7 +71,8 @@ void SaveCatalogXml()
xml.AppendChild( pCourseNode ); xml.AppendChild( pCourseNode );
pCourseNode->AppendChild( "Title", pCourse->m_sName ); pCourseNode->AppendChild( "MainTitle", pCourse->GetDisplayMainTitle() );
pCourseNode->AppendChild( "SubTitle", pCourse->GetDisplaySubTitle() );
pCourseNode->AppendChild( "HasMods", pCourse->HasMods() ); pCourseNode->AppendChild( "HasMods", pCourse->HasMods() );
FOREACH_StepsType( st ) FOREACH_StepsType( st )
@@ -84,7 +88,10 @@ void SaveCatalogXml()
TrailID trailID; TrailID trailID;
trailID.FromTrail( pTrail ); trailID.FromTrail( pTrail );
pCourseNode->AppendChild( trailID.CreateNode() ); XNode* pTrailIDNode = trailID.CreateNode();
pCourseNode->AppendChild( pTrailIDNode );
pTrailIDNode->AppendChild( pTrail->GetRadarValues().CreateNode() );
} }
} }
} }
+51 -20
View File
@@ -74,9 +74,9 @@ void Course::LoadFromCRSFile( CString sPath )
// handle the data // handle the data
if( 0 == stricmp(sValueName, "COURSE") ) if( 0 == stricmp(sValueName, "COURSE") )
m_sName = sParams[1]; m_sMainTitle = sParams[1];
else if( 0 == stricmp(sValueName, "COURSETRANSLIT") ) else if( 0 == stricmp(sValueName, "COURSETRANSLIT") )
m_sNameTranslit = sParams[1]; m_sMainTitleTranslit = sParams[1];
else if( 0 == stricmp(sValueName, "REPEAT") ) else if( 0 == stricmp(sValueName, "REPEAT") )
{ {
CString str = sParams[1]; CString str = sParams[1];
@@ -249,11 +249,11 @@ void Course::LoadFromCRSFile( CString sPath )
static TitleSubst tsub("courses"); static TitleSubst tsub("courses");
TitleFields title; TitleFields title;
title.Title = m_sName; title.Title = m_sMainTitle;
title.TitleTranslit = m_sNameTranslit; title.TitleTranslit = m_sMainTitleTranslit;
tsub.Subst( title ); tsub.Subst( title );
m_sName = title.Title; m_sMainTitle = title.Title;
m_sNameTranslit = title.TitleTranslit; m_sMainTitleTranslit = title.TitleTranslit;
} }
void Course::Init() void Course::Init()
@@ -266,7 +266,13 @@ void Course::Init()
FOREACH_Difficulty(dc) FOREACH_Difficulty(dc)
m_iCustomMeter[dc] = -1; m_iCustomMeter[dc] = -1;
m_entries.clear(); m_entries.clear();
m_sPath = m_sName = m_sNameTranslit = m_sBannerPath = m_sCDTitlePath = ""; m_sPath = "";
m_sMainTitle = "";
m_sMainTitleTranslit = "";
m_sSubTitle = "";
m_sSubTitleTranslit = "";
m_sBannerPath = "";
m_sCDTitlePath = "";
ZERO( m_TrailCacheValid ); ZERO( m_TrailCacheValid );
m_iTrailCacheSeed = 0; m_iTrailCacheSeed = 0;
} }
@@ -282,9 +288,9 @@ void Course::Save()
return; return;
} }
f.PutLine( ssprintf("#COURSE:%s;", m_sName.c_str()) ); f.PutLine( ssprintf("#COURSE:%s;", m_sMainTitle.c_str()) );
if( m_sNameTranslit != "" ) if( m_sMainTitleTranslit != "" )
f.PutLine( ssprintf("#COURSETRANSLIT:%s;", m_sNameTranslit.c_str()) ); f.PutLine( ssprintf("#COURSETRANSLIT:%s;", m_sMainTitleTranslit.c_str()) );
if( m_bRepeat ) if( m_bRepeat )
f.PutLine( "#REPEAT:YES;" ); f.PutLine( "#REPEAT:YES;" );
if( m_iLives != -1 ) if( m_iLives != -1 )
@@ -388,10 +394,10 @@ void Course::AutogenEndlessFromGroup( CString sGroupName, Difficulty diff )
if( sGroupName == "" ) if( sGroupName == "" )
{ {
m_sName = "All Songs"; m_sMainTitle = "All Songs";
// m_sBannerPath = ""; // XXX // m_sBannerPath = ""; // XXX
} else { } else {
m_sName = SONGMAN->ShortenGroupName( sGroupName ); m_sMainTitle = SONGMAN->ShortenGroupName( sGroupName );
m_sBannerPath = SONGMAN->GetGroupBannerPath( sGroupName ); m_sBannerPath = SONGMAN->GetGroupBannerPath( sGroupName );
} }
@@ -420,7 +426,7 @@ void Course::AutogenNonstopFromGroup( CString sGroupName, Difficulty diff )
m_bRepeat = false; m_bRepeat = false;
m_sName += " Random"; m_sMainTitle += " Random";
// resize to 4 // resize to 4
while( m_entries.size() < 4 ) while( m_entries.size() < 4 )
@@ -445,9 +451,9 @@ void Course::AutogenOniFromArtist( CString sArtistName, CString sArtistNameTrans
/* "Artist Oni" is a little repetitive; "by Artist" stands out less, and lowercasing /* "Artist Oni" is a little repetitive; "by Artist" stands out less, and lowercasing
* "by" puts more emphasis on the artist's name. It also sorts them together. */ * "by" puts more emphasis on the artist's name. It also sorts them together. */
m_sName = "by " + sArtistName; m_sMainTitle = "by " + sArtistName;
if( sArtistNameTranslit != sArtistName ) if( sArtistNameTranslit != sArtistName )
m_sNameTranslit = "by " + sArtistNameTranslit; m_sMainTitleTranslit = "by " + sArtistNameTranslit;
// m_sBannerPath = ""; // XXX // m_sBannerPath = ""; // XXX
@@ -526,11 +532,36 @@ struct SortTrailEntry
bool operator< ( const SortTrailEntry &rhs ) const { return SortMeter < rhs.SortMeter; } bool operator< ( const SortTrailEntry &rhs ) const { return SortMeter < rhs.SortMeter; }
}; };
CString Course::GetDisplayName() const CString Course::GetDisplayMainTitle() const
{ {
if( !PREFSMAN->m_bShowNative ) if( !PREFSMAN->m_bShowNative )
return GetTranslitName(); return GetTranslitMainTitle();
return m_sName; return m_sMainTitle;
}
CString Course::GetDisplaySubTitle() const
{
if( !PREFSMAN->m_bShowNative )
return GetTranslitSubTitle();
return m_sSubTitle;
}
CString Course::GetFullDisplayTitle() const
{
CString Title = GetDisplayMainTitle();
CString SubTitle = GetDisplaySubTitle();
if(!SubTitle.empty()) Title += " " + SubTitle;
return Title;
}
CString Course::GetFullTranslitTitle() const
{
CString Title = GetTranslitMainTitle();
CString SubTitle = GetTranslitSubTitle();
if(!SubTitle.empty()) Title += " " + SubTitle;
return Title;
} }
/* This is called by many simple functions, like Course::GetTotalSeconds, and may /* This is called by many simple functions, like Course::GetTotalSeconds, and may
@@ -642,7 +673,7 @@ bool Course::GetTrailUnsorted( StepsType st, CourseDifficulty cd, Trail &trail )
// 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: */
RandomGen rnd( GAMESTATE->m_iRoundSeed + GetHashForString(m_sName) ); RandomGen rnd( GAMESTATE->m_iRoundSeed + GetHashForString(m_sMainTitle) );
vector<CourseEntry> tmp_entries; vector<CourseEntry> tmp_entries;
if( m_bRandomize ) if( m_bRandomize )
@@ -1017,7 +1048,7 @@ void Course::UpdateCourseStats( StepsType st )
// themes change.. // themes change..
LOG->Trace("%s: Total feet: %d", LOG->Trace("%s: Total feet: %d",
this->m_sName.c_str(), this->m_sMainTitle.c_str(),
m_SortOrder_TotalDifficulty ); m_SortOrder_TotalDifficulty );
} }
+16 -4
View File
@@ -75,8 +75,11 @@ public:
bool m_bIsAutogen; // was this created by AutoGen? bool m_bIsAutogen; // was this created by AutoGen?
CString m_sPath; CString m_sPath;
CString m_sName, m_sNameTranslit; private:
CString m_sMainTitle, m_sMainTitleTranslit;
CString m_sSubTitle, m_sSubTitleTranslit;
public:
bool HasBanner() const; bool HasBanner() const;
CString m_sBannerPath; CString m_sBannerPath;
@@ -90,9 +93,18 @@ public:
vector<CourseEntry> m_entries; vector<CourseEntry> m_entries;
/* If PREFSMAN->m_bShowNative is off, this are the same as GetTranslit* below. */ /* If PREFSMAN->m_bShowNative is off, these are the same as GetTranslit* below.
CString GetDisplayName() const; * Otherwise, they return the main titles. */
CString GetTranslitName() const { return m_sNameTranslit.size()? m_sNameTranslit: m_sName; } CString GetDisplayMainTitle() const;
CString GetDisplaySubTitle() const;
/* Returns the transliterated titles, if any; otherwise returns the main titles. */
CString GetTranslitMainTitle() const { return m_sMainTitleTranslit.size()? m_sMainTitleTranslit: m_sMainTitle; }
CString GetTranslitSubTitle() const { return m_sSubTitleTranslit.size()? m_sSubTitleTranslit: m_sSubTitle; }
/* "title subtitle" */
CString GetFullDisplayTitle() const;
CString GetFullTranslitTitle() const;
// Dereferences course_entries and returns only the playable Songs and Steps // Dereferences course_entries and returns only the playable Songs and Steps
Trail* GetTrail( StepsType st, CourseDifficulty cd=DIFFICULTY_MEDIUM ) const; Trail* GetTrail( StepsType st, CourseDifficulty cd=DIFFICULTY_MEDIUM ) const;
+14 -14
View File
@@ -22,8 +22,8 @@ static bool CompareCoursePointersByName(const Course* pCourse1, const Course* pC
// XXX: That doesn't happen to me, and it shouldn't (strcmp is strictly // XXX: That doesn't happen to me, and it shouldn't (strcmp is strictly
// a byte sort, though CompareNoCase doesn't use strcmp). Are you sure // a byte sort, though CompareNoCase doesn't use strcmp). Are you sure
// you didn't have only one space before? -glenn // you didn't have only one space before? -glenn
CString sName1 = pCourse1->m_sName; CString sName1 = pCourse1->GetFullDisplayTitle();
CString sName2 = pCourse2->m_sName; CString sName2 = pCourse2->GetFullDisplayTitle();
sName1.Replace( " " , " 0" ); sName1.Replace( " " , " 0" );
sName2.Replace( " " , " 0" ); sName2.Replace( " " , " 0" );
return sName1.CompareNoCase( sName2 ) == -1; return sName1.CompareNoCase( sName2 ) == -1;
@@ -74,7 +74,7 @@ static bool MovePlayersBestToEnd( const Course* pCourse1, const Course* pCourse2
if( !C1HasBest && C2HasBest ) if( !C1HasBest && C2HasBest )
return true; return true;
return pCourse1->m_sName < pCourse2->m_sName; return CompareCoursePointersByName( pCourse1, pCourse2 );
} }
static bool CompareRandom( const Course* pCourse1, const Course* pCourse2 ) static bool CompareRandom( const Course* pCourse1, const Course* pCourse2 )
@@ -140,7 +140,7 @@ bool CompareCoursePointersBySortValueDescending(const Course *pSong1, const Cour
bool CompareCoursePointersByTitle( const Course *pCourse1, const Course *pCourse2 ) bool CompareCoursePointersByTitle( const Course *pCourse1, const Course *pCourse2 )
{ {
return pCourse1->m_sName < pCourse2->m_sName; return CompareCoursePointersByName( pCourse1, pCourse2 );
} }
void CourseUtil::SortCoursePointerArrayByAvgDifficulty( vector<Course*> &apCourses ) void CourseUtil::SortCoursePointerArrayByAvgDifficulty( vector<Course*> &apCourses )
@@ -183,18 +183,18 @@ void CourseID::FromCourse( const Course *p )
if( p->m_bIsAutogen ) if( p->m_bIsAutogen )
{ {
sPath = ""; sPath = "";
sName = p->m_sName; sFullTitle = p->GetFullDisplayTitle();
} }
else else
{ {
sPath = p->m_sPath; sPath = p->m_sPath;
sName = ""; sFullTitle = "";
} }
} }
else else
{ {
sPath = ""; sPath = "";
sName = ""; sFullTitle = "";
} }
} }
@@ -204,7 +204,7 @@ Course *CourseID::ToCourse() const
pCourse = SONGMAN->GetCourseFromPath( sPath ); pCourse = SONGMAN->GetCourseFromPath( sPath );
if( pCourse ) if( pCourse )
return pCourse; return pCourse;
pCourse = SONGMAN->GetCourseFromName( sName ); pCourse = SONGMAN->GetCourseFromName( sFullTitle );
return pCourse; return pCourse;
} }
@@ -215,8 +215,8 @@ XNode* CourseID::CreateNode() const
if( !sPath.empty() ) if( !sPath.empty() )
pNode->AppendAttr( "Path", sPath ); pNode->AppendAttr( "Path", sPath );
if( !sName.empty() ) if( !sFullTitle.empty() )
pNode->AppendAttr( "Name", sName ); pNode->AppendAttr( "FullTitle", sFullTitle );
return pNode; return pNode;
} }
@@ -225,21 +225,21 @@ void CourseID::LoadFromNode( const XNode* pNode )
{ {
ASSERT( pNode->name == "Course" ); ASSERT( pNode->name == "Course" );
pNode->GetAttrValue("Path", sPath); pNode->GetAttrValue("Path", sPath);
pNode->GetAttrValue("Name", sName); pNode->GetAttrValue("FullTitle", sFullTitle);
} }
CString CourseID::ToString() const CString CourseID::ToString() const
{ {
if( !sPath.empty() ) if( !sPath.empty() )
return sPath; return sPath;
if( !sName.empty() ) if( !sFullTitle.empty() )
return sName; return sFullTitle;
return ""; return "";
} }
bool CourseID::IsValid() const bool CourseID::IsValid() const
{ {
return !sPath.empty() || !sName.empty(); return !sPath.empty() || !sFullTitle.empty();
} }
/* /*
+2 -2
View File
@@ -25,7 +25,7 @@ namespace CourseUtil
class CourseID class CourseID
{ {
CString sPath; CString sPath;
CString sName; CString sFullTitle;
public: public:
CourseID() { Unset(); } CourseID() { Unset(); }
@@ -34,7 +34,7 @@ public:
Course *ToCourse() const; Course *ToCourse() const;
bool operator<( const CourseID &other ) const bool operator<( const CourseID &other ) const
{ {
return sPath < other.sPath || sName < other.sName; return sPath < other.sPath || sFullTitle < other.sFullTitle;
} }
XNode* CreateNode() const; XNode* CreateNode() const;
+1 -1
View File
@@ -401,7 +401,7 @@ void EditCoursesMenu::OnRowValueChanged( Row row )
{ {
case ROW_COURSE: case ROW_COURSE:
CHECKPOINT; CHECKPOINT;
m_textValue[ROW_COURSE].SetText( pCourse->m_sName ); m_textValue[ROW_COURSE].SetText( pCourse->GetFullDisplayTitle() );
m_CourseBanner.LoadFromCourse( pCourse ); m_CourseBanner.LoadFromCourse( pCourse );
m_CourseBanner.ScaleToClipped( COURSE_BANNER_WIDTH, COURSE_BANNER_HEIGHT ); m_CourseBanner.ScaleToClipped( COURSE_BANNER_WIDTH, COURSE_BANNER_HEIGHT );
m_iSelection[ROW_ENTRY] = 0; m_iSelection[ROW_ENTRY] = 0;
+2 -2
View File
@@ -1520,7 +1520,7 @@ void GameState::GetRankingFeats( PlayerNumber pn, vector<RankingFeat> &asFeatsOu
RankingFeat feat; RankingFeat feat;
feat.Type = RankingFeat::COURSE; feat.Type = RankingFeat::COURSE;
feat.pCourse = pCourse; feat.pCourse = pCourse;
feat.Feat = ssprintf("MR #%d in %s", i+1, pCourse->m_sName.c_str() ); feat.Feat = ssprintf("MR #%d in %s", i+1, pCourse->GetFullDisplayTitle().c_str() );
if( cd != DIFFICULTY_MEDIUM ) if( cd != DIFFICULTY_MEDIUM )
feat.Feat += " " + CourseDifficultyToThemedString(cd); feat.Feat += " " + CourseDifficultyToThemedString(cd);
feat.pStringToFill = &hs.sName; feat.pStringToFill = &hs.sName;
@@ -1546,7 +1546,7 @@ void GameState::GetRankingFeats( PlayerNumber pn, vector<RankingFeat> &asFeatsOu
RankingFeat feat; RankingFeat feat;
feat.Type = RankingFeat::COURSE; feat.Type = RankingFeat::COURSE;
feat.pCourse = pCourse; feat.pCourse = pCourse;
feat.Feat = ssprintf("PR #%d in %s", i+1, pCourse->m_sName.c_str() ); feat.Feat = ssprintf("PR #%d in %s", i+1, pCourse->GetFullDisplayTitle().c_str() );
feat.pStringToFill = &hs.sName; feat.pStringToFill = &hs.sName;
feat.grade = GRADE_NO_DATA; feat.grade = GRADE_NO_DATA;
feat.iScore = hs.iScore; feat.iScore = hs.iScore;
+2 -2
View File
@@ -130,8 +130,8 @@ void MusicWheelItem::LoadFromWheelItemData( WheelItemData* pWID )
bt = &m_textSectionName; bt = &m_textSectionName;
break; break;
case TYPE_COURSE: case TYPE_COURSE:
sDisplayName = data->m_pCourse->GetDisplayName(); sDisplayName = data->m_pCourse->GetFullDisplayTitle();
sTranslitName = data->m_pCourse->GetTranslitName(); sTranslitName = data->m_pCourse->GetFullTranslitTitle();
bt = &m_textCourse; bt = &m_textCourse;
break; break;
case TYPE_SORT: case TYPE_SORT:
+1 -1
View File
@@ -1135,7 +1135,7 @@ void ScreenEdit::InputEdit( const DeviceInput& DeviceI, const InputEventType typ
if( bUsesThisSong ) if( bUsesThisSong )
{ {
g_CourseMode.rows[0].choices.push_back( crs->m_sName ); g_CourseMode.rows[0].choices.push_back( crs->GetFullDisplayTitle() );
if( crs == m_pAttacksFromCourse ) if( crs == m_pAttacksFromCourse )
g_CourseMode.rows[0].defaultChoice = g_CourseMode.rows[0].choices.size()-1; g_CourseMode.rows[0].defaultChoice = g_CourseMode.rows[0].choices.size()-1;
} }
+2 -2
View File
@@ -711,7 +711,7 @@ float ScreenRanking::SetPage( PageToShow pts )
return SECONDS_PER_PAGE; return SECONDS_PER_PAGE;
case PAGE_TYPE_TRAIL: case PAGE_TYPE_TRAIL:
{ {
m_textCourseTitle.SetText( pts.pCourse->m_sName ); m_textCourseTitle.SetText( pts.pCourse->GetFullDisplayTitle() );
m_Banner.LoadFromCourse( pts.pCourse ); m_Banner.LoadFromCourse( pts.pCourse );
m_textStepsType.SetText( GameManager::NotesTypeToThemedString(pts.nt) ); m_textStepsType.SetText( GameManager::NotesTypeToThemedString(pts.nt) );
@@ -814,7 +814,7 @@ float ScreenRanking::SetPage( PageToShow pts )
CourseScoreRowItem *pCourseScoreRowItem = m_vpCourseScoreRowItem[c]; CourseScoreRowItem *pCourseScoreRowItem = m_vpCourseScoreRowItem[c];
const Course* pCourse = pCourseScoreRowItem->m_pCourse; const Course* pCourse = pCourseScoreRowItem->m_pCourse;
pCourseScoreRowItem->m_textSongTitle.SetText( pCourse->m_sName ); pCourseScoreRowItem->m_textSongTitle.SetText( pCourse->GetFullDisplayTitle() );
FOREACH_ShownCourseDifficulty( cd ) FOREACH_ShownCourseDifficulty( cd )
{ {
BitmapText* pTextStepsScore = &pCourseScoreRowItem->m_textStepsScore[cd]; BitmapText* pTextStepsScore = &pCourseScoreRowItem->m_textStepsScore[cd];
+1 -1
View File
@@ -133,7 +133,7 @@ ScreenUnlock::ScreenUnlock( CString sClassName ) : ScreenAttract( sClassName )
if (crs != NULL) if (crs != NULL)
{ {
text->SetMaxWidth( MaxWidth ); text->SetMaxWidth( MaxWidth );
text->SetText( crs->m_sName ); text->SetText( crs->GetFullDisplayTitle() );
text->Command("Diffuse,0,1,0,1"); text->Command("Diffuse,0,1,0,1");
} }
else // entry isn't a song or course else // entry isn't a song or course
+2 -2
View File
@@ -893,7 +893,7 @@ Course* SongManager::GetCourseFromPath( CString sPath )
Course* SongManager::GetCourseFromName( CString sName ) Course* SongManager::GetCourseFromName( CString sName )
{ {
for( unsigned int i=0; i<m_pCourses.size(); i++ ) for( unsigned int i=0; i<m_pCourses.size(); i++ )
if( sName.CompareNoCase(m_pCourses[i]->m_sName) == 0 ) if( sName.CompareNoCase(m_pCourses[i]->GetFullDisplayTitle()) == 0 )
return m_pCourses[i]; return m_pCourses[i];
return NULL; return NULL;
@@ -947,7 +947,7 @@ Course *SongManager::FindCourse( CString sName )
{ {
for( unsigned i = 0; i < m_pCourses.size(); i++ ) for( unsigned i = 0; i < m_pCourses.size(); i++ )
{ {
if( !sName.CompareNoCase(m_pCourses[i]->m_sName) ) if( !sName.CompareNoCase(m_pCourses[i]->GetFullDisplayTitle()) )
return m_pCourses[i]; return m_pCourses[i];
} }
+1 -1
View File
@@ -29,7 +29,7 @@ Trail *TrailID::ToTrail( const Course *p, bool bAllowNull ) const
Trail *ret = p->GetTrail( st, cd ); Trail *ret = p->GetTrail( st, cd );
if( !bAllowNull && ret == NULL ) if( !bAllowNull && ret == NULL )
RageException::Throw( "%i, %i, \"%s\"", st, cd, p->m_sName.c_str() ); RageException::Throw( "%i, %i, \"%s\"", st, cd, p->GetFullDisplayTitle().c_str() );
return ret; return ret;
} }