tAddition of a maximum value for integer configuration file variables. - vaccinewars - be a doctor and try to vaccinate the world
 (HTM) git clone git://src.adamsgaard.dk/vaccinewars
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 3246a0f16e74240421b047d76f53470c707621c6
 (DIR) parent 4b2ee96bbcd2229edce28a0a259d334b622e9822
 (HTM) Author: Ben Webb <ben@salilab.org>
       Date:   Mon, 23 Jun 2003 11:26:47 +0000
       
       Addition of a maximum value for integer configuration file variables.
       
       
       Diffstat:
         M src/dopewars.c                      |     275 ++++++++++++++++---------------
         M src/dopewars.h                      |       2 +-
       
       2 files changed, 144 insertions(+), 133 deletions(-)
       ---
 (DIR) diff --git a/src/dopewars.c b/src/dopewars.c
       t@@ -234,430 +234,435 @@ struct GLOBALS Globals[] = {
           * be set in a dopewars configuration file, or in the server. See
           * doc/configfile.html for more detailed explanations. */
          {&Port, NULL, NULL, NULL, NULL, "Port", N_("Network port to connect to"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 65535},
          {NULL, NULL, NULL, &HiScoreFile, NULL, "HiScoreFile",
       -   N_("Name of the high score file"), NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   N_("Name of the high score file"), NULL, NULL, 0, "", NULL, NULL, FALSE,
       +   0, 0},
          {NULL, NULL, NULL, &ServerName, NULL, "Server",
           N_("Name of the server to connect to"), NULL, NULL, 0, "", NULL,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &ServerMOTD, NULL, "ServerMOTD",
           N_("Server's welcome message of the day"), NULL, NULL, 0, "", NULL,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &BindAddress, NULL, "BindAddress",
           N_("Network address for the server to listen on"), NULL, NULL, 0, "",
       -   NULL, NULL, FALSE, 0},
       +   NULL, NULL, FALSE, 0, 0},
        #ifdef NETWORKING
          {NULL, &UseSocks, NULL, NULL, NULL, "Socks.Active",
           N_("TRUE if a SOCKS server should be used for networking"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
        #ifndef CYGWIN
          {NULL, &Socks.numuid, NULL, NULL, NULL, "Socks.NumUID",
           N_("TRUE if numeric user IDs should be used for SOCKS4"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
        #endif
          {NULL, NULL, NULL, &Socks.user, NULL, "Socks.User",
           N_("If not blank, the username to use for SOCKS4"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Socks.name, NULL, "Socks.Name",
           N_("The hostname of a SOCKS server to use"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {&Socks.port, NULL, NULL, NULL, NULL, "Socks.Port",
           N_("The port number of a SOCKS server to use"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 65535},
          {&Socks.version, NULL, NULL, NULL, NULL, "Socks.Version",
           N_("The version of the SOCKS protocol to use (4 or 5)"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 4},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 4, 5},
          {NULL, NULL, NULL, &Socks.authuser, NULL, "Socks.Auth.User",
           N_("Username for SOCKS5 authentication"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Socks.authpassword, NULL, "Socks.Auth.Password",
           N_("Password for SOCKS5 authentication"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, &MetaServer.Active, NULL, NULL, NULL, "MetaServer.Active",
           N_("TRUE if server should report to a metaserver"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &MetaServer.Name, NULL, "MetaServer.Name",
           N_("Metaserver name to report/get server details to/from"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {&MetaServer.Port, NULL, NULL, NULL, NULL, "MetaServer.Port",
           N_("Port for metaserver communication"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 65535},
          {NULL, NULL, NULL, &MetaServer.ProxyName, NULL, "MetaServer.ProxyName",
           N_("Name of a proxy for metaserver communication"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {&MetaServer.ProxyPort, NULL, NULL, NULL, NULL, "MetaServer.ProxyPort",
           N_("Port for communicating with the proxy server"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 65535},
          {NULL, NULL, NULL, &MetaServer.Path, NULL, "MetaServer.Path",
           N_("Path of the script on the metaserver"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &MetaServer.LocalName, NULL, "MetaServer.LocalName",
           N_("Preferred hostname of your server machine"), NULL, NULL, 0, "",
       -   NULL, NULL, FALSE, 0},
       +   NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &MetaServer.Password, NULL, "MetaServer.Password",
           N_("Authentication for LocalName with the metaserver"), NULL, NULL, 0,
       -   "", NULL, NULL, FALSE, 0},
       +   "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &MetaServer.Comment, NULL, "MetaServer.Comment",
           N_("Server description, reported to the metaserver"), NULL, NULL, 0, "",
       -   NULL, NULL, FALSE, 0},
       +   NULL, NULL, FALSE, 0, 0},
          {NULL, &MetaServer.UseSocks, NULL, NULL, NULL, "MetaServer.UseSocks",
           N_("If TRUE, use SOCKS for metaserver communication"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &MetaServer.authuser, NULL, "MetaServer.Auth.User",
           N_("Username for HTTP Basic authentication"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &MetaServer.authpassword, NULL,
           "MetaServer.Auth.Password",
           N_("Password for HTTP Basic authentication"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &MetaServer.proxyuser, NULL, "MetaServer.Proxy.User",
           N_("Username for HTTP Basic proxy authentication"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &MetaServer.proxypassword, NULL,
           "MetaServer.Proxy.Password",
           N_("Password for HTTP Basic proxy authentication"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
        #endif /* NETWORKING */
        #ifdef CYGWIN
          {NULL, &MinToSysTray, NULL, NULL, NULL, "MinToSysTray",
           N_("If TRUE, the server minimizes to the System Tray"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
        #else
          {NULL, &Daemonize, NULL, NULL, NULL, "Daemonize",
           N_("If TRUE, the server runs in the background"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &WebBrowser, NULL, "WebBrowser",
           N_("The command used to start your web browser"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
        #endif
          {&NumTurns, NULL, NULL, NULL, NULL, "NumTurns",
           N_("No. of game turns (if 0, game never ends)"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, -1},
          {&StartDate.day, NULL, NULL, NULL, NULL, "StartDate.Day",
           N_("Day of the month on which the game starts"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 1, 31},
          {&StartDate.month, NULL, NULL, NULL, NULL, "StartDate.Month",
           N_("Month in which the game starts"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 1, 12},
          {&StartDate.year, NULL, NULL, NULL, NULL, "StartDate.Year",
           N_("Year in which the game starts"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, -1},
          {NULL, NULL, NULL, &Currency.Symbol, NULL, "Currency.Symbol",
           N_("The currency symbol (e.g. $)"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, &Currency.Prefix, NULL, NULL, NULL, "Currency.Prefix",
           N_("If TRUE, the currency symbol precedes prices"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Log.File, NULL, "Log.File",
           N_("File to write log messages to"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {&Log.Level, NULL, NULL, NULL, NULL, "Log.Level",
           N_("Controls the number of log messages produced"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 5},
          {NULL, NULL, NULL, &Log.Timestamp, NULL, "Log.Timestamp",
           N_("strftime() format string for log timestamps"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, &Sanitized, NULL, NULL, NULL, "Sanitized",
       -   N_("Random events are sanitized"), NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   N_("Random events are sanitized"), NULL, NULL, 0, "", NULL, NULL, FALSE,
       +   0, 0},
          {NULL, &DrugValue, NULL, NULL, NULL, "DrugValue",
           N_("TRUE if the value of bought drugs should be saved"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, &ConfigVerbose, NULL, NULL, NULL, "ConfigVerbose",
           N_("Be verbose in processing config file"), NULL, NULL, 0, "", NULL,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, 0},
          {&NumLocation, NULL, NULL, NULL, NULL, "NumLocation",
           N_("Number of locations in the game"),
           (void **)(&Location), NULL, sizeof(struct LOCATION), "", NULL,
       -   ResizeLocations, FALSE, 1},
       +   ResizeLocations, FALSE, 1, -1},
          {&NumCop, NULL, NULL, NULL, NULL, "NumCop",
           N_("Number of types of cop in the game"),
       -   (void **)(&Cop), NULL, sizeof(struct COP), "", NULL, ResizeCops, FALSE, 0},
       +   (void **)(&Cop), NULL, sizeof(struct COP), "", NULL, ResizeCops, FALSE,
       +   0, -1},
          {&NumGun, NULL, NULL, NULL, NULL, "NumGun",
           N_("Number of guns in the game"),
       -   (void **)(&Gun), NULL, sizeof(struct GUN), "", NULL, ResizeGuns, FALSE, 0},
       +   (void **)(&Gun), NULL, sizeof(struct GUN), "", NULL, ResizeGuns, FALSE,
       +   0, -1},
          {&NumDrug, NULL, NULL, NULL, NULL, "NumDrug",
           N_("Number of drugs in the game"),
           (void **)(&Drug), NULL, sizeof(struct DRUG), "", NULL, ResizeDrugs,
       -   FALSE, 1},
       +   FALSE, 1, -1},
          {&LoanSharkLoc, NULL, NULL, NULL, NULL, "LoanShark",
       -   N_("Location of the Loan Shark"), NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   N_("Location of the Loan Shark"), NULL, NULL, 0, "", NULL, NULL, FALSE,
       +   0, 0},
          {&BankLoc, NULL, NULL, NULL, NULL, "Bank", N_("Location of the bank"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {&GunShopLoc, NULL, NULL, NULL, NULL, "GunShop",
           N_("Location of the gun shop"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {&RoughPubLoc, NULL, NULL, NULL, NULL, "RoughPub",
           N_("Location of the pub"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {&DebtInterest, NULL, NULL, NULL, NULL, "DebtInterest",
           N_("Daily interest rate on the loan shark debt"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, -100},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, -100, -200},
          {&BankInterest, NULL, NULL, NULL, NULL, "BankInterest",
           N_("Daily interest rate on your bank balance"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, -100},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, -100, -200},
          {NULL, NULL, NULL, &Names.LoanSharkName, NULL, "LoanSharkName",
       -   N_("Name of the loan shark"), NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   N_("Name of the loan shark"), NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Names.BankName, NULL, "BankName",
       -   N_("Name of the bank"), NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   N_("Name of the bank"), NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Names.GunShopName, NULL, "GunShopName",
       -   N_("Name of the gun shop"), NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   N_("Name of the gun shop"), NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Names.RoughPubName, NULL, "RoughPubName",
       -   N_("Name of the pub"), NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   N_("Name of the pub"), NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, &UseSounds, NULL, NULL, NULL, "UseSounds",
           N_("TRUE if sounds should be enabled"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.FightHit, NULL, "Sounds.FightHit",
           N_("Sound file played for a gun \"hit\""), NULL, NULL, 0, "",
       -   NULL, NULL, FALSE, 0},
       +   NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.FightMiss, NULL, "Sounds.FightMiss",
           N_("Sound file played for a gun \"miss\""), NULL, NULL, 0, "",
       -   NULL, NULL, FALSE, 0},
       +   NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.FightReload, NULL, "Sounds.FightReload",
           N_("Sound file played when guns are reloaded"), NULL, NULL, 0, "",
       -   NULL, NULL, FALSE, 0},
       +   NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.EnemyBitchKilled, NULL, "Sounds.EnemyBitchKilled",
           N_("Sound file played when an enemy bitch/deputy is killed"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.BitchKilled, NULL, "Sounds.BitchKilled",
           N_("Sound file played when one of your bitches is killed"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.EnemyKilled, NULL, "Sounds.EnemyKilled",
           N_("Sound file played when another player or cop is killed"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.Killed, NULL, "Sounds.Killed",
           N_("Sound file played when you are killed"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.EnemyFailFlee, NULL, "Sounds.EnemyFailFlee",
           N_("Sound file played when a player tries to escape, but fails"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.FailFlee, NULL, "Sounds.FailFlee",
           N_("Sound file played when you try to escape, but fail"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.EnemyFlee, NULL, "Sounds.EnemyFlee",
           N_("Sound file played when a player successfully escapes"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.Flee, NULL, "Sounds.Flee",
           N_("Sound file played when you successfully escape"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.Jet, NULL, "Sounds.Jet",
           N_("Sound file played on arriving at a new location"), NULL, NULL, 0, "",
       -   NULL, NULL, FALSE, 0},
       +   NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.TalkToAll, NULL, "Sounds.TalkToAll",
           N_("Sound file played when a player sends a public chat message"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.TalkPrivate, NULL, "Sounds.TalkPrivate",
           N_("Sound file played when a player sends a private chat message"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.JoinGame, NULL, "Sounds.JoinGame",
           N_("Sound file played when a player joins the game"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.LeaveGame, NULL, "Sounds.LeaveGame",
           N_("Sound file played when a player leaves the game"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.StartGame, NULL, "Sounds.StartGame",
           N_("Sound file played at the start of the game"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Sounds.EndGame, NULL, "Sounds.EndGame",
           N_("Sound file played at the end of the game"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {&DrugSortMethod, NULL, NULL, NULL, NULL, "DrugSortMethod",
           N_("Sort key for listing available drugs"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 1, 4},
          {&FightTimeout, NULL, NULL, NULL, NULL, "FightTimeout",
           N_("No. of seconds in which to return fire"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, -1},
          {&IdleTimeout, NULL, NULL, NULL, NULL, "IdleTimeout",
           N_("Players are disconnected after this many seconds"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, -1},
          {&ConnectTimeout, NULL, NULL, NULL, NULL, "ConnectTimeout",
           N_("Time in seconds for connections to be made or broken"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, -1},
          {&MaxClients, NULL, NULL, NULL, NULL, "MaxClients",
           N_("Maximum number of TCP/IP connections"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, -1},
          {&AITurnPause, NULL, NULL, NULL, NULL, "AITurnPause",
           N_("Seconds between turns of AI players"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, -1},
          {NULL, NULL, &StartCash, NULL, NULL, "StartCash",
           N_("Amount of cash that each player starts with"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, -1},
          {NULL, NULL, &StartDebt, NULL, NULL, "StartDebt",
           N_("Amount of debt that each player starts with"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, -1},
          {NULL, NULL, NULL, &StaticLocation.Name, NULL, "Name",
           N_("Name of each location"), (void **)(&Location), &StaticLocation,
       -   sizeof(struct LOCATION), "Location", &NumLocation, NULL, FALSE, 0},
       +   sizeof(struct LOCATION), "Location", &NumLocation, NULL, FALSE, 0, -1},
          {&(StaticLocation.PolicePresence), NULL, NULL, NULL, NULL,
           "PolicePresence",
           N_("Police presence at each location (%)"),
           (void **)(&Location), &StaticLocation,
       -   sizeof(struct LOCATION), "Location", &NumLocation, NULL, FALSE, 0},
       +   sizeof(struct LOCATION), "Location", &NumLocation, NULL, FALSE, 0, 100},
          {&(StaticLocation.MinDrug), NULL, NULL, NULL, NULL, "MinDrug",
           N_("Minimum number of drugs at each location"),
           (void **)(&Location), &StaticLocation,
       -   sizeof(struct LOCATION), "Location", &NumLocation, NULL, FALSE, 1},
       +   sizeof(struct LOCATION), "Location", &NumLocation, NULL, FALSE, 1, -1},
          {&(StaticLocation.MaxDrug), NULL, NULL, NULL, NULL, "MaxDrug",
           N_("Maximum number of drugs at each location"),
           (void **)(&Location), &StaticLocation,
       -   sizeof(struct LOCATION), "Location", &NumLocation, NULL, FALSE, 1},
       +   sizeof(struct LOCATION), "Location", &NumLocation, NULL, FALSE, 1, -1},
          {&PlayerArmour, NULL, NULL, NULL, NULL, "PlayerArmour",
           N_("% resistance to gunshots of each player"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 100},
          {&BitchArmour, NULL, NULL, NULL, NULL, "BitchArmour",
           N_("% resistance to gunshots of each bitch"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 1},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 1, 100},
          {NULL, NULL, NULL, &StaticCop.Name, NULL, "Name",
           N_("Name of each cop"),
           (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &StaticCop.DeputyName, NULL, "DeputyName",
           N_("Name of each cop's deputy"),
           (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &StaticCop.DeputiesName, NULL, "DeputiesName",
           N_("Name of each cop's deputies"),
           (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, 0},
          {&StaticCop.Armour, NULL, NULL, NULL, NULL, "Armour",
           N_("% resistance to gunshots of each cop"),
           (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop,
       -   NULL, FALSE, 1},
       +   NULL, FALSE, 1, 100},
          {&StaticCop.DeputyArmour, NULL, NULL, NULL, NULL, "DeputyArmour",
           N_("% resistance to gunshots of each deputy"),
           (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop,
       -   NULL, FALSE, 1},
       +   NULL, FALSE, 1, 100},
          {&StaticCop.AttackPenalty, NULL, NULL, NULL, NULL, "AttackPenalty",
           N_("Attack penalty relative to a player"),
           (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, 100},
          {&StaticCop.DefendPenalty, NULL, NULL, NULL, NULL, "DefendPenalty",
           N_("Defend penalty relative to a player"),
           (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, 100},
          {&StaticCop.MinDeputies, NULL, NULL, NULL, NULL, "MinDeputies",
           N_("Minimum number of accompanying deputies"),
           (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, -1},
          {&StaticCop.MaxDeputies, NULL, NULL, NULL, NULL, "MaxDeputies",
           N_("Maximum number of accompanying deputies"),
           (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, -1},
          {&StaticCop.GunIndex, NULL, NULL, NULL, NULL, "GunIndex",
           N_("Zero-based index of the gun that cops are armed with"),
           (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, -1},
          {&StaticCop.CopGun, NULL, NULL, NULL, NULL, "CopGun",
           N_("Number of guns that each cop carries"),
           (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, -1},
          {&StaticCop.DeputyGun, NULL, NULL, NULL, NULL, "DeputyGun",
           N_("Number of guns that each deputy carries"),
           (void **)(&Cop), &StaticCop, sizeof(struct COP), "Cop", &NumCop,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, -1},
          {NULL, NULL, NULL, &StaticDrug.Name, NULL, "Name",
           N_("Name of each drug"),
           (void **)(&Drug), &StaticDrug,
       -   sizeof(struct DRUG), "Drug", &NumDrug, NULL, FALSE, 0},
       +   sizeof(struct DRUG), "Drug", &NumDrug, NULL, FALSE, 0, 0},
          {NULL, NULL, &(StaticDrug.MinPrice), NULL, NULL, "MinPrice",
           N_("Minimum normal price of each drug"),
           (void **)(&Drug), &StaticDrug,
       -   sizeof(struct DRUG), "Drug", &NumDrug, NULL, FALSE, 1},
       +   sizeof(struct DRUG), "Drug", &NumDrug, NULL, FALSE, 1, -1},
          {NULL, NULL, &(StaticDrug.MaxPrice), NULL, NULL, "MaxPrice",
           N_("Maximum normal price of each drug"),
           (void **)(&Drug), &StaticDrug,
       -   sizeof(struct DRUG), "Drug", &NumDrug, NULL, FALSE, 1},
       +   sizeof(struct DRUG), "Drug", &NumDrug, NULL, FALSE, 1, -1},
          {NULL, &(StaticDrug.Cheap), NULL, NULL, NULL, "Cheap",
           N_("TRUE if this drug can be specially cheap"),
           (void **)(&Drug), &StaticDrug,
       -   sizeof(struct DRUG), "Drug", &NumDrug, NULL, FALSE, 0},
       +   sizeof(struct DRUG), "Drug", &NumDrug, NULL, FALSE, 0, 0},
          {NULL, &(StaticDrug.Expensive), NULL, NULL, NULL, "Expensive",
           N_("TRUE if this drug can be specially expensive"),
           (void **)(&Drug), &StaticDrug,
       -   sizeof(struct DRUG), "Drug", &NumDrug, NULL, FALSE, 0},
       +   sizeof(struct DRUG), "Drug", &NumDrug, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &StaticDrug.CheapStr, NULL, "CheapStr",
           N_("Message displayed when this drug is specially cheap"),
           (void **)(&Drug), &StaticDrug,
       -   sizeof(struct DRUG), "Drug", &NumDrug, NULL, FALSE, 0},
       +   sizeof(struct DRUG), "Drug", &NumDrug, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Drugs.ExpensiveStr1, NULL, "Drugs.ExpensiveStr1",
           N_("Format string used for expensive drugs 50% of time"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Drugs.ExpensiveStr2, NULL, "Drugs.ExpensiveStr2",
           N_("Format string used for expensive drugs 50% of time"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {&(Drugs.CheapDivide), NULL, NULL, NULL, NULL, "Drugs.CheapDivide",
           N_("Divider for drug price when it's specially cheap"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 1},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 1, -1},
          {&(Drugs.ExpensiveMultiply), NULL, NULL, NULL, NULL,
           "Drugs.ExpensiveMultiply",
           N_("Multiplier for specially expensive drug prices"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 1},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 1, -1},
          {NULL, NULL, NULL, &StaticGun.Name, NULL, "Name",
           N_("Name of each gun"),
           (void **)(&Gun), &StaticGun,
       -   sizeof(struct GUN), "Gun", &NumGun, NULL, FALSE, 0},
       +   sizeof(struct GUN), "Gun", &NumGun, NULL, FALSE, 0, 0},
          {NULL, NULL, &(StaticGun.Price), NULL, NULL, "Price",
           N_("Price of each gun"),
           (void **)(&Gun), &StaticGun,
       -   sizeof(struct GUN), "Gun", &NumGun, NULL, FALSE, 0},
       +   sizeof(struct GUN), "Gun", &NumGun, NULL, FALSE, 0, 0},
          {&(StaticGun.Space), NULL, NULL, NULL, NULL, "Space",
           N_("Space taken by each gun"),
           (void **)(&Gun), &StaticGun,
       -   sizeof(struct GUN), "Gun", &NumGun, NULL, FALSE, 0},
       +   sizeof(struct GUN), "Gun", &NumGun, NULL, FALSE, 0, -1},
          {&(StaticGun.Damage), NULL, NULL, NULL, NULL, "Damage",
           N_("Damage done by each gun"),
           (void **)(&Gun), &StaticGun,
       -   sizeof(struct GUN), "Gun", &NumGun, NULL, FALSE, 0},
       +   sizeof(struct GUN), "Gun", &NumGun, NULL, FALSE, 0, -1},
          {NULL, NULL, NULL, &Names.Bitch, NULL, "Names.Bitch",
           N_("Word used to denote a single \"bitch\""), NULL, NULL, 0, "", NULL,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Names.Bitches, NULL, "Names.Bitches",
           N_("Word used to denote two or more \"bitches\""),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Names.Gun, NULL, "Names.Gun",
           N_("Word used to denote a single gun or equivalent"), NULL, NULL, 0, "",
       -   NULL, NULL, FALSE, 0},
       +   NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Names.Guns, NULL, "Names.Guns",
           N_("Word used to denote two or more guns"), NULL, NULL, 0, "", NULL,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Names.Drug, NULL, "Names.Drug",
           N_("Word used to denote a single drug or equivalent"), NULL, NULL, 0,
       -   "", NULL, NULL, FALSE, 0},
       +   "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Names.Drugs, NULL, "Names.Drugs",
           N_("Word used to denote two or more drugs"), NULL, NULL, 0, "", NULL,
       -   NULL, FALSE, 0},
       +   NULL, FALSE, 0, 0},
          {NULL, NULL, NULL, &Names.Date, NULL, "Names.Date",
           N_("strftime() format string for displaying the game turn"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, 0},
          {NULL, NULL, &Prices.Spy, NULL, NULL, "Prices.Spy",
           N_("Cost for a bitch to spy on the enemy"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, -1},
          {NULL, NULL, &Prices.Tipoff, NULL, NULL, "Prices.Tipoff",
           N_("Cost for a bitch to tipoff the cops to an enemy"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, -1},
          {NULL, NULL, &Bitch.MinPrice, NULL, NULL, "Bitch.MinPrice",
           N_("Minimum price to hire a bitch"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, -1},
          {NULL, NULL, &Bitch.MaxPrice, NULL, NULL, "Bitch.MaxPrice",
           N_("Maximum price to hire a bitch"),
       -   NULL, NULL, 0, "", NULL, NULL, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, NULL, FALSE, 0, -1},
          {NULL, NULL, NULL, NULL, &SubwaySaying, "SubwaySaying",
           N_("List of things which you overhear on the subway"),
       -   NULL, NULL, 0, "", &NumSubway, ResizeSubway, FALSE, 0},
       +   NULL, NULL, 0, "", &NumSubway, ResizeSubway, FALSE, 0, 0},
          {&NumSubway, NULL, NULL, NULL, NULL, "NumSubwaySaying",
           N_("Number of subway sayings"),
       -   NULL, NULL, 0, "", NULL, ResizeSubway, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, ResizeSubway, FALSE, 0, -1},
          {NULL, NULL, NULL, NULL, &Playing, "Playing",
           N_("List of songs which you can hear playing"),
       -   NULL, NULL, 0, "", &NumPlaying, ResizePlaying, FALSE, 0},
       +   NULL, NULL, 0, "", &NumPlaying, ResizePlaying, FALSE, 0, 0},
          {&NumPlaying, NULL, NULL, NULL, NULL, "NumPlaying",
           N_("Number of playing songs"),
       -   NULL, NULL, 0, "", NULL, ResizePlaying, FALSE, 0},
       +   NULL, NULL, 0, "", NULL, ResizePlaying, FALSE, 0, -1},
          {NULL, NULL, NULL, NULL, &StoppedTo, "StoppedTo",
           N_("List of things which you can stop to do"),
       -   NULL, NULL, 0, "", &NumStoppedTo, ResizeStoppedTo, FALSE, 0},
       +   NULL, NULL, 0, "", &NumStoppedTo, ResizeStoppedTo, FALSE, 0, 0},
          {&NumStoppedTo, NULL, NULL, NULL, NULL, "NumStoppedTo",
           N_("Number of things which you can stop to do"),
       -   NULL, NULL, 0, "", NULL, ResizeStoppedTo, FALSE, 0}
       +   NULL, NULL, 0, "", NULL, ResizeStoppedTo, FALSE, 0, -1}
        };
        const int NUMGLOB = sizeof(Globals) / sizeof(Globals[0]);
        
       t@@ -2200,6 +2205,12 @@ static gboolean SetConfigValue(int GlobalIndex, int StructIndex,
                               GlobalName, Globals[GlobalIndex].MinVal);
                return FALSE;
              }
       +      if (Globals[GlobalIndex].MaxVal > Globals[GlobalIndex].MinVal
       +          && IntVal > Globals[GlobalIndex].MaxVal) {
       +        g_scanner_warn(scanner, _("%s can be no larger than %d - ignoring!"),
       +                       GlobalName, Globals[GlobalIndex].MaxVal);
       +        return FALSE;
       +      }
              if (Globals[GlobalIndex].ResizeFunc) {
                (*(Globals[GlobalIndex].ResizeFunc)) (IntVal);
                /* Displayed, for example, when you set NumDrug=10 to allow
 (DIR) diff --git a/src/dopewars.h b/src/dopewars.h
       t@@ -351,7 +351,7 @@ struct GLOBALS {
          int *MaxIndex;
          void (*ResizeFunc) (int NewNum);
          gboolean Modified;
       -  int MinVal;
       +  int MinVal, MaxVal;
        };
        
        struct CMDLINE {