diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml
index b5759dae61..c2bfc66c43 100644
--- a/Docs/Luadoc/Lua.xml
+++ b/Docs/Luadoc/Lua.xml
@@ -1114,6 +1114,9 @@
+
+
+
@@ -1122,6 +1125,8 @@
+
+
@@ -1137,8 +1142,12 @@
+
+
+
+
@@ -1204,12 +1213,17 @@
+
+
+
+
+
diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml
index 39bbac6690..4772e2fffb 100644
--- a/Docs/Luadoc/LuaDocumentation.xml
+++ b/Docs/Luadoc/LuaDocumentation.xml
@@ -3432,6 +3432,9 @@ save yourself some time, copy this for undocumented things:
+
+
+
@@ -3440,6 +3443,8 @@ save yourself some time, copy this for undocumented things:
+
+
If the player has a CMod set, returns the value of that CMod and its associated approach speed. Returns nil otherwise.
@@ -3464,8 +3469,12 @@ save yourself some time, copy this for undocumented things:
+
+
+
+
Sets the for the player, if the optional argument is provided. Returns the that was previously set.
@@ -3600,7 +3609,11 @@ save yourself some time, copy this for undocumented things:
+
+
+
+
@@ -3608,6 +3621,7 @@ save yourself some time, copy this for undocumented things:
Returns true if the player is using reverse. (equivalent to GetReverse() == 1.0)
+
If the player has a XMod set, returns the value of that XMod and its associated approach speed. Returns nil otherwise.
diff --git a/src/ArrowEffects.cpp b/src/ArrowEffects.cpp
index c5313daa1d..3a959cabee 100644
--- a/src/ArrowEffects.cpp
+++ b/src/ArrowEffects.cpp
@@ -97,13 +97,14 @@ void ArrowEffects::Update()
? GAMESTATE->m_pPlayerState[pn]->m_Position : GAMESTATE->m_Position;
const float field_zoom= GAMESTATE->m_pPlayerState[pn]->m_NotefieldZoom;
const float* effects= GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions.GetCurrent().m_fEffects;
+ const float* accels= GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions.GetCurrent().m_fAccels;
PerPlayerData &data = g_EffectData[pn];
if( !position.m_bFreeze || !position.m_bDelay )
{
data.m_fExpandSeconds += fTime - fLastTime;
- data.m_fExpandSeconds = fmodf( data.m_fExpandSeconds, PI*2 );
+ data.m_fExpandSeconds = fmodf( data.m_fExpandSeconds, (PI*2)/(accels[PlayerOptions::ACCEL_EXPAND_PERIOD]+1) );
}
// Update Tornado
@@ -185,7 +186,7 @@ void ArrowEffects::Update()
if(effects[PlayerOptions::EFFECT_TIPSY] != 0)
{
const float time= RageTimer::GetTimeSinceStartFast();
- const float time_times_timer= time * TIPSY_TIMER_FREQUENCY;
+ const float time_times_timer= time * ((effects[PlayerOptions::EFFECT_TIPSY_SPEED] * TIPSY_TIMER_FREQUENCY) + TIPSY_TIMER_FREQUENCY);
const float arrow_times_mag= ARROW_SIZE * TIPSY_ARROW_MAGNITUDE;
const float time_times_offset_timer= time *
TIPSY_OFFSET_TIMER_FREQUENCY;
@@ -194,7 +195,7 @@ void ArrowEffects::Update()
for(int col= 0; col < MAX_COLS_PER_PLAYER; ++col)
{
data.m_tipsy_result[col]= RageFastCos(
- time_times_timer + (col * TIPSY_COLUMN_FREQUENCY)) *
+ time_times_timer + (col * ((effects[PlayerOptions::EFFECT_TIPSY_OFFSET] * TIPSY_COLUMN_FREQUENCY) + TIPSY_COLUMN_FREQUENCY))) *
arrow_times_mag;
data.m_tipsy_offset_result[col]= RageFastCos(
time_times_offset_timer + (col * TIPSY_OFFSET_COLUMN_FREQUENCY)) *
@@ -212,7 +213,7 @@ void ArrowEffects::Update()
// Update Beat
do {
float fAccelTime = 0.2f, fTotalTime = 0.5f;
- float fBeat = position.m_fSongBeatVisible + fAccelTime;
+ float fBeat = ((position.m_fSongBeatVisible + fAccelTime + effects[PlayerOptions::EFFECT_BEAT_OFFSET]) * (effects[PlayerOptions::EFFECT_BEAT_MULT]+1));
const bool bEvenBeat = ( int(fBeat) % 2 ) != 0;
@@ -360,7 +361,7 @@ float ArrowEffects::GetYOffset( const PlayerState* pPlayerState, int iCol, float
fYAdjust += fBrakeYAdjust;
}
if( fAccels[PlayerOptions::ACCEL_WAVE] != 0 )
- fYAdjust += fAccels[PlayerOptions::ACCEL_WAVE] * WAVE_MOD_MAGNITUDE *RageFastSin( fYOffset/WAVE_MOD_HEIGHT );
+ fYAdjust += fAccels[PlayerOptions::ACCEL_WAVE] * WAVE_MOD_MAGNITUDE *RageFastSin( fYOffset/((fAccels[PlayerOptions::ACCEL_WAVE_PERIOD]*WAVE_MOD_HEIGHT)+WAVE_MOD_HEIGHT) );
fYOffset += fYAdjust;
@@ -396,7 +397,7 @@ float ArrowEffects::GetYOffset( const PlayerState* pPlayerState, int iCol, float
// TODO: Don't index by PlayerNumber.
PerPlayerData &data = g_EffectData[pPlayerState->m_PlayerNumber];
- float fExpandMultiplier = SCALE( RageFastCos(data.m_fExpandSeconds*EXPAND_MULTIPLIER_FREQUENCY),
+ float fExpandMultiplier = SCALE( RageFastCos(data.m_fExpandSeconds*EXPAND_MULTIPLIER_FREQUENCY*(fAccels[PlayerOptions::ACCEL_EXPAND_PERIOD]+1)),
EXPAND_MULTIPLIER_SCALE_FROM_LOW, EXPAND_MULTIPLIER_SCALE_FROM_HIGH,
EXPAND_MULTIPLIER_SCALE_TO_LOW, EXPAND_MULTIPLIER_SCALE_TO_HIGH );
fScrollSpeed *= SCALE( fAccels[PlayerOptions::ACCEL_EXPAND],
@@ -493,7 +494,7 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float
const float fPositionBetween = SCALE( fRealPixelOffset, data.m_fMinTornadoX[iColNum], data.m_fMaxTornadoX[iColNum],
TORNADO_POSITION_SCALE_TO_LOW, TORNADO_POSITION_SCALE_TO_HIGH );
float fRads = acosf( fPositionBetween );
- fRads += fYOffset * TORNADO_OFFSET_FREQUENCY / SCREEN_HEIGHT;
+ fRads += (fYOffset + fEffects[PlayerOptions::EFFECT_TORNADO_OFFSET]) * ((fEffects[PlayerOptions::EFFECT_TORNADO_PERIOD] * TORNADO_OFFSET_FREQUENCY) + TORNADO_OFFSET_FREQUENCY) / SCREEN_HEIGHT;
const float fAdjustedPixelOffset = SCALE( RageFastCos(fRads), TORNADO_OFFSET_SCALE_FROM_LOW, TORNADO_OFFSET_SCALE_FROM_HIGH,
data.m_fMinTornadoX[iColNum], data.m_fMaxTornadoX[iColNum] );
@@ -503,8 +504,8 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float
if( fEffects[PlayerOptions::EFFECT_DRUNK] != 0 )
fPixelOffsetFromCenter += fEffects[PlayerOptions::EFFECT_DRUNK] *
- ( RageFastCos( RageTimer::GetTimeSinceStartFast() + iColNum*DRUNK_COLUMN_FREQUENCY
- + fYOffset*DRUNK_OFFSET_FREQUENCY/SCREEN_HEIGHT) * ARROW_SIZE*DRUNK_ARROW_MAGNITUDE );
+ ( RageFastCos( RageTimer::GetTimeSinceStartFast()*(1+fEffects[PlayerOptions::EFFECT_DRUNK_SPEED]) + iColNum*((fEffects[PlayerOptions::EFFECT_DRUNK_OFFSET]*DRUNK_COLUMN_FREQUENCY)+DRUNK_COLUMN_FREQUENCY)
+ + fYOffset*((fEffects[PlayerOptions::EFFECT_DRUNK_PERIOD]*DRUNK_OFFSET_FREQUENCY)+DRUNK_OFFSET_FREQUENCY)/SCREEN_HEIGHT) * ARROW_SIZE*DRUNK_ARROW_MAGNITUDE );
if( fEffects[PlayerOptions::EFFECT_FLIP] != 0 )
{
const int iFirstCol = 0;
@@ -520,7 +521,7 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float
if( fEffects[PlayerOptions::EFFECT_BEAT] != 0 )
{
- const float fShift = data.m_fBeatFactor*RageFastSin( fYOffset / BEAT_OFFSET_HEIGHT + PI/BEAT_PI_HEIGHT );
+ const float fShift = data.m_fBeatFactor*RageFastSin( fYOffset / ((fEffects[PlayerOptions::EFFECT_BEAT_PERIOD]*BEAT_OFFSET_HEIGHT)+BEAT_OFFSET_HEIGHT) + PI/BEAT_PI_HEIGHT );
fPixelOffsetFromCenter += fEffects[PlayerOptions::EFFECT_BEAT] * fShift;
}
@@ -858,7 +859,7 @@ float ArrowEffects::GetZPos(int iCol, float fYOffset)
const float* fEffects = curr_options->m_fEffects;
if( fEffects[PlayerOptions::EFFECT_BUMPY] != 0 )
- fZPos += fEffects[PlayerOptions::EFFECT_BUMPY] * 40*RageFastSin( fYOffset/16.0f );
+ fZPos += fEffects[PlayerOptions::EFFECT_BUMPY] * 40*RageFastSin( (fYOffset+(100.0f*fEffects[PlayerOptions::EFFECT_BUMPY_OFFSET]) )/((fEffects[PlayerOptions::EFFECT_BUMPY_PERIOD]*16.0f)+16.0f) );
return fZPos;
}
diff --git a/src/PlayerOptions.cpp b/src/PlayerOptions.cpp
index 859ac76c58..7f3753a79a 100644
--- a/src/PlayerOptions.cpp
+++ b/src/PlayerOptions.cpp
@@ -214,10 +214,15 @@ void PlayerOptions::GetMods( vector &AddTo, bool bForceNoteSkin ) const
AddPart( AddTo, m_fAccels[ACCEL_BOOST], "Boost" );
AddPart( AddTo, m_fAccels[ACCEL_BRAKE], "Brake" );
AddPart( AddTo, m_fAccels[ACCEL_WAVE], "Wave" );
+ AddPart( AddTo, m_fAccels[ACCEL_WAVE_PERIOD], "WavePeriod" );
AddPart( AddTo, m_fAccels[ACCEL_EXPAND], "Expand" );
+ AddPart( AddTo, m_fAccels[ACCEL_EXPAND_PERIOD], "ExpandPeriod" );
AddPart( AddTo, m_fAccels[ACCEL_BOOMERANG], "Boomerang" );
AddPart( AddTo, m_fEffects[EFFECT_DRUNK], "Drunk" );
+ AddPart( AddTo, m_fEffects[EFFECT_DRUNK_SPEED], "DrunkSpeed" );
+ AddPart( AddTo, m_fEffects[EFFECT_DRUNK_OFFSET], "DrunkOffset" );
+ AddPart( AddTo, m_fEffects[EFFECT_DRUNK_PERIOD], "DrunkPeriod" );
AddPart( AddTo, m_fEffects[EFFECT_DIZZY], "Dizzy" );
AddPart( AddTo, m_fEffects[EFFECT_CONFUSION], "Confusion" );
AddPart( AddTo, m_fEffects[EFFECT_CONFUSION_OFFSET], "ConfusionOffset" );
@@ -230,9 +235,18 @@ void PlayerOptions::GetMods( vector &AddTo, bool bForceNoteSkin ) const
AddPart( AddTo, m_fEffects[EFFECT_FLIP], "Flip" );
AddPart( AddTo, m_fEffects[EFFECT_INVERT], "Invert" );
AddPart( AddTo, m_fEffects[EFFECT_TORNADO], "Tornado" );
+ AddPart( AddTo, m_fEffects[EFFECT_TORNADO_PERIOD], "TornadoPeriod" );
+ AddPart( AddTo, m_fEffects[EFFECT_TORNADO_OFFSET], "TornadoOffset" );
AddPart( AddTo, m_fEffects[EFFECT_TIPSY], "Tipsy" );
+ AddPart( AddTo, m_fEffects[EFFECT_TIPSY_SPEED], "TipsySpeed" );
+ AddPart( AddTo, m_fEffects[EFFECT_TIPSY_OFFSET], "TipsyOffset" );
AddPart( AddTo, m_fEffects[EFFECT_BUMPY], "Bumpy" );
+ AddPart( AddTo, m_fEffects[EFFECT_BUMPY_OFFSET], "BumpyOffset" );
+ AddPart( AddTo, m_fEffects[EFFECT_BUMPY_PERIOD], "BumpyPeriod" );
AddPart( AddTo, m_fEffects[EFFECT_BEAT], "Beat" );
+ AddPart( AddTo, m_fEffects[EFFECT_BEAT_OFFSET], "BeatOffset" );
+ AddPart( AddTo, m_fEffects[EFFECT_BEAT_PERIOD], "BeatPeriod" );
+ AddPart( AddTo, m_fEffects[EFFECT_BEAT_MULT], "BeatMult" );
AddPart( AddTo, m_fEffects[EFFECT_XMODE], "XMode" );
AddPart( AddTo, m_fEffects[EFFECT_TWIRL], "Twirl" );
AddPart( AddTo, m_fEffects[EFFECT_ROLL], "Roll" );
@@ -484,25 +498,63 @@ bool PlayerOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut
else if( sBit == "normal-drain" ) { m_DrainType= DrainType_Normal; }
else if( sBit == "boost" ) SET_FLOAT( fAccels[ACCEL_BOOST] )
else if( sBit == "brake" || sBit == "land" ) SET_FLOAT( fAccels[ACCEL_BRAKE] )
- else if( sBit == "wave" ) SET_FLOAT( fAccels[ACCEL_WAVE] )
- else if( sBit == "expand" || sBit == "dwiwave" ) SET_FLOAT( fAccels[ACCEL_EXPAND] )
+ else if( sBit.find("wave") != sBit.npos)
+ {
+ if( sBit == "wave" ) SET_FLOAT( fAccels[ACCEL_WAVE] )
+ else if( sBit == "waveperiod" ) SET_FLOAT( fAccels[ACCEL_WAVE_PERIOD] )
+ }
+ else if( (sBit.find("expand") != sBit.npos) || (sBit.find("dwiwave") != sBit.npos) )
+ {
+ if( sBit == "expand" || sBit == "dwiwave" ) SET_FLOAT( fAccels[ACCEL_EXPAND] )
+ else if( sBit == "expandperiod" ) SET_FLOAT( fAccels[ACCEL_EXPAND_PERIOD] )
+ }
else if( sBit == "boomerang" ) SET_FLOAT( fAccels[ACCEL_BOOMERANG] )
- else if( sBit == "drunk" ) SET_FLOAT( fEffects[EFFECT_DRUNK] )
+ else if( sBit.find("drunk") != sBit.npos)
+ {
+ if( sBit == "drunk" ) SET_FLOAT( fEffects[EFFECT_DRUNK] )
+ else if( sBit == "drunkspeed" ) SET_FLOAT( fEffects[EFFECT_DRUNK_SPEED] )
+ else if( sBit == "drunkoffset" ) SET_FLOAT( fEffects[EFFECT_DRUNK_OFFSET] )
+ else if( sBit == "drunkperiod" ) SET_FLOAT( fEffects[EFFECT_DRUNK_PERIOD] )
+ }
else if( sBit == "dizzy" ) SET_FLOAT( fEffects[EFFECT_DIZZY] )
- else if( sBit == "confusion" ) SET_FLOAT( fEffects[EFFECT_CONFUSION] )
- else if( sBit == "confusionoffset" ) SET_FLOAT( fEffects[EFFECT_CONFUSION_OFFSET] )
- else if( sBit == "confusionx" ) SET_FLOAT( fEffects[EFFECT_CONFUSION_X] )
- else if( sBit == "confusionxoffset" ) SET_FLOAT( fEffects[EFFECT_CONFUSION_X_OFFSET] )
- else if( sBit == "confusiony" ) SET_FLOAT( fEffects[EFFECT_CONFUSION_Y] )
- else if( sBit == "confusionyoffset" ) SET_FLOAT( fEffects[EFFECT_CONFUSION_Y_OFFSET] )
+ else if( sBit.find("confusion") != sBit.npos)
+ {
+ if( sBit == "confusion" ) SET_FLOAT( fEffects[EFFECT_CONFUSION] )
+ else if( sBit == "confusionoffset" ) SET_FLOAT( fEffects[EFFECT_CONFUSION_OFFSET] )
+ else if( sBit == "confusionx" ) SET_FLOAT( fEffects[EFFECT_CONFUSION_X] )
+ else if( sBit == "confusionxoffset" ) SET_FLOAT( fEffects[EFFECT_CONFUSION_X_OFFSET] )
+ else if( sBit == "confusiony" ) SET_FLOAT( fEffects[EFFECT_CONFUSION_Y] )
+ else if( sBit == "confusionyoffset" ) SET_FLOAT( fEffects[EFFECT_CONFUSION_Y_OFFSET] )
+ }
else if( sBit == "mini" ) SET_FLOAT( fEffects[EFFECT_MINI] )
else if( sBit == "tiny" ) SET_FLOAT( fEffects[EFFECT_TINY] )
else if( sBit == "flip" ) SET_FLOAT( fEffects[EFFECT_FLIP] )
else if( sBit == "invert" ) SET_FLOAT( fEffects[EFFECT_INVERT] )
- else if( sBit == "tornado" ) SET_FLOAT( fEffects[EFFECT_TORNADO] )
- else if( sBit == "tipsy" ) SET_FLOAT( fEffects[EFFECT_TIPSY] )
- else if( sBit == "bumpy" ) SET_FLOAT( fEffects[EFFECT_BUMPY] )
- else if( sBit == "beat" ) SET_FLOAT( fEffects[EFFECT_BEAT] )
+ else if( sBit.find("tornado") != sBit.npos)
+ {
+ if( sBit == "tornado" ) SET_FLOAT( fEffects[EFFECT_TORNADO] )
+ else if( sBit == "tornadoperiod" ) SET_FLOAT( fEffects[EFFECT_TORNADO_PERIOD] )
+ else if( sBit == "tornadooffset" ) SET_FLOAT( fEffects[EFFECT_TORNADO_OFFSET] )
+ }
+ else if( sBit.find("tipsy") != sBit.npos)
+ {
+ if( sBit == "tipsy" ) SET_FLOAT( fEffects[EFFECT_TIPSY] )
+ else if( sBit == "tipsyspeed" ) SET_FLOAT( fEffects[EFFECT_TIPSY_SPEED] )
+ else if( sBit == "tipsyoffset" ) SET_FLOAT( fEffects[EFFECT_TIPSY_OFFSET] )
+ }
+ else if( sBit.find("bumpy") != sBit.npos)
+ {
+ if( sBit == "bumpy" ) SET_FLOAT( fEffects[EFFECT_BUMPY] )
+ else if( sBit == "bumpyoffset" ) SET_FLOAT( fEffects[EFFECT_BUMPY_OFFSET] )
+ else if( sBit == "bumpyperiod" ) SET_FLOAT( fEffects[EFFECT_BUMPY_PERIOD] )
+ }
+ else if( sBit.find("beat") != sBit.npos)
+ {
+ if( sBit == "beat" ) SET_FLOAT( fEffects[EFFECT_BEAT] )
+ else if( sBit == "beatoffset" ) SET_FLOAT( fEffects[EFFECT_BEAT_OFFSET] )
+ else if( sBit == "beatperiod" ) SET_FLOAT( fEffects[EFFECT_BEAT_PERIOD] )
+ else if( sBit == "beatmult" ) SET_FLOAT( fEffects[EFFECT_BEAT_MULT] )
+ }
else if( sBit == "xmode" ) SET_FLOAT( fEffects[EFFECT_XMODE] )
else if( sBit == "twirl" ) SET_FLOAT( fEffects[EFFECT_TWIRL] )
else if( sBit == "roll" ) SET_FLOAT( fEffects[EFFECT_ROLL] )
@@ -1154,9 +1206,14 @@ public:
FLOAT_INTERFACE(Boost, Accels[PlayerOptions::ACCEL_BOOST], true);
FLOAT_INTERFACE(Brake, Accels[PlayerOptions::ACCEL_BRAKE], true);
FLOAT_INTERFACE(Wave, Accels[PlayerOptions::ACCEL_WAVE], true);
+ FLOAT_INTERFACE(WavePeriod, Accels[PlayerOptions::ACCEL_WAVE_PERIOD], true);
FLOAT_INTERFACE(Expand, Accels[PlayerOptions::ACCEL_EXPAND], true);
+ FLOAT_INTERFACE(ExpandPeriod, Accels[PlayerOptions::ACCEL_EXPAND_PERIOD], true);
FLOAT_INTERFACE(Boomerang, Accels[PlayerOptions::ACCEL_BOOMERANG], true);
FLOAT_INTERFACE(Drunk, Effects[PlayerOptions::EFFECT_DRUNK], true);
+ FLOAT_INTERFACE(DrunkSpeed, Effects[PlayerOptions::EFFECT_DRUNK_SPEED], true);
+ FLOAT_INTERFACE(DrunkOffset, Effects[PlayerOptions::EFFECT_DRUNK_OFFSET], true);
+ FLOAT_INTERFACE(DrunkPeriod, Effects[PlayerOptions::EFFECT_DRUNK_PERIOD], true);
FLOAT_INTERFACE(Dizzy, Effects[PlayerOptions::EFFECT_DIZZY], true);
FLOAT_INTERFACE(Confusion, Effects[PlayerOptions::EFFECT_CONFUSION], true);
FLOAT_INTERFACE(ConfusionOffset, Effects[PlayerOptions::EFFECT_CONFUSION_OFFSET], true);
@@ -1169,9 +1226,18 @@ public:
FLOAT_INTERFACE(Flip, Effects[PlayerOptions::EFFECT_FLIP], true);
FLOAT_INTERFACE(Invert, Effects[PlayerOptions::EFFECT_INVERT], true);
FLOAT_INTERFACE(Tornado, Effects[PlayerOptions::EFFECT_TORNADO], true);
+ FLOAT_INTERFACE(TornadoPeriod, Effects[PlayerOptions::EFFECT_TORNADO_PERIOD], true);
+ FLOAT_INTERFACE(TornadoOffset, Effects[PlayerOptions::EFFECT_TORNADO_OFFSET], true);
FLOAT_INTERFACE(Tipsy, Effects[PlayerOptions::EFFECT_TIPSY], true);
+ FLOAT_INTERFACE(TipsySpeed, Effects[PlayerOptions::EFFECT_TIPSY_SPEED], true);
+ FLOAT_INTERFACE(TipsyOffset, Effects[PlayerOptions::EFFECT_TIPSY_OFFSET], true);
FLOAT_INTERFACE(Bumpy, Effects[PlayerOptions::EFFECT_BUMPY], true);
+ FLOAT_INTERFACE(BumpyOffset, Effects[PlayerOptions::EFFECT_BUMPY_OFFSET], true);
+ FLOAT_INTERFACE(BumpyPeriod, Effects[PlayerOptions::EFFECT_BUMPY_PERIOD], true);
FLOAT_INTERFACE(Beat, Effects[PlayerOptions::EFFECT_BEAT], true);
+ FLOAT_INTERFACE(BeatOffset, Effects[PlayerOptions::EFFECT_BEAT_OFFSET], true);
+ FLOAT_INTERFACE(BeatPeriod, Effects[PlayerOptions::EFFECT_BEAT_PERIOD], true);
+ FLOAT_INTERFACE(BeatMult, Effects[PlayerOptions::EFFECT_BEAT_MULT], true);
FLOAT_INTERFACE(Xmode, Effects[PlayerOptions::EFFECT_XMODE], true);
FLOAT_INTERFACE(Twirl, Effects[PlayerOptions::EFFECT_TWIRL], true);
FLOAT_INTERFACE(Roll, Effects[PlayerOptions::EFFECT_ROLL], true);
@@ -1550,9 +1616,14 @@ public:
ADD_METHOD(Boost);
ADD_METHOD(Brake);
ADD_METHOD(Wave);
+ ADD_METHOD(WavePeriod);
ADD_METHOD(Expand);
+ ADD_METHOD(ExpandPeriod);
ADD_METHOD(Boomerang);
ADD_METHOD(Drunk);
+ ADD_METHOD(DrunkSpeed);
+ ADD_METHOD(DrunkOffset);
+ ADD_METHOD(DrunkPeriod);
ADD_METHOD(Dizzy);
ADD_METHOD(Confusion);
ADD_METHOD(ConfusionOffset);
@@ -1565,9 +1636,18 @@ public:
ADD_METHOD(Flip);
ADD_METHOD(Invert);
ADD_METHOD(Tornado);
+ ADD_METHOD(TornadoPeriod);
+ ADD_METHOD(TornadoOffset);
ADD_METHOD(Tipsy);
+ ADD_METHOD(TipsySpeed);
+ ADD_METHOD(TipsyOffset);
ADD_METHOD(Bumpy);
+ ADD_METHOD(BumpyOffset);
+ ADD_METHOD(BumpyPeriod);
ADD_METHOD(Beat);
+ ADD_METHOD(BeatOffset);
+ ADD_METHOD(BeatPeriod);
+ ADD_METHOD(BeatMult);
ADD_METHOD(Xmode);
ADD_METHOD(Twirl);
ADD_METHOD(Roll);
diff --git a/src/PlayerOptions.h b/src/PlayerOptions.h
index 63074919d1..383bf24bec 100644
--- a/src/PlayerOptions.h
+++ b/src/PlayerOptions.h
@@ -106,12 +106,17 @@ public:
ACCEL_BOOST, /**< The arrows start slow, then zoom towards the targets. */
ACCEL_BRAKE, /**< The arrows start fast, then slow down as they approach the targets. */
ACCEL_WAVE,
+ ACCEL_WAVE_PERIOD,
ACCEL_EXPAND,
+ ACCEL_EXPAND_PERIOD,
ACCEL_BOOMERANG, /**< The arrows start from above the targets, go down, then come back up. */
NUM_ACCELS
};
enum Effect {
EFFECT_DRUNK,
+ EFFECT_DRUNK_SPEED,
+ EFFECT_DRUNK_OFFSET,
+ EFFECT_DRUNK_PERIOD,
EFFECT_DIZZY,
EFFECT_CONFUSION,
EFFECT_CONFUSION_OFFSET,
@@ -124,9 +129,18 @@ public:
EFFECT_FLIP,
EFFECT_INVERT,
EFFECT_TORNADO,
+ EFFECT_TORNADO_PERIOD,
+ EFFECT_TORNADO_OFFSET,
EFFECT_TIPSY,
+ EFFECT_TIPSY_SPEED,
+ EFFECT_TIPSY_OFFSET,
EFFECT_BUMPY,
+ EFFECT_BUMPY_OFFSET,
+ EFFECT_BUMPY_PERIOD,
EFFECT_BEAT,
+ EFFECT_BEAT_OFFSET,
+ EFFECT_BEAT_PERIOD,
+ EFFECT_BEAT_MULT,
EFFECT_XMODE,
EFFECT_TWIRL,
EFFECT_ROLL,