]> git.pond.sub.org Git - empserver/blobdiff - src/lib/commands/cede.c
Use relations_with() for getrel(NP, THEM) where NP isn't THEM
[empserver] / src / lib / commands / cede.c
index f2ec792026e02624efecfeeffa140a0811236aef..3f5ceef6929b0155142134f8a0b9bd1db7c0232b 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-2010, Dave Pare, Jeff Bailey, Thomas Ruschak,
  *                           Ken Stevens, Steve McClure
  *
  *  This program is free software; you can redistribute it and/or modify
  *
  *  ---
  *
- *  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.
  *
  *  ---
  *
  *  cede.c: Give a sector to a neighbor
- * 
+ *
  *  Known contributors to this file:
  *     Dave Pare
  *     Thomas Ruschak
 
 #include <config.h>
 
-#include "misc.h"
-#include "player.h"
-#include "xy.h"
-#include "sect.h"
-#include "nsc.h"
-#include "nat.h"
+#include "commands.h"
+#include "land.h"
+#include "lost.h"
+#include "nuke.h"
 #include "path.h"
-#include "file.h"
 #include "plane.h"
-#include "land.h"
 #include "ship.h"
-#include "nuke.h"
-#include "commands.h"
 
+static int has_units_with_mob(coord, coord, natid);
 static void cede_hdr(void);
 static int cede_sect(struct nstr_sect *, natid);
 static int cede_ship(struct nstr_item *, natid);
@@ -61,17 +56,18 @@ cede(void)
     natid to;
     int n;
     int is_sector = 0, is_ship = 0;
-    s_char *p;
+    char *p;
     struct nstr_sect ns;
     struct nstr_item ni;
     struct natstr *natp;
-    s_char buf[1024];
+    char buf[1024];
 
-    if ((p = getstarg(player->argp[1], "Cede what? ", buf)) == 0)
+    p = getstarg(player->argp[1], "Cede what? ", buf);
+    if (!p || !*p)
        return RET_SYN;
     if (snxtsct(&ns, p))
        is_sector = 1;
-    if (snxtitem(&ni, EF_SHIP, p))
+    if (snxtitem(&ni, EF_SHIP, p, NULL))
        is_ship = 1;
     if (!is_sector && !is_ship)
        return RET_SYN;
@@ -80,9 +76,9 @@ cede(void)
     if (is_sector && is_ship) {
        int type;
 
-       if ((p =
-            getstarg(player->argp[3], "Cede sectors or ships (se, sh)? ",
-                     buf)) == 0)
+       p = getstarg(player->argp[3], "Cede sectors or ships (se, sh)? ",
+                    buf);
+       if (!p)
            return RET_FAIL;
        if (strlen(p) > 4)
            p[2] = 0;
@@ -103,7 +99,7 @@ cede(void)
        pr("You can only give to normal countries...\n");
        return RET_FAIL;
     }
-    if (getrel(natp, player->cnum) < FRIENDLY) {
+    if (relations_with(n, player->cnum) < FRIENDLY) {
        pr("You can only cede to a country that is friendly towards you...\n");
        return RET_FAIL;
     }
@@ -121,17 +117,11 @@ cede_sect(struct nstr_sect *ns, natid to)
     struct sctstr sect, osect;
     int nsect;
     int n, bad;
-    s_char dirstr[20];
     int off_x, off_y;
     struct nstr_item ni;
     struct shpstr ship;
 
     prdate();
-    for (n = 1; n <= 6; n++)
-       dirstr[n] = dirch[n];
-    dirstr[0] = '.';
-    dirstr[7] = '$';
-    dirstr[8] = '\0';
     nsect = 0;
     while (nxtsct(ns, &sect)) {
        if (!player->owner)
@@ -162,7 +152,8 @@ cede_sect(struct nstr_sect *ns, natid to)
                bad = 0;
        }
        if (bad) {
-           pr("%s has no sector with mobility adjacent to or ship in %s!\n", cname(to), xyas(sect.sct_x, sect.sct_y, player->cnum));
+           pr("%s has no sector with mobility adjacent to or ship in %s!\n",
+              cname(to), xyas(sect.sct_x, sect.sct_y, player->cnum));
            continue;
        }
 
@@ -173,13 +164,30 @@ cede_sect(struct nstr_sect *ns, natid to)
        putsect(&sect);
        pr("  %s %d%% ceded\n", xyas(sect.sct_x, sect.sct_y, player->cnum),
           (int)sect.sct_effic);
-       wu(0, (natid)to, "%s ceded to you by %s\n",
+       wu(0, to, "%s ceded to you by %s\n",
           xyas(sect.sct_x, sect.sct_y, to), cname(player->cnum));
     }
     pr("%d sector%s\n", nsect, splur(nsect));
     return RET_OK;
 }
 
+static int
+has_units_with_mob(coord x, coord y, natid cn)
+{
+    struct nstr_item ni;
+    struct lndstr land;
+
+    snxtitem_xy(&ni, EF_LAND, x, y);
+    while (nxtitem(&ni, &land)) {
+       if (land.lnd_own != cn)
+           continue;
+       if (land.lnd_mobil > 0)
+           return 1;
+    }
+
+    return 0;
+}
+
 static void
 cede_hdr(void)
 {
@@ -221,10 +229,7 @@ grab_sect(struct sctstr *sp, natid to)
 
        wu(0, to, "\t%s ceded to you by %s\n",
           prplane(pp), cname(player->cnum));
-       makelost(EF_PLANE, pp->pln_own, pp->pln_uid, pp->pln_x, pp->pln_y);
        pp->pln_own = to;
-       makenotlost(EF_PLANE, pp->pln_own, pp->pln_uid, pp->pln_x,
-                   pp->pln_y);
        pp->pln_mobil = 0;
        pp->pln_mission = 0;
        putplane(pp->pln_uid, pp);
@@ -236,12 +241,9 @@ grab_sect(struct sctstr *sp, natid to)
        if (np->nuk_own == 0)
            continue;
 
-       wu(0, to, "\tnuclear stockpile #%d ceded to you by %s\n",
-          np->nuk_uid, cname(player->cnum));
-       makelost(EF_NUKE, np->nuk_own, np->nuk_uid, np->nuk_x, np->nuk_y);
+       wu(0, to, "\t%s ceded to you by %s\n",
+          prnuke(np), cname(player->cnum));
        np->nuk_own = to;
-       makenotlost(EF_NUKE, np->nuk_own, np->nuk_uid, np->nuk_x,
-                   np->nuk_y);
        putnuke(ni.cur, np);
     }
 
@@ -255,10 +257,8 @@ grab_sect(struct sctstr *sp, natid to)
        if (lp->lnd_own != player->cnum)
            continue;
 
-       wu(0, to, "\t%s ceded to you by %s\n", prland(lp),
-          cname(player->cnum));
-       makelost(EF_LAND, lp->lnd_own, lp->lnd_uid, lp->lnd_x, lp->lnd_y);
-       makenotlost(EF_LAND, to, lp->lnd_uid, lp->lnd_x, lp->lnd_y);
+       wu(0, to, "\t%s ceded to you by %s\n",
+          prland(lp), cname(player->cnum));
        lp->lnd_own = to;
        lp->lnd_mobil = 0;
        lp->lnd_mission = 0;
@@ -280,8 +280,6 @@ grab_sect(struct sctstr *sp, natid to)
 
     sp->sct_dist_x = sp->sct_x;
     sp->sct_dist_y = sp->sct_y;
-    makelost(EF_SECTOR, sp->sct_own, 0, sp->sct_x, sp->sct_y);
-    makenotlost(EF_SECTOR, to, 0, sp->sct_x, sp->sct_y);
     if (sp->sct_oldown == sp->sct_own)
        sp->sct_oldown = to;
     sp->sct_own = to;
@@ -350,10 +348,7 @@ grab_ship(struct shpstr *sp, natid to)
 
        wu(0, to, "\t%s ceded to you by %s\n",
           prplane(pp), cname(player->cnum));
-       makelost(EF_PLANE, pp->pln_own, pp->pln_uid, pp->pln_x, pp->pln_y);
        pp->pln_own = to;
-       makenotlost(EF_PLANE, pp->pln_own, pp->pln_uid, pp->pln_x,
-                   pp->pln_y);
        pp->pln_mobil = 0;
        pp->pln_mission = 0;
        putplane(pp->pln_uid, pp);
@@ -371,15 +366,11 @@ grab_ship(struct shpstr *sp, natid to)
 
        wu(0, to, "\t%s ceded to you by %s\n",
           prland(lp), cname(player->cnum));
-       makelost(EF_LAND, lp->lnd_own, lp->lnd_uid, lp->lnd_x, lp->lnd_y);
-       makenotlost(EF_LAND, to, lp->lnd_uid, lp->lnd_x, lp->lnd_y);
        lp->lnd_own = to;
        lp->lnd_mobil = 0;
        lp->lnd_mission = 0;
        putland(ni.cur, lp);
     }
 
-    makelost(EF_SHIP, sp->shp_own, sp->shp_uid, sp->shp_x, sp->shp_y);
     sp->shp_own = to;
-    makenotlost(EF_SHIP, sp->shp_own, sp->shp_uid, sp->shp_x, sp->shp_y);
 }