Change struct range from exclusive to inclusive upper bounds, for consistency with struct realmstr and the area syntax. Also fix many bugs. real()'s conversion from struct range's exclusive upper bounds to struct realmstr's inclusive upper bounds could underflow and store -1 in the realms file. Harmless, because its users didn't mind: list_realm() and nstr_exec_val() convert back to relative coordinates, and sarg_getrange() is only used by sarg_area(), which happened to undo the damage. The change to inclusive upper bounds gets rid of the broken conversion. xyinrange() incorrectly treated the upper bound as inclusive, unless the bounds were equal. Impact: * nxtitem() and nxtitemp() cases NS_AREA and NS_DIST attempted to hack around xyinrange()'s lossage(!), but screwed up: sectors on the lower bound of of a range spanning the the whole world were skipped. This affected all command arguments that support area or distance syntax for items. In sufficiently small worlds, it could also make radar miss satellites and ships, sonar miss ships, satellite miss ships and land units, nuclear detonations miss ships, planes, land units and nukes, automatic supply miss ship and land unit supply sources, ships and land units fail to return fire, ships fail to fire support. * draw_map() could draw units sitting just right or just below of the mapped area. No effect, as these parts of the map weren't actually shown. xydist_range() produced an inclusive upper bound when it decided that the range covers everything in that dimension (which it didn't get quite right either). This could make snxtsct_dist() and snxtitem_dist() initialize the iterator with an incorrect upper bound. Similar impact as the xyinrange() / nxtitem() lossage. border() could print the hundreds line unnecessarily. snxtsct() and snxtsct_all() screwed up for odd WORLD_Y: they failed to include (WORLD_Y - 1) / 2 in the y-range. This affected all command arguments that support "*" syntax for sectors, plus add ... c, power n, and break. snxtsct_all() failed to normalize the bounds (presumed harmless). There were a few correct, but somewhat unclean uses of struct range with inclusive upper bounds: * nat_reset() used one internally. * pathrange() worked with inclusive upper bounds internally, but corrected to exclusive upper bounds before passing the range out. * sarg_getrange() worked with inclusive upper bounds. Its only caller sarg_area() corrected that to exclusive upper bounds. The change to inclusive upper bounds cleans this up. unit_map() and xysize_range() had no issues (isn't that amazing?), but need to be updated for the changed struct range semantics.
72 lines
2.5 KiB
C
72 lines
2.5 KiB
C
/*
|
|
* Empire - A multi-player, client/server Internet based war game.
|
|
* Copyright (C) 1986-2008, Dave Pare, Jeff Bailey, Thomas Ruschak,
|
|
* Ken Stevens, Steve McClure
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*
|
|
* ---
|
|
*
|
|
* 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.h: Constants having to do with world locations.
|
|
*
|
|
* Known contributors to this file:
|
|
* Steve McClure, 1998
|
|
*/
|
|
|
|
#ifndef XY_H
|
|
#define XY_H
|
|
|
|
#include "types.h"
|
|
|
|
/* Return the number of sectors in the world */
|
|
#define WORLD_SZ() (WORLD_X * WORLD_Y / 2)
|
|
|
|
/* Fast version of sctoff() for normalized arguments */
|
|
#define XYOFFSET(x, y) (((y) * WORLD_X + (x)) / 2)
|
|
|
|
#define XNORM(x) \
|
|
(((x) < 0) ? (WORLD_X - 1 - ((-(x) - 1) % WORLD_X)) : ((x) % WORLD_X))
|
|
#define YNORM(y) \
|
|
(((y) < 0) ? (WORLD_Y - 1 - ((-(y) - 1) % WORLD_Y)) : ((y) % WORLD_Y))
|
|
|
|
struct range {
|
|
coord lx, ly; /* low-range x,y (inclusive) */
|
|
coord hx, hy; /* high-range x,y (inclusive) */
|
|
int width, height;
|
|
};
|
|
|
|
extern char *xyas(coord x, coord y, natid country);
|
|
extern char *ownxy(struct sctstr *sp);
|
|
extern coord xrel(struct natstr *np, coord absx);
|
|
extern coord yrel(struct natstr *np, coord absy);
|
|
extern void xyrelrange(struct natstr *np, struct range *src,
|
|
struct range *dst);
|
|
extern void xyabsrange(struct natstr *np, struct range *src,
|
|
struct range *dst);
|
|
extern coord strtox(char *str, char **end);
|
|
extern coord strtoy(char *str, char **end);
|
|
extern coord xabs(struct natstr *np, coord relx);
|
|
extern coord yabs(struct natstr *np, coord rely);
|
|
extern coord xnorm(coord x);
|
|
extern coord ynorm(coord y);
|
|
extern int xyinrange(coord x, coord y, struct range *rp);
|
|
|
|
#endif
|