Cat is back in the bag. Revert commits.
A-mods need to be tested more. ...and this is what happens when you forget to stash changes before a merge. Lesson learned.
This commit is contained in:
@@ -59,7 +59,7 @@ end
|
||||
local function ParseSpeedModFile(path)
|
||||
local function Failure()
|
||||
-- error; write a fallback mod file and return it
|
||||
local fallbackString = "0.5x,1x,1.5x,2x,3x,4x,5x,6x,7x,8x,C250,a400,m550"
|
||||
local fallbackString = "0.5x,1x,1.5x,2x,3x,4x,5x,6x,7x,8x,C250,C450,m550"
|
||||
Trace("[CustomSpeedMods]: Could not read SpeedMods; writing fallback to "..path)
|
||||
local file = RageFileUtil.CreateRageFile()
|
||||
file:Open(path, 2)
|
||||
|
||||
+1
-27
@@ -408,35 +408,9 @@ void Player::Init(
|
||||
break;
|
||||
}
|
||||
|
||||
// calculate A-mod speed here, so we can adjust properly on a per-song basis.
|
||||
// XXX: can we find a better location for this?
|
||||
// XXX: Yes, I copied the same comment practically. --wolfman2000
|
||||
if (m_pPlayerState->m_PlayerOptions.GetCurrent().m_fAvgScrollBPM != 0)
|
||||
{
|
||||
float avgBPM;
|
||||
if (GAMESTATE->IsCourseMode() )
|
||||
{
|
||||
vector<TrailEntry> &entries = GAMESTATE->m_pCurTrail[pn]->m_vEntries;
|
||||
float foundBPMs = 0;
|
||||
FOREACH_CONST( TrailEntry, entries, e )
|
||||
{
|
||||
foundBPMs += e->pSong->m_SongTiming.GetBPMUsedMostOften();
|
||||
}
|
||||
avgBPM = foundBPMs / entries.size();
|
||||
}
|
||||
else
|
||||
{
|
||||
avgBPM = GAMESTATE->m_pCurSong->m_SongTiming.GetBPMUsedMostOften();
|
||||
}
|
||||
|
||||
// set an X-mod equal to Anum / avgBPM (e.g. A600 with 150 becomes 4x)
|
||||
PO_GROUP_ASSIGN(m_pPlayerState->m_PlayerOptions, ModsLevel_Preferred, m_fScrollSpeed,
|
||||
m_pPlayerState->m_PlayerOptions.GetPreferred().m_fAvgScrollBPM / avgBPM);
|
||||
}
|
||||
|
||||
// calculate M-mod speed here, so we can adjust properly on a per-song basis.
|
||||
// XXX: can we find a better location for this?
|
||||
else if( m_pPlayerState->m_PlayerOptions.GetCurrent().m_fMaxScrollBPM != 0 )
|
||||
if( m_pPlayerState->m_PlayerOptions.GetCurrent().m_fMaxScrollBPM != 0 )
|
||||
{
|
||||
DisplayBpms bpms;
|
||||
|
||||
|
||||
+3
-44
@@ -27,7 +27,6 @@ void PlayerOptions::Init()
|
||||
{
|
||||
m_bSetScrollSpeed = false;
|
||||
m_fMaxScrollBPM = 0; m_SpeedfMaxScrollBPM = 1.0f;
|
||||
m_fAvgScrollBPM = 0; m_SpeedfAvgScrollBPM = 1.0f;
|
||||
m_fTimeSpacing = 0; m_SpeedfTimeSpacing = 1.0f;
|
||||
m_fScrollSpeed = 1.0f; m_SpeedfScrollSpeed = 1.0f;
|
||||
m_fScrollBPM = 200; m_SpeedfScrollBPM = 1.0f;
|
||||
@@ -63,7 +62,6 @@ void PlayerOptions::Approach( const PlayerOptions& other, float fDeltaSeconds )
|
||||
APPROACH( fTimeSpacing );
|
||||
APPROACH( fScrollSpeed );
|
||||
//APPROACH( fMaxScrollBPM ); // if uncommented, causes crashes. -aj
|
||||
//APPROACH( fAvgScrollBPM ); // not sure if this crashes, but playing safe. -Wolfman2000
|
||||
fapproach( m_fScrollBPM, other.m_fScrollBPM, fDeltaSeconds * other.m_SpeedfScrollBPM*150 );
|
||||
for( int i=0; i<NUM_ACCELS; i++ )
|
||||
APPROACH( fAccels[i] );
|
||||
@@ -120,12 +118,7 @@ void PlayerOptions::GetMods( vector<RString> &AddTo, bool bForceNoteSkin ) const
|
||||
|
||||
if( !m_fTimeSpacing )
|
||||
{
|
||||
if( m_fAvgScrollBPM )
|
||||
{
|
||||
RString s = ssprintf( "a%.0f", m_fAvgScrollBPM );
|
||||
AddTo.push_back( s );
|
||||
}
|
||||
else if( m_fMaxScrollBPM )
|
||||
if( m_fMaxScrollBPM )
|
||||
{
|
||||
RString s = ssprintf( "m%.0f", m_fMaxScrollBPM );
|
||||
AddTo.push_back( s );
|
||||
@@ -349,7 +342,6 @@ bool PlayerOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut
|
||||
SET_FLOAT( fTimeSpacing )
|
||||
m_fTimeSpacing = 0;
|
||||
m_fMaxScrollBPM = 0;
|
||||
m_fAvgScrollBPM = 0;
|
||||
}
|
||||
else if( sscanf( sBit, "c%f", &level ) == 1 )
|
||||
{
|
||||
@@ -359,7 +351,6 @@ bool PlayerOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut
|
||||
SET_FLOAT( fTimeSpacing )
|
||||
m_fTimeSpacing = 1;
|
||||
m_fMaxScrollBPM = 0;
|
||||
m_fAvgScrollBPM = 0;
|
||||
}
|
||||
// oITG's m-mods
|
||||
// XXX: will not properly tween, I don't think.
|
||||
@@ -372,14 +363,6 @@ bool PlayerOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut
|
||||
*/
|
||||
SET_FLOAT( fMaxScrollBPM )
|
||||
m_fTimeSpacing = 0;
|
||||
m_fAvgScrollBPM = 0;
|
||||
}
|
||||
// Third Style inspired a-mods
|
||||
else if( sscanf( sBit, "a%f", &level ) == 1 )
|
||||
{
|
||||
SET_FLOAT( fAvgScrollBPM );
|
||||
m_fTimeSpacing = 0;
|
||||
m_fMaxScrollBPM = 0;
|
||||
}
|
||||
|
||||
else if( sBit == "clearall" ) Init();
|
||||
@@ -683,7 +666,6 @@ bool PlayerOptions::operator==( const PlayerOptions &other ) const
|
||||
COMPARE(m_fScrollSpeed);
|
||||
COMPARE(m_fScrollBPM);
|
||||
COMPARE(m_fMaxScrollBPM);
|
||||
COMPARE(m_fAvgScrollBPM);
|
||||
COMPARE(m_fRandomSpeed);
|
||||
COMPARE(m_FailType);
|
||||
COMPARE(m_bMuteOnError);
|
||||
@@ -752,9 +734,9 @@ bool PlayerOptions::IsEasierForSongAndSteps( Song* pSong, Steps* pSteps, PlayerN
|
||||
|
||||
if( m_fCover ) return true;
|
||||
|
||||
// M-mods and a-mods make songs with indefinite BPMs easier because
|
||||
// M-mods make songs with indefinite BPMs easier because
|
||||
// they ensure that the song has a scrollable speed.
|
||||
if( m_fMaxScrollBPM != 0 || m_fAvgScrollBPM != 0 )
|
||||
if( m_fMaxScrollBPM != 0 )
|
||||
{
|
||||
// BPM display is obfuscated
|
||||
// if( pSong->m_DisplayBPMType == DISPLAY_BPM_RANDOM )
|
||||
@@ -848,7 +830,6 @@ RString PlayerOptions::GetSavedPrefsString() const
|
||||
SAVE( m_fScrollSpeed );
|
||||
SAVE( m_fScrollBPM );
|
||||
SAVE( m_fMaxScrollBPM );
|
||||
SAVE( m_fAvgScrollBPM );
|
||||
SAVE( m_fScrolls[SCROLL_REVERSE] );
|
||||
SAVE( m_fPerspectiveTilt );
|
||||
SAVE( m_bTransforms[TRANSFORM_NOHOLDS] );
|
||||
@@ -878,7 +859,6 @@ void PlayerOptions::ResetPrefs( ResetPrefsType type )
|
||||
CPY( m_fScrollSpeed );
|
||||
CPY( m_fScrollBPM );
|
||||
CPY( m_fMaxScrollBPM );
|
||||
CPY( m_fAvgScrollBPM );
|
||||
break;
|
||||
case saved_prefs_invalid_for_course:
|
||||
break;
|
||||
@@ -953,7 +933,6 @@ public:
|
||||
p->m_fTimeSpacing = FArg(1);
|
||||
p->m_fTimeSpacing = 1;
|
||||
p->m_fMaxScrollBPM = 0;
|
||||
p->m_fAvgScrollBPM = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -970,7 +949,6 @@ public:
|
||||
p->m_fScrollSpeed = FArg(1);
|
||||
p->m_fTimeSpacing = 0;
|
||||
p->m_fMaxScrollBPM = 0;
|
||||
p->m_fAvgScrollBPM = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -987,23 +965,6 @@ public:
|
||||
{
|
||||
p->m_fMaxScrollBPM = FArg(1);
|
||||
p->m_fTimeSpacing = 0;
|
||||
p->m_fAvgScrollBPM = 0;
|
||||
return 0;
|
||||
}
|
||||
static int GetAMod( T * p, lua_State * L )
|
||||
{
|
||||
if (!p->m_fTimeSpacing && p->m_fAvgScrollBPM)
|
||||
lua_pushnumber(L, p->m_fAvgScrollBPM);
|
||||
else
|
||||
lua_pushnil(L);
|
||||
|
||||
return 1;
|
||||
}
|
||||
static int SetAMod( T * p, lua_State * L )
|
||||
{
|
||||
p->m_fAvgScrollBPM = FArg(1);
|
||||
p->m_fTimeSpacing = 0;
|
||||
p->m_fMaxScrollBPM = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1224,8 +1185,6 @@ public:
|
||||
ADD_METHOD( SetXMod );
|
||||
ADD_METHOD( GetMMod );
|
||||
ADD_METHOD( SetMMod );
|
||||
ADD_METHOD( GetAMod );
|
||||
ADD_METHOD( SetAMod );
|
||||
|
||||
// Accel
|
||||
ADD_METHOD( GetBoost );
|
||||
|
||||
+1
-3
@@ -22,7 +22,6 @@ public:
|
||||
PlayerOptions(): m_bSetScrollSpeed(false),
|
||||
m_fTimeSpacing(0), m_SpeedfTimeSpacing(1.0f),
|
||||
m_fMaxScrollBPM(0), m_SpeedfMaxScrollBPM(1.0f),
|
||||
m_fAvgScrollBPM(0), m_SpeedfAvgScrollBPM(1.0f),
|
||||
m_fScrollSpeed(1.0f), m_SpeedfScrollSpeed(1.0f),
|
||||
m_fScrollBPM(200), m_SpeedfScrollBPM(1.0f),
|
||||
m_fDark(0), m_SpeedfDark(1.0f),
|
||||
@@ -159,9 +158,8 @@ public:
|
||||
/* All floats have a corresponding speed setting, which determines how fast
|
||||
* PlayerOptions::Approach approaches. */
|
||||
bool m_bSetScrollSpeed; // true if the scroll speed was set by FromString
|
||||
float m_fTimeSpacing, m_SpeedfTimeSpacing; // instead of Beat spacing (CMods, mMods, aMods)
|
||||
float m_fTimeSpacing, m_SpeedfTimeSpacing; // instead of Beat spacing (CMods, mMods)
|
||||
float m_fMaxScrollBPM, m_SpeedfMaxScrollBPM;
|
||||
float m_fAvgScrollBPM, m_SpeedfAvgScrollBPM;
|
||||
float m_fScrollSpeed, m_SpeedfScrollSpeed; // used if !m_bTimeSpacing (xMods)
|
||||
float m_fScrollBPM, m_SpeedfScrollBPM; // used if m_bTimeSpacing (CMod)
|
||||
float m_fAccels[NUM_ACCELS], m_SpeedfAccels[NUM_ACCELS];
|
||||
|
||||
@@ -847,13 +847,9 @@ void Song::ReCalculateRadarValuesAndLastSecond(bool fromCache, bool duringCache)
|
||||
{
|
||||
if( fromCache && this->GetFirstSecond() >= 0 && this->GetLastSecond() > 0 )
|
||||
{
|
||||
this->m_SongTiming.SetLastRowFromTime(this->GetLastSecond());
|
||||
// this is loaded from cache, then we just have to calculate the radar values.
|
||||
for( unsigned i=0; i<m_vpSteps.size(); i++ )
|
||||
{
|
||||
m_vpSteps[i]->CalculateRadarValues( m_fMusicLengthSeconds );
|
||||
m_vpSteps[i]->m_Timing.SetLastRowFromTime(this->GetLastSecond());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -908,12 +904,6 @@ void Song::ReCalculateRadarValuesAndLastSecond(bool fromCache, bool duringCache)
|
||||
// Yes, for some reason we can have freaky stuff take place here.
|
||||
this->firstSecond = (localFirst < localLast) ? localFirst : 0;
|
||||
this->lastSecond = localLast;
|
||||
|
||||
this->m_SongTiming.SetLastRowFromTime(localLast);
|
||||
for( unsigned i = 0; i < this->m_vpSteps.size(); ++i)
|
||||
{
|
||||
this->m_vpSteps[i]->m_Timing.SetLastRowFromTime(localLast);
|
||||
}
|
||||
}
|
||||
|
||||
// Return whether the song is playable in the given style.
|
||||
|
||||
+1
-86
@@ -9,7 +9,7 @@
|
||||
|
||||
TimingSegment* GetSegmentAtRow( int iNoteRow, TimingSegmentType tst );
|
||||
|
||||
TimingData::TimingData(float fOffset) : m_fBeat0OffsetInSeconds(fOffset), lastRow(-1)
|
||||
TimingData::TimingData(float fOffset) : m_fBeat0OffsetInSeconds(fOffset)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -19,7 +19,6 @@ void TimingData::Copy( const TimingData& cpy )
|
||||
Clear();
|
||||
|
||||
m_fBeat0OffsetInSeconds = cpy.m_fBeat0OffsetInSeconds;
|
||||
lastRow = cpy.lastRow;
|
||||
m_sFile = cpy.m_sFile;
|
||||
|
||||
FOREACH_TimingSegmentType( tst )
|
||||
@@ -170,90 +169,6 @@ struct ts_less : binary_function <TimingSegment*, TimingSegment*, bool>
|
||||
}
|
||||
};
|
||||
|
||||
void TimingData::SetLastRowFromTime(float seconds)
|
||||
{
|
||||
float beat = 0;
|
||||
// TODO: Address this.
|
||||
float dummy1, dummy5;
|
||||
bool dummy2, dummy3;
|
||||
int dummy4;
|
||||
GetBeatAndBPSFromElapsedTime(seconds, beat, dummy1, dummy2, dummy3, dummy4, dummy5);
|
||||
this->lastRow = BeatToNoteRow(beat);
|
||||
}
|
||||
|
||||
float TimingData::GetBPMUsedMostOften()
|
||||
{
|
||||
if (this == NULL)
|
||||
{
|
||||
return -1; // not taking ANY chances.
|
||||
}
|
||||
|
||||
if (!HasBpmChanges())
|
||||
{
|
||||
return GetBPMSegmentAtRow(0)->GetBPM();
|
||||
}
|
||||
|
||||
// TODO: Find a way to make this const compatible.
|
||||
vector<TimingSegment *> &bpms = m_avpTimingSegments[SEGMENT_BPM];
|
||||
map<float, float> lengths;
|
||||
map<float, float>::iterator location;
|
||||
|
||||
BPMSegment *prev = ToBPM(GetBPMSegmentAtRow(0));
|
||||
BPMSegment *curr = ToBPM(bpms[1]);
|
||||
BPMSegment *next = curr;
|
||||
float runningTime = GetElapsedTimeFromBeat(next->GetBeat());
|
||||
lengths.insert(make_pair(prev->GetBPM(), runningTime));
|
||||
|
||||
for( unsigned i = 1; i < bpms.size(); ++i )
|
||||
{
|
||||
bool isLast = (i + 1 == bpms.size());
|
||||
|
||||
if (isLast)
|
||||
{
|
||||
runningTime = GetElapsedTimeFromBeat(NoteRowToBeat(lastRow));
|
||||
}
|
||||
else
|
||||
{
|
||||
next = ToBPM(bpms[i + 1]);
|
||||
runningTime = GetElapsedTimeFromBeat(next->GetBeat());
|
||||
}
|
||||
|
||||
float curBPM = curr->GetBPM();
|
||||
location = lengths.find(curBPM);
|
||||
float elapsedTime = runningTime - lengths[prev->GetBPM()];
|
||||
if (location == lengths.end())
|
||||
{
|
||||
lengths[curBPM] = elapsedTime;
|
||||
}
|
||||
else
|
||||
{
|
||||
lengths[curBPM] += elapsedTime;
|
||||
}
|
||||
|
||||
if (!isLast)
|
||||
{
|
||||
prev = curr;
|
||||
curr = next;
|
||||
}
|
||||
}
|
||||
|
||||
// at this point, go through the map.
|
||||
float highestKey = -1;
|
||||
float highestValue = -1;
|
||||
|
||||
// TODO: C++11 this.
|
||||
FOREACHM_CONST(float, float, lengths, it)
|
||||
{
|
||||
if (it->second > highestValue)
|
||||
{
|
||||
highestValue = it->second;
|
||||
highestKey = it->first;
|
||||
}
|
||||
}
|
||||
|
||||
return highestKey;
|
||||
}
|
||||
|
||||
// Multiply the BPM in the range [fStartBeat,fEndBeat) by fFactor.
|
||||
void TimingData::MultiplyBPMInBeatRange( int iStartIndex, int iEndIndex, float fFactor )
|
||||
{
|
||||
|
||||
@@ -286,8 +286,6 @@ public:
|
||||
bool IsJudgableAtRow( int row ) const { return !IsWarpAtRow(row) && !IsFakeAtRow(row); }
|
||||
bool IsJudgableAtBeat( float beat ) const { return IsJudgableAtRow( BeatToNoteRow( beat ) ); }
|
||||
|
||||
float GetBPMUsedMostOften();
|
||||
|
||||
void MultiplyBPMInBeatRange( int iStartIndex, int iEndIndex, float fFactor );
|
||||
|
||||
void NoteRowToMeasureAndBeat( int iNoteRow, int &iMeasureIndexOut, int &iBeatIndexOut, int &iRowsRemainder ) const;
|
||||
@@ -378,8 +376,6 @@ public:
|
||||
return m_avpTimingSegments[tst];
|
||||
}
|
||||
|
||||
void SetLastRowFromTime(float seconds);
|
||||
|
||||
/**
|
||||
* @brief Tidy up the timing data, e.g. provide default BPMs, labels, tickcounts.
|
||||
* @param allowEmpty true if completely empty TimingData should be left
|
||||
@@ -400,9 +396,6 @@ public:
|
||||
/** @brief The initial offset of a song. */
|
||||
float m_fBeat0OffsetInSeconds;
|
||||
|
||||
/** @brief The row of the final song. */
|
||||
int lastRow;
|
||||
|
||||
// XXX: this breaks encapsulation. get rid of it ASAP
|
||||
vector<RString> ToVectorString(TimingSegmentType tst, int dec = 6) const;
|
||||
protected:
|
||||
|
||||
Reference in New Issue
Block a user