/*
* Empire - A multi-player, client/server Internet based war game.
- * Copyright (C) 1986-2004, Dave Pare, Jeff Bailey, Thomas Ruschak,
+ * Copyright (C) 1986-2008, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure
*
* This program is free software; you can redistribute it and/or modify
*
* ---
*
- * See the "LEGAL", "LICENSE", "CREDITS" and "README" files for all the
- * related information and legal notices. It is expected that any future
- * projects/authors will amend these files as needed.
+ * See files README, COPYING and CREDITS in the root of the source
+ * tree for related information and legal notices. It is expected
+ * that future projects/authors will amend these files as needed.
*
* ---
*
* econfig-spec.h: Combined include for optlist.h and emp_config.c
+ *
+ * Known contributors to this file:
+ * Marc Olzheim, 2004
+ * Markus Armbruster, 2004-2007
*/
-\r
-/*\r
- * Preprocessor of MSC C++ 6.0 (VC98) is broken and chokes on empty\r
+
+/*
+ * This file declares econfig keys. It expand into the corresponding
+ * variable declarations if defined(EMP_CONFIG_H_OUTPUT), and into
+ * struct keymatch[] initializers if defined(EMP_CONFIG_C_OUTPUT).
+ *
+ * EMPCFBOTH() defines econfig keys. EMPCF_OPT() is a convenience
+ * wrapper for options. EMPCF_COMMENT() defines comments.
+ */
+
+/*
+ * Preprocessor of MSC C++ 6.0 (VC98) is broken and chokes on empty
* macro arguments. Fixed in MSC C++ 7.0. Work around: pass
* useless token `unused'.
*/
#if defined(EMP_CONFIG_C_OUTPUT)
-#define EMPCFONLYC(fvname, vname, vtype, ctype, num, descr) \
- { (fvname), (ctype), &(vname), (num), (descr) },
-#define EMPCFBOTH(fvname, vname, vtype, ctype, num, descr) \
- { (fvname), (ctype), &(vname), (num), (descr) },
+#define EMPCFONLYC(fvname, vname, vtype, ctype, flags, descr) \
+ { (fvname), (ctype), &(vname), (flags), (descr) },
+#define EMPCFBOTH(fvname, vname, vtype, ctype, flags, descr) \
+ { (fvname), (ctype), &(vname), (flags), (descr) },
#elif defined(EMP_CONFIG_H_OUTPUT)
-#define EMPCFONLYC(fvname, vname, vtype, ctype, num, descr)
-#define EMPCFBOTH(fvname, vname, vtype, ctype, num, descr) \
+#define EMPCFONLYC(fvname, vname, vtype, ctype, flags, descr)
+#define EMPCFBOTH(fvname, vname, vtype, ctype, flags, descr) \
extern vtype vname;
#endif /* EMP_CONFIG_C_OUTPUT || EMP_CONFIG_H_OUTPUT */
#define EMPCF_COMMENT(comment) \
EMPCFONLYC("", emp_config_dummy, unused , NSC_NOTYPE, 0, (comment))
-/* things that can be changed */
+#define EMPCF_OPT(fvname, vname, descr) \
+EMPCFBOTH((fvname), (vname), int, NSC_INT, KM_OPTION, (descr))
+
+/* econfig key definitions: */
+
EMPCF_COMMENT("\n### Server configuration and information")
-EMPCFBOTH("data", datadir, char *, NSC_STRING, KM_INTERNAL,
- "Directory the data is stored in")
+EMPCFBOTH("custom_tables", custom_tables, char *, NSC_STRING, KM_INTERNAL,
+ "Custom configuration table files, separated by space")
+EMPCFBOTH("data", gamedir, char *, NSC_STRING, KM_INTERNAL,
+ "Directory where this game's data is stored")
+EMPCF_COMMENT("# Note: Use an absolute name here, the interpretation of a relative\n"
+ "# name may change.")
EMPCFBOTH("info", infodir, char *, NSC_STRING, KM_INTERNAL,
- "Directory the info pages are stored in")
+ "Directory where info pages are stored, can be shared among games")
+EMPCF_COMMENT("# Note: Use an absolute name here, the interpretation of a relative\n"
+ "# name may change.")
+EMPCFBOTH("builtin", builtindir, char *, NSC_STRING, KM_INTERNAL,
+ "Directory where builtin files are stored")
+EMPCF_COMMENT("# Set this to your source tree's src/lib/global to run the server\n"
+ "# without installing it, else leave it alone.")
+EMPCFBOTH("listen_addr", listen_addr, char *, NSC_STRING, KM_INTERNAL,
+ "Local IP address the server should listen on.")
+EMPCF_COMMENT("# \"\" listens on all, localhost just on the loopback interface")
EMPCFBOTH("port", loginport, char *, NSC_STRING, KM_INTERNAL,
- "TCP/IP port the server will start up on")
+ "TCP port the server will bind")
+EMPCFBOTH("keep_journal", keep_journal, int, NSC_INT, KM_INTERNAL,
+ "Enable journal log file")
EMPCFBOTH("privname", privname, char *, NSC_STRING, 0,
"Name of the deity")
EMPCFBOTH("privlog", privlog, char *, NSC_STRING, 0,
"E-mail of the deity")
+EMPCFBOTH("privip", privip, char *, NSC_STRING, KM_INTERNAL,
+ "Deities may connect from these IPs or networks, \"\" allows all")
EMPCFBOTH("WORLD_X", WORLD_X, int, NSC_INT, 0,
"World size X dimension (enforced to be even by subtracting 1 if necessary)")
EMPCFBOTH("WORLD_Y", WORLD_Y, int, NSC_INT, 0,
"World size Y dimension")
-EMPCF_COMMENT("\n\n### Update policy")
-EMPCFBOTH("update_policy", update_policy, int, NSC_INT, 0,
- "0 - normal, 1 - update_times, 2 - blitz, 3 - demand only")
+EMPCF_COMMENT("\n\n### Update policy\n\n"
+ "# Note: the update schedule is defined in the file schedule in the\n"
+ "# same directory as this file.")
EMPCFBOTH("etu_per_update", etu_per_update, int, NSC_INT, 0,
"Number of ETUs per update")
-EMPCFBOTH("s_p_etu", s_p_etu, int, NSC_INT, 0,
- "Seconds per etu, updates will occur every s_p_etu * etu_per_update seconds")
-EMPCFBOTH("adj_update", adj_update, int, NSC_INT, KM_INTERNAL,
- "Move the update forward or backward (in seconds)")
EMPCFBOTH("update_window", update_window, int, NSC_INT, 0,
- "Window the update will occur in (in seconds) before and after the update time")
-EMPCFBOTH("update_times", update_times, char *, NSC_STRING, 0,
- "Times when updates occur under policy #1. Must coincide with schedule.")
-EMPCFBOTH("hourslop", hourslop, int, NSC_INT, KM_INTERNAL,
- "Number of minutes update check can slip to match update_times")
-EMPCFBOTH("blitz_time", blitz_time, int, NSC_INT, 0,
- "Number of minutes between updates under policy #2.")
-
-EMPCF_COMMENT("\n\n### Demand update policy")
-EMPCFBOTH("update_demandpolicy", update_demandpolicy, int, NSC_INT, 0,
- "0 - emp_tm checks, 1 - after setting, 2 - demand updates disabled")
+ "Time window the update will occur in after the update time, in seconds")
+EMPCFBOTH("pre_update_hook", pre_update_hook, char *, NSC_STRING, KM_INTERNAL,
+ "Shell command run right before the update.")
+EMPCFBOTH("update_demand", update_demand, int, NSC_INT, 0,
+ "Demand update policy")
+EMPCF_COMMENT("# 0 - No demand updates\n"
+ "# 1 - Scheduled updates are demand updates\n"
+ "# 2 - Demand updates run right after the deciding vote is cast,\n"
+ "# in addition to (non-demand) scheduled updates\n")
EMPCFBOTH("update_wantmin", update_wantmin, int, NSC_INT, 0,
- "number of requests needed for demand update")
-EMPCFBOTH("update_missed", update_missed, int, NSC_INT, 0,
- "number of demand updates country can miss before veto update")
+ "Number of votes required for a demand update")
EMPCFBOTH("update_demandtimes", update_demandtimes, char *, NSC_STRING, 0,
- "Times when demand updates can occur. Ranges CANNOT cross midnight.")
+ "Times when unscheduled demand updates can occur, separated by space.")
+EMPCF_COMMENT("# Give time ranges as HOUR:MINUTE-HOUR:MINUTE, e.g. 20:00-24:00\n"
+ "# Ranges CANNOT cross midnight.")
EMPCF_COMMENT("\n\n### Game hours restrictions")
EMPCFBOTH("game_days", game_days, char *, NSC_STRING, 0,
- "Days game is up and running (Su Mo Tu We Th Fr Sa)")
+ "Days of week the game is up and running, separated by space")
+EMPCF_COMMENT("# Give days as Su Mo Tu We Th Fr Sa.")
EMPCFBOTH("game_hours", game_hours, char *, NSC_STRING, 0,
- "Hours game is up and running (6:00-18:00)")
-
-EMPCF_COMMENT("\n\n### Options\n")
-EMPCFONLYC("option", emp_config_dummy, unused , NSC_NOTYPE, 0, NULL)
-EMPCFONLYC("nooption", emp_config_dummy, unused , NSC_NOTYPE, 0, NULL)
+ "Time of day ranges when the game is open, separated by space.")
+EMPCF_COMMENT("# Give time ranges as HOUR:MINUTE-HOUR:MINUTE, e.g. 20:00-24:00\n"
+ "# Ranges CANNOT cross midnight.")
+EMPCF_COMMENT("\n\n### Options")
+EMPCF_OPT("ALL_BLEED", opt_ALL_BLEED,
+ "Let tech bleed to everyone, not just allies")
+EMPCF_OPT("AUTO_POWER", opt_AUTO_POWER,
+ "Power report is updated only automatically, at the update")
+EMPCF_OPT("BLITZ", opt_BLITZ,
+ "Enable blitz mode")
+EMPCF_OPT("BRIDGETOWERS", opt_BRIDGETOWERS,
+ "Allow bridge towers")
+EMPCF_OPT("EASY_BRIDGES", opt_EASY_BRIDGES,
+ "Allow bridge building without bridge heads")
+EMPCF_OPT("FALLOUT", opt_FALLOUT,
+ "Enable secondary effects caused by radiation")
+EMPCF_OPT("FUEL", opt_FUEL,
+ "Make ships use fuel to move")
+EMPCF_OPT("GODNEWS", opt_GODNEWS,
+ "Inform the world when deities give/take away")
+EMPCF_OPT("GO_RENEW", opt_GO_RENEW,
+ "Make gold and oil renewable resources")
+EMPCF_OPT("GUINEA_PIGS", opt_GUINEA_PIGS,
+ "Enable experimental stuff not ready for prime time")
+EMPCF_OPT("HIDDEN", opt_HIDDEN,
+ "Hide information between players")
+EMPCF_OPT("INTERDICT_ATT", opt_INTERDICT_ATT,
+ "Interdict post-attack move in")
+EMPCF_OPT("LANDSPIES", opt_LANDSPIES,
+ "Enable the land unit type spies")
+EMPCF_OPT("LOANS", opt_LOANS,
+ "Allow bailing out of other countries via S&L scandals")
+EMPCF_OPT("LOSE_CONTACT", opt_LOSE_CONTACT,
+ "Let contact be lost after a few updates")
+EMPCF_OPT("MARKET", opt_MARKET,
+ "Enable time-based market and trading")
+EMPCF_OPT("MOB_ACCESS", opt_MOB_ACCESS,
+ "Update mobility in real-time rather than at the update")
+EMPCF_OPT("NOFOOD", opt_NOFOOD,
+ "Disable food consumption")
+EMPCF_OPT("NOMOBCOST", opt_NOMOBCOST,
+ "Don't charge mobility for firing from ships")
+EMPCF_OPT("NO_FORT_FIRE", opt_NO_FORT_FIRE,
+ "Disable fortress fire")
+EMPCF_OPT("NO_PLAGUE", opt_NO_PLAGUE,
+ "Disable plague")
+EMPCF_OPT("PINPOINTMISSILE", opt_PINPOINTMISSILE,
+ "Enable marine missiles")
+EMPCF_OPT("RES_POP", opt_RES_POP,
+ "Population is limited by research")
+EMPCF_OPT("SAIL", opt_SAIL,
+ "Enable sail command")
+EMPCF_OPT("SHOWPLANE", opt_SHOWPLANE,
+ "Show planes and land units embarked on ships or land units up for trade")
+EMPCF_OPT("SLOW_WAR", opt_SLOW_WAR,
+ "Declaring war takes time")
+EMPCF_OPT("SUPER_BARS", opt_SUPER_BARS,
+ "Make bars immune to damage")
+EMPCF_OPT("TECH_POP", opt_TECH_POP,
+ "Technology costs more as population rises")
+EMPCF_OPT("TRADESHIPS", opt_TRADESHIPS,
+ "Enable Tradeships")
+EMPCF_OPT("TREATIES", opt_TREATIES,
+ "Allow treaties")
EMPCF_COMMENT("\n\n### Countries")
EMPCFBOTH("btu_build_rate", btu_build_rate, float, NSC_FLOAT, 0,
"Players have their coordinate system at deity 0,0 (0 - no, 1 - yes)")
EMPCFBOTH("at_least_one_100", at_least_one_100, int, NSC_INT, KM_INTERNAL,
"Initialize new countries with at least one sector with 100 of all resource")
-EMPCFBOTH("powe_cost", powe_cost, double, NSC_DOUBLE, 0,
- "Number of BTUs needed to generate a new power report")
+EMPCFBOTH("start_cash", start_cash, long, NSC_LONG, KM_INTERNAL,
+ "Starting cash for new countries")
EMPCFBOTH("war_cost", War_Cost, int, NSC_INT, 0,
"Cost to declare war (if SLOW_WAR is on)")
EMPCFBOTH("startmob", startmob, int, NSC_INT, KM_INTERNAL,
"Starting mobility for sanctuaries")
EMPCFBOTH("sect_mob_scale", sect_mob_scale, float, NSC_FLOAT, 0,
- "Sector mobility accumulation (sect_mob_scale * ETUs per update)")
+ "Sector mobility accumulation per ETU")
EMPCFBOTH("sect_mob_max", sect_mob_max, int, NSC_INT, 0,
"Maximum mobility for sectors")
EMPCFBOTH("buil_bh", buil_bh, int, NSC_INT, 0,
EMPCF_COMMENT("\n\n### Land Units")
EMPCFBOTH("land_mob_scale", land_mob_scale, float, NSC_FLOAT, 0,
- "Land unit mobility accumulation (land_mob_scale * ETUs per update)")
-EMPCFBOTH("land_grow_scale", land_grow_scale, int, NSC_INT, 0,
- "How fast efficiency grows for land units each update (* ETUs)")
+ "Land unit mobility accumulation per ETU")
+EMPCFBOTH("land_grow_scale", land_grow_scale, float, NSC_FLOAT, 0,
+ "How fast efficiency grows for land units, per ETU")
EMPCFBOTH("land_mob_max", land_mob_max, int, NSC_INT, 0,
"Maximum mobility for land units")
EMPCFBOTH("money_land", money_land, double, NSC_DOUBLE, 0,
EMPCF_COMMENT("\n\n### Planes")
EMPCFBOTH("plane_mob_scale", plane_mob_scale, float, NSC_FLOAT, 0,
- "Plane mobility accumulation (plane_mob_scale * ETUs per update)")
-EMPCFBOTH("plane_grow_scale", plane_grow_scale, int, NSC_INT, 0,
- "How fast efficiency grows for planes each update (* ETUs)")
+ "Plane mobility accumulation per ETU")
+EMPCFBOTH("plane_grow_scale", plane_grow_scale, float, NSC_FLOAT, 0,
+ "How fast efficiency grows for planes each update, per ETU")
EMPCFBOTH("plane_mob_max", plane_mob_max, int, NSC_INT, 0,
"Maximum mobility for planes")
EMPCFBOTH("money_plane", money_plane, double, NSC_DOUBLE, 0,
EMPCF_COMMENT("\n\n### Ships")
EMPCFBOTH("ship_mob_scale", ship_mob_scale, float, NSC_FLOAT, 0,
- "Ship mobility accumulation (ship_mob_scale * ETUs per update)")
-EMPCFBOTH("ship_grow_scale", ship_grow_scale, int, NSC_INT, 0,
- "How fast efficiency grows for ships each update (* ETUs)")
+ "Ship mobility accumulation per ETU")
+EMPCFBOTH("ship_grow_scale", ship_grow_scale, float, NSC_FLOAT, 0,
+ "How fast efficiency grows for ships each update, per ETU")
EMPCFBOTH("ship_mob_max", ship_mob_max, int, NSC_INT, 0,
"Maximum mobility for ships")
EMPCFBOTH("money_ship", money_ship, double, NSC_DOUBLE, 0,
"Maximum range (in sectors) a land unit will try to interdict another country")
EMPCFBOTH("ship_max_interdiction_range", ship_max_interdiction_range, int, NSC_INT, 0,
"Maximum range (in sectors) a ship will try to interdict another country")
-EMPCFBOTH("flakscale", flakscale, double, NSC_DOUBLE, 0,
+EMPCFBOTH("flakscale", flakscale, float, NSC_FLOAT, 0,
"Scale factor for flak damage")
EMPCFBOTH("combat_mob", combat_mob, double, NSC_DOUBLE, 0,
"How much mobility do units spend for combat (* casualties/bodies)")
EMPCFBOTH("fire_range_factor", fire_range_factor, float, NSC_FLOAT, 0,
"Scale normal firing ranges by this amount")
EMPCFBOTH("sect_mob_neg_factor", sect_mob_neg_factor, int, NSC_INT, 0,
- "Amount of negative mobility a sector has after takeover (ETU / x) (MOB_ACCESS)")
+ "Initial mobility for MOB_ACCESS (etu_per_update / sect_mob_neg_factor)")
+EMPCF_COMMENT("# Applies to sector takeover, ship build, plane or land unit build or trade")
EMPCFBOTH("mission_mob_cost", mission_mob_cost, double, NSC_DOUBLE, 0,
"Cost to put something on a mission (percentage of max mob)")
EMPCFBOTH("fallout_spread", fallout_spread, double, NSC_DOUBLE, 0,
"Amount of fallout that leaks into surrounding sectors")
EMPCFBOTH("drnuke_const", drnuke_const, float, NSC_FLOAT, 0,
- "Amount of research to tech needed to build a nuke (if DR_NUKE is on)")
+ "Amount of research to tech needed to build a nuke, a common value is 0.33")
EMPCF_COMMENT("\n\n### Market/Trade")
EMPCFBOTH("MARK_DELAY", MARK_DELAY, int, NSC_INT, 0,
"Bonus your ally gets for you cashing in with them")
EMPCF_COMMENT("\n\n### Misc.")
+EMPCFBOTH("disabled_commands", disabled_commands, char *, NSC_STRING, KM_INTERNAL,
+ "Disabled commands, separated by space")
EMPCFBOTH("anno_keep_days", anno_keep_days, int, NSC_INT, KM_INTERNAL,
"How long until announcements expire (<0 means never)")
EMPCFBOTH("news_keep_days", news_keep_days, int, NSC_INT, KM_INTERNAL,
EMPCFBOTH("lost_items_timeout", lost_items_timeout, int, NSC_INT, KM_INTERNAL,
"Seconds before a lost item is timed out of the database")
+/* Sentinel */
EMPCFONLYC(NULL, emp_config_dummy, NULL, NSC_NOTYPE, 0, NULL)
-#undef EMPCFONLYC
-#undef EMPCFBOTH
+#undef EMPCFONLYC
+#undef EMPCFBOTH
#undef EMPCF_COMMENT