comparison src/tool-ds.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 #include "shmem.h"
21 #include "structdesc.h"
22 #include "data.h"
23
24 /* ----------------[ prototypes because I like main first ]---------------- */
25 void dump_ship_sysdef(void);
26 void dump_ship_Ccode(void);
27 void dump_ships_to_table(void);
28 void describe_ship(int ship);
29 void usage(char name[]);
30
31 /* --[ rather than duplicate it 3 times make the macro from hell (shrug) ]-- */
32 #define Print_value(place) { \
33 switch (ship_fields[place].type) { \
34 case FT_CHAR: \
35 printf("%c", *(char *) temp); \
36 break; \
37 case FT_SHORT: \
38 printf("%d", *(short *) temp); \
39 break; \
40 case FT_INT: \
41 printf("%d", *(int *) temp); \
42 break; \
43 case FT_LONG: \
44 printf("%ld", *(long *) temp); \
45 break; \
46 case FT_FLOAT: \
47 printf("%g", *(float *) temp); \
48 break; \
49 case FT_STRING: \
50 printf("%s", (char *) temp); \
51 break; \
52 case FT_LONGFLAGS: \
53 { \
54 int zz = 0; \
55 char **names = (char **) ship_fields[place].aux; \
56 long flag = *(long *) temp; \
57 int first = 1; \
58 for (zz = 0; names[zz]; zz++) { \
59 if (flag & (1 << zz)) { \
60 printf("%s%s", first ? "" : ",", names[zz]); \
61 first = 0; \
62 } \
63 } \
64 } \
65 break; \
66 default: \
67 printf("unknown type"); \
68 break; \
69 } \
70 }
71
72 char *shipTYPES[] = {
73 "SCOUT",
74 "DESTROYER",
75 "CRUISER",
76 "BATTLESHIP",
77 "ASSAULT",
78 "STARBASE",
79 "ATT",
80 "JUMPSHIP",
81 "FRIGATE",
82 "WARBASE",
83 "LIGHTCRUISER",
84 "CARRIER"
85 };
86
87 struct nflags_desc_
88 {
89 int flag;
90 char *meaning;
91 } nflags_desc[] =
92 {
93 {
94 SFNUNDOCKABLE, "can not dock with another ship"
95 },
96 {
97 SFNCANORBIT, "can orbit hostile worlds"
98 },
99 {
100 SFNCANWARP, "has warp engines"
101 },
102 {
103 SFNCANFUEL, "can transfer fuel to docked ships"
104 },
105 {
106 SFNCANREPAIR, "can speed repair of docked ships"
107 },
108 {
109 SFNCANREFIT, "can let docked ships refit"
110 },
111 {
112 SFNARMYNEEDKILL, "needs kills to carry armies"
113 },
114 {
115 SFNHASPHASERS, "is armed with phasers"
116 },
117 {
118 SFNPLASMASTYLE, "360 arc of fire for plasmas"
119 },
120 {
121 SFNPLASMAARMED, "is armed with plasmas by default"
122 },
123 {
124 SFNHASMISSILE, "is armed with missiles by default"
125 },
126 {
127 SFNHASFIGHTERS, "has a fighter bay"
128 },
129 {
130 0, 0
131 }
132 };
133
134 /* ==============================[ Functions ]============================== */
135
136 int
137 main(int argc, char **argv)
138 {
139 int i, droutine = 0;
140 char *name;
141
142 name = *argv++;
143 argc--;
144
145 if (argc != 1)
146 usage(name);
147
148 while (*argv)
149 {
150 if (**argv == '-')
151 ++* argv;
152 else
153 break;
154 switch (**argv)
155 {
156 case 's': /* sysdef */
157 droutine = 1;
158 break;
159 case 'c': /* C Code */
160 droutine = 2;
161 break;
162 case 't': /* table */
163 droutine = 3;
164 break;
165 case 'v': /* verbose */
166 droutine = 4;
167 break;
168 default:
169 printf("! %s: Unknown option '-%c'\n", name, **argv);
170 usage(name);
171 }
172 }
173
174 /* start up a daemon if we need to */
175 openmem(1, 0);
176
177 /*
178 * do this with two switches because we don't want to fire up the daemon if
179 * we don't need to
180 */
181 switch (droutine)
182 {
183 case 1: /* Sysdef */
184 dump_ship_sysdef();
185 break;
186 case 2: /* C Code */
187 dump_ship_Ccode();
188 break;
189 case 3: /* Table */
190 dump_ships_to_table();
191 break;
192 case 4:
193 { /* Verbose */
194 ++*argv;
195 if (!**argv)
196 {
197 for (i = 0; i < NUM_TYPES; i++)
198 describe_ship(i);
199 }
200 else
201 {
202 describe_ship(atoi(*argv));
203 }
204 break; /* for old times sake */
205 } /* case 4 (Braces on this one because it
206 * looks nice, thats all */
207 } /* switch */
208 }
209
210 /* ------------------[ Print ship stats in sysdef format ]------------------ */
211 void
212 dump_ship_sysdef(void)
213 {
214 int j, i;
215
216 for (i = 0; i < NUM_TYPES; i++)
217 {
218 struct ship *shp = &shipvals[i];
219 printf("SHIP=%d\n", i);
220 for (j = 0; ship_fields[j].name; j++)
221 {
222 void *temp = ship_fields[j].offset + (char *) shp;
223
224 printf("%c%c %-24s",
225 shp->s_desig1, shp->s_desig2, ship_fields[j].name);
226 Print_value(j);
227 printf("\n");
228 }
229 printf("end\n");
230 }
231 }
232
233 /* ----------------[ Print ship stats in a C syntax format ]---------------- */
234 void
235 dump_ship_Ccode(void)
236 {
237 int j, i;
238
239 for (i = 0; i < NUM_TYPES; i++)
240 {
241 struct ship *shp = &shipvals[i];
242 printf(" /* comprehensive definition of %s */\n", shipTYPES[i]);
243 for (j = 0; ship_fields[j].name; j++)
244 {
245 void *temp = ship_fields[j].offset + (char *) shp;
246
247 if (ship_fields[j].type == FT_STRING)
248 {
249 printf(" strcpy(shipvals[%s].s_%s, \"%s\")", shipTYPES[i],
250 ship_fields[j].name, (char *) temp);
251 }
252 else
253 {
254 printf(" shipvals[%s].s_%s = ",
255 shipTYPES[i], ship_fields[j].name);
256 Print_value(j);
257 }
258 printf(";\n");
259 }
260 printf("\n");
261 }
262 }
263
264 /* -----------------[ Print ship stats in a table format ]----------------- */
265 void
266 dump_ships_to_table(void)
267 {
268 int x, j, i;
269
270 /*
271 * we have to find the max element of the ship fields, this is the only way
272 * I know of so far (BG)
273 */
274
275 printf("Ship Statistics:\n");
276 for (i = 0; ship_fields[i].name; i++)
277 {
278 printf("%-13s ", ship_fields[i].name);
279 for (j = 0; j < NUM_TYPES; j++)
280 {
281 struct ship *shp = &shipvals[j];
282 void *temp = (ship_fields[i].offset + (char *) shp);
283
284 /* we do this one differently so don't use Print_value() */
285 switch (ship_fields[i].type)
286 {
287 case FT_CHAR:
288 printf("%6c ", *(char *) temp);
289 break;
290 case FT_SHORT:
291 printf("%6d ", *(short *) temp);
292 break;
293 case FT_INT:
294 printf("%6d ", *(int *) temp);
295 break;
296 case FT_LONG:
297 printf("%6ld ", *(long *) temp);
298 break;
299 case FT_FLOAT:
300 printf("%6g ", *(float *) temp);
301 break;
302 case FT_STRING:
303 printf("%6s ", (char *) temp);
304 break;
305 default:
306 break;
307 }
308 }
309 printf("\n");
310 }
311 }
312
313
314 /* -------------------------[ Verbose description ]------------------------- */
315 void
316 describe_ship(int s_no)
317 {
318 struct ship *sp = &shipvals[s_no];
319 int i;
320
321 printf("The %s\n", sp->s_name);
322 for (i = 0; nflags_desc[i].flag; i++)
323 {
324 if ((sp->s_nflags & nflags_desc[i].flag) != nflags_desc[i].flag)
325 continue;
326 printf("\t%s\n", nflags_desc[i].meaning);
327 }
328 }
329
330
331 /* ----------------------------[ Prints usage ]---------------------------- */
332 void
333 usage(char name[])
334 {
335 int x;
336
337 char errmsg[][255] = {
338 "\n\t'%s <format option>'\n\n",
339 "This tool will dump all ship values, configurable to 3 formats:\n",
340 "\t-s -- .sysdef Format\n",
341 "\t-c -- C code Format\n",
342 "\t-t -- Table Format (best printed with 8 point font)\n",
343 "\t-v# -- Verbose Format (optional ship number)\n",
344 ""
345 };
346
347 printf("-- NetrekII (Paradise), %s --\n", PARAVERS);
348 for (x = 0; *errmsg[x] != NULL; x++)
349 printf(errmsg[x], name);
350
351 exit(1);
352 }