Files
itgmania212121/stepmania/src/song.h
T

194 lines
5.8 KiB
C++
Raw Normal View History

2002-04-16 17:31:00 +00:00
#pragma once
/*
-----------------------------------------------------------------------------
Class: Song
2002-07-02 00:27:58 +00:00
Desc: See header.
2002-05-19 01:59:48 +00:00
Copyright (c) 2001-2002 by the person(s) listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
2001-11-03 10:52:42 +00:00
2002-05-01 19:14:55 +00:00
#include "GameConstantsAndTypes.h"
2002-09-07 11:45:15 +00:00
#include "Grade.h"
struct Notes;
class StyleDef;
2001-11-30 09:38:35 +00:00
extern const int FILE_CACHE_VERSION;
2001-12-28 10:15:59 +00:00
struct BPMSegment
{
BPMSegment() { m_fStartBeat = m_fBPM = -1; };
2002-06-24 22:04:31 +00:00
BPMSegment( float s, float b ) { m_fStartBeat = s; m_fBPM = b; };
2001-12-28 10:15:59 +00:00
float m_fStartBeat;
float m_fBPM;
};
2002-07-11 19:02:26 +00:00
struct StopSegment
2001-12-28 10:15:59 +00:00
{
2002-07-11 19:02:26 +00:00
StopSegment() { m_fStartBeat = m_fStopSeconds = -1; };
StopSegment( float s, float f ) { m_fStartBeat = s; m_fStopSeconds = f; };
2001-12-28 10:15:59 +00:00
float m_fStartBeat;
2002-07-11 19:02:26 +00:00
float m_fStopSeconds;
};
struct BackgroundChange
2002-07-11 19:02:26 +00:00
{
BackgroundChange() { m_fStartBeat = -1; };
BackgroundChange( float s, CString sBGName ) { m_fStartBeat = s; m_sBGName = sBGName; };
2002-07-11 19:02:26 +00:00
float m_fStartBeat;
CString m_sBGName;
2001-12-19 01:50:57 +00:00
};
2001-11-03 10:52:42 +00:00
class Song
{
2002-09-06 23:36:04 +00:00
public:
2002-08-30 04:28:12 +00:00
/* Set when this song should be displayed in the music wheel: */
enum { SHOW_ALWAYS, /* all the time */
SHOW_ROULETTE, /* only when rouletting */
SHOW_NEVER } /* never (unless song hiding is turned off) */
m_SelectionDisplay;
2002-09-06 23:36:04 +00:00
Song();
2002-06-14 22:25:22 +00:00
~Song();
bool LoadWithoutCache( CString sDir );
2002-09-06 23:36:04 +00:00
bool LoadFromSongDir( CString sDir );
2002-06-30 23:19:33 +00:00
2002-04-16 17:31:00 +00:00
void TidyUpData(); // call after loading to clean up invalid data
2001-11-03 10:52:42 +00:00
void SaveToSMFile( CString sPath, bool bSavingCache );
void SaveToSongFileAndDWI(); // saves SM, then saves DWI so that the SM is the master copy and NoteTypes not supported by DWI are not lost
2002-06-30 23:19:33 +00:00
void SaveToCacheFile();
void SaveToSongFile(); // no path means save to SongFilePath
2002-05-19 01:59:48 +00:00
const CString &GetSongFilePath() const;
CString GetCacheFilePath() const;
2002-06-29 11:59:09 +00:00
void AddAutoGenNotes();
/* Directory this song data came from: */
2002-06-29 11:59:09 +00:00
CString m_sSongDir;
/* Filename associated with this file. This will always have
* an .SM extension. If we loaded an .SM, this will point to
* it, but if we loaded any other type, this will point to a
* generated .SM filename. */
CString m_sSongFileName;
2002-06-29 11:59:09 +00:00
CString m_sGroupName;
2001-11-03 10:52:42 +00:00
2002-06-29 11:59:09 +00:00
bool m_bChangedSinceSave;
2001-12-28 10:15:59 +00:00
2002-06-29 11:59:09 +00:00
CString m_sMainTitle;
CString m_sSubTitle;
CString m_sArtist;
CString m_sCredit;
2001-12-19 14:56:22 +00:00
CString GetFullTitle() const { return m_sMainTitle + (m_sSubTitle.GetLength()? (" " + m_sSubTitle):""); }
2002-07-11 19:02:26 +00:00
static void GetMainAndSubTitlesFromFullTitle( const CString sFullTitle, CString &sMainTitleOut, CString &sSubTitleOut );
2002-04-28 20:42:32 +00:00
2002-06-29 11:59:09 +00:00
CString m_sMusicFile;
DWORD m_iMusicBytes;
2002-07-03 21:27:26 +00:00
float m_fBeat0OffsetInSeconds;
2002-06-29 11:59:09 +00:00
float m_fMusicLengthSeconds;
2002-07-11 19:02:26 +00:00
float m_fFirstBeat;
float m_fLastBeat;
2002-06-29 11:59:09 +00:00
float m_fMusicSampleStartSeconds;
float m_fMusicSampleLengthSeconds;
2002-08-18 23:20:18 +00:00
float GetMusicStartBeat() const;
2002-08-18 23:20:18 +00:00
2002-06-29 11:59:09 +00:00
CString m_sBannerFile;
CString m_sBackgroundFile;
CString m_sCDTitleFile;
2002-07-11 19:02:26 +00:00
CString m_sMovieBackgroundFile;
2002-06-29 11:59:09 +00:00
2002-09-06 01:52:27 +00:00
CString GetMusicPath() const {return m_sMusicFile.Find('.')==0 ? m_sMusicFile : m_sSongDir+m_sMusicFile; };
CString GetBannerPath() const {return m_sSongDir+m_sBannerFile; };
CString GetBackgroundPath() const {return m_sSongDir+m_sBackgroundFile; };
CString GetCDTitlePath() const {return m_sCDTitleFile.Find('.')==0 ? m_sCDTitleFile : m_sSongDir+m_sCDTitleFile; };
CString GetMovieBackgroundPath() const {return m_sSongDir+m_sMovieBackgroundFile; };
2002-06-29 11:59:09 +00:00
2002-09-07 11:45:15 +00:00
bool HasMusic() const;
bool HasBanner() const;
bool HasBackground() const;
bool HasCDTitle() const;
bool HasMovieBackground() const;
bool HasBGChanges() const;
2002-06-29 11:59:09 +00:00
CArray<BPMSegment, BPMSegment&> m_BPMSegments; // this must be sorted before gameplay
2002-07-11 19:02:26 +00:00
CArray<StopSegment, StopSegment&> m_StopSegments; // this must be sorted before gameplay
CArray<BackgroundChange, BackgroundChange&> m_BackgroundChanges; // this must be sorted before gameplay
2002-06-29 11:59:09 +00:00
void AddBPMSegment( BPMSegment seg );
2002-07-11 19:02:26 +00:00
void AddStopSegment( StopSegment seg );
void AddBackgroundChange( BackgroundChange seg );
2002-07-11 19:02:26 +00:00
2002-08-21 00:48:41 +00:00
void GetMinMaxBPM( float &fMinBPM, float &fMaxBPM ) const
{
2001-12-28 10:15:59 +00:00
fMaxBPM = 0;
fMinBPM = 100000; // inf
for( int i=0; i<m_BPMSegments.GetSize(); i++ )
{
2002-08-22 09:31:32 +00:00
const BPMSegment &seg = m_BPMSegments[i];
2001-12-28 10:15:59 +00:00
fMaxBPM = max( seg.m_fBPM, fMaxBPM );
fMinBPM = min( seg.m_fBPM, fMinBPM );
}
};
2002-08-21 00:48:41 +00:00
float GetBPMAtBeat( float fBeat ) const
2002-06-29 11:59:09 +00:00
{
for( int i=0; i<m_BPMSegments.GetSize()-1; i++ )
2002-07-02 00:27:58 +00:00
if( m_BPMSegments[i+1].m_fStartBeat > fBeat )
2002-06-29 11:59:09 +00:00
break;
return m_BPMSegments[i].m_fBPM;
};
2002-07-27 19:29:51 +00:00
BPMSegment& GetBPMSegmentAtBeat( float fBeat )
{
for( int i=0; i<m_BPMSegments.GetSize()-1; i++ )
if( m_BPMSegments[i+1].m_fStartBeat > fBeat )
break;
return m_BPMSegments[i];
};
CString GetBackgroundAtBeat( float fBeat )
2002-07-11 19:02:26 +00:00
{
for( int i=0; i<m_BackgroundChanges.GetSize()-1; i++ )
if( m_BackgroundChanges[i+1].m_fStartBeat > fBeat )
2002-07-11 19:02:26 +00:00
break;
return m_BackgroundChanges[i].m_sBGName;
2002-07-11 19:02:26 +00:00
};
void GetBeatAndBPSFromElapsedTime( float fElapsedTime, float &fBeatOut, float &fBPSOut, bool &bFreezeOut ) const;
float GetElapsedTimeFromBeat( float fBeat ) const;
2002-06-29 11:59:09 +00:00
2002-07-11 19:02:26 +00:00
CArray<Notes*, Notes*> m_apNotes;
2002-01-20 23:29:03 +00:00
bool SongCompleteForStyle( const StyleDef *st ) const;
bool SongHasNotesType( NotesType nt ) const;
bool SongHasNotesTypeAndDifficulty( NotesType nt, DifficultyClass dc ) const;
void GetNotesThatMatch( const StyleDef *s, int p, CArray<Notes*, Notes*>& arrayAddTo ) const;
2002-09-07 11:45:15 +00:00
int GetNumTimesPlayed() const;
bool IsNew() const;
bool IsEasy( NotesType nt ) const;
Grade GetGradeForDifficultyClass( const StyleDef *s, int p, DifficultyClass dc ) const;
2002-08-30 04:28:12 +00:00
bool NormallyDisplayed() const;
bool RouletteDisplayed() const;
2001-11-03 10:52:42 +00:00
};
2002-02-11 04:46:31 +00:00
void SortSongPointerArrayByTitle( CArray<Song*, Song*> &arraySongPointers );
void SortSongPointerArrayByBPM( CArray<Song*, Song*> &arraySongPointers );
void SortSongPointerArrayByArtist( CArray<Song*, Song*> &arraySongPointers );
void SortSongPointerArrayByGroup( CArray<Song*, Song*> &arraySongPointers );
void SortSongPointerArrayByMostPlayed( CArray<Song*, Song*> &arraySongPointers );
2002-01-16 10:01:32 +00:00