Files
itgmania212121/src/ScreenNameEntryTraditional.cpp
T

347 lines
9.5 KiB
C++
Raw Normal View History

2011-03-17 01:47:30 -04:00
#include "global.h"
#include "ScreenNameEntryTraditional.h"
#include "PrefsManager.h"
#include "GameState.h"
#include "GameManager.h"
#include "StatsManager.h"
#include "SongManager.h"
#include "Song.h"
#include "Style.h"
#include "ProfileManager.h"
#include "Profile.h"
#include "InputEventPlus.h"
#include "RageInput.h"
#include "RageLog.h"
#include "CommonMetrics.h"
2023-04-20 19:02:13 +02:00
#include <vector>
2011-03-17 01:47:30 -04:00
REGISTER_SCREEN_CLASS( ScreenNameEntryTraditional );
void ScreenNameEntryTraditional::Init()
{
if( PREFSMAN->m_sTestInitialScreen.Get() == m_sName )
{
GAMESTATE->m_bSideIsJoined[PLAYER_1] = true;
GAMESTATE->m_bSideIsJoined[PLAYER_2] = true;
2011-06-06 20:40:11 -04:00
GAMESTATE->SetMasterPlayerNumber(PLAYER_1);
2011-03-17 01:47:30 -04:00
GAMESTATE->m_PlayMode.Set( PLAY_MODE_REGULAR );
GAMESTATE->SetCurrentStyle( GAMEMAN->GameAndStringToStyle( GAMEMAN->GetDefaultGame(),"versus"), GAMESTATE->GetMasterPlayerNumber() );
2011-03-17 01:47:30 -04:00
for( int z = 0; z < 3; ++z )
{
StageStats ss;
const std::vector<Song*> &apSongs = SONGMAN->GetAllSongs();
2011-03-17 01:47:30 -04:00
ss.m_vpPlayedSongs.push_back( apSongs[rand()%apSongs.size()] );
ss.m_vpPossibleSongs = ss.m_vpPlayedSongs;
ss.m_playMode = GAMESTATE->m_PlayMode;
ASSERT( ss.m_vpPlayedSongs[0]->GetAllSteps().size() );
2011-03-17 01:47:30 -04:00
FOREACH_PlayerNumber( p )
{
ss.m_player[p].m_pStyle = GAMESTATE->GetCurrentStyle(p);
StepsType st = GAMESTATE->GetCurrentStyle(p)->m_StepsType;
2011-03-17 01:47:30 -04:00
Steps *pSteps = ss.m_vpPlayedSongs[0]->GetAllSteps()[0];
ss.m_player[p].m_iStepsPlayed = 1;
GAMESTATE->m_pCurSteps[p].Set( pSteps );
ss.m_player[p].m_iPossibleDancePoints = 100;
ss.m_player[p].m_iActualDancePoints = 100;
ss.m_player[p].m_iScore = 100;
ss.m_player[p].m_iPossibleDancePoints = 1000;
ss.m_player[p].m_iActualDancePoints = 985;
ss.m_player[p].m_vpPossibleSteps.push_back( pSteps );
HighScore hs;
hs.SetGrade( Grade_Tier03 );
hs.SetPercentDP( ss.m_player[p].GetPercentDancePoints() );
hs.SetScore( ss.m_player[p].m_iScore );
hs.SetDateTime( DateTime::GetNowDateTime() );
int a, b;
PROFILEMAN->AddStepsScore( ss.m_vpPlayedSongs[0], pSteps, p, hs, a, b );
PROFILEMAN->AddStepsScore( ss.m_vpPlayedSongs[0], pSteps, p, hs, a, b );
PROFILEMAN->AddStepsScore( ss.m_vpPlayedSongs[0], pSteps, p, hs, a, b );
PROFILEMAN->AddStepsScore( ss.m_vpPlayedSongs[0], pSteps, p, hs, a, b );
PROFILEMAN->AddStepsScore( ss.m_vpPlayedSongs[0], pSteps, p, hs, a, b );
PROFILEMAN->AddCategoryScore( st, RANKING_A, p, hs, a, b );
}
STATSMAN->m_vPlayedStageStats.push_back( ss );
}
}
MAX_RANKING_NAME_LENGTH.Load( m_sName, "MaxRankingNameLength" );
ScreenWithMenuElements::Init();
}
void ScreenNameEntryTraditional::BeginScreen()
{
/* Find out if players are entering their name. */
FOREACH_PlayerNumber( pn )
{
std::vector<GameState::RankingFeat> aFeats;
2011-03-17 01:47:30 -04:00
GAMESTATE->GetRankingFeats( pn, aFeats );
bool bNoStagesLeft = GAMESTATE->m_iPlayerStageTokens[pn] <= 0;
2023-04-20 19:02:13 +02:00
m_bEnteringName[pn] = ( aFeats.size() > 0 ||
2011-04-04 00:58:18 -04:00
PROFILEMAN->ProfileFromMemoryCardIsNew(pn) ) && bNoStagesLeft;
2011-03-17 01:47:30 -04:00
m_bFinalized[pn] = !m_bEnteringName[pn];
}
FOREACH_HumanPlayer( pn )
{
if( !m_bEnteringName[pn] )
continue; // skip
m_sSelection[pn] = L"";
// load last used ranking name if any
const Profile *pProfile = PROFILEMAN->GetProfile(pn);
if( pProfile && !pProfile->m_sLastUsedHighScoreName.empty() )
{
m_sSelection[pn] = RStringToWstring( pProfile->m_sLastUsedHighScoreName );
if( (int) m_sSelection[pn].size() > MAX_RANKING_NAME_LENGTH )
m_sSelection[pn].erase( MAX_RANKING_NAME_LENGTH );
}
UpdateSelectionText( pn );
}
ScreenWithMenuElements::BeginScreen();
}
void ScreenNameEntryTraditional::HandleScreenMessage( const ScreenMessage SM )
{
if( SM == SM_MenuTimer )
{
if( !m_Out.IsTransitioning() )
{
Message msg("MenuTimerExpired");
this->HandleMessage( msg );
}
return;
}
ScreenWithMenuElements::HandleScreenMessage( SM );
}
bool ScreenNameEntryTraditional::AnyStillEntering() const
{
FOREACH_PlayerNumber( pn )
if( !m_bFinalized[pn] )
return true;
return false;
}
bool ScreenNameEntryTraditional::AnyEntering() const
{
FOREACH_PlayerNumber( pn )
if( m_bEnteringName[pn] )
return true;
return false;
}
2013-01-12 22:48:38 -05:00
bool ScreenNameEntryTraditional::Input( const InputEventPlus &input )
2011-03-17 01:47:30 -04:00
{
if( IsTransitioning() )
2013-01-12 22:48:38 -05:00
return false;
2011-03-17 01:47:30 -04:00
2013-01-12 22:48:38 -05:00
return ScreenWithMenuElements::Input( input );
2011-03-17 01:47:30 -04:00
}
bool ScreenNameEntryTraditional::Finish( PlayerNumber pn )
{
if( !AnyStillEntering() )
{
StartTransitioningScreen( SM_GoToNextScreen );
return true;
}
if( m_bFinalized[pn] )
return false;
m_bFinalized[pn] = true;
UpdateSelectionText( pn ); /* hide NAME_ cursor */
RString sSelection = WStringToRString( m_sSelection[pn] );
// save last used ranking name
Profile* pProfile = PROFILEMAN->GetProfile(pn);
pProfile->m_sLastUsedHighScoreName = sSelection;
Trim( sSelection, " " );
GAMESTATE->StoreRankingName( pn, sSelection );
{
Message msg("PlayerFinished");
msg.SetParam( "PlayerNumber", pn );
this->HandleMessage( msg );
}
if( !AnyStillEntering() )
StartTransitioningScreen( SM_GoToNextScreen );
return true;
}
void ScreenNameEntryTraditional::UpdateSelectionText( PlayerNumber pn )
{
std::wstring sText = m_sSelection[pn];
2011-03-17 01:47:30 -04:00
if( !m_bFinalized[pn] && (int) sText.size() < MAX_RANKING_NAME_LENGTH )
sText += L"_";
Message msg("EntryChanged");
msg.SetParam( "PlayerNumber", pn );
msg.SetParam( "Text", WStringToRString(sText) );
this->HandleMessage( msg );
}
bool ScreenNameEntryTraditional::EnterKey( PlayerNumber pn, wchar_t sLetter )
{
if( m_bFinalized[pn] )
return false; // ignore
/* If we have room, add a new character. */
if( (int) m_sSelection[pn].size() == MAX_RANKING_NAME_LENGTH )
{
SelectChar( pn, "BACK" );
return false;
}
m_sSelection[pn] += sLetter;
UpdateSelectionText( pn );
/* If that filled the string, set the cursor on OK. */
if( (int) m_sSelection[pn].size() == MAX_RANKING_NAME_LENGTH )
SelectChar( pn, "ENTER" );
return true;
}
void ScreenNameEntryTraditional::SelectChar( PlayerNumber pn, const RString &sKey )
{
Message msg("SelectKey");
msg.SetParam( "PlayerNumber", pn );
msg.SetParam( "Key", sKey );
this->HandleMessage( msg );
}
bool ScreenNameEntryTraditional::Backspace( PlayerNumber pn )
{
if( m_bFinalized[pn] )
return false; // ignore
if( !m_sSelection[pn].size() )
return false;
m_sSelection[pn].erase( m_sSelection[pn].size()-1, 1 );
UpdateSelectionText( pn );
return true;
}
// lua start
#include "LuaBinding.h"
2023-04-20 19:02:13 +02:00
/** @brief Allow Lua to have access to the ScreenNameEntryTraditional. */
2011-03-17 01:47:30 -04:00
class LunaScreenNameEntryTraditional: public Luna<ScreenNameEntryTraditional>
{
public:
static int EnterKey( T* p, lua_State *L )
{
PlayerNumber pn = Enum::Check<PlayerNumber>(L, 1);
RString sKey = SArg(2);
bool bRet = p->EnterKey( pn, utf8_get_char(sKey) );
LuaHelpers::Push( L, bRet );
return 1;
}
static int Finish( T* p, lua_State *L )
{
PlayerNumber pn = Enum::Check<PlayerNumber>(L, 1);
bool bRet = p->Finish( pn );
LuaHelpers::Push( L, bRet );
return 1;
}
static int Backspace( T* p, lua_State *L )
{
PlayerNumber pn = Enum::Check<PlayerNumber>(L, 1);
bool bRet = p->Backspace( pn );
LuaHelpers::Push( L, bRet );
return 1;
}
static int GetEnteringName( T* p, lua_State *L )
{
PlayerNumber pn = Enum::Check<PlayerNumber>(L, 1);
LuaHelpers::Push( L, p->m_bEnteringName[pn] );
return 1;
}
static int GetFinalized( T* p, lua_State *L )
{
PlayerNumber pn = Enum::Check<PlayerNumber>(L, 1);
LuaHelpers::Push( L, p->m_bFinalized[pn] );
return 1;
}
static int GetAnyEntering( T* p, lua_State *L )
{
LuaHelpers::Push( L, p->AnyEntering() );
return 1;
}
static int GetAnyStillEntering( T* p, lua_State *L )
{
LuaHelpers::Push( L, p->AnyStillEntering() );
return 1;
}
static int GetSelection( T* p, lua_State *L )
{
PlayerNumber pn = Enum::Check<PlayerNumber>(L, 1);
LuaHelpers::Push( L, WStringToRString(p->m_sSelection[pn]) );
return 1;
}
LunaScreenNameEntryTraditional()
{
ADD_METHOD( EnterKey );
ADD_METHOD( Finish );
ADD_METHOD( Backspace );
ADD_METHOD( GetEnteringName );
ADD_METHOD( GetAnyEntering );
ADD_METHOD( GetFinalized );
ADD_METHOD( GetAnyStillEntering );
ADD_METHOD( GetSelection );
}
};
LUA_REGISTER_DERIVED_CLASS( ScreenNameEntryTraditional, ScreenWithMenuElements )
// lua end
/*
* (c) 2001-2007 Glenn Maynard, Chris Danford
* All rights reserved.
2023-04-20 19:02:13 +02:00
*
2011-03-17 01:47:30 -04:00
* 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.
2023-04-20 19:02:13 +02:00
*
2011-03-17 01:47:30 -04:00
* 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.
*/