changeset 56:2898afb3c9a0

Cleanup the texture alignment code, also cosmetically. Add more informative error messages for certain conditions that lacked them.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 26 Sep 2011 06:05:23 +0300
parents 522a71f40632
children 334cf83fd576
files src/l_align.cc
diffstat 1 files changed, 118 insertions(+), 94 deletions(-) [+]
line wrap: on
line diff
--- a/src/l_align.cc	Mon Sep 26 06:02:12 2011 +0300
+++ b/src/l_align.cc	Mon Sep 26 06:05:23 2011 +0300
@@ -149,7 +149,7 @@
     char texname[WAD_TEX_NAME + 1];
     char errormessage[128];          /* area to hold the error messages produced */
     int ldef;                        /* linedef number */
-    int sd1;                         /* current sidedef in *sdlist */
+    int sdef;                         /* current sidedef in *sdlist */
     int vert1, vert2;                /* vertex 1 and 2 for the linedef under scrutiny */
     int xoffset;                     /* xoffset accumulator */
     int useroffset;                  /* user input offset for first input */
@@ -170,23 +170,17 @@
     xoffset = 0;
     useroffset = 0;
 
-    switch (vDisplayMenu(250, 110, "Aligning textures (X offset) :",
-                         " Sidedef 1, Check for identical textures.     ",
-                         YK_, 0,
-                         " Sidedef 1, As above, but with initial offset.",
-                         YK_, 0,
-                         " Sidedef 1, No texture checking.              ",
-                         YK_, 0,
-                         " Sidedef 1, As above, but with initial offset.",
-                         YK_, 0,
-                         " Sidedef 2, Check for identical textures.     ",
-                         YK_, 0,
-                         " Sidedef 2, As above, but with initial offset.",
-                         YK_, 0,
-                         " Sidedef 2, No texture checking.              ",
-                         YK_, 0,
-                         " Sidedef 2, As above, but with initial offset.",
-                         YK_, 0, NULL))
+    switch (vDisplayMenu(250, 110,
+    "Aligning textures (X offset) :",
+    " Sidedef 1, Check for identical textures.     ", YK_, 0,
+    " Sidedef 1, As above, but with initial offset.", YK_, 0,
+    " Sidedef 1, No texture checking.              ", YK_, 0,
+    " Sidedef 1, As above, but with initial offset.", YK_, 0,
+    " Sidedef 2, Check for identical textures.     ", YK_, 0,
+    " Sidedef 2, As above, but with initial offset.", YK_, 0,
+    " Sidedef 2, No texture checking.              ", YK_, 0,
+    " Sidedef 2, As above, but with initial offset.", YK_, 0,
+    NULL))
     {
     case 1:                        /* Sidedef 1 with checking for same textures   */
         type_sd = 1;
@@ -235,57 +229,64 @@
         type_tex = 0;
         type_off = 1;
         break;
+    default:
+        return;
     }
 
-    ldef = 0;
     if (!*sdlist)
     {
         Notify(-1, -1, "Error in AlignTexturesX: list is empty", 0);
         return;
     }
-    sd1 = (*sdlist)->objnum;
+
+    /* throw out all 1/2nd SideDefs until a 1/2st is found */
+    ldef = 0;
+    sdef = (*sdlist)->objnum;
 
-    if (type_sd == 1)                /* throw out all 2nd SideDefs untill a 1st is found */
+    while (ldef <= NumLineDefs && (
+           (type_sd == 1 && LineDefs[ldef].sidedef1 != sdef) ||
+           (type_sd == 2 && LineDefs[ldef].sidedef2 != sdef)               
+           ))
     {
-        while (*sdlist && LineDefs[ldef].sidedef1 != sd1
-               && ldef <= NumLineDefs)
+        ldef++;
+        if ((type_sd == 1 && LineDefs[ldef].sidedef2 == sdef) ||
+            (type_sd == 2 && LineDefs[ldef].sidedef1 == sdef))
         {
-            ldef++;
-            if (LineDefs[ldef].sidedef2 == sd1)
+            int tmp = (*sdlist)->objnum;
+            UnSelectObject(sdlist, tmp);
+            if (!*sdlist)
             {
-                UnSelectObject(sdlist, (*sdlist)->objnum);
-                if (!*sdlist)
-                    return;
-                sd1 = (*sdlist)->objnum;
-                ldef = 0;
+                sprintf(errormessage, "*sdlist == NULL while unselecting sidedefs (type_sd=%d, sdef=%d, ldef=%d, tmp=%d).",
+                    type_sd, sdef, ldef, tmp);
+                Notify(-1, -1, errormessage, 0);
+                return;
             }
-        }
-    }
-
-    if (type_sd == 2)                /* throw out all 1st SideDefs untill a 2nd is found */
-    {
-        while (LineDefs[ldef].sidedef2 != sd1 && ldef <= NumLineDefs)
-        {
-            ldef++;
-            if (LineDefs[ldef].sidedef1 == sd1)
-            {
-                UnSelectObject(sdlist, (*sdlist)->objnum);
-                if (!*sdlist)
-                    return;
-                sd1 = (*sdlist)->objnum;
-                ldef = 0;
-            }
+            sdef = (*sdlist)->objnum;
+            ldef = 0;
         }
     }
 
     /* get texture name of the sidedef in the *sdlist) */
-    strncpy(texname, SideDefs[(*sdlist)->objnum].tex3, WAD_TEX_NAME);
-
-    /* test if there is a texture there */
-    if (texname[0] == 0 || texname[0] == '-')
+    SDPtr pdef = &SideDefs[(*sdlist)->objnum];
+    int mode = -1;
+    if (ValidTextureName(pdef->tex3))
+    {
+        strncpy(texname, pdef->tex3, WAD_TEX_NAME);
+        mode = 3;
+    }
+    else if (ValidTextureName(pdef->tex2))
     {
-        Beep();
-        sprintf(errormessage, "No texture for sidedef #%d.",
+        strncpy(texname, pdef->tex2, WAD_TEX_NAME);
+        mode = 2;
+    }
+    else if (ValidTextureName(pdef->tex1))
+    {
+        strncpy(texname, pdef->tex1, WAD_TEX_NAME);
+        mode = 1;
+    }
+    else
+    {
+        sprintf(errormessage, "No texture(s) for sidedef #%d.",
                 (*sdlist)->objnum);
         Notify(-1, -1, errormessage, 0);
         return;
@@ -293,16 +294,21 @@
 
     GetWallTextureSize(&texlength, &dummy, texname);        /* clunky, but it works */
 
-    /* get initial offset to use (if required) */
-    if (type_off == 1)                /* source taken from InputObjectNumber */
+    if (texlength < 4)
     {
-        int x0;                        /* left hand (x) window start     */
-        int y0;                        /* top (y) window start           */
-        int key;                /* holds value returned by InputInteger */
-        char prompt[80];        /* prompt for inital offset input */
+        sprintf(errormessage, "Texture length for texture '%s' is %d. Not continuing.",
+                texname, texlength);
+        Notify(-1, -1, errormessage, 0);
+        return;
+    }
 
-        sprintf(prompt, "Enter initial offset between 0 and %d:",
-                (int) texlength);
+    /* get initial offset to use (if required) */
+    if (type_off == 1)
+    {
+        int x0, y0, key;
+        char prompt[80];
+
+        sprintf(prompt, "Enter initial offset between 0 and %d:", texlength);
 
         x0 = (ScrMaxX - 25 - 8 * strlen(prompt)) / 2;
         y0 = (ScrMaxY - 55) / 2;
@@ -311,46 +317,56 @@
         set_colour(WHITE);
         DrawScreenText(x0 + 10, y0 + 8, prompt);
 
-        while ((key =
-                InputInteger(x0 + 10, y0 + 28, &useroffset, 0,
-                             (int) texlength)) != YK_RETURN && key != YK_ESC)
+        while ((key = InputInteger(x0 + 10, y0 + 28, &useroffset, 0,
+               (int) texlength)) != YK_RETURN && key != YK_ESC)
             Beep();
 
+        if (key == YK_ESC)
+            return;
     }
 
-    while (*sdlist)                /* main processing loop */
+    /* Main processing loop */
+    while (*sdlist)
     {
         ldef = 0;
-        sd1 = (*sdlist)->objnum;
+        sdef = (*sdlist)->objnum;
 
         if (type_sd == 1)        /* throw out all 2nd SideDefs untill a 1st is found */
         {
-            while (LineDefs[ldef].sidedef1 != sd1 && ldef <= NumLineDefs)
+            while (LineDefs[ldef].sidedef1 != sdef && ldef <= NumLineDefs)
             {
                 ldef++;
-                if (LineDefs[ldef].sidedef2 == sd1)
+                if (LineDefs[ldef].sidedef2 == sdef)
                 {
                     UnSelectObject(sdlist, (*sdlist)->objnum);
-                    sd1 = (*sdlist)->objnum;
+                    if (*sdlist == NULL)
+                    {
+                        sprintf(errormessage, "Error in type_sd==1, *sdlist == NULL");
+                        Notify(-1, -1, errormessage, 0);
+                        return;
+                    }
+                    sdef = (*sdlist)->objnum;
                     ldef = 0;
-                    if (!*sdlist)
-                        return;
                 }
             }
         }
-
+        else
         if (type_sd == 2)        /* throw out all 1st SideDefs untill a 2nd is found */
         {
-            while (LineDefs[ldef].sidedef2 != sd1 && ldef <= NumLineDefs)
+            while (LineDefs[ldef].sidedef2 != sdef && ldef <= NumLineDefs)
             {
                 ldef++;
-                if (LineDefs[ldef].sidedef1 == sd1)
+                if (LineDefs[ldef].sidedef1 == sdef)
                 {
                     UnSelectObject(sdlist, (*sdlist)->objnum);
-                    sd1 = (*sdlist)->objnum;
+                    if (*sdlist == NULL)
+                    {
+                        sprintf(errormessage, "Error in type_sd==2, *sdlist == NULL");
+                        Notify(-1, -1, errormessage, 0);
+                        return;
+                    }
+                    sdef = (*sdlist)->objnum;
                     ldef = 0;
-                    if (!*sdlist)
-                        return;
                 }
             }
         }
@@ -358,10 +374,11 @@
         /* do we test for same textures for the sidedef in question?? */
         if (type_tex == 1)
         {
-            if (strncmp
-                (SideDefs[(*sdlist)->objnum].tex3, texname, WAD_TEX_NAME))
+            pdef = &SideDefs[(*sdlist)->objnum];
+            if ((mode == 3 && strncmp(pdef->tex3, texname, WAD_TEX_NAME)) ||
+                (mode == 2 && strncmp(pdef->tex2, texname, WAD_TEX_NAME)) ||
+                (mode == 1 && strncmp(pdef->tex1, texname, WAD_TEX_NAME)))
             {
-                Beep();
                 sprintf(errormessage, "No texture for sidedef #%d.",
                         (*sdlist)->objnum);
                 Notify(-1, -1, errormessage, 0);
@@ -369,45 +386,50 @@
             }
         }
 
-        sd1 = (*sdlist)->objnum;
-        ldef = 0;
+        sdef = (*sdlist)->objnum;
 
         /* find out which linedef holds that sidedef */
-        if (type_sd == 1)
+        int n;
+        for (ldef = -1, n = 0; n < NumLineDefs; n++)
+            if ((type_sd == 1 && LineDefs[n].sidedef1 == sdef) ||
+                (type_sd == 2 && LineDefs[n].sidedef2 == sdef)) 
+            {
+                ldef = n;
+                break;
+            }
+
+        if (ldef < 0)
         {
-            while (LineDefs[ldef].sidedef1 != sd1 && ldef < NumLineDefs)
-                ldef++;
-        }
-        else
-        {
-            while (LineDefs[ldef].sidedef2 != sd1 && ldef < NumLineDefs)
-                ldef++;
+            sprintf(errormessage, "Linedef for sidedef #%d not found?!",
+                    sdef);
+            Notify(-1, -1, errormessage, 0);
+            return;
         }
 
+        /* test for linedef highlight continuity */
         vert1 = LineDefs[ldef].start;
-        /* test for linedef highlight continuity */
         if (vert1 != vert2 && vert2 != -1)
         {
-            Beep();
             sprintf(errormessage, "Linedef #%d is not contiguous"
                     " with the previous linedef, please reselect.",
                     (*sdlist)->objnum);
             Notify(-1, -1, errormessage, 0);
             return;
         }
+
         /* is this the first time round here */
         if (vert1 != vert2)
         {
             if (type_off == 1)        /* do we have an initial offset ? */
             {
-                SideDefs[sd1].xoff = useroffset;
+                SideDefs[sdef].xoff = useroffset;
                 xoffset = useroffset;
             }
             else
-                SideDefs[sd1].xoff = 0;
+                SideDefs[sdef].xoff = 0;
         }
         else                        /* put new xoffset into the sidedef */
-            SideDefs[sd1].xoff = xoffset;
+            SideDefs[sdef].xoff = xoffset;
 
         /* calculate length of linedef */
         vert2 = LineDefs[ldef].end;
@@ -415,8 +437,10 @@
                              Vertices[vert2].y - Vertices[vert1].y);
 
         xoffset += length;
+
         /* remove multiples of texlength from xoffset */
         xoffset = xoffset % texlength;
+
         /* move to next object in selected list */
         UnSelectObject(sdlist, (*sdlist)->objnum);
     }