]> granicus.if.org Git - xconq/blobdiff - mac/maccolors.c
commits for 7.5.0 pre-release tarball
[xconq] / mac / maccolors.c
diff --git a/mac/maccolors.c b/mac/maccolors.c
deleted file mode 100644 (file)
index ef68567..0000000
+++ /dev/null
@@ -1,1528 +0,0 @@
-/* Side color support for the Mac interface to Xconq.
-   Copyright (C) 1997, 1998 Hans Ronne.
-
-Xconq is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2, or (at your option)
-any later version.  See the file COPYING.  */
-
-#include "conq.h"
-#include "macconq.h"
-
-#ifdef NEW_HEADERS
-#include <ColorPicker.h>
-#else
-#include <Picker.h>
-#endif
-
-/* --- FUNCTIONS PROTOTYPES -------------------------------------------------*/
-
-static int append_image_names(MenuHandle menu);
-static int append_color_names(MenuHandle menu);
-static int append_terrain_names(MenuHandle menu);
-static int append_imf_name(Obj *form, MenuHandle menu);
-static RGBColor get_color(char *name);                                 /* Get new color by name */
-static RGBColor pick_new_color(RGBColor inColor, char *name);  /* Use color picker to get a new color */
-
-/* --- EXTERN DEFINED IN MACDRAW.C  -------------------------------------------*/
-
-extern Image **best_terrain_images;
-
-/* --- DEFAULTS FOR NEW MAP PREFERENCES ---------------------------------------*/
-
-int default_sidecolors = FALSE;                /* Use side colors in maps & lists */
-int default_iconmasks = FALSE;         /* Use masks for icons  */
-int default_boxmasks = TRUE;           /* Use masks for grouping boxes */
-int default_textmasks = FALSE;         /* Use masks for text */
-int default_featureborders = TRUE;     /* Draw feature (province) borders */
-int default_featurenames = TRUE;               /* Draw feature (province) names */
-int default_simple_borders = TRUE;     /* Do not draw borders to water or to empty lands */
-int default_shorelines = TRUE;         /* Draw shorelines in 3D relief */
-int default_draw_ai = FALSE;           /* Draw AI regions (if present). */
-int alert_256_colors = FALSE;          /* Suggest switch to 256 colors at start. */
-int default_draw_scrollbars = FALSE;   /* Draw scrollbars in maps. */
-int default_draw_cpanel = TRUE;                /* Draw control panel in maps. */
-int default_draw_emblems = TRUE;       /* Draw unit emblems in maps and lists. */
-int default_draw_topline = TRUE;               /* Draw top line boxes in maps */
-int default_draw_topunit = TRUE;               /* Draw unit info boxes in maps */
-int default_drawothermaps = TRUE;      /* Draw other maps as boxes */
-int default_erase_names = TRUE;                /* Draw extra rows to erase name of moving unit */
-int default_max_bufx = 600;            /* Horizontal scrolling buffers in offscreen graphics */
-int default_max_bufy = 400;            /* Vertical scrolling buffers in offscreen graphics */
-int default_optimize_fonts = TRUE;     /* Use optimized font sizes in map content */
-int default_blinking_curunit = TRUE;   /* Use blinking current unit instead of animated box */
-int default_selectionmasks = TRUE;     /* Use selection masks instead of selection boxes */
-int default_power = 5;                         /* Default power of new map */
-
-/* --- VARIOUS PREFERENCES -----------------------------------------------------*/
-
-int use_colornames = TRUE;                     /* Save and read side colors as colorschemes */
-int use_RGB_values = FALSE;            /* Save and read RGB colors in XCol resource */
-int show_instructions = TRUE;          /* Show instructions window at start */
-int fullsize_map = TRUE;                       /* Show full size map window at start */
-int unified_cicns = FALSE;                     /* Use BitMap as mask for the PixMap */
-
-/* --- COLOR SCHEME DEFAULTS ---------------------------------------------------*/
-
-int default_main_icon_color = 1;               /* Default number (1-3) of sideColor used for icons */ 
-int default_half_icon_color = 2;               /* Default number (1-3) of sideColor used for right half of icons */
-int default_icon_mask_color = 3;               /* Default number (1-3) of sideColor used for icon masks */
-int default_split_icon = TRUE;         /* Default use different colors for right and left halves of icons */
-               
-/* --- COLORS, COLOR SCHEMES AND COLOR NAMES --------------------------------------*/
-
-RGBColor blackcolor = {0, 0, 0};
-RGBColor dkgraycolor = {24000, 24000, 24000};
-RGBColor graycolor = {32768, 32768, 32768};
-RGBColor ltgraycolor = {49000, 49000, 49000};
-RGBColor whitecolor = {0xFFFF, 0xFFFF, 0xFFFF};
-
-RGBColor *featColor;                           /* Feature colors by RGB value */
-RGBColor *sideColor;                           /* sideColor[0-15][1-3] are defined by default color schemes */
-                                                       /* sideColor[][0] is not defined, and available for future use */
-
-char **current_colorscheme;            /* Current color schemes by names (red,pink,blue) */
-                                                       /* Unlike side->colorscheme defined also for null sides */      
-
-char **default_featColorName;          /* Default feature colors by name (black etc) */
-char **default_colorscheme;            /* Default color schemes (red,pink,brown) etc */
-
-char **featColorItemName;                      /* Name of item for which featColor is set (Shorelines etc) */
-char **featColorName;                  /* Name of feature color values (red, green etc) */
-char **sideColorName;                  /* Name of side color values (red, green etc) */
-
-int *main_icon_color;                          /* Number (1-3) of sideColor used for icons */ 
-int *half_icon_color;                          /* Number (1-3) of sideColor used for right half of icons */
-int *icon_mask_color;                          /* Number (1-3) of sideColor used for icon masks */
-int *split_icon;                                       /* Use two colors for left and right halves of icons if TRUE */
-
-/* --- FUNCTIONS FOR BUILDING AND HANDLING COLORS AND COLOR SCHEMES ---------------------*/
-
-void 
-set_default_colors(void)                       /* Default colors used in absence of saved preferences */
-{
-       int i;
-
-       featColor = (RGBColor *) xmalloc((FEATURES+1) * sizeof(RGBColor));
-       featColorItemName = (char **) xmalloc((FEATURES+1) * sizeof(char *));
-       featColorName = (char **) xmalloc((FEATURES+1) * sizeof(char *));
-       default_featColorName = (char **) xmalloc((FEATURES+1) * sizeof(char *));
-       sideColor = (RGBColor *) xmalloc((MAXSIDES+1) * 4 * sizeof(RGBColor));
-       sideColorName = (char **) xmalloc((MAXSIDES+1) * 4 * sizeof(char *));
-       current_colorscheme = (char **) xmalloc((MAXSIDES+1) * sizeof(char *)); 
-       default_colorscheme = (char **) xmalloc((MAXSIDES+1) * sizeof(char *));
-       main_icon_color = (int *) xmalloc((MAXSIDES+1) * sizeof(int));
-       half_icon_color = (int *) xmalloc((MAXSIDES+1) * sizeof(int));
-       icon_mask_color = (int *) xmalloc((MAXSIDES+1) * sizeof(int));
-       split_icon = (int *) xmalloc((MAXSIDES+1) * sizeof(int));
-
-       default_colorscheme[0] = "black,black,white";
-       default_colorscheme[1] = "blue,blue,pale-turquoise";
-       default_colorscheme[2] = "red,red,yellow";
-       default_colorscheme[3] = "deep-pink,deep-pink,spring-green";
-       default_colorscheme[4] = "straw,straw,saddle-brown";
-       default_colorscheme[5] = "red,blue,cyan";
-       default_colorscheme[6] = "white,violet,black";
-       default_colorscheme[7] = "cyan,cyan,blue";
-       default_colorscheme[8] = "yellow,yellow,red";
-       default_colorscheme[9] = "green,magenta,medium-blue";
-       default_colorscheme[10] = "purple,purple,cyan";
-       default_colorscheme[11] = "navy-blue,deep-pink,spring-green";
-       default_colorscheme[12] = "lawn-green,lawn-green,deep-pink";
-       default_colorscheme[13] = "light-pink,spring-green,midnight-blue";
-       default_colorscheme[14] = "dark-green,purple,aquamarine";
-       default_colorscheme[15] = "cyan,green-yellow,navy-blue";
-       default_featColorName[0] = "dark-orange";               /* Window background outside map. */
-       default_featColorName[1] = "black";                     /* Fore color */        
-       default_featColorName[2] = "pale-turquoise";    /* Mask color */
-       default_featColorName[3] = "midnight-blue";     /* Text color */
-       default_featColorName[4] = g_grid_color();
-       default_featColorName[5] = g_unseen_color();
-       default_featColorName[6] = g_shoreline_color();
-       default_featColorName[7] = "deep-pink";         /* Feature text and borders */
-       default_featColorName[8] = g_frontline_color();
-       default_featColorName[9] = g_meridian_color();
-       default_featColorName[10] = g_contour_color();
-       featColorItemName[0] = "Background";
-       featColorItemName[1] = "Fore color";    /* These names are used in the Colors menu */
-       featColorItemName[2] = "Mask color";
-       featColorItemName[3] = "Text color";
-       featColorItemName[4] = "Grid color";
-       featColorItemName[5] = "Unseen color";
-       featColorItemName[6] = "Shorelines";
-       featColorItemName[7] = "Features";
-       featColorItemName[8] = "Frontlines";
-       featColorItemName[9] = "Meridians";
-       featColorItemName[10] = "Contours";
-}
-
-void
-set_default_side_colors(int e)
-{
-       /* First reset current colors to default colors */
-       side_n(e)->colorscheme = default_colorscheme[e];
-       /* Change the current colors */
-       set_side_colors(e);
-       /* Copy the result back to default colors */
-       default_colorscheme[e] = side_n(e)->colorscheme;
-       force_overall_update();
-       save_preferences();
-}
-
-void
-set_default_feature_color(int e)
-{
-       /* First reset current colors to default colors */
-       featColorName[e] = default_featColorName[e];
-       /* Change the current colors */
-       set_feature_color(e);
-       /* Copy the result back to default colors */
-       default_featColorName[e] = featColorName[e];
-       force_overall_update();
-       save_preferences();
-}
-
-/* Load side colors and feature colors from defaults */
-
-void
-init_side_colors(void)
-{
-       int i;
-       char cstring[96];
-
-       for (i = 0; i <= MAXSIDES; i++) {
-
-               /* Use of XCol colors overrides any colorschemes */
-               if (!use_RGB_values) {
-
-                       /* Set side color names initially to "undefined" */
-                       set_sideColorName(i, 1, "undefined");
-                       set_sideColorName(i, 2, "undefined");
-                       set_sideColorName(i, 3, "undefined");
-                       /* Use schemes defined in game file if present or else default schemes */
-                       if (side_n(i) && side_n(i)->colorscheme) {
-                               current_colorscheme[i] = copy_string(side_n(i)->colorscheme);
-                       } else {
-                               current_colorscheme[i] = copy_string(default_colorscheme[i]);
-                       }
-                       net_set_side_colorscheme(dside, side_n(i), current_colorscheme[i]);
-                       dissect_colorscheme(i);
-               }
-
-               /* Load color use parameters from their defaults values */
-               main_icon_color[i]      = default_main_icon_color;
-               half_icon_color[i]      = default_half_icon_color;
-               icon_mask_color[i]      = default_icon_mask_color;
-               split_icon[i]           = default_split_icon;
-
-               /* Then zero color use parameters if the corresponding color is undefined */
-               if (strcmp(get_sideColorName(i, main_icon_color[i]), "undefined") == 0) {
-                       main_icon_color[i] = 0;
-               }
-               if (strcmp(get_sideColorName(i, half_icon_color[i]), "undefined") == 0) {
-                       half_icon_color[i] = 0;
-                       split_icon[i] = 0;
-               }
-               if (strcmp(get_sideColorName(i, icon_mask_color[i]), "undefined") == 0) {
-                       icon_mask_color[i] = 0;
-               }
-       }
-       for (i = 0; i <= FEATURES; i++) {
-               /* Load feature colors from their defaults  */
-               featColorName[i] = default_featColorName[i];
-               featColor[i] = get_color(featColorName[i]);
-       }
-       /* This is now checked once and for all, instead of every time an area background is drawn. */
-       if (strcmp(gridcolor_name, unseencolor_name) == 0
-               || g_terrain_seen() || (dside)->see_all)
-                       grid_matches_unseen = TRUE;
-}
-
-/* This function is based on init_emblem from the X11 interface. */
-/* It also tests each name for validity and stores it in an array. */
-
-void
-dissect_colorscheme(int sidenum)
-{
-       char            *colorscheme = current_colorscheme[sidenum];
-       char            *s, *c;
-       char            cbuf[BUFSIZE];
-       int             i, button;
-       Str255  pname;
-
-       if (!empty_string(colorscheme)) {
-               /* Take spec apart and iterate for multiple colors */
-               for (s = colorscheme, c = cbuf, i = 1; i <= 3; ++s) {
-                       /* Test for end of name or end of scheme */
-                       if (*s == ',' || *s == '\0') {
-                               /* Terminate the name string */
-                               *c = '\0';
-                               c = cbuf;
-                               /* First check that the color name is valid. If not, substitute "undefined" */
-                               if (!valid_imf_name(cbuf)) {
-                                       c2p(cbuf, pname);
-                                       ParamText("\pSorry, Ò", pname, 
-                                                        "\pÓ is not a valid color name. Substituting ÒundefinedÓ.", "\p");
-                                       button = Alert(aOneButtonAlert, NULL);
-                                       strcpy(cbuf, "undefined");
-                               }
-                               /* Also replace empty strings with "undefined" but do it silently */
-                               if (strcmp(cbuf, "") == 0)
-                                 strcpy(cbuf, "undefined");
-
-                               /* Get the color and store the color name in the name array */
-                               set_sideColorName(sidenum, i, copy_string(cbuf));
-                               set_sideColor(sidenum, i++, get_color(cbuf)); 
-
-                       /* Add one more character */
-                       } else *c++ = *s;
-                       /* Test for end of colorscheme */
-                       if (*s == '\0')
-                         break;
-               }
-       }
-}
-
-/* Get a ppat color by its name. Function that call get_color should first check that the name is valid */ 
-
-RGBColor
-get_color(char* name)
-{
-       ImageFamily     *imf;
-       Image           *img;
-       MacImage                *macimg;
-       PixMapHandle    pmhandle;
-       CTabHandle      ctabhandle;
-       ColorSpec               *ctdata;
-
-       /* Return black if name is "undefined" */       
-       if (strcmp(name, "undefined") == 0)
-            return blackcolor;
-
-       /* Find (or create) the image family. */
-       imf = get_generic_images(name);
-
-       /* Needed only in the presence of mac-lib. */ 
-       record_imf_get(imf);                    
-
-       /* Get the 1x1 image (color). */
-       img = get_img(imf, 1, 1);
-
-       /* Needed only in the presence of mac-lib. */ 
-       mac_interp_imf(imf, img, 0);    
-
-       /* Get the resulting mac image. */
-       macimg = (MacImage *) img->hook;
-
-       /* Return black if it has no colrpat. */
-       if (!macimg->colrpat) 
-             return blackcolor;
-
-       /* Copy colrpat data into macimg->color. */
-       pmhandle = (*macimg->colrpat)->patMap;
-       ctabhandle = (*pmhandle)->pmTable;
-       ctdata = (ColorSpec *) &((*ctabhandle)->ctTable);
-       macimg->color.red       = ctdata[0].rgb.red;
-       macimg->color.green     = ctdata[0].rgb.green;
-       macimg->color.blue      = ctdata[0].rgb.blue;
-       macimg->colordefined    = TRUE;
-       
-       /* Return the resulting color. */
-       return macimg->color;
-}      
-
-/* Given an initial color and a name, allow the user to pick a color
-   for that name. */
-
-RGBColor  
-pick_new_color(RGBColor inColor, char* name) 
-{
-       RGBColor outColor = inColor;
-       Point where = {0};
-       char prompt[64];
-       Str255 pprompt;
-       short button;
-
-       /* Return if the color name is "undefined". */
-       if (strcmp(name, "undefined") == 0)
-         return;
-
-       /* Build the prompt. */
-       strcpy(prompt, "Define Ò");
-       strcat(prompt, name);
-       strcat(prompt, "Ó:");
-       c2p(prompt, pprompt);
-
-       /* Open the color picker. */
-       button = GetColor(where, pprompt, &inColor, &outColor);
-       if (button == 1)
-         return outColor;
-       else
-         return inColor;
-}
-
-/* --- FUNCTIONS FOR READING AND WRITING XCOL RGB DATA ------------------------------*/
-
-/* (should generify all this) */
-
-void
-read_xcol(void)
-{
-       Handle XCol;    /* Special resource used to save RGB colors in prefs file */
-       int i, j;               /* Index for loading colors from XCol resource */
-       int n = 0;              /* XCol resource counter */
-
-       /* First load the side colors */
-       for (i = 0; i <= MAXSIDES; i++) {
-               for (j = 1; j <= 3; j++) {
-
-                       /* Convert XCol resource data into RGB colors */
-                       XCol = GetResource('XCol', 128 + n);
-                       if (XCol != nil) {
-                       
-                               sideColor[4 * i + j].red        = *(*XCol + 1); 
-                               sideColor[4 * i + j].green      = *(*XCol + 3);
-                               sideColor[4 * i + j].blue       = *(*XCol + 5) ;
-                               
-                               sideColor[4 * i + j].red        &= 0x00FF;      /* Necessary to avoid color drift */
-                               sideColor[4 * i + j].green      &= 0x00FF;      /* Dont ask me why */
-                               sideColor[4 * i + j].blue       &= 0x00FF;
-
-                               sideColor[4 * i + j].red        += (*(*XCol + 0) << 8);
-                               sideColor[4 * i + j].green      += (*(*XCol + 2) << 8);
-                               sideColor[4 * i + j].blue       += (*(*XCol + 4) << 8);
-                               
-                               n += 1;
-                       }
-               }
-       }                       
-
-       /* Then load the feature colors */
-       for (i = 1; i <= FEATURES; i++) {
-
-               /* Convert XCol resource data into RGB colors */
-               XCol = GetResource('XCol', 128 + n);
-               if (XCol != nil) {
-               
-                       featColor[i].red   = *(*XCol + 1); 
-                       featColor[i].green = *(*XCol + 3);
-                       featColor[i].blue  = *(*XCol + 5) ;
-                       
-                       featColor[i].red   &= 0x00FF;   /* Necessary to avoid color drift */
-                       featColor[i].green &= 0x00FF;   /* Dont ask me why */
-                       featColor[i].blue  &= 0x00FF;
-
-                       featColor[i].red   += (*(*XCol + 0) << 8);
-                       featColor[i].green += (*(*XCol + 2) << 8);
-                       featColor[i].blue  += (*(*XCol + 4) << 8);
-
-                       n += 1;
-               }
-       }                       
-}
-
-void
-write_xcol(void)
-{
-       char cnumber[2], cstring[36];
-       Str255 pnumber, pstring;                        /* Used to write XCol names in pref file */
-       Handle XCol, oldXCol;                           /* Special resource used to store RGB colors */
-       int i, j;                                                       /* Index for loading XCols into sideColor[] */
-       int n = 0;                                                      /* Resource counter */
-
-       /* First write the side colors */
-       for (i = 0; i <= MAXSIDES; i++) {
-               for (j = 1; j <= 3; j++) {
-
-                       /* Convert RGB colors into XCol resource data */
-                       oldXCol = GetResource('XCol', 128 + n);
-                       if (oldXCol != nil) RmveResource(oldXCol);
-                       XCol = NewHandle(6);
-
-                       *(*XCol + 1) = sideColor[4 * i + j].red;        
-                       *(*XCol + 3) = sideColor[4 * i + j].green;      
-                       *(*XCol + 5) = sideColor[4 * i + j].blue;
-
-                       *(*XCol + 0) = sideColor[4 * i + j].red >> 8;
-                       *(*XCol + 2) = sideColor[4 * i + j].green       >> 8;
-                       *(*XCol + 4) = sideColor[4 * i + j].blue        >> 8;
-
-                       strcpy(cstring, "Side ");
-                       NumToString(i, pnumber);
-                       p2c(pnumber, cnumber);
-                       strcat(cstring, cnumber);
-                       strcat(cstring, " color ");
-                       NumToString(j, pnumber);
-                       p2c(pnumber, cnumber);
-                       strcat(cstring, cnumber);
-                       c2p(cstring, pstring);
-                       AddResource(XCol, 'XCol', 128 + n, pstring);
-                       
-                       n += 1;                                 
-               }
-       }
-
-       /* Then write the feature colors */
-       for (i = 1; i <= FEATURES; i++) {
-
-               /* Convert RGB colors into XCol resource data */
-               oldXCol = GetResource('XCol', 128 + n);
-               if (oldXCol != nil) RmveResource(oldXCol);
-               XCol = NewHandle(6);
-
-               *(*XCol + 1) = featColor[i].red;        
-               *(*XCol + 3) = featColor[i].green;      
-               *(*XCol + 5) = featColor[i].blue;
-
-               *(*XCol + 0) = featColor[i].red >> 8;
-               *(*XCol + 2) = featColor[i].green >> 8;
-               *(*XCol + 4) = featColor[i].blue >> 8;
-
-               c2p(featColorItemName[i], pstring);
-               AddResource(XCol, 'XCol', 128 + n, pstring);
-
-               n += 1;                                 
-       }
-}
-
-/* --- COLOR MANAGING DIALOGS --------------------------------------------------*/
-
-/* The following three dialogs are used by the Colors menu and also by Preferences : Colorschemes */
-
-/* This monster dialog does just about anything that has to do with side colors. A checkbox at the top enables or 
-   disables the use of split icons (two different colors for the left and right half). Three popup menus makes it
-   possible to chose three different colors from the available ppat colors in the Images file. The name of the new
-   color can also be entered in a text field, followed by a Return. The editflag parameter is used to ensure that
-   such a Return is not interpreted as a hit of the OK button. The actual RGB values associated with a given color 
-   name can be changed by clicking the color field, where the color itself is displayed. A second row of popup
-   menus makes it possible to chose how each color should be used. The half icon color alternative is disabled if 
-   the split icon checkbox is unchecked, and the whole menu is disabled if the color is undefined. If a color use is
-   picked which already was assigned to another color, that color is switched to "Not in use". At the bottom of the
-   dialog box, five sample icons are plotted in real time to illustrate the given choice of colors. */
-
-void
-set_side_colors(int e)
-{
-       char cname[32], tmpName1[32], tmpName2[32], tmpName3[32], tmpScheme[96];
-       short tmpUse[4], tmpSplit, editflag, ditem, mitem, button, found, done, i, n;  
-       RGBColor tmpColor[4], tmpMain, tmpHalf, tmpMask, tmpBack;
-       Handle itemhandle, ppathandle;  
-       MenuHandle popMenu, useMenu;
-       Rect srcrect, itemrect;
-       CIconHandle cicnhandle;
-       MacImage *macuimg;
-       BitMap bm, mm;          
-       GrafPtr oldport;
-       Image *uimg;
-       Str255 pname;
-       DialogPtr win;
-
-       /* Then check for color support */
-       if (!hasColorQD) {
-               ParamText("\pSorry, your mac does not support colors.", "\p", "\p", "\p");
-               button = Alert(aOneButtonAlert, NULL);
-               return;
-       } 
-
-       /* Get dialog window and popup menus */
-       win = GetNewDialog(dSideColor, NULL, (DialogPtr) -1);
-       popMenu = GetMenu(mSideColorPopup);
-       useMenu = GetMenu(mSideColorUse);
-
-       /* Save the Dialog background color if not white */
-       tmpBack = ((CGrafPtr) win)->rgbBkColor;
-
-       /* Load current side color names into temp names */
-       strcpy(tmpName1, get_sideColorName(e, 1));
-       strcpy(tmpName2, get_sideColorName(e, 2));
-       strcpy(tmpName3, get_sideColorName(e, 3));
-       
-       /* Load current side colors into temp colors */
-       tmpColor[1] = get_sideColor(e, 1);
-       tmpColor[2] = get_sideColor(e, 2);
-       tmpColor[3] = get_sideColor(e, 3);
-
-       /* Also load side colors into tmpMain, tmpHalf & tmpMask */
-       tmpMain = get_sideColor(e, main_icon_color[e]);
-       tmpHalf = get_sideColor(e, half_icon_color[e]);
-       tmpMask = get_sideColor(e, icon_mask_color[e]);
-
-       /* Load color use info into tmpUse[i] */
-       for (i = 1; i <= 3; i++) {
-               if (main_icon_color[e] == i)
-                 tmpUse[i] = miMainIconColor;
-               else if (half_icon_color[e] == i)
-                 tmpUse[i] = miHalfIconColor;
-               else if (icon_mask_color[e] == i)
-                 tmpUse[i] = miIconMaskColor;
-               else
-                 tmpUse[i] = miNotInUse;
-       }
-
-       /* Load use of split icons */
-       tmpSplit = split_icon[e];
-
-       /* Load temp names into the text fields */
-       GetDItem(win, diSideColorName1, NULL, &itemhandle, NULL);
-       c2p(tmpName1, pname);
-       SetIText(itemhandle, pname);
-       GetDItem(win, diSideColorName2, NULL, &itemhandle, NULL);
-       c2p(tmpName2, pname);
-       SetIText(itemhandle, pname);
-       GetDItem(win, diSideColorName3, NULL, &itemhandle, NULL);
-       c2p(tmpName3, pname);
-       SetIText(itemhandle, pname);
-
-       /* Add "undefined" at the top of the popup menu. */
-       AppendMenu(popMenu, "\pundefined");
-       /* Add an item separator. */
-       AppendMenu(popMenu, "\p(-");
-       /* Then append available color and terrain names. */
-       append_image_names(popMenu);
-
-       /* Change port and start the main loop */
-       GetPort(&oldport);
-       SetPort(win);
-       done = FALSE;
-       editflag = FALSE;
-       while (!done) {
-
-               /* Check length of popMenu */
-               n = CountMItems(popMenu);
-
-               /* Set popup1 to tmpName1 if found in menu */
-               GetDItem(win, diSideColorPopup1, NULL, &itemhandle, NULL);
-               SetCtlMax((ControlHandle) itemhandle, n);               /* Important! */
-               found = FALSE;
-               for (i = 1; i <= n; i++) {
-                       GetItem(popMenu, i, pname);
-                       p2c(pname, cname);
-                       if (strcmp(tmpName1, cname) != 0)
-                         continue;
-                       SetCtlValue((ControlHandle) itemhandle, i);
-                       found = TRUE;
-                       break;
-               }
-               if (!found) {                   /* Add tmpName1 to menu if necessary */
-                       n += 1;
-                       c2p(tmpName1, pname);
-                       AppendMenu(popMenu, pname);
-                       SetCtlMax((ControlHandle) itemhandle, n);       /* Important! */
-                       SetCtlValue((ControlHandle) itemhandle, n);
-               }
-               /* Set popup2 to tmpName2 if found in menu */
-               GetDItem(win, diSideColorPopup2, NULL, &itemhandle, NULL);
-               SetCtlMax((ControlHandle) itemhandle, n);               /* Important! */
-               found = FALSE;
-               for (i = 1; i <= n; i++) {
-                       GetItem(popMenu, i, pname);
-                       p2c(pname, cname);
-                       if (strcmp(tmpName2, cname) != 0)
-                         continue;
-                       SetCtlValue((ControlHandle) itemhandle, i);
-                       found = TRUE;
-                       break;
-               }
-               if (!found) {                   /* Add tmpName2 to menu if necessary */
-                       n += 1;
-                       c2p(tmpName2, pname);
-                       AppendMenu(popMenu, pname);
-                       SetCtlMax((ControlHandle) itemhandle, n);       /* Important! */
-                       SetCtlValue((ControlHandle) itemhandle, n);
-               }
-               /* Set popup3 to tmpName3 if found in menu */
-               GetDItem(win, diSideColorPopup3, NULL, &itemhandle, NULL);
-               SetCtlMax((ControlHandle) itemhandle, n);               /* Important! */
-               found = FALSE;
-               for (i = 1; i <= n; i++) {
-                       GetItem(popMenu, i, pname);
-                       p2c(pname, cname);
-                       if (strcmp(tmpName3, cname) != 0)
-                         continue;
-                       SetCtlValue((ControlHandle) itemhandle, i);
-                       found = TRUE;
-                       break;
-               }
-               if (!found) {                   /* Add tmpName3 to menu if necessary */
-                       n += 1;
-                       c2p(tmpName3, pname);
-                       AppendMenu(popMenu, pname);
-                       SetCtlMax((ControlHandle) itemhandle, n);       /* Important! */
-                       SetCtlValue((ControlHandle) itemhandle, n);
-               }
-
-               /* Set undefined colors to default forecolor & maskcolor */
-               if (!strcmp(tmpName1, "undefined"))
-                 tmpColor[1] = forecolor;
-               if (!strcmp(tmpName2, "undefined"))
-                 tmpColor[2] = forecolor;
-               if (!strcmp(tmpName3, "undefined"))
-                 tmpColor[3] = maskcolor;
-
-               /* Set split icons checkbox to correct value */
-               GetDItem(win, diSideColorSplit, NULL, &itemhandle, NULL);
-               SetCtlValue((ControlHandle) itemhandle, tmpSplit);
-               /* Enable or disable the half icon color item in the popup menu */
-               if (tmpSplit)
-                 EnableItem(useMenu, miHalfIconColor);
-               else
-                 DisableItem(useMenu, miHalfIconColor);
-
-               /* Set color use popup menus to correct initial values */
-               GetDItem(win, diSideColorUse1, NULL, &itemhandle, NULL);
-               /* Disable the whole menu if the color is undefined */
-               if (!strcmp(tmpName1, "undefined")) {
-                       tmpUse[1] = miNotInUse;
-                       HiliteControl((ControlHandle) itemhandle, 255);
-               } else
-                 HiliteControl((ControlHandle) itemhandle, 0); 
-               /* Dont permit half icon color if split icons is unchecked */
-               if (!tmpSplit && (tmpUse[1] == miHalfIconColor))
-                 tmpUse[1] = miNotInUse;
-               SetCtlValue((ControlHandle) itemhandle, tmpUse[1]);
-
-               GetDItem(win, diSideColorUse2, NULL, &itemhandle, NULL);
-               /* Disable the whole menu if the color is undefined */
-               if (!strcmp(tmpName2, "undefined")) {
-                       tmpUse[2] = miNotInUse;
-                       HiliteControl((ControlHandle) itemhandle, 255);
-               } else
-                 HiliteControl((ControlHandle) itemhandle, 0); 
-               /* Dont permit half icon color if split icons is unchecked */
-               if (!tmpSplit && (tmpUse[2] == miHalfIconColor))
-                 tmpUse[2] = miNotInUse;
-               SetCtlValue((ControlHandle) itemhandle, tmpUse[2]);
-
-               GetDItem(win, diSideColorUse3, NULL, &itemhandle, NULL);
-               /* Disable the whole menu if the color is undefined */
-               if (!strcmp(tmpName3, "undefined")) {
-                       tmpUse[3] = miNotInUse;
-                       HiliteControl((ControlHandle) itemhandle, 255);
-               } else
-                 HiliteControl((ControlHandle) itemhandle, 0); 
-               /* Dont permit half icon color if split icons is unchecked */
-               if (!tmpSplit && (tmpUse[3] == miHalfIconColor))
-                 tmpUse[3] = miNotInUse;
-               SetCtlValue((ControlHandle) itemhandle, tmpUse[3]);
-
-               /* Set icon plotting colors */
-               tmpMain = forecolor;
-               tmpHalf = forecolor;
-               tmpMask = maskcolor;
-               for (i = 1; i <= 3; i++) {
-                       if (tmpUse[i] == miMainIconColor)
-                         tmpMain = tmpColor[i];
-                       if (tmpUse[i] == miHalfIconColor)
-                         tmpHalf = tmpColor[i];
-                       if (tmpUse[i] == miIconMaskColor)
-                         tmpMask = tmpColor[i];
-               }
-
-               /* Open the window now (as late as possible) */
-               ShowWindow(win);
-               SetCursor(&QD(arrow));
-               draw_default_button(win, diSideColorOkButton);
-       
-               /* Draw background for sample icons */
-               GetDItem(win, diSideColorCyan, NULL, NULL, &itemrect);
-               ForeColor(cyanColor);
-               FillRect(&itemrect, QDPat(black));
-               GetDItem(win, diSideColorGreen, NULL, NULL, &itemrect);
-               ForeColor(greenColor);
-               FillRect(&itemrect, QDPat(black));
-               ForeColor(blackColor);
-               GetDItem(win, diSideColorFrame, NULL, NULL, &itemrect);
-               FrameRect(&itemrect);
-
-               /* Plot 5 sample icons (if available) */
-               for (i = 0; i <= 4; i++) {
-                       /* Skip now if we ran out of unit types */                      
-                       if (i > numutypes - 1)
-                            continue;
-                       /* Get the best unit image from family */
-                       uimg = best_image(uimages[i], 32, 32);
-                       macuimg = (MacImage *) uimg->hook;
-                       /* mac_init_cicn now always creates colricon. */
-                       if (!macuimg->colricon)
-                            mac_init_cicn(uimg);
-                       cicnhandle = (CIconHandle) macuimg->colricon;
-                       /* Get pixmap, bitmap & maskmap from cicn and set srcrect */
-                       bm = (*(cicnhandle))->iconBMap;
-                       mm = (*(cicnhandle))->iconMask;
-                       SetRect(&srcrect, 0, 0, bm.rowBytes * 8, bm.rowBytes * 8);
-                       /* Set destination and colors */
-                       GetDItem(win, diSideColorIcon1 + i, NULL, NULL, &itemrect);
-                       RGBForeColor(&tmpMain);
-                       RGBBackColor(&tmpMask);
-
-                       /* First plot the MaskMap srcBic using the icon mask color */
-                       CopyBits(&mm, &win->portBits, &srcrect, &itemrect, srcBic, NULL);
-                       /* Then plot the BitMap using the main icon color */ 
-                       CopyBits(&bm, &win->portBits, &srcrect, &itemrect, srcOr, NULL);
-                       /* Plot right half in half icon color, but only if the latter is defined */
-                       if (tmpUse[1] == 3 || tmpUse[2] == 3 || tmpUse[3] == 3) {
-                               RGBForeColor(&tmpHalf);
-                               srcrect.left = srcrect.right / 2;
-                               itemrect.left += (itemrect.right - itemrect.left) / 2;
-                               CopyBits(&bm, &win->portBits, &srcrect, &itemrect, srcOr, NULL);
-                       }
-                       /* Restore colors */
-                       ForeColor(blackColor);
-                       RGBBackColor(&tmpBack);
-               }
-
-               /* Paint temp colors into the color panes */
-               PenSize(2, 2);
-
-               GetDItem(win, diSideColorPane1, NULL, NULL, &itemrect);
-               if (strcmp(tmpName1, "undefined") == 0) {
-                       FillRect(&itemrect, QDPat(ltGray));
-               } else {
-                       RGBForeColor(&tmpColor[1]);
-                       FillRect(&itemrect, QDPat(black));
-                       ForeColor(blackColor);
-               }
-               FrameRect(&itemrect);
-
-               GetDItem(win, diSideColorPane2, NULL, NULL, &itemrect);
-               if (strcmp(tmpName2, "undefined") == 0) {
-                       FillRect(&itemrect, QDPat(ltGray));
-               } else {
-                       RGBForeColor(&tmpColor[2]);
-                       FillRect(&itemrect, QDPat(black));
-                       ForeColor(blackColor);
-               }
-               FrameRect(&itemrect);
-
-               GetDItem(win, diSideColorPane3, NULL, NULL, &itemrect);
-               if (strcmp(tmpName3, "undefined") == 0) {
-                       FillRect(&itemrect, QDPat(ltGray));
-               } else {
-                       RGBForeColor(&tmpColor[3]);
-                       FillRect(&itemrect, QDPat(black));
-                       ForeColor(blackColor);
-               }
-               FrameRect(&itemrect);
-
-               PenNormal();
-
-               /* Handle clicks on buttons, popup menus, color panes, check boxes & edit fields */
-               ModalDialog(NULL, &ditem);
-               switch (ditem) {
-
-                       /* Get name from popup menu, load the color and copy name into text field  */
-               case    diSideColorPopup1:
-                       GetDItem(win, ditem, NULL, &itemhandle, NULL);
-                       mitem = GetCtlValue((ControlHandle) itemhandle);
-                       GetItem(popMenu, mitem, pname);
-                       p2c(pname, tmpName1);
-                       tmpColor[1] = get_color(tmpName1);      /* May change tmpName1 to undefined! */
-                       c2p(tmpName1, pname);
-                       GetDItem(win, diSideColorName1, NULL, &itemhandle, NULL);
-                       SetIText(itemhandle, pname);
-               break;
-               case    diSideColorPopup2:
-                       GetDItem(win, ditem, NULL, &itemhandle, NULL);
-                       mitem = GetCtlValue((ControlHandle) itemhandle);
-                       GetItem(popMenu, mitem, pname);
-                       p2c(pname, tmpName2);
-                       tmpColor[2] = get_color(tmpName2);      /* May change tmpName2 to undefined! */
-                       c2p(tmpName2, pname);
-                       GetDItem(win, diSideColorName2, NULL, &itemhandle, NULL);
-                       SetIText(itemhandle, pname);
-               break;
-               case    diSideColorPopup3:
-                       GetDItem(win, ditem, NULL, &itemhandle, NULL);
-                       mitem = GetCtlValue((ControlHandle) itemhandle);
-                       GetItem(popMenu, mitem, pname);
-                       p2c(pname, tmpName3);
-                       tmpColor[3] = get_color(tmpName3);      /* May change tmpName3 to undefined! */
-                       c2p(tmpName3, pname);
-                       GetDItem(win, diSideColorName3, NULL, &itemhandle, NULL);
-                       SetIText(itemhandle, pname);
-               break;
-
-                       /* Get color use from popup menus and copy into tmpUse[i] */
-               case    diSideColorUse1:
-                       GetDItem(win, ditem, NULL, &itemhandle, NULL);
-                       tmpUse[1] = GetCtlValue((ControlHandle) itemhandle);
-                       if (strcmp(tmpName1, "") == 0) tmpUse[1] = miNotInUse;
-                       if (tmpUse[2] == tmpUse[1]) tmpUse[2] = miNotInUse;
-                       if (tmpUse[3] == tmpUse[1]) tmpUse[3] = miNotInUse;
-               break;
-               case    diSideColorUse2:
-                       GetDItem(win, ditem, NULL, &itemhandle, NULL);
-                       tmpUse[2] = GetCtlValue((ControlHandle) itemhandle);
-                       if (strcmp(tmpName2, "") == 0) tmpUse[2] = miNotInUse;
-                       if (tmpUse[1] == tmpUse[2]) tmpUse[1] = miNotInUse;
-                       if (tmpUse[3] == tmpUse[2]) tmpUse[3] = miNotInUse;
-               break;
-               case    diSideColorUse3:
-                       GetDItem(win, ditem, NULL, &itemhandle, NULL);
-                       tmpUse[3] = GetCtlValue((ControlHandle) itemhandle);
-                       if (strcmp(tmpName3, "") == 0) tmpUse[3] = miNotInUse;
-                       if (tmpUse[1] == tmpUse[3]) tmpUse[1] = miNotInUse;
-                       if (tmpUse[2] == tmpUse[3]) tmpUse[2] = miNotInUse;
-               break;
-
-                       /* Pick new color by clicking in a color pane */
-               case    diSideColorPane1:
-                       tmpColor[1] = pick_new_color(tmpColor[1], tmpName1);
-                       break;
-               case    diSideColorPane2:
-                       tmpColor[2] = pick_new_color(tmpColor[2], tmpName2);
-                       break;
-               case    diSideColorPane3:
-                       tmpColor[3] = pick_new_color(tmpColor[3], tmpName3);
-                       break;
-
-                       /* Toggle split icons checkbox */
-               case    diSideColorSplit:
-                       GetDItem(win, diSideColorSplit, NULL, &itemhandle, NULL);
-                       tmpSplit = !GetCtlValue((ControlHandle) itemhandle);
-                       SetCtlValue((ControlHandle) itemhandle, tmpSplit);
-                       break;
-
-                       /* Edit the text fields */
-               case    diSideColorName1:
-               case    diSideColorName2:
-               case    diSideColorName3:
-                       editflag = TRUE;                /* Set flag to save text instead of exit next time Return is hit */
-                       continue;                       /* Do NOT break if text is being edited! Continue instead */
-
-               case    diSideColorOkButton:
-                       if (editflag) {                 /* Save text fields instead of exit when flag is set */ 
-                               editflag = FALSE;               /* Clear flag to permit exit next time Return is hit */
-
-                               /* Check text fields for validity and then update temp colors */
-                               GetDItem(win, diSideColorName1, NULL, &itemhandle, NULL);
-                       GetIText(itemhandle, pname);
-                               p2c(pname, cname);
-                               if (valid_imf_name(cname)) {
-                                       tmpColor[1] = get_color(cname);         /* May change cname to undefined! */
-                                       strcpy(tmpName1, cname);
-                               } else {        
-                                       ParamText("\pSorry, Ò", pname, "\pÓ is not a valid color name. ", 
-                                                        "\pUse hyphens: Òdark-redÓ is OK but Òdark redÓ is not.");
-                                       button = Alert(aOneButtonAlert, NULL);
-                               }
-                               c2p(tmpName1, pname);
-                               SetIText(itemhandle, pname);            /* Update or restore the text field */
-
-                               GetDItem(win, diSideColorName2, NULL, &itemhandle, NULL);
-                       GetIText(itemhandle, pname);
-                               p2c(pname, cname);
-                               if (valid_imf_name(cname)) {
-                                       tmpColor[2] = get_color(cname);         /* May change cname to undefined! */
-                                       strcpy(tmpName2, cname);
-                               } else {
-                                       ParamText("\pSorry, Ò", pname, "\pÓ is not a valid color name. ", 
-                                                        "\pUse hyphens: Òdark-redÓ is OK but Òdark redÓ is not.");
-                                       button = Alert(aOneButtonAlert, NULL);
-                               }
-                               c2p(tmpName2, pname);
-                               SetIText(itemhandle, pname);            /* Update or restore the text field */
-
-                               GetDItem(win, diSideColorName3, NULL, &itemhandle, NULL);
-                       GetIText(itemhandle, pname);
-                               p2c(pname, cname);
-                               if (valid_imf_name(cname)) {
-                                       tmpColor[3] = get_color(cname);         /* May change cname to undefined! */
-                                       strcpy(tmpName3, cname);
-                               } else {        
-                                       ParamText("\pSorry, Ò", pname, "\pÓ is not a valid color name. ", 
-                                                        "\pUse hyphens: Òdark-redÓ is OK but Òdark redÓ is not.");
-                                       button = Alert(aOneButtonAlert, NULL);
-                               }
-                               c2p(tmpName3, pname);
-                               SetIText(itemhandle, pname);            /* Update or restore the text field */
-
-                               break;
-
-                       } else {        /* Update everything and exit the dialog */
-
-                               /* Update side colors */
-                               set_sideColor(e, 1, tmpColor[1]);
-                               set_sideColor(e, 2, tmpColor[2]);
-                               set_sideColor(e, 3, tmpColor[3]);
-
-                               /* Update side color names */
-                               set_sideColorName(e, 1, copy_string(tmpName1));
-                               set_sideColorName(e, 2, copy_string(tmpName2));
-                               set_sideColorName(e, 3, copy_string(tmpName3));
-
-                               /* Change "undefined" to empty string before proceeding */
-                               /* This is done to conform with the color scheme format */
-                               if (strcmp(tmpName1, "undefined") == 0)
-                                 strcpy(tmpName1, "");
-                               if (strcmp(tmpName2, "undefined") == 0)
-                                 strcpy(tmpName2, "");
-                               if (strcmp(tmpName3, "undefined") == 0)
-                                 strcpy(tmpName3, "");
-
-                               /* Build a new colorscheme */
-                               strcpy(tmpScheme,tmpName1);
-                               strcat(tmpScheme, ",");
-                               strcat(tmpScheme, tmpName2);
-                               strcat(tmpScheme, ",");
-                               strcat(tmpScheme, tmpName3);
-                               side_n(e)->colorscheme = copy_string(tmpScheme);
-
-                               /* Update color use parameters */
-                               main_icon_color[e] = 0;
-                               half_icon_color[e] = 0;
-                               icon_mask_color[e] = 0;
-                               for (i = 1; i <=3; i++) {
-                                       if (tmpUse[i] == miMainIconColor)
-                                         main_icon_color[e] = i;
-                                       if (tmpUse[i] == miHalfIconColor)
-                                         half_icon_color[e] = i;
-                                       if (tmpUse[i] == miIconMaskColor)
-                                         icon_mask_color[e] = i;
-                               }
-
-                               /* Set use of split icons */
-                               split_icon[e] = tmpSplit;
-
-                               done = TRUE;
-                               break;
-                       }
-
-               case    diSideColorCancelButton:
-                       done = TRUE;
-                       break;
-               
-               default:   /* Important to break here in order to reenter the while loop! */
-                       break;
-
-               }
-       }
-       SetPort(oldport);
-       DisposeDialog(win);
-       update_all_map_windows();
-}
-
-/* Set the colors of special features */
-
-void
-set_feature_color(int e)
-{
-       short editflag, ditem, mitem, button, found, done, i, n;  
-       char cname[32], tmpName[32];
-       Handle itemhandle, ppathandle;  
-       RGBColor tmpColor;
-       MenuHandle popMenu;
-       Rect itemrect;
-       GrafPtr oldport;
-       Str255 pname;
-       DialogPtr win;
-
-       /* Then check for color support */
-       if (!hasColorQD) {
-               ParamText("\pSorry, your mac does not support colors.", "\p", "\p", "\p");
-               button = Alert(aOneButtonAlert, NULL);
-               return;
-       } 
-
-       /* Get dialog window and popup menu */
-       win = GetNewDialog(dFeatureColor, NULL, (DialogPtr) -1);
-       popMenu = GetMenu(mSideColorPopup);
-
-       /* Load current color & name into temps */
-       strcpy(tmpName, featColorName[e]);
-       tmpColor = featColor[e];
-
-       /* Load temp name into the text field */
-       GetDItem(win, diFeatureColorName, NULL, &itemhandle, NULL);
-       c2p(tmpName, pname);
-       SetIText(itemhandle, pname);
-
-       /* Append available color and terrain names to the popup menu. */
-       append_image_names(popMenu);
-       
-       /* Change port and start the main loop */
-       GetPort(&oldport);
-       SetPort(win);
-       done = FALSE;
-       editflag = FALSE;
-       while (!done) {
-
-               /* Check length of popMenu */
-               n = CountMItems(popMenu);
-
-               /* Set popup to tmpName if found in menu */
-               GetDItem(win, diFeatureColorPopup, NULL, &itemhandle, NULL);
-               SetCtlMax((ControlHandle) itemhandle, n);                       /* Important! */
-               found = FALSE;
-               for (i = 1; i <= n; i++) {
-                       GetItem(popMenu, i, pname);
-                       p2c(pname, cname);
-                       if (strcmp(tmpName, cname) != 0)
-                         continue;
-                       SetCtlValue((ControlHandle) itemhandle, i);
-                       found = TRUE;
-                         break;
-               }
-               if (!found) {                           /* Add tmpName to menu if necessary */
-                       c2p(tmpName, pname);
-                       AppendMenu(popMenu, pname);
-                       SetCtlMax((ControlHandle) itemhandle, n + 1);   /* Important! */
-                       SetCtlValue((ControlHandle) itemhandle, n + 1);
-               }
-
-               /* Open the window now (as late as possible) */
-               ShowWindow(win);
-               SetCursor(&QD(arrow));
-               draw_default_button(win, diFeatureColorOkButton);
-       
-               /* Paint temp color into the color pane */
-               PenSize(2, 2);
-               GetDItem(win, diFeatureColorPane, NULL, NULL, &itemrect);
-               RGBForeColor(&tmpColor);
-               FillRect(&itemrect, QDPat(black));
-               ForeColor(blackColor);
-               FrameRect(&itemrect);
-               PenNormal();
-
-               /* Handle clicks on buttons, popup menus, and color panes */
-               ModalDialog(NULL, &ditem);
-               switch (ditem) {
-
-                       /* Get name from popup menu, copy into text field, and load the color */
-               case    diFeatureColorPopup:
-                       GetDItem(win, ditem, NULL, &itemhandle, NULL);
-                       mitem = GetCtlValue((ControlHandle) itemhandle);
-                       GetItem(popMenu, mitem, pname);
-                       GetDItem(win, diFeatureColorName, NULL, &itemhandle, NULL);
-                       SetIText(itemhandle, pname);
-                       p2c(pname, tmpName);
-                       tmpColor = get_color(tmpName);
-                       break;
-
-                       /* Pick new color by clicking in a color pane */
-               case    diFeatureColorPane:
-                       tmpColor = pick_new_color(tmpColor, tmpName);
-                       break;
-
-                       /* The text field is being edited */
-               case    diFeatureColorName:
-                       editflag = TRUE;                /* Set flag to save text instead of exit next time OK is hit */
-                       continue;                       /* Do NOT break if text is being edited! Continue instead */
-
-               case    diFeatureColorOkButton:
-                       if (editflag) {                 /* Save text fields instead of exit when flag is set */ 
-                               editflag = FALSE;               /* Clear flag to permit exit next time OK is hit */
-
-                               /* Check text field for validity and then update temp color */
-                               GetDItem(win, diFeatureColorName, NULL, &itemhandle, NULL);
-                               GetIText(itemhandle, pname);
-                               p2c(pname, cname);
-                               if (valid_imf_name(cname)) {
-                                       strcpy(tmpName, cname);
-                                       tmpColor = get_color(tmpName);
-                               } else {
-                                       ParamText("\pSorry, Ò", pname, "\pÓ is not a valid color name. ", 
-                                                        "\pUse hyphens: Òdark-redÓ is OK, Òdark redÓ is not.");
-                                       button = Alert(aOneButtonAlert, NULL);
-                                       c2p(tmpName, pname);
-                                       SetIText(itemhandle, pname);            /* Restore old text */
-                               } 
-                               break;
-
-                       } else {        /* Update everything and exit the dialog */
-
-                               featColor[e] = tmpColor;
-                               featColorName[e] = copy_string(tmpName);
-
-                               /* This is now checked only once, instead of every time a map is redrawn. */
-                               if (strcmp(gridcolor_name, unseencolor_name) == 0
-                                   || g_terrain_seen() || (dside)->see_all) {
-                                        grid_matches_unseen = TRUE;
-                               } else grid_matches_unseen = FALSE;
-
-                               ui_update_state();
-                               done = TRUE;
-                               break;
-                       }
-
-               case    diFeatureColorCancelButton:
-                       done = TRUE;
-                       break;
-               
-               default:   /* Important to break here in order to reenter the while loop! */
-                       break;
-
-               }
-       }
-       SetPort(oldport);
-       DisposeDialog(win);
-       update_all_map_windows();
-}
-
-/* Set color (or pattern) used to display the terrain */
-
-void
-set_terrain_color( Str255 tname)
-{
-       short editflag, ditem, mitem, button, found, done, i, n, e = -1;  
-       char cname[32], tmpName[32];
-       Handle itemhandle, ppathandle;  
-       RGBColor tmpColor;
-       MenuHandle popMenu;
-       MacImage *macimg;
-       Rect itemrect;
-       GrafPtr oldport;
-       Str255 pname;
-       ImageFamily *imf;
-       Image *img;
-       DialogPtr win;
-
-       /* Then check for color support */
-       if (!hasColorQD) {
-               ParamText("\pSorry, your mac does not support colors.", "\p", "\p", "\p");
-               button = Alert(aOneButtonAlert, NULL);
-               return;
-       } 
-
-       /* Get dialog window and popup menu */
-       win = GetNewDialog(dFeatureColor, NULL, (DialogPtr) -1);
-       popMenu = GetMenu(mSideColorPopup);
-
-       /* Load tname into the text field and get the corresponding color */
-       GetDItem(win, diFeatureColorName, NULL, &itemhandle, NULL);
-       SetIText(itemhandle, tname);
-       p2c(tname, tmpName);
-       tmpColor = get_color(tmpName);
-
-       /* Get the current terrain number from tmpName */
-       for_all_terrain_types(i) {
-               /* Use image names if they exist */
-               if (!empty_string(t_image_name(i))) {
-                       sanitize_for_menu(t_image_name(i), pname);
-                       /* Else use terrain names (may differ from image names) */
-               } else
-                 sanitize_for_menu(t_type_name(i), pname);
-               p2c(pname, cname);
-               if (strcmp(cname, tmpName) != 0)
-                 continue;
-               e = i; 
-               break;
-       }
-
-       /* Append available color and terrain names to the popup menu. */
-       append_image_names(popMenu);
-       
-       /* Change port and start the main loop */
-       GetPort(&oldport);
-       SetPort(win);
-       done = FALSE;
-       editflag = FALSE;
-       while (!done) {
-
-               /* Check length of popMenu and load the image family */
-               n = CountMItems(popMenu);
-               imf = get_imf(tmpName);
-               mac_load_imf(imf);
-
-               /* Set popup to tmpName if found in menu */
-               GetDItem(win, diFeatureColorPopup, NULL, &itemhandle, NULL);
-               SetCtlMax((ControlHandle) itemhandle, n);                       /* Important! */
-               found = FALSE;
-               for (i = 1; i <= n; i++) {
-                       GetItem(popMenu, i, pname);
-                       p2c(pname, cname);
-                       if (strcmp(tmpName, cname) != 0)
-                         continue;
-                       SetCtlValue((ControlHandle) itemhandle, i);
-                       found = TRUE; break;
-               }
-               if (!found) {                           /* Add tmpName to menu if necessary */
-                       c2p(tmpName, pname);
-                       AppendMenu(popMenu, pname);
-                       SetCtlMax((ControlHandle) itemhandle, n + 1);   /* Important! */
-                       SetCtlValue((ControlHandle) itemhandle, n + 1);
-               }
-
-               /* Open the window now (as late as possible) */
-               ShowWindow(win);
-               SetCursor(&QD(arrow));
-               draw_default_button(win, diFeatureColorOkButton);
-       
-               /* Paint terrain pattern into the color pane */
-               GetDItem(win, diFeatureColorPane, NULL, NULL, &itemrect);
-               img = best_image(imf, hws[5], hcs[5]);
-               macimg = (MacImage *) img->hook;
-               if (macimg->colrpat != NULL) {
-                       FillCRect(&itemrect, macimg->colrpat);
-               } else if (macimg->colordefined) {
-                       RGBForeColor(&macimg->color);
-                       PaintRect(&itemrect);
-                       ForeColor(blackColor);
-               }
-
-               /* Draw the frame */
-               PenSize(2, 2);
-               FrameRect(&itemrect);
-               PenNormal();
-
-               /* Handle clicks on buttons, popup menus, and color panes */
-               ModalDialog(NULL, &ditem);
-               switch (ditem) {
-
-                       /* Get name from popup menu, copy into text field, and load the color */
-               case    diFeatureColorPopup:
-                       GetDItem(win, ditem, NULL, &itemhandle, NULL);
-                       mitem = GetCtlValue((ControlHandle) itemhandle);
-                       GetItem(popMenu, mitem, pname);
-                       GetDItem(win, diFeatureColorName, NULL, &itemhandle, NULL);
-                       SetIText(itemhandle, pname);
-                       p2c(pname, tmpName);
-                       tmpColor = get_color(tmpName);
-               break;
-
-                       /* The text field is being edited */
-               case    diFeatureColorName:
-                       editflag = TRUE;                /* Set flag to save text instead of exit next time OK is hit */
-                       continue;                       /* Do NOT break if text is being edited! Continue instead */
-
-               case    diFeatureColorOkButton:
-                       if (editflag) {                 /* Save text fields instead of exit when flag is set */ 
-                               editflag = FALSE;               /* Clear flag to permit exit next time OK is hit */
-
-                               /* Check text field for validity and then update temp color */
-                               GetDItem(win, diFeatureColorName, NULL, &itemhandle, NULL);
-                       GetIText(itemhandle, pname);
-                               p2c(pname, cname);
-                               if (valid_imf_name(cname)) {
-                                       strcpy(tmpName, cname);
-                                       tmpColor = get_color(tmpName);
-                               } else {        /* Restore previous text */
-                                       ParamText("\pSorry, Ò", pname, "\pÓ is not a valid color name. ", 
-                                                        "\pUse hyphens: Òdark-redÓ is OK but Òdark redÓ is not.");
-                                       button = Alert(aOneButtonAlert, NULL);
-                                       c2p(tmpName, pname);
-                                       SetIText(itemhandle, pname);
-                               } 
-                               break;
-
-                       } else {        /* Update everything and exit the dialog */
-
-                               /* Replace timages[e] with the new image family. */
-                               timages[e] = imf;
-                               /* Recompute its best images. */
-                               for (i = 0; i < NUMPOWERS; ++i) {
-                                       img = best_image(timages[e], hws[i], hhs[i]);
-                                       if (img && e != -1) {
-                                               best_terrain_images[i * numttypes + e] = img;
-                                       }
-                               }
-                               /* Replace terrain colors used for solid color drawing */
-                               img = get_img(imf, 1, 1);
-                               if (img->hook && e != -1) {
-                                       macimg = (MacImage *) img->hook;
-                                       tcolors[e] = macimg;
-                               }
-                               done = TRUE;
-                               break;
-                       }
-
-               case    diFeatureColorCancelButton:
-                       done = TRUE;
-                       break;
-               
-               default:   /* Important to break here in order to reenter the while loop! */
-                       break;
-
-               }
-       }
-       SetPort(oldport);
-       DisposeDialog(win);
-       update_all_map_windows();
-}
-
-/* --- FUNCTIONS USED TO BUILD AND MAINTAIN MENUS -----------------------------------*/
-
-/* Insert side and feature names into the colors menu */
-
-void
-build_colors_menu(void)
-{
-       MenuHandle menu;
-       Str255 pname;
-       int i, t;
-
-       menu = GetMenu(mColors);
-       /* First load side names at the top of the menu */
-       /* Side 0 (Independents) is already in the menu */
-       for (i = 1; i <= numsides; i++) {
-               sanitize_for_menu(shortest_side_title(side_n(i), tmpbuf), pname);
-               InsMenuItem(menu, pname, i);
-       }
-       /* Then load feature names below first separator */
-       for (i = 0; i <= FEATURES; i++) {
-               sanitize_for_menu(featColorItemName[i], pname);
-               InsMenuItem(menu, pname, numsides + i + 2);
-       }
-       /* Then load terrain types below second separator */
-       for_all_terrain_types(t) {
-               sanitize_for_menu(t_type_name(t), pname);
-               InsMenuItem(menu, pname, numsides + FEATURES + t + 4);
-       }
-}
-
-void
-build_sides_menu(void)
-{
-       MenuHandle menu;
-       Str255 pname;
-       int i;
-
-       menu = GetMenu(mSidesPopup);
-       /* First load real side names for sides in play */
-       /* Side 0 (Independents) is already in the menu */
-       for (i = 1; i <= numsides; i++) {
-               sanitize_for_menu(shortest_side_title(side_n(i), tmpbuf), pname);
-               AppendMenu(menu, pname);
-       }
-       /* Then load side numbers for remaining sides */
-       for (i = numsides + 1; i <= MAXSIDES; i++) {
-               sprintf(tmpbuf, "Side %d", i);
-               sanitize_for_menu(tmpbuf, pname);
-               AppendMenu(menu, pname);
-       }
-}
-
-void
-build_features_menu(void)
-{
-       MenuHandle menu;
-       Str255 pname;
-       int i;
-
-       menu = GetMenu(mFeatPopup);
-       /* Load available feature names */
-       for (i = 0; i <= FEATURES; i++) {
-               sanitize_for_menu(featColorItemName[i], pname);
-               AppendMenu(menu, pname);
-       }
-}
-
-int
-append_image_names(MenuHandle menu)
-{
-       Handle  ppathandle;  
-       char            cname[32];
-       Str255  pname;
-       int             i, n, num = 0;
-
-       /* Use lib-mac Images file if available. */
-       n = GetResFileAttrs(images_refnum);
-       if (!ResError()) {
-               /* Load all available ppat colors into the popup menu. */
-               n = CountResources('ppat');
-               for (i = 1; i <= n; ++i ) {
-                       ppathandle = GetIndResource('ppat', i);
-                       GetResInfo(ppathandle, NULL, NULL, pname);
-                       /* Only use ppats that live in the Images file. */
-                       if (HomeResFile(ppathandle) != images_refnum)
-                               continue;
-                       p2c(pname, cname);
-                       /* Skip invalid names. */
-                       if (!valid_imf_name(cname))
-                               continue;
-                       AppendMenu(menu, pname);
-                       ++num;
-               }
-
-       /* Else use colors.imf and terrain.imf. */
-       } else {
-               /* First load all real colors. */
-               num += append_color_names(menu);
-               /* Then add an item separator. */
-               if (num)
-                   AppendMenu(menu, "\p(-");
-               /* Then load the terrain colors. */
-               num += append_terrain_names(menu);
-       }
-       return num;
-}
-
-int
-append_color_names(MenuHandle menu)
-{
-       int     num = 0, startlineno = 1, endlineno = 1;
-       LibraryPath *p;
-       Obj     *form;
-       FILE    *fp;
-
-       for_all_library_paths(p) {
-               make_pathname(p->path, "colors.imf", "", spbuf);
-               fp = open_file(spbuf, "r");
-               if (fp != NULL) {
-                       while ((form = read_form(fp, &startlineno, &endlineno)) != lispeof) {
-                               if (append_imf_name(form, menu))
-                                   ++num;
-                       }
-                       fclose(fp);
-                       return TRUE;
-               }
-       }
-               run_warning("Could not find your colors.imf file");
-               return FALSE;           
-       }
-
-int
-append_terrain_names(MenuHandle menu)
-{
-       int     num = 0, startlineno = 1, endlineno = 1;
-       LibraryPath *p;
-       Obj     *form;
-       FILE    *fp;
-
-       for_all_library_paths(p) {
-               make_pathname(p->path, "terrain.imf", "", spbuf);
-               fp = open_file(spbuf, "r");
-               if (fp != NULL) {
-                       while ((form = read_form(fp, &startlineno, &endlineno)) != lispeof) {
-                               if (append_imf_name(form, menu))
-                                   ++num;
-                       }
-                       fclose(fp);
-                       return TRUE;
-               }
-       }
-               run_warning("Could not find your terrain.imf file");
-       return FALSE;           
-}      
-
-int
-append_imf_name(Obj *form, MenuHandle menu)
-{
-       Str255  lastname, pname;
-       char            *name, cname[32];
-       Obj             *head;
-       
-       /* Ignore any non-lists. */
-       if (!consp(form))
-           return FALSE;
-       head = car(form);
-       /* Ignore any non-imf forms. */
-       if (!match_keyword(head, K_IMF))
-           return FALSE;
-       /* Ignore imf without a name. */
-       if (!stringp(cadr(form)))
-           return FALSE;
-       name = c_string(cadr(form));
-       /* Ignore invalid imf names. */
-       if (!valid_imf_name(name))
-           return FALSE;
-       /* Get the last item name in the menu. */
-       GetItem(menu, CountMItems(menu), lastname);
-       p2c(lastname, cname);
-       /* Skip if imf has the same name as last item. */
-       if (strcmp(name, cname) == NULL)
-           return FALSE;
-       c2p(name, pname);
-       AppendMenu(menu, pname);
-       return TRUE;
-}