]> granicus.if.org Git - nethack/commitdiff
some updates
authornhmall <mjnh@persona.ca>
Sun, 31 May 2015 02:22:39 +0000 (22:22 -0400)
committernhmall <mjnh@persona.ca>
Sun, 31 May 2015 02:22:39 +0000 (22:22 -0400)
 Changes to be committed:
modified:   include/botl.h
modified:   src/botl.c

include/botl.h
src/botl.c

index 284338261cf0814696b6bbbbba3c5f06394c0a3b..6ffb75fb28434265f6a35b11a1e6ecf17268c0bb 100644 (file)
@@ -6,9 +6,9 @@
 #define BOTL_H
 
 #ifdef STATUS_VIA_WINDOWPORT
-
+#if 0
 /* clang-format off */
-#define BL_FLUSH        -1
+#define BL_BOGUS        -1
 #define BL_TITLE        0
 #define BL_STR          1
 #define BL_DX           2
 #define BL_LEVELDESC    20
 #define BL_EXP          21
 #define BL_CONDITION    22
-#define MAXBLSTATS      23
 /* clang-format on */
+#else
+enum statusfields { BL_BOGUS = -1, BL_TITLE = 0, BL_STR, BL_DX, BL_CO, BL_IN,
+BL_WI, BL_CH, BL_ALIGN, BL_SCORE, BL_CAP, BL_GOLD, BL_ENE, BL_ENEMAX,
+BL_XP, BL_AC, BL_HD, BL_TIME, BL_HUNGER, BL_HP, BL_HPMAX, BL_LEVELDESC,
+BL_EXP, BL_CONDITION };
+#define BL_FLUSH BL_BOGUS
+#define MAXBLSTATS      BL_CONDITION+1
+
+#define BEFORE  0
+#define NOW     1
+#endif
 
 /* Boolean condition bits for the condition mask */
 
index a2d8f3ba6bdae9e5ec4dd03db1bf39752b174d27..9ad736af37f6325933e5df9fd4a9a3841fa25561 100644 (file)
@@ -18,8 +18,70 @@ struct istat_s {
     char *val;
     int valwidth;
     int idxmax;
+    enum statusfields fld;
 };
 
+/* If entries are added to this, botl.h will require updating too */
+struct istat_s initblstats[MAXBLSTATS] = {
+        { 0L, ANY_STR,  {(genericptr_t)0L}, (char *)0, 80,  0, BL_TITLE},
+        { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0, BL_STR},
+        { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0, BL_DX},
+        { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0, BL_CO},
+        { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0, BL_IN},
+        { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0, BL_WI},
+        { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0, BL_CH},
+        { 0L, ANY_STR,  {(genericptr_t)0L}, (char *)0, 40,  0, BL_ALIGN},
+        { 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 20,  0, BL_SCORE},
+        { 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 20,  0, BL_CAP},
+        { 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 30,  0, BL_GOLD},
+        { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0, BL_ENE},
+        { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0, BL_ENEMAX},
+        { 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 10,  0, BL_XP},
+        { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0, BL_AC},
+        { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0, BL_HD},
+        { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 20,  0, BL_TIME},
+        { 0L, ANY_UINT, {(genericptr_t)0L}, (char *)0, 40,  0, BL_HUNGER},
+        { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0, BL_HP},
+        { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0, BL_HPMAX},
+        { 0L, ANY_STR,  {(genericptr_t)0L}, (char *)0, 80,  0, BL_LEVELDESC},
+        { 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 20,  0, BL_EXP},
+        { 0L, ANY_MASK32,{(genericptr_t)0L},(char *)0,  0,  0, BL_CONDITION}
+};
+
+static struct fieldid_t {
+        const char *fieldname;
+        enum statusfields fldid;
+} fieldids[] = {
+        {"title",               BL_TITLE},
+        {"strength",            BL_STR},
+        {"dexterity",           BL_DX},
+        {"constitution",        BL_CO},
+        {"intelligence",        BL_IN},
+        {"wisdom",              BL_WI},
+        {"charisma",            BL_CH},
+        {"alignment",           BL_ALIGN},
+        {"score",               BL_SCORE},
+        {"carrying-capacity",   BL_CAP},
+        {"gold",                BL_GOLD},
+        {"power",               BL_ENE},
+        {"power-max",           BL_ENEMAX},
+        {"experience-level",    BL_XP},
+        {"armor-class",         BL_AC},
+        {"HD",                  BL_HD},
+        {"time",                BL_TIME},
+        {"hunger",              BL_HUNGER},
+        {"hitpoints",           BL_HP},
+        {"hitpoints-max",       BL_HPMAX},
+        {"dungeon-level",       BL_LEVELDESC},
+        {"experience",          BL_EXP},
+        {"condition",           BL_CONDITION},
+};
+
+
+struct istat_s blstats[2][MAXBLSTATS];
+
+static boolean blinit = FALSE, update_all = FALSE;
+
 STATIC_DCL void NDECL(init_blstats);
 STATIC_DCL char *FDECL(anything_to_s, (char *, anything *, int));
 STATIC_DCL void FDECL(s_to_anything, (anything *, char *, int));
@@ -320,69 +382,148 @@ bot()
 
 #else /* STATUS_VIA_WINDOWPORT */
 
-/* If entries are added to this, botl.h will require updating too */
-struct istat_s blstats[2][MAXBLSTATS] = {
-    {
-    { 0L, ANY_STR,  {(genericptr_t)0L}, (char *)0, 80, 0 },    /*  0 BL_TITLE */
-    { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0},    /*  1 BL_STR */
-    { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0},    /*  2 BL_DX */
-    { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0},    /*  3 BL_CO */
-    { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0},    /*  4 BL_IN */
-    { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0},    /*  5 BL_WI */
-    { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0},    /*  6 BL_CH */
-    { 0L, ANY_STR,  {(genericptr_t)0L}, (char *)0, 40,  0},    /*  7 BL_ALIGN */
-    { 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 20,  0},    /*  8 BL_SCORE */
-    { 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 20,  0},    /*  9 BL_CAP */
-    { 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 30,  0},    /* 10 BL_GOLD */
-    { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10, BL_ENEMAX}, /* 11 BL_ENE */
-    { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0},    /* 12 BL_ENEMAX */
-    { 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 10,  0},    /* 13 BL_XP */
-    { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0},    /* 14 BL_AC */
-    { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0},    /* 15 BL_HD */
-    { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 20,  0},    /* 16 BL_TIME */
-    { 0L, ANY_UINT, {(genericptr_t)0L}, (char *)0, 40,  0},    /* 17 BL_HUNGER */
-    { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10, BL_HPMAX},  /* 18 BL_HP */
-    { 0L, ANY_INT,  {(genericptr_t)0L}, (char *)0, 10,  0},    /* 19 BL_HPMAX */
-    { 0L, ANY_STR,  {(genericptr_t)0L}, (char *)0, 80,  0},    /* 20 BL_LEVELDESC */
-    { 0L, ANY_LONG, {(genericptr_t)0L}, (char *)0, 20,  0},    /* 21 BL_EXP */
-    { 0L, ANY_MASK32,{(genericptr_t)0L},(char *)0,  0,  0}     /* 22 BL_CONDITION */
-    }
-};
-
-static boolean blinit = FALSE, update_all = FALSE;
-const char *status_fieldnames[] = {
-    "title", "strength", "dexterity", "constitution", "intelligence",
-    "wisdom", "charisma", "alignment", "score", "carrying-capacity", "gold",
-    "power", "power-max", "experience-level", "armor-class", "HD", "time",
-    "hunger", "hitpoints", "hitpoints-max", "dungeon-level", "experience",
-    "condition"
-};
-
 void
 status_initialize(reassessment)
 boolean
     reassessment; /* TRUE = just reassess fields w/o other initialization*/
 {
     int i;
-    const char *fieldfmts[] = { "%s",     " St:%s", " Dx:%s", " Co:%s",
-                                " In:%s", " Wi:%s", " Ch:%s", " %s",
-                                " S:%s",  " %s",    " %s",    " Pw:%s",
-                                "(%s)",   " Xp:%s", " AC:%s", " HD:%s",
-                                " T:%s",  " %s",    " HP:%s", "(%s)",
-                                "%s",     "/%s",    "%s" };
+    const char *fieldfmt = (const char *)0;
+    const char *fieldname = (const char *)0;
+
     if (!reassessment) {
         init_blstats();
         (*windowprocs.win_status_init)();
         blinit = TRUE;
     }
     for (i = 0; i < MAXBLSTATS; ++i) {
-        if ((i == BL_SCORE && !flags.showscore)
-            || (i == BL_EXP && !flags.showexp)
-            || (i == BL_TIME && !flags.time) || (i == BL_HD && !Upolyd)
-            || ((i == BL_XP || i == BL_EXP) && Upolyd))
-            status_enablefield(i, status_fieldnames[i], fieldfmts[i], FALSE);
-        else
-            status_enablefield(i, status_fieldnames[i], fieldfmts[i], TRUE);
+        enum statusfields fld = initblstats[i].fld;
+        
+        switch (fld) {
+        case BL_TITLE:
+            fieldfmt = "%s";
+            fieldname = "title";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_STR:
+            fieldfmt = " St:%s";
+            fieldname = "strength";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_DX:
+            fieldfmt = " Dx:%s";
+            fieldname = "dexterity";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_CO:
+            fieldfmt = " Co:%s";
+            fieldname = "constitution";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_IN:
+            fieldfmt = " In:%s";
+            fieldname = "intelligence";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_WI:
+            fieldfmt = " Wi:%s";
+            fieldname = "wisdom";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_CH:
+            fieldfmt = " Ch:%s";
+            fieldname = "charisma";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_ALIGN:
+            fieldfmt = " %s";
+            fieldname = "alignment";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_SCORE:
+            fieldfmt = " S:%s";
+            fieldname = "score";
+            status_enablefield(fld, fieldname, fieldfmt,
+                                  (!flags.showscore) ? FALSE : TRUE);
+            break;
+        case BL_CAP:
+            fieldfmt = " %s";
+            fieldname = "carrying-capacity";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_GOLD:
+            fieldfmt = " %s";
+            fieldname = "gold";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_ENE:
+            fieldfmt = " Pw:%s";
+            fieldname = "power";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_ENEMAX:
+            fieldfmt = "(%s)";
+            fieldname = "power-max";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_XP:
+            fieldfmt = " Xp:%s";
+            fieldname = "experience-level";
+            status_enablefield(fld, fieldname, fieldfmt,
+                                   (Upolyd) ? FALSE : TRUE);
+            break;
+        case BL_AC:
+            fieldfmt = " AC:%s";
+            fieldname = "armor-class";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_HD:
+            fieldfmt = " HD:%s";
+            fieldname = "HD";
+            status_enablefield(fld, fieldname, fieldfmt,
+                                   (!Upolyd) ? FALSE : TRUE);
+            break;
+        case BL_TIME:
+            fieldfmt = " T:%s";
+            fieldname = "time";
+            status_enablefield(fld, fieldname, fieldfmt,
+                                   (!flags.time) ? FALSE : TRUE);
+            break;
+        case BL_HUNGER:
+            fieldfmt = " %s";
+            fieldname = "hunger";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_HP:
+            fieldfmt = " HP:%s";
+            fieldname = "hitpoints";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_HPMAX:
+            fieldfmt = "(%s)";
+            fieldname = "hitpoint-max";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_LEVELDESC:
+            fieldfmt = "%s";
+            fieldname = "dungeon-level";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_EXP:
+            fieldfmt = "/%s";
+            fieldname = "experience";
+            status_enablefield(fld, fieldname, fieldfmt,
+                                  (!flags.showexp || Upolyd) ? FALSE : TRUE);
+            break;
+        case BL_CONDITION:
+            fieldfmt = "%S";
+            fieldname = "condition";
+            status_enablefield(fld, fieldname, fieldfmt, TRUE);
+            break;
+        case BL_BOGUS:
+        default:
+            break;
+       }
     }
     update_all = TRUE;
 }
@@ -407,20 +548,24 @@ status_finish()
 STATIC_OVL void
 init_blstats()
 {
-    int i;
+    static boolean initalready = FALSE;
+    int i, j;
 
-    for (i = 0; i < MAXBLSTATS; ++i) {
-        /* ensure initial field values set on blstats[1][i] too */
-        blstats[1][i] = blstats[0][i];
-
-        blstats[0][i].a = zeroany;
-        blstats[1][i].a = zeroany;
-        if (blstats[0][i].valwidth) {
-            blstats[0][i].val = (char *) alloc(blstats[0][i].valwidth);
-            blstats[1][i].val = (char *) alloc(blstats[0][i].valwidth);
-        } else {
-            blstats[0][i].val = (char *) 0;
-            blstats[1][i].val = (char *) 0;
+    if (initalready) {
+        impossible("init_blstats called more than once.");
+        return;
+    }
+
+    initalready = TRUE;
+    for (i = BEFORE; i <= NOW; ++i) {
+        for (j = 0; j < MAXBLSTATS; ++j) {
+            blstats[i][j] = initblstats[j];
+            blstats[i][j].a = zeroany;
+            if (blstats[i][j].valwidth) {
+                blstats[i][j].val = (char *) alloc(blstats[i][j].valwidth);
+                blstats[i][j].val[0] = '\0';
+            } else
+                blstats[i][j].val = (char *) 0;
         }
     }
 }
@@ -887,10 +1032,10 @@ bot()
      * text display obliterates the status line.
      *
      * To work around it, we call status_update() with ficticious
-     * index of BL_FLUSH (-1).
+     * index of BL_BOGUS (-1).
      */
     if (context.botlx && !updated)
-        status_update(BL_FLUSH, (genericptr_t) 0, 0, 0);
+        status_update(BL_BOGUS, (genericptr_t) 0, 0, 0);
 
     context.botl = context.botlx = 0;
     update_all = FALSE;
@@ -991,17 +1136,18 @@ char *sa, *sb, *sc, *sd;
     boolean normal[2] = { 0, 0 };
     boolean percent = FALSE, down_up = FALSE, changed = FALSE;
     anything threshold;
-
+    enum statusfields fld = BL_BOGUS;
     threshold.a_void = 0;
 
     /* Example:
      *         hilite_status: hitpoints/10%/red/normal
      */
 
-    /* field name to idx */
-    for (i = 0; sa && i < MAXBLSTATS; ++i) {
-        if (strcmpi(sa, status_fieldnames[i]) == 0) {
+    /* field name to statusfield */
+    for (i = 0; sa && i < SIZE(fieldids); ++i) {
+        if (strcmpi(sa, fieldids[i].fieldname) == 0) {
             idx = i;
+            fld = fieldids[i].fldid;
             break;
         }
     }
@@ -1016,8 +1162,8 @@ char *sa, *sb, *sc, *sd;
         || (strcmpi(sb, "up") == 0) || (strcmpi(sb, "down") == 0)) {
         down_up = TRUE;
     } else if ((strcmpi(sb, "changed") == 0)
-               && (idx == BL_TITLE || idx == BL_ALIGN || idx == BL_LEVELDESC
-                   || idx == BL_CONDITION)) {
+               && (fld == BL_TITLE || fld == BL_ALIGN || fld == BL_LEVELDESC
+                   || fld == BL_CONDITION)) {
         changed = TRUE; /* changed is only thing allowed */
     } else {
         tmp = sb;
@@ -1146,9 +1292,9 @@ int bufsiz;
                 Strcat(buf, " ");
                 bufsiz--;
             }
-            k = strlen(status_fieldnames[i]);
+            k = strlen(fieldids[i].fieldname);
             if (k < bufsiz) {
-                Strcat(buf, status_fieldnames[i]);
+                Strcat(buf, fieldids[i].fieldname);
                 bufsiz -= k;
             }
             if (bufsiz > 1) {
@@ -1239,7 +1385,7 @@ status_hilite_menu()
     start_menu(tmpwin);
     for (i = 0; i < MAXBLSTATS; i++) {
         (void) memset(&hltemp[i], 0, sizeof(struct hilite_s));
-        fieldname = status_fieldnames[i];
+        fieldname = fieldids[i].fieldname;
         any.a_int = i + 1;
         add_menu(tmpwin, NO_GLYPH, &any, 0, 0, ATR_NONE, fieldname,
                  MENU_UNSELECTED);
@@ -1262,7 +1408,7 @@ status_hilite_menu()
         if (field_picks[i]) {
             menu_item *pick = (menu_item *) 0;
             Sprintf(buf, "Threshold behavior options for %s:",
-                    status_fieldnames[i]);
+                    fieldids[i].fieldname);
             tmpwin = create_nhwindow(NHW_MENU);
             start_menu(tmpwin);
             if (i == BL_CONDITION) {
@@ -1301,12 +1447,12 @@ status_hilite_menu()
                 return FALSE;
 
             if (hltemp[i].behavior == BL_TH_UPDOWN) {
-                Sprintf(below, "%s decreases", status_fieldnames[i]);
-                Sprintf(above, "%s increases", status_fieldnames[i]);
+                Sprintf(below, "%s decreases", fieldids[i].fieldname);
+                Sprintf(above, "%s increases", fieldids[i].fieldname);
             } else if (hltemp[i].behavior) {
                 /* Have them enter the threshold*/
                 Sprintf(
-                    buf, "Set %s threshold to what%s?", status_fieldnames[i],
+                    buf, "Set %s threshold to what%s?", fieldids[i].fieldname,
                     (hltemp[i].behavior == BL_TH_VAL_PERCENTAGE)
                         ? " percentage"
                         : (hltemp[i].behavior == BL_TH_CONDITION) ? " mask"
@@ -1319,11 +1465,11 @@ status_hilite_menu()
                 if (!hltemp[i].threshold.a_void)
                     return FALSE;
 
-                Sprintf(below, "%s falls below %s%s", status_fieldnames[i],
+                Sprintf(below, "%s falls below %s%s", fieldids[i].fieldname,
                         thresholdbuf,
                         (hltemp[i].behavior == BL_TH_VAL_PERCENTAGE) ? "%"
                                                                      : "");
-                Sprintf(above, "%s rises above %s%s", status_fieldnames[i],
+                Sprintf(above, "%s rises above %s%s", fieldids[i].fieldname,
                         thresholdbuf,
                         (hltemp[i].behavior == BL_TH_VAL_PERCENTAGE) ? "%"
                                                                      : "");
@@ -1368,7 +1514,7 @@ status_hilite_menu()
     buf[0] = '\0';
     for (i = 0; i < MAXBLSTATS; i++) {
         if (field_picks[i]) {
-            Sprintf(eos(buf), "%s/%s%s/", status_fieldnames[i],
+            Sprintf(eos(buf), "%s/%s%s/", fieldids[i].fieldname,
                     (hltemp[i].behavior == BL_TH_UPDOWN)
                         ? "updown"
                         : anything_to_s(thresholdbuf, &hltemp[i].threshold,
@@ -1457,14 +1603,16 @@ genericptr_t ptr;
     long cond, *condptr = (long *) ptr;
     register int i;
     char *text = (char *) ptr;
-    int fieldorder1[] = { BL_TITLE, BL_STR, BL_DX,    BL_CO,    BL_IN,
-                          BL_WI,    BL_CH,  BL_ALIGN, BL_SCORE, -1 };
-    int fieldorder2[] = { BL_LEVELDESC, BL_GOLD,      BL_HP,   BL_HPMAX,
-                          BL_ENE,       BL_ENEMAX,    BL_AC,   BL_XP,
-                          BL_EXP,       BL_HD,        BL_TIME, BL_HUNGER,
-                          BL_CAP,       BL_CONDITION, -1 };
-
-    if (idx != BL_FLUSH) {
+
+    enum statusfields fieldorder[2][15] = {
+        { BL_TITLE, BL_STR, BL_DX, BL_CO, BL_IN, BL_WI, BL_CH, BL_ALIGN,
+          BL_SCORE, BL_BOGUS, BL_BOGUS, BL_BOGUS, BL_BOGUS, BL_BOGUS, BL_BOGUS},
+        { BL_LEVELDESC, BL_GOLD, BL_HP, BL_HPMAX, BL_ENE, BL_ENEMAX,
+          BL_AC, BL_XP, BL_EXP, BL_HD, BL_TIME, BL_HUNGER,
+          BL_CAP, BL_CONDITION, BL_BOGUS}
+    };
+
+    if (idx != BL_BOGUS) {
         if (!activefields[idx])
             return;
         switch (idx) {
@@ -1494,14 +1642,14 @@ genericptr_t ptr;
 
     /* This genl version updates everything on the display, everytime */
     newbot1[0] = '\0';
-    for (i = 0; fieldorder1[i] >= 0; ++i) {
-        int idx1 = fieldorder1[i];
+    for (i = 0; fieldorder[0][i] != BL_BOGUS; ++i) {
+        int idx1 = fieldorder[0][i];
         if (activefields[idx1])
             Strcat(newbot1, vals[idx1]);
     }
     newbot2[0] = '\0';
-    for (i = 0; fieldorder2[i] >= 0; ++i) {
-        int idx2 = fieldorder2[i];
+    for (i = 0; fieldorder[1][i] != BL_BOGUS; ++i) {
+        int idx2 = fieldorder[1][i];
         if (activefields[idx2])
             Strcat(newbot2, vals[idx2]);
     }