Information Packet
From WinBolo
An information packet provides an overview of the current game. It is sent to the Tracker periodically and is the first message sent when a game is joined.
The LAN broadcast search functionality broadcasts an Information Packet request across the subnet to find games.
typedef struct {
u_char c[36];
} u_char36;
typedef u_char BYTE;
typedef u_short WORD;
/* Version */
#define BoloVersion_Major 0x01
#define BoloVersion_Minor 0x01
#define BoloVersion_Revision 0x04
/* Request/Response packets */
#define BoloPacket_Request 13
#define BoloPacket_Response 14
typedef struct {
BYTE signature[4]; /* 'Bolo' */
BYTE versionMajor; /* 0x01 */
BYTE versionMinor; /* 0x00 */
BYTE versionRevision; /* 0x09 */
BYTE type; /* 13 for request, 14 for response */
} BOLOHEADER;
typedef struct {
struct in_addr serveraddress;
unsigned short serverport;
u_long start_time;
BYTE spare1;
BYTE spare2;
} GAMEID;
typedef struct {
BOLOHEADER h;
u_char36 mapname; /* Pascal string (first byte is length) */
GAMEID gameid; /* 8 byte unique ID for game (combination */
/* of starting machine address & timestamp) */
BYTE gametype; /* Game type (1, 2 or 3: open, tourn. & strict) */
BYTE allow_mines; /* 0x80 for normal hidden mines */
/* 0xC0 for all mines visible */
BYTE allow_AI; /* 0 for no AI tanks, 1 for AI tanks allowed */
BYTE spare1; /* 0 */
long start_delay; /* if non zero, time until game starts, (50ths) */
long time_limit; /* if non zero, time until game ends, (50ths) */
WORD num_players; /* number of players */
WORD free_pills; /* number of free (neutral) pillboxes */
WORD free_bases; /* number of free (neutral) refuelling bases */
BYTE has_password; /* non-zero if game has password set */
BYTE spare2; /* 0 */
} INFO_PACKET;
/* Sends a query packet to the command line argument specified */
static void sendquery(int s, char **argv) {
static const BOLOHEADER h = { /* Bolo request packet we are sending */
{ 'B', 'o', 'l', 'o' },
BoloVersion_Major,
BoloVersion_Minor,
BoloVersion_Revision,
BoloPacket_Request
};

