/*
* 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 : OIMMPLAY.H
// Description : header file of MultiPlayerIm (I'Magic Multiplayer SDK)
// Owner : Gilbert
#ifndef __OIMMPLAY_H
#define __OIMMPLAY_H
#ifdef IMAGICMP
#include
#include
extern GUID GAME_GUID;
extern char *GAME_GUID_STR;
#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 IMServiceProvider : public IMMSERVICEINFO
{
IMServiceProvider(const IMMSERVICEINFO &);
char *name_str();
DWORD service_id() { return dwServiceID; }
char *name_str_long();
};
struct IMSessionDesc : public IMMSESSIONINFO
{
IMSessionDesc() {}
IMSessionDesc(const IMMSESSIONINFO &);
void after_copy() {}
IMSessionDesc *before_use() { return this; }
char *name_str() { return szSessionName; };
DWORD session_id() { return dwSessionID; }
};
struct IMPlayer : public IMMPLAYERINFO
{
char connecting; // initially set to 1,
// clear after disconnect
IMPlayer(const IMMPLAYERINFO &);
IMMPID pid() { return imID; }
char *friendly_name_str() { return szFriendly; }
char *formal_name_str() { return szFormal; }
};
class MultiPlayerIM
{
public:
int init_flag;
DynArrayB service_providers; // array of IMServiceProvider
DynArrayB current_sessions; // array of IMSessionDesc
PCIMMID imm_ptr;
IMSessionDesc joined_session;
char skipped_session; // create/join session during create player
char lobbied_flag;
int use_receive_thread;
IMMPID my_player_id;
int host_flag;
DynArrayB player_pool; // array of IMPlayer
char * recv_buffer;
DWORD recv_buffer_size;
public:
MultiPlayerIM();
~MultiPlayerIM();
void pre_init();
void init(DWORD serviceProvideCode);
void deinit();
// ------- functions on lobby ----------//
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; } // not available
// ------- functions on service provider ------ //
void poll_service_providers(); // can be called before init
IMServiceProvider *get_service_provider(int i); // can be called before init
// ------- functions on session --------//
int poll_sessions();
void sort_sessions(int sortType);
IMSessionDesc *get_session(int i);
int create_session(char *sessionName, int maxPlayers);
int join_session(IMSessionDesc* 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( IMMPID playerId );
void poll_players();
IMPlayer *get_player(int i);
IMPlayer *search_player(IMMPID playerId);
IMPlayer *search_player(char *name);
int is_host(IMMPID playerId);
int am_I_host();
int is_player_connecting(IMMPID playerId);
// ------- functions on message passing ------//
int send(IMMPID toId, LPVOID lpData, DWORD dataSize);
void begin_stream(IMMPID toID);
int send_stream(IMMPID toId, LPVOID lpData, DWORD dataSize);
void end_stream(IMMPID toID);
int get_msg_count();
char *receive(IMMPID *from, IMMPID *to, LPDWORD recvLen, int *sysMsgCount=0);
void before_receive(); // call before receive
void after_send(); // call after send
protected:
void handle_system_msg(LPVOID, DWORD );
// void handle_lobby_system_msg(LPVOID, DWORD);
};
extern MultiPlayerIM mp_im;
#include
#endif // IMAGICMP
#endif // __OIMMPLAY_H