2014-01-13 12:44:33 +01:00
/////////////////////////////////////////////////////////////////////
// Created by [Dennis Andersen] [2013]
/////////////////////////////////////////////////////////////////////
2014-01-28 09:00:02 +01:00
# include "..\GameSession.h"
# include "..\GameClient.h"
2014-01-14 09:25:22 +01:00
# include <Protocols.h>
2014-01-13 12:44:33 +01:00
# include <PostBox\PostBox.h>
# include <GameLogicStates.h>
2014-01-29 10:18:01 +01:00
# define NOMINMAX
2014-01-13 12:44:33 +01:00
# include <Windows.h>
2014-02-04 16:07:10 +01:00
# include <Queue.h>
2014-01-13 12:44:33 +01:00
2014-02-09 16:42:26 +01:00
# define DELTA_TIME_20 0.05f
# define DELTA_TIME_24 0.04166666666666666666666666666667f
# define DELTA_TIME_30 0.03333333333333333333333333333333f
# define DELTA_TIME_60 0.01666666666666666666666666666667f
# define DELTA_TIME_120 0.00833333333333333333333333333333f
2014-01-13 12:44:33 +01:00
using namespace Utility : : DynamicMemory ;
using namespace Oyster ;
using namespace Oyster : : Network ;
using namespace Oyster : : Thread ;
using namespace GameLogic ;
namespace DanBias
{
2014-01-28 15:04:25 +01:00
GameSession * GameSession : : gameSession = nullptr ;
2014-01-30 00:19:00 +01:00
2014-01-13 12:44:33 +01:00
GameSession : : GameSession ( )
2014-01-20 15:47:52 +01:00
: gameInstance ( GameAPI : : Instance ( ) )
2014-01-13 12:44:33 +01:00
{
this - > owner = 0 ;
this - > isCreated = false ;
this - > isRunning = false ;
2014-01-28 15:04:25 +01:00
this - > gameSession = this ;
2014-02-09 16:42:26 +01:00
this - > logicFrameTime = DELTA_TIME_20 ;
this - > networkFrameTime = DELTA_TIME_20 ;
this - > networkTimer . reset ( ) ;
this - > logicTimer . reset ( ) ;
2014-01-30 00:19:00 +01:00
memset ( & this - > description , 0 , sizeof ( GameDescription ) ) ;
2014-01-13 12:44:33 +01:00
}
GameSession : : ~ GameSession ( )
{
2014-01-29 10:18:01 +01:00
this - > worker . Terminate ( ) ;
this - > clients . Clear ( ) ;
this - > gameInstance ;
2014-01-13 12:44:33 +01:00
this - > owner = 0 ;
2014-01-29 10:18:01 +01:00
this - > isCreated = false ;
this - > isRunning = false ;
2014-01-13 12:44:33 +01:00
}
bool GameSession : : Create ( GameDescription & desc )
{
2014-01-30 00:19:00 +01:00
this - > description = desc ;
2014-02-09 16:42:26 +01:00
/* Do some error checking */
2014-01-13 12:44:33 +01:00
if ( desc . clients . Size ( ) = = 0 ) return false ;
if ( ! desc . owner ) return false ;
if ( this - > isCreated ) return false ;
2014-02-09 16:42:26 +01:00
/* standard initialization of some data */
2014-01-31 08:41:08 +01:00
NetworkSession : : clients = desc . clients ;
2014-02-09 16:42:26 +01:00
this - > clients . Reserve ( desc . clients . Size ( ) ) ;
2014-01-13 12:44:33 +01:00
this - > owner = desc . owner ;
2014-02-09 16:42:26 +01:00
/* Initiate the game instance */
2014-01-20 15:47:52 +01:00
if ( ! this - > gameInstance . Initiate ( ) )
{
printf ( " Failed to initiate the game instance \n " ) ;
}
2014-02-09 16:42:26 +01:00
/* Create the players in the game instance */
2014-01-20 15:47:52 +01:00
GameLogic : : IPlayerData * p = 0 ;
2014-01-13 12:44:33 +01:00
for ( unsigned int i = 0 ; i < desc . clients . Size ( ) ; i + + )
{
2014-01-20 15:47:52 +01:00
if ( ( p = this - > gameInstance . CreatePlayer ( ) ) )
{
2014-01-31 08:41:08 +01:00
desc . clients [ i ] - > SetOwner ( this ) ;
2014-02-09 16:42:26 +01:00
this - > clients . Push ( new GameClient ( desc . clients [ i ] , p ) ) ;
2014-01-20 15:47:52 +01:00
}
else
{
printf ( " Failed to create player (%i) \n " , i ) ;
}
2014-01-13 12:44:33 +01:00
}
2014-02-09 16:42:26 +01:00
/* Create the game level */
if ( ! ( this - > levelData = this - > gameInstance . CreateLevel ( ) ) )
{
printf ( " Level not created! " ) ;
2014-01-20 15:47:52 +01:00
return false ;
2014-02-09 16:42:26 +01:00
}
2014-01-13 12:44:33 +01:00
2014-02-09 16:42:26 +01:00
/* Set some game instance data options */
this - > gameInstance . SetSubscription ( GameSession : : ObjectMove ) ;
this - > gameInstance . SetSubscription ( GameSession : : ObjectDisabled ) ;
this - > gameInstance . SetFPS ( 60 ) ;
2014-02-04 16:07:10 +01:00
this - > description . clients . Clear ( ) ;
2014-01-20 15:47:52 +01:00
this - > isCreated = true ;
2014-02-09 16:42:26 +01:00
/* Create the worker thread */
if ( this - > worker . Create ( this , false ) ! = OYSTER_THREAD_ERROR_SUCCESS )
return false ;
2014-01-20 15:47:52 +01:00
return this - > isCreated ;
2014-01-13 12:44:33 +01:00
}
void GameSession : : Run ( )
{
if ( this - > isRunning ) return ;
if ( this - > clients . Size ( ) > 0 )
{
2014-01-29 10:18:01 +01:00
this - > worker . Start ( ) ;
2014-01-20 15:47:52 +01:00
this - > worker . SetPriority ( OYSTER_THREAD_PRIORITY_1 ) ;
2014-01-13 12:44:33 +01:00
this - > isRunning = true ;
}
}
2014-02-04 16:07:10 +01:00
void GameSession : : ThreadEntry ( )
{
2014-02-09 16:42:26 +01:00
//List with clients that we are waiting on..
2014-02-04 16:07:10 +01:00
DynamicArray < SmartPointer < GameClient > > readyList = this - > clients ;
2014-01-13 12:44:33 +01:00
2014-02-09 16:42:26 +01:00
//First we need to clean invalid clients, if any, and tell them to start loading game data
2014-02-04 16:07:10 +01:00
for ( unsigned int i = 0 ; i < readyList . Size ( ) ; i + + )
{
if ( ! readyList [ i ] )
{
readyList . Remove ( i ) ;
}
else
{
2014-02-11 13:41:38 +01:00
Protocol_LobbyCreateGame p ( readyList [ i ] - > GetPlayer ( ) - > GetID ( ) , " char_temporary.dan " , readyList [ i ] - > GetPlayer ( ) - > GetOrientation ( ) ) ;
2014-02-04 16:07:10 +01:00
readyList [ i ] - > GetClient ( ) - > Send ( p ) ;
}
}
unsigned int readyCounter = readyList . Size ( ) ;
2014-02-09 16:42:26 +01:00
//Sync with clients
2014-02-04 16:07:10 +01:00
while ( readyCounter ! = 0 )
{
this - > ProcessClients ( ) ;
for ( unsigned int i = 0 ; i < readyList . Size ( ) ; i + + )
{
if ( readyList [ i ] & & readyList [ i ] - > IsReady ( ) )
{
2014-02-09 16:42:26 +01:00
//Need to send information about other players, to all players
for ( unsigned int k = 0 ; k < this - > clients . Size ( ) ; k + + )
2014-02-04 16:07:10 +01:00
{
2014-02-09 16:42:26 +01:00
if ( ( this - > clients [ k ] & & readyList [ i ] ) & & readyList [ i ] - > GetClient ( ) - > GetID ( ) ! = this - > clients [ k ] - > GetClient ( ) - > GetID ( ) )
2014-02-04 16:07:10 +01:00
{
2014-02-11 13:41:38 +01:00
Protocol_ObjectCreate p ( this - > clients [ k ] - > GetPlayer ( ) - > GetOrientation ( ) , this - > clients [ k ] - > GetPlayer ( ) - > GetID ( ) , " char_temporary.dan " ) ; //The model name will be custom later..
2014-02-04 16:07:10 +01:00
readyList [ i ] - > GetClient ( ) - > Send ( p ) ;
}
}
readyCounter - - ;
readyList [ i ] = 0 ;
}
}
Sleep ( 5 ) ; //TODO: This might not be needed here.
}
2014-02-09 16:42:26 +01:00
for ( unsigned int i = 0 ; i < this - > clients . Size ( ) ; i + + )
{
if ( this - > clients [ i ] )
{
this - > clients [ i ] - > GetClient ( ) - > Send ( GameLogic : : Protocol_LobbyStartGame ( 5 ) ) ;
}
}
2014-02-04 16:07:10 +01:00
}
2014-01-13 12:44:33 +01:00
2014-01-29 10:18:01 +01:00
bool GameSession : : Attach ( Utility : : DynamicMemory : : SmartPointer < NetworkClient > client )
2014-01-13 12:44:33 +01:00
{
2014-01-29 10:18:01 +01:00
if ( ! this - > isCreated ) return false ;
2014-01-13 12:44:33 +01:00
2014-01-29 10:18:01 +01:00
client - > SetOwner ( this ) ;
2014-02-09 16:42:26 +01:00
IPlayerData * player = this - > gameInstance . CreatePlayer ( ) ;
if ( ! player ) return false ;
SmartPointer < GameClient > obj = new GameClient ( client , player ) ;
2014-01-29 10:18:01 +01:00
2014-01-13 12:44:33 +01:00
for ( unsigned int i = 0 ; i < clients . Size ( ) ; i + + )
{
if ( ! clients [ i ] )
{
clients [ i ] = obj ;
2014-01-29 10:18:01 +01:00
return true ;
2014-01-13 12:44:33 +01:00
}
}
2014-01-29 10:18:01 +01:00
clients . Push ( obj ) ;
return true ;
2014-01-13 12:44:33 +01:00
}
2014-02-04 16:07:10 +01:00
void GameSession : : CloseSession ( bool dissconnectClients )
{
2014-02-09 16:42:26 +01:00
this - > worker . Terminate ( ) ;
2014-02-04 16:07:10 +01:00
NetworkSession : : CloseSession ( true ) ;
this - > clients . Clear ( ) ;
}
2014-01-13 12:44:33 +01:00
} //End namespace DanBias