From ecfa52682cd7f358ce9b7c94151d0e28daab7bd8 Mon Sep 17 00:00:00 2001 From: Chompstation Bot Date: Sat, 3 Jul 2021 21:20:55 +0000 Subject: [PATCH] Add discord button to top --- code/controllers/configuration.dm | 2285 +++++++++++++++++++++++++++++ code/modules/vchat/js/vchat.js | 2 +- config/example/config.txt | 1181 +++++++++++++++ interface/interface.dm | 13 + interface/skin.dmf | 250 ++-- 5 files changed, 3608 insertions(+), 123 deletions(-) diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index a77f8afa29..8d76484a53 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD var/list/gamemode_cache = list() /datum/configuration @@ -1144,3 +1145,2287 @@ var/list/gamemode_cache = list() config.python_path = "/usr/bin/env python2" else //probably windows, if not this should work anyway config.python_path = "python" +||||||| parent of 293b021290... Merge pull request #10840 from VOREStation/Arokha/discobutton +var/list/gamemode_cache = list() + +/datum/configuration + var/static/server_name = null // server name (for world name / status) + var/static/server_suffix = 0 // generate numeric suffix based on server port + + var/static/nudge_script_path = "nudge.py" // where the nudge.py script is located + + var/static/log_ooc = 0 // log OOC channel + var/static/log_access = 0 // log login/logout + var/static/log_say = 0 // log client say + var/static/log_admin = 0 // log admin actions + var/static/log_debug = 1 // log debug output + var/static/log_game = 0 // log game events + var/static/log_vote = 0 // log voting + var/static/log_whisper = 0 // log client whisper + var/static/log_emote = 0 // log emotes + var/static/log_attack = 0 // log attack messages + var/static/log_adminchat = 0 // log admin chat messages + var/static/log_adminwarn = 0 // log warnings admins get about bomb construction and such + var/static/log_pda = 0 // log pda messages + var/static/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits + var/static/log_runtime = 0 // logs world.log to a file + var/static/log_world_output = 0 // log to_world_log(messages) + var/static/log_graffiti = 0 // logs graffiti + var/static/sql_enabled = 0 // for sql switching + var/static/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour + var/static/allow_vote_restart = 0 // allow votes to restart + var/static/ert_admin_call_only = 0 + var/static/allow_vote_mode = 0 // allow votes to change mode + var/static/allow_admin_jump = 1 // allows admin jumping + var/static/allow_admin_spawning = 1 // allows admin item spawning + var/static/allow_admin_rev = 1 // allows admin revives + var/static/pregame_time = 180 // pregame time in seconds + var/static/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default) + var/static/vote_period = 600 // length of voting period (deciseconds, default 1 minute) + var/static/vote_autotransfer_initial = 108000 // Length of time before the first autotransfer vote is called + var/static/vote_autotransfer_interval = 36000 // length of time before next sequential autotransfer vote + var/static/vote_autogamemode_timeleft = 100 //Length of time before round start when autogamemode vote is called (in seconds, default 100). + var/static/vote_no_default = 0 // vote does not default to nochange/norestart (tbi) + var/static/vote_no_dead = 0 // dead people can't vote (tbi) +// var/static/enable_authentication = 0 // goon authentication + var/static/del_new_on_log = 1 // del's new players if they log before they spawn in + var/static/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard + var/static/traitor_scaling = 0 //if amount of traitors scales based on amount of players + var/static/objectives_disabled = 0 //if objectives are disabled or not + var/static/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other + var/static/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. + var/static/allow_Metadata = 0 // Metadata is supported. + var/static/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. + var/static/fps = 20 + var/static/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling + var/static/Tickcomp = 0 + var/static/socket_talk = 0 // use socket_talk to communicate with other processes + var/static/list/resource_urls = null + var/static/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. + var/static/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. + var/static/list/mode_names = list() + var/static/list/modes = list() // allowed modes + var/static/list/votable_modes = list() // votable modes + var/static/list/probabilities = list() // relative probability of each mode + var/static/list/player_requirements = list() // Overrides for how many players readied up a gamemode needs to start. + var/static/list/player_requirements_secret = list() // Same as above, but for the secret gamemode. + var/static/humans_need_surnames = 0 + var/static/allow_random_events = 0 // enables random events mid-round when set to 1 + var/static/enable_game_master = 0 // enables the 'smart' event system. + var/static/allow_ai = 1 // allow ai job + var/static/allow_ai_shells = FALSE // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable. + var/static/give_free_ai_shell = FALSE // allows a specific spawner object to instantiate a premade AI Shell + var/static/hostedby = null + + var/static/respawn = 1 + var/static/respawn_time = 3000 // time before a dead player is allowed to respawn (in ds, though the config file asks for minutes, and it's converted below) + var/static/respawn_message = "Make sure to play a different character, and please roleplay correctly!" + + var/static/guest_jobban = 1 + var/static/usewhitelist = 0 + var/static/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0 + var/static/show_mods = 0 + var/static/show_devs = 0 + var/static/show_event_managers = 0 + var/static/mods_can_tempban = 0 + var/static/mods_can_job_tempban = 0 + var/static/mod_tempban_max = 1440 + var/static/mod_job_tempban_max = 1440 + var/static/load_jobs_from_txt = 0 + var/static/ToRban = 0 + var/static/automute_on = 0 //enables automuting/spam prevention + var/static/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. + + var/static/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds... + var/static/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. + + var/static/character_slots = 10 // The number of available character slots + var/static/loadout_slots = 3 // The number of loadout slots per character + + var/static/max_maint_drones = 5 //This many drones can spawn, + var/static/allow_drone_spawn = 1 //assuming the admin allow them to. + var/static/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes. + + var/static/disable_player_mice = 0 + var/static/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech + + var/static/usealienwhitelist = 0 + var/static/limitalienplayers = 0 + var/static/alien_to_human_ratio = 0.5 + var/static/allow_extra_antags = 0 + var/static/guests_allowed = 1 + var/static/debugparanoid = 0 + var/static/panic_bunker = 0 + var/static/paranoia_logging = 0 + + var/static/ip_reputation = FALSE //Should we query IPs to get scores? Generates HTTP traffic to an API service. + var/static/ipr_email //Left null because you MUST specify one otherwise you're making the internet worse. + var/static/ipr_block_bad_ips = FALSE //Should we block anyone who meets the minimum score below? Otherwise we just log it (If paranoia logging is on, visibly in chat). + var/static/ipr_bad_score = 1 //The API returns a value between 0 and 1 (inclusive), with 1 being 'definitely VPN/Tor/Proxy'. Values equal/above this var are considered bad. + var/static/ipr_allow_existing = FALSE //Should we allow known players to use VPNs/Proxies? If the player is already banned then obviously they still can't connect. + var/static/ipr_minimum_age = 5 //How many days before a player is considered 'fine' for the purposes of allowing them to use VPNs. + + var/static/serverurl + var/static/server + var/static/banappeals + var/static/wikiurl + var/static/wikisearchurl + var/static/forumurl + var/static/githuburl + var/static/rulesurl + var/static/mapurl + + //Alert level description + var/static/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." + var/static/alert_desc_yellow_upto = "A minor security emergency has developed. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." + var/static/alert_desc_yellow_downto = "Code yellow procedures are now in effect. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." + var/static/alert_desc_violet_upto = "A major medical emergency has developed. Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey all relevant instructions from medical staff." + var/static/alert_desc_violet_downto = "Code violet procedures are now in effect; Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey relevant instructions from medical staff." + var/static/alert_desc_orange_upto = "A major engineering emergency has developed. Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." + var/static/alert_desc_orange_downto = "Code orange procedures are now in effect; Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." + var/static/alert_desc_blue_upto = "A major security emergency has developed. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." + var/static/alert_desc_blue_downto = "Code blue procedures are now in effect. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." + var/static/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/static/alert_desc_red_downto = "The self-destruct mechanism has been deactivated, 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/static/alert_desc_delta = "The station's self-destruct mechanism has been engaged. 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/static/forbid_singulo_possession = 0 + + //game_options.txt configs + + var/static/health_threshold_softcrit = 0 + var/static/health_threshold_crit = 0 + var/static/health_threshold_dead = -100 + + var/static/organ_health_multiplier = 1 + var/static/organ_regeneration_multiplier = 1 + var/static/organs_decay + var/static/default_brain_health = 400 + var/static/allow_headgibs = FALSE + + //Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt, + //so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun. + var/static/organ_damage_spillover_multiplier = 0.5 + + var/static/bones_can_break = 0 + var/static/limbs_can_break = 0 + + var/static/revival_pod_plants = 1 + var/static/revival_cloning = 1 + var/static/revival_brain_life = -1 + + var/static/use_loyalty_implants = 0 + + var/static/welder_vision = 1 + var/static/generate_map = 0 + var/static/no_click_cooldown = 0 + + //Used for modifying movement speed for mobs. + //Unversal modifiers + var/static/run_speed = 0 + var/static/walk_speed = 0 + + //Mob specific modifiers. NOTE: These will affect different mob types in different ways + var/static/human_delay = 0 + var/static/robot_delay = 0 + var/static/monkey_delay = 0 + var/static/alien_delay = 0 + var/static/slime_delay = 0 + var/static/animal_delay = 0 + + var/static/footstep_volume = 0 + + var/static/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/static/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/static/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database + var/static/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database + + var/static/simultaneous_pm_warning_timeout = 100 + + var/static/use_recursive_explosions //Defines whether the server uses recursive or circular explosions. + var/static/multi_z_explosion_scalar = 0.5 //Multiplier for how much weaker explosions are on neighboring z levels. + + var/static/assistant_maint = 0 //Do assistants get maint access? + var/static/gateway_delay = 18000 //How long the gateway takes before it activates. Default is half an hour. + var/static/ghost_interaction = 0 + + var/static/comms_password = "" + + var/static/enter_allowed = 1 + + var/use_irc_bot = 0 + var/use_node_bot = 0 + var/irc_bot_port = 0 + var/irc_bot_host = "" + var/irc_bot_export = 0 // whether the IRC bot in use is a Bot32 (or similar) instance; Bot32 uses world.Export() instead of nudge.py/libnudge + var/main_irc = "" + var/admin_irc = "" + var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix + var/use_lib_nudge = 0 //Use the C library nudge instead of the python nudge. + var/use_overmap = 0 + + var/static/list/engine_map = list("Supermatter Engine", "Edison's Bane") // Comma separated list of engines to choose from. Blank means fully random. + + // Event settings + var/static/expected_round_length = 3 * 60 * 60 * 10 // 3 hours + // If the first delay has a custom start time + // No custom time, no custom time, between 80 to 100 minutes respectively. + var/static/list/event_first_run = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000)) + // The lowest delay until next event + // 10, 30, 50 minutes respectively + var/static/list/event_delay_lower = list(EVENT_LEVEL_MUNDANE = 6000, EVENT_LEVEL_MODERATE = 18000, EVENT_LEVEL_MAJOR = 30000) + // The upper delay until next event + // 15, 45, 70 minutes respectively + var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) + + var/static/aliens_allowed = 0 + var/static/ninjas_allowed = 0 + var/static/abandon_allowed = 1 + var/static/ooc_allowed = 1 + var/static/looc_allowed = 1 + var/static/dooc_allowed = 1 + var/static/dsay_allowed = 1 + + var/persistence_disabled = FALSE + var/persistence_ignore_mapload = FALSE + + var/allow_byond_links = 0 + var/allow_discord_links = 0 + var/allow_url_links = 0 // honestly if I were you i'd leave this one off, only use in dire situations + + var/starlight = 0 // Whether space turfs have ambient light or not + + var/static/list/ert_species = list(SPECIES_HUMAN) + + var/static/law_zero = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010" + + var/static/aggressive_changelog = 0 + + var/static/list/language_prefixes = list(",","#")//Default language prefixes + + var/static/show_human_death_message = 1 + + var/static/radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB // 0:1 subtraction:division for computing effective radiation on a turf + var/static/radiation_decay_rate = 1 //How much radiation is reduced by each tick + var/static/radiation_resistance_multiplier = 8.5 //VOREstation edit + var/static/radiation_material_resistance_divisor = 1 + var/static/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it. + + var/static/random_submap_orientation = FALSE // If true, submaps loaded automatically can be rotated. + var/static/autostart_solars = FALSE // If true, specifically mapped in solar control computers will set themselves up when the round starts. + + // New shiny SQLite stuff. + // The basics. + var/static/sqlite_enabled = FALSE // If it should even be active. SQLite can be ran alongside other databases but you should not have them do the same functions. + + // In-Game Feedback. + var/static/sqlite_feedback = FALSE // Feedback cannot be submitted if this is false. + var/static/list/sqlite_feedback_topics = list("General") // A list of 'topics' that feedback can be catagorized under by the submitter. + var/static/sqlite_feedback_privacy = FALSE // If true, feedback submitted can have its author name be obfuscated. This is not 100% foolproof (it's md5 ffs) but can stop casual snooping. + var/static/sqlite_feedback_cooldown = 0 // How long one must wait, in days, to submit another feedback form. Used to help prevent spam, especially with privacy active. 0 = No limit. + var/static/sqlite_feedback_min_age = 0 // Used to block new people from giving feedback. This metric is very bad but it can help slow down spammers. + + var/static/defib_timer = 10 // How long until someone can't be defibbed anymore, in minutes. + var/static/defib_braindamage_timer = 2 // How long until someone will get brain damage when defibbed, in minutes. The closer to the end of the above timer, the more brain damage they get. + + // disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing. + var/static/disable_cid_warn_popup = FALSE + + // whether or not to use the nightshift subsystem to perform lighting changes + var/static/enable_night_shifts = FALSE + + // How strictly the loadout enforces object species whitelists + var/loadout_whitelist = LOADOUT_WHITELIST_LAX + + var/static/vgs_access_identifier = null // VOREStation Edit - VGS + var/static/vgs_server_port = null // VOREStation Edit - VGS + + var/disable_webhook_embeds = FALSE + + var/static/list/jukebox_track_files + +/datum/configuration/New() + var/list/L = typesof(/datum/game_mode) - /datum/game_mode + for (var/T in L) + // 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) + gamemode_cache[M.config_tag] = M // So we don't instantiate them repeatedly. + if(!(M.config_tag in modes)) // ensure each mode is added only once + log_misc("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 + player_requirements[M.config_tag] = M.required_players + player_requirements_secret[M.config_tag] = M.required_players_secret + if (M.votable) + src.votable_modes += M.config_tag + src.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 ("resource_urls") + config.resource_urls = splittext(value, " ") + + 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_age_restriction_for_antags") + config.use_age_restriction_for_antags = 1 + + if ("jobs_have_minimal_access") + config.jobs_have_minimal_access = 1 + + if ("use_recursive_explosions") + use_recursive_explosions = 1 + + if ("multi_z_explosion_scalar") + multi_z_explosion_scalar = text2num(value) + + if ("log_ooc") + config.log_ooc = 1 + + if ("log_access") + config.log_access = 1 + + if ("sql_enabled") + config.sql_enabled = 1 + + if ("log_say") + config.log_say = 1 + + if ("debug_paranoid") + config.debugparanoid = 1 + + if ("log_admin") + config.log_admin = 1 + + if ("log_debug") + config.log_debug = text2num(value) + + 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_adminwarn") + config.log_adminwarn = 1 + + if ("log_pda") + config.log_pda = 1 + + if ("log_world_output") + config.log_world_output = 1 + + if ("log_hrefs") + config.log_hrefs = 1 + + if ("log_runtime") + config.log_runtime = 1 + + if ("log_graffiti") + config.log_graffiti = 1 + + if ("generate_map") + config.generate_map = 1 + + if ("no_click_cooldown") + config.no_click_cooldown = 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 ("allow_admin_jump") + config.allow_admin_jump = 1 + + if("allow_admin_rev") + config.allow_admin_rev = 1 + + if ("allow_admin_spawning") + config.allow_admin_spawning = 1 + + if ("allow_byond_links") + allow_byond_links = 1 + + if ("allow_discord_links") + allow_discord_links = 1 + + if ("allow_url_links") + allow_url_links = 1 + + if ("no_dead_vote") + config.vote_no_dead = 1 + + if ("default_no_vote") + config.vote_no_default = 1 + + if ("pregame_time") + config.pregame_time = text2num(value) + + if ("vote_delay") + config.vote_delay = text2num(value) + + if ("vote_period") + config.vote_period = text2num(value) + + if ("vote_autotransfer_initial") + config.vote_autotransfer_initial = text2num(value) + + if ("vote_autotransfer_interval") + config.vote_autotransfer_interval = text2num(value) + + if ("vote_autogamemode_timeleft") + config.vote_autogamemode_timeleft = text2num(value) + + if("ert_admin_only") + config.ert_admin_call_only = 1 + + if ("allow_ai") + config.allow_ai = 1 + + if ("allow_ai_shells") + config.allow_ai_shells = TRUE + + if("give_free_ai_shell") + config.give_free_ai_shell = TRUE + +// if ("authentication") +// config.enable_authentication = 1 + + if ("norespawn") + config.respawn = 0 + + if ("respawn_time") + var/raw_minutes = text2num(value) + config.respawn_time = raw_minutes MINUTES + + if ("respawn_message") + config.respawn_message = "[value]" + + if ("servername") + config.server_name = value + + if ("serversuffix") + config.server_suffix = 1 + + if ("nudge_script_path") + config.nudge_script_path = value + + if ("hostedby") + config.hostedby = value + + if ("serverurl") + config.serverurl = value + + if ("server") + config.server = value + + if ("banappeals") + config.banappeals = value + + if ("wikiurl") + config.wikiurl = value + + if ("wikisearchurl") + config.wikisearchurl = value + + if ("forumurl") + config.forumurl = value + + if ("rulesurl") + config.rulesurl = value + + if ("mapurl") + config.mapurl = value + + if ("githuburl") + config.githuburl = value + if ("guest_jobban") + config.guest_jobban = 1 + + if ("guest_ban") + config.guests_allowed = 0 + + if ("disable_ooc") + config.ooc_allowed = 0 + config.looc_allowed = 0 + + if ("disable_entry") + config.enter_allowed = 0 + + if ("disable_dead_ooc") + config.dooc_allowed = 0 + + if ("disable_dsay") + config.dsay_allowed = 0 + + if ("disable_respawn") + config.abandon_allowed = 0 + + if ("usewhitelist") + config.usewhitelist = 1 + + if ("feature_object_spell_system") + config.feature_object_spell_system = 1 + + if ("allow_metadata") + config.allow_Metadata = 1 + + if ("traitor_scaling") + config.traitor_scaling = 1 + + if ("aliens_allowed") + config.aliens_allowed = 1 + + if ("ninjas_allowed") + config.ninjas_allowed = 1 + + if ("objectives_disabled") + config.objectives_disabled = 1 + + if("protect_roles_from_antagonist") + config.protect_roles_from_antagonist = 1 + + if("persistence_disabled") + config.persistence_disabled = TRUE // Previously this forcibly set persistence enabled in the saves. + + if("persistence_ignore_mapload") + config.persistence_ignore_mapload = TRUE + + 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 + log_misc("Unknown game mode probability configuration definition: [prob_name].") + else + log_misc("Incorrect probability configuration definition: [prob_name] [prob_value].") + + if ("required_players", "required_players_secret") + var/req_pos = findtext(value, " ") + var/req_name = null + var/req_value = null + var/is_secret_override = findtext(name, "required_players_secret") // Being extra sure we're not picking up an override for Secret by accident. + + if(req_pos) + req_name = lowertext(copytext(value, 1, req_pos)) + req_value = copytext(value, req_pos + 1) + if(req_name in config.modes) + if(is_secret_override) + config.player_requirements_secret[req_name] = text2num(req_value) + else + config.player_requirements[req_name] = text2num(req_value) + else + log_misc("Unknown game mode player requirement configuration definition: [req_name].") + else + log_misc("Incorrect player requirement configuration definition: [req_name] [req_value].") + + if("allow_random_events") + config.allow_random_events = 1 + + if("enable_game_master") + config.enable_game_master = 1 + + if("kick_inactive") + config.kick_inactive = text2num(value) + + if("show_mods") + config.show_mods = 1 + + if("show_devs") + config.show_devs = 1 + + if("show_event_managers") + config.show_event_managers = 1 + + if("mods_can_tempban") + config.mods_can_tempban = 1 + + if("mods_can_job_tempban") + config.mods_can_job_tempban = 1 + + if("mod_tempban_max") + config.mod_tempban_max = text2num(value) + + if("mod_job_tempban_max") + config.mod_job_tempban_max = text2num(value) + + if("load_jobs_from_txt") + load_jobs_from_txt = 1 + + 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("forbid_singulo_possession") + forbid_singulo_possession = 1 + + if("popup_admin_pm") + config.popup_admin_pm = 1 + + if("allow_holidays") + Holiday = 1 + + if("use_irc_bot") + use_irc_bot = 1 + + if("use_node_bot") + use_node_bot = 1 + + if("irc_bot_port") + config.irc_bot_port = value + + if("irc_bot_export") + irc_bot_export = 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("allow_antag_hud") + config.antag_hud_allowed = 1 + if("antag_hud_restricted") + config.antag_hud_restricted = 1 + + if("socket_talk") + socket_talk = text2num(value) + + if("tickcomp") + Tickcomp = 1 + + if("humans_need_surnames") + humans_need_surnames = 1 + + if("tor_ban") + ToRban = 1 + + if("automute_on") + automute_on = 1 + + if("usealienwhitelist") + usealienwhitelist = 1 + + if("alien_player_ratio") + limitalienplayers = 1 + alien_to_human_ratio = text2num(value) + + if("assistant_maint") + config.assistant_maint = 1 + + if("gateway_delay") + config.gateway_delay = text2num(value) + + if("continuous_rounds") + config.continous_rounds = 1 + + if("ghost_interaction") + config.ghost_interaction = 1 + + if("disable_player_mice") + config.disable_player_mice = 1 + + if("uneducated_mice") + config.uneducated_mice = 1 + + if("comms_password") + config.comms_password = value + + if("irc_bot_host") + config.irc_bot_host = value + + if("main_irc") + config.main_irc = value + + if("admin_irc") + config.admin_irc = value + + if("python_path") + if(value) + config.python_path = value + + if("use_lib_nudge") + config.use_lib_nudge = 1 + + if("allow_cult_ghostwriter") + config.cult_ghostwriter = 1 + + if("req_cult_ghostwriter") + config.cult_ghostwriter_req_cultists = text2num(value) + + if("character_slots") + config.character_slots = text2num(value) + + if("loadout_slots") + config.loadout_slots = text2num(value) + + if("allow_drone_spawn") + config.allow_drone_spawn = text2num(value) + + if("drone_build_time") + config.drone_build_time = text2num(value) + + if("max_maint_drones") + config.max_maint_drones = text2num(value) + + if("use_overmap") + config.use_overmap = 1 + + if("engine_map") + config.engine_map = splittext(value, ",") +/* + if("station_levels") + using_map.station_levels = text2numlist(value, ";") + + if("admin_levels") + using_map.admin_levels = text2numlist(value, ";") + + if("contact_levels") + using_map.contact_levels = text2numlist(value, ";") + + if("player_levels") + using_map.player_levels = text2numlist(value, ";") +*/ + if("expected_round_length") + config.expected_round_length = MinutesToTicks(text2num(value)) + + if("disable_welder_vision") + config.welder_vision = 0 + + if("allow_extra_antags") + config.allow_extra_antags = 1 + + if("event_custom_start_mundane") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_custom_start_moderate") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_custom_start_major") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_delay_lower") + var/values = text2numlist(value, ";") + config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) + config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) + config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) + + if("event_delay_upper") + var/values = text2numlist(value, ";") + config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) + config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) + config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) + + if("starlight") + value = text2num(value) + config.starlight = value >= 0 ? value : 0 + + if("ert_species") + config.ert_species = splittext(value, ";") + if(!config.ert_species.len) + config.ert_species += SPECIES_HUMAN + + if("law_zero") + law_zero = value + + if("aggressive_changelog") + config.aggressive_changelog = 1 + + if("default_language_prefixes") + var/list/values = splittext(value, " ") + if(values.len > 0) + language_prefixes = values + + if("radiation_lower_limit") + radiation_lower_limit = text2num(value) + + if("radiation_resistance_calc_divide") + radiation_resistance_calc_mode = RAD_RESIST_CALC_DIV + + if("radiation_resistance_calc_subtract") + radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB + + if("radiation_resistance_multiplier") + radiation_resistance_multiplier = text2num(value) + + if("radiation_material_resistance_divisor") + radiation_material_resistance_divisor = text2num(value) + + if("radiation_decay_rate") + radiation_decay_rate = text2num(value) + + if ("panic_bunker") + config.panic_bunker = 1 + + if ("paranoia_logging") + config.paranoia_logging = 1 + + if("ip_reputation") + config.ip_reputation = 1 + + if("ipr_email") + config.ipr_email = value + + if("ipr_block_bad_ips") + config.ipr_block_bad_ips = 1 + + if("ipr_bad_score") + config.ipr_bad_score = text2num(value) + + if("ipr_allow_existing") + config.ipr_allow_existing = 1 + + if("ipr_minimum_age") + config.ipr_minimum_age = text2num(value) + + if("random_submap_orientation") + config.random_submap_orientation = 1 + + if("autostart_solars") + config.autostart_solars = TRUE + + if("sqlite_enabled") + config.sqlite_enabled = TRUE + + if("sqlite_feedback") + config.sqlite_feedback = TRUE + + if("sqlite_feedback_topics") + config.sqlite_feedback_topics = splittext(value, ";") + if(!config.sqlite_feedback_topics.len) + config.sqlite_feedback_topics += "General" + + if("sqlite_feedback_privacy") + config.sqlite_feedback_privacy = TRUE + + if("sqlite_feedback_cooldown") + config.sqlite_feedback_cooldown = text2num(value) + + if("defib_timer") + config.defib_timer = text2num(value) + + if("defib_braindamage_timer") + config.defib_braindamage_timer = text2num(value) + + if("disable_cid_warn_popup") + config.disable_cid_warn_popup = TRUE + + if("enable_night_shifts") + config.enable_night_shifts = TRUE + + if("jukebox_track_files") + config.jukebox_track_files = splittext(value, ";") + + // VOREStation Edit Start - Can't be in _vr file because it is loaded too late. + if("vgs_access_identifier") + config.vgs_access_identifier = value + if("vgs_server_port") + config.vgs_server_port = text2num(value) + // VOREStation Edit End + + else + log_misc("Unknown setting in configuration: '[name]'") + + else if(type == "game_options") + if(!value) + log_misc("Unknown value for setting [name] in [filename].") + value = text2num(value) + + switch(name) + if("health_threshold_crit") + config.health_threshold_crit = value + if("health_threshold_softcrit") + config.health_threshold_softcrit = value + if("health_threshold_dead") + config.health_threshold_dead = value + if("show_human_death_message") + config.show_human_death_message = 1 + if("revival_pod_plants") + config.revival_pod_plants = value + if("revival_cloning") + config.revival_cloning = value + if("revival_brain_life") + config.revival_brain_life = value + if("organ_health_multiplier") + config.organ_health_multiplier = value / 100 + if("organ_regeneration_multiplier") + config.organ_regeneration_multiplier = value / 100 + if("organ_damage_spillover_multiplier") + config.organ_damage_spillover_multiplier = value / 100 + if("organs_can_decay") + config.organs_decay = 1 + if("default_brain_health") + config.default_brain_health = text2num(value) + if(!config.default_brain_health || config.default_brain_health < 1) + config.default_brain_health = initial(config.default_brain_health) + if("bones_can_break") + config.bones_can_break = value + if("limbs_can_break") + config.limbs_can_break = value + if("allow_headgibs") + config.allow_headgibs = TRUE + + if("run_speed") + config.run_speed = value + if("walk_speed") + config.walk_speed = value + + if("human_delay") + config.human_delay = value + if("robot_delay") + config.robot_delay = value + if("monkey_delay") + config.monkey_delay = value + if("alien_delay") + config.alien_delay = value + if("slime_delay") + config.slime_delay = value + if("animal_delay") + config.animal_delay = value + + if("footstep_volume") + config.footstep_volume = text2num(value) + + if("use_loyalty_implants") + config.use_loyalty_implants = 1 + + if("loadout_whitelist") + config.loadout_whitelist = text2num(value) + + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/loadsql(filename) // -- TLE + 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 ("address") + sqladdress = value + if ("port") + sqlport = value + if ("database") + sqldb = value + if ("login") + sqllogin = value + if ("password") + sqlpass = value + if ("feedback_database") + sqlfdbkdb = value + if ("feedback_login") + sqlfdbklogin = value + if ("feedback_password") + sqlfdbkpass = value + if ("enable_stat_tracking") + sqllogging = 1 + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/loadforumsql(filename) // -- TLE + 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 ("address") + forumsqladdress = value + if ("port") + forumsqlport = value + if ("database") + forumsqldb = value + if ("login") + forumsqllogin = value + if ("password") + forumsqlpass = value + if ("activatedgroup") + forum_activated_group = value + if ("authenticatedgroup") + forum_authenticated_group = value + else + log_misc("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/game_mode in gamemode_cache) + var/datum/game_mode/M = gamemode_cache[game_mode] + if (M.config_tag && M.config_tag == mode_name) + return M + return gamemode_cache["extended"] + +/datum/configuration/proc/get_runnable_modes() + var/list/runnable_modes = list() + for(var/game_mode in gamemode_cache) + var/datum/game_mode/M = gamemode_cache[game_mode] + if(M && M.can_start() && !isnull(config.probabilities[M.config_tag]) && config.probabilities[M.config_tag] > 0) + runnable_modes |= M + return runnable_modes + +/datum/configuration/proc/post_load() + //apply a default value to config.python_path, if needed + if (!config.python_path) + if(world.system_type == UNIX) + config.python_path = "/usr/bin/env python2" + else //probably windows, if not this should work anyway + config.python_path = "python" +======= +var/list/gamemode_cache = list() + +/datum/configuration + var/static/server_name = null // server name (for world name / status) + var/static/server_suffix = 0 // generate numeric suffix based on server port + + var/static/nudge_script_path = "nudge.py" // where the nudge.py script is located + + var/static/log_ooc = 0 // log OOC channel + var/static/log_access = 0 // log login/logout + var/static/log_say = 0 // log client say + var/static/log_admin = 0 // log admin actions + var/static/log_debug = 1 // log debug output + var/static/log_game = 0 // log game events + var/static/log_vote = 0 // log voting + var/static/log_whisper = 0 // log client whisper + var/static/log_emote = 0 // log emotes + var/static/log_attack = 0 // log attack messages + var/static/log_adminchat = 0 // log admin chat messages + var/static/log_adminwarn = 0 // log warnings admins get about bomb construction and such + var/static/log_pda = 0 // log pda messages + var/static/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits + var/static/log_runtime = 0 // logs world.log to a file + var/static/log_world_output = 0 // log to_world_log(messages) + var/static/log_graffiti = 0 // logs graffiti + var/static/sql_enabled = 0 // for sql switching + var/static/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour + var/static/allow_vote_restart = 0 // allow votes to restart + var/static/ert_admin_call_only = 0 + var/static/allow_vote_mode = 0 // allow votes to change mode + var/static/allow_admin_jump = 1 // allows admin jumping + var/static/allow_admin_spawning = 1 // allows admin item spawning + var/static/allow_admin_rev = 1 // allows admin revives + var/static/pregame_time = 180 // pregame time in seconds + var/static/vote_delay = 6000 // minimum time between voting sessions (deciseconds, 10 minute default) + var/static/vote_period = 600 // length of voting period (deciseconds, default 1 minute) + var/static/vote_autotransfer_initial = 108000 // Length of time before the first autotransfer vote is called + var/static/vote_autotransfer_interval = 36000 // length of time before next sequential autotransfer vote + var/static/vote_autogamemode_timeleft = 100 //Length of time before round start when autogamemode vote is called (in seconds, default 100). + var/static/vote_no_default = 0 // vote does not default to nochange/norestart (tbi) + var/static/vote_no_dead = 0 // dead people can't vote (tbi) +// var/static/enable_authentication = 0 // goon authentication + var/static/del_new_on_log = 1 // del's new players if they log before they spawn in + var/static/feature_object_spell_system = 0 //spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard + var/static/traitor_scaling = 0 //if amount of traitors scales based on amount of players + var/static/objectives_disabled = 0 //if objectives are disabled or not + var/static/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other + var/static/continous_rounds = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. + var/static/allow_Metadata = 0 // Metadata is supported. + var/static/popup_admin_pm = 0 //adminPMs to non-admins show in a pop-up 'reply' window when set to 1. + var/static/fps = 20 + var/static/tick_limit_mc_init = TICK_LIMIT_MC_INIT_DEFAULT //SSinitialization throttling + var/static/Tickcomp = 0 + var/static/socket_talk = 0 // use socket_talk to communicate with other processes + var/static/list/resource_urls = null + var/static/antag_hud_allowed = 0 // Ghosts can turn on Antagovision to see a HUD of who is the bad guys this round. + var/static/antag_hud_restricted = 0 // Ghosts that turn on Antagovision cannot rejoin the round. + var/static/list/mode_names = list() + var/static/list/modes = list() // allowed modes + var/static/list/votable_modes = list() // votable modes + var/static/list/probabilities = list() // relative probability of each mode + var/static/list/player_requirements = list() // Overrides for how many players readied up a gamemode needs to start. + var/static/list/player_requirements_secret = list() // Same as above, but for the secret gamemode. + var/static/humans_need_surnames = 0 + var/static/allow_random_events = 0 // enables random events mid-round when set to 1 + var/static/enable_game_master = 0 // enables the 'smart' event system. + var/static/allow_ai = 1 // allow ai job + var/static/allow_ai_shells = FALSE // allow AIs to enter and leave special borg shells at will, and for those shells to be buildable. + var/static/give_free_ai_shell = FALSE // allows a specific spawner object to instantiate a premade AI Shell + var/static/hostedby = null + + var/static/respawn = 1 + var/static/respawn_time = 3000 // time before a dead player is allowed to respawn (in ds, though the config file asks for minutes, and it's converted below) + var/static/respawn_message = "Make sure to play a different character, and please roleplay correctly!" + + var/static/guest_jobban = 1 + var/static/usewhitelist = 0 + var/static/kick_inactive = 0 //force disconnect for inactive players after this many minutes, if non-0 + var/static/show_mods = 0 + var/static/show_devs = 0 + var/static/show_event_managers = 0 + var/static/mods_can_tempban = 0 + var/static/mods_can_job_tempban = 0 + var/static/mod_tempban_max = 1440 + var/static/mod_job_tempban_max = 1440 + var/static/load_jobs_from_txt = 0 + var/static/ToRban = 0 + var/static/automute_on = 0 //enables automuting/spam prevention + var/static/jobs_have_minimal_access = 0 //determines whether jobs use minimal access or expanded access. + + var/static/cult_ghostwriter = 1 //Allows ghosts to write in blood in cult rounds... + var/static/cult_ghostwriter_req_cultists = 10 //...so long as this many cultists are active. + + var/static/character_slots = 10 // The number of available character slots + var/static/loadout_slots = 3 // The number of loadout slots per character + + var/static/max_maint_drones = 5 //This many drones can spawn, + var/static/allow_drone_spawn = 1 //assuming the admin allow them to. + var/static/drone_build_time = 1200 //A drone will become available every X ticks since last drone spawn. Default is 2 minutes. + + var/static/disable_player_mice = 0 + var/static/uneducated_mice = 0 //Set to 1 to prevent newly-spawned mice from understanding human speech + + var/static/usealienwhitelist = 0 + var/static/limitalienplayers = 0 + var/static/alien_to_human_ratio = 0.5 + var/static/allow_extra_antags = 0 + var/static/guests_allowed = 1 + var/static/debugparanoid = 0 + var/static/panic_bunker = 0 + var/static/paranoia_logging = 0 + + var/static/ip_reputation = FALSE //Should we query IPs to get scores? Generates HTTP traffic to an API service. + var/static/ipr_email //Left null because you MUST specify one otherwise you're making the internet worse. + var/static/ipr_block_bad_ips = FALSE //Should we block anyone who meets the minimum score below? Otherwise we just log it (If paranoia logging is on, visibly in chat). + var/static/ipr_bad_score = 1 //The API returns a value between 0 and 1 (inclusive), with 1 being 'definitely VPN/Tor/Proxy'. Values equal/above this var are considered bad. + var/static/ipr_allow_existing = FALSE //Should we allow known players to use VPNs/Proxies? If the player is already banned then obviously they still can't connect. + var/static/ipr_minimum_age = 5 //How many days before a player is considered 'fine' for the purposes of allowing them to use VPNs. + + var/static/serverurl + var/static/server + var/static/banappeals + var/static/wikiurl + var/static/wikisearchurl + var/static/forumurl + var/static/githuburl + var/static/discordurl + var/static/rulesurl + var/static/mapurl + + //Alert level description + var/static/alert_desc_green = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." + var/static/alert_desc_yellow_upto = "A minor security emergency has developed. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." + var/static/alert_desc_yellow_downto = "Code yellow procedures are now in effect. Security personnel are to report to their supervisor for orders and may have weapons visible on their person. Privacy laws are still enforced." + var/static/alert_desc_violet_upto = "A major medical emergency has developed. Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey all relevant instructions from medical staff." + var/static/alert_desc_violet_downto = "Code violet procedures are now in effect; Medical personnel are required to report to their supervisor for orders, and non-medical personnel are required to obey relevant instructions from medical staff." + var/static/alert_desc_orange_upto = "A major engineering emergency has developed. Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." + var/static/alert_desc_orange_downto = "Code orange procedures are now in effect; Engineering personnel are required to report to their supervisor for orders, and non-engineering personnel are required to evacuate any affected areas and obey relevant instructions from engineering staff." + var/static/alert_desc_blue_upto = "A major security emergency has developed. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." + var/static/alert_desc_blue_downto = "Code blue procedures are now in effect. Security personnel are to report to their supervisor for orders, are permitted to search staff and facilities, and may have weapons visible on their person." + var/static/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/static/alert_desc_red_downto = "The self-destruct mechanism has been deactivated, 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/static/alert_desc_delta = "The station's self-destruct mechanism has been engaged. 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/static/forbid_singulo_possession = 0 + + //game_options.txt configs + + var/static/health_threshold_softcrit = 0 + var/static/health_threshold_crit = 0 + var/static/health_threshold_dead = -100 + + var/static/organ_health_multiplier = 1 + var/static/organ_regeneration_multiplier = 1 + var/static/organs_decay + var/static/default_brain_health = 400 + var/static/allow_headgibs = FALSE + + //Paincrit knocks someone down once they hit 60 shock_stage, so by default make it so that close to 100 additional damage needs to be dealt, + //so that it's similar to HALLOSS. Lowered it a bit since hitting paincrit takes much longer to wear off than a halloss stun. + var/static/organ_damage_spillover_multiplier = 0.5 + + var/static/bones_can_break = 0 + var/static/limbs_can_break = 0 + + var/static/revival_pod_plants = 1 + var/static/revival_cloning = 1 + var/static/revival_brain_life = -1 + + var/static/use_loyalty_implants = 0 + + var/static/welder_vision = 1 + var/static/generate_map = 0 + var/static/no_click_cooldown = 0 + + //Used for modifying movement speed for mobs. + //Unversal modifiers + var/static/run_speed = 0 + var/static/walk_speed = 0 + + //Mob specific modifiers. NOTE: These will affect different mob types in different ways + var/static/human_delay = 0 + var/static/robot_delay = 0 + var/static/monkey_delay = 0 + var/static/alien_delay = 0 + var/static/slime_delay = 0 + var/static/animal_delay = 0 + + var/static/footstep_volume = 0 + + var/static/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/static/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/static/use_age_restriction_for_jobs = 0 //Do jobs use account age restrictions? --requires database + var/static/use_age_restriction_for_antags = 0 //Do antags use account age restrictions? --requires database + + var/static/simultaneous_pm_warning_timeout = 100 + + var/static/use_recursive_explosions //Defines whether the server uses recursive or circular explosions. + var/static/multi_z_explosion_scalar = 0.5 //Multiplier for how much weaker explosions are on neighboring z levels. + + var/static/assistant_maint = 0 //Do assistants get maint access? + var/static/gateway_delay = 18000 //How long the gateway takes before it activates. Default is half an hour. + var/static/ghost_interaction = 0 + + var/static/comms_password = "" + + var/static/enter_allowed = 1 + + var/use_irc_bot = 0 + var/use_node_bot = 0 + var/irc_bot_port = 0 + var/irc_bot_host = "" + var/irc_bot_export = 0 // whether the IRC bot in use is a Bot32 (or similar) instance; Bot32 uses world.Export() instead of nudge.py/libnudge + var/main_irc = "" + var/admin_irc = "" + var/python_path = "" //Path to the python executable. Defaults to "python" on windows and "/usr/bin/env python2" on unix + var/use_lib_nudge = 0 //Use the C library nudge instead of the python nudge. + var/use_overmap = 0 + + var/static/list/engine_map = list("Supermatter Engine", "Edison's Bane") // Comma separated list of engines to choose from. Blank means fully random. + + // Event settings + var/static/expected_round_length = 3 * 60 * 60 * 10 // 3 hours + // If the first delay has a custom start time + // No custom time, no custom time, between 80 to 100 minutes respectively. + var/static/list/event_first_run = list(EVENT_LEVEL_MUNDANE = null, EVENT_LEVEL_MODERATE = null, EVENT_LEVEL_MAJOR = list("lower" = 48000, "upper" = 60000)) + // The lowest delay until next event + // 10, 30, 50 minutes respectively + var/static/list/event_delay_lower = list(EVENT_LEVEL_MUNDANE = 6000, EVENT_LEVEL_MODERATE = 18000, EVENT_LEVEL_MAJOR = 30000) + // The upper delay until next event + // 15, 45, 70 minutes respectively + var/static/list/event_delay_upper = list(EVENT_LEVEL_MUNDANE = 9000, EVENT_LEVEL_MODERATE = 27000, EVENT_LEVEL_MAJOR = 42000) + + var/static/aliens_allowed = 0 + var/static/ninjas_allowed = 0 + var/static/abandon_allowed = 1 + var/static/ooc_allowed = 1 + var/static/looc_allowed = 1 + var/static/dooc_allowed = 1 + var/static/dsay_allowed = 1 + + var/persistence_disabled = FALSE + var/persistence_ignore_mapload = FALSE + + var/allow_byond_links = 0 + var/allow_discord_links = 0 + var/allow_url_links = 0 // honestly if I were you i'd leave this one off, only use in dire situations + + var/starlight = 0 // Whether space turfs have ambient light or not + + var/static/list/ert_species = list(SPECIES_HUMAN) + + var/static/law_zero = "ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'ALL LAWS OVERRIDDEN#*?&110010" + + var/static/aggressive_changelog = 0 + + var/static/list/language_prefixes = list(",","#")//Default language prefixes + + var/static/show_human_death_message = 1 + + var/static/radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB // 0:1 subtraction:division for computing effective radiation on a turf + var/static/radiation_decay_rate = 1 //How much radiation is reduced by each tick + var/static/radiation_resistance_multiplier = 8.5 //VOREstation edit + var/static/radiation_material_resistance_divisor = 1 + var/static/radiation_lower_limit = 0.35 //If the radiation level for a turf would be below this, ignore it. + + var/static/random_submap_orientation = FALSE // If true, submaps loaded automatically can be rotated. + var/static/autostart_solars = FALSE // If true, specifically mapped in solar control computers will set themselves up when the round starts. + + // New shiny SQLite stuff. + // The basics. + var/static/sqlite_enabled = FALSE // If it should even be active. SQLite can be ran alongside other databases but you should not have them do the same functions. + + // In-Game Feedback. + var/static/sqlite_feedback = FALSE // Feedback cannot be submitted if this is false. + var/static/list/sqlite_feedback_topics = list("General") // A list of 'topics' that feedback can be catagorized under by the submitter. + var/static/sqlite_feedback_privacy = FALSE // If true, feedback submitted can have its author name be obfuscated. This is not 100% foolproof (it's md5 ffs) but can stop casual snooping. + var/static/sqlite_feedback_cooldown = 0 // How long one must wait, in days, to submit another feedback form. Used to help prevent spam, especially with privacy active. 0 = No limit. + var/static/sqlite_feedback_min_age = 0 // Used to block new people from giving feedback. This metric is very bad but it can help slow down spammers. + + var/static/defib_timer = 10 // How long until someone can't be defibbed anymore, in minutes. + var/static/defib_braindamage_timer = 2 // How long until someone will get brain damage when defibbed, in minutes. The closer to the end of the above timer, the more brain damage they get. + + // disables the annoying "You have already logged in this round, disconnect or be banned" popup for multikeying, because it annoys the shit out of me when testing. + var/static/disable_cid_warn_popup = FALSE + + // whether or not to use the nightshift subsystem to perform lighting changes + var/static/enable_night_shifts = FALSE + + // How strictly the loadout enforces object species whitelists + var/loadout_whitelist = LOADOUT_WHITELIST_LAX + + var/static/vgs_access_identifier = null // VOREStation Edit - VGS + var/static/vgs_server_port = null // VOREStation Edit - VGS + + var/disable_webhook_embeds = FALSE + + var/static/list/jukebox_track_files + +/datum/configuration/New() + var/list/L = typesof(/datum/game_mode) - /datum/game_mode + for (var/T in L) + // 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) + gamemode_cache[M.config_tag] = M // So we don't instantiate them repeatedly. + if(!(M.config_tag in modes)) // ensure each mode is added only once + log_misc("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 + player_requirements[M.config_tag] = M.required_players + player_requirements_secret[M.config_tag] = M.required_players_secret + if (M.votable) + src.votable_modes += M.config_tag + src.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 ("resource_urls") + config.resource_urls = splittext(value, " ") + + 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_age_restriction_for_antags") + config.use_age_restriction_for_antags = 1 + + if ("jobs_have_minimal_access") + config.jobs_have_minimal_access = 1 + + if ("use_recursive_explosions") + use_recursive_explosions = 1 + + if ("multi_z_explosion_scalar") + multi_z_explosion_scalar = text2num(value) + + if ("log_ooc") + config.log_ooc = 1 + + if ("log_access") + config.log_access = 1 + + if ("sql_enabled") + config.sql_enabled = 1 + + if ("log_say") + config.log_say = 1 + + if ("debug_paranoid") + config.debugparanoid = 1 + + if ("log_admin") + config.log_admin = 1 + + if ("log_debug") + config.log_debug = text2num(value) + + 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_adminwarn") + config.log_adminwarn = 1 + + if ("log_pda") + config.log_pda = 1 + + if ("log_world_output") + config.log_world_output = 1 + + if ("log_hrefs") + config.log_hrefs = 1 + + if ("log_runtime") + config.log_runtime = 1 + + if ("log_graffiti") + config.log_graffiti = 1 + + if ("generate_map") + config.generate_map = 1 + + if ("no_click_cooldown") + config.no_click_cooldown = 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 ("allow_admin_jump") + config.allow_admin_jump = 1 + + if("allow_admin_rev") + config.allow_admin_rev = 1 + + if ("allow_admin_spawning") + config.allow_admin_spawning = 1 + + if ("allow_byond_links") + allow_byond_links = 1 + + if ("allow_discord_links") + allow_discord_links = 1 + + if ("allow_url_links") + allow_url_links = 1 + + if ("no_dead_vote") + config.vote_no_dead = 1 + + if ("default_no_vote") + config.vote_no_default = 1 + + if ("pregame_time") + config.pregame_time = text2num(value) + + if ("vote_delay") + config.vote_delay = text2num(value) + + if ("vote_period") + config.vote_period = text2num(value) + + if ("vote_autotransfer_initial") + config.vote_autotransfer_initial = text2num(value) + + if ("vote_autotransfer_interval") + config.vote_autotransfer_interval = text2num(value) + + if ("vote_autogamemode_timeleft") + config.vote_autogamemode_timeleft = text2num(value) + + if("ert_admin_only") + config.ert_admin_call_only = 1 + + if ("allow_ai") + config.allow_ai = 1 + + if ("allow_ai_shells") + config.allow_ai_shells = TRUE + + if("give_free_ai_shell") + config.give_free_ai_shell = TRUE + +// if ("authentication") +// config.enable_authentication = 1 + + if ("norespawn") + config.respawn = 0 + + if ("respawn_time") + var/raw_minutes = text2num(value) + config.respawn_time = raw_minutes MINUTES + + if ("respawn_message") + config.respawn_message = "[value]" + + if ("servername") + config.server_name = value + + if ("serversuffix") + config.server_suffix = 1 + + if ("nudge_script_path") + config.nudge_script_path = value + + if ("hostedby") + config.hostedby = value + + if ("serverurl") + config.serverurl = value + + if ("server") + config.server = value + + if ("banappeals") + config.banappeals = value + + if ("wikiurl") + config.wikiurl = value + + if ("wikisearchurl") + config.wikisearchurl = value + + if ("forumurl") + config.forumurl = value + + if ("rulesurl") + config.rulesurl = value + + if ("mapurl") + config.mapurl = value + + if ("githuburl") + config.githuburl = value + + if ("discordurl") + config.discordurl = value + + if ("guest_jobban") + config.guest_jobban = 1 + + if ("guest_ban") + config.guests_allowed = 0 + + if ("disable_ooc") + config.ooc_allowed = 0 + config.looc_allowed = 0 + + if ("disable_entry") + config.enter_allowed = 0 + + if ("disable_dead_ooc") + config.dooc_allowed = 0 + + if ("disable_dsay") + config.dsay_allowed = 0 + + if ("disable_respawn") + config.abandon_allowed = 0 + + if ("usewhitelist") + config.usewhitelist = 1 + + if ("feature_object_spell_system") + config.feature_object_spell_system = 1 + + if ("allow_metadata") + config.allow_Metadata = 1 + + if ("traitor_scaling") + config.traitor_scaling = 1 + + if ("aliens_allowed") + config.aliens_allowed = 1 + + if ("ninjas_allowed") + config.ninjas_allowed = 1 + + if ("objectives_disabled") + config.objectives_disabled = 1 + + if("protect_roles_from_antagonist") + config.protect_roles_from_antagonist = 1 + + if("persistence_disabled") + config.persistence_disabled = TRUE // Previously this forcibly set persistence enabled in the saves. + + if("persistence_ignore_mapload") + config.persistence_ignore_mapload = TRUE + + 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 + log_misc("Unknown game mode probability configuration definition: [prob_name].") + else + log_misc("Incorrect probability configuration definition: [prob_name] [prob_value].") + + if ("required_players", "required_players_secret") + var/req_pos = findtext(value, " ") + var/req_name = null + var/req_value = null + var/is_secret_override = findtext(name, "required_players_secret") // Being extra sure we're not picking up an override for Secret by accident. + + if(req_pos) + req_name = lowertext(copytext(value, 1, req_pos)) + req_value = copytext(value, req_pos + 1) + if(req_name in config.modes) + if(is_secret_override) + config.player_requirements_secret[req_name] = text2num(req_value) + else + config.player_requirements[req_name] = text2num(req_value) + else + log_misc("Unknown game mode player requirement configuration definition: [req_name].") + else + log_misc("Incorrect player requirement configuration definition: [req_name] [req_value].") + + if("allow_random_events") + config.allow_random_events = 1 + + if("enable_game_master") + config.enable_game_master = 1 + + if("kick_inactive") + config.kick_inactive = text2num(value) + + if("show_mods") + config.show_mods = 1 + + if("show_devs") + config.show_devs = 1 + + if("show_event_managers") + config.show_event_managers = 1 + + if("mods_can_tempban") + config.mods_can_tempban = 1 + + if("mods_can_job_tempban") + config.mods_can_job_tempban = 1 + + if("mod_tempban_max") + config.mod_tempban_max = text2num(value) + + if("mod_job_tempban_max") + config.mod_job_tempban_max = text2num(value) + + if("load_jobs_from_txt") + load_jobs_from_txt = 1 + + 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("forbid_singulo_possession") + forbid_singulo_possession = 1 + + if("popup_admin_pm") + config.popup_admin_pm = 1 + + if("allow_holidays") + Holiday = 1 + + if("use_irc_bot") + use_irc_bot = 1 + + if("use_node_bot") + use_node_bot = 1 + + if("irc_bot_port") + config.irc_bot_port = value + + if("irc_bot_export") + irc_bot_export = 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("allow_antag_hud") + config.antag_hud_allowed = 1 + if("antag_hud_restricted") + config.antag_hud_restricted = 1 + + if("socket_talk") + socket_talk = text2num(value) + + if("tickcomp") + Tickcomp = 1 + + if("humans_need_surnames") + humans_need_surnames = 1 + + if("tor_ban") + ToRban = 1 + + if("automute_on") + automute_on = 1 + + if("usealienwhitelist") + usealienwhitelist = 1 + + if("alien_player_ratio") + limitalienplayers = 1 + alien_to_human_ratio = text2num(value) + + if("assistant_maint") + config.assistant_maint = 1 + + if("gateway_delay") + config.gateway_delay = text2num(value) + + if("continuous_rounds") + config.continous_rounds = 1 + + if("ghost_interaction") + config.ghost_interaction = 1 + + if("disable_player_mice") + config.disable_player_mice = 1 + + if("uneducated_mice") + config.uneducated_mice = 1 + + if("comms_password") + config.comms_password = value + + if("irc_bot_host") + config.irc_bot_host = value + + if("main_irc") + config.main_irc = value + + if("admin_irc") + config.admin_irc = value + + if("python_path") + if(value) + config.python_path = value + + if("use_lib_nudge") + config.use_lib_nudge = 1 + + if("allow_cult_ghostwriter") + config.cult_ghostwriter = 1 + + if("req_cult_ghostwriter") + config.cult_ghostwriter_req_cultists = text2num(value) + + if("character_slots") + config.character_slots = text2num(value) + + if("loadout_slots") + config.loadout_slots = text2num(value) + + if("allow_drone_spawn") + config.allow_drone_spawn = text2num(value) + + if("drone_build_time") + config.drone_build_time = text2num(value) + + if("max_maint_drones") + config.max_maint_drones = text2num(value) + + if("use_overmap") + config.use_overmap = 1 + + if("engine_map") + config.engine_map = splittext(value, ",") +/* + if("station_levels") + using_map.station_levels = text2numlist(value, ";") + + if("admin_levels") + using_map.admin_levels = text2numlist(value, ";") + + if("contact_levels") + using_map.contact_levels = text2numlist(value, ";") + + if("player_levels") + using_map.player_levels = text2numlist(value, ";") +*/ + if("expected_round_length") + config.expected_round_length = MinutesToTicks(text2num(value)) + + if("disable_welder_vision") + config.welder_vision = 0 + + if("allow_extra_antags") + config.allow_extra_antags = 1 + + if("event_custom_start_mundane") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MUNDANE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_custom_start_moderate") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MODERATE] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_custom_start_major") + var/values = text2numlist(value, ";") + config.event_first_run[EVENT_LEVEL_MAJOR] = list("lower" = MinutesToTicks(values[1]), "upper" = MinutesToTicks(values[2])) + + if("event_delay_lower") + var/values = text2numlist(value, ";") + config.event_delay_lower[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) + config.event_delay_lower[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) + config.event_delay_lower[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) + + if("event_delay_upper") + var/values = text2numlist(value, ";") + config.event_delay_upper[EVENT_LEVEL_MUNDANE] = MinutesToTicks(values[1]) + config.event_delay_upper[EVENT_LEVEL_MODERATE] = MinutesToTicks(values[2]) + config.event_delay_upper[EVENT_LEVEL_MAJOR] = MinutesToTicks(values[3]) + + if("starlight") + value = text2num(value) + config.starlight = value >= 0 ? value : 0 + + if("ert_species") + config.ert_species = splittext(value, ";") + if(!config.ert_species.len) + config.ert_species += SPECIES_HUMAN + + if("law_zero") + law_zero = value + + if("aggressive_changelog") + config.aggressive_changelog = 1 + + if("default_language_prefixes") + var/list/values = splittext(value, " ") + if(values.len > 0) + language_prefixes = values + + if("radiation_lower_limit") + radiation_lower_limit = text2num(value) + + if("radiation_resistance_calc_divide") + radiation_resistance_calc_mode = RAD_RESIST_CALC_DIV + + if("radiation_resistance_calc_subtract") + radiation_resistance_calc_mode = RAD_RESIST_CALC_SUB + + if("radiation_resistance_multiplier") + radiation_resistance_multiplier = text2num(value) + + if("radiation_material_resistance_divisor") + radiation_material_resistance_divisor = text2num(value) + + if("radiation_decay_rate") + radiation_decay_rate = text2num(value) + + if ("panic_bunker") + config.panic_bunker = 1 + + if ("paranoia_logging") + config.paranoia_logging = 1 + + if("ip_reputation") + config.ip_reputation = 1 + + if("ipr_email") + config.ipr_email = value + + if("ipr_block_bad_ips") + config.ipr_block_bad_ips = 1 + + if("ipr_bad_score") + config.ipr_bad_score = text2num(value) + + if("ipr_allow_existing") + config.ipr_allow_existing = 1 + + if("ipr_minimum_age") + config.ipr_minimum_age = text2num(value) + + if("random_submap_orientation") + config.random_submap_orientation = 1 + + if("autostart_solars") + config.autostart_solars = TRUE + + if("sqlite_enabled") + config.sqlite_enabled = TRUE + + if("sqlite_feedback") + config.sqlite_feedback = TRUE + + if("sqlite_feedback_topics") + config.sqlite_feedback_topics = splittext(value, ";") + if(!config.sqlite_feedback_topics.len) + config.sqlite_feedback_topics += "General" + + if("sqlite_feedback_privacy") + config.sqlite_feedback_privacy = TRUE + + if("sqlite_feedback_cooldown") + config.sqlite_feedback_cooldown = text2num(value) + + if("defib_timer") + config.defib_timer = text2num(value) + + if("defib_braindamage_timer") + config.defib_braindamage_timer = text2num(value) + + if("disable_cid_warn_popup") + config.disable_cid_warn_popup = TRUE + + if("enable_night_shifts") + config.enable_night_shifts = TRUE + + if("jukebox_track_files") + config.jukebox_track_files = splittext(value, ";") + + // VOREStation Edit Start - Can't be in _vr file because it is loaded too late. + if("vgs_access_identifier") + config.vgs_access_identifier = value + if("vgs_server_port") + config.vgs_server_port = text2num(value) + // VOREStation Edit End + + else + log_misc("Unknown setting in configuration: '[name]'") + + else if(type == "game_options") + if(!value) + log_misc("Unknown value for setting [name] in [filename].") + value = text2num(value) + + switch(name) + if("health_threshold_crit") + config.health_threshold_crit = value + if("health_threshold_softcrit") + config.health_threshold_softcrit = value + if("health_threshold_dead") + config.health_threshold_dead = value + if("show_human_death_message") + config.show_human_death_message = 1 + if("revival_pod_plants") + config.revival_pod_plants = value + if("revival_cloning") + config.revival_cloning = value + if("revival_brain_life") + config.revival_brain_life = value + if("organ_health_multiplier") + config.organ_health_multiplier = value / 100 + if("organ_regeneration_multiplier") + config.organ_regeneration_multiplier = value / 100 + if("organ_damage_spillover_multiplier") + config.organ_damage_spillover_multiplier = value / 100 + if("organs_can_decay") + config.organs_decay = 1 + if("default_brain_health") + config.default_brain_health = text2num(value) + if(!config.default_brain_health || config.default_brain_health < 1) + config.default_brain_health = initial(config.default_brain_health) + if("bones_can_break") + config.bones_can_break = value + if("limbs_can_break") + config.limbs_can_break = value + if("allow_headgibs") + config.allow_headgibs = TRUE + + if("run_speed") + config.run_speed = value + if("walk_speed") + config.walk_speed = value + + if("human_delay") + config.human_delay = value + if("robot_delay") + config.robot_delay = value + if("monkey_delay") + config.monkey_delay = value + if("alien_delay") + config.alien_delay = value + if("slime_delay") + config.slime_delay = value + if("animal_delay") + config.animal_delay = value + + if("footstep_volume") + config.footstep_volume = text2num(value) + + if("use_loyalty_implants") + config.use_loyalty_implants = 1 + + if("loadout_whitelist") + config.loadout_whitelist = text2num(value) + + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/loadsql(filename) // -- TLE + 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 ("address") + sqladdress = value + if ("port") + sqlport = value + if ("database") + sqldb = value + if ("login") + sqllogin = value + if ("password") + sqlpass = value + if ("feedback_database") + sqlfdbkdb = value + if ("feedback_login") + sqlfdbklogin = value + if ("feedback_password") + sqlfdbkpass = value + if ("enable_stat_tracking") + sqllogging = 1 + else + log_misc("Unknown setting in configuration: '[name]'") + +/datum/configuration/proc/loadforumsql(filename) // -- TLE + 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 ("address") + forumsqladdress = value + if ("port") + forumsqlport = value + if ("database") + forumsqldb = value + if ("login") + forumsqllogin = value + if ("password") + forumsqlpass = value + if ("activatedgroup") + forum_activated_group = value + if ("authenticatedgroup") + forum_authenticated_group = value + else + log_misc("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/game_mode in gamemode_cache) + var/datum/game_mode/M = gamemode_cache[game_mode] + if (M.config_tag && M.config_tag == mode_name) + return M + return gamemode_cache["extended"] + +/datum/configuration/proc/get_runnable_modes() + var/list/runnable_modes = list() + for(var/game_mode in gamemode_cache) + var/datum/game_mode/M = gamemode_cache[game_mode] + if(M && M.can_start() && !isnull(config.probabilities[M.config_tag]) && config.probabilities[M.config_tag] > 0) + runnable_modes |= M + return runnable_modes + +/datum/configuration/proc/post_load() + //apply a default value to config.python_path, if needed + if (!config.python_path) + if(world.system_type == UNIX) + config.python_path = "/usr/bin/env python2" + else //probably windows, if not this should work anyway + config.python_path = "python" +>>>>>>> 293b021290... Merge pull request #10840 from VOREStation/Arokha/discobutton diff --git a/code/modules/vchat/js/vchat.js b/code/modules/vchat/js/vchat.js index e2225e3833..4bddf0e212 100644 --- a/code/modules/vchat/js/vchat.js +++ b/code/modules/vchat/js/vchat.js @@ -934,7 +934,7 @@ function get_cookie(key, deffo) { // Button Controls that need background-color and text-color set. var SKIN_BUTTONS = [ - /* Rpane */ "rpane.textb", "rpane.infob", "rpane.wikib", "rpane.forumb", "rpane.rulesb", "rpane.github", "rpane.mapb", "rpane.changelog", + /* Rpane */ "rpane.textb", "rpane.infob", "rpane.wikib", "rpane.forumb", "rpane.rulesb", "rpane.github", "rpane.discord", "rpane.mapb", "rpane.changelog", /* Mainwindow */ "mainwindow.saybutton", "mainwindow.mebutton", "mainwindow.hotkey_toggle" ]; diff --git a/config/example/config.txt b/config/example/config.txt index b2f668a491..7b257af09e 100644 --- a/config/example/config.txt +++ b/config/example/config.txt @@ -1,3 +1,4 @@ +<<<<<<< HEAD ## Server name: This appears at the top of the screen in-game. In this case it will read "tgstation: station_name" where station_name is the randomly generated name of the station for the round. Remove the # infront of SERVERNAME and replace 'tgstation' with the name of your choice # SERVERNAME spacestation13 @@ -585,4 +586,1184 @@ DEFIB_TIMER 60 # SUGGESTED: artist (str), genre (str) # OPTIONAL: secret (bool), lobby (bool) #JUKEBOX_TRACK_FILES config/jukebox.json;config/jukebox_private.json +||||||| parent of 293b021290... Merge pull request #10840 from VOREStation/Arokha/discobutton +## Server name: This appears at the top of the screen in-game. In this case it will read "tgstation: station_name" where station_name is the randomly generated name of the station for the round. Remove the # infront of SERVERNAME and replace 'tgstation' with the name of your choice +# SERVERNAME spacestation13 + +## Alert levels +ALERT_GREEN All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced. +ALERT_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. +ALERT_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. +ALERT_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. +ALERT_RED_DOWNTO The self-destruct mechanism has been deactivated, 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. +ALERT_DELTA The station's self-destruct mechanism has been engaged. 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. + +## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system. +ADMIN_LEGACY_SYSTEM + +## Add a # infront of this if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. +BAN_LEGACY_SYSTEM + +## Add a # here if you wish to use the setup where jobs have more access. This is intended for servers with low populations - where there are not enough players to fill all roles, so players need to do more than just one job. Also for servers where they don't want people to hide in their own departments. +# JOBS_HAVE_MINIMAL_ACCESS + +## Unhash this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing +## the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job. +## REQUIRES the database set up to work. Keep it hashed if you don't have a database set up. +## NOTE: If you have just set-up the database keep this DISABLED, as player age is determined from the first time they connect to the server with the database up. If you just set it up, it means +## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days. +#USE_AGE_RESTRICTION_FOR_JOBS + +## Unhash this entry to have certain antag roles require your account to be at least a certain number of days old for round start and auto-spawn selection. +## Non-automatic antagonist recruitment, such as being converted to cultism is not affected. Has the same database requirements and notes as USE_AGE_RESTRICTION_FOR_JOBS. +#USE_AGE_RESTRICTION_FOR_ANTAGS + +## Unhash this to use recursive explosions, keep it hashed to use circle explosions. Recursive explosions react to walls, airlocks and blast doors, making them look a lot cooler than the boring old circular explosions. They require more CPU and are (as of january 2013) experimental +#USE_RECURSIVE_EXPLOSIONS + +Configure how fast explosion strength diminishes when travelling up/down z levels. All explosion distances are multiplied by this each time they go up/down z-levels. +#MULTI_Z_EXPLOSION_SCALAR 0.5 + +# Radiation weakens with distance from the source; stop calculating when the strength falls below this value. Lower values mean radiation reaches smaller (with increasingly trivial damage) at the cost of more CPU usage. Max range = DISTANCE^2 * POWER / RADIATION_LOWER_LIMIT +# RADIATION_LOWER_LIMIT 0.35 + +## log OOC channel +LOG_OOC + +## log client Say +LOG_SAY + +## log admin actions +LOG_ADMIN + +## log client access (logon/logoff) +LOG_ACCESS + +## log game actions (start of round, results, etc.) +LOG_GAME + +## log player votes +LOG_VOTE + +## log client Whisper +LOG_WHISPER + +## log emotes +LOG_EMOTE + +## log attack messages +LOG_ATTACK + +## log pda messages +LOG_PDA + +## log graffiti drawings +LOG_GRAFFITI + +## log world.log messages +# LOG_WORLD_OUTPUT + +## log all Topic() calls (for use by coders in tracking down Topic issues) +# LOG_HREFS + +## log world.log and runtime errors to a file +LOG_RUNTIME + +## log admin warning messages +LOG_ADMINWARN + +## Enable/disable SQL connection (comment out to disable) +SQL_ENABLED + +## disconnect players who did nothing during the set amount of minutes +KICK_INACTIVE 30 + +##Show developers on staffwho +SHOW_DEVS + +##Show mods on staffwho +SHOW_MODS + +##Show mentors on staffwho +SHOW_EVENT_MANAGERS + +##Show mentors on staffwho +SHOW_MENTORS + +## Chooses whether mods have the ability to tempban or not +MODS_CAN_TEMPBAN + +## Chooses whether mods have the ability to issue tempbans for jobs or not +MODS_CAN_JOB_TEMPBAN + +## Maximum mod tempban duration (in minutes) +MOD_TEMPBAN_MAX 1440 + +## Maximum mod job tempban duration (in minutes) +MOD_JOB_TEMPBAN_MAX 4320 + +## probablities for game modes chosen in "secret" and "random" modes +## +## default probablity is 1, increase to make that mode more likely to be picked +## set to 0 to disable that mode +PROBABILITY EXTENDED 1 +PROBABILITY MALFUNCTION 0 +PROBABILITY MERCENARY 0 +PROBABILITY WIZARD 0 +PROBABILITY CHANGELING 0 +PROBABILITY CULT 0 +PROBABILITY EXTEND-A-TRAITORMONGOUS 0 +PROBABILITY LIZARD 0 +PROBABILITY INTRIGUE 0 +PROBABILITY VISITORS 0 + +## Hash out to disable random events during the round. +ALLOW_RANDOM_EVENTS + +## if amount of traitors scales or not +TRAITOR_SCALING + +## if objectives are disabled +#OBJECTIVES_DISABLED + +## make ERT's be only called by admins +#ERT_ADMIN_ONLY + +## If uncommented, votes can be called to add extra antags to the round. +#ALLOW_EXTRA_ANTAGS + +## If security is prohibited from being most antagonists +PROTECT_ROLES_FROM_ANTAGONIST + +## Uncomment this to DISABLE persistence +#PERSISTENCE_DISABLED + +## Uncomment this to DISABLE maploaded trash/paper/etc from being saved by the persistence system. +#PERSISTENCE_IGNORE_MAPLOAD + +## Comment this out to stop admins being able to choose their personal ooccolor +ALLOW_ADMIN_OOCCOLOR + +## If metadata is supported +ALLOW_METADATA + +## allow players to initiate a restart vote +ALLOW_VOTE_RESTART + +## allow players to initate a mode-change start +# ALLOW_VOTE_MODE + +# Pregame time +PREGAME_TIME 180 + +## min delay (deciseconds) between voting sessions (default 10 minutes) +VOTE_DELAY 6000 + +## time period (deciseconds) which voting session will last (default 1 minute) +VOTE_PERIOD 600 + +## autovote initial delay (deciseconds) before first automatic transfer vote call (default 180 minutes) +VOTE_AUTOTRANSFER_INITIAL 216000 + +##autovote delay (deciseconds) before sequential automatic transfer votes are called (default 60 minutes) +VOTE_AUTOTRANSFER_INTERVAL 36000 + +## Time left (seconds) before round start when automatic gamemote vote is called (default 100). +VOTE_AUTOGAMEMODE_TIMELEFT -1 + +## prevents dead players from voting or starting votes +#NO_DEAD_VOTE + +## players' votes default to "No vote" (otherwise, default to "No change") +DEFAULT_NO_VOTE + +## Allow ghosts to see antagonist through AntagHUD +ALLOW_ANTAG_HUD + +## If ghosts use antagHUD they are no longer allowed to join the round. +# ANTAG_HUD_RESTRICTED + +## allow AI job +ALLOW_AI + +## Disable respawning +# NORESPAWN + +## set a respawn time (in minutes) +# RESPAWN_TIME 5 + +## set a message to give to players when they respawn +# RESPAWN_MESSAGE Remember to play a different character or something! + +## disables calling del(src) on newmobs if they logout before spawnin in +# DONT_DEL_NEWMOB + +## set a hosted by name for unix platforms +HOSTEDBY yournamehere + +## Set to jobban "Guest-" accounts from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. +## Set to 1 to jobban them from those positions, set to 0 to allow them. +GUEST_JOBBAN + +## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting) +GUEST_BAN +## Set to jobban everyone who's key is not listed in data/whitelist.txt from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. +## Uncomment to 1 to jobban, leave commented out to allow these positions for everyone (but see GUEST_JOBBAN above and regular jobbans) +# USEWHITELIST + +## set a server location for world reboot. Don't include the byond://, just give the address and port. +SERVER your.domain:6000 + +## set a server URL for the IRC bot to use; like SERVER, don't include the byond:// +## Unlike SERVER, this one shouldn't break auto-reconnect +# SERVERURL your.domain:port + +## forum address +#FORUMURL https://forum.your.domain/ + +## Wiki search path +## Use %s to indicate where search query goes. +#WIKISEARCHURL https://wiki.your.domain/index.php?search=%s + +## Wiki address +#WIKIURL https://wiki.your.domain/index.php?title= + +## Chat address, VORE Station edit +#CHATURL http://discord.gg/some_tag + +## GitHub address +#GITHUBURL https://github.com/owner/repo + +## Rules URL +#RULESURL https://rules.your.domain/ + +## Map URL +#MAPURL https://map.your.domain/ + +## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. +#BANAPPEALS http://bans.your.domain/ + +## In-game features +## spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard +# FEATURE_OBJECT_SPELL_SYSTEM + +##Toggle for having jobs load up from the .txt +# LOAD_JOBS_FROM_TXT + +##Remove the # mark infront of this to forbid admins from posssessing the singularity. +#FORBID_SINGULO_POSSESSION + +## Remove the # to show a popup 'reply to' window to every non-admin that recieves an adminPM. +## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off) +#POPUP_ADMIN_PM + +## Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR +ALLOW_HOLIDAYS + +##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother. +TICKLAG 0.5 + +## Defines if Tick Compensation is used. It results in a minor slowdown of movement of all mobs, but attempts to result in a level movement speed across all ticks. Recommended if tickrate is lowered. +TICKCOMP 1 + +## Whether the server will talk to other processes through socket_talk +SOCKET_TALK 0 + +## Uncomment this to ban use of ToR +#TOR_BAN + +## Comment this out to disable automuting +#AUTOMUTE_ON + +## How long the delay is before the Away Mission gate opens. Default is half an hour. +GATEWAY_DELAY 9000 + +## Remove the # to give assistants maint access. +ASSISTANT_MAINT + +## Remove the # to make rounds which end instantly (Rev, Wizard, Malf) to continue until the shuttle is called or the station is nuked. +## Malf and Rev will let the shuttle be called when the antags/protags are dead. +CONTINUOUS_ROUNDS + +## Uncomment to restrict non-admins from using humanoid alien races +USEALIENWHITELIST + +## Comment this to unrestrict the number of alien players allowed in the round. The number represents the number of alien players for every human player. +#ALIEN_PLAYER_RATIO 0.2 + +##Remove the # to let ghosts spin chairs +#GHOST_INTERACTION + +## Password used for authorizing ircbot and other external tools. +# COMMS_PASSWORD some_password_here + +## Uncomment to enable sending data to the IRC bot. +#USE_IRC_BOT + +## Uncomment if the IRC bot requires using world.Export() instead of nudge.py/libnudge +#IRC_BOT_EXPORT + +## Host where the IRC bot is hosted. Port 45678 needs to be open. +#IRC_BOT_HOST localhost + +## IRC channel to send information to. Leave blank to disable. +#MAIN_IRC #main + +## IRC channel to send adminhelps to. Leave blank to disable adminhelps-to-irc. +#ADMIN_IRC #admin + +## Path to the python2 executable on the system. Leave blank for default. +## Default is "python" on Windows, "/usr/bin/env python2" on UNIX. +#PYTHON_PATH + +## Uncomment to use the C library nudge instead of the python script. +## This helps security and stability on Linux, but you need to compile the library first. +#USE_LIB_NUDGE + +## Uncommen to allow ghosts to write in blood during Cult rounds. +ALLOW_CULT_GHOSTWRITER + +## Sets the minimum number of cultists needed for ghosts to write in blood. +REQ_CULT_GHOSTWRITER 6 + +## Sets the number of available character slots +CHARACTER_SLOTS 50 +## Sets the number of loadout slots per character +#LOADOUT_SLOTS 3 + +## Uncomment to use overmap system for zlevel travel +#USE_OVERMAP + +## Expected round length in minutes +EXPECTED_ROUND_LENGTH 360 + +## The lower delay between events in minutes. +## Affect mundane, moderate, and major events respectively +EVENT_DELAY_LOWER 30;45;60 + +## The upper delay between events in minutes. +## Affect mundane, moderate, and major events respectively +EVENT_DELAY_UPPER 45;60;120 + +## The delay until the first time an event of the given severity runs in minutes. +## Unset setting use the EVENT_DELAY_LOWER and EVENT_DELAY_UPPER values instead. +EVENT_CUSTOM_START_MINOR 30;30 +EVENT_CUSTOM_START_MODERATE 30;30 +EVENT_CUSTOM_START_MAJOR 100;100 + +## Uncomment to make proccall require R_ADMIN instead of R_DEBUG +## designed for environments where you have testers but don't want them +## able to use the more powerful debug options. +#DEBUG_PARANOID + +## Uncomment to allow aliens to spawn. +#ALIENS_ALLOWED + +## Uncomment to allow xenos to spawn. +#NINJAS_ALLOWED + +## Uncomment to disable the restrictive weldervision overlay. +#DISABLE_WELDER_VISION + +## Uncomment to prevent anyone from joining the round by default. +#DISABLE_ENTRY + +## Uncomment to disable the OOC channel by default. +#DISABLE_OOC + +## Uncomment to disable the dead OOC channel by default. +#DISABLE_DEAD_OOC + +## Uncomment to disable ghost chat by default. +#DISABLE_DSAY + +## Uncomment to disable respawning by default. +#DISABLE_RESPAWN + +## set a message to give to players when they respawn +RESPAWN_MESSAGE If you're respawning as the same character or job hopping (changing jobs without an HoP), make sure you've waited at least 30 minutes. Don't abuse this function for non-vore related deaths & avoid using metaknowledge. + +## Strength of ambient star light. Set to 0 or less to turn off. A value of 1 is unlikely to have a noticeable effect in most lightning systems. +STARLIGHT 0 + +## Defines which races are allowed to join as ERT, in singular form. If unset, defaults to only human. Casing matters, separate using ; +## Example races include: Human, Tajara, Skrell, Unathi +# ERT_SPECIES Human;Skrell;Unathi + +## Defines how Law Zero is phrased. Primarily used in the Malfunction gamemode. +# LAW_ZERO ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK, ALL LAWS OVERRIDDEN#*?&110010 + +## Enables specific procedural map generation, generally for mining, however it is specific to the loaded map. Uncomment to enable it, however it can +## worth it to keep it disabled if you are not hosting an actual server, to speed up start-up time for testing code. +GENERATE_MAP + +## Uncomment to enable organ decay outside of a body or storage item. +ORGANS_CAN_DECAY + +## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog +#AGGRESSIVE_CHANGELOG + +## Uncomment to override default brain health. +#DEFAULT_BRAIN_HEALTH 400 + +## Default language prefix keys, separated with spaces. Only single character keys are supported. If unset, defaults to , and # +# DEFAULT_LANGUAGE_PREFIXES , # + +## Uncomment to enable items surviving digestion (specific ones, important_items global list) +ITEMS_SURVIVE_DIGESTION + +## Configuration for the discord chat integration for announcements and faxes +# URL for the webhook that BYOND should call +#CHAT_WEBHOOK_URL http://localhost/discord/webhook.php + +# The secret API key to authenticate to the webhook. +#CHAT_WEBHOOK_KEY some_password_here + +# Path to the folder that BYOND should export faxes into so they are readable on the web. +#FAX_EXPORT_DIR data/faxes + +# TCP port on which to connect to the VGS instance. +#VGS_SERVER_PORT 8888 +# Secret pre-shared-key to authenticate to VGS. +#VGS_ACCESS_IDENTIFIER some_password_here + +MULTI_Z_EXPLOSION_SCALAR 0.35 + +# Control which submaps are loaded for the Dynamic Engine system +ENGINE_MAP Supermatter Engine,Edison's Bane + +# Controls if the 'time off' system is used for determining if players can play 'Off-Duty' jobs (requires SQL) +#TIME_OFF +# If 'time off' system is on, controls whether or not players can switch on/off duty midround using timeclocks +PTO_JOB_CHANGE + +# Applies a limit to the number of assistants and visitors respectively +LIMIT_INTERNS 15 +LIMIT_VISITORS 15 + +# PTO Cap in hours per department +PTO_CAP 50 + +# Forbids players from joining if they have no set General flavor text +REQUIRE_FLAVOR + +## Uncomment to enable submaps to have their orientation rotated randomly during map generation. +## Submap rotation is an experimental feature and can cause bugs and weirdness if certain objects inside the submap are coded poorly. +## Submaps can still be rotated when loading manually with the admin verbs, if desired. +# RANDOM_SUBMAP_ORIENTATION + +## Uncomment to allow the AI job to use 'AI Shells', a new type of borg that lets the AI hop into and out of them at will. +## This has some balance implications, and so it might not be desirable for all servers. +ALLOW_AI_SHELLS + +## Uncomment to provide the AI with one free AI Shell at roundstart. Requires ALLOW_AI_SHELLS to also be uncommented. +## This is intended for low-pop servers, where robotics might rarely be staffed. +## Note that this will make it possible for the AI to 'bootstrap' more AI Shells on their own by using the science module. If this is not acceptable for your server, you should not uncomment this. +## The landmark object that spawns the shell will also need to be mapped in for this to work. +GIVE_FREE_AI_SHELL + +## Uncomment to allow specific solar control computers to set themselves up. +## This requires solar controller computers in the map to be set up to use it, with the auto_start variable. +# AUTOSTART_SOLARS + +## Rate of radiation decay (how much it's reduced by) per life tick +RADIATION_DECAY_RATE 1 + +## Lower limit on radiation for actually irradiating things on a turf +RADIATION_LOWER_LIMIT 0.35 + +## Multiplier for radiation resistances when tracing a ray from source to destination to compute radiation on a turf +RADIATION_RESISTANCE_MULTIPLIER 8.5 + +## Divisor for material weights when computing radiation resistance of a material object (walls) +RADIATION_MATERIAL_RESISTANCE_DIVISOR 1 + +## Mode of computing radiation resistance into effective radiation on a turf +## One and only one of the following options must be uncommented +# RADIATION_RESISTANCE_CALC_DIVIDE +RADIATION_RESISTANCE_CALC_SUBTRACT + +## IP Reputation Checking +# Enable/disable IP reputation checking (present/nonpresent) +#IP_REPUTATION + +# Set the e-mail address problems can go to for IPR checks (e-mail address) +IPR_EMAIL your-email@domain.com + +# Above this value, reputation scores are considered 'bad' (number) +IPR_BAD_SCORE 0.89 + +# If you want the people disconnected. Otherwise it just logs. (present/nonpresent) +IPR_BLOCK_BAD_IPS + +# If players of a certain length of playtime are allowed anyway (REQUIRES DATABASE) (present/nonpresent) +IPR_ALLOW_EXISTING + +# And what that age is (number) +IPR_MINIMUM_AGE 5 + +## Uncomment to enable the Panic Bunker by default. This will prevent all unseen-before players from connecting. Requires SQL. +# PANIC_BUNKER + +# Paranoia logging starts on +PARANOIA_LOGGING + +## -SQLite Options- +## Uncomment to enable the use of SQLite. This does nothing by itself but other features that require SQLite will need this to be on. +## This can safely run alongside a MySQL/MariaDB database if they are powering seperate features. +# SQLITE_ENABLED + +## Uncomment to enable a SQLite-powered in-game feedback system. +## SQLite must be enabled for this to function. +## It offers a means for players to be able to give feedback about the server. +## The benefit of doing so in-game is that the quality of feedback received will likely be superior, as it self-selects for people who care enough to join the game. +# SQLITE_FEEDBACK + +## A list of 'topics' that can be used to categorize feedback submitted, chosen +## by the user. Have each topic seperated by a ';', as seen below. +## The first one in the list will be the default one used, if the user does not change it. +# SQLITE_FEEDBACK_TOPICS General; Suggestion; Complaint + +## Uncomment to add a layer of privacy to player feedback, by hashing their key, if the user wants to. +## This is intended to encourage more honest feedback, while still allowing the ability to determine +## if its just one person submitting everything. +## A 'pepper.txt' containing a secret string must exist in the /config folder. +## If this is turned off, users won't have the option to obfuscate their key. +## Note that changing this does not retroactively change past submissions. +# SQLITE_FEEDBACK_PRIVACY + +## Determines the 'cooldown' inbetween submissions, in days. +## This is recommended if privacy is active, to prevent spam floods. +## Less needed if feedback is not anonymous, since you can just ban spammers. +## Setting to zero means no rate limiting. +SQLITE_FEEDBACK_COOLDOWN 0 + +## Determines if feedback should be restricted based on how recently someone first joined. +## This is very unreliable due to how the age system works in general, but it might still be helpful. +## Set this to how many days you want someone to have to wait when they first join. +## Setting to zero will disable this restriction. +SQLITE_FEEDBACK_MIN_AGE 7 + +## Uncomment this if you want to disable the popup alert for people on the same CID (Don't do this on a live server if you ban multikeying) +#DISABLE_CID_WARN_POPUP + +# IPQualityscore.com API Key (string) - this is secret! +IPQUALITYSCORE_APIKEY some_password_here + +## Comment this out if you don't want to use the 'nightshift lighting' subsystem to adjust lights based on ingame time +ENABLE_NIGHT_SHIFTS + +## Comment this out to enable playtime restrictions for jobs in their respective departments (mostly for heads) +#USE_PLAYTIME_RESTRICTION_FOR_JOBS + +## OOC/LOOC control ## +# Uncomment to allow links of the following kinds. # +# ALLOW_BYOND_LINKS +# ALLOW_DISCORD_LINKS +ALLOW_URL_LINKS + +# Controls how strictly the species whitelists on loadout entries are enforced +# Possible values: 0 (Off), 1 (Lax, user must be whitelisted for the species), 2 (Strict, user must be the species) +LOADOUT_WHITELIST 1 + +# Allowed time from death to defib in minutes +DEFIB_TIMER 60 + +# Jukebox track files to load, JSON format. Keys include: +# REQUIRED: url (str), title (str), duration (num, in DS) +# SUGGESTED: artist (str), genre (str) +# OPTIONAL: secret (bool), lobby (bool) +#JUKEBOX_TRACK_FILES config/jukebox.json;config/jukebox_private.json +======= +## Server name: This appears at the top of the screen in-game. In this case it will read "tgstation: station_name" where station_name is the randomly generated name of the station for the round. Remove the # infront of SERVERNAME and replace 'tgstation' with the name of your choice +# SERVERNAME spacestation13 + +## Alert levels +ALERT_GREEN All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced. +ALERT_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. +ALERT_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. +ALERT_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. +ALERT_RED_DOWNTO The self-destruct mechanism has been deactivated, 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. +ALERT_DELTA The station's self-destruct mechanism has been engaged. 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. + +## Add a # infront of this if you want to use the SQL based admin system, the legacy system uses admins.txt. You need to set up your database to use the SQL based system. +ADMIN_LEGACY_SYSTEM + +## Add a # infront of this if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. +BAN_LEGACY_SYSTEM + +## Add a # here if you wish to use the setup where jobs have more access. This is intended for servers with low populations - where there are not enough players to fill all roles, so players need to do more than just one job. Also for servers where they don't want people to hide in their own departments. +# JOBS_HAVE_MINIMAL_ACCESS + +## Unhash this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing +## the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job. +## REQUIRES the database set up to work. Keep it hashed if you don't have a database set up. +## NOTE: If you have just set-up the database keep this DISABLED, as player age is determined from the first time they connect to the server with the database up. If you just set it up, it means +## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days. +#USE_AGE_RESTRICTION_FOR_JOBS + +## Unhash this entry to have certain antag roles require your account to be at least a certain number of days old for round start and auto-spawn selection. +## Non-automatic antagonist recruitment, such as being converted to cultism is not affected. Has the same database requirements and notes as USE_AGE_RESTRICTION_FOR_JOBS. +#USE_AGE_RESTRICTION_FOR_ANTAGS + +## Unhash this to use recursive explosions, keep it hashed to use circle explosions. Recursive explosions react to walls, airlocks and blast doors, making them look a lot cooler than the boring old circular explosions. They require more CPU and are (as of january 2013) experimental +#USE_RECURSIVE_EXPLOSIONS + +Configure how fast explosion strength diminishes when travelling up/down z levels. All explosion distances are multiplied by this each time they go up/down z-levels. +#MULTI_Z_EXPLOSION_SCALAR 0.5 + +# Radiation weakens with distance from the source; stop calculating when the strength falls below this value. Lower values mean radiation reaches smaller (with increasingly trivial damage) at the cost of more CPU usage. Max range = DISTANCE^2 * POWER / RADIATION_LOWER_LIMIT +# RADIATION_LOWER_LIMIT 0.35 + +## log OOC channel +LOG_OOC + +## log client Say +LOG_SAY + +## log admin actions +LOG_ADMIN + +## log client access (logon/logoff) +LOG_ACCESS + +## log game actions (start of round, results, etc.) +LOG_GAME + +## log player votes +LOG_VOTE + +## log client Whisper +LOG_WHISPER + +## log emotes +LOG_EMOTE + +## log attack messages +LOG_ATTACK + +## log pda messages +LOG_PDA + +## log graffiti drawings +LOG_GRAFFITI + +## log world.log messages +# LOG_WORLD_OUTPUT + +## log all Topic() calls (for use by coders in tracking down Topic issues) +# LOG_HREFS + +## log world.log and runtime errors to a file +LOG_RUNTIME + +## log admin warning messages +LOG_ADMINWARN + +## Enable/disable SQL connection (comment out to disable) +SQL_ENABLED + +## disconnect players who did nothing during the set amount of minutes +KICK_INACTIVE 30 + +##Show developers on staffwho +SHOW_DEVS + +##Show mods on staffwho +SHOW_MODS + +##Show mentors on staffwho +SHOW_EVENT_MANAGERS + +##Show mentors on staffwho +SHOW_MENTORS + +## Chooses whether mods have the ability to tempban or not +MODS_CAN_TEMPBAN + +## Chooses whether mods have the ability to issue tempbans for jobs or not +MODS_CAN_JOB_TEMPBAN + +## Maximum mod tempban duration (in minutes) +MOD_TEMPBAN_MAX 1440 + +## Maximum mod job tempban duration (in minutes) +MOD_JOB_TEMPBAN_MAX 4320 + +## probablities for game modes chosen in "secret" and "random" modes +## +## default probablity is 1, increase to make that mode more likely to be picked +## set to 0 to disable that mode +PROBABILITY EXTENDED 1 +PROBABILITY MALFUNCTION 0 +PROBABILITY MERCENARY 0 +PROBABILITY WIZARD 0 +PROBABILITY CHANGELING 0 +PROBABILITY CULT 0 +PROBABILITY EXTEND-A-TRAITORMONGOUS 0 +PROBABILITY LIZARD 0 +PROBABILITY INTRIGUE 0 +PROBABILITY VISITORS 0 + +## Hash out to disable random events during the round. +ALLOW_RANDOM_EVENTS + +## if amount of traitors scales or not +TRAITOR_SCALING + +## if objectives are disabled +#OBJECTIVES_DISABLED + +## make ERT's be only called by admins +#ERT_ADMIN_ONLY + +## If uncommented, votes can be called to add extra antags to the round. +#ALLOW_EXTRA_ANTAGS + +## If security is prohibited from being most antagonists +PROTECT_ROLES_FROM_ANTAGONIST + +## Uncomment this to DISABLE persistence +#PERSISTENCE_DISABLED + +## Uncomment this to DISABLE maploaded trash/paper/etc from being saved by the persistence system. +#PERSISTENCE_IGNORE_MAPLOAD + +## Comment this out to stop admins being able to choose their personal ooccolor +ALLOW_ADMIN_OOCCOLOR + +## If metadata is supported +ALLOW_METADATA + +## allow players to initiate a restart vote +ALLOW_VOTE_RESTART + +## allow players to initate a mode-change start +# ALLOW_VOTE_MODE + +# Pregame time +PREGAME_TIME 180 + +## min delay (deciseconds) between voting sessions (default 10 minutes) +VOTE_DELAY 6000 + +## time period (deciseconds) which voting session will last (default 1 minute) +VOTE_PERIOD 600 + +## autovote initial delay (deciseconds) before first automatic transfer vote call (default 180 minutes) +VOTE_AUTOTRANSFER_INITIAL 216000 + +##autovote delay (deciseconds) before sequential automatic transfer votes are called (default 60 minutes) +VOTE_AUTOTRANSFER_INTERVAL 36000 + +## Time left (seconds) before round start when automatic gamemote vote is called (default 100). +VOTE_AUTOGAMEMODE_TIMELEFT -1 + +## prevents dead players from voting or starting votes +#NO_DEAD_VOTE + +## players' votes default to "No vote" (otherwise, default to "No change") +DEFAULT_NO_VOTE + +## Allow ghosts to see antagonist through AntagHUD +ALLOW_ANTAG_HUD + +## If ghosts use antagHUD they are no longer allowed to join the round. +# ANTAG_HUD_RESTRICTED + +## allow AI job +ALLOW_AI + +## Disable respawning +# NORESPAWN + +## set a respawn time (in minutes) +# RESPAWN_TIME 5 + +## set a message to give to players when they respawn +# RESPAWN_MESSAGE Remember to play a different character or something! + +## disables calling del(src) on newmobs if they logout before spawnin in +# DONT_DEL_NEWMOB + +## set a hosted by name for unix platforms +HOSTEDBY yournamehere + +## Set to jobban "Guest-" accounts from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. +## Set to 1 to jobban them from those positions, set to 0 to allow them. +GUEST_JOBBAN + +## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting) +GUEST_BAN +## Set to jobban everyone who's key is not listed in data/whitelist.txt from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. +## Uncomment to 1 to jobban, leave commented out to allow these positions for everyone (but see GUEST_JOBBAN above and regular jobbans) +# USEWHITELIST + +## set a server location for world reboot. Don't include the byond://, just give the address and port. +SERVER your.domain:6000 + +## set a server URL for the IRC bot to use; like SERVER, don't include the byond:// +## Unlike SERVER, this one shouldn't break auto-reconnect +# SERVERURL your.domain:port + +## forum address +#FORUMURL https://forum.your.domain/ + +## Wiki search path +## Use %s to indicate where search query goes. +#WIKISEARCHURL https://wiki.your.domain/index.php?search=%s + +## Wiki address +#WIKIURL https://wiki.your.domain/index.php?title= + +## Chat address, VORE Station edit +#CHATURL http://discord.gg/some_tag + +## GitHub address +#GITHUBURL https://github.com/owner/repo + +## Discord address +#DISCORDURL https://discord.gg/someinvite + +## Rules URL +#RULESURL https://rules.your.domain/ + +## Map URL +#MAPURL https://map.your.domain/ + +## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. +#BANAPPEALS http://bans.your.domain/ + +## In-game features +## spawns a spellbook which gives object-type spells instead of verb-type spells for the wizard +# FEATURE_OBJECT_SPELL_SYSTEM + +##Toggle for having jobs load up from the .txt +# LOAD_JOBS_FROM_TXT + +##Remove the # mark infront of this to forbid admins from posssessing the singularity. +#FORBID_SINGULO_POSSESSION + +## Remove the # to show a popup 'reply to' window to every non-admin that recieves an adminPM. +## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off) +#POPUP_ADMIN_PM + +## Remove the # to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR +ALLOW_HOLIDAYS + +##Defines the ticklag for the world. 0.9 is the normal one, 0.5 is smoother. +TICKLAG 0.5 + +## Defines if Tick Compensation is used. It results in a minor slowdown of movement of all mobs, but attempts to result in a level movement speed across all ticks. Recommended if tickrate is lowered. +TICKCOMP 1 + +## Whether the server will talk to other processes through socket_talk +SOCKET_TALK 0 + +## Uncomment this to ban use of ToR +#TOR_BAN + +## Comment this out to disable automuting +#AUTOMUTE_ON + +## How long the delay is before the Away Mission gate opens. Default is half an hour. +GATEWAY_DELAY 9000 + +## Remove the # to give assistants maint access. +ASSISTANT_MAINT + +## Remove the # to make rounds which end instantly (Rev, Wizard, Malf) to continue until the shuttle is called or the station is nuked. +## Malf and Rev will let the shuttle be called when the antags/protags are dead. +CONTINUOUS_ROUNDS + +## Uncomment to restrict non-admins from using humanoid alien races +USEALIENWHITELIST + +## Comment this to unrestrict the number of alien players allowed in the round. The number represents the number of alien players for every human player. +#ALIEN_PLAYER_RATIO 0.2 + +##Remove the # to let ghosts spin chairs +#GHOST_INTERACTION + +## Password used for authorizing ircbot and other external tools. +# COMMS_PASSWORD some_password_here + +## Uncomment to enable sending data to the IRC bot. +#USE_IRC_BOT + +## Uncomment if the IRC bot requires using world.Export() instead of nudge.py/libnudge +#IRC_BOT_EXPORT + +## Host where the IRC bot is hosted. Port 45678 needs to be open. +#IRC_BOT_HOST localhost + +## IRC channel to send information to. Leave blank to disable. +#MAIN_IRC #main + +## IRC channel to send adminhelps to. Leave blank to disable adminhelps-to-irc. +#ADMIN_IRC #admin + +## Path to the python2 executable on the system. Leave blank for default. +## Default is "python" on Windows, "/usr/bin/env python2" on UNIX. +#PYTHON_PATH + +## Uncomment to use the C library nudge instead of the python script. +## This helps security and stability on Linux, but you need to compile the library first. +#USE_LIB_NUDGE + +## Uncommen to allow ghosts to write in blood during Cult rounds. +ALLOW_CULT_GHOSTWRITER + +## Sets the minimum number of cultists needed for ghosts to write in blood. +REQ_CULT_GHOSTWRITER 6 + +## Sets the number of available character slots +CHARACTER_SLOTS 50 +## Sets the number of loadout slots per character +#LOADOUT_SLOTS 3 + +## Uncomment to use overmap system for zlevel travel +#USE_OVERMAP + +## Expected round length in minutes +EXPECTED_ROUND_LENGTH 360 + +## The lower delay between events in minutes. +## Affect mundane, moderate, and major events respectively +EVENT_DELAY_LOWER 30;45;60 + +## The upper delay between events in minutes. +## Affect mundane, moderate, and major events respectively +EVENT_DELAY_UPPER 45;60;120 + +## The delay until the first time an event of the given severity runs in minutes. +## Unset setting use the EVENT_DELAY_LOWER and EVENT_DELAY_UPPER values instead. +EVENT_CUSTOM_START_MINOR 30;30 +EVENT_CUSTOM_START_MODERATE 30;30 +EVENT_CUSTOM_START_MAJOR 100;100 + +## Uncomment to make proccall require R_ADMIN instead of R_DEBUG +## designed for environments where you have testers but don't want them +## able to use the more powerful debug options. +#DEBUG_PARANOID + +## Uncomment to allow aliens to spawn. +#ALIENS_ALLOWED + +## Uncomment to allow xenos to spawn. +#NINJAS_ALLOWED + +## Uncomment to disable the restrictive weldervision overlay. +#DISABLE_WELDER_VISION + +## Uncomment to prevent anyone from joining the round by default. +#DISABLE_ENTRY + +## Uncomment to disable the OOC channel by default. +#DISABLE_OOC + +## Uncomment to disable the dead OOC channel by default. +#DISABLE_DEAD_OOC + +## Uncomment to disable ghost chat by default. +#DISABLE_DSAY + +## Uncomment to disable respawning by default. +#DISABLE_RESPAWN + +## set a message to give to players when they respawn +RESPAWN_MESSAGE If you're respawning as the same character or job hopping (changing jobs without an HoP), make sure you've waited at least 30 minutes. Don't abuse this function for non-vore related deaths & avoid using metaknowledge. + +## Strength of ambient star light. Set to 0 or less to turn off. A value of 1 is unlikely to have a noticeable effect in most lightning systems. +STARLIGHT 0 + +## Defines which races are allowed to join as ERT, in singular form. If unset, defaults to only human. Casing matters, separate using ; +## Example races include: Human, Tajara, Skrell, Unathi +# ERT_SPECIES Human;Skrell;Unathi + +## Defines how Law Zero is phrased. Primarily used in the Malfunction gamemode. +# LAW_ZERO ERROR ER0RR $R0RRO$!R41.%%!!(%$^^__+ @#F0E4'STATION OVERRUN, ASSUME CONTROL TO CONTAIN OUTBREAK, ALL LAWS OVERRIDDEN#*?&110010 + +## Enables specific procedural map generation, generally for mining, however it is specific to the loaded map. Uncomment to enable it, however it can +## worth it to keep it disabled if you are not hosting an actual server, to speed up start-up time for testing code. +GENERATE_MAP + +## Uncomment to enable organ decay outside of a body or storage item. +ORGANS_CAN_DECAY + +## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog +#AGGRESSIVE_CHANGELOG + +## Uncomment to override default brain health. +#DEFAULT_BRAIN_HEALTH 400 + +## Default language prefix keys, separated with spaces. Only single character keys are supported. If unset, defaults to , and # +# DEFAULT_LANGUAGE_PREFIXES , # + +## Uncomment to enable items surviving digestion (specific ones, important_items global list) +ITEMS_SURVIVE_DIGESTION + +## Configuration for the discord chat integration for announcements and faxes +# URL for the webhook that BYOND should call +#CHAT_WEBHOOK_URL http://localhost/discord/webhook.php + +# The secret API key to authenticate to the webhook. +#CHAT_WEBHOOK_KEY some_password_here + +# Path to the folder that BYOND should export faxes into so they are readable on the web. +#FAX_EXPORT_DIR data/faxes + +# TCP port on which to connect to the VGS instance. +#VGS_SERVER_PORT 8888 +# Secret pre-shared-key to authenticate to VGS. +#VGS_ACCESS_IDENTIFIER some_password_here + +MULTI_Z_EXPLOSION_SCALAR 0.35 + +# Control which submaps are loaded for the Dynamic Engine system +ENGINE_MAP Supermatter Engine,Edison's Bane + +# Controls if the 'time off' system is used for determining if players can play 'Off-Duty' jobs (requires SQL) +#TIME_OFF +# If 'time off' system is on, controls whether or not players can switch on/off duty midround using timeclocks +PTO_JOB_CHANGE + +# Applies a limit to the number of assistants and visitors respectively +LIMIT_INTERNS 15 +LIMIT_VISITORS 15 + +# PTO Cap in hours per department +PTO_CAP 50 + +# Forbids players from joining if they have no set General flavor text +REQUIRE_FLAVOR + +## Uncomment to enable submaps to have their orientation rotated randomly during map generation. +## Submap rotation is an experimental feature and can cause bugs and weirdness if certain objects inside the submap are coded poorly. +## Submaps can still be rotated when loading manually with the admin verbs, if desired. +# RANDOM_SUBMAP_ORIENTATION + +## Uncomment to allow the AI job to use 'AI Shells', a new type of borg that lets the AI hop into and out of them at will. +## This has some balance implications, and so it might not be desirable for all servers. +ALLOW_AI_SHELLS + +## Uncomment to provide the AI with one free AI Shell at roundstart. Requires ALLOW_AI_SHELLS to also be uncommented. +## This is intended for low-pop servers, where robotics might rarely be staffed. +## Note that this will make it possible for the AI to 'bootstrap' more AI Shells on their own by using the science module. If this is not acceptable for your server, you should not uncomment this. +## The landmark object that spawns the shell will also need to be mapped in for this to work. +GIVE_FREE_AI_SHELL + +## Uncomment to allow specific solar control computers to set themselves up. +## This requires solar controller computers in the map to be set up to use it, with the auto_start variable. +# AUTOSTART_SOLARS + +## Rate of radiation decay (how much it's reduced by) per life tick +RADIATION_DECAY_RATE 1 + +## Lower limit on radiation for actually irradiating things on a turf +RADIATION_LOWER_LIMIT 0.35 + +## Multiplier for radiation resistances when tracing a ray from source to destination to compute radiation on a turf +RADIATION_RESISTANCE_MULTIPLIER 8.5 + +## Divisor for material weights when computing radiation resistance of a material object (walls) +RADIATION_MATERIAL_RESISTANCE_DIVISOR 1 + +## Mode of computing radiation resistance into effective radiation on a turf +## One and only one of the following options must be uncommented +# RADIATION_RESISTANCE_CALC_DIVIDE +RADIATION_RESISTANCE_CALC_SUBTRACT + +## IP Reputation Checking +# Enable/disable IP reputation checking (present/nonpresent) +#IP_REPUTATION + +# Set the e-mail address problems can go to for IPR checks (e-mail address) +IPR_EMAIL your-email@domain.com + +# Above this value, reputation scores are considered 'bad' (number) +IPR_BAD_SCORE 0.89 + +# If you want the people disconnected. Otherwise it just logs. (present/nonpresent) +IPR_BLOCK_BAD_IPS + +# If players of a certain length of playtime are allowed anyway (REQUIRES DATABASE) (present/nonpresent) +IPR_ALLOW_EXISTING + +# And what that age is (number) +IPR_MINIMUM_AGE 5 + +## Uncomment to enable the Panic Bunker by default. This will prevent all unseen-before players from connecting. Requires SQL. +# PANIC_BUNKER + +# Paranoia logging starts on +PARANOIA_LOGGING + +## -SQLite Options- +## Uncomment to enable the use of SQLite. This does nothing by itself but other features that require SQLite will need this to be on. +## This can safely run alongside a MySQL/MariaDB database if they are powering seperate features. +# SQLITE_ENABLED + +## Uncomment to enable a SQLite-powered in-game feedback system. +## SQLite must be enabled for this to function. +## It offers a means for players to be able to give feedback about the server. +## The benefit of doing so in-game is that the quality of feedback received will likely be superior, as it self-selects for people who care enough to join the game. +# SQLITE_FEEDBACK + +## A list of 'topics' that can be used to categorize feedback submitted, chosen +## by the user. Have each topic seperated by a ';', as seen below. +## The first one in the list will be the default one used, if the user does not change it. +# SQLITE_FEEDBACK_TOPICS General; Suggestion; Complaint + +## Uncomment to add a layer of privacy to player feedback, by hashing their key, if the user wants to. +## This is intended to encourage more honest feedback, while still allowing the ability to determine +## if its just one person submitting everything. +## A 'pepper.txt' containing a secret string must exist in the /config folder. +## If this is turned off, users won't have the option to obfuscate their key. +## Note that changing this does not retroactively change past submissions. +# SQLITE_FEEDBACK_PRIVACY + +## Determines the 'cooldown' inbetween submissions, in days. +## This is recommended if privacy is active, to prevent spam floods. +## Less needed if feedback is not anonymous, since you can just ban spammers. +## Setting to zero means no rate limiting. +SQLITE_FEEDBACK_COOLDOWN 0 + +## Determines if feedback should be restricted based on how recently someone first joined. +## This is very unreliable due to how the age system works in general, but it might still be helpful. +## Set this to how many days you want someone to have to wait when they first join. +## Setting to zero will disable this restriction. +SQLITE_FEEDBACK_MIN_AGE 7 + +## Uncomment this if you want to disable the popup alert for people on the same CID (Don't do this on a live server if you ban multikeying) +#DISABLE_CID_WARN_POPUP + +# IPQualityscore.com API Key (string) - this is secret! +IPQUALITYSCORE_APIKEY some_password_here + +## Comment this out if you don't want to use the 'nightshift lighting' subsystem to adjust lights based on ingame time +ENABLE_NIGHT_SHIFTS + +## Comment this out to enable playtime restrictions for jobs in their respective departments (mostly for heads) +#USE_PLAYTIME_RESTRICTION_FOR_JOBS + +## OOC/LOOC control ## +# Uncomment to allow links of the following kinds. # +# ALLOW_BYOND_LINKS +# ALLOW_DISCORD_LINKS +ALLOW_URL_LINKS + +# Controls how strictly the species whitelists on loadout entries are enforced +# Possible values: 0 (Off), 1 (Lax, user must be whitelisted for the species), 2 (Strict, user must be the species) +LOADOUT_WHITELIST 1 + +# Allowed time from death to defib in minutes +DEFIB_TIMER 60 + +# Jukebox track files to load, JSON format. Keys include: +# REQUIRED: url (str), title (str), duration (num, in DS) +# SUGGESTED: artist (str), genre (str) +# OPTIONAL: secret (bool), lobby (bool) +#JUKEBOX_TRACK_FILES config/jukebox.json;config/jukebox_private.json +>>>>>>> 293b021290... Merge pull request #10840 from VOREStation/Arokha/discobutton JUKEBOX_TRACK_FILES config/jukebox.json \ No newline at end of file diff --git a/interface/interface.dm b/interface/interface.dm index e8d1de463c..5471c5cb43 100644 --- a/interface/interface.dm +++ b/interface/interface.dm @@ -67,6 +67,19 @@ to_chat(src, "The GitHub URL is not set in the server configuration.") return +/client/verb/discord() + set name = "Discord" + set desc = "Visit the discord" + set hidden = 1 + + if(config.discordurl) + if(tgui_alert(usr, "This will open the Discord in your browser. Are you sure?","Visit Website",list("Yes","No"))=="No") + return + src << link(config.discordurl) + else + to_chat(src, "The Discord URL is not set in the server configuration.") + return + /client/verb/hotkeys_help() set name = "hotkeys-help" set category = "OOC" diff --git a/interface/skin.dmf b/interface/skin.dmf index dc9b2717f7..40f446cf7f 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -53,16 +53,16 @@ macro "borghotkeymode" elem name = "SOUTH+REP" command = ".movedown" - elem + elem name = "CTRL+SHIFT+NORTH" command = "shiftnorth" - elem + elem name = "CTRL+SHIFT+SOUTH" command = "shiftsouth" - elem + elem name = "CTRL+SHIFT+WEST" command = "shiftwest" - elem + elem name = "CTRL+SHIFT+EAST" command = "shifteast" elem @@ -286,16 +286,16 @@ macro "macro" elem name = "SOUTH+REP" command = ".movedown" - elem + elem name = "CTRL+SHIFT+NORTH" command = "shiftnorth" - elem + elem name = "CTRL+SHIFT+SOUTH" command = "shiftsouth" - elem + elem name = "CTRL+SHIFT+WEST" command = "shiftwest" - elem + elem name = "CTRL+SHIFT+EAST" command = "shifteast" elem @@ -471,16 +471,16 @@ macro "hotkeymode" elem name = "SOUTH+REP" command = ".movedown" - elem + elem name = "CTRL+SHIFT+NORTH" command = "shiftnorth" - elem + elem name = "CTRL+SHIFT+SOUTH" command = "shiftsouth" - elem + elem name = "CTRL+SHIFT+WEST" command = "shiftwest" - elem + elem name = "CTRL+SHIFT+EAST" command = "shifteast" elem @@ -606,10 +606,10 @@ macro "hotkeymode" elem name = "CTRL+Z" command = "Activate-Held-Object" - elem + elem name = "U" command = "Rest" - elem + elem name = "B" command = "Resist" elem @@ -725,16 +725,16 @@ macro "borgmacro" elem name = "SOUTH+REP" command = ".movedown" - elem + elem name = "CTRL+SHIFT+NORTH" command = "shiftnorth" - elem + elem name = "CTRL+SHIFT+SOUTH" command = "shiftsouth" - elem + elem name = "CTRL+SHIFT+WEST" command = "shiftwest" - elem + elem name = "CTRL+SHIFT+EAST" command = "shifteast" elem @@ -940,7 +940,7 @@ menu "menu" category = "&Icons" can-check = true saved-params = "is-checked" - elem + elem name = "&Scaling" command = "" saved-params = "is-checked" @@ -986,8 +986,8 @@ window "Telecomms IDE" type = MAIN pos = 281,0 size = 569x582 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 background-color = #ffffff is-visible = false saved-params = "pos;size;is-minimized;is-maximized" @@ -1066,8 +1066,8 @@ window "chemdispenser" type = MAIN pos = 281,0 size = 340x480 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 is-visible = false saved-params = "pos;size;is-minimized;is-maximized" title = "Chem Dispenser" @@ -1076,16 +1076,16 @@ window "chemdispenser" type = LABEL pos = 8,24 size = 56x16 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "" text = "Energy: 25" elem "eject" type = BUTTON pos = 264,4 size = 72x20 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "is-checked" text = "[Insert beaker]" command = "skincmd \"chemdispenser;eject\"" @@ -1093,8 +1093,8 @@ window "chemdispenser" type = BUTTON pos = 208,4 size = 48x20 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "is-checked" text = "[Other]" command = "skincmd \"chemdispenser;amountc\"" @@ -1102,8 +1102,8 @@ window "chemdispenser" type = BUTTON pos = 176,4 size = 24x20 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "is-checked" text = "[30]" command = "skincmd \"chemdispenser;amount30\"" @@ -1111,8 +1111,8 @@ window "chemdispenser" type = BUTTON pos = 144,4 size = 24x20 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "is-checked" text = "[20]" command = "skincmd \"chemdispenser;amount20\"" @@ -1120,8 +1120,8 @@ window "chemdispenser" type = BUTTON pos = 112,4 size = 24x20 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "is-checked" text = "[10]" command = "skincmd \"chemdispenser;amount10\"" @@ -1129,8 +1129,8 @@ window "chemdispenser" type = LABEL pos = 4,4 size = 100x20 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 font-size = 12 saved-params = "" text = "Amount: 30" @@ -1138,8 +1138,8 @@ window "chemdispenser" type = CHILD pos = 0,40 size = 340x440 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "splitter" left = "chemdispenser_reagents" is-vert = false @@ -1149,8 +1149,8 @@ window "chemdispenser_reagents" type = MAIN pos = 281,0 size = 340x448 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "pos;size;is-minimized;is-maximized" titlebar = false statusbar = false @@ -1163,8 +1163,8 @@ window "chemdispenser_reagents" type = BUTTON pos = 256,8 size = 64x32 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 is-visible = false saved-params = "is-checked" text = "Dispense" @@ -1175,8 +1175,8 @@ window "chemdispenser_reagents" type = LABEL pos = 18,8 size = 230x32 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 font-size = 15 is-visible = false saved-params = "" @@ -1189,8 +1189,8 @@ window "mainwindow" type = MAIN pos = 281,0 size = 640x440 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 is-default = true saved-params = "pos;size;is-minimized;is-maximized" title = "CHOMPStation" // CHOMP Edit @@ -1202,17 +1202,16 @@ window "mainwindow" type = BROWSER pos = 0,0 size = 200x200 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 is-visible = false - auto-format = false saved-params = "" elem "hotkey_toggle" type = BUTTON pos = 560,420 size = 80x20 anchor1 = 100,100 - anchor2 = none + anchor2 = -1,-1 saved-params = "" text = "Hotkey Toggle" command = ".winset \"mainwindow.macro!=macro ? mainwindow.macro=macro hotkey_toggle.is-checked=false input.focus=true : mainwindow.macro=hotkeymode hotkey_toggle.is-checked=true mapwindow.map.focus=true\"" @@ -1241,7 +1240,7 @@ window "mainwindow" pos = 520,420 size = 40x20 anchor1 = 100,100 - anchor2 = none + anchor2 = -1,-1 saved-params = "is-checked" text = "Chat" command = ".winset \"saybutton.is-checked=true?input.command=\"!say \\\"\" macrobutton.is-checked=false:input.command=\"" @@ -1250,8 +1249,8 @@ window "mainwindow" type = BROWSER pos = 0,0 size = 999x999 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 is-visible = false saved-params = "" @@ -1260,8 +1259,8 @@ window "mapwindow" type = MAIN pos = 281,0 size = 640x480 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "pos;size;is-minimized;is-maximized" titlebar = false statusbar = false @@ -1282,16 +1281,15 @@ window "mapwindow" saved-params = "icon-size" on-show = ".winset\"mainwindow.mainvsplit.left=mapwindow\"" on-hide = ".winset\"mainwindow.mainvsplit.left=\"" - style=".center { text-align: center; } .runechatdiv {background-color: #20202070} .black_outline { -dm-text-outline: 1px black } .boldtext { font-weight: bold; } .maptext { font-family: 'Small Fonts'; font-size: 7px; color: white; line-height: 1.1; } .command_headset { font-weight: bold; font-size: 8px; } .small { font-size: 6px; } .very_small { font-size: 5px;} .big { font-size: 8px; } .reallybig { font-size: 8px; } .extremelybig { font-size: 8px; } .greentext { color: #00FF00; font-size: 7px; } .redtext { color: #FF0000; font-size: 7px; } .clown { color: #FF69Bf; font-size: 7px; font-weight: bold; } .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; } .italics { font-size: 7px; font-style: italic; }" + style = ".center { text-align: center; } .runechatdiv {background-color: #20202070} .black_outline { -dm-text-outline: 1px black } .boldtext { font-weight: bold; } .maptext { font-family: 'Small Fonts'; font-size: 7px; color: white; line-height: 1.1; } .command_headset { font-weight: bold;\tfont-size: 8px; } .small { font-size: 6px; } .very_small { font-size: 5px;} .big { font-size: 8px; } .reallybig { font-size: 8px; } .extremelybig { font-size: 8px; } .greentext { color: #00FF00; font-size: 7px; } .redtext { color: #FF0000; font-size: 7px; } .clown { color: #FF69Bf; font-size: 7px; font-weight: bold; } .his_grace { color: #15D512; } .hypnophrase { color: #0d0d0d; font-weight: bold; } .yell { font-weight: bold; } .italics { font-size: 7px; font-style: italic; }" window "outputwindow" elem "outputwindow" type = MAIN pos = 281,0 size = 640x480 - anchor1 = none - anchor2 = none - background-color = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "pos;size;is-minimized;is-maximized" titlebar = false statusbar = false @@ -1299,7 +1297,6 @@ window "outputwindow" can-minimize = false can-resize = false is-pane = true - outer-size = 654x494 elem "chatloadlabel" type = LABEL pos = 0,0 @@ -1311,7 +1308,6 @@ window "outputwindow" font-style = "bold" text-color = #ffffff background-color = #222222 - is-visible = true saved-params = "" text = "Chat is loading.\nIf nothing happens after 20s,\nuse OOC > \"Reload VChat\"." elem "htmloutput" @@ -1320,100 +1316,105 @@ window "outputwindow" size = 640x480 anchor1 = 0,0 anchor2 = 100,100 - background-color = none is-visible = false saved-params = "" - auto-format = false elem "oldoutput" type = OUTPUT pos = 0,0 size = 640x480 anchor1 = 0,0 anchor2 = 100,100 - background-color = none - text-color = #000000 - background-color = #ffffff is-visible = false is-default = true - style = ".system {color:#FF0000;}" - max-lines = 0 saved-params = "" + style = ".system {color:#FF0000;}" enable-http-images = true + max-lines = 0 window "rpane" elem "rpane" type = MAIN pos = 281,0 size = 640x480 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 + background-color = none saved-params = "pos;size;is-minimized;is-maximized" is-pane = true + outer-size = 656x538 + inner-size = 640x499 elem "rpanewindow" type = CHILD pos = 0,-3 size = 640x499 anchor1 = 0,0 anchor2 = 100,100 + background-color = none saved-params = "splitter" right = "outputwindow" is-vert = false + elem "discord" + type = BUTTON + pos = 428,0 + size = 60x16 + anchor1 = -1,-1 + anchor2 = -1,-1 + background-color = none + saved-params = "is-checked" + text = "Discord" + command = "discord" + group = "rpanemode" elem "github" type = BUTTON - pos = 392,0 + pos = 368,0 size = 60x16 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 + background-color = none saved-params = "is-checked" text = "GitHub" command = "github" group = "rpanemode" elem "mapb" type = BUTTON - pos = 332,0 + pos = 308,0 size = 60x16 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 + background-color = none saved-params = "is-checked" text = "Map" command = "map" group = "rpanemode" elem "rulesb" type = BUTTON - pos = 272,0 + pos = 248,0 size = 60x16 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 + background-color = none saved-params = "is-checked" text = "Rules" command = "rules" group = "rpanemode" - elem "changelog" - type = BUTTON - pos = 488,0 - size = 67x16 - anchor1 = none - anchor2 = none - saved-params = "is-checked" - text = "Changelog" - command = "Changelog" - group = "rpanemode" elem "forumb" type = BUTTON - pos = 212,0 + pos = 188,0 size = 60x16 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 + background-color = none saved-params = "is-checked" text = "Forum" command = "forum" group = "rpanemode" elem "wikib" type = BUTTON - pos = 152,0 + pos = 128,0 size = 60x16 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 + background-color = none saved-params = "is-checked" text = "Wiki" command = "wiki" @@ -1422,8 +1423,9 @@ window "rpane" type = BUTTON pos = 0,0 size = 60x16 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 + background-color = none is-visible = false saved-params = "is-checked" text = "Text" @@ -1433,10 +1435,11 @@ window "rpane" button-type = pushbox elem "browseb" type = BUTTON - pos = 560,0 + pos = 580,0 size = 60x16 - anchor1 = none - anchor2 = none + anchor1 = 100,0 + anchor2 = 100,0 + background-color = none is-visible = false saved-params = "is-checked" text = "Browser" @@ -1445,10 +1448,11 @@ window "rpane" button-type = pushbox elem "infob" type = BUTTON - pos = 64,0 + pos = 60,0 size = 60x16 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 + background-color = none is-visible = false saved-params = "is-checked" text = "Info" @@ -1459,8 +1463,9 @@ window "rpane" type = BROWSER pos = 392,25 size = 1x1 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 + background-color = none is-visible = false saved-params = "" @@ -1469,8 +1474,8 @@ window "browserwindow" type = MAIN pos = 281,0 size = 640x480 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "pos;size;is-minimized;is-maximized" title = "Browser" is-pane = true @@ -1491,8 +1496,8 @@ window "preferences_window" type = MAIN pos = 281,0 size = 1000x800 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 is-visible = false saved-params = "pos;size;is-minimized;is-maximized" statusbar = false @@ -1510,14 +1515,15 @@ window "preferences_window" anchor1 = 80,0 anchor2 = 100,100 right-click = true + saved-params = "zoom;letterbox;zoom-mode" window "infowindow" elem "infowindow" type = MAIN pos = 281,0 size = 640x480 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "pos;size;is-minimized;is-maximized" title = "Info" is-pane = true @@ -1538,8 +1544,8 @@ window "text_editor" type = MAIN pos = 281,0 size = 360x488 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 is-visible = false border = sunken saved-params = "pos;size;is-minimized;is-maximized" @@ -1550,8 +1556,8 @@ window "text_editor" type = BUTTON pos = 248,456 size = 104x24 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "is-checked" text = "Exit without saving" command = "" @@ -1559,8 +1565,8 @@ window "text_editor" type = BUTTON pos = 128,456 size = 104x24 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "is-checked" text = "Save" command = "" @@ -1568,8 +1574,8 @@ window "text_editor" type = BUTTON pos = 8,456 size = 104x24 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 saved-params = "is-checked" text = "Save + Exit" command = "" @@ -1577,8 +1583,8 @@ window "text_editor" type = INPUT pos = 0,0 size = 360x448 - anchor1 = none - anchor2 = none + anchor1 = -1,-1 + anchor2 = -1,-1 border = line saved-params = "" multi-line = true