2 * Empire - A multi-player, client/server Internet based war game.
3 * Copyright (C) 1986-2013, Dave Pare, Jeff Bailey, Thomas Ruschak,
4 * Ken Stevens, Steve McClure, Markus Armbruster
6 * Empire is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
21 * See files README, COPYING and CREDITS in the root of the source
22 * tree for related information and legal notices. It is expected
23 * that future projects/authors will amend these files as needed.
27 * econfig-spec.h: Combined include for optlist.h and emp_config.c
29 * Known contributors to this file:
31 * Markus Armbruster, 2004-2013
35 * This file declares econfig keys. It expand into the corresponding
36 * variable declarations if defined(EMP_CONFIG_H_OUTPUT), and into
37 * struct keymatch[] initializers if defined(EMP_CONFIG_C_OUTPUT).
39 * EMPCFBOTH() defines econfig keys. EMPCF_OPT() is a convenience
40 * wrapper for options. EMPCF_COMMENT() defines comments.
44 * Preprocessor of MSC C++ 6.0 (VC98) is broken and chokes on empty
45 * macro arguments. Fixed in MSC C++ 7.0. Work around: pass
46 * useless token `unused'.
49 #if defined(EMP_CONFIG_C_OUTPUT)
51 #define EMPCFONLYC(fvname, vname, vtype, ctype, flags, descr) \
52 { (fvname), (ctype), &(vname), (flags), (descr) },
53 #define EMPCFBOTH(fvname, vname, vtype, ctype, flags, descr) \
54 { (fvname), (ctype), &(vname), (flags), (descr) },
56 #elif defined(EMP_CONFIG_H_OUTPUT)
58 #define EMPCFONLYC(fvname, vname, vtype, ctype, flags, descr)
59 #define EMPCFBOTH(fvname, vname, vtype, ctype, flags, descr) \
62 #endif /* EMP_CONFIG_C_OUTPUT || EMP_CONFIG_H_OUTPUT */
64 #define EMPCF_COMMENT(comment) \
65 EMPCFONLYC("", emp_config_dummy, unused , NSC_NOTYPE, 0, (comment))
67 #define EMPCF_OPT(fvname, vname, descr) \
68 EMPCFBOTH((fvname), (vname), int, NSC_INT, KM_OPTION, (descr))
70 /* econfig key definitions: */
72 EMPCF_COMMENT("\n### Server configuration and information")
73 EMPCFBOTH("custom_tables", custom_tables, char *, NSC_STRING, KM_INTERNAL,
74 "Custom configuration table files, separated by space")
75 EMPCFBOTH("data", gamedir_conf, char *, NSC_STRING, KM_INTERNAL,
76 "Directory where this game's data is stored")
77 EMPCFBOTH("info", infodir_conf, char *, NSC_STRING, KM_INTERNAL,
78 "Directory where info pages are stored, can be shared among games")
79 EMPCF_COMMENT("# Set this to your build tree's info.nr to run the server without\n"
81 EMPCFBOTH("builtin", builtindir_conf, char *, NSC_STRING, KM_INTERNAL,
82 "Directory where builtin files are stored")
83 EMPCF_COMMENT("# Set this to your source tree's src/lib/global to run the server\n"
84 "# without installing it, else leave it alone.")
85 EMPCFBOTH("listen_addr", listen_addr, char *, NSC_STRING, KM_INTERNAL,
86 "Local IP address the server should listen on")
87 EMPCF_COMMENT("# \"\" listens on all, localhost just on the loopback interface.\n"
88 "# OpenBSD restriction: when the system has both IPv4 and IPv6\n"
89 "# addresses configured, \"\" listens on all IPv4 addresses, and \"::\"\n"
90 "# on all IPv6 addresses. There is no way to listen both on all IPv4\n"
91 "# and on all IPv6 interfaces.")
92 EMPCFBOTH("port", loginport, char *, NSC_STRING, KM_INTERNAL,
93 "TCP port the server will bind")
94 EMPCFBOTH("keep_journal", keep_journal, int, NSC_INT, KM_INTERNAL,
95 "Enable journal log file")
96 EMPCF_COMMENT("# 0 - Disabled\n"
97 "# 1 - Enabled, player output suppressed\n"
98 "# 2 - Enabled, log everything (big; rotating & compressing advised)\n")
99 EMPCFBOTH("post_crash_dump_hook", post_crash_dump_hook, char *, NSC_STRING, KM_INTERNAL,
100 "Shell command run right after a crash dump, in the game's data directory")
101 EMPCFBOTH("privname", privname, char *, NSC_STRING, 0,
103 EMPCFBOTH("privlog", privlog, char *, NSC_STRING, 0,
104 "E-mail of the deity")
105 EMPCFBOTH("privip", privip, char *, NSC_STRING, KM_INTERNAL,
106 "Deities may connect from these IPs or networks, \"\" allows all")
107 EMPCFBOTH("WORLD_X", WORLD_X, int, NSC_INT, 0,
108 "World size X dimension (enforced to be even by subtracting 1 if necessary)")
109 EMPCFBOTH("WORLD_Y", WORLD_Y, int, NSC_INT, 0,
110 "World size Y dimension")
112 EMPCF_COMMENT("\n\n### Update policy\n\n"
113 "# Note: the update schedule is defined in the file schedule in the\n"
114 "# same directory as this file.")
115 EMPCFBOTH("etu_per_update", etu_per_update, int, NSC_INT, 0,
116 "Number of ETUs per update")
117 EMPCFBOTH("update_window", update_window, int, NSC_INT, 0,
118 "Time window the update will occur in after the update time, in seconds")
119 EMPCFBOTH("pre_update_hook", pre_update_hook, char *, NSC_STRING, KM_INTERNAL,
120 "Shell command run right before the update, in the game's data directory")
121 EMPCFBOTH("update_demand", update_demand, int, NSC_INT, 0,
122 "Demand update policy")
123 EMPCF_COMMENT("# 0 - No demand updates\n"
124 "# 1 - Scheduled updates are demand updates\n"
125 "# 2 - Demand updates run right after the deciding vote is cast,\n"
126 "# in addition to (non-demand) scheduled updates")
127 EMPCFBOTH("update_wantmin", update_wantmin, int, NSC_INT, 0,
128 "Number of votes required for a demand update")
129 EMPCFBOTH("update_demandtimes", update_demandtimes, char *, NSC_STRING, 0,
130 "Times when unscheduled demand updates can occur, separated by space")
131 EMPCF_COMMENT("# Give time ranges as HOUR:MINUTE-HOUR:MINUTE, e.g. 20:00-24:00.\n"
132 "# Ranges CANNOT cross midnight.")
134 EMPCF_COMMENT("\n\n### Game hours restrictions")
135 EMPCFBOTH("game_days", game_days, char *, NSC_STRING, 0,
136 "Days of week the game is up and running, separated by space")
137 EMPCF_COMMENT("# Give days as Su Mo Tu We Th Fr Sa.")
138 EMPCFBOTH("game_hours", game_hours, char *, NSC_STRING, 0,
139 "Time of day ranges when the game is open, separated by space")
140 EMPCF_COMMENT("# Give time ranges as HOUR:MINUTE-HOUR:MINUTE, e.g. 20:00-24:00.\n"
141 "# Ranges CANNOT cross midnight.")
143 EMPCF_COMMENT("\n\n### Options")
144 EMPCF_OPT("ALL_BLEED", opt_ALL_BLEED,
145 "Let tech bleed to everyone, not just allies")
146 EMPCF_OPT("AUTO_POWER", opt_AUTO_POWER,
147 "Power report is updated only automatically, at the update")
148 EMPCF_OPT("BLITZ", opt_BLITZ,
150 EMPCF_OPT("BRIDGETOWERS", opt_BRIDGETOWERS,
151 "Allow bridge towers")
152 EMPCF_COMMENT("# If you enable this, make sure that bridge spans can produce\n"
153 "# sufficient avail. Depending on your etu_per_update, you may have\n"
154 "# to tweak buil_tower_bh, rollover_avail_max, or bridge span's maxpop.")
155 EMPCF_OPT("EASY_BRIDGES", opt_EASY_BRIDGES,
156 "Allow bridge building without bridge heads")
157 EMPCF_OPT("FALLOUT", opt_FALLOUT,
158 "Enable secondary effects caused by radiation")
159 EMPCF_OPT("GODNEWS", opt_GODNEWS,
160 "Inform the world when deities give/take away")
161 EMPCF_OPT("GO_RENEW", opt_GO_RENEW,
162 "Make gold and oil renewable resources")
163 EMPCF_OPT("GUINEA_PIGS", opt_GUINEA_PIGS,
164 "Enable experimental stuff not ready for prime time")
165 EMPCF_OPT("HIDDEN", opt_HIDDEN,
166 "Hide information between players")
167 EMPCF_OPT("INTERDICT_ATT", opt_INTERDICT_ATT,
168 "Interdict post-attack move in")
169 EMPCF_OPT("LOANS", opt_LOANS,
170 "Allow bailing out of other countries via S&L scandals")
171 EMPCF_OPT("LOSE_CONTACT", opt_LOSE_CONTACT,
172 "Let contact be lost after a few updates")
173 EMPCF_OPT("MARKET", opt_MARKET,
174 "Enable time-based market and trading")
175 EMPCF_OPT("MOB_ACCESS", opt_MOB_ACCESS,
176 "Update mobility in real-time rather than at the update")
177 EMPCF_OPT("NOFOOD", opt_NOFOOD,
178 "Disable food consumption")
179 EMPCF_OPT("NOMOBCOST", opt_NOMOBCOST,
180 "Don't charge mobility for firing from ships")
181 EMPCF_OPT("NO_FORT_FIRE", opt_NO_FORT_FIRE,
182 "Disable fortress fire")
183 EMPCF_OPT("NO_PLAGUE", opt_NO_PLAGUE,
185 EMPCF_OPT("RAILWAYS", opt_RAILWAYS,
186 "Highways double as rail")
187 EMPCF_OPT("RES_POP", opt_RES_POP,
188 "Population is limited by research")
189 EMPCF_OPT("SAIL", opt_SAIL,
190 "Enable sail command")
191 EMPCF_OPT("SUPER_BARS", opt_SUPER_BARS,
192 "Make bars immune to damage")
193 EMPCF_OPT("TECH_POP", opt_TECH_POP,
194 "Technology costs more as population rises")
195 EMPCF_OPT("TREATIES", opt_TREATIES,
198 EMPCF_COMMENT("\n\n### Countries")
199 EMPCFBOTH("btu_build_rate", btu_build_rate, float, NSC_FLOAT, 0,
200 "Rate at which BTUs accumulate (etu * civ * eff * btu_build_rate)")
201 EMPCFBOTH("m_m_p_d", m_m_p_d, int, NSC_INT, 0,
202 "Maximum minutes per day a country is allowed to be logged in")
203 EMPCFBOTH("max_btus", max_btus, int, NSC_INT, 0,
204 "Maximum number of BTUs a country can have")
205 EMPCFBOTH("max_idle", max_idle, int, NSC_INT, 0,
206 "Maximum number of minutes a player can sit idle while logged in")
207 EMPCFBOTH("max_idle_visitor", max_idle_visitor, int, NSC_INT, 0,
208 "Maximum number of minutes a visitor can sit idle while logged in")
209 EMPCFBOTH("login_grace_time", login_grace_time, int, NSC_INT, 0,
210 "Grace time for clients to complete login and logout (seconds)")
211 EMPCFBOTH("players_at_00", players_at_00, int, NSC_INT, 0,
212 "Players have their coordinate system at deity 0,0 (0 - no, 1 - yes)")
213 EMPCFBOTH("at_least_one_100", at_least_one_100, int, NSC_INT, KM_INTERNAL,
214 "Initialize new countries with at least one sector with 100 of all resource")
215 EMPCFBOTH("start_cash", start_cash, int, NSC_INT, KM_INTERNAL,
216 "Starting cash for new countries")
218 EMPCF_COMMENT("\n\n### Technology/Research/Education/Happiness")
219 EMPCFBOTH("easy_tech", easy_tech, float, NSC_FLOAT, 0,
220 "Amount of tech built with no penalty")
221 EMPCFBOTH("start_tech", start_technology, float, NSC_FLOAT, KM_INTERNAL,
222 "Starting technology for new countries")
223 EMPCFBOTH("start_happy", start_happiness, float, NSC_FLOAT, KM_INTERNAL,
224 "Starting happiness for new countries")
225 EMPCFBOTH("start_research", start_research, float, NSC_FLOAT, KM_INTERNAL,
226 "Starting research for new countries")
227 EMPCFBOTH("start_edu", start_education, float, NSC_FLOAT, KM_INTERNAL,
228 "Starting education for new countries")
229 EMPCFBOTH("level_age_rate", level_age_rate, float, NSC_FLOAT, 0,
230 "ETU rate at which tech decays (0 -> no decline)")
231 EMPCFBOTH("tech_log_base", tech_log_base, float, NSC_FLOAT, 0,
232 "Log base to apply to tech breakthroughs above the easy tech level")
233 EMPCFBOTH("ally_factor", ally_factor, float, NSC_FLOAT, 0,
234 "Shared tech with allies (1 / ally_factor)")
235 EMPCFBOTH("edu_avg", edu_avg, float, NSC_FLOAT, 0,
236 "Number of ETUs education is averaged over")
237 EMPCFBOTH("hap_avg", hap_avg, float, NSC_FLOAT, 0,
238 "Number of ETUs happiness is averaged over")
239 EMPCFBOTH("edu_cons", edu_cons, double, NSC_DOUBLE, 0,
240 "Education consumption (1 breakthrough per edu_cons)")
241 EMPCFBOTH("hap_cons", hap_cons, double, NSC_DOUBLE, 0,
242 "Happiness consumption (1 breakthrough per hap_cons)")
244 EMPCF_COMMENT("\n\n### Sectors")
245 EMPCFBOTH("startmob", startmob, int, NSC_INT, KM_INTERNAL,
246 "Starting mobility for sanctuaries")
247 EMPCFBOTH("sect_mob_scale", sect_mob_scale, float, NSC_FLOAT, 0,
248 "Sector mobility accumulation per ETU")
249 EMPCFBOTH("sect_mob_max", sect_mob_max, int, NSC_INT, 0,
250 "Maximum mobility for sectors")
251 EMPCFBOTH("buil_bh", buil_bh, int, NSC_INT, 0,
252 "Number of hcms required to build a bridge span")
253 EMPCFBOTH("buil_bc", buil_bc, double, NSC_DOUBLE, 0,
254 "Cash required to build a bridge span")
255 EMPCFBOTH("buil_bt", buil_bt, double, NSC_DOUBLE, 0,
256 "Technology required to build a bridge span")
257 EMPCFBOTH("buil_tower_bh", buil_tower_bh, int, NSC_INT, 0,
258 "Number of hcms required to build a bridge tower")
259 EMPCFBOTH("buil_tower_bc", buil_tower_bc, double, NSC_DOUBLE, 0,
260 "Cash required to build a bridge tower")
261 EMPCFBOTH("buil_tower_bt", buil_tower_bt, double, NSC_DOUBLE, 0,
262 "Technology required to build a bridge tower")
264 EMPCF_COMMENT("\n\n### Land Units")
265 EMPCFBOTH("land_mob_scale", land_mob_scale, float, NSC_FLOAT, 0,
266 "Land unit mobility accumulation per ETU")
267 EMPCFBOTH("land_grow_scale", land_grow_scale, float, NSC_FLOAT, 0,
268 "How fast efficiency grows for land units, per ETU")
269 EMPCFBOTH("land_mob_max", land_mob_max, int, NSC_INT, 0,
270 "Maximum mobility for land units")
271 EMPCFBOTH("money_land", money_land, double, NSC_DOUBLE, 0,
272 "Cost per ETU to maintain land units (fraction of unit price)")
273 EMPCFBOTH("morale_base", morale_base, int, NSC_INT, KM_INTERNAL,
274 "Base level for setting morale of land units")
276 EMPCF_COMMENT("\n\n### Planes")
277 EMPCFBOTH("plane_mob_scale", plane_mob_scale, float, NSC_FLOAT, 0,
278 "Plane mobility accumulation per ETU")
279 EMPCFBOTH("plane_grow_scale", plane_grow_scale, float, NSC_FLOAT, 0,
280 "How fast efficiency grows for planes each update, per ETU")
281 EMPCFBOTH("plane_mob_max", plane_mob_max, int, NSC_INT, 0,
282 "Maximum mobility for planes")
283 EMPCFBOTH("money_plane", money_plane, double, NSC_DOUBLE, 0,
284 "Cost per ETU to maintain planes (fraction of plane price)")
286 EMPCF_COMMENT("\n\n### Ships")
287 EMPCFBOTH("ship_mob_scale", ship_mob_scale, float, NSC_FLOAT, 0,
288 "Ship mobility accumulation per ETU")
289 EMPCFBOTH("ship_grow_scale", ship_grow_scale, float, NSC_FLOAT, 0,
290 "How fast efficiency grows for ships each update, per ETU")
291 EMPCFBOTH("ship_mob_max", ship_mob_max, int, NSC_INT, 0,
292 "Maximum mobility for ships")
293 EMPCFBOTH("money_ship", money_ship, double, NSC_DOUBLE, 0,
294 "Cost per ETU to maintain ships (fraction of ship price)")
295 EMPCFBOTH("torpedo_damage", torpedo_damage, int, NSC_INT, 0,
296 "Torpedo damage (damage is X + 1dX + 1dX)")
298 EMPCF_COMMENT("\n\n### Combat/Damage")
299 EMPCFBOTH("fort_max_interdiction_range", fort_max_interdiction_range, int, NSC_INT, 0,
300 "Maximum range (in sectors) a fort will try to interdict another country")
301 EMPCFBOTH("land_max_interdiction_range", land_max_interdiction_range, int, NSC_INT, 0,
302 "Maximum range (in sectors) a land unit will try to interdict another country")
303 EMPCFBOTH("ship_max_interdiction_range", ship_max_interdiction_range, int, NSC_INT, 0,
304 "Maximum range (in sectors) a ship will try to interdict another country")
305 EMPCFBOTH("flakscale", flakscale, float, NSC_FLOAT, 0,
306 "Scale factor for flak damage")
307 EMPCFBOTH("combat_mob", combat_mob, double, NSC_DOUBLE, 0,
308 "How much mobility do units spend for combat (* casualties/bodies)")
309 EMPCFBOTH("people_damage", people_damage, double, NSC_DOUBLE, 0,
310 "People take this amount of normal damage")
311 EMPCFBOTH("unit_damage", unit_damage, double, NSC_DOUBLE, 0,
312 "Land units take this amount of normal damage")
313 EMPCFBOTH("collateral_dam", collateral_dam, double, NSC_DOUBLE, 0,
314 "Side effect damage amount done to sector")
315 EMPCFBOTH("assault_penalty", assault_penalty, double, NSC_DOUBLE, 0,
316 "Attack strength multiplier for paratroopers and assaulting")
317 EMPCFBOTH("fire_range_factor", fire_range_factor, float, NSC_FLOAT, 0,
318 "Scale normal firing ranges by this amount")
319 EMPCFBOTH("sect_mob_neg_factor", sect_mob_neg_factor, int, NSC_INT, 0,
320 "Initial mobility for MOB_ACCESS (-etu_per_update / sect_mob_neg_factor)")
321 EMPCF_COMMENT("# Applies to sector takeover, ship build, plane or land unit build, and trade.")
323 EMPCF_COMMENT("\n\n### Populace")
324 EMPCFBOTH("uwbrate", uwbrate, double, NSC_DOUBLE, 0,
325 "Birth rate for uncompensated workers")
326 EMPCFBOTH("money_civ", money_civ, double, NSC_DOUBLE, 0,
327 "Money gained from taxes on a civilian in one ETU")
328 EMPCFBOTH("money_mil", money_mil, double, NSC_DOUBLE, 0,
329 "Money gained from taxes on an active soldier in one ETU")
330 EMPCFBOTH("money_res", money_res, double, NSC_DOUBLE, 0,
331 "Money gained from taxes on a soldier on active reserve in one ETU")
332 EMPCFBOTH("money_uw", money_uw, double, NSC_DOUBLE, 0,
333 "Money gained from taxes on an uncompensated worker in one ETU")
334 EMPCFBOTH("babyeat", babyeat, double, NSC_DOUBLE, 0,
335 "Amount of food to mature 1 baby into a civilian")
336 EMPCFBOTH("bankint", bankint, double, NSC_DOUBLE, 0,
337 "Bank dollar gain (per bar per etu)")
338 EMPCFBOTH("eatrate", eatrate, double, NSC_DOUBLE, 0,
339 "Food eating rate for mature people")
340 EMPCFBOTH("fcrate", fcrate, double, NSC_DOUBLE, 0,
341 "Food cultivation rate (* workforce in sector)")
342 EMPCFBOTH("fgrate", fgrate, double, NSC_DOUBLE, 0,
343 "Food growth rate (* fertility of sector)")
344 EMPCFBOTH("obrate", obrate, double, NSC_DOUBLE, 0,
345 "Civilian birth rate")
346 EMPCFBOTH("rollover_avail_max", rollover_avail_max, int, NSC_INT, 0,
347 "Maximum avail that can roll over an update")
349 EMPCF_COMMENT("\n\n### Nukes")
350 EMPCFBOTH("decay_per_etu", decay_per_etu, double, NSC_DOUBLE, 0,
351 "Decay of fallout per ETU")
352 EMPCFBOTH("fallout_spread", fallout_spread, double, NSC_DOUBLE, 0,
353 "Amount of fallout that leaks into surrounding sectors")
354 EMPCFBOTH("drnuke_const", drnuke_const, float, NSC_FLOAT, 0,
355 "Research needed to build a nuke, as fraction of the tech needed")
356 EMPCF_COMMENT("# A common value is 0.33.")
358 EMPCF_COMMENT("\n\n### Market/Trade")
359 EMPCFBOTH("MARK_DELAY", MARK_DELAY, int, NSC_INT, 0,
360 "Time commodities stay on the market for bidding (seconds)")
361 EMPCFBOTH("TRADE_DELAY", TRADE_DELAY, int, NSC_INT, 0,
362 "Time ships, planes, lands and nukes stay on the market for bidding (seconds)")
363 EMPCFBOTH("buytax", buytax, double, NSC_DOUBLE, 0,
364 "Multiple of the bid charged to the buyer on market purchases")
365 EMPCFBOTH("tradetax", tradetax, double, NSC_DOUBLE, 0,
366 "Amount of a trade transaction the seller makes (the rest is tax)")
368 EMPCF_COMMENT("\n\n### Trade ships")
369 EMPCFBOTH("trade_1_dist", trade_1_dist, int, NSC_INT, 0,
370 "Less than this distance gets no money for cashing in")
371 EMPCFBOTH("trade_2_dist", trade_2_dist, int, NSC_INT, 0,
372 "Less than this distance gets trade_1 money for cashing in")
373 EMPCFBOTH("trade_3_dist", trade_3_dist, int, NSC_INT, 0,
374 "Less than this distance gets trade_2 money for cashing in, more gets trade_3")
375 EMPCFBOTH("trade_1", trade_1, float, NSC_FLOAT, 0,
376 "Return per sector on trade_1 distance amount")
377 EMPCFBOTH("trade_2", trade_2, float, NSC_FLOAT, 0,
378 "Return per sector on trade_2 distance amount")
379 EMPCFBOTH("trade_3", trade_3, float, NSC_FLOAT, 0,
380 "Return per sector on trade_3 distance amount")
381 EMPCFBOTH("trade_ally_bonus", trade_ally_bonus, float, NSC_FLOAT, 0,
382 "Bonus you get for cashing in with an ally")
383 EMPCFBOTH("trade_ally_cut", trade_ally_cut, float, NSC_FLOAT, 0,
384 "Bonus your ally gets for you cashing in with them")
386 EMPCF_COMMENT("\n\n### Miscellaneous")
387 EMPCFBOTH("disabled_commands", disabled_commands, char *, NSC_STRING, KM_INTERNAL,
388 "Disabled commands, separated by space")
389 EMPCFBOTH("anno_keep_days", anno_keep_days, int, NSC_INT, KM_INTERNAL,
390 "How long until announcements expire (<0 means never)")
391 EMPCFBOTH("news_keep_days", news_keep_days, int, NSC_INT, KM_INTERNAL,
392 "How long until news expire")
393 EMPCFBOTH("lost_keep_hours", lost_keep_hours, int, NSC_INT, KM_INTERNAL,
394 "How long until lost items expire")
397 EMPCFONLYC(NULL, emp_config_dummy, NULL, NSC_NOTYPE, 0, NULL)