]> git.pond.sub.org Git - empserver/blobdiff - src/lib/commands/edit.c
Update copyright notice.
[empserver] / src / lib / commands / edit.c
index 42b88273fe7b2ca50b332fecc98ac0b4f689f1ef..fbdd9d0db5b671e8961122ce3099452fbad72653 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-2004, Dave Pare, Jeff Bailey, Thomas Ruschak,
  *                           Ken Stevens, Steve McClure
  *
  *  This program is free software; you can redistribute it and/or modify
  *     David Muir Sharnoff
  *     Chad Zabel, 1994
  *     Steve McClure, 1998-2000
- *     Ron Koenderink, 2003
+ *     Ron Koenderink, 2003-2004
  */
 
-#include <stdio.h>
 #include <ctype.h>
-#ifdef Rel4
+#include <limits.h>
+#include <stdio.h>
 #include <string.h>
-#endif /* Rel4 */
 #include "misc.h"
 #include "player.h"
 #include "var.h"
@@ -63,7 +62,7 @@ static int docountry(s_char op, int arg, s_char *p, float farg, natid nat,
 static int doland(s_char op, int arg, s_char *p, struct sctstr *sect);
 static int doplane(s_char op, int arg, s_char *p, struct plnstr *plane);
 static int doship(s_char op, int arg, s_char *p, struct shpstr *ship);
-static int dounit(s_char op, int arg, s_char *p, struct lndstr *land);
+static int dounit(s_char op, int arg, s_char *p, float farg, struct lndstr *land);
 static int getin(s_char **, s_char **, int *, s_char *);
 static void noise(struct sctstr *sptr, int public_amt, s_char *name,
                  int old, int new);
@@ -198,7 +197,7 @@ edit(void)
            break;
        switch (ewhat) {
        case 'c':
-           farg = atof(ptr);
+           farg = (float)atof(ptr);
            if ((err = docountry(thing[0], arg, ptr, farg, nat, np))
                != RET_OK)
                return err;
@@ -212,13 +211,18 @@ edit(void)
        case 's':
            if ((err = doship(thing[0], arg, ptr, &ship)) != RET_OK)
                return err;
+           if (!ef_ensure_space(EF_SHIP, ship.shp_uid, 50))
+               return RET_FAIL;
            if (!putship(ship.shp_uid, &ship))
                return RET_FAIL;
            break;
        case 'u':
-           if ((err = dounit(thing[0], arg, ptr, &land))
+           farg = (float)atof(ptr);
+           if ((err = dounit(thing[0], arg, ptr, farg, &land))
                != RET_OK)
                return err;
+           if (!ef_ensure_space(EF_LAND, land.lnd_uid, 50))
+               return RET_FAIL;
            if (!putland(land.lnd_uid, &land))
                return RET_FAIL;
            break;
@@ -226,6 +230,8 @@ edit(void)
            if ((err = doplane(thing[0], arg, ptr, &plane))
                != RET_OK)
                return err;
+           if (!ef_ensure_space(EF_PLANE, plane.pln_uid, 50))
+               return RET_FAIL;
            if (!putplane(plane.pln_uid, &plane))
                return RET_FAIL;
            break;
@@ -280,18 +286,17 @@ prsect(struct sctstr *sect)
        xyas(sect->sct_dist_x, sect->sct_dist_y, player->cnum));
     pr("Designation <s>: %c\t New designation <S>: %c\n",
        dchr[sect->sct_type].d_mnem, dchr[sect->sct_newtype].d_mnem);
-    pr("own  oo eff mob min gld frt oil urn wrk lty  che plg ptime fall avail\n");
-    pr("  o   O   e   m   i   g   f   c   u   w   l    x   p     t    F     a\n");
-    pr("%3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %4d %3d %5d %4d %5d\n",
+    pr("own  oo eff mob min gld frt oil urn wrk lty che ctg plg ptime fall avail\n");
+    pr("  o   O   e   m   i   g   f   c   u   w   l   x   X   p     t    F     a\n");
+    pr("%3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %3d %5d %4d %5d\n",
        sect->sct_own, sect->sct_oldown, sect->sct_effic, sect->sct_mobil,
        sect->sct_min, sect->sct_gmin, sect->sct_fertil, sect->sct_oil,
        sect->sct_uran, sect->sct_work, sect->sct_loyal,
-       getvar(V_CHE, (s_char *)sect, EF_SECTOR),
-       getvar(V_PSTAGE, (s_char *)sect, EF_SECTOR),
-       getvar(V_PTIME, (s_char *)sect, EF_SECTOR),
-       getvar(V_FALLOUT, (s_char *)sect, EF_SECTOR), sect->sct_avail);
+       sect->sct_che, sect->sct_che_target,
+       sect->sct_pstage, sect->sct_ptime,
+       sect->sct_fallout, sect->sct_avail);
 
-    pr("Mines <M>: %d\t", getvar(V_MINE, (s_char *)sect, EF_SECTOR));
+    pr("Mines <M>: %d\t", sect->sct_mines);
     pr("Coastal <C>: %d\n", sect->sct_coastal);
     pr("Road %% <R>: %d\t", sect->sct_road);
     pr("Rail %% <r>: %d\t", sect->sct_rail);
@@ -312,7 +317,7 @@ prnat(natid n)
     pr("Connected: %d\n", np->nat_connected);
     pr("Representative <r>: %-20s\n", np->nat_pnam);
     pr("BTUs <b>: %3d\t\t\t", np->nat_btu);
-    pr("Reserves <m>: %5d\n", np->nat_reserve);
+    pr("Reserves <m>: %5ld\n", np->nat_reserve);
     pr("Capital <c>: %s\t\t",
        xyas(np->nat_xcap, np->nat_ycap, player->cnum));
     pr("Origin <o>: %3s\n",
@@ -323,7 +328,7 @@ prnat(natid n)
     pr("Research <R>: %.2f\n", np->nat_level[NAT_RLEV]);
     pr("Education <E>: %.2f\t\t", np->nat_level[NAT_ELEV]);
     pr("Happiness <H>: %.2f\n", np->nat_level[NAT_HLEV]);
-    pr("Money <M>: $%6d\n", np->nat_money);
+    pr("Money <M>: $%6ld\n", np->nat_money);
     pr("Telegrams <t>: %6d\n", np->nat_tgms);
     if (opt_DEMANDUPDATE)
        pr("Updates missed <U>: %d\n", np->nat_missed);
@@ -360,10 +365,6 @@ pr_plane(struct plnstr *plane)
 static void
 pr_land(struct lndstr *land)
 {
-    int vec[I_MAX + 1];
-    struct lchrstr *lcp;
-
-    lcp = &lchr[(int)land->lnd_type];
     pr("UID <U>: %d\n", (int)land->lnd_uid);
     pr("Owner <O>: %d\n", (int)land->lnd_own);
     pr("Location <L>: %s\n", xyas(land->lnd_x, land->lnd_y, player->cnum));
@@ -371,8 +372,6 @@ pr_land(struct lndstr *land)
     pr("Mobility <M>: %d\n", (int)land->lnd_mobil);
     pr("Tech <t>: %d\t\t", land->lnd_tech);
     pr("Army <a>: %c\n", land->lnd_army);
-    pr("Attack: %f\t", lcp->l_att);
-    pr("Defense: %f\n", lcp->l_def);
     pr("Fortification <F>: %d\t", land->lnd_harden);
     pr("Fuel <B>: %d\n", land->lnd_fuel);
     count_land_planes(land);
@@ -383,29 +382,27 @@ pr_land(struct lndstr *land)
     pr("Retreat percentage <Z>: %d\n", (int)land->lnd_retreat);
     pr("Retreat path <R>: '%s'\t\tRetreat Flags <W>: %d\n",
        land->lnd_rpath, (int)land->lnd_rflags);
-    getvec(VT_ITEM, vec, (s_char *)land, EF_LAND);
     pr("civ mil  uw food shl gun  pet  irn  dst  oil  lcm  hcm rad\n");
     pr("  c   m   u    f   s   g    p    i    d    o    l    h   r\n");
-    pr("%3d", vec[I_CIVIL]);
-    pr("%4d", vec[I_MILIT]);
-    pr("%4d", vec[I_UW]);
-    pr("%5d", vec[I_FOOD]);
-    pr("%4d", vec[I_SHELL]);
-    pr("%4d", vec[I_GUN]);
-    pr("%5d", vec[I_PETROL]);
-    pr("%5d", vec[I_IRON]);
-    pr("%5d", vec[I_DUST]);
-    pr("%5d", vec[I_OIL]);
-    pr("%5d", vec[I_LCM]);
-    pr("%5d", vec[I_HCM]);
-    pr("%4d", vec[I_RAD]);
+    pr("%3d", land->lnd_item[I_CIVIL]);
+    pr("%4d", land->lnd_item[I_MILIT]);
+    pr("%4d", land->lnd_item[I_UW]);
+    pr("%5d", land->lnd_item[I_FOOD]);
+    pr("%4d", land->lnd_item[I_SHELL]);
+    pr("%4d", land->lnd_item[I_GUN]);
+    pr("%5d", land->lnd_item[I_PETROL]);
+    pr("%5d", land->lnd_item[I_IRON]);
+    pr("%5d", land->lnd_item[I_DUST]);
+    pr("%5d", land->lnd_item[I_OIL]);
+    pr("%5d", land->lnd_item[I_LCM]);
+    pr("%5d", land->lnd_item[I_HCM]);
+    pr("%4d", land->lnd_item[I_RAD]);
     pr("\n");
 }
 
 static void
 pr_ship(struct shpstr *ship)
 {
-    int vec[I_MAX + 1];
     struct natstr *natp;
 
     if ((natp = getnatp(ship->shp_own)) == 0)
@@ -416,38 +413,36 @@ pr_ship(struct shpstr *ship)
     pr("Location <L>: %s\n", xyas(ship->shp_x, ship->shp_y, player->cnum));
     pr("Tech <T>: %d\t\t\t", ship->shp_tech);
     pr("Efficiency <E>: %d\n", (int)ship->shp_effic);
-    pr("Mobility <M>: %d\t\t\t", (int)ship->shp_mobil);
+    pr("Mobility <M>: %d\t\t", (int)ship->shp_mobil);
     pr("Fleet <F>: %c\n", ship->shp_fleet);
     count_planes(ship);
-    pr("Helos <H>: %d\n", (int)ship->shp_nchoppers);
-    pr("Xlight planes <X>: %d\n", (int)ship->shp_nxlight);
+    pr("Xlight planes <X>: %d\t\t", (int)ship->shp_nxlight);
     pr("Planes <P>: %d\n", (int)ship->shp_nplane);
+    pr("Helos <H>: %d\t\t\t", (int)ship->shp_nchoppers);
     count_units(ship);
     pr("Units <Y>: %d\n", (int)ship->shp_nland);
     /* could depend on opt_FUEL - but a deity might want to set this
        up before enabling the option */
-    pr("Fuel <B>: %d\n", (int)ship->shp_fuel);
+    pr("Fuel <B>: %d\t\t\t", (int)ship->shp_fuel);
     pr("Retreat path <R>: '%s'\t\tRetreat Flags <W>: %d\n",
        ship->shp_rpath, (int)ship->shp_rflags);
-    getvec(VT_ITEM, vec, (s_char *)ship, EF_SHIP);
-    pr("Plague Stage <a>: %d\n",
-       getvar(V_PSTAGE, (s_char *)ship, EF_SHIP));
-    pr("Plague Time <b>: %d\n", getvar(V_PTIME, (s_char *)ship, EF_SHIP));
+    pr("Plague Stage <a>: %d\t\t",ship->shp_pstage);
+    pr("Plague Time <b>: %d\n", ship->shp_ptime);
     pr("civ mil  uw food shl gun  pet  irn  dst  oil  lcm  hcm rad\n");
     pr("  c   m   u    f   s   g    p    i    d    o    l    h   r\n");
-    pr("%3d", vec[I_CIVIL]);
-    pr("%4d", vec[I_MILIT]);
-    pr("%4d", vec[I_UW]);
-    pr("%5d", vec[I_FOOD]);
-    pr("%4d", vec[I_SHELL]);
-    pr("%4d", vec[I_GUN]);
-    pr("%5d", vec[I_PETROL]);
-    pr("%5d", vec[I_IRON]);
-    pr("%5d", vec[I_DUST]);
-    pr("%5d", vec[I_OIL]);
-    pr("%5d", vec[I_LCM]);
-    pr("%5d", vec[I_HCM]);
-    pr("%4d", vec[I_RAD]);
+    pr("%3d", ship->shp_item[I_CIVIL]);
+    pr("%4d", ship->shp_item[I_MILIT]);
+    pr("%4d", ship->shp_item[I_UW]);
+    pr("%5d", ship->shp_item[I_FOOD]);
+    pr("%4d", ship->shp_item[I_SHELL]);
+    pr("%4d", ship->shp_item[I_GUN]);
+    pr("%5d", ship->shp_item[I_PETROL]);
+    pr("%5d", ship->shp_item[I_IRON]);
+    pr("%5d", ship->shp_item[I_DUST]);
+    pr("%5d", ship->shp_item[I_OIL]);
+    pr("%5d", ship->shp_item[I_LCM]);
+    pr("%5d", ship->shp_item[I_HCM]);
+    pr("%4d", ship->shp_item[I_RAD]);
     pr("\n");
 }
 
@@ -483,6 +478,11 @@ getin(s_char **what, s_char **p, int *arg, s_char *buf)
     return RET_OK;
 }
 
+static void
+warn_deprecated(char key)
+{
+    pr("Key <%c> is deprecated and will go away in a future release\n", key);
+}
 
 static int
 doland(s_char op, int arg, s_char *p, struct sctstr *sect)
@@ -530,7 +530,7 @@ doland(s_char op, int arg, s_char *p, struct sctstr *sect)
        if (arg < 0)
            return RET_SYN;
        oldown = (natid)errcheck(arg, 0, MAXNOC - 1);
-       pr("Old player->owner of %s changed from %s (#%d) to %s (#%d).\n",
+       pr("Old owner of %s changed from %s (#%d) to %s (#%d).\n",
           xyas(sect->sct_x, sect->sct_y, player->cnum),
           cname(sect->sct_oldown),
           sect->sct_oldown, cname(oldown), oldown);
@@ -584,32 +584,40 @@ doland(s_char op, int arg, s_char *p, struct sctstr *sect)
        sect->sct_loyal = (u_char)new;
        break;
     case 'x':
-       old = getvar(V_CHE, (s_char *)sect, EF_SECTOR);
-       new = errcheck(arg, 0, 65536);
-       pr("Guerillas in %s changed from %d to %d%\n",
+       old = sect->sct_che;
+       new = errcheck(arg, 0, CHE_MAX);
+       pr("Guerillas in %s changed from %d to %d\n",
           xyas(sect->sct_x, sect->sct_y, player->cnum), old, new);
-       putvar(V_CHE, new, (s_char *)sect, EF_SECTOR);
+       sect->sct_che = new;
+       break;
+    case 'X':
+       old = sect->sct_che_target;
+       new = errcheck(arg, 0, MAXNOC - 1);
+       pr("Old owner of %s changed from %s (#%d) to %s (#%d).\n",
+          xyas(sect->sct_x, sect->sct_y, player->cnum),
+          cname(old), old, cname(new), new);
+       sect->sct_che_target = new;
        break;
     case 'p':
-       old = getvar(V_PSTAGE, (s_char *)sect, EF_SECTOR);
+       old = sect->sct_pstage;
        new = errcheck(arg, 0, PLG_EXPOSED);
-       pr("Plague stage of %s changed from %d to %d%\n",
+       pr("Plague stage of %s changed from %d to %d%%\n",
           xyas(sect->sct_x, sect->sct_y, player->cnum), old, new);
-       putvar(V_PSTAGE, new, (s_char *)sect, EF_SECTOR);
+       sect->sct_pstage = new;
        break;
     case 't':
-       old = getvar(V_PTIME, (s_char *)sect, EF_SECTOR);
+       old = sect->sct_ptime;
        new = errcheck(arg, 0, 255);
-       pr("Plague time of %s changed from %d to %d%\n",
+       pr("Plague time of %s changed from %d to %d%%\n",
           xyas(sect->sct_x, sect->sct_y, player->cnum), old, new);
-       putvar(V_PTIME, new, (s_char *)sect, EF_SECTOR);
+       sect->sct_ptime = new;
        break;
     case 'F':
-       old = getvar(V_FALLOUT, (s_char *)sect, EF_SECTOR);
-       new = errcheck(arg, 0, 9999);
+       old = sect->sct_fallout;
+       new = errcheck(arg, 0, FALLOUT_MAX);
        pr("Fallout for sector %s changed from %d to %d\n",
           xyas(sect->sct_x, sect->sct_y, player->cnum), old, new);
-       putvar(V_FALLOUT, new, (s_char *)sect, EF_SECTOR);
+       sect->sct_fallout = new;
        break;
     case 'a':
        new = errcheck(arg, 0, 9999);
@@ -617,8 +625,9 @@ doland(s_char op, int arg, s_char *p, struct sctstr *sect)
        sect->sct_avail = new;
        break;
     case 'M':
-       putvar(V_MINE, arg, (s_char *)sect, EF_SECTOR);
-       pr("Mines changed to %d\n", arg);
+       new = errcheck(arg, 0, MINES_MAX);
+       sect->sct_mines = new;
+       pr("Mines changed to %d\n", new);
        break;
     case 'L':
        if (!sarg_xy(p, &newx, &newy))
@@ -637,7 +646,7 @@ doland(s_char op, int arg, s_char *p, struct sctstr *sect)
        sect->sct_dist_y = newy;
        break;
     case 's':
-       des = typematch(p, EF_SECTOR);
+       des = sct_typematch(p);
        if (des < 0)
            return RET_SYN;
        pr("Designation for sector %s changed from %c to %c\n",
@@ -646,7 +655,7 @@ doland(s_char op, int arg, s_char *p, struct sctstr *sect)
        sect->sct_type = des;
        break;
     case 'S':
-       des = typematch(p, EF_SECTOR);
+       des = sct_typematch(p);
        if (des < 0)
            return RET_SYN;
        pr("New Designation for sector %s changed from %c to %c\n",
@@ -690,7 +699,6 @@ static int
 docountry(s_char op, int arg, s_char *p, float farg, natid nat,
          struct natstr *np)
 {
-    extern int m_m_p_d;
     coord newx, newy;
     switch (op) {
     case 'n':
@@ -712,11 +720,11 @@ docountry(s_char op, int arg, s_char *p, float farg, natid nat,
        break;
     case 'm':
        benefit(nat, np->nat_reserve < arg);
-       pr("Military Reserves changed from %d to %d\n",
+       pr("Military Reserves changed from %ld to %d\n",
           np->nat_reserve, arg);
        if (np->nat_stat == STAT_NORM)
            wu(player->cnum, nat,
-              "Military Reserves changed from %d to %d by divine intervention.\n",
+              "Military Reserves changed from %ld to %d by divine intervention.\n",
               np->nat_reserve, arg);
        np->nat_reserve = arg;
        break;
@@ -748,9 +756,9 @@ docountry(s_char op, int arg, s_char *p, float farg, natid nat,
        np->nat_minused = arg;
        break;
     case 'M':
-       pr("Money changed from %d to %d\n", np->nat_money, arg);
+       pr("Money changed from %ld to %d\n", np->nat_money, arg);
        wu(player->cnum, nat,
-          "Money changed from %d to %d by divine intervention.\n",
+          "Money changed from %ld to %d by divine intervention.\n",
           np->nat_money, arg);
        np->nat_money = arg;
        break;
@@ -794,13 +802,13 @@ doship(s_char op, int arg, s_char *p, struct shpstr *ship)
     newx = newy = 0;
     switch (op) {
     case 'a':
-       putvar(V_PSTAGE, arg, (s_char *)ship, EF_SHIP);
+       ship->shp_pstage = arg;
        break;
     case 'b':
-       putvar(V_PTIME, arg, (s_char *)ship, EF_SHIP);
+       ship->shp_ptime = arg;
        break;
     case 'R':
-       bcopy(p, ship->shp_rpath, 10);
+       memcpy(ship->shp_rpath, p, sizeof(ship->shp_rpath));
        break;
     case 'W':
        ship->shp_rflags = arg;
@@ -840,16 +848,12 @@ doship(s_char op, int arg, s_char *p, struct shpstr *ship)
        ship->shp_y = newy;
        break;
     case 'T':
-       ship->shp_tech = arg;
+       shp_set_tech(ship,
+                    errcheck(arg,
+                             mchr[(int)ship->shp_type].m_tech, SHRT_MAX));
        break;
     case 'E':
-       ship->shp_effic = errcheck(arg, 0, 100);
-       if (arg < 10) {
-           ship->shp_effic = 0;
-           makelost(EF_SHIP, ship->shp_own, ship->shp_uid, ship->shp_x,
-                    ship->shp_y);
-           ship->shp_own = (natid)0;
-       }
+       ship->shp_effic = errcheck(arg, SHIP_MINEFF, 100);
        break;
     case 'M':
        ship->shp_mobil = arg;
@@ -874,82 +878,47 @@ doship(s_char op, int arg, s_char *p, struct shpstr *ship)
        ship->shp_nplane = errcheck(arg, 0, 100);
        break;
     case 'c':
-       if (!putvar(V_CIVIL, arg, (s_char *)ship, EF_SHIP)) {
-           pr("No room on ship!\n");
-           return RET_FAIL;
-       }
+       ship->shp_item[I_CIVIL] = arg;
        break;
     case 'm':
-       if (!putvar(V_MILIT, arg, (s_char *)ship, EF_SHIP)) {
-           pr("No room on ship!\n");
-           return RET_FAIL;
-       }
+       ship->shp_item[I_MILIT] = arg;
        break;
     case 'u':
-       if (!putvar(V_UW, arg, (s_char *)ship, EF_SHIP)) {
-           pr("No room on ship!\n");
-           return RET_FAIL;
-       }
+       ship->shp_item[I_UW] = arg;
        break;
     case 'f':
-       if (!putvar(V_FOOD, arg, (s_char *)ship, EF_SHIP)) {
-           pr("No room on ship!\n");
-           return RET_FAIL;
-       }
+       ship->shp_item[I_FOOD] = arg;
        break;
     case 's':
-       if (!putvar(V_SHELL, arg, (s_char *)ship, EF_SHIP)) {
-           pr("No room on ship!\n");
-           return RET_FAIL;
-       }
+       ship->shp_item[I_SHELL] = arg;
        break;
     case 'g':
-       if (!putvar(V_GUN, arg, (s_char *)ship, EF_SHIP)) {
-           pr("No room on ship!\n");
-           return RET_FAIL;
-       }
+       ship->shp_item[I_GUN] = arg;
        break;
     case 'p':
-       if (!putvar(V_PETROL, arg, (s_char *)ship, EF_SHIP)) {
-           pr("No room on ship!\n");
-           return RET_FAIL;
-       }
+       ship->shp_item[I_PETROL] = arg;
        break;
     case 'i':
-       if (!putvar(V_IRON, arg, (s_char *)ship, EF_SHIP)) {
-           pr("No room on ship!\n");
-           return RET_FAIL;
-       }
+       ship->shp_item[I_IRON] = arg;
        break;
     case 'd':
-       if (!putvar(V_DUST, arg, (s_char *)ship, EF_SHIP)) {
-           pr("No room on ship!\n");
-           return RET_FAIL;
-       }
+       ship->shp_item[I_DUST] = arg;
        break;
     case 'o':
-       if (!putvar(V_OIL, arg, (s_char *)ship, EF_SHIP)) {
-           pr("No room on ship!\n");
-           return RET_FAIL;
-       }
+       ship->shp_item[I_OIL] = arg;
        break;
     case 'l':
-       if (!putvar(V_LCM, arg, (s_char *)ship, EF_SHIP)) {
-           pr("No room on ship!\n");
-           return RET_FAIL;
-       }
+       ship->shp_item[I_LCM] = arg;
        break;
     case 'h':
-       if (!putvar(V_HCM, arg, (s_char *)ship, EF_SHIP)) {
-           pr("No room on ship!\n");
-           return RET_FAIL;
-       }
+       ship->shp_item[I_HCM] = arg;
        break;
     case 'r':
-       if (!putvar(V_RAD, arg, (s_char *)ship, EF_SHIP)) {
-           pr("No room on ship!\n");
-           return RET_FAIL;
-       }
+       ship->shp_item[I_RAD] = arg;
+       break;
+    case 'D':
+       warn_deprecated(op);
+       ship->shp_armor = errcheck(arg, 0, SHRT_MAX);
        break;
     default:
        pr("huh? (%c)\n", op);
@@ -959,7 +928,7 @@ doship(s_char op, int arg, s_char *p, struct shpstr *ship)
 }
 
 static int
-dounit(s_char op, int arg, s_char *p, struct lndstr *land)
+dounit(s_char op, int arg, s_char *p, float farg, struct lndstr *land)
 {
     coord newx, newy;
 
@@ -998,19 +967,15 @@ dounit(s_char op, int arg, s_char *p, struct lndstr *land)
        land->lnd_y = newy;
        break;
     case 'e':
-       land->lnd_effic = errcheck(arg, 0, 100);
-       if (arg < 10) {
-           makelost(EF_LAND, land->lnd_own, land->lnd_uid, land->lnd_x,
-                    land->lnd_y);
-           land->lnd_effic = 0;
-           land->lnd_own = (natid)0;
-       }
+       land->lnd_effic = errcheck(arg, LAND_MINEFF, 100);
        break;
     case 'M':
        land->lnd_mobil = arg;
        break;
     case 't':
-       land->lnd_tech = arg;
+       lnd_set_tech(land,
+                    errcheck(arg,
+                             lchr[(int)land->lnd_type].l_tech, SHRT_MAX));
        break;
     case 'a':
        if (p[0] == '~')
@@ -1041,88 +1006,61 @@ dounit(s_char op, int arg, s_char *p, struct lndstr *land)
        land->lnd_retreat = arg;
        break;
     case 'R':
-       bcopy(p, land->lnd_rpath, 10);
+       memcpy(land->lnd_rpath, p, sizeof(land->lnd_rpath));
        break;
     case 'W':
        land->lnd_rflags = arg;
        break;
     case 'c':
-       if (!putvar(V_CIVIL, arg, (s_char *)land, EF_LAND)) {
-           pr("No room on land unit!\n");
-           return RET_FAIL;
-       }
+       land->lnd_item[I_CIVIL] = arg;
        break;
     case 'm':
-       if (!putvar(V_MILIT, arg, (s_char *)land, EF_LAND)) {
-           pr("No room on land!\n");
-           return RET_FAIL;
-       }
+       land->lnd_item[I_MILIT] = arg;
        break;
     case 'u':
-       if (!putvar(V_UW, arg, (s_char *)land, EF_LAND)) {
-           pr("No room on land!\n");
-           return RET_FAIL;
-       }
+       land->lnd_item[I_UW] = arg;
        break;
     case 'f':
-       if (!putvar(V_FOOD, arg, (s_char *)land, EF_LAND)) {
-           pr("No room on land!\n");
-           return RET_FAIL;
-       }
+       land->lnd_item[I_FOOD] = arg;
        break;
     case 's':
-       if (!putvar(V_SHELL, arg, (s_char *)land, EF_LAND)) {
-           pr("No room on land!\n");
-           return RET_FAIL;
-       }
+       land->lnd_item[I_SHELL] = arg;
        break;
     case 'g':
-       if (!putvar(V_GUN, arg, (s_char *)land, EF_LAND)) {
-           pr("No room on land!\n");
-           return RET_FAIL;
-       }
+       land->lnd_item[I_GUN] = arg;
        break;
     case 'p':
-       if (!putvar(V_PETROL, arg, (s_char *)land, EF_LAND)) {
-           pr("No room on land!\n");
-           return RET_FAIL;
-       }
+       land->lnd_item[I_PETROL] = arg;
        break;
     case 'i':
-       if (!putvar(V_IRON, arg, (s_char *)land, EF_LAND)) {
-           pr("No room on land!\n");
-           return RET_FAIL;
-       }
+       land->lnd_item[I_IRON] = arg;
        break;
     case 'd':
-       if (!putvar(V_DUST, arg, (s_char *)land, EF_LAND)) {
-           pr("No room on land!\n");
-           return RET_FAIL;
-       }
+       land->lnd_item[I_DUST] = arg;
        break;
     case 'o':
-       if (!putvar(V_OIL, arg, (s_char *)land, EF_LAND)) {
-           pr("No room on land!\n");
-           return RET_FAIL;
-       }
+       land->lnd_item[I_OIL] = arg;
        break;
     case 'l':
-       if (!putvar(V_LCM, arg, (s_char *)land, EF_LAND)) {
-           pr("No room on land!\n");
-           return RET_FAIL;
-       }
+       land->lnd_item[I_LCM] = arg;
        break;
     case 'h':
-       if (!putvar(V_HCM, arg, (s_char *)land, EF_LAND)) {
-           pr("No room on land!\n");
-           return RET_FAIL;
-       }
+       land->lnd_item[I_HCM] = arg;
        break;
     case 'r':
-       if (!putvar(V_RAD, arg, (s_char *)land, EF_LAND)) {
-           pr("No room on land!\n");
-           return RET_FAIL;
-       }
+       land->lnd_item[I_RAD] = arg;
+       break;
+    case 'A':
+       warn_deprecated(op);
+       pr("Attack changed from %1.2f to %1.2f.\n",
+          land->lnd_att, farg);
+       land->lnd_att = farg;
+       break;
+    case 'D':
+       warn_deprecated(op);
+       pr("Defense changed from %1.2f to %1.2f.\n",
+          land->lnd_def, farg);
+       land->lnd_def = farg;
        break;
     default:
        pr("huh? (%c)\n", op);
@@ -1171,19 +1109,15 @@ doplane(s_char op, int arg, s_char *p, struct plnstr *plane)
        }
        break;
     case 'e':
-       plane->pln_effic = errcheck(arg, 0, 100);
-       if (arg < 10) {
-           plane->pln_effic = 0;
-           makelost(EF_PLANE, plane->pln_own, plane->pln_uid,
-                    plane->pln_x, plane->pln_y);
-           plane->pln_own = (natid)0;
-       }
+       plane->pln_effic = errcheck(arg, PLANE_MINEFF, 100);
        break;
     case 'm':
        plane->pln_mobil = errcheck(arg, -127, 255);
        break;
     case 't':
-       plane->pln_tech = arg;
+       pln_set_tech(plane,
+                    errcheck(arg,
+                             plchr[(int)plane->pln_type].pl_tech, SHRT_MAX));
        break;
     case 'w':
        if (p[0] == '~')