#include "habitat.hpp"


//------------------------- HABITAT Module ----------------------//
//						  v 08 . 03 .  2007						 //
//																 //
//								MT								 //
//---------------------------------------------------------------//


// --- CHabitat Constructer --- //
CHabitat :: CHabitat()
{ };

// --- The New Game --- //
void CHabitat :: NewGame()
{
	Socket.SendCommand(COMMAND_HABITAT_INIT_CREATE);
		printf("~Info: %s created a new game.\n", Data.gamer_name);
		printf("~Info: %s waiting %d gamers.\n", Data.gamer_name, GAMERS_TO_WAIT);

			//--- waiting N gamers --- 
			for (int i=0; i<GAMERS_TO_WAIT +1 /*youself*/; i++) {
				if  (Socket.Wait2(COMMAND_HABITAT_INIT_WAIT_NSTART, COMMAND_HABITAT_INIT_WAIT_START) == -1 )
					if (i>1) break;
				if (i>0) printf("~Info: + one gamer, #%d.\n", i);	
			}
			//==== waiting N gamers ===

	Socket.SendCommand(COMMAND_HABITAT_INIT_START);
		
}

// --- CHabitat :: Init --- //
void CHabitat :: Init(char *host, int portno, char *gamer_name)
{ 
	Socket.ConnectTo(host,portno);
		printf("~Info: Connection done.\n");
	Socket.SendCommand(gamer_name);
	strcpy(Data.gamer_name, gamer_name);
		printf("~Info: The name is %s.\n", Data.gamer_name);
	Socket.SendCommand("Hi!\0");
		
		//-------------------------------------
		Socket.SendCommand(COMMAND_HABITAT_INIT_WHO);
		Data.game_number = Socket.ReadAfterWait2_Int(COMMAND_HABITAT_INIT_WAITING);
		
		if (Socket.error.get_number() == ERROR_SOCKET_QUIET_NOT_FIND_S) {
			// Create a new game	
			Data.game_number = -1;
				printf("~Info: %s creating a game...\n", Data.gamer_name);
			NewGame();
		}
		else {	
			// Join to the game
				printf("~Info: %s finding a game...\n", Data.gamer_name);
			Socket.SendCommandWithInt(COMMAND_HABITAT_INIT_JOIN, Data.game_number);
				printf("~Info: %s join to #%d game.\n", Data.gamer_name, Data.game_number);
			}
		//=====================================

	Socket.Wait(COMMAND_HABITAT_INIT_STARTJOIN);
		printf("~Info: The game is started.\n\n");
};


void CHabitat :: Destroy()
{
	Socket.CloseHost();
		printf("\n~Info: Closed connection.\n");
};


CData* CHabitat :: GetDataAddr()
{
	return &Data;
}


CSocket* CHabitat :: GetSocketAddr()
{
	return &Socket;
}


void CHabitat :: Analyze()
{
	
};
