]> git.pond.sub.org Git - empserver/blobdiff - src/lib/update/sail.c
Update copyright notice.
[empserver] / src / lib / update / sail.c
index 401a83226e1b090b7c8696d2cbd333114867146b..eb0d3931a7cab388d7445a9db43fd975df5976cd 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *  Copyright (C) 1986-2007, 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.
  *
  *  ---
  *
 
 #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"
 
 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;
@@ -82,7 +63,7 @@ and therefore cannot be less than 0.
        "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;
@@ -98,7 +79,7 @@ sail_find_fleet(struct fltheadstr **head, struct shpstr *sp)
     int len = 0;
     int follow = -1;
     int stop;
-    s_char *cp;
+    char *cp;
 
     if (sp->shp_own == 0)
        return 0;
@@ -165,15 +146,14 @@ sail_find_fleet(struct fltheadstr **head, struct shpstr *sp)
        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. */
@@ -212,7 +192,7 @@ sail_nav_fleet(struct fltheadstr *fltp)
     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;
@@ -239,16 +219,6 @@ sail_nav_fleet(struct fltheadstr *fltp)
     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) {
@@ -257,13 +227,25 @@ sail_nav_fleet(struct fltheadstr *fltp)
               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;
@@ -308,9 +290,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. */
@@ -335,15 +317,15 @@ static void
 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;
        mlp->mobil = fe->mobil;
        emp_insque(&mlp->queue, list);
     }