/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak,
- * Ken Stevens, Steve McClure
+ * Copyright (C) 1986-2011, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Ken Stevens, Steve McClure, Markus Armbruster
*
- * This program is free software; you can redistribute it and/or modify
+ * Empire 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
+ * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* 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
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* ---
*
- * 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.
*
* ---
*
* coastal.c: Routines to calculate the coastal flag
- *
+ *
* Known contributors to this file:
* Ron Koenderink, 2005
- *
*/
#include <config.h>
-#include "prototypes.h"
#include "file.h"
#include "path.h"
+#include "prototypes.h"
+#include "sect.h"
-static void
-update_coastal_flag(struct sctstr *sp, struct sctstr *sectp)
+static int
+update_coastal_flag(coord x, coord y, coord ign_x, coord ign_y)
{
int n;
struct sctstr sect;
for (n = 1; n <= 6; n++) { /* Directions */
- getsect(sp->sct_x + diroff[n][0], sp->sct_y + diroff[n][1], §);
- if (sectp && sectp->sct_x == sect.sct_x &&
- sectp->sct_y == sect.sct_y)
+ getsect(x + diroff[n][0], y + diroff[n][1], §);
+ if (sect.sct_x == ign_x && sect.sct_y == ign_y)
continue;
if (sect.sct_type == SCT_WATER || sect.sct_type == SCT_BTOWER ||
- sect.sct_type == SCT_BSPAN) {
- if (!sp->sct_coastal) {
- sp->sct_coastal = 1;
- putsect(sp);
- }
- return;
- }
- }
- if (sp->sct_coastal) {
- sp->sct_coastal = 0;
- putsect(sp);
+ sect.sct_type == SCT_BSPAN)
+ return 1;
}
+
+ return 0;
}
-static void
-coastal_sea_to_land(struct sctstr *sp, int des)
+static int
+coastal_sea_to_land(coord x, coord y)
{
- int n;
+ int n, c;
struct sctstr sect;
- update_coastal_flag(sp, NULL);
-
for (n = 1; n <= 6; n++) { /* Directions */
- getsect(sp->sct_x + diroff[n][0], sp->sct_y + diroff[n][1], §);
- update_coastal_flag(§, sp);
+ getsect(x + diroff[n][0], y + diroff[n][1], §);
+ c = update_coastal_flag(sect.sct_x, sect.sct_y, x, y);
+ if (!sect.sct_coastal != !c) {
+ sect.sct_coastal = c;
+ putsect(§);
+ }
}
+
+ return update_coastal_flag(x, y, x, y);
}
-static void
-coastal_land_to_sea(struct sctstr *sp, int des)
+static int
+coastal_land_to_sea(coord x, coord y)
{
int n;
struct sctstr sect;
- sp->sct_coastal = 1;
- putsect(sp);
-
for (n = 1; n <= 6; ++n) { /* Directions */
- getsect(sp->sct_x + diroff[n][0], sp->sct_y + diroff[n][1], §);
+ getsect(x + diroff[n][0], y + diroff[n][1], §);
if (!sect.sct_coastal) {
sect.sct_coastal = 1;
putsect(§);
}
}
+
+ return 1;
}
+/*
+ * Compute coastal flags for a change of SP from OLDDES to NEWDES.
+ * Update adjacent sectors, but don't touch SP.
+ * Return new coastal flag for SP.
+ */
void
-set_coastal(struct sctstr *sp, int des)
+set_coastal(struct sctstr *sp, int olddes, int newdes)
{
- int old_water = 0;
- int new_water = 0;
-
- if (sp->sct_type == SCT_WATER || sp->sct_type == SCT_BTOWER ||
- sp->sct_type == SCT_BSPAN)
- old_water = 1;
-
- if (des == SCT_WATER || des == SCT_BTOWER || des== SCT_BSPAN)
- new_water = 1;
+ int old_water = olddes == SCT_WATER
+ || olddes == SCT_BTOWER || olddes == SCT_BSPAN;
+ int new_water = newdes == SCT_WATER
+ || newdes == SCT_BTOWER || newdes == SCT_BSPAN;
- if (new_water == old_water)
- return;
- else if (new_water)
- coastal_land_to_sea(sp, des);
- else
- coastal_sea_to_land(sp, des);
+ if (new_water != old_water)
+ sp->sct_coastal = new_water
+ ? coastal_land_to_sea(sp->sct_x, sp->sct_y)
+ : coastal_sea_to_land(sp->sct_x, sp->sct_y);
}