comparison 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
comparison
equal deleted inserted replaced
7:814de70c9f67 8:0836fb919dfa
1 /*--------------------------------------------------------------------------
2 NETREK II -- Paradise
3
4 Permission to use, copy, modify, and distribute this software and its
5 documentation, or any derivative works thereof, for any NON-COMMERCIAL
6 purpose and without fee is hereby granted, provided that this copyright
7 notice appear in all copies. No representations are made about the
8 suitability of this software for any purpose. This software is provided
9 "as is" without express or implied warranty.
10
11 Xtrek Copyright 1986 Chris Guthrie
12 Netrek (Xtrek II) Copyright 1989 Kevin P. Smith
13 Scott Silvey
14 Paradise II (Netrek II) Copyright 1993 Larry Denys
15 Kurt Olsen
16 Brandon Gillespie
17 --------------------------------------------------------------------------*/
18
19 #include "config.h"
20
21 #include <stdio.h>
22 #include "data.h"
23 #include "defs.h"
24 #include "shmem.h"
25 #include "tool-util.h"
26
27 /* ------------------------------------------------------------------- */
28 char *statnames[] = {"F", "O", "A", "E", "D", "Q"};
29
30 char *oldranknames[] = {
31 "Ensign", "Lieutenan",
32 "Lt. Cmdr.", "Commander",
33 "Captain", "Flt. Capt",
34 "Commodore", "Rear Adml",
35 "Admiral"
36 };
37
38 char *oldshiptypes[] = {"SC", "DD", "CA", "BB", "AS", "SB"};
39
40 /* ------------------------------------------------------------------- */
41 char *maprank(struct player * p);
42 char *mapshiptype(struct player * p);
43 char *mapname(char *s);
44 char *fillcH(int width, char fchar);
45 char *typestat(struct player * p);
46
47 /* -------------------------------[ Main ]----------------------------- */
48 main(int argc, char **argv)
49 {
50 int mode;
51 char monitor[17];
52 char fh[33];
53 int teams[9];
54 int i, count;
55 struct player *j;
56 int usage = 0;
57
58 argv0 = argv[0];
59
60 if (argc > 1)
61 {
62 if (argv[1][0] != '-')
63 {
64 usage++;
65 }
66 else
67 {
68 switch (argv[1][1])
69 {
70 case 'h':
71 usage++;
72 break;
73 case 'd':
74 case 'r':
75 case 'l':
76 case 'o':
77 case 'M':
78 case 'p':
79 mode = argv[1][1];
80 break;
81 default:
82 usage++;
83 break;
84 }
85 }
86 }
87 else
88 {
89 mode = '\0';
90 }
91
92 if (usage)
93 {
94 char *message[255] = {
95 "\n\t'%s [option]'\n",
96 "\nOptions:\n",
97 "\t-h help (this usage description)\n",
98 "\t-d Damage Status.\n",
99 "\t-r ?\n",
100 "\t-l Lag Statistics\n",
101 "\t-o Old style (NetrekI Ranks/ships)\n",
102 "\t-M Default (Metaserver)\n",
103 "\t-p PID\n\n",
104 "\0"
105 };
106
107 fprintf(stderr, "-- NetrekII (Paradise), %s --\n", PARAVERS);
108 for (i = 0; *message[i] != '\0'; i++)
109 fprintf(stderr, message[i], argv0);
110
111 exit(1);
112 }
113
114 openmem(0);
115
116 for (count = 0, i = 0, j = players; i < MAXPLAYER; i++, j++)
117 {
118 if (j->p_status == PFREE)
119 continue;
120 count++;
121 }
122
123 if (!count)
124 {
125 printf("No one is playing.\n");
126 exit(0);
127 }
128
129 for (i = 0; i < 9; i++)
130 teams[i] = 0;
131
132 for (i = 0, j = players; i < MAXPLAYER; i++, j++)
133 {
134 if (j->p_status == PFREE)
135 {
136 continue;
137 }
138 teams[j->p_team]++;
139 }
140
141 /* print the header #1 */
142 printf("--==[ %d Player%s", count,
143 (count == 1 ? " ]=====[" : (count > 9 ? "s ]===[" : "s ]====[")));
144 printf(" Feds: %d ]=[ Roms: %d ]=[ Kli: %d ]=[ Ori: %d ]=====--\n",
145 teams[FED], teams[ROM], teams[KLI], teams[ORI]);
146
147 /* print the header #2 */
148 switch (mode)
149 {
150 case 'd':
151 printf("--==[ Name ]=========[ Type Kills Damage Shields Armies Fuel ]======--\n");
152 break;
153 case 'r':
154 printf("--==[ Name ]=========[ Status Type Genocides MaxKills DI ]====--\n");
155 break;
156 case 'l':
157 printf("--==[ Name ]============[ Average Stnd Dev Loss ]==================--\n");
158 break;
159 case 'M':
160 case 'o':
161 case '\0':
162 printf("--=======[ Rank ]====[ Name ]=========[ Address ]======================--\n");
163 break;
164 case 'p':
165 printf("--========[ PID ]===[ Name ]==========[ Address ]======================--\n");
166 break;
167 }
168
169 for (i = 0, j = players; i < MAXPLAYER; i++, j++)
170 {
171 if (j->p_status == PFREE)
172 {
173 continue;
174 }
175 switch (mode)
176 {
177 case 'd':
178 printf(" %2s: %-16s %2s %6.2f %6d %7d %6d %6d\n",
179 twoletters(j), j->p_name,
180 typestat(j),
181 j->p_kills,
182 j->p_damage,
183 j->p_shield,
184 j->p_armies,
185 j->p_fuel);
186 break;
187 case 'r':
188 printf(" %2s: %-16s %s/%-4d %2s %7d %9.1f %10.2f\n",
189 twoletters(j),
190 j->p_name,
191 statnames[j->p_status],
192 j->p_ghostbuster,
193 typestat(j),
194 j->p_stats.st_genocides,
195 j->p_stats.st_tmaxkills,
196 j->p_stats.st_di);
197 break;
198 case 'l':
199 printf(" %2s: %-16s %7d ms %7d ms %5d%%\n",
200 twoletters(j),
201 j->p_name,
202 j->p_avrt,
203 j->p_stdv,
204 j->p_pkls);
205 break;
206 case 'o':
207 if (i > 19)
208 continue; /* show only first 20 */
209
210 strncpy(fh, j->p_full_hostname, 32);
211 fh[32] = 0;
212 printf(" %2s: %2s %-9.9s %-16s %s@%s\n",
213 twoletters(j), mapshiptype(j), maprank(j),
214 mapname(j->p_name), j->p_login, fh);
215 break;
216 case 'p':
217 strncpy(fh, j->p_full_hostname, 32);
218 fh[32] = 0;
219 printf(" %c%2s: %2s %-9d %-16s %s@%s\n",
220 (j->p_stats.st_flags & ST_CYBORG) ? '*' : ' ',
221 twoletters(j), typestat(j),
222 j->p_ntspid,
223 j->p_name,
224 j->p_login,
225 fh);
226 break;
227 case 'M':
228 case '\0':
229 strncpy(fh, j->p_full_hostname, 32);
230 fh[32] = 0;
231 printf(" %c%2s: %2s %-11.11s %-16s %s@%s\n",
232 (j->p_stats.st_flags & ST_CYBORG) ? '*' : ' ',
233 twoletters(j), typestat(j),
234 j->p_stats.st_royal ? royal[j->p_stats.st_royal].name
235 : ranks[j->p_stats.st_rank].name,
236 j->p_name,
237 j->p_login,
238 fh);
239 break;
240 }
241 }
242
243 printf("--==[ NetrekII (Paradise), %s ]%s--\n", PARAVERS, fillcH((63 - strlen(PARAVERS)), '='));
244 }
245
246 /* ---------------------------[ Functions ]--------------------------- */
247
248 /*
249 * map rank into one of the original netrek rank names for compatibility with
250 * the metaserver
251 */
252 char *
253 maprank(struct player * p)
254 {
255 int r;
256
257 r = (int) (10 * (p->p_stats.st_rank / (float) NUMRANKS));
258 if (r < 0)
259 r = 0;
260 if (r > 8)
261 r = 8;
262 return oldranknames[r];
263 }
264
265 char *
266 mapshiptype(struct player * p)
267 {
268 int n;
269
270 n = p->p_ship.s_alttype;
271 if (n > 5)
272 n = 5;
273
274 return oldshiptypes[n];
275 }
276
277 char *
278 mapname(char *s)
279 {
280 char newname[17];
281
282 if (*s == ' ')
283 {
284 strncpy(newname, s, 16);
285 newname[0] = '_';
286 return newname;
287 }
288 else
289 return s;
290 }
291
292 /* fills with fchar up to width (width must be less than 255) */
293 char *
294 fillcH(int width, char fchar)
295 {
296 char buf[width];
297 int i;
298
299 for (i = 0; i < width; i++)
300 buf[i] = fchar;
301
302 return buf;
303 }
304
305 char *
306 typestat(struct player * p)
307 {
308 char str[3];
309
310 switch (p->p_status)
311 {
312 case PALIVE:
313 case PEXPLODE:
314 str[0] = p->p_ship.s_desig1;
315 str[1] = p->p_ship.s_desig2;
316 str[3] = 0;
317 return str;
318 case PTQUEUE:
319 return "tq";
320 case POBSERVE:
321 return "ob";
322 case POUTFIT:
323 return "of";
324 case PDEAD:
325 default:
326 return "--";
327 }
328 }