Working toward stateless loader.
This commit is contained in:
@@ -201,6 +201,44 @@ static StepsType DetermineStepsType( int iPlayer, const NoteData &nd, const RStr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool GetTagFromMap( const NameToData_t &mapNameToData, const RString &sName, RString &sOut )
|
||||||
|
{
|
||||||
|
NameToData_t::const_iterator it;
|
||||||
|
it = mapNameToData.find( sName );
|
||||||
|
if( it == mapNameToData.end() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
sOut = it->second;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finds the longest common match for the given tag in all files. If the given tag
|
||||||
|
* was found in at least one file, returns true; otherwise returns false. */
|
||||||
|
static bool GetCommonTagFromMapList( const vector<NameToData_t> &aBMSData, const RString &sName, RString &sCommonTag )
|
||||||
|
{
|
||||||
|
bool bFoundOne = false;
|
||||||
|
for( unsigned i=0; i < aBMSData.size(); i++ )
|
||||||
|
{
|
||||||
|
RString sTag;
|
||||||
|
if( !GetTagFromMap( aBMSData[i], sName, sTag ) )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if( !bFoundOne )
|
||||||
|
{
|
||||||
|
bFoundOne = true;
|
||||||
|
sCommonTag = sTag;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sCommonTag = FindLargestInitialSubstring( sCommonTag, sTag );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return bFoundOne;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
float BMSLoader::GetBeatsPerMeasure( const MeasureToTimeSig_t &sigs, int iMeasure )
|
float BMSLoader::GetBeatsPerMeasure( const MeasureToTimeSig_t &sigs, int iMeasure )
|
||||||
{
|
{
|
||||||
map<int, float>::const_iterator time_sig = sigs.find( iMeasure );
|
map<int, float>::const_iterator time_sig = sigs.find( iMeasure );
|
||||||
@@ -552,7 +590,7 @@ void BMSLoader::GetApplicableFiles( const RString &sPath, vector<RString> &out )
|
|||||||
GetDirListing( sPath + RString("*.bme"), out );
|
GetDirListing( sPath + RString("*.bme"), out );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BMSLoader::ReadBMSFile( const RString &sPath, NameToData_t &mapNameToData )
|
static bool ReadBMSFile( const RString &sPath, NameToData_t &mapNameToData )
|
||||||
{
|
{
|
||||||
RageFile file;
|
RageFile file;
|
||||||
if( !file.Open(sPath) )
|
if( !file.Open(sPath) )
|
||||||
@@ -586,43 +624,6 @@ bool BMSLoader::ReadBMSFile( const RString &sPath, NameToData_t &mapNameToData )
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BMSLoader::GetTagFromMap( const NameToData_t &mapNameToData, const RString &sName, RString &sOut )
|
|
||||||
{
|
|
||||||
NameToData_t::const_iterator it;
|
|
||||||
it = mapNameToData.find( sName );
|
|
||||||
if( it == mapNameToData.end() )
|
|
||||||
return false;
|
|
||||||
|
|
||||||
sOut = it->second;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Finds the longest common match for the given tag in all files. If the given tag
|
|
||||||
* was found in at least one file, returns true; otherwise returns false. */
|
|
||||||
bool BMSLoader::GetCommonTagFromMapList( const vector<NameToData_t> &aBMSData, const RString &sName, RString &sCommonTag )
|
|
||||||
{
|
|
||||||
bool bFoundOne = false;
|
|
||||||
for( unsigned i=0; i < aBMSData.size(); i++ )
|
|
||||||
{
|
|
||||||
RString sTag;
|
|
||||||
if( !GetTagFromMap( aBMSData[i], sName, sTag ) )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if( !bFoundOne )
|
|
||||||
{
|
|
||||||
bFoundOne = true;
|
|
||||||
sCommonTag = sTag;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
sCommonTag = FindLargestInitialSubstring( sCommonTag, sTag );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return bFoundOne;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
BMS_TRACK_TIME_SIG = 2,
|
BMS_TRACK_TIME_SIG = 2,
|
||||||
@@ -920,6 +921,36 @@ void BMSLoader::SetTimeSigAdjustments( const MeasureToTimeSig_t &sigs, Song *pOu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void SlideDuplicateDifficulties( Song &p )
|
||||||
|
{
|
||||||
|
/* BMS files have to guess the Difficulty from the meter; this is inaccurate,
|
||||||
|
* and often leads to duplicates. Slide duplicate difficulties upwards. We
|
||||||
|
* only do this with BMS files, since a very common bug was having *all*
|
||||||
|
* difficulties slid upwards due to (for example) having two beginner steps.
|
||||||
|
* We do a second pass in Song::TidyUpData to eliminate any remaining duplicates
|
||||||
|
* after this. */
|
||||||
|
FOREACH_StepsType( st )
|
||||||
|
{
|
||||||
|
FOREACH_Difficulty( dc )
|
||||||
|
{
|
||||||
|
if( dc == DIFFICULTY_EDIT )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
vector<Steps*> vSteps;
|
||||||
|
SongUtil::GetSteps( &p, vSteps, st, dc );
|
||||||
|
|
||||||
|
StepsUtil::SortNotesArrayByDifficulty( vSteps );
|
||||||
|
for( unsigned k=1; k<vSteps.size(); k++ )
|
||||||
|
{
|
||||||
|
Steps* pSteps = vSteps[k];
|
||||||
|
|
||||||
|
Difficulty dc2 = min( (Difficulty)(dc+1), DIFFICULTY_CHALLENGE );
|
||||||
|
pSteps->SetDifficulty( dc2 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool BMSLoader::LoadFromDir( const RString &sDir, Song &out )
|
bool BMSLoader::LoadFromDir( const RString &sDir, Song &out )
|
||||||
{
|
{
|
||||||
LOG->Trace( "Song::LoadFromBMSDir(%s)", sDir.c_str() );
|
LOG->Trace( "Song::LoadFromBMSDir(%s)", sDir.c_str() );
|
||||||
@@ -1056,36 +1087,6 @@ bool BMSLoader::LoadFromDir( const RString &sDir, Song &out )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void BMSLoader::SlideDuplicateDifficulties( Song &p )
|
|
||||||
{
|
|
||||||
/* BMS files have to guess the Difficulty from the meter; this is inaccurate,
|
|
||||||
* and often leads to duplicates. Slide duplicate difficulties upwards. We
|
|
||||||
* only do this with BMS files, since a very common bug was having *all*
|
|
||||||
* difficulties slid upwards due to (for example) having two beginner steps.
|
|
||||||
* We do a second pass in Song::TidyUpData to eliminate any remaining duplicates
|
|
||||||
* after this. */
|
|
||||||
FOREACH_StepsType( st )
|
|
||||||
{
|
|
||||||
FOREACH_Difficulty( dc )
|
|
||||||
{
|
|
||||||
if( dc == DIFFICULTY_EDIT )
|
|
||||||
continue;
|
|
||||||
|
|
||||||
vector<Steps*> vSteps;
|
|
||||||
SongUtil::GetSteps( &p, vSteps, st, dc );
|
|
||||||
|
|
||||||
StepsUtil::SortNotesArrayByDifficulty( vSteps );
|
|
||||||
for( unsigned k=1; k<vSteps.size(); k++ )
|
|
||||||
{
|
|
||||||
Steps* pSteps = vSteps[k];
|
|
||||||
|
|
||||||
Difficulty dc2 = min( (Difficulty)(dc+1), DIFFICULTY_CHALLENGE );
|
|
||||||
pSteps->SetDifficulty( dc2 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* (c) 2001-2004 Chris Danford, Glenn Maynard
|
* (c) 2001-2004 Chris Danford, Glenn Maynard
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
|
|||||||
@@ -9,19 +9,15 @@
|
|||||||
class Song;
|
class Song;
|
||||||
class Steps;
|
class Steps;
|
||||||
|
|
||||||
|
typedef multimap<RString, RString> NameToData_t;
|
||||||
|
typedef map<int, float> MeasureToTimeSig_t;
|
||||||
|
|
||||||
class BMSLoader: public NotesLoader
|
class BMSLoader: public NotesLoader
|
||||||
{
|
{
|
||||||
void SlideDuplicateDifficulties( Song &p );
|
|
||||||
|
|
||||||
typedef multimap<RString, RString> NameToData_t;
|
|
||||||
bool ReadBMSFile( const RString &sPath, BMSLoader::NameToData_t &mapNameToData );
|
|
||||||
bool LoadFromBMSFile( const RString &sPath, const NameToData_t &mapNameToData, Steps &out1 );
|
bool LoadFromBMSFile( const RString &sPath, const NameToData_t &mapNameToData, Steps &out1 );
|
||||||
void ReadGlobalTags( const NameToData_t &mapNameToData, Song &out );
|
void ReadGlobalTags( const NameToData_t &mapNameToData, Song &out );
|
||||||
static bool GetTagFromMap( const BMSLoader::NameToData_t &mapNameToData, const RString &sName, RString &sOut );
|
|
||||||
static bool GetCommonTagFromMapList( const vector<NameToData_t> &aBMSData, const RString &sName, RString &out );
|
|
||||||
void SearchForDifficulty( RString sTag, Steps *pOut );
|
void SearchForDifficulty( RString sTag, Steps *pOut );
|
||||||
|
|
||||||
typedef map<int, float> MeasureToTimeSig_t;
|
|
||||||
void ReadTimeSigs( const NameToData_t &mapNameToData, MeasureToTimeSig_t &out );
|
void ReadTimeSigs( const NameToData_t &mapNameToData, MeasureToTimeSig_t &out );
|
||||||
float GetBeatsPerMeasure( const MeasureToTimeSig_t &sigs, int iMeasure );
|
float GetBeatsPerMeasure( const MeasureToTimeSig_t &sigs, int iMeasure );
|
||||||
int GetMeasureStartRow( const MeasureToTimeSig_t &sigs, int iMeasureNo );
|
int GetMeasureStartRow( const MeasureToTimeSig_t &sigs, int iMeasureNo );
|
||||||
|
|||||||
Reference in New Issue
Block a user