]> git.pond.sub.org Git - empserver/blobdiff - src/lib/subs/move.c
Use the new path finder for land paths, drop old A*
[empserver] / src / lib / subs / move.c
index e2fe6cf1751293a4eebc971b228fe1b288bb77fe..57abc754388357f26a291ef6dff92d78ce9694fe 100644 (file)
@@ -1,11 +1,11 @@
 /*
  *  Empire - A multi-player, client/server Internet based war game.
- *  Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak,
- *                           Ken Stevens, Steve McClure
+ *  Copyright (C) 1986-2011, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ *                Ken Stevens, Steve McClure, Markus Armbruster
  *
- *  This program is free software; you can redistribute it and/or modify
+ *  Empire is free software: you can redistribute it and/or modify
  *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2 of the License, or
+ *  the Free Software Foundation, either version 3 of the License, or
  *  (at your option) any later version.
  *
  *  This program is distributed in the hope that it will be useful,
@@ -14,8 +14,7 @@
  *  GNU General Public License for more details.
  *
  *  You should have received a copy of the GNU General Public License
- *  along with this program; if not, write to the Free Software
- *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  *  ---
  *
  *  ---
  *
  *  move.c: Move something somewhere.
- * 
+ *
  *  Known contributors to this file:
- *     
+ *
  */
 
 #include <config.h>
 
-#include "misc.h"
-#include "player.h"
-#include "sect.h"
-#include "item.h"
+#include <ctype.h>
+#include "damage.h"
 #include "file.h"
-#include "xy.h"
-#include "path.h"
-#include "nat.h"
 #include "map.h"
-#include "nsc.h"
-#include "damage.h"
+#include "path.h"
+#include "player.h"
 #include "prototypes.h"
+#include "sect.h"
 
-static int move_map(s_char *what, coord curx, coord cury, s_char *arg);
+static int move_map(coord curx, coord cury, char *arg);
 
 int
-move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
-           double weight, s_char *path,
-           int (*map)(s_char *, coord, coord, s_char *), int exploring,
+move_ground(struct sctstr *start, struct sctstr *end,
+           double weight, char *path,
+           int (*map)(coord, coord, char *), int exploring,
            int *dam)
 {
     struct sctstr sect, ending_sect;
@@ -59,19 +54,19 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
     coord curx, cury, oldx, oldy;
     coord tmpx, tmpy;
     coord dx, dy;
-    s_char *movstr;
+    char *movstr;
     double sect_mcost;
     double total_mcost;
     double mv_cost;
-    double mobility = (double)start->sct_mobil;
+    double mobility = start->sct_mobil;
     int dir;
     int intcost;
     int takedam = *dam;
     int out = 0;
-    s_char bpath[512];
-    s_char buf2[512];
-    s_char prompt[128];
-    s_char buf[1024];
+    char bpath[1024];
+    char buf2[1024];
+    char prompt[128];
+    char buf[1024];
 
     *end = *start;
     if (mobility <= 0.0)
@@ -85,7 +80,7 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
        }
        pr("Looking for best path to %s\n", path);
        path = BestLandPath(buf2, start, &ending_sect, &total_mcost,
-                           MOB_ROAD);
+                           MOB_MOVE);
        if (exploring && path)  /* take off the 'h' */
            path[strlen(path) - 1] = '\0';
        if (!path)
@@ -114,9 +109,9 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
        oldy = cury;
        if (!movstr || *movstr == 0) {
            if (exploring) {
-               map(what, curx, cury, NULL);
+               map(curx, cury, NULL);
            } else {
-               move_map(what, curx, cury, NULL);
+               move_map(curx, cury, NULL);
            }
            sprintf(prompt, "<%.1f: %c %s> ", mobility,
                    dchr[sect.sct_type].d_mnem,
@@ -126,7 +121,7 @@ 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);
+                                     MOB_MOVE);
            } else {
                pr("Invalid destination sector!\n");
                movstr = NULL;
@@ -158,18 +153,17 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
            *movstr = 0;
            continue;
        }
-       movstr++;
+       do  movstr++; while (isspace(*movstr));
        if (dir == DIR_MAP) {
            if (!exploring)
-               map(what, curx, cury, movstr + 1);
+               map(curx, cury, movstr);
            *movstr = 0;
            continue;
        } else if (dir == DIR_STOP)
            break;
        else if (dir == DIR_VIEW) {
            pr("%d%% %s with %d civilians.\n", sect.sct_effic,
-              dchr[sect.sct_type].d_name,
-              sect.sct_item[I_CIVIL]);
+              dchr[sect.sct_type].d_name, sect.sct_item[I_CIVIL]);
            continue;
        }
        /*
@@ -191,7 +185,7 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
                *movstr = 0;
                continue;
            }
-           sect_mcost = sector_mcost(&next, MOB_ROAD);
+           sect_mcost = sector_mcost(&next, MOB_MOVE);
            if ((!player->owner && (!exploring
                                    || next.sct_item[I_MILIT]
                                    || next.sct_item[I_CIVIL]))
@@ -211,8 +205,8 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
            mobility -= sect_mcost;
            total_mcost += sect_mcost;
        }
-       curx = tmpx;
-       cury = tmpy;
+       curx = next.sct_x;
+       cury = next.sct_y;
        if (cury != start->sct_y)
            out = 1;
        if (curx != start->sct_x)
@@ -230,7 +224,7 @@ 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");
+                                    "commodities");
        if (*dam >= 100)
            break;
     }
@@ -250,7 +244,7 @@ move_ground(s_char *what, struct sctstr *start, struct sctstr *end,
 
 /*ARGSUSED*/
 static int
-move_map(s_char *what, coord curx, coord cury, s_char *arg)
+move_map(coord curx, coord cury, char *arg)
 {
     struct nstr_sect ns;
     struct sctstr sect;
@@ -305,7 +299,7 @@ fly_map(coord curx, coord cury)
     i = 0;
     while (i < 7 && nxtsct(&ns, &sect)) {
        /* Nasty: this relies on the iteration order */
-       if (!(view[i] = player->bmap[sctoff(ns.x, ns.y)]))
+       if (!(view[i] = player->bmap[sect.sct_uid]))
            view[i] = ' ';
        i++;
     }
@@ -323,7 +317,7 @@ check_lmines(coord x, coord y, double weight)
     int dam = 0;
 
     getsect(x, y, &sect);
-    if (sect.sct_mines > 0 &&
+    if (SCT_LANDMINES(&sect) > 0 &&
        sect.sct_oldown != player->cnum &&
        chance(DMINE_LHITCHANCE(sect.sct_mines)) && chance(weight / 100.0)) {
        pr_beep();