From 2fc1c513892926252542ec0a785ffff0069760a0 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Sun, 9 Mar 2014 10:19:52 -0600 Subject: [PATCH 1/8] Changed TimingData Lua API to not return strings that will be immediately be parsed into numbers. --- .../ScreenGameplay decorations/default.lua | 21 +++---- src/TimingData.cpp | 59 +++++++++++++++---- src/TimingSegments.cpp | 25 ++++++++ src/TimingSegments.h | 17 ++++++ 4 files changed, 97 insertions(+), 25 deletions(-) diff --git a/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua b/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua index a8664db8b2..e7b9331a3b 100644 --- a/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua +++ b/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua @@ -91,45 +91,38 @@ local function CreateSegments(Player) end; for i=2,#bpms do - local data = split("=",bpms[i]); - bpmFrame[#bpmFrame+1] = CreateLine(data[1], 0, + bpmFrame[#bpmFrame+1] = CreateLine(bpms[i][1], 0, "#00808077", "#00808077", "#00808077", "#FF634777", "#FF000077"); end; for i=1,#delays do - local data = split("=",delays[i]); - delayFrame[#delayFrame+1] = CreateLine(data[1], data[2], + delayFrame[#delayFrame+1] = CreateLine(delays[i][1], delays[i][2], "#FFFF0077", "#FFFF0077", "#FFFF0077", "#00FF0077", "#FF000077"); end; for i=1,#stops do - local data = split("=",stops[i]); - stopFrame[#stopFrame+1] = CreateLine(data[1], data[2], + stopFrame[#stopFrame+1] = CreateLine(stops[i][1], stops[i][2], "#FFFFFF77", "#FFFFFF77", "#FFFFFF77", "#FFA50077", "#FF000077"); end; for i=1,#scrolls do - local data = split("=",scrolls[i]); - scrollFrame[#scrollFrame+1] = CreateLine(data[1], 0, + scrollFrame[#scrollFrame+1] = CreateLine(scrolls[i][1], 0, "#4169E177", "#4169E177", "#4169E177", "#0000FF77", "#FF000077"); end; for i=1,#speeds do - local data = split("=",speeds[i]); -- TODO: Turn beats into seconds for this calculation? - speedFrame[#speedFrame+1] = CreateLine(data[1], 0, + speedFrame[#speedFrame+1] = CreateLine(speeds[i][1], 0, "#ADFF2F77", "#ADFF2F77", "#ADFF2F77", "#7CFC0077", "#FF000077"); end; for i=1,#warps do - local data = split("=",warps[i]); - warpFrame[#warpFrame+1] = CreateLine(data[1], 0, + warpFrame[#warpFrame+1] = CreateLine(warps[i][1], 0, "#CC00CC77", "#CC00CC77", "#CC00CC77", "#FF33CC77", "#FF000077"); end; for i=1,#fakes do - local data = split("=",fakes[i]); - fakeFrame[#fakeFrame+1] = CreateLine(data[1], 0, + fakeFrame[#fakeFrame+1] = CreateLine(fakes[i][1], 0, "#BC8F8F77", "#BC8F8F77", "#BC8F8F77", "#F4A46077", "#FF000077"); end; end; diff --git a/src/TimingData.cpp b/src/TimingData.cpp index efa04bc13b..bad41a1bb3 100644 --- a/src/TimingData.cpp +++ b/src/TimingData.cpp @@ -991,6 +991,43 @@ vector TimingData::ToVectorString(TimingSegmentType tst, int dec) const // lua start #include "LuaBinding.h" +// This breaks encapsulation just as much as TimingData::ToVectorString does. +// But, it exists solely for the purpose of providing lua access, so it's as okay as all the other lua stuff that reaches past the encapsulation. +void TimingSegmentSetToLuaTable(TimingData* td, TimingSegmentType tst, lua_State *L); +void TimingSegmentSetToLuaTable(TimingData* td, TimingSegmentType tst, lua_State *L) +{ + const vector segs= td->GetTimingSegments(tst); + lua_createtable(L, segs.size(), 0); + if(tst == SEGMENT_LABEL) + { + for(size_t i= 0; i < segs.size(); ++i) + { + lua_createtable(L, 2, 0); + lua_pushnumber(L, segs[i]->GetBeat()); + lua_rawseti(L, -2, 1); + lua_pushstring(L, (ToLabel(segs[i]))->GetLabel().c_str()); + lua_rawseti(L, -2, 2); + lua_rawseti(L, -2, i+1); + } + } + else + { + for(size_t i= 0; i < segs.size(); ++i) + { + vector values= segs[i]->GetValues(); + lua_createtable(L, values.size()+1, 0); + lua_pushnumber(L, segs[i]->GetBeat()); + lua_rawseti(L, -2, 1); + for(size_t v= 0; v < values.size(); ++v) + { + lua_pushnumber(L, values[v]); + lua_rawseti(L, -2, v+2); + } + lua_rawseti(L, -2, i+1); + } + } +} + /** @brief Allow Lua to have access to the TimingData. */ class LunaTimingData: public Luna { @@ -1004,47 +1041,47 @@ public: static int HasScrollChanges( T* p, lua_State *L ) { lua_pushboolean(L, p->HasScrollChanges()); return 1; } static int GetWarps( T* p, lua_State *L ) { - LuaHelpers::CreateTableFromArray(p->ToVectorString(SEGMENT_WARP), L); + TimingSegmentSetToLuaTable(p, SEGMENT_WARP, L); return 1; } static int GetFakes( T* p, lua_State *L ) { - LuaHelpers::CreateTableFromArray(p->ToVectorString(SEGMENT_FAKE), L); + TimingSegmentSetToLuaTable(p, SEGMENT_FAKE, L); return 1; } static int GetScrolls( T* p, lua_State *L ) { - LuaHelpers::CreateTableFromArray(p->ToVectorString(SEGMENT_SCROLL), L); + TimingSegmentSetToLuaTable(p, SEGMENT_SCROLL, L); return 1; } static int GetSpeeds( T* p, lua_State *L ) { - LuaHelpers::CreateTableFromArray(p->ToVectorString(SEGMENT_SPEED), L); + TimingSegmentSetToLuaTable(p, SEGMENT_SPEED, L); return 1; } static int GetTimeSignatures( T* p, lua_State *L ) { - LuaHelpers::CreateTableFromArray(p->ToVectorString(SEGMENT_TIME_SIG), L); + TimingSegmentSetToLuaTable(p, SEGMENT_TIME_SIG, L); return 1; } static int GetCombos( T* p, lua_State *L ) { - LuaHelpers::CreateTableFromArray(p->ToVectorString(SEGMENT_COMBO), L); + TimingSegmentSetToLuaTable(p, SEGMENT_COMBO, L); return 1; } static int GetTickcounts( T* p, lua_State *L ) { - LuaHelpers::CreateTableFromArray(p->ToVectorString(SEGMENT_TICKCOUNT), L); + TimingSegmentSetToLuaTable(p, SEGMENT_TICKCOUNT, L); return 1; } static int GetStops( T* p, lua_State *L ) { - LuaHelpers::CreateTableFromArray(p->ToVectorString(SEGMENT_STOP), L); + TimingSegmentSetToLuaTable(p, SEGMENT_STOP, L); return 1; } static int GetDelays( T* p, lua_State *L ) { - LuaHelpers::CreateTableFromArray(p->ToVectorString(SEGMENT_DELAY), L); + TimingSegmentSetToLuaTable(p, SEGMENT_DELAY, L); return 1; } static int GetBPMs( T* p, lua_State *L ) @@ -1060,12 +1097,12 @@ public: } static int GetLabels( T* p, lua_State *L ) { - LuaHelpers::CreateTableFromArray(p->ToVectorString(SEGMENT_LABEL), L); + TimingSegmentSetToLuaTable(p, SEGMENT_LABEL, L); return 1; } static int GetBPMsAndTimes( T* p, lua_State *L ) { - LuaHelpers::CreateTableFromArray(p->ToVectorString(SEGMENT_BPM), L); + TimingSegmentSetToLuaTable(p, SEGMENT_BPM, L); return 1; } static int GetActualBPM( T* p, lua_State *L ) diff --git a/src/TimingSegments.cpp b/src/TimingSegments.cpp index c8b82e0a52..ac9d6a2ada 100644 --- a/src/TimingSegments.cpp +++ b/src/TimingSegments.cpp @@ -170,6 +170,14 @@ RString ComboSegment::ToString(int dec) const return ssprintf(str.c_str(), GetBeat(), GetCombo(), GetMissCombo()); } +vector ComboSegment::GetValues() const +{ + vector ret; + ret.push_back(GetCombo()); + ret.push_back(GetMissCombo()); + return ret; +} + RString LabelSegment::ToString(int dec) const { const RString str = "%.0" + IntToString(dec) + "f=%s"; @@ -189,6 +197,14 @@ RString TimeSignatureSegment::ToString(int dec) const return ssprintf(str.c_str(), GetBeat(), GetNum(), GetDen()); } +vector TimeSignatureSegment::GetValues() const +{ + vector ret; + ret.push_back(GetNum()); + ret.push_back(GetDen()); + return ret; +} + RString SpeedSegment::ToString(int dec) const { const RString str = "%.0" + IntToString(dec) @@ -198,6 +214,15 @@ RString SpeedSegment::ToString(int dec) const GetDelay(), GetUnit()); } +vector SpeedSegment::GetValues() const +{ + vector ret; + ret.push_back(GetRatio()); + ret.push_back(GetDelay()); + ret.push_back(GetUnit()); + return ret; +} + void SpeedSegment::Scale( int start, int oldLength, int newLength ) { if( GetUnit() == 0 ) diff --git a/src/TimingSegments.h b/src/TimingSegments.h index ef2c5e5e26..0fdf4a9db5 100644 --- a/src/TimingSegments.h +++ b/src/TimingSegments.h @@ -83,6 +83,11 @@ struct TimingSegment return FloatToString(GetBeat()); } + virtual vector GetValues() const + { + return vector(0); + } + bool operator<( const TimingSegment &other ) const { return GetRow() < other.GetRow(); @@ -148,6 +153,7 @@ struct FakeSegment : public TimingSegment void Scale( int start, int length, int newLength ); RString ToString( int dec ) const; + vector GetValues() const { return vector(1, GetLength()); } bool operator==( const FakeSegment &other ) const { @@ -205,6 +211,7 @@ struct WarpSegment : public TimingSegment void Scale( int start, int length, int newLength ); RString ToString( int dec ) const; + vector GetValues() const { return vector(1, GetLength()); } bool operator==( const WarpSegment &other ) const { @@ -259,6 +266,7 @@ struct TickcountSegment : public TimingSegment void SetTicks( int iTicks ) { m_iTicksPerBeat = iTicks; } RString ToString( int dec ) const; + vector GetValues() const { return vector(1, GetTicks()); } bool operator==( const TickcountSegment &other ) const { @@ -310,6 +318,7 @@ struct ComboSegment : public TimingSegment void SetMissCombo( int iCombo ) { m_iMissCombo = iCombo; } RString ToString( int dec ) const; + vector GetValues() const; bool operator==( const ComboSegment &other ) const { @@ -361,6 +370,8 @@ struct LabelSegment : public TimingSegment void SetLabel( const RString& sLabel ) { m_sLabel.assign(sLabel); } RString ToString( int dec ) const; + // Use the default definition for GetValues because the value for a LabelSegment is not a float or set of floats. + // TimingSegmentSetToLuaTable in TimingData.cpp has a special case for labels to handle this. bool operator==( const LabelSegment &other ) const { @@ -408,6 +419,7 @@ struct BPMSegment : public TimingSegment void SetBPM( float fBPM ) { m_fBPS = fBPM / 60.0f; } RString ToString( int dec ) const; + vector GetValues() const { return vector(1, GetBPM()); } bool operator==( const BPMSegment &other ) const { @@ -464,6 +476,7 @@ struct TimeSignatureSegment : public TimingSegment void Set( int num, int den ) { m_iNumerator = num; m_iDenominator = den; } RString ToString( int dec ) const; + vector GetValues() const; /** * @brief Retrieve the number of note rows per measure within the TimeSignatureSegment. @@ -545,6 +558,7 @@ struct SpeedSegment : public TimingSegment void Scale( int start, int length, int newLength ); RString ToString( int dec ) const; + vector GetValues() const; bool operator==( const SpeedSegment &other ) const { @@ -604,6 +618,7 @@ struct ScrollSegment : public TimingSegment void SetRatio( float fRatio ) { m_fRatio = fRatio; } RString ToString( int dec ) const; + vector GetValues() const { return vector(1, GetRatio()); } bool operator==( const ScrollSegment &other ) const { @@ -648,6 +663,7 @@ struct StopSegment : public TimingSegment void SetPause( float fSeconds ) { m_fSeconds = fSeconds; } RString ToString( int dec ) const; + vector GetValues() const { return vector(1, GetPause()); } bool operator==( const StopSegment &other ) const { @@ -691,6 +707,7 @@ struct DelaySegment : public TimingSegment void SetPause( float fSeconds ) { m_fSeconds = fSeconds; } RString ToString( int dec ) const; + vector GetValues() const { return vector(1, GetPause()); } bool operator==( const DelaySegment &other ) const { From 4680cb1802e3c6fa0d948112964c313746975895 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Sun, 9 Mar 2014 10:53:02 -0600 Subject: [PATCH 2/8] Updated documentation to match API changes. --- Docs/Luadoc/LuaDocumentation.xml | 48 ++++++++++++++++---------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index 5d412831ae..9c77a32081 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -4615,44 +4615,44 @@ save yourself some time, copy this for undocumented things: Returns the BPM at fBeat. - - Returns a table of the BPMs as strings. + + Returns a table of the BPMs as floats. - - Returns a table of the BPMs and the times they happen as strings with the format "beat=BPM". + + Returns a table of the BPMs and the times they happen as tables. The first value is the beat. The second value is the bpm. Returns the elapsed time from fBeat. - - Returns a table of the Stops and the times they happen as strings with the format "beat=stop seconds". + + Returns a table of the Stops and the times they happen as tables. The first value is the beat. The second value is the length. - - Returns a table of the Delays and the times they happen as strings with the format "beat=stop seconds". + + Returns a table of the Delays and the times they happen as tables. The first value is the beat. The second value is the length. - - Returns a table of the Labels and the times they happen as strings with the format "beat=label name." + + Returns a table of the Labels and the times they happen as tables. The first value is the beat. The second value is the label. - - Returns a table of the Warps and the times they happen as strings with the format "beat=number of beats warped over." + + Returns a table of the Warps and the times they happen as tables. The first value is the beat. The second value is the number of beats to warp over. - - Returns a table of the Combos and the times they happen as strings with the format "beat=combo value." + + Returns a table of the Combos and the times they happen as tables. The first value is the beat. The second value is the combo. The third value is the miss combo. - - Returns a table of the Time Signatures and the times they happen as strings with the format "beat=beats per measure (numerator)=denominator." + + Returns a table of the Time Signatures and the times they happen as tables. The first value is the beat. The second value is the numerator. The third value is the denominator. - - Returns a table of the Tickcountss and the times they happen as strings with the format "beat=number of ticks per beat." + + Returns a table of the Tickcounts and the times they happen as tables. The first value is the beat. The second value is the number of ticks per beat. - - Returns a table of the Fakes and the times they happen as strings with the format "beat=number of beats to not judge." + + Returns a table of the Fakes and the times they happen as tables. The first value is the beat. The second value is the number of beats to not judge. - - Returns a table of the Scrolls and the times they happen as strings with the format "beat=scroll rate ratio." + + Returns a table of the Scrolls and the times they happen as tables. The first value is the beat. The second value is the scroll rate ratio. - - Returns a table of the Speeds and the times they happen as strings with the format "beat=scroll rate ratio=length of time to fully activate=unit of activation (0 for beats, 1 for seconds)." + + Returns a table of the Speeds and the times they happen as tables. The first value is the beat. The second value is the scroll rate ratio. The third value is the length of time to fully activate. The fourth value is the unit of activation (0 for beats, 1 for seconds). Returns true if the TimingData contains BPM changes. From 321c2cdc62dba0c4059366e3ff1604966c7457a0 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Wed, 10 Sep 2014 04:15:44 -0600 Subject: [PATCH 3/8] Added metric for controlling whether TimingData returns numbers instead of strings. --- Themes/_fallback/metrics.ini | 3 + .../ScreenGameplay decorations/default.lua | 14 ++-- src/TimingData.cpp | 82 +++++++------------ 3 files changed, 38 insertions(+), 61 deletions(-) diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index 3a752eb261..eca0f7830f 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -4552,3 +4552,6 @@ TimerOnCommand=visible,false [PaneDisplay] NullCountString="" + +[TimingData] +GetReturnsNumbers=false diff --git a/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua b/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua index e7b9331a3b..0d031e6303 100644 --- a/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua +++ b/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua @@ -30,13 +30,13 @@ local function CreateSegments(Player) local firstBeatSecs = song:GetFirstSecond(); local lastBeatSecs = song:GetLastSecond(); - local bpms = timingData:GetBPMsAndTimes(); - local stops = timingData:GetStops(); - local delays = timingData:GetDelays(); - local warps = timingData:GetWarps(); - local fakes = timingData:GetFakes(); - local scrolls = timingData:GetScrolls(); - local speeds = timingData:GetSpeeds(); + local bpms = timingData:GetBPMsAndTimesAsNumbers(); + local stops = timingData:GetStopsAsNumbers(); + local delays = timingData:GetDelaysAsNumbers(); + local warps = timingData:GetWarpsAsNumbers(); + local fakes = timingData:GetFakesAsNumbers(); + local scrolls = timingData:GetScrollsAsNumbers(); + local speeds = timingData:GetSpeedsAsNumbers(); -- we don't want too many segments to be shown. local sumSegments = #bpms + #stops + #delays + #warps + #fakes + #scrolls + #speeds diff --git a/src/TimingData.cpp b/src/TimingData.cpp index bad41a1bb3..17b00f30a3 100644 --- a/src/TimingData.cpp +++ b/src/TimingData.cpp @@ -3,6 +3,7 @@ #include "PrefsManager.h" #include "RageUtil.h" #include "RageLog.h" +#include "ThemeManager.h" #include "NoteTypes.h" #include "Foreach.h" #include @@ -991,6 +992,8 @@ vector TimingData::ToVectorString(TimingSegmentType tst, int dec) const // lua start #include "LuaBinding.h" +#define TIMING_DATA_RETURNS_NUMBERS THEME->GetMetricB("TimingData", "GetReturnsNumbers") + // This breaks encapsulation just as much as TimingData::ToVectorString does. // But, it exists solely for the purpose of providing lua access, so it's as okay as all the other lua stuff that reaches past the encapsulation. void TimingSegmentSetToLuaTable(TimingData* td, TimingSegmentType tst, lua_State *L); @@ -1039,51 +1042,32 @@ public: static int HasFakes( T* p, lua_State *L ) { lua_pushboolean(L, p->HasFakes()); return 1; } static int HasSpeedChanges( T* p, lua_State *L ) { lua_pushboolean(L, p->HasSpeedChanges()); return 1; } static int HasScrollChanges( T* p, lua_State *L ) { lua_pushboolean(L, p->HasScrollChanges()); return 1; } - static int GetWarps( T* p, lua_State *L ) - { - TimingSegmentSetToLuaTable(p, SEGMENT_WARP, L); - return 1; - } - static int GetFakes( T* p, lua_State *L ) - { - TimingSegmentSetToLuaTable(p, SEGMENT_FAKE, L); - return 1; - } - static int GetScrolls( T* p, lua_State *L ) - { - TimingSegmentSetToLuaTable(p, SEGMENT_SCROLL, L); - return 1; - } - static int GetSpeeds( T* p, lua_State *L ) - { - TimingSegmentSetToLuaTable(p, SEGMENT_SPEED, L); - return 1; - } - static int GetTimeSignatures( T* p, lua_State *L ) - { - TimingSegmentSetToLuaTable(p, SEGMENT_TIME_SIG, L); - return 1; - } - static int GetCombos( T* p, lua_State *L ) - { - TimingSegmentSetToLuaTable(p, SEGMENT_COMBO, L); - return 1; - } - static int GetTickcounts( T* p, lua_State *L ) - { - TimingSegmentSetToLuaTable(p, SEGMENT_TICKCOUNT, L); - return 1; - } - static int GetStops( T* p, lua_State *L ) - { - TimingSegmentSetToLuaTable(p, SEGMENT_STOP, L); - return 1; - } - static int GetDelays( T* p, lua_State *L ) - { - TimingSegmentSetToLuaTable(p, SEGMENT_DELAY, L); - return 1; +#define GET_FUNCTION(get_name, segment_name) \ + static int get_name(T* p, lua_State* L) \ + { \ + if(TIMING_DATA_RETURNS_NUMBERS) \ + { \ + TimingSegmentSetToLuaTable(p, segment_name, L); \ + } \ + else \ + { \ + LuaHelpers::CreateTableFromArray(p->ToVectorString(segment_name), L); \ + } \ + return 1; \ } + + GET_FUNCTION(GetWarps, SEGMENT_WARP); + GET_FUNCTION(GetFakes, SEGMENT_FAKE); + GET_FUNCTION(GetScrolls, SEGMENT_SCROLL); + GET_FUNCTION(GetSpeeds, SEGMENT_SPEED); + GET_FUNCTION(GetTimeSignatures, SEGMENT_TIME_SIG); + GET_FUNCTION(GetCombos, SEGMENT_COMBO); + GET_FUNCTION(GetTickcounts, SEGMENT_TICKCOUNT); + GET_FUNCTION(GetStops, SEGMENT_STOP); + GET_FUNCTION(GetDelays, SEGMENT_DELAY); + GET_FUNCTION(GetLabels, SEGMENT_LABEL); + GET_FUNCTION(GetBPMsAndTimes, SEGMENT_BPM); +#undef GET_FUNCTION static int GetBPMs( T* p, lua_State *L ) { vector vBPMs; @@ -1095,16 +1079,6 @@ public: LuaHelpers::CreateTableFromArray(vBPMs, L); return 1; } - static int GetLabels( T* p, lua_State *L ) - { - TimingSegmentSetToLuaTable(p, SEGMENT_LABEL, L); - return 1; - } - static int GetBPMsAndTimes( T* p, lua_State *L ) - { - TimingSegmentSetToLuaTable(p, SEGMENT_BPM, L); - return 1; - } static int GetActualBPM( T* p, lua_State *L ) { // certainly there's a better way to do it than this? -aj From 3006b70d712d352759c7fe88e60c5c73db31fa4e Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Wed, 10 Sep 2014 05:37:13 -0600 Subject: [PATCH 4/8] Updated TimingData docs. --- Docs/Luadoc/LuaDocumentation.xml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index 9c77a32081..ae5373c98c 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -4606,6 +4606,22 @@ save yourself some time, copy this for undocumented things: + + GetBPMsAndTimes, GetStops, GetDelays, GetLabels, GetWarps, GetCombos, GetTimeSignatures, GetTickcounts, GetFakes, GetScrolls, and GetSpeeds all have two different modes.
+ If the metric TimingData:GetReturnsNumbers is false (the default), they return tables of strings. The strings are numbers separated by '='.
+ If the metric TimingData:GetReturnsNumbers is true, they return tables of tables, and the inner tables contain numbers as described for each function.
+ The first form is kept around and is the default for compatibility with older themes. The advantage of the second form is that you no longer need to have a bit of code in your theme to transform the string into a table of numbers before you can use it.
+ Example:
+ local bpmsand= timing_data:GetBPMsAndTimes()
+ for i, s in ipairs(bpmsand) do
+ local sand= split("=", s)
+ bpmsand[i]= {tonumber(sand[1]), tonumber(sand[2])}
+ end
+ -- do something that looks at all the bpms and times.
+ Becomes:
+ local bpmsand= timing_data:GetBPMsAndTimes()
+ -- do something that looks at all the bpms and times.
+
Returns the minimum and maximum BPM of the song in a table (in that order). From 63affc326f155187bfce19ea62a0182a39693b28 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Wed, 10 Sep 2014 12:07:26 -0600 Subject: [PATCH 5/8] Forgot about the AsNumbers unseen version that default was trying to use. --- .../ScreenGameplay decorations/default.lua | 14 +++++++------- Themes/default/metrics.ini | 3 +++ 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua b/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua index 0d031e6303..e7b9331a3b 100644 --- a/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua +++ b/Themes/default/BGAnimations/ScreenGameplay decorations/default.lua @@ -30,13 +30,13 @@ local function CreateSegments(Player) local firstBeatSecs = song:GetFirstSecond(); local lastBeatSecs = song:GetLastSecond(); - local bpms = timingData:GetBPMsAndTimesAsNumbers(); - local stops = timingData:GetStopsAsNumbers(); - local delays = timingData:GetDelaysAsNumbers(); - local warps = timingData:GetWarpsAsNumbers(); - local fakes = timingData:GetFakesAsNumbers(); - local scrolls = timingData:GetScrollsAsNumbers(); - local speeds = timingData:GetSpeedsAsNumbers(); + local bpms = timingData:GetBPMsAndTimes(); + local stops = timingData:GetStops(); + local delays = timingData:GetDelays(); + local warps = timingData:GetWarps(); + local fakes = timingData:GetFakes(); + local scrolls = timingData:GetScrolls(); + local speeds = timingData:GetSpeeds(); -- we don't want too many segments to be shown. local sumSegments = #bpms + #stops + #delays + #warps + #fakes + #scrolls + #speeds diff --git a/Themes/default/metrics.ini b/Themes/default/metrics.ini index 1435f2789c..fb4674858e 100644 --- a/Themes/default/metrics.ini +++ b/Themes/default/metrics.ini @@ -2234,3 +2234,6 @@ ShowBPMDisplay=false [ScreenJukebox] [ScreenCredits] + +[TimingData] +GetReturnsNumbers=true From fd1de8b0809376f2fe5bea19d884f195a8ab969c Mon Sep 17 00:00:00 2001 From: Dan Guzek Date: Thu, 11 Sep 2014 16:02:45 -0400 Subject: [PATCH 6/8] add distinct coin input debounce preference This commit adds a preference, DebounceCoinInputTime (defaults is 0), which allows coin input to be debounced via a float value separate from other input. --- src/InputFilter.cpp | 26 +++++++++++++++++++++----- src/PrefsManager.cpp | 1 + src/PrefsManager.h | 1 + 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/InputFilter.cpp b/src/InputFilter.cpp index 00d8228f9c..9a7faa1d68 100644 --- a/src/InputFilter.cpp +++ b/src/InputFilter.cpp @@ -7,6 +7,8 @@ #include "RageThreads.h" #include "Preference.h" #include "Foreach.h" +#include "GameInput.h" +#include "InputMapper.h" // for mouse stuff: -aj #include "PrefsManager.h" #include "ScreenDimensions.h" @@ -229,12 +231,26 @@ void InputFilter::CheckButtonChange( ButtonState &bs, DeviceInput di, const Rage { if( bs.m_BeingHeld == bs.m_bLastReportedHeld ) return; + + GameInput gi; - /* If the last IET_FIRST_PRESS or IET_RELEASE event was sent too recently, - * wait a while before sending it. */ - if( now - bs.m_LastReportTime < g_fInputDebounceTime ) - return; - + /* Possibly apply debounce, + * If the input was coin, possibly apply distinct coin debounce in the else below. */ + if (! INPUTMAPPER->DeviceToGame(di, gi) || gi.button != GAME_BUTTON_COIN ) + { + /* If the last IET_FIRST_PRESS or IET_RELEASE event was sent too recently, + * wait a while before sending it. */ + if( now - bs.m_LastReportTime < g_fInputDebounceTime ) + { + return; + } + } else { + if( now - bs.m_LastReportTime < PREFSMAN->m_fDebounceCoinInputTime ) + { + return; + } + } + bs.m_LastReportTime = now; bs.m_bLastReportedHeld = bs.m_BeingHeld; bs.m_fSecsHeld = 0; diff --git a/src/PrefsManager.cpp b/src/PrefsManager.cpp index 79ef13dace..7fd7c2e6aa 100644 --- a/src/PrefsManager.cpp +++ b/src/PrefsManager.cpp @@ -254,6 +254,7 @@ PrefsManager::PrefsManager() : m_bAllowMultipleHighScoreWithSameName ( "AllowMultipleHighScoreWithSameName", true ), m_bCelShadeModels ( "CelShadeModels", false ), // Work-In-Progress.. disable by default. m_bPreferredSortUsesGroups ( "PreferredSortUsesGroups", true ), + m_fDebounceCoinInputTime ( "DebounceCoinInputTime", 0 ), m_fPadStickSeconds ( "PadStickSeconds", 0 ), m_bForceMipMaps ( "ForceMipMaps", false ), diff --git a/src/PrefsManager.h b/src/PrefsManager.h index e27daf627e..dddacbcef7 100644 --- a/src/PrefsManager.h +++ b/src/PrefsManager.h @@ -245,6 +245,7 @@ public: Preference m_bAllowMultipleHighScoreWithSameName; Preference m_bCelShadeModels; Preference m_bPreferredSortUsesGroups; + Preference m_fDebounceCoinInputTime; // allow users to apply a distinct debounce to coin input // Number of seconds it takes for a button on the controller to release // after pressed. From 455431d8c35a9624ad793937cad0e587794f9941 Mon Sep 17 00:00:00 2001 From: Kyzentun Date: Mon, 15 Sep 2014 00:04:41 -0600 Subject: [PATCH 7/8] Removed DefaultFail GamePref and reinstated DefaultFailType real preference. Should fix default fail related problems. --- Themes/_fallback/Languages/en.ini | 2 +- Themes/_fallback/Scripts/02 StageMods.lua | 22 ----- .../Scripts/03 ThemeAndGamePrefs.lua | 80 ------------------- Themes/_fallback/metrics.ini | 9 +-- src/GameConstantsAndTypes.cpp | 1 + src/PlayerOptions.cpp | 2 +- src/PrefsManager.cpp | 1 + src/PrefsManager.h | 3 +- src/ScreenOptionsMasterPrefs.cpp | 33 +------- 9 files changed, 11 insertions(+), 142 deletions(-) diff --git a/Themes/_fallback/Languages/en.ini b/Themes/_fallback/Languages/en.ini index fa6dd33c83..e4c8fc3f32 100644 --- a/Themes/_fallback/Languages/en.ini +++ b/Themes/_fallback/Languages/en.ini @@ -659,7 +659,7 @@ Double for 1 Credit=Double for 1 Credit Drunk=Drunk Dynamic Random=Dynamic Random Echo=Echo -End of Song=End of Song +EndOfSong=End of Song FailAtEnd=Fail at end EffectSpeed=Speed EffectPitch=Pitch diff --git a/Themes/_fallback/Scripts/02 StageMods.lua b/Themes/_fallback/Scripts/02 StageMods.lua index 0dc51d8cba..3ed4f978de 100644 --- a/Themes/_fallback/Scripts/02 StageMods.lua +++ b/Themes/_fallback/Scripts/02 StageMods.lua @@ -10,28 +10,6 @@ function AreStageSongModsForced() return GAMESTATE:IsAnExtraStage() or bOni or bBattle or bRave end -local default_fail_applied= {} - -function ResetDefaultFail() - default_fail_applied= {} -end - -function SetFail() - local sFail = "" - if GetGamePref("DefaultFail") then - sFail = string.format("FailType_%s", GetGamePref("DefaultFail")) - else - sFail = "FailType_Off" - end - for pn in ivalues(GAMESTATE:GetHumanPlayers()) do - if not default_fail_applied[pn] then - GAMESTATE:GetPlayerState(pn):GetPlayerOptions("ModsLevel_Preferred"):FailSetting(sFail) - default_fail_applied[pn]= true - MESSAGEMAN:Broadcast( "PlayerOptionsChanged", {PlayerNumber = pn} ) - end - end -end - function ScreenSelectMusic:setupmusicstagemods() Trace( "setupmusicstagemods" ) local pm = GAMESTATE:GetPlayMode() diff --git a/Themes/_fallback/Scripts/03 ThemeAndGamePrefs.lua b/Themes/_fallback/Scripts/03 ThemeAndGamePrefs.lua index 3e8311486c..4026074ed1 100644 --- a/Themes/_fallback/Scripts/03 ThemeAndGamePrefs.lua +++ b/Themes/_fallback/Scripts/03 ThemeAndGamePrefs.lua @@ -2,7 +2,6 @@ function InitGamePrefs() local Prefs = { - { "DefaultFail", "Immediate" }, }; local BPrefs = @@ -150,82 +149,3 @@ end; --[[ end themeoption rows ]] --[[ game option rows ]] -local fail_choices= { "Immediate","ImmediateContinue", "EndOfSong", "Off" } -function GamePrefDefaultFail() - return { - Name = "GamePrefDefaultFail"; - LayoutType = "ShowAllInRow"; - SelectType = "SelectOne"; - OneChoiceForAllPlayers = true; - ExportOnChange = false; - Choices = fail_choices; - LoadSelections = function(self, list, pn) - if ReadGamePrefFromFile("DefaultFail") ~= nil then - local default= GetGamePref("DefaultFail") - if default then - if default == "Immediate" then - list[1] = true - elseif default == "ImmediateContinue" then - list[2] = true - elseif default == "EndOfSong" or default == "AtEnd" then - list[3] = true - elseif default == "Off" then - list[4] = true - else - list[1] = true - end - else - list[1] = true - end - else - WriteGamePrefToFile("DefaultFail","Immediate") - list[1] = true - end - end; - SaveSelections = function(self, list, pn) - local val - if list[1] then - val = fail_choices[1] - elseif list[2] then - val = fail_choices[2] - elseif list[3] then - val = fail_choices[3] - elseif list[4] then - val = fail_choices[4] - else - val = fail_choices[1] - end - WriteGamePrefToFile("DefaultFail",val) - MESSAGEMAN:Broadcast("PreferenceSet", { Message == "Set Preference" } ) - THEME:ReloadMetrics() - end; - } -end - -function SongPrefFail() - -- Apply the default fail type to any players that haven't had it applied. - SetFail() - return { - Name= "Fail", - LayoutType= "ShowAllInRow", - SelectType= "SelectOne", - OneChoiceForAllPlayers= false, - ExportOnChange= false, - Choices= fail_choices, - LoadSelections= function(self, list, pn) - local fail= GAMESTATE:GetPlayerState(pn):GetPlayerOptions("ModsLevel_Preferred"):FailSetting():sub(10) - for i, c in ipairs(self.Choices) do - if c == fail then - list[i]= true - end - end - end, - SaveSelections= function(self, list, pn) - for i, c in ipairs(self.Choices) do - if list[i] then - GAMESTATE:GetPlayerState(pn):GetPlayerOptions("ModsLevel_Preferred"):FailSetting("FailType_" .. c) - end - end - end - } -end diff --git a/Themes/_fallback/metrics.ini b/Themes/_fallback/metrics.ini index c3c604abfb..c3b8e9970e 100644 --- a/Themes/_fallback/metrics.ini +++ b/Themes/_fallback/metrics.ini @@ -1816,7 +1816,7 @@ Fallback="ScreenSelectMaster" PrevScreen="ScreenInit" NextScreen="ScreenInit" # -ScreenBeginCommand=%ResetDefaultFail +ScreenBeginCommand= StopMusicOnBack=true # CoinModeChangeScreen=Branch.TitleMenu() @@ -2955,7 +2955,7 @@ Line6="conf,SoundVolume" Line7="conf,TimingWindowScale" Line8="conf,LifeDifficulty" Line9="conf,AllowW1" -LineFA="lua,GamePrefDefaultFail()" +LineFA="conf,DefaultFailType" Line10="conf,AutogenSteps" Line11="conf,ShowBanners" Line12="conf,ShowCaution" @@ -3005,7 +3005,7 @@ LineNames="3,4,8,SI,SM,11,13,14,15,16,28,29,30,31" #LineScore="lua,UserPrefScoringMode()" Line3="conf,TimingWindowScale" Line4="conf,LifeDifficulty" -Line8="lua,GamePrefDefaultFail()" +Line8="conf,DefaultFailType" LineSI="lua,SpeedModIncSize()" LineSM="lua,SpeedModIncLarge()" Line11="conf,AllowW1" @@ -3198,7 +3198,6 @@ LineNames="1,2,3,4,5,6,7,8,9,10" Line1="list,LifeType" Line2="list,BarDrain" Line3="list,BatLives" -##Line4="lua,GamePrefDefaultFail()" Line5="list,Assist" Line6="list,Rate" Line7="list,SoundEffect" @@ -3206,7 +3205,7 @@ Line8="list,AutoAdjust" Line9="list,Background" Line10="list,SaveScores" Line11="list,SaveReplays" -Line4="lua,SongPrefFail()" +Line4="list,Fail" [ScreenSplash] Class="ScreenSplash" diff --git a/src/GameConstantsAndTypes.cpp b/src/GameConstantsAndTypes.cpp index f9b366ab55..a6f6f7f2d1 100644 --- a/src/GameConstantsAndTypes.cpp +++ b/src/GameConstantsAndTypes.cpp @@ -499,6 +499,7 @@ static const char *FailTypeNames[] = { }; XToString( FailType ); XToLocalizedString( FailType ); +StringToX( FailType ); LuaXType( FailType ); /* diff --git a/src/PlayerOptions.cpp b/src/PlayerOptions.cpp index 1020bd0dd1..a579d1483f 100644 --- a/src/PlayerOptions.cpp +++ b/src/PlayerOptions.cpp @@ -74,7 +74,7 @@ void PlayerOptions::Init() ZERO( m_bTurns ); ZERO( m_bTransforms ); m_bMuteOnError = false; - m_FailType = FailType_Immediate; + m_FailType = PREFSMAN->m_DefaultFailType; m_sNoteSkin = ""; } diff --git a/src/PrefsManager.cpp b/src/PrefsManager.cpp index 79ef13dace..56f0f62148 100644 --- a/src/PrefsManager.cpp +++ b/src/PrefsManager.cpp @@ -285,6 +285,7 @@ PrefsManager::PrefsManager() : m_sCoursesToShowRanking ( "CoursesToShowRanking", "" ), m_bQuirksMode ( "QuirksMode", false ), + m_DefaultFailType("DefaultFailtype", FailType_ImmediateContinue), /* Debug: */ m_bLogToDisk ( "LogToDisk", true ), diff --git a/src/PrefsManager.h b/src/PrefsManager.h index e27daf627e..1db1ecb5a9 100644 --- a/src/PrefsManager.h +++ b/src/PrefsManager.h @@ -2,6 +2,7 @@ #define PREFSMANAGER_H #include "Preference.h" +#include "GameConstantsAndTypes.h" class IniFile; @@ -292,7 +293,7 @@ public: /** @brief Enable some quirky behavior used by some older versions of StepMania. */ Preference m_bQuirksMode; - // Preference m_sDefaultFailType; // XXX: Fix fail bug? + Preference m_DefaultFailType; // Debug: Preference m_bLogToDisk; diff --git a/src/ScreenOptionsMasterPrefs.cpp b/src/ScreenOptionsMasterPrefs.cpp index 92d319160a..7098210eeb 100644 --- a/src/ScreenOptionsMasterPrefs.cpp +++ b/src/ScreenOptionsMasterPrefs.cpp @@ -480,37 +480,6 @@ static int GetLifeDifficulty() LuaFunction( GetLifeDifficulty, GetLifeDifficulty() ); -static void DefaultFailType( int &sel, bool ToSel, const ConfOption *pConfOption ) -{ - if( ToSel ) - { - PlayerOptions po; - po.FromString( PREFSMAN->m_sDefaultModifiers ); - sel = po.m_FailType; - } - else - { - PlayerOptions po; - SongOptions so; - GetPrefsDefaultModifiers( po, so ); - - switch( sel ) - { - case 0: po.m_FailType = FailType_Immediate; break; - case 1: po.m_FailType = FailType_ImmediateContinue; break; - case 2: po.m_FailType = FailType_EndOfSong; break; - case 3: po.m_FailType = FailType_Off; break; - default: - { - LOG->Warn("Invalid fail type %d! Going to use the default...", sel); - po.m_FailType = FailType_Immediate; break; - } - } - - SetPrefsDefaultModifiers( po, so ); - } -} - // Graphic options struct res_t { @@ -739,7 +708,7 @@ static void InitializeConfOptions() ADD( ConfOption( "ProgressiveLifebar", MovePref, "Off","|1","|2","|3","|4","|5","|6","|7","|8") ); ADD( ConfOption( "ProgressiveStageLifebar", MovePref, "Off","|1","|2","|3","|4","|5","|6","|7","|8","Insanity") ); ADD( ConfOption( "ProgressiveNonstopLifebar", MovePref, "Off","|1","|2","|3","|4","|5","|6","|7","|8","Insanity") ); - ADD( ConfOption( "DefaultFailType", DefaultFailType, "Immediate","ImmediateContinue","EndOfSong","Off" ) ); + ADD( ConfOption( "DefaultFailType", MovePref, "Immediate","ImmediateContinue","EndOfSong","Off" ) ); ADD( ConfOption( "CoinsPerCredit", CoinsPerCredit, "|1","|2","|3","|4","|5","|6","|7","|8","|9","|10","|11","|12","|13","|14","|15","|16" ) ); ADD( ConfOption( "Premium", MovePref, "Off","Double for 1 Credit","2 Players for 1 Credit" ) ); ADD( ConfOption( "JointPremium", JointPremium, "Off","2 Players for 1 Credit" ) ); From 3fd3d22b3cc44115a267e183520e37f9c8786318 Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Sun, 21 Sep 2014 20:53:53 -0400 Subject: [PATCH 8/8] Ignore user data in general. --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 956874a71c..1b725d22be 100644 --- a/.gitignore +++ b/.gitignore @@ -57,6 +57,7 @@ src/stamp-h1 Docs/doxygen PBProject/build Xcode/build +Xcode/*.xcodeproj/xcuserdata/ *.xcodeproj/xcuserdata *.xcodeproj/project.xcworkspace src/build-* @@ -129,4 +130,4 @@ bundle/ffmpeg/*/*.ver bundle/ffmpeg/*/*.def bundle/ffmpeg/*/*.orig.def bundle/ffmpeg/*/*.dll.a -bundle/ffmpeg/*/*.lib \ No newline at end of file +bundle/ffmpeg/*/*.lib