[splittiming] load split timing from ssc files

This commit is contained in:
Thai Pangsakulyanont
2011-05-10 17:44:12 +07:00
parent d0e9e58030
commit ce91d1a431
5 changed files with 41 additions and 35 deletions
+6 -1
View File
@@ -103,7 +103,7 @@ bool SMLoader::LoadTimingFromFile( const RString &fn, TimingData &out )
return true;
}
void SMLoader::ProcessBPMs( TimingData &out, const RString sParam )
bool SMLoader::ProcessBPMs( TimingData &out, const RString sParam )
{
vector<RString> arrayBPMChangeExpressions;
split( sParam, ",", arrayBPMChangeExpressions );
@@ -112,6 +112,7 @@ void SMLoader::ProcessBPMs( TimingData &out, const RString sParam )
float negBeat = -1;
float negBPM = 1;
float highspeedBeat = -1;
bool bNotEmpty = false;
for( unsigned b=0; b<arrayBPMChangeExpressions.size(); b++ )
{
@@ -125,6 +126,8 @@ void SMLoader::ProcessBPMs( TimingData &out, const RString sParam )
continue;
}
bNotEmpty = true;
const float fBeat = StringToFloat( arrayBPMChangeValues[0] );
const float fNewBPM = StringToFloat( arrayBPMChangeValues[1] );
@@ -169,6 +172,8 @@ void SMLoader::ProcessBPMs( TimingData &out, const RString sParam )
}
}
}
return bNotEmpty;
}
void SMLoader::ProcessStops( TimingData &out, const RString sParam )
+1 -1
View File
@@ -27,7 +27,7 @@ namespace SMLoader
bool LoadFromBGChangesString( BackgroundChange &change, const RString &sBGChangeExpression );
void ProcessBPMs( TimingData &, const RString );
bool ProcessBPMs( TimingData &, const RString );
void ProcessStops( TimingData &, const RString );
void ProcessDelays( TimingData &, const RString );
void ProcessTimeSignatures( TimingData &, const RString );
+28 -31
View File
@@ -142,6 +142,8 @@ bool SSCLoader::LoadFromSSCFile( const RString &sPath, Song &out, bool bFromCach
int state = GETTING_SONG_INFO;
const unsigned values = msd.GetNumValues();
Steps* pNewNotes = NULL;
TimingData stepsTiming;
bool bHasOwnTiming = false;
for( unsigned i = 0; i < values; i++ )
{
@@ -478,6 +480,8 @@ bool SSCLoader::LoadFromSSCFile( const RString &sPath, Song &out, bool bFromCach
{
state = GETTING_STEP_INFO;
pNewNotes = out.CreateSteps();
stepsTiming = TimingData( out.m_SongTiming.m_fBeat0OffsetInSeconds );
bHasOwnTiming = false;
}
break;
}
@@ -541,53 +545,54 @@ bool SSCLoader::LoadFromSSCFile( const RString &sPath, Song &out, bool bFromCach
else if( sValueName=="NOTES" || sValueName=="NOTES2" )
{
state = GETTING_SONG_INFO;
//pNewNotes->m_Timing = out.m_Timing;
if( bHasOwnTiming )
pNewNotes->m_Timing = stepsTiming;
pNewNotes->SetSMNoteData( sParams[1] );
pNewNotes->TidyUpData();
out.AddSteps( pNewNotes );
}
else if( sValueName=="BPMS" ) // This must ALWAYS be here in Split Timing.
else if( sValueName=="BPMS" )
{
state = GETTING_STEP_TIMING_INFO;
/*
pNewNotes->m_Timing = TimingData(out.m_SongTiming.m_fBeat0OffsetInSeconds);
SMLoader::ProcessBPMs(pNewNotes->m_Timing, sParams[1]);
*/
if( SMLoader::ProcessBPMs(stepsTiming, sParams[1]) )
bHasOwnTiming = true;
}
break;
}
case GETTING_STEP_TIMING_INFO:
{
if( sValueName=="STOPS" )
else if( sValueName=="STOPS" )
{
// SMLoader::ProcessStops(pNewNotes->m_Timing, sParams[1]);
SMLoader::ProcessStops(stepsTiming, sParams[1]);
}
else if( sValueName=="DELAYS" )
{
// SMLoader::ProcessDelays(pNewNotes->m_Timing, sParams[1]);
SMLoader::ProcessDelays(stepsTiming, sParams[1]);
}
else if( sValueName=="TIMESIGNATURES" )
{
// SMLoader::ProcessTimeSignatures(pNewNotes->m_Timing, sParams[1]);
SMLoader::ProcessTimeSignatures(stepsTiming, sParams[1]);
}
else if( sValueName=="TICKCOUNTS" )
{
// SMLoader::ProcessTickcounts(pNewNotes->m_Timing, sParams[1]);
SMLoader::ProcessTickcounts(stepsTiming, sParams[1]);
}
else if( sValueName=="COMBOS" )
{
// ProcessCombos(pNewNotes->m_Timing, sParams[1]);
ProcessCombos(stepsTiming, sParams[1]);
}
else if( sValueName=="WARPS" )
{
// ProcessWarps(pNewNotes->m_Timing, sParams[1]);
ProcessWarps(stepsTiming, sParams[1]);
}
else if( sValueName=="LABELS" )
{
// ProcessLabels(pNewNotes->m_Timing, sParams[1]);
ProcessLabels(stepsTiming, sParams[1]);
}
else if( sValueName=="ATTACKS" )
{
// TODO: Look into Step attacks vs Song Attacks. -Wolfman2000
@@ -635,18 +640,10 @@ bool SSCLoader::LoadFromSSCFile( const RString &sPath, Song &out, bool bFromCach
}
*/
}
else if( sValueName=="OFFSET" )
{/*
pNewNotes->m_Timing.m_fBeat0OffsetInSeconds = StringToFloat( sParams[1] );
*/
}
else if( sValueName=="NOTES" || sValueName=="NOTES2" )
{
state = GETTING_SONG_INFO;
pNewNotes->SetSMNoteData( sParams[1] );
pNewNotes->TidyUpData();
out.AddSteps( pNewNotes );
stepsTiming.m_fBeat0OffsetInSeconds = StringToFloat( sParams[1] );
}
break;
}
-2
View File
@@ -16,8 +16,6 @@ enum SSCLoadingStates
{
GETTING_SONG_INFO, /**< Retrieving song information. */
GETTING_STEP_INFO, /**< Retrieving step information. */
GETTING_STEP_TIMING_INFO, /**< Retrieving a step's individual timing information. */
GETTING_NOTE_INFO, /**< Retrieving the specific notes. This state may be deprecated. */
NUM_SSCLoadingStates /**< The number of states used. */
};
+6
View File
@@ -863,6 +863,12 @@ void Song::Save()
ReCalculateRadarValuesAndLastBeat();
TranslateTitles();
// TODO: Figure out a better way to save to Song's timing data.
if( m_vpSteps.size() == 1 )
{
m_SongTiming = m_vpSteps[0]->m_Timing;
}
// Save the new files. These calls make backups on their own.
if( !SaveToSSCFile(GetSongFilePath(), false) )