]> git.pond.sub.org Git - empserver/blobdiff - src/lib/subs/move.c
COPYING duplicates information from README. Remove. Move GPL from
[empserver] / src / lib / subs / move.c
index 4204c082dcd4f9aa832eeee0050262b86546d891..7b83f21fb0c27ac8b2c565bc76ed3c59df3cd7d6 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.
  *
  *  ---
  *
  *     
  */
 
+#include <config.h>
+
 #include "misc.h"
 #include "player.h"
-#include "var.h"
 #include "sect.h"
 #include "item.h"
 #include "file.h"
-#include "deity.h"
 #include "xy.h"
 #include "path.h"
 #include "nat.h"
@@ -50,24 +50,20 @@ static int move_map(s_char *what, coord curx, coord cury, s_char *arg);
 
 int
 move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
-           double mobility, double weight, s_char *path,
-           int (*map) (s_char *, coord, coord, s_char *), int exploring,
+           double weight, s_char *path,
+           int (*map)(s_char *, coord, coord, s_char *), int exploring,
            int *dam)
-
-
-                               /* RESULT */
 {
     struct sctstr sect, ending_sect;
     struct sctstr next, dsect;
-    int vec[I_MAX + 1];
     coord curx, cury, oldx, oldy;
     coord tmpx, tmpy;
     coord dx, dy;
-    s_char *movstr, *BestLandPath(s_char *, struct sctstr *,
-                                 struct sctstr *, double *, int);
+    s_char *movstr;
     double sect_mcost;
     double total_mcost;
     double mv_cost;
+    double mobility = (double)start->sct_mobil;
     int dir;
     int intcost;
     int takedam = (*dam), out = 0;
@@ -76,6 +72,7 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
     s_char prompt[128];
     s_char buf[1024];
 
+    *end = *start;
     if (mobility <= 0.0)
        return -1;
     *dam = 0;
@@ -86,9 +83,8 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
            return -1;
        }
        pr("Looking for best path to %s\n", path);
-       path =
-           BestLandPath(buf2, start, &ending_sect, &total_mcost,
-                        MOB_ROAD);
+       path = BestLandPath(buf2, start, &ending_sect, &total_mcost,
+                           MOB_ROAD);
        if (exploring && (path != (s_char *)0)) /* take off the 'h' */
            *(path + strlen(path) - 1) = '\0';
        if (path == (s_char *)0)
@@ -96,29 +92,23 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
        else {
            pr("Using best path '%s', movement cost %1.3f\n",
               path, total_mcost);
-           bzero(bpath, 512);
-           bcopy(path, bpath, strlen(path));
+           strncpy(bpath, path, sizeof(bpath));
            path = bpath;
        }
        if ((total_mcost * weight) > mobility) {
            pr("Not enough mobility to go all the way. Nothing moved.\n");
-           *end = *start;
            return -1;
        }
     }
     movstr = path;
-    tmpx = start->sct_x;
-    curx = tmpx;
-    tmpy = start->sct_y;
-    cury = tmpy;
+    curx = start->sct_x;
+    cury = start->sct_y;
     total_mcost = 0.0;
     if (getsect(curx, cury, &sect) < 0) {
        logerror("move_path: getsect %d,%d", curx, cury);
        return -1;
     }
     for (;;) {
-       tmpx = curx;
-       tmpy = cury;
        oldx = curx;
        oldy = cury;
        if (movstr == 0 || *movstr == 0) {
@@ -134,8 +124,8 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
        }
        if (movstr && sarg_xy(movstr, &dx, &dy)) {
            if (getsect(dx, dy, &dsect)) {
-               movstr =
-                   BestLandPath(buf2, &sect, &dsect, &mv_cost, MOB_ROAD);
+               movstr = BestLandPath(buf2, &sect, &dsect, &mv_cost,
+                                     MOB_ROAD);
            } else {
                pr("Invalid destination sector!\n");
                movstr = (s_char *)0;
@@ -152,14 +142,16 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
                } else {
                    pr("Using best path '%s', movement cost %1.3f\n",
                       movstr, mv_cost);
-                   bzero(bpath, 512);
-                   bcopy(movstr, bpath, strlen(movstr));
+                   strncpy(bpath, movstr, sizeof(bpath));
                    movstr = bpath;
                }
            }
        }
-       if (movstr == 0 || *movstr == 0)
-           movstr = dirch;
+       if (movstr == 0 || *movstr == 0) {
+           buf2[0] = dirch[DIR_STOP];
+           buf2[1] = 0;
+           movstr = buf2;
+       }
        if ((dir = chkdir(*movstr, DIR_STOP, DIR_MAP)) < 0) {
            pr("\"%c\" is not legal...", *movstr);
            direrr("'%c' to stop ", "'%c' to view ", "& '%c' to map\n");
@@ -177,7 +169,7 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
        else if (dir == DIR_VIEW) {
            pr("%d%% %s with %d civilians.\n", sect.sct_effic,
               dchr[sect.sct_type].d_name,
-              getvar(V_CIVIL, (s_char *)&sect, EF_SECTOR));
+              sect.sct_item[I_CIVIL]);
            continue;
        }
        /*
@@ -185,8 +177,8 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
         * next sector.  Mobility, terrain,
         * or ownership may prevent us.
         */
-       tmpx += diroff[dir][0];
-       tmpy += diroff[dir][1];
+       tmpx = curx + diroff[dir][0];
+       tmpy = cury + diroff[dir][1];
        if (getsect(tmpx, tmpy, &next) < 0) {
            pr("You can't go there...\n");
            *movstr = 0;
@@ -196,17 +188,14 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
            if ((next.sct_type == SCT_SANCT) &&
                (next.sct_own != player->cnum)) {
                pr("Converts, huh?\n");
-               *end = next;
-               intcost = (int)total_mcost;
-               if (chance(total_mcost - intcost))
-                   intcost++;
-               return intcost;
+               *movstr = 0;
+               continue;
            }
-           getvec(VT_ITEM, vec, (s_char *)&next, EF_SECTOR);
            sect_mcost = sector_mcost(&next, MOB_ROAD);
-           if ((!player->owner && (!exploring ||
-                                   (vec[I_MILIT] || vec[I_CIVIL]))) ||
-               sect_mcost == -1.0) {
+           if ((!player->owner && (!exploring
+                                   || next.sct_item[I_MILIT]
+                                   || next.sct_item[I_CIVIL]))
+               || sect_mcost == -1.0) {
                /* already-owned, or prohibited terrain */
                pr("You can't go there...\n");
                *movstr = 0;
@@ -240,8 +229,8 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
         */
        if (takedam && chance(weight / 100.0) &&
            ((curx != oldx) || (cury != oldy)))
-           (*dam) +=
-               ground_interdict(curx, cury, player->cnum, "commodities");
+           (*dam) += ground_interdict(curx, cury, player->cnum,
+                                      "commodities");
        if (*dam >= 100)
            break;
     }
@@ -270,7 +259,6 @@ move_map(s_char *what, coord curx, coord cury, s_char *arg)
     s_char range[128];
     s_char view[7];
     int i;
-    int vec[I_MAX + 1];
     int changed = 0;
 
     np = getnatp(player->cnum);
@@ -307,13 +295,13 @@ move_map(s_char *what, coord curx, coord cury, s_char *arg)
        writemap(player->cnum);
     if (!getsect(curx, cury, &sect))
        return RET_FAIL;
-    getvec(VT_ITEM, vec, (s_char *)&sect, EF_SECTOR);
     pr("    %c %c      eff   mob   civ  mil   uw food  work  avail\n",
        view[0], view[1]);
     pr("   %c %c %c     %3d   %3d  %4d %4d %4d %4d   %3d   %3d\n",
        view[2], view[3], view[4],
-       sect.sct_effic, sect.sct_mobil, vec[I_CIVIL], vec[I_MILIT],
-       vec[I_UW], vec[I_FOOD], sect.sct_work, sect.sct_avail);
+       sect.sct_effic, sect.sct_mobil,
+       sect.sct_item[I_CIVIL], sect.sct_item[I_MILIT], sect.sct_item[I_UW],
+       sect.sct_item[I_FOOD], sect.sct_work, sect.sct_avail);
     pr("    %c %c\n", view[5], view[6]);
     return RET_OK;
 }
@@ -359,20 +347,17 @@ int
 check_lmines(coord x, coord y, double weight)
 {
     struct sctstr sect;
-    int mines;
     int dam = 0;
 
     getsect(x, y, &sect);
-    mines = getvar(V_MINE, (s_char *)&sect, EF_SECTOR);
-    if (mines > 0 &&
+    if (sect.sct_mines > 0 &&
        sect.sct_oldown != player->cnum &&
-       chance(DMINE_LHITCHANCE(mines)) && chance(weight / 100.0)) {
+       chance(DMINE_LHITCHANCE(sect.sct_mines)) && chance(weight / 100.0)) {
        pr_beep();
        pr("Blammo! Landmines detected! in %s  ",
           xyas(sect.sct_x, sect.sct_y, player->cnum));
        dam = roll(20);
-       --mines;
-       putvar(V_MINE, mines, (s_char *)&sect, EF_SECTOR);
+       --sect.sct_mines;
        putsect(&sect);
        pr("%d damage sustained.\n", dam);
     }