]> git.pond.sub.org Git - empserver/blob - src/lib/commands/rout.c
Import of Empire 4.2.12
[empserver] / src / lib / commands / rout.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  *  rout.c: Show empire deliver routes
29  * 
30  *  Known contributors to this file:
31  *     
32  */
33
34 #include "misc.h"
35 #include "player.h"
36 #include "var.h"
37 #include "xy.h"
38 #include "nat.h"
39 #include "nsc.h"
40 #include "sect.h"
41 #include "item.h"
42 #include "path.h"
43 #include "file.h"
44 #include "map.h"
45 #include "commands.h"
46 #include "optlist.h"
47
48 int
49 rout(void)
50 {
51         struct  ichrstr *ip;
52         struct  nstr_sect ns;
53         struct  natstr  *natp;
54         struct  sctstr  sect;
55         struct  nscstr  cond[NS_NCOND];
56         int     ncond;
57         struct  range   relrange;
58         int     row;
59         int     y;
60         int     ry;
61         int     i_del;
62         int     dir;
63         s_char  *p;
64         s_char  what[64];
65         s_char  *str;
66         s_char  buf1[1024];
67         /* Note this is not re-entrant anyway, so we keep the buffers
68            around */
69         static s_char      *mapbuf = (s_char *)0;
70         static s_char      **map = (s_char **)0;
71         static s_char      *buf = (s_char *)0;
72         int i;
73
74         if ((ip = whatitem(player->argp[1], "What item? ")) == 0)
75                 return RET_SYN;
76         i_del = V_DEL(ip-ichr);
77         if(player->argp[2] == (s_char *) 0) {
78                 if ((str = getstring("(sects)? ", buf1)) == 0)
79                         return RET_SYN;
80         } else {
81                 str = player->argp[2];
82         }
83         if(*str == '*') {
84                 sprintf(what, "%d:%d,%d:%d",
85                         -WORLD_X/2, WORLD_X/2-1,
86                         -WORLD_Y/2, WORLD_Y/2-1);
87                 if (!snxtsct(&ns, what))
88                         return RET_FAIL;
89         } else if (!snxtsct(&ns, str))
90                 return RET_FAIL;
91         if (!mapbuf)
92             mapbuf = (s_char *)malloc((WORLD_Y*MAPWIDTH(3))*sizeof(s_char));
93         if (!map) {
94             map = (s_char **)malloc(WORLD_Y * sizeof(s_char *));
95             if (map && mapbuf) {
96                 for (i = 0; i < WORLD_Y; i++)
97                     map[i] = &mapbuf[MAPWIDTH(3) * i];
98             } else if (map) {
99                 free((s_char *)map);
100                 map = (s_char **)0;
101             }
102         }
103         if (!buf)
104             buf = (s_char *)malloc((MAPWIDTH(3) + 12) * sizeof(s_char));
105         if (!mapbuf || !map || !buf) {
106             pr("Memory error, tell the deity.\n");
107             logerror("malloc failed in rout\n");
108             return RET_FAIL;
109         }
110         ncond = ns.ncond;
111         bcopy((s_char *)ns.cond, (s_char *)cond, sizeof(struct nscstr) * ncond);
112         ns.ncond = 0;
113
114         natp = getnatp(player->cnum);
115         xyrelrange(natp, &ns.range, &relrange);
116         bzero((s_char *)mapbuf,((WORLD_Y * MAPWIDTH(3)) * sizeof(s_char)));
117         blankfill((s_char *)mapbuf, &ns.range, 3);
118         border(&relrange, "     ", " ");
119
120         while (nxtsct(&ns, &sect)) {
121                 if (!player->owner)
122                         continue;
123                 p = &map[ns.dy][ns.dx*2];
124                 if ((dir = getvar(i_del, (s_char *)&sect, EF_SECTOR) & 0x7) &&
125                     nstr_exec(cond, ncond, (s_char *)&sect, EF_SECTOR))
126                         bcopy(routech[dir][0], p, 3);
127                 p[1] = dchr[sect.sct_type].d_mnem;
128         }
129         for (row = 0, y = ns.range.ly; row < ns.range.height; y++,row++) {
130                 ry = yrel(natp, y);
131                 bzero(buf,(MAPWIDTH(3) + 10) * sizeof(s_char));
132                 sprintf(buf,"%4d ",ry);
133                 bcopy(map[row],buf+5,ns.range.width*2+1);
134                 sprintf(buf+5+ns.range.width*2+1," %-4d\n",ry);
135                 pr("%s", buf);
136                 if (y >= WORLD_Y)
137                         y -= WORLD_Y;
138         }
139         border(&relrange, "     ", " ");
140         return RET_OK;
141 }