diff --git a/stepmania/src/GameConstantsAndTypes.h b/stepmania/src/GameConstantsAndTypes.h index 59f8b1d5c2..6a633c04f5 100644 --- a/stepmania/src/GameConstantsAndTypes.h +++ b/stepmania/src/GameConstantsAndTypes.h @@ -82,7 +82,11 @@ enum StepsType STEPS_TYPE_PARA_SINGLE, STEPS_TYPE_DS3DDX_SINGLE, STEPS_TYPE_BM_SINGLE, - STEPS_TYPE_MANIAX_SINGLE, +// MD 10/26/03 - uncomment the following three once we get support in for them +// STEPS_TYPE_BM_DOUBLE, +// STEPS_TYPE_BM_SINGLE7, +// STEPS_TYPE_BM_DOUBLE7, + STEPS_TYPE_MANIAX_SINGLE, STEPS_TYPE_MANIAX_DOUBLE, STEPS_TYPE_TECHNO_SINGLE8, STEPS_TYPE_PNM_FIVE, diff --git a/stepmania/src/GameManager.cpp b/stepmania/src/GameManager.cpp index 860952ae99..834a5d7956 100644 --- a/stepmania/src/GameManager.cpp +++ b/stepmania/src/GameManager.cpp @@ -55,6 +55,10 @@ struct { { "para-single", 5 }, { "ds3ddx-single", 8 }, { "bm-single", 6 }, +// MD 10/26/03 - for future support +// { "bm-double", 12 }, +// { "bm-single7", 8 }, +// { "bm-double7", 16 }, { "maniax-single", 4 }, { "maniax-double", 8 }, { "techno-single8", 8 }, diff --git a/stepmania/src/NoteTypes.h b/stepmania/src/NoteTypes.h index 620ba705a6..5e5fce98aa 100644 --- a/stepmania/src/NoteTypes.h +++ b/stepmania/src/NoteTypes.h @@ -52,6 +52,12 @@ enum TRACK_11, TRACK_12, TRACK_13, // BMS reader needs 13 tracks + // MD 10/26/03 - BMS reader needs a whole lot more than 13 tracks - more like 16 + // because we have 11-16, 18, 19, 21-26, 28, 29 for IIDX double (bm-double7) + TRACK_14, + TRACK_15, + TRACK_16, + // MD 10/26/03 end MAX_NOTE_TRACKS // leave this at the end }; @@ -88,7 +94,7 @@ struct HoldNote }; -inline int BeatToNoteRow( float fBeatNum ) { return (int) roundf( fBeatNum * ROWS_PER_BEAT); }; +inline int BeatToNoteRow( float fBeatNum ) { return int( fBeatNum * ROWS_PER_BEAT + 0.5f); }; // round inline int BeatToNoteRowNotRounded( float fBeatNum ) { return (int)( fBeatNum * ROWS_PER_BEAT ); }; inline float NoteRowToBeat( float fNoteIndex ) { return fNoteIndex / (float)ROWS_PER_BEAT; }; inline float NoteRowToBeat( int iNoteIndex ) { return NoteRowToBeat( (float)iNoteIndex ); }; diff --git a/stepmania/src/NotesLoader.h b/stepmania/src/NotesLoader.h index 4f1e60f3fb..c247228a27 100644 --- a/stepmania/src/NotesLoader.h +++ b/stepmania/src/NotesLoader.h @@ -6,6 +6,7 @@ #include typedef int DanceNote; +// MD 10/26/03 - this structure is only correct for DDR - use the lower enum instead enum { DANCE_NOTE_NONE = 0, DANCE_NOTE_PAD1_LEFT, @@ -21,6 +22,25 @@ enum { DANCE_NOTE_PAD2_UPRIGHT, DANCE_NOTE_PAD2_RIGHT }; +enum { + BMS_NULL_COLUMN = 0, + BMS_P1_KEY1, + BMS_P1_KEY2, + BMS_P1_KEY3, + BMS_P1_KEY4, + BMS_P1_KEY5, + BMS_P1_TURN, + BMS_P1_KEY6, + BMS_P1_KEY7, + BMS_P2_KEY1, + BMS_P2_KEY2, + BMS_P2_KEY3, + BMS_P2_KEY4, + BMS_P2_KEY5, + BMS_P2_TURN, + BMS_P2_KEY6, + BMS_P2_KEY7, +}; class NotesLoader { protected: diff --git a/stepmania/src/NotesLoaderBMS.cpp b/stepmania/src/NotesLoaderBMS.cpp index 0670fd9449..35c199658a 100644 --- a/stepmania/src/NotesLoaderBMS.cpp +++ b/stepmania/src/NotesLoaderBMS.cpp @@ -28,6 +28,66 @@ // 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 // + +// MD 10/26/03 - Hey, folks, BMSes are used for things BESIDES DDR steps, +// and so we're borking up BMSes that are for pnm/bm/etc. +// +// pnm-nine: 11-15,21-24 +// pnm-five: 13-15,21-22 +// bm-single: 11-16 +// bm-double: 11-16,21-26 +// bm-single7: 11-16,18-19 +// bm-double7: 11-16,18-19,21-26,28-29 +// +// So the magics for these are: +// pnm-nine: nothing >5, with 12, 14, 22 and/or 24 +// pnm-five: nothing >5, with 14 and/or 22 +// bm-*: 18/19 - 7-key modes have 16/17/26/27 +// + +int iTracks[MAX_NOTE_TRACKS]; + +void BMSLoader::PushTrackNumForMagic( int iTrackNum ) { + int ix = (iTrackNum < 20) ? (iTrackNum - 11) : (iTrackNum - 12); + iTracks[ix]++; +} +StepsType BMSLoader::CheckTracksMagic( void ) { + int iTrackCount = 0; + for (int ix = 0; ix 40 ) @@ -42,6 +102,7 @@ void BMSLoader::mapBMSTrackToDanceNote( int iBMSTrack, int &iDanceColOut, char & switch( iBMSTrack ) { +/* MD 10/26/03 - Let's try this with the new numbers. case 11: iDanceColOut = DANCE_NOTE_PAD1_LEFT; break; case 12: iDanceColOut = DANCE_NOTE_PAD1_UPLEFT; break; case 13: iDanceColOut = DANCE_NOTE_PAD1_DOWN; break; @@ -54,6 +115,23 @@ void BMSLoader::mapBMSTrackToDanceNote( int iBMSTrack, int &iDanceColOut, char & case 24: iDanceColOut = DANCE_NOTE_PAD2_UP; break; case 25: iDanceColOut = DANCE_NOTE_PAD2_UPRIGHT; break; case 26: iDanceColOut = DANCE_NOTE_PAD2_RIGHT; break; +*/ + case 11: iDanceColOut = BMS_P1_KEY1; break; + case 12: iDanceColOut = BMS_P1_KEY2; break; + case 13: iDanceColOut = BMS_P1_KEY3; break; + case 14: iDanceColOut = BMS_P1_KEY4; break; + case 15: iDanceColOut = BMS_P1_KEY5; break; + case 16: iDanceColOut = BMS_P1_TURN; break; + case 18: iDanceColOut = BMS_P1_KEY6; break; + case 19: iDanceColOut = BMS_P1_KEY7; break; + case 21: iDanceColOut = BMS_P2_KEY1; break; + case 22: iDanceColOut = BMS_P2_KEY2; break; + case 23: iDanceColOut = BMS_P2_KEY3; break; + case 24: iDanceColOut = BMS_P2_KEY4; break; + case 25: iDanceColOut = BMS_P2_KEY5; break; + case 26: iDanceColOut = BMS_P2_TURN; break; + case 28: iDanceColOut = BMS_P2_KEY6; break; + case 29: iDanceColOut = BMS_P2_KEY7; break; default: iDanceColOut = -1; break; } } @@ -114,6 +192,7 @@ bool BMSLoader::LoadFromBMSFile( const CString &sPath, Steps &out ) out.m_StepsType = STEPS_TYPE_DANCE_COUPLE; break; case 3: // double + // Fix it if we find that. out.m_StepsType = STEPS_TYPE_DANCE_DOUBLE; break; default: @@ -155,6 +234,11 @@ bool BMSLoader::LoadFromBMSFile( const CString &sPath, Steps &out ) int iMeasureNo = atoi( value_name.substr(1,3).c_str() ); int iTrackNum = atoi( value_name.substr(4,2).c_str() ); + // MD 10/26/03 - fix for Pop N' and such, including "if there are six panels, then we have Solo" - check here, + // then put the correct step type later + BMS_PushTrackNumForMagic(iTrackNum); + // end MD 10/26/03 + CString &sNoteData = value_data; vector arrayNotes; @@ -167,6 +251,8 @@ bool BMSLoader::LoadFromBMSFile( const CString &sPath, Steps &out ) const unsigned iNumNotesInThisMeasure = arrayNotes.size(); //LOG->Trace( "%s:%s: iMeasureNo = %d, iNoteNum = %d, iNumNotesInThisMeasure = %d", // valuename.c_str(), sNoteData.c_str(), iMeasureNo, iNoteNum, iNumNotesInThisMeasure ); + + for( unsigned j=0; jMoveTapNoteTrack(DANCE_NOTE_PAD1_UP, DANCE_NOTE_PAD1_UPRIGHT); } + */ // we're done reading in all of the BMS values if( out.m_StepsType == STEPS_TYPE_INVALID ) @@ -210,31 +305,94 @@ bool BMSLoader::LoadFromBMSFile( const CString &sPath, Steps &out ) switch( out.m_StepsType ) { + // MD 10/26/03 fix PNM &c. case STEPS_TYPE_DANCE_SINGLE: - iTransformNewToOld[0] = DANCE_NOTE_PAD1_LEFT; - iTransformNewToOld[1] = DANCE_NOTE_PAD1_DOWN; - iTransformNewToOld[2] = DANCE_NOTE_PAD1_UP; - iTransformNewToOld[3] = DANCE_NOTE_PAD1_RIGHT; + iTransformNewToOld[0] = BMS_P1_KEY1; + iTransformNewToOld[1] = BMS_P1_KEY3; + iTransformNewToOld[2] = BMS_P1_KEY5; + iTransformNewToOld[3] = BMS_P1_TURN; break; case STEPS_TYPE_DANCE_DOUBLE: case STEPS_TYPE_DANCE_COUPLE: - iTransformNewToOld[0] = DANCE_NOTE_PAD1_LEFT; - iTransformNewToOld[1] = DANCE_NOTE_PAD1_DOWN; - iTransformNewToOld[2] = DANCE_NOTE_PAD1_UP; - iTransformNewToOld[3] = DANCE_NOTE_PAD1_RIGHT; - iTransformNewToOld[4] = DANCE_NOTE_PAD2_LEFT; - iTransformNewToOld[5] = DANCE_NOTE_PAD2_DOWN; - iTransformNewToOld[6] = DANCE_NOTE_PAD2_UP; - iTransformNewToOld[7] = DANCE_NOTE_PAD2_RIGHT; + iTransformNewToOld[0] = BMS_P1_KEY1; + iTransformNewToOld[1] = BMS_P1_KEY3; + iTransformNewToOld[2] = BMS_P1_KEY5; + iTransformNewToOld[3] = BMS_P1_TURN; + iTransformNewToOld[4] = BMS_P2_KEY1; + iTransformNewToOld[5] = BMS_P2_KEY3; + iTransformNewToOld[6] = BMS_P2_KEY5; + iTransformNewToOld[7] = BMS_P2_TURN; break; case STEPS_TYPE_DANCE_SOLO: - iTransformNewToOld[0] = DANCE_NOTE_PAD1_LEFT; - iTransformNewToOld[1] = DANCE_NOTE_PAD1_UPLEFT; - iTransformNewToOld[2] = DANCE_NOTE_PAD1_DOWN; - iTransformNewToOld[3] = DANCE_NOTE_PAD1_UP; - iTransformNewToOld[4] = DANCE_NOTE_PAD1_UPRIGHT; - iTransformNewToOld[5] = DANCE_NOTE_PAD1_RIGHT; + case STEPS_TYPE_BM_SINGLE: + // Hey! Why the hell are these exactly the same? :-) + iTransformNewToOld[0] = BMS_P1_KEY1; + iTransformNewToOld[1] = BMS_P1_KEY2; + iTransformNewToOld[2] = BMS_P1_KEY3; + iTransformNewToOld[3] = BMS_P1_KEY4; + iTransformNewToOld[4] = BMS_P1_KEY5; + iTransformNewToOld[5] = BMS_P1_TURN; break; + case STEPS_TYPE_PNM_FIVE: + iTransformNewToOld[0] = BMS_P1_KEY3; + iTransformNewToOld[1] = BMS_P1_KEY4; + iTransformNewToOld[2] = BMS_P1_KEY5; + iTransformNewToOld[3] = BMS_P2_KEY1; + iTransformNewToOld[4] = BMS_P2_KEY2; + break; + case STEPS_TYPE_PNM_NINE: + iTransformNewToOld[0] = BMS_P1_KEY1; + iTransformNewToOld[1] = BMS_P1_KEY2; + iTransformNewToOld[2] = BMS_P1_KEY3; + iTransformNewToOld[3] = BMS_P1_KEY4; + iTransformNewToOld[4] = BMS_P1_KEY5; + iTransformNewToOld[5] = BMS_P2_KEY1; + iTransformNewToOld[6] = BMS_P2_KEY2; + iTransformNewToOld[7] = BMS_P2_KEY3; + iTransformNewToOld[8] = BMS_P2_KEY4; + break; + /* MD 10/26/03 - uncomment this section when we get around to BM support outside 5-key + case STEPS_TYPE_BM_DOUBLE: + iTransformNewToOld[0] = BMS_P1_KEY1; + iTransformNewToOld[1] = BMS_P1_KEY2; + iTransformNewToOld[2] = BMS_P1_KEY3; + iTransformNewToOld[3] = BMS_P1_KEY4; + iTransformNewToOld[4] = BMS_P1_KEY5; + iTransformNewToOld[5] = BMS_P1_TURN; + iTransformNewToOld[6] = BMS_P2_KEY1; + iTransformNewToOld[7] = BMS_P2_KEY2; + iTransformNewToOld[8] = BMS_P2_KEY3; + iTransformNewToOld[9] = BMS_P2_KEY4; + iTransformNewToOld[10] = BMS_P2_KEY5; + iTransformNewToOld[11] = BMS_P2_TURN; + break; + case STEPS_TYPE_BM_SINGLE7: + iTransformNewToOld[0] = BMS_P1_KEY1; + iTransformNewToOld[1] = BMS_P1_KEY2; + iTransformNewToOld[2] = BMS_P1_KEY3; + iTransformNewToOld[3] = BMS_P1_KEY4; + iTransformNewToOld[4] = BMS_P1_KEY5; + iTransformNewToOld[5] = BMS_P1_KEY6; + iTransformNewToOld[6] = BMS_P1_KEY7; + iTransformNewToOld[7] = BMS_P1_TURN; + case STEPS_TYPE_BM_DOUBLE7: + iTransformNewToOld[0] = BMS_P1_KEY1; + iTransformNewToOld[1] = BMS_P1_KEY2; + iTransformNewToOld[2] = BMS_P1_KEY3; + iTransformNewToOld[3] = BMS_P1_KEY4; + iTransformNewToOld[4] = BMS_P1_KEY5; + iTransformNewToOld[5] = BMS_P1_KEY6; + iTransformNewToOld[6] = BMS_P1_KEY7; + iTransformNewToOld[7] = BMS_P1_TURN; + iTransformNewToOld[8] = BMS_P2_KEY1; + iTransformNewToOld[9] = BMS_P2_KEY2; + iTransformNewToOld[10] = BMS_P2_KEY3; + iTransformNewToOld[11] = BMS_P2_KEY4; + iTransformNewToOld[12] = BMS_P2_KEY5; + iTransformNewToOld[13] = BMS_P2_KEY6; + iTransformNewToOld[14] = BMS_P2_KEY7; + iTransformNewToOld[15] = BMS_P2_TURN; + */ default: ASSERT(0); } @@ -415,6 +573,12 @@ bool BMSLoader::LoadFromDir( CString sDir, Song &out ) // // Thank you. + // MD 10/26/03 - And allow me to add to that my opinion of the BMS format in general. + // + // ()*&@^*&^@$(*&^!@(*&^($*&^!#(*&@!&*#*#*@#*@#(*@(%@(*! + // + // end MD 10/26/03 + case 8: { // indirect bpm // This is a very inefficient way to parse, but it doesn't matter much // because this is only parsed on the first run after the song is installed. diff --git a/stepmania/src/NotesLoaderBMS.h b/stepmania/src/NotesLoaderBMS.h index 06c00ae6b6..5d4a815c39 100644 --- a/stepmania/src/NotesLoaderBMS.h +++ b/stepmania/src/NotesLoaderBMS.h @@ -8,6 +8,8 @@ class BMSLoader: public NotesLoader { bool LoadFromBMSFile( const CString &sPath, Steps &out1 ); void mapBMSTrackToDanceNote( int iBMSTrack, int &iDanceColOut, char &cNoteCharOut ); + void PushTrackNumForMagic( int iTrackNum ); + StepsType CheckTracksMagic( void ); public: void GetApplicableFiles( CString sPath, CStringArray &out );