]> git.pond.sub.org Git - empserver/blobdiff - src/lib/subs/shpsub.c
COPYING duplicates information from README. Remove. Move GPL from
[empserver] / src / lib / subs / shpsub.c
index 4b0533b1f8e68029b11cfdfa98959c7c3d847d9d..c1b021142c400a8d3557667a9994f2b77f35ece8 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *  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
@@ -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.
  *
  *  ---
  *
@@ -32,6 +32,8 @@
  *     Steve McClure, 1996-2000
  */
 
+#include <config.h>
+
 #include <math.h>
 #include "misc.h"
 #include "queue.h"
@@ -53,7 +55,6 @@
 #include "server.h"
 #include "prototypes.h"
 
-static int shp_check_nav(struct sctstr *);
 static int shp_check_one_mines(struct mlist *);
 static int shp_hit_mine(struct shpstr *, struct mchrstr *);
 static void shp_mess(s_char *, struct mlist *);
@@ -71,7 +72,7 @@ shp_sel(struct nstr_item *ni, struct emp_qelem *list)
     struct mlist *mlp;
 
     emp_initque(list);
-    while (nxtitem(ni, (s_char *)&ship)) {
+    while (nxtitem(ni, &ship)) {
        if (!player->owner)
            continue;
        mcp = &mchr[(int)ship.shp_type];
@@ -103,7 +104,7 @@ shp_sel(struct nstr_item *ni, struct emp_qelem *list)
        ship.shp_rflags = 0;
        memset(ship.shp_rpath, 0, sizeof(ship.shp_rpath));
        putship(ship.shp_uid, &ship);
-       mlp = (struct mlist *)malloc(sizeof(struct mlist));
+       mlp = malloc(sizeof(struct mlist));
        mlp->mcp = mcp;
        mlp->ship = ship;
        mlp->mobil = (double)ship.shp_mobil;
@@ -136,7 +137,7 @@ shp_nav(struct emp_qelem *list, double *minmobp, double *maxmobp,
            mpr(actor, "%s was sunk at %s\n",
                prship(&ship), xyas(ship.shp_x, ship.shp_y, actor));
            emp_remque((struct emp_qelem *)mlp);
-           free((s_char *)mlp);
+           free(mlp);
            continue;
        }
        if (opt_SAIL) {
@@ -161,7 +162,7 @@ shp_nav(struct emp_qelem *list, double *minmobp, double *maxmobp,
            continue;
        case CN_LANDLOCKED:
            shp_mess("is landlocked", mlp);
-           break;
+           continue;
        case CN_NAVIGABLE:
            break;
        case CN_ERROR:
@@ -203,7 +204,7 @@ shp_put(struct emp_qelem *list, natid actor)
        putship(mlp->ship.shp_uid, &mlp->ship);
        newqp = qp->q_back;
        emp_remque(qp);
-       free((s_char *)qp);
+       free(qp);
        qp = newqp;
     }
 }
@@ -255,7 +256,7 @@ shp_sweep(struct emp_qelem *ship_list, int verbose, natid actor)
            if (chance(0.66)) {
                mpr(actor, "Sweep...\n");
                mines--;
-               shells = min(max, shells + 1);
+               shells = MIN(max, shells + 1);
                changed |= map_set(actor, sect.sct_x, sect.sct_y, 'X', 0);
            }
        }
@@ -264,7 +265,7 @@ shp_sweep(struct emp_qelem *ship_list, int verbose, natid actor)
        if (shp_check_one_mines(mlp)) {
            stopping = 1;
            emp_remque(qp);
-           free((s_char *)qp);
+           free(qp);
        }
        putship(mlp->ship.shp_uid, &mlp->ship);
        putsect(&sect);
@@ -294,7 +295,7 @@ shp_check_one_mines(struct mlist *mlp)
        if (changed)
            writemap(actor);
        putsect(&sect);
-       putship(mlp->ship.shp_uid, (s_char *)&mlp->ship);
+       putship(mlp->ship.shp_uid, &mlp->ship);
        if (!mlp->ship.shp_own)
            return 1;
     }
@@ -315,7 +316,7 @@ shp_check_mines(struct emp_qelem *ship_list)
        if (shp_check_one_mines(mlp)) {
            stopping = 1;
            emp_remque(qp);
-           free((s_char *)qp);
+           free(qp);
        }
     }
     return stopping;
@@ -338,7 +339,7 @@ shp_list(struct emp_qelem *ship_list)
        pr("%4d ", shp->shp_uid);
        pr("%-16.16s ", mlp->mcp->m_name);
        prxy("%4d,%-4d ", shp->shp_x, shp->shp_y, mlp->ship.shp_own);
-       pr("%1c", shp->shp_fleet);
+       pr("%c", shp->shp_fleet);
        pr("%4d%%", shp->shp_effic);
        pr("%4d", shp->shp_item[I_MILIT]);
        pr("%4d", shp->shp_item[I_SHELL]);
@@ -363,13 +364,13 @@ shp_mess(s_char *str, struct mlist *mlp)
     mlp->ship.shp_mobil = (int)mlp->mobil;
     putship(mlp->ship.shp_uid, &mlp->ship);
     emp_remque((struct emp_qelem *)mlp);
-    free((s_char *)mlp);
+    free(mlp);
 }
 
-static int
+int
 shp_check_nav(struct sctstr *sect)
 {
-    switch (dchr[sect->sct_type].d_flg & 03) {
+    switch (dchr[sect->sct_type].d_nav) {
     case NAVOK:
        break;
 
@@ -387,6 +388,17 @@ shp_check_nav(struct sctstr *sect)
     return CN_NAVIGABLE;
 }
 
+int
+sect_has_dock(struct sctstr *sect)
+{
+    switch (dchr[sect->sct_type].d_nav) {
+    case NAV_02:
+       return 1;
+    default:
+       return 0;
+    }
+}
+
 static int
 shp_count(struct emp_qelem *list, int wantflags, int nowantflags, int x,
          int y)
@@ -417,7 +429,7 @@ shp_damage_one(struct mlist *mlp, int dam)
     putship(mlp->ship.shp_uid, &mlp->ship);
     if (!mlp->ship.shp_own) {
        emp_remque((struct emp_qelem *)mlp);
-       free((s_char *)mlp);
+       free(mlp);
     }
 }
 
@@ -591,25 +603,19 @@ notify_coastguard(struct emp_qelem *list, int trange, struct sctstr *sectp)
     if (vrange < trange)
        return 0;
 
-    /* We got here, so we could theoretically see the ship.  Now,
-     * do we want to see it in our telebox? If not, return positive
-     * since we could see the ship and want forts to fire. */
-    if (!(natp->nat_flags & NF_COASTWATCH))
-       return 1;
-
     for (qp = list->q_back; qp != list; qp = next) {
        next = qp->q_back;
        mlp = (struct mlist *)qp;
        if (mlp->mcp->m_flags & M_SUB)
            continue;
-       wu(0, sectp->sct_own,
-          "%s %s sighted at %s\n",
-          cname(mlp->ship.shp_own),
-          prship(&mlp->ship),
-          xyas(mlp->ship.shp_x, mlp->ship.shp_y, sectp->sct_own));
-       if (opt_HIDDEN) {
-           setcont(sectp->sct_own, mlp->ship.shp_own, FOUND_LOOK);
-       }
+       if (natp->nat_flags & NF_COASTWATCH)
+           wu(0, sectp->sct_own,
+              "%s %s sighted at %s\n",
+              cname(mlp->ship.shp_own),
+              prship(&mlp->ship),
+              xyas(mlp->ship.shp_x, mlp->ship.shp_y, sectp->sct_own));
+       if (opt_HIDDEN)
+           setcont(sectp->sct_own, mlp->ship.shp_own, FOUND_COAST);
     }
 
     return 1;
@@ -665,7 +671,7 @@ shp_fort_interdiction(struct emp_qelem *list, coord newx, coord newy,
        gun = fsect.sct_item[I_GUN];
        if (gun < 1)
            continue;
-       range = tfactfire(fsect.sct_own, (double)min(gun, 7));
+       range = tfactfire(fsect.sct_own, (double)MIN(gun, 7));
        if (fsect.sct_effic > 59)
            range++;
        range2 = roundrange(range);
@@ -840,8 +846,8 @@ shp_nav_one_sector(struct emp_qelem *list, int dir, natid actor,
                continue;
            }
        }
-       if (opt_BIG_CITY && sect.sct_type == SCT_CAPIT) {
-           if (mlp->mcp->m_lcm + 2 * mlp->mcp->m_hcm >= 60) {
+       if (IS_BIG_CITY(sect.sct_type)) {
+           if (!(mlp->mcp->m_flags & M_CANAL)) {
                sprintf(dp,
                        "is too large to fit into the canal system at %s",
                        xyas(newx, newy, actor));
@@ -954,7 +960,7 @@ shp_missile_defense(coord dx, coord dy, natid bombown, int hardtarget)
            continue;
 
        /* now calculate the odds */
-       gun = min(ship.shp_item[I_GUN], ship.shp_glim);
+       gun = MIN(ship.shp_item[I_GUN], ship.shp_glim);
        eff = (double)ship.shp_effic / 100.0;
        teff =
            (((double)ship.shp_tech) / (((double)ship.shp_tech) + 200.0));
@@ -1008,8 +1014,8 @@ shp_path(int together, struct shpstr *shp, s_char *buf)
        return 0;
     }
 
-    cp = (s_char *)BestShipPath(buf, shp->shp_x, shp->shp_y,
-                               d_sect.sct_x, d_sect.sct_y, player->cnum);
+    cp = BestShipPath(buf, shp->shp_x, shp->shp_y,
+                     d_sect.sct_x, d_sect.sct_y, player->cnum);
     if (!cp || shp->shp_mobil <= 0) {
        mpr(shp->shp_own, "Can't get to '%s' right now.\n",
            xyas(d_sect.sct_x, d_sect.sct_y, player->cnum));
@@ -1029,7 +1035,7 @@ shp_missdef(struct shpstr *sp, natid victim)
 
     emp_initque(&list);
 
-    mlp = (struct mlist *)malloc(sizeof(struct mlist));
+    mlp = malloc(sizeof(struct mlist));
     mlp->mcp = &mchr[(int)sp->shp_type];
     mlp->ship = *sp;
     mlp->mobil = (double)sp->shp_mobil;