mirror of
https://github.com/yogstation13/Yogstation.git
synced 2025-02-26 09:04:50 +00:00
* Ports paradise error handler, with in game runtime viewer! * Changes to the old runtime error and removes inerror reference * Oops * Adds a wrapper for world.log so it displays both in the runtime diary and in DD window
898 lines
32 KiB
Plaintext
898 lines
32 KiB
Plaintext
//Configuraton defines //TODO: Move all yes/no switches into bitflags
|
|
|
|
//Used by jobs_have_maint_access
|
|
#define ASSISTANTS_HAVE_MAINT_ACCESS 1
|
|
#define SECURITY_HAS_MAINT_ACCESS 2
|
|
#define EVERYONE_HAS_MAINT_ACCESS 4
|
|
|
|
//Not accessible from usual debug controller verb
|
|
/datum/protected_configuration
|
|
var/autoadmin = 0
|
|
var/autoadmin_rank = "Game Admin"
|
|
|
|
/datum/protected_configuration/vv_get_var(var_name)
|
|
return debug_variable(var_name, "SECRET", 0, src)
|
|
|
|
/datum/protected_configuration/vv_edit_var(var_name, var_value)
|
|
return FALSE
|
|
|
|
/datum/configuration
|
|
var/name = "Configuration" // datum name
|
|
|
|
var/server_name = null // server name (the name of the game window)
|
|
var/server_sql_name = null // short form server name used for the DB
|
|
var/station_name = null // station name (the name of the station in-game)
|
|
var/lobby_countdown = 120 // In between round countdown.
|
|
var/round_end_countdown = 25 // Post round murder death kill countdown
|
|
var/hub = 0
|
|
|
|
var/log_ooc = 0 // log OOC channel
|
|
var/log_access = 0 // log login/logout
|
|
var/log_say = 0 // log client say
|
|
var/log_admin = 0 // log admin actions
|
|
var/log_game = 0 // log game events
|
|
var/log_vote = 0 // log voting
|
|
var/log_whisper = 0 // log client whisper
|
|
var/log_prayer = 0 // log prayers
|
|
var/log_law = 0 // log lawchanges
|
|
var/log_emote = 0 // log emotes
|
|
var/log_attack = 0 // log attack messages
|
|
var/log_adminchat = 0 // log admin chat messages
|
|
var/log_pda = 0 // log pda messages
|
|
var/log_hrefs = 0 // log all links clicked in-game. Could be used for debugging and tracking down exploits
|
|
var/log_twitter = 0 // log certain expliotable parrots and other such fun things in a JSON file of twitter valid phrases.
|
|
var/log_world_topic = 0 // log all world.Topic() calls
|
|
var/log_runtimes = FALSE // log runtimes into a file
|
|
var/sql_enabled = 0 // for sql switching
|
|
var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour
|
|
var/allow_vote_restart = 0 // allow votes to restart
|
|
var/allow_vote_mode = 0 // allow votes to change mode
|
|
var/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default)
|
|
var/vote_period = 600 // length of voting period (deciseconds, default 1 minute)
|
|
var/vote_no_default = 0 // vote does not default to nochange/norestart (tbi)
|
|
var/vote_no_dead = 0 // dead people can't vote (tbi)
|
|
var/del_new_on_log = 1 // del's new players if they log before they spawn in
|
|
var/allow_Metadata = 0 // Metadata is supported.
|
|
var/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1.
|
|
var/fps = 20
|
|
var/allow_holidays = 0 //toggles whether holiday-specific content should be used
|
|
var/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling
|
|
|
|
var/hostedby = null
|
|
var/respawn = 1
|
|
var/guest_jobban = 1
|
|
var/usewhitelist = 0
|
|
var/kick_inactive = 0 //force disconnect for inactive players
|
|
var/load_jobs_from_txt = 0
|
|
var/automute_on = 0 //enables automuting/spam prevention
|
|
var/minimal_access_threshold = 0 //If the number of players is larger than this threshold, minimal access will be turned on.
|
|
var/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access.
|
|
var/jobs_have_maint_access = 0 //Who gets maint access? See defines above.
|
|
var/sec_start_brig = 0 //makes sec start in brig or dept sec posts
|
|
|
|
var/server
|
|
var/banappeals
|
|
var/wikiurl = "http://www.tgstation13.org/wiki" // Default wiki link.
|
|
var/forumurl = "http://tgstation13.org/phpBB/index.php" //default forums
|
|
var/rulesurl = "http://www.tgstation13.org/wiki/Rules" // default rules
|
|
var/githuburl = "https://www.github.com/tgstation/-tg-station" //default github
|
|
|
|
var/forbid_singulo_possession = 0
|
|
var/useircbot = 0
|
|
|
|
var/check_randomizer = 0
|
|
|
|
var/allow_panic_bunker_bounce = 0 //Send new players somewhere else
|
|
var/panic_server_name = "somewhere else"
|
|
var/panic_address = "byond://" //Reconnect a player this linked server if this server isn't accepting new players
|
|
|
|
//IP Intel vars
|
|
var/ipintel_email
|
|
var/ipintel_rating_bad = 1
|
|
var/ipintel_save_good = 12
|
|
var/ipintel_save_bad = 1
|
|
var/ipintel_domain = "check.getipintel.net"
|
|
|
|
var/admin_legacy_system = 0 //Defines whether the server uses the legacy admin system with admins.txt or the SQL system. Config option in config.txt
|
|
var/ban_legacy_system = 0 //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. Config option in config.txt
|
|
var/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database
|
|
var/use_account_age_for_jobs = 0 //Uses the time they made the account for the job restriction stuff. New player joining alerts should be unaffected.
|
|
var/see_own_notes = 0 //Can players see their own admin notes (read-only)? Config option in config.txt
|
|
|
|
//Population cap vars
|
|
var/soft_popcap = 0
|
|
var/hard_popcap = 0
|
|
var/extreme_popcap = 0
|
|
var/soft_popcap_message = "Be warned that the server is currently serving a high number of users, consider using alternative game servers."
|
|
var/hard_popcap_message = "The server is currently serving a high number of users, You cannot currently join. You may wait for the number of living crew to decline, observe, or find alternative servers."
|
|
var/extreme_popcap_message = "The server is currently serving a high number of users, find alternative servers."
|
|
|
|
//game_options.txt configs
|
|
var/force_random_names = 0
|
|
var/list/mode_names = list()
|
|
var/list/modes = list() // allowed modes
|
|
var/list/votable_modes = list() // votable modes
|
|
var/list/probabilities = list() // relative probability of each mode
|
|
var/list/min_pop = list() // overrides for acceptible player counts in a mode
|
|
var/list/max_pop = list()
|
|
|
|
var/humans_need_surnames = 0
|
|
var/allow_ai = 0 // allow ai job
|
|
var/forbid_secborg = 0 // disallow secborg module to be chosen.
|
|
var/forbid_peaceborg = 0
|
|
var/panic_bunker = 0 // prevents new people it hasn't seen before from connecting
|
|
var/notify_new_player_age = 0 // how long do we notify admins of a new player
|
|
var/irc_first_connection_alert = 0 // do we notify the irc channel when somebody is connecting for the first time?
|
|
|
|
var/traitor_scaling_coeff = 6 //how much does the amount of players get divided by to determine traitors
|
|
var/changeling_scaling_coeff = 6 //how much does the amount of players get divided by to determine changelings
|
|
var/security_scaling_coeff = 8 //how much does the amount of players get divided by to determine open security officer positions
|
|
var/abductor_scaling_coeff = 15 //how many players per abductor team
|
|
|
|
var/traitor_objectives_amount = 2
|
|
var/protect_roles_from_antagonist = 0 //If security and such can be traitor/cult/other
|
|
var/protect_assistant_from_antagonist = 0 //If assistants can be traitor/cult/other
|
|
var/enforce_human_authority = 0 //If non-human species are barred from joining as a head of staff
|
|
var/allow_latejoin_antagonists = 0 // If late-joining players can be traitor/changeling
|
|
var/list/continuous = list() // which roundtypes continue if all antagonists die
|
|
var/list/midround_antag = list() // which roundtypes use the midround antagonist system
|
|
var/midround_antag_time_check = 60 // How late (in minutes) you want the midround antag system to stay on, setting this to 0 will disable the system
|
|
var/midround_antag_life_check = 0.7 // A ratio of how many people need to be alive in order for the round not to immediately end in midround antagonist
|
|
var/shuttle_refuel_delay = 12000
|
|
var/show_game_type_odds = 0 //if set this allows players to see the odds of each roundtype on the get revision screen
|
|
var/mutant_races = 0 //players can choose their mutant race before joining the game
|
|
var/list/roundstart_races = list() //races you can play as from the get go. If left undefined the game's roundstart var for species is used
|
|
var/mutant_humans = 0 //players can pick mutant bodyparts for humans before joining the game
|
|
|
|
var/no_summon_guns //No
|
|
var/no_summon_magic //Fun
|
|
var/no_summon_events //Allowed
|
|
|
|
var/intercept = 1 //Whether or not to send a communications intercept report roundstart. This may be overriden by gamemodes.
|
|
var/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced."
|
|
var/alert_desc_blue_upto = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted."
|
|
var/alert_desc_blue_downto = "The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed."
|
|
var/alert_desc_red_upto = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised."
|
|
var/alert_desc_red_downto = "The station's destruction has been averted. There is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised."
|
|
var/alert_desc_delta = "Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill."
|
|
|
|
var/revival_pod_plants = 1
|
|
var/revival_cloning = 1
|
|
var/revival_brain_life = -1
|
|
|
|
var/rename_cyborg = 0
|
|
var/ooc_during_round = 0
|
|
var/emojis = 0
|
|
|
|
//Used for modifying movement speed for mobs.
|
|
//Unversal modifiers
|
|
var/run_speed = 0
|
|
var/walk_speed = 0
|
|
|
|
//Mob specific modifiers. NOTE: These will affect different mob types in different ways
|
|
var/human_delay = 0
|
|
var/robot_delay = 0
|
|
var/monkey_delay = 0
|
|
var/alien_delay = 0
|
|
var/slime_delay = 0
|
|
var/animal_delay = 0
|
|
|
|
var/gateway_delay = 18000 //How long the gateway takes before it activates. Default is half an hour.
|
|
var/ghost_interaction = 0
|
|
|
|
var/silent_ai = 0
|
|
var/silent_borg = 0
|
|
|
|
var/damage_multiplier = 1 //Modifier for damage to all mobs. Impacts healing as well.
|
|
|
|
var/allowwebclient = 0
|
|
var/webclientmembersonly = 0
|
|
|
|
var/sandbox_autoclose = 0 // close the sandbox panel after spawning an item, potentially reducing griff
|
|
|
|
var/default_laws = 0 //Controls what laws the AI spawns with.
|
|
var/silicon_max_law_amount = 12
|
|
var/list/lawids = list()
|
|
|
|
var/list/law_weights = list()
|
|
|
|
var/assistant_cap = -1
|
|
|
|
var/starlight = 0
|
|
var/generate_minimaps = 0
|
|
var/grey_assistants = 0
|
|
|
|
var/lavaland_budget = 60
|
|
var/space_budget = 16
|
|
|
|
var/aggressive_changelog = 0
|
|
|
|
var/reactionary_explosions = 0 //If we use reactionary explosions, explosions that react to walls and doors
|
|
|
|
var/autoconvert_notes = 0 //if all connecting player's notes should attempt to be converted to the database
|
|
|
|
var/announce_admin_logout = 0
|
|
var/announce_admin_login = 0
|
|
|
|
var/list/datum/votablemap/maplist = list()
|
|
var/datum/votablemap/defaultmap = null
|
|
var/maprotation = 1
|
|
var/maprotatechancedelta = 0.75
|
|
|
|
// Enables random events mid-round when set to 1
|
|
var/allow_random_events = 0
|
|
|
|
// Multipliers for random events minimal starting time and minimal players amounts
|
|
var/events_min_time_mul = 1
|
|
var/events_min_players_mul = 1
|
|
|
|
// The object used for the clickable stat() button.
|
|
var/obj/effect/statclick/statclick
|
|
|
|
var/client_warn_version = 0
|
|
var/client_warn_message = "Your version of byond may have issues or be blocked from accessing this server in the future."
|
|
var/client_error_version = 0
|
|
var/client_error_message = "Your version of byond is too old, may have issues, and is blocked from accessing this server."
|
|
|
|
var/cross_name = "Other server"
|
|
var/showircname = 0
|
|
|
|
var/list/gamemode_cache = null
|
|
|
|
var/minutetopiclimit
|
|
var/secondtopiclimit
|
|
|
|
var/error_cooldown = 600 // The "cooldown" time for each occurrence of a unique error
|
|
var/error_limit = 50 // How many occurrences before the next will silence them
|
|
var/error_silence_time = 6000 // How long a unique error will be silenced for
|
|
var/error_msg_delay = 50 // How long to wait between messaging admins about occurrences of a unique error
|
|
|
|
/datum/configuration/New()
|
|
gamemode_cache = typecacheof(/datum/game_mode,TRUE)
|
|
for(var/T in gamemode_cache)
|
|
// I wish I didn't have to instance the game modes in order to look up
|
|
// their information, but it is the only way (at least that I know of).
|
|
var/datum/game_mode/M = new T()
|
|
|
|
if(M.config_tag)
|
|
if(!(M.config_tag in modes)) // ensure each mode is added only once
|
|
diary << "Adding game mode [M.name] ([M.config_tag]) to configuration."
|
|
modes += M.config_tag
|
|
mode_names[M.config_tag] = M.name
|
|
probabilities[M.config_tag] = M.probability
|
|
if(M.votable)
|
|
votable_modes += M.config_tag
|
|
qdel(M)
|
|
votable_modes += "secret"
|
|
|
|
/datum/configuration/proc/load(filename, type = "config") //the type can also be game_options, in which case it uses a different switch. not making it separate to not copypaste code - Urist
|
|
var/list/Lines = file2list(filename)
|
|
|
|
for(var/t in Lines)
|
|
if(!t)
|
|
continue
|
|
|
|
t = trim(t)
|
|
if(length(t) == 0)
|
|
continue
|
|
else if(copytext(t, 1, 2) == "#")
|
|
continue
|
|
|
|
var/pos = findtext(t, " ")
|
|
var/name = null
|
|
var/value = null
|
|
|
|
if(pos)
|
|
name = lowertext(copytext(t, 1, pos))
|
|
value = copytext(t, pos + 1)
|
|
else
|
|
name = lowertext(t)
|
|
|
|
if(!name)
|
|
continue
|
|
|
|
if(type == "config")
|
|
switch(name)
|
|
if("hub")
|
|
config.hub = 1
|
|
if("admin_legacy_system")
|
|
config.admin_legacy_system = 1
|
|
if("ban_legacy_system")
|
|
config.ban_legacy_system = 1
|
|
if("use_age_restriction_for_jobs")
|
|
config.use_age_restriction_for_jobs = 1
|
|
if("use_account_age_for_jobs")
|
|
config.use_account_age_for_jobs = 1
|
|
if("lobby_countdown")
|
|
config.lobby_countdown = text2num(value)
|
|
if("round_end_countdown")
|
|
config.round_end_countdown = text2num(value)
|
|
if("log_ooc")
|
|
config.log_ooc = 1
|
|
if("log_access")
|
|
config.log_access = 1
|
|
if("log_say")
|
|
config.log_say = 1
|
|
if("log_admin")
|
|
config.log_admin = 1
|
|
if("log_prayer")
|
|
config.log_prayer = 1
|
|
if("log_law")
|
|
config.log_law = 1
|
|
if("log_game")
|
|
config.log_game = 1
|
|
if("log_vote")
|
|
config.log_vote = 1
|
|
if("log_whisper")
|
|
config.log_whisper = 1
|
|
if("log_attack")
|
|
config.log_attack = 1
|
|
if("log_emote")
|
|
config.log_emote = 1
|
|
if("log_adminchat")
|
|
config.log_adminchat = 1
|
|
if("log_pda")
|
|
config.log_pda = 1
|
|
if("log_hrefs")
|
|
config.log_hrefs = 1
|
|
if("log_twitter")
|
|
config.log_twitter = 1
|
|
if("log_world_topic")
|
|
config.log_world_topic = 1
|
|
if("allow_admin_ooccolor")
|
|
config.allow_admin_ooccolor = 1
|
|
if("allow_vote_restart")
|
|
config.allow_vote_restart = 1
|
|
if("allow_vote_mode")
|
|
config.allow_vote_mode = 1
|
|
if("no_dead_vote")
|
|
config.vote_no_dead = 1
|
|
if("default_no_vote")
|
|
config.vote_no_default = 1
|
|
if("vote_delay")
|
|
config.vote_delay = text2num(value)
|
|
if("vote_period")
|
|
config.vote_period = text2num(value)
|
|
if("norespawn")
|
|
config.respawn = 0
|
|
if("servername")
|
|
config.server_name = value
|
|
if("serversqlname")
|
|
config.server_sql_name = 1
|
|
if("stationname")
|
|
config.station_name = value
|
|
if("hostedby")
|
|
config.hostedby = value
|
|
if("server")
|
|
config.server = value
|
|
if("banappeals")
|
|
config.banappeals = value
|
|
if("wikiurl")
|
|
config.wikiurl = value
|
|
if("forumurl")
|
|
config.forumurl = value
|
|
if("rulesurl")
|
|
config.rulesurl = value
|
|
if("githuburl")
|
|
config.githuburl = value
|
|
if("guest_jobban")
|
|
config.guest_jobban = 1
|
|
if("guest_ban")
|
|
guests_allowed = 0
|
|
if("usewhitelist")
|
|
config.usewhitelist = TRUE
|
|
if("allow_metadata")
|
|
config.allow_Metadata = 1
|
|
if("kick_inactive")
|
|
if(value < 1)
|
|
value = INACTIVITY_KICK
|
|
config.kick_inactive = value
|
|
if("load_jobs_from_txt")
|
|
load_jobs_from_txt = 1
|
|
if("forbid_singulo_possession")
|
|
forbid_singulo_possession = 1
|
|
if("popup_admin_pm")
|
|
config.popup_admin_pm = 1
|
|
if("allow_holidays")
|
|
config.allow_holidays = 1
|
|
if("useircbot")
|
|
useircbot = 1
|
|
if("ticklag")
|
|
var/ticklag = text2num(value)
|
|
if(ticklag > 0)
|
|
fps = 10 / ticklag
|
|
if("tick_limit_mc_init")
|
|
tick_limit_mc_init = text2num(value)
|
|
if("fps")
|
|
fps = text2num(value)
|
|
if("automute_on")
|
|
automute_on = 1
|
|
if("comms_key")
|
|
global.comms_key = value
|
|
if(value != "default_pwd" && length(value) > 6) //It's the default value or less than 6 characters long, warn badmins
|
|
global.comms_allowed = 1
|
|
if("cross_server_address")
|
|
global.cross_address = value
|
|
if(value != "byond:\\address:port")
|
|
global.cross_allowed = 1
|
|
if("cross_comms_name")
|
|
cross_name = value
|
|
if("panic_server_name")
|
|
panic_server_name = value
|
|
if("panic_server_address")
|
|
panic_address = value
|
|
if(value != "byond:\\address:port")
|
|
allow_panic_bunker_bounce = 1
|
|
if("medal_hub_address")
|
|
global.medal_hub = value
|
|
if("medal_hub_password")
|
|
global.medal_pass = value
|
|
if("show_irc_name")
|
|
config.showircname = 1
|
|
if("see_own_notes")
|
|
config.see_own_notes = 1
|
|
if("soft_popcap")
|
|
config.soft_popcap = text2num(value)
|
|
if("hard_popcap")
|
|
config.hard_popcap = text2num(value)
|
|
if("extreme_popcap")
|
|
config.extreme_popcap = text2num(value)
|
|
if("soft_popcap_message")
|
|
config.soft_popcap_message = value
|
|
if("hard_popcap_message")
|
|
config.hard_popcap_message = value
|
|
if("extreme_popcap_message")
|
|
config.extreme_popcap_message = value
|
|
if("panic_bunker")
|
|
config.panic_bunker = 1
|
|
if("notify_new_player_age")
|
|
config.notify_new_player_age = text2num(value)
|
|
if("irc_first_connection_alert")
|
|
config.irc_first_connection_alert = 1
|
|
if("check_randomizer")
|
|
config.check_randomizer = 1
|
|
if("ipintel_email")
|
|
if (value != "ch@nge.me")
|
|
config.ipintel_email = value
|
|
if("ipintel_rating_bad")
|
|
config.ipintel_rating_bad = text2num(value)
|
|
if("ipintel_domain")
|
|
config.ipintel_domain = value
|
|
if("ipintel_save_good")
|
|
config.ipintel_save_good = text2num(value)
|
|
if("ipintel_save_bad")
|
|
config.ipintel_save_bad = text2num(value)
|
|
if("aggressive_changelog")
|
|
config.aggressive_changelog = 1
|
|
if("log_runtimes")
|
|
log_runtimes = TRUE
|
|
var/newlog = file("data/logs/runtimes/runtime-[time2text(world.realtime, "YYYY-MM-DD")].log")
|
|
if(runtime_diary != newlog)
|
|
world.log << "Now logging runtimes to data/logs/runtimes/runtime-[time2text(world.realtime, "YYYY-MM-DD")].log"
|
|
runtime_diary = newlog
|
|
if("autoconvert_notes")
|
|
config.autoconvert_notes = 1
|
|
if("allow_webclient")
|
|
config.allowwebclient = 1
|
|
if("webclient_only_byond_members")
|
|
config.webclientmembersonly = 1
|
|
if("announce_admin_logout")
|
|
config.announce_admin_logout = 1
|
|
if("announce_admin_login")
|
|
config.announce_admin_login = 1
|
|
if("maprotation")
|
|
config.maprotation = 1
|
|
if("maprotationchancedelta")
|
|
config.maprotatechancedelta = text2num(value)
|
|
if("autoadmin")
|
|
protected_config.autoadmin = 1
|
|
if(value)
|
|
protected_config.autoadmin_rank = ckeyEx(value)
|
|
if("generate_minimaps")
|
|
config.generate_minimaps = 1
|
|
if("client_warn_version")
|
|
config.client_warn_version = text2num(value)
|
|
if("client_warn_message")
|
|
config.client_warn_message = value
|
|
if("client_error_version")
|
|
config.client_error_version = text2num(value)
|
|
if("client_error_message")
|
|
config.client_error_message = value
|
|
if("minute_topic_limit")
|
|
config.minutetopiclimit = text2num(value)
|
|
if("second_topic_limit")
|
|
config.secondtopiclimit = text2num(value)
|
|
if("error_cooldown")
|
|
error_cooldown = text2num(value)
|
|
if("error_limit")
|
|
error_limit = text2num(value)
|
|
if("error_silence_time")
|
|
error_silence_time = text2num(value)
|
|
if("error_msg_delay")
|
|
error_msg_delay = text2num(value)
|
|
else
|
|
diary << "Unknown setting in configuration: '[name]'"
|
|
|
|
else if(type == "game_options")
|
|
switch(name)
|
|
if("damage_multiplier")
|
|
config.damage_multiplier = text2num(value)
|
|
if("revival_pod_plants")
|
|
config.revival_pod_plants = text2num(value)
|
|
if("revival_cloning")
|
|
config.revival_cloning = text2num(value)
|
|
if("revival_brain_life")
|
|
config.revival_brain_life = text2num(value)
|
|
if("rename_cyborg")
|
|
config.rename_cyborg = 1
|
|
if("ooc_during_round")
|
|
config.ooc_during_round = 1
|
|
if("emojis")
|
|
config.emojis = 1
|
|
if("run_delay")
|
|
config.run_speed = text2num(value)
|
|
if("walk_delay")
|
|
config.walk_speed = text2num(value)
|
|
if("human_delay")
|
|
config.human_delay = text2num(value)
|
|
if("robot_delay")
|
|
config.robot_delay = text2num(value)
|
|
if("monkey_delay")
|
|
config.monkey_delay = text2num(value)
|
|
if("alien_delay")
|
|
config.alien_delay = text2num(value)
|
|
if("slime_delay")
|
|
config.slime_delay = text2num(value)
|
|
if("animal_delay")
|
|
config.animal_delay = text2num(value)
|
|
if("alert_red_upto")
|
|
config.alert_desc_red_upto = value
|
|
if("alert_red_downto")
|
|
config.alert_desc_red_downto = value
|
|
if("alert_blue_downto")
|
|
config.alert_desc_blue_downto = value
|
|
if("alert_blue_upto")
|
|
config.alert_desc_blue_upto = value
|
|
if("alert_green")
|
|
config.alert_desc_green = value
|
|
if("alert_delta")
|
|
config.alert_desc_delta = value
|
|
if("no_intercept_report")
|
|
config.intercept = 0
|
|
if("assistants_have_maint_access")
|
|
config.jobs_have_maint_access |= ASSISTANTS_HAVE_MAINT_ACCESS
|
|
if("security_has_maint_access")
|
|
config.jobs_have_maint_access |= SECURITY_HAS_MAINT_ACCESS
|
|
if("everyone_has_maint_access")
|
|
config.jobs_have_maint_access |= EVERYONE_HAS_MAINT_ACCESS
|
|
if("sec_start_brig")
|
|
config.sec_start_brig = 1
|
|
if("gateway_delay")
|
|
config.gateway_delay = text2num(value)
|
|
if("continuous")
|
|
var/mode_name = lowertext(value)
|
|
if(mode_name in config.modes)
|
|
config.continuous[mode_name] = 1
|
|
else
|
|
diary << "Unknown continuous configuration definition: [mode_name]."
|
|
if("midround_antag")
|
|
var/mode_name = lowertext(value)
|
|
if(mode_name in config.modes)
|
|
config.midround_antag[mode_name] = 1
|
|
else
|
|
diary << "Unknown midround antagonist configuration definition: [mode_name]."
|
|
if("midround_antag_time_check")
|
|
config.midround_antag_time_check = text2num(value)
|
|
if("midround_antag_life_check")
|
|
config.midround_antag_life_check = text2num(value)
|
|
if("min_pop")
|
|
var/pop_pos = findtext(value, " ")
|
|
var/mode_name = null
|
|
var/mode_value = null
|
|
|
|
if(pop_pos)
|
|
mode_name = lowertext(copytext(value, 1, pop_pos))
|
|
mode_value = copytext(value, pop_pos + 1)
|
|
if(mode_name in config.modes)
|
|
config.min_pop[mode_name] = text2num(mode_value)
|
|
else
|
|
diary << "Unknown minimum population configuration definition: [mode_name]."
|
|
else
|
|
diary << "Incorrect minimum population configuration definition: [mode_name] [mode_value]."
|
|
if("max_pop")
|
|
var/pop_pos = findtext(value, " ")
|
|
var/mode_name = null
|
|
var/mode_value = null
|
|
|
|
if(pop_pos)
|
|
mode_name = lowertext(copytext(value, 1, pop_pos))
|
|
mode_value = copytext(value, pop_pos + 1)
|
|
if(mode_name in config.modes)
|
|
config.max_pop[mode_name] = text2num(mode_value)
|
|
else
|
|
diary << "Unknown maximum population configuration definition: [mode_name]."
|
|
else
|
|
diary << "Incorrect maximum population configuration definition: [mode_name] [mode_value]."
|
|
if("shuttle_refuel_delay")
|
|
config.shuttle_refuel_delay = text2num(value)
|
|
if("show_game_type_odds")
|
|
config.show_game_type_odds = 1
|
|
if("ghost_interaction")
|
|
config.ghost_interaction = 1
|
|
if("traitor_scaling_coeff")
|
|
config.traitor_scaling_coeff = text2num(value)
|
|
if("changeling_scaling_coeff")
|
|
config.changeling_scaling_coeff = text2num(value)
|
|
if("security_scaling_coeff")
|
|
config.security_scaling_coeff = text2num(value)
|
|
if("abductor_scaling_coeff")
|
|
config.abductor_scaling_coeff = text2num(value)
|
|
if("traitor_objectives_amount")
|
|
config.traitor_objectives_amount = text2num(value)
|
|
if("probability")
|
|
var/prob_pos = findtext(value, " ")
|
|
var/prob_name = null
|
|
var/prob_value = null
|
|
|
|
if(prob_pos)
|
|
prob_name = lowertext(copytext(value, 1, prob_pos))
|
|
prob_value = copytext(value, prob_pos + 1)
|
|
if(prob_name in config.modes)
|
|
config.probabilities[prob_name] = text2num(prob_value)
|
|
else
|
|
diary << "Unknown game mode probability configuration definition: [prob_name]."
|
|
else
|
|
diary << "Incorrect probability configuration definition: [prob_name] [prob_value]."
|
|
|
|
if("protect_roles_from_antagonist")
|
|
config.protect_roles_from_antagonist = 1
|
|
if("protect_assistant_from_antagonist")
|
|
config.protect_assistant_from_antagonist = 1
|
|
if("enforce_human_authority")
|
|
config.enforce_human_authority = 1
|
|
if("allow_latejoin_antagonists")
|
|
config.allow_latejoin_antagonists = 1
|
|
if("allow_random_events")
|
|
config.allow_random_events = 1
|
|
|
|
if("events_min_time_mul")
|
|
config.events_min_time_mul = text2num(value)
|
|
if("events_min_players_mul")
|
|
config.events_min_players_mul = text2num(value)
|
|
|
|
if("minimal_access_threshold")
|
|
config.minimal_access_threshold = text2num(value)
|
|
if("jobs_have_minimal_access")
|
|
config.jobs_have_minimal_access = 1
|
|
if("humans_need_surnames")
|
|
humans_need_surnames = 1
|
|
if("force_random_names")
|
|
config.force_random_names = 1
|
|
if("allow_ai")
|
|
config.allow_ai = 1
|
|
if("disable_secborg")
|
|
config.forbid_secborg = 1
|
|
if("disable_peaceborg")
|
|
config.forbid_peaceborg = 1
|
|
if("silent_ai")
|
|
config.silent_ai = 1
|
|
if("silent_borg")
|
|
config.silent_borg = 1
|
|
if("sandbox_autoclose")
|
|
config.sandbox_autoclose = 1
|
|
if("default_laws")
|
|
config.default_laws = text2num(value)
|
|
if("random_laws")
|
|
var/law_id = lowertext(value)
|
|
lawids += law_id
|
|
if("law_weight")
|
|
// Value is in the form "LAWID,NUMBER"
|
|
var/list/L = splittext(value, ",")
|
|
if(L.len != 2)
|
|
diary << "Invalid LAW_WEIGHT: " + t
|
|
continue
|
|
var/lawid = L[1]
|
|
var/weight = text2num(L[2])
|
|
law_weights[lawid] = weight
|
|
|
|
if("silicon_max_law_amount")
|
|
config.silicon_max_law_amount = text2num(value)
|
|
if("join_with_mutant_race")
|
|
config.mutant_races = 1
|
|
if("roundstart_races")
|
|
var/race_id = lowertext(value)
|
|
for(var/species_id in species_list)
|
|
if(species_id == race_id)
|
|
roundstart_races += species_list[species_id]
|
|
roundstart_species[species_id] = species_list[species_id]
|
|
if("join_with_mutant_humans")
|
|
config.mutant_humans = 1
|
|
if("assistant_cap")
|
|
config.assistant_cap = text2num(value)
|
|
if("starlight")
|
|
config.starlight = 1
|
|
if("grey_assistants")
|
|
config.grey_assistants = 1
|
|
if("lavaland_budget")
|
|
config.lavaland_budget = text2num(value)
|
|
if("space_budget")
|
|
config.space_budget = text2num(value)
|
|
if("no_summon_guns")
|
|
config.no_summon_guns = 1
|
|
if("no_summon_magic")
|
|
config.no_summon_magic = 1
|
|
if("no_summon_events")
|
|
config.no_summon_events = 1
|
|
if("reactionary_explosions")
|
|
config.reactionary_explosions = 1
|
|
if("bombcap")
|
|
var/BombCap = text2num(value)
|
|
if (!BombCap)
|
|
continue
|
|
if (BombCap < 4)
|
|
BombCap = 4
|
|
|
|
MAX_EX_DEVESTATION_RANGE = round(BombCap/4)
|
|
MAX_EX_HEAVY_RANGE = round(BombCap/2)
|
|
MAX_EX_LIGHT_RANGE = BombCap
|
|
MAX_EX_FLASH_RANGE = BombCap
|
|
MAX_EX_FLAME_RANGE = BombCap
|
|
else
|
|
diary << "Unknown setting in configuration: '[name]'"
|
|
|
|
fps = round(fps)
|
|
if(fps <= 0)
|
|
fps = initial(fps)
|
|
|
|
|
|
/datum/configuration/proc/loadmaplist(filename)
|
|
var/list/Lines = file2list(filename)
|
|
|
|
var/datum/votablemap/currentmap = null
|
|
for(var/t in Lines)
|
|
if(!t)
|
|
continue
|
|
|
|
t = trim(t)
|
|
if(length(t) == 0)
|
|
continue
|
|
else if(copytext(t, 1, 2) == "#")
|
|
continue
|
|
|
|
var/pos = findtext(t, " ")
|
|
var/command = null
|
|
var/data = null
|
|
|
|
if(pos)
|
|
command = lowertext(copytext(t, 1, pos))
|
|
data = copytext(t, pos + 1)
|
|
else
|
|
command = lowertext(t)
|
|
|
|
if(!command)
|
|
continue
|
|
|
|
if (!currentmap && command != "map")
|
|
continue
|
|
|
|
switch (command)
|
|
if ("map")
|
|
currentmap = new (data)
|
|
if ("friendlyname")
|
|
currentmap.friendlyname = data
|
|
if ("minplayers","minplayer")
|
|
currentmap.minusers = text2num(data)
|
|
if ("maxplayers","maxplayer")
|
|
currentmap.maxusers = text2num(data)
|
|
if ("friendlyname")
|
|
currentmap.friendlyname = data
|
|
if ("weight","voteweight")
|
|
currentmap.voteweight = text2num(data)
|
|
if ("default","defaultmap")
|
|
config.defaultmap = currentmap
|
|
if ("endmap")
|
|
config.maplist[currentmap.name] = currentmap
|
|
currentmap = null
|
|
else
|
|
diary << "Unknown command in map vote config: '[command]'"
|
|
|
|
|
|
/datum/configuration/proc/loadsql(filename)
|
|
var/list/Lines = file2list(filename)
|
|
for(var/t in Lines)
|
|
if(!t)
|
|
continue
|
|
|
|
t = trim(t)
|
|
if(length(t) == 0)
|
|
continue
|
|
else if(copytext(t, 1, 2) == "#")
|
|
continue
|
|
|
|
var/pos = findtext(t, " ")
|
|
var/name = null
|
|
var/value = null
|
|
|
|
if(pos)
|
|
name = lowertext(copytext(t, 1, pos))
|
|
value = copytext(t, pos + 1)
|
|
else
|
|
name = lowertext(t)
|
|
|
|
if(!name)
|
|
continue
|
|
|
|
switch(name)
|
|
if("sql_enabled")
|
|
config.sql_enabled = 1
|
|
if("address")
|
|
sqladdress = value
|
|
if("port")
|
|
sqlport = value
|
|
if("feedback_database")
|
|
sqlfdbkdb = value
|
|
if("feedback_login")
|
|
sqlfdbklogin = value
|
|
if("feedback_password")
|
|
sqlfdbkpass = value
|
|
if("feedback_tableprefix")
|
|
sqlfdbktableprefix = value
|
|
else
|
|
diary << "Unknown setting in configuration: '[name]'"
|
|
|
|
/datum/configuration/proc/pick_mode(mode_name)
|
|
// I wish I didn't have to instance the game modes in order to look up
|
|
// their information, but it is the only way (at least that I know of).
|
|
for(var/T in gamemode_cache)
|
|
var/datum/game_mode/M = new T()
|
|
if(M.config_tag && M.config_tag == mode_name)
|
|
return M
|
|
qdel(M)
|
|
return new /datum/game_mode/extended()
|
|
|
|
/datum/configuration/proc/get_runnable_modes()
|
|
var/list/datum/game_mode/runnable_modes = new
|
|
for(var/T in gamemode_cache)
|
|
var/datum/game_mode/M = new T()
|
|
//world << "DEBUG: [T], tag=[M.config_tag], prob=[probabilities[M.config_tag]]"
|
|
if(!(M.config_tag in modes))
|
|
qdel(M)
|
|
continue
|
|
if(probabilities[M.config_tag]<=0)
|
|
qdel(M)
|
|
continue
|
|
if(min_pop[M.config_tag])
|
|
M.required_players = min_pop[M.config_tag]
|
|
if(max_pop[M.config_tag])
|
|
M.maximum_players = max_pop[M.config_tag]
|
|
if(M.can_start())
|
|
runnable_modes[M] = probabilities[M.config_tag]
|
|
//world << "DEBUG: runnable_mode\[[runnable_modes.len]\] = [M.config_tag]"
|
|
return runnable_modes
|
|
|
|
/datum/configuration/proc/get_runnable_midround_modes(crew)
|
|
var/list/datum/game_mode/runnable_modes = new
|
|
for(var/T in (gamemode_cache - ticker.mode.type))
|
|
var/datum/game_mode/M = new T()
|
|
if(!(M.config_tag in modes))
|
|
qdel(M)
|
|
continue
|
|
if(probabilities[M.config_tag]<=0)
|
|
qdel(M)
|
|
continue
|
|
if(min_pop[M.config_tag])
|
|
M.required_players = min_pop[M.config_tag]
|
|
if(max_pop[M.config_tag])
|
|
M.maximum_players = max_pop[M.config_tag]
|
|
if(M.required_players <= crew)
|
|
if(M.maximum_players >= 0 && M.maximum_players < crew)
|
|
continue
|
|
runnable_modes[M] = probabilities[M.config_tag]
|
|
return runnable_modes
|
|
|
|
/datum/configuration/proc/stat_entry()
|
|
if(!statclick)
|
|
statclick = new/obj/effect/statclick/debug("Edit", src)
|
|
|
|
stat("[name]:", statclick)
|