/* * Seven Kingdoms: Ancient Adversaries * * Copyright 1997,1998 Enlight Software Ltd. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ // Filename : ODPLAY.H // Description : Header file of MultiPlayerDP (DirectPlay) // Owner : Gilbert #ifndef __ODPLAY_H #define __ODPLAY_H #ifndef IMAGICMP #include #include #include extern GUID GAME_GUID; extern HANDLE PLAYER_MESSAGE_HANDLE; #define MP_SERVICE_PROVIDER_NAME_LEN 64 #define MP_SESSION_NAME_LEN 64 #define MP_PASSWORD_LEN 32 #define MP_FRIENDLY_NAME_LEN 20 #define MP_FORMAL_NAME_LEN 64 #define MP_RECV_BUFFER_SIZE 0x2000 struct DPServiceProvider { GUID guid; char description[MP_SERVICE_PROVIDER_NAME_LEN+1]; char *name_str() { return description; } GUID service_id() { return guid; } }; struct DPSessionDesc : public DPSESSIONDESC2 { char session_name[MP_SESSION_NAME_LEN+1]; char pass_word[MP_SESSION_NAME_LEN+1]; DPSessionDesc(); DPSessionDesc(const DPSESSIONDESC2 &); DPSessionDesc(const DPSessionDesc &); DPSessionDesc& operator= (const DPSessionDesc &); void after_copy(); DPSessionDesc *before_use(); char *name_str() { return session_name; }; GUID session_id() { return guidInstance; } }; struct DPPlayer { DPID player_id; char friendly_name[MP_FRIENDLY_NAME_LEN+1]; char formal_name[MP_FORMAL_NAME_LEN+1]; char connecting; // initially set to 1, // clear after DPSYS_DESTROYPLAYERORGROUP received from DirectPlay DPID pid() { return player_id; } char *friendly_name_str() { return friendly_name; } char *formal_name_str() { return formal_name; } }; class MultiPlayerDP { public: int init_flag; int lobbied_flag; DynArrayB service_providers; // array of DPServiceProvider DynArrayB current_sessions; // array of DPSessionDesc LPDIRECTPLAY direct_play1; LPDIRECTPLAY3A direct_play3; LPDIRECTPLAYLOBBY2A direct_play_lobby; DPSessionDesc joined_session; DPLCONNECTION * connection_string; // only when lobbied DPID my_player_id; int host_flag; DynArrayB player_pool; char * recv_buffer; DWORD recv_buffer_size; public: MultiPlayerDP(); ~MultiPlayerDP(); void pre_init(); void init(GUID serviceProviderGuid); void deinit(); // ------- functions on DirectPlayLobby -------- // void init_lobbied(int maxPlayers, char *cmdLine); int is_lobbied(); // return 0=not lobbied, 1=auto create, 2=auto join, 4=selectable char *get_lobbied_name(); // return 0 if not available int send_lobby(LPVOID lpData, DWORD dataSize); char *receive_lobby(LPDWORD recvLen); // ------- functions on service provider ------ // void poll_service_providers(); // can be called before init DPServiceProvider *get_service_provider(int i); // can be called before init // ------- functions on session --------// int poll_sessions(); void sort_sessions(int sortType); DPSessionDesc *get_session(int i); int create_session(char *sessionName, int maxPlayers); int join_session(DPSessionDesc* sessionDesc); int join_session(int currentSessionIndex ); void close_session(); void disable_join_session(); // so that new player cannot join // -------- functions on player management -------// int create_player(char *friendlyName, char *formalName, LPVOID lpData=NULL, DWORD dataSize=0, DWORD flags=0); void destroy_player( DPID playerId ); void poll_players(); DPPlayer *get_player(int i); DPPlayer *search_player(DPID player_id); DPPlayer *search_player(char *name); int is_host(DPID playerId); int am_I_host(); int is_player_connecting(DPID playerId); // ------- functions on data management ------// // remote data (public) : each player has one data to the public int update_public_data(DPID, LPVOID, DWORD ); int retrieve_public_data(DPID, LPVOID, LPDWORD); // local data (private) : each player keeps a data on each other player int update_private_data(DPID, LPVOID, DWORD); int retrieve_private_data(DPID, LPVOID, LPDWORD); // ------- functions on message passing ------// int send(DPID toId, LPVOID lpData, DWORD dataSize); void begin_stream(DPID toID); int send_stream(DPID toId, LPVOID lpData, DWORD dataSize); void end_stream(DPID toID); int get_msg_count(); char *receive(LPDPID from, LPDPID to, LPDWORD recvLen, int *sysMsgCount=0); void before_receive() {} // dummy function to compatible with IMMPLAY, call before receive void after_send() {} // dummy function to compatible with IMMPLAY, call after send protected: void handle_system_msg(LPVOID, DWORD ); void handle_lobby_system_msg(LPVOID, DWORD); }; extern MultiPlayerDP mp_dp; #include #endif // IMAGICMP #endif // __ODPLAY_H