/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2011, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2015, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure, Markus Armbruster
*
* Empire is free software: you can redistribute it and/or modify
#include "misc.h"
#include "nat.h"
#include "nsc.h"
-#include "nuke.h"
#include "optlist.h"
#include "plane.h"
#include "player.h"
/* whether to revert bmap, internal to do_map() */
#define MAP_BMAP_REVERT bit(7)
+static int parse_map_arg(int, char *, struct nstr_sect *, char *);
static int parse_map_flags(int, char *);
static int revert_bmap(struct nstr_sect *);
static int draw_map(char, int, struct nstr_sect *);
static int bmnxtsct(struct nstr_sect *);
static char map_char(int, natid, int);
static int unit_map(int, int, struct nstr_sect *, char *);
+static void snxtsct_around(struct nstr_sect *, coord, coord);
int
-do_map(int bmap, int unit_type, char *arg, char *map_flags_arg)
+do_map(int bmap, int unit_type, char *arg1, char *arg2)
{
struct nstr_sect ns;
- char origin = '\0';
- int map_flags;
+ char origin;
+ int res, map_flags;
+
+ res = parse_map_arg(unit_type, arg1, &ns, &origin);
+ if (res != RET_OK)
+ return res;
+
+ map_flags = parse_map_flags(bmap, arg2);
+ if (map_flags < 0)
+ return RET_SYN;
+
+ if (map_flags & MAP_BMAP_REVERT)
+ return revert_bmap(&ns);
+ return draw_map(origin, map_flags, &ns);
+}
+static int
+parse_map_arg(int unit_type, char *arg,
+ struct nstr_sect *nsp, char *originp)
+{
switch (sarg_type(arg)) {
case NS_DIST:
case NS_AREA:
case NS_ALL:
- if (!snxtsct(&ns, arg))
+ if (!snxtsct(nsp, arg))
return RET_SYN;
+ *originp = 0;
break;
default:
- if (unit_map(unit_type, atoi(arg), &ns, &origin) < 0)
+ if (unit_map(unit_type, atoi(arg), nsp, originp) < 0) {
+ pr("No such %s\n", ef_nameof(unit_type));
return RET_FAIL;
+ }
}
-
- map_flags = parse_map_flags(bmap, map_flags_arg);
- if (map_flags < 0)
- return RET_SYN;
-
- if (map_flags & MAP_BMAP_REVERT)
- return revert_bmap(&ns);
- return draw_map(origin, map_flags, &ns);
+ return RET_OK;
}
static void
case 0: map_flags = 0;
}
- if (!str)
+ if (!str || !*str)
return map_flags;
/* special case "revert" */
blankfill(wmapbuf, &nsp->range, 1);
if (map_flags & MAP_BMAP) {
- int c;
+ char *map = map_flags & MAP_ALT ? player->map : player->bmap;
- if (map_flags & MAP_ALT) {
- while (bmnxtsct(nsp)) {
- if (0 != (c = player->map[nsp->id]))
- wmap[nsp->dy][nsp->dx] = c;
- }
- } else {
- while (bmnxtsct(nsp)) {
- if (0 != (c = player->bmap[nsp->id]))
- wmap[nsp->dy][nsp->dx] = c;
- }
+ while (bmnxtsct(nsp)) {
+ if (map[nsp->id])
+ wmap[nsp->dy][nsp->dx] = map[nsp->id];
}
} else {
struct sctstr sect;
+ char mapch;
+ int changed = 0;
if (!player->god) {
memset(bitmap, 0, (WORLD_SZ() + 7) / 8);
bitinit2(nsp, bitmap, player->cnum);
}
- if (map_flags & MAP_ALT) {
- while (nxtsct(nsp, §)) {
- if (!player->god && !emp_getbit(nsp->x, nsp->y, bitmap))
- continue;
- wmap[nsp->dy][nsp->dx]
- = map_char(sect.sct_newtype, sect.sct_own,
- player->owner);
- }
- } else {
- struct sctstr sect;
- char mapch;
- int changed = 0;
- while (nxtsct(nsp, §)) {
- if (!player->god && !emp_getbit(nsp->x, nsp->y, bitmap))
- continue;
- mapch = map_char(sect.sct_type, sect.sct_own, player->owner);
- wmap[nsp->dy][nsp->dx] = mapch;
+ while (nxtsct(nsp, §)) {
+ if (!player->god && !emp_getbit(nsp->x, nsp->y, bitmap))
+ continue;
+ mapch = map_char(map_flags & MAP_ALT
+ ? sect.sct_newtype : sect.sct_type,
+ sect.sct_own, player->owner);
+ wmap[nsp->dy][nsp->dx] = mapch;
+ if (!(map_flags & MAP_ALT))
changed |= map_set(player->cnum, nsp->x, nsp->y, mapch, 0);
- }
- if (changed)
- writemap(player->cnum);
}
+ if (changed)
+ writemap(player->cnum);
}
i = 0;
yval = yrel(np, y);
wmap[i][nsp->range.width] = '\0';
- pr("%4d %s %-4d\n", yval, wmap[i], yval);
+ pr("%4d %s %d\n", yval, wmap[i], yval);
if (y >= WORLD_Y)
y -= WORLD_Y;
}
np->id = sctoff(np->x, np->y);
return 1;
}
- /*NOTREACHED*/
}
/*
unit_map(int unit_type, int uid, struct nstr_sect *nsp, char *originp)
{
union empobj_storage unit;
- struct range range;
char *name;
if (CANT_HAPPEN((ef_flags(unit_type) & (EFF_OWNER | EFF_XY))
*originp = *name;
}
- range.lx = xnorm(unit.gen.x - 10);
- range.hx = xnorm(unit.gen.x + 10);
- range.ly = ynorm(unit.gen.y - 5);
- range.hy = ynorm(unit.gen.y + 5);
+ snxtsct_around(nsp, unit.gen.x, unit.gen.y);
+ return 0;
+}
+
+static void
+snxtsct_around(struct nstr_sect *nsp, coord x, coord y)
+{
+ struct range range;
+
+ range.lx = xnorm(x - 10);
+ range.hx = xnorm(x + 10);
+ range.ly = ynorm(y - 5);
+ range.hy = ynorm(y + 5);
xysize_range(&range);
snxtsct_area(nsp, &range);
- return 0;
}
int
display_region_map(int bmap, int unit_type, coord curx, coord cury,
- char *arg)
+ char *arg1, char *arg2)
{
- char coordinates[80];
- char *map_flag_arg;
-
- if (!arg || !*arg) {
- struct natstr *np;
-
- np = getnatp(player->cnum);
- sprintf(coordinates, "%d:%d,%d:%d",
- xrel(np, curx - 10), xrel(np, curx + 10),
- yrel(np, cury - 5), yrel(np, cury + 5));
- arg = coordinates;
- map_flag_arg = NULL;
+ struct nstr_sect ns;
+ char origin;
+ int res, map_flags;
+
+ if (arg1 && *arg1) {
+ res = parse_map_arg(unit_type, arg1, &ns, &origin);
+ if (res != RET_OK)
+ return res;
+
+ map_flags = parse_map_flags(bmap, arg2);
+ if (map_flags < 0)
+ return RET_SYN;
} else {
- map_flag_arg = strchr(arg, ' ');
- if (map_flag_arg != NULL) {
- *map_flag_arg++ = '\0';
- while (isspace(*map_flag_arg)) map_flag_arg++;
- }
+ snxtsct_around(&ns, curx, cury);
+ map_flags = 0;
+ origin = 0;
}
- player->condarg = NULL;
- return do_map(bmap, unit_type, arg, map_flag_arg);
+
+ if (map_flags & MAP_BMAP_REVERT)
+ return revert_bmap(&ns);
+ return draw_map(origin, map_flags, &ns);
}
int