45 T m_[NUM_ModsLevel]{};
49 void Init() { Call(ModsLevel_Preferred, &T::Init); }
51 void Update(
float fDelta)
55 fDelta = m_Timer.GetDeltaTime();
56 m_[ModsLevel_Current].Approach(m_[ModsLevel_Song], fDelta);
60 void Assign(ModsLevel level, U T::*member,
const U& val)
62 if (level != ModsLevel_Song)
63 m_[ModsLevel_Current].*member = val;
64 for (; level < ModsLevel_Current; enum_add(level, 1))
65 m_[level].*member = val;
68 template<
typename U,
int n>
69 void Assign_n(ModsLevel level,
75 if (level != ModsLevel_Song)
76 (m_[ModsLevel_Current].*member)[index] = val;
77 for (; level < ModsLevel_Current; enum_add(level, 1))
78 (m_[level].*member)[index] = val;
81 void Assign(ModsLevel level,
const T& val)
83 if (level != ModsLevel_Song)
84 m_[ModsLevel_Current] = val;
85 for (; level < ModsLevel_Current; enum_add(level, 1))
89 void Call(ModsLevel level,
void (T::*fun)())
91 if (level != ModsLevel_Song)
92 (m_[ModsLevel_Current].*fun)();
93 for (; level < ModsLevel_Current; enum_add(level, 1))
97 void FromString(ModsLevel level,
const std::string& str)
99 if (level != ModsLevel_Song)
100 m_[ModsLevel_Current].FromString(str);
101 for (; level < ModsLevel_Current; enum_add(level, 1))
102 m_[level].FromString(str);
105 void SetCurrentToLevel(ModsLevel level)
107 m_[ModsLevel_Current] = m_[level];
110 [[nodiscard]]
auto Get(ModsLevel l)
const ->
const T& {
return m_[l]; }
111 [[nodiscard]]
auto GetPreferred()
const ->
const T&
113 return m_[ModsLevel_Preferred];
115 [[nodiscard]]
auto GetStage()
const ->
const T&
117 return m_[ModsLevel_Stage];
119 [[nodiscard]]
auto GetSong()
const ->
const T&
121 return m_[ModsLevel_Song];
123 [[nodiscard]]
auto GetCurrent()
const ->
const T&
125 return m_[ModsLevel_Current];
127 auto Get(ModsLevel l) -> T& {
return m_[l]; }
128 auto GetPreferred() -> T& {
return m_[ModsLevel_Preferred]; }
129 auto GetStage() -> T& {
return m_[ModsLevel_Stage]; }
130 auto GetSong() -> T& {
return m_[ModsLevel_Song]; }
131 auto GetCurrent() -> T& {
return m_[ModsLevel_Current]; }