Files
itgmania212121/stepmania/src/Combo.cpp
T

180 lines
5.7 KiB
C++

#include "global.h"
/*
-----------------------------------------------------------------------------
Class: Combo
Desc: See header.
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
#include "Combo.h"
#include "PrefsManager.h"
#include "ScreenManager.h"
#include "ScreenGameplay.h"
#include "GameState.h"
#include "ThemeManager.h"
CachedThemeMetric LABEL_X ("Combo","LabelX");
CachedThemeMetric LABEL_Y ("Combo","LabelY");
CachedThemeMetric LABEL_HORIZ_ALIGN ("Combo","LabelHorizAlign");
CachedThemeMetric LABEL_VERT_ALIGN ("Combo","LabelVertAlign");
CachedThemeMetric NUMBER_X ("Combo","NumberX");
CachedThemeMetric NUMBER_Y ("Combo","NumberY");
CachedThemeMetric NUMBER_HORIZ_ALIGN ("Combo","NumberHorizAlign");
CachedThemeMetric NUMBER_VERT_ALIGN ("Combo","NumberVertAlign");
CachedThemeMetric SHOW_COMBO_AT ("Combo","ShowComboAt");
CachedThemeMetric NUMBER_MIN_ZOOM ("Combo","NumberMinZoom");
CachedThemeMetric NUMBER_MAX_ZOOM ("Combo","NumberMaxZoom");
CachedThemeMetric NUMBER_MAX_ZOOM_AT ("Combo","NumberMaxZoomAt");
CachedThemeMetric PULSE_ZOOM ("Combo","PulseZoom");
CachedThemeMetric C_TWEEN_SECONDS ("Combo","TweenSeconds");
Combo::Combo()
{
LABEL_X.Refresh();
LABEL_Y.Refresh();
LABEL_HORIZ_ALIGN.Refresh();
LABEL_VERT_ALIGN.Refresh();
NUMBER_X.Refresh();
NUMBER_Y.Refresh();
NUMBER_HORIZ_ALIGN.Refresh();
NUMBER_VERT_ALIGN.Refresh();
SHOW_COMBO_AT.Refresh();
NUMBER_MIN_ZOOM.Refresh();
NUMBER_MAX_ZOOM.Refresh();
NUMBER_MAX_ZOOM_AT.Refresh();
PULSE_ZOOM.Refresh();
C_TWEEN_SECONDS.Refresh();
Reset();
m_sprCombo.Load( THEME->GetPathTo("Graphics", "gameplay combo label") );
m_sprCombo.TurnShadowOn();
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 );
this->AddChild( &m_sprCombo );
m_textComboNumber.LoadFromNumbers( THEME->GetPathTo("Numbers","gameplay combo numbers") );
m_textComboNumber.TurnShadowOn();
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 );
this->AddChild( &m_textComboNumber );
}
void Combo::Reset()
{
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_bDemonstration ) // cheaters never prosper
{
m_iCurCombo = 0;
m_iCurComboOfPerfects = 0;
return;
}
#endif //DEBUG
// combo of marvelous/perfect
switch( score )
{
case TNS_MARVELOUS:
case TNS_PERFECT:
m_iCurComboOfPerfects += iNumNotesInThisRow;
if( rand() < 0.1f && m_iCurComboOfPerfects>=150 && (m_iCurComboOfPerfects%150)==0 && !GAMESTATE->m_bDemonstration )
SCREENMAN->SendMessageToTopScreen( SM_BeginToasty, 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 ) (iOldCombo<i && i<=m_iCurCombo)
if ( CROSSED(100) ) SCREENMAN->SendMessageToTopScreen( 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:
{
// end combo
bool bItemAcquired = false;
if( pInventory )
bItemAcquired = pInventory->OnComboBroken( m_PlayerNumber, m_iCurCombo );
if( !bItemAcquired && m_iCurCombo>50 ) // don't play "combo stopped" if we got an item
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);
}
}