Files
itgmania212121/stepmania/src/song.h
T

151 lines
4.4 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-19 01:59:48 +00:00
#include "Notes.h"
2001-11-03 10:52:42 +00:00
2002-05-01 19:14:55 +00:00
#include "GameConstantsAndTypes.h"
#include "RageUtil.h"
2001-11-30 09:38:35 +00:00
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;
};
struct FreezeSegment
{
FreezeSegment() { m_fStartBeat = m_fFreezeSeconds = -1; };
2002-06-24 22:04:31 +00:00
FreezeSegment( float s, float f ) { m_fStartBeat = s; m_fFreezeSeconds = f; };
2001-12-28 10:15:59 +00:00
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();
2002-06-14 22:25:22 +00:00
~Song();
2002-05-19 01:59:48 +00:00
bool LoadFromSongDir( CString sDir ); // calls one of the loads below
2002-04-16 17:31:00 +00:00
bool LoadFromDWIFile( CString sPath );
bool LoadFromBMSDir( CString sDir );
2002-06-30 23:19:33 +00:00
bool LoadFromSMFile( CString sPath, bool bLoadNoteData );
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
2002-07-02 00:27:58 +00:00
void SaveToSMFile( CString sPath = "" ); // no path means save to SongFilePath
2002-06-30 23:19:33 +00:00
void SaveToCacheFile();
2002-05-19 01:59:48 +00:00
2002-07-02 00:27:58 +00:00
CString GetSongFilePath();
CString GetCacheFilePath();
2002-06-29 11:59:09 +00:00
2002-07-02 00:27:58 +00:00
void LoadNoteData();
public:
2002-06-29 11:59:09 +00:00
CString m_sSongDir;
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
2002-05-01 19:14:55 +00:00
CString GetFullTitle() {return m_sMainTitle + " " + m_sSubTitle; };
2002-06-29 11:59:09 +00:00
static void GetMainAndSubTitlesFromFullTitle( 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;
float m_fOffsetInSeconds;
float m_fMusicLengthSeconds;
float m_fMusicSampleStartSeconds;
float m_fMusicSampleLengthSeconds;
CString m_sBannerFile;
CString m_sBackgroundFile;
CString m_sBackgroundMovieFile;
CString m_sCDTitleFile;
CString GetMusicPath() {return m_sSongDir+m_sMusicFile; };
CString GetBannerPath() {return m_sSongDir+m_sBannerFile; };
CString GetBackgroundPath() {return m_sSongDir+m_sBackgroundFile; };
CString GetBackgroundMoviePath(){return m_sSongDir+m_sBackgroundMovieFile; };
CString GetCDTitlePath() {return m_sSongDir+m_sCDTitleFile; };
bool HasMusic() {return m_sMusicFile != "" && DoesFileExist(GetMusicPath()); };
bool HasBanner() {return m_sBannerFile != "" && DoesFileExist(GetBannerPath()); };
bool HasBackground() {return m_sBackgroundFile != "" && DoesFileExist(GetBackgroundPath()); };
bool HasBackgroundMovie() {return m_sBackgroundMovieFile != ""&& DoesFileExist(GetBackgroundMoviePath()); };
bool HasCDTitle() {return m_sCDTitleFile != "" && DoesFileExist(GetCDTitlePath()); };
CArray<BPMSegment, BPMSegment&> m_BPMSegments; // this must be sorted before gameplay
CArray<FreezeSegment, FreezeSegment&> m_FreezeSegments; // this must be sorted before gameplay
void AddBPMSegment( BPMSegment seg );
void AddFreezeSegment( FreezeSegment seg );
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 );
}
};
2002-06-29 11:59:09 +00:00
float GetBPMAtBeat( float fBeat )
{
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-06-30 23:19:33 +00:00
void GetBeatAndBPSFromElapsedTime( float fElapsedTime, float &fBeatOut, float &fBPSOut, bool &bFreezeOut );
2002-04-16 17:31:00 +00:00
float GetElapsedTimeFromBeat( float fBeat );
2002-06-29 11:59:09 +00:00
CArray<Notes*, Notes*> m_arrayNotes;
2002-01-20 23:29:03 +00:00
2002-06-29 11:59:09 +00:00
void GetNotesThatMatch( NotesType nt, CArray<Notes*, Notes*>& arrayAddTo );
2002-02-02 05:11:12 +00:00
int GetNumTimesPlayed()
{
int iTotalNumTimesPlayed = 0;
2002-05-19 01:59:48 +00:00
for( int i=0; i<m_arrayNotes.GetSize(); i++ )
2002-02-02 05:11:12 +00:00
{
2002-06-14 22:25:22 +00:00
iTotalNumTimesPlayed += m_arrayNotes[i]->m_iNumTimesPlayed;
2002-02-02 05:11:12 +00:00
}
return iTotalNumTimesPlayed;
}
2002-05-19 01:59:48 +00:00
bool IsNew() { return GetNumTimesPlayed()==0; };
2002-05-27 08:23:27 +00:00
Grade GetGradeForDifficultyClass( NotesType nt, DifficultyClass dc );
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