From 33a0e450e4f73cc22010281b560b13f0aaafcaf3 Mon Sep 17 00:00:00 2001 From: Glenn Maynard Date: Sat, 7 Sep 2002 05:04:04 +0000 Subject: [PATCH] Switch to separate note patterns for couples. Add loader support. This will break saving couples to DWI and probably the editor, too. Getting to that. --- stepmania/src/FontManager.cpp | 2 +- stepmania/src/GameConstantsAndTypes.h | 3 +- stepmania/src/GameManager.cpp | 15 ++++---- stepmania/src/NoteData.cpp | 3 +- stepmania/src/Notes.cpp | 8 ++-- stepmania/src/Notes.h | 2 +- stepmania/src/NotesLoaderBMS.cpp | 53 +++++++++++++++++++++----- stepmania/src/NotesLoaderBMS.h | 4 +- stepmania/src/NotesLoaderDWI.cpp | 54 ++++++++++++++++++++++----- stepmania/src/NotesLoaderDWI.h | 9 ++--- 10 files changed, 111 insertions(+), 42 deletions(-) diff --git a/stepmania/src/FontManager.cpp b/stepmania/src/FontManager.cpp index 82db3636f1..fb2681d872 100644 --- a/stepmania/src/FontManager.cpp +++ b/stepmania/src/FontManager.cpp @@ -73,7 +73,7 @@ Font* FontManager::LoadFont( CString sFontOrTextureFilePath, CString sChars ) else // the texture is not already loaded { CString sDrive, sDir, sFName, sExt; - splitpath( FALSE, sFontOrTextureFilePath, sDrive, sDir, sFName, sExt ); + splitpath( false, sFontOrTextureFilePath, sDrive, sDir, sFName, sExt ); if( sChars == "" ) pFont = (Font*) new Font( sFontOrTextureFilePath ); diff --git a/stepmania/src/GameConstantsAndTypes.h b/stepmania/src/GameConstantsAndTypes.h index d6ce40d913..dfd967fd02 100644 --- a/stepmania/src/GameConstantsAndTypes.h +++ b/stepmania/src/GameConstantsAndTypes.h @@ -63,7 +63,8 @@ enum NotesType { NOTES_TYPE_DANCE_SINGLE = 0, NOTES_TYPE_DANCE_DOUBLE, - NOTES_TYPE_DANCE_COUPLE, + NOTES_TYPE_DANCE_COUPLE_1, + NOTES_TYPE_DANCE_COUPLE_2, NOTES_TYPE_DANCE_SOLO, NOTES_TYPE_PUMP_SINGLE, NOTES_TYPE_PUMP_DOUBLE, diff --git a/stepmania/src/GameManager.cpp b/stepmania/src/GameManager.cpp index 8a356f9c44..604d052381 100644 --- a/stepmania/src/GameManager.cpp +++ b/stepmania/src/GameManager.cpp @@ -34,7 +34,8 @@ struct { } const NotesTypes[NUM_NOTES_TYPES] = { { "dance-single", 4 }, { "dance-double", 8 }, - { "dance-couple", 8 }, + { "dance-couple-1", 4 }, + { "dance-couple-2", 4 }, { "dance-solo", 6 }, { "pump-single", 5 }, { "pump-double", 10 }, @@ -467,7 +468,7 @@ StyleDef g_StyleDefs[NUM_STYLES] = true, // m_bUsedForGameplay false, // m_bUsedForEdit "DDR Couple", // m_szName - { NOTES_TYPE_DANCE_COUPLE, NOTES_TYPE_DANCE_COUPLE }, // m_NotesTypes + { NOTES_TYPE_DANCE_COUPLE_1, NOTES_TYPE_DANCE_COUPLE_2 }, // m_NotesTypes NOTES_TYPE_INVALID, // m_FallbackNotesType StyleDef::TWO_PLAYERS_TWO_CREDITS, // m_StyleType { 160, 480 }, // m_iCenterX @@ -480,10 +481,10 @@ StyleDef g_StyleDefs[NUM_STYLES] = { TRACK_4, GAME_CONTROLLER_1, DANCE_BUTTON_RIGHT, +DANCE_COL_SPACING*1.5f }, }, { // PLAYER_2 - { TRACK_5, GAME_CONTROLLER_2, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*1.5f }, - { TRACK_6, GAME_CONTROLLER_2, DANCE_BUTTON_DOWN, -DANCE_COL_SPACING*0.5f }, - { TRACK_7, GAME_CONTROLLER_2, DANCE_BUTTON_UP, +DANCE_COL_SPACING*0.5f }, - { TRACK_8, GAME_CONTROLLER_2, DANCE_BUTTON_RIGHT, +DANCE_COL_SPACING*1.5f }, + { TRACK_1, GAME_CONTROLLER_2, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*1.5f }, + { TRACK_2, GAME_CONTROLLER_2, DANCE_BUTTON_DOWN, -DANCE_COL_SPACING*0.5f }, + { TRACK_3, GAME_CONTROLLER_2, DANCE_BUTTON_UP, +DANCE_COL_SPACING*0.5f }, + { TRACK_4, GAME_CONTROLLER_2, DANCE_BUTTON_RIGHT, +DANCE_COL_SPACING*1.5f }, }, }, { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; @@ -527,7 +528,7 @@ StyleDef g_StyleDefs[NUM_STYLES] = false, // m_bUsedForGameplay true, // m_bUsedForEdit "DDR Couple", // m_szName - { NOTES_TYPE_DANCE_COUPLE, NOTES_TYPE_DANCE_COUPLE }, // m_NotesTypes + { NOTES_TYPE_DANCE_COUPLE_1, NOTES_TYPE_DANCE_COUPLE_2 }, // m_NotesTypes NOTES_TYPE_INVALID, // m_FallbackNotesType StyleDef::ONE_PLAYER_TWO_CREDITS, // m_StyleType { 320, 320 }, // m_iCenterX diff --git a/stepmania/src/NoteData.cpp b/stepmania/src/NoteData.cpp index f1c5cabb7d..4ba5b012d5 100644 --- a/stepmania/src/NoteData.cpp +++ b/stepmania/src/NoteData.cpp @@ -481,7 +481,8 @@ void NoteData::Turn( PlayerOptions::TurnType tt ) { case NOTES_TYPE_DANCE_SINGLE: case NOTES_TYPE_DANCE_DOUBLE: - case NOTES_TYPE_DANCE_COUPLE: + case NOTES_TYPE_DANCE_COUPLE_1: + case NOTES_TYPE_DANCE_COUPLE_2: iTakeFromTrack[0] = 2; iTakeFromTrack[1] = 0; iTakeFromTrack[2] = 3; diff --git a/stepmania/src/Notes.cpp b/stepmania/src/Notes.cpp index 2c817860d5..81728d7f7e 100644 --- a/stepmania/src/Notes.cpp +++ b/stepmania/src/Notes.cpp @@ -136,7 +136,7 @@ void Notes::WriteDWINotesTag( FILE* fp ) switch( m_NotesType ) { case NOTES_TYPE_DANCE_SINGLE: fprintf( fp, "#SINGLE:" ); break; - case NOTES_TYPE_DANCE_COUPLE: fprintf( fp, "#COUPLE:" ); break; + case NOTES_TYPE_DANCE_COUPLE_1: fprintf( fp, "#COUPLE:" ); break; case NOTES_TYPE_DANCE_DOUBLE: fprintf( fp, "#DOUBLE:" ); break; case NOTES_TYPE_DANCE_SOLO: fprintf( fp, "#SOLO:" ); break; default: return; // not a type supported by DWI @@ -156,7 +156,7 @@ void Notes::WriteDWINotesTag( FILE* fp ) this->GetNoteData( ¬edata ); notedata.ConvertHoldNotesTo2sAnd3s(); - const int iNumPads = (m_NotesType==NOTES_TYPE_DANCE_COUPLE || m_NotesType==NOTES_TYPE_DANCE_DOUBLE) ? 2 : 1; + const int iNumPads = (m_NotesType==NOTES_TYPE_DANCE_COUPLE_1 || m_NotesType==NOTES_TYPE_DANCE_DOUBLE) ? 2 : 1; const int iLastMeasure = int( notedata.GetLastBeat()/BEATS_PER_MEASURE ); for( int pad=0; padGetSMNoteDataString(); } -void Notes::GetNoteData( NoteData* pNoteDataOut ) +void Notes::GetNoteData( NoteData* pNoteDataOut ) const { pNoteDataOut->m_iNumTracks = GameManager::NotesTypeToNumTracks( m_NotesType ); pNoteDataOut->LoadFromSMNoteDataString( m_sSMNoteData ); diff --git a/stepmania/src/Notes.h b/stepmania/src/Notes.h index 951c6b2bfa..5bfd36fada 100644 --- a/stepmania/src/Notes.h +++ b/stepmania/src/Notes.h @@ -36,7 +36,7 @@ public: float m_fRadarValues[NUM_RADAR_VALUES]; // between 0.0-1.2 starting from 12-o'clock rotating clockwise CString m_sSMNoteData; - void GetNoteData( NoteData* pNoteDataOut ); + void GetNoteData( NoteData* pNoteDataOut ) const; void SetNoteData( NoteData* pNewNoteData ); diff --git a/stepmania/src/NotesLoaderBMS.cpp b/stepmania/src/NotesLoaderBMS.cpp index f08acbff79..7b6b56bcb5 100644 --- a/stepmania/src/NotesLoaderBMS.cpp +++ b/stepmania/src/NotesLoaderBMS.cpp @@ -27,7 +27,7 @@ // While reading in, use the 6 panel mapping. After reading in, detect if only 4 notes // are used. If so, shift the Up+Right column back to the Up column // -void mapBMSTrackToDanceNote( int iBMSTrack, int &iDanceColOut, char &cNoteCharOut ) +void BMSLoader::mapBMSTrackToDanceNote( int iBMSTrack, int &iDanceColOut, char &cNoteCharOut ) { if( iBMSTrack > 40 ) { @@ -58,10 +58,13 @@ void mapBMSTrackToDanceNote( int iBMSTrack, int &iDanceColOut, char &cNoteCharOu } -bool BMSLoader::LoadFromBMSFile( const CString &sPath, Notes &out ) +bool BMSLoader::LoadFromBMSFile( const CString &sPath, Notes &out, Notes &out2 ) { LOG->Trace( "Notes::LoadFromBMSFile( '%s' )", sPath ); + out.m_NotesType = NOTES_TYPE_INVALID; + out2.m_NotesType = NOTES_TYPE_INVALID; + NoteData* pNoteData = new NoteData; pNoteData->m_iNumTracks = MAX_NOTE_TRACKS; @@ -111,7 +114,7 @@ bool BMSLoader::LoadFromBMSFile( const CString &sPath, Notes &out ) // if the mode should be solo, then we'll update m_DanceStyle below when we read in step data break; case 2: // couple/battle - out.m_NotesType = NOTES_TYPE_DANCE_COUPLE; + out.m_NotesType = NOTES_TYPE_DANCE_COUPLE_1; break; case 3: // double out.m_NotesType = NOTES_TYPE_DANCE_DOUBLE; @@ -184,9 +187,7 @@ bool BMSLoader::LoadFromBMSFile( const CString &sPath, Notes &out ) if( out.m_NotesType == NOTES_TYPE_DANCE_SINGLE || out.m_NotesType == NOTES_TYPE_DANCE_DOUBLE || - out.m_NotesType == NOTES_TYPE_DANCE_COUPLE// || - //out.m_NotesType == NOTES_TYPE_DANCE_COUPLE_2 - ) // if there are 4 panels, then the Up+Right track really contains the notes for Up + out.m_NotesType == NOTES_TYPE_DANCE_COUPLE_1) // if there are 4 panels, then the Up+Right track really contains the notes for Up { for( int i=0; iLoadTransformed( pNoteData, iNumNewTracks, iTransformNewToOld ); + out2.SetNoteData(pNoteData2); + out2.TidyUpData(); + } + delete pNoteData; delete pNoteData2; @@ -267,8 +289,19 @@ bool BMSLoader::LoadFromBMSDir( CString sDir, Song &out ) for( int i=0; im_NotesType != NOTES_TYPE_INVALID) + out.m_apNotes.Add( pNewNotes ); + else + delete pNewNotes; + if(pNewNotes2->m_NotesType != NOTES_TYPE_INVALID) + out.m_apNotes.Add( pNewNotes2 ); + else + delete pNewNotes2; } CString sPath = out.m_sSongDir + arrayBMSFileNames[0]; diff --git a/stepmania/src/NotesLoaderBMS.h b/stepmania/src/NotesLoaderBMS.h index 82e46f1b5f..056a94f87a 100644 --- a/stepmania/src/NotesLoaderBMS.h +++ b/stepmania/src/NotesLoaderBMS.h @@ -3,9 +3,11 @@ #include "Song.h" #include "Notes.h" +#include "NotesLoader.h" class BMSLoader { - bool LoadFromBMSFile( const CString &sPath, Notes &out ); + bool LoadFromBMSFile( const CString &sPath, Notes &out1, Notes &out2 ); + void mapBMSTrackToDanceNote( int iBMSTrack, int &iDanceColOut, char &cNoteCharOut ); public: bool LoadFromBMSDir( CString sDir, Song &out ); diff --git a/stepmania/src/NotesLoaderDWI.cpp b/stepmania/src/NotesLoaderDWI.cpp index 03bf9d711a..4dc5f24493 100644 --- a/stepmania/src/NotesLoaderDWI.cpp +++ b/stepmania/src/NotesLoaderDWI.cpp @@ -61,10 +61,13 @@ bool DWILoader::LoadFromDWITokens( CString sNumFeet, CString sStepData1, CString sStepData2, - Notes &out) + Notes &out, Notes &out2) { LOG->Trace( "Notes::LoadFromDWITokens()" ); + out.m_NotesType = NOTES_TYPE_INVALID; + out2.m_NotesType = NOTES_TYPE_INVALID; + sStepData1.Replace( "\n", "" ); sStepData1.Replace( " ", "" ); sStepData2.Replace( "\n", "" ); @@ -72,7 +75,7 @@ bool DWILoader::LoadFromDWITokens( if( sMode == "SINGLE" ) out.m_NotesType = NOTES_TYPE_DANCE_SINGLE; else if( sMode == "DOUBLE" ) out.m_NotesType = NOTES_TYPE_DANCE_DOUBLE; - else if( sMode == "COUPLE" ) out.m_NotesType = NOTES_TYPE_DANCE_COUPLE; + else if( sMode == "COUPLE" ) out.m_NotesType = NOTES_TYPE_DANCE_COUPLE_1; else if( sMode == "SOLO" ) out.m_NotesType = NOTES_TYPE_DANCE_SOLO; else { @@ -91,7 +94,7 @@ bool DWILoader::LoadFromDWITokens( mapDanceNoteToNoteDataColumn[DANCE_NOTE_PAD1_RIGHT] = 3; break; case NOTES_TYPE_DANCE_DOUBLE: - case NOTES_TYPE_DANCE_COUPLE: + case NOTES_TYPE_DANCE_COUPLE_1: mapDanceNoteToNoteDataColumn[DANCE_NOTE_PAD1_LEFT] = 0; mapDanceNoteToNoteDataColumn[DANCE_NOTE_PAD1_DOWN] = 1; mapDanceNoteToNoteDataColumn[DANCE_NOTE_PAD1_UP] = 2; @@ -227,18 +230,39 @@ bool DWILoader::LoadFromDWITokens( ASSERT( pNoteData->m_iNumTracks > 0 ); - out.m_sSMNoteData = pNoteData->GetSMNoteDataString(); + if(out.m_NotesType == NOTES_TYPE_DANCE_COUPLE_1) { + int iTransformNewToOld[MAX_NOTE_TRACKS]; + /* Couples. Set up a second note pattern for the 2p side. */ + out2 = out; + out2.m_NotesType = NOTES_TYPE_DANCE_COUPLE_2; + + for( int i = 0; i < MAX_NOTE_TRACKS; ++i) + iTransformNewToOld[i] = -1; + + iTransformNewToOld[0] = 4; + iTransformNewToOld[1] = 5; + iTransformNewToOld[2] = 6; + iTransformNewToOld[3] = 7; + + NoteData* pNoteData2 = new NoteData; + pNoteData2->m_iNumTracks = 4; + + pNoteData2->LoadTransformed( pNoteData, 4, iTransformNewToOld ); + out2.SetNoteData(pNoteData2); + + delete pNoteData2; + out2.TidyUpData(); + + pNoteData->m_iNumTracks = 4; + } + out.SetNoteData(pNoteData); delete pNoteData; - out.TidyUpData(); return true; } - - - bool DWILoader::LoadFromDWIFile( CString sPath, Song &out ) { LOG->Trace( "Song::LoadFromDWIFile(%s)", sPath ); @@ -322,15 +346,25 @@ bool DWILoader::LoadFromDWIFile( CString sPath, Song &out ) 0==stricmp(sValueName,"SOLO")) { Notes* pNewNotes = new Notes; + Notes* pNewNotes2 = new Notes; LoadFromDWITokens( sParams[0], sParams[1], sParams[2], sParams[3], (iNumParams==5) ? sParams[4] : "", - *pNewNotes + *pNewNotes, + *pNewNotes2 ); - out.m_apNotes.Add( pNewNotes ); + /* Add either note pattern that actually loaded. */ + if(pNewNotes->m_NotesType != NOTES_TYPE_INVALID) + out.m_apNotes.Add( pNewNotes ); + else + delete pNewNotes; + if(pNewNotes2->m_NotesType != NOTES_TYPE_INVALID) + out.m_apNotes.Add( pNewNotes2 ); + else + delete pNewNotes2; } else // do nothing. We don't care about this value name diff --git a/stepmania/src/NotesLoaderDWI.h b/stepmania/src/NotesLoaderDWI.h index 87b2b0c236..fd4eb15df0 100644 --- a/stepmania/src/NotesLoaderDWI.h +++ b/stepmania/src/NotesLoaderDWI.h @@ -13,12 +13,9 @@ class DWILoader { void DWIcharToNote( char c, GameController i, DanceNote ¬e1Out, DanceNote ¬e2Out ); bool LoadFromDWITokens( - CString sMode, - CString sDescription, - CString sNumFeet, - CString sStepData1, - CString sStepData2, - Notes &out); + CString sMode, CString sDescription, CString sNumFeet, CString sStepData1, + CString sStepData2, + Notes &out, Notes &out2); public: bool LoadFromDWIFile( CString sPath, Song &out );