smarter autogen for doubles

This commit is contained in:
Chris Danford
2002-10-05 20:03:14 +00:00
parent adc450a3ac
commit 646d4ba6d9
5 changed files with 59 additions and 51 deletions
+18 -14
View File
@@ -529,27 +529,31 @@ StyleDef g_StyleDefs[NUM_STYLES] =
GAME_DANCE, // m_Game GAME_DANCE, // m_Game
false, // m_bUsedForGameplay false, // m_bUsedForGameplay
true, // m_bUsedForEdit true, // m_bUsedForEdit
"couple (edit-only)", // m_szName "couple (edit)", // m_szName
{ NOTES_TYPE_DANCE_COUPLE, NOTES_TYPE_DANCE_COUPLE }, // m_NotesTypes { NOTES_TYPE_DANCE_COUPLE, NOTES_TYPE_DANCE_COUPLE }, // m_NotesTypes
StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType
{ 160, 480 }, // m_iCenterX { 160, 480 }, // m_iCenterX
8, // m_iColsPerPlayer 8, // m_iColsPerPlayer
{ // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER]; { // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER];
{ // PLAYER_1 { // PLAYER_1
{ TRACK_1, GAME_CONTROLLER_1, DANCE_BUTTON_LEFT, +DANCE_COL_SPACING*4.0f }, { TRACK_1, GAME_CONTROLLER_1, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*4.0f },
{ TRACK_2, GAME_CONTROLLER_1, DANCE_BUTTON_DOWN, +DANCE_COL_SPACING*3.0f }, { TRACK_2, GAME_CONTROLLER_1, DANCE_BUTTON_DOWN, -DANCE_COL_SPACING*3.0f },
{ TRACK_3, GAME_CONTROLLER_1, DANCE_BUTTON_UP, +DANCE_COL_SPACING*2.0f }, { TRACK_3, GAME_CONTROLLER_1, DANCE_BUTTON_UP, -DANCE_COL_SPACING*2.0f },
{ TRACK_4, GAME_CONTROLLER_1, DANCE_BUTTON_RIGHT, +DANCE_COL_SPACING*1.0f }, { TRACK_4, GAME_CONTROLLER_1, DANCE_BUTTON_RIGHT, -DANCE_COL_SPACING*1.0f },
{ TRACK_5, GAME_CONTROLLER_2, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*1.0f }, { TRACK_5, GAME_CONTROLLER_2, DANCE_BUTTON_LEFT, +DANCE_COL_SPACING*1.0f },
{ TRACK_6, GAME_CONTROLLER_2, DANCE_BUTTON_DOWN, -DANCE_COL_SPACING*2.0f }, { TRACK_6, GAME_CONTROLLER_2, DANCE_BUTTON_DOWN, +DANCE_COL_SPACING*2.0f },
{ TRACK_7, GAME_CONTROLLER_2, DANCE_BUTTON_UP, -DANCE_COL_SPACING*3.0f }, { TRACK_7, GAME_CONTROLLER_2, DANCE_BUTTON_UP, +DANCE_COL_SPACING*3.0f },
{ TRACK_8, GAME_CONTROLLER_2, DANCE_BUTTON_RIGHT, -DANCE_COL_SPACING*4.0f }, { TRACK_8, GAME_CONTROLLER_2, DANCE_BUTTON_RIGHT, +DANCE_COL_SPACING*4.0f },
}, },
{ // PLAYER_2 { // PLAYER_2
{ TRACK_1, GAME_CONTROLLER_1, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*1.5f }, { TRACK_1, GAME_CONTROLLER_1, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*4.0f },
{ TRACK_2, GAME_CONTROLLER_1, DANCE_BUTTON_DOWN, -DANCE_COL_SPACING*0.5f }, { TRACK_2, GAME_CONTROLLER_1, DANCE_BUTTON_DOWN, -DANCE_COL_SPACING*3.0f },
{ TRACK_3, GAME_CONTROLLER_1, DANCE_BUTTON_UP, +DANCE_COL_SPACING*0.5f }, { TRACK_3, GAME_CONTROLLER_1, DANCE_BUTTON_UP, -DANCE_COL_SPACING*2.0f },
{ TRACK_4, GAME_CONTROLLER_1, DANCE_BUTTON_RIGHT, +DANCE_COL_SPACING*1.5f }, { TRACK_4, GAME_CONTROLLER_1, DANCE_BUTTON_RIGHT, -DANCE_COL_SPACING*1.0f },
{ TRACK_5, GAME_CONTROLLER_2, DANCE_BUTTON_LEFT, +DANCE_COL_SPACING*1.0f },
{ TRACK_6, GAME_CONTROLLER_2, DANCE_BUTTON_DOWN, +DANCE_COL_SPACING*2.0f },
{ TRACK_7, GAME_CONTROLLER_2, DANCE_BUTTON_UP, +DANCE_COL_SPACING*3.0f },
{ TRACK_8, GAME_CONTROLLER_2, DANCE_BUTTON_RIGHT, +DANCE_COL_SPACING*4.0f },
}, },
}, },
{ // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER]; { // m_iColumnDrawOrder[MAX_COLS_PER_PLAYER];
@@ -714,7 +718,7 @@ StyleDef g_StyleDefs[NUM_STYLES] =
GAME_PUMP, // m_Game GAME_PUMP, // m_Game
false, // m_bUsedForGameplay false, // m_bUsedForGameplay
true, // m_bUsedForEdit true, // m_bUsedForEdit
"couple (edit-only)", // m_szName "couple (edit)", // m_szName
{ NOTES_TYPE_PUMP_COUPLE,NOTES_TYPE_PUMP_COUPLE}, // m_NotesTypes { NOTES_TYPE_PUMP_COUPLE,NOTES_TYPE_PUMP_COUPLE}, // m_NotesTypes
StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType
{ 160, 480 }, // m_iCenterX { 160, 480 }, // m_iCenterX
+27 -30
View File
@@ -865,50 +865,46 @@ void NoteData::LoadTransformedSlidingWindow( NoteData* pOriginal, int iNewNumTra
pOriginal->ConvertHoldNotesTo4s(); pOriginal->ConvertHoldNotesTo4s();
m_iNumTracks = iNewNumTracks; m_iNumTracks = iNewNumTracks;
int iCurTrackOffset = 0;
int iTrackOffsetMin = 0;
int iTrackOffsetMax = abs( iNewNumTracks - pOriginal->m_iNumTracks );
int bOffsetIncreasing = true;
int iLastRow = pOriginal->GetLastRow(); int iLastRow = pOriginal->GetLastRow();
for( int r=0; r<=iLastRow; r++ ) for( int r=0; r<=iLastRow; r++ )
{ {
int iMeasure = (int)(NoteRowToBeat(r) / BEATS_PER_MEASURE); // copy notes in this measure
for( int t=0; t<=pOriginal->m_iNumTracks; t++ ) for( int t=0; t<=pOriginal->m_iNumTracks; t++ )
{ {
int iOldTrack = t; int iOldTrack = t;
int iNewTrack = (iOldTrack + iMeasure/4) % iNewNumTracks; // change sliding window every 4 measures int iNewTrack = (iOldTrack + iCurTrackOffset) % iNewNumTracks;
if( pOriginal->m_TapNotes[iOldTrack][r] != '0' ) if( pOriginal->m_TapNotes[iOldTrack][r] != '0' )
this->m_TapNotes[iNewTrack][r] = pOriginal->m_TapNotes[iOldTrack][r]; this->m_TapNotes[iNewTrack][r] = pOriginal->m_TapNotes[iOldTrack][r];
} }
}
pOriginal->Convert4sToHoldNotes(); if( r % (ROWS_PER_MEASURE*2) == 0 ) // adjust sliding window every two measures
Convert4sToHoldNotes();
}
void NoteData::LoadTransformedMirrorOnCross( NoteData* pOriginal, int iNewNumTracks )
{ {
ASSERT( iNewNumTracks == pOriginal->m_iNumTracks*2 ); // See if there is a hold crossing the beginning of this measure
pOriginal->Convert4sToHoldNotes();
m_iNumTracks = iNewNumTracks; bool bHoldCrossesThisMeasure = false;
for( int i=0; i<pOriginal->m_iNumHoldNotes; i++ )
{
const HoldNote& hn = pOriginal->m_HoldNotes[i];
if( hn.m_fStartBeat < NoteRowToBeat(r) && hn.m_fEndBeat > NoteRowToBeat(r) )
{
bHoldCrossesThisMeasure = true;
break;
}
}
pOriginal->ConvertHoldNotesTo4s(); pOriginal->ConvertHoldNotesTo4s();
bool bMirror = false; // adjust offset
int iMirrorTrack = pOriginal->m_iNumTracks/2-1; if( !bHoldCrossesThisMeasure )
int iLastRow = pOriginal->GetLastRow();
for( int r=0; r<=iLastRow; r++ )
{ {
for( int t=0; t<=pOriginal->m_iNumTracks; t++ ) iCurTrackOffset += bOffsetIncreasing ? 1 : -1;
{ if( iCurTrackOffset == iTrackOffsetMin || iCurTrackOffset == iTrackOffsetMax )
int iOldTrack = t; bOffsetIncreasing ^= true;
int iNewTrack = bMirror ? m_iNumTracks - iOldTrack : iOldTrack; CLAMP( iCurTrackOffset, iTrackOffsetMin, iTrackOffsetMax );
if( pOriginal->m_TapNotes[iOldTrack][r] != '0' )
{
this->m_TapNotes[iNewTrack][r] = pOriginal->m_TapNotes[iOldTrack][r];
if( iOldTrack == iMirrorTrack )
bMirror ^= true;
} }
} }
} }
@@ -917,6 +913,7 @@ void NoteData::LoadTransformedMirrorOnCross( NoteData* pOriginal, int iNewNumTra
Convert4sToHoldNotes(); Convert4sToHoldNotes();
} }
NoteType NoteData::GetSmallestNoteTypeForMeasure( int iMeasureIndex ) NoteType NoteData::GetSmallestNoteTypeForMeasure( int iMeasureIndex )
{ {
const int iMeasureStartIndex = iMeasureIndex * ROWS_PER_MEASURE; const int iMeasureStartIndex = iMeasureIndex * ROWS_PER_MEASURE;
+1 -2
View File
@@ -89,8 +89,7 @@ public:
// Transformations // Transformations
void LoadTransformed( NoteData* pOriginal, int iNewNumTracks, const int iOriginalTrackToTakeFrom[] ); // -1 for iOriginalTracksToTakeFrom means no track void LoadTransformed( NoteData* pOriginal, int iNewNumTracks, const int iOriginalTrackToTakeFrom[] ); // -1 for iOriginalTracksToTakeFrom means no track
void LoadTransformedSlidingWindow( NoteData* pOriginal, int iNewNumTracks ); // useful for autogenerating DDR->Pump, Pump->DDR void LoadTransformedSlidingWindow( NoteData* pOriginal, int iNewNumTracks ); // used by autogen
void LoadTransformedMirrorOnCross( NoteData* pOriginal, int iNewNumTracks ); // useful for autogenerating double patterns
void CropToLeftSide(); void CropToLeftSide();
+10 -3
View File
@@ -33,7 +33,7 @@
#include "NotesLoaderKSF.h" #include "NotesLoaderKSF.h"
#include "NotesWriterDWI.h" #include "NotesWriterDWI.h"
const int FILE_CACHE_VERSION = 92; // increment this when Song or Notes changes to invalidate cache const int FILE_CACHE_VERSION = 97; // increment this when Song or Notes changes to invalidate cache
int CompareBPMSegments(const void *arg1, const void *arg2) int CompareBPMSegments(const void *arg1, const void *arg2)
@@ -548,10 +548,15 @@ void Song::TidyUpData()
/* Get Notes that match a given style and player. */ /* Get Notes that match a given style and player. */
void Song::GetNotesThatMatch( const StyleDef *s, int p, CArray<Notes*, Notes*>& arrayAddTo ) const void Song::GetNotesThatMatch( const StyleDef *s, int p, CArray<Notes*, Notes*>& arrayAddTo ) const
{
GetNotesThatMatch( s->m_NotesTypes[p], arrayAddTo );
}
void Song::GetNotesThatMatch( NotesType nt, CArray<Notes*, Notes*>& arrayAddTo ) const
{ {
for( int i=0; i<m_apNotes.GetSize(); i++ ) // for each of the Song's Notes for( int i=0; i<m_apNotes.GetSize(); i++ ) // for each of the Song's Notes
{ {
if( m_apNotes[i]->m_NotesType == s->m_NotesTypes[p] ) if( m_apNotes[i]->m_NotesType == nt )
arrayAddTo.Add( m_apNotes[i] ); arrayAddTo.Add( m_apNotes[i] );
} }
} }
@@ -731,7 +736,9 @@ void Song::AddAutoGenNotes()
{ {
int iNumTracks = GAMEMAN->NotesTypeToNumTracks(nt); int iNumTracks = GAMEMAN->NotesTypeToNumTracks(nt);
int iTrackDifference = abs(iNumTracks-iNumTracksOfMissing); int iTrackDifference = abs(iNumTracks-iNumTracksOfMissing);
if( SongHasNotesType(nt) && iTrackDifference<iBestTrackDifference ) CArray<Notes*,Notes*> apNotes;
this->GetNotesThatMatch( nt, apNotes );
if( iTrackDifference<iBestTrackDifference && apNotes.GetSize() > 0 && apNotes[0]->m_sDescription.Find("autogen")==-1 )
{ {
ntBestMatch = nt; ntBestMatch = nt;
iBestTrackDifference = iTrackDifference; iBestTrackDifference = iTrackDifference;
+1
View File
@@ -189,6 +189,7 @@ public:
bool SongHasNotesType( NotesType nt ) const; bool SongHasNotesType( NotesType nt ) const;
bool SongHasNotesTypeAndDifficulty( NotesType nt, Difficulty dc ) const; bool SongHasNotesTypeAndDifficulty( NotesType nt, Difficulty dc ) const;
void GetNotesThatMatch( const StyleDef *s, int p, CArray<Notes*, Notes*>& arrayAddTo ) const; void GetNotesThatMatch( const StyleDef *s, int p, CArray<Notes*, Notes*>& arrayAddTo ) const;
void GetNotesThatMatch( NotesType nt, CArray<Notes*, Notes*>& arrayAddTo ) const;
int GetNumTimesPlayed() const; int GetNumTimesPlayed() const;
bool IsNew() const; bool IsNew() const;
bool IsEasy( NotesType nt ) const; bool IsEasy( NotesType nt ) const;