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