view planetlist.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: planetlist.c,v 1.1.1.1 1997/12/06 05:41:29 darius Exp $ */

/*
 * planetlist.c
 */
#include "copyright.h"
#include <stdio.h>
#include <string.h>

#include "Wlib.h"
#include "defs.h"
#include "struct.h"
#include "data.h"
#include "proto.h"

/* Prototypes */
static void planet_list_paradise P((void));
static void planet_list_normal P((void));
static void print_planet P((W_Window wind, int line, struct planet * j));

static char *teamname[5] = {
    "IND",
    "FED",
    "ROM",
    "KLI",
    "ORI"
};

/*
** Open a window which contains all the planets and their current
** statistics.  Players will not know about planets that their team
** has not orbited.
*/

void
planetlist()
{
    /*
       W_ClearWindow(planetw);
    */
    if (!paradise) {		/* if not a paradise server then */
	planet_list_normal();
    } else {			/* else must be a paradise server */
	planet_list_paradise();
    }
}


/*This function provides the planet list for a normal server. */

static void
planet_list_normal()
{
    int     k = 0;		/* for row number */
    int     i;			/* looping var */
    struct planet *j;		/* to point to a planet */
    char    buf[100];		/* to sprintf into */
    char    buf1[40];
    W_Window wind;

    wind = planetw;

    for (i = 0, j = &planets[i]; i < nplanets; i++, j++) {
	if (i == 0 || i == nplanets / 2) {
	    if (i != 0) {
		wind = planetw2;
	    }
	    sprintf(buf, "Planet name           Own Armies      Resources          Info");
	    W_WriteText(wind, 2, 1, textColor, buf, strlen(buf), W_RegularFont);
	    k = 2;
	}
	sprintf(buf1, "%-16s ", j->pl_name);
	if (j->pl_info & idx_to_mask(me->p_teami)) {
	    sprintf(buf, "%3s %3d       %s%s%s      %s    ",
		    teamname[mask_to_idx(j->pl_owner) + 1],
		    j->pl_armies,
		    (j->pl_flags & PLREPAIR ? "REPR " : "     "),
		    (j->pl_flags & PLFUEL ? "FUEL " : "     "),
		    (j->pl_flags & PLAGRI ? "AGRI " : "     "),
		    team_bit_string(j->pl_info));
	    W_WriteText(wind, 2, k, planetColor(j), buf1, strlen(buf1),
			planetFont(j));
	    W_WriteText(wind, 24, k++, planetColor(j), buf, strlen(buf),
			planetFont(j));
	}
	/* end of have info */
	else {			/* else no info on planet */
	    W_WriteText(wind, 2, k++, planetColor(j), buf1, strlen(buf1),
			planetFont(j));
	}
    }				/* end of for loop */

}



/*This function provides the planet list for a paradise server version 2.0 */

static void
planet_list_paradise()
{
    typedef struct planet *plptr;

    int     k = 0;		/* for row number */
    int     i, team_pnum;	/* looping var */
    plptr   j;			/* to point to a planet */
    char    buf[100];		/* to sprintf into */
    W_Window wind;
    extern int number_of_teams;
    plptr **team_p;
    int    *team_pcount;

    wind = planetw;

    /* this malloc stuff will handle any number of teams/races */

    /* team's planet counters */
    team_pcount = (int *) malloc((number_of_teams + 1) * sizeof(int));
    for (i = 0; i < number_of_teams + 1; i++)
	team_pcount[i] = 0;

    if (mapSort) {
	/* make some memory */
	team_p = (plptr **) malloc((number_of_teams + 1) * sizeof(struct planet *));
	for (i = 0; i < (number_of_teams + 1); i++)
	    team_p[i] = (plptr *) malloc(nplanets * sizeof(struct planet *));

	/* loop thru and put proper team planeter point on each planet */
	for (i = 0, j = &planets[i]; i < nplanets; i++, j++) {
	    k = mask_to_idx(j->pl_owner) + 1;	/* which team gets planet */
	    team_p[k][team_pcount[k]] = j;
	    team_pcount[k]++;
	}

	/* go thru each teams planet list and display */
	for (i = 0, k = 0; i < (number_of_teams + 1); i++) {
	    for (team_pnum = 0; team_pnum < team_pcount[i]; team_pnum++, k++) {

		j = team_p[i][team_pnum];
		/* (nplanets+13)/2 is the height of window; from newwin.c */
		if (k == 0 || k >= ((nplanets + 13) / 2)) {
		    if (k != 0)
			wind = planetw2;
		    sprintf(buf, "Planet name      sctr own armies RESOURCES  SURFC  ATMOS    VISIT    TIME");
		    W_WriteText(wind, 2, 1, textColor, buf, strlen(buf), W_RegularFont);
		    k = 2;
		}
		print_planet(wind, k, j);
	    }			/* end of 2nd for */
	    if (team_pcount[i] > 0)
		k++;
	}			/* end of 1st for */

	for (i = 0; i < (number_of_teams + 1); i++)
	    free(team_p[i]);
	free(team_p);
    } else {			/* do the original alpa only sort planet list */

	for (i = 0, j = &planets[i]; i < nplanets; i++, j++, k++) {
	    if (i == 0 || i == nplanets / 2) {

		sprintf(buf, "Planet name      sctr own armies RESOURCES  SURFC  ATMOS    VISIT    TIME");

		if (i != 0) {
		    wind = planetw2;
		}
		W_WriteText(wind, 2, 1, textColor, buf, strlen(buf), W_RegularFont);
		k = 2;
	    }
	    team_pcount[mask_to_idx(j->pl_owner) + 1]++;
	    print_planet(wind, k, j);
	}
    }

    k++;
    for (i = 0; i < (number_of_teams + 1); i++) {
	W_Color cur_color;

	cur_color = shipCol[i];
	sprintf(buf, "%s: ", teamname[i]);
	W_WriteText(wind, i * 7 + 2, k, cur_color, buf, strlen(buf), W_RegularFont);
	sprintf(buf, " %.2i", team_pcount[i]);
	W_WriteText(wind, i * 7 + 2, k + 1, cur_color, buf, strlen(buf), W_RegularFont);
    }

    free(team_pcount);

}				/* end of planet_list_paradise */


/****************************** print_planet() ************************/
static void
print_planet(wind, line, j)
    W_Window wind;
    int     line;
    struct planet *j;
{
    char    buf[100];		/* to sprintf into */

    sprintf(buf, "%-16s %d-%d", j->pl_name, (j->pl_x / GRIDSIZE) + 1,
	    (j->pl_y / GRIDSIZE) + 1);
    W_WriteText(wind, 2, line, textColor, buf, strlen(buf),
		W_RegularFont);

    if (j->pl_info & idx_to_mask(me->p_teami)) {
	if (PL_TYPE(*j) == PLSTAR) {	/* if planet actually a star */
	    W_WriteText(wind, 24, line, textColor, "---S T A R---", 13,
		       W_RegularFont);
	} else if (PL_TYPE(*j) == PLWHOLE) { /* if wormhole... */
	   W_WriteText(wind, 24, line, textColor, "---W O R M H O L E---", 21,
			W_RegularFont);
	} else {		/* else planet not a star */
	    char   *s = NULL;

	    switch (j->pl_flags & PLATMASK) {
	    case PLPOISON:
		s = "TOXC";
		break;
	    case PLATYPE3:
		s = "TNTD";
		break;
	    case PLATYPE2:
		s = "THIN";
		break;
	    case PLATYPE1:
		s = "STND";
		break;
	    };
	    sprintf(buf, "%3s %3d       %c%c%c%c     %c%c%c    %4s",
		    teamname[mask_to_idx(j->pl_owner) + 1],
		    j->pl_armies,
		    (j->pl_flags & PLREPAIR ? 'R' : ' '),
		    (j->pl_flags & PLFUEL ? 'F' : ' '),
		    (j->pl_flags & PLAGRI ? 'A' : ' '),
		    (j->pl_flags & PLSHIPYARD ? 'S' : ' '),
		    (j->pl_flags & PLDILYTH ? 'D' : ' '),
		    (j->pl_flags & PLMETAL ? 'M' : ' '),
		    (j->pl_flags & PLARABLE ? 'A' : ' '),
		    s);

	    W_WriteText(wind, 24, line, planetColor(j), buf, strlen(buf),
			planetFont(j));

	    sprintf(buf, "%4s   %3ld",
		    team_bit_string(j->pl_info),
		    ((idx_to_mask(me->p_teami) == j->pl_owner) ? 0 : (status2->clock - j->pl_timestamp)));

	    W_WriteText(wind, 64, line, planetColor(j), buf, strlen(buf),
			planetFont(j));
	}
    } else {
	sprintf(buf, "--- No info; Scout me ---");
	W_WriteText(wind, 24, line, textColor, buf, strlen(buf),
		    W_RegularFont);
    }
}				/* end of print_planet */