Files
itgmania212121/stepmania/src/GameState.h
T
Glenn Maynard 8d48438c15 ModeMenuAvailable metric removed; change Codes instead.
Merge the sort menu into the mode menu.
GAMESTATE->m_SortOrder is now GAMESTATE->m_PreferredSortOrder.
Allow the mode menu to have non-mutually-exclusive items.
2005-01-29 20:46:08 +00:00

299 lines
9.8 KiB
C++

/* GameState - Holds game data that is not saved between sessions. */
#ifndef GAMESTATE_H
#define GAMESTATE_H
#include "GameConstantsAndTypes.h"
#include "SongOptions.h"
#include "Grade.h"
#include "Attack.h"
#include "RageTimer.h"
#include "Difficulty.h"
#include <map>
#include <deque>
#include <set>
class Song;
class Steps;
class Course;
class Trail;
class Game;
class Style;
class Character;
class TimingData;
struct StageStats;
struct PlayerState;
class GameState
{
public:
GameState();
~GameState();
void Reset();
void ApplyCmdline(); // called by Reset
void BeginGame(); // called when first player joins
void JoinPlayer( PlayerNumber pn );
void PlayersFinalized(); // called after a style is chosen, which means the number of players is finalized
void EndGame(); // called on ScreenGameOver, ScreenMusicScroll, ScreenCredits
void SaveCurrentSettingsToProfile( PlayerNumber pn ); // called at the beginning of each stage
void Update( float fDelta );
//
// Main state info
//
const Game* m_pCurGame;
const Style* m_pCurStyle;
bool m_bSideIsJoined[NUM_PLAYERS]; // left side, right side
bool m_bPlayersFinalized;
PlayMode m_PlayMode; // many screens display different info depending on this value
int m_iCoins; // not "credits"
PlayerNumber m_MasterPlayerNumber; // used in Styles where one player controls both sides
bool m_bIsOnSystemMenu; // system screens will not be effected by the operator key -- Miryokuteki
CourseDifficulty m_PreferredCourseDifficulty[NUM_PLAYERS]; // used in nonstop
bool DifficultiesLocked();
bool ChangePreferredDifficulty( PlayerNumber pn, Difficulty dc );
bool ChangePreferredDifficulty( PlayerNumber pn, int dir );
bool ChangePreferredCourseDifficulty( PlayerNumber pn, CourseDifficulty cd );
bool ChangePreferredCourseDifficulty( PlayerNumber pn, int dir );
bool IsCourseDifficultyShown( CourseDifficulty cd );
Difficulty GetEasiestNotesDifficulty() const;
RageTimer m_timeGameStarted; // from the moment the first player pressed Start
map<CString,CString> m_mapEnv;
/* This is set to a random number per-game/round; it can be used for a random seed. */
int m_iGameSeed, m_iRoundSeed;
bool PlayersCanJoin() const; // true if it's not too late for a player to join
bool EnoughCreditsToJoin() const; // true if an unjoined player can join by pressint start
int GetNumSidesJoined() const;
const Game* GetCurrentGame();
const Style* GetCurrentStyle() const;
void GetPlayerInfo( PlayerNumber pn, bool& bIsEnabledOut, bool& bIsHumanOut );
bool IsPlayerEnabled( PlayerNumber pn ) const;
int GetNumPlayersEnabled() const;
bool PlayerUsingBothSides() const;
bool IsHumanPlayer( PlayerNumber pn ) const;
int GetNumHumanPlayers() const;
PlayerNumber GetFirstHumanPlayer() const;
PlayerNumber GetFirstDisabledPlayer() const;
bool IsCpuPlayer( PlayerNumber pn ) const;
bool AnyPlayersAreCpu() const;
void GetCharacters( vector<Character*> &apCharactersOut );
Character* GameState::GetRandomCharacter();
Character* GameState::GetDefaultCharacter();
bool IsCourseMode() const;
bool IsBattleMode() const; /* not Rave */
bool ShowMarvelous() const;
CString m_sLoadingMessage; // used in loading screen
CString m_sPreferredSongGroup; // GROUP_ALL_MUSIC denotes no preferred group
bool m_bChangedFailType; // true if FailType was changed in the song options screen
Difficulty m_PreferredDifficulty[NUM_PLAYERS];
SortOrder m_PreferredSortOrder; // used by MusicWheel
bool m_bEditing; // NoteField does special stuff when this is true
bool m_bDemonstrationOrJukebox; // ScreenGameplay does special stuff when this is true
bool m_bJukeboxUsesModifiers;
int m_iNumStagesOfThisSong;
int m_iCurrentStageIndex;
int GetStageIndex() const;
void BeginStage();
void CancelStage();
void FinishStage();
int GetNumStagesLeft() const;
bool IsFinalStage() const;
bool IsExtraStage() const;
bool IsExtraStage2() const;
CString GetStageText() const;
void GetAllStageTexts( CStringArray &out ) const;
int GetCourseSongIndex() const;
CString GetPlayerDisplayName( PlayerNumber pn ) const;
//
// State Info used during gameplay
//
// NULL on ScreenSelectMusic if the currently selected wheel item isn't a Song.
Song* m_pCurSong;
// The last Song that the user manually changed to.
Song* m_pPreferredSong;
Steps* m_pCurSteps[NUM_PLAYERS];
// NULL on ScreenSelectMusic if the currently selected wheel item isn't a Course.
Course* m_pCurCourse;
// The last Course that the user manually changed to.
Course* m_pPreferredCourse;
Trail* m_pCurTrail[NUM_PLAYERS];
//
// Music statistics: Arcade: the current stage (one song). Oni/Endles: a single song in a course
//
// Let a lot of classes access this info here so the don't have to keep their own copies.
//
float m_fMusicSeconds; // time into the current song
float m_fSongBeat;
float m_fCurBPS;
bool m_bFreeze; // in the middle of a freeze
RageTimer m_LastBeatUpdate; // time of last m_fSongBeat, etc. update
bool m_bPastHereWeGo;
int m_BeatToNoteSkinRev; /* hack: incremented whenever m_BeatToNoteSkin changes */
void ResetNoteSkins();
void ResetNoteSkinsForPlayer( PlayerNumber pn );
void GetAllUsedNoteSkins( vector<CString> &out ) const;
static const float MUSIC_SECONDS_INVALID;
void ResetMusicStatistics(); // Call this when it's time to play a new song. Clears the values above.
void UpdateSongPosition( float fPositionSeconds, const TimingData &timing, const RageTimer &timestamp = RageZeroTimer );
float GetSongPercent( float beat ) const;
bool AllAreInDangerOrWorse() const;
bool AllAreDead() const;
bool AllHaveComboOf30OrMoreMisses() const;
bool OneIsHot() const;
// used in PLAY_MODE_BATTLE and PLAY_MODE_RAVE
void SetNoteSkinForBeatRange( PlayerState* pPlayerState, const CString& sNoteSkin, float StartBeat, float EndBeat );
// used in PLAY_MODE_BATTLE
float m_fOpponentHealthPercent;
// used in PLAY_MODE_RAVE
float m_fTugLifePercentP1;
void GetUndisplayedBeats( const PlayerState* pPlayerState, float TotalSeconds, float &StartBeat, float &EndBeat ) const; // only meaningful when a NoteField is in use
void LaunchAttack( PlayerNumber target, const Attack& a );
void RebuildPlayerOptionsFromActiveAttacks( PlayerNumber pn );
void RemoveAllActiveAttacks(); // called on end of song
void RemoveActiveAttacksForPlayer( PlayerNumber pn, AttackLevel al=NUM_ATTACK_LEVELS /*all*/ );
void RemoveAllInventory();
int GetSumOfActiveAttackLevels( PlayerNumber pn ) const;
PlayerNumber GetBestPlayer() const;
StageResult GetStageResult( PlayerNumber pn ) const;
void ResetStageStatistics(); // Call this when it's time to play a new stage.
void GetFinalEvalStats( StageStats& statsOut ) const; // shown on final evaluation
//
// Options stuff
//
SongOptions m_SongOptions;
SongOptions m_StoredSongOptions;
void ApplyModifiers( PlayerNumber pn, CString sModifiers );
void StoreSelectedOptions();
void RestoreSelectedOptions();
bool IsDisqualified( PlayerNumber pn );
void AdjustFailType();
// character stuff
private:
vector<Character*> m_pCharacters;
public:
Character* m_pCurCharacters[NUM_PLAYERS];
void ReloadCharacters();
bool HasEarnedExtraStage() const;
bool m_bAllow2ndExtraStage; //only used when "Allow Selection of Extra Stage is on"
//
// Ranking Stuff
//
struct RankingFeat
{
enum { SONG, COURSE, CATEGORY } Type;
Song* pSong; // valid if Type == SONG
Steps* pSteps; // valid if Type == SONG
Course* pCourse; // valid if Type == COURSE
Grade grade;
int iScore;
float fPercentDP;
CString Banner;
CString Feat;
CString *pStringToFill;
};
void GetRankingFeats( PlayerNumber pn, vector<RankingFeat> &vFeatsOut ) const;
void StoreRankingName( PlayerNumber pn, CString name ); // Called by name entry screens
vector<CString*> m_vpsNamesThatWereFilled; // filled on StoreRankingName,
//
// Award stuff
//
// lowest priority in front, highest priority at the back.
deque<PerDifficultyAward> m_vLastPerDifficultyAwards[NUM_PLAYERS];
deque<PeakComboAward> m_vLastPeakComboAwards[NUM_PLAYERS];
//
// Attract stuff
//
int m_iNumTimesThroughAttract; // negative means play regardless of m_iAttractSoundFrequency setting
bool IsTimeToPlayAttractSounds();
//
// DifficultiesToShow stuff
//
void GetDifficultiesToShow( set<Difficulty> &AddTo );
void GetCourseDifficultiesToShow( set<CourseDifficulty> &AddTo );
//
// PlayerState
//
PlayerState* m_pPlayerState[NUM_PLAYERS];
};
extern GameState* GAMESTATE; // global and accessable from anywhere in our program
#endif
/*
* (c) 2001-2004 Chris Danford, Glenn Maynard, Chris Gomez
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/