From 9dbbb7949e7df4f932f57017992d7c884b02cd02 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sun, 16 Mar 2003 20:55:45 +0000 Subject: [PATCH] ScoreKeeperMAX2: - Jumps count as 2 toward combo, but 1 toward judgement totals - Only Perfect or better increments combo in courses --- .../ScreenSelectMusic options message 1x2.png | Bin 0 -> 5014 bytes stepmania/src/Combo.cpp | 131 +++-------------- stepmania/src/Combo.h | 10 +- stepmania/src/Player.cpp | 17 +-- stepmania/src/Player.h | 1 - stepmania/src/ScoreDisplayOni.cpp | 2 +- stepmania/src/ScoreKeeper.h | 4 +- stepmania/src/ScoreKeeperMAX2.cpp | 133 ++++++++++++++++-- stepmania/src/ScoreKeeperMAX2.h | 4 +- stepmania/src/ScreenGameplay.cpp | 6 +- stepmania/src/ScreenSelectCourse.cpp | 25 +++- stepmania/src/ScreenSelectCourse.h | 1 + stepmania/src/ScreenSelectMusic.cpp | 4 +- stepmania/src/StageStats.cpp | 1 + stepmania/src/StageStats.h | 1 + stepmania/src/ThemeManager.cpp | 6 +- 16 files changed, 185 insertions(+), 161 deletions(-) create mode 100644 stepmania/Themes/default/Graphics/ScreenSelectMusic options message 1x2.png diff --git a/stepmania/Themes/default/Graphics/ScreenSelectMusic options message 1x2.png b/stepmania/Themes/default/Graphics/ScreenSelectMusic options message 1x2.png new file mode 100644 index 0000000000000000000000000000000000000000..fc3d08b75edad7ab86eee16b56bc16960cac01b5 GIT binary patch literal 5014 zcmV;H6KU*;P)004R=004l4008;_004mK004C`008P>0026d000+nm#LZ5000vq zNkl89_#n5nu!v!H&@P1JqlQKP?1A z&F>sOJU&{QG)%$wPSkW!Y6F$Vw~q;6G6ZIx0=fk5LTbV@1nAD6u` zUY1fyL9>*=7;^!D+s>ttxi6%Y<=69$4DcoenghTU09=ITQULIWCWx)ELuyL^Kmq_U zQope2jHHyw4;$ZNgqIlroX7~1@oi+qYA!LxLW8-#|8^rx26*Gf*Yl=1h(ZV`%YU-# zI1V_@Jm)aabCkBqvIHUi>FudBE=}jJ8ezuR9RPSAFSYT@q?AXRwPbu<*9FeG(OlAv zZ`a&!&FSwp!ct0lHuL~M2mq3EE{md&b8tSNB>+eOkoWst&P5o8C~e*Ecj>yW1OOR^ z;p~1bMJE7+KPrQRyu4g4ia%GHvp=n?JOGfc>srkvrQ?R?zS0i>;C(X>|D$!>HW35? zxUP%VMpad_`=r|FTIt$=a}Hq`F2XBJI)5E~<2-l#3BMsHTWfQR_@iwl%sq>%03d2s zH*?P})20oKcJhX{Is1~Slrm$C`2Y~i<^gT|8E$oA=_e0i4yRcCG0_FhvD9oGhNx4g$g9^5y6Ri#3L*6W`OTK~SJ@K%0~hKu zM~U!YwS)O!^~p!<48D&-0AFd%a$J+cu%057+Cp_c!f#s_$-?PJd+k zE#9DvVm-x*?;7Lt7WLD04PDUC&o?L^PyO+IzjvO+aXjZe_iwc&YJC4RD?-n8U5Mjp zi@K_+Ac`UoLU_tUnYw+NrYU4u28iu=oO6idcv5hV*3Jb0!1sL!f?zI>E&y;q@OTbV z%Dh=wj(H-7#<&|rJV_~8$4cBZVlS6c9yAZh`y@II5n{^docX7`(kO}mX&$>nv}IWa zX_{iueqoFq2CjXf>nDskjM$$sU2s9vVT;J?PGHg0@Cd^L_Vi$g5zkN=FC))zC^*M}zN_||D}o2S zDxEfgN?098%xYf%)&bAM}eWA#VL{2$X5 zTbia%=WRg{Je}j2UL{GA$>3k{?m6{*VV(XouL&J zCXZ~OpR43~{&HqI#>b_Alwf1A_SOKFte0i^Sjp?2g>9gUNjq3FibXp%U1MI5YKwCY zzVE+yIwt&Cg3m+W7eYXmWl&XBC!d$lsk*N7eZQBlLI_BbWU@|LgKisH#j+&|Mg};F zq8EWuLS=(41Hm~5&-1L5Nm-U~I-OpKzu)iH6BnZ$OdeU{+9ga~-D|dR7wt@Y+i*!b zw~j7ZZ??QA$yS#VvE2g2YG+N_*Q6`UGB_TOPjhJ~kni1mew?`+4o`t`VHjG!%T^ca zhP5n9xL&Wl#;r#uZGvtrS)FQ2j0~{0I*6bS3JCQT!<0GNJfRSRM^W^&;uu@8biI2@ zf3)9}P-pgug%A)$(bLMsWX0CSqclyyah%8EVrq188(k~CE{|MWjXAIa)XK3v7M$}* z=P!M9n$W)`TMYlACuiFlrOP+c&YH9@PM7A@l>oqn5RN+Qp4%UF=83Hf@;uku$^gJm zlEk{teYy~l*KI2oZ-H(sS)FQ2{#d>T zbJZ5>Mo?c->kC7R0ewLb1V%w5X_~54S-==em)3rqbGTeCXziKOsd)VkBuUa6sMM16 zRjwK3dEU8TY-JZho5zOpd@Td~psURXOM@3R?ZgQEDFMJ0Likg4fvEwJQXVY=C3{tm z#h8`0vH6`V)&>}Ra;A(ifclD$4sT4+-)^_r?^oXGOmF_NC@?(R zsG1d0?*vfB({Y?xTi8JmK$@mX`F!QgcD2gX4Dec(I01mLYx}A-(dOQjwcZLl91dfB z3gLT^13+Gur8mNdwRD_djH$iJ_8cswlo1d<9+tMGROvPU+kk+kQp$t=U@0QyRrfK) zaU8hc@4XR-_xs&=OCyfs!Km4yD3qt~=eS>+mF{+)^4VPkXkK-Dit^!h)XQKksxPVZa9H3

1o615xhkp{Rc%zp@JnnIrEMhdV?fvE|u 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 literal 0 HcmV?d00001 diff --git a/stepmania/src/Combo.cpp b/stepmania/src/Combo.cpp index 95ac680067..4c0e33c893 100644 --- a/stepmania/src/Combo.cpp +++ b/stepmania/src/Combo.cpp @@ -11,10 +11,6 @@ */ #include "Combo.h" -#include "PrefsManager.h" -#include "ScreenManager.h" -#include "ScreenGameplay.h" -#include "GameState.h" #include "ThemeManager.h" @@ -51,14 +47,13 @@ Combo::Combo() PULSE_ZOOM.Refresh(); C_TWEEN_SECONDS.Refresh(); - Reset(); - m_sprCombo.Load( THEME->GetPathTo("Graphics", "Combo label") ); m_sprCombo.EnableShadow( true ); m_sprCombo.StopAnimating(); m_sprCombo.SetXY( LABEL_X, LABEL_Y ); m_sprCombo.SetHorizAlign( (Actor::HorizAlign)(int)LABEL_HORIZ_ALIGN ); m_sprCombo.SetVertAlign( (Actor::VertAlign)(int)LABEL_VERT_ALIGN ); + m_sprCombo.SetDiffuse( RageColor(1,1,1,0) ); // invisible this->AddChild( &m_sprCombo ); m_textComboNumber.LoadFromNumbers( THEME->GetPathTo("Numbers","Combo numbers") ); @@ -66,117 +61,31 @@ Combo::Combo() m_textComboNumber.SetXY( NUMBER_X, NUMBER_Y ); m_textComboNumber.SetHorizAlign( (Actor::HorizAlign)(int)NUMBER_HORIZ_ALIGN ); m_textComboNumber.SetVertAlign( (Actor::VertAlign)(int)NUMBER_VERT_ALIGN ); + m_textComboNumber.SetDiffuse( RageColor(1,1,1,0) ); // invisible this->AddChild( &m_textComboNumber ); } -void Combo::Reset() +void Combo::SetCombo( int iCombo ) { - m_iCurCombo = m_iMaxCombo = m_iCurComboOfPerfects = 0; - - m_textComboNumber.SetDiffuse( RageColor(1,1,1,0) ); // invisible - m_sprCombo.SetDiffuse( RageColor(1,1,1,0) ); // invisible -} - -void Combo::SetScore( TapNoteScore score, int iNumNotesInThisRow, Inventory* pInventory ) -{ -#ifndef DEBUG - if( PREFSMAN->m_bAutoPlay && !GAMESTATE->m_bDemonstrationOrJukebox ) // cheaters never prosper + if( iCombo >= (int)SHOW_COMBO_AT ) { - m_iCurCombo = 0; - m_iCurComboOfPerfects = 0; - return; + m_textComboNumber.SetDiffuse( RageColor(1,1,1,1) ); // visible + m_sprCombo.SetDiffuse( RageColor(1,1,1,1) ); // visible + + m_textComboNumber.SetText( ssprintf("%d", iCombo) ); + float fNumberZoom = SCALE(iCombo,0.f,(float)NUMBER_MAX_ZOOM_AT,(float)NUMBER_MIN_ZOOM,(float)NUMBER_MAX_ZOOM); + CLAMP( fNumberZoom, (float)NUMBER_MIN_ZOOM, (float)NUMBER_MAX_ZOOM ); + m_textComboNumber.SetZoom( fNumberZoom * (float)PULSE_ZOOM ); + m_textComboNumber.BeginTweening( C_TWEEN_SECONDS ); + m_textComboNumber.SetTweenZoom( fNumberZoom ); + + m_sprCombo.SetZoom( PULSE_ZOOM ); + m_sprCombo.BeginTweening( C_TWEEN_SECONDS ); + m_sprCombo.SetTweenZoom( 1 ); } -#endif //DEBUG - - // combo of marvelous/perfect - switch( score ) + else { - case TNS_MARVELOUS: - case TNS_PERFECT: - m_iCurComboOfPerfects += iNumNotesInThisRow; - - if( m_iCurComboOfPerfects==250 && !GAMESTATE->m_bDemonstrationOrJukebox ) - SCREENMAN->SendMessageToTopScreen( SM_PlayToasty, 0 ); - break; - default: - m_iCurComboOfPerfects = 0; - break; - } - - // combo of marvelous/perfect/great - switch( score ) - { - case TNS_MARVELOUS: - case TNS_PERFECT: - case TNS_GREAT: - { - int iOldCombo = m_iCurCombo; - - m_iCurCombo += iNumNotesInThisRow; // continue combo - - #define CROSSED( i ) (iOldComboSendMessageToTopScreen( SM_100Combo, 0 ); - else if( CROSSED(200) ) SCREENMAN->SendMessageToTopScreen( SM_200Combo, 0 ); - else if( CROSSED(300) ) SCREENMAN->SendMessageToTopScreen( SM_300Combo, 0 ); - else if( CROSSED(400) ) SCREENMAN->SendMessageToTopScreen( SM_400Combo, 0 ); - else if( CROSSED(500) ) SCREENMAN->SendMessageToTopScreen( SM_500Combo, 0 ); - else if( CROSSED(600) ) SCREENMAN->SendMessageToTopScreen( SM_600Combo, 0 ); - else if( CROSSED(700) ) SCREENMAN->SendMessageToTopScreen( SM_700Combo, 0 ); - else if( CROSSED(800) ) SCREENMAN->SendMessageToTopScreen( SM_800Combo, 0 ); - else if( CROSSED(900) ) SCREENMAN->SendMessageToTopScreen( SM_900Combo, 0 ); - else if( CROSSED(1000)) SCREENMAN->SendMessageToTopScreen( SM_1000Combo, 0 ); - - // new max combo - m_iMaxCombo = max(m_iMaxCombo, m_iCurCombo); - - - if( m_iCurCombo >= (int)SHOW_COMBO_AT ) - { - m_textComboNumber.SetDiffuse( RageColor(1,1,1,1) ); // visible - m_sprCombo.SetDiffuse( RageColor(1,1,1,1) ); // visible - - m_textComboNumber.SetText( ssprintf("%d", m_iCurCombo) ); - float fNumberZoom = SCALE(m_iCurCombo,0.f,(float)NUMBER_MAX_ZOOM_AT,(float)NUMBER_MIN_ZOOM,(float)NUMBER_MAX_ZOOM); - CLAMP( fNumberZoom, (float)NUMBER_MIN_ZOOM, (float)NUMBER_MAX_ZOOM ); - m_textComboNumber.SetZoom( fNumberZoom * (float)PULSE_ZOOM ); - m_textComboNumber.BeginTweening( C_TWEEN_SECONDS ); - m_textComboNumber.SetTweenZoom( fNumberZoom ); - - m_sprCombo.SetZoom( PULSE_ZOOM ); - m_sprCombo.BeginTweening( C_TWEEN_SECONDS ); - m_sprCombo.SetTweenZoom( 1 ); - } - else - { - m_textComboNumber.SetDiffuse( RageColor(1,1,1,0) ); // invisible - m_sprCombo.SetDiffuse( RageColor(1,1,1,0) ); // invisible - } - - } - break; - case TNS_GOOD: - case TNS_BOO: - case TNS_MISS: - { - // don't play "combo stopped" in battle - switch( GAMESTATE->m_PlayMode ) - { - case PLAY_MODE_BATTLE: - if( pInventory ) - pInventory->OnComboBroken( m_PlayerNumber, m_iCurCombo ); - default: - if( m_iCurCombo>50 ) - SCREENMAN->SendMessageToTopScreen( SM_ComboStopped, 0 ); - } - - m_iCurCombo = 0; - - m_textComboNumber.SetDiffuse( RageColor(1,1,1,0) ); // invisible - m_sprCombo.SetDiffuse( RageColor(1,1,1,0) ); // invisible - } - break; - default: - ASSERT(0); + m_textComboNumber.SetDiffuse( RageColor(1,1,1,0) ); // invisible + m_sprCombo.SetDiffuse( RageColor(1,1,1,0) ); // invisible } } diff --git a/stepmania/src/Combo.h b/stepmania/src/Combo.h index 1b82e20f48..9f709cd491 100644 --- a/stepmania/src/Combo.h +++ b/stepmania/src/Combo.h @@ -26,19 +26,11 @@ public: void Init( PlayerNumber pn ) { m_PlayerNumber = pn; } - void SetScore( TapNoteScore score, int iNumNotesInThisRow, Inventory* pInventory ); - - int GetCurrentCombo() const { return m_iCurCombo; } - int GetMaxCombo() const { return m_iMaxCombo; } - void Reset(); + void SetCombo( int iCombo ); protected: PlayerNumber m_PlayerNumber; - int m_iCurCombo; - int m_iMaxCombo; - int m_iCurComboOfPerfects; - Sprite m_sprCombo; BitmapText m_textComboNumber; }; diff --git a/stepmania/src/Player.cpp b/stepmania/src/Player.cpp index f47a63c932..ea892caeb1 100644 --- a/stepmania/src/Player.cpp +++ b/stepmania/src/Player.cpp @@ -61,11 +61,6 @@ Player::Player() this->AddChild( &m_HoldJudgment[c] ); } -int Player::GetPlayersMaxCombo() -{ - return( m_Combo.GetMaxCombo() ); -} - Player::~Player() { } @@ -490,7 +485,10 @@ void Player::OnRowDestroyed( TapNoteScore lastScore, int iIndexThatWasSteppedOn case TNS_GREAT: case TNS_PERFECT: case TNS_MARVELOUS: - m_GhostArrowRow.TapNote( c, score, m_Combo.GetCurrentCombo()>(int)BRIGHT_GHOST_COMBO_THRESHOLD); + { + bool bBright = GAMESTATE->m_CurStageStats.iCurCombo[m_PlayerNumber]>(int)BRIGHT_GHOST_COMBO_THRESHOLD; + m_GhostArrowRow.TapNote( c, score, bBright ); + } break; } } @@ -499,8 +497,7 @@ void Player::OnRowDestroyed( TapNoteScore lastScore, int iIndexThatWasSteppedOn if( iNumNotesInThisRow > 0 ) { HandleTapRowScore( score, iNumNotesInThisRow ); // update score - m_Combo.SetScore( score, iNumNotesInThisRow, m_pInventory ); - GAMESTATE->m_CurStageStats.iMaxCombo[m_PlayerNumber] = max( GAMESTATE->m_CurStageStats.iMaxCombo[m_PlayerNumber], m_Combo.GetCurrentCombo() ); + m_Combo.SetCombo( GAMESTATE->m_CurStageStats.iCurCombo[m_PlayerNumber] ); } m_Judgment.SetJudgment( score ); @@ -541,7 +538,7 @@ int Player::UpdateTapNotesMissedOlderThan( float fMissIfOlderThanSeconds ) if( iNumMissesThisRow > 0 ) { HandleTapRowScore( TNS_MISS, iNumMissesThisRow ); - m_Combo.SetScore( TNS_MISS, iNumMissesThisRow, m_pInventory ); + m_Combo.SetCombo( GAMESTATE->m_CurStageStats.iCurCombo[m_PlayerNumber] ); } } @@ -580,7 +577,7 @@ void Player::HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow ) #endif //DEBUG if(m_pScoreKeeper) - m_pScoreKeeper->HandleTapRowScore(scoreOfLastTap, iNumTapsInRow); + m_pScoreKeeper->HandleTapRowScore(scoreOfLastTap, iNumTapsInRow, m_pInventory); if (m_pScore) m_pScore->SetScore(GAMESTATE->m_CurStageStats.fScore[m_PlayerNumber]); diff --git a/stepmania/src/Player.h b/stepmania/src/Player.h index f55b2ea1a7..7e250b9f33 100644 --- a/stepmania/src/Player.h +++ b/stepmania/src/Player.h @@ -48,7 +48,6 @@ public: void Load( PlayerNumber player_no, NoteData* pNoteData, LifeMeter* pLM, ScoreDisplay* pScore, Inventory* pInventory, ScoreKeeper* pScoreKeeper ); void CrossedRow( int iNoteRow ); void Step( int col ); - int GetPlayersMaxCombo(); void FadeToFail(); diff --git a/stepmania/src/ScoreDisplayOni.cpp b/stepmania/src/ScoreDisplayOni.cpp index 94bb1a03d5..38ed621dd6 100644 --- a/stepmania/src/ScoreDisplayOni.cpp +++ b/stepmania/src/ScoreDisplayOni.cpp @@ -24,7 +24,7 @@ ScoreDisplayOni::ScoreDisplayOni() LOG->Trace( "ScoreDisplayOni::ScoreDisplayOni()" ); // init the text - m_text.LoadFromNumbers( THEME->GetPathTo("Numbers","gameplay score numbers") ); + m_text.LoadFromNumbers( THEME->GetPathTo("Numbers","ScoreDisplayOni numbers") ); m_text.EnableShadow( false ); this->AddChild( &m_text ); } diff --git a/stepmania/src/ScoreKeeper.h b/stepmania/src/ScoreKeeper.h index 7fd1136b1b..08828efd3b 100644 --- a/stepmania/src/ScoreKeeper.h +++ b/stepmania/src/ScoreKeeper.h @@ -22,6 +22,8 @@ #include "PlayerNumber.h" #include "GameConstantsAndTypes.h" // for TapNoteScore and HoldNoteScore class NoteData; +class Inventory; + class ScoreKeeper: public Actor { @@ -38,7 +40,7 @@ public: ScoreKeeper(PlayerNumber pn) { m_PlayerNumber=pn; } virtual void DrawPrimitives() { } - virtual void HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow ) = 0; + virtual void HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow, Inventory* pInventory ) = 0; virtual void HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tapScore ) = 0; virtual int TapNoteScoreToDancePoints( TapNoteScore tns ) = 0; diff --git a/stepmania/src/ScoreKeeperMAX2.cpp b/stepmania/src/ScoreKeeperMAX2.cpp index e957701d9c..8c2e210bcf 100644 --- a/stepmania/src/ScoreKeeperMAX2.cpp +++ b/stepmania/src/ScoreKeeperMAX2.cpp @@ -13,31 +13,43 @@ #include "GameState.h" #include "PrefsManager.h" #include "Notes.h" +#include "PrefsManager.h" +#include "ScreenManager.h" +#include "ScreenGameplay.h" +#include "GameState.h" + ScoreKeeperMAX2::ScoreKeeperMAX2(Notes *notes, PlayerNumber pn_): ScoreKeeper(pn_) { -// Stats_DoublesCount = true; + if( notes ) + { + NoteData noteData; + notes->GetNoteData( ¬eData ); - NoteData noteData; - notes->GetNoteData( ¬eData ); + int Meter = notes->GetMeter(); + Meter = min(Meter, 10); - int Meter = notes? notes->GetMeter() : 5; - Meter = min(Meter, 10); + int N = noteData.GetNumRowsWithTaps() + noteData.GetNumHoldNotes(); + + int sum = (N * (N + 1)) / 2; - int N = noteData.GetNumRowsWithTaps() + noteData.GetNumHoldNotes(); - - int sum = (N * (N + 1)) / 2; + if(sum) + m_fScoreMultiplier = float(Meter * 1000000) / sum; + else /* avoid div/0 on empty songs */ + m_fScoreMultiplier = 0.f; - if(sum) - m_fScoreMultiplier = float(Meter * 1000000) / sum; - else /* avoid div/0 on empty songs */ + ASSERT(m_fScoreMultiplier >= 0.0); + } + else + { + ASSERT( GAMESTATE->IsCourseMode() ); m_fScoreMultiplier = 0.f; - - ASSERT(m_fScoreMultiplier >= 0.0); + } m_iTapNotesHit = 0; m_lScore = 0; + m_iCurToastyCombo = 0; } void ScoreKeeperMAX2::AddScore( TapNoteScore score ) @@ -59,7 +71,7 @@ void ScoreKeeperMAX2::AddScore( TapNoteScore score ) GAMESTATE->m_CurStageStats.fScore[m_PlayerNumber] = m_lScore * m_fScoreMultiplier; } -void ScoreKeeperMAX2::HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow ) +void ScoreKeeperMAX2::HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow, Inventory* pInventory ) { ASSERT( iNumTapsInRow >= 1 ); @@ -106,6 +118,99 @@ void ScoreKeeperMAX2::HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTa */ // for( int i=0; im_bAutoPlay && !GAMESTATE->m_bDemonstrationOrJukebox ) // cheaters never prosper + { + m_iCurComboOfPerfects = 0; + return; + } +#endif //DEBUG + + // combo of marvelous/perfect + switch( scoreOfLastTap ) + { + case TNS_MARVELOUS: + case TNS_PERFECT: + m_iCurToastyCombo += iNumTapsInRow; + + if( m_iCurToastyCombo==250 && !GAMESTATE->m_bDemonstrationOrJukebox ) + SCREENMAN->SendMessageToTopScreen( SM_PlayToasty, 0 ); + break; + default: + m_iCurToastyCombo = 0; + break; + } + + + int &iCurCombo = GAMESTATE->m_CurStageStats.iCurCombo[m_PlayerNumber]; + + switch( scoreOfLastTap ) + { + case TNS_MARVELOUS: + case TNS_PERFECT: + case TNS_GREAT: + { + int iOldCombo = iCurCombo; + + if( GAMESTATE->IsCourseMode() ) + { + switch( scoreOfLastTap ) + { + case TNS_MARVELOUS: + case TNS_PERFECT: + iCurCombo += iNumTapsInRow; + break; + case TNS_GREAT: + int aosid = 4; + break; + } + } + else + iCurCombo += iNumTapsInRow; + + #define CROSSED( i ) (iOldComboSendMessageToTopScreen( SM_100Combo, 0 ); + else if( CROSSED(200) ) SCREENMAN->SendMessageToTopScreen( SM_200Combo, 0 ); + else if( CROSSED(300) ) SCREENMAN->SendMessageToTopScreen( SM_300Combo, 0 ); + else if( CROSSED(400) ) SCREENMAN->SendMessageToTopScreen( SM_400Combo, 0 ); + else if( CROSSED(500) ) SCREENMAN->SendMessageToTopScreen( SM_500Combo, 0 ); + else if( CROSSED(600) ) SCREENMAN->SendMessageToTopScreen( SM_600Combo, 0 ); + else if( CROSSED(700) ) SCREENMAN->SendMessageToTopScreen( SM_700Combo, 0 ); + else if( CROSSED(800) ) SCREENMAN->SendMessageToTopScreen( SM_800Combo, 0 ); + else if( CROSSED(900) ) SCREENMAN->SendMessageToTopScreen( SM_900Combo, 0 ); + else if( CROSSED(1000)) SCREENMAN->SendMessageToTopScreen( SM_1000Combo, 0 ); + + // new max combo + GAMESTATE->m_CurStageStats.iMaxCombo[m_PlayerNumber] = max(GAMESTATE->m_CurStageStats.iMaxCombo[m_PlayerNumber], iCurCombo); + } + break; + case TNS_GOOD: + case TNS_BOO: + case TNS_MISS: + { + // don't play "combo stopped" in battle + switch( GAMESTATE->m_PlayMode ) + { + case PLAY_MODE_BATTLE: + if( pInventory ) + pInventory->OnComboBroken( m_PlayerNumber, iCurCombo ); + default: + if( iCurCombo>50 ) + SCREENMAN->SendMessageToTopScreen( SM_ComboStopped, 0 ); + } + + iCurCombo = 0; + } + break; + default: + ASSERT(0); + } } diff --git a/stepmania/src/ScoreKeeperMAX2.h b/stepmania/src/ScoreKeeperMAX2.h index aa2c355454..82382bc9ae 100644 --- a/stepmania/src/ScoreKeeperMAX2.h +++ b/stepmania/src/ScoreKeeperMAX2.h @@ -22,12 +22,14 @@ class ScoreKeeperMAX2: public ScoreKeeper float m_fScoreMultiplier; int m_iTapNotesHit; // number of notes judged so far, needed by scoring + int m_iCurToastyCombo; + void AddScore( TapNoteScore score ); public: ScoreKeeperMAX2(Notes *notes, PlayerNumber pn); - void HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow ); + void HandleTapRowScore( TapNoteScore scoreOfLastTap, int iNumTapsInRow, Inventory* pInventory ); void HandleHoldScore( HoldNoteScore holdScore, TapNoteScore tapScore ); int TapNoteScoreToDancePoints( TapNoteScore tns ); diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index d1172c65a3..523bcf3e74 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -175,7 +175,7 @@ ScreenGameplay::ScreenGameplay( bool bDemonstration ) { iTotalMeter += m_apCourseNotes[i]->GetMeter(); m_apCourseNotes[i]->GetNoteData( ¬edata ); - iTotalPossibleDancePoints += m_pScoreKeeper[p]->GetPossibleDancePoints( ¬edata ); + iTotalPossibleDancePoints += m_pScoreKeeper[GAMESTATE->m_MasterPlayerNumber]->GetPossibleDancePoints( ¬edata ); } GAMESTATE->m_CurStageStats.pSong = NULL; @@ -346,7 +346,7 @@ ScreenGameplay::ScreenGameplay( bool bDemonstration ) m_MaxCombo.LoadFromNumbers( THEME->GetPathTo("Numbers","ScreenGameplay max combo numbers") ); m_MaxCombo.SetXY( MAXCOMBO_X, MAXCOMBO_Y ); m_MaxCombo.SetZoom( MAXCOMBO_ZOOM ); - m_MaxCombo.SetText( ssprintf("%d", m_Player[GAMESTATE->m_MasterPlayerNumber].GetPlayersMaxCombo()) ); /* MAKE THIS WORK FOR BOTH PLAYERS! */ + m_MaxCombo.SetText( ssprintf("%d", GAMESTATE->m_CurStageStats.iCurCombo[GAMESTATE->m_MasterPlayerNumber]) ); /* TODO: Make this work for both players */ this->AddChild( &m_MaxCombo ); for( p=0; pm_MasterPlayerNumber != PLAYER_INVALID ) - m_MaxCombo.SetText( ssprintf("%d", m_Player[GAMESTATE->m_MasterPlayerNumber].GetPlayersMaxCombo()) ); /* MAKE THIS WORK FOR BOTH PLAYERS! */ + m_MaxCombo.SetText( ssprintf("%d", GAMESTATE->m_CurStageStats.iCurCombo[GAMESTATE->m_MasterPlayerNumber]) ); /* MAKE THIS WORK FOR BOTH PLAYERS! */ //LOG->Trace( "m_fOffsetInBeats = %f, m_fBeatsPerSecond = %f, m_Music.GetPositionSeconds = %f", m_fOffsetInBeats, m_fBeatsPerSecond, m_Music.GetPositionSeconds() ); diff --git a/stepmania/src/ScreenSelectCourse.cpp b/stepmania/src/ScreenSelectCourse.cpp index f451b5f5a2..74e270a460 100644 --- a/stepmania/src/ScreenSelectCourse.cpp +++ b/stepmania/src/ScreenSelectCourse.cpp @@ -121,7 +121,7 @@ ScreenSelectCourse::ScreenSelectCourse() m_sprOptionsMessage.SetXY( CENTER_X, CENTER_Y ); m_sprOptionsMessage.SetZoomY( 0 ); m_sprOptionsMessage.SetDiffuse( RageColor(1,1,1,0) ); - this->AddChild( &m_sprOptionsMessage ); +// this->AddChild( &m_sprOptionsMessage ); // draw and update manually m_soundSelect.Load( THEME->GetPathTo("Sounds","Common start") ); @@ -151,6 +151,13 @@ void ScreenSelectCourse::DrawPrimitives() m_Menu.DrawBottomLayer(); Screen::DrawPrimitives(); m_Menu.DrawTopLayer(); + m_sprOptionsMessage.Draw(); +} + +void ScreenSelectCourse::Update( float fDelta ) +{ + Screen::Update( fDelta ); + m_sprOptionsMessage.Update( fDelta ); } void ScreenSelectCourse::TweenOnScreen() @@ -338,16 +345,24 @@ void ScreenSelectCourse::MenuStart( PlayerNumber pn ) m_bMadeChoice = true; + float fShowSeconds = m_Menu.m_Out.GetLengthSeconds(); + // show "hold START for options" m_sprOptionsMessage.SetDiffuse( RageColor(1,1,1,0) ); - m_sprOptionsMessage.BeginTweening( 0.25f ); // fade in + m_sprOptionsMessage.BeginTweening( 0.15f ); // fade in m_sprOptionsMessage.SetTweenZoomY( 1 ); m_sprOptionsMessage.SetTweenDiffuse( RageColor(1,1,1,1) ); - m_sprOptionsMessage.BeginTweening( 2.0f ); // sleep - m_sprOptionsMessage.BeginTweening( 0.25f ); // fade out + m_sprOptionsMessage.BeginTweening( fShowSeconds-0.35f ); // sleep + m_sprOptionsMessage.BeginTweening( 0.15f ); // fade out m_sprOptionsMessage.SetTweenDiffuse( RageColor(1,1,1,0) ); m_sprOptionsMessage.SetTweenZoomY( 0 ); - this->SendScreenMessage( SM_AllowOptionsMenuRepeat, 0.75f ); + + /* Don't accept a held START for a little while, so it's not + * hit accidentally. Accept an initial START right away, though, + * so we don't ignore deliberate fast presses (which would be + * annoying). */ + this->SendScreenMessage( SM_AllowOptionsMenuRepeat, 0.5f ); + m_Menu.StartTransitioning( SM_GoToNextScreen ); diff --git a/stepmania/src/ScreenSelectCourse.h b/stepmania/src/ScreenSelectCourse.h index 2f7d43bb49..a77b2cfcad 100644 --- a/stepmania/src/ScreenSelectCourse.h +++ b/stepmania/src/ScreenSelectCourse.h @@ -27,6 +27,7 @@ public: virtual ~ScreenSelectCourse(); virtual void DrawPrimitives(); + virtual void Update( float fDelta ); virtual void Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI ); virtual void HandleScreenMessage( const ScreenMessage SM ); diff --git a/stepmania/src/ScreenSelectMusic.cpp b/stepmania/src/ScreenSelectMusic.cpp index 94f0772c0b..ee77cb7548 100644 --- a/stepmania/src/ScreenSelectMusic.cpp +++ b/stepmania/src/ScreenSelectMusic.cpp @@ -219,7 +219,7 @@ ScreenSelectMusic::ScreenSelectMusic() m_sprLongBalloon.SetEffectBob( 2, RageVector3(0,10,0) ); this->AddChild( &m_sprLongBalloon ); - m_sprOptionsMessage.Load( THEME->GetPathTo("Graphics","ScreenSelectMusic options") ); + m_sprOptionsMessage.Load( THEME->GetPathTo("Graphics","ScreenSelectMusic options message 1x2") ); m_sprOptionsMessage.StopAnimating(); m_sprOptionsMessage.SetXY( CENTER_X, CENTER_Y ); m_sprOptionsMessage.SetZoom( 1 ); @@ -228,7 +228,7 @@ ScreenSelectMusic::ScreenSelectMusic() m_soundSelect.Load( THEME->GetPathTo("Sounds","Common start") ); - m_soundChangeNotes.Load( THEME->GetPathTo("Sounds","ScreenSelectMusic notes") ); + m_soundChangeNotes.Load( THEME->GetPathTo("Sounds","ScreenSelectMusic difficulty") ); m_soundOptionsChange.Load( THEME->GetPathTo("Sounds","ScreenSelectMusic options") ); m_soundLocked.Load( THEME->GetPathTo("Sounds","ScreenSelectMusic locked") ); diff --git a/stepmania/src/StageStats.cpp b/stepmania/src/StageStats.cpp index 1ef6a15d59..c1dd37e779 100644 --- a/stepmania/src/StageStats.cpp +++ b/stepmania/src/StageStats.cpp @@ -37,6 +37,7 @@ void StageStats::operator+=( const StageStats& other ) iTapNoteScores[p][t] += other.iTapNoteScores[p][t]; for( int h=0; h