From 921a617a64f12ce8c537ca7fd21cb264e31d9425 Mon Sep 17 00:00:00 2001 From: MrThatKid Date: Fri, 14 Jul 2017 22:32:58 -0700 Subject: [PATCH] Added nITG's Tangent Modifiers (#1495) * Implemented nITG's TanDrunk modifiers. RageMath functions added: RageFastTan RageFastCsc Modifers added: GlitchyTan TanDrunk TanDrunkSpeed TanDrunkOffset TanDrunkPeriod TanDrunkZ TanDrunkZSpeed TanDrunkZOffset TanDrunkZPeriod * Implemented nITG's TanTipsy and TanTornado mods Also, the Drunk code and Tipsy update code was deduplicated. Modifiers Added: TanTipsy TanTipsySpeed TanTipsyOffset TanTornado TanTornadoPeriod TanTornadoOffset TanTornadoZ TanTornadoZPeriod TanTornadoZOffset * Implemented nITG's remaining tan mods. Modifiers added: TanExpand TanExpandPeriod TanBumpy TanBumpyPeriod TanBumpyOffset TanBumpyX TanBumpyXPeriod TanBumpyXOffset TanDigital TanDigitalPeriod TanDigitalSteps TanDigitalOffset TanDigitalZ TanDigitalZPeriod TanDigitalZSteps TanDigitalZOffset * Updated luadocs to reference new modifiers * Rename GlitchyTan to Cosecant (#4) * Rename GlitchyTan to Cosecant * Update luadocs to reflect change --- Docs/Luadoc/Lua.xml | 1 + Docs/Luadoc/LuaDocumentation.xml | 133 +++++++++++++----- src/ArrowEffects.cpp | 223 ++++++++++++++++++++++++++----- src/PlayerOptions.cpp | 143 +++++++++++++++++++- src/PlayerOptions.h | 35 +++++ src/RageMath.cpp | 10 ++ src/RageMath.h | 2 + 7 files changed, 479 insertions(+), 68 deletions(-) diff --git a/Docs/Luadoc/Lua.xml b/Docs/Luadoc/Lua.xml index b1948b7b49..b928b96f2d 100644 --- a/Docs/Luadoc/Lua.xml +++ b/Docs/Luadoc/Lua.xml @@ -1176,6 +1176,7 @@ + diff --git a/Docs/Luadoc/LuaDocumentation.xml b/Docs/Luadoc/LuaDocumentation.xml index c7bd3d3849..1dfb848a0e 100644 --- a/Docs/Luadoc/LuaDocumentation.xml +++ b/Docs/Luadoc/LuaDocumentation.xml @@ -3514,15 +3514,27 @@ save yourself some time, copy this for undocumented things: - + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + Use 1-16 in place of 'n' to apply Bumpy on a specific column. - - - - - + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + If the player has a CMod set, returns the value of that CMod and its associated approach speed. Returns nil otherwise.
@@ -3544,20 +3556,37 @@ save yourself some time, copy this for undocumented things: Use 1-16 in place of 'n' to apply ConfusionYOffset on a specific column. + Use 1-16 in place of 'n' to apply Dark on a specific column. - - - - - - - - + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + @@ -3569,17 +3598,37 @@ save yourself some time, copy this for undocumented things: - - - - - - - - + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + - - + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + Sets the for the player, if the optional argument is provided. Returns the that was previously set. @@ -3750,15 +3799,33 @@ save yourself some time, copy this for undocumented things: Use 1-16 in place of 'n' to apply Tiny on a specific column. - - - - - - - - - + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + + + Has a tangent variant that can be accessed by prepending 'Tan' to the function name. + diff --git a/src/ArrowEffects.cpp b/src/ArrowEffects.cpp index 17ebe9bfe8..40aa8650bd 100644 --- a/src/ArrowEffects.cpp +++ b/src/ArrowEffects.cpp @@ -115,8 +115,11 @@ namespace float m_fInvertDistance[MAX_COLS_PER_PLAYER]; float m_tipsy_result[MAX_COLS_PER_PLAYER]; float m_tipsy_offset_result[MAX_COLS_PER_PLAYER]; + float m_tan_tipsy_result[MAX_COLS_PER_PLAYER]; + float m_tan_tipsy_offset_result[MAX_COLS_PER_PLAYER]; float m_fBeatFactor[3]; float m_fExpandSeconds; + float m_fTanExpandSeconds; // m_prev_style is for checking whether ArrowEffects::Init needs to be // called. Finding all the placed ArrowEffects is used and making sure @@ -136,10 +139,18 @@ namespace float tornado_offset_scale_from_high[3]; }; +static float SelectTanType(float angle, bool is_cosec) +{ + if (is_cosec) + return RageFastCsc(angle); + else + return RageFastTan(angle); +} + static float CalculateTornadoOffsetFromMagnitude(int dimension, int col_id, float magnitude, float effect_offset, float period, const Style::ColumnInfo* pCols, float field_zoom, - PerPlayerData& data, float y_offset) + PerPlayerData& data, float y_offset, bool is_tan) { float const real_pixel_offset= pCols[col_id].fXOffset * field_zoom; float const position_between= SCALE(real_pixel_offset, @@ -150,7 +161,9 @@ static float CalculateTornadoOffsetFromMagnitude(int dimension, int col_id, float rads= acosf(position_between); float frequency= tornado_offset_frequency[dimension]; rads+= (y_offset + effect_offset) * ((period * frequency) + frequency) / SCREEN_HEIGHT; - float const adjusted_pixel_offset= SCALE(RageFastCos(rads), + float processed_rads = is_tan ? SelectTanType(rads, curr_options->m_bCosecant) : RageFastCos(rads); + + float const adjusted_pixel_offset= SCALE(processed_rads, tornado_offset_scale_from_low[dimension], tornado_offset_scale_from_high[dimension], data.m_MinTornado[dimension][col_id] * field_zoom, @@ -158,6 +171,24 @@ static float CalculateTornadoOffsetFromMagnitude(int dimension, int col_id, return (adjusted_pixel_offset - real_pixel_offset) * magnitude; } +static float CalculateDrunkAngle(float speed, int col, float offset, + float col_frequency, float y_offset, float period, float offset_frequency) +{ + float time = ArrowEffects::GetTime(); + return time * (1+speed) + col*( (offset*col_frequency) + col_frequency) + + y_offset * ( (period*offset_frequency) + offset_frequency) / SCREEN_HEIGHT; +} + +static float CalculateBumpyAngle(float y_offset, float offset, float period) +{ + return (y_offset+(100.0f*offset))/((period*16.0f)+16.0f); +} + +static float CalculateDigitalAngle(float y_offset, float offset, float period) +{ + return PI * (y_offset + (1.0f * offset ) ) / (ARROW_SIZE + (period * ARROW_SIZE) ); +} + static void UpdateBeat(int dimension, PerPlayerData &data, const SongPosition &position, float beat_offset, float beat_mult) { float fAccelTime = 0.2f, fTotalTime = 0.5f; @@ -191,6 +222,36 @@ static void UpdateBeat(int dimension, PerPlayerData &data, const SongPosition &p data.m_fBeatFactor[dimension] *= 20.0f; } +static void UpdateTipsy(float * tipsy_result, float * tipsy_offset_result, float offset, float speed, bool is_tan) +{ + const float time= ArrowEffects::GetTime(); + const float time_times_timer= time * ((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; + const float arrow_times_offset_mag= ARROW_SIZE * + TIPSY_OFFSET_ARROW_MAGNITUDE; + for(int col= 0; col < MAX_COLS_PER_PLAYER; ++col) + { + if (is_tan) + { + tipsy_result[col]= SelectTanType(time_times_timer + (col * ((offset * + TIPSY_COLUMN_FREQUENCY) + TIPSY_COLUMN_FREQUENCY)), curr_options->m_bCosecant) + * arrow_times_mag; + tipsy_offset_result[col]= SelectTanType(time_times_offset_timer + (col * + TIPSY_OFFSET_COLUMN_FREQUENCY), curr_options->m_bCosecant) + * arrow_times_offset_mag; + } + else + { + tipsy_result[col]= RageFastCos(time_times_timer + (col * ((offset * + TIPSY_COLUMN_FREQUENCY) + TIPSY_COLUMN_FREQUENCY))) * arrow_times_mag; + tipsy_offset_result[col]= RageFastCos(time_times_offset_timer + (col * + TIPSY_OFFSET_COLUMN_FREQUENCY)) * arrow_times_offset_mag; + } + } +} + void ArrowEffects::Init(PlayerNumber pn) { @@ -274,6 +335,8 @@ void ArrowEffects::Update() { data.m_fExpandSeconds += fTime - fLastTime; data.m_fExpandSeconds = fmodf( data.m_fExpandSeconds, (PI*2)/(accels[PlayerOptions::ACCEL_EXPAND_PERIOD]+1) ); + data.m_fTanExpandSeconds += fTime - fLastTime; + data.m_fTanExpandSeconds = fmodf( data.m_fTanExpandSeconds, (PI*2)/(accels[PlayerOptions::ACCEL_TAN_EXPAND_PERIOD]+1) ); } // Update Invert @@ -323,22 +386,9 @@ void ArrowEffects::Update() // Update Tipsy if(effects[PlayerOptions::EFFECT_TIPSY] != 0) { - const float time= ArrowEffects::GetTime(); - 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; - const float arrow_times_offset_mag= ARROW_SIZE * - TIPSY_OFFSET_ARROW_MAGNITUDE; - for(int col= 0; col < MAX_COLS_PER_PLAYER; ++col) - { - data.m_tipsy_result[col]= RageFastCos( - 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)) * - arrow_times_offset_mag; - } + UpdateTipsy(data.m_tipsy_result, data.m_tipsy_offset_result, + effects[PlayerOptions::EFFECT_TIPSY_OFFSET], + effects[PlayerOptions::EFFECT_TIPSY_SPEED], false); } else { @@ -347,6 +397,21 @@ void ArrowEffects::Update() data.m_tipsy_result[col]= 0; } } + + // Update TanTipsy + if(effects[PlayerOptions::EFFECT_TAN_TIPSY] != 0) + { + UpdateTipsy(data.m_tan_tipsy_result, data.m_tan_tipsy_offset_result, + effects[PlayerOptions::EFFECT_TAN_TIPSY_OFFSET], + effects[PlayerOptions::EFFECT_TAN_TIPSY_SPEED], true); + } + else + { + for(int col= 0; col < MAX_COLS_PER_PLAYER; ++col) + { + data.m_tan_tipsy_result[col]= 0; + } + } // Update Beat UpdateBeat(dim_x, data, position, effects[PlayerOptions::EFFECT_BEAT_OFFSET], effects[PlayerOptions::EFFECT_BEAT_MULT]); @@ -452,6 +517,9 @@ float ArrowEffects::GetYOffset( const PlayerState* pPlayerState, int iCol, float const float* fAccels = curr_options->m_fAccels; const float* fEffects = curr_options->m_fEffects; + + // TODO: Don't index by PlayerNumber. + PerPlayerData &data = g_EffectData[pPlayerState->m_PlayerNumber]; float fYAdjust = 0; // fill this in depending on PlayerOptions @@ -511,9 +579,6 @@ float ArrowEffects::GetYOffset( const PlayerState* pPlayerState, int iCol, float if( fAccels[PlayerOptions::ACCEL_EXPAND] != 0 ) { - // TODO: Don't index by PlayerNumber. - PerPlayerData &data = g_EffectData[pPlayerState->m_PlayerNumber]; - 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 ); @@ -522,6 +587,16 @@ float ArrowEffects::GetYOffset( const PlayerState* pPlayerState, int iCol, float EXPAND_SPEED_SCALE_TO_LOW, fExpandMultiplier ); } + if( fAccels[PlayerOptions::ACCEL_TAN_EXPAND] != 0 ) + { + float fTanExpandMultiplier = SCALE( SelectTanType(data.m_fTanExpandSeconds*EXPAND_MULTIPLIER_FREQUENCY*(fAccels[PlayerOptions::ACCEL_TAN_EXPAND_PERIOD]+1), curr_options->m_bCosecant), + 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_TAN_EXPAND], + EXPAND_SPEED_SCALE_FROM_LOW, EXPAND_SPEED_SCALE_FROM_HIGH, + EXPAND_SPEED_SCALE_TO_LOW, fTanExpandMultiplier ); + } + fYOffset *= fScrollSpeed; fPeakYOffsetOut *= fScrollSpeed; @@ -569,6 +644,7 @@ float ArrowEffects::GetYPos( const PlayerState* pPlayerState, int iCol, float fY // TODO: Don't index by PlayerNumber. PerPlayerData& data= g_EffectData[curr_options->m_pn]; f+= fEffects[PlayerOptions::EFFECT_TIPSY] * data.m_tipsy_result[iCol]; + f+= fEffects[PlayerOptions::EFFECT_TAN_TIPSY] * data.m_tan_tipsy_result[iCol]; if( fEffects[PlayerOptions::EFFECT_ATTENUATE_Y] != 0 ) { @@ -600,6 +676,7 @@ float ArrowEffects::GetYOffsetFromYPos(int iCol, float YPos, float fYReverseOffs // TODO: Don't index by PlayerNumber. PerPlayerData& data= g_EffectData[curr_options->m_pn]; f+= fEffects[PlayerOptions::EFFECT_TIPSY] * data.m_tipsy_offset_result[iCol]; + f+= fEffects[PlayerOptions::EFFECT_TAN_TIPSY] * data.m_tan_tipsy_offset_result[iCol]; f+= fEffects[PlayerOptions::EFFECT_PARABOLA_Y] * (YPos/ARROW_SIZE) * (YPos/ARROW_SIZE); @@ -630,16 +707,44 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float iColNum, fEffects[PlayerOptions::EFFECT_TORNADO], fEffects[PlayerOptions::EFFECT_TORNADO_OFFSET], fEffects[PlayerOptions::EFFECT_TORNADO_PERIOD], - pCols, pPlayerState->m_NotefieldZoom, data, fYOffset); + pCols, pPlayerState->m_NotefieldZoom, data, fYOffset, false); + } + + if( fEffects[PlayerOptions::EFFECT_TAN_TORNADO] != 0 ) + { + fPixelOffsetFromCenter += CalculateTornadoOffsetFromMagnitude(dim_x, + iColNum, fEffects[PlayerOptions::EFFECT_TAN_TORNADO], + fEffects[PlayerOptions::EFFECT_TAN_TORNADO_OFFSET], + fEffects[PlayerOptions::EFFECT_TAN_TORNADO_PERIOD], + pCols, pPlayerState->m_NotefieldZoom, data, fYOffset, true); } if( fEffects[PlayerOptions::EFFECT_BUMPY_X] != 0 ) - fPixelOffsetFromCenter += fEffects[PlayerOptions::EFFECT_BUMPY_X] * 40*RageFastSin( (fYOffset+(100.0f*(fEffects[PlayerOptions::EFFECT_BUMPY_X_OFFSET])))/((fEffects[PlayerOptions::EFFECT_BUMPY_X_PERIOD]*16.0f)+16.0f) ); + fPixelOffsetFromCenter += fEffects[PlayerOptions::EFFECT_BUMPY_X] * + 40*RageFastSin( CalculateBumpyAngle(fYOffset, + fEffects[PlayerOptions::EFFECT_BUMPY_X_OFFSET], + fEffects[PlayerOptions::EFFECT_BUMPY_X_PERIOD]) ); + + if( fEffects[PlayerOptions::EFFECT_TAN_BUMPY_X] != 0 ) + fPixelOffsetFromCenter += fEffects[PlayerOptions::EFFECT_TAN_BUMPY_X] * + 40*SelectTanType( CalculateBumpyAngle(fYOffset, + fEffects[PlayerOptions::EFFECT_TAN_BUMPY_X_OFFSET], + fEffects[PlayerOptions::EFFECT_TAN_BUMPY_X_PERIOD]), curr_options->m_bCosecant ); if( fEffects[PlayerOptions::EFFECT_DRUNK] != 0 ) fPixelOffsetFromCenter += fEffects[PlayerOptions::EFFECT_DRUNK] * - ( RageFastCos( GetTime()*(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 ); + ( RageFastCos( CalculateDrunkAngle(fEffects[PlayerOptions::EFFECT_DRUNK_SPEED], iColNum, + fEffects[PlayerOptions::EFFECT_DRUNK_OFFSET], DRUNK_COLUMN_FREQUENCY, + fYOffset, fEffects[PlayerOptions::EFFECT_DRUNK_PERIOD], + DRUNK_OFFSET_FREQUENCY) ) * ARROW_SIZE*DRUNK_ARROW_MAGNITUDE ); + + if( fEffects[PlayerOptions::EFFECT_TAN_DRUNK] != 0 ) + fPixelOffsetFromCenter += fEffects[PlayerOptions::EFFECT_TAN_DRUNK] * + ( SelectTanType( CalculateDrunkAngle(fEffects[PlayerOptions::EFFECT_TAN_DRUNK_SPEED], + iColNum, fEffects[PlayerOptions::EFFECT_TAN_DRUNK_OFFSET], + DRUNK_COLUMN_FREQUENCY, fYOffset, + fEffects[PlayerOptions::EFFECT_TAN_DRUNK_PERIOD], DRUNK_OFFSET_FREQUENCY) + , curr_options->m_bCosecant) * ARROW_SIZE*DRUNK_ARROW_MAGNITUDE ); if( fEffects[PlayerOptions::EFFECT_FLIP] != 0 ) { @@ -685,8 +790,17 @@ float ArrowEffects::GetXPos( const PlayerState* pPlayerState, int iColNum, float if( fEffects[PlayerOptions::EFFECT_DIGITAL] != 0 ) fPixelOffsetFromCenter += (fEffects[PlayerOptions::EFFECT_DIGITAL] * ARROW_SIZE * 0.5f) * round((fEffects[PlayerOptions::EFFECT_DIGITAL_STEPS]+1) * RageFastSin( - (PI * (fYOffset + (1.0f * (fEffects[PlayerOptions::EFFECT_DIGITAL_OFFSET]) ) ) / - (ARROW_SIZE + (fEffects[PlayerOptions::EFFECT_DIGITAL_PERIOD] * ARROW_SIZE)) ) ) )/(fEffects[PlayerOptions::EFFECT_DIGITAL_STEPS]+1); + CalculateDigitalAngle(fYOffset, + fEffects[PlayerOptions::EFFECT_DIGITAL_OFFSET], + fEffects[PlayerOptions::EFFECT_DIGITAL_PERIOD]) ) )/(fEffects[PlayerOptions::EFFECT_DIGITAL_STEPS]+1); + + if( fEffects[PlayerOptions::EFFECT_TAN_DIGITAL] != 0 ) + fPixelOffsetFromCenter += (fEffects[PlayerOptions::EFFECT_TAN_DIGITAL] * ARROW_SIZE * 0.5f) * + round((fEffects[PlayerOptions::EFFECT_TAN_DIGITAL_STEPS]+1) * SelectTanType( + CalculateDigitalAngle(fYOffset, + fEffects[PlayerOptions::EFFECT_TAN_DIGITAL_OFFSET], + fEffects[PlayerOptions::EFFECT_TAN_DIGITAL_PERIOD]), curr_options->m_bCosecant ) )/(fEffects[PlayerOptions::EFFECT_TAN_DIGITAL_STEPS]+1); + if( fEffects[PlayerOptions::EFFECT_SQUARE] != 0 ) { @@ -1073,14 +1187,35 @@ float ArrowEffects::GetZPos( const PlayerState* pPlayerState, int iCol, float fY fEffects[PlayerOptions::EFFECT_TORNADO_Z], fEffects[PlayerOptions::EFFECT_TORNADO_Z_OFFSET], fEffects[PlayerOptions::EFFECT_TORNADO_Z_PERIOD], - pCols, pPlayerState->m_NotefieldZoom, data, fYOffset); + pCols, pPlayerState->m_NotefieldZoom, data, fYOffset, false); + } + + if( fEffects[PlayerOptions::EFFECT_TAN_TORNADO_Z] != 0 ) + { + fZPos += CalculateTornadoOffsetFromMagnitude(dim_z, iCol, + fEffects[PlayerOptions::EFFECT_TAN_TORNADO_Z], + fEffects[PlayerOptions::EFFECT_TAN_TORNADO_Z_OFFSET], + fEffects[PlayerOptions::EFFECT_TAN_TORNADO_Z_PERIOD], + pCols, pPlayerState->m_NotefieldZoom, data, fYOffset, true); } if( fEffects[PlayerOptions::EFFECT_BUMPY] != 0 ) - fZPos += fEffects[PlayerOptions::EFFECT_BUMPY] * 40*RageFastSin( (fYOffset+(100.0f*fEffects[PlayerOptions::EFFECT_BUMPY_OFFSET]) )/((fEffects[PlayerOptions::EFFECT_BUMPY_PERIOD]*16.0f)+16.0f) ); + fZPos += fEffects[PlayerOptions::EFFECT_BUMPY] * 40*RageFastSin( + CalculateBumpyAngle(fYOffset, + fEffects[PlayerOptions::EFFECT_BUMPY_OFFSET], + fEffects[PlayerOptions::EFFECT_BUMPY_PERIOD]) ); if( curr_options->m_fBumpy[iCol] != 0 ) - fZPos += curr_options->m_fBumpy[iCol] * 40*RageFastSin( (fYOffset+(100.0f*(fEffects[PlayerOptions::EFFECT_BUMPY_OFFSET])))/((fEffects[PlayerOptions::EFFECT_BUMPY_PERIOD]*16.0f)+16.0f) ); + fZPos += curr_options->m_fBumpy[iCol] * 40*RageFastSin( + CalculateBumpyAngle(fYOffset, + fEffects[PlayerOptions::EFFECT_BUMPY_OFFSET], + fEffects[PlayerOptions::EFFECT_BUMPY_PERIOD]) ); + + if( fEffects[PlayerOptions::EFFECT_TAN_BUMPY] != 0 ) + fZPos += fEffects[PlayerOptions::EFFECT_TAN_BUMPY] * 40*SelectTanType( + CalculateBumpyAngle(fYOffset, + fEffects[PlayerOptions::EFFECT_TAN_BUMPY_OFFSET], + fEffects[PlayerOptions::EFFECT_TAN_BUMPY_PERIOD]), curr_options->m_bCosecant ); if( fEffects[PlayerOptions::EFFECT_ZIGZAG_Z] != 0 ) { @@ -1106,8 +1241,19 @@ float ArrowEffects::GetZPos( const PlayerState* pPlayerState, int iCol, float fY if( fEffects[PlayerOptions::EFFECT_DRUNK_Z] != 0 ) fZPos += fEffects[PlayerOptions::EFFECT_DRUNK_Z] * - ( RageFastCos( GetTime()*(1+fEffects[PlayerOptions::EFFECT_DRUNK_Z_SPEED]) + iCol*((fEffects[PlayerOptions::EFFECT_DRUNK_Z_OFFSET]*DRUNK_Z_COLUMN_FREQUENCY)+DRUNK_Z_COLUMN_FREQUENCY) - + fYOffset*((fEffects[PlayerOptions::EFFECT_DRUNK_Z_PERIOD]*DRUNK_Z_OFFSET_FREQUENCY)+DRUNK_Z_OFFSET_FREQUENCY)/SCREEN_HEIGHT) * ARROW_SIZE*DRUNK_Z_ARROW_MAGNITUDE ); + ( RageFastCos( CalculateDrunkAngle(fEffects[PlayerOptions::EFFECT_DRUNK_Z_SPEED], iCol, + fEffects[PlayerOptions::EFFECT_DRUNK_Z_OFFSET], DRUNK_Z_COLUMN_FREQUENCY, + fYOffset, fEffects[PlayerOptions::EFFECT_DRUNK_Z_PERIOD], + DRUNK_Z_OFFSET_FREQUENCY) ) * ARROW_SIZE*DRUNK_Z_ARROW_MAGNITUDE ); + + if( fEffects[PlayerOptions::EFFECT_TAN_DRUNK_Z] != 0 ) + fZPos += fEffects[PlayerOptions::EFFECT_TAN_DRUNK_Z] * + ( SelectTanType( CalculateDrunkAngle(fEffects[PlayerOptions::EFFECT_TAN_DRUNK_Z_SPEED], + iCol, fEffects[PlayerOptions::EFFECT_TAN_DRUNK_Z_OFFSET], + DRUNK_Z_COLUMN_FREQUENCY, fYOffset, + fEffects[PlayerOptions::EFFECT_TAN_DRUNK_Z_PERIOD], + DRUNK_Z_OFFSET_FREQUENCY) + , curr_options->m_bCosecant) * ARROW_SIZE*DRUNK_Z_ARROW_MAGNITUDE ); if( fEffects[PlayerOptions::EFFECT_BEAT_Z] != 0 ) { @@ -1118,8 +1264,17 @@ float ArrowEffects::GetZPos( const PlayerState* pPlayerState, int iCol, float fY if( fEffects[PlayerOptions::EFFECT_DIGITAL_Z] != 0 ) fZPos += (fEffects[PlayerOptions::EFFECT_DIGITAL_Z] * ARROW_SIZE * 0.5f) * round((fEffects[PlayerOptions::EFFECT_DIGITAL_Z_STEPS]+1) * RageFastSin( - (PI * (fYOffset + (1.0f * (fEffects[PlayerOptions::EFFECT_DIGITAL_Z_OFFSET]) ) ) / - (ARROW_SIZE + (fEffects[PlayerOptions::EFFECT_DIGITAL_Z_PERIOD] * ARROW_SIZE)) )))/(fEffects[PlayerOptions::EFFECT_DIGITAL_Z_STEPS]+1); + CalculateDigitalAngle(fYOffset, + fEffects[PlayerOptions::EFFECT_DIGITAL_Z_OFFSET], + fEffects[PlayerOptions::EFFECT_DIGITAL_Z_PERIOD]) ) ) /(fEffects[PlayerOptions::EFFECT_DIGITAL_Z_STEPS]+1); + + if( fEffects[PlayerOptions::EFFECT_TAN_DIGITAL_Z] != 0 ) + fZPos += (fEffects[PlayerOptions::EFFECT_TAN_DIGITAL_Z] * ARROW_SIZE * 0.5f) * + round((fEffects[PlayerOptions::EFFECT_TAN_DIGITAL_Z_STEPS]+1) * SelectTanType( + CalculateDigitalAngle(fYOffset, + fEffects[PlayerOptions::EFFECT_TAN_DIGITAL_Z_OFFSET], + fEffects[PlayerOptions::EFFECT_TAN_DIGITAL_Z_PERIOD]), curr_options->m_bCosecant ) ) /(fEffects[PlayerOptions::EFFECT_TAN_DIGITAL_Z_STEPS]+1); + if( fEffects[PlayerOptions::EFFECT_SQUARE_Z] != 0 ) { diff --git a/src/PlayerOptions.cpp b/src/PlayerOptions.cpp index 06b4c2186a..de5efedf86 100644 --- a/src/PlayerOptions.cpp +++ b/src/PlayerOptions.cpp @@ -94,6 +94,7 @@ void PlayerOptions::Init() m_bStealthPastReceptors = false; m_bDizzyHolds = false; m_bZBuffer = false; + m_bCosecant = false; m_sNoteSkin = ""; ZERO( m_fMovesX ); ONE( m_SpeedfMovesX ); ZERO( m_fMovesY ); ONE( m_SpeedfMovesY ); @@ -179,6 +180,7 @@ void PlayerOptions::Approach( const PlayerOptions& other, float fDeltaSeconds ) DO_COPY( m_bStealthPastReceptors ); DO_COPY( m_bDizzyHolds ); DO_COPY( m_bZBuffer ); + DO_COPY( m_bCosecant ); DO_COPY( m_FailType ); DO_COPY( m_MinTNSToHideNotes ); DO_COPY( m_sNoteSkin ); @@ -286,16 +288,26 @@ void PlayerOptions::GetMods( vector &AddTo, bool bForceNoteSkin ) const 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_TAN_EXPAND], "TanExpand" ); + AddPart( AddTo, m_fAccels[ACCEL_TAN_EXPAND_PERIOD], "TanExpandPeriod" ); 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_TAN_DRUNK], "TanDrunk" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DRUNK_SPEED], "TanDrunkSpeed" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DRUNK_OFFSET], "TanDrunkOffset" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DRUNK_PERIOD], "TanDrunkPeriod" ); AddPart( AddTo, m_fEffects[EFFECT_DRUNK_Z], "DrunkZ" ); - AddPart( AddTo, m_fEffects[EFFECT_DRUNK_Z_SPEED], "DrunkZSpeed" ); + AddPart( AddTo, m_fEffects[EFFECT_DRUNK_Z_SPEED], "DrunkZSpeed" ); AddPart( AddTo, m_fEffects[EFFECT_DRUNK_Z_OFFSET], "DrunkZOffset" ); AddPart( AddTo, m_fEffects[EFFECT_DRUNK_Z_PERIOD], "DrunkZPeriod" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DRUNK_Z], "TanDrunkZ" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DRUNK_Z_SPEED], "TanDrunkZSpeed" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DRUNK_Z_OFFSET], "TanDrunkZOffset" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DRUNK_Z_PERIOD], "TanDrunkZPeriod" ); AddPart( AddTo, m_fEffects[EFFECT_SHRINK_TO_LINEAR], "ShrinkLinear" ); AddPart( AddTo, m_fEffects[EFFECT_SHRINK_TO_MULT], "ShrinkMult" ); AddPart( AddTo, m_fEffects[EFFECT_PULSE_INNER], "PulseInner" ); @@ -325,18 +337,33 @@ void PlayerOptions::GetMods( vector &AddTo, bool bForceNoteSkin ) const 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_TAN_TORNADO], "TanTornado" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_TORNADO_PERIOD], "TanTornadoPeriod" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_TORNADO_OFFSET], "TanTornadoOffset" ); AddPart( AddTo, m_fEffects[EFFECT_TORNADO_Z], "TornadoZ" ); AddPart( AddTo, m_fEffects[EFFECT_TORNADO_Z_PERIOD], "TornadoZPeriod" ); AddPart( AddTo, m_fEffects[EFFECT_TORNADO_Z_OFFSET], "TornadoZOffset" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_TORNADO_Z], "TanTornadoZ" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_TORNADO_Z_PERIOD],"TanTornadoZPeriod" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_TORNADO_Z_OFFSET],"TanTornadoZOffset" ); 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_TAN_TIPSY], "TanTipsy" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_TIPSY_SPEED], "TanTipsySpeed" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_TIPSY_OFFSET], "TanTipsyOffset" ); 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_TAN_BUMPY], "TanBumpy" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_BUMPY_OFFSET], "TanBumpyOffset" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_BUMPY_PERIOD], "TanBumpyPeriod" ); AddPart( AddTo, m_fEffects[EFFECT_BUMPY_X], "BumpyX" ); AddPart( AddTo, m_fEffects[EFFECT_BUMPY_X_OFFSET], "BumpyXOffset" ); AddPart( AddTo, m_fEffects[EFFECT_BUMPY_X_PERIOD], "BumpyXPeriod" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_BUMPY_X], "TanBumpyX" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_BUMPY_X_OFFSET], "TanBumpyXOffset" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_BUMPY_X_PERIOD], "TanBumpyXPeriod" ); AddPart( AddTo, m_fEffects[EFFECT_BEAT], "Beat" ); AddPart( AddTo, m_fEffects[EFFECT_BEAT_OFFSET], "BeatOffset" ); AddPart( AddTo, m_fEffects[EFFECT_BEAT_PERIOD], "BeatPeriod" ); @@ -369,10 +396,18 @@ void PlayerOptions::GetMods( vector &AddTo, bool bForceNoteSkin ) const AddPart( AddTo, m_fEffects[EFFECT_DIGITAL_STEPS], "DigitalSteps" ); AddPart( AddTo, m_fEffects[EFFECT_DIGITAL_PERIOD], "DigitalPeriod" ); AddPart( AddTo, m_fEffects[EFFECT_DIGITAL_OFFSET], "DigitalOffset" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DIGITAL], "TanDigital" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DIGITAL_STEPS], "TanDigitalSteps" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DIGITAL_PERIOD], "TanDigitalPeriod" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DIGITAL_OFFSET], "TanDigitalOffset" ); AddPart( AddTo, m_fEffects[EFFECT_DIGITAL_Z], "DigitalZ" ); AddPart( AddTo, m_fEffects[EFFECT_DIGITAL_Z_STEPS], "DigitalZSteps" ); AddPart( AddTo, m_fEffects[EFFECT_DIGITAL_Z_PERIOD], "DigitalZPeriod" ); AddPart( AddTo, m_fEffects[EFFECT_DIGITAL_Z_OFFSET], "DigitalZOffset" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DIGITAL_Z], "TanDigitalZ" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DIGITAL_Z_STEPS], "TanDigitalZSteps" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DIGITAL_Z_PERIOD],"TanDigitalZPeriod" ); + AddPart( AddTo, m_fEffects[EFFECT_TAN_DIGITAL_Z_OFFSET],"TanDigitalZOffset" ); AddPart( AddTo, m_fEffects[EFFECT_PARABOLA_X], "ParabolaX" ); AddPart( AddTo, m_fEffects[EFFECT_PARABOLA_Y], "ParabolaY" ); AddPart( AddTo, m_fEffects[EFFECT_PARABOLA_Z], "ParabolaZ" ); @@ -383,6 +418,7 @@ void PlayerOptions::GetMods( vector &AddTo, bool bForceNoteSkin ) const AddPart( AddTo, m_bStealthPastReceptors, "StealthPastReceptors"); AddPart( AddTo, m_bDizzyHolds, "DizzyHolds"); AddPart( AddTo, m_bZBuffer, "ZBuffer"); + AddPart( AddTo, m_bCosecant, "Cosecant"); for( int i=0; i<16; i++) { @@ -676,6 +712,8 @@ bool PlayerOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut { if( sBit == "expand" || sBit == "dwiwave" ) SET_FLOAT( fAccels[ACCEL_EXPAND] ) else if( sBit == "expandperiod" ) SET_FLOAT( fAccels[ACCEL_EXPAND_PERIOD] ) + else if( sBit == "tanexpand" ) SET_FLOAT( fAccels[ACCEL_TAN_EXPAND] ) + else if( sBit == "tanexpandperiod" ) SET_FLOAT( fAccels[ACCEL_TAN_EXPAND_PERIOD] ) } else if( sBit == "boomerang" ) SET_FLOAT( fAccels[ACCEL_BOOMERANG] ) else if( sBit.find("drunk") != sBit.npos) @@ -684,10 +722,18 @@ bool PlayerOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut 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 == "tandrunk" ) SET_FLOAT( fEffects[EFFECT_TAN_DRUNK] ) + else if( sBit == "tandrunkspeed" ) SET_FLOAT( fEffects[EFFECT_TAN_DRUNK_SPEED] ) + else if( sBit == "tandrunkoffset" ) SET_FLOAT( fEffects[EFFECT_TAN_DRUNK_OFFSET] ) + else if( sBit == "tandrunkperiod" ) SET_FLOAT( fEffects[EFFECT_TAN_DRUNK_PERIOD] ) else if( sBit == "drunkz" ) SET_FLOAT( fEffects[EFFECT_DRUNK_Z] ) else if( sBit == "drunkzspeed" ) SET_FLOAT( fEffects[EFFECT_DRUNK_Z_SPEED] ) else if( sBit == "drunkzoffset" ) SET_FLOAT( fEffects[EFFECT_DRUNK_Z_OFFSET] ) else if( sBit == "drunkzperiod" ) SET_FLOAT( fEffects[EFFECT_DRUNK_Z_PERIOD] ) + else if( sBit == "tandrunkz" ) SET_FLOAT( fEffects[EFFECT_TAN_DRUNK_Z] ) + else if( sBit == "tandrunkzspeed" ) SET_FLOAT( fEffects[EFFECT_TAN_DRUNK_Z_SPEED] ) + else if( sBit == "tandrunkzoffset" ) SET_FLOAT( fEffects[EFFECT_TAN_DRUNK_Z_OFFSET] ) + else if( sBit == "tandrunkzperiod" ) SET_FLOAT( fEffects[EFFECT_TAN_DRUNK_Z_PERIOD] ) } else if( sBit.find("shrink") != sBit.npos) { @@ -790,24 +836,39 @@ bool PlayerOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut 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 == "tantornado" ) SET_FLOAT( fEffects[EFFECT_TAN_TORNADO] ) + else if( sBit == "tantornadoperiod" ) SET_FLOAT( fEffects[EFFECT_TAN_TORNADO_PERIOD] ) + else if( sBit == "tantornadooffset" ) SET_FLOAT( fEffects[EFFECT_TAN_TORNADO_OFFSET] ) else if( sBit == "tornadoz" ) SET_FLOAT( fEffects[EFFECT_TORNADO_Z] ) else if( sBit == "tornadozperiod" ) SET_FLOAT( fEffects[EFFECT_TORNADO_Z_PERIOD] ) else if( sBit == "tornadozoffset" ) SET_FLOAT( fEffects[EFFECT_TORNADO_Z_OFFSET] ) + else if( sBit == "tantornadoz" ) SET_FLOAT( fEffects[EFFECT_TAN_TORNADO_Z] ) + else if( sBit == "tantornadozperiod" ) SET_FLOAT( fEffects[EFFECT_TAN_TORNADO_Z_PERIOD] ) + else if( sBit == "tantornadozoffset" ) SET_FLOAT( fEffects[EFFECT_TAN_TORNADO_Z_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 == "tantipsy" ) SET_FLOAT( fEffects[EFFECT_TAN_TIPSY] ) + else if( sBit == "tantipsyspeed" ) SET_FLOAT( fEffects[EFFECT_TAN_TIPSY_SPEED] ) + else if( sBit == "tantipsyoffset" ) SET_FLOAT( fEffects[EFFECT_TAN_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 == "tanbumpy" ) SET_FLOAT( fEffects[EFFECT_TAN_BUMPY] ) + else if( sBit == "tanbumpyoffset" ) SET_FLOAT( fEffects[EFFECT_TAN_BUMPY_OFFSET] ) + else if( sBit == "tanbumpyperiod" ) SET_FLOAT( fEffects[EFFECT_TAN_BUMPY_PERIOD] ) else if( sBit == "bumpyx" ) SET_FLOAT( fEffects[EFFECT_BUMPY_X] ) else if( sBit == "bumpyxoffset" ) SET_FLOAT( fEffects[EFFECT_BUMPY_X_OFFSET] ) else if( sBit == "bumpyxperiod" ) SET_FLOAT( fEffects[EFFECT_BUMPY_X_PERIOD] ) + else if( sBit == "tanbumpyx" ) SET_FLOAT( fEffects[EFFECT_TAN_BUMPY_X] ) + else if( sBit == "tanbumpyxoffset" ) SET_FLOAT( fEffects[EFFECT_TAN_BUMPY_X_OFFSET] ) + else if( sBit == "tanbumpyxperiod" ) SET_FLOAT( fEffects[EFFECT_TAN_BUMPY_X_PERIOD] ) else { for (int i=0; i<16; i++) @@ -842,10 +903,18 @@ bool PlayerOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut else if( sBit == "digitalsteps" ) SET_FLOAT( fEffects[EFFECT_DIGITAL_STEPS] ) else if( sBit == "digitalperiod" ) SET_FLOAT( fEffects[EFFECT_DIGITAL_PERIOD] ) else if( sBit == "digitaloffset" ) SET_FLOAT( fEffects[EFFECT_DIGITAL_OFFSET] ) + else if( sBit == "tandigital" ) SET_FLOAT( fEffects[EFFECT_TAN_DIGITAL] ) + else if( sBit == "tandigitalsteps" ) SET_FLOAT( fEffects[EFFECT_TAN_DIGITAL_STEPS] ) + else if( sBit == "tandigitalperiod" ) SET_FLOAT( fEffects[EFFECT_TAN_DIGITAL_PERIOD] ) + else if( sBit == "tandigitaloffset" ) SET_FLOAT( fEffects[EFFECT_TAN_DIGITAL_OFFSET] ) else if( sBit == "digitalz" ) SET_FLOAT( fEffects[EFFECT_DIGITAL_Z] ) else if( sBit == "digitalzsteps" ) SET_FLOAT( fEffects[EFFECT_DIGITAL_Z_STEPS] ) else if( sBit == "digitalzperiod" ) SET_FLOAT( fEffects[EFFECT_DIGITAL_Z_PERIOD] ) else if( sBit == "digitalzoffset" ) SET_FLOAT( fEffects[EFFECT_DIGITAL_Z_OFFSET] ) + else if( sBit == "tandigitalz" ) SET_FLOAT( fEffects[EFFECT_TAN_DIGITAL_Z] ) + else if( sBit == "tandigitalzsteps" ) SET_FLOAT( fEffects[EFFECT_TAN_DIGITAL_Z_STEPS] ) + else if( sBit == "tandigitalzperiod" ) SET_FLOAT( fEffects[EFFECT_TAN_DIGITAL_Z_PERIOD] ) + else if( sBit == "tandigitalzoffset" ) SET_FLOAT( fEffects[EFFECT_TAN_DIGITAL_Z_OFFSET] ) } else if( sBit.find("zigzag") != sBit.npos) { @@ -1055,6 +1124,7 @@ bool PlayerOptions::FromOneModString( const RString &sOneMod, RString &sErrorOut } } else if( sBit == "zbuffer" ) m_bZBuffer = on; + else if( sBit == "cosecant" ) m_bCosecant = on; // deprecated mods/left in for compatibility else if( sBit == "converge" ) SET_FLOAT( fScrolls[SCROLL_CENTERED] ) // end of the list @@ -1290,6 +1360,7 @@ bool PlayerOptions::operator==( const PlayerOptions &other ) const COMPARE(m_bStealthPastReceptors); COMPARE(m_bDizzyHolds); COMPARE(m_bZBuffer); + COMPARE(m_bCosecant); COMPARE(m_fDark); COMPARE(m_fBlind); COMPARE(m_fCover); @@ -1370,6 +1441,7 @@ PlayerOptions& PlayerOptions::operator=(PlayerOptions const& other) CPY(m_bStealthPastReceptors); CPY(m_bDizzyHolds); CPY(m_bZBuffer); + CPY(m_bCosecant); CPY_SPEED(fDark); CPY_SPEED(fBlind); CPY_SPEED(fCover); @@ -1638,6 +1710,7 @@ void PlayerOptions::ResetPrefs( ResetPrefsType type ) CPY(m_bStealthPastReceptors); CPY(m_bDizzyHolds); CPY(m_bZBuffer); + CPY(m_bCosecant); CPY(m_MinTNSToHideNotes); CPY( m_fPerspectiveTilt ); @@ -1700,15 +1773,25 @@ public: 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(TanExpand, Accels[PlayerOptions::ACCEL_TAN_EXPAND], true); + FLOAT_INTERFACE(TanExpandPeriod, Accels[PlayerOptions::ACCEL_TAN_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(TanDrunk, Effects[PlayerOptions::EFFECT_TAN_DRUNK], true); + FLOAT_INTERFACE(TanDrunkSpeed, Effects[PlayerOptions::EFFECT_TAN_DRUNK_SPEED], true); + FLOAT_INTERFACE(TanDrunkOffset, Effects[PlayerOptions::EFFECT_TAN_DRUNK_OFFSET], true); + FLOAT_INTERFACE(TanDrunkPeriod, Effects[PlayerOptions::EFFECT_TAN_DRUNK_PERIOD], true); FLOAT_INTERFACE(DrunkZ, Effects[PlayerOptions::EFFECT_DRUNK_Z], true); FLOAT_INTERFACE(DrunkZSpeed, Effects[PlayerOptions::EFFECT_DRUNK_Z_SPEED], true); FLOAT_INTERFACE(DrunkZOffset, Effects[PlayerOptions::EFFECT_DRUNK_Z_OFFSET], true); FLOAT_INTERFACE(DrunkZPeriod, Effects[PlayerOptions::EFFECT_DRUNK_Z_PERIOD], true); + FLOAT_INTERFACE(TanDrunkZ, Effects[PlayerOptions::EFFECT_TAN_DRUNK_Z], true); + FLOAT_INTERFACE(TanDrunkZSpeed, Effects[PlayerOptions::EFFECT_TAN_DRUNK_Z_SPEED], true); + FLOAT_INTERFACE(TanDrunkZOffset, Effects[PlayerOptions::EFFECT_TAN_DRUNK_Z_OFFSET], true); + FLOAT_INTERFACE(TanDrunkZPeriod, Effects[PlayerOptions::EFFECT_TAN_DRUNK_Z_PERIOD], true); FLOAT_INTERFACE(Dizzy, Effects[PlayerOptions::EFFECT_DIZZY], true); FLOAT_INTERFACE(AttenuateX, Effects[PlayerOptions::EFFECT_ATTENUATE_X], true); FLOAT_INTERFACE(AttenuateY, Effects[PlayerOptions::EFFECT_ATTENUATE_Y], true); @@ -1738,18 +1821,33 @@ public: 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(TanTornado, Effects[PlayerOptions::EFFECT_TAN_TORNADO], true); + FLOAT_INTERFACE(TanTornadoPeriod, Effects[PlayerOptions::EFFECT_TAN_TORNADO_PERIOD], true); + FLOAT_INTERFACE(TanTornadoOffset, Effects[PlayerOptions::EFFECT_TAN_TORNADO_OFFSET], true); FLOAT_INTERFACE(TornadoZ, Effects[PlayerOptions::EFFECT_TORNADO_Z], true); FLOAT_INTERFACE(TornadoZPeriod, Effects[PlayerOptions::EFFECT_TORNADO_Z_PERIOD], true); FLOAT_INTERFACE(TornadoZOffset, Effects[PlayerOptions::EFFECT_TORNADO_Z_OFFSET], true); + FLOAT_INTERFACE(TanTornadoZ, Effects[PlayerOptions::EFFECT_TAN_TORNADO_Z], true); + FLOAT_INTERFACE(TanTornadoZPeriod, Effects[PlayerOptions::EFFECT_TAN_TORNADO_Z_PERIOD], true); + FLOAT_INTERFACE(TanTornadoZOffset, Effects[PlayerOptions::EFFECT_TAN_TORNADO_Z_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(TanTipsy, Effects[PlayerOptions::EFFECT_TAN_TIPSY], true); + FLOAT_INTERFACE(TanTipsySpeed, Effects[PlayerOptions::EFFECT_TAN_TIPSY_SPEED], true); + FLOAT_INTERFACE(TanTipsyOffset, Effects[PlayerOptions::EFFECT_TAN_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(TanBumpy, Effects[PlayerOptions::EFFECT_TAN_BUMPY], true); + FLOAT_INTERFACE(TanBumpyOffset, Effects[PlayerOptions::EFFECT_TAN_BUMPY_OFFSET], true); + FLOAT_INTERFACE(TanBumpyPeriod, Effects[PlayerOptions::EFFECT_TAN_BUMPY_PERIOD], true); FLOAT_INTERFACE(BumpyX, Effects[PlayerOptions::EFFECT_BUMPY_X], true); FLOAT_INTERFACE(BumpyXOffset, Effects[PlayerOptions::EFFECT_BUMPY_X_OFFSET], true); FLOAT_INTERFACE(BumpyXPeriod, Effects[PlayerOptions::EFFECT_BUMPY_X_PERIOD], true); + FLOAT_INTERFACE(TanBumpyX, Effects[PlayerOptions::EFFECT_TAN_BUMPY_X], true); + FLOAT_INTERFACE(TanBumpyXOffset, Effects[PlayerOptions::EFFECT_TAN_BUMPY_X_OFFSET], true); + FLOAT_INTERFACE(TanBumpyXPeriod, Effects[PlayerOptions::EFFECT_TAN_BUMPY_X_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); @@ -1782,10 +1880,18 @@ public: FLOAT_INTERFACE(DigitalSteps, Effects[PlayerOptions::EFFECT_DIGITAL_STEPS], true); FLOAT_INTERFACE(DigitalPeriod, Effects[PlayerOptions::EFFECT_DIGITAL_PERIOD], true); FLOAT_INTERFACE(DigitalOffset, Effects[PlayerOptions::EFFECT_DIGITAL_OFFSET], true); + FLOAT_INTERFACE(TanDigital, Effects[PlayerOptions::EFFECT_TAN_DIGITAL], true); + FLOAT_INTERFACE(TanDigitalSteps, Effects[PlayerOptions::EFFECT_TAN_DIGITAL_STEPS], true); + FLOAT_INTERFACE(TanDigitalPeriod, Effects[PlayerOptions::EFFECT_TAN_DIGITAL_PERIOD], true); + FLOAT_INTERFACE(TanDigitalOffset, Effects[PlayerOptions::EFFECT_TAN_DIGITAL_OFFSET], true); FLOAT_INTERFACE(DigitalZ, Effects[PlayerOptions::EFFECT_DIGITAL_Z], true); FLOAT_INTERFACE(DigitalZSteps, Effects[PlayerOptions::EFFECT_DIGITAL_Z_STEPS], true); FLOAT_INTERFACE(DigitalZPeriod, Effects[PlayerOptions::EFFECT_DIGITAL_Z_PERIOD], true); FLOAT_INTERFACE(DigitalZOffset, Effects[PlayerOptions::EFFECT_DIGITAL_Z_OFFSET], true); + FLOAT_INTERFACE(TanDigitalZ, Effects[PlayerOptions::EFFECT_TAN_DIGITAL_Z], true); + FLOAT_INTERFACE(TanDigitalZSteps, Effects[PlayerOptions::EFFECT_TAN_DIGITAL_Z_STEPS], true); + FLOAT_INTERFACE(TanDigitalZPeriod, Effects[PlayerOptions::EFFECT_TAN_DIGITAL_Z_PERIOD], true); + FLOAT_INTERFACE(TanDigitalZOffset, Effects[PlayerOptions::EFFECT_TAN_DIGITAL_Z_OFFSET], true); FLOAT_INTERFACE(ParabolaX, Effects[PlayerOptions::EFFECT_PARABOLA_X], true); FLOAT_INTERFACE(ParabolaY, Effects[PlayerOptions::EFFECT_PARABOLA_Y], true); FLOAT_INTERFACE(ParabolaZ, Effects[PlayerOptions::EFFECT_PARABOLA_Z], true); @@ -1831,6 +1937,7 @@ public: BOOL_INTERFACE(StealthPastReceptors, StealthPastReceptors); BOOL_INTERFACE(DizzyHolds, DizzyHolds); BOOL_INTERFACE(ZBuffer, ZBuffer); + BOOL_INTERFACE(Cosecant, Cosecant); BOOL_INTERFACE(TurnNone, Turns[PlayerOptions::TURN_NONE]); BOOL_INTERFACE(Mirror, Turns[PlayerOptions::TURN_MIRROR]); BOOL_INTERFACE(Backwards, Turns[PlayerOptions::TURN_BACKWARDS]); @@ -2187,15 +2294,25 @@ public: ADD_METHOD(WavePeriod); ADD_METHOD(Expand); ADD_METHOD(ExpandPeriod); + ADD_METHOD(TanExpand); + ADD_METHOD(TanExpandPeriod); ADD_METHOD(Boomerang); ADD_METHOD(Drunk); ADD_METHOD(DrunkSpeed); ADD_METHOD(DrunkOffset); ADD_METHOD(DrunkPeriod); + ADD_METHOD(TanDrunk); + ADD_METHOD(TanDrunkSpeed); + ADD_METHOD(TanDrunkOffset); + ADD_METHOD(TanDrunkPeriod); ADD_METHOD(DrunkZ); ADD_METHOD(DrunkZSpeed); ADD_METHOD(DrunkZOffset); ADD_METHOD(DrunkZPeriod); + ADD_METHOD(TanDrunkZ); + ADD_METHOD(TanDrunkZSpeed); + ADD_METHOD(TanDrunkZOffset); + ADD_METHOD(TanDrunkZPeriod); ADD_METHOD(Dizzy); ADD_METHOD(ShrinkLinear); ADD_METHOD(ShrinkMult); @@ -2225,18 +2342,33 @@ public: ADD_METHOD(Tornado); ADD_METHOD(TornadoPeriod); ADD_METHOD(TornadoOffset); + ADD_METHOD(TanTornado); + ADD_METHOD(TanTornadoPeriod); + ADD_METHOD(TanTornadoOffset); ADD_METHOD(TornadoZ); ADD_METHOD(TornadoZPeriod); ADD_METHOD(TornadoZOffset); + ADD_METHOD(TanTornadoZ); + ADD_METHOD(TanTornadoZPeriod); + ADD_METHOD(TanTornadoZOffset); ADD_METHOD(Tipsy); ADD_METHOD(TipsySpeed); ADD_METHOD(TipsyOffset); + ADD_METHOD(TanTipsy); + ADD_METHOD(TanTipsySpeed); + ADD_METHOD(TanTipsyOffset); ADD_METHOD(Bumpy); ADD_METHOD(BumpyOffset); ADD_METHOD(BumpyPeriod); + ADD_METHOD(TanBumpy); + ADD_METHOD(TanBumpyOffset); + ADD_METHOD(TanBumpyPeriod); ADD_METHOD(BumpyX); ADD_METHOD(BumpyXOffset); ADD_METHOD(BumpyXPeriod); + ADD_METHOD(TanBumpyX); + ADD_METHOD(TanBumpyXOffset); + ADD_METHOD(TanBumpyXPeriod); ADD_METHOD(Beat); ADD_METHOD(BeatOffset); ADD_METHOD(BeatPeriod); @@ -2269,10 +2401,18 @@ public: ADD_METHOD(DigitalSteps); ADD_METHOD(DigitalPeriod); ADD_METHOD(DigitalOffset); + ADD_METHOD(TanDigital); + ADD_METHOD(TanDigitalSteps); + ADD_METHOD(TanDigitalPeriod); + ADD_METHOD(TanDigitalOffset); ADD_METHOD(DigitalZ); ADD_METHOD(DigitalZSteps); ADD_METHOD(DigitalZPeriod); ADD_METHOD(DigitalZOffset); + ADD_METHOD(TanDigitalZ); + ADD_METHOD(TanDigitalZSteps); + ADD_METHOD(TanDigitalZPeriod); + ADD_METHOD(TanDigitalZOffset); ADD_METHOD(ParabolaX); ADD_METHOD(ParabolaY); ADD_METHOD(ParabolaZ); @@ -2298,6 +2438,7 @@ public: ADD_METHOD(StealthPastReceptors); ADD_METHOD(DizzyHolds); ADD_METHOD(ZBuffer); + ADD_METHOD(Cosecant); ADD_METHOD(RandAttack); ADD_METHOD(NoAttack); ADD_METHOD(PlayerAutoPlay); diff --git a/src/PlayerOptions.h b/src/PlayerOptions.h index cbb62e51b1..78c89da400 100644 --- a/src/PlayerOptions.h +++ b/src/PlayerOptions.h @@ -83,6 +83,7 @@ public: m_bMuteOnError(false), m_FailType(FailType_Immediate), m_bStealthType(false), m_bStealthPastReceptors(false), m_bDizzyHolds(false), m_bZBuffer(false), + m_bCosecant(false), m_MinTNSToHideNotes(PREFSMAN->m_MinTNSToHideNotes) { m_sNoteSkin = ""; @@ -137,6 +138,8 @@ public: ACCEL_WAVE_PERIOD, ACCEL_EXPAND, ACCEL_EXPAND_PERIOD, + ACCEL_TAN_EXPAND, + ACCEL_TAN_EXPAND_PERIOD, ACCEL_BOOMERANG, /**< The arrows start from above the targets, go down, then come back up. */ NUM_ACCELS }; @@ -145,10 +148,18 @@ public: EFFECT_DRUNK_SPEED, EFFECT_DRUNK_OFFSET, EFFECT_DRUNK_PERIOD, + EFFECT_TAN_DRUNK, + EFFECT_TAN_DRUNK_SPEED, + EFFECT_TAN_DRUNK_OFFSET, + EFFECT_TAN_DRUNK_PERIOD, EFFECT_DRUNK_Z, EFFECT_DRUNK_Z_SPEED, EFFECT_DRUNK_Z_OFFSET, EFFECT_DRUNK_Z_PERIOD, + EFFECT_TAN_DRUNK_Z, + EFFECT_TAN_DRUNK_Z_SPEED, + EFFECT_TAN_DRUNK_Z_OFFSET, + EFFECT_TAN_DRUNK_Z_PERIOD, EFFECT_DIZZY, EFFECT_ATTENUATE_X, EFFECT_ATTENUATE_Y, @@ -178,18 +189,33 @@ public: EFFECT_TORNADO, EFFECT_TORNADO_PERIOD, EFFECT_TORNADO_OFFSET, + EFFECT_TAN_TORNADO, + EFFECT_TAN_TORNADO_PERIOD, + EFFECT_TAN_TORNADO_OFFSET, EFFECT_TORNADO_Z, EFFECT_TORNADO_Z_PERIOD, EFFECT_TORNADO_Z_OFFSET, + EFFECT_TAN_TORNADO_Z, + EFFECT_TAN_TORNADO_Z_PERIOD, + EFFECT_TAN_TORNADO_Z_OFFSET, EFFECT_TIPSY, EFFECT_TIPSY_SPEED, EFFECT_TIPSY_OFFSET, + EFFECT_TAN_TIPSY, + EFFECT_TAN_TIPSY_SPEED, + EFFECT_TAN_TIPSY_OFFSET, EFFECT_BUMPY, EFFECT_BUMPY_OFFSET, EFFECT_BUMPY_PERIOD, + EFFECT_TAN_BUMPY, + EFFECT_TAN_BUMPY_OFFSET, + EFFECT_TAN_BUMPY_PERIOD, EFFECT_BUMPY_X, EFFECT_BUMPY_X_OFFSET, EFFECT_BUMPY_X_PERIOD, + EFFECT_TAN_BUMPY_X, + EFFECT_TAN_BUMPY_X_OFFSET, + EFFECT_TAN_BUMPY_X_PERIOD, EFFECT_BEAT, EFFECT_BEAT_OFFSET, EFFECT_BEAT_PERIOD, @@ -206,10 +232,18 @@ public: EFFECT_DIGITAL_STEPS, EFFECT_DIGITAL_PERIOD, EFFECT_DIGITAL_OFFSET, + EFFECT_TAN_DIGITAL, + EFFECT_TAN_DIGITAL_STEPS, + EFFECT_TAN_DIGITAL_PERIOD, + EFFECT_TAN_DIGITAL_OFFSET, EFFECT_DIGITAL_Z, EFFECT_DIGITAL_Z_STEPS, EFFECT_DIGITAL_Z_PERIOD, EFFECT_DIGITAL_Z_OFFSET, + EFFECT_TAN_DIGITAL_Z, + EFFECT_TAN_DIGITAL_Z_STEPS, + EFFECT_TAN_DIGITAL_Z_PERIOD, + EFFECT_TAN_DIGITAL_Z_OFFSET, EFFECT_ZIGZAG, EFFECT_ZIGZAG_PERIOD, EFFECT_ZIGZAG_OFFSET, @@ -349,6 +383,7 @@ public: bool m_bStealthPastReceptors; bool m_bDizzyHolds; bool m_bZBuffer; + bool m_bCosecant; /** @brief The method for which a player can fail a song. */ FailType m_FailType; TapNoteScore m_MinTNSToHideNotes; diff --git a/src/RageMath.cpp b/src/RageMath.cpp index a9ce768adb..626752037f 100644 --- a/src/RageMath.cpp +++ b/src/RageMath.cpp @@ -643,6 +643,16 @@ float RageFastCos( float x ) return RageFastSin( x + 0.5f*PI ); } +float RageFastTan( float x ) +{ + return RageFastSin( x ) / RageFastCos( x ); +} + +float RageFastCsc( float x ) +{ + return 1 / RageFastSin( x ); +} + float RageSquare( float angle ) { float fAngle = fmod( angle , (PI * 2) ); diff --git a/src/RageMath.h b/src/RageMath.h index b9a2022563..1f6295a9e8 100644 --- a/src/RageMath.h +++ b/src/RageMath.h @@ -55,6 +55,8 @@ void RageMatrixTranspose( RageMatrix* pOut, const RageMatrix* pIn ); float RageFastSin( float x ) CONST_FUNCTION; float RageFastCos( float x ) CONST_FUNCTION; +float RageFastTan( float x ) CONST_FUNCTION; +float RageFastCsc( float x ) CONST_FUNCTION; float RageSquare( float x) CONST_FUNCTION; float RageTriangle( float x) CONST_FUNCTION;