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