From 25c3c7d4f1683627798ff5efd2bd3059a10af4de Mon Sep 17 00:00:00 2001 From: Jason Felds Date: Sat, 4 May 2013 14:11:47 -0400 Subject: [PATCH] Change our auto_ptr's to unique_ptr's. auto_ptr is deprecated in c++11. --- src/ActorUtil.cpp | 2 +- src/Difficulty.cpp | 6 +- src/EnumHelper.cpp | 10 +- src/EnumHelper.h | 10 +- src/GameState.h | 902 +++++++++++++++++----------------- src/NoteSkinManager.cpp | 2 +- src/Profile.cpp | 8 +- src/RageFileDriverDeflate.cpp | 2 +- src/StatsManager.cpp | 2 +- 9 files changed, 472 insertions(+), 472 deletions(-) diff --git a/src/ActorUtil.cpp b/src/ActorUtil.cpp index 728dcc9d6e..a58bc01b5c 100644 --- a/src/ActorUtil.cpp +++ b/src/ActorUtil.cpp @@ -210,7 +210,7 @@ Actor* ActorUtil::MakeActor( const RString &sPath_, Actor *pParentActor ) { case FT_Lua: { - auto_ptr pNode( LoadXNodeFromLuaShowErrors(sPath) ); + unique_ptr pNode( LoadXNodeFromLuaShowErrors(sPath) ); if( pNode.get() == nullptr ) { // XNode will warn about the error diff --git a/src/Difficulty.cpp b/src/Difficulty.cpp index b6ff9a342d..5deb006ec6 100644 --- a/src/Difficulty.cpp +++ b/src/Difficulty.cpp @@ -23,13 +23,13 @@ LuaXType( Difficulty ); const RString &CourseDifficultyToLocalizedString( CourseDifficulty x ) { - static auto_ptr g_CourseDifficultyName[NUM_Difficulty]; + static unique_ptr g_CourseDifficultyName[NUM_Difficulty]; if( g_CourseDifficultyName[0].get() == nullptr ) { FOREACH_ENUM( Difficulty,i) { - auto_ptr ap( new LocalizedString("CourseDifficulty", DifficultyToString(i)) ); - g_CourseDifficultyName[i] = ap; + unique_ptr ap( new LocalizedString("CourseDifficulty", DifficultyToString(i)) ); + g_CourseDifficultyName[i] = move(ap); } } return g_CourseDifficultyName[x]->GetValue(); diff --git a/src/EnumHelper.cpp b/src/EnumHelper.cpp index 56c7b33a71..13f5459fa1 100644 --- a/src/EnumHelper.cpp +++ b/src/EnumHelper.cpp @@ -51,18 +51,18 @@ int CheckEnum( lua_State *L, LuaReference &table, int iPos, int iInvalid, const } // szNameArray is of size iMax; pNameCache is of size iMax+2. -const RString &EnumToString( int iVal, int iMax, const char **szNameArray, auto_ptr *pNameCache ) +const RString &EnumToString( int iVal, int iMax, const char **szNameArray, unique_ptr *pNameCache ) { if( unlikely(pNameCache[0].get() == nullptr) ) { for( int i = 0; i < iMax; ++i ) { - auto_ptr ap( new RString( szNameArray[i] ) ); - pNameCache[i] = ap; + unique_ptr ap( new RString( szNameArray[i] ) ); + pNameCache[i] = move(ap); } - auto_ptr ap( new RString ); - pNameCache[iMax+1] = ap; + unique_ptr ap( new RString ); + pNameCache[iMax+1] = move(ap); } // iMax+1 is "Invalid". iMax+0 is the NUM_ size value, which can not be converted diff --git a/src/EnumHelper.h b/src/EnumHelper.h index 9bc9b87f44..b885fbb750 100644 --- a/src/EnumHelper.h +++ b/src/EnumHelper.h @@ -64,14 +64,14 @@ namespace Enum void SetMetatable( lua_State *L, LuaReference &EnumTable, LuaReference &EnumIndexTable, const char *szName ); }; -const RString &EnumToString( int iVal, int iMax, const char **szNameArray, auto_ptr *pNameCache ); // XToString helper +const RString &EnumToString( int iVal, int iMax, const char **szNameArray, unique_ptr *pNameCache ); // XToString helper #define XToString(X) \ const RString& X##ToString(X x); \ COMPILE_ASSERT( NUM_##X == ARRAYLEN(X##Names) ); \ const RString& X##ToString( X x ) \ { \ - static auto_ptr as_##X##Name[NUM_##X+2]; \ + static unique_ptr as_##X##Name[NUM_##X+2]; \ return EnumToString( x, NUM_##X, X##Names, as_##X##Name ); \ } \ namespace StringConversion { template<> RString ToString( const X &value ) { return X##ToString(value); } } @@ -80,12 +80,12 @@ namespace StringConversion { template<> RString ToString( const X &value ) { const RString &X##ToLocalizedString(X x); \ const RString &X##ToLocalizedString( X x ) \ { \ - static auto_ptr g_##X##Name[NUM_##X]; \ + static unique_ptr g_##X##Name[NUM_##X]; \ if( g_##X##Name[0].get() == nullptr ) { \ for( unsigned i = 0; i < NUM_##X; ++i ) \ { \ - auto_ptr ap( new LocalizedString(#X, X##ToString((X)i)) ); \ - g_##X##Name[i] = ap; \ + unique_ptr ap( new LocalizedString(#X, X##ToString((X)i)) ); \ + g_##X##Name[i] = move(ap); \ } \ } \ return g_##X##Name[x]->GetValue(); \ diff --git a/src/GameState.h b/src/GameState.h index 8540c2fd2c..855b9706ba 100644 --- a/src/GameState.h +++ b/src/GameState.h @@ -1,451 +1,451 @@ -#ifndef GAMESTATE_H -#define GAMESTATE_H - -#include "Attack.h" -#include "Difficulty.h" -#include "GameConstantsAndTypes.h" -#include "Grade.h" -#include "MessageManager.h" -#include "ModsGroup.h" -#include "RageTimer.h" -#include "PlayerOptions.h" -#include "SongOptions.h" -#include "SongPosition.h" -#include "Preference.h" - -#include -#include -#include - -class Character; -class Course; -class Game; -struct lua_State; -class LuaTable; -class PlayerState; -class PlayerOptions; -class Profile; -class Song; -class Steps; -class StageStats; -class Style; -class TimingData; -class Trail; - -SortOrder GetDefaultSort(); - -/** @brief Holds game data that is not saved between sessions. */ -class GameState -{ - /** @brief The player number used with Styles where one player controls both sides. */ - PlayerNumber masterPlayerNumber; - /** @brief The TimingData that is used for processing certain functions. */ - TimingData * processedTiming; -public: - /** @brief Set up the GameState with initial values. */ - GameState(); - ~GameState(); - /** @brief Reset the GameState back to initial values. */ - void Reset(); - void ResetPlayer( PlayerNumber pn ); - void ResetPlayerOptions( PlayerNumber pn ); - void ApplyCmdline(); // called by Reset - void ApplyGameCommand( const RString &sCommand, PlayerNumber pn=PLAYER_INVALID ); - /** @brief Start the game when the first player joins in. */ - void BeginGame(); - void JoinPlayer( PlayerNumber pn ); - void UnjoinPlayer( PlayerNumber pn ); - bool JoinInput( PlayerNumber pn ); - bool JoinPlayers(); - void LoadProfiles( bool bLoadEdits = true ); - void SavePlayerProfiles(); - void SavePlayerProfile( PlayerNumber pn ); - bool HaveProfileToLoad(); - bool HaveProfileToSave(); - void SaveLocalData(); - void AddStageToPlayer( PlayerNumber pn ); - void LoadCurrentSettingsFromProfile( PlayerNumber pn ); - /** - * @brief Save the specified player's settings to his/her profile. - * - * This is called at the beginning of each stage. - * @param pn the PlayerNumber to save the stats to. */ - void SaveCurrentSettingsToProfile( PlayerNumber pn ); - Song* GetDefaultSong() const; - - void Update( float fDelta ); - - // Main state info - - /** - * @brief State what the current game is. - * - * Call this instead of m_pCurGame.Set to make sure that - * PREFSMAN->m_sCurrentGame stays in sync. - * @param pGame the game to start using. */ - void SetCurGame( const Game *pGame ); - BroadcastOnChangePtr m_pCurGame; - BroadcastOnChangePtr m_pCurStyle; - /** @brief Determine which side is joined. - * - * The left side is player 1, and the right side is player 2. */ - bool m_bSideIsJoined[NUM_PLAYERS]; // left side, right side - MultiPlayerStatus m_MultiPlayerStatus[NUM_MultiPlayer]; - BroadcastOnChange m_PlayMode; // many screens display different info depending on this value - /** - * @brief The number of coins presently in the machine. - * - * Note that coins are not "credits". One may have to put in two coins - * to get one credit, only to have to put in another four coins to get - * the three credits needed to begin the game. */ - bool m_bMultiplayer; - int m_iNumMultiplayerNoteFields; - bool DifficultiesLocked() const; - bool ChangePreferredDifficultyAndStepsType( PlayerNumber pn, Difficulty dc, StepsType st ); - bool ChangePreferredDifficulty( PlayerNumber pn, int dir ); - bool ChangePreferredCourseDifficultyAndStepsType( PlayerNumber pn, CourseDifficulty cd, StepsType st ); - bool ChangePreferredCourseDifficulty( PlayerNumber pn, int dir ); - bool IsCourseDifficultyShown( CourseDifficulty cd ); - Difficulty GetClosestShownDifficulty( PlayerNumber pn ) const; - Difficulty GetEasiestStepsDifficulty() const; - Difficulty GetHardestStepsDifficulty() const; - RageTimer m_timeGameStarted; // from the moment the first player pressed Start - LuaTable *m_Environment; - - // This is set to a random number per-game/round; it can be used for a random seed. - int m_iGameSeed, m_iStageSeed; - RString m_sStageGUID; - - /** - * @brief Determine if a second player can join in at this time. - * @return true if a player can still enter the game, false otherwise. */ - bool PlayersCanJoin() const; - int GetNumSidesJoined() const; - - const Game* GetCurrentGame(); - const Style* GetCurrentStyle() const; - void SetCurrentStyle( const Style *pStyle ); - - void GetPlayerInfo( PlayerNumber pn, bool& bIsEnabledOut, bool& bIsHumanOut ); - bool IsPlayerEnabled( PlayerNumber pn ) const; - bool IsMultiPlayerEnabled( MultiPlayer mp ) const; - bool IsPlayerEnabled( const PlayerState* pPlayerState ) const; - int GetNumPlayersEnabled() const; - - /** - * @brief Is the specified Player a human Player? - * @param pn the numbered Player to check. - * @return true if it's a human Player, or false otherwise. */ - bool IsHumanPlayer( PlayerNumber pn ) const; - int GetNumHumanPlayers() const; - PlayerNumber GetFirstHumanPlayer() const; - PlayerNumber GetFirstDisabledPlayer() const; - bool IsCpuPlayer( PlayerNumber pn ) const; - bool AnyPlayersAreCpu() const; - - /** - * @brief Retrieve the present master player number. - * @return The master player number. */ - PlayerNumber GetMasterPlayerNumber() const; - - /** - * @brief Set the master player number. - * @param p the master player number. */ - void SetMasterPlayerNumber(const PlayerNumber p); - - /** - * @brief Retrieve the present timing data being processed. - * @return the timing data pointer. */ - TimingData * GetProcessedTimingData() const; - - /** - * @brief Set the timing data to be used with processing. - * @param t the timing data. */ - void SetProcessedTimingData(TimingData * t); - - bool IsCourseMode() const; - bool IsBattleMode() const; // not Rave - - /** - * @brief Do we show the W1 timing judgment? - * @return true if we do, or false otherwise. */ - bool ShowW1() const; - - BroadcastOnChange m_sPreferredSongGroup; // GROUP_ALL denotes no preferred group - BroadcastOnChange m_sPreferredCourseGroup; // GROUP_ALL denotes no preferred group - bool m_bChangedFailTypeOnScreenSongOptions; // true if FailType was changed in the song options screen - BroadcastOnChange m_PreferredStepsType; - BroadcastOnChange1D m_PreferredDifficulty; - BroadcastOnChange1D m_PreferredCourseDifficulty;// used in nonstop - BroadcastOnChange m_SortOrder; // set by MusicWheel - SortOrder m_PreferredSortOrder; // used by MusicWheel - EditMode m_EditMode; - bool IsEditing() const { return m_EditMode != EditMode_Invalid; } - /** - * @brief Are we in the demonstration or jukebox mode? - * - * ScreenGameplay often does special things when this is set to true. */ - bool m_bDemonstrationOrJukebox; - bool m_bJukeboxUsesModifiers; - int m_iNumStagesOfThisSong; - /** - * @brief Increase this every stage while not resetting on a continue. - * - * This is cosmetic: it's not use for Stage or Screen branching logic. */ - int m_iCurrentStageIndex; - /** - * @brief The number of stages available for the players. - * - * This resets whenever a player joins or continues. */ - int m_iPlayerStageTokens[NUM_PLAYERS]; - - RString sExpandedSectionName; - - static int GetNumStagesMultiplierForSong( const Song* pSong ); - static int GetNumStagesForSongAndStyleType( const Song* pSong, StyleType st ); - int GetNumStagesForCurrentSongAndStepsOrCourse() const; - - void BeginStage(); - void CancelStage(); - void CommitStageStats(); - void FinishStage(); - int GetNumStagesLeft( PlayerNumber pn ) const; - int GetSmallestNumStagesLeftForAnyHumanPlayer() const; - bool IsFinalStageForAnyHumanPlayer() const; - bool IsAnExtraStage() const; - bool IsAnExtraStageAndSelectionLocked() const; - bool IsExtraStage() const; - bool IsExtraStage2() const; - Stage GetCurrentStage() const; - int GetCourseSongIndex() const; - RString GetPlayerDisplayName( PlayerNumber pn ) const; - - bool m_bLoadingNextSong; - int GetLoadingCourseSongIndex() const; - - // State Info used during gameplay - - // NULL on ScreenSelectMusic if the currently selected wheel item isn't a Song. - BroadcastOnChangePtr m_pCurSong; - // The last Song that the user manually changed to. - Song* m_pPreferredSong; - BroadcastOnChangePtr1D m_pCurSteps; - - // NULL on ScreenSelectMusic if the currently selected wheel item isn't a Course. - BroadcastOnChangePtr m_pCurCourse; - // The last Course that the user manually changed to. - Course* m_pPreferredCourse; - BroadcastOnChangePtr1D m_pCurTrail; - - bool m_bBackedOutOfFinalStage; - - // Music statistics: - SongPosition m_Position; - - BroadcastOnChange m_bGameplayLeadIn; - - // if re-adding noteskin changes in courses, add functions and such here -aj - void GetAllUsedNoteSkins( vector &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 ×tamp = RageZeroTimer, bool bUpdatePlayers = false ); - float GetSongPercent( float beat ) const; - - bool AllAreInDangerOrWorse() const; - bool OneIsHot() const; - - // Haste - float m_fHasteRate; // [-1,+1]; 0 = normal speed - float m_fLastHasteUpdateMusicSeconds; - float m_fAccumulatedHasteSeconds; - - // Random Attacks & Attack Mines - vector m_RandomAttacks; - - // used in PLAY_MODE_BATTLE - float m_fOpponentHealthPercent; - - // used in PLAY_MODE_RAVE - float m_fTugLifePercentP1; - - // used in workout - bool m_bGoalComplete[NUM_PLAYERS]; - bool m_bWorkoutGoalComplete; - - /** @brief Primarily called at the end of a song to stop all attacks. */ - void RemoveAllActiveAttacks(); - PlayerNumber GetBestPlayer() const; - StageResult GetStageResult( PlayerNumber pn ) const; - - /** @brief Call this function when it's time to play a new stage. */ - void ResetStageStatistics(); - - // Options stuff - ModsGroup m_SongOptions; - - /** - * @brief Did the current game mode change the default Noteskin? - * - * This is true if it has: see Edit/Sync Songs for a common example. - * Note: any mode that wants to use this must set it explicitly. */ - bool m_bDidModeChangeNoteSkin; - - void GetDefaultPlayerOptions( PlayerOptions &po ); - void GetDefaultSongOptions( SongOptions &so ); - void ResetToDefaultSongOptions( ModsLevel l ); - void ApplyPreferredModifiers( PlayerNumber pn, RString sModifiers ); - void ApplyStageModifiers( PlayerNumber pn, RString sModifiers ); - void ClearStageModifiersIllegalForCourse(); - void ResetOptions(); - - bool CurrentOptionsDisqualifyPlayer( PlayerNumber pn ); - bool PlayerIsUsingModifier( PlayerNumber pn, const RString &sModifier ); - - PlayerOptions::FailType GetPlayerFailType( const PlayerState *pPlayerState ) const; - - // character stuff - Character* m_pCurCharacters[NUM_PLAYERS]; - - bool HasEarnedExtraStage() const { return m_bEarnedExtraStage; } - EarnedExtraStage GetEarnedExtraStage() const { return CalculateEarnedExtraStage(); } - - // 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; - RString Banner; - RString Feat; - RString *pStringToFill; - }; - - void GetRankingFeats( PlayerNumber pn, vector &vFeatsOut ) const; - bool AnyPlayerHasRankingFeats() const; - void StoreRankingName( PlayerNumber pn, RString name ); // Called by name entry screens - vector m_vpsNamesThatWereFilled; // filled on StoreRankingName, - - // Award stuff - // lowest priority in front, highest priority at the back. - deque m_vLastStageAwards[NUM_PLAYERS]; - deque m_vLastPeakComboAwards[NUM_PLAYERS]; - - // Attract stuff - int m_iNumTimesThroughAttract; // negative means play regardless of m_iAttractSoundFrequency setting - bool IsTimeToPlayAttractSounds() const; - void VisitAttractScreen( const RString sScreenName ); - - // PlayerState - /** @brief Allow access to each player's PlayerState. */ - PlayerState* m_pPlayerState[NUM_PLAYERS]; - PlayerState* m_pMultiPlayerState[NUM_MultiPlayer]; - - // Preferences - static Preference m_bAutoJoin; - - // These options have weird interactions depending on m_bEventMode, - // so wrap them. - bool m_bTemporaryEventMode; - bool IsEventMode() const; - CoinMode GetCoinMode() const; - Premium GetPremium() const; - - // Edit stuff - - /** - * @brief Is the game right now using Song timing or Steps timing? - * - * Different options are available depending on this setting. */ - bool m_bIsUsingStepTiming; - /** - * @brief Are we presently in the Step Editor, where some rules apply differently? - * - * TODO: Find a better way to implement this. */ - bool m_bInStepEditor; - BroadcastOnChange m_stEdit; - BroadcastOnChange m_cdEdit; - BroadcastOnChangePtr m_pEditSourceSteps; - BroadcastOnChange m_stEditSource; - BroadcastOnChange m_iEditCourseEntryIndex; - BroadcastOnChange m_sEditLocalProfileID; - Profile* GetEditLocalProfile(); - - // Workout stuff - float GetGoalPercentComplete( PlayerNumber pn ); - bool IsGoalComplete( PlayerNumber pn ) { return GetGoalPercentComplete( pn ) >= 1; } - - bool m_bDopefish; - - // Lua - void PushSelf( lua_State *L ); - - // Keep extra stage logic internal to GameState. -private: - EarnedExtraStage CalculateEarnedExtraStage() const; - int m_iAwardedExtraStages[NUM_PLAYERS]; - bool m_bEarnedExtraStage; - - // Timing position corrections - RageTimer m_LastPositionTimer; - float m_LastPositionSeconds; - - GameState(const GameState& rhs); - GameState& operator=(const GameState& rhs); - -}; - -PlayerNumber GetNextHumanPlayer( PlayerNumber pn ); -PlayerNumber GetNextEnabledPlayer( PlayerNumber pn ); -PlayerNumber GetNextCpuPlayer( PlayerNumber pn ); -PlayerNumber GetNextPotentialCpuPlayer( PlayerNumber pn ); -MultiPlayer GetNextEnabledMultiPlayer( MultiPlayer mp ); - -/** @brief A foreach loop to act on each human Player. */ -#define FOREACH_HumanPlayer( pn ) for( PlayerNumber pn=GetNextHumanPlayer((PlayerNumber)-1); pn!=PLAYER_INVALID; pn=GetNextHumanPlayer(pn) ) -/** @brief A foreach loop to act on each enabled Player. */ -#define FOREACH_EnabledPlayer( pn ) for( PlayerNumber pn=GetNextEnabledPlayer((PlayerNumber)-1); pn!=PLAYER_INVALID; pn=GetNextEnabledPlayer(pn) ) -/** @brief A foreach loop to act on each CPU Player. */ -#define FOREACH_CpuPlayer( pn ) for( PlayerNumber pn=GetNextCpuPlayer((PlayerNumber)-1); pn!=PLAYER_INVALID; pn=GetNextCpuPlayer(pn) ) -/** @brief A foreach loop to act on each potential CPU Player. */ -#define FOREACH_PotentialCpuPlayer( pn ) for( PlayerNumber pn=GetNextPotentialCpuPlayer((PlayerNumber)-1); pn!=PLAYER_INVALID; pn=GetNextPotentialCpuPlayer(pn) ) -/** @brief A foreach loop to act on each Player in MultiPlayer. */ -#define FOREACH_EnabledMultiPlayer( mp ) for( MultiPlayer mp=GetNextEnabledMultiPlayer((MultiPlayer)-1); mp!=MultiPlayer_Invalid; mp=GetNextEnabledMultiPlayer(mp) ) - - - -extern GameState* GAMESTATE; // global and accessable from anywhere in our program - -#endif - -/** - * @file - * @author Chris Danford, Glenn Maynard, Chris Gomez (c) 2001-2004 - * @section LICENSE - * 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. - */ +#ifndef GAMESTATE_H +#define GAMESTATE_H + +#include "Attack.h" +#include "Difficulty.h" +#include "GameConstantsAndTypes.h" +#include "Grade.h" +#include "MessageManager.h" +#include "ModsGroup.h" +#include "RageTimer.h" +#include "PlayerOptions.h" +#include "SongOptions.h" +#include "SongPosition.h" +#include "Preference.h" + +#include +#include +#include + +class Character; +class Course; +class Game; +struct lua_State; +class LuaTable; +class PlayerState; +class PlayerOptions; +class Profile; +class Song; +class Steps; +class StageStats; +class Style; +class TimingData; +class Trail; + +SortOrder GetDefaultSort(); + +/** @brief Holds game data that is not saved between sessions. */ +class GameState +{ + /** @brief The player number used with Styles where one player controls both sides. */ + PlayerNumber masterPlayerNumber; + /** @brief The TimingData that is used for processing certain functions. */ + TimingData * processedTiming; +public: + /** @brief Set up the GameState with initial values. */ + GameState(); + ~GameState(); + /** @brief Reset the GameState back to initial values. */ + void Reset(); + void ResetPlayer( PlayerNumber pn ); + void ResetPlayerOptions( PlayerNumber pn ); + void ApplyCmdline(); // called by Reset + void ApplyGameCommand( const RString &sCommand, PlayerNumber pn=PLAYER_INVALID ); + /** @brief Start the game when the first player joins in. */ + void BeginGame(); + void JoinPlayer( PlayerNumber pn ); + void UnjoinPlayer( PlayerNumber pn ); + bool JoinInput( PlayerNumber pn ); + bool JoinPlayers(); + void LoadProfiles( bool bLoadEdits = true ); + void SavePlayerProfiles(); + void SavePlayerProfile( PlayerNumber pn ); + bool HaveProfileToLoad(); + bool HaveProfileToSave(); + void SaveLocalData(); + void AddStageToPlayer( PlayerNumber pn ); + void LoadCurrentSettingsFromProfile( PlayerNumber pn ); + /** + * @brief Save the specified player's settings to his/her profile. + * + * This is called at the beginning of each stage. + * @param pn the PlayerNumber to save the stats to. */ + void SaveCurrentSettingsToProfile( PlayerNumber pn ); + Song* GetDefaultSong() const; + + void Update( float fDelta ); + + // Main state info + + /** + * @brief State what the current game is. + * + * Call this instead of m_pCurGame.Set to make sure that + * PREFSMAN->m_sCurrentGame stays in sync. + * @param pGame the game to start using. */ + void SetCurGame( const Game *pGame ); + BroadcastOnChangePtr m_pCurGame; + BroadcastOnChangePtr m_pCurStyle; + /** @brief Determine which side is joined. + * + * The left side is player 1, and the right side is player 2. */ + bool m_bSideIsJoined[NUM_PLAYERS]; // left side, right side + MultiPlayerStatus m_MultiPlayerStatus[NUM_MultiPlayer]; + BroadcastOnChange m_PlayMode; // many screens display different info depending on this value + /** + * @brief The number of coins presently in the machine. + * + * Note that coins are not "credits". One may have to put in two coins + * to get one credit, only to have to put in another four coins to get + * the three credits needed to begin the game. */ + bool m_bMultiplayer; + int m_iNumMultiplayerNoteFields; + bool DifficultiesLocked() const; + bool ChangePreferredDifficultyAndStepsType( PlayerNumber pn, Difficulty dc, StepsType st ); + bool ChangePreferredDifficulty( PlayerNumber pn, int dir ); + bool ChangePreferredCourseDifficultyAndStepsType( PlayerNumber pn, CourseDifficulty cd, StepsType st ); + bool ChangePreferredCourseDifficulty( PlayerNumber pn, int dir ); + bool IsCourseDifficultyShown( CourseDifficulty cd ); + Difficulty GetClosestShownDifficulty( PlayerNumber pn ) const; + Difficulty GetEasiestStepsDifficulty() const; + Difficulty GetHardestStepsDifficulty() const; + RageTimer m_timeGameStarted; // from the moment the first player pressed Start + LuaTable *m_Environment; + + // This is set to a random number per-game/round; it can be used for a random seed. + int m_iGameSeed, m_iStageSeed; + RString m_sStageGUID; + + /** + * @brief Determine if a second player can join in at this time. + * @return true if a player can still enter the game, false otherwise. */ + bool PlayersCanJoin() const; + int GetNumSidesJoined() const; + + const Game* GetCurrentGame(); + const Style* GetCurrentStyle() const; + void SetCurrentStyle( const Style *pStyle ); + + void GetPlayerInfo( PlayerNumber pn, bool& bIsEnabledOut, bool& bIsHumanOut ); + bool IsPlayerEnabled( PlayerNumber pn ) const; + bool IsMultiPlayerEnabled( MultiPlayer mp ) const; + bool IsPlayerEnabled( const PlayerState* pPlayerState ) const; + int GetNumPlayersEnabled() const; + + /** + * @brief Is the specified Player a human Player? + * @param pn the numbered Player to check. + * @return true if it's a human Player, or false otherwise. */ + bool IsHumanPlayer( PlayerNumber pn ) const; + int GetNumHumanPlayers() const; + PlayerNumber GetFirstHumanPlayer() const; + PlayerNumber GetFirstDisabledPlayer() const; + bool IsCpuPlayer( PlayerNumber pn ) const; + bool AnyPlayersAreCpu() const; + + /** + * @brief Retrieve the present master player number. + * @return The master player number. */ + PlayerNumber GetMasterPlayerNumber() const; + + /** + * @brief Set the master player number. + * @param p the master player number. */ + void SetMasterPlayerNumber(const PlayerNumber p); + + /** + * @brief Retrieve the present timing data being processed. + * @return the timing data pointer. */ + TimingData * GetProcessedTimingData() const; + + /** + * @brief Set the timing data to be used with processing. + * @param t the timing data. */ + void SetProcessedTimingData(TimingData * t); + + bool IsCourseMode() const; + bool IsBattleMode() const; // not Rave + + /** + * @brief Do we show the W1 timing judgment? + * @return true if we do, or false otherwise. */ + bool ShowW1() const; + + BroadcastOnChange m_sPreferredSongGroup; // GROUP_ALL denotes no preferred group + BroadcastOnChange m_sPreferredCourseGroup; // GROUP_ALL denotes no preferred group + bool m_bChangedFailTypeOnScreenSongOptions; // true if FailType was changed in the song options screen + BroadcastOnChange m_PreferredStepsType; + BroadcastOnChange1D m_PreferredDifficulty; + BroadcastOnChange1D m_PreferredCourseDifficulty;// used in nonstop + BroadcastOnChange m_SortOrder; // set by MusicWheel + SortOrder m_PreferredSortOrder; // used by MusicWheel + EditMode m_EditMode; + bool IsEditing() const { return m_EditMode != EditMode_Invalid; } + /** + * @brief Are we in the demonstration or jukebox mode? + * + * ScreenGameplay often does special things when this is set to true. */ + bool m_bDemonstrationOrJukebox; + bool m_bJukeboxUsesModifiers; + int m_iNumStagesOfThisSong; + /** + * @brief Increase this every stage while not resetting on a continue. + * + * This is cosmetic: it's not use for Stage or Screen branching logic. */ + int m_iCurrentStageIndex; + /** + * @brief The number of stages available for the players. + * + * This resets whenever a player joins or continues. */ + int m_iPlayerStageTokens[NUM_PLAYERS]; + + RString sExpandedSectionName; + + static int GetNumStagesMultiplierForSong( const Song* pSong ); + static int GetNumStagesForSongAndStyleType( const Song* pSong, StyleType st ); + int GetNumStagesForCurrentSongAndStepsOrCourse() const; + + void BeginStage(); + void CancelStage(); + void CommitStageStats(); + void FinishStage(); + int GetNumStagesLeft( PlayerNumber pn ) const; + int GetSmallestNumStagesLeftForAnyHumanPlayer() const; + bool IsFinalStageForAnyHumanPlayer() const; + bool IsAnExtraStage() const; + bool IsAnExtraStageAndSelectionLocked() const; + bool IsExtraStage() const; + bool IsExtraStage2() const; + Stage GetCurrentStage() const; + int GetCourseSongIndex() const; + RString GetPlayerDisplayName( PlayerNumber pn ) const; + + bool m_bLoadingNextSong; + int GetLoadingCourseSongIndex() const; + + // State Info used during gameplay + + // NULL on ScreenSelectMusic if the currently selected wheel item isn't a Song. + BroadcastOnChangePtr m_pCurSong; + // The last Song that the user manually changed to. + Song* m_pPreferredSong; + BroadcastOnChangePtr1D m_pCurSteps; + + // NULL on ScreenSelectMusic if the currently selected wheel item isn't a Course. + BroadcastOnChangePtr m_pCurCourse; + // The last Course that the user manually changed to. + Course* m_pPreferredCourse; + BroadcastOnChangePtr1D m_pCurTrail; + + bool m_bBackedOutOfFinalStage; + + // Music statistics: + SongPosition m_Position; + + BroadcastOnChange m_bGameplayLeadIn; + + // if re-adding noteskin changes in courses, add functions and such here -aj + void GetAllUsedNoteSkins( vector &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 ×tamp = RageZeroTimer, bool bUpdatePlayers = false ); + float GetSongPercent( float beat ) const; + + bool AllAreInDangerOrWorse() const; + bool OneIsHot() const; + + // Haste + float m_fHasteRate; // [-1,+1]; 0 = normal speed + float m_fLastHasteUpdateMusicSeconds; + float m_fAccumulatedHasteSeconds; + + // Random Attacks & Attack Mines + vector m_RandomAttacks; + + // used in PLAY_MODE_BATTLE + float m_fOpponentHealthPercent; + + // used in PLAY_MODE_RAVE + float m_fTugLifePercentP1; + + // used in workout + bool m_bGoalComplete[NUM_PLAYERS]; + bool m_bWorkoutGoalComplete; + + /** @brief Primarily called at the end of a song to stop all attacks. */ + void RemoveAllActiveAttacks(); + PlayerNumber GetBestPlayer() const; + StageResult GetStageResult( PlayerNumber pn ) const; + + /** @brief Call this function when it's time to play a new stage. */ + void ResetStageStatistics(); + + // Options stuff + ModsGroup m_SongOptions; + + /** + * @brief Did the current game mode change the default Noteskin? + * + * This is true if it has: see Edit/Sync Songs for a common example. + * Note: any mode that wants to use this must set it explicitly. */ + bool m_bDidModeChangeNoteSkin; + + void GetDefaultPlayerOptions( PlayerOptions &po ); + void GetDefaultSongOptions( SongOptions &so ); + void ResetToDefaultSongOptions( ModsLevel l ); + void ApplyPreferredModifiers( PlayerNumber pn, RString sModifiers ); + void ApplyStageModifiers( PlayerNumber pn, RString sModifiers ); + void ClearStageModifiersIllegalForCourse(); + void ResetOptions(); + + bool CurrentOptionsDisqualifyPlayer( PlayerNumber pn ); + bool PlayerIsUsingModifier( PlayerNumber pn, const RString &sModifier ); + + PlayerOptions::FailType GetPlayerFailType( const PlayerState *pPlayerState ) const; + + // character stuff + Character* m_pCurCharacters[NUM_PLAYERS]; + + bool HasEarnedExtraStage() const { return m_bEarnedExtraStage; } + EarnedExtraStage GetEarnedExtraStage() const { return CalculateEarnedExtraStage(); } + + // 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; + RString Banner; + RString Feat; + RString *pStringToFill; + }; + + void GetRankingFeats( PlayerNumber pn, vector &vFeatsOut ) const; + bool AnyPlayerHasRankingFeats() const; + void StoreRankingName( PlayerNumber pn, RString name ); // Called by name entry screens + vector m_vpsNamesThatWereFilled; // filled on StoreRankingName, + + // Award stuff + // lowest priority in front, highest priority at the back. + deque m_vLastStageAwards[NUM_PLAYERS]; + deque m_vLastPeakComboAwards[NUM_PLAYERS]; + + // Attract stuff + int m_iNumTimesThroughAttract; // negative means play regardless of m_iAttractSoundFrequency setting + bool IsTimeToPlayAttractSounds() const; + void VisitAttractScreen( const RString sScreenName ); + + // PlayerState + /** @brief Allow access to each player's PlayerState. */ + PlayerState* m_pPlayerState[NUM_PLAYERS]; + PlayerState* m_pMultiPlayerState[NUM_MultiPlayer]; + + // Preferences + static Preference m_bAutoJoin; + + // These options have weird interactions depending on m_bEventMode, + // so wrap them. + bool m_bTemporaryEventMode; + bool IsEventMode() const; + CoinMode GetCoinMode() const; + Premium GetPremium() const; + + // Edit stuff + + /** + * @brief Is the game right now using Song timing or Steps timing? + * + * Different options are available depending on this setting. */ + bool m_bIsUsingStepTiming; + /** + * @brief Are we presently in the Step Editor, where some rules apply differently? + * + * TODO: Find a better way to implement this. */ + bool m_bInStepEditor; + BroadcastOnChange m_stEdit; + BroadcastOnChange m_cdEdit; + BroadcastOnChangePtr m_pEditSourceSteps; + BroadcastOnChange m_stEditSource; + BroadcastOnChange m_iEditCourseEntryIndex; + BroadcastOnChange m_sEditLocalProfileID; + Profile* GetEditLocalProfile(); + + // Workout stuff + float GetGoalPercentComplete( PlayerNumber pn ); + bool IsGoalComplete( PlayerNumber pn ) { return GetGoalPercentComplete( pn ) >= 1; } + + bool m_bDopefish; + + // Lua + void PushSelf( lua_State *L ); + + // Keep extra stage logic internal to GameState. +private: + EarnedExtraStage CalculateEarnedExtraStage() const; + int m_iAwardedExtraStages[NUM_PLAYERS]; + bool m_bEarnedExtraStage; + + // Timing position corrections + RageTimer m_LastPositionTimer; + float m_LastPositionSeconds; + + GameState(const GameState& rhs); + GameState& operator=(const GameState& rhs); + +}; + +PlayerNumber GetNextHumanPlayer( PlayerNumber pn ); +PlayerNumber GetNextEnabledPlayer( PlayerNumber pn ); +PlayerNumber GetNextCpuPlayer( PlayerNumber pn ); +PlayerNumber GetNextPotentialCpuPlayer( PlayerNumber pn ); +MultiPlayer GetNextEnabledMultiPlayer( MultiPlayer mp ); + +/** @brief A foreach loop to act on each human Player. */ +#define FOREACH_HumanPlayer( pn ) for( PlayerNumber pn=GetNextHumanPlayer((PlayerNumber)-1); pn!=PLAYER_INVALID; pn=GetNextHumanPlayer(pn) ) +/** @brief A foreach loop to act on each enabled Player. */ +#define FOREACH_EnabledPlayer( pn ) for( PlayerNumber pn=GetNextEnabledPlayer((PlayerNumber)-1); pn!=PLAYER_INVALID; pn=GetNextEnabledPlayer(pn) ) +/** @brief A foreach loop to act on each CPU Player. */ +#define FOREACH_CpuPlayer( pn ) for( PlayerNumber pn=GetNextCpuPlayer((PlayerNumber)-1); pn!=PLAYER_INVALID; pn=GetNextCpuPlayer(pn) ) +/** @brief A foreach loop to act on each potential CPU Player. */ +#define FOREACH_PotentialCpuPlayer( pn ) for( PlayerNumber pn=GetNextPotentialCpuPlayer((PlayerNumber)-1); pn!=PLAYER_INVALID; pn=GetNextPotentialCpuPlayer(pn) ) +/** @brief A foreach loop to act on each Player in MultiPlayer. */ +#define FOREACH_EnabledMultiPlayer( mp ) for( MultiPlayer mp=GetNextEnabledMultiPlayer((MultiPlayer)-1); mp!=MultiPlayer_Invalid; mp=GetNextEnabledMultiPlayer(mp) ) + + + +extern GameState* GAMESTATE; // global and accessable from anywhere in our program + +#endif + +/** + * @file + * @author Chris Danford, Glenn Maynard, Chris Gomez (c) 2001-2004 + * @section LICENSE + * 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. + */ diff --git a/src/NoteSkinManager.cpp b/src/NoteSkinManager.cpp index b3f167adce..ca70566a59 100644 --- a/src/NoteSkinManager.cpp +++ b/src/NoteSkinManager.cpp @@ -406,7 +406,7 @@ Actor *NoteSkinManager::LoadActor( const RString &sButton, const RString &sEleme return new Actor; } - auto_ptr pNode( XmlFileUtil::XNodeFromTable(L) ); + unique_ptr pNode( XmlFileUtil::XNodeFromTable(L) ); if( pNode.get() == nullptr ) { // XNode will warn about the error diff --git a/src/Profile.cpp b/src/Profile.cpp index 860673907a..9f75200d3f 100644 --- a/src/Profile.cpp +++ b/src/Profile.cpp @@ -801,7 +801,7 @@ ProfileLoadResult Profile::LoadAllFromDir( RString sDir, bool bRequireSignature } int iError; - auto_ptr pFile( FILEMAN->Open(fn, RageFile::READ, iError) ); + unique_ptr pFile( FILEMAN->Open(fn, RageFile::READ, iError) ); if( pFile.get() == nullptr ) { LOG->Trace( "Error opening %s: %s", fn.c_str(), strerror(iError) ); @@ -943,7 +943,7 @@ XNode *Profile::SaveStatsXmlCreateNode() const bool Profile::SaveStatsXmlToDir( RString sDir, bool bSignData ) const { LOG->Trace( "SaveStatsXmlToDir: %s", sDir.c_str() ); - auto_ptr xml( SaveStatsXmlCreateNode() ); + unique_ptr xml( SaveStatsXmlCreateNode() ); // Save stats.xml RString fn = sDir + (g_bProfileDataCompress? STATS_XML_GZ:STATS_XML); @@ -1765,7 +1765,7 @@ void Profile::SaveStepsRecentScore( const Song* pSong, const Steps* pSteps, High ASSERT( h.stepsID.IsValid() ); h.hs = hs; - auto_ptr xml( new XNode("Stats") ); + unique_ptr xml( new XNode("Stats") ); xml->AppendChild( "MachineGuid", PROFILEMAN->GetMachineProfile()->m_sGuid ); XNode *recent = xml->AppendChild( new XNode("RecentSongScores") ); recent->AppendChild( h.CreateNode() ); @@ -1792,7 +1792,7 @@ void Profile::SaveCourseRecentScore( const Course* pCourse, const Trail* pTrail, h.trailID.FromTrail( pTrail ); h.hs = hs; - auto_ptr xml( new XNode("Stats") ); + unique_ptr xml( new XNode("Stats") ); xml->AppendChild( "MachineGuid", PROFILEMAN->GetMachineProfile()->m_sGuid ); XNode *recent = xml->AppendChild( new XNode("RecentCourseScores") ); recent->AppendChild( h.CreateNode() ); diff --git a/src/RageFileDriverDeflate.cpp b/src/RageFileDriverDeflate.cpp index 9931bbc0ff..2cdee8bc49 100644 --- a/src/RageFileDriverDeflate.cpp +++ b/src/RageFileDriverDeflate.cpp @@ -303,7 +303,7 @@ int RageFileObjDeflate::FlushInternal() */ RageFileObjInflate *GunzipFile( RageFileBasic *pFile_, RString &sError, uint32_t *iCRC32 ) { - auto_ptr pFile(pFile_); + unique_ptr pFile(pFile_); sError = ""; diff --git a/src/StatsManager.cpp b/src/StatsManager.cpp index 81617ee7fd..2e734b8ece 100644 --- a/src/StatsManager.cpp +++ b/src/StatsManager.cpp @@ -257,7 +257,7 @@ void StatsManager::CommitStatsToProfiles( const StageStats *pSS ) // Save recent scores { - auto_ptr xml( new XNode("Stats") ); + unique_ptr xml( new XNode("Stats") ); xml->AppendChild( "MachineGuid", PROFILEMAN->GetMachineProfile()->m_sGuid ); XNode *recent = nullptr;