Fix possible crash if Player accesses the NoteData in it's dtor and the Player is a PlayerPlus. Now just treat PlayerPlus as a smart pointer to a Player with the added Load( const NoteData& ) member function. This is only a connivence class anyway.
This commit is contained in:
+10
-4
@@ -206,18 +206,24 @@ protected:
|
||||
TweenState m_tsJudgment[NUM_REVERSE][NUM_CENTERED];
|
||||
};
|
||||
|
||||
class PlayerPlus : public Player
|
||||
class PlayerPlus
|
||||
{
|
||||
Player *m_pPlayer;
|
||||
NoteData m_NoteData;
|
||||
public:
|
||||
PlayerPlus() : Player(m_NoteData) { }
|
||||
void Load( const NoteData &nd ) { m_NoteData = nd; Player::Load(); }
|
||||
PlayerPlus() { m_pPlayer = new Player(m_NoteData); }
|
||||
~PlayerPlus() { delete m_pPlayer; }
|
||||
void Load( const NoteData &nd ) { m_NoteData = nd; m_pPlayer->Load(); }
|
||||
Player *operator->() { return m_pPlayer; }
|
||||
const Player *operator->() const { return m_pPlayer; }
|
||||
operator Player*() { return m_pPlayer; }
|
||||
operator const Player*() const { return m_pPlayer; }
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* (c) 2001-2004 Chris Danford
|
||||
* (c) 2001-2006 Chris Danford, Steve Checkoway
|
||||
* All rights reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
|
||||
@@ -709,10 +709,10 @@ void ScreenEdit::Init()
|
||||
m_Undo.SetNumTracks( m_NoteDataEdit.GetNumTracks() );
|
||||
|
||||
|
||||
m_Player.Init( "Player", GAMESTATE->m_pPlayerState[PLAYER_1], NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL );
|
||||
m_Player->Init( "Player", GAMESTATE->m_pPlayerState[PLAYER_1], NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL );
|
||||
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerController = PC_HUMAN;
|
||||
m_Player.SetXY( PLAYER_X, PLAYER_Y );
|
||||
this->AddChild( &m_Player );
|
||||
m_Player->SetXY( PLAYER_X, PLAYER_Y );
|
||||
this->AddChild( m_Player );
|
||||
|
||||
this->AddChild( &m_Foreground );
|
||||
|
||||
@@ -793,7 +793,7 @@ void ScreenEdit::PlayTicks()
|
||||
iRowLastCrossed = iSongRow;
|
||||
|
||||
int iTickRow = -1;
|
||||
const NoteData &nd = m_Player.GetNoteData();
|
||||
const NoteData &nd = m_Player->GetNoteData();
|
||||
// for each index we crossed since the last update:
|
||||
FOREACH_NONEMPTY_ROW_ALL_TRACKS_RANGE( nd, r, iRowLastCrossed+1, iSongRow+1 )
|
||||
if( nd.IsThereATapOrHoldHeadAtRow( r ) )
|
||||
@@ -2035,7 +2035,7 @@ void ScreenEdit::InputPlay( const InputEventPlus &input, EditButton EditB )
|
||||
{
|
||||
case PLAYER_1:
|
||||
if( PREFSMAN->m_AutoPlay == PC_HUMAN )
|
||||
m_Player.Step( input.StyleI.col, input.DeviceI.ts );
|
||||
m_Player->Step( input.StyleI.col, input.DeviceI.ts );
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -2228,7 +2228,7 @@ void ScreenEdit::TransitionEditState( EditState em )
|
||||
m_SnapDisplay.SetHidden( em != STATE_EDITING );
|
||||
m_NoteFieldEdit.SetHidden( em != STATE_EDITING );
|
||||
m_NoteFieldRecord.SetHidden( em != STATE_RECORDING && em != STATE_RECORDING_PAUSED );
|
||||
m_Player.SetHidden( em != STATE_PLAYING );
|
||||
m_Player->SetHidden( em != STATE_PLAYING );
|
||||
m_Foreground.SetHidden( !g_bEditorShowBGChangesPlay || em == STATE_EDITING );
|
||||
|
||||
switch( em )
|
||||
@@ -2384,7 +2384,7 @@ void ScreenEdit::HandleScreenMessage( const ScreenMessage SM )
|
||||
|
||||
// The options may have changed the note skin.
|
||||
m_NoteFieldRecord.CacheAllUsedNoteSkins();
|
||||
m_Player.CacheAllUsedNoteSkins();
|
||||
m_Player->CacheAllUsedNoteSkins();
|
||||
|
||||
// stop any music that screen may have been playing
|
||||
SOUND->StopMusic();
|
||||
|
||||
@@ -73,7 +73,6 @@ ScreenHowToPlay::ScreenHowToPlay()
|
||||
m_iNumW2s = NUM_W2S;
|
||||
|
||||
// initialize these because they might not be used.
|
||||
m_pPlayer = NULL;
|
||||
m_pLifeMeterBar = NULL;
|
||||
m_pmCharacter = NULL;
|
||||
m_pmDancePad = NULL;
|
||||
@@ -154,8 +153,7 @@ void ScreenHowToPlay::Init()
|
||||
GAMESTATE->m_bGameplayLeadIn.Set( false );
|
||||
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerController = PC_AUTOPLAY;
|
||||
|
||||
m_pPlayer = new PlayerPlus;
|
||||
m_pPlayer->Init(
|
||||
m_Player->Init(
|
||||
"Player",
|
||||
GAMESTATE->m_pPlayerState[PLAYER_1],
|
||||
NULL,
|
||||
@@ -166,10 +164,10 @@ void ScreenHowToPlay::Init()
|
||||
NULL,
|
||||
NULL,
|
||||
NULL );
|
||||
m_pPlayer->Load( m_NoteData );
|
||||
m_pPlayer->SetName( "Player" );
|
||||
this->AddChild( m_pPlayer );
|
||||
SET_XY_AND_ON_COMMAND( m_pPlayer );
|
||||
m_Player.Load( m_NoteData );
|
||||
m_Player->SetName( "Player" );
|
||||
this->AddChild( m_Player );
|
||||
SET_XY_AND_ON_COMMAND( m_Player );
|
||||
|
||||
// Don't show judgement
|
||||
GAMESTATE->m_pPlayerState[PLAYER_1]->m_PlayerOptions.m_fBlind = 1;
|
||||
@@ -192,7 +190,6 @@ ScreenHowToPlay::~ScreenHowToPlay()
|
||||
delete m_pLifeMeterBar;
|
||||
delete m_pmCharacter;
|
||||
delete m_pmDancePad;
|
||||
delete m_pPlayer;
|
||||
}
|
||||
|
||||
void ScreenHowToPlay::Step()
|
||||
@@ -248,7 +245,7 @@ void ScreenHowToPlay::Update( float fDelta )
|
||||
|
||||
if(( iCurNoteRow != iLastNoteRowCounted ) &&(m_NoteData.IsThereATapAtRow( iCurNoteRow )))
|
||||
{
|
||||
if( m_pLifeMeterBar && !m_pPlayer )
|
||||
if( m_pLifeMeterBar && !m_Player )
|
||||
{
|
||||
if ( m_iW2s < m_iNumW2s )
|
||||
m_pLifeMeterBar->ChangeLife(TNS_W2);
|
||||
|
||||
@@ -23,7 +23,7 @@ public:
|
||||
protected:
|
||||
virtual void Step();
|
||||
LifeMeterBar *m_pLifeMeterBar;
|
||||
PlayerPlus *m_pPlayer;
|
||||
PlayerPlus m_Player;
|
||||
Model *m_pmCharacter;
|
||||
Model *m_pmDancePad;
|
||||
int m_iW2s;
|
||||
|
||||
Reference in New Issue
Block a user