Mercurial > ~darius > hgwebdir.cgi > paradise_client
diff shipbitmaps.c @ 3:5a977ccbc7a9 default tip
Empty changelog
author | darius |
---|---|
date | Sat, 06 Dec 1997 05:41:29 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/shipbitmaps.c Sat Dec 06 05:41:29 1997 +0000 @@ -0,0 +1,863 @@ +/* $Id: shipbitmaps.c,v 1.1.1.1 1997/12/06 05:41:30 darius Exp $ */ + +/* with this file, now the user can define and develop new ship bitmap + sets ('albums') more easily. + + The user need only create a file in the proper directory with the +proper name with the proper format. The directory is specified by the +shipBitmapPath resource in the .xtrekrc. Its default is +/usr/games/lib/netrek. The name of the file is "R%d.C%d" where the +first integer is the race number and the second is the ship class +number. + + The format of the file is: 3 4-byte integers in network byte order. +The first is the number of views in the file (this field is currently +ignored but should have the value 16). The second integer is the +width and the third is the height. Then follows raw bitmap data. I +don't know what the format is, but it's basically a binary version of +the X bitmap file format. Translate those hex numbers to raw bytes +and you have it. I can tell you that each line is padded to 8 bits. + +*/ + +#include <stdio.h> +#ifndef AMIGA +#include <sys/param.h> +#include <netinet/in.h> +#endif +#include <errno.h> + +#ifdef m_flags + /* appears under HPUX */ +#undef m_flags +#endif + +#include "Wlib.h" +#include "defs.h" +#include "struct.h" +#include "data.h" +#include "gameconf.h" + +#ifdef NOSHIPBITMAPS +#include "bitmaps_CASB.h" +#else +#include "bitmaps_NEW.h" +#ifdef HOCKEY +#include "puck.h" +#endif /*HOCKEY*/ +#endif + +static int +get_ship_width(team, shipn) + int team, shipn; +{ +#ifndef NOSHIPBITMAPS + if (shipn == ATT && paradise) + return att_width; + switch (team) { + case 0: + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_width; +#endif /*HOCKEY*/ + case SCOUT: + return fed_scout_width; + case DESTROYER: + return fed_destroyer_width; + case CRUISER: + return fed_cruiser_width; + case BATTLESHIP: + return fed_battleship_width; + case ASSAULT: + return fed_assault_width; + case STARBASE: + return fed_starbase_width; + case JUMPSHIP: + return fed_jumpship_width; + case FLAGSHIP: + return fed_galaxy_width; + case GALAXY: + return fed_galaxy_width; + case WARBASE: + return fed_warbase_width; + case LIGHTCRUISER: + return fed_lightcruiser_width; + case CARRIER: + return fed_carrier_height; + case UTILITY: + return fed_utility_width; + case PATROL: + return fed_patrol_width; + } + case 1: + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_width; +#endif /*HOCKEY*/ + case SCOUT: + return rom_scout_width; + case DESTROYER: + return rom_destroyer_width; + case CRUISER: + return rom_cruiser_width; + case BATTLESHIP: + return rom_battleship_width; + case ASSAULT: + return rom_assault_width; + case STARBASE: + return rom_starbase_width; + case JUMPSHIP: + return rom_jumpship_width; + case FLAGSHIP: + return rom_galaxy_width; + case GALAXY: + return rom_galaxy_width; + case WARBASE: + return rom_warbase_width; + case LIGHTCRUISER: + return rom_lightcruiser_width; + case CARRIER: + return rom_carrier_height; + case UTILITY: + return rom_utility_width; + case PATROL: + return rom_patrol_width; + } + case 2: + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_width; +#endif /*HOCKEY*/ + case SCOUT: + return kli_scout_width; + case DESTROYER: + return kli_destroyer_width; + case CRUISER: + return kli_cruiser_width; + case BATTLESHIP: + return kli_battleship_width; + case ASSAULT: + return kli_assault_width; + case STARBASE: + return kli_starbase_width; + case JUMPSHIP: + return kli_jumpship_width; + case FLAGSHIP: + return kli_galaxy_width; + case GALAXY: + return kli_galaxy_width; + case WARBASE: + return kli_warbase_width; + case LIGHTCRUISER: + return kli_lightcruiser_width; + case CARRIER: + return kli_carrier_height; + case UTILITY: + return kli_utility_width; + case PATROL: + return kli_patrol_width; + } + case 3: + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_width; +#endif /*HOCKEY*/ + case SCOUT: + return ori_scout_width; + case DESTROYER: + return ori_destroyer_width; + case CRUISER: + return ori_cruiser_width; + case BATTLESHIP: + return ori_battleship_width; + case ASSAULT: + return ori_assault_width; + case STARBASE: + return ori_starbase_width; + case JUMPSHIP: + return ori_jumpship_width; + case FLAGSHIP: + return ori_galaxy_width; + case GALAXY: + return ori_galaxy_width; + case WARBASE: + return ori_warbase_width; + case LIGHTCRUISER: + return ori_lightcruiser_width; + case CARRIER: + return ori_carrier_height; + case UTILITY: + return ori_utility_width; + case PATROL: + return ori_patrol_width; + } + case -1: + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_width; +#endif /*HOCKEY*/ + case SCOUT: + return ind_scout_width; + case DESTROYER: + return ind_destroyer_width; + case CRUISER: + return ind_cruiser_width; + case BATTLESHIP: + return ind_battleship_width; + case ASSAULT: + return ind_assault_width; + case STARBASE: + return ind_starbase_width; + case JUMPSHIP: + return ind_starbase_width; + case FLAGSHIP: + return ind_galaxy_width; + case GALAXY: + return ind_galaxy_width; + case WARBASE: + return ind_starbase_width; + case LIGHTCRUISER: + return ind_lightcruiser_width; + case CARRIER: + return ind_carrier_height; + case UTILITY: + return ind_utility_width; + case PATROL: + return ind_patrol_width; + } + } +#endif /* NOSHIPBITMAPS */ + return 20; +} + + +static int +get_ship_height(team, shipn) + int team, shipn; +{ +#ifndef NOSHIPBITMAPS + if (shipn == ATT && paradise) + return att_height; + switch (team) { + case 0: + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_height; +#endif /*HOCKEY*/ + case SCOUT: + return fed_scout_height; + case DESTROYER: + return fed_destroyer_height; + case CRUISER: + return fed_cruiser_height; + case BATTLESHIP: + return fed_battleship_height; + case ASSAULT: + return fed_assault_height; + case STARBASE: + return fed_starbase_height; + case JUMPSHIP: + return fed_jumpship_height; + case FLAGSHIP: + return fed_galaxy_height; + case GALAXY: + return fed_galaxy_height; + case WARBASE: + return fed_warbase_height; + case LIGHTCRUISER: + return fed_lightcruiser_height; + case CARRIER: + return fed_carrier_height; + case UTILITY: + return fed_utility_height; + case PATROL: + return fed_patrol_height; + } + case 1: + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_height; +#endif /*HOCKEY*/ + case SCOUT: + return rom_scout_height; + case DESTROYER: + return rom_destroyer_height; + case CRUISER: + return rom_cruiser_height; + case BATTLESHIP: + return rom_battleship_height; + case ASSAULT: + return rom_assault_height; + case STARBASE: + return rom_starbase_height; + case JUMPSHIP: + return rom_jumpship_height; + case FLAGSHIP: + return rom_galaxy_height; + case GALAXY: + return rom_galaxy_height; + case WARBASE: + return rom_warbase_height; + case LIGHTCRUISER: + return rom_lightcruiser_height; + case CARRIER: + return rom_carrier_height; + case UTILITY: + return rom_utility_height; + case PATROL: + return rom_patrol_height; + } + case 2: + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_height; +#endif /*HOCKEY*/ + case SCOUT: + return kli_scout_height; + case DESTROYER: + return kli_destroyer_height; + case CRUISER: + return kli_cruiser_height; + case BATTLESHIP: + return kli_battleship_height; + case ASSAULT: + return kli_assault_height; + case STARBASE: + return kli_starbase_height; + case JUMPSHIP: + return kli_jumpship_height; + case FLAGSHIP: + return kli_galaxy_height; + case GALAXY: + return kli_galaxy_height; + case WARBASE: + return kli_warbase_height; + case LIGHTCRUISER: + return kli_lightcruiser_height; + case CARRIER: + return kli_carrier_height; + case UTILITY: + return kli_utility_height; + case PATROL: + return kli_patrol_height; + } + case 3: + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_height; +#endif /*HOCKEY*/ + case SCOUT: + return ori_scout_height; + case DESTROYER: + return ori_destroyer_height; + case CRUISER: + return ori_cruiser_height; + case BATTLESHIP: + return ori_battleship_height; + case ASSAULT: + return ori_assault_height; + case STARBASE: + return ori_starbase_height; + case JUMPSHIP: + return ori_jumpship_height; + case FLAGSHIP: + return ori_galaxy_height; + case GALAXY: + return ori_galaxy_height; + case WARBASE: + return ori_warbase_height; + case LIGHTCRUISER: + return ori_lightcruiser_height; + case CARRIER: + return ori_carrier_height; + case UTILITY: + return ori_utility_height; + case PATROL: + return ori_patrol_height; + } + case -1: + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_height; +#endif /*HOCKEY*/ + case SCOUT: + return ind_scout_height; + case DESTROYER: + return ind_destroyer_height; + case CRUISER: + return ind_cruiser_height; + case BATTLESHIP: + return ind_battleship_height; + case ASSAULT: + return ind_assault_height; + case STARBASE: + return ind_starbase_height; + case JUMPSHIP: + return ind_starbase_height; + case FLAGSHIP: + return ind_galaxy_height; + case GALAXY: + return ind_galaxy_height; + case WARBASE: + return ind_starbase_height; + case LIGHTCRUISER: + return ind_lightcruiser_height; + case CARRIER: + return ind_carrier_height; + case UTILITY: + return ind_utility_height; + case PATROL: + return ind_patrol_height; + } + } +#endif /* NOSHIPBITMAPS */ + return 20; +} + +static int +get_ship_nviews(shipn) + int shipn; +{ + if (shipn == STARBASE || + shipn == WARBASE || + shipn == JUMPSHIP +#ifdef HOCKEY + || shipn == PUCK +#endif /*HOCKEY*/ + ) + return 1; + else + return 16; +} + +static unsigned char * +get_ship_bits(team, shipn, view) + int team, shipn; + int view; +{ +#ifndef NOSHIPBITMAPS + if (shipn == ATT && paradise) { + if (view > 0) + view = 0; + return att_bits[view]; + } +#endif + if (view > 16) + view = 0; + switch (team) { + case 0: +#ifndef NOSHIPBITMAPS + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_bits; +#endif /*HOCKEY*/ + case SCOUT: + return fed_scout_bits[view]; + case DESTROYER: + return fed_destroyer_bits[view]; + case CRUISER: + return fed_cruiser_bits[view]; + case BATTLESHIP: + return fed_battleship_bits[view]; + case ASSAULT: + return fed_assault_bits[view]; + case STARBASE: + return fed_starbase_bits; + case JUMPSHIP: + return fed_jumpship_bits; + case FLAGSHIP: + return fed_galaxy_bits[view]; + case GALAXY: + return fed_galaxy_bits[view]; + case WARBASE: + return fed_warbase_bits; + case LIGHTCRUISER: + return fed_lightcruiser_bits[view]; + case CARRIER: + return fed_carrier_bits[view]; + case UTILITY: + return fed_utility_bits[view]; + case PATROL: + return fed_patrol_bits[view]; + } +#else + if (get_ship_nviews(shipn) == 1) + return fed_starbase_bits; + else + return fed_cruiser_bits[view]; +#endif + case 1: +#ifndef NOSHIPBITMAPS + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_bits; +#endif /*HOCKEY*/ + case SCOUT: + return rom_scout_bits[view]; + case DESTROYER: + return rom_destroyer_bits[view]; + case CRUISER: + return rom_cruiser_bits[view]; + case BATTLESHIP: + return rom_battleship_bits[view]; + case ASSAULT: + return rom_assault_bits[view]; + case STARBASE: + return rom_starbase_bits; + case JUMPSHIP: + return rom_jumpship_bits; + case FLAGSHIP: + return rom_galaxy_bits[view]; + case GALAXY: + return rom_galaxy_bits[view]; + case WARBASE: + return rom_warbase_bits; + case LIGHTCRUISER: + return rom_lightcruiser_bits[view]; + case CARRIER: + return rom_carrier_bits[view]; + case UTILITY: + return rom_utility_bits[view]; + case PATROL: + return rom_patrol_bits[view]; + } +#else + if (get_ship_nviews(shipn) == 1) + return rom_starbase_bits; + else + return rom_cruiser_bits[view]; +#endif + case 2: +#ifndef NOSHIPBITMAPS + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_bits; +#endif /*HOCKEY*/ + case SCOUT: + return kli_scout_bits[view]; + case DESTROYER: + return kli_destroyer_bits[view]; + case CRUISER: + return kli_cruiser_bits[view]; + case BATTLESHIP: + return kli_battleship_bits[view]; + case ASSAULT: + return kli_assault_bits[view]; + case STARBASE: + return kli_starbase_bits; + case JUMPSHIP: + return kli_jumpship_bits; + case FLAGSHIP: + return kli_galaxy_bits[view]; + case GALAXY: + return kli_galaxy_bits[view]; + case WARBASE: + return kli_warbase_bits; + case LIGHTCRUISER: + return kli_lightcruiser_bits[view]; + case CARRIER: + return kli_carrier_bits[view]; + case UTILITY: + return kli_utility_bits[view]; + case PATROL: + return kli_patrol_bits[view]; + } +#else + if (get_ship_nviews(shipn) == 1) + return kli_starbase_bits; + else + return kli_cruiser_bits[view]; +#endif + case 3: +#ifndef NOSHIPBITMAPS + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_bits; +#endif /*HOCKEY*/ + case SCOUT: + return ori_scout_bits[view]; + case DESTROYER: + return ori_destroyer_bits[view]; + case CRUISER: + return ori_cruiser_bits[view]; + case BATTLESHIP: + return ori_battleship_bits[view]; + case ASSAULT: + return ori_assault_bits[view]; + case STARBASE: + return ori_starbase_bits; + case JUMPSHIP: + return ori_jumpship_bits; + case FLAGSHIP: + return ori_galaxy_bits[view]; + case GALAXY: + return ori_galaxy_bits[view]; + case WARBASE: + return ori_warbase_bits; + case LIGHTCRUISER: + return ori_lightcruiser_bits[view]; + case CARRIER: + return ori_carrier_bits[view]; + case UTILITY: + return ori_utility_bits[view]; + case PATROL: + return ori_patrol_bits[view]; + } +#else + if (get_ship_nviews(shipn) == 1) + return ori_starbase_bits; + else + return ori_cruiser_bits[view]; +#endif + case -1: +#ifndef NOSHIPBITMAPS + switch (shipn) { +#ifdef HOCKEY + case PUCK: + return puck_bits; +#endif /*HOCKEY*/ + case SCOUT: + return ind_scout_bits[view]; + case DESTROYER: + return ind_destroyer_bits[view]; + case CRUISER: + return ind_cruiser_bits[view]; + case BATTLESHIP: + return ind_battleship_bits[view]; + case ASSAULT: + return ind_assault_bits[view]; + case STARBASE: + return ind_starbase_bits; + case JUMPSHIP: + return ind_starbase_bits; + case FLAGSHIP: + return ind_galaxy_bits[view]; + case GALAXY: + return ind_galaxy_bits[view]; + case WARBASE: + return ind_starbase_bits; + case LIGHTCRUISER: + return ind_lightcruiser_bits[view]; + case CARRIER: + return ind_carrier_bits[view]; + case UTILITY: + return ind_utility_bits[view]; + case PATROL: + return ind_patrol_bits[view]; + } +#else + if (get_ship_nviews(shipn) == 1) + return fed_starbase_bits; + else + return fed_cruiser_bits[view]; +#endif + } + return fed_cruiser_bits[view]; +} + + +/* points at the beginning of the fed ship shapes. Independent are + at negative indices */ +static struct ship_shape *all_ship_shapes = 0; + +struct ship_shape * +shape_of_ship(team, shipclass) + int team, shipclass; +{ + if (team < -1 || team >= number_of_teams || + shipclass < 0 || shipclass >= nshiptypes) + return &all_ship_shapes[-nshiptypes]; + return &all_ship_shapes[team * nshiptypes + shipclass]; +} + +void +clear_one_ship_shape(shp) + struct ship_shape *shp; +{ + int j; + for (j = 0; j < shp->nviews; j++) { + W_FreeBitmap(shp->bmap[j]); + } + shp->nviews = 0; + free(shp->bmap); + shp->bmap = 0; + W_FreeBitmap(shp->shield); + shp->shield = 0; +} + +void +free_shipshapes() +{ + /* don't forget that IND offset */ + int race, i; + if (!all_ship_shapes) /* if nothing there to begin with */ + return; + for (race = -1; race < number_of_teams; race++) { + for (i = 0; i < nshiptypes; i++) { + clear_one_ship_shape(shape_of_ship(race, i)); + } + } + free(all_ship_shapes - nshiptypes); + all_ship_shapes = 0; +} + +void +slurp_ship_bitmaps() +{ + int i, race, k; + int width, height, size = 0; + int nviews; /* NYI */ + unsigned char *buf = 0, *buf2; + char *freeme; + char *mainbitmapdir, *bitmapdir; + static char path[MAXPATHLEN]; + + if (all_ship_shapes == 0) { + all_ship_shapes = nshiptypes + (struct ship_shape *) + malloc(sizeof(*all_ship_shapes) * (number_of_teams + 1) * nshiptypes); + } + mainbitmapdir = stringDefault("shipBitmapPath", +#ifndef AMIGA /* worked this way, sort of... was annoying. */ + "/usr/games/lib/netrek" +#else + "netrek:graphics" +#endif /* AMIGA */ + ); + mainbitmapdir = expandFilename(mainbitmapdir); + + for (race = -1 /* IND */ ; race < number_of_teams; race++) { + freeme = NULL; + /* you can now have a different bitmapDir for each race [BDyess] */ + sprintf(path, "shipBitmapPath.%d", race); + if ((bitmapdir = getdefault(path)) == NULL) + bitmapdir = mainbitmapdir; + else + bitmapdir = freeme = expandFilename((char *) strdup(bitmapdir)); + for (k = 0; k < nshiptypes; k++) { + struct ship_shape *curr_shape = shape_of_ship(race, k); + FILE *fp; + sprintf(path, "%s/R%d.C%d", bitmapdir, race, k); + + fp = fopen(path, "r"); + if (fp == 0) { + if (errno != ENOENT) { + fprintf(stderr, "Error accessing ship bitmap file %s:", path); + perror(""); + } + nviews = get_ship_nviews(k, 0); + width = get_ship_width(race, k, 0); + height = get_ship_height(race, k, 0); + } else { + fread(&nviews, sizeof(nviews), 1, fp); + nviews = ntohl(nviews); + fread(&width, sizeof(width), 1, fp); + width = ntohl(width); + fread(&height, sizeof(height), 1, fp); + height = ntohl(height); + if (nviews > get_ship_nviews(k, 0)) + nviews = get_ship_nviews(k, 0); + size = (width + 7) / 8 * height; + buf = (unsigned char *) malloc(size); + } + + curr_shape->nviews = nviews /* nviews */ ; + curr_shape->width = width; + curr_shape->height = height; + curr_shape->shield = W_MakeShieldBitmap(width, height, w); + + curr_shape->bmap = (W_Icon *) malloc(sizeof(*curr_shape->bmap) * + nviews); + + for (i = 0; i < nviews; i++) { + if (fp) { + fread(buf, size, 1, fp); + curr_shape->bmap[i] = + W_StoreBitmap(width, height, buf, w); + } else { + buf2 = get_ship_bits(race, k, i); + curr_shape->bmap[i] = + W_StoreBitmap(width, height, buf2, w); + } + +#if 0 + /* these widths and heights are not necessarily correct */ + if (fp) + buf2 = get_ship_bits(race, k, i, blk_altbits); + else + buf2 = get_ship_bits(race, k, i, !blk_altbits); + + curr_shape->bmap[i + (blk_altbits ? 0 : nviews)] = + W_StoreBitmap(width, height, buf2, w); +#endif + } + + if (fp) { + free(buf); + fclose(fp); + } + } + if (freeme) + free(freeme); + } +} + +void +replace_shipshape(race, shiptype, nviews, width, height) + int race, shiptype, nviews, width, height; +{ + struct ship_shape *shp = shape_of_ship(race, shiptype); + int i; + + clear_one_ship_shape(shp); + + shp->nviews = nviews; + shp->bmap = (W_Icon *) malloc(sizeof(*shp->bmap) * nviews); + shp->width = width; + shp->height = height; + shp->shield = W_MakeShieldBitmap(width, height, w); + for (i = 0; i < nviews; i++) { + /* we really should check the files again. */ + shp->bmap[i] = W_StoreBitmap(get_ship_width(race, shiptype), + get_ship_height(race, shiptype), + get_ship_bits(race, shiptype, i, 0), + w); +#if 0 + shp->bmap[i + nviews] = W_StoreBitmap(get_ship_width(race, shiptype), + get_ship_height(race, shiptype), + get_ship_bits(race, shiptype, i, 0), + w); +#endif + } +} + + +void +replace_ship_bitmap(race, shiptype, view, bits) + int race, shiptype, view; + unsigned char *bits; +{ + struct ship_shape *shp = shape_of_ship(race, shiptype); + + if (view >= shp->nviews) { + fprintf(stderr, "race %d, ship class %d: view %d out of range (0..%d)\n", + race, shiptype, view, shp->nviews - 1); + return; + } + W_FreeBitmap(shp->bmap[view]); + /* store the bitmaps into the auxiliary view */ + shp->bmap[view] = W_StoreBitmap(shp->width, shp->height, bits, w); +}