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
false, // m_bUsedForGameplay
true, // m_bUsedForEdit
"couple (edit-only)", // m_szName
"couple (edit)", // m_szName
{ NOTES_TYPE_DANCE_COUPLE, NOTES_TYPE_DANCE_COUPLE }, // m_NotesTypes
StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType
{ 160, 480 }, // m_iCenterX
8, // m_iColsPerPlayer
{ // m_ColumnInfo[NUM_PLAYERS][MAX_COLS_PER_PLAYER];
{ // PLAYER_1
{ 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_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_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 },
{ 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_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_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 },
},
{ // PLAYER_2
{ TRACK_1, GAME_CONTROLLER_1, DANCE_BUTTON_LEFT, -DANCE_COL_SPACING*1.5f },
{ TRACK_2, GAME_CONTROLLER_1, DANCE_BUTTON_DOWN, -DANCE_COL_SPACING*0.5f },
{ TRACK_3, GAME_CONTROLLER_1, DANCE_BUTTON_UP, +DANCE_COL_SPACING*0.5f },
{ TRACK_4, GAME_CONTROLLER_1, DANCE_BUTTON_RIGHT, +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*3.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_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];
@@ -714,7 +718,7 @@ StyleDef g_StyleDefs[NUM_STYLES] =
GAME_PUMP, // m_Game
false, // m_bUsedForGameplay
true, // m_bUsedForEdit
"couple (edit-only)", // m_szName
"couple (edit)", // m_szName
{ NOTES_TYPE_PUMP_COUPLE,NOTES_TYPE_PUMP_COUPLE}, // m_NotesTypes
StyleDef::ONE_PLAYER_ONE_CREDIT, // m_StyleType
{ 160, 480 }, // m_iCenterX
+29 -32
View File
@@ -865,50 +865,46 @@ void NoteData::LoadTransformedSlidingWindow( NoteData* pOriginal, int iNewNumTra
pOriginal->ConvertHoldNotesTo4s();
m_iNumTracks = iNewNumTracks;
int iCurTrackOffset = 0;
int iTrackOffsetMin = 0;
int iTrackOffsetMax = abs( iNewNumTracks - pOriginal->m_iNumTracks );
int bOffsetIncreasing = true;
int iLastRow = pOriginal->GetLastRow();
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++ )
{
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' )
this->m_TapNotes[iNewTrack][r] = pOriginal->m_TapNotes[iOldTrack][r];
}
}
pOriginal->Convert4sToHoldNotes();
Convert4sToHoldNotes();
}
void NoteData::LoadTransformedMirrorOnCross( NoteData* pOriginal, int iNewNumTracks )
{
ASSERT( iNewNumTracks == pOriginal->m_iNumTracks*2 );
m_iNumTracks = iNewNumTracks;
pOriginal->ConvertHoldNotesTo4s();
bool bMirror = false;
int iMirrorTrack = pOriginal->m_iNumTracks/2-1;
int iLastRow = pOriginal->GetLastRow();
for( int r=0; r<=iLastRow; r++ )
{
for( int t=0; t<=pOriginal->m_iNumTracks; t++ )
if( r % (ROWS_PER_MEASURE*2) == 0 ) // adjust sliding window every two measures
{
int iOldTrack = t;
int iNewTrack = bMirror ? m_iNumTracks - iOldTrack : iOldTrack;
if( pOriginal->m_TapNotes[iOldTrack][r] != '0' )
// See if there is a hold crossing the beginning of this measure
pOriginal->Convert4sToHoldNotes();
bool bHoldCrossesThisMeasure = false;
for( int i=0; i<pOriginal->m_iNumHoldNotes; i++ )
{
this->m_TapNotes[iNewTrack][r] = pOriginal->m_TapNotes[iOldTrack][r];
if( iOldTrack == iMirrorTrack )
bMirror ^= true;
const HoldNote& hn = pOriginal->m_HoldNotes[i];
if( hn.m_fStartBeat < NoteRowToBeat(r) && hn.m_fEndBeat > NoteRowToBeat(r) )
{
bHoldCrossesThisMeasure = true;
break;
}
}
pOriginal->ConvertHoldNotesTo4s();
// adjust offset
if( !bHoldCrossesThisMeasure )
{
iCurTrackOffset += bOffsetIncreasing ? 1 : -1;
if( iCurTrackOffset == iTrackOffsetMin || iCurTrackOffset == iTrackOffsetMax )
bOffsetIncreasing ^= true;
CLAMP( iCurTrackOffset, iTrackOffsetMin, iTrackOffsetMax );
}
}
}
@@ -917,6 +913,7 @@ void NoteData::LoadTransformedMirrorOnCross( NoteData* pOriginal, int iNewNumTra
Convert4sToHoldNotes();
}
NoteType NoteData::GetSmallestNoteTypeForMeasure( int iMeasureIndex )
{
const int iMeasureStartIndex = iMeasureIndex * ROWS_PER_MEASURE;
+1 -2
View File
@@ -89,8 +89,7 @@ public:
// Transformations
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 LoadTransformedMirrorOnCross( NoteData* pOriginal, int iNewNumTracks ); // useful for autogenerating double patterns
void LoadTransformedSlidingWindow( NoteData* pOriginal, int iNewNumTracks ); // used by autogen
void CropToLeftSide();
+10 -3
View File
@@ -33,7 +33,7 @@
#include "NotesLoaderKSF.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)
@@ -548,10 +548,15 @@ void Song::TidyUpData()
/* Get Notes that match a given style and player. */
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
{
if( m_apNotes[i]->m_NotesType == s->m_NotesTypes[p] )
if( m_apNotes[i]->m_NotesType == nt )
arrayAddTo.Add( m_apNotes[i] );
}
}
@@ -731,7 +736,9 @@ void Song::AddAutoGenNotes()
{
int iNumTracks = GAMEMAN->NotesTypeToNumTracks(nt);
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;
iBestTrackDifference = iTrackDifference;
+1
View File
@@ -189,6 +189,7 @@ public:
bool SongHasNotesType( NotesType nt ) const;
bool SongHasNotesTypeAndDifficulty( NotesType nt, Difficulty dc ) 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;
bool IsNew() const;
bool IsEasy( NotesType nt ) const;