view gameconf.c @ 3:5a977ccbc7a9 default tip

Empty changelog
author darius
date Sat, 06 Dec 1997 05:41:29 +0000
parents
children
line wrap: on
line source

/* $Id: gameconf.c,v 1.1.1.1 1997/12/06 05:41:29 darius Exp $ */

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <time.h>
#ifndef hpux
#include <sys/time.h>
#endif
#ifdef __STDC__
#include <stdlib.h>
#endif

#include "gameconf.h"
#include "defaultlogos.h"
#include "data.h"
#include "gppackets.h"

int     number_of_teams;

struct teaminfo_s *teaminfo = 0;

void
load_default_teams()
{
    number_of_teams = 4;

    /* independent is teaminfo[-1], allteam is teaminfo[4] */
    teaminfo = 1 + (struct teaminfo_s *) malloc(sizeof(*teaminfo) * (number_of_teams + 2));

    strcpy(teaminfo[-1].name, "Independant");
    teaminfo[-1].letter = 'I';
    strcpy(teaminfo[-1].shortname, "IND");

    strcpy(teaminfo[0].name, "Federation");
    teaminfo[0].letter = 'F';
    strcpy(teaminfo[0].shortname, "FED");


    strcpy(teaminfo[1].name, "Romulan");
    teaminfo[1].letter = 'R';
    strcpy(teaminfo[1].shortname, "ROM");


    strcpy(teaminfo[2].name, "Klingon");
    teaminfo[2].letter = 'K';
    strcpy(teaminfo[2].shortname, "KLI");


    strcpy(teaminfo[3].name, "Orion");
    teaminfo[3].letter = 'O';
    strcpy(teaminfo[3].shortname, "ORI");

    strcpy(teaminfo[4].name, "None");
    teaminfo[4].letter = '-';
    strcpy(teaminfo[4].shortname, "NON");
}

void
load_default_teamlogos()
{
    if (number_of_teams < 1)
	return;
    teaminfo[0].shield_logo = W_StoreBitmap(fedshield_width, fedshield_height,
					    fedshield_bits, teamWin[0]);
    if (number_of_teams < 2)
	return;
    teaminfo[1].shield_logo = W_StoreBitmap(romshield_width, romshield_height,
					    romshield_bits, teamWin[1]);
    if (number_of_teams < 3)
	return;
    teaminfo[2].shield_logo = W_StoreBitmap(klishield_width, klishield_height,
					    klishield_bits, teamWin[2]);
    if (number_of_teams < 4)
	return;
    teaminfo[3].shield_logo = W_StoreBitmap(orishield_width, orishield_height,
					    orishield_bits, teamWin[3]);
}

void
load_generic_teams()
{
    /*
       reserved letters: A G T
    */
    int     i;

    /* independent is teaminfo[-1] */
    teaminfo = 1 + (struct teaminfo_s *) malloc(sizeof(*teaminfo) * (number_of_teams + 1));

    strcpy(teaminfo[-1].name, "Independant");
    teaminfo[-1].letter = 'I';
    strcpy(teaminfo[-1].shortname, "IND");

    load_default_teamlogos();	/* loads the first 4 team logos */

    for (i = 0; i < number_of_teams; i++) {
	sprintf(teaminfo[i].name, "Team #%d", i);
	teaminfo[i].letter = 'J' + i;	/* I, J through P */
	sprintf(teaminfo[i].shortname, "T%02d", i);

#if 0
	/* we should draw something nifty here */
	if (i >= 4)		/* the first 4 have been loaded already. */
	    teaminfo[i].shield_logo = W_StoreBitmap(1, 1, &i, teamWin[i]);
	/* XXX uh-oh if more than 4 teams */

/* exactly.  If there are more than 4 teams the above will SEGV because
   of the &i (which should be a char * bitmap array).
*/
#endif

    }
}

void
initialize_thingies()
{
    int     i;
    int     n = (npthingies * nplayers + ngthingies);
    thingies = (struct thingy *) malloc(sizeof(*thingies) * n);
    for (i = 0; i < n; i++) {
	thingies[i].t_shape = SHP_BLANK;
	thingies[i].t_no = i;
	thingies[i].t_owner = (i >= npthingies * nplayers) ? -1 : (i / npthingies);
    }
}

void
initialize_players()
{
    int     i;

    players = (struct player *) malloc(sizeof(*players) * nplayers);

    bzero(players, sizeof(struct player) * nplayers);

    for (i = 0; i < nplayers; i++) {
	players[i].p_status = PFREE;
	players[i].p_cloakphase = 0;
	players[i].p_no = i;
	players[i].p_ntorp = 0;
	players[i].p_ndrone = 0;/* TSH */
	players[i].p_explode = 1;
	players[i].p_stats.st_tticks = 1;
	players[i].p_ship = shiptypes->ship;
    }
}

void
initialize_torps()
{
    int     i;

    torps = (struct torp *) malloc(sizeof(*torps) * nplayers * ntorps);

    for (i = 0; i < nplayers * ntorps; i++) {
	torps[i].t_status = TFREE;
	torps[i].t_no = i;
	torps[i].t_owner = (i / ntorps);
    }
}

void
initialize_plasmas()
{
    int     i;

    plasmatorps = (struct plasmatorp *) malloc(sizeof(*plasmatorps) * nplayers * nplasmas);

    for (i = 0; i < nplayers * nplasmas; i++) {
	plasmatorps[i].pt_status = PTFREE;
	plasmatorps[i].pt_no = i;
	plasmatorps[i].pt_owner = (i / nplasmas);
    }
}

void
initialize_phasers()
{
    int     i;

    phasers = (struct phaser *) malloc(sizeof(*phasers) * nplayers * nphasers);

    for (i = 0; i < nplayers * nphasers; i++) {
	phasers[i].ph_status = PHFREE;
	phasers[i].ph_fuse = 0;
    }
}

void
initialize_planets()
{
    int     i;

    planets = (struct planet *) malloc(sizeof(*planets) * nplanets);

    for (i = 0; i < nplanets; i++) {
	struct planet *curr = &planets[i];
	curr->pl_no = i;
	curr->pl_flags = 0;
	curr->pl_owner = 0;
	curr->pl_x = curr->pl_y = -10000;
	sprintf(curr->pl_name, "planet%d", i);
	curr->pl_namelen = strlen(curr->pl_name);
	curr->pl_armies = 0;
	curr->pl_info = 0;
	curr->pl_deadtime = 0;
	curr->pl_couptime = 0;
	curr->pl_timestamp = 0;

	/* initialize planet redraw for moving planets */
	pl_update[i].plu_update = -1;
    }
}

void
init_ranks()
{
    ranks2 = (struct rank2 *) malloc(sizeof(*ranks2) * nranks2);
    ranks2[0].genocides = 0;
    ranks2[0].di = 0;
    ranks2[0].battle = 0.0;
    ranks2[0].strategy = 0.0;
    ranks2[0].specship = 0.0;
    ranks2[0].name = strdup("Recruit");

    ranks2[1].genocides = 1;
    ranks2[1].di = 10;
    ranks2[1].battle = 0.30;
    ranks2[1].strategy = 0.3;
    ranks2[1].specship = 0.0;
    ranks2[1].name = strdup("Specialist");

    ranks2[2].genocides = 2;
    ranks2[2].di = 25;
    ranks2[2].battle = 0.40;
    ranks2[2].strategy = 0.6;
    ranks2[2].specship = 0.0;
    ranks2[2].name = strdup("Cadet");

    ranks2[3].genocides = 3;
    ranks2[3].di = 45;
    ranks2[3].battle = 0.50;
    ranks2[3].strategy = 0.9;
    ranks2[3].specship = 0.0;
    ranks2[3].name = strdup("Midshipman");

    ranks2[4].genocides = 4;
    ranks2[4].di = 70;
    ranks2[4].battle = 0.70;
    ranks2[4].strategy = 1.2;
    ranks2[4].specship = 0.0;
    ranks2[4].name = strdup("Ensn. J.G.");

    ranks2[5].genocides = 5;
    ranks2[5].di = 100;
    ranks2[5].battle = 0.90;
    ranks2[5].strategy = 1.5;
    ranks2[5].specship = 0.0;
    ranks2[5].name = strdup("Ensign");

    ranks2[6].genocides = 6;
    ranks2[6].di = 140;
    ranks2[6].battle = 1.10;
    ranks2[6].strategy = 2.0;
    ranks2[6].specship = 0.0;
    ranks2[6].name = strdup("Lt. J.G.");

    ranks2[7].genocides = 8;
    ranks2[7].di = 190;
    ranks2[7].battle = 1.30;
    ranks2[7].strategy = 2.5;
    ranks2[7].specship = 0.0;
    ranks2[7].name = strdup("Lieutenant");

    ranks2[8].genocides = 10;
    ranks2[8].di = 250;
    ranks2[8].battle = 1.50;
    ranks2[8].strategy = 3.0;
    ranks2[8].specship = 0.5;
    ranks2[8].name = strdup("Lt. Cmdr.");

    ranks2[9].genocides = 15;
    ranks2[9].di = 300;
    ranks2[9].battle = 1.80;
    ranks2[9].strategy = 3.5;
    ranks2[9].specship = 0.7;
    ranks2[9].name = strdup("Commander");

    ranks2[10].genocides = 18;
    ranks2[10].di = 350;
    ranks2[10].battle = 2.00;
    ranks2[10].strategy = 4.0;
    ranks2[10].specship = 1.0;
    ranks2[10].name = strdup("Captain");

    ranks2[11].genocides = 25;
    ranks2[11].di = 400;
    ranks2[11].battle = 2.10;
    ranks2[11].strategy = 4.3;
    ranks2[11].specship = 2.5;
    ranks2[11].name = strdup("Fleet Capt.");

    ranks2[12].genocides = 50;
    ranks2[12].di = 500;
    ranks2[12].battle = 2.15;
    ranks2[12].strategy = 4.8;
    ranks2[12].specship = 3.0;
    ranks2[12].name = strdup("Commodore");

    ranks2[13].genocides = 75;
    ranks2[13].di = 700;
    ranks2[13].battle = 2.20;
    ranks2[13].strategy = 5.3;
    ranks2[13].specship = 3.3;
    ranks2[13].name = strdup("Moff");

    ranks2[14].genocides = 100;
    ranks2[14].di = 900;
    ranks2[14].battle = 2.25;
    ranks2[14].strategy = 5.7;
    ranks2[14].specship = 3.6;
    ranks2[14].name = strdup("Grand Moff");

    ranks2[15].genocides = 300;
    ranks2[15].di = 1200;
    ranks2[15].battle = 2.30;
    ranks2[15].strategy = 6.0;
    ranks2[15].specship = 3.8;
    ranks2[15].name = strdup("Rear Adml.");

    ranks2[16].genocides = 700;
    ranks2[16].di = 1700;
    ranks2[16].battle = 2.35;
    ranks2[16].strategy = 6.1;
    ranks2[16].specship = 4.0;
    ranks2[16].name = strdup("Admiral");

    ranks2[17].genocides = 1000;
    ranks2[17].di = 2500;
    ranks2[17].battle = 2.40;
    ranks2[17].strategy = 6.2;
    ranks2[17].specship = 4.2;
    ranks2[17].name = strdup("Grand Adml.");
}

void
init_royal()
{
    royal = (struct royalty *) malloc(sizeof(*royal) * nroyals);

    royal[0].name = strdup("none");
    royal[1].name = strdup("Wesley");
    royal[2].name = strdup("Centurion");
    royal[3].name = strdup("Praetor");
    royal[4].name = strdup("Emperor");
#if 0
    royal[5].name = strdup("Wizard");
    royal[6].name = strdup("Duke");
    royal[7].name = strdup("Count");
    royal[8].name = strdup("Baron");
    royal[9].name = strdup("Knight");
    royal[10].name = strdup("Dread");
    royal[11].name = strdup("Lord of Destruction");
    royal[12].name = strdup("BlitzMeister");
    royal[13].name = strdup("Hitler");
    royal[14].name = strdup("Terminator");
    royal[15].name = strdup("Kamikaze");
    royal[16].name = strdup("Speed Kamikaze");
    royal[17].name = strdup("Carpet Bomber");
    royal[18].name = strdup("NukeMeister");
    royal[19].name = strdup("Terrorist");
    royal[20].name = strdup("Democrat");
    royal[21].name = strdup("Executioner");
    royal[22].name = strdup("DooshMeister");
    royal[23].name = strdup("Diplomat");
    royal[24].name = strdup("speed Diplomat");
    royal[25].name = strdup("Addict");
#endif				/* 0 */
}

void
reinit_ranks()
{
    int     i;
    ranks2 = (struct rank2 *) malloc(sizeof(*ranks2) * nranks2);

    for (i = 0; i < nranks2; i++) {
	ranks2[i].name = strdup("blank");
    }
}

void
reinit_royal()
{
    int     i;
    royal = (struct royalty *) malloc(sizeof(*royal) * nroyals);

    for (i = 0; i < nroyals; i++) {
	royal[i].name = strdup("blank");
    }
}


void
resize_players()
{
    int     me_no;

    if (me)
	me_no = me->p_no;
    players = (struct player *) realloc(players, sizeof(*players) * nplayers);
    if (me) {
	me = &players[me_no];
	myship = me->p_ship;
    }
}

void
free_teams()
{
    int     i;
    for (i = 0; i < number_of_teams; i++) {
	W_FreeBitmap(teaminfo[i].shield_logo);
    }
    /* we offsetted by 1 to make room for IND */
    free(teaminfo - 1);
    teaminfo = 0;
}

void
free_torps()
{
    free(torps);
    torps = 0;
}

void
free_phasers()
{
    free(phasers);
    phasers = 0;
}

void
free_plasmas()
{
    free(plasmatorps);
    plasmatorps = 0;
}

void
free_thingies()
{
    free(thingies);
    thingies = 0;
}

void
free_ranks()
{
    int     i;
    for (i = 0; i < nranks2; i++)
	if (ranks2[i].name)
	    free(ranks2[i].name);
    free(ranks2);
    ranks2 = 0;
}

void
free_royal()
{
    int     i;
    for (i = 0; i < nroyals; i++)
	if (royal[i].name)
	    free(royal[i].name);

    free(royal);
    royal = 0;
}

/*
 */

void
build_default_configuration()
{
    load_default_teams();
    /* can't load logos until we have some windows */

    init_shiptypes();
    initialize_players();
    initialize_torps();
    initialize_thingies();
    initialize_plasmas();
    initialize_planets();
    initialize_phasers();


    init_ranks();
    init_royal();
}

/*
 */


int
compute_gameparam_size(buf)
    char   *buf;
{
    struct gameparam_spacket *pkt = (struct gameparam_spacket *) buf;

    if (*buf != SP_GPARAM)
	return -1;

    switch (pkt->subtype) {
    case 0:
	return sizeof(struct gp_sizes_spacket);
    case 1:
	return sizeof(struct gp_team_spacket);
    case 2:
	return sizeof(struct gp_teamlogo_spacket);
    case 3:
	return sizeof(struct gp_shipshape_spacket);
    case 4:
	return sizeof(struct gp_shipbitmap_spacket);
    case 5:
	return sizeof(struct gp_rank_spacket);
    case 6:
	return sizeof(struct gp_royal_spacket);
    case 7:
	return sizeof(struct gp_teamplanet_spacket);
    default:
	return -1;
    }
}

void
handleGPsizes(pkt)
    struct gp_sizes_spacket *pkt;
{
    free_ranks();
    free_royal();

    free_teams();
    free_torps();
    free_phasers();
    free_plasmas();
    free_thingies();

    free_shipshapes();

    nplayers = pkt->nplayers;
    number_of_teams = pkt->nteams;
    /* shiptypes */
    nranks2 = pkt->nranks;
    nroyals = pkt->nroyal;
    nphasers = pkt->nphasers;
    ntorps = pkt->ntorps;
    nplasmas = pkt->nplasmas;
    npthingies = pkt->nthingies;
    ngthingies = pkt->gthingies;

    /* gwidth */
    /* flags */

    load_generic_teams();

    reinit_ranks();
    reinit_royal();

    resize_players();
    initialize_torps();
    initialize_phasers();
    initialize_plasmas();
    initialize_thingies();

    slurp_ship_bitmaps();
}

void
handleGPteam(pkt)
    struct gp_team_spacket *pkt;
{
    struct teaminfo_s *currteam;

    if ((int) pkt->index >= number_of_teams) {
	fprintf(stderr, "Team #%d %s is out of range (0..%d)\n", pkt->index,
		pkt->teamname, number_of_teams);
	return;
    }
    currteam = &teaminfo[pkt->index];

    currteam->letter = pkt->letter;

    strncpy(currteam->shortname, pkt->shortname, 3);
    currteam->shortname[3] = 0;

    strncpy(currteam->name, pkt->teamname, sizeof(currteam->name) - 1);
    currteam->name[sizeof(currteam->name) - 1] = 0;;
}

void
handleGPteamlogo(pkt)
    struct gp_teamlogo_spacket *pkt;
{
    static char buf[13 * 99];	/* 99x99 */
    static int curr_height = 0;
    static int lwidth, lheight;
    static int teamindex;
    int     pwidth;

    if ((unsigned) pkt->teamindex >= number_of_teams) {
	fprintf(stderr, "Team #%d is out of range (0..%d)\n", pkt->teamindex,
		number_of_teams);
	return;
    }
    if (pkt->y != curr_height) {
	fprintf(stderr, "Bad gp_teamlogo packet sequence y(%d) != curr_height(%d)\n",
		pkt->y, curr_height);
	curr_height = 0;
	return;
    }
    if (curr_height) {
	if (lwidth != pkt->logowidth || lheight != pkt->logoheight ||
	    teamindex != pkt->teamindex) {
	    fprintf(stderr, "gp_teamlogo packet sequence error, %d!=%d || %d!=%d || %d!=%d\n",
		    lwidth, pkt->logowidth, lheight, pkt->logoheight,
		    teamindex, pkt->teamindex);
	    curr_height = 0;
	    return;
	}
    } else {
	teamindex = pkt->teamindex;
	lwidth = pkt->logowidth;
	lheight = pkt->logoheight;
	if (lwidth > 99 || lheight > 99) {
	    fprintf(stderr, "logo too big (%dx%d), rejecting\n", lwidth, lheight);
	    curr_height = 0;
	    return;
	}
    }
    pwidth = (lwidth - 1) / 8 + 1;
    memcpy(buf + pwidth * curr_height, pkt->data, pwidth * pkt->thisheight);
    curr_height += pkt->thisheight;

    if (curr_height >= lheight) {
	W_FreeBitmap(teaminfo[teamindex].shield_logo);
	teaminfo[teamindex].shield_logo = W_StoreBitmap(lwidth, lheight, buf,
							teamWin[teamindex]);
	curr_height = 0;
    }
}

void
handleGPshipshape(pkt)
    struct gp_shipshape_spacket *pkt;
{
    if (pkt->race < -1 || pkt->race >= number_of_teams) {
	fprintf(stderr, "race #%d out of range (-1..%d)\n", pkt->race,
		number_of_teams - 1);
	return;
    }
    if ( /* pkt->shipno<0 || */ (int) pkt->shipno >= nshiptypes) {
	fprintf(stderr, "ship class #%d out of range (0..%d)\n", pkt->shipno,
		nshiptypes - 1);
	return;
    }
    replace_shipshape(pkt->race, pkt->shipno, pkt->nviews,
		      pkt->width, pkt->height);
}

void
handleGPshipbitmap(pkt)
    struct gp_shipbitmap_spacket *pkt;
{
    if (pkt->race < -1 || pkt->race >= number_of_teams) {
	fprintf(stderr, "race #%d out of range (-1..%d)\n", pkt->race,
		number_of_teams - 1);
	return;
    }
    if ( /* pkt->shipno<0 || */ (int) pkt->shipno >= nshiptypes) {
	fprintf(stderr, "ship class #%d out of range (0..%d)\n", pkt->shipno,
		nshiptypes - 1);
	return;
    }
    replace_ship_bitmap(pkt->race, pkt->shipno, pkt->thisview, pkt->bitmapdata);
}

void
handleGPrank(pkt)
    struct gp_rank_spacket *pkt;
{
    struct rank2 *curr;
    if (pkt->rankn >= nranks2) {
	fprintf(stderr, "rank #%d %s out of range (0..%d)\n", pkt->rankn,
		pkt->name, nranks2 - 1);
	return;
    }
    curr = &ranks2[pkt->rankn];
    free(curr->name);

    curr->genocides = htonl(pkt->genocides);
    curr->di = htonl(pkt->milliDI) / 1000.0;
    curr->battle = htonl(pkt->millibattle) / 1000.0;
    curr->strategy = htonl(pkt->millistrat) / 1000.0;
    curr->specship = htonl(pkt->millispec) / 1000.0;
    curr->name = strdup(pkt->name);
}

void
handleGProyal(pkt)
    struct gp_royal_spacket *pkt;
{
    if ((int) pkt->rankn >= nroyals) {
	fprintf(stderr, "Royalty #%d %s out of range (0..%d)\n", pkt->rankn,
		pkt->name, nroyals - 1);
	return;
    }
    free(royal[pkt->rankn].name);
    royal[pkt->rankn].name = strdup(pkt->name);
}

static unsigned char mplanet_bits[] = {
    0xe0, 0x03, 0x18, 0x0c, 0x04, 0x10, 0x02, 0x20, 0x02, 0x20, 0x01, 0x40,
    0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x01, 0x40, 0x02, 0x20, 0x02, 0x20,
0x04, 0x10, 0x18, 0x0c, 0xe0, 0x03, 0x00, 0x00};
static unsigned char planet_bits[] = {
    0x00, 0xf8, 0x03, 0x00, 0x00, 0x07, 0x1c, 0x00, 0xc0, 0x00, 0x60, 0x00,
    0x20, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x02,
    0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x02, 0x00, 0x00, 0x08,
    0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x10,
    0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10,
    0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x10,
    0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x08,
    0x04, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x08, 0x00, 0x00, 0x02,
    0x10, 0x00, 0x00, 0x01, 0x20, 0x00, 0x80, 0x00, 0xc0, 0x00, 0x60, 0x00,
0x00, 0x07, 0x1c, 0x00, 0x00, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00};

void
handleGPteamplanet(pkt)
    struct gp_teamplanet_spacket *pkt;
{
    {
#define	TACTICALSIZE	sizeof(pkt->tactical)
	unsigned char tactical[TACTICALSIZE];
	int     i;
	int     race = pkt->teamn;

	if (race < -1 || race >= number_of_teams) {
	    fprintf(stderr, "race #%d out of range (-1..%d)\n", race,
		    number_of_teams - 1);
	    return;
	}
	for (i = 0; i < TACTICALSIZE; i++) {
	    tactical[i] = (pkt->tactical[i] & pkt->tacticalM[i]) |
		(planet_bits[i] & ~pkt->tacticalM[i]);
	}

	W_FreeBitmap(bplanets[race + 1]);
	bplanets[race + 1] = W_StoreBitmap(30, 30, tactical, w);

#undef TACTICALSIZE
    }

    {
#define	GALACTICSIZE	sizeof(pkt->galactic)
	unsigned char galactic[GALACTICSIZE];
	int     i;
	int     race = pkt->teamn;

	if (race < -1 || race >= number_of_teams) {
	    fprintf(stderr, "race #%d out of range (-1..%d)\n", race,
		    number_of_teams - 1);
	    return;
	}
	for (i = 0; i < GALACTICSIZE; i++) {
	    galactic[i] = (pkt->galactic[i] & pkt->galacticM[i]) |
		(mplanet_bits[i] & ~pkt->galacticM[i]);
	}

	W_FreeBitmap(mbplanets[race + 1]);
	mbplanets[race + 1] = W_StoreBitmap(16, 16, galactic, mapw);

#undef GALACTICSIZE
    }
}

void
handleGameparams(pkt)
    struct gameparam_spacket *pkt;
{
    switch (pkt->subtype) {
    case 0:
	handleGPsizes((struct gp_sizes_spacket *) pkt);
	break;
    case 1:
	handleGPteam((struct gp_team_spacket *) pkt);
	break;
    case 2:
	handleGPteamlogo((struct gp_teamlogo_spacket *) pkt);
	break;
    case 3:
	handleGPshipshape((struct gp_shipshape_spacket *) pkt);
	break;
    case 4:
	handleGPshipbitmap((struct gp_shipbitmap_spacket *) pkt);
	break;
    case 5:
	handleGPrank((struct gp_rank_spacket *) pkt);
	break;
    case 6:
	handleGProyal((struct gp_royal_spacket *) pkt);
	break;
    case 7:
	handleGPteamplanet((struct gp_teamplanet_spacket *) pkt);
	break;
    default:
	fprintf(stderr, "Gameparams packet subtype %d not yet implemented\n",
		pkt->subtype);
    }
}