/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2011, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2014, 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" */
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