/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2005, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2006, 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.
*
* ---
*
* Steve McClure, 1998-2000
*/
+#include <config.h>
+
#include "misc.h"
#include "sect.h"
#include "path.h"
s_char *cp;
if (sp->shp_own == 0)
- return (0);
+ return 0;
wu(0, sp->shp_own,
"Ship #%d, following #%d, which you don't own.\n",
sp->shp_uid, ap->shp_uid);
- return (0);
+ return 0;
}
/* Not a follower. */
if (ap->shp_path[0] != 'f')
wu(0, sp->shp_own,
"Ship #%d, following #%d, which you don't own.\n",
sp->shp_uid, follow);
- return (0);
+ return 0;
}
/* This should prevent infinite loops. */
wu(0, sp->shp_own,
"Ship #%d, too many follows (circular follow?).\n",
sp->shp_uid);
- return (0);
+ return 0;
}
- for (stop = 0, cp = ap->shp_path; (!stop) && (*cp); cp++) {
+ for (stop = 0, cp = ap->shp_path; !stop && *cp; cp++) {
switch (*cp) {
case 'y':
case 'u':
/* if this ship is not sailing anywhere then ignore it. */
if (!*ap->shp_path)
- return (0);
+ return 0;
/* Find the fleet structure we belong to. */
for (fltp = (*head); (fltp && fltp->leader != follow);
fltp = fltp->next) ;
if (!fltp) {
- fltp = (struct fltheadstr *)malloc(sizeof(*fltp));
+ fltp = malloc(sizeof(*fltp));
memset(fltp, 0, sizeof(*fltp));
/* Fix the links. */
"Ship %d not in same sector as its sailing fleet\n",
sp->shp_uid);
fltp->real_q = LEADER_WRONGSECT;
- return (0);
+ return 0;
}
- this = (struct fltelemstr *)malloc(sizeof(*this));
+ this = malloc(sizeof(*this));
memset(this, 0, sizeof(*this));
this->num = sp->shp_uid;
this->own = sp->shp_own;
natid own;
struct emp_qelem ship_list;
int dir;
+ int canal = 1;
#ifdef SAILDEBUG
switch (fltp->real_q) {
wu(0, fltp->own, " %d", fe->num);
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) {
" ship #%d (%s) is crewless and can't go on\n",
fe->num, cname(fe->own));
error = 1;
- }
+ } else if (!(mchr[sp->shp_type].m_flags & M_CANAL))
+ canal = 0;
}
if (error)
- return (0);
+ return 0;
+ sectp = getsectp(fltp->x, fltp->y);
+ switch (shp_check_nav(sectp)) {
+ case CN_NAVIGABLE:
+ if (IS_BIG_CITY(sectp->sct_type) && !canal) {
+ wu(0, fltp->own,
+ "Your fleet lead by %d is too big to fit through the canal.\n",
+ fltp->leader);
+ return 0;
+ }
+ 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;
+ }
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++) {
- dir = chkdir(*s, DIR_STOP, DIR_LAST);
- if (0 != (error = shp_nav_one_sector(&ship_list, dir, own, 0)))
+ dir = diridx(*s);
+ if (0 != shp_nav_one_sector(&ship_list, dir, own, 0))
fltp->maxmoves = 1;
- --(fltp->maxmoves);
+ --fltp->maxmoves;
}
shp_put(&ship_list, own);
getship(sp->shp_uid, &ship);
/* 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. */
emp_initque(list);
for (fe = fltp->head; fe; fe = fe->next) {
- mlp = (struct mlist *)malloc(sizeof(struct mlist));
+ mlp = malloc(sizeof(struct mlist));
sp = getshipp(fe->num);
mlp->mcp = mchr + sp->shp_type;
mlp->ship = *sp;