249 lines
6.8 KiB
C++
249 lines
6.8 KiB
C++
|
|
/*
|
||
|
|
* Join players in perparation for ScreenGameplayMultiplayer.
|
||
|
|
*/
|
||
|
|
|
||
|
|
#include "global.h"
|
||
|
|
#include "ScreenJoinMultiplayer.h"
|
||
|
|
#include "RageInput.h"
|
||
|
|
class Style;
|
||
|
|
#include "GameManager.h"
|
||
|
|
#include "GameState.h"
|
||
|
|
#include "InputMapper.h"
|
||
|
|
#include "GameSoundManager.h"
|
||
|
|
#include "GameCommand.h"
|
||
|
|
|
||
|
|
enum MultiPlayerStatus
|
||
|
|
{
|
||
|
|
MultiPlayerStatus_Joined,
|
||
|
|
MultiPlayerStatus_NotJoined,
|
||
|
|
MultiPlayerStatus_Unplugged,
|
||
|
|
MultiPlayerStatus_MissingMultitap,
|
||
|
|
NUM_MultiPlayerStatus,
|
||
|
|
MultiPlayerStatus_Invalid
|
||
|
|
};
|
||
|
|
|
||
|
|
static const CString MultiPlayerStatusNames[] = {
|
||
|
|
"Joined",
|
||
|
|
"NotJoined",
|
||
|
|
"Unplugged",
|
||
|
|
"MissingMultitap",
|
||
|
|
};
|
||
|
|
XToString( MultiPlayerStatus, NUM_MultiPlayerStatus );
|
||
|
|
|
||
|
|
static bool IsConnected( MultiPlayerStatus s )
|
||
|
|
{
|
||
|
|
return s == MultiPlayerStatus_Joined || s == MultiPlayerStatus_NotJoined;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
static MultiPlayerStatus g_MultiPlayerStatus[NUM_MultiPlayer];
|
||
|
|
|
||
|
|
REGISTER_SCREEN_CLASS( ScreenJoinMultiplayer );
|
||
|
|
ScreenJoinMultiplayer::ScreenJoinMultiplayer( CString sClassName ) : ScreenWithMenuElements( sClassName )
|
||
|
|
{
|
||
|
|
FOREACH_MultiPlayer( p )
|
||
|
|
g_MultiPlayerStatus[p] = MultiPlayerStatus_Invalid;
|
||
|
|
}
|
||
|
|
|
||
|
|
void ScreenJoinMultiplayer::Init()
|
||
|
|
{
|
||
|
|
ScreenWithMenuElements::Init();
|
||
|
|
|
||
|
|
// Set Style to the first style (should be a one player style)
|
||
|
|
vector<const Style*> v;
|
||
|
|
GAMEMAN->GetStylesForGame( GAMESTATE->m_pCurGame, v, false );
|
||
|
|
GAMESTATE->m_pCurStyle.Set( v[0] );
|
||
|
|
|
||
|
|
FOREACH_MultiPlayer( p )
|
||
|
|
{
|
||
|
|
GameCommand gc;
|
||
|
|
gc.m_iIndex = p;
|
||
|
|
|
||
|
|
Lua *L = LUA->Get();
|
||
|
|
gc.PushSelf( L );
|
||
|
|
lua_setglobal( L, "ThisGameCommand" );
|
||
|
|
LUA->Release( L );
|
||
|
|
|
||
|
|
m_sprPlayer[p].Load( THEME->GetPathG(m_sName, "player") );
|
||
|
|
this->AddChild( m_sprPlayer[p] );
|
||
|
|
|
||
|
|
LUA->UnsetGlobal( "ThisGameCommand" );
|
||
|
|
}
|
||
|
|
|
||
|
|
m_exprOnCommandFunction.SetFromExpression( THEME->GetMetric(m_sName,"TranformFunction") );
|
||
|
|
|
||
|
|
FOREACH_MultiPlayer( p )
|
||
|
|
{
|
||
|
|
PositionItem( m_sprPlayer[p], p, NUM_MultiPlayer );
|
||
|
|
}
|
||
|
|
|
||
|
|
m_soundPlugIn.Load( THEME->GetPathS(m_sName,"PlugIn") );
|
||
|
|
m_soundUnplug.Load( THEME->GetPathS(m_sName,"Unplug") );
|
||
|
|
m_soundJoin.Load( THEME->GetPathS(m_sName,"Join") );
|
||
|
|
m_soundUnjoin.Load( THEME->GetPathS(m_sName,"Unjoin") );
|
||
|
|
|
||
|
|
UpdatePlayerStatus();
|
||
|
|
}
|
||
|
|
|
||
|
|
void ScreenJoinMultiplayer::PositionItem( Actor *pActor, int iItemIndex, int iNumItems )
|
||
|
|
{
|
||
|
|
Lua *L = LUA->Get();
|
||
|
|
m_exprOnCommandFunction.PushSelf( L );
|
||
|
|
ASSERT( !lua_isnil(L, -1) );
|
||
|
|
pActor->PushSelf( L );
|
||
|
|
LuaHelpers::Push( iItemIndex, L );
|
||
|
|
LuaHelpers::Push( iNumItems, L );
|
||
|
|
lua_call( L, 3, 0 ); // 3 args, 0 results
|
||
|
|
LUA->Release(L);
|
||
|
|
}
|
||
|
|
|
||
|
|
void ScreenJoinMultiplayer::HandleScreenMessage( const ScreenMessage SM )
|
||
|
|
{
|
||
|
|
ScreenWithMenuElements::HandleScreenMessage( SM );
|
||
|
|
}
|
||
|
|
|
||
|
|
void ScreenJoinMultiplayer::Input( const DeviceInput& DeviceI, const InputEventType type, const GameInput &GameI, const MenuInput &MenuI, const StyleInput &StyleI )
|
||
|
|
{
|
||
|
|
if( this->IsTransitioning() )
|
||
|
|
return;
|
||
|
|
|
||
|
|
// Translate input and sent to the appropriate player. Assume that all
|
||
|
|
// joystick devices are mapped the same as the master player.
|
||
|
|
if( DeviceI.device >= DEVICE_JOY1 &&
|
||
|
|
DeviceI.device < DEVICE_JOY1 + NUM_MultiPlayer )
|
||
|
|
{
|
||
|
|
DeviceInput di = DeviceI;
|
||
|
|
di.device = DEVICE_JOY1;
|
||
|
|
GameInput gi;
|
||
|
|
INPUTMAPPER->DeviceToGame( di, gi );
|
||
|
|
|
||
|
|
if( GameI.IsValid() )
|
||
|
|
{
|
||
|
|
MenuInput mi;
|
||
|
|
INPUTMAPPER->GameToMenu( gi, mi );
|
||
|
|
|
||
|
|
MultiPlayer p = (MultiPlayer)(DeviceI.device - DEVICE_JOY1);
|
||
|
|
|
||
|
|
ASSERT( p>=0 && p<NUM_MultiPlayer );
|
||
|
|
|
||
|
|
MultiPlayerStatus old = g_MultiPlayerStatus[p];
|
||
|
|
|
||
|
|
switch( mi.button )
|
||
|
|
{
|
||
|
|
case MENU_BUTTON_UP:
|
||
|
|
if( old == MultiPlayerStatus_NotJoined )
|
||
|
|
{
|
||
|
|
m_soundJoin.Play();
|
||
|
|
g_MultiPlayerStatus[p] = MultiPlayerStatus_Joined;
|
||
|
|
m_sprPlayer[p]->PlayCommand( MultiPlayerStatusToString(g_MultiPlayerStatus[p]) );
|
||
|
|
}
|
||
|
|
return; // input handled
|
||
|
|
case MENU_BUTTON_DOWN:
|
||
|
|
if( old == MultiPlayerStatus_Joined )
|
||
|
|
{
|
||
|
|
m_soundUnjoin.Play();
|
||
|
|
g_MultiPlayerStatus[p] = MultiPlayerStatus_NotJoined;
|
||
|
|
m_sprPlayer[p]->PlayCommand( MultiPlayerStatusToString(g_MultiPlayerStatus[p]) );
|
||
|
|
}
|
||
|
|
return; // input handled
|
||
|
|
case MENU_BUTTON_BACK:
|
||
|
|
MenuBack( GAMESTATE->m_MasterPlayerNumber );
|
||
|
|
return; // input handled
|
||
|
|
case MENU_BUTTON_START:
|
||
|
|
MenuStart( GAMESTATE->m_MasterPlayerNumber );
|
||
|
|
return; // input handled
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
ScreenWithMenuElements::Input( DeviceI, type, GameI, MenuI, StyleI );
|
||
|
|
}
|
||
|
|
|
||
|
|
void ScreenJoinMultiplayer::Update( float fDeltaTime )
|
||
|
|
{
|
||
|
|
ScreenWithMenuElements::Update(fDeltaTime);
|
||
|
|
}
|
||
|
|
|
||
|
|
void ScreenJoinMultiplayer::DrawPrimitives()
|
||
|
|
{
|
||
|
|
ScreenWithMenuElements::DrawPrimitives();
|
||
|
|
}
|
||
|
|
|
||
|
|
void ScreenJoinMultiplayer::UpdatePlayerStatus()
|
||
|
|
{
|
||
|
|
FOREACH_MultiPlayer( p )
|
||
|
|
{
|
||
|
|
InputDevice id = (InputDevice)p;
|
||
|
|
|
||
|
|
MultiPlayerStatus old = g_MultiPlayerStatus[p];
|
||
|
|
bool bWasConnected = IsConnected( old );
|
||
|
|
|
||
|
|
MultiPlayerStatus s = MultiPlayerStatus_Invalid;
|
||
|
|
switch( INPUTMAN->GetInputDeviceState(id) )
|
||
|
|
{
|
||
|
|
default:
|
||
|
|
ASSERT(0);
|
||
|
|
case InputDeviceState_Connected:
|
||
|
|
s = MultiPlayerStatus_NotJoined;
|
||
|
|
break;
|
||
|
|
case InputDeviceState_INVALID:
|
||
|
|
case InputDeviceState_Disconnected:
|
||
|
|
s = MultiPlayerStatus_Unplugged;
|
||
|
|
break;
|
||
|
|
case InputDeviceState_MissingMultitap:
|
||
|
|
s = MultiPlayerStatus_MissingMultitap;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
if( old != s )
|
||
|
|
{
|
||
|
|
m_sprPlayer[p]->PlayCommand( MultiPlayerStatusToString(s) );
|
||
|
|
g_MultiPlayerStatus[p] = s;
|
||
|
|
|
||
|
|
bool bIsConnected = IsConnected( s );
|
||
|
|
|
||
|
|
if( !bWasConnected && bIsConnected )
|
||
|
|
m_soundPlugIn.Play();
|
||
|
|
else if( bWasConnected && !bIsConnected )
|
||
|
|
m_soundUnplug.Play();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void ScreenJoinMultiplayer::MenuBack( PlayerNumber pn )
|
||
|
|
{
|
||
|
|
SOUND->StopMusic();
|
||
|
|
Cancel( SM_GoToPrevScreen );
|
||
|
|
}
|
||
|
|
|
||
|
|
void ScreenJoinMultiplayer::MenuStart( PlayerNumber pn )
|
||
|
|
{
|
||
|
|
this->StartTransitioning( SM_BeginFadingOut );
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
/*
|
||
|
|
* (c) 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.
|
||
|
|
*/
|