]> git.pond.sub.org Git - empserver/blobdiff - src/lib/update/sail.c
COPYING duplicates information from README. Remove. Move GPL from
[empserver] / src / lib / update / sail.c
index 3103b222ba6a32ac7b4b0c54372e5e73f486cff4..e74ad2f8c1d5074a49c584ffb2c072583354cc79 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2000, 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
@@ -19,9 +19,9 @@
  *
  *  ---
  *
- *  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 "var.h"
 #include "sect.h"
 #include "path.h"
 #include "ship.h"
-#include "var.h"
-#include "news.h"
 #include "file.h"
 #include "nat.h"
 #include "xy.h"
 #include "update.h"
 #include "subs.h"
 #include "common.h"
+#include <math.h>
 #include <stdlib.h>
 
+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, ceil(double);
+    double mobcost;
     int howfar;
 
     mobcost = 0.0;
@@ -99,7 +101,7 @@ sail_find_fleet(struct fltheadstr **head, struct shpstr *sp)
     s_char *cp;
 
     if (sp->shp_own == 0)
-       return (0);
+       return 0;
 
 
 
@@ -111,7 +113,7 @@ sail_find_fleet(struct fltheadstr **head, struct shpstr *sp)
            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')
@@ -124,7 +126,7 @@ sail_find_fleet(struct fltheadstr **head, struct shpstr *sp)
        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. */
@@ -132,10 +134,10 @@ sail_find_fleet(struct fltheadstr **head, struct shpstr *sp)
        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':
@@ -160,15 +162,15 @@ sail_find_fleet(struct fltheadstr **head, struct shpstr *sp)
 
     /* 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));
-       bzero((s_char *)fltp, sizeof(*fltp));
+       fltp = malloc(sizeof(*fltp));
+       memset(fltp, 0, sizeof(*fltp));
 
        /* Fix the links. */
        fltp->next = (*head);
@@ -189,11 +191,11 @@ sail_find_fleet(struct fltheadstr **head, struct shpstr *sp)
           "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));
-    bzero((s_char *)this, sizeof(*this));
+    this = malloc(sizeof(*this));
+    memset(this, 0, sizeof(*this));
     this->num = sp->shp_uid;
     this->own = sp->shp_own;
     this->next = fltp->head;
@@ -208,13 +210,13 @@ sail_nav_fleet(struct fltheadstr *fltp)
 {
     struct fltelemstr *fe;
     struct shpstr *sp, ship;
-    int vec[I_MAX + 1];
     struct sctstr *sectp;
     int error = 0;
     s_char *s, *p;
     natid own;
     struct emp_qelem ship_list;
     int dir;
+    int canal = 1;
 
 #ifdef SAILDEBUG
     switch (fltp->real_q) {
@@ -237,37 +239,43 @@ 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 (check_nav(sectp)) {
+    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);
+       return 0;
     }
-    for (fe = fltp->head; fe; fe = fe->next) {
-       sp = getshipp(fe->num);
-       getvec(VT_ITEM, vec, (s_char *)sp, EF_SHIP);
-       if (vec[I_MILIT] == 0 && vec[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 */
     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);
@@ -308,9 +316,9 @@ sail_ship(natid cn)
 
     /* 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. */
@@ -331,7 +339,7 @@ sail_ship(natid cn)
 
 /* The following is a total hack by Ken Stevens to cut down dramatically on repeated code 1995 */
 
-void
+static void
 fltp_to_list(struct fltheadstr *fltp, struct emp_qelem *list)
 {
     struct fltelemstr *fe;
@@ -340,10 +348,10 @@ fltp_to_list(struct fltheadstr *fltp, struct emp_qelem *list)
 
     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;
-       bcopy((s_char *)sp, (s_char *)&mlp->ship, sizeof(struct shpstr));
+       mlp->ship = *sp;
        mlp->mobil = fe->mobil;
        emp_insque(&mlp->queue, list);
     }