/*
* 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.
*
* ---
*
* sail.c: Sail ships during the update
- *
+ *
* Known contributors to this file:
* Doug Hay
* Robert Forsman
#include <config.h>
-#include "misc.h"
-#include "sect.h"
-#include "path.h"
-#include "ship.h"
-#include "file.h"
-#include "nat.h"
-#include "xy.h"
+#include <math.h>
#include "nsc.h"
+#include "path.h"
#include "update.h"
-#include "subs.h"
-#include "common.h"
-#include <math.h>
-#include <stdlib.h>
+#include "empobj.h"
+#include "unit.h"
+
+struct fltelemstr {
+ int num;
+ int own;
+ double mobil, mobcost;
+ struct fltelemstr *next;
+};
+
+struct fltheadstr {
+ int leader;
+ signed char real_q;
+/* defines for the real_q member */
+#define LEADER_VIRTUAL 0
+#define LEADER_REAL 1
+#define LEADER_WRONGSECT 2
+ coord x, y;
+ natid own;
+ unsigned maxmoves;
+ struct fltelemstr *head;
+ struct fltheadstr *next;
+};
static void fltp_to_list(struct fltheadstr *, struct emp_qelem *);
static void
cost_ship(struct shpstr *sp, struct fltelemstr *ep, struct fltheadstr *fp)
{
- double mobcost;
+ double mobcost = shp_mobcost(sp);
int howfar;
- mobcost = 0.0;
- if (sp->shp_effic > 0) {
- mobcost = sp->shp_effic * sp->shp_speed * 0.01;
- mobcost = 480.0 / (mobcost * (1 + (50 + sp->shp_tech) /
- (double)(200 + sp->shp_tech)));
- }
-/* the next two lines are not necessary since shp_mobquota is unsigned
-and therefore cannot be less than 0.
- if (sp->shp_mobquota<0)
- sp->shp_mobquota=0;
-*/
-
howfar = 0;
if (mobcost > 0) {
howfar = (int)sp->shp_mobil - (int)sp->shp_mobquota;
"Ship #%d can move %d spaces on mobility %d (cost/sect %f)\n",
sp->shp_uid, howfar, sp->shp_mobil, mobcost);
#endif
- if ((unsigned int)howfar < fp->maxmoves)
+ if ((unsigned)howfar < fp->maxmoves)
fp->maxmoves = howfar;
ep->mobil = sp->shp_mobil;
int len = 0;
int follow = -1;
int stop;
- s_char *cp;
+ char *cp;
if (sp->shp_own == 0)
return 0;
return 0;
/* Find the fleet structure we belong to. */
- for (fltp = (*head); (fltp && fltp->leader != follow);
- fltp = fltp->next) ;
+ for (fltp = *head; fltp && fltp->leader != follow; fltp = fltp->next) ;
if (!fltp) {
fltp = malloc(sizeof(*fltp));
memset(fltp, 0, sizeof(*fltp));
/* Fix the links. */
- fltp->next = (*head);
+ fltp->next = *head;
*head = fltp;
/* Set the leader. */
struct shpstr *sp, ship;
struct sctstr *sectp;
int error = 0;
- s_char *s, *p;
+ char *s, *p;
natid own;
struct emp_qelem ship_list;
int dir;
wu(0, fltp->own, "\n");
#endif
sectp = getsectp(fltp->x, fltp->y);
- switch (check_nav(sectp)) {
- case CN_NAVIGABLE:
- break;
- case CN_CONSTRUCTION:
- case CN_LANDLOCKED:
- default:
- wu(0, fltp->own, "Your fleet lead by %d is trapped by land.\n",
- fltp->leader);
- return 0;
- }
for (fe = fltp->head; fe; fe = fe->next) {
sp = getshipp(fe->num);
if (sp->shp_item[I_MILIT] == 0 && sp->shp_item[I_CIVIL] == 0) {
fe->num, cname(fe->own));
error = 1;
}
+ if ((shp_check_nav(sectp, sp) == CN_LANDLOCKED) &&
+ (dchr[sectp->sct_type].d_nav == NAV_CANAL)) {
+ wu(0, fltp->own,
+ "Your ship #%d (%s) is too big to fit through the canal.\n",
+ fe->num, cname(fe->own));
+ error = 1;
+ }
}
if (error)
return 0;
sp = getshipp(fltp->leader);
+ sectp = getsectp(fltp->x, fltp->y);
+ if (shp_check_nav(sectp, sp) != CN_NAVIGABLE)
+ wu(0, fltp->own, "Your fleet lead by %d is trapped by land.\n",
+ fltp->leader);
+ sp = getshipp(fltp->leader);
own = sp->shp_own;
fltp_to_list(fltp, &ship_list); /* hack -KHS 1995 */
- for (s = sp->shp_path; (*s) && (fltp->maxmoves > 0); s++) {
+ for (s = sp->shp_path; *s && fltp->maxmoves > 0; s++) {
dir = diridx(*s);
if (0 != shp_nav_one_sector(&ship_list, dir, own, 0))
fltp->maxmoves = 1;
--fltp->maxmoves;
}
- shp_put(&ship_list, own);
+ unit_put(&ship_list, own);
getship(sp->shp_uid, &ship);
fltp->x = ship.shp_x;
fltp->y = ship.shp_y;
sail_ship(natid cn)
{
struct shpstr *sp;
- struct fltheadstr *head = 0;
+ struct fltheadstr *head = NULL;
struct fltheadstr *fltp;
int n;
/* see what the fleets fall out into */
for (fltp = head; fltp; fltp = fltp->next) {
- sail_nav_fleet(fltp);
- wu(0, fltp->own, "Your fleet lead by ship #%d has reached %s.\n",
- fltp->leader, xyas(fltp->x, fltp->y, fltp->own));
+ if (sail_nav_fleet(fltp))
+ wu(0, fltp->own, "Your fleet lead by ship #%d has reached %s.\n",
+ fltp->leader, xyas(fltp->x, fltp->y, fltp->own));
}
/* Free up the memory, 'cause I want to. */
- for (fltp = head; fltp != 0;) {
+ for (fltp = head; fltp;) {
struct fltelemstr *fe;
struct fltheadstr *saveh;
saveh = fltp->next;
- for (fe = fltp->head; fe != 0;) {
+ for (fe = fltp->head; fe;) {
struct fltelemstr *saveel;
saveel = fe->next;
free(fe);
fltp_to_list(struct fltheadstr *fltp, struct emp_qelem *list)
{
struct fltelemstr *fe;
- struct mlist *mlp;
+ struct ulist *mlp;
struct shpstr *sp;
emp_initque(list);
for (fe = fltp->head; fe; fe = fe->next) {
- mlp = malloc(sizeof(struct mlist));
+ mlp = malloc(sizeof(struct ulist));
sp = getshipp(fe->num);
- mlp->mcp = mchr + sp->shp_type;
- mlp->ship = *sp;
+ mlp->chrp = (struct empobj_chr *)(mchr + sp->shp_type);
+ mlp->unit.ship = *sp;
+ ef_mark_fresh(EF_SHIP, &mlp->unit.ship);
mlp->mobil = fe->mobil;
emp_insque(&mlp->queue, list);
}