#ifndef _NETWORK_H_
 
#define _NETWORK_H_
 
 
 
#include "dr_types.h"
 
extern tU32 gMess_max_flags;
 
extern tU32 gMess_mid_flags;
 
extern tU32 gMess_min_flags;
 
extern tU32 gGuarantee_number;
 
extern int gNet_service_disable;
 
extern int gIn_net_service;
 
extern int gPlayer_list_batch_number;
 
extern int gOnly_receive_guarantee_replies;
 
extern void* gMessage_to_free;
 
extern tNet_message* gBroadcast_stack;
 
extern tNet_message* gTo_host_stack;
 
extern tU32 gLast_flush_message;
 
extern int gRace_only_flags[33];
 
extern int gJoin_list_mode;
 
extern tNet_game_player_info gNew_net_players[6];
 
extern tGuaranteed_message gGuarantee_list[100];
 
extern tMid_message* gMid_messages;
 
extern tU32 gLast_player_list_received;
 
extern tMin_message* gMin_messages;
 
extern void (*gAdd_proc)(tNet_game_details*);
 
extern int gReceiving_batch_number;
 
extern int gReceiving_new_players;
 
extern tMax_message* gMax_messages;
 
extern int gNext_guarantee;
 
extern tU32 gAsk_time;
 
extern int gNet_initialised;
 
extern int gDont_allow_joiners;
 
extern tNet_game_details* gCurrent_join_poll_game;
 
extern int gMessage_header_size;
 
extern int gJoin_poll_index;
 
extern int gJoin_request_denied;
 
extern int gHost_died;
 
extern int gCar_was_taken;
 
extern int gBastard_has_answered;
 
extern int gTime_for_next_one;
 
extern int gReceived_game_scores;
 
 
 
int NetInitialise(void);
 
 
 
int NetShutdown(void);
 
 
 
void ShutdownNetIfRequired(void);
 
 
 
void DisableNetService(void);
 
 
 
void ReenableNetService(void);
 
 
 
int PermitNetServiceReentrancy(void);
 
 
 
void HaltNetServiceReentrancy(void);
 
 
 
void NetSendHeadupToAllPlayers(char* pMessage);
 
 
 
void NetSendHeadupToEverybody(char* pMessage);
 
 
 
void NetSendHeadupToPlayer(char* pMessage, tPlayer_ID pPlayer);
 
 
 
void InitialisePlayerStati(void);
 
 
 
void LeaveTempGame(void);
 
 
 
void DisposeCurrentJoinPollGame(void);
 
 
 
void DoNextJoinPoll(void);
 
 
 
void NetStartProducingJoinList(void (*pAdd_proc)(tNet_game_details*));
 
 
 
void NetEndJoinList(void);
 
 
 
void NetDisposePIDGameInfo(tNet_game_details* pDetails);
 
 
 
void NetDisposeGameDetails(tNet_game_details* pDetails);
 
 
 
tNet_game_details* NetAllocatePIDGameDetails(void);
 
 
 
void NetLeaveGameLowLevel(tNet_game_details* pDetails);
 
 
 
void NetLeaveGame(tNet_game_details* pNet_game);
 
 
 
void NetSetPlayerSystemInfo(tNet_game_player_info* pPlayer, void* pSender_address);
 
 
 
void NetDisposePlayer(tNet_game_player_info* pPlayer);
 
 
 
void FillInThisPlayer(tNet_game_details* pGame, tNet_game_player_info* pPlayer, int pCar_index, int pHost);
 
 
 
void LoadCarN(int pIndex, tNet_game_player_info* pPlayer);
 
 
 
void DisposeCarN(int pIndex);
 
 
 
void PlayerHasLeft(int pIndex);
 
 
 
void NetPlayersChanged(int pNew_count, tNet_game_player_info* pNew_players);
 
 
 
tNet_game_details* NetHostGame(tNet_game_type pGame_type, tNet_game_options* pOptions, int pStart_rank, char* pHost_name, int pCar_index);
 
 
 
int NetInitClient(tNet_game_details* pDetails);
 
 
 
int NetJoinGameLowLevel(tNet_game_details* pDetails, char* pPlayer_name);
 
 
 
int NetJoinGame(tNet_game_details* pDetails, char* pPlayer_name, int pCar_index);
 
 
 
void NetObtainSystemUserName(char* pName, int pMax_length);
 
 
 
tU32 NetExtractGameID(tNet_game_details* pDetails);
 
 
 
tPlayer_ID NetExtractPlayerID(tNet_game_details* pDetails);
 
 
 
int NetSendMessageToAddress(tNet_game_details* pDetails, tNet_message* pMessage, void* pAddress);
 
 
 
int NetSendMessageToPlayer(tNet_game_details* pDetails, tNet_message* pMessage, tPlayer_ID pPlayer);
 
 
 
int NetSendMessageToHost(tNet_game_details* pDetails, tNet_message* pMessage);
 
 
 
int NetReplyToMessage(tNet_game_details* pDetails, tNet_message* pIncoming_message, tNet_message* pReply_message);
 
 
 
int NetSendMessageToAllPlayers(tNet_game_details* pDetails, tNet_message* pMessage);
 
 
 
tU32 NetGetContentsSize(tNet_message_type pType, tS32 pSize_decider);
 
 
 
tU32 NetGetMessageSize(tNet_message_type pType, tS32 pSize_decider);
 
 
 
tS32 NetCalcSizeDecider(tNet_contents* pContents);
 
 
 
tNet_message* NetBuildMessage(tNet_message_type pType, tS32 pSize_decider);
 
 
 
tNet_contents* NetGetToHostContents(tNet_message_type pType, tS32 pSize_decider);
 
 
 
tNet_contents* NetGetBroadcastContents(tNet_message_type pType, tS32 pSize_decider);
 
 
 
void NetSendMessageStacks(void);
 
 
 
tNet_message* NetAllocateMessage(int pSize);
 
 
 
void NetFreeExcessMemory(void);
 
 
 
int NetDisposeMessage(tNet_game_details* pDetails, tNet_message* pMessage);
 
 
 
tNet_message* NetGetNextMessage(tNet_game_details* pDetails, void** pSender_address);
 
 
 
void ReceivedSendMeDetails(tNet_contents* pContents, void* pSender_address);
 
 
 
void ReceivedDetails(tNet_contents* pContents);
 
 
 
void SendOutPlayerList(void);
 
 
 
void ReceivedJoin(tNet_contents* pContents, void* pSender_address);
 
 
 
void KickPlayerOut(tPlayer_ID pID);
 
 
 
void ReceivedLeave(tNet_contents* pContents, tNet_message* pMessage);
 
 
 
void NetFullScreenMessage(int pStr_index, int pLeave_it_up_there);
 
 
 
void HostHasBittenTheDust(int pMessage_index);
 
 
 
void ReceivedHosticide(tNet_contents* pContents);
 
 
 
void ConfirmReceipt(void);
 
 
 
void ReceivedNewPlayerList(tNet_contents* pContents, tNet_message* pM);
 
 
 
void ReceivedRaceOver(tNet_contents* pContents);
 
 
 
void ReceivedStatusReport(tNet_contents* pContents, tNet_message* pMessage);
 
 
 
void ReceivedStartRace(tNet_contents* pContents);
 
 
 
void ReceivedGuaranteeReply(tNet_contents* pContents);
 
 
 
void ReceivedHeadup(tNet_contents* pContents);
 
 
 
void ReceivedHostQuery(tNet_contents* pContents, tNet_message* pMessage);
 
 
 
void ReceivedHostReply(tNet_contents* pContents);
 
 
 
void SendGuaranteeReply(tNet_message* pMessage, void* pSender_address);
 
 
 
int PlayerIsInList(tPlayer_ID pID);
 
 
 
void ReceivedTimeSync(tNet_contents* pContents, tNet_message* pMessage, tU32 pReceive_time);
 
 
 
void ReceivedConfirm(tNet_contents* pContents);
 
 
 
void ReceivedDisableCar(tNet_contents* pContents);
 
 
 
void ReceivedEnableCar(tNet_contents* pContents);
 
 
 
void ReceivedScores(tNet_contents* pContents);
 
 
 
void ReceivedWasted(tNet_contents* pContents);
 
 
 
void ReceivedCarDetailsReq(tNet_contents* pContents, void* pSender_address);
 
 
 
void ReceivedCarDetails(tNet_contents* pContents);
 
 
 
void ReceivedGameScores(tNet_contents* pContents);
 
 
 
void ReceivedMessage(tNet_message* pMessage, void* pSender_address, tU32 pReceive_time);
 
 
 
void NetReceiveAndProcessMessages(void);
 
 
 
void BroadcastStatus(void);
 
 
 
void CheckForDisappearees(void);
 
 
 
void CheckForPendingStartRace(void);
 
 
 
void NetService(int pIn_race);
 
 
 
void NetFinishRace(tNet_game_details* pDetails, tRace_over_reason pReason);
 
 
 
void NetPlayerStatusChanged(tPlayer_status pNew_status);
 
 
 
tPlayer_status NetGetPlayerStatus(void);
 
 
 
int NetGuaranteedSendMessageToAllPlayers(tNet_game_details* pDetails, tNet_message* pMessage, int (*pNotifyFail)(tU32, tNet_message*));
 
 
 
int NetGuaranteedSendMessageToEverybody(tNet_game_details* pDetails, tNet_message* pMessage, int (*pNotifyFail)(tU32, tNet_message*));
 
 
 
int NetGuaranteedSendMessageToHost(tNet_game_details* pDetails, tNet_message* pMessage, int (*pNotifyFail)(tU32, tNet_message*));
 
 
 
int NetGuaranteedSendMessageToPlayer(tNet_game_details* pDetails, tNet_message* pMessage, tPlayer_ID pPlayer, int (*pNotifyFail)(tU32, tNet_message*));
 
 
 
int NetGuaranteedSendMessageToAddress(tNet_game_details* pDetails, tNet_message* pMessage, void* pAddress, int (*pNotifyFail)(tU32, tNet_message*));
 
 
 
void ResendGuaranteedMessages(void);
 
 
 
int SampleFailNotifier(tU32 pAge, tNet_message* pMessage);
 
 
 
void NetWaitForGuaranteeReplies(void);
 
 
 
tNet_game_player_info* NetPlayerFromID(tPlayer_ID pPlayer);
 
 
 
tCar_spec* NetCarFromPlayerID(tPlayer_ID pPlayer);
 
 
 
tNet_game_player_info* NetPlayerFromCar(tCar_spec* pCar);
 
 
 
tU32 DoCheckSum(tNet_message* pMessage);
 
 
 
void GetCheckSum(tNet_message* pMessage);
 
 
 
void CheckCheckSum(tNet_message* pMessage);
 
 
 
#endif