From b8ab1f7393e090a31bd9ccd96f8f5dc8ec336d09 Mon Sep 17 00:00:00 2001 From: Steve Checkoway Date: Thu, 20 Jul 2006 02:19:03 +0000 Subject: [PATCH] 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. --- stepmania/src/Player.h | 14 ++++++++++---- stepmania/src/ScreenEdit.cpp | 14 +++++++------- stepmania/src/ScreenHowToPlay.cpp | 15 ++++++--------- stepmania/src/ScreenHowToPlay.h | 2 +- 4 files changed, 24 insertions(+), 21 deletions(-) diff --git a/stepmania/src/Player.h b/stepmania/src/Player.h index f3af507f0d..7726a8bc22 100644 --- a/stepmania/src/Player.h +++ b/stepmania/src/Player.h @@ -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 diff --git a/stepmania/src/ScreenEdit.cpp b/stepmania/src/ScreenEdit.cpp index 9f57ae3338..44b44840a8 100644 --- a/stepmania/src/ScreenEdit.cpp +++ b/stepmania/src/ScreenEdit.cpp @@ -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(); diff --git a/stepmania/src/ScreenHowToPlay.cpp b/stepmania/src/ScreenHowToPlay.cpp index 2fb523b767..8b7251b7a4 100644 --- a/stepmania/src/ScreenHowToPlay.cpp +++ b/stepmania/src/ScreenHowToPlay.cpp @@ -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); diff --git a/stepmania/src/ScreenHowToPlay.h b/stepmania/src/ScreenHowToPlay.h index b70fb9df4c..21e67fcec1 100644 --- a/stepmania/src/ScreenHowToPlay.h +++ b/stepmania/src/ScreenHowToPlay.h @@ -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;