Files
Jedi-Academy/tools/jawa/jawa.cpp
2013-04-04 14:32:05 -07:00

203 lines
5.5 KiB
C++

// jawa.cpp : Defines the entry point for the application.
#include "stdafx.h"
#ifndef _DEBUG
#error Jawa should only be used in debug mode!
#endif
// Our (many) game sessions
#define MAX_SESSIONS 10
CSession sessions[MAX_SESSIONS];
// Handle the logon task
XONLINETASK_HANDLE g_hLogonTask;
//-----------------------------------------------------------------------------
// Name: Print()
//-----------------------------------------------------------------------------
VOID __cdecl Print( const WCHAR* strFormat, ... )
{
const int MAX_OUTPUT_STR = 80;
WCHAR strBuffer[ MAX_OUTPUT_STR ];
va_list pArglist;
va_start( pArglist, strFormat );
INT iChars = wvsprintfW( strBuffer, strFormat, pArglist );
assert( iChars < MAX_OUTPUT_STR );
OutputDebugStringW( L"\n*** SimpleAuth: " );
OutputDebugStringW( strBuffer );
OutputDebugStringW( L"\n\n" );
(VOID)iChars; // avoid compiler warning
va_end( pArglist );
}
//-----------------------------------------------------------------------------
// Name: SignIn()
//-----------------------------------------------------------------------------
BOOL SignIn()
{
XONLINE_USER StoredUsers[ XONLINE_MAX_STORED_ONLINE_USERS ];
DWORD dwNumStoredUsers;
HRESULT hr = XOnlineGetUsers( StoredUsers, &dwNumStoredUsers );
assert( SUCCEEDED( hr ) );
assert( dwNumStoredUsers );
XONLINE_USER LogonUsers[ XONLINE_MAX_LOGON_USERS ] = { 0 }; // Initially zeroed
LogonUsers[0] = StoredUsers[0];
const DWORD Services[] = { XONLINE_MATCHMAKING_SERVICE };
const DWORD dwNumServices = sizeof( Services ) / sizeof( Services[0] );
hr = XOnlineLogon( LogonUsers, Services, dwNumServices, NULL, &g_hLogonTask );
assert( hr == S_OK );
// 1. Check for system authentication errors.
do { hr = XOnlineTaskContinue( g_hLogonTask ); } while ( hr == XONLINETASK_S_RUNNING );
assert( hr == XONLINE_S_LOGON_CONNECTION_ESTABLISHED );
// 2. Check for user authentication errors.
PXONLINE_USER Users = XOnlineGetLogonUsers();
assert( Users );
for( DWORD i = 0; i < XONLINE_MAX_LOGON_USERS; ++i )
{
if( Users[i].xuid.qwUserID != 0 ) // A valid user
assert( Users[i].hr == S_OK || Users[i].hr == XONLINE_S_LOGON_USER_HAS_MESSAGE );
}
// 3. Finally check the requested services
for( DWORD i = 0; i < dwNumServices; ++i )
{
hr = XOnlineGetServiceInfo( Services[i], NULL );
assert( hr == S_OK );
}
return TRUE;
}
//-----------------------------------------------------------------------------
// Name: main()
// Desc: The application's entry point
//-----------------------------------------------------------------------------
void __cdecl main()
{
XInitDevices( 0, NULL );
while ( XGetDeviceEnumerationStatus() == XDEVICE_ENUMERATION_BUSY ) {}
// We need MANY keys registered!
XNetStartupParams xnsp;
ZeroMemory( &xnsp, sizeof(xnsp) );
xnsp.cfgSizeOfStruct = sizeof(xnsp);
xnsp.cfgKeyRegMax = 255; // 4
xnsp.cfgSecRegMax = 255; // 32
XNetStartup( &xnsp );
HRESULT hr = XOnlineStartup( NULL );
assert( SUCCEEDED( hr ) );
// Need to log in first.
if( !SignIn() )
return;
char sessionName[16] = { 0 };
{
// Always generate worst case display
CSession *sess = &sessions[0];
sess->PrivateFilled = 0;
sess->PrivateOpen = 0;
sess->PublicFilled = 5;
sess->PublicOpen = 3;
sess->TotalPlayers = 5;
sess->GameType = 4; // PowerDuel
sess->CurrentMap = 8; // Imperial Control Room
strcpy( sessionName, "WWWWWWWWWWWWWWQ" );
WCHAR wSessionName[16];
wsprintfW( wSessionName, L"%hs", sessionName );
sess->SetSessionName( wSessionName );
sess->FriendlyFire = 0;
sess->SaberOnly = 0;
sess->JediMastery = 0;
sess->Dedicated = 0;
HRESULT hr = sess->Create();
if (hr != S_OK)
{
OutputDebugString( "Session creation failed" );
}
do
{
hr = XOnlineTaskContinue( g_hLogonTask );
if ( FAILED( hr ) )
{
OutputDebugString( "Logon task failed" );
}
hr = sess->Process();
} while ( sess->IsCreating() );
}
for( int i = 1; i < MAX_SESSIONS; ++i )
{
CSession *sess = &sessions[i];
int totalSlots = (rand() % 5) + 4; // 4 - 8
int publicSlots = (rand() % totalSlots); // 0 - (total-1)
int privateSlots = totalSlots - publicSlots; // 1 - total
int privateTaken = (rand() % privateSlots) + 1; // 1 - private
int publicTaken = (rand() % (publicSlots+1)); // 0 - public
sess->PrivateFilled = 1; //privateTaken;
sess->PrivateOpen = 2; //privateSlots - privateTaken;
sess->PublicFilled = 3; //publicTaken;
sess->PublicOpen = 4; //publicSlots - publicTaken;
sess->TotalPlayers = 4; //privateTaken + publicTaken;
sess->GameType = rand() % 10;
sess->CurrentMap = rand() % 23;
XNetRandom( (BYTE *)&sessionName[0], 10 );
for( int j = 0; j < 10; ++j )
sessionName[j] = (((unsigned char)sessionName[j]) % 26) + 'A';
WCHAR wSessionName[11];
wsprintfW( wSessionName, L"%hs", sessionName );
wSessionName[10] = 0;
sess->SetSessionName( wSessionName );
sess->FriendlyFire = rand() % 2;
sess->SaberOnly = rand() % 2;
sess->JediMastery = rand() % 7;
sess->Dedicated = rand() % 2;
HRESULT hr = sess->Create();
if (hr != S_OK)
{
OutputDebugString( "Session creation failed" );
}
do
{
hr = XOnlineTaskContinue( g_hLogonTask );
if ( FAILED( hr ) )
{
OutputDebugString( "Logon task failed" );
}
hr = sess->Process();
} while ( sess->IsCreating() );
}
while( TRUE )
{
// Service things
hr = XOnlineTaskContinue( g_hLogonTask );
assert( SUCCEEDED( hr ) );
for( int j = 0; j < MAX_SESSIONS; ++j )
{
hr = sessions[j].Process();
assert( SUCCEEDED( hr ) );
}
}
}