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:
@@ -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 );
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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; 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 );
|
||||
|
||||
@@ -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 );
|
||||
|
||||
|
||||
|
||||
@@ -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,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 );
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 );
|
||||
|
||||
Reference in New Issue
Block a user