diff --git a/stepmania/Themes/default/Fonts/ScreenSMOnlineLogin text.redir b/stepmania/Themes/default/Fonts/ScreenSMOnlineLogin text.redir new file mode 100644 index 0000000000..a498e7c2c6 --- /dev/null +++ b/stepmania/Themes/default/Fonts/ScreenSMOnlineLogin text.redir @@ -0,0 +1 @@ +_shared2 \ No newline at end of file diff --git a/stepmania/Themes/default/Graphics/ScreenSMOnlineLogin PasswordBG.redir b/stepmania/Themes/default/Graphics/ScreenSMOnlineLogin PasswordBG.redir new file mode 100644 index 0000000000..c1aa339aab --- /dev/null +++ b/stepmania/Themes/default/Graphics/ScreenSMOnlineLogin PasswordBG.redir @@ -0,0 +1 @@ +ScreenSelectMusic score frame p2 \ No newline at end of file diff --git a/stepmania/Themes/default/metrics.ini b/stepmania/Themes/default/metrics.ini index dce6c2e5a1..e89fee7a21 100644 --- a/stepmania/Themes/default/metrics.ini +++ b/stepmania/Themes/default/metrics.ini @@ -745,6 +745,37 @@ ScoreFrameP2OnCommand=hidden,1 Fallback=ScreenSelectCourse DefaultSort=Endless +[ScreenSMOnlineLogin] +PlayerNumber=1 +PasswordBG= +NextScreen=ScreenNetRoom +PrevScreen=ScreenTitleMenu +PasswordBGX=320 +PasswordBGY=260 +PasswordBGOnCommand= +PasswordBGOffCommand= +TitleX=320 +TitleY=50 +TitleOnCommand= +TitleOffCommand= +UserNameX=320 +UserNameY=150 +UserNameOnCommand= +UserNameOffCommand= +PasswordX=250 +PasswordY=260 +PasswordOnCommand= +PasswordOffCommand= +LoginMessageX=320 +LoginMessageY=290 +LoginMessageOnCommand= +LoginMessageOffCommand= +StyleIcon= +MemoryCardIcons= +TimerSeconds=99 +HelpText= +Fallback=ScreenWithMenuElements + [ScreenNetRoom] MusicSelectScreen=ScreenSMOnlineSelectMusic TitleBGColor=0.5,0.0,0.5,1.0 @@ -3535,7 +3566,7 @@ Choices=1,2,3 Condition1=IsNetSMOnline() Condition2=IsNetConnected() Condition3=true -NextScreen1=screen,ScreenSMOnlineSelectMusic +NextScreen1=screen,ScreenNetRoom NextScreen2=screen,ScreenNetSelectMusic NextScreen3=screen,ScreenSelectMusic @@ -3545,7 +3576,7 @@ Choices=1,2,3 Condition1=IsNetSMOnline() Condition2=IsNetConnected() Condition3=true -NextScreen1=screen,ScreenNetRoom +NextScreen1=screen,ScreenSMOnlineLogin NextScreen2=screen,ScreenNetSelectMusic NextScreen3=screen,ScreenSelectMusic diff --git a/stepmania/src/Makefile.am b/stepmania/src/Makefile.am index 2f58372196..62f44d2baf 100644 --- a/stepmania/src/Makefile.am +++ b/stepmania/src/Makefile.am @@ -40,7 +40,7 @@ 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 ScreenSMOnlineLogin.cpp ScreenSMOnlineLogin.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 \ diff --git a/stepmania/src/ScreenSMOnlineLogin.cpp b/stepmania/src/ScreenSMOnlineLogin.cpp new file mode 100644 index 0000000000..406edc3490 --- /dev/null +++ b/stepmania/src/ScreenSMOnlineLogin.cpp @@ -0,0 +1,261 @@ +#include "global.h" + +#if !defined(WITHOUT_NETWORKING) +#include "ScreenSMOnlineLogin.h" +#include "ScreenManager.h" +#include "ThemeManager.h" +#include "RageTimer.h" +#include "ActorUtil.h" +#include "Actor.h" +#include "GameSoundManager.h" +#include "MenuTimer.h" +#include "NetworkSyncManager.h" +#include "RageUtil.h" +#include "GameState.h" +#include "ScreenDimensions.h" +#include "crypto\CryptMD5.h" + +const ScreenMessage SM_SMOnlinePack = ScreenMessage(SM_User+8); + +REGISTER_SCREEN_CLASS( ScreenSMOnlineLogin ); +ScreenSMOnlineLogin::ScreenSMOnlineLogin( const CString& sName ) : ScreenWithMenuElements( sName ) +{ + m_iPlayer = THEME->GetMetricI( sName, "PlayerNumber" ) - 1; + + m_sUserName = GAMESTATE->GetPlayerDisplayName((PlayerNumber)m_iPlayer); + + m_sprPassword.SetName( "PasswordBG" ); + m_sprPassword.Load( THEME->GetPathG( m_sName, "PasswordBG" ) ); + m_sprPassword.SetHorizAlign( align_left ); + SET_XY_AND_ON_COMMAND( m_sprPassword ); + this->AddChild( &m_sprPassword ); + + m_textTitle.LoadFromFont( THEME->GetPathF(m_sName,"text") ); + m_textTitle.SetName( "Title" ); + SET_XY_AND_ON_COMMAND( m_textTitle ); + this->AddChild( &m_textTitle ); + + m_textTitle.SetText( NSMAN->GetServerName() ); + + m_textUserName.LoadFromFont( THEME->GetPathF(m_sName,"text") ); + m_textUserName.SetName( "UserName" ); + m_textUserName.SetWrapWidthPixels( SCREEN_WIDTH ); + SET_XY_AND_ON_COMMAND( m_textUserName ); + this->AddChild( &m_textUserName ); + + //XXX: Yuck, this should be metric'ed out when we get a chance + m_textUserName.SetText( "You are logging on as " + m_sUserName + " if this is incorrect, please change your profile." ); + + m_textPassword.LoadFromFont( THEME->GetPathF(m_sName,"text") ); + m_textPassword.SetName( "Password" ); + SET_XY_AND_ON_COMMAND( m_textPassword ); + this->AddChild( &m_textPassword ); + m_sPassword = ""; + + m_textLoginMessage.LoadFromFont( THEME->GetPathF(m_sName,"text") ); + m_textLoginMessage.SetName( "LoginMessage" ); + SET_XY_AND_ON_COMMAND( m_textLoginMessage ); + this->AddChild( &m_textLoginMessage ); + +} + +void ScreenSMOnlineLogin::Input( const DeviceInput& DeviceI, const InputEventType type, + const GameInput& GameI, const MenuInput& MenuI, + const StyleInput& StyleI ) +{ + if( m_In.IsTransitioning() || m_Out.IsTransitioning() ) + return; + + if( (type != IET_FIRST_PRESS) && (type != IET_SLOW_REPEAT) && (type != IET_FAST_REPEAT ) ) + return; + + bool bHoldingShift = + INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, KEY_LSHIFT)) || + INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, KEY_RSHIFT)); + + bool bHoldingCtrl = + INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, KEY_LCTRL)) || + INPUTFILTER->IsBeingPressed(DeviceInput(DEVICE_KEYBOARD, KEY_RCTRL)) || + (!NSMAN->useSMserver); //If we are disconnected, assume no chatting + + switch( DeviceI.button ) + { + case KEY_ENTER: + case KEY_KP_ENTER: + if ( m_sPassword != "" ) + SendLogin(); + return; + break; + case KEY_BACK: + if(!m_sPassword.empty()) + m_sPassword = m_sPassword.erase( m_sPassword.size()-1 ); + UpdateTextInput(); + break; + default: + char c; + c = DeviceI.ToChar(); + + if( bHoldingShift && !bHoldingCtrl ) + { + c = (char)toupper(c); + + switch( c ) + { + case '`': c='~'; break; + case '1': c='!'; break; + case '2': c='@'; break; + case '3': c='#'; break; + case '4': c='$'; break; + case '5': c='%'; break; + case '6': c='^'; break; + case '7': c='&'; break; + case '8': c='*'; break; + case '9': c='('; break; + case '0': c=')'; break; + case '-': c='_'; break; + case '=': c='+'; break; + case '[': c='{'; break; + case ']': c='}'; break; + case '\'': c='"'; break; + case '\\': c='|'; break; + case ';': c=':'; break; + case ',': c='<'; break; + case '.': c='>'; break; + case '/': c='?'; break; + } + } + if( (c >= ' ') && (!bHoldingCtrl) ) + { + m_sPassword += c; + UpdateTextInput(); + } + break; + } + Screen::Input( DeviceI, type, GameI, MenuI, StyleI ); // default input handler +} + +void ScreenSMOnlineLogin::HandleScreenMessage( const ScreenMessage SM ) +{ + Screen::HandleScreenMessage( SM ); + switch( SM ) + { + case SM_GoToPrevScreen: + SCREENMAN->SetNewScreen( THEME->GetMetric (m_sName, "PrevScreen") ); + break; + case SM_GoToNextScreen: + SCREENMAN->SetNewScreen( THEME->GetMetric (m_sName, "NextScreen") ); + break; + case SM_SMOnlinePack: + + int ResponceCode = NSMAN->m_SMOnlinePacket.Read1(); + if ( ResponceCode == 0 ) + { + int Status = NSMAN->m_SMOnlinePacket.Read1(); + if ( Status == 0 ) + SCREENMAN->SendMessageToTopScreen( SM_GoToNextScreen ); + else + { + CString Responce = NSMAN->m_SMOnlinePacket.ReadNT(); + m_textLoginMessage.SetText( Responce ); + } + } + //Else we ignore it. + + break; + } +} + +void ScreenSMOnlineLogin::MenuStart( PlayerNumber pn ) +{ + SendLogin(); +} + +void ScreenSMOnlineLogin::MenuBack( PlayerNumber pn ) +{ + SCREENMAN->SendMessageToTopScreen( SM_GoToPrevScreen ); +} + +void ScreenSMOnlineLogin::TweenOffScreen() +{ + OFF_COMMAND( m_textTitle ); + OFF_COMMAND( m_textUserName ); + OFF_COMMAND( m_textPassword ); + OFF_COMMAND( m_textLoginMessage ); + OFF_COMMAND( m_sprPassword ); +} + +void ScreenSMOnlineLogin::UpdateTextInput() +{ + CString PasswordText; + + for ( int i = 0; i < m_sPassword.length(); ++i ) + PasswordText+='*'; + + m_textPassword.SetText( PasswordText ); +} + +void ScreenSMOnlineLogin::SendLogin() +{ + CString HashedName; + CString PreHashedName; + + unsigned char Output[16]; + const unsigned char *Input = (unsigned char *)m_sPassword.c_str(); + + MD5Context BASE; + + memset(&BASE,0,sizeof(MD5Context)); + memset(&Output,0,16); + + MD5Init( &BASE ); + + MD5Update( &BASE, Input, 5); + + MD5Final( Output, &BASE ); + + for (int i = 0; i < 16; i++) + PreHashedName += ssprintf( "%2X", Output[i] ); + + //XXX: Yuck. Convert spaces to 0's better. (will fix soon) + for (int i = 0; i < 32; i++) + if ( PreHashedName.c_str()[i] == ' ' ) + HashedName += '0'; + else + HashedName += PreHashedName.c_str()[i]; + + NSMAN->m_SMOnlinePacket.ClearPacket(); + NSMAN->m_SMOnlinePacket.Write1((uint8_t)0); //Login command + NSMAN->m_SMOnlinePacket.Write1((uint8_t)0); //MD5 hash style + NSMAN->m_SMOnlinePacket.WriteNT(m_sUserName); + NSMAN->m_SMOnlinePacket.WriteNT(HashedName); + NSMAN->SendSMOnline( ); + +} + +#endif + +/* + * (c) 2004 Charles Lohr + * All rights reserved. + * Elements from ScreenTextEntry + * + * 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/ScreenSMOnlineLogin.h b/stepmania/src/ScreenSMOnlineLogin.h new file mode 100644 index 0000000000..ae21578950 --- /dev/null +++ b/stepmania/src/ScreenSMOnlineLogin.h @@ -0,0 +1,71 @@ +/* ScreenSMOnlineLogin - Login for StepMania online */ + +#ifndef SCREENSMONLINELOGIN_H +#define SCREENSMONLINELOGIN_H + +#include "ScreenWithMenuElements.h" +#include "Sprite.h" +#include "Quad.h" +#include "BitmapText.h" + +class ScreenSMOnlineLogin : public ScreenWithMenuElements +{ +public: + ScreenSMOnlineLogin( const CString& sName ); + + virtual void Input( const DeviceInput& DeviceI, const InputEventType type, + const GameInput& GameI, const MenuInput& MenuI, + const StyleInput& StyleI ); + + virtual void MenuStart( PlayerNumber pn ); + virtual void MenuBack( PlayerNumber pn ); + + virtual void HandleScreenMessage( const ScreenMessage SM ); + + virtual void TweenOffScreen(); + + void UpdateTextInput(); + void SendLogin(); +private: + + BitmapText m_textTitle; + + BitmapText m_textUserName; + + BitmapText m_textPassword; + BitmapText m_textLoginMessage; + + CString m_sUserName; + CString m_sPassword; + + Sprite m_sprPassword; + + int m_iPlayer; +}; + +#endif + +/* + * (c) 2004 Charles Lohr + * 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-net2003.vcproj b/stepmania/src/StepMania-net2003.vcproj index cb2bd40909..7b36d7287e 100644 --- a/stepmania/src/StepMania-net2003.vcproj +++ b/stepmania/src/StepMania-net2003.vcproj @@ -531,6 +531,12 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"\ + + + + diff --git a/stepmania/src/StepMania.dsp b/stepmania/src/StepMania.dsp index 7b020db4d4..54e5900cbe 100644 --- a/stepmania/src/StepMania.dsp +++ b/stepmania/src/StepMania.dsp @@ -2800,6 +2800,14 @@ SOURCE=.\ScreenSetTime.h # End Source File # Begin Source File +SOURCE=.\ScreenSMOnlineLogin.cpp +# End Source File +# Begin Source File + +SOURCE=.\ScreenSMOnlineLogin.h +# End Source File +# Begin Source File + SOURCE=.\ScreenSongOptions.cpp # End Source File # Begin Source File diff --git a/stepmania/src/StepMania.vcproj b/stepmania/src/StepMania.vcproj index e546c19342..f6c4bd4ec3 100644 --- a/stepmania/src/StepMania.vcproj +++ b/stepmania/src/StepMania.vcproj @@ -481,6 +481,12 @@ cl /Zl /nologo /c verstub.cpp /Fo"$(IntDir)"\ + + + + diff --git a/stepmania/src/StepManiaXbox.vcproj b/stepmania/src/StepManiaXbox.vcproj index 3366ae5003..f0ec4b2129 100644 --- a/stepmania/src/StepManiaXbox.vcproj +++ b/stepmania/src/StepManiaXbox.vcproj @@ -614,6 +614,12 @@ cl /Zl /nologo /c verstub.cpp /Fo$(IntDir)\ + + + +