cleanup survival elements
This commit is contained in:
+103
-52
@@ -7,12 +7,21 @@
|
||||
#include "ActorUtil.h"
|
||||
#include "Course.h"
|
||||
#include "PrefsManager.h"
|
||||
#include "StreamDisplay.h"
|
||||
|
||||
const float MAX_LIFE_SECONDS = 3*60;
|
||||
const float FULL_LIFE_SECONDS = 3*60;
|
||||
|
||||
static ThemeMetric<float> METER_WIDTH ("LifeMeterTime","MeterWidth");
|
||||
static ThemeMetric<float> METER_HEIGHT ("LifeMeterTime","MeterHeight");
|
||||
static ThemeMetric<float> DANGER_THRESHOLD ("LifeMeterTime","DangerThreshold");
|
||||
static ThemeMetric<int> NUM_CHAMBERS ("LifeMeterTime","NumChambers");
|
||||
static ThemeMetric<int> NUM_STRIPS ("LifeMeterTime","NumStrips");
|
||||
static ThemeMetric<float> INITIAL_VALUE ("LifeMeterTime","InitialValue");
|
||||
|
||||
LifeMeterTime::LifeMeterTime()
|
||||
{
|
||||
m_fLifeRemainingSeconds = 0;
|
||||
m_fLifeTotalGainedSeconds = 0;
|
||||
m_fLifeTotalLostSeconds = 0;
|
||||
}
|
||||
|
||||
void LifeMeterTime::Load( PlayerNumber pn )
|
||||
@@ -23,26 +32,42 @@ void LifeMeterTime::Load( PlayerNumber pn )
|
||||
|
||||
bool bPlayerEnabled = GAMESTATE->IsPlayerEnabled(pn);
|
||||
|
||||
m_sprFrame.Load( THEME->GetPathG(sType,"frame") );
|
||||
m_sprBackground.Load( THEME->GetPathG(sType,"background") );
|
||||
m_sprBackground->SetName( "Background" );
|
||||
m_sprBackground->ZoomToWidth( METER_WIDTH );
|
||||
m_sprBackground->ZoomToHeight( METER_HEIGHT );
|
||||
this->AddChild( m_sprBackground );
|
||||
|
||||
m_quadDangerGlow.ZoomToWidth( METER_WIDTH );
|
||||
m_quadDangerGlow.ZoomToHeight( METER_HEIGHT );
|
||||
m_quadDangerGlow.SetEffectDiffuseShift();
|
||||
m_quadDangerGlow.SetEffectColor1( RageColor(1,0,0,0.8f) );
|
||||
m_quadDangerGlow.SetEffectColor2( RageColor(1,0,0,0) );
|
||||
m_quadDangerGlow.SetEffectClock( Actor::CLOCK_BGM_BEAT );
|
||||
this->AddChild( &m_quadDangerGlow );
|
||||
|
||||
m_pStream = new StreamDisplay;
|
||||
bool bExtra = GAMESTATE->IsExtraStage()||GAMESTATE->IsExtraStage2();
|
||||
CString sExtra = bExtra ? "extra " : "";
|
||||
m_pStream->Load(
|
||||
METER_WIDTH,
|
||||
METER_HEIGHT,
|
||||
NUM_STRIPS,
|
||||
NUM_CHAMBERS,
|
||||
THEME->GetPathG(sType,sExtra+"normal"),
|
||||
THEME->GetPathG(sType,sExtra+"hot"),
|
||||
THEME->GetPathG(sType,sExtra+"passing")
|
||||
);
|
||||
this->AddChild( m_pStream );
|
||||
|
||||
m_sprFrame.Load( THEME->GetPathG(sType,sExtra+"frame") );
|
||||
m_sprFrame->SetName( "Frame" );
|
||||
this->AddChild( m_sprFrame );
|
||||
ActorUtil::OnCommand( m_sprFrame, sType );
|
||||
|
||||
m_textTimeRemaining.LoadFromFont( THEME->GetPathF(sType, "TimeRemaining") );
|
||||
m_textTimeRemaining.SetName( "TimeRemaining" );
|
||||
this->AddChild( &m_textTimeRemaining );
|
||||
ActorUtil::OnCommand( m_textTimeRemaining, sType );
|
||||
|
||||
m_Meter.SetName( "Meter" );
|
||||
m_Meter.Load( THEME->GetPathG(sType,"Stream"), THEME->GetMetricF(sType,"StreamWidth"), THEME->GetPathG(sType,"Tip") );
|
||||
this->AddChild( &m_Meter );
|
||||
ActorUtil::OnCommand( m_Meter, sType );
|
||||
|
||||
FOREACH_TapNoteScore( tns )
|
||||
m_TapCommands[tns] = THEME->GetMetricA( sType, TapNoteScoreToString(tns)+"Command" );
|
||||
m_GainLife = THEME->GetMetricA( sType, "GainLifeCommand" );
|
||||
|
||||
m_soundGainLife.Load( THEME->GetPathS(sType,"GainLife") );
|
||||
|
||||
if( pn == PLAYER_2 )
|
||||
m_pStream->SetZoomX( -1 );
|
||||
}
|
||||
|
||||
void LifeMeterTime::OnLoadSong()
|
||||
@@ -53,54 +78,54 @@ void LifeMeterTime::OnLoadSong()
|
||||
Course* pCourse = GAMESTATE->m_pCurCourse;
|
||||
ASSERT( pCourse );
|
||||
const CourseEntry *pEntry = &pCourse->m_entries[GAMESTATE->GetCourseSongIndex()];
|
||||
m_fLifeRemainingSeconds += pEntry->fGainSeconds;
|
||||
CLAMP( m_fLifeRemainingSeconds, 0, MAX_LIFE_SECONDS );
|
||||
m_fLifeTotalGainedSeconds += pEntry->fGainSeconds;
|
||||
|
||||
m_soundGainLife.Play();
|
||||
|
||||
m_textTimeRemaining.RunCommands( m_GainLife );
|
||||
if( GAMESTATE->GetCourseSongIndex() > 0 )
|
||||
m_soundGainLife.Play();
|
||||
}
|
||||
|
||||
|
||||
void LifeMeterTime::ChangeLife( TapNoteScore score )
|
||||
void LifeMeterTime::ChangeLife( TapNoteScore tns )
|
||||
{
|
||||
if( STATSMAN->m_CurStageStats.m_player[m_PlayerNumber].bFailedEarlier )
|
||||
return;
|
||||
|
||||
switch( score )
|
||||
float fMeterChange = 0;
|
||||
switch( tns )
|
||||
{
|
||||
case TNS_MARVELOUS: m_fLifeRemainingSeconds += PREFSMAN->m_fTimeMeterSecondsChangeMarvelous; break;
|
||||
case TNS_PERFECT: m_fLifeRemainingSeconds += PREFSMAN->m_fTimeMeterSecondsChangePerfect; break;
|
||||
case TNS_GREAT: m_fLifeRemainingSeconds += PREFSMAN->m_fTimeMeterSecondsChangeGreat; break;
|
||||
case TNS_GOOD: m_fLifeRemainingSeconds += PREFSMAN->m_fTimeMeterSecondsChangeGood; break;
|
||||
case TNS_BOO: m_fLifeRemainingSeconds += PREFSMAN->m_fTimeMeterSecondsChangeBoo; break;
|
||||
case TNS_MISS: m_fLifeRemainingSeconds += PREFSMAN->m_fTimeMeterSecondsChangeMiss; break;
|
||||
case TNS_MARVELOUS: fMeterChange = PREFSMAN->m_fTimeMeterSecondsChangeMarvelous; break;
|
||||
case TNS_PERFECT: fMeterChange = PREFSMAN->m_fTimeMeterSecondsChangePerfect; break;
|
||||
case TNS_GREAT: fMeterChange = PREFSMAN->m_fTimeMeterSecondsChangeGreat; break;
|
||||
case TNS_GOOD: fMeterChange = PREFSMAN->m_fTimeMeterSecondsChangeGood; break;
|
||||
case TNS_BOO: fMeterChange = PREFSMAN->m_fTimeMeterSecondsChangeBoo; break;
|
||||
case TNS_MISS: fMeterChange = PREFSMAN->m_fTimeMeterSecondsChangeMiss; break;
|
||||
case TNS_HIT_MINE: fMeterChange = PREFSMAN->m_fTimeMeterSecondsChangeHitMine; break;
|
||||
default: ASSERT(0);
|
||||
}
|
||||
CLAMP( m_fLifeRemainingSeconds, 0, MAX_LIFE_SECONDS );
|
||||
|
||||
m_textTimeRemaining.RunCommands( m_TapCommands[score] );
|
||||
m_fLifeTotalLostSeconds -= fMeterChange;
|
||||
|
||||
if( m_fLifeRemainingSeconds == 0 )
|
||||
if( GetLifeSeconds() <= 0 )
|
||||
STATSMAN->m_CurStageStats.m_player[m_PlayerNumber].bFailedEarlier = true;
|
||||
}
|
||||
|
||||
void LifeMeterTime::ChangeLife( HoldNoteScore score, TapNoteScore tscore )
|
||||
void LifeMeterTime::ChangeLife( HoldNoteScore hns, TapNoteScore tns )
|
||||
{
|
||||
switch( score )
|
||||
{
|
||||
case HNS_OK:
|
||||
break;
|
||||
case HNS_NG:
|
||||
ChangeLife( TNS_MISS ); // NG is the same as a miss
|
||||
break;
|
||||
default:
|
||||
ASSERT(0);
|
||||
}
|
||||
}
|
||||
if( STATSMAN->m_CurStageStats.m_player[m_PlayerNumber].bFailedEarlier )
|
||||
return;
|
||||
|
||||
void LifeMeterTime::ChangeLife( float fDeltaLifePercent )
|
||||
{
|
||||
float fMeterChange = 0;
|
||||
switch( hns )
|
||||
{
|
||||
case HNS_OK: fMeterChange = PREFSMAN->m_fTimeMeterSecondsChangeOK; break;
|
||||
case HNS_NG: fMeterChange = PREFSMAN->m_fTimeMeterSecondsChangeNG; break;
|
||||
default: ASSERT(0);
|
||||
}
|
||||
|
||||
m_fLifeTotalLostSeconds -= fMeterChange;
|
||||
|
||||
if( GetLifeSeconds() <= 0 )
|
||||
STATSMAN->m_CurStageStats.m_player[m_PlayerNumber].bFailedEarlier = true;
|
||||
}
|
||||
|
||||
void LifeMeterTime::OnDancePointsChange()
|
||||
@@ -125,17 +150,43 @@ bool LifeMeterTime::IsFailing() const
|
||||
|
||||
void LifeMeterTime::Update( float fDeltaTime )
|
||||
{
|
||||
LifeMeter::Update( fDeltaTime );
|
||||
// update current stage stats so ScoreDisplayLifeTime can show the right thing
|
||||
float fSecs = GetLifeSeconds();
|
||||
fSecs = max( 0, fSecs );
|
||||
STATSMAN->m_CurStageStats.m_player[m_PlayerNumber].fLifeRemainingSeconds = fSecs;
|
||||
|
||||
m_textTimeRemaining.SetText( SecondsToMMSSMsMs(m_fLifeRemainingSeconds) );
|
||||
m_Meter.SetPercent( m_fLifeRemainingSeconds/MAX_LIFE_SECONDS );
|
||||
LifeMeter::Update( fDeltaTime );
|
||||
|
||||
// TODO
|
||||
m_pStream->SetPercent( GetLife() );
|
||||
m_pStream->SetPassingAlpha( 0 );
|
||||
m_pStream->SetHotAlpha( 0 );
|
||||
|
||||
if( m_pStream->GetTrailingLifePercent() < DANGER_THRESHOLD && !GAMESTATE->IsPlayerDead(m_PlayerNumber) )
|
||||
m_quadDangerGlow.SetDiffuseAlpha( 1 );
|
||||
else
|
||||
m_quadDangerGlow.SetDiffuseAlpha( 0 );
|
||||
}
|
||||
|
||||
float LifeMeterTime::GetLife() const
|
||||
{
|
||||
return m_fLifeRemainingSeconds/MAX_LIFE_SECONDS;
|
||||
float fPercent = GetLifeSeconds() / FULL_LIFE_SECONDS;
|
||||
CLAMP( fPercent, 0, 1 );
|
||||
return fPercent;
|
||||
}
|
||||
|
||||
void LifeMeterTime::ForceFail()
|
||||
{
|
||||
m_fLifeTotalLostSeconds = m_fLifeTotalGainedSeconds + 100;
|
||||
}
|
||||
|
||||
float LifeMeterTime::GetLifeSeconds() const
|
||||
{
|
||||
float fSecs = m_fLifeTotalGainedSeconds - (m_fLifeTotalLostSeconds + STATSMAN->m_CurStageStats.fGameplaySeconds);
|
||||
return fSecs;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* (c) 2001-2004 Chris Danford
|
||||
* All rights reserved.
|
||||
|
||||
Reference in New Issue
Block a user