Mercurial > ~darius > hgwebdir.cgi > paradise_server
diff src/tool-pl.c @ 8:0836fb919dfa
First entry of Paradise Server 2.9 patch 10 Beta
author | darius |
---|---|
date | Sat, 06 Dec 1997 04:37:05 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/tool-pl.c Sat Dec 06 04:37:05 1997 +0000 @@ -0,0 +1,328 @@ +/*-------------------------------------------------------------------------- +NETREK II -- Paradise + +Permission to use, copy, modify, and distribute this software and its +documentation, or any derivative works thereof, for any NON-COMMERCIAL +purpose and without fee is hereby granted, provided that this copyright +notice appear in all copies. No representations are made about the +suitability of this software for any purpose. This software is provided +"as is" without express or implied warranty. + + Xtrek Copyright 1986 Chris Guthrie + Netrek (Xtrek II) Copyright 1989 Kevin P. Smith + Scott Silvey + Paradise II (Netrek II) Copyright 1993 Larry Denys + Kurt Olsen + Brandon Gillespie +--------------------------------------------------------------------------*/ + +#include "config.h" + +#include <stdio.h> +#include "data.h" +#include "defs.h" +#include "shmem.h" +#include "tool-util.h" + +/* ------------------------------------------------------------------- */ +char *statnames[] = {"F", "O", "A", "E", "D", "Q"}; + +char *oldranknames[] = { + "Ensign", "Lieutenan", + "Lt. Cmdr.", "Commander", + "Captain", "Flt. Capt", + "Commodore", "Rear Adml", + "Admiral" +}; + +char *oldshiptypes[] = {"SC", "DD", "CA", "BB", "AS", "SB"}; + +/* ------------------------------------------------------------------- */ +char *maprank(struct player * p); +char *mapshiptype(struct player * p); +char *mapname(char *s); +char *fillcH(int width, char fchar); +char *typestat(struct player * p); + +/* -------------------------------[ Main ]----------------------------- */ +main(int argc, char **argv) +{ + int mode; + char monitor[17]; + char fh[33]; + int teams[9]; + int i, count; + struct player *j; + int usage = 0; + + argv0 = argv[0]; + + if (argc > 1) + { + if (argv[1][0] != '-') + { + usage++; + } + else + { + switch (argv[1][1]) + { + case 'h': + usage++; + break; + case 'd': + case 'r': + case 'l': + case 'o': + case 'M': + case 'p': + mode = argv[1][1]; + break; + default: + usage++; + break; + } + } + } + else + { + mode = '\0'; + } + + if (usage) + { + char *message[255] = { + "\n\t'%s [option]'\n", + "\nOptions:\n", + "\t-h help (this usage description)\n", + "\t-d Damage Status.\n", + "\t-r ?\n", + "\t-l Lag Statistics\n", + "\t-o Old style (NetrekI Ranks/ships)\n", + "\t-M Default (Metaserver)\n", + "\t-p PID\n\n", + "\0" + }; + + fprintf(stderr, "-- NetrekII (Paradise), %s --\n", PARAVERS); + for (i = 0; *message[i] != '\0'; i++) + fprintf(stderr, message[i], argv0); + + exit(1); + } + + openmem(0); + + for (count = 0, i = 0, j = players; i < MAXPLAYER; i++, j++) + { + if (j->p_status == PFREE) + continue; + count++; + } + + if (!count) + { + printf("No one is playing.\n"); + exit(0); + } + + for (i = 0; i < 9; i++) + teams[i] = 0; + + for (i = 0, j = players; i < MAXPLAYER; i++, j++) + { + if (j->p_status == PFREE) + { + continue; + } + teams[j->p_team]++; + } + + /* print the header #1 */ + printf("--==[ %d Player%s", count, + (count == 1 ? " ]=====[" : (count > 9 ? "s ]===[" : "s ]====["))); + printf(" Feds: %d ]=[ Roms: %d ]=[ Kli: %d ]=[ Ori: %d ]=====--\n", + teams[FED], teams[ROM], teams[KLI], teams[ORI]); + + /* print the header #2 */ + switch (mode) + { + case 'd': + printf("--==[ Name ]=========[ Type Kills Damage Shields Armies Fuel ]======--\n"); + break; + case 'r': + printf("--==[ Name ]=========[ Status Type Genocides MaxKills DI ]====--\n"); + break; + case 'l': + printf("--==[ Name ]============[ Average Stnd Dev Loss ]==================--\n"); + break; + case 'M': + case 'o': + case '\0': + printf("--=======[ Rank ]====[ Name ]=========[ Address ]======================--\n"); + break; + case 'p': + printf("--========[ PID ]===[ Name ]==========[ Address ]======================--\n"); + break; + } + + for (i = 0, j = players; i < MAXPLAYER; i++, j++) + { + if (j->p_status == PFREE) + { + continue; + } + switch (mode) + { + case 'd': + printf(" %2s: %-16s %2s %6.2f %6d %7d %6d %6d\n", + twoletters(j), j->p_name, + typestat(j), + j->p_kills, + j->p_damage, + j->p_shield, + j->p_armies, + j->p_fuel); + break; + case 'r': + printf(" %2s: %-16s %s/%-4d %2s %7d %9.1f %10.2f\n", + twoletters(j), + j->p_name, + statnames[j->p_status], + j->p_ghostbuster, + typestat(j), + j->p_stats.st_genocides, + j->p_stats.st_tmaxkills, + j->p_stats.st_di); + break; + case 'l': + printf(" %2s: %-16s %7d ms %7d ms %5d%%\n", + twoletters(j), + j->p_name, + j->p_avrt, + j->p_stdv, + j->p_pkls); + break; + case 'o': + if (i > 19) + continue; /* show only first 20 */ + + strncpy(fh, j->p_full_hostname, 32); + fh[32] = 0; + printf(" %2s: %2s %-9.9s %-16s %s@%s\n", + twoletters(j), mapshiptype(j), maprank(j), + mapname(j->p_name), j->p_login, fh); + break; + case 'p': + strncpy(fh, j->p_full_hostname, 32); + fh[32] = 0; + printf(" %c%2s: %2s %-9d %-16s %s@%s\n", + (j->p_stats.st_flags & ST_CYBORG) ? '*' : ' ', + twoletters(j), typestat(j), + j->p_ntspid, + j->p_name, + j->p_login, + fh); + break; + case 'M': + case '\0': + strncpy(fh, j->p_full_hostname, 32); + fh[32] = 0; + printf(" %c%2s: %2s %-11.11s %-16s %s@%s\n", + (j->p_stats.st_flags & ST_CYBORG) ? '*' : ' ', + twoletters(j), typestat(j), + j->p_stats.st_royal ? royal[j->p_stats.st_royal].name + : ranks[j->p_stats.st_rank].name, + j->p_name, + j->p_login, + fh); + break; + } + } + + printf("--==[ NetrekII (Paradise), %s ]%s--\n", PARAVERS, fillcH((63 - strlen(PARAVERS)), '=')); +} + +/* ---------------------------[ Functions ]--------------------------- */ + +/* + * map rank into one of the original netrek rank names for compatibility with + * the metaserver + */ +char * +maprank(struct player * p) +{ + int r; + + r = (int) (10 * (p->p_stats.st_rank / (float) NUMRANKS)); + if (r < 0) + r = 0; + if (r > 8) + r = 8; + return oldranknames[r]; +} + +char * +mapshiptype(struct player * p) +{ + int n; + + n = p->p_ship.s_alttype; + if (n > 5) + n = 5; + + return oldshiptypes[n]; +} + +char * +mapname(char *s) +{ + char newname[17]; + + if (*s == ' ') + { + strncpy(newname, s, 16); + newname[0] = '_'; + return newname; + } + else + return s; +} + +/* fills with fchar up to width (width must be less than 255) */ +char * +fillcH(int width, char fchar) +{ + char buf[width]; + int i; + + for (i = 0; i < width; i++) + buf[i] = fchar; + + return buf; +} + +char * +typestat(struct player * p) +{ + char str[3]; + + switch (p->p_status) + { + case PALIVE: + case PEXPLODE: + str[0] = p->p_ship.s_desig1; + str[1] = p->p_ship.s_desig2; + str[3] = 0; + return str; + case PTQUEUE: + return "tq"; + case POBSERVE: + return "ob"; + case POUTFIT: + return "of"; + case PDEAD: + default: + return "--"; + } +}