diff --git a/stepmania/src/Makefile.am b/stepmania/src/Makefile.am
index 25aed53e5a..8166e04c50 100644
--- a/stepmania/src/Makefile.am
+++ b/stepmania/src/Makefile.am
@@ -25,6 +25,7 @@ Screens = \
Screen.cpp Screen.h ScreenAttract.cpp ScreenAttract.h \
ScreenBookkeeping.cpp ScreenBookkeeping.h ScreenBranch.cpp ScreenBranch.h \
ScreenCenterImage.cpp ScreenCenterImage.h ScreenCredits.cpp ScreenCredits.h \
+ScreenDebugOverlay.cpp ScreenDebugOverlay.h \
ScreenDemonstration.cpp ScreenDemonstration.h ScreenDimensions.h \
ScreenEdit.cpp ScreenEdit.h \
ScreenEditCoursesMenu.cpp ScreenEditCoursesMenu.h EditCoursesSongMenu.cpp EditCoursesSongMenu.h \
diff --git a/stepmania/src/ScreenDebugOverlay.cpp b/stepmania/src/ScreenDebugOverlay.cpp
new file mode 100644
index 0000000000..5883bbe056
--- /dev/null
+++ b/stepmania/src/ScreenDebugOverlay.cpp
@@ -0,0 +1,313 @@
+#include "global.h"
+#include "ScreenDebugOverlay.h"
+#include "ScreenDimensions.h"
+#include "PrefsManager.h"
+#include "RageLog.h"
+#include "GameState.h"
+#include "PlayerState.h"
+#include "StepMania.h"
+#include "GameCommand.h"
+#include "ScreenGameplay.h"
+
+static bool g_bIsDisplayed = false;
+static bool g_bIsSlow = false;
+static bool g_bIsHalt = false;
+static RageTimer g_HaltTimer(RageZeroTimer);
+
+REGISTER_SCREEN_CLASS( ScreenDebugOverlay );
+ScreenDebugOverlay::ScreenDebugOverlay( const CString &sName ) : Screen(sName)
+{
+}
+
+ScreenDebugOverlay::~ScreenDebugOverlay()
+{
+}
+
+struct MapDebugToDI
+{
+ DeviceInput holdForMenu;
+ DeviceInput button[NUM_DEBUG_LINES];
+ void Clear()
+ {
+ holdForMenu.MakeInvalid();
+ FOREACH_DebugLine(i)
+ button[i].MakeInvalid();
+ }
+};
+static MapDebugToDI g_Mappings;
+
+static CString GetDebugButtonName( DebugLine i )
+{
+ // TODO: Make arch appropriate.
+ return g_Mappings.button[i].toString();
+}
+
+void ScreenDebugOverlay::Init()
+{
+ Screen::Init();
+
+ // Init debug mappings
+ // TODO: Arch-specific?
+ {
+ 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);
+ }
+
+
+ m_Quad.StretchTo( RectF( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT ) );
+ 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 );
+
+ FOREACH_DebugLine( i )
+ {
+ BitmapText &txt = m_Text[i];
+ txt.LoadFromFont( THEME->GetPathToF("Common normal") );
+ txt.SetHorizAlign( Actor::align_left );
+ this->AddChild( &txt );
+ }
+
+ Update( 0 );
+}
+
+static void SetSpeed()
+{
+ if( g_bIsHalt )
+ {
+ INPUTFILTER->ButtonPressed( DeviceInput(DEVICE_KEYBOARD, KEY_TAB), true );
+ INPUTFILTER->ButtonPressed( DeviceInput(DEVICE_KEYBOARD, KEY_ACCENT), true );
+ }
+ else if( g_bIsSlow )
+ {
+ INPUTFILTER->ButtonPressed( DeviceInput(DEVICE_KEYBOARD, KEY_TAB), false );
+ INPUTFILTER->ButtonPressed( DeviceInput(DEVICE_KEYBOARD, KEY_ACCENT), true );
+ }
+ else
+ {
+ INPUTFILTER->ButtonPressed( DeviceInput(DEVICE_KEYBOARD, KEY_TAB), false );
+ INPUTFILTER->ButtonPressed( DeviceInput(DEVICE_KEYBOARD, KEY_ACCENT), false );
+ }
+
+ // PauseMusic( g_bIsHalt );
+}
+
+void ScreenDebugOverlay::Update( float fDeltaTime )
+{
+ Screen::Update(fDeltaTime);
+
+ this->SetVisible( g_bIsDisplayed );
+ if( !g_bIsDisplayed )
+ return;
+
+ /* Highlight options that aren't the default. */
+ const RageColor off(0.6f, 0.6f, 0.6f, 1.0f);
+ const RageColor on(1, 1, 1, 1);
+
+ 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 );
+
+ CString s;
+ switch( i )
+ {
+ case DebugLine_Autoplay: s="AutoPlay"; break;
+ case DebugLine_CoinMode: { s="CoinMode: "+CoinModeToString(PREFSMAN->m_CoinMode); } break;
+ case DebugLine_Slow: s="Slow"; break;
+ case DebugLine_Halt: s="Halt"; break;
+ case DebugLine_LightsDebug: s="Lights Debug"; break;
+ case DebugLine_MonkeyInput: s="MonkeyInput"; break;
+ case DebugLine_Stats: s="Stats"; break;
+ case DebugLine_Vsync: s="Vsync"; break;
+ case DebugLine_ScreenTestMode: s="Screen Test Mode"; break;
+ case DebugLine_ClearMachineStats: s="Clear Machine Stats";break;
+ case DebugLine_FillMachineStats: s="Fill Machine Stats"; break;
+ case DebugLine_SendNotesEnded: s="Send Notes Ended"; break;
+ case DebugLine_CurrentScreen: { s="Screen: "; s+=SCREENMAN ? SCREENMAN->GetTopScreen()->m_sName : ""; } break;
+ case DebugLine_Uptime: s="uptime: " + SecondsToMMSSMsMsMs(RageTimer::GetTimeSinceStart()); break;
+ default: ASSERT(0);
+ }
+ CString sButton = GetDebugButtonName(i);
+ if( !sButton.empty() )
+ sButton += ": ";
+ txt.SetText( sButton + s );
+
+ bool bOn = false;
+ switch( i )
+ {
+ case DebugLine_Autoplay: bOn=PREFSMAN->m_bAutoPlay; break;
+ case DebugLine_CoinMode: bOn=true; break;
+ case DebugLine_Slow: bOn=g_bIsSlow; break;
+ case DebugLine_Halt: bOn=g_bIsHalt; break;
+ case DebugLine_LightsDebug: bOn=false; break;
+ case DebugLine_MonkeyInput: bOn=false; break;
+ case DebugLine_Stats: bOn=PREFSMAN->m_bShowStats; break;
+ case DebugLine_Vsync: bOn=PREFSMAN->m_bVsync; break;
+ case DebugLine_ScreenTestMode: bOn=PREFSMAN->m_bScreenTestMode;break;
+ case DebugLine_ClearMachineStats: bOn=true; break;
+ case DebugLine_FillMachineStats: bOn=true; break;
+ case DebugLine_SendNotesEnded: bOn=true; break;
+ case DebugLine_CurrentScreen: bOn=false; break;
+ case DebugLine_Uptime: bOn=false; break;
+ default: ASSERT(0);
+ }
+
+ txt.SetDiffuse( bOn ? on:off );
+ }
+
+ if( g_bIsHalt )
+ {
+ /* More than once I've paused the game accidentally and wasted time
+ * figuring out why, so warn. */
+ if( g_HaltTimer.Ago() >= 5.0f )
+ {
+ g_HaltTimer.Touch();
+ LOG->Warn( "Game halted" );
+ }
+ }
+}
+
+bool ScreenDebugOverlay::OverlayInput( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI )
+{
+ if( DeviceI == g_Mappings.holdForMenu )
+ {
+ if( type == IET_FIRST_PRESS )
+ g_bIsDisplayed = true;
+ else if( type == IET_RELEASE )
+ g_bIsDisplayed = false;
+ }
+
+ if( !g_bIsDisplayed )
+ return false;
+
+ if( type != IET_FIRST_PRESS )
+ return false; /* eat the input but do nothing */
+
+ FOREACH_DebugLine( i )
+ {
+ if( DeviceI == g_Mappings.button[i] )
+ {
+ BitmapText &txt = m_Text[i];
+
+ txt.FinishTweening();
+ float fZoom = txt.GetZoom();
+ txt.SetZoom( fZoom * 1.2f );
+ txt.BeginTweening( 0.2f, Actor::TWEEN_LINEAR );
+ txt.SetZoom( fZoom );
+
+ switch( i )
+ {
+ case DebugLine_Autoplay:
+ PREFSMAN->m_bAutoPlay.Set( !PREFSMAN->m_bAutoPlay );
+ FOREACH_HumanPlayer(pn)
+ GAMESTATE->m_pPlayerState[pn]->m_PlayerController = PREFSMAN->m_bAutoPlay ? PC_AUTOPLAY : PC_HUMAN;
+ break;
+ case DebugLine_CoinMode:
+ {
+ int i = PREFSMAN->m_CoinMode.Get();
+ i++;
+ wrap( i, NUM_COIN_MODES );
+ PREFSMAN->m_CoinMode.Set( (CoinMode)i );
+ }
+ break;
+ case DebugLine_Slow:
+ g_bIsSlow = !g_bIsSlow;
+ SetSpeed();
+ break;
+ case DebugLine_Halt:
+ g_bIsHalt = !g_bIsHalt;
+ g_HaltTimer.Touch();
+ SetSpeed();
+ break;
+ case DebugLine_LightsDebug:
+ ASSERT(0); // TODO
+ break;
+ case DebugLine_MonkeyInput:
+ ASSERT(0); // TODO
+ break;
+ case DebugLine_Stats:
+ PREFSMAN->m_bShowStats.Set( !PREFSMAN->m_bShowStats );
+ break;
+ case DebugLine_Vsync:
+ PREFSMAN->m_bVsync.Set( !PREFSMAN->m_bVsync );
+ ApplyGraphicOptions();
+ break;
+ case DebugLine_ScreenTestMode:
+ PREFSMAN->m_bScreenTestMode.Set( !PREFSMAN->m_bScreenTestMode );
+ break;
+ case DebugLine_ClearMachineStats:
+ {
+ GameCommand gc;
+ gc.Load( 0, ParseCommands("ClearMachineStats") );
+ gc.ApplyToAllPlayers();
+ }
+ break;
+ case DebugLine_FillMachineStats:
+ {
+ GameCommand gc;
+ gc.Load( 0, ParseCommands("FillMachineStats") );
+ gc.ApplyToAllPlayers();
+ }
+ break;
+ case DebugLine_SendNotesEnded:
+ SCREENMAN->PostMessageToTopScreen( SM_NotesEnded, 0 );
+ break;
+ case DebugLine_CurrentScreen:
+ break;
+ case DebugLine_Uptime:
+ break;
+ default: ASSERT(0);
+ }
+ break;
+ }
+ }
+
+ return true;
+}
+
+/*
+ * (c) 2001-2005 Chris Danford, Glenn Maynard
+ * 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/stepmania/src/ScreenDebugOverlay.h b/stepmania/src/ScreenDebugOverlay.h
new file mode 100644
index 0000000000..0155241ec3
--- /dev/null
+++ b/stepmania/src/ScreenDebugOverlay.h
@@ -0,0 +1,73 @@
+/* ScreenDebugOverlay - credits and statistics drawn on top of everything else. */
+
+#ifndef ScreenDebugOverlay_H
+#define ScreenDebugOverlay_H
+
+#include "Screen.h"
+#include "BitmapText.h"
+#include "Quad.h"
+
+enum DebugLine
+{
+ DebugLine_Autoplay,
+ DebugLine_CoinMode,
+ DebugLine_Slow,
+ DebugLine_Halt,
+ DebugLine_LightsDebug,
+ DebugLine_MonkeyInput,
+ DebugLine_Stats,
+ DebugLine_Vsync,
+ DebugLine_ScreenTestMode,
+ DebugLine_ClearMachineStats,
+ DebugLine_FillMachineStats,
+ DebugLine_SendNotesEnded,
+ DebugLine_CurrentScreen,
+ DebugLine_Uptime,
+ NUM_DEBUG_LINES
+};
+#define FOREACH_DebugLine( i ) FOREACH_ENUM( DebugLine, NUM_DEBUG_LINES, i )
+
+class ScreenDebugOverlay : public Screen
+{
+public:
+ ScreenDebugOverlay( const CString &sName );
+ virtual ~ScreenDebugOverlay();
+ 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:
+ Quad m_Quad;
+ BitmapText m_Header;
+ BitmapText m_Text[NUM_DEBUG_LINES];
+};
+
+
+#endif
+
+/*
+ * (c) 2001-2005 Chris Danford, Glenn Maynard
+ * 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/stepmania/src/StepMania.dsp b/stepmania/src/StepMania.dsp
index e9e9d2a546..4a20d3ac99 100644
--- a/stepmania/src/StepMania.dsp
+++ b/stepmania/src/StepMania.dsp
@@ -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
@@ -2530,6 +2530,14 @@ SOURCE=.\ScreenCredits.h
# End Source File
# Begin Source File
+SOURCE=.\ScreenDebugOverlay.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\ScreenDebugOverlay.h
+# End Source File
+# Begin Source File
+
SOURCE=.\ScreenDemonstration.cpp
# End Source File
# Begin Source File
diff --git a/stepmania/src/StepMania.vcproj b/stepmania/src/StepMania.vcproj
index 975304b71b..22d38950e3 100644
--- a/stepmania/src/StepMania.vcproj
+++ b/stepmania/src/StepMania.vcproj
@@ -268,6 +268,12 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"\
+
+
+
+