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.
This commit is contained in:
Glenn Maynard
2002-09-07 05:04:04 +00:00
parent a0cba0afa4
commit 33a0e450e4
10 changed files with 111 additions and 42 deletions
+1 -1
View File
@@ -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 );
+2 -1
View File
@@ -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,
+8 -7
View File
@@ -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
+2 -1
View File
@@ -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;
+4 -4
View File
@@ -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( &notedata );
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; pad<iNumPads; pad++ )
@@ -202,7 +202,7 @@ void Notes::WriteDWINotesTag( FILE* fp )
switch( m_NotesType )
{
case NOTES_TYPE_DANCE_SINGLE:
case NOTES_TYPE_DANCE_COUPLE:
case NOTES_TYPE_DANCE_COUPLE_1:
case NOTES_TYPE_DANCE_DOUBLE:
fprintf( fp, NotesToDWIString( notedata.m_TapNotes[pad*4+0][row], notedata.m_TapNotes[pad*4+1][row], notedata.m_TapNotes[pad*4+2][row], notedata.m_TapNotes[pad*4+3][row] ) );
break;
@@ -244,7 +244,7 @@ void Notes::SetNoteData( NoteData* pNewNoteData )
m_sSMNoteData = pNewNoteData->GetSMNoteDataString();
}
void Notes::GetNoteData( NoteData* pNoteDataOut )
void Notes::GetNoteData( NoteData* pNoteDataOut ) const
{
pNoteDataOut->m_iNumTracks = GameManager::NotesTypeToNumTracks( m_NotesType );
pNoteDataOut->LoadFromSMNoteDataString( m_sSMNoteData );
+1 -1
View File
@@ -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 );
+43 -10
View File
@@ -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; i<MAX_TAP_NOTE_ROWS; i++ ) // for each TapNote
{
@@ -207,11 +208,14 @@ bool BMSLoader::LoadFromBMSFile( const CString &sPath, Notes &out )
int iNumNewTracks = GameManager::NotesTypeToNumTracks( out.m_NotesType );
int iTransformNewToOld[MAX_NOTE_TRACKS];
int i;
for( i = 0; i < MAX_NOTE_TRACKS; ++i)
iTransformNewToOld[i] = -1;
switch( out.m_NotesType )
{
case NOTES_TYPE_DANCE_SINGLE:
case NOTES_TYPE_DANCE_COUPLE:
// case NOTES_TYPE_DANCE_COUPLE_2:
case NOTES_TYPE_DANCE_COUPLE_1:
iTransformNewToOld[0] = DANCE_NOTE_PAD1_LEFT;
iTransformNewToOld[1] = DANCE_NOTE_PAD1_DOWN;
iTransformNewToOld[2] = DANCE_NOTE_PAD1_UP;
@@ -245,6 +249,24 @@ bool BMSLoader::LoadFromBMSFile( const CString &sPath, Notes &out )
out.SetNoteData(pNoteData2);
if(out.m_NotesType == NOTES_TYPE_DANCE_COUPLE_1) {
/* Couples. Set up a second note pattern for the 2p side. */
out2 = out;
out2.m_NotesType = NOTES_TYPE_DANCE_COUPLE_2;
for( i = 0; i < MAX_NOTE_TRACKS; ++i)
iTransformNewToOld[i] = -1;
iTransformNewToOld[0] = DANCE_NOTE_PAD2_LEFT;
iTransformNewToOld[1] = DANCE_NOTE_PAD2_DOWN;
iTransformNewToOld[2] = DANCE_NOTE_PAD2_UP;
iTransformNewToOld[3] = DANCE_NOTE_PAD2_RIGHT;
pNoteData2->LoadTransformed( 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; i<arrayBMSFileNames.GetSize(); i++ )
{
Notes* pNewNotes = new Notes;
LoadFromBMSFile( out.m_sSongDir + arrayBMSFileNames[i], *pNewNotes );
out.m_apNotes.Add( pNewNotes );
Notes* pNewNotes2 = new Notes;
LoadFromBMSFile( out.m_sSongDir + arrayBMSFileNames[i],
*pNewNotes, *pNewNotes2 );
/* 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;
}
CString sPath = out.m_sSongDir + arrayBMSFileNames[0];
+3 -1
View File
@@ -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 );
+44 -10
View File
@@ -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
+3 -6
View File
@@ -13,12 +13,9 @@ class DWILoader {
void DWIcharToNote( char c, GameController i, DanceNote &note1Out, DanceNote &note2Out );
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 );