From f858e3a5b632cfb96590cb16d99941c8c6b40923 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Sun, 1 May 2005 22:59:00 +0000 Subject: [PATCH] send message on beat crossed --- stepmania/src/Actor.cpp | 6 +++ stepmania/src/Actor.h | 3 +- stepmania/src/Combo.cpp | 20 ++++++--- stepmania/src/Combo.h | 8 ++-- stepmania/src/MessageManager.cpp | 1 + stepmania/src/MessageManager.h | 1 + stepmania/src/Player.cpp | 2 +- stepmania/src/ScreenGameplay.cpp | 77 ++++++++++++++++++++------------ 8 files changed, 77 insertions(+), 41 deletions(-) diff --git a/stepmania/src/Actor.cpp b/stepmania/src/Actor.cpp index 5e718058bb..992e9d80b0 100644 --- a/stepmania/src/Actor.cpp +++ b/stepmania/src/Actor.cpp @@ -1053,6 +1053,12 @@ void Actor::SubscribeToMessage( const CString &sMessageName ) m_vsSubscribedTo.push_back( sMessageName ); } +void Actor::SubscribeToMessage( Message message ) +{ + MESSAGEMAN->Subscribe( this, message ); + m_vsSubscribedTo.push_back( MessageToString(message) ); +} + /* * (c) 2001-2004 Chris Danford * All rights reserved. diff --git a/stepmania/src/Actor.h b/stepmania/src/Actor.h index 60947c5f69..6d87edc9f6 100644 --- a/stepmania/src/Actor.h +++ b/stepmania/src/Actor.h @@ -349,7 +349,6 @@ public: virtual void RunCommands2( const LuaReference& cmds, Actor *pParent ); void RunCommands( const apActorCommands& cmds ) { this->RunCommands( *cmds ); } // convenience void RunCommands2( const apActorCommands& cmds, Actor *pParent ) { this->RunCommands2( *cmds, pParent ); } // convenience - void SubscribeToMessage( const CString &sMessageName ); // will automatically unsubscribe static float GetCommandsLengthSeconds( const LuaReference& cmds ); static float GetCommandsLengthSeconds( const apActorCommands& cmds ) { return GetCommandsLengthSeconds( *cmds ); } // convenience @@ -357,6 +356,8 @@ public: // // Messages // + void SubscribeToMessage( Message message ); // will automatically unsubscribe + void SubscribeToMessage( const CString &sMessageName ); // will automatically unsubscribe virtual void HandleMessage( const CString& sMessage ); diff --git a/stepmania/src/Combo.cpp b/stepmania/src/Combo.cpp index ccb18e19ea..75c0a98974 100644 --- a/stepmania/src/Combo.cpp +++ b/stepmania/src/Combo.cpp @@ -5,17 +5,23 @@ #include "GameState.h" #include "song.h" #include "Command.h" +#include "PlayerState.h" Combo::Combo() { m_iLastSeenCombo = -1; + m_pPlayerState = NULL; + m_pPlayerStageStats = NULL; + + this->SubscribeToMessage( MESSAGE_BEAT_CROSSED ); } -void Combo::Load( PlayerNumber pn ) +void Combo::Load( PlayerState *pPlayerState, PlayerStageStats *pPlayerStageStats ) { ASSERT( m_SubActors.empty() ); // don't load twice - m_PlayerNumber = pn; + m_pPlayerState = pPlayerState; + m_pPlayerStageStats = pPlayerStageStats; SHOW_COMBO_AT .Load(m_sName,"ShowComboAt"); LABEL_X .Load(m_sName,"LabelX"); @@ -90,8 +96,8 @@ void Combo::SetCombo( int iCombo, int iMisses ) m_textNumber.SetHidden( false ); CString txt = ssprintf("%d", iNum); - /* Don't do anything if it's not changing. */ - if(m_textNumber.GetText() == txt) return; + + // Do pulse even if the number isn't changing. m_textNumber.SetText( txt ); float fNumberZoom = SCALE(iNum,0.f,(float)NUMBER_MAX_ZOOM_AT,(float)NUMBER_MIN_ZOOM,(float)NUMBER_MAX_ZOOM); @@ -114,17 +120,17 @@ void Combo::SetCombo( int iCombo, int iMisses ) if( bPastMidpoint ) { - if( STATSMAN->m_CurStageStats.m_player[m_PlayerNumber].FullComboOfScore(TNS_MARVELOUS) ) + if( m_pPlayerStageStats->FullComboOfScore(TNS_MARVELOUS) ) { sprLabel->RunCommands( FULL_COMBO_MARVELOUSES_COMMAND ); m_textNumber.RunCommands( FULL_COMBO_MARVELOUSES_COMMAND ); } - else if( bPastMidpoint && STATSMAN->m_CurStageStats.m_player[m_PlayerNumber].FullComboOfScore(TNS_PERFECT) ) + else if( bPastMidpoint && m_pPlayerStageStats->FullComboOfScore(TNS_PERFECT) ) { sprLabel->RunCommands( FULL_COMBO_PERFECTS_COMMAND ); m_textNumber.RunCommands( FULL_COMBO_PERFECTS_COMMAND ); } - else if( bPastMidpoint && STATSMAN->m_CurStageStats.m_player[m_PlayerNumber].FullComboOfScore(TNS_GREAT) ) + else if( bPastMidpoint && m_pPlayerStageStats->FullComboOfScore(TNS_GREAT) ) { sprLabel->RunCommands( FULL_COMBO_GREATS_COMMAND ); m_textNumber.RunCommands( FULL_COMBO_GREATS_COMMAND ); diff --git a/stepmania/src/Combo.h b/stepmania/src/Combo.h index fc6069634a..cef0e0726f 100644 --- a/stepmania/src/Combo.h +++ b/stepmania/src/Combo.h @@ -8,14 +8,15 @@ #include "BitmapText.h" #include "PlayerNumber.h" #include "ThemeMetric.h" - +struct PlayerState; +struct PlayerStageStats; class Combo : public ActorFrame { public: Combo(); - void Load( PlayerNumber pn ); + void Load( PlayerState *pPlayerState, PlayerStageStats *pPlayerStageStats ); void SetCombo( int iCombo, int iMisses ); @@ -38,7 +39,8 @@ protected: ThemeMetric FULL_COMBO_BROKEN_COMMAND; ThemeMetric SHOW_MISS_COMBO; - PlayerNumber m_PlayerNumber; + PlayerState *m_pPlayerState; + PlayerStageStats *m_pPlayerStageStats; AutoActor m_sprMilestone; AutoActor m_sprComboLabel; diff --git a/stepmania/src/MessageManager.cpp b/stepmania/src/MessageManager.cpp index 84f35bb652..b7111b4b85 100644 --- a/stepmania/src/MessageManager.cpp +++ b/stepmania/src/MessageManager.cpp @@ -27,6 +27,7 @@ static const CString MessageNames[NUM_MESSAGES] = { "NoteWillCrossIn1500Ms", "CardRemovedP1", "CardRemovedP2", + "BeatCrossed", }; XToString( Message, NUM_MESSAGES ); diff --git a/stepmania/src/MessageManager.h b/stepmania/src/MessageManager.h index b1fe06c2af..6030a1c797 100644 --- a/stepmania/src/MessageManager.h +++ b/stepmania/src/MessageManager.h @@ -34,6 +34,7 @@ enum Message MESSAGE_NOTE_WILL_CROSS_IN_1500MS, MESSAGE_CARD_REMOVED_P1, MESSAGE_CARD_REMOVED_P2, + MESSAGE_BEAT_CROSSED, NUM_MESSAGES, MESSAGE_INVALID }; diff --git a/stepmania/src/Player.cpp b/stepmania/src/Player.cpp index 86aa368b29..17872857ed 100644 --- a/stepmania/src/Player.cpp +++ b/stepmania/src/Player.cpp @@ -165,7 +165,7 @@ void Player::Init( m_soundAttackEnding.SetParams( p ); m_Combo.SetName( "Combo" ); - m_Combo.Load( pn ); + m_Combo.Load( m_pPlayerState, m_pPlayerStageStats ); ActorUtil::OnCommand( m_Combo, sType ); m_Judgment.SetName( "Judgment" ); diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index bea368fce6..b81f09ce1f 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -1706,47 +1706,66 @@ void ScreenGameplay::UpdateLights() void ScreenGameplay::SendCrossedMessages() { - const int NUM_MESSAGES_TO_SEND = 4; - const float MESSAGE_SPACING_SECONDS = 0.5f; - - PlayerNumber pn = PLAYER_INVALID; - FOREACH_EnabledPlayer( p ) { - if( GAMESTATE->m_pCurSteps[p]->GetDifficulty() == DIFFICULTY_BEGINNER ) - { - pn = p; - break; - } - } - if( pn == PLAYER_INVALID ) - return; + static int iRowLastCrossed = 0; - NoteData &nd = m_Player[pn].m_NoteData; - - static int iRowLastCrossedAll[NUM_MESSAGES_TO_SEND] = { 0, 0, 0, 0 }; - for( int i=0; im_fMusicSeconds + fOffsetFromCurrentSeconds; // trigger the light a tiny bit early + float fPositionSeconds = GAMESTATE->m_fMusicSeconds; float fSongBeat = GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ); int iRowNow = BeatToNoteRowNotRounded( fSongBeat ); iRowNow = max( 0, iRowNow ); - int &iRowLastCrossed = iRowLastCrossedAll[i]; - FOREACH_NONEMPTY_ROW_ALL_TRACKS_RANGE( nd, r, iRowLastCrossed+1, iRowNow+1 ) + for( int r=iRowLastCrossed+1; r<=iRowNow; r++ ) { - if( nd.IsThereATapOrHoldHeadAtRow(r) ) - { - LOG->Trace( "r = %d", r ); - MESSAGEMAN->Broadcast( (Message)(MESSAGE_NOTE_CROSSED + i) ); - break; - } + if( GetNoteType( r ) == NOTE_TYPE_4TH ) + MESSAGEMAN->Broadcast( MESSAGE_BEAT_CROSSED ); } iRowLastCrossed = iRowNow; } + + { + const int NUM_MESSAGES_TO_SEND = 4; + const float MESSAGE_SPACING_SECONDS = 0.5f; + + PlayerNumber pn = PLAYER_INVALID; + FOREACH_EnabledPlayer( p ) + { + if( GAMESTATE->m_pCurSteps[p]->GetDifficulty() == DIFFICULTY_BEGINNER ) + { + pn = p; + break; + } + } + if( pn == PLAYER_INVALID ) + return; + + NoteData &nd = m_Player[pn].m_NoteData; + + static int iRowLastCrossedAll[NUM_MESSAGES_TO_SEND] = { 0, 0, 0, 0 }; + for( int i=0; im_fMusicSeconds + fOffsetFromCurrentSeconds; + float fSongBeat = GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ); + + int iRowNow = BeatToNoteRowNotRounded( fSongBeat ); + iRowNow = max( 0, iRowNow ); + int &iRowLastCrossed = iRowLastCrossedAll[i]; + + FOREACH_NONEMPTY_ROW_ALL_TRACKS_RANGE( nd, r, iRowLastCrossed+1, iRowNow+1 ) + { + if( nd.IsThereATapOrHoldHeadAtRow(r) ) + { + MESSAGEMAN->Broadcast( (Message)(MESSAGE_NOTE_CROSSED + i) ); + break; + } + } + + iRowLastCrossed = iRowNow; + } + } } void ScreenGameplay::BackOutFromGameplay()