diff --git a/stepmania/src/ArrowEffects.cpp b/stepmania/src/ArrowEffects.cpp index 89c24cce9e..3a1195ff8b 100644 --- a/stepmania/src/ArrowEffects.cpp +++ b/stepmania/src/ArrowEffects.cpp @@ -280,8 +280,16 @@ float ArrowEffects::GetYOffset( const PlayerState* pPlayerState, int iCol, float static void ArrowGetReverseShiftAndScale( const PlayerState* pPlayerState, int iCol, float fYReverseOffsetPixels, float &fShiftOut, float &fScaleOut ) { + /* XXX: Hack: we need to scale the reverse shift by the zoom. */ + float fTinyPercent = pPlayerState->m_CurrentPlayerOptions.m_fEffects[PlayerOptions::EFFECT_TINY]; + float fZoom = 1 - fTinyPercent*0.5f; + + // don't divide by 0 + if( fabsf(fZoom) < 0.01 ) + fZoom = 0.01f; + float fPercentReverse = pPlayerState->m_CurrentPlayerOptions.GetReversePercentForColumn(iCol); - fShiftOut = SCALE( fPercentReverse, 0.f, 1.f, -fYReverseOffsetPixels/2, fYReverseOffsetPixels/2 ); + fShiftOut = SCALE( fPercentReverse, 0.f, 1.f, -fYReverseOffsetPixels/fZoom/2, fYReverseOffsetPixels/fZoom/2 ); float fPercentCentered = pPlayerState->m_CurrentPlayerOptions.m_fScrolls[PlayerOptions::SCROLL_CENTERED]; fShiftOut = SCALE( fPercentCentered, 0.f, 1.f, fShiftOut, 0.0f ); @@ -394,7 +402,11 @@ float ArrowEffects::GetRotation( const PlayerState* pPlayerState, float fNoteBea static float GetCenterLine( const PlayerState* pPlayerState ) { - return CENTER_LINE_Y; + /* Another mini hack: if EFFECT_MINI is on, then our center line is at eg. 320, + * not 160. */ + const float fMiniPercent = pPlayerState->m_CurrentPlayerOptions.m_fEffects[PlayerOptions::EFFECT_TINY]; + const float fZoom = 1 - fMiniPercent*0.5f; + return CENTER_LINE_Y / fZoom; } static float GetHiddenSudden( const PlayerState* pPlayerState ) diff --git a/stepmania/src/NoteField.cpp b/stepmania/src/NoteField.cpp index d1648998a1..ffeeac0af6 100644 --- a/stepmania/src/NoteField.cpp +++ b/stepmania/src/NoteField.cpp @@ -453,6 +453,7 @@ void NoteField::DrawPrimitives() float fDrawScale = 1; fDrawScale *= 1 + 0.5f * fabsf( current_po.m_fPerspectiveTilt ); + fDrawScale *= 1 + fabsf( current_po.m_fEffects[PlayerOptions::EFFECT_TINY] ); iFirstPixelToDraw = (int)(iFirstPixelToDraw * fDrawScale); iLastPixelToDraw = (int)(iLastPixelToDraw * fDrawScale); diff --git a/stepmania/src/NoteFieldPositioning.cpp b/stepmania/src/NoteFieldPositioning.cpp index 417b8225fc..34cf4031a7 100644 --- a/stepmania/src/NoteFieldPositioning.cpp +++ b/stepmania/src/NoteFieldPositioning.cpp @@ -19,8 +19,9 @@ void NoteFieldMode::BeginDrawTrack( const PlayerState* pPlayerState, int iTrack // TODO: Remove indexing by PlayerNumber. float fPixelXOffsetFromCenter = s->m_ColumnInfo[pPlayerState->m_PlayerNumber][iTrack].fXOffset; - /* Allow Mini to pull tracks together, but not to push them apart. */ const float* fEffects = pPlayerState->m_CurrentPlayerOptions.m_fEffects; + + /* Allow Mini to pull tracks together, but not to push them apart. */ float fMiniPercent = fEffects[PlayerOptions::EFFECT_MINI]; fMiniPercent = min( powf(0.5f, fMiniPercent), 1.0f ); fPixelXOffsetFromCenter *= fMiniPercent; diff --git a/stepmania/src/Player.cpp b/stepmania/src/Player.cpp index 9c529d0989..99f9c3e5e1 100644 --- a/stepmania/src/Player.cpp +++ b/stepmania/src/Player.cpp @@ -517,7 +517,11 @@ void Player::Update( float fDeltaTime ) float fMiniPercent = m_pPlayerState->m_CurrentPlayerOptions.m_fEffects[PlayerOptions::EFFECT_MINI]; - float fJudgmentZoom = min( powf(0.5f, fMiniPercent), 1.0f ); + float fTinyPercent = m_pPlayerState->m_CurrentPlayerOptions.m_fEffects[PlayerOptions::EFFECT_TINY]; + float fNoteFieldZoom = 1 - fTinyPercent*0.5f; + float fJudgmentZoom = min( powf(0.5f, fMiniPercent+fTinyPercent), 1.0f ); + if( m_pNoteField ) + m_pNoteField->SetZoom( fNoteFieldZoom ); if( m_pJudgment ) m_pJudgment->SetZoom( m_pJudgment->GetZoom() * fJudgmentZoom ); if( m_sprJudgmentFrame.IsLoaded() ) @@ -816,6 +820,12 @@ void Player::DrawPrimitives() float fTiltDegrees = SCALE(fTilt,-1.f,+1.f,+30,-30) * (bReverse?-1:1); + float fZoom = SCALE( m_pPlayerState->m_CurrentPlayerOptions.m_fEffects[PlayerOptions::EFFECT_TINY], 0.f, 1.f, 1.f, 0.5f ); + if( fTilt > 0 ) + fZoom *= SCALE( fTilt, 0.f, 1.f, 1.f, 0.9f ); + else + fZoom *= SCALE( fTilt, 0.f, -1.f, 1.f, 0.9f ); + float fYOffset; if( fTilt > 0 ) fYOffset = SCALE( fTilt, 0.f, 1.f, 0.f, -45.f ) * (bReverse?-1:1); @@ -823,6 +833,7 @@ void Player::DrawPrimitives() fYOffset = SCALE( fTilt, 0.f, -1.f, 0.f, -20.f ) * (bReverse?-1:1); m_pNoteField->SetY( fOriginalY + fYOffset ); + m_pNoteField->SetZoom( fZoom ); m_pNoteField->SetRotationX( fTiltDegrees ); m_pNoteField->Draw(); @@ -1040,8 +1051,8 @@ void Player::HandleStep( int col, const RageTimer &tm, bool bHeld ) // fall through default: { - float fCalsFor100Lbs = SCALE( iNumTracksHeld, 1, 2, 0.029f, 0.097f ); - float fCalsFor200Lbs = SCALE( iNumTracksHeld, 1, 2, 0.052f, 0.167f ); + float fCalsFor100Lbs = SCALE( iNumTracksHeld, 1, 2, 0.023f, 0.077f ); + float fCalsFor200Lbs = SCALE( iNumTracksHeld, 1, 2, 0.041f, 0.133f ); fCals = SCALE( pProfile->GetCalculatedWeightPounds(), 100.f, 200.f, fCalsFor100Lbs, fCalsFor200Lbs ); } break; diff --git a/stepmania/src/PlayerOptions.cpp b/stepmania/src/PlayerOptions.cpp index fd2313d7b6..4468621e82 100644 --- a/stepmania/src/PlayerOptions.cpp +++ b/stepmania/src/PlayerOptions.cpp @@ -119,6 +119,7 @@ void PlayerOptions::GetMods( vector &AddTo ) const AddPart( AddTo, m_fEffects[EFFECT_DRUNK], "Drunk" ); AddPart( AddTo, m_fEffects[EFFECT_DIZZY], "Dizzy" ); AddPart( AddTo, m_fEffects[EFFECT_MINI], "Mini" ); + AddPart( AddTo, m_fEffects[EFFECT_TINY], "Tiny" ); AddPart( AddTo, m_fEffects[EFFECT_FLIP], "Flip" ); AddPart( AddTo, m_fEffects[EFFECT_INVERT], "Invert" ); AddPart( AddTo, m_fEffects[EFFECT_TORNADO], "Tornado" ); @@ -282,6 +283,7 @@ void PlayerOptions::FromString( const RString &sOptions, bool bWarnOnInvalid ) else if( sBit == "drunk" ) SET_FLOAT( fEffects[EFFECT_DRUNK] ) else if( sBit == "dizzy" ) SET_FLOAT( fEffects[EFFECT_DIZZY] ) else if( sBit == "mini" ) SET_FLOAT( fEffects[EFFECT_MINI] ) + else if( sBit == "tiny" ) SET_FLOAT( fEffects[EFFECT_TINY] ) else if( sBit == "flip" ) SET_FLOAT( fEffects[EFFECT_FLIP] ) else if( sBit == "invert" ) SET_FLOAT( fEffects[EFFECT_INVERT] ) else if( sBit == "tornado" ) SET_FLOAT( fEffects[EFFECT_TORNADO] ) diff --git a/stepmania/src/PlayerOptions.h b/stepmania/src/PlayerOptions.h index 954450d096..1222206a42 100644 --- a/stepmania/src/PlayerOptions.h +++ b/stepmania/src/PlayerOptions.h @@ -41,6 +41,7 @@ public: EFFECT_DRUNK, EFFECT_DIZZY, EFFECT_MINI, + EFFECT_TINY, EFFECT_FLIP, EFFECT_INVERT, EFFECT_TORNADO,