]> git.pond.sub.org Git - empserver/commitdiff
edit: Fix tech and range adjustment for edit p key 'T'
authorMarkus Armbruster <armbru@pond.sub.org>
Tue, 6 Jan 2015 14:22:01 +0000 (15:22 +0100)
committerMarkus Armbruster <armbru@pond.sub.org>
Mon, 2 Mar 2015 07:20:47 +0000 (08:20 +0100)
It sets the new type, then falls through to setting tech if the new
type requires more than the plane currently has.  Two problems with
that:

* If we fall through, the plane is invalid: it has less tech than
  required.  Its only use before it gets overwritten is pln_set_tech()
  calling pln_range_max() to find out whether the range is limited.
  Passes a negative number to log().  Not fatal, but pln_set_tech()'s
  range adjustment is unlikely to work.

* If we don't fall through, the range may still need adjustment,
  either up (to keep it unlimited if the new type has more range), or
  down (to keep it within the new type's shorter range).

Screwed up when the key was added in commit 6b0b6f17.  Fix by
adjusting tech first, then setting the type, then adjusting the range.
The latter relies on pln_set_tech() coping with ranges exceeding the
type's maximum, which it does.

Change the other type edits similarly for consistency.

When a type edit triggers a tech change, the tech change is now
silent.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
src/lib/commands/edit.c
tests/actofgod/final.xdump
tests/actofgod/journal.log
tests/retreat/final.xdump

index 27ca073e925d5797de8c1dba00b3e346097ba242..a51f25623240cab431cc2aa6f9c4e91645664e75 100644 (file)
@@ -31,7 +31,7 @@
  *     Chad Zabel, 1994
  *     Steve McClure, 1998-2000
  *     Ron Koenderink, 2003-2009
- *     Markus Armbruster, 2003-2014
+ *     Markus Armbruster, 2003-2015
  */
 
 #include <config.h>
@@ -905,12 +905,12 @@ edit_ship(struct shpstr *ship, char *key, char *p)
        divine_unit_change((struct empobj *)ship, "Type",
                           arg != ship->shp_type, 0,
                           "to %s", mchr[arg].m_name);
+       if (ship->shp_tech < mchr[arg].m_tech)
+           shp_set_tech(ship, mchr[arg].m_tech);
        ship->shp_type = arg;
+       shp_set_tech(ship, ship->shp_tech);
        limit_item((struct empobj *)ship, ship->shp_item, mchr[arg].m_item);
-       if (ship->shp_tech >= mchr[arg].m_tech)
-           break;
-       arg = mchr[arg].m_tech;
-       /* fall through */
+       break;
     case 'T':
        arg = LIMIT_TO(arg, mcp->m_tech, SHRT_MAX);
        divine_unit_change((struct empobj *)ship, "Tech level",
@@ -992,12 +992,12 @@ edit_land(struct lndstr *land, char *key, char *p)
        divine_unit_change((struct empobj *)land, "Type",
                           arg != land->lnd_type, 0,
                           "to %s", lchr[arg].l_name);
+       if (land->lnd_tech < lchr[arg].l_tech)
+           lnd_set_tech(land, lchr[arg].l_tech);
        land->lnd_type = arg;
+       lnd_set_tech(land, land->lnd_tech);
        limit_item((struct empobj *)land, land->lnd_item, lchr[arg].l_item);
-       if (land->lnd_tech >= lchr[arg].l_tech)
-           break;
-       arg = lchr[arg].l_tech;
-       /* fall through */
+       break;
     case 't':
        arg = LIMIT_TO(arg, lcp->l_tech, SHRT_MAX);
        divine_unit_change((struct empobj *)land, "Tech level",
@@ -1109,11 +1109,14 @@ edit_plane(struct plnstr *plane, char *key, char *p)
        divine_unit_change((struct empobj *)plane, "Type",
                           arg != plane->pln_type, 0,
                           "to %s", plchr[arg].pl_name);
+       if (plane->pln_tech < plchr[arg].pl_tech)
+           pln_set_tech(plane, plchr[arg].pl_tech);
+       if (plane->pln_range >= pln_range_max(plane))
+           /* preserve unlimited range, pln_set_tech() will adjust */
+           plane->pln_range = UCHAR_MAX;
        plane->pln_type = arg;
-       if (plane->pln_tech >= plchr[arg].pl_tech)
-           break;
-       arg = plchr[arg].pl_tech;
-       /* fall through */
+       pln_set_tech(plane, plane->pln_tech);
+       break;
     case 't':
        arg = LIMIT_TO(arg, pcp->pl_tech, SHRT_MAX);
        divine_unit_change((struct empobj *)plane, "Tech level",
@@ -1192,11 +1195,10 @@ edit_nuke(struct nukstr *nuke, char *key, char *p)
        divine_unit_change((struct empobj *)nuke, "Type",
                           arg != nuke->nuk_type, 0,
                           "to %s", nchr[arg].n_name);
+       if (nuke->nuk_tech < nchr[arg].n_tech)
+           nuke->nuk_tech = nchr[arg].n_tech;
        nuke->nuk_type = arg;
-       if (nuke->nuk_tech >= nchr[arg].n_tech)
-           break;
-       arg = nchr[arg].n_tech;
-       /* fall through */
+       break;
     case 'T':
        arg = LIMIT_TO(arg, ncp->n_tech, SHRT_MAX);
        divine_unit_change((struct empobj *)nuke, "Tech level",
index 6d7338a8952fe82729cd492e4e09f123c4122a4b..54e0c52bfacd26519426e32455009f4f315556b1 100644 (file)
@@ -187,8 +187,8 @@ uid owner xloc yloc type effic mobil off tech opx opy mission radius wing range
 4 3 3 -1 0 100 127 0 32767 0 0 none 0 "" 18 0 -1 4 () 0 0.00000
 5 3 1 -1 0 100 127 0 32767 1 -1 air\040defense 4 "" 18 0 -1 -1 () 0 0.00000
 6 1 0 0 9 10 0 0 90 0 0 none 0 "" 0 0 -1 -1 () 0 0.00000
-7 0 0 0 9 0 0 0 90 0 0 none 0 "" 4 0 -1 -1 () 0 0.00000
-8 0 0 0 0 0 0 0 90 0 0 none 0 "" 15 0 -1 -1 () 0 0.00000
+7 0 0 0 9 0 0 0 90 0 0 none 0 "" 17 0 -1 -1 () 0 0.00000
+8 0 0 0 0 0 0 0 90 0 0 none 0 "" 9 0 -1 -1 () 0 0.00000
 49 0 0 0 0 0 0 0 0 0 0 none 0 "" 0 0 -1 -1 () 0 0.00000
 /config
 config land
@@ -218,7 +218,7 @@ actor action victim times duration time
 0 44 1 32 0 0
 0 43 2 6 0 0
 0 44 3 28 0 0
-0 43 1 81 0 0
+0 43 1 77 0 0
 0 42 1 6 0 0
 1 45 0 3 0 0
 0 43 3 38 0 0
index 3acdf34cfe0238c2dc4c16f55be7fbfd956c8593..a89af165bab89112bfa0b112dc093f7743f4a5f0 100644 (file)
     Play#0 input edit s 6 t lc O 1 t lc t hc g 8 t lc
     Play#0 command edit
     Play#0 output Play#0 1 Type of fb   fishing boat (#6) changed to lc   light cruiser
-    Play#0 output Play#0 1 Tech level of lc   light cruiser (#6) changed from 0 to 45
     Play#0 output Play#0 1 Owner of lc   light cruiser (#6) changed from POGO (#0) to 1 (#1)
     Play#0 output Play#0 1 Efficiency of lc   light cruiser (#6) changed from 0 to 20
     Play#0 output Play#0 1 Type of lc   light cruiser (#6) unchanged
     Play#0 output Play#0 1 Type of lc   light cruiser (#6) changed to hc   heavy cruiser
-    Play#0 output Play#0 1 Tech level of hc   heavy cruiser (#6) changed from 45 to 50
     Play#0 output Play#0 1 guns of hc   heavy cruiser (#6) changed from 0 to 8
     Play#0 output Play#0 1 Type of hc   heavy cruiser (#6) changed to lc   light cruiser
     Play#0 output Play#0 1 guns of lc   light cruiser (#6) changed from 8 to 5
     Play#0 input edit p 6 T mb O 1 T mb T hb T mb
     Play#0 command edit
     Play#0 output Play#0 1 Type of f1   Sopwith Camel #6 changed to mb   medium bomber
-    Play#0 output Play#0 1 Tech level of mb   medium bomber #6 changed from 0 to 80
     Play#0 output Play#0 1 Owner of mb   medium bomber #6 changed from POGO (#0) to 1 (#1)
     Play#0 output Play#0 1 Efficiency of mb   medium bomber #6 changed from 0 to 10
     Play#0 output Play#0 1 Type of mb   medium bomber #6 unchanged
     Play#0 output Play#0 1 Type of mb   medium bomber #6 changed to hb   B-26B Marauder
-    Play#0 output Play#0 1 Tech level of hb   B-26B Marauder #6 changed from 80 to 90
     Play#0 output Play#0 1 Type of hb   B-26B Marauder #6 changed to mb   medium bomber
     Play#0 output Play#0 6 0 640
     Play#0 input edit p 7 r 255 T hb T mb
     Play#0 command edit
     Play#0 output Play#0 1 Range of f1   Sopwith Camel #7 changed from 0 to 4
     Play#0 output Play#0 1 Type of f1   Sopwith Camel #7 changed to hb   B-26B Marauder
-    Play#0 output Play#0 1 Tech level of hb   B-26B Marauder #7 changed from 0 to 90
     Play#0 output Play#0 1 Type of hb   B-26B Marauder #7 changed to mb   medium bomber
     Play#0 output Play#0 6 0 640
     Play#0 input edit p 8 T hb r 255 T f1
     Play#0 command edit
     Play#0 output Play#0 1 Type of f1   Sopwith Camel #8 changed to hb   B-26B Marauder
-    Play#0 output Play#0 1 Tech level of hb   B-26B Marauder #8 changed from 0 to 90
     Play#0 output Play#0 1 Range of hb   B-26B Marauder #8 changed from 0 to 15
     Play#0 output Play#0 1 Type of hb   B-26B Marauder #8 changed to f1   Sopwith Camel
     Play#0 output Play#0 6 0 640
     Play#0 input edit u 6 T art O 1 T art T hat g 12 T art
     Play#0 command edit
     Play#0 output Play#0 1 Type of cav  cavalry #6 changed to art  artillery
-    Play#0 output Play#0 1 Tech level of art  artillery #6 changed from 0 to 35
     Play#0 output Play#0 1 Owner of art  artillery #6 changed from POGO (#0) to 1 (#1)
     Play#0 output Play#0 1 Efficiency of art  artillery #6 changed from 0 to 10
     Play#0 output Play#0 1 Type of art  artillery #6 unchanged
     Play#0 output Play#0 1 Type of art  artillery #6 changed to hat  hvy artillery
-    Play#0 output Play#0 1 Tech level of hat  hvy artillery #6 changed from 35 to 100
     Play#0 output Play#0 1 guns of hat  hvy artillery #6 changed from 0 to 12
     Play#0 output Play#0 1 Type of hat  hvy artillery #6 changed to art  artillery
     Play#0 output Play#0 1 guns of art  artillery #6 changed from 12 to 10
     Play#0 input edit n 6 t 15kt O 1 t 15kt t 50kt t 15kt
     Play#0 command edit
     Play#0 output Play#0 1 Type of 10kt  fission warhead #6 changed to 15kt  fission
-    Play#0 output Play#0 1 Tech level of 15kt  fission warhead #6 changed from 0 to 290
     Play#0 output Play#0 1 Owner of 15kt  fission warhead #6 changed from POGO (#0) to 1 (#1)
     Play#0 output Play#0 1 Efficiency of 15kt  fission warhead #6 changed from 0 to 100
     Play#0 output Play#0 1 Type of 15kt  fission warhead #6 unchanged
     Play#0 output Play#0 1 Type of 15kt  fission warhead #6 changed to 50kt  fission
-    Play#0 output Play#0 1 Tech level of 50kt  fission warhead #6 changed from 290 to 300
     Play#0 output Play#0 1 Type of 50kt  fission warhead #6 changed to 15kt  fission
     Play#0 output Play#0 6 0 640
     Play#0 input edit n 2 T 280
     Play#0 output Play#0 1 POGO stole 1 civilians from 8,6
     Play#0 output Play#0 1 lc   light cruiser (#6) given to you by an act of POGO!
     Play#0 output Play#0 1 Type of lc   light cruiser (#6) changed to hc   heavy cruiser by an act of POGO
-    Play#0 output Play#0 1 Tech level of hc   heavy cruiser (#6) changed from 45 to 50 by an act of POGO
     Play#0 output Play#0 1 POGO gave you 8 guns in hc   heavy cruiser (#6)
     Play#0 output Play#0 1 Type of hc   heavy cruiser (#6) changed to lc   light cruiser by an act of POGO
     Play#0 output Play#0 1 POGO stole 3 guns from lc   light cruiser (#6)
     Play#0 output Play#0 1 mb   medium bomber #6 given to you by an act of POGO!
     Play#0 output Play#0 1 Type of mb   medium bomber #6 changed to hb   B-26B Marauder by an act of POGO
-    Play#0 output Play#0 1 Tech level of hb   B-26B Marauder #6 changed from 80 to 90 by an act of POGO
     Play#0 output Play#0 1 Type of hb   B-26B Marauder #6 changed to mb   medium bomber by an act of POGO
     Play#0 output Play#0 1 art  artillery #6 given to you by an act of POGO!
     Play#0 output Play#0 1 Type of art  artillery #6 changed to hat  hvy artillery by an act of POGO
-    Play#0 output Play#0 1 Tech level of hat  hvy artillery #6 changed from 35 to 100 by an act of POGO
     Play#0 output Play#0 1 POGO gave you 12 guns in hat  hvy artillery #6
     Play#0 output Play#0 1 Type of hat  hvy artillery #6 changed to art  artillery by an act of POGO
     Play#0 output Play#0 1 POGO stole 2 guns from art  artillery #6
     Play#0 output Play#0 1 15kt  fission warhead #6 given to you by an act of POGO!
     Play#0 output Play#0 1 Type of 15kt  fission warhead #6 changed to 50kt  fission by an act of POGO
-    Play#0 output Play#0 1 Tech level of 50kt  fission warhead #6 changed from 290 to 300 by an act of POGO
     Play#0 output Play#0 1 Type of 50kt  fission warhead #6 changed to 15kt  fission by an act of POGO
     Play#0 output Play#0 1 Money changed from 0 to -2147483648 by an act of POGO!
     Play#0 output Play#0 1 Technology changed from 0.00 to 3.14 by an act of POGO!
index 2ea0af95b8e59c4a89dcbebc94dd73813da1470b..36b0f0d8f3376ea02004122298d4afd1afa89355 100644 (file)
@@ -208,7 +208,7 @@ uid owner xloc yloc type effic mobil off tech opx opy mission radius wing range
 27 0 0 0 0 0 127 0 0 0 0 none 0 "" 0 0 -1 -1 () 0 0.00000
 28 0 0 0 0 0 127 0 0 0 0 none 0 "" 0 0 -1 -1 () 0 0.00000
 29 0 0 0 0 0 127 0 0 0 0 none 0 "" 0 0 -1 -1 () 0 0.00000
-30 1 -2 2 17 100 19 0 400 0 0 none 0 "" 7 0 -1 -1 () 0 0.00000
+30 1 -2 2 17 100 19 0 400 0 0 none 0 "" 18 0 -1 -1 () 0 0.00000
 31 0 0 0 0 0 127 0 0 0 0 none 0 "" 0 0 -1 -1 () 0 0.00000
 32 0 0 0 0 0 127 0 0 0 0 none 0 "" 0 0 -1 -1 () 0 0.00000
 33 0 0 0 0 0 127 0 0 0 0 none 0 "" 0 0 -1 -1 () 0 0.00000