send message on beat crossed

This commit is contained in:
Chris Danford
2005-05-01 22:59:00 +00:00
parent 0eff412ab0
commit f858e3a5b6
8 changed files with 77 additions and 41 deletions
+6
View File
@@ -1053,6 +1053,12 @@ void Actor::SubscribeToMessage( const CString &sMessageName )
m_vsSubscribedTo.push_back( 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 * (c) 2001-2004 Chris Danford
* All rights reserved. * All rights reserved.
+2 -1
View File
@@ -349,7 +349,6 @@ public:
virtual void RunCommands2( const LuaReference& cmds, Actor *pParent ); virtual void RunCommands2( const LuaReference& cmds, Actor *pParent );
void RunCommands( const apActorCommands& cmds ) { this->RunCommands( *cmds ); } // convenience void RunCommands( const apActorCommands& cmds ) { this->RunCommands( *cmds ); } // convenience
void RunCommands2( const apActorCommands& cmds, Actor *pParent ) { this->RunCommands2( *cmds, pParent ); } // 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 LuaReference& cmds );
static float GetCommandsLengthSeconds( const apActorCommands& cmds ) { return GetCommandsLengthSeconds( *cmds ); } // convenience static float GetCommandsLengthSeconds( const apActorCommands& cmds ) { return GetCommandsLengthSeconds( *cmds ); } // convenience
@@ -357,6 +356,8 @@ public:
// //
// Messages // Messages
// //
void SubscribeToMessage( Message message ); // will automatically unsubscribe
void SubscribeToMessage( const CString &sMessageName ); // will automatically unsubscribe
virtual void HandleMessage( const CString& sMessage ); virtual void HandleMessage( const CString& sMessage );
+13 -7
View File
@@ -5,17 +5,23 @@
#include "GameState.h" #include "GameState.h"
#include "song.h" #include "song.h"
#include "Command.h" #include "Command.h"
#include "PlayerState.h"
Combo::Combo() Combo::Combo()
{ {
m_iLastSeenCombo = -1; 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 ASSERT( m_SubActors.empty() ); // don't load twice
m_PlayerNumber = pn; m_pPlayerState = pPlayerState;
m_pPlayerStageStats = pPlayerStageStats;
SHOW_COMBO_AT .Load(m_sName,"ShowComboAt"); SHOW_COMBO_AT .Load(m_sName,"ShowComboAt");
LABEL_X .Load(m_sName,"LabelX"); LABEL_X .Load(m_sName,"LabelX");
@@ -90,8 +96,8 @@ void Combo::SetCombo( int iCombo, int iMisses )
m_textNumber.SetHidden( false ); m_textNumber.SetHidden( false );
CString txt = ssprintf("%d", iNum); 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 ); m_textNumber.SetText( txt );
float fNumberZoom = SCALE(iNum,0.f,(float)NUMBER_MAX_ZOOM_AT,(float)NUMBER_MIN_ZOOM,(float)NUMBER_MAX_ZOOM); 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( bPastMidpoint )
{ {
if( STATSMAN->m_CurStageStats.m_player[m_PlayerNumber].FullComboOfScore(TNS_MARVELOUS) ) if( m_pPlayerStageStats->FullComboOfScore(TNS_MARVELOUS) )
{ {
sprLabel->RunCommands( FULL_COMBO_MARVELOUSES_COMMAND ); sprLabel->RunCommands( FULL_COMBO_MARVELOUSES_COMMAND );
m_textNumber.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 ); sprLabel->RunCommands( FULL_COMBO_PERFECTS_COMMAND );
m_textNumber.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 ); sprLabel->RunCommands( FULL_COMBO_GREATS_COMMAND );
m_textNumber.RunCommands( FULL_COMBO_GREATS_COMMAND ); m_textNumber.RunCommands( FULL_COMBO_GREATS_COMMAND );
+5 -3
View File
@@ -8,14 +8,15 @@
#include "BitmapText.h" #include "BitmapText.h"
#include "PlayerNumber.h" #include "PlayerNumber.h"
#include "ThemeMetric.h" #include "ThemeMetric.h"
struct PlayerState;
struct PlayerStageStats;
class Combo : public ActorFrame class Combo : public ActorFrame
{ {
public: public:
Combo(); Combo();
void Load( PlayerNumber pn ); void Load( PlayerState *pPlayerState, PlayerStageStats *pPlayerStageStats );
void SetCombo( int iCombo, int iMisses ); void SetCombo( int iCombo, int iMisses );
@@ -38,7 +39,8 @@ protected:
ThemeMetric<apActorCommands> FULL_COMBO_BROKEN_COMMAND; ThemeMetric<apActorCommands> FULL_COMBO_BROKEN_COMMAND;
ThemeMetric<bool> SHOW_MISS_COMBO; ThemeMetric<bool> SHOW_MISS_COMBO;
PlayerNumber m_PlayerNumber; PlayerState *m_pPlayerState;
PlayerStageStats *m_pPlayerStageStats;
AutoActor m_sprMilestone; AutoActor m_sprMilestone;
AutoActor m_sprComboLabel; AutoActor m_sprComboLabel;
+1
View File
@@ -27,6 +27,7 @@ static const CString MessageNames[NUM_MESSAGES] = {
"NoteWillCrossIn1500Ms", "NoteWillCrossIn1500Ms",
"CardRemovedP1", "CardRemovedP1",
"CardRemovedP2", "CardRemovedP2",
"BeatCrossed",
}; };
XToString( Message, NUM_MESSAGES ); XToString( Message, NUM_MESSAGES );
+1
View File
@@ -34,6 +34,7 @@ enum Message
MESSAGE_NOTE_WILL_CROSS_IN_1500MS, MESSAGE_NOTE_WILL_CROSS_IN_1500MS,
MESSAGE_CARD_REMOVED_P1, MESSAGE_CARD_REMOVED_P1,
MESSAGE_CARD_REMOVED_P2, MESSAGE_CARD_REMOVED_P2,
MESSAGE_BEAT_CROSSED,
NUM_MESSAGES, NUM_MESSAGES,
MESSAGE_INVALID MESSAGE_INVALID
}; };
+1 -1
View File
@@ -165,7 +165,7 @@ void Player::Init(
m_soundAttackEnding.SetParams( p ); m_soundAttackEnding.SetParams( p );
m_Combo.SetName( "Combo" ); m_Combo.SetName( "Combo" );
m_Combo.Load( pn ); m_Combo.Load( m_pPlayerState, m_pPlayerStageStats );
ActorUtil::OnCommand( m_Combo, sType ); ActorUtil::OnCommand( m_Combo, sType );
m_Judgment.SetName( "Judgment" ); m_Judgment.SetName( "Judgment" );
+48 -29
View File
@@ -1706,47 +1706,66 @@ void ScreenGameplay::UpdateLights()
void ScreenGameplay::SendCrossedMessages() 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 ) static int iRowLastCrossed = 0;
{
pn = p;
break;
}
}
if( pn == PLAYER_INVALID )
return;
NoteData &nd = m_Player[pn].m_NoteData; float fPositionSeconds = GAMESTATE->m_fMusicSeconds;
static int iRowLastCrossedAll[NUM_MESSAGES_TO_SEND] = { 0, 0, 0, 0 };
for( int i=0; i<NUM_MESSAGES_TO_SEND; i++ )
{
float fOffsetFromCurrentSeconds = MESSAGE_SPACING_SECONDS * i;
float fPositionSeconds = GAMESTATE->m_fMusicSeconds + fOffsetFromCurrentSeconds; // trigger the light a tiny bit early
float fSongBeat = GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds ); float fSongBeat = GAMESTATE->m_pCurSong->GetBeatFromElapsedTime( fPositionSeconds );
int iRowNow = BeatToNoteRowNotRounded( fSongBeat ); int iRowNow = BeatToNoteRowNotRounded( fSongBeat );
iRowNow = max( 0, iRowNow ); 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) ) if( GetNoteType( r ) == NOTE_TYPE_4TH )
{ MESSAGEMAN->Broadcast( MESSAGE_BEAT_CROSSED );
LOG->Trace( "r = %d", r );
MESSAGEMAN->Broadcast( (Message)(MESSAGE_NOTE_CROSSED + i) );
break;
}
} }
iRowLastCrossed = iRowNow; 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; i<NUM_MESSAGES_TO_SEND; i++ )
{
float fOffsetFromCurrentSeconds = MESSAGE_SPACING_SECONDS * i;
float fPositionSeconds = GAMESTATE->m_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() void ScreenGameplay::BackOutFromGameplay()