/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2000, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2009, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure
*
* This program is free software; you can redistribute it and/or modify
*
* ---
*
- * See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
- * related information and legal notices. It is expected that any future
- * projects/authors will amend these files as needed.
+ * See files README, COPYING and CREDITS in the root of the source
+ * tree for related information and legal notices. It is expected
+ * that future projects/authors will amend these files as needed.
*
* ---
*
* xy.c: x-y related conversion routines
- *
+ *
* Known contributors to this file:
* Dave Pare, 1989
+ * Markus Armbruster, 2004-2008
*/
-#include <ctype.h>
+#include <config.h>
+
+#include <errno.h>
#include <stdarg.h>
+#include <stdio.h>
+#include "file.h"
#include "misc.h"
-#include "xy.h"
#include "nat.h"
-#include "sect.h"
-#include "file.h"
-#include <stdio.h>
-#include "common.h"
#include "optlist.h"
+#include "prototypes.h"
+#include "sect.h"
+#include "xy.h"
/*
* return pointer to a string containing the x,y
* coords as desired by a particular target country.
*/
-s_char *
+char *
xyas(coord x, coord y, natid country)
{
struct natstr *np;
return prbuf("%d,%d", xrel(np, x), yrel(np, y));
}
-s_char *
+char *
ownxy(struct sctstr *sp)
{
return xyas(sp->sct_x, sp->sct_y, sp->sct_own);
{
coord x;
- if ((np->nat_stat & STAT_ABS) == 0) {
- x = XNORM(absx - np->nat_xorg);
- } else {
- x = XNORM(absx);
- }
+ x = XNORM(absx - np->nat_xorg);
if (x >= WORLD_X / 2)
x -= WORLD_X;
- else if (x < -WORLD_X / 2)
- x += WORLD_X;
return x;
}
{
coord y;
- if ((np->nat_stat & STAT_ABS) == 0) {
- y = YNORM(absy - np->nat_yorg);
- } else {
- y = YNORM(absy);
- }
+ y = YNORM(absy - np->nat_yorg);
if (y >= WORLD_Y / 2)
y -= WORLD_Y;
- else if (y < -WORLD_Y / 2)
- y += WORLD_Y;
return y;
}
dst->height = src->height;
}
-void
-inputxy(coord *xp, coord *yp, natid cn)
+/*
+ * Convert initial part of STR to normalized x-coordinate.
+ * Return -1 on error. This works, as normalized coordinates are
+ * non-negative.
+ * Assign pointer to first character after the coordinate to *END,
+ * unless END is a null pointer.
+ */
+coord
+strtox(char *str, char **end)
{
- struct natstr *np;
+ long l;
+
+ errno = 0;
+ l = strtol(str, end, 10);
+ if (*end == str || errno != 0)
+ return -1;
+ return XNORM(l);
+}
- np = getnatp(cn);
- *xp = xabs(np, *xp);
- *yp = yabs(np, *yp);
+/*
+ * Convert initial part of STR to normalized y-coordinate.
+ * Return -1 on error. This works, as normalized coordinates are
+ * non-negative.
+ * Assign pointer to first character after the coordinate to *END,
+ * unless END is a null pointer.
+ */
+coord
+strtoy(char *str, char **end)
+{
+ long l;
+
+ errno = 0;
+ l = strtol(str, end, 10);
+ if (*end == str || errno != 0)
+ return -1;
+ return YNORM(l);
}
coord
xabs(struct natstr *np, coord relx)
{
- if ((np->nat_stat & STAT_ABS) == 0)
- relx += np->nat_xorg;
+ relx += np->nat_xorg;
return XNORM(relx);
}
coord
yabs(struct natstr *np, coord rely)
{
- if ((np->nat_stat & STAT_ABS) == 0)
- rely += np->nat_yorg;
+ rely += np->nat_yorg;
return YNORM(rely);
}
int
sctoff(coord x, coord y)
{
- if ((x + y) & 01) {
- logerror("%d,%d is an invalid sector specification!\n", x, y);
+ if (CANT_HAPPEN((x + y) & 1))
return -1;
- }
- return (YNORM(y) * WORLD_X + XNORM(x)) / 2;
+ return XYOFFSET(XNORM(x), YNORM(y));
}
coord
-xnorm(register coord x)
+xnorm(coord x)
{
- if (x < 0)
- x = WORLD_X - (-x % WORLD_X);
- return x % WORLD_X;
+ return XNORM(x);
}
coord
-ynorm(register coord y)
+ynorm(coord y)
{
- if (y < 0)
- y = WORLD_Y - (-y % WORLD_Y);
- return y % WORLD_Y;
+ return YNORM(y);
}
int
xyinrange(coord x, coord y, struct range *rp)
{
- if (rp->lx < rp->hx) {
+ if (rp->lx <= rp->hx) {
/* xrange doesn't wrap */
if (x < rp->lx || x > rp->hx)
return 0;
if (x < rp->lx && x > rp->hx)
return 0;
}
- if (rp->ly < rp->hy) {
+ if (rp->ly <= rp->hy) {
/* yrange doesn't wrap */
if (y < rp->ly || y > rp->hy)
return 0;
}
-s_char *
-prbuf(s_char *format, ...)
+char *
+prbuf(char *format, ...)
{
static int nbuf = -1;
- static s_char buf[20][1024];
+ static char buf[20][1024];
va_list ap;
if (++nbuf > 19)