Files
itgmania212121/stepmania/src/song.h
T

165 lines
5.0 KiB
C++
Raw Normal View History

2002-04-16 17:31:00 +00:00
#pragma once
/*
-----------------------------------------------------------------------------
Class: Song
Desc: Holds data about a piece of music that can be played by one or more
Games.
2002-04-16 17:31:00 +00:00
Copyright (c) 2001-2002 by the persons listed below. All rights reserved.
Chris Danford
-----------------------------------------------------------------------------
*/
2001-11-03 10:52:42 +00:00
2002-04-16 17:31:00 +00:00
#include "NoteMetadata.h"
2001-11-03 10:52:42 +00:00
#include "GameTypes.h"
#include "RageUtil.h"
//enum DanceStyle; // why is this needed?
2001-11-30 09:38:35 +00:00
2001-12-28 10:15:59 +00:00
struct BPMSegment
{
BPMSegment() { m_fStartBeat = m_fBPM = -1; };
float m_fStartBeat;
float m_fBPM;
};
struct FreezeSegment
{
FreezeSegment() { m_fStartBeat = m_fFreezeSeconds = -1; };
float m_fStartBeat;
float m_fFreezeSeconds;
2001-12-19 01:50:57 +00:00
};
2001-11-03 10:52:42 +00:00
class Song
{
public:
Song();
2001-11-03 10:52:42 +00:00
bool LoadFromSongDir( CString sDir );
2002-04-16 17:31:00 +00:00
bool LoadFromDWIFile( CString sPath );
bool LoadFromBMSDir( CString sDir );
bool LoadFromSMDir( CString sDir );
2002-02-11 04:46:31 +00:00
2002-04-16 17:31:00 +00:00
void Save();
2002-02-11 04:46:31 +00:00
2001-12-28 10:15:59 +00:00
private:
2001-11-03 10:52:42 +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
public:
2002-01-16 10:01:32 +00:00
CString GetSongFilePath() {return m_sSongFilePath; };
CString GetSongFileDir() {return m_sSongDir; };
CString GetGroupName() {return m_sGroupName; };
CString GetMusicPath() {return m_sMusicPath; };
2002-04-28 20:42:32 +00:00
void GetMusicSampleRange( float &fStartSec, float &fEndSec ) { fStartSec = m_fMusicSampleStartSeconds; fEndSec = m_fMusicSampleStartSeconds + m_fMusicSampleLengthSeconds; };
2002-01-16 10:01:32 +00:00
CString GetBannerPath() {return m_sBannerPath; };
CString GetBackgroundPath() {return m_sBackgroundPath; };
CString GetBackgroundMoviePath(){return m_sBackgroundMoviePath; };
2002-04-16 17:31:00 +00:00
CString GetCDTitlePath() {return m_sCDTitlePath; };
2001-11-03 10:52:42 +00:00
2001-12-28 10:15:59 +00:00
2002-01-16 10:01:32 +00:00
bool HasMusic() {return m_sMusicPath != "" && DoesFileExist(GetMusicPath()); };
bool HasBanner() {return m_sBannerPath != "" && DoesFileExist(GetBannerPath()); };
bool HasBackground() {return m_sBackgroundPath != "" && DoesFileExist(GetBackgroundPath()); };
bool HasBackgroundMovie() {return m_sBackgroundMoviePath != ""&& DoesFileExist(GetBackgroundMoviePath()); };
2002-04-16 17:31:00 +00:00
bool HasCDTitle() {return m_sCDTitlePath != "" && DoesFileExist(GetCDTitlePath()); };
2001-12-19 14:56:22 +00:00
2002-04-28 20:42:32 +00:00
CString GetMainTitle() {return m_sMainTitle; };
CString GetSubTitle() {return m_sSubTitle; };
void GetMainAndSubTitlesFromFullTitle( CString sFullTitle, CString &sMainTitleOut, CString &sSubTitleOut )
2002-04-16 17:31:00 +00:00
{
char szSeps[] = { '-', '~' };
for( int i=0; i<sizeof(szSeps); i++ )
{
const char c = szSeps[i];
2002-04-28 20:42:32 +00:00
int iBeginIndex = sFullTitle.Find( c );
2002-04-16 17:31:00 +00:00
if( iBeginIndex == -1 )
continue;
2002-04-28 20:42:32 +00:00
int iEndIndex = sFullTitle.Find( c, iBeginIndex+1 );
2002-04-16 17:31:00 +00:00
if( iEndIndex == -1 )
continue;
2002-04-28 20:42:32 +00:00
sMainTitleOut = sFullTitle.Left( iBeginIndex-1 );
sSubTitleOut = sFullTitle.Mid( iBeginIndex, iEndIndex-iBeginIndex+1 );
2002-04-16 17:31:00 +00:00
return;
}
2002-04-28 20:42:32 +00:00
sMainTitleOut = sFullTitle;
2002-04-16 17:31:00 +00:00
sSubTitleOut = "";
};
2002-04-28 20:42:32 +00:00
2002-01-16 10:01:32 +00:00
CString GetArtist() {return m_sArtist; };
2002-04-16 17:31:00 +00:00
CString GetCredit() {return m_sCredit; };
2001-11-30 21:21:33 +00:00
float GetBeatOffsetInSeconds() {return m_fOffsetInSeconds; };
void SetBeatOffsetInSeconds(float fNewOffset) {m_fOffsetInSeconds = fNewOffset; };
2001-12-28 10:15:59 +00:00
void GetMinMaxBPM( float &fMinBPM, float &fMaxBPM )
{
2001-12-28 10:15:59 +00:00
fMaxBPM = 0;
fMinBPM = 100000; // inf
for( int i=0; i<m_BPMSegments.GetSize(); i++ )
{
BPMSegment &seg = m_BPMSegments[i];
fMaxBPM = max( seg.m_fBPM, fMaxBPM );
fMinBPM = min( seg.m_fBPM, fMinBPM );
}
};
2001-12-19 01:50:57 +00:00
void GetBeatAndBPSFromElapsedTime( float fElapsedTime, float &fBeatOut, float &fBPSOut );
2002-04-16 17:31:00 +00:00
float GetElapsedTimeFromBeat( float fBeat );
void GetNoteMetadatasThatMatchGameAndStyle( CString sGame, CString sStyle, CArray<NoteMetadata*, NoteMetadata*>& arrayAddTo );
2002-01-20 23:29:03 +00:00
2002-02-02 05:11:12 +00:00
int GetNumTimesPlayed()
{
int iTotalNumTimesPlayed = 0;
2002-04-16 17:31:00 +00:00
for( int i=0; i<m_arrayNoteMetadatas.GetSize(); i++ )
2002-02-02 05:11:12 +00:00
{
2002-04-16 17:31:00 +00:00
iTotalNumTimesPlayed += m_arrayNoteMetadatas[i].m_iNumTimesPlayed;
2002-02-02 05:11:12 +00:00
}
return iTotalNumTimesPlayed;
}
2001-11-03 10:52:42 +00:00
2002-02-11 04:46:31 +00:00
bool HasChangedSinceLastSave() { return m_bChangedSinceSave; }
void SetChangedSinceLastSave() { m_bChangedSinceSave = true; }
2002-04-16 17:31:00 +00:00
Grade GetGradeForDifficultyClass( CString sGame, CString sStyle, DifficultyClass dc );
2001-11-03 10:52:42 +00:00
private:
2001-12-28 10:15:59 +00:00
CString m_sSongFilePath;
2001-11-03 10:52:42 +00:00
CString m_sSongDir;
2001-12-28 10:15:59 +00:00
CString m_sGroupName;
2001-11-03 10:52:42 +00:00
bool m_bChangedSinceSave;
2002-04-28 20:42:32 +00:00
CString m_sMainTitle;
CString m_sSubTitle;
2001-11-03 10:52:42 +00:00
CString m_sArtist;
2002-04-16 17:31:00 +00:00
CString m_sCredit;
float m_fOffsetInSeconds;
2001-11-03 10:52:42 +00:00
2001-12-28 10:15:59 +00:00
CString m_sMusicPath;
2002-04-16 17:31:00 +00:00
DWORD m_dwMusicBytes;
2002-04-28 20:42:32 +00:00
float m_fMusicSampleStartSeconds, m_fMusicSampleLengthSeconds;
2001-12-28 10:15:59 +00:00
CString m_sBannerPath;
CString m_sBackgroundPath;
2002-01-16 10:01:32 +00:00
CString m_sBackgroundMoviePath;
2002-04-16 17:31:00 +00:00
CString m_sCDTitlePath;
2001-11-03 10:52:42 +00:00
2001-12-19 01:50:57 +00:00
CArray<BPMSegment, BPMSegment&> m_BPMSegments; // this must be sorted before dancing
2001-12-28 10:15:59 +00:00
CArray<FreezeSegment, FreezeSegment&> m_FreezeSegments; // this must be sorted before dancing
2001-11-03 10:52:42 +00:00
public:
2002-04-16 17:31:00 +00:00
CArray<NoteMetadata, NoteMetadata&> m_arrayNoteMetadatas;
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