send message on beat crossed
This commit is contained in:
@@ -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.
|
||||||
|
|||||||
@@ -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
@@ -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 );
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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 );
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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" );
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user