]> git.pond.sub.org Git - empserver/blobdiff - src/lib/commands/marc.c
Update copyright notice.
[empserver] / src / lib / commands / marc.c
index b6293e34d366eaba4bf7e14cd237416991d4fc1f..c9083843f5bbd89b724213a7897b44fbff6da42a 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
 #include <ctype.h>
 #include "commands.h"
 #include "file.h"
-#include "land.h"
 #include "map.h"
 #include "path.h"
-
-static int set_leader(struct emp_qelem *list, struct lndstr **leaderp);
-static void switch_leader(struct emp_qelem *list, int land_uid);
+#include "empobj.h"
+#include "unit.h"
 
 int
 march(void)
@@ -52,9 +50,8 @@ march(void)
     double minmob, maxmob;
     int together;
     char *cp = NULL;
-    struct lndstr *lnd = NULL; /* leader */
-    struct nstr_sect ns;
-    char origin;
+    int leader_uid;
+    struct empobj *leader;
     int dir;
     int stopping = 0;
     int skip = 0;
@@ -72,10 +69,12 @@ march(void)
        pr("No lands\n");
        return RET_FAIL;
     }
-    set_leader(&land_list, &lnd);
+    leader = get_leader(&land_list);
+    leader_uid = leader->uid;
+    pr("Leader is %s\n", obj_nameof(leader));
     if (player->argp[2]) {
        strcpy(buf, player->argp[2]);
-       if (!(cp = lnd_path(together, lnd, buf)))
+       if (!(cp = lnd_path(together, (struct lndstr *)leader, buf)))
            cp = player->argp[2];
     }
 
@@ -89,16 +88,19 @@ march(void)
                pr("No lands left\n");
                return RET_OK;
            }
-           if (set_leader(&land_list, &lnd)) {
+           leader = get_leader(&land_list);
+           if (leader->uid != leader_uid) {
+               leader_uid = leader->uid;
+               pr_leader_change(leader);
                stopping = 1;
                continue;
            }
            if (!skip)
-               nav_map(lnd->lnd_x, lnd->lnd_y, 1);
+               nav_map(leader->x, leader->y, 1);
            else
                skip = 0;
            sprintf(prompt, "<%.1f:%.1f: %s> ", maxmob,
-                   minmob, xyas(lnd->lnd_x, lnd->lnd_y, player->cnum));
+                   minmob, xyas(leader->x, leader->y, player->cnum));
            cp = getstring(prompt, buf);
 /* Just in case any of our lands were shelled while we were at the
  * prompt, we call lnd_mar() again.
@@ -108,11 +110,14 @@ march(void)
                pr("No lands left\n");
                return RET_OK;
            }
-           if (set_leader(&land_list, &lnd)) {
+           leader = get_leader(&land_list);
+           if (leader->uid != leader_uid) {
+               leader_uid = leader->uid;
+               pr_leader_change(leader);
                stopping = 1;
                continue;
            }
-           if (cp && !(cp = lnd_path(together, lnd, buf)))
+           if (cp && !(cp = lnd_path(together, (struct lndstr *)leader, buf)))
                cp = buf;
        }
        if (cp == NULL || *cp == '\0')
@@ -126,7 +131,7 @@ march(void)
        }
        ac = parse(cp, player->argp, NULL, scanspace, NULL);
        if (ac <= 1) {
-           sprintf(dp, "%d", lnd->lnd_uid);
+           sprintf(dp, "%d", leader->uid);
            player->argp[1] = dp;
            cp++;
        } else
@@ -139,76 +144,75 @@ march(void)
             * fall through
             */
        case 'M':
-           unit_map(EF_LAND, atoi(player->argp[1]), &ns, &origin);
-           draw_map(bmap_flag, origin, 0, &ns);
+           do_map(bmap_flag, EF_LAND, player->argp[1], player->argp[2]);
            skip = 1;
-           break;
+           continue;
        case 'f':
            if (ac <= 1)
                switch_leader(&land_list, -1);
            else
                switch_leader(&land_list, atoi(player->argp[1]));
-           set_leader(&land_list, &lnd);
-           break;
+           leader = get_leader(&land_list);
+           if (leader->uid != leader_uid) {
+               leader_uid = leader->uid;
+               pr_leader_change(leader);
+           }
+           continue;
        case 'i':
            lnd_list(&land_list);
-           break;
+           continue;
        case 'm':
            lnd_sweep(&land_list, 1, 1, player->cnum);
            stopping |= lnd_check_mines(&land_list);
-           break;
+           continue;
        case 'r':
-           player->argp[0] = "lradar";
-           rada();
+           radar(EF_LAND);
            skip = 1;
            player->btused++;
-           break;
+           continue;
        case 'l':
            llook();
            player->btused++;
-           break;
+           continue;
        case 'd':
            if (ac == 2) {
                player->argp[2] = player->argp[1];
-               sprintf(dp, "%d", lnd->lnd_uid);
+               sprintf(dp, "%d", leader->uid);
                player->argp[1] = dp;
            }
            landmine();
            skip = 1;
            player->btused++;
-           break;
-       default:
-           direrr("`%c' to stop", 0, 0);
-           pr(", `i' to list units, `f' to change leader,\n");
-           pr("`r' to radar, `l' to look, `M' to map, `B' to bmap,\n");
-           pr("`d' to drop mines, and `m' to minesweep\n");
-           stopping = 1;
+           continue;
        }
+       direrr("`%c' to stop", 0, 0);
+       pr(", `i' to list units, `f' to change leader,\n");
+       pr("`r' to radar, `l' to look, `M' to map, `B' to bmap,\n");
+       pr("`d' to drop mines, and `m' to minesweep\n");
+       stopping = 1;
     }
     return RET_OK;
 }
 
-static int
-set_leader(struct emp_qelem *list, struct lndstr **leaderp)
+void
+pr_leader_change(struct empobj *leader)
 {
-    struct llist *llp = (struct llist *)(list->q_back);
+    pr("Changing %s to %s\n",
+       leader->ef_type == EF_SHIP ? "flagship" : "leader",
+       obj_nameof(leader));
+}
 
-    if (!*leaderp)
-       pr("Leader is ");
-    else if ((*leaderp)->lnd_uid != llp->land.lnd_uid)
-       pr("Changing leader to ");
-    else
-       return 0;
-    *leaderp = &llp->land;
-    pr("%s\n", prland(&llp->land));
-    return 1;
+struct empobj *
+get_leader(struct emp_qelem *list)
+{
+    return &((struct ulist *)(list->q_back))->unit.gen;
 }
 
-static void
-switch_leader(struct emp_qelem *list, int land_uid)
+void
+switch_leader(struct emp_qelem *list, int uid)
 {
     struct emp_qelem *qp, *save;
-    struct llist *llp;
+    struct ulist *ulp;
 
     if (QEMPTY(list))
        return;
@@ -218,8 +222,8 @@ switch_leader(struct emp_qelem *list, int land_uid)
         emp_remque(qp);
         emp_insque(qp, list);
         qp = list->q_back;
-        llp = (struct llist *)qp;
-        if (llp->land.lnd_uid == land_uid || land_uid == -1)
+        ulp = (struct ulist *)qp;
+        if (ulp->unit.gen.uid == uid || uid == -1)
             break;
     } while (list->q_back != save);
 }