]> git.pond.sub.org Git - empserver/blob - src/lib/commands/surv.c
deity.h is redundant, remove it.
[empserver] / src / lib / commands / surv.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  *  surv.c: Show sector survey
29  * 
30  *  Known contributors to this file:
31  *     Dave Pare, 1986
32  */
33
34 #include "misc.h"
35 #include "player.h"
36 #include "var.h"
37 #include "sect.h"
38 #include "xy.h"
39 #include "nsc.h"
40 #include "file.h"
41 #include "nat.h"
42 #include "map.h"
43 #include "commands.h"
44 #include "optlist.h"
45
46 static s_char code_char(long int coding, struct sctstr *sp);
47
48 /*
49  * survey type <sarg> ?cond
50  *
51  */
52 int
53 surv(void)
54 {
55     int nsect;
56     struct nstr_sect nstr;
57     int y;
58     long coding;
59     struct natstr *np;
60     struct sctstr sect;
61     struct range range;
62     s_char *ptr;
63     struct nscstr cond[NS_NCOND];
64     int ncond;
65     int i;
66     s_char what[64];
67     s_char buf[1024];
68     s_char *str;
69     /* Note this is not re-entrant anyway, so we keep the buffers
70        around */
71     static s_char *mapbuf = (s_char *)0;
72     static s_char **map = (s_char **)0;
73
74     nsect = 0;
75     if ((ptr =
76          getstarg(player->argp[1], "commodity or variable? ", buf)) == 0)
77         return RET_SYN;
78     if (encode(ptr, &coding, EF_SECTOR) < 0)
79         return RET_SYN;
80     if (player->argp[2] == (s_char *)0) {
81         if ((str = getstring("(sects)? ", buf)) == 0)
82             return RET_SYN;
83     } else {
84         str = player->argp[2];
85     }
86     if (*str == '*') {
87         sprintf(what, "%d:%d,%d:%d",
88                 -WORLD_X / 2, WORLD_X / 2 - 1,
89                 -WORLD_Y / 2, WORLD_Y / 2 - 1);
90         if (!snxtsct(&nstr, what))
91             return RET_FAIL;
92     } else if (!snxtsct(&nstr, str))
93         return RET_SYN;
94     if (!mapbuf)
95         mapbuf =
96             (s_char *)malloc((WORLD_Y * MAPWIDTH(1)) * sizeof(s_char));
97     if (!map) {
98         map = (s_char **)malloc(WORLD_Y * sizeof(s_char *));
99         if (map && mapbuf) {
100             for (i = 0; i < WORLD_Y; i++)
101                 map[i] = &mapbuf[MAPWIDTH(1) * i];
102         } else if (map) {
103             free((s_char *)map);
104             map = (s_char **)0;
105         }
106     }
107     if (!mapbuf || !map) {
108         pr("Memory error, tell the deity.\n");
109         logerror("malloc failed in sect\n");
110         return RET_FAIL;
111     }
112     ncond = nstr.ncond;
113     memcpy(cond, nstr.cond, sizeof(struct nscstr) * ncond);
114     nstr.ncond = 0;
115     np = getnatp(player->cnum);
116     xyrelrange(np, &nstr.range, &range);
117     border(&range, "     ", "");
118     blankfill((s_char *)mapbuf, &nstr.range, 1);
119     while (nxtsct(&nstr, &sect)) {
120         if (!player->owner)
121             continue;
122         ptr = &map[nstr.dy][nstr.dx];
123         if (nstr_exec(cond, ncond, (s_char *)&sect, EF_SECTOR)) {
124             ++nsect;
125             *ptr = 0x80 | code_char(coding, &sect);
126         } else {
127             *ptr = dchr[sect.sct_type].d_mnem;
128         }
129     }
130     for (y = nstr.range.ly, i = 0; i < nstr.range.height; y++, i++) {
131         int yval;
132
133         yval = yrel(np, y);
134         pr("%4d %s %4d\n", yval, map[i], yval);
135         if (y >= WORLD_Y)
136             y -= WORLD_Y;
137     }
138     border(&range, "     ", "");
139     if (nsect > 0)
140         pr("\n%d sector%s.\n", nsect, splur(nsect));
141     return RET_OK;
142 }
143
144 static s_char
145 code_char(long int coding, struct sctstr *sp)
146 {
147     int amt;
148     int n;
149
150     if (!(coding & NSC_VAR))
151         coding |= NSC_OFF;
152     amt = decode(player->cnum, coding, (s_char *)sp, EF_SECTOR);
153     n = 0;
154     if ((coding & NSC_CMASK) == NSC_VAR) {
155         if (amt != 0)
156             n = (amt / 100) + 1;
157     } else if (amt != 0)
158         n = (amt / 10) + 1;
159     if (n > 11)
160         n = 11;
161     if (n < 0)
162         n = 0;
163     return " 0123456789$"[n];
164 }