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;