]> git.pond.sub.org Git - empserver/blob - src/lib/commands/sect.c
Import of Empire 4.2.12
[empserver] / src / lib / commands / sect.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  *  sect.c: Show sectors in map-like format with conditionals.
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 "xy.h"
38 #include "sect.h"
39 #include "nsc.h"
40 #include "com.h"
41 #include "nat.h"
42 #include "file.h"
43 #include "map.h"
44 #include "deity.h"
45 #include "commands.h"
46 #include "optlist.h"
47
48 int
49 sct(void)
50 {
51         struct  nstr_sect ns;
52         struct  sctstr sect;
53         struct  nscstr cond[NS_NCOND];
54         struct  range range;
55         struct  natstr *np;
56         int     ncond;
57         int     nsect;
58         s_char  *ptr;
59         coord   y, yval;
60         int     i;
61         s_char  what[64];
62         s_char  *str;
63         s_char  buf[1024];
64         /* Note this is not re-entrant anyway, so we keep the buffers
65            around */
66         static s_char      *mapbuf = (s_char *)0;
67         static s_char      **map = (s_char **)0;
68
69         nsect = 0;
70         if(player->argp[1] == (s_char *) 0) {
71                 if ((str = getstring("(sects)? ", buf)) == 0)
72                         return RET_SYN;
73         }
74         else {
75                 str = player->argp[1];
76         }
77
78         if(*str == '*') {
79                 sprintf(what, "%d:%d,%d:%d",
80                         -WORLD_X/2, WORLD_X/2-1,
81                         -WORLD_Y/2, WORLD_Y/2-1);
82                 if (!snxtsct(&ns, what))
83                         return RET_FAIL;
84         }
85         else
86         if (!snxtsct(&ns, str))
87                 return RET_SYN;
88         if (!mapbuf)
89             mapbuf = (s_char *)malloc((WORLD_Y*MAPWIDTH(1))*sizeof(s_char));
90         if (!map) {
91             map = (s_char **)malloc(WORLD_Y * sizeof(s_char *));
92             if (map && mapbuf) {
93                 for (i = 0; i < WORLD_Y; i++)
94                     map[i] = &mapbuf[MAPWIDTH(1) * i];
95             } else if (map) {
96                 free((s_char *)map);
97                 map = (s_char **)0;
98             }
99         }
100         if (!mapbuf || !map) {
101             pr("Memory error, tell the deity.\n");
102             logerror("malloc failed in sect\n");
103             return RET_FAIL;
104         }
105         np = getnatp(player->cnum);
106         ncond = ns.ncond;
107         bcopy((s_char *)ns.cond, (s_char *)cond, sizeof(*cond) * ncond);
108         ns.ncond = 0;
109         xyrelrange(getnatp(player->cnum), &ns.range, &range);
110         border(&range, "    ", "");
111         blankfill((s_char *)mapbuf, &ns.range, 1);
112         while (nxtsct(&ns, &sect)) {
113                 if (!player->owner)
114                         continue;
115                 ptr = &map[ns.dy][ns.dx];
116                 *ptr = dchr[sect.sct_type].d_mnem;
117                 if (nstr_exec(cond, ncond, (s_char *)&sect, EF_SECTOR)) {
118                         ++nsect;
119                         *ptr |= 0x80;
120                 }
121         }
122         for (i=0,y=ns.range.ly; i < ns.range.height; y++,i++) {
123                 yval = yrel(np, y);
124                 pr("%3d %s %-3d\n", yval, map[i], yval);
125                 if (y >= WORLD_Y)
126                         y -= WORLD_Y;
127         }
128         border(&range, "    ", "");
129         if (nsect == 0) {
130                 if (player->argp[1])
131                         pr("%s: No sector(s)\n", player->argp[1]);
132                 else
133                         pr("%s: No sector(s)\n", "");
134                 return RET_FAIL;
135         }else
136                 pr("%d sector%s\n", nsect, splur(nsect));
137         return RET_OK;
138 }