]> git.pond.sub.org Git - empserver/blob - src/lib/commands/sdump.c
Import of Empire 4.2.12
[empserver] / src / lib / commands / sdump.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  *  sdump.c: Dump ship information
29  * 
30  *  Known contributors to this file:
31  *     John Yockey, 1997
32  *     Steve McClure, 1998
33  */
34
35 #include "misc.h"
36 #include "player.h"
37 #include "var.h"
38 #include "xy.h"
39 #include "sect.h"
40 #include "ship.h"
41 #include "nat.h"
42 #include "nsc.h"
43 #include "deity.h"
44 #include "file.h"
45 #include "optlist.h"
46 #include "commands.h"
47
48 int
49 sdump(void)
50 {
51         int     nships;
52         struct  nstr_item ni;
53         struct  shpstr ship;
54         int     vec[I_MAX+1];
55         int     field[128];
56         struct  natstr *np;
57         int     n,i;
58         time_t  now;
59
60         if (!snxtitem(&ni, EF_SHIP, player->argp[1]))
61                 return RET_SYN;
62         prdate();
63
64         if (!player->argp[2]) {
65                 for (n = 1; n <= 34; n++) 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("type",player->argp[n])) {
72                                 field[i++] = 1;
73                         } else if (!strcmp("x",player->argp[n])) {
74                                 field[i++] = 2;
75                         } else if (!strcmp("y",player->argp[n])) {
76                                 field[i++] = 3;
77                         } else if (!strcmp("flt",player->argp[n])) {
78                                 field[i++] = 4;
79                         } else if (!strcmp("eff",player->argp[n])) {
80                                 field[i++] = 5;
81                         } else if (!strcmp("civ",player->argp[n])) {
82                                 field[i++] = 6;
83                         } else if (!strcmp("mil",player->argp[n])) {
84                                 field[i++] = 7;
85                         } else if (!strcmp("uw",player->argp[n])) {
86                                 field[i++] = 8;
87                         } else if (!strcmp("food",player->argp[n])) {
88                                 field[i++] = 9;
89                         } else if (!strcmp("pln",player->argp[n])) {
90                                 field[i++] = 10;
91                         } else if (!strcmp("he",player->argp[n])) {
92                                 field[i++] = 11;
93                         } else if (!strcmp("xl",player->argp[n])) {
94                                 field[i++] = 12;
95                         } else if (!strcmp("land",player->argp[n])) {
96                                 field[i++] = 13;
97                         } else if (!strcmp("mob",player->argp[n])) {
98                                 field[i++] = 14;
99                         } else if (!strcmp("fuel",player->argp[n])) {
100                                 field[i++] = 15;
101                         } else if (!strcmp("tech",player->argp[n])) {
102                                 field[i++] = 16;
103                         } else if (!strcmp("shell",player->argp[n])) {
104                                 field[i++] = 17;
105                         } else if (!strcmp("gun",player->argp[n])) {
106                                 field[i++] = 18;
107                         } else if (!strcmp("petrol",player->argp[n])) {
108                                 field[i++] = 19;
109                         } else if (!strcmp("iron",player->argp[n])) {
110                                 field[i++] = 20;
111                         } else if (!strcmp("dust",player->argp[n])) {
112                                 field[i++] = 21;
113                         } else if (!strcmp("bar",player->argp[n])) {
114                                 field[i++] = 22;
115                         } else if (!strcmp("oil",player->argp[n])) {
116                                 field[i++] = 23;
117                         } else if (!strcmp("lcm",player->argp[n])) {
118                                 field[i++] = 24;
119                         } else if (!strcmp("hcm",player->argp[n])) {
120                                 field[i++] = 25;
121                         } else if (!strcmp("rad",player->argp[n])) {
122                                 field[i++] = 26;
123                         } else if (!strcmp("def",player->argp[n])) {
124                                 field[i++] = 27;
125                         } else if (!strcmp("spd",player->argp[n])) {
126                                 field[i++] = 28;
127                         } else if (!strcmp("vis",player->argp[n])) {
128                                 field[i++] = 29;
129                         } else if (!strcmp("rng",player->argp[n])) {
130                                 field[i++] = 30;
131                         } else if (!strcmp("fir",player->argp[n])) {
132                                 field[i++] = 31;
133                         } else if (!strcmp("origx", player->argp[n])) {
134                                 field[i++] = 32;
135                         } else if (!strcmp("origy", player->argp[n])) {
136                                 field[i++] = 33;
137                         } else if (!strcmp("name",player->argp[n])) {
138                                 field[i++] = 34;
139                         } else {
140                                 pr("Unrecognized field %s\n",player->argp[n]);
141                         }
142                         if (n++ > 100) {
143                                 pr("Too many fields\n");
144                                 return RET_FAIL;
145                         }
146                 }
147                 field[i] = 0;
148         }
149
150         if (player->god)
151                 pr("   ");
152         time(&now);
153         pr("DUMP SHIPS %d\n", now);
154         if (player->god)
155                 pr("own ");
156         pr("id");
157         n = 0;
158         while (field[n]) {
159                 switch (field[n]) {
160                 case 1: pr(" type"); break;
161                 case 2: pr(" x"); break;
162                 case 3: pr(" y"); break;
163                 case 4: pr(" flt"); break;
164                 case 5: pr(" eff"); break;
165                 case 6: pr(" civ"); break;
166                 case 7: pr(" mil"); break;
167                 case 8: pr(" uw"); break;
168                 case 9: pr(" food"); break;
169                 case 10: pr(" pln"); break;
170                 case 11: pr(" he"); break;
171                 case 12: pr(" xl"); break;
172                 case 13: pr(" land"); break;
173                 case 14: pr(" mob"); break;
174                 case 15: pr(" fuel"); break;
175                 case 16: pr(" tech"); break;
176                 case 17: pr(" shell"); break;
177                 case 18: pr(" gun"); break;
178                 case 19: pr(" petrol"); break;
179                 case 20: pr(" iron"); break;
180                 case 21: pr(" dust"); break;
181                 case 22: pr(" bar"); break;
182                 case 23: pr(" oil"); break;
183                 case 24: pr(" lcm"); break;
184                 case 25: pr(" hcm"); break;
185                 case 26: pr(" rad"); break;
186                 case 27: pr(" def"); break;
187                 case 28: pr(" spd"); break;
188                 case 29: pr(" vis"); break;
189                 case 30: pr(" rng"); break;
190                 case 31: pr(" fir"); break;
191                 case 32: pr(" origx"); break;
192                 case 33: pr(" origy"); break;
193                 case 34: pr(" name"); break;
194                 }
195                 n++;
196         }
197         pr("\n");
198
199         nships = 0;
200         np = getnatp(player->cnum);
201         while (nxtitem(&ni, (s_char *)&ship)) {
202                 if (!player->owner || ship.shp_own == 0)
203                         continue;
204                 if (ship.shp_type < 0 || ship.shp_type > shp_maxno) {
205                         pr("bad ship type %d (#%d)\n",
206                                 ship.shp_type, ni.cur);
207                         continue;
208                 }
209                 count_planes(&ship);
210                 count_units(&ship);
211                 nships++;
212                 if (player->god)
213                         pr("%3d ", ship.shp_own);
214                 pr("%d", ni.cur);
215                 n = 0;
216                 getvec(VT_ITEM, vec, (s_char *)&ship, EF_SHIP);
217                 while (field[n]) {
218                         switch (field[n++]) {
219                         case 1: pr(" %0.4s", mchr[(int)ship.shp_type].m_name); break;
220                         case 2: pr(" %d", xrel(np, ship.shp_x)); break;
221                         case 3: pr(" %d", yrel(np, ship.shp_y)); break;
222                         case 4: if (ship.shp_fleet == ' ') 
223                                         pr(" ~");
224                                 else
225                                         pr(" %c", ship.shp_fleet);
226                                 break;
227                         case 5: pr(" %d", ship.shp_effic); break;
228                         case 6: pr(" %d", vec[I_CIVIL]); break;
229                         case 7: pr(" %d", vec[I_MILIT]); break;
230                         case 8: pr(" %d", vec[I_UW]); break;
231                         case 9: pr(" %d", vec[I_FOOD]); break;
232                         case 10: pr(" %d", ship.shp_nplane); break;
233                         case 11: pr(" %d",ship.shp_nchoppers); break;
234                         case 12: pr(" %d",ship.shp_nxlight); break;
235                         case 13: pr(" %d", ship.shp_nland); break;
236                         case 14: pr(" %d", ship.shp_mobil); break;
237                         case 15: if (opt_FUEL)
238                                         pr(" %d",ship.shp_fuel);
239                                  else
240                                         pr(" 0");
241                                  break;
242                         case 16: pr(" %d", ship.shp_tech); break;
243                         case 17: pr(" %d", vec[I_SHELL]); break;
244                         case 18: pr(" %d", vec[I_GUN]); break;
245                         case 19: pr(" %d", vec[I_PETROL]); break;
246                         case 20: pr(" %d", vec[I_IRON]); break;
247                         case 21: pr(" %d", vec[I_DUST]); break;
248                         case 22: pr(" %d", vec[I_BAR]); break;
249                         case 23: pr(" %d", vec[I_OIL]); break;
250                         case 24: pr(" %d", vec[I_LCM]); break;
251                         case 25: pr(" %d", vec[I_HCM]); break;
252                         case 26: pr(" %d", vec[I_RAD]); break;
253                         case 27: pr(" %d", ship.shp_armor); break;
254                         case 28: pr(" %d", ship.shp_speed); break;
255                         case 29: pr(" %d", ship.shp_visib); break;
256                         case 30: pr(" %d", ship.shp_frnge); break;
257                         case 31: pr(" %d", ship.shp_glim); break;
258                         case 32: pr(" %d", xrel(np, ship.shp_orig_x)); break;
259                         case 33: pr(" %d", yrel(np, ship.shp_orig_y)); break;
260                         case 34: pr(" %c%s%c", '"', ship.shp_name, '"'); break;
261                         }
262                 }
263                 pr("\n");
264         }
265         if (nships == 0) {
266                 if (player->argp[1])
267                         pr("%s: No ship(s)\n", player->argp[1]);
268                 else
269                         pr("%s: No ship(s)\n", "");
270                 return RET_FAIL;
271         }else
272                 pr("%d ship%s\n", nships, splur(nships));
273         return RET_OK;
274 }