]> git.pond.sub.org Git - empserver/blob - src/lib/commands/dump.c
3ad1f21ffc1336eb5ec418e843118ebe0f9ceaba
[empserver] / src / lib / commands / dump.c
1 /*
2  *  Empire - A multi-player, client/server Internet based war game.
3  *  Copyright (C) 1986-2008, Dave Pare, Jeff Bailey, Thomas Ruschak,
4  *                           Ken Stevens, Steve McClure
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  *  ---
21  *
22  *  See files README, COPYING and CREDITS in the root of the source
23  *  tree for related information and legal notices.  It is expected
24  *  that future projects/authors will amend these files as needed.
25  *
26  *  ---
27  *
28  *  dump.c: Dump sector information
29  *
30  *  Known contributors to this file:
31  *     Jeff Wallace, 1989
32  *     Steve McClure, 1997 (added timestamping)
33  */
34
35 #include <config.h>
36
37 #include "commands.h"
38 #include "optlist.h"
39 #include "path.h"
40
41 int
42 dump(void)
43 {
44     struct sctstr sect;
45     char dirstr[20];
46     int nsect;
47     int n, i;
48     struct nstr_sect nstr;
49     int field[128];
50     struct natstr *np;
51     time_t now;
52
53     if (!snxtsct(&nstr, player->argp[1]))
54         return RET_SYN;
55     prdate();
56     (void)strcpy(dirstr, ".      $");
57     n = 1;
58     for (n = 1; n <= 6; n++)
59         dirstr[n] = dirch[n];
60     nsect = 0;
61     np = getnatp(player->cnum);
62
63     if (!player->argp[2]) {
64         for (n = 1; n <= 80; n++)
65             field[n - 1] = n;
66         field[n - 1] = 0;
67     } else {
68         n = 2;
69         i = 0;
70         while (player->argp[n]) {
71             if (!strcmp("des", player->argp[n])) {
72                 field[i++] = 1;
73             } else if (!strcmp("sdes", player->argp[n])) {
74                 field[i++] = 2;
75             } else if (!strcmp("eff", player->argp[n])) {
76                 field[i++] = 3;
77             } else if (!strcmp("mob", player->argp[n])) {
78                 field[i++] = 4;
79             } else if (!strcmp("*", player->argp[n])) {
80                 field[i++] = 5;
81             } else if (!strcmp("off", player->argp[n])) {
82                 field[i++] = 6;
83             } else if (!strcmp("min", player->argp[n])) {
84                 field[i++] = 7;
85             } else if (!strcmp("gold", player->argp[n])) {
86                 field[i++] = 8;
87             } else if (!strcmp("fert", player->argp[n])) {
88                 field[i++] = 9;
89             } else if (!strcmp("ocontent", player->argp[n])) {
90                 field[i++] = 10;
91             } else if (!strcmp("uran", player->argp[n])) {
92                 field[i++] = 11;
93             } else if (!strcmp("work", player->argp[n])) {
94                 field[i++] = 12;
95             } else if (!strcmp("avail", player->argp[n])) {
96                 field[i++] = 13;
97             } else if (!strcmp("terr", player->argp[n])) {
98                 field[i++] = 14;
99             } else if (!strcmp("civ", player->argp[n])) {
100                 field[i++] = 15;
101             } else if (!strcmp("mil", player->argp[n])) {
102                 field[i++] = 16;
103             } else if (!strcmp("uw", player->argp[n])) {
104                 field[i++] = 17;
105             } else if (!strcmp("food", player->argp[n])) {
106                 field[i++] = 18;
107             } else if (!strcmp("shell", player->argp[n])) {
108                 field[i++] = 19;
109             } else if (!strcmp("gun", player->argp[n])) {
110                 field[i++] = 20;
111             } else if (!strcmp("pet", player->argp[n])) {
112                 field[i++] = 21;
113             } else if (!strcmp("iron", player->argp[n])) {
114                 field[i++] = 22;
115             } else if (!strcmp("dust", player->argp[n])) {
116                 field[i++] = 23;
117             } else if (!strcmp("bar", player->argp[n])) {
118                 field[i++] = 24;
119             } else if (!strcmp("oil", player->argp[n])) {
120                 field[i++] = 25;
121             } else if (!strcmp("lcm", player->argp[n])) {
122                 field[i++] = 26;
123             } else if (!strcmp("hcm", player->argp[n])) {
124                 field[i++] = 27;
125             } else if (!strcmp("rad", player->argp[n])) {
126                 field[i++] = 28;
127             } else if (!strcmp("u_del", player->argp[n])) {
128                 field[i++] = 29;
129             } else if (!strcmp("f_del", player->argp[n])) {
130                 field[i++] = 30;
131             } else if (!strcmp("s_del", player->argp[n])) {
132                 field[i++] = 31;
133             } else if (!strcmp("g_del", player->argp[n])) {
134                 field[i++] = 32;
135             } else if (!strcmp("p_del", player->argp[n])) {
136                 field[i++] = 33;
137             } else if (!strcmp("i_del", player->argp[n])) {
138                 field[i++] = 34;
139             } else if (!strcmp("d_del", player->argp[n])) {
140                 field[i++] = 35;
141             } else if (!strcmp("b_del", player->argp[n])) {
142                 field[i++] = 36;
143             } else if (!strcmp("o_del", player->argp[n])) {
144                 field[i++] = 37;
145             } else if (!strcmp("l_del", player->argp[n])) {
146                 field[i++] = 38;
147             } else if (!strcmp("h_del", player->argp[n])) {
148                 field[i++] = 39;
149             } else if (!strcmp("r_del", player->argp[n])) {
150                 field[i++] = 40;
151             } else if (!strcmp("u_cut", player->argp[n])) {
152                 field[i++] = 41;
153             } else if (!strcmp("f_cut", player->argp[n])) {
154                 field[i++] = 42;
155             } else if (!strcmp("s_cut", player->argp[n])) {
156                 field[i++] = 43;
157             } else if (!strcmp("g_cut", player->argp[n])) {
158                 field[i++] = 44;
159             } else if (!strcmp("p_cut", player->argp[n])) {
160                 field[i++] = 45;
161             } else if (!strcmp("i_cut", player->argp[n])) {
162                 field[i++] = 46;
163             } else if (!strcmp("d_cut", player->argp[n])) {
164                 field[i++] = 47;
165             } else if (!strcmp("b_cut", player->argp[n])) {
166                 field[i++] = 48;
167             } else if (!strcmp("o_cut", player->argp[n])) {
168                 field[i++] = 49;
169             } else if (!strcmp("l_cut", player->argp[n])) {
170                 field[i++] = 50;
171             } else if (!strcmp("h_cut", player->argp[n])) {
172                 field[i++] = 51;
173             } else if (!strcmp("r_cut", player->argp[n])) {
174                 field[i++] = 52;
175             } else if (!strcmp("dist_x", player->argp[n])) {
176                 field[i++] = 53;
177             } else if (!strcmp("dist_y", player->argp[n])) {
178                 field[i++] = 54;
179             } else if (!strcmp("c_dist", player->argp[n])) {
180                 field[i++] = 55;
181             } else if (!strcmp("m_dist", player->argp[n])) {
182                 field[i++] = 56;
183             } else if (!strcmp("u_dist", player->argp[n])) {
184                 field[i++] = 57;
185             } else if (!strcmp("f_dist", player->argp[n])) {
186                 field[i++] = 58;
187             } else if (!strcmp("s_dist", player->argp[n])) {
188                 field[i++] = 59;
189             } else if (!strcmp("g_dist", player->argp[n])) {
190                 field[i++] = 60;
191             } else if (!strcmp("p_dist", player->argp[n])) {
192                 field[i++] = 61;
193             } else if (!strcmp("i_dist", player->argp[n])) {
194                 field[i++] = 62;
195             } else if (!strcmp("d_dist", player->argp[n])) {
196                 field[i++] = 63;
197             } else if (!strcmp("b_dist", player->argp[n])) {
198                 field[i++] = 64;
199             } else if (!strcmp("o_dist", player->argp[n])) {
200                 field[i++] = 65;
201             } else if (!strcmp("l_dist", player->argp[n])) {
202                 field[i++] = 66;
203             } else if (!strcmp("h_dist", player->argp[n])) {
204                 field[i++] = 67;
205             } else if (!strcmp("r_dist", player->argp[n])) {
206                 field[i++] = 68;
207             } else if (!strcmp("road", player->argp[n])) {
208                 field[i++] = 69;
209             } else if (!strcmp("rail", player->argp[n])) {
210                 field[i++] = 70;
211             } else if (!strcmp("defense", player->argp[n])) {
212                 field[i++] = 71;
213             } else if (!strcmp("fallout", player->argp[n])) {
214                 field[i++] = 72;
215             } else if (!strcmp("coast", player->argp[n])) {
216                 field[i++] = 73;
217             } else if (!strcmp("c_del", player->argp[n])) {
218                 field[i++] = 74;
219             } else if (!strcmp("m_del", player->argp[n])) {
220                 field[i++] = 75;
221             } else if (!strcmp("c_cut", player->argp[n])) {
222                 field[i++] = 76;
223             } else if (!strcmp("m_cut", player->argp[n])) {
224                 field[i++] = 77;
225             } else if (!strcmp("terr1", player->argp[n])) {
226                 field[i++] = 78;
227             } else if (!strcmp("terr2", player->argp[n])) {
228                 field[i++] = 79;
229             } else if (!strcmp("terr3", player->argp[n])) {
230                 field[i++] = 80;
231             } else {
232                 pr("Unrecognized field %s\n", player->argp[n]);
233             }
234             if (n++ > 100) {
235                 pr("Too many fields\n");
236                 return RET_FAIL;
237             }
238         }
239         field[i] = 0;
240     }
241
242     if (player->god)
243         pr("   ");
244     time(&now);
245     pr("DUMP SECTOR %ld\n", (long)now);
246     if (player->god)
247         pr("own ");
248     pr("x y");
249     n = 0;
250     while (field[n]) {
251         pr(" ");
252         switch (field[n]) {
253         case 1:
254             pr("des");
255             break;
256         case 2:
257             pr("sdes");
258             break;
259         case 3:
260             pr("eff");
261             break;
262         case 4:
263             pr("mob");
264             break;
265         case 5:
266             pr("*");
267             break;
268         case 6:
269             pr("off");
270             break;
271         case 7:
272             pr("min");
273             break;
274         case 8:
275             pr("gold");
276             break;
277         case 9:
278             pr("fert");
279             break;
280         case 10:
281             pr("ocontent");
282             break;
283         case 11:
284             pr("uran");
285             break;
286         case 12:
287             pr("work");
288             break;
289         case 13:
290             pr("avail");
291             break;
292         case 14:
293             pr("terr");
294             break;
295         case 15:
296             pr("civ");
297             break;
298         case 16:
299             pr("mil");
300             break;
301         case 17:
302             pr("uw");
303             break;
304         case 18:
305             pr("food");
306             break;
307         case 19:
308             pr("shell");
309             break;
310         case 20:
311             pr("gun");
312             break;
313         case 21:
314             pr("pet");
315             break;
316         case 22:
317             pr("iron");
318             break;
319         case 23:
320             pr("dust");
321             break;
322         case 24:
323             pr("bar");
324             break;
325         case 25:
326             pr("oil");
327             break;
328         case 26:
329             pr("lcm");
330             break;
331         case 27:
332             pr("hcm");
333             break;
334         case 28:
335             pr("rad");
336             break;
337         case 29:
338             pr("u_del");
339             break;
340         case 30:
341             pr("f_del");
342             break;
343         case 31:
344             pr("s_del");
345             break;
346         case 32:
347             pr("g_del");
348             break;
349         case 33:
350             pr("p_del");
351             break;
352         case 34:
353             pr("i_del");
354             break;
355         case 35:
356             pr("d_del");
357             break;
358         case 36:
359             pr("b_del");
360             break;
361         case 37:
362             pr("o_del");
363             break;
364         case 38:
365             pr("l_del");
366             break;
367         case 39:
368             pr("h_del");
369             break;
370         case 40:
371             pr("r_del");
372             break;
373         case 41:
374             pr("u_cut");
375             break;
376         case 42:
377             pr("f_cut");
378             break;
379         case 43:
380             pr("s_cut");
381             break;
382         case 44:
383             pr("g_cut");
384             break;
385         case 45:
386             pr("p_cut");
387             break;
388         case 46:
389             pr("i_cut");
390             break;
391         case 47:
392             pr("d_cut");
393             break;
394         case 48:
395             pr("b_cut");
396             break;
397         case 49:
398             pr("o_cut");
399             break;
400         case 50:
401             pr("l_cut");
402             break;
403         case 51:
404             pr("h_cut");
405             break;
406         case 52:
407             pr("r_cut");
408             break;
409         case 53:
410             pr("dist_x");
411             break;
412         case 54:
413             pr("dist_y");
414             break;
415         case 55:
416             pr("c_dist");
417             break;
418         case 56:
419             pr("m_dist");
420             break;
421         case 57:
422             pr("u_dist");
423             break;
424         case 58:
425             pr("f_dist");
426             break;
427         case 59:
428             pr("s_dist");
429             break;
430         case 60:
431             pr("g_dist");
432             break;
433         case 61:
434             pr("p_dist");
435             break;
436         case 62:
437             pr("i_dist");
438             break;
439         case 63:
440             pr("d_dist");
441             break;
442         case 64:
443             pr("b_dist");
444             break;
445         case 65:
446             pr("o_dist");
447             break;
448         case 66:
449             pr("l_dist");
450             break;
451         case 67:
452             pr("h_dist");
453             break;
454         case 68:
455             pr("r_dist");
456             break;
457         case 69:
458             pr("road");
459             break;
460         case 70:
461             pr("rail");
462             break;
463         case 71:
464             pr("defense");
465             break;
466         case 72:
467             pr("fallout");
468             break;
469         case 73:
470             pr("coast");
471             break;
472         case 74:
473             pr("c_del");
474             break;
475         case 75:
476             pr("m_del");
477             break;
478         case 76:
479             pr("c_cut");
480             break;
481         case 77:
482             pr("m_cut");
483             break;
484         case 78:
485             pr("terr1");
486             break;
487         case 79:
488             pr("terr2");
489             break;
490         case 80:
491             pr("terr3");
492             break;
493         }
494         n++;
495     }
496     pr("\n");
497
498     while (nxtsct(&nstr, &sect)) {
499         if (!player->owner)
500             continue;
501         nsect++;
502
503 /* census */
504         if (player->god)
505             pr("%d ", sect.sct_own);
506         pr("%d %d", xrel(np, nstr.x), yrel(np, nstr.y));
507
508         n = 0;
509         while (field[n]) {
510             pr(" ");
511             switch (field[n++]) {
512             case 1:
513                 pr("%c", dchr[sect.sct_type].d_mnem);
514                 break;
515             case 2:
516                 if (sect.sct_newtype != sect.sct_type)
517                     pr("%c", dchr[sect.sct_newtype].d_mnem);
518                 else
519                     pr("_");
520                 break;
521             case 3:
522                 pr("%d", sect.sct_effic);
523                 break;
524             case 4:
525                 pr("%d", sect.sct_mobil);
526                 break;
527             case 5:
528                 pr("%c", sect.sct_own != sect.sct_oldown ? '*' : '.');
529                 break;
530             case 6:
531                 pr("%d", sect.sct_off);
532                 break;
533             case 7:
534                 pr("%d", sect.sct_min);
535                 break;
536             case 8:
537                 pr("%d", sect.sct_gmin);
538                 break;
539             case 9:
540                 pr("%d", sect.sct_fertil);
541                 break;
542             case 10:
543                 pr("%d", sect.sct_oil);
544                 break;
545             case 11:
546                 pr("%d", sect.sct_uran);
547                 break;
548             case 12:
549                 pr("%d", sect.sct_work);
550                 break;
551             case 13:
552                 pr("%d", sect.sct_avail);
553                 break;
554             case 14:
555                 pr("%d", sect.sct_terr);
556                 break;
557             case 15:
558                 pr("%d", sect.sct_item[I_CIVIL]);
559                 break;
560             case 16:
561                 pr("%d", sect.sct_item[I_MILIT]);
562                 break;
563             case 17:
564                 pr("%d", sect.sct_item[I_UW]);
565                 break;
566             case 18:
567                 pr("%d", sect.sct_item[I_FOOD]);
568                 break;
569 /* commodity */
570             case 19:
571                 pr("%d", sect.sct_item[I_SHELL]);
572                 break;
573             case 20:
574                 pr("%d", sect.sct_item[I_GUN]);
575                 break;
576             case 21:
577                 pr("%d", sect.sct_item[I_PETROL]);
578                 break;
579             case 22:
580                 pr("%d", sect.sct_item[I_IRON]);
581                 break;
582             case 23:
583                 pr("%d", sect.sct_item[I_DUST]);
584                 break;
585             case 24:
586                 pr("%d", sect.sct_item[I_BAR]);
587                 break;
588             case 25:
589                 pr("%d", sect.sct_item[I_OIL]);
590                 break;
591             case 26:
592                 pr("%d", sect.sct_item[I_LCM]);
593                 break;
594             case 27:
595                 pr("%d", sect.sct_item[I_HCM]);
596                 break;
597             case 28:
598                 pr("%d", sect.sct_item[I_RAD]);
599                 break;
600 /* cutoff */
601             case 29:
602                 pr("%c", dirstr[sect.sct_del[I_UW] & 0x7]);
603                 break;
604             case 30:
605                 pr("%c", dirstr[sect.sct_del[I_FOOD] & 0x7]);
606                 break;
607             case 31:
608                 pr("%c", dirstr[sect.sct_del[I_SHELL] & 0x7]);
609                 break;
610             case 32:
611                 pr("%c", dirstr[sect.sct_del[I_GUN] & 0x7]);
612                 break;
613             case 33:
614                 pr("%c", dirstr[sect.sct_del[I_PETROL] & 0x7]);
615                 break;
616             case 34:
617                 pr("%c", dirstr[sect.sct_del[I_IRON] & 0x7]);
618                 break;
619             case 35:
620                 pr("%c", dirstr[sect.sct_del[I_DUST] & 0x7]);
621                 break;
622             case 36:
623                 pr("%c", dirstr[sect.sct_del[I_BAR] & 0x7]);
624                 break;
625             case 37:
626                 pr("%c", dirstr[sect.sct_del[I_OIL] & 0x7]);
627                 break;
628             case 38:
629                 pr("%c", dirstr[sect.sct_del[I_LCM] & 0x7]);
630                 break;
631             case 39:
632                 pr("%c", dirstr[sect.sct_del[I_HCM] & 0x7]);
633                 break;
634             case 40:
635                 pr("%c", dirstr[sect.sct_del[I_RAD] & 0x7]);
636                 break;
637             case 41:
638                 pr("%d", sect.sct_del[I_UW] & ~0x7);
639                 break;
640             case 42:
641                 pr("%d", sect.sct_del[I_FOOD] & ~0x7);
642                 break;
643             case 43:
644                 pr("%d", sect.sct_del[I_SHELL] & ~0x7);
645                 break;
646             case 44:
647                 pr("%d", sect.sct_del[I_GUN] & ~0x7);
648                 break;
649             case 45:
650                 pr("%d", sect.sct_del[I_PETROL] & ~0x7);
651                 break;
652             case 46:
653                 pr("%d", sect.sct_del[I_IRON] & ~0x7);
654                 break;
655             case 47:
656                 pr("%d", sect.sct_del[I_DUST] & ~0x7);
657                 break;
658             case 48:
659                 pr("%d", sect.sct_del[I_BAR] & ~0x7);
660                 break;
661             case 49:
662                 pr("%d", sect.sct_del[I_OIL] & ~0x7);
663                 break;
664             case 50:
665                 pr("%d", sect.sct_del[I_LCM] & ~0x7);
666                 break;
667             case 51:
668                 pr("%d", sect.sct_del[I_HCM] & ~0x7);
669                 break;
670             case 52:
671                 pr("%d", sect.sct_del[I_RAD] & ~0x7);
672                 break;
673 /* level */
674             case 53:
675                 pr("%d", xrel(getnatp(player->cnum), sect.sct_dist_x));
676                 break;
677             case 54:
678                 pr("%d", yrel(getnatp(player->cnum), sect.sct_dist_y));
679                 break;
680             case 55:
681                 pr("%d", sect.sct_dist[I_CIVIL]);
682                 break;
683             case 56:
684                 pr("%d", sect.sct_dist[I_MILIT]);
685                 break;
686             case 57:
687                 pr("%d", sect.sct_dist[I_UW]);
688                 break;
689             case 58:
690                 pr("%d", sect.sct_dist[I_FOOD]);
691                 break;
692             case 59:
693                 pr("%d", sect.sct_dist[I_SHELL]);
694                 break;
695             case 60:
696                 pr("%d", sect.sct_dist[I_GUN]);
697                 break;
698             case 61:
699                 pr("%d", sect.sct_dist[I_PETROL]);
700                 break;
701             case 62:
702                 pr("%d", sect.sct_dist[I_IRON]);
703                 break;
704             case 63:
705                 pr("%d", sect.sct_dist[I_DUST]);
706                 break;
707             case 64:
708                 pr("%d", sect.sct_dist[I_BAR]);
709                 break;
710             case 65:
711                 pr("%d", sect.sct_dist[I_OIL]);
712                 break;
713             case 66:
714                 pr("%d", sect.sct_dist[I_LCM]);
715                 break;
716             case 67:
717                 pr("%d", sect.sct_dist[I_HCM]);
718                 break;
719             case 68:
720                 pr("%d", sect.sct_dist[I_RAD]);
721                 break;
722             case 69:
723                 pr("%d", sect.sct_road);
724                 break;
725             case 70:
726                 pr("%d", sect.sct_rail);
727                 break;
728             case 71:
729                 pr("%d", SCT_DEFENSE(&sect));
730                 break;
731             case 72:
732                 if (opt_FALLOUT)
733                     pr("%d", sect.sct_fallout);
734                 else
735                     pr("0");
736                 break;
737             case 73:
738                 pr("%d", sect.sct_coastal);
739                 break;
740             case 74:
741                 pr("%c", dirstr[sect.sct_del[I_CIVIL] & 0x7]);
742                 break;
743             case 75:
744                 pr("%c", dirstr[sect.sct_del[I_MILIT] & 0x7]);
745                 break;
746             case 76:
747                 pr("%d", sect.sct_del[I_CIVIL] & ~0x7);
748                 break;
749             case 77:
750                 pr("%d", sect.sct_del[I_MILIT] & ~0x7);
751                 break;
752             case 78:
753                 pr("%d", sect.sct_terr1);
754                 break;
755             case 79:
756                 pr("%d", sect.sct_terr2);
757                 break;
758             case 80:
759                 pr("%d", sect.sct_terr3);
760                 break;
761             }
762         }
763         pr("\n");
764     }
765     if (nsect == 0) {
766         if (player->argp[1])
767             pr("%s: No sector(s)\n", player->argp[1]);
768         else
769             pr("%s: No sector(s)\n", "");
770         return RET_FAIL;
771     } else
772         pr("%d sector%s\n", nsect, splur(nsect));
773     return RET_OK;
774 }