Files
itgmania212121/src/ScreenSelectProfile.cpp
T
2023-02-02 11:54:17 -08:00

316 lines
8.2 KiB
C++

#include "global.h"
#include "ScreenSelectProfile.h"
#include "ScreenManager.h"
#include "ProfileManager.h"
#include "GameState.h"
#include "MemoryCardManager.h"
#include "InputEventPlus.h"
REGISTER_SCREEN_CLASS( ScreenSelectProfile );
void ScreenSelectProfile::Init()
{
FOREACH_PlayerNumber( p )
{
// no selection initially
m_iSelectedProfiles[p]=-1;
}
m_TrackingRepeatingInput = GameButton_Invalid;
ScreenWithMenuElements::Init();
}
bool ScreenSelectProfile::Input( const InputEventPlus &input )
{
if( IsTransitioning() )
return false;
return ScreenWithMenuElements::Input( input );
}
bool ScreenSelectProfile::MenuLeft( const InputEventPlus &input )
{
PlayerNumber pn = input.pn;
if( m_fLockInputSecs > 0 )
return false;
if( input.type == IET_RELEASE )
return false;
if( input.type != IET_FIRST_PRESS )
{
/*
if( !ALLOW_REPEATING_INPUT )
return false;
*/
if( m_TrackingRepeatingInput != input.MenuI )
return false;
}
m_TrackingRepeatingInput = input.MenuI;
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuLeftP1+Enum::to_integral(pn)) );
return true;
}
bool ScreenSelectProfile::MenuRight( const InputEventPlus &input )
{
PlayerNumber pn = input.pn;
if( m_fLockInputSecs > 0 )
return false;
if( input.type == IET_RELEASE )
return false;
if( input.type != IET_FIRST_PRESS )
{
/*
if( !ALLOW_REPEATING_INPUT )
return false;
*/
if( m_TrackingRepeatingInput != input.MenuI )
return false;
}
m_TrackingRepeatingInput = input.MenuI;
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuRightP1+Enum::to_integral(pn)) );
return true;
}
bool ScreenSelectProfile::MenuUp( const InputEventPlus &input )
{
PlayerNumber pn = input.pn;
if( m_fLockInputSecs > 0 )
return false;
if( input.type == IET_RELEASE )
return false;
if( input.type != IET_FIRST_PRESS )
{
/*
if( !ALLOW_REPEATING_INPUT )
return false;
*/
if( m_TrackingRepeatingInput != input.MenuI )
return false;
}
m_TrackingRepeatingInput = input.MenuI;
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuUpP1+Enum::to_integral(pn)) );
return true;
}
bool ScreenSelectProfile::MenuDown( const InputEventPlus &input )
{
PlayerNumber pn = input.pn;
if( m_fLockInputSecs > 0 )
return false;
if( input.type == IET_RELEASE )
return false;
if( input.type != IET_FIRST_PRESS )
{
/*
if( !ALLOW_REPEATING_INPUT )
return false;
*/
if( m_TrackingRepeatingInput != input.MenuI )
return false;
}
m_TrackingRepeatingInput = input.MenuI;
MESSAGEMAN->Broadcast( (MessageID)(Message_MenuDownP1+Enum::to_integral(pn)) );
return true;
}
bool ScreenSelectProfile::SetProfileIndex( PlayerNumber pn, int iProfileIndex )
{
if( !GAMESTATE->IsHumanPlayer( pn ) )
{
if( iProfileIndex == -1 )
{
GAMESTATE->JoinPlayer( pn );
SCREENMAN->PlayStartSound();
return true;
}
return false;
}
if( iProfileIndex > PROFILEMAN->GetNumLocalProfiles() )
return false;
// wrong selection
if( iProfileIndex < -3 )
return false;
// unload player
if( iProfileIndex == -2 )
{
// GAMESTATE->UnjoinPlayer takes care of unloading the profile.
GAMESTATE->UnjoinPlayer( pn );
MEMCARDMAN->UnlockCard( pn );
MEMCARDMAN->UnmountCard( pn );
m_iSelectedProfiles[pn]=-1;
return true;
}
m_iSelectedProfiles[pn]=iProfileIndex;
return true;
}
bool ScreenSelectProfile::Finish(){
if( GAMESTATE->GetNumPlayersEnabled() == 0 )
return false;
// if profile indexes are the same for both players
if( GAMESTATE->GetNumPlayersEnabled() == 2 && m_iSelectedProfiles[0] == m_iSelectedProfiles[1] && m_iSelectedProfiles[0] > 0 )
return false;
int iUsedLocalProfiles = 0;
int iUnselectedProfiles = 0;
FOREACH_PlayerNumber( p )
{
// not all players have made their choices
if( GAMESTATE->IsHumanPlayer( p ) && ( m_iSelectedProfiles[p] == -1 ) )
iUnselectedProfiles++;
// card not ready
if( m_iSelectedProfiles[p] == 0 && MEMCARDMAN->GetCardState( p ) != MemoryCardState_Ready )
return false;
// profile index too big
if( m_iSelectedProfiles[p] > PROFILEMAN->GetNumLocalProfiles() )
return false;
// inc used profile count
if( m_iSelectedProfiles[p] > 0 )
iUsedLocalProfiles++;
}
// this allows to continue if there is less local profiles than number of human players
if( iUnselectedProfiles && iUsedLocalProfiles < PROFILEMAN->GetNumLocalProfiles() )
return false;
// unload all profiles, so we don't end up in a situation where two
// players might have the same profile assigned
FOREACH_PlayerNumber( p )
{
MEMCARDMAN->UnlockCard( p );
MEMCARDMAN->UnmountCard( p );
PROFILEMAN->UnloadProfile( p );
}
// all ok - load profiles and go to next screen
FOREACH_PlayerNumber( p )
{
if( m_iSelectedProfiles[p] > 0 )
{
PROFILEMAN->m_sDefaultLocalProfileID[p].Set( PROFILEMAN->GetLocalProfileIDFromIndex( m_iSelectedProfiles[p] - 1 ) );
PROFILEMAN->LoadLocalProfileFromMachine( p );
GAMESTATE->LoadCurrentSettingsFromProfile(p);
}
if( m_iSelectedProfiles[p] == 0 )
{
MEMCARDMAN->WaitForCheckingToComplete();
MEMCARDMAN->MountCard( p );
bool bSuccess = PROFILEMAN->LoadProfileFromMemoryCard( p, true ); // load full profile
MEMCARDMAN->UnmountCard( p );
// Lock the card on successful load, so we won't allow it to be changed.
if( bSuccess )
{
GAMESTATE->LoadCurrentSettingsFromProfile(p);
MEMCARDMAN->LockCard( p );
}
}
// If the player picked a profile (>= 0) or chose to play as a guest (-3),
// broadcast a message
if( m_iSelectedProfiles[p] >= 0 || m_iSelectedProfiles[p] == -3 ) {
Message msg( MessageIDToString(Message_PlayerProfileSet) );
msg.SetParam( "Player", p );
MESSAGEMAN->Broadcast( msg );
}
}
StartTransitioningScreen( SM_GoToNextScreen );
return true;
}
void ScreenSelectProfile::HandleScreenMessage( const ScreenMessage SM )
{
if( SM == SM_MenuTimer )
{
bool bFinished = Finish();
if( !bFinished )
{
// TODO: we need to decide how to handle unfinished business.
}
}
ScreenWithMenuElements::HandleScreenMessage( SM );
}
// lua start
#include "LuaBinding.h"
/** @brief Allow Lua to have access to the ScreenSelectProfile. */
class LunaScreenSelectProfile: public Luna<ScreenSelectProfile>
{
public:
static int SetProfileIndex( T* p, lua_State *L )
{
PlayerNumber pn = Enum::Check<PlayerNumber>(L, 1);
int iProfileIndex = IArg(2);
bool bRet = p->SetProfileIndex( pn, iProfileIndex );
LuaHelpers::Push( L, bRet );
return 1;
}
static int GetProfileIndex( T* p, lua_State *L )
{
PlayerNumber pn = Enum::Check<PlayerNumber>(L, 1);
LuaHelpers::Push( L, p->GetProfileIndex( pn ) );
return 1;
}
static int Finish( T* p, lua_State *L )
{
bool bRet = p->Finish();
LuaHelpers::Push( L, bRet );
return 1;
}
static int Cancel( T* p, lua_State *L )
{
p->Cancel( SM_GoToPrevScreen );
return 1;
}
LunaScreenSelectProfile()
{
ADD_METHOD( SetProfileIndex );
ADD_METHOD( GetProfileIndex );
ADD_METHOD( Finish );
ADD_METHOD( Cancel );
}
};
LUA_REGISTER_DERIVED_CLASS( ScreenSelectProfile, ScreenWithMenuElements )
/*
* Copyright (c) 2007 vdl
* 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.
*/