From 2088eab2282d7fcc8279ec9dc36eab710a05024f Mon Sep 17 00:00:00 2001 From: Ron Koenderink Date: Wed, 18 Jan 2006 01:08:55 +0000 Subject: [PATCH] (sail_nav_fleet): Prevent a large fleet from sailing through a canal. Ensure only ships with M_CANAL can navigate a canal. --- src/lib/update/sail.c | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/lib/update/sail.c b/src/lib/update/sail.c index 666cacf8..0ad89d65 100644 --- a/src/lib/update/sail.c +++ b/src/lib/update/sail.c @@ -216,6 +216,7 @@ sail_nav_fleet(struct fltheadstr *fltp) natid own; struct emp_qelem ship_list; int dir; + int canal = 1; #ifdef SAILDEBUG switch (fltp->real_q) { @@ -238,9 +239,27 @@ sail_nav_fleet(struct fltheadstr *fltp) wu(0, fltp->own, " %d", fe->num); wu(0, fltp->own, "\n"); #endif + 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) { + wu(0, fltp->own, + " 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; 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: @@ -249,17 +268,6 @@ sail_nav_fleet(struct fltheadstr *fltp) 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) { - wu(0, fltp->own, - " ship #%d (%s) is crewless and can't go on\n", - fe->num, cname(fe->own)); - error = 1; - } - } - if (error) - return 0; sp = getshipp(fltp->leader); own = sp->shp_own; fltp_to_list(fltp, &ship_list); /* hack -KHS 1995 */