From 1ad58b4631207e23c2000c24f94bb46b377ca5a9 Mon Sep 17 00:00:00 2001 From: Chris Danford Date: Tue, 22 Nov 2005 21:18:45 +0000 Subject: [PATCH] experimental: save NoteData to XML for recording played games --- stepmania/src/NoteData.cpp | 30 ++++++++++++++++++++ stepmania/src/NoteData.h | 4 +++ stepmania/src/NoteTypes.cpp | 47 ++++++++++++++++++++++++++++++++ stepmania/src/NoteTypes.h | 14 ++++++++++ stepmania/src/ScreenGameplay.cpp | 18 ++++++++++++ stepmania/src/ScreenGameplay.h | 1 + 6 files changed, 114 insertions(+) diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index 02e7afc395..9e53d39eac 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -8,6 +8,8 @@ #include "NoteData.h" #include "RageUtil.h" #include "RageLog.h" +#include "XmlFile.h" +#include "Foreach.h" #include "RageUtil_AutoPtr.h" REGISTER_CLASS_TRAITS( NoteData, new NoteData(*pCopy) ) @@ -877,6 +879,34 @@ bool NoteData::GetPrevTapNoteRowForAllTracks( int &rowInOut ) const } } +XNode* NoteData::CreateNode() const +{ + XNode *p = new XNode; + p->m_sName = "NoteData"; + + FOREACH_NONEMPTY_ROW_ALL_TRACKS( *this, row ) + { + set s; + GetTapNonEmptyTracks( row, s ); + FOREACHS_CONST( int, s, t ) + { + TapNote tn = this->GetTapNote(*t, row); + XNode *p2 = tn.CreateNode(); + p2->AppendAttr( "Track", *t ); + p2->AppendAttr( "Row", row ); + p->AppendChild( p2 ); + } + } + + return p; +} + +void NoteData::LoadFromNode( const XNode* pNode ) +{ + ASSERT(0); +} + + /* * (c) 2001-2004 Chris Danford, Glenn Maynard * All rights reserved. diff --git a/stepmania/src/NoteData.h b/stepmania/src/NoteData.h index 49649e9912..de5b3b4bc1 100644 --- a/stepmania/src/NoteData.h +++ b/stepmania/src/NoteData.h @@ -150,6 +150,10 @@ public: // Transformations void LoadTransformed( const NoteData& original, int iNewNumTracks, const int iOriginalTrackToTakeFrom[] ); // -1 for iOriginalTracksToTakeFrom means no track + + // XML + XNode* CreateNode() const; + void LoadFromNode( const XNode* pNode ); }; diff --git a/stepmania/src/NoteTypes.cpp b/stepmania/src/NoteTypes.cpp index 65aedc2a95..df01daea51 100644 --- a/stepmania/src/NoteTypes.cpp +++ b/stepmania/src/NoteTypes.cpp @@ -3,6 +3,7 @@ #include "RageUtil.h" #include "LuaManager.h" #include "LuaFunctions.h" +#include "XmlFile.h" TapNote TAP_EMPTY ( TapNote::empty, TapNote::SubType_invalid, TapNote::original, "", 0, false, 0 ); TapNote TAP_ORIGINAL_TAP ( TapNote::tap, TapNote::SubType_invalid, TapNote::original, "", 0, false, 0 ); @@ -75,6 +76,52 @@ bool IsNoteOfType( int row, NoteType t ) return GetNoteType(row) == t; } + +XNode* TapNoteResult::CreateNode() const +{ + XNode *p = new XNode; + p->m_sName = "TapNoteResult"; + + p->AppendAttr( "TapNoteScore", TapNoteScoreToString(tns) ); + p->AppendAttr( "TapNoteOffset", fTapNoteOffset ); + + return p; +} + +void TapNoteResult::LoadFromNode( const XNode* pNode ) +{ + ASSERT(0); +} + +XNode* HoldNoteResult::CreateNode() const +{ + XNode *p = new XNode; + p->m_sName = "HoldNoteResult"; + + return p; +} + +void HoldNoteResult::LoadFromNode( const XNode* pNode ) +{ + ASSERT(0); +} + +XNode* TapNote::CreateNode() const +{ + XNode *p = new XNode; + p->m_sName = "TapNote"; + + p->AppendChild( result.CreateNode() ); + p->AppendChild( HoldResult.CreateNode() ); + + return p; +} + +void TapNote::LoadFromNode( const XNode* pNode ) +{ + ASSERT(0); +} + float HoldNoteResult::GetLastHeldBeat() const { return NoteRowToBeat(iLastHeldRow); diff --git a/stepmania/src/NoteTypes.h b/stepmania/src/NoteTypes.h index ee78d9f42a..a8ff44475e 100644 --- a/stepmania/src/NoteTypes.h +++ b/stepmania/src/NoteTypes.h @@ -4,6 +4,7 @@ #define NOTE_TYPES_H #include "GameConstantsAndTypes.h" +struct XNode; struct TapNoteResult { @@ -21,6 +22,10 @@ struct TapNoteResult /* If the whole row has been judged, all taps on the row will be set to hidden. */ bool bHidden; + + // XML + XNode* CreateNode() const; + void LoadFromNode( const XNode* pNode ); }; struct HoldNoteResult @@ -49,6 +54,10 @@ struct HoldNoteResult bool bHeld; bool bActive; + + // XML + XNode* CreateNode() const; + void LoadFromNode( const XNode* pNode ); }; @@ -102,6 +111,11 @@ struct TapNote /* hold_head only: */ HoldNoteResult HoldResult; + + // XML + XNode* CreateNode() const; + void LoadFromNode( const XNode* pNode ); + TapNote() {} TapNote( diff --git a/stepmania/src/ScreenGameplay.cpp b/stepmania/src/ScreenGameplay.cpp index 8475aa969c..169a81697d 100644 --- a/stepmania/src/ScreenGameplay.cpp +++ b/stepmania/src/ScreenGameplay.cpp @@ -50,6 +50,7 @@ #include "DifficultyMeter.h" #include "PlayerScoreList.h" #include "InputEventPlus.h" +#include "XmlFile.h" // // Defines @@ -2533,6 +2534,7 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM ) { SongFinished(); StageFinished( false ); + //SaveRecordedResults(); } else if( SM == SM_GainFocus ) { @@ -2686,6 +2688,22 @@ Song *ScreenGameplay::GetNextCourseSong() const return m_apSongsQueue[iPlaySongIndex]; } +void ScreenGameplay::SaveRecordedResults() +{ + FOREACH_HumanPlayer( pn ) + { + FOREACH_EnabledPlayerInfo( m_vPlayerInfo, pi ) + { + XNode *p = pi->m_pPlayer->m_NoteData.CreateNode(); + DISP_OPT opt; + p->SaveToFile( "Save/LastSongRecording.xml", opt ); + SAFE_DELETE( p ); + return; + } + } +} + + // lua start #include "LuaBinding.h" diff --git a/stepmania/src/ScreenGameplay.h b/stepmania/src/ScreenGameplay.h index c3c427130a..af3dfb81b8 100644 --- a/stepmania/src/ScreenGameplay.h +++ b/stepmania/src/ScreenGameplay.h @@ -151,6 +151,7 @@ protected: void UpdateLyrics( float fDeltaTime ); void SongFinished(); void StageFinished( bool bBackedOut ); + void SaveRecordedResults(); virtual void InitSongQueues();