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