2007-01-15 12:09:25 -08:00
/*
This file is part of Warzone 2100.
Copyright ( C ) 1999 - 2004 Eidos Interactive
Copyright ( C ) 2005 - 2007 Warzone Resurrection Project
Warzone 2100 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 .
Warzone 2100 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 Warzone 2100 ; if not , write to the Free Software
Foundation , Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 USA
*/
2007-06-28 10:47:08 -07:00
/*
* Multiplay . h
*
* Alex Lee 1997 / 98 , Pumpkin Studios , Bath .
*/
2007-06-24 14:51:29 -07:00
# ifndef _multiplay_h
# define _multiplay_h
2007-06-28 10:47:08 -07:00
# include "group.h"
2006-09-13 02:09:05 -07:00
// Different Message Structures allowed to be sent between players.
2007-06-28 10:47:08 -07:00
// Each message must have type = to one of these.
typedef enum _msgtype
{
NET_DROID , //0 a new droid
NET_DROIDINFO , //1 update a droid order.
NET_DROIDDEST , //2 issue a droid destruction
NET_DROIDMOVE , //3 move a droid, don't change anything else though..
NET_GROUPORDER , //4 order a group of droids.
NET_TEMPLATE , //5 a new template
NET_TEMPLATEDEST , //6 remove template
NET_FEATUREDEST , //7 destroy a game feature.
NET_PING , //8 ping players.
NET_CHECK_DROID , //9 check & update bot position and damage.
NET_CHECK_STRUCT , //10 check & update struct damage.
NET_CHECK_POWER , //11 power levels for a player.
2008-02-02 07:04:08 -08:00
__DEPRECATED__NET_VERSION__ , //12 was VERSION data; is unused now; but some code depends on this enum having these numbers (BAD!!!)
2007-06-28 10:47:08 -07:00
NET_BUILD , //13 build a new structure
NET_STRUCTDEST , //14 specify a strucutre to destroy
NET_BUILDFINISHED , //15 a building is complete.
NET_RESEARCH , //16 Research has been completed.
NET_TEXTMSG , //17 A simple text message between machines.
NET_LEAVING , //18 A player is leaving, (nicely)
NET_REQUESTDROID , //19 a message has been recvd for an unknown droid, request the droid to resolve issues.
// JOINING TYPES. these msgs are used when a player joins a game in progress.
NET_PLAYERCOMPLETE , //20 All Setup information about player x has been sent
2008-02-02 07:13:34 -08:00
__DEPRECATED__NET_REQUESTPLAYER__ , //21 NOTUSED please send me info about a player; is unused now; but some code depends on this enum having these numbers (BAD!!!)
2007-06-28 10:47:08 -07:00
NET_STRUCT , //22 a complete structure
NET_WHOLEDROID , //23 a complete droid
2006-09-13 02:09:05 -07:00
NET_FEATURES , //24 information regarding features.
2007-06-28 10:47:08 -07:00
NET_PLAYERRESPONDING , //25 computer that sent this is now playing warzone!
// RECENT TYPES
NET_OPTIONS , //26 welcome a player to a game.
NET_KICK , //27 kick a player .
NET_SECONDARY , //28 set a droids secondary order
NET_FIREUP , //29 campaign game has started, we can go too.. Shortcut message, not to be used in dmatch.
NET_ALLIANCE , //30 alliance data.
NET_GIFT , //31 a luvly gift between players.
NET_DEMOLISH , //32 a demolish is complete.
NET_COLOURREQUEST , //33 player requests a colour change.
NET_ARTIFACTS , //34 artifacts randomly placed.
NET_DMATCHWIN , //35 winner of a deathmatch. NOTUSED
NET_SCORESUBMIT , //36 submission of scores to host.
NET_DESTROYXTRA , //37 destroy droid with destroyer intact.
NET_VTOL , //38 vtol rearmed
2007-07-15 06:08:59 -07:00
NET_UNUSED_39 , //39 unused
2007-06-28 10:47:08 -07:00
NET_WHITEBOARD , //40 whiteboard.
NET_SECONDARY_ALL , //41 complete secondary order.
NET_DROIDEMBARK , //42 droid embarked on a Transporter
NET_DROIDDISEMBARK , //43 droid disembarked from a Transporter
NET_RESEARCHSTATUS , //44 105, research state.
NET_LASSAT , //45 107, lassat firing.
2006-08-20 07:48:14 -07:00
NET_REQUESTMAP , //46 107 dont have map, please send it.
NET_AITEXTMSG , //chat between AIs
NET_TEAMS_ON ,
NET_BEACONMSG ,
2006-09-26 11:14:05 -07:00
NET_SET_TEAMS ,
NET_TEAMREQUEST
2007-06-28 10:47:08 -07:00
} MESSAGE_TYPES ;
// /////////////////////////////////////////////////////////////////////////////////////////////////
// Game Options Structure. Enough info to completely describe the static stuff in amultiplay game.
typedef struct {
2007-08-18 14:37:37 -07:00
uint8_t type ; // DMATCH/CAMPAIGN/SKIRMISH/TEAMPLAY etc...
2006-11-03 13:35:50 -08:00
char map [ 128 ] ; // name of multiplayer map being used.
2006-08-12 09:52:37 -07:00
char version [ 8 ] ; // version of warzone
2007-08-18 14:37:37 -07:00
uint8_t maxPlayers ; // max players to allow
2006-11-03 13:35:50 -08:00
char name [ 128 ] ; // game name (to be used)
2007-06-28 10:47:08 -07:00
BOOL fog ;
2007-08-18 14:37:37 -07:00
uint32_t power ; // power level for arena game
uint8_t base ; // clean/base/base&defence
uint8_t alliance ; // no/yes/AIs vs Humans
uint8_t limit ; // limit no/time/frag
uint8_t skDiff [ MAX_PLAYERS ] ; // skirmish game difficulty settings.
2007-06-28 10:47:08 -07:00
} MULTIPLAYERGAME , * LPMULTIPLAYERGAME ;
2008-01-04 04:59:42 -08:00
typedef struct
{
UBYTE id ;
UBYTE limit ;
} MULTISTRUCTLIMITS ;
2007-06-28 10:47:08 -07:00
// info used inside games.
typedef struct {
2008-01-04 04:59:42 -08:00
UDWORD PingTimes [ MAX_PLAYERS ] ; // store for pings.
BOOL localOptionsReceived ; // used to show if we have game options yet..
BOOL localJoiningInProgress ; // used before we know our player number.
BOOL JoiningInProgress [ MAX_PLAYERS ] ;
BOOL bHostSetup ;
UDWORD startTime ;
UDWORD modem ; // modem to use.
UDWORD numStructureLimits ; // number of limits
MULTISTRUCTLIMITS * pStructureLimits ; // limits chunk.
2007-06-28 10:47:08 -07:00
UDWORD skScores [ MAX_PLAYERS ] [ 2 ] ; // score+kills for local skirmish players.
2006-11-03 17:11:26 -08:00
char phrases [ 5 ] [ 255 ] ; // 5 favourite text messages.
2007-06-28 10:47:08 -07:00
} MULTIPLAYERINGAME , * LPMULTIPLAYERINGAME ;
// ////////////////////////////////////////////////////////////////////////////
2006-09-13 02:09:05 -07:00
// Game Options and stats.
2007-06-28 10:47:08 -07:00
extern MULTIPLAYERGAME game ; // the game description.
extern MULTIPLAYERINGAME ingame ; // the game description.
extern BOOL bMultiPlayer ; // true when more than 1 player.
extern UDWORD selectedPlayer ;
2006-11-04 15:16:51 -08:00
extern SDWORD player2dpid [ MAX_PLAYERS ] ; // note this is of type DPID, not DWORD
2007-06-28 10:47:08 -07:00
extern BOOL openchannels [ MAX_PLAYERS ] ;
extern UBYTE bDisplayMultiJoiningStatus ; // draw load progress?
// ////////////////////////////////////////////////////////////////////////////
// defines
2007-12-31 03:07:07 -08:00
// Max bit-rate, set for a 28.8KB/s modem (we have hardcore fans!)
2007-06-28 10:47:08 -07:00
2007-12-31 03:07:07 -08:00
# define MAX_BYTESPERSEC 3400
2007-06-28 10:47:08 -07:00
# define ANYPLAYER 99
# define ONEPLAYER 98
//#define DMATCH 11 // to easily distinguish game types when joining.
# define CAMPAIGN 12
2007-07-21 08:39:00 -07:00
//#define TEAMPLAY 13
2007-06-28 10:47:08 -07:00
# define SKIRMISH 14
# define MULTI_SKIRMISH2 18
# define MULTI_SKIRMISH3 19
//#define MULTI_SKIRMISHA 20
# define MULTI_CAMPAIGN2 15
# define MULTI_CAMPAIGN3 16
//#define MULTI_CAMPAIGNA 17
# define NOLIMIT 0 // limit options for dmatch.
# define FRAGLIMIT 1
# define TIMELIMIT 2
# define CAMP_CLEAN 0 // campaign subtypes
# define CAMP_BASE 1
# define CAMP_WALLS 2
# define FORCEEDITPLAYER 0
# define DEATHMATCHTEMPLATES 4 // game templates are stored in player x.
# define CAMPAIGNTEMPLATES 5
# define PING_LO 0 // this ping is kickin'.
# define PING_MED 600 // this ping is crusin'.
# define PING_HI 1200 // this ping is crawlin'.
# define PING_LIMIT 2000 // if ping is bigger than this, then worry and panic.
# define LEV_LOW 100 // how many points to allocate for res levels???
# define LEV_MED 400
# define LEV_HI 700
2007-05-28 07:58:31 -07:00
# define DIFF_SLIDER_STOPS 20 //max number of stops for the multiplayer difficulty slider
2007-06-28 10:47:08 -07:00
// functions
2007-12-30 16:20:37 -08:00
extern WZ_DECL_WARN_UNUSED_RESULT BASE_OBJECT * IdToPointer ( UDWORD id , UDWORD player ) ;
extern WZ_DECL_WARN_UNUSED_RESULT STRUCTURE * IdToStruct ( UDWORD id , UDWORD player ) ;
extern WZ_DECL_WARN_UNUSED_RESULT BOOL IdToDroid ( UDWORD id , UDWORD player , DROID * * psDroid ) ;
extern WZ_DECL_WARN_UNUSED_RESULT FEATURE * IdToFeature ( UDWORD id , UDWORD player ) ;
extern WZ_DECL_WARN_UNUSED_RESULT DROID_TEMPLATE * IdToTemplate ( UDWORD tempId , UDWORD player ) ;
extern WZ_DECL_WARN_UNUSED_RESULT DROID_TEMPLATE * NameToTemplate ( const char * sName , UDWORD player ) ;
2007-06-28 10:47:08 -07:00
2006-11-03 13:35:50 -08:00
extern char * getPlayerName ( UDWORD player ) ;
2007-03-16 13:26:40 -07:00
extern BOOL setPlayerName ( UDWORD player , const char * sName ) ;
2006-11-03 13:35:50 -08:00
extern char * getPlayerColourName ( SDWORD player ) ;
2007-06-28 10:47:08 -07:00
extern BOOL isHumanPlayer ( UDWORD player ) ; //to tell if the player is a computer or not.
extern BOOL myResponsibility ( UDWORD player ) ;
extern BOOL responsibleFor ( UDWORD player , UDWORD playerinquestion ) ;
extern UDWORD whosResponsible ( UDWORD player ) ;
2007-03-16 09:20:16 -07:00
extern Vector3i cameraToHome ( UDWORD player , BOOL scroll ) ;
2006-09-30 16:09:12 -07:00
extern SDWORD dpidToPlayer ( SDWORD dpid ) ;
extern char playerName [ MAX_PLAYERS ] [ MAX_NAME_SIZE ] ; //Array to store all player names (humans and AIs)
2007-06-28 10:47:08 -07:00
2006-09-13 02:09:05 -07:00
extern BOOL multiPlayerLoop ( void ) ; // for loop.c
2007-06-28 10:47:08 -07:00
2006-09-13 02:09:05 -07:00
extern BOOL recvMessage ( void ) ;
extern BOOL sendTemplate ( DROID_TEMPLATE * t ) ;
2007-06-28 10:47:08 -07:00
extern BOOL SendDestroyTemplate ( DROID_TEMPLATE * t ) ;
extern BOOL SendResearch ( UBYTE player , UDWORD index ) ;
2006-09-13 02:09:05 -07:00
extern BOOL SendDestroyFeature ( FEATURE * pF ) ; // send a destruct feature message.
2006-11-23 05:28:38 -08:00
extern BOOL sendTextMessage ( const char * pStr , BOOL cast ) ; // send a text message
2008-01-11 12:17:39 -08:00
extern BOOL sendAIMessage ( char * pStr , UDWORD player , UDWORD to ) ; //send AI message
2007-06-28 10:47:08 -07:00
extern BOOL turnOffMultiMsg ( BOOL bDoit ) ;
extern UBYTE sendMap ( void ) ;
extern BOOL multiplayerWinSequence ( BOOL firstCall ) ;
/////////////////////////////////////////////////////////
// definitions of functions in multiplay's other c files.
// Buildings . multistruct
2007-12-24 06:47:44 -08:00
extern BOOL sendBuildStarted ( STRUCTURE * psStruct , DROID * psDroid ) ;
2007-12-24 07:15:10 -08:00
extern BOOL SendDestroyStructure ( STRUCTURE * s ) ;
2007-12-24 06:57:58 -08:00
extern BOOL SendBuildFinished ( STRUCTURE * psStruct ) ;
2007-12-24 06:41:25 -08:00
extern BOOL sendLasSat ( UBYTE player , STRUCTURE * psStruct , BASE_OBJECT * psObj ) ;
2007-06-28 10:47:08 -07:00
// droids . multibot
2007-12-30 08:59:20 -08:00
extern BOOL SendDroid ( const DROID_TEMPLATE * pTemplate , uint32_t x , uint32_t y , uint8_t player , uint32_t id ) ;
2007-12-30 08:57:14 -08:00
extern BOOL SendDestroyDroid ( const DROID * psDroid ) ;
2006-09-13 02:09:05 -07:00
extern BOOL SendDemolishFinished ( STRUCTURE * psS , DROID * psD ) ;
2007-12-30 09:05:15 -08:00
extern BOOL SendDroidInfo ( const DROID * psDroid , DROID_ORDER order , uint32_t x , uint32_t y , const BASE_OBJECT * psObj ) ;
2007-12-30 09:07:11 -08:00
extern BOOL SendDroidMove ( const DROID * psDroid , uint32_t x , uint32_t y , BOOL formation ) ;
2007-12-30 09:11:39 -08:00
extern BOOL SendGroupOrderSelected ( uint8_t player , uint32_t x , uint32_t y , const BASE_OBJECT * psObj ) ;
2007-06-28 10:47:08 -07:00
extern BOOL SendCmdGroup ( DROID_GROUP * psGroup , UWORD x , UWORD y , BASE_OBJECT * psObj ) ;
2007-12-30 09:11:39 -08:00
extern BOOL SendGroupOrderGroup ( const DROID_GROUP * psGroup , DROID_ORDER order , uint32_t x , uint32_t y , const BASE_OBJECT * psObj ) ;
2007-06-28 10:47:08 -07:00
2007-12-30 09:08:13 -08:00
extern BOOL sendDroidSecondary ( const DROID * psDroid , SECONDARY_ORDER sec , SECONDARY_STATE state ) ;
2007-12-30 09:10:01 -08:00
extern BOOL sendDroidSecondaryAll ( const DROID * psDroid ) ;
2007-12-30 09:02:53 -08:00
extern BOOL sendDroidEmbark ( const DROID * psDroid ) ;
2007-12-30 09:01:17 -08:00
extern BOOL sendDroidDisEmbark ( const DROID * psDroid ) ;
2007-12-30 09:13:23 -08:00
extern BOOL sendHappyVtol ( const DROID * psDroid ) ;
2007-06-28 10:47:08 -07:00
// Startup. mulitopt
2006-09-13 02:09:05 -07:00
extern BOOL multiTemplateSetup ( void ) ;
extern BOOL multiInitialise ( void ) ; // for Init.c
extern BOOL lobbyInitialise ( void ) ; // for Init.c
extern BOOL multiShutdown ( void ) ;
extern BOOL sendLeavingMsg ( void ) ;
2007-06-28 10:47:08 -07:00
2006-11-03 13:35:50 -08:00
extern BOOL hostCampaign ( char * sGame , char * sPlayer ) ;
extern BOOL joinCampaign ( UDWORD gameNumber , char * playername ) ;
//extern BOOL hostArena (char *sGame, char *sPlayer);
//extern BOOL joinArena (UDWORD gameNumber, char *playername);
2006-09-13 02:09:05 -07:00
extern void playerResponding ( void ) ;
extern BOOL multiGameInit ( void ) ;
extern BOOL multiGameShutdown ( void ) ;
2007-06-28 10:47:08 -07:00
extern BOOL copyTemplateSet ( UDWORD from , UDWORD to ) ;
extern BOOL addTemplateSet ( UDWORD from , UDWORD to ) ;
extern BOOL addTemplate ( UDWORD player , DROID_TEMPLATE * psNew ) ;
// syncing.
2006-09-13 02:09:05 -07:00
extern BOOL sendCheck ( void ) ; //send/recv check info
extern BOOL sendScoreCheck ( void ) ; //score check only(frontend)
extern BOOL sendPing ( void ) ; // allow game to request pings.
2007-06-28 10:47:08 -07:00
// multijoin
2006-09-13 02:09:05 -07:00
extern void modifyResources ( POWER_GEN_FUNCTION * psFunction ) ;
2007-06-28 10:47:08 -07:00
extern BOOL sendReseachStatus ( STRUCTURE * psBuilding , UDWORD index , UBYTE player , BOOL bStart ) ;
2006-08-20 07:48:14 -07:00
2006-11-03 13:35:50 -08:00
extern void displayAIMessage ( char * pStr , SDWORD from , SDWORD to ) ; //make AI process a message
2006-08-20 07:48:14 -07:00
/* for multiplayer message stack */
2006-10-03 19:54:24 -07:00
extern UDWORD msgStackPush ( SDWORD CBtype , SDWORD plFrom , SDWORD plTo , const char * tStr , SDWORD x , SDWORD y , DROID * psDroid ) ;
2006-09-13 05:58:32 -07:00
extern BOOL isMsgStackEmpty ( void ) ;
2006-08-26 08:50:47 -07:00
extern BOOL msgStackGetFrom ( SDWORD * psVal ) ;
extern BOOL msgStackGetTo ( SDWORD * psVal ) ;
2006-11-03 13:35:50 -08:00
extern BOOL msgStackGetMsg ( char * psVal ) ;
2006-09-13 05:58:32 -07:00
extern BOOL msgStackPop ( void ) ;
extern SDWORD msgStackGetCount ( void ) ;
2006-08-26 08:50:47 -07:00
extern void msgStackReset ( void ) ;
2006-10-03 19:54:24 -07:00
extern BOOL msgStackGetDroid ( DROID * * ppsDroid ) ;
2006-08-26 08:50:47 -07:00
2008-01-09 15:50:44 -08:00
extern BOOL sendBeacon ( int32_t locX , int32_t locY , int32_t forPlayer , int32_t sender , const char * pStr ) ;
2006-09-13 05:58:32 -07:00
extern BOOL msgStackFireTop ( void ) ;
2006-08-26 13:51:54 -07:00
2007-06-24 14:51:29 -07:00
# endif