sync controls cleanup:

move sync display/saving out of complicated ScreenGameplay
  show sync UI in editor playback as well as gameplay
  revert sync from in-memory backup, not from disk
  move more functions into debug overlay
This commit is contained in:
Chris Danford
2005-05-19 23:29:39 +00:00
parent f20e5915b0
commit d67d60e178
34 changed files with 902 additions and 383 deletions
+41 -3
View File
@@ -63,7 +63,6 @@ GameState::GameState() :
m_pCurGame = NULL;
m_iCoins = 0;
m_timeGameStarted.SetZero();
m_bIsOnSystemMenu = false;
ReloadCharacters();
@@ -82,6 +81,8 @@ GameState::GameState() :
m_Environment = new LuaTable;
m_pTimingDataOriginal = new TimingData;
/* Don't reset yet; let the first screen do it, so we can
* use PREFSMAN and THEME. */
// Reset();
@@ -95,7 +96,9 @@ GameState::~GameState()
FOREACH_PlayerNumber( p )
SAFE_DELETE( m_pPlayerState[p] );
delete m_Environment;
SAFE_DELETE( m_Environment );
SAFE_DELETE( m_pTimingDataOriginal );
}
void GameState::ApplyGameCommand( const CString &sCommand, PlayerNumber pn )
@@ -300,7 +303,7 @@ void GameState::PlayersFinalized()
if( MEMCARDMAN->GetCardsLocked() )
return;
MESSAGEMAN->Broadcast( PLAYERS_FINALIZED );
MESSAGEMAN->Broadcast( MESSAGE_PLAYERS_FINALIZED );
MEMCARDMAN->LockCards();
@@ -678,6 +681,8 @@ void GameState::ResetStageStatistics()
// Reset the round seed. Do this here and not in FinishStage so that players
// get new shuffle patterns if they Back out of gameplay and play again.
GAMESTATE->m_iStageSeed = rand();
ResetOriginalSyncData();
}
void GameState::UpdateSongPosition( float fPositionSeconds, const TimingData &timing, const RageTimer &timestamp )
@@ -1906,6 +1911,37 @@ bool GameState::PlayerIsUsingModifier( PlayerNumber pn, const CString &sModifier
return po == GAMESTATE->m_pPlayerState[pn]->m_PlayerOptions && so == GAMESTATE->m_SongOptions;
}
void GameState::ResetOriginalSyncData()
{
if( m_pCurSong )
*m_pTimingDataOriginal = m_pCurSong->m_Timing;
else
*m_pTimingDataOriginal = TimingData();
m_fGlobalOffsetSecondsOriginal = PREFSMAN->m_fGlobalOffsetSeconds;
}
bool GameState::IsSyncDataChanged()
{
if( m_pCurSong && *m_pTimingDataOriginal != m_pCurSong->m_Timing )
return true;
if( m_fGlobalOffsetSecondsOriginal != PREFSMAN->m_fGlobalOffsetSeconds )
return true;
return false;
}
void GameState::SaveSyncChanges()
{
GAMESTATE->m_pCurSong->Save();
PREFSMAN->SaveGlobalPrefsToDisk();
}
void GameState::RevertSyncChanges()
{
PREFSMAN->m_fGlobalOffsetSeconds.Set( GAMESTATE->m_fGlobalOffsetSecondsOriginal );
GAMESTATE->m_pCurSong->m_Timing = *GAMESTATE->m_pTimingDataOriginal;
}
// lua start
#include "LuaBinding.h"
@@ -2014,6 +2050,7 @@ public:
static int GetNumSidesJoined( T* p, lua_State *L ) { lua_pushnumber(L, p->GetNumSidesJoined() ); return 1; }
static int GetCoinMode( T* p, lua_State *L ) { lua_pushnumber(L, p->GetCoinMode() ); return 1; }
static int GetPremium( T* p, lua_State *L ) { lua_pushnumber(L, p->GetPremium() ); return 1; }
static int IsSyncDataChanged( T* p, lua_State *L ) { lua_pushboolean(L, p->IsSyncDataChanged() ); return 1; }
static void Register(lua_State *L)
{
@@ -2058,6 +2095,7 @@ public:
ADD_METHOD( GetNumSidesJoined )
ADD_METHOD( GetCoinMode )
ADD_METHOD( GetPremium )
ADD_METHOD( IsSyncDataChanged )
Luna<T>::Register( L );
+8 -1
View File
@@ -55,7 +55,6 @@ public:
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
BroadcastOnChange1D<CourseDifficulty,NUM_PLAYERS> m_PreferredCourseDifficulty;// used in nonstop
bool DifficultiesLocked();
bool ChangePreferredDifficulty( PlayerNumber pn, Difficulty dc );
@@ -302,6 +301,14 @@ public:
float GetGoalPercentComplete( PlayerNumber pn );
bool IsGoalComplete( PlayerNumber pn ) { return GetGoalPercentComplete( pn ) >= 1; }
// Sync changes stuff
TimingData *m_pTimingDataOriginal;
float m_fGlobalOffsetSecondsOriginal;
void ResetOriginalSyncData();
bool IsSyncDataChanged();
void SaveSyncChanges();
void RevertSyncChanges();
// Lua
void PushSelf( lua_State *L );
};
+3 -1
View File
@@ -42,7 +42,9 @@ ScreenNameEntry.cpp ScreenNameEntry.h ScreenNameEntryTraditional.cpp ScreenNameE
ScreenOptions.cpp ScreenOptions.h ScreenOptionsMaster.cpp ScreenOptionsMaster.h \
ScreenOptionsMasterPrefs.cpp ScreenOptionsMasterPrefs.h ScreenPackages.cpp ScreenPackages.h ScreenPlayerOptions.cpp ScreenPlayerOptions.h ScreenNetworkOptions.h \
ScreenNetworkOptions.cpp ScreenProfileOptions.cpp ScreenProfileOptions.h ScreenPrompt.cpp ScreenPrompt.h ScreenRanking.cpp ScreenRanking.h \
ScreenReloadSongs.cpp ScreenReloadSongs.h ScreenSandbox.cpp ScreenSandbox.h \
ScreenReloadSongs.cpp ScreenReloadSongs.h \
ScreenSandbox.cpp ScreenSandbox.h \
ScreenSaveSync.cpp ScreenSaveSync.h \
ScreenSelect.cpp ScreenSelect.h ScreenSelectCharacter.cpp ScreenSelectCharacter.h \
ScreenSelectDifficulty.cpp ScreenSelectDifficulty.h ScreenSelectGroup.cpp ScreenSelectGroup.h \
ScreenSelectMaster.cpp ScreenSelectMaster.h ScreenSelectMode.cpp ScreenSelectMode.h \
+2
View File
@@ -46,6 +46,8 @@ static const CString MessageNames[] = {
"SideJoinedP1",
"SideJoinedP2",
"PlayersFinalized",
"AssistTickChanged",
"AutosyncChanged",
};
XToString( Message, NUM_MESSAGES );
+4 -2
View File
@@ -52,7 +52,9 @@ enum Message
MESSAGE_COIN_INSERTED,
MESSAGE_SIDE_JOINED_P1,
MESSAGE_SIDE_JOINED_P2,
PLAYERS_FINALIZED,
MESSAGE_PLAYERS_FINALIZED,
MESSAGE_ASSIST_TICK_CHANGED,
MESSAGE_AUTOSYNC_CHANGED,
NUM_MESSAGES,
MESSAGE_INVALID
};
@@ -118,7 +120,7 @@ private:
Message mSendWhenChanged;
T *val;
public:
BroadcastOnChangePtr( Message m ) { mSendWhenChanged = m; }
BroadcastOnChangePtr( Message m ) { mSendWhenChanged = m; val = NULL; }
const T* Get() const { return val; }
void Set( T* t ) { val = t; if(MESSAGEMAN) MESSAGEMAN->Broadcast( MessageToString(mSendWhenChanged) ); }
operator T* () const { return val; }
+15 -3
View File
@@ -77,6 +77,8 @@ Player::Player()
PlayerAI::InitFromDisk();
m_pNoteField = new NoteField;
this->SubscribeToMessage( MESSAGE_AUTOSYNC_CHANGED );
}
Player::~Player()
@@ -1140,7 +1142,9 @@ void Player::HandleAutosync(float fNoteOffset)
if( GAMESTATE->m_SongOptions.m_AutosyncType == SongOptions::AUTOSYNC_OFF )
return;
m_fOffset[m_iOffsetSample++] = fNoteOffset;
m_fOffset[m_iOffsetSample] = fNoteOffset;
m_iOffsetSample++;
if( m_iOffsetSample < SAMPLE_COUNT )
return; /* need more */
@@ -1174,11 +1178,11 @@ void Player::HandleAutosync(float fNoteOffset)
ASSERT(0);
}
SCREENMAN->SystemMessage( ssprintf(sAutosyncType+": Offset corrected by %f. Error in steps: %f seconds.", mean, stddev) );
SCREENMAN->SystemMessage( "Autosync: Correction applied." );
}
else
{
SCREENMAN->SystemMessage( ssprintf(sAutosyncType+": Offset NOT corrected. Average offset: %f seconds. Error: %f seconds.", mean, stddev) );
SCREENMAN->SystemMessage( "Autosync: Correction NOT applied.\n Timing deviation too high." );
}
m_iOffsetSample = 0;
@@ -1646,6 +1650,14 @@ bool Player::IsPlayingBeginner() const
}
}
void Player::HandleMessage( const CString& sMessage )
{
// Reset autosync samples when toggling
if( sMessage == MessageToString(MESSAGE_AUTOSYNC_CHANGED) )
m_iOffsetSample = 0;
}
/*
* (c) 2001-2004 Chris Danford
* All rights reserved.
+1
View File
@@ -31,6 +31,7 @@ public:
virtual void Update( float fDeltaTime );
virtual void DrawPrimitives();
virtual void HandleMessage( const CString& sMessage );
void Init(
const CString &sType,
+2 -2
View File
@@ -1,6 +1,6 @@
#include "global.h"
#include "RageMath.h"
#include "RageUtil.h"
#include "RageMath.h"
#include "RageLog.h"
#include "RageFile.h"
@@ -179,7 +179,7 @@ CString Commify( int iNum )
return sReturn;
}
CString AddNumberSuffix( int i )
CString FormatNumberAndSuffix( int i )
{
CString sSuffix;
switch( i%10 )
+1 -1
View File
@@ -219,7 +219,7 @@ CString SecondsToMMSSMsMsMs( float fSecs );
CString PrettyPercent( float fNumerator, float fDenominator );
inline CString PrettyPercent( int fNumerator, int fDenominator ) { return PrettyPercent( float(fNumerator), float(fDenominator) ); }
CString Commify( int iNum );
CString AddNumberSuffix( int i );
CString FormatNumberAndSuffix( int i );
struct tm GetLocalTime();
+2
View File
@@ -17,6 +17,8 @@ Screen::Screen( CString sName )
{
SetName( sName );
m_bIsTransparent = false;
ALLOW_OPERATOR_MENU_BUTTON.Load( sName, "AllowOperatorMenuButton" );
}
Screen::~Screen()
+12
View File
@@ -10,6 +10,7 @@
#include "MenuInput.h"
#include "StyleInput.h"
#include "ScreenManager.h"
#include "ThemeMetric.h"
// Each Screen class should have a REGISTER_SCREEN_CLASS in its CPP file.
#define REGISTER_SCREEN_CLASS( className ) \
@@ -20,6 +21,14 @@
}; \
static Register##className register_##className;
enum ScreenType
{
attract,
game_menu,
gameplay,
system_menu
};
class Screen : public ActorFrame
{
public:
@@ -40,6 +49,7 @@ public:
bool IsTransparent() const { return m_bIsTransparent; }
virtual bool UsesBackground() const { return true; } // override and set false if this screen shouldn't load a background
virtual ScreenType GetScreenType() const { return ALLOW_OPERATOR_MENU_BUTTON ? system_menu : game_menu; }
static bool JoinInput( const MenuInput &MenuI ); // return true if a player joined
@@ -54,6 +64,8 @@ protected:
bool m_bIsTransparent; // screens below us need to be drawn first
ThemeMetric<bool> ALLOW_OPERATOR_MENU_BUTTON;
public:
// let subclass override if they want
+2
View File
@@ -21,6 +21,8 @@ public:
virtual void Update( float fDelta );
virtual void HandleScreenMessage( const ScreenMessage SM );
virtual ScreenType GetScreenType() const { return attract; }
protected:
virtual void StartPlayingMusic();
};
+153 -55
View File
@@ -9,6 +9,12 @@
#include "GameCommand.h"
#include "ScreenGameplay.h"
#include "RageSoundManager.h"
#include "GameSoundManager.h"
#include "RageTextureManager.h"
#include "NoteSkinManager.h"
#include "Bookkeeper.h"
#include "ProfileManager.h"
#include "CodeDetector.h"
static bool g_bIsDisplayed = false;
static bool g_bIsSlow = false;
@@ -16,6 +22,11 @@ static bool g_bIsHalt = false;
static RageTimer g_HaltTimer(RageZeroTimer);
static bool g_bMute = false;
static bool IsGameplay()
{
return SCREENMAN && SCREENMAN->GetTopScreen() && SCREENMAN->GetTopScreen()->GetScreenType() == gameplay;
}
REGISTER_SCREEN_CLASS( ScreenDebugOverlay );
ScreenDebugOverlay::ScreenDebugOverlay( const CString &sName ) : Screen(sName)
{
@@ -27,13 +38,17 @@ ScreenDebugOverlay::~ScreenDebugOverlay()
struct MapDebugToDI
{
DeviceInput holdForMenu;
DeviceInput button[NUM_DEBUG_LINES];
DeviceInput holdForDebug;
DeviceInput debugButton[NUM_DEBUG_LINES];
DeviceInput gameplayButton[NUM_DEBUG_LINES];
void Clear()
{
holdForMenu.MakeInvalid();
holdForDebug.MakeInvalid();
FOREACH_DebugLine(i)
button[i].MakeInvalid();
{
debugButton[i].MakeInvalid();
gameplayButton[i].MakeInvalid();
}
}
};
static MapDebugToDI g_Mappings;
@@ -41,7 +56,12 @@ static MapDebugToDI g_Mappings;
static CString GetDebugButtonName( DebugLine i )
{
// TODO: Make arch appropriate.
return g_Mappings.button[i].toString();
vector<CString> v;
if( g_Mappings.debugButton[i].IsValid() )
v.push_back( g_Mappings.debugButton[i].toString() );
if( g_Mappings.gameplayButton[i].IsValid() )
v.push_back( g_Mappings.gameplayButton[i].toString()+" in gameplay" );
return join( " or ", v );
}
void ScreenDebugOverlay::Init()
@@ -53,20 +73,26 @@ void ScreenDebugOverlay::Init()
{
g_Mappings.Clear();
g_Mappings.holdForMenu = DeviceInput(DEVICE_KEYBOARD, KEY_F3);
g_Mappings.button[0] = DeviceInput(DEVICE_KEYBOARD, KEY_C1);
g_Mappings.button[1] = DeviceInput(DEVICE_KEYBOARD, KEY_C2);
g_Mappings.button[2] = DeviceInput(DEVICE_KEYBOARD, KEY_C3);
g_Mappings.button[3] = DeviceInput(DEVICE_KEYBOARD, KEY_C4);
g_Mappings.button[4] = DeviceInput(DEVICE_KEYBOARD, KEY_C5);
g_Mappings.button[5] = DeviceInput(DEVICE_KEYBOARD, KEY_C6);
g_Mappings.button[6] = DeviceInput(DEVICE_KEYBOARD, KEY_C7);
g_Mappings.button[7] = DeviceInput(DEVICE_KEYBOARD, KEY_C8);
g_Mappings.button[8] = DeviceInput(DEVICE_KEYBOARD, KEY_C9);
g_Mappings.button[9] = DeviceInput(DEVICE_KEYBOARD, KEY_C0);
g_Mappings.button[10] = DeviceInput(DEVICE_KEYBOARD, KEY_UNDERSCORE);
g_Mappings.button[11] = DeviceInput(DEVICE_KEYBOARD, KEY_EQUAL);
g_Mappings.button[12] = DeviceInput(DEVICE_KEYBOARD, KEY_PAUSE);
g_Mappings.holdForDebug = DeviceInput(DEVICE_KEYBOARD, KEY_F3);
g_Mappings.gameplayButton[0] = DeviceInput(DEVICE_KEYBOARD, KEY_F8);
g_Mappings.gameplayButton[1] = DeviceInput(DEVICE_KEYBOARD, KEY_F7);
g_Mappings.gameplayButton[2] = DeviceInput(DEVICE_KEYBOARD, KEY_F6);
g_Mappings.debugButton[3] = DeviceInput(DEVICE_KEYBOARD, KEY_C1);
g_Mappings.debugButton[4] = DeviceInput(DEVICE_KEYBOARD, KEY_C2);
g_Mappings.debugButton[5] = DeviceInput(DEVICE_KEYBOARD, KEY_C3);
g_Mappings.debugButton[6] = DeviceInput(DEVICE_KEYBOARD, KEY_C4);
g_Mappings.debugButton[7] = DeviceInput(DEVICE_KEYBOARD, KEY_C5);
g_Mappings.debugButton[8] = DeviceInput(DEVICE_KEYBOARD, KEY_C6);
g_Mappings.debugButton[9] = DeviceInput(DEVICE_KEYBOARD, KEY_C7);
g_Mappings.debugButton[10] = DeviceInput(DEVICE_KEYBOARD, KEY_C8);
g_Mappings.debugButton[11] = DeviceInput(DEVICE_KEYBOARD, KEY_C9);
g_Mappings.debugButton[12] = DeviceInput(DEVICE_KEYBOARD, KEY_C0);
g_Mappings.debugButton[13] = DeviceInput(DEVICE_KEYBOARD, KEY_HYPHEN);
g_Mappings.debugButton[14] = DeviceInput(DEVICE_KEYBOARD, KEY_EQUAL);
g_Mappings.debugButton[15] = DeviceInput(DEVICE_KEYBOARD, KEY_LBRACKET);
g_Mappings.debugButton[16] = DeviceInput(DEVICE_KEYBOARD, KEY_RBRACKET);
g_Mappings.debugButton[17] = DeviceInput(DEVICE_KEYBOARD, KEY_BACKSLASH);
}
@@ -74,20 +100,27 @@ void ScreenDebugOverlay::Init()
m_Quad.SetDiffuse( RageColor(0, 0, 0, 0.5f) );
this->AddChild( &m_Quad );
m_Header.LoadFromFont( THEME->GetPathToF("Common normal") );
m_Header.SetHorizAlign( Actor::align_left );
m_Header.SetX( 20 );
m_Header.SetY( SCREEN_TOP+20 );
m_Header.SetZoom( 1.0f );
m_Header.SetText( "Debug Menu" );
this->AddChild( &m_Header );
m_textHeader.LoadFromFont( THEME->GetPathToF("Common normal") );
m_textHeader.SetHorizAlign( Actor::align_left );
m_textHeader.SetX( SCREEN_LEFT+20 );
m_textHeader.SetY( SCREEN_TOP+20 );
m_textHeader.SetZoom( 1.0f );
m_textHeader.SetText( "Debug Menu" );
this->AddChild( &m_textHeader );
FOREACH_DebugLine( i )
{
BitmapText &txt = m_Text[i];
txt.LoadFromFont( THEME->GetPathToF("Common normal") );
txt.SetHorizAlign( Actor::align_left );
this->AddChild( &txt );
BitmapText &txt1 = m_textButton[i];
txt1.LoadFromFont( THEME->GetPathToF("Common normal") );
txt1.SetHorizAlign( Actor::align_right );
txt1.SetShadowLength( 2 );
this->AddChild( &txt1 );
BitmapText &txt2 = m_textFunction[i];
txt2.LoadFromFont( THEME->GetPathToF("Common normal") );
txt2.SetHorizAlign( Actor::align_left );
txt2.SetShadowLength( 2 );
this->AddChild( &txt2 );
}
Update( 0 );
@@ -133,28 +166,37 @@ void ScreenDebugOverlay::UpdateText()
FOREACH_DebugLine( i )
{
BitmapText &txt = m_Text[i];
txt.SetX( 100 );
txt.SetY( SCALE(i, 0, NUM_DEBUG_LINES-1, SCREEN_TOP+60, SCREEN_BOTTOM-40) );
txt.SetZoom( 0.8f );
BitmapText &txt1 = m_textButton[i];
txt1.SetX( SCREEN_CENTER_X-50 );
txt1.SetY( SCALE(i, 0, NUM_DEBUG_LINES-1, SCREEN_TOP+60, SCREEN_BOTTOM-40) );
txt1.SetZoom( 0.7f );
BitmapText &txt2 = m_textFunction[i];
txt2.SetX( SCREEN_CENTER_X-30 );
txt2.SetY( SCALE(i, 0, NUM_DEBUG_LINES-1, SCREEN_TOP+60, SCREEN_BOTTOM-40) );
txt2.SetZoom( 0.7f );
CString s1;
switch( i )
{
case DebugLine_Autoplay: s1="AutoPlay"; break;
case DebugLine_AssistTick: s1="AssistTick"; break;
case DebugLine_Autosync: s1="AutoSync"; break;
case DebugLine_CoinMode: s1="CoinMode"; break;
case DebugLine_Slow: s1="Slow"; break;
case DebugLine_Halt: s1="Halt"; break;
case DebugLine_LightsDebug: s1="Lights Debug"; break;
case DebugLine_MonkeyInput: s1="MonkeyInput"; break;
case DebugLine_Stats: s1="Stats"; break;
case DebugLine_Stats: s1="Rendering Stats"; break;
case DebugLine_Vsync: s1="Vsync"; break;
case DebugLine_ScreenTestMode: s1="Screen Test Mode"; break;
case DebugLine_ClearMachineStats: s1="Clear Machine Stats"; break;
case DebugLine_FillMachineStats: s1="Fill Machine Stats"; break;
case DebugLine_SendNotesEnded: s1="Send Notes Ended"; break;
case DebugLine_Volume: s1="Mute"; break;
case DebugLine_CurrentScreen: s1="Screen"; break;
case DebugLine_ReloadCurrentScreen: s1="Reload"; break;
case DebugLine_ReloadTheme: s1="Reload Theme"; break;
case DebugLine_WriteProfiles: s1="Write Profiles"; break;
case DebugLine_Uptime: s1="Uptime"; break;
default: ASSERT(0);
}
@@ -163,6 +205,8 @@ void ScreenDebugOverlay::UpdateText()
switch( i )
{
case DebugLine_Autoplay: bOn=PREFSMAN->m_AutoPlay.Get() != PC_HUMAN; break;
case DebugLine_AssistTick: bOn=GAMESTATE->m_SongOptions.m_bAssistTick; break;
case DebugLine_Autosync: bOn=GAMESTATE->m_SongOptions.m_AutosyncType!=SongOptions::AUTOSYNC_OFF; break;
case DebugLine_CoinMode: bOn=true; break;
case DebugLine_Slow: bOn=g_bIsSlow; break;
case DebugLine_Halt: bOn=g_bIsHalt; break;
@@ -175,7 +219,9 @@ void ScreenDebugOverlay::UpdateText()
case DebugLine_FillMachineStats: bOn=true; break;
case DebugLine_SendNotesEnded: bOn=true; break;
case DebugLine_Volume: bOn=g_bMute; break;
case DebugLine_CurrentScreen: bOn=false; break;
case DebugLine_ReloadCurrentScreen: bOn=true; break;
case DebugLine_ReloadTheme: bOn=true; break;
case DebugLine_WriteProfiles: bOn=true; break;
case DebugLine_Uptime: bOn=false; break;
default: ASSERT(0);
}
@@ -192,6 +238,16 @@ void ScreenDebugOverlay::UpdateText()
default: ASSERT(0);
}
break;
case DebugLine_AssistTick: s2=bOn ? "on":"off"; break;
case DebugLine_Autosync:
switch( GAMESTATE->m_SongOptions.m_AutosyncType )
{
case SongOptions::AUTOSYNC_OFF: s2="off"; break;
case SongOptions::AUTOSYNC_SONG: s2="Song"; break;
case SongOptions::AUTOSYNC_MACHINE: s2="Machine"; break;
default: ASSERT(0);
}
break;
case DebugLine_CoinMode: s2=CoinModeToString(PREFSMAN->m_CoinMode); break;
case DebugLine_Slow: s2=bOn ? "on":"off"; break;
case DebugLine_Halt: s2=bOn ? "on":"off"; break;
@@ -204,19 +260,23 @@ void ScreenDebugOverlay::UpdateText()
case DebugLine_FillMachineStats: s2=""; break;
case DebugLine_SendNotesEnded: s2=""; break;
case DebugLine_Volume: s2=bOn ? "on":"off"; break;
case DebugLine_CurrentScreen: s2=SCREENMAN ? SCREENMAN->GetTopScreen()->m_sName:""; break;
case DebugLine_ReloadCurrentScreen: s2=SCREENMAN ? SCREENMAN->GetTopScreen()->m_sName:""; break;
case DebugLine_ReloadTheme: s2=""; break;
case DebugLine_WriteProfiles: s2=""; break;
case DebugLine_Uptime: s2=SecondsToMMSSMsMsMs(RageTimer::GetTimeSinceStart()); break;
default: ASSERT(0);
}
txt.SetDiffuse( bOn ? on:off );
txt1.SetDiffuse( bOn ? on:off );
txt2.SetDiffuse( bOn ? on:off );
CString sButton = GetDebugButtonName(i);
if( !sButton.empty() )
sButton += ": ";
txt1.SetText( sButton );
if( !s2.empty() )
s1 += " - ";
txt.SetText( sButton + s1 + s2 );
txt2.SetText( s1 + s2 );
}
if( g_bIsHalt )
@@ -233,7 +293,7 @@ void ScreenDebugOverlay::UpdateText()
bool ScreenDebugOverlay::OverlayInput( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI )
{
if( DeviceI == g_Mappings.holdForMenu )
if( DeviceI == g_Mappings.holdForDebug )
{
if( type == IET_FIRST_PRESS )
g_bIsDisplayed = true;
@@ -241,23 +301,22 @@ bool ScreenDebugOverlay::OverlayInput( const DeviceInput& DeviceI, const InputEv
g_bIsDisplayed = false;
}
if( !g_bIsDisplayed )
return false;
if( type != IET_FIRST_PRESS )
return false; /* eat the input but do nothing */
return true; /* eat the input but do nothing */
FOREACH_DebugLine( i )
{
if( DeviceI == g_Mappings.button[i] )
if( (g_bIsDisplayed && DeviceI == g_Mappings.debugButton[i]) ||
(IsGameplay() && DeviceI == g_Mappings.gameplayButton[i]) )
{
BitmapText &txt = m_Text[i];
BitmapText &txt1 = m_textButton[i];
txt1.FinishTweening();
float fZoom = txt1.GetZoom();
txt1.SetZoom( fZoom * 1.2f );
txt1.BeginTweening( 0.2f, Actor::TWEEN_LINEAR );
txt1.SetZoom( fZoom );
txt.FinishTweening();
float fZoom = txt.GetZoom();
txt.SetZoom( fZoom * 1.2f );
txt.BeginTweening( 0.2f, Actor::TWEEN_LINEAR );
txt.SetZoom( fZoom );
BitmapText &txt2 = m_textFunction[i];
switch( i )
{
@@ -270,6 +329,26 @@ bool ScreenDebugOverlay::OverlayInput( const DeviceInput& DeviceI, const InputEv
GAMESTATE->m_pPlayerState[pn]->m_PlayerController = PREFSMAN->m_AutoPlay;
}
break;
case DebugLine_AssistTick:
{
if( type != IET_FIRST_PRESS )
return true; /* eat the input but do nothing */
GAMESTATE->m_SongOptions.m_bAssistTick = !GAMESTATE->m_SongOptions.m_bAssistTick;
/* Store this change, so it sticks if we change songs: */
GAMESTATE->m_StoredSongOptions.m_bAssistTick = GAMESTATE->m_SongOptions.m_bAssistTick;
MESSAGEMAN->Broadcast( MESSAGE_ASSIST_TICK_CHANGED );
}
break;
case DebugLine_Autosync:
{
if( type != IET_FIRST_PRESS )
return true; /* eat the input but do nothing */
SongOptions::AutosyncType as = (SongOptions::AutosyncType)(GAMESTATE->m_SongOptions.m_AutosyncType+1);
wrap( (int&)as, SongOptions::NUM_AUTOSYNC_TYPES );
GAMESTATE->m_SongOptions.m_AutosyncType = as;
MESSAGEMAN->Broadcast( MESSAGE_AUTOSYNC_CHANGED );
}
break;
case DebugLine_CoinMode:
{
CoinMode cm = (CoinMode)(PREFSMAN->m_CoinMode+1);
@@ -324,7 +403,24 @@ bool ScreenDebugOverlay::OverlayInput( const DeviceInput& DeviceI, const InputEv
g_bMute = !g_bMute;
SOUNDMAN->SetPrefs( g_bMute ? 0 : PREFSMAN->GetSoundVolume() );
break;
case DebugLine_CurrentScreen:
case DebugLine_ReloadCurrentScreen:
SOUND->StopMusic();
ResetGame( true );
break;
case DebugLine_ReloadTheme:
THEME->ReloadMetrics();
TEXTUREMAN->ReloadAll();
NOTESKIN->RefreshNoteSkinData( GAMESTATE->m_pCurGame );
CodeDetector::RefreshCacheItems();
break;
case DebugLine_WriteProfiles:
// HACK: Also save bookkeeping and profile info for debugging
// so we don't have to play through a whole song to get new output.
BOOKKEEPER->WriteToDisk();
PROFILEMAN->SaveMachineProfile();
FOREACH_PlayerNumber( p )
if( PROFILEMAN->IsPersistentProfile(p) )
PROFILEMAN->SaveProfile( p );
break;
case DebugLine_Uptime:
break;
@@ -333,11 +429,13 @@ bool ScreenDebugOverlay::OverlayInput( const DeviceInput& DeviceI, const InputEv
UpdateText();
SCREENMAN->SystemMessage( txt.GetText() );
SCREENMAN->SystemMessage( txt2.GetText() );
return true;
}
}
return true;
return false;
}
+8 -3
View File
@@ -10,6 +10,8 @@
enum DebugLine
{
DebugLine_Autoplay,
DebugLine_AssistTick,
DebugLine_Autosync,
DebugLine_CoinMode,
DebugLine_Slow,
DebugLine_Halt,
@@ -22,7 +24,9 @@ enum DebugLine
DebugLine_FillMachineStats,
DebugLine_SendNotesEnded,
DebugLine_Volume,
DebugLine_CurrentScreen,
DebugLine_ReloadCurrentScreen,
DebugLine_ReloadTheme,
DebugLine_WriteProfiles,
DebugLine_Uptime,
NUM_DEBUG_LINES
};
@@ -43,8 +47,9 @@ private:
void UpdateText();
Quad m_Quad;
BitmapText m_Header;
BitmapText m_Text[NUM_DEBUG_LINES];
BitmapText m_textHeader;
BitmapText m_textButton[NUM_DEBUG_LINES];
BitmapText m_textFunction[NUM_DEBUG_LINES];
};
+2
View File
@@ -13,6 +13,8 @@ public:
virtual void Init();
virtual void HandleScreenMessage( const ScreenMessage SM );
virtual ScreenType GetScreenType() const { return attract; }
};
#endif
+8 -2
View File
@@ -477,13 +477,13 @@ static Menu g_CourseMode(
int g_iLastInsertAttackTrack = -1;
float g_fLastInsertAttackDurationSeconds = -1;
#define PREV_SCREEN THEME->GetMetric(m_sName,"PrevScreen")
REGISTER_SCREEN_CLASS( ScreenEdit );
ScreenEdit::ScreenEdit( CString sName ) : ScreenWithMenuElements( sName )
{
LOG->Trace( "ScreenEdit::ScreenEdit()" );
PREV_SCREEN.Load( sName, "PrevScreen" );
ASSERT( GAMESTATE->m_pCurSong );
ASSERT( GAMESTATE->m_pCurSteps[0] );
}
@@ -1482,6 +1482,11 @@ void ScreenEdit::TransitionEditState( EditState em )
{
EditState old = m_EditState;
if( old == STATE_PLAYING )
{
SCREENMAN->AddNewScreenToTop( "ScreenSaveSync" );
}
switch( em )
{
case STATE_EDITING:
@@ -1522,6 +1527,7 @@ void ScreenEdit::TransitionEditState( EditState em )
case STATE_RECORDING:
break;
case STATE_PLAYING:
GAMESTATE->ResetOriginalSyncData();
break;
default:
ASSERT(0);
+2 -2
View File
@@ -139,8 +139,8 @@ public:
virtual void HandleScreenMessage( const ScreenMessage SM );
protected:
ThemeMetric<CString> PREV_SCREEN;
virtual ScreenType GetScreenType() const { return m_EditState==STATE_PLAYING ? gameplay : system_menu; }
enum EditState { STATE_EDITING, STATE_RECORDING, STATE_PLAYING, NUM_EDIT_STATES, STATE_INVALID };
void TransitionEditState( EditState em );
void PlayTicks();
+1 -245
View File
@@ -65,9 +65,6 @@
static ThemeMetric<float> INITIAL_BACKGROUND_BRIGHTNESS ("ScreenGameplay","InitialBackgroundBrightness");
static ThemeMetric<float> SECONDS_BETWEEN_COMMENTS ("ScreenGameplay","SecondsBetweenComments");
/* Global, so it's accessible from ShowSavePrompt: */
static float g_fOldOffset; // used on offset screen to calculate difference
AutoScreenMessage( SM_PlayGo )
// received while STATE_DANCING
@@ -76,7 +73,6 @@ AutoScreenMessage( SM_StartLoadingNextSong )
// received while STATE_OUTRO
AutoScreenMessage( SM_SaveChangedBeforeGoingBack )
AutoScreenMessage( SM_GoToScreenAfterBack )
AutoScreenMessage( SM_BeginFailed )
@@ -102,8 +98,6 @@ ScreenGameplay::ScreenGameplay( CString sName ) : ScreenWithMenuElements(sName)
FAIL_AFTER_30_MISSES.Load( sName, "FailAfter30Misses" );
USE_FORCED_MODIFIERS_IN_BEGINNER.Load( sName, "UseForcedModifiersInBeginner" );
FORCED_MODIFIERS_IN_BEGINNER.Load( sName, "ForcedModifiersInBeginner" );
this->SubscribeToMessage( PREFSMAN->m_AutoPlay.GetName()+"Changed" );
}
void ScreenGameplay::Init()
@@ -212,8 +206,6 @@ void ScreenGameplay::Init()
}
}
m_bChangedOffsetOrBPM = GAMESTATE->m_SongOptions.m_AutosyncType == SongOptions::AUTOSYNC_SONG;
m_DancingState = STATE_INTRO;
// Set this in LoadNextSong()
@@ -221,12 +213,6 @@ void ScreenGameplay::Init()
m_bZeroDeltaOnNextUpdate = false;
// init old offset in case offset changes in song
if( GAMESTATE->IsCourseMode() )
g_fOldOffset = -1000;
else
g_fOldOffset = GAMESTATE->m_pCurSong->m_Timing.m_fBeat0OffsetInSeconds;
m_SongBackground.SetName( "SongBackground" );
m_SongBackground.SetDrawOrder( DRAW_ORDER_BEFORE_EVERYTHING );
@@ -548,14 +534,6 @@ void ScreenGameplay::Init()
this->AddChild( &m_LyricDisplay );
m_textAutoPlay.LoadFromFont( THEME->GetPathF(m_sName,"autoplay") );
m_textAutoPlay.SetName( "AutoPlay" );
SET_XY( m_textAutoPlay );
if( !GAMESTATE->m_bDemonstrationOrJukebox ) // only load if we're not in demonstration or jukebox
this->AddChild( &m_textAutoPlay );
UpdateAutoPlayText();
m_BPMDisplay.SetName( "BPMDisplay" );
m_BPMDisplay.Load();
SET_XY( m_BPMDisplay );
@@ -1834,7 +1812,7 @@ void ScreenGameplay::BackOutFromGameplay()
m_soundAssistTick.StopPlaying(); /* Stop any queued assist ticks. */
this->ClearMessageQueue();
m_Cancel.StartTransitioning( SM_SaveChangedBeforeGoingBack );
m_Cancel.StartTransitioning( SM_GoToScreenAfterBack );
}
void ScreenGameplay::AbortGiveUp( bool bShowText )
@@ -1936,102 +1914,6 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ
/* Nothing below cares about releases. */
if(type == IET_RELEASE) return;
// Handle special keys to adjust the offset
if( DeviceI.device == DEVICE_KEYBOARD )
{
switch( DeviceI.button )
{
case KEY_F6:
{
bool bHoldingShift =
INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_RSHIFT)) ||
INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_LSHIFT));
// toggle
if( GAMESTATE->m_SongOptions.m_AutosyncType != SongOptions::AUTOSYNC_OFF )
GAMESTATE->m_SongOptions.m_AutosyncType = SongOptions::AUTOSYNC_OFF;
else
GAMESTATE->m_SongOptions.m_AutosyncType = bHoldingShift ? SongOptions::AUTOSYNC_MACHINE : SongOptions::AUTOSYNC_SONG;
m_bChangedOffsetOrBPM |= !bHoldingShift;
UpdateAutoPlayText();
}
break;
case KEY_F7:
GAMESTATE->m_SongOptions.m_bAssistTick ^= 1;
/* Store this change, so it sticks if we change songs: */
GAMESTATE->m_StoredSongOptions.m_bAssistTick = GAMESTATE->m_SongOptions.m_bAssistTick;
m_textDebug.SetText( ssprintf("Assist Tick is %s", GAMESTATE->m_SongOptions.m_bAssistTick?"ON":"OFF") );
m_textDebug.StopTweening();
m_textDebug.SetDiffuse( RageColor(1,1,1,1) );
m_textDebug.BeginTweening( 3 ); // sleep
m_textDebug.BeginTweening( 0.5f ); // fade out
m_textDebug.SetDiffuse( RageColor(1,1,1,0) );
break;
case KEY_F9:
case KEY_F10:
{
m_bChangedOffsetOrBPM = true;
float fOffsetDelta;
switch( DeviceI.button )
{
case KEY_F9: fOffsetDelta = -0.020f; break;
case KEY_F10: fOffsetDelta = +0.020f; break;
default: ASSERT(0); return;
}
if( INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_RALT)) ||
INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_LALT)) )
fOffsetDelta /= 2; /* .010 */
else if( type == IET_FAST_REPEAT )
fOffsetDelta *= 10;
BPMSegment& seg = GAMESTATE->m_pCurSong->GetBPMSegmentAtBeat( GAMESTATE->m_fSongBeat );
seg.m_fBPS += fOffsetDelta;
m_textDebug.SetText( ssprintf("Cur BPM = %.2f", seg.GetBPM()) );
m_textDebug.StopTweening();
m_textDebug.SetDiffuse( RageColor(1,1,1,1) );
m_textDebug.BeginTweening( 3 ); // sleep
m_textDebug.BeginTweening( 0.5f ); // fade out
m_textDebug.SetDiffuse( RageColor(1,1,1,0) );
}
break;
case KEY_F11:
case KEY_F12:
{
m_bChangedOffsetOrBPM = true;
float fOffsetDelta;
switch( DeviceI.button )
{
case KEY_F11: fOffsetDelta = -0.02f; break;
case KEY_F12: fOffsetDelta = +0.02f; break;
default: ASSERT(0); return;
}
if( INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_RALT)) ||
INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_LALT)) )
fOffsetDelta /= 20; /* 1ms */
else switch( type )
{
case IET_SLOW_REPEAT: fOffsetDelta *= 10; break;
case IET_FAST_REPEAT: fOffsetDelta *= 40; break;
}
GAMESTATE->m_pCurSong->m_Timing.m_fBeat0OffsetInSeconds += fOffsetDelta;
m_textDebug.SetText( ssprintf("Offset = %.3f", GAMESTATE->m_pCurSong->m_Timing.m_fBeat0OffsetInSeconds) );
m_textDebug.StopTweening();
m_textDebug.SetDiffuse( RageColor(1,1,1,1) );
m_textDebug.BeginTweening( 3 ); // sleep
m_textDebug.BeginTweening( 0.5f ); // fade out
m_textDebug.SetDiffuse( RageColor(1,1,1,0) );
}
break;
}
}
//
// handle a step or battle item activate
@@ -2045,111 +1927,9 @@ void ScreenGameplay::Input( const DeviceInput& DeviceI, const InputEventType typ
if( PREFSMAN->m_AutoPlay == PC_HUMAN )
m_Player[StyleI.player].Step( StyleI.col, DeviceI.ts );
}
// else if( type==IET_FIRST_PRESS &&
// !PREFSMAN->m_bAutoPlay &&
// MenuI.IsValifd() &&
// GAMESTATE->IsPlayerEnabled( MenuI.player ) &&
// GAMESTATE->IsBattleMode() )
// {
// int iItemSlot;
// switch( MenuI.button )
// {
// case MENU_BUTTON_LEFT: iItemSlot = 0; break;
// case MENU_BUTTON_START: iItemSlot = 1; break;
// case MENU_BUTTON_RIGHT: iItemSlot = 2; break;
// default: iItemSlot = -1; break;
// }
//
// if( iItemSlot != -1 )
// m_pInventory[MenuI.player]->UseItem( iItemSlot );
// }
}
void ScreenGameplay::UpdateAutoPlayText()
{
vector<CString> vsText;
switch( PREFSMAN->m_AutoPlay )
{
case PC_HUMAN: break;
case PC_AUTOPLAY: vsText.push_back("AutoPlay"); break;
case PC_CPU: vsText.push_back("AutoPlay CPU"); break;
default: ASSERT(0);
}
switch( GAMESTATE->m_SongOptions.m_AutosyncType )
{
case SongOptions::AUTOSYNC_OFF: break;
case SongOptions::AUTOSYNC_SONG: vsText.push_back("AutosyncSong"); break;
case SongOptions::AUTOSYNC_MACHINE: vsText.push_back("AutosyncMachine"); break;
default: ASSERT(0);
}
CString sText = join( " ", vsText );
m_textAutoPlay.SetText( sText );
}
void SaveChanges( void* papSongsQueue )
{
vector<Song*>& apSongsQueue = *(vector<Song*>*)papSongsQueue;
for( unsigned i=0; i<apSongsQueue.size(); i++ )
apSongsQueue[i]->Save();
}
void RevertChanges( void* papSongsQueue )
{
vector<Song*>& apSongsQueue = *(vector<Song*>*)papSongsQueue;
FOREACH( Song*, apSongsQueue, pSong )
{
SONGMAN->RevertFromDisk( *pSong );
}
}
void ScreenGameplay::ShowSavePrompt( ScreenMessage SM_SendWhenDone )
{
CString sMessage;
switch( GAMESTATE->m_PlayMode )
{
case PLAY_MODE_REGULAR:
case PLAY_MODE_BATTLE:
case PLAY_MODE_RAVE:
sMessage = ssprintf(
"You have changed the offset or BPM of\n"
"%s\n",
GAMESTATE->m_pCurSong->GetFullDisplayTitle().c_str() );
if( fabs(GAMESTATE->m_pCurSong->m_Timing.m_fBeat0OffsetInSeconds - g_fOldOffset) > 0.001 )
{
sMessage += ssprintf(
"\n"
"Offset was changed from %.3f to %.3f (%.3f).\n",
g_fOldOffset,
GAMESTATE->m_pCurSong->m_Timing.m_fBeat0OffsetInSeconds,
GAMESTATE->m_pCurSong->m_Timing.m_fBeat0OffsetInSeconds - g_fOldOffset );
}
sMessage +=
"\n"
"Would you like to save these changes back\n"
"to the song file?\n"
"Choosing NO will discard your changes.";
break;
case PLAY_MODE_NONSTOP:
case PLAY_MODE_ONI:
case PLAY_MODE_ENDLESS:
sMessage = ssprintf(
"You have changed the offset or BPM of\n"
"one or more songs in this course.\n"
"Would you like to save these changes back\n"
"to the song file(s)?\n"
"Choosing NO will discard your changes." );
break;
default:
ASSERT(0);
}
SCREENMAN->Prompt( SM_SendWhenDone, sMessage, PROMPT_YES_NO, ANSWER_NO, SaveChanges, RevertChanges, &m_apSongsQueue );
}
/*
* Saving StageStats that are affected by the note pattern is a little tricky:
@@ -2461,18 +2241,6 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM )
int iDamageLevel = SM-SM_BattleDamageLevel1+1;
PlayAnnouncer( ssprintf("gameplay battle damage level%d",iDamageLevel), 3 );
}
else if( SM == SM_SaveChangedBeforeGoingBack )
{
if( m_bChangedOffsetOrBPM )
{
m_bChangedOffsetOrBPM = false;
ShowSavePrompt( SM_GoToScreenAfterBack );
}
else
{
HandleScreenMessage( SM_GoToScreenAfterBack );
}
}
else if( SM == SM_GoToScreenAfterBack )
{
SongFinished();
@@ -2484,13 +2252,6 @@ void ScreenGameplay::HandleScreenMessage( const ScreenMessage SM )
}
else if( SM == SM_GoToNextScreen )
{
if( m_bChangedOffsetOrBPM )
{
m_bChangedOffsetOrBPM = false;
ShowSavePrompt( SM_GoToNextScreen );
return;
}
SongFinished();
StageFinished( false );
}
@@ -2626,11 +2387,6 @@ void ScreenGameplay::ShowOniGameOver( PlayerNumber pn )
m_sprOniGameOver[pn].PlayCommand( "Die" );
}
void ScreenGameplay::HandleMessage( const CString& sMessage )
{
if( sMessage == PREFSMAN->m_AutoPlay.GetName()+"Changed" )
UpdateAutoPlayText();
}
/*
* (c) 2001-2004 Chris Danford, Glenn Maynard
+1 -6
View File
@@ -40,9 +40,9 @@ public:
virtual void Update( float fDeltaTime );
virtual void Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI );
virtual void HandleScreenMessage( const ScreenMessage SM );
virtual void HandleMessage( const CString& sMessage );
virtual bool UsesBackground() const { return false; }
virtual ScreenType GetScreenType() const { return gameplay; }
protected:
ThemeMetric<CString> PLAYER_TYPE;
@@ -67,7 +67,6 @@ protected:
float StartPlayingSong(float MinTimeToNotes, float MinTimeToMusic);
void LoadLights();
void PauseGame( bool bPause, GameController gc = GAME_CONTROLLER_INVALID );
void ShowSavePrompt( ScreenMessage SM_SendWhenDone );
void PlayAnnouncer( CString type, float fSeconds );
void UpdateLights();
void SendCrossedMessages();
@@ -93,7 +92,6 @@ protected:
vector<Steps*> m_vpStepsQueue[NUM_PLAYERS]; // size may be >1 if playing a course
vector<AttackArray> m_asModifiersQueue[NUM_PLAYERS];// size may be >1 if playing a course
bool m_bChangedOffsetOrBPM;
float m_fTimeSinceLastDancingComment; // this counter is only running while STATE_DANCING
LyricDisplay m_LyricDisplay;
@@ -133,9 +131,6 @@ protected:
RageTimer m_GiveUpTimer;
void AbortGiveUp( bool bShowText );
BitmapText m_textAutoPlay; // for AutoPlay, AutoAdjust
void UpdateAutoPlayText();
BitmapText m_MaxCombo;
Transition m_Ready;
+4 -8
View File
@@ -446,15 +446,11 @@ retry:
m_sLastLoadedBackgroundPath = sNewBGA;
}
bool bWasOnSystemMenu = GAMESTATE->m_bIsOnSystemMenu;
if( THEME->HasMetric(sScreenName,"AllowOperatorMenuButton") )
GAMESTATE->m_bIsOnSystemMenu = !THEME->GetMetricB( sScreenName,"AllowOperatorMenuButton" );
else
GAMESTATE->m_bIsOnSystemMenu = false;
bool bWasOnSystemMenu = pOldTopScreen && pOldTopScreen->GetScreenType() == system_menu;
bool bIsOnSystemMenu = pNewScreen->GetScreenType() == system_menu;
// If we're exiting a system menu, persist settings in case we don't exit normally
if( bWasOnSystemMenu && !GAMESTATE->m_bIsOnSystemMenu )
if( bWasOnSystemMenu && !bIsOnSystemMenu )
PREFSMAN->SaveGlobalPrefsToDisk();
LOG->Trace("... SetFromNewScreen");
@@ -484,7 +480,7 @@ void ScreenManager::Prompt( ScreenMessage smSendOnPop, const CString &sText, Pro
m_ScreenStack.back()->HandleScreenMessage( SM_LoseFocus );
// add the new state onto the back of the array
Screen *pNewScreen = new ScreenPrompt( smSendOnPop, sText, type, defaultAnswer, OnYes, OnNo, pCallbackData);
Screen *pNewScreen = new ScreenPrompt( "ScreenPrompt", smSendOnPop, sText, type, defaultAnswer, OnYes, OnNo, pCallbackData);
pNewScreen->Init();
this->ZeroNextUpdate();
SetFromNewScreen( pNewScreen, true );
+14 -2
View File
@@ -17,6 +17,7 @@ bool ScreenPrompt::s_bCancelledLast = false;
//REGISTER_SCREEN_CLASS( ScreenPrompt );
ScreenPrompt::ScreenPrompt(
const CString &sScreenName,
ScreenMessage smSendOnPop,
CString sText,
PromptType type,
@@ -25,7 +26,7 @@ ScreenPrompt::ScreenPrompt(
void(*OnNo)(void*),
void* pCallbackData
) :
Screen("ScreenPrompt")
Screen( sScreenName )
{
m_bIsTransparent = true; // draw screens below us
@@ -130,9 +131,14 @@ void ScreenPrompt::HandleScreenMessage( const ScreenMessage SM )
case SM_DoneOpeningWipingLeft:
break;
case SM_DoneOpeningWipingRight:
SCREENMAN->PopTopScreen( m_smSendOnPop );
if( SCREENMAN->IsStackedScreen(this) )
SCREENMAN->PopTopScreen( m_smSendOnPop );
else
this->HandleScreenMessage( SM_GoToNextScreen );
break;
}
Screen::HandleScreenMessage( SM );
}
void ScreenPrompt::Change( int dir )
@@ -160,11 +166,17 @@ void ScreenPrompt::MenuRight( PlayerNumber pn )
void ScreenPrompt::MenuStart( PlayerNumber pn )
{
if( m_Out.IsTransitioning() || m_Cancel.IsTransitioning() )
return;
End( false );
}
void ScreenPrompt::MenuBack( PlayerNumber pn )
{
if( m_Out.IsTransitioning() || m_Cancel.IsTransitioning() )
return;
switch( m_PromptType )
{
case PROMPT_OK:
+2 -1
View File
@@ -15,9 +15,10 @@
class ScreenPrompt : public Screen
{
public:
ScreenPrompt( CString sName );
ScreenPrompt( const CString &sScreenName );
virtual void Init();
ScreenPrompt(
const CString &sScreenName,
ScreenMessage smSendOnPop,
CString sText,
PromptType type = PROMPT_OK,
+135
View File
@@ -0,0 +1,135 @@
#include "global.h"
#include "ScreenSaveSync.h"
#include "GameState.h"
#include "song.h"
#include "PrefsManager.h"
static CString GetPromptText()
{
CString s;
{
float fOld = GAMESTATE->m_fGlobalOffsetSecondsOriginal;
float fNew = PREFSMAN->m_fGlobalOffsetSeconds;
float fDelta = fNew - fOld;
if( fabs(fDelta) > 0.00001 )
{
s += ssprintf(
"You have changed the Machine Global Offset\nfrom %.3f to %.3f (%+.3f).\n\n",
fOld,
fNew,
fDelta );
}
}
s += ssprintf(
"You have changed the timing of\n\n"
"%s:\n\n",
GAMESTATE->m_pCurSong->GetFullDisplayTitle().c_str() );
{
float fOld = GAMESTATE->m_pTimingDataOriginal->m_fBeat0OffsetInSeconds;
float fNew = GAMESTATE->m_pCurSong->m_Timing.m_fBeat0OffsetInSeconds;
float fDelta = fNew - fOld;
if( fabs(fDelta) > 0.00001 )
{
s += ssprintf(
"The song offset changed from %.3f to %.3f (%+.3f).\n\n",
fOld,
fNew,
fDelta );
}
}
for( int i=0; i<GAMESTATE->m_pCurSong->m_Timing.m_BPMSegments.size(); i++ )
{
float fOld = GAMESTATE->m_pTimingDataOriginal->m_BPMSegments[i].m_fBPS;
float fNew = GAMESTATE->m_pCurSong->m_Timing.m_BPMSegments[i].m_fBPS;
float fDelta = fNew - fOld;
if( fabs(fDelta) > 0.00001 )
{
s += ssprintf(
"The %s BPM segment changed from %.3f BPS to %.3f BPS (%+.3f).\n\n",
FormatNumberAndSuffix(i+1).c_str(),
fOld,
fNew,
fDelta );
}
}
for( int i=0; i<GAMESTATE->m_pCurSong->m_Timing.m_StopSegments.size(); i++ )
{
float fOld = GAMESTATE->m_pTimingDataOriginal->m_StopSegments[i].m_fStopSeconds;
float fNew = GAMESTATE->m_pCurSong->m_Timing.m_StopSegments[i].m_fStopSeconds;
float fDelta = fNew - fOld;
if( fabs(fDelta) > 0.00001 )
{
s += ssprintf(
"The %s Stop segment changed from %.3f seconds to %.3f seconds (%+.3f).\n\n",
FormatNumberAndSuffix(i+1).c_str(),
fOld,
fNew,
fDelta );
}
}
s +="\n\nWould you like to save these changes to the song file?\n"
"Choosing NO will discard your changes.";
return s;
}
static void SaveSyncChanges( void* pThrowAway )
{
GAMESTATE->SaveSyncChanges();
}
static void RevertSyncChanges( void* pThrowAway )
{
GAMESTATE->RevertSyncChanges();
}
REGISTER_SCREEN_CLASS( ScreenSaveSync );
ScreenSaveSync::ScreenSaveSync( const CString &sScreenName ) :
ScreenPrompt(
sScreenName,
SM_None,
GetPromptText(),
PROMPT_YES_NO,
ANSWER_YES,
SaveSyncChanges,
RevertSyncChanges,
NULL )
{
}
/*
* (c) 2001-2005 Chris Danford
* 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.
*/
+40
View File
@@ -0,0 +1,40 @@
/* ScreenSaveSync - */
#ifndef ScreenSaveSync_H
#define ScreenSaveSync_H
#include "ScreenPrompt.h"
class ScreenSaveSync : public ScreenPrompt
{
public:
ScreenSaveSync( const CString &sScreenName );
};
#endif
/*
* (c) 2001-2005 Chris Danford
* 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.
*/
+2 -2
View File
@@ -1618,7 +1618,7 @@ void ScreenSelectMusic::AfterMusicChange()
const vector<Song*> best = SONGMAN->GetBestSongs( PROFILE_SLOT_MACHINE );
const int index = FindIndex( best.begin(), best.end(), pSong );
if( index != -1 )
m_MachineRank.SetText( AddNumberSuffix( index+1 ) );
m_MachineRank.SetText( FormatNumberAndSuffix( index+1 ) );
m_DifficultyDisplay.SetDifficulties( pSong, GAMESTATE->GetCurrentStyle()->m_StepsType );
@@ -1753,7 +1753,7 @@ void ScreenSelectMusic::AfterMusicChange()
const vector<Course*> best = SONGMAN->GetBestCourses( ct, PROFILE_SLOT_MACHINE );
const int index = FindCourseIndexOfSameMode( best.begin(), best.end(), pCourse );
if( index != -1 )
m_MachineRank.SetText( AddNumberSuffix( index+1 ) );
m_MachineRank.SetText( FormatNumberAndSuffix( index+1 ) );
+297
View File
@@ -0,0 +1,297 @@
#include "global.h"
#include "ScreenSyncOverlay.h"
#include "ScreenDimensions.h"
#include "GameState.h"
#include "song.h"
#include "PrefsManager.h"
static bool IsGameplay()
{
return SCREENMAN && SCREENMAN->GetTopScreen() && SCREENMAN->GetTopScreen()->GetScreenType() == gameplay;
}
REGISTER_SCREEN_CLASS( ScreenSyncOverlay );
ScreenSyncOverlay::ScreenSyncOverlay( const CString &sName ) : Screen(sName)
{
}
ScreenSyncOverlay::~ScreenSyncOverlay()
{
}
void ScreenSyncOverlay::Init()
{
Screen::Init();
m_quad.SetDiffuse( RageColor(0,0,0,0) );
m_quad.SetHorizAlign( Actor::align_left );
m_quad.SetXY( SCREEN_CENTER_X+10, SCREEN_TOP+100 );
this->AddChild( &m_quad );
m_textHelp.LoadFromFont( THEME->GetPathToF("Common normal") );
m_textHelp.SetHorizAlign( Actor::align_left );
m_textHelp.SetXY( SCREEN_CENTER_X+20, SCREEN_TOP+100 );
m_textHelp.SetDiffuseAlpha( 0 );
m_textHelp.SetZoom( 0.6f );
m_textHelp.SetShadowLength( 2 );
m_textHelp.SetText(
"Revert sync changes:\n"
" F4\n"
"Adjust current BPM:\n"
" F9/F10 (hold Alt for smaller)\n"
"Adjust song offset:\n"
" F11/F12 (hold Alt for smaller)\n"
"Adjust machine offset:\n"
" Shift + F11/F12 (hold Alt for smaller)" );
this->AddChild( &m_textHelp );
m_quad.ZoomToWidth( m_textHelp.GetZoomedWidth()+20 );
m_quad.ZoomToHeight( m_textHelp.GetZoomedHeight()+20 );
m_textStatus.LoadFromFont( THEME->GetPathToF("Common normal") );
m_textStatus.SetHorizAlign( Actor::align_center );
m_textStatus.SetXY( SCREEN_CENTER_X, SCREEN_CENTER_Y+150 );
m_textStatus.SetZoom( 0.8f );
m_textStatus.SetShadowLength( 2 );
this->AddChild( &m_textStatus );
Update( 0 );
}
void ScreenSyncOverlay::Update( float fDeltaTime )
{
this->SetVisible( IsGameplay() );
if( !IsGameplay() )
{
m_quad.SetDiffuseAlpha( 0 );
m_textHelp.SetDiffuseAlpha( 0 );
return;
}
Screen::Update(fDeltaTime);
// TODO: Only update when changed.
UpdateText();
}
void ScreenSyncOverlay::UpdateText()
{
CString s;
switch( PREFSMAN->m_AutoPlay )
{
case PC_HUMAN: break;
case PC_AUTOPLAY: s+="AutoPlay\n"; break;
case PC_CPU: s+="AutoPlayCPU\n"; break;
default: ASSERT(0);
}
switch( GAMESTATE->m_SongOptions.m_AutosyncType )
{
case SongOptions::AUTOSYNC_OFF: break;
case SongOptions::AUTOSYNC_SONG: s+="AutoSync Song\n"; break;
case SongOptions::AUTOSYNC_MACHINE: s+="AutoSync Machine\n";break;
default: ASSERT(0);
}
if( GAMESTATE->m_pCurSong == NULL )
{
m_textStatus.SetText( "" );
return;
}
{
float fOld = GAMESTATE->m_fGlobalOffsetSecondsOriginal;
float fNew = PREFSMAN->m_fGlobalOffsetSeconds;
float fDelta = fNew - fOld;
if( fabs(fDelta) > 0.00001 )
{
s += ssprintf(
"Machine global offset: %.3fs (%+.3f)\n",
fNew,
fDelta );
}
}
{
float fOld = GAMESTATE->m_pTimingDataOriginal->m_fBeat0OffsetInSeconds;
float fNew = GAMESTATE->m_pCurSong->m_Timing.m_fBeat0OffsetInSeconds;
float fDelta = fNew - fOld;
if( fabs(fDelta) > 0.00001 )
{
s += ssprintf(
"Song offset: %.3fs (%+.3f)\n",
fNew,
fDelta );
}
}
ASSERT( GAMESTATE->m_pTimingDataOriginal->m_BPMSegments.size() == GAMESTATE->m_pCurSong->m_Timing.m_BPMSegments.size() );
for( int i=0; i<GAMESTATE->m_pCurSong->m_Timing.m_BPMSegments.size(); i++ )
{
float fOld = GAMESTATE->m_pTimingDataOriginal->m_BPMSegments[i].m_fBPS;
float fNew = GAMESTATE->m_pCurSong->m_Timing.m_BPMSegments[i].m_fBPS;
float fDelta = fNew - fOld;
if( fabs(fDelta) > 0.00001 )
{
s += ssprintf(
"%s tempo segment: %.3f BPS (%+.3f)\n",
FormatNumberAndSuffix(i+1).c_str(),
fNew,
fDelta );
}
}
m_textStatus.SetText( s );
}
bool ScreenSyncOverlay::OverlayInput( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI )
{
if( !IsGameplay() )
return false;
if( DeviceI.device != DEVICE_KEYBOARD )
return false;
switch( DeviceI.button )
{
case KEY_F4:
SCREENMAN->SystemMessage( "Sync changes reverted." );
break;
case KEY_F9:
case KEY_F10:
case KEY_F11:
case KEY_F12:
if( GAMESTATE->IsCourseMode() )
{
SCREENMAN->SystemMessage( "Can't sync while playing a course." );
return true;
}
break;
default:
return false;
}
switch( DeviceI.button )
{
case KEY_F4:
GAMESTATE->RevertSyncChanges();
break;
case KEY_F9:
case KEY_F10:
{
float fDelta;
switch( DeviceI.button )
{
case KEY_F9: fDelta = -0.02f; break;
case KEY_F10: fDelta = +0.02f; break;
default: ASSERT(0);
}
if( INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_RALT)) ||
INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_LALT)) )
fDelta /= 20;
switch( type )
{
case IET_RELEASE: fDelta *= 0; break;
case IET_SLOW_REPEAT: fDelta *= 0; break;
case IET_FAST_REPEAT: fDelta *= 10; break;
}
if( GAMESTATE->m_pCurSong != NULL )
{
BPMSegment& seg = GAMESTATE->m_pCurSong->GetBPMSegmentAtBeat( GAMESTATE->m_fSongBeat );
seg.m_fBPS += fDelta;
}
}
break;
case KEY_F11:
case KEY_F12:
{
float fDelta;
switch( DeviceI.button )
{
case KEY_F11: fDelta = -0.02f; break;
case KEY_F12: fDelta = +0.02f; break;
default: ASSERT(0);
}
if( INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_RALT)) ||
INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_LALT)) )
fDelta /= 20; /* 1ms */
switch( type )
{
case IET_RELEASE: fDelta *= 0; break;
case IET_SLOW_REPEAT: fDelta *= 0; break;
case IET_FAST_REPEAT: fDelta *= 10; break;
}
if( INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_RSHIFT)) ||
INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_LSHIFT)) )
{
PREFSMAN->m_fGlobalOffsetSeconds.Set( PREFSMAN->m_fGlobalOffsetSeconds + fDelta );
}
else
{
if( GAMESTATE->m_pCurSong != NULL )
GAMESTATE->m_pCurSong->m_Timing.m_fBeat0OffsetInSeconds += fDelta;
}
}
break;
default:
ASSERT(0);
}
ShowHelp();
UpdateText();
return true;
}
void ScreenSyncOverlay::ShowHelp()
{
m_quad.StopTweening();
m_quad.BeginTweening( 0.3f, Actor::TWEEN_LINEAR );
m_quad.SetDiffuseAlpha( 0.5f );
m_textHelp.StopTweening();
m_textHelp.BeginTweening( 0.3f, Actor::TWEEN_LINEAR );
m_textHelp.SetDiffuseAlpha( 1 );
if( !GAMESTATE->IsSyncDataChanged() )
{
m_quad.Sleep( 4 );
m_quad.BeginTweening( 0.3f, Actor::TWEEN_LINEAR );
m_quad.SetDiffuseAlpha( 0 );
m_textHelp.Sleep( 4 );
m_textHelp.BeginTweening( 0.3f, Actor::TWEEN_LINEAR );
m_textHelp.SetDiffuseAlpha( 0 );
}
}
/*
* (c) 2001-2005 Chris Danford
* 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.
*/
+56
View File
@@ -0,0 +1,56 @@
/* ScreenSyncOverlay - credits and statistics drawn on top of everything else. */
#ifndef ScreenSyncOverlay_H
#define ScreenSyncOverlay_H
#include "Screen.h"
#include "BitmapText.h"
#include "Quad.h"
class ScreenSyncOverlay : public Screen
{
public:
ScreenSyncOverlay( const CString &sName );
virtual ~ScreenSyncOverlay();
virtual void Init();
bool OverlayInput( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI );
void Update( float fDeltaTime );
private:
void UpdateText();
void ShowHelp();
Quad m_quad;
BitmapText m_textHelp;
BitmapText m_textStatus;
};
#endif
/*
* (c) 2001-2005 Chris Danford
* 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.
*/
+1 -1
View File
@@ -118,7 +118,7 @@ CString ScreenSystemLayer::GetCreditsMessage( PlayerNumber pn ) const
return "";
bool bShowCreditsMessage;
if( GAMESTATE->m_bIsOnSystemMenu )
if( SCREENMAN && SCREENMAN->GetTopScreen() && SCREENMAN->GetTopScreen()->GetScreenType() == system_menu )
bShowCreditsMessage = true;
else if( MEMCARDMAN->GetCardsLocked() )
bShowCreditsMessage = !GAMESTATE->IsPlayerEnabled( pn );
+2 -1
View File
@@ -31,7 +31,8 @@ struct SongOptions
enum AutosyncType {
AUTOSYNC_OFF,
AUTOSYNC_SONG,
AUTOSYNC_MACHINE
AUTOSYNC_MACHINE,
NUM_AUTOSYNC_TYPES
};
AutosyncType m_AutosyncType;
bool m_bSaveScore;
+1 -36
View File
@@ -1281,7 +1281,7 @@ bool HandleGlobalInputs( DeviceInput DeviceI, InputEventType type, GameInput Gam
/* Global operator key, to get quick access to the options menu. Don't
* do this if we're on a "system menu", which includes the editor
* (to prevent quitting without storing changes). */
if( !GAMESTATE->m_bIsOnSystemMenu )
if( SCREENMAN->GetTopScreen()->GetScreenType() != system_menu )
{
SCREENMAN->DeletePreparedScreens();
SCREENMAN->SystemMessage( "Service switch pressed" );
@@ -1301,41 +1301,6 @@ bool HandleGlobalInputs( DeviceInput DeviceI, InputEventType type, GameInput Gam
return false; // Attract need to know because they go to TitleMenu on > 1 credit
}
if(DeviceI == DeviceInput(DEVICE_KEYBOARD, KEY_F2))
{
bool bShift = INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_LSHIFT) );
bool bCtrl = INPUTFILTER->IsBeingPressed( DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL) );
if( bShift )
{
// HACK: Also save bookkeeping and profile info for debugging
// so we don't have to play through a whole song to get new output.
BOOKKEEPER->WriteToDisk();
PROFILEMAN->SaveMachineProfile();
FOREACH_PlayerNumber( p )
if( PROFILEMAN->IsPersistentProfile(p) )
PROFILEMAN->SaveProfile( p );
SCREENMAN->SystemMessage( "Stats saved" );
}
else
{
THEME->ReloadMetrics();
TEXTUREMAN->ReloadAll();
NOTESKIN->RefreshNoteSkinData( GAMESTATE->m_pCurGame );
CodeDetector::RefreshCacheItems();
/* If we're in screen test mode, reload the screen. */
if( PREFSMAN->m_bScreenTestMode || bCtrl )
{
SOUND->StopMusic();
ResetGame( true );
}
else
SCREENMAN->SystemMessage( "Reloaded metrics and textures" );
}
return true;
}
#ifndef DARWIN
if(DeviceI == DeviceInput(DEVICE_KEYBOARD, KEY_F4))
{
+18 -2
View File
@@ -62,7 +62,7 @@ IntDir=.\../Debug6
TargetDir=\stepmania\stepmania\Program
TargetName=StepMania-debug
SOURCE="$(InputPath)"
PreLink_Cmds=archutils\Win32\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\
PreLink_Cmds=archutils\Win32\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\
PostBuild_Cmds=archutils\Win32\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi
# End Special Build Tool
@@ -99,7 +99,7 @@ IntDir=.\../Release6
TargetDir=\stepmania\stepmania\Program
TargetName=StepMania
SOURCE="$(InputPath)"
PreLink_Cmds=archutils\Win32\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\
PreLink_Cmds=archutils\Win32\verinc cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\
PostBuild_Cmds=archutils\Win32\mapconv $(IntDir)\$(TargetName).map $(TargetDir)\StepMania.vdi
# End Special Build Tool
@@ -2836,6 +2836,14 @@ SOURCE=.\ScreenSandbox.h
# End Source File
# Begin Source File
SOURCE=.\ScreenSaveSync.cpp
# End Source File
# Begin Source File
SOURCE=.\ScreenSaveSync.h
# End Source File
# Begin Source File
SOURCE=.\ScreenSelect.cpp
# End Source File
# Begin Source File
@@ -2948,6 +2956,14 @@ SOURCE=.\ScreenStyleSplash.h
# End Source File
# Begin Source File
SOURCE=.\ScreenSyncOverlay.cpp
# End Source File
# Begin Source File
SOURCE=.\ScreenSyncOverlay.h
# End Source File
# Begin Source File
SOURCE=.\ScreenSystemLayer.cpp
# End Source File
# Begin Source File
+12
View File
@@ -505,6 +505,12 @@ cl /Zl /nologo /c verstub.cpp /Fo&quot;$(IntDir)&quot;\
<File
RelativePath="ScreenSandbox.h">
</File>
<File
RelativePath="ScreenSaveSync.cpp">
</File>
<File
RelativePath="ScreenSaveSync.h">
</File>
<File
RelativePath="ScreenSelect.cpp">
</File>
@@ -583,6 +589,12 @@ cl /Zl /nologo /c verstub.cpp /Fo&quot;$(IntDir)&quot;\
<File
RelativePath="ScreenStyleSplash.h">
</File>
<File
RelativePath="ScreenSyncOverlay.cpp">
</File>
<File
RelativePath="ScreenSyncOverlay.h">
</File>
<File
RelativePath="ScreenSystemLayer.cpp">
</File>
+16 -4
View File
@@ -165,16 +165,28 @@ float TimingData::GetBPMAtBeat( float fBeat ) const
return m_BPMSegments[i].GetBPM();
}
BPMSegment& TimingData::GetBPMSegmentAtBeat( float fBeat )
int TimingData::GetBPMSegmentIndexAtBeat( float fBeat )
{
int iIndex = BeatToNoteRow( fBeat );
unsigned i;
for( i=0; i<m_BPMSegments.size()-1; i++ )
int i;
for( i=0; i<(int)(m_BPMSegments.size())-1; i++ )
if( m_BPMSegments[i+1].m_iStartIndex > iIndex )
break;
return m_BPMSegments[i];
return i;
}
BPMSegment& TimingData::GetBPMSegmentAtBeat( float fBeat )
{
static BPMSegment empty;
if( m_BPMSegments.empty() )
{
empty = BPMSegment();
return empty;
}
int i = GetBPMSegmentIndexAtBeat( fBeat );
return m_BPMSegments[i];
}
void TimingData::GetBeatAndBPSFromElapsedTime( float fElapsedTime, float &fBeatOut, float &fBPSOut, bool &bFreezeOut ) const
{
+34
View File
@@ -5,6 +5,8 @@
#include "NoteTypes.h"
#define COMPARE(x) if(x!=other.x) return false;
struct BPMSegment
{
BPMSegment() { m_iStartIndex = -1; m_fBPS = -1; }
@@ -14,6 +16,14 @@ struct BPMSegment
void SetBPM( float f );
float GetBPM() const;
bool operator==( const BPMSegment &other )
{
COMPARE( m_iStartIndex );
COMPARE( m_fBPS );
return true;
}
bool operator!=( const BPMSegment &other ) { return !operator==(other); }
};
struct StopSegment
@@ -22,6 +32,14 @@ struct StopSegment
StopSegment( int s, float f ) { m_iStartRow = s; m_fStopSeconds = f; }
int m_iStartRow;
float m_fStopSeconds;
bool operator==( const StopSegment &other )
{
COMPARE( m_iStartRow );
COMPARE( m_fStopSeconds );
return true;
}
bool operator!=( const StopSegment &other ) { return !operator==(other); }
};
class TimingData
@@ -36,6 +54,7 @@ public:
void MultiplyBPMInBeatRange( int iStartIndex, int iEndIndex, float fFactor );
void AddBPMSegment( const BPMSegment &seg );
void AddStopSegment( const StopSegment &seg );
int GetBPMSegmentIndexAtBeat( float fBeat );
BPMSegment& GetBPMSegmentAtBeat( float fBeat );
void GetBeatAndBPSFromElapsedTime( float fElapsedTime, float &fBeatOut, float &fBPSOut, bool &bFreezeOut ) const;
@@ -49,6 +68,19 @@ public:
float GetElapsedTimeFromBeat( float fBeat ) const;
bool HasBpmChangesOrStops() const;
bool operator==( const TimingData &other )
{
COMPARE( m_BPMSegments.size() );
for( int i=0; i<m_BPMSegments.size(); i++ )
COMPARE( m_BPMSegments[i] );
COMPARE( m_StopSegments.size() );
for( int i=0; i<m_StopSegments.size(); i++ )
COMPARE( m_StopSegments[i] );
COMPARE( m_fBeat0OffsetInSeconds );
return true;
}
bool operator!=( const TimingData &other ) { return !operator==(other); }
// used for editor fix - expand/contract needs to move BPMSegments
// and StopSegments that land during/after the edited range.
// in addition, we need to be able to shift them otherwise as well
@@ -68,6 +100,8 @@ public:
float m_fBeat0OffsetInSeconds;
};
#undef COMPARE
#endif
/*