code:
2021-10-01:
  Mooshimi:
  - code_imp: AIs will no longer get the asimov lawset on unique-lawset station trait
      rounds
  Timberpoes:
  - bugfix: Spawners Menu buttons once again work to jump or spawn as ghost roles.
  Watermelon914:
  - bugfix: Fixed module circuit size not taking up capacity equal to the amount of
      circuit components inside of it.
2021-10-02:
  Arkatos:
  - qol: Vending machines now use their name as a title for their UI.
  InvalidArgument3:
  - bugfix: durand shield will no longer burn forever or take fire/acid damage from
      the environment
  - bugfix: burning vehicles can now be extinguished.
  - bugfix: you can now properly toggle on/off exosuit modules such as the generators,
      repair droid, tesla energy relays, and RCS
  JohnFulpWillard:
  - spellcheck: The NT IRN app will properly tell you that it cannot be used with
      department budget cards, who is this 'budgetorders' fellow anyways?
  - bugfix: Oven boards can now be researched with the rest of the kitchen's machinery.
  MMMiracles:
  - rscadd: Tramstation's cargo crates now spawn with some maintenance loot at roundstart.
  - bugfix: Fixed a singular rogue corner decal in Tramstation's cargo
  - bugfix: Tramstation's dinner room area disposal now actually connects to the disposal
      grid and not directly back into the dinner area.
  - bugfix: Tramstation's directional signs have been updated to properly show department
      directions.
  Melbert:
  - balance: The firebreath Mutation is now a cone of fire, instead of a real fireball.
  Mooshimi:
  - bugfix: you will no longer spawn behind the arrivals shuttle on kilo or on ice
      wastes for icebox, when the stations has the random spawn trait
  Mothblocks:
  - admin: You can now cancel incoming and outgoing cross comms console messages.
  - bugfix: The species list will now scroll properly when there are too many. This
      has meant nothing up until this point, but will when Halloween races are enabled
      again.
  - admin: Added a preference to disable your usual deadmin preferences when you are
      spawned in CentCom. This is on by default.
  - bugfix: UI with tooltips will now be much faster to create them, such as R&D console
      searching or preferences menu tab switching.
  Sealed101:
  - expansion: 'There is a new type of experiment provided by Nanotrasen: Machinery
      scanning!'
  Y0SH1M4S73R:
  - admin: Circuit components to perform animations and manipulate filters have been
      added. These components are the "Begin Animation", "Animation Step", "Add Filter",
      "Filter Remover", "Filter Parameter Helper", and "Animation & Filter Bitflag
      Helper" components. Refer to their descriptions for more information.
2021-10-03:
  Ghilker:
  - qol: 'Allow players to build a girder on a turf by r-clicking the turf with a
      sheet of iron with enough material in it remove: Removed wall girder building
      from iron sheet construction recipe UI'
  - qol: added an examine text on iron sheets to inform players about the new method
      of building girders
  - expansion: Add USB port to the atmos pumps
  Hulkamania:
  - expansion: You can now proclaim yourself a Mime Fan or a Clown Enjoyer.
  InvalidArgument3:
  - expansion: 'directional floodlights for exosuits sound: sound effects for switching
      exosuit equipment'
  JohnFulpWillard:
  - bugfix: Midround Nightmares will once again spawn.
  KathyRyals:
  - bugfix: Fixed the hair dye spray to be tiny, as it was intended.
  KittyCatMeowMeow:
  - bugfix: Fixes access on Maint airlocks on the tramstation bar
  Maurukas:
  - bugfix: The Metastation gravity generator is now properly connected to the power
      grid again
  - bugfix: A large number of doubled power cables have been fixed across on all stations
  - bugfix: A large number of broken, disconnected or doubled up atmospherics pipes
      have been fixed across all stations
  - bugfix: Multiple disconnected vents and scrubbers have been reconnected to the
      atmos network on Tram and Meta
  - bugfix: A large number of improperly named and networked cameras have been fixed
      across all stations
  - bugfix: Doubled tiles, decals, disposals, pipes and wires from the great map merge
      incident have been removed
  Mooshimi:
  - spellcheck: was/were grammar fix on items being knocked off
  Mothblocks:
  - bugfix: Midround wizard is now selectable.
  Pickle-Coding:
  - bugfix: Reactions will now properly fully react when it has moles to consume.
      Instead of the reaction stopping when one of the gasses is lower than reaction
      rate, it will instead adjust the reaction rate so that it consumes all of the
      gas.
  Ryll/Shaps:
  - balance: Getting hit by the tram and landing on lattice or unplated flooring (on
      the upper z-level) will now cause you to smash through it and fall to the z-level
      below at the cost of taking some extra damage. Note that floors with plating
      will still hold steady, so you can still use flooring to make getting hit by
      the tram insanely lethal, it just takes a bit more effort.
  esainane:
  - bugfix: The Space Hotel ruin's Staff Room and Staff Store now use distinct areas,
      and no longer have APCs fighting each other for control.
  - code_imp: /area now retains a local reference to the APC in the area, if any
  - bugfix: The SM/HFR will now always play harsh accent sounds when they should
  tralezab:
  - bugfix: spirit holder exorcisms now make sounds
  - bugfix: fixes possessed blade not actually being able to be possessed
  - refactor: null rod's subtype picking is now an element
2021-10-04:
  Ghilker:
  - bugfix: fix pod emergency storage exploit
  KittyCatMeowMeow:
  - bugfix: Added a few cables to Lavaland Mining for charging
  Mooshimi:
  - code_imp: moved some ai law defines to the proper file
  Wayland-Smithy:
  - bugfix: Fixed many Tramstation department sign arrows pointing to upload and vault.
  esainane:
  - refactor: Completely restructure HFR main processes, fixing many unusual edge
      cases when the HFR was unpowered, out of fuel, interacted with other subsystems
      poorly, etc.
  - refactor: HFR equations with cryptic parameters have all been rewritten to use
      mathematically equivalent normalized equations derived from human-parseable
      parameters.
  - code_imp: The HFR now has fewer superfluous and misleading checks.
  - code_imp: HFR configuration is now much more heavily documented and generally
      readable.
  - code_imp: Many HFR defines and comments which are unused, misleading, and/or completely
      inapplicable to any public release of HFR code have been removed.
  - bugfix: The HFR now only interacts with the SSair subsystem via the side IO components.
  - bugfix: The HFR will no longer fail to cool if atmospherics is running slowly.
  - bugfix: The HFR's ambient sound loop will no longer fail to update to match the
      current fusion level under certain conditions.
  - bugfix: The HFR will no longer fail to update its UI under certain conditions.
  - bugfix: The HFR will no longer melt down at speeds largely determined by the wider
      atmospherics system.
  - bugfix: The HFR can no longer get stuck in states which heal without taking damage
      or vice versa.
  - bugfix: The HFR's healing/damage effects that depend on fusion power level now
      genuinely depend on fusion power level, rather than doing nothing but at any
      power level.
  - bugfix: The HFR no longer uses two distinct functions to fire nuclear particles,
      which effectively doubled the rate under some conditions.
  - bugfix: The HFR now treats Iron Content as having appropriate units - fractional
      rather than percentage points. Accumulating Iron Content will now makes it slightly
      harder to destabilize the reaction (turn it endothermic), beware.
  - bugfix: The HFR now respects delta_time in more places, again, again.
  - bugfix: The HFR now respects delta_time in another place, again, again, again.
  - code_imp: Some HFR calculations have been greatly simplified (no mechanical change).
  - bugfix: The HFR will no longer accumulate iron if there is no live reaction.
  - bugfix: The HFR will no longer passively evaporate moderator gases if there is
      no live reaction.
  - bugfix: 'The HFR, after cracking under pressure, will no longer merely leave a
      pretty decal on the affected part while becoming immune to all future cracking
      conditions, as long as nobody repaired the crack. The initial spill if highly
      pressurized is still the most dangerous, but the HFR will continue to slowly
      leak its contents even under low pressure while cracked. content: The HFR initially
      took damage at unsafe fusion levels with excess mass over 2500-1500 moles, depending
      on temperature. This was later changed to 2700-2589 moles, but in a way that
      looked like it was only meant make the thresholds a few hundred moles more tolerant.
      The range is now 2700-1800 moles.'
  - bugfix: HFR production rate is no longer multiplied by both the fuel consumption
      modifier and the gas production modifier. This means the top tier Hypernoblium/Anti-noblium
      recipe is now worth using, providing a production bonus of 3x rather than a
      penalty of x0.03. This recipe is still just as hard to operate safely.
  - bugfix: The Abandoned Zoo ruin no longer has duplicate copies of an APC, power
      cable, and rack on the same tile.
  tralezab:
  - bugfix: You can now hold people at gunpoint from range!
2021-10-05:
  Iamgoofball:
  - server: Dynamic now has an extra configuration value, max_threat_level. Defaults
      to 100 threat.
  Krysonism:
  - bugfix: Shark biopsy samples are now clean and don't contain a duplicate shark
      cell line.
  Melbert:
  - bugfix: Fixes people getting rejected by the panic bunker when they probably shouldn't
      have been (if you can read this, it probably doesn't affect you anymore)
  Mothblocks:
  - bugfix: Old photos from persistent photo albums will now no longer be lost.
  Timberpoes:
  - bugfix: Captains can sleep tight at night knowing that Disky no longer fears escape
      shuttle rides at the end of the shift. The nuke disk will no longer teleport
      itself back to the station from the emergency shuttle when the emergency shuttle
      departs.
  - admin: Admins should no longer get trolled by URL keys creating clickable links
      that look the same as admin PM shortcuts.
  Zytolg:
  - bugfix: The new mining base on Icebox will now fully load its surrounding plasma
      lake area.
  - bugfix: The Kilostation Art Closet now provides station sevants with the necessary
      art supplies.
  esainane:
  - bugfix: The airlock to MetaStation's Medical Cold Room is now properly named and
      requires Medbay General access.
  - bugfix: Kitchen cold rooms which are cold (that is, those on Ice, Meta, and Tram)
      now have their air alarms configured to expect this.
2021-10-06:
  JohnFulpWillard:
  - bugfix: Surgeries that repair organs will once again repair the organ.
  - bugfix: Swarmers-banned ghosts can no longer create Swarmer bodies from the beacon.
  Zytolg:
  - expansion: Remaps the Holding Facility into 2021 Standards
  - code_imp: Indestructible paper wall support. It's better than the alternative.
  kopoba:
  - bugfix: fix ebow was able to accept pka modkits with 0 cost
2021-10-07:
  PeterMorrison1:
  - bugfix: fixed dropped arrows being controllable with the bow
  Watermelon914:
  - qol: Refactored tgui list inputs to be a lot more user-friendly.
  lovegreenstuff:
  - bugfix: ice reaction oversight, now freezes at the proper 274k instead of 245k
  tralezab code, melbert idea!:
  - rscadd: There's a new wizard event, RPG titles. Summon the star duke!
  zxaber:
  - rscdel: The augment painter has been removed from the game.
  - rscadd: Spraycans can now change the visual style of robotic augments via right-click.
  - bugfix: Borg lights are now visible again.
2021-10-08:
  InvalidArgument3:
  - bugfix: penetrator rounds will no longer ignore vehicles
  JohnFulpWillard:
  - qol: Choice beacons now use a TGUI menu
  Melbert:
  - bugfix: The huds for clown and mime fan are back
  - bugfix: You can no longer be a simultaneous clown and mime fan, pick a side coward
  - bugfix: Quirks that once were not compatible are now incompatible again
  NamelessFairy & Mothblocks:
  - expansion: Replaces the ghost mafia button with a minigames button which opens
      the new minigames panel.
  - qol: CTF is now accessible through the new minigames menu
  - rscadd: CTF can now be played through the CTF menu, accessible through the minigames
      menu
  TiviPlus:
  - bugfix: fixed ambient occlusion stacking sometimes
  Watermelon914:
  - expansion: Adds the dispenser shell, which accepts normal-sized items and lets
      you dispense them at any time.
  - expansion: Adds the For Each component and the Filter List component.
  - refactor: Refactored the circuit list datatype to support composite types (i.e.
      entity list, any list, number list), which are lists that can only contain values
      of the specified datatype. This also refactors anything that uses the list datatype
      to use composite lists.
  - qol: NTNet components now use composite lists to send and receive data
  - bugfix: Prevented people from infinitely making lists with the list literal component.
  tralezab:
  - bugfix: Fixes catwalks not working at all!
  zxaber:
  - rscadd: Emagged and Syndicate borgs can now self-detonate. For emagged borgs,
      this destroys the MMI, so know what you're signing up for.
2021-10-09:
  Burgermancoding:
  - qol: you can orbit people who send messages using the gangster cellphone from
      families
  Colovorat:
  - expansion: Adds catwalk floor crafting recipe
  - imageadd: catwalk floor tile object sprite and inhand sprites
  DaddyIssues and Grobelon:
  - expansion: 'Added 3 new foods: Catburgers, Egg with sausage, and Sausage bread.'
  Ghilker:
  - balance: Rad collectors are gone, can be only spawned by admins. SM will now generate
      power by releasing zaps that will hit tesla coils around it. Roundstart setups
      might not be enough for bigger stations and t4 machines later in the round,
      recommended to upgrade the powergen.
  Ghommie:
  - expansion: 'The Mr. Deempisi Portrait plaque has been replaced with a very special
      picture frame: A small picture of one out four random things (Mr. Deempisi included)
      that can have a photo affixed over it. The photo will persist between rounds
      on that specific station until removed of if the frame is destroyed. Each station
      gets one, all but one (Kilo is too damn cramped) located in the bar behind the
      bartender counter. It''s also more artsy than other picture frames now. spriteadd:
      Desouled the picture frame sprites.'
  Krysonism:
  - qol: The tentacle slap ability button now goes red and displays a cooldown timer
      when on cooldown.
  - bugfix: Vat beasts now longer lose their ability when someone rides them.
  - expansion: Adds carp scales, and carp scale crafting.
  Melbert:
  - bugfix: Removing invasive spreading from a plant will now actually remove invasive
      spreading
  - refactor: Refactored seed / gene deletion, and a bit of gene addition / removal
  Timberpoes:
  - bugfix: Observers will no longer see ghost icons representing Maintenance Loot
      Spawners of Roundstart Past once the round has actually started.
  Wallemations:
  - expansion: The Goat Plushie has picked up some bad habits, please try not to let
      it near any illicit substances for the sake of its rehabilitation.
  Watermelon914:
  - admin: Admins can now stop animations on an object as well as decide if it starts
      parallel or not.
  - bugfix: Fixed animating filters in steps not working at all.
  - qol: Gave instantly executing ports special datatypes to distinguish what ports
      cause instant execution
  - bugfix: Fixed default FPS for new players and applies it to them when they join.
  Zytolg:
  - bugfix: Fixes the floating sign in the Tramstation Teleporter
  esainane:
  - code_imp: freon_gas_act is now called freeze_turf. It was only ever used in two
      places, neither of which involved Freon.
  thestubborn:
  - bugfix: the Driscoll poncho should be centered now
  timothymtorres:
  - qol: Adds random statue spawners to secure art exhibits in the library for Meta,
      Tram, and Delta.
2021-10-10:
  Arkatos:
  - bugfix: Thermomachine design icon in the R&D Console UI will now show properly.
  Guillaume Prata:
  - bugfix: Cyborgs can interact with a morgue tray to close it now, instead of needing
      to interact with the main structure.
  Krysonism:
  - qol: The mega arachnid now has a toggleable self only small sprite. No more hitting
      yourself!
  Mooshimi:
  - qol: status displays can now be wrenched off the wall, and frames can be printed
      at the autolathe
  PeterMorrison1:
  - bugfix: fixed antagonist preference tooltip showing wrong descriptions
  Watermelon914:
  - bugfix: Fixed variables sometimes just not working.
  - bugfix: Fixed the dispenser shell and For Each and Filter components not appearing
      in the component printer.
  - bugfix: Fixed the changeling antag panel
  - bugfix: Fixed the wizard's antag panel.
  - admin: Datum input ports can now have atoms and datums uploaded to them.
  esainane:
  - bugfix: HFR ambience will no longer play intensely when the HFR is out of fuel
  - bugfix: SMs meant to be immobile should now be truly immobile.
  - bugfix: Bluespace anomalies will no longer teleport camera eyes, such as AI eye,
      Blob Overmind eye, Advanced Camera consoles, or the Xenobiology Slime management
      console. This is particularly relevant for the Xenobiology advanced slime console,
      as the eye cannot move outside of, or while outside of, the area the console
      is in.
  - spellcheck: Fixed a typo in the Hostile Statue description.
  - code_imp: Remove a very useless check from APC code
  - bugfix: The beams from Emitters, and all hitscan weaponry, now render properly
      again.
  - bugfix: CentCom now has one APC per area.
  tralezab:
  - bugfix: Preferences menu now supports Halloween races
2021-10-11:
  Fikou:
  - bugfix: fixes unpowered space ruins actually being powered
  - expansion: more secret away mission stuff
  Ghommie:
  - bugfix: Fixed two issues with paper code. Namely paper text being always colored
      black outside of edit mode and signatures showing the current name and not the
      real name.
  - expansion: Added USB ports to light switches.
  Mothblocks:
  - rscadd: Added back the reset keybindings button.
  - bugfix: Fixed weird scaling on the buttons in a tabbed list UI (such as "Communications"
      in the keybindings menu)
  Watermelon914:
  - bugfix: Fixed a runtime with the integrated circuit duplicator
  - admin: Signal Handler circuit components are no longer limited to 1 registered
      object.
  - admin: Get variable circuit components can now get GLOB variables
  - admin: Animate and Save Shell circuit components will now apply DF_VAR_EDITED
  - bugfix: Fixes the changeling panel not working at all.
  - balance: Bluespace launchpad maximum range decreased from 60 to 40. Traitor launchpad
      unaffected.
  - balance: Bluespace launchpads will now give a visual indication of the turf they
      are teleporting to/teleporting from as well as a noise notification. Does not
      apply to traitor launchpads.
  - balance: Bluespace launchpads will now show a beam that fades out between the
      target turf and the launchpad after it has done the teleportation. Again, does
      not apply to traitor launchpads.
  esainane:
  - bugfix: The CE's blueprints can now once again show an overlay of the station's
      original structural layout! Cleaning up after an explosion is now - well, realistically,
      just as frustrating as ever, but it looks nice!
  tralezab:
  - refactor: Refactored monkey AI a bit, noticeable changes should be minimal!
  - qol: toggle random events doesn't uselessly include a message to the user, only
      to admins... which the user is.
2021-10-12:
  Ghommie:
  - bugfix: MMI components can't be no longer attached to modules. This was causing
      race conditions with other MMI components present in the circuit (not much of
      a good thing).
  Melbert:
  - rscdel: Removed the action button for toggling griffin and owl wings, you can
      still open and close them with alt-click.
  - refactor: Toggle Suit component for labcoats, suit coats, and formal coats (and
      some others)
  tralezab:
  - bugfix: Basic mobs can once again be vareditted
2021-10-13:
  Colovorat:
  - bugfix: You can no longer extract and transform DNA of species that have no DNA
  Fikou:
  - bugfix: fixes mode switch actions on storage items being broken
  Ghilker:
  - qol: lower sound level of the coils, the sound and range is calculated by a function
      based on the zap power
  Ghommie:
  - expansion: A timepiece circuit component has been added. It can output the station
      time in different time formats and units of time when triggered.
  InvalidArgument3:
  - expansion: The Yellow slimecore plasma reaction is back in the form of creating
      an EMP-proof cell.
  Melbert:
  - rscadd: 'Icebox: The Chapel, Library, and Departures Lounge (and some maintenance
      around it) have been revamped and expanded to utilize multi-z.'
  Mothblocks:
  - bugfix: Fixed a bug where bans could not be applied if the database connection
      was not immediately established, even after a re-establish.
  - server: Updated database schema to allow for null round IDs in bans and tickets.
  RandomGamer123:
  - bugfix: Contractor support units now do not get a second uplink with 20 TC in
      them.
  - bugfix: Malf AIs cannot be rolled midround if one has already been rolled roundstart.
  - bugfix: Syringe/Hypospray failure messages now reflect the proper body part.
  Wayland-Smithy:
  - bugfix: Fixed base lighting appearance inheritance.
2021-10-14:
  FA120:
  - bugfix: list literal can now contain tables,like they are supposed to
  Guillaume Prata:
  - imageadd: Engineering clothes have working reflective stripes now. Easier for
      someone to find your corpse in maints, harder for you to hide in the dark to
      do bad things.
  Melbert:
  - bugfix: You no longer see yourself in everything you double examine
  Seris02:
  - bugfix: regal rat can now eat cheese + runtime fixes for its signal
  SomethingFish:
  - expansion: Adds a BLT sandwich as a new food to the game.
  Watermelon914:
  - bugfix: Fixes filter list component not being a filter list component
2021-10-15:
  ArcaneMusic:
  - expansion: Venom swells your mob when stung.
  Coconutwarrior97:
  - bugfix: Fixes the holoparas breaking their users glasses when manifesting bug.
  - bugfix: Lavaproof borg upgrade for miner borgs now works properly.
  LemonInTheDark:
  - bugfix: Fixes openspace not working if the floor below has been changed
  MMMiracles:
  - rscadd: Tramstation's maintenance now has new catwalk tiles covering the various
      piping/wiring throughout.
  - bugfix: Tramstation's powernet should be slightly more resistant to bouts of power
      outages caused by rogue syndicate mice operatives.
  - bugfix: Patched up a few missed spots involving pipe/wiring for departments like
      Botany/Courtroom.
  Maurukas:
  - balance: The super matter crystal can no longer be immediately delaminated by
      firing a gun into it, only brought close to the delamination threshold.
  Melbert:
  - rscadd: 'Icebox: Science RND and Genetics remap!'
  RandomGamer123:
  - bugfix: Leftover plasma tanks formerly intended for radiation collectors have
      been removed.
  Ryll/Shaps:
  - rscadd: Added new quirk, "Shifty Eyes", which rarely causes people who examine
      you while standing closeby to think that you both made eye contact, even when
      you didn't.
  - balance: The time window for making eye contact with someone else has been extended
      from  examining each other within 1 second to within 2 seconds.
  - spellcheck: Fixed incorrect "the"'s being inserted before the names of improper
      nouns in item stripping code.
  SuperNovaa41:
  - spellcheck: No more phantom hand grabbing.
  - bugfix: Pipes now properly fulfill your nicotine cravings.
  Zytolg:
  - bugfix: The Nanotrasen Materials Reclamation Program has recycled the spare firelock
      trapped in the Cargo Offices east windows.
2021-10-16:
  Gandalf2k15:
  - qol: Added the dyekit functions to the character preferences menu.
  Ghommie:
  - bugfix: Fixed monkeys having the wrong on fire overlay when ablaze.
  Seris02:
  - bugfix: quantum pads and other things with fault do_teleport calls no longer cause
      runtimes
  - code_imp: removes color_legacy prefs and changes sanitize_hexcolor()'s default
      to 6 characters
  thatoneplebeian:
  - refactor: refactored drowsiness code
2021-10-17:
  ATHATH:
  - bugfix: The "don't allow any organics to escape on the emergency shuttle alive"
      objective no longer counts inorganic species like golems, plasmamen, androids,
      etc.
  - qol: Some malf AI objectives have had their descriptions updated to reflect them
      only caring about player-controlled creatures.
  Ghommie:
  - bugfix: Fixes the mind name of aliens not being updated when evolving (for real
      this time)
  - expansion: Added a trigonometry circuit component.
  - bugfix: Pets no longer enjoy being shoved around.
  Guillaume Prata:
  - imageadd: Fire extinguishers now have a worn sprite when they are stored on your
      Firesuit.
  - imageadd: Atmos Optical glasses have a new icon for it's connectable mode.
  - balance: Atmospheric Technicians will have external airlock access by default
      now instead of only on skeleton crew.
  Horatio22 borrowed Iamgoofball and Surrealaser , spriter d4n0w4r:
  - imageadd: added 2 new outfits to the detective autodrobe
  IndieanaJones:
  - bugfix: Monkeys can now open worn backpacks by clicking on them.
  - bugfix: Players with the monkified mutation now have a generic monkey name as
      opposed to their actual name again.
  JohnFulpWillard:
  - bugfix: Secways will now say it's broken, rather than it's component.
  Krysonism:
  - balance: Growing vats can now be set to regrow the sample upon completion.
  - balance: Increased the volume of growing vats from 200 to 300u.
  LemonInTheDark:
  - bugfix: Non wallsocket lights will be properly colored again. Whoops
  Melbert:
  - bugfix: Icebox chapel morgue slabs are now all the right direction
  Mickyan:
  - qol: While holding a spraycan you may right click on existing graffiti or colored
      objects to set the spraycan to match that color
  PositiveEntropy, EricZilla:
  - imageadd: Resprites pinpointers!
  RandomGamer123:
  - bugfix: Admins who aghost won't be dragged back to their body when someone attempts
      to defib them.
  Sealed101:
  - bugfix: fixes combat hypospray locking itself out from 10u transfers to 5u when
      used in-hand
  SpaceDragon00:
  - bugfix: Organs will now consistently "Fail" once they have reached max damage
  YakumoChen:
  - spellcheck: Gives shaft miner a more accurate job description
  esainane:
  - refactor: Radiation Collectors, Tesla Coils, and Grounding Rods are now subtypes
      of a common energy_accumulator type. This centralizes logic for smoothing energy
      release; converting between Joules, Watts, and internal energy units; and ensures
      that all such accumulators display and generate power along the same smoothing
      curve.
  - bugfix: Tesla Coils no longer generate power using half the smoothing that Radiation
      Collectors used. This was due to a mistake in handling delta_time.
  - code_imp: Removed many magic numbers from power generation code.
  - qol: Tesla Coils will now display energy stored in Joules and power being produced
      in Watts, much like Radiation Collectors did.
  - qol: Grounding Rods will now display recent energy they've absorbed and the sustainable
      power that this energy could be producing. It should now be very obvious if
      you could use more Tesla Coils.
  - bugfix: Fixed supermatter lightning bolt target selection. Previously, two grounding
      rods were always* safe. Now, one grounding rod is always* safe.
  - qol: Roller Beds now come with an examine hint for how to roll them up.
  lovegreenstuff:
  - bugfix: probital now works properly on ingest. you now get mitogen again
  magatsuchi:
  - rscadd: added ability to change hologram appearance to custom character
  tralezab:
  - rscadd: Titlescreens are now widescreen'd up.
  - qol: The titlescreen is no longer described as "Effectively impervious to conventional
      methods of destruction." and only the splash screen can be interacted with
  - bugfix: you can no longer exploit the pink crossbreeding power to strip factions
      from mobs
2021-10-18:
  Ghommie:
  - bugfix: Fixed the join/ready buttons not reverting if the game fails to setup.
  Pickle-Coding:
  - admin: Assembly bomb creation is now logged in Kelvin.
  RandomGamer123:
  - spellcheck: Fixed capitalisation errors in hypernoblium crystal usage messages.
  Sealed101:
  - bugfix: fixed abductor and advanced tools' recycling results being heavily diminished
      or taken from their basic counterparts
  SuperNovaa41:
  - balance: The Goon Source code item is now invulnerable to deletion (aside from
      ninja intervention), similar to every other high risk item.
  esainane:
  - rscadd: When all else fails, dusting a Clown can alter the Supermatter's containment
      field. It might make the situation better. It might not. Who knows, HONK
  magatsuchi:
  - spellcheck: fixed a single bracket typo
  tralezab:
  - bugfix: fixes an error in department officers spawning with wallets
2021-10-19:
  Cyberboss:
  - bugfix: Prying open one of a pair of cycle-linked airlocks will now always close
      the other (if it is powered).
  - expansion: 'Arrivals, escape, and pod airlocks now restrict those without access
      from exiting directly to space. Use is unrestricted when entering the station
      or a shuttle is docked. tweak: Shuttle departures will now force exterior airlocks
      closed on both the shuttle and docking bay. The lives of your fellow crew members
      are more important than your tardiness and limbs, employee!'
  - bugfix: Fixed the numbering of escape pods in certain maps.
  Ebin-Halcyon:
  - balance: Syndicate masks are now fire + acid proof
  Ghilker:
  - qol: filters can now filter multiple gases at once
  Ghommie:
  - expansion: Meta and Delta chapels now have pews in lieu of stools or chairs.
  MeyHaZah, Onule, Fikou:
  - imageadd: mining gear resprite
  Mothblocks:
  - rscadd: Emagging the communications console will now let you purchase dangerous
      shuttles. The Gigafactral and the Monastery were moved over (and made cheaper),
      while the Disco Inferno and Oh, Hi Daniel make a return.
  Ryll/Shaps:
  - admin: As an admin, if you start replying to a freshly submitted ticket that another
      admin is already replying to, you'll get a notice that someone already has it
      open when you get the prompt. Nice to let you know someone else is handling
      it, so you can coordinate replies better!
  That REALLY Good Soda Flavor:
  - refactor: Rolling paper will now use the customizable reagent holder component.
      This cleans up the code and expands the possibilities for using the component
      by adding support for dried items.
  esainane:
  - bugfix: Removed a scrubbers pipe that didn't lead anywhere near Upper Hydroponics
      on Tram.
2021-10-20:
  Ghommie:
  - bugfix: Fixed maintenance drones being unable to examinate things they currently
      can't interact with throgh shift-click.
  - bugfix: Fixed clown car drivers being unable to examinate things or interacting
      with their inventory while the car is in cannon mode.
  - bugfix: Fixed honorbound people being unable to pull, examinate and alt-click
      other living mobs while holding an item that could be used as a melee weapon.
  - bugfix: Fixed mechas firing their weapons or using their tools when the pilot
      is examinating things through shift-click.
  Mickyan:
  - expansion: Nearsighter quirk now lets you pick the look of your prescription glasses
      from the character preference menu
  - imageadd: Added thin prescription glasses
2021-10-21:
  ATHATH:
  - bugfix: Butter bears can now attack objects, as they were intended to.
  - bugfix: Fugu glanded butter bears can now break down walls, matching the behavior
      of other fugu glanded mobs.
  - bugfix: Butter bears can now deal damage with their attacks if their melee damage
      variables (which are zero by default) become nonzero.
  - bugfix: Butter bear attacks are now considered to be blunt instead of sharp for
      the purposes of wounds.
  Coconutwarrior97:
  - rscadd: Adds a hydroponics airlock type, and replaces old medical hydroponics
      doors with the newer airlock type.
  - bugfix: Fixes an issue where people with the doctor phobia were afraid of hydroponics
      doors.
  Ghommie:
  - balance: Moved Pun Pun away from the kitchen on Delta. It's now behind the bar
      counter.
  JohnFulpWillard:
  - bugfix: da vim can now be entered again.
  MMMiracles:
  - rscadd: Added new pair of glasses that can be found within the trash piles of
      maintenance.
  - bugfix: Pacifists can now fire the circuit gun.
  MentalCow:
  - bugfix: Security Plasmamen spawn with their suit sensors set to Maximum
  PositiveEntropy, AdipemDragon:
  - imageadd: Botany tools have been resprited!
  Sealed101:
  - bugfix: The internal radio implant from Icebox departures has been returned to
      it's owner's internal organs. A normal handheld radio has been left in its place.
  - bugfix: The american sausage has become edible AND roast-stick-friendly!
  - bugfix: Fixes advanced roasting stick griddling itself when used on a bonfire
      with a rod griddle built over it instead of using the bonfire to roast the sausage.
  Timberpoes:
  - bugfix: Fixed an issue where the unbanning panel would give inaccurate information
      about the ban in the unban confirmation prompts.
  - bugfix: Fixed an issue where clicking the X to close out the confirmation popup
      on the unbanning panel acted as if you'd pressed Yes.
  - admin: Added a reban button to the unbanning panel. This allows an admin to quickly
      and easily re-apply a ban they've removed and replaces the unban button when
      a ban has been removed. As a result, accidentally removing the wrong ban no
      longer requires the admin to place a second brand new ban on top of the old
      one.
  - admin: Editing the IP, ckey or CID of a server ban will now kick any players matching
      the edited ban's new details.
  Zytolg:
  - bugfix: Tramstation is now free from oddly decaled walls.
  - bugfix: The Lavaland Syndicate Base is now Powered again.
  - code_imp: repathed /unpowered Syndicate Base areas to /powered
  esainane:
  - bugfix: Gas Filters will now always attempt to move gas, as long as at least one
      output has space available. Any gas not able to be moved to its destination
      is returned to the input as if it was never removed. Previously, only gases
      for the main output port would continue to move when the other output port was
      full.
  - bugfix: Gas Filters again no longer leaves empty entries for gases that were filtered
      in the main output.
  - bugfix: Gas Filters again no longer outright destroys gas when no filters (or
      a bad filter, somehow) are set. Instead, it will go through to the main output,
      as before, or if the main output is full, be returned back to the input, as
      if never removed.
2021-10-22:
  Ghommie:
  - bugfix: Fixed the contents of certain coded or mapped closets exceeding their
      storage capacity, like the HoS closet on Delta, which had redundant grey HoS
      jumpsuit, trenchcoat and beret, or the mixed wardrobe closet with its duplicate
      bandanas, jacket and green jumpsuits,
  - bugfix: fixed implant abilities not being properly removed when the implant is
      removed.
  IndieanaJones:
  - expansion: Player monkeys make a screeching noise when using the *screech emote.
  JohnFulpWillard:
  - bugfix: Changelings that re-adapt with pheremone receptors on, will have them
      forcefully removed.
  Seris02:
  - rscadd: makes it so lockers/crates can have access electronics removed/inserted
  Y0SH1M4S73R:
  - bugfix: The proc call, set var, and spawn atom circuit components will properly
      resolve any weakrefs passed to them through their list ports.
  - admin: The signal handler circuit component has two new presets, item_pre_attack_secondary
      and item_afterattack_secondary.
  - bugfix: Backup human names are once again respected when forcibly humanizing what
      would otherwise be a non-human head of staff.
  - admin: Added a "suppress_message_admins" variable to SDQL spells, which prevents
      the spell's query from getting output to all admins' chat panels. The query
      will still be written to the game log.
  - bugfix: The SDQL spell parse error modal grows properly.
  esainane:
  - bugfix: The Orion Trail's instructions screen is usable again.
  tralezab:
  - bugfix: 480x480 titlescreens now load up centered as intended from the widescreen
      title changes
2021-10-23:
  Guillaume Prata:
  - qol: CMOs will now spawn with blue shoes (Paramedic) that protect them from contracting
      diseases from any blood pool they step in, just like everyone else at medbay
      already does.
  Mickyan:
  - qol: Art supplies are now also available in the library vendor in case the art
      storage room is not present on station
  Mooshimi:
  - qol: 'Maintenance drone spawners have returned to robotics maintenance removed:
      maint drone is gone from the mechfab and research tree'
  Sealed101:
  - bugfix: fixes mining drills showing as pickaxes when worn or held in-hand
  Seris02:
  - bugfix: borgs will no longer leave MMIs while cryoing
2021-10-24:
  Coconutwarrior97:
  - bugfix: Fixes some hydro airlocks having null in their req_access.
  Ghommie:
  - expansion: Added binary and decimal conversion components.
  Guillaume Prata:
  - bugfix: Space Heaters won't change temperature without draining it's cell charge
      anymore.
  JohnFulpWillard:
  - qol: Roulette Wheels now say their actions, rather than have it magically appear
      in the chat box of everyone nearby.
  Mooshimi:
  - balance: cattleprods can no longer be held in suit storage slots
  esainane:
  - bugfix: Members of the Science department can no longer get given the objective
      to steal their own server's source code.
2021-10-25:
  ArcaneMusic:
  - bugfix: Regular/Advanced mops are now in the same categories of the auto/protolathe.
  Coconutwarrior97:
  - bugfix: Fixes pacifists wielding mjollnir being able to shock people.
  JohnFulpWillard:
  - qol: Bounty consoles will now talk to the user if they have to wait for a new
      bounty or is using an incorrect ID, rather than telepathically transmit messages.
  PositiveEntropy:
  - imageadd: Resprites the defibrillator!
  Sealed101:
  - bugfix: fixes bomb implants blowing you up anyway when closing the window instead
      of pressing the "No" option
  - bugfix: fixes bomb implants blowing you up when clicking the action button while
      the confirmation popup is still up
  Watermelon914:
  - balance: Makes wizard a high impact ruleset.
  esainane:
  - bugfix: The SM air alarm on MetaStation and TramStation once again starts unlocked,
      and can also be locked and unlocked by Engineers instead of just Atmospherics
      Technicians. This matches the setup on Delta, IceBox, and Kilo.
  jlsnow301:
  - spellcheck: Offering items to other players now has punctuation
  tralezab:
  - rscadd: Added a rare skillchip to maint.
2021-10-26:
  ArcaneMusic:
  - rscadd: A new frosted over building has been unearthed in the wastes of icebox.
  Fikou:
  - rscdel: the captain can no longer unlock his display case on delta without breaking
      it
  MMMiracles:
  - rscadd: Tramstation now has stocked the various departments with either a basic
      break room or basic starter food to give a growing crew what they need to stay
      healthy.
  - rscadd: Some extra public-access vendors for junkfood and cigarettes have been
      added to the public halls of Tramstation.
  - rscadd: Security now has an evidence room to store confiscated things.
  Melbert:
  - bugfix: Some special plant reagent genes now show up on the plant analyzer properly
      again
  Mothblocks:
  - bugfix: Backup human names will now properly only apply when you are a nonhuman
      head of staff, rather than any head of staff.
  Seris02:
  - bugfix: fixes a slight issue with the hair color not being visible on ghosts after
      the legacy color removal
  Watermelon914:
  - bugfix: BCIs no longer runtime when they're created at mapload.
  - admin: Players now see any notes they may have gotten whilst disconnected when
      they join the server for the next time
  Zytolg:
  - expansion: Sofas now include the Bench Type. These are buildable with 2 metal
      plates from the crafting menu.
  - expansion: Beds can now be rotated (flipped), and include the Double Bed Type.
      Miners can also make Double Pod Beds to really feel like an Alaskan King.
  - expansion: Bedsheets to match! Try to share those big blankets with a lizard if
      you see that they're shivering!
  - code_imp: 'Stuff that lets you interact with the benches and beds in-game, so
      that you too can enjoy being a king. sprites: Ports the Benches and Double Bed
      sprites from Skyrat sprites: Flipped Beds'
  esainane:
  - code_imp: LabeledList.Item now supports arbitrary nodes as labels. String labels
      still work as previously.
  - code_imp: RoundGauge now supports an alertBefore property, for when warnings need
      to happen below a threshold. This can combine sensibly to form ranges with alertAfter.
  - refactor: The HFR interface has been heavily rewritten and restructured, fixing
      many edge cases where data was empty, unset, or took extreme values. Major parts
      now have their own file. The structure of gas lists is now consistent. Static
      data is used for more values. Much presentation layer logic has been moved to
      tgui instead of dm. Some processing that should never have happened, in tgui
      or anywhere else, is now gone forever.
  - qol: The HFR UI now displays the recipe specific gases that each fuel will create
      in a large table inside an expandable area. This can be collapsed when not needed.
  - qol: The HFR UI now uses a minimum mass for the scale of its gas lists. This should
      provide a visual cue for when a gas mix is running out, or needs more fuel to
      start.
  - qol: The HFR UI now graphs its various gas mixtures on a unified logarithmic scale,
      and tells you how fast the temperatures are changing in real units after all
      effects.
  - qol: The HFR UI now displays reactor status through gauges, with scales set to
      indicate typical ranges involved, and warnings to indicate when something is
      going wrong.
  - qol: The HFR UI now directly displays reaction instability, reaction activity,
      and the cell charge of the local APC. Reaction activity is the amount of heat
      output relative to what is permitted by the heat output limiter. This is effectively
      making explicit the result of a calculation you would otherwise need to do anyway,
      and makes it easier to notice when a reaction has stalled. qol; The HFR UI will
      now helpfully inform you in discerning red text if you have no recipe set, or
      if any one of the gas mixtures is empty. This should be particularly helpful
      for noticing when you didn't add any coolant. Please involve coolant when operating
      a nuclear reactor.
  - qol: The HFR UI now always lists Plasma, BZ, and Proto-Nitrate in the moderator
      gas list, and provides tooltips explaining their usage and purpose.
  - qol: The HFR UI now has many other tooltips, from explaining the function and
      purpose of the various reactor controls, to the fringe effects of uncommon moderator
      gases.
  - code_imp: heat_output_bool is gone forever yes this deserves its own changelog
      entry
  - bugfix: The RD's office in IceBox once again contains an AI Core circuit.
  - bugfix: Many escape pods are no longer missing cycling airlock systems.
  - bugfix: Air should no longer magically not pass certain areas.
  jlsnow301:
  - rscadd: Cargo's Delivery Tagger now uses TGUI
  malton33:
  - rscdel: Removes the book "Singularity and Tesla for Dummies"
2021-10-27:
  Capsandi:
  - expansion: Ethereals have their own lungs which electrolyze water vapor now
  - bugfix: Ethereals will no longer take burn damage from breathing air which they
      can stand in safely with internals
  Likteer:
  - rscadd: Added facial hair to Ethereal customisation.
  Melbert:
  - code_imp: auto-grow for hydroponics trays now use a setter
  NamelessFairy:
  - qol: Word filters now support soft filtering, allowing players to say a word only
      after they confirm wanting to say it after a warning.
  - bugfix: Deadchat is now effected by OOC word filters
  - bugfix: A reason for a word being filtered will now be displayed nomatter what
      case the word is in
  - config: Adds new config options for soft filters
  - admin: Admins will get notifications when a soft filtered word is said
  Sealed101:
  - expansion: Spooky headless corgi spirits have been sighted across the Sector!
  - bugfix: fixes hats glued to corgis' heads when dressing corgis up
  Timberpoes:
  - admin: The terrible code ocelot haunting the editing ban panel has been banished.
      Editing bans now actually works again.
  - qol: Station Engineer trimmed ID cards can now be given Atmospherics access without
      needing to be Silver.
  - qol: Geneticist and Roboticist trimmed ID cards can now be given Ordnance (Toxins)
      accesses without needing to be Silver.
  - qol: Detective and Sec Officer trimmed ID cards can now be given Armory access
      without needing to be Silver.
  Watermelon914:
  - bugfix: Fixes notes and bans being shown to players on connect when the note or
      ban doesn't belong to them.
  Y0SH1M4S73R:
  - bugfix: DNA unique identity and unique feature strings once again generate correctly,
      which also means they work correctly again.
  axietheaxolotl:
  - imageadd: recoloured the CC commander envirosuit
  esainane:
  - bugfix: You can no longer use the *collapse emote to cheat your way out of stamcrit.
  - bugfix: Directional firelocks are now transparent, consistent with full-tile firelocks.
      This avoids some very strange behavior where you could see through a directional
      firelock when you were on the same tile.
  - bugfix: Assemblies attached over a wire will now always pulse the wire on activation,
      even if the wire is cut. You can create voice or signal activated airlocks again!
  - bugfix: Objects which use custom materials and break above 0 integrity no longer
      spawn broken.
  - code_imp: Made a comment which warned against breaking this sort of thing more
      explicit.
  - bugfix: Bits of space near the station are no longer randomly powered by unconnected
      areas. Outlet Injectors used for sending gas to space have been replaced with
      Passive Vents.
  - bugfix: The waste air from Virology on Tramstation will now be removed. Previously,
      the turf that the outlet injector was on was unpowered.
  - bugfix: Reinforced walls will now properly re-smooth when nearby reinforced walls
      are created or destroyed.
2021-10-28:
  Cyberboss:
  - bugfix: Emergency inlet access on the mining station eastern-most airlocks has
      been removed.
  - bugfix: Fixed mining station east airlocks requiring external airlock access instead
      of mining access.
  - bugfix: Removed access requirements from southern mining station public external
      airlocks.
  Guillaume Prata:
  - expansion: Atmospherics Technicians can receive some useful things from their
      mail now.
  LemonInTheDark:
  - bugfix: emagging ethereals works again
  Seris02:
  - bugfix: orion can now no longer give you multiple prizes
  - qol: personal lockers will now allow you to actually un/lock them without swiping
      ID
  Watermelon914:
  - balance: If you try using the staff of change, the staff of chaos or the staff
      of healing as a crewmember, then it'll backfire. The Staff of change wabbajacks
      the user, like the pool of change; this means you can't become a xenomorph or
      a syndicate borg. The Staff of chaos has a 5% chance of firing the bolt directly
      at the user using it. The Staff of healing now behaves like a medibeam gun to
      non-wizards trying to use it.
  carshalash:
  - bugfix: Squirt cider now requires salt. Tomato soup no longer becomes squirt cider
  esainane:
  - bugfix: A roundstart Mannitol pill should no longer cause overdose on its own.
  optimumtact:
  - rscadd: Bans are now more user friendly


code:
################################
# Example Changelog File
#
# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
#
# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
# When it is, any changes listed below will disappear.
#
# Valid Prefixes:
#   bugfix
#     - (fixes bugs)
#   wip
#     - (work in progress)
#   qol
#     - (quality of life)
#   soundadd
#     - (adds a sound)
#   sounddel
#     - (removes a sound)
#   rscadd
#     - (adds a feature)
#   rscdel
#     - (removes a feature)
#   imageadd
#     - (adds an image or sprite)
#   imagedel
#     - (removes an image or sprite)
#   spellcheck
#     - (fixes spelling or grammar)
#   experiment
#     - (experimental change)
#   balance
#     - (balance changes)
#   code_imp
#     - (misc internal code change)
#   refactor
#     - (refactors code)
#   config
#     - (makes a change to the config files)
#   admin
#     - (makes changes to administrator tools)
#   server
#     - (miscellaneous changes to server)
#################################

# Your name.
author: "

# Optional: Remove this file after generating master changelog.  Useful for PR changelogs that won't get used again.
delete-after: True

# Any changes you've made.  See valid prefix list above.
# INDENT WITH TWO SPACES.  NOT TABS.  SPACES.
# SCREW THIS UP AND IT WON'T WORK.
# Also, this gets changed to [] after reading.  Just remove the brackets when you add new shit.
# Please surround your changes in  double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
changes:
  - rscadd: "Added a changelog editing system that should cause fewer conflicts and more accurate timestamps."
  - rscdel: "Killed innocent kittens."

repo_name: AnalWerewolf/sundown

license: mit


code:
  <title>Create Object</title>

	<form name="spawner" action="byond://?src=/* ref src */" method="get">
		<input type="hidden" name="src" value="/* ref src */">
		/* hreftokenfield */

		Type <input type="text" name="filter" value="" style="width:280px;height:25"> <input type = "submit" value = "Search" onclick = "updateSearch()" />

		Offset: <input type="text" name="offset" value="x,y,z" style="width:250px">

		A <input type="radio" name="offset_type" value="absolute">
		R <input type="radio" name="offset_type" value="relative" checked="checked">

		Number: <input type="text" name="object_count" value="1" style="width:30px">
		Dir: <input type="text" name="object_dir" value="" style="width:30px">
		Name: <input type="text" name="object_name" value="" style="width:180px">

		Where:
			<select name='object_where' style="width:320px">
				<option value='onfloor'>On floor below own mob</option>
				<option value='frompod'>On floor below own mob, dropped via supply pod</option>
				<option value='inhand'>In own mob's hand</option>
				<option value='inmarked'>In marked object</option>
			</select>

		<input type="submit" value="spawn">
		<select name="object_list" id="object_list" size="18" multiple style="width:98%"></select>

	</form>


code:
Due to the fact browse_rsc can't create subdirectories, every time you update font-awesome you'll need to change relative webfont references in all.min.css
eg ../webfonts/fa-regular-400.ttf => fa-regular-400.ttf (or whatever you call it in asset datum)

Second change is ripping out file types other than woff and eot(ie8) from the css

Finally, removing brand related css.


code:
<!DOCTYPE html>

<title>Stat Browser</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Cache-Control" content="max-age=15; must-revalidate" />
<link id="goonStyle" rel="stylesheet" type="text/css" href="browserOutput_white.css" media="all" />


code:
# Runtime Loaded Icons

These icons are not compiled into the .rsc or are otherwise loaded at runtime.

Please keep all (non-config) icons that do this in this folder as it is needed by the [deploy.sh](../../tools/deploy.sh) script to minimize build output.


code:
//Please use mob or src (not usr) in these procs. This way they can be called in the same fashion as procs.
/client/verb/wiki(query as text)
	set name = "wiki"
	set desc = "Type what you want to know about.  This will open the wiki in your web browser. Type nothing to go to the main page."
	set hidden = TRUE
	var/wikiurl = CONFIG_GET(string/wikiurl)
	if(wikiurl)
		if(query)
			var/output = wikiurl + "/index.php?title=Special%3ASearch&profile=default&search=" + query
			src << link(output)
		else if (query != null)
			src << link(wikiurl)
	else
		to_chat(src, span_danger("The wiki URL is not set in the server configuration."))
	return

/client/verb/forum()
	set name = "forum"
	set desc = "Visit the forum."
	set hidden = TRUE
	var/forumurl = CONFIG_GET(string/forumurl)
	if(forumurl)
		if(tgui_alert(src, "This will open the forum in your browser. Are you sure?",, list("Yes","No"))!="Yes")
			return
		src << link(forumurl)
	else
		to_chat(src, span_danger("The forum URL is not set in the server configuration."))
	return

/client/verb/rules()
	set name = "rules"
	set desc = "Show Server Rules."
	set hidden = TRUE
	var/rulesurl = CONFIG_GET(string/rulesurl)
	if(rulesurl)
		if(tgui_alert(src, "This will open the rules in your browser. Are you sure?",, list("Yes","No"))!="Yes")
			return
		src << link(rulesurl)
	else
		to_chat(src, span_danger("The rules URL is not set in the server configuration."))
	return

/client/verb/github()
	set name = "github"
	set desc = "Visit Github"
	set hidden = TRUE
	var/githuburl = CONFIG_GET(string/githuburl)
	if(githuburl)
		if(tgui_alert(src, "This will open the Github repository in your browser. Are you sure?",, list("Yes","No"))!="Yes")
			return
		src << link(githuburl)
	else
		to_chat(src, span_danger("The Github URL is not set in the server configuration."))
	return

/client/verb/reportissue()
	set name = "report-issue"
	set desc = "Report an issue"
	set hidden = TRUE
	var/githuburl = CONFIG_GET(string/githuburl)
	if(githuburl)
		var/message = "This will open the Github issue reporter in your browser. Are you sure?"
		if(GLOB.revdata.testmerge.len)
			message += "
The following experimental changes are active and are probably the cause of any new or sudden issues you may experience. If possible, please try to find a specific thread for your issue instead of posting to the general issue tracker:
"
			message += GLOB.revdata.GetTestMergeInfo(FALSE)
		// We still use tgalert here because some people were concerned that if someone wanted to report that tgui wasn't working
		// then the report issue button being tgui-based would be problematic.
		if(tgalert(src, message, "Report Issue","Yes","No")!="Yes")
			return

		// Keep a static version of the template to avoid reading file
		var/static/issue_template = file2text(".github/ISSUE_TEMPLATE/bug_report.md")

		// Get a local copy of the template for modification
		var/local_template = issue_template

		// Remove comment header
		var/content_start = findtext(local_template, "<")
		if(content_start)
			local_template = copytext(local_template, content_start)

		// Insert round
		if(GLOB.round_id)
			local_template = replacetext(local_template, "## Round ID:\n", "## Round ID:\n[GLOB.round_id]")

		// Insert testmerges
		if(GLOB.revdata.testmerge.len)
			var/list/all_tms = list()
			for(var/entry in GLOB.revdata.testmerge)
				var/datum/tgs_revision_information/test_merge/tm = entry
				all_tms += "- \[[tm.title]\]([githuburl]/pull/[tm.number])"
			var/all_tms_joined = all_tms.Join("\n") // for some reason this can't go in the []
			local_template = replacetext(local_template, "## Testmerges:\n", "## Testmerges:\n[all_tms_joined]")

		var/url_params = "Reporting client version: [byond_version].[byond_build]\n\n[local_template]"
		DIRECT_OUTPUT(src, link("[githuburl]/issues/new?body=[url_encode(url_params)]"))
	else
		to_chat(src, span_danger("The Github URL is not set in the server configuration."))
	return

/client/verb/changelog()
	set name = "Changelog"
	set category = "OOC"
	if(!GLOB.changelog_tgui)
		GLOB.changelog_tgui = new /datum/changelog()

	GLOB.changelog_tgui.ui_interact(mob)
	if(prefs.lastchangelog != GLOB.changelog_hash)
		prefs.lastchangelog = GLOB.changelog_hash
		prefs.save_preferences()
		winset(src, "infowindow.changelog", "font-style=;")


code:
/*
/datum/verbs/menu/Example/verb/Example()
	set name = "" //if this starts with @ the verb is not created and name becomes the command to invoke.
	set desc = "" //desc is the text given to this entry in the menu
	//You can not use src in these verbs. It will be the menu at compile time, but the client at runtime.
*/

GLOBAL_LIST_EMPTY(menulist)

/datum/verbs/menu
	var/default //default checked type.
	//Set to true to append our children to our parent,
	//Rather then add us as a node (used for having more then one checkgroups in the same menu)

/datum/verbs/menu/GetList()
	return GLOB.menulist

/datum/verbs/menu/HandleVerb(list/entry, verbpath, client/C)
	return list2params(entry)


code:
macro "default"

menu "menu"
	elem
		name = "&File"
		command = ""
		saved-params = "is-checked"
	elem
		name = "&Quick screenshot\tF2"
		command = ".screenshot auto"
		category = "&File"
		saved-params = "is-checked"
	elem
		name = "&Save screenshot as...\tShift+F2"
		command = ".screenshot"
		category = "&File"
		saved-params = "is-checked"
	elem
		name = ""
		command = ""
		category = "&File"
		saved-params = "is-checked"
	elem "reconnectbutton"
		name = "&Reconnect"
		command = ".reconnect"
		category = "&File"
		saved-params = "is-checked"
	elem
		name = "&Quit\tAlt-F4"
		command = ".quit"
		category = "&File"
		saved-params = "is-checked"
	elem
		name = "&Help"
		command = ""
		saved-params = "is-checked"
	elem
		name = "&Admin Help\tF1"
		command = "adminhelp"
		category = "&Help"
		saved-params = "is-checked"
	elem
		name = "&Hotkeys"
		command = "hotkeys-help"
		category = "&Help"
		saved-params = "is-checked"

window "mainwindow"
	elem "mainwindow"
		type = MAIN
		pos = 281,0
		size = 640x440
		anchor1 = -1,-1
		anchor2 = -1,-1
		is-default = true
		saved-params = "pos;size;is-minimized;is-maximized"
		statusbar = false
		icon = 'icons\\ss_32.png'
		macro = "default"
		menu = "menu"
	elem "split"
		type = CHILD
		pos = 3,0
		size = 634x440
		anchor1 = 0,0
		anchor2 = 100,100
		saved-params = "splitter"
		left = "mapwindow"
		right = "infowindow"
		is-vert = true
	elem "asset_cache_browser"
		type = BROWSER
		pos = 0,0
		size = 200x200
		anchor1 = -1,-1
		anchor2 = -1,-1
		is-visible = false
		saved-params = ""
	elem "tooltip"
		type = BROWSER
		pos = 0,0
		size = 999x999
		anchor1 = -1,-1
		anchor2 = -1,-1
		is-visible = false
		saved-params = ""

window "mapwindow"
	elem "mapwindow"
		type = MAIN
		pos = 281,0
		size = 640x480
		anchor1 = -1,-1
		anchor2 = -1,-1
		saved-params = "pos;size;is-minimized;is-maximized"
		is-pane = true
	elem "map"
		type = MAP
		pos = 0,0
		size = 640x480
		anchor1 = 0,0
		anchor2 = 100,100
		font-family = "Arial"
		font-size = 7
		is-default = true
		saved-params = "zoom;letterbox;zoom-mode"
		style = ".center { text-align: center; } .maptext { font-family: 'Small Fonts'; font-size: 7px; -dm-text-outline: 1px black; color: white; line-height: 1.1; } .command_headset { font-weight: bold;\tfont-size: 8px; } .small { font-size: 6px; } .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: 6px; }"
	elem "lobbybrowser"
		type = BROWSER
		pos = 0,0
		size = 640x480
		anchor1 = 0,0
		anchor2 = 100,100
		background-color = none
		is-visible = false
		is-disabled = true
		saved-params = ""
		auto-format = false
	elem "lobby_preview_map"
		type = MAP
		pos = 520,0
		size = 120x480
		anchor1 = 75,0
		anchor2 = 100,100
		right-click = true
		saved-params = "zoom;letterbox;zoom-mode"
		is-visible = false
		is-disabled = true
	elem "status_bar"
		type = LABEL
		pos = 0,464
		size = 280x16
		anchor1 = 0,100
		is-visible = false
		text = ""
		align = left
		background-color = #222222
		text-color = #ffffff
		border = line

window "infowindow"
	elem "infowindow"
		type = MAIN
		pos = 281,0
		size = 640x480
		anchor1 = -1,-1
		anchor2 = -1,-1
		saved-params = "pos;size;is-minimized;is-maximized"
		is-pane = true
	elem "info"
		type = CHILD
		pos = 0,30
		size = 640x445
		anchor1 = 0,0
		anchor2 = 100,100
		saved-params = "splitter"
		left = "statwindow"
		right = "outputwindow"
		is-vert = false
	elem "discord"
		type = BUTTON
		pos = 16,5
		size = 300x20
		anchor1 = 3,0
		anchor2 = 50,0
		saved-params = "is-checked"
		text = "Discord"
		command = "discord"
	elem "codebase"
		type = BUTTON
		pos = 316,5
		size = 300x20
		anchor1 = 50,0
		anchor2 = 97,0
		saved-params = "is-checked"
		text = "Codebase"
		command = "repository"

window "outputwindow"
	elem "outputwindow"
		type = MAIN
		pos = 281,0
		size = 640x480
		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 "input"
		type = INPUT
		pos = 2,460
		size = 517x20
		anchor1 = 0,100
		anchor2 = 100,100
		background-color = #d3b5b5
		is-default = true
		border = sunken
		saved-params = "command"
	elem "oocbutton"
		type = BUTTON
		pos = 599,460
		size = 40x19
		anchor1 = 100,100
		anchor2 = -1,-1
		background-color = none
		border = line
		saved-params = "is-checked"
		text = "OOC"
		command = ".winset \"oocbutton.is-checked=true ? input.command=\"!ooc \\\"\" : input.command=\"\"oocbutton.is-checked=true ? mebutton.is-checked=false\"\"oocbutton.is-checked=true ? saybutton.is-checked=false\""
		is-flat = true
		button-type = pushbox
	elem "saybutton"
		type = BUTTON
		pos = 519,460
		size = 40x19
		anchor1 = 100,100
		anchor2 = -1,-1
		background-color = none
		border = line
		saved-params = "is-checked"
		text = "Say"
		command = ".winset \"saybutton.is-checked=true ? input.command=\"!say \\\"\" : input.command=\"\"saybutton.is-checked=true ? mebutton.is-checked=false\"\"saybutton.is-checked=true ? oocbutton.is-checked=false\""
		is-flat = true
		button-type = pushbox
	elem "mebutton"
		type = BUTTON
		pos = 559,460
		size = 40x19
		anchor1 = 100,100
		anchor2 = -1,-1
		background-color = none
		border = line
		saved-params = "is-checked"
		text = "Me"
		command = ".winset \"mebutton.is-checked=true ? input.command=\"!me \\\"\" : input.command=\"\"mebutton.is-checked=true ? saybutton.is-checked=false\"\"mebutton.is-checked=true ? oocbutton.is-checked=false\""
		is-flat = true
		button-type = pushbox
	elem "browseroutput"
		type = BROWSER
		pos = 0,0
		size = 640x456
		anchor1 = 0,0
		anchor2 = 100,100
		background-color = #ffffff
		is-visible = false
		is-disabled = true
		saved-params = ""
	elem "output"
		type = OUTPUT
		pos = 0,0
		size = 640x456
		anchor1 = 0,0
		anchor2 = 100,100
		is-default = true
		saved-params = ""

window "popupwindow"
	elem "popupwindow"
		type = MAIN
		pos = 281,0
		size = 120x120
		anchor1 = -1,-1
		anchor2 = -1,-1
		is-visible = false
		saved-params = "pos;size;is-minimized;is-maximized"
		statusbar = false
		can-resize = false

window "preferences_window"
	elem "preferences_window"
		type = MAIN
		pos = 281,0
		size = 1280x1000
		anchor1 = -1,-1
		anchor2 = -1,-1
		is-visible = false
		saved-params = "pos;size;is-minimized;is-maximized"
		statusbar = false
	elem "preferences_browser"
		type = BROWSER
		pos = 0,0
		size = 1280x1000
		anchor1 = 0,0
		anchor2 = 100,100
		saved-params = ""

window "statwindow"
	elem "statwindow"
		type = MAIN
		pos = 281,0
		size = 340x240
		anchor1 = -1,-1
		anchor2 = -1,-1
		saved-params = "pos;size;is-minimized;is-maximized"
		is-pane = true
	elem "statbrowser"
		type = BROWSER
		pos = 0,0
		size = 340x240
		anchor1 = 0,0
		anchor2 = 100,100
		is-visible = false
		saved-params = ""


code:
/// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/// !!!!!!!!!!HEY LISTEN!!!!!!!!!!!!!!!!!!!!!!!!
/// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

// If you modify this file you ALSO need to modify code/modules/goonchat/browserAssets/browserOutput.css and browserOutput_white.css
// BUT you have to use PX font sizes with are on a x8 scale of these font sizes
// Sample font-size: DM: 8 CSS: 64px

/client/script = {"<style>
body					{font-family: Verdana, sans-serif;}

h1, h2, h3, h4, h5, h6	{color: #0000ff;	font-family: Georgia, Verdana, sans-serif;}

em						{font-style: normal;	font-weight: bold;}

.motd					{color: #638500;	font-family: Verdana, sans-serif;}
.motd h1, .motd h2, .motd h3, .motd h4, .motd h5, .motd h6
	{color: #638500;	text-decoration: underline;}
.motd a, .motd a:link, .motd a:visited, .motd a:active, .motd a:hover
	{color: #638500;}

.italics				{					font-style: italic;}

.bold					{					font-weight: bold;}

.prefix					{					font-weight: bold;}
.oocplain				{}
.warningplain			{}
.ooc					{					font-weight: bold;}
.adminobserverooc		{color: #0099cc;	font-weight: bold;}
.adminooc				{color: #700038;	font-weight: bold;}

.adminsay				{color:	#FF4500;	font-weight: bold;}
.admin					{color: #386aff;	font-weight: bold;}

.name					{					font-weight: bold;}

.say					{}
.deadsay				{color: #5c00e6;}
.binarysay				{color: #20c20e;	background-color: #000000;	display: block;}
.binarysay a			{color: #00ff00;}
.binarysay a:active, .binarysay a:visited {color: #88ff88;}
.radio					{color: #008000;}
.sciradio				{color: #993399;}
.comradio				{color: #948f02;}
.secradio				{color: #a30000;}
.medradio				{color: #337296;}
.engradio				{color: #fb5613;}
.suppradio				{color: #a8732b;}
.servradio				{color: #6eaa2c;}
.syndradio				{color: #6d3f40;}
.centcomradio			{color: #686868;}
.aiprivradio			{color: #ff00ff;}
.redteamradio			{color: #ff0000;}
.blueteamradio			{color: #0000ff;}
.greenteamradio			{color: #00ff00;}
.yellowteamradio		{color: #d1ba22;}
.gangradio				{color: #ac2ea1;}

.yell					{					font-weight: bold;}

.alert					{color: #ff0000; text-shadow: 0 0 1px #e72525;}
h1.alert, h2.alert		{color: #000000;}

.emote					{}
.infoplain				{}

.userlove				{color: #ff57cd; text-shadow: 0 0 6px #e72b8f; font-style: italic; font-size: 110%;}

.love					{color: #ff45c7; font-style: italic; text-shadow: 0 0 6px #cc77ee;}

.horny					{color: #ff4591; font-style: italic; text-shadow: 0 0 3px #9b4e77;}

.bling					{color: #D5AD6D; text-shadow: 0 0 3px #D5AD6D; font-weight: bold; font-size: 110%; background: -webkit-linear-gradient(transparent, transparent), -webkit-linear-gradient(top, rgba(213,173,109,1) 0%, rgba(213,173,109,1) 26%, rgba(226,186,120,1) 35%, rgba(163,126,67,1) 45%, rgba(145,112,59,1) 61%, rgba(213,173,109,1) 100%); background: -o-linear-gradient(transparent, transparent); background-clip: text; -webkit-background-clip: text; -webkit-text-fill-color: transparent;}

.animatedpain 					{color: #BA55D3; text-shadow: 0 0 6px #c75be2; font-size: 110%; animation: pain 2500ms infinite;}
	@keyframes pain {
		0% {color: #BA55D3;text-shadow: 0 0 4px #c75be2;}
		50% {color: #cc00ff;text-shadow: 0 0 8px #ad37ca;}
		100% {color: #BA55D3;text-shadow: 0 0 4px #c75be2;}
}
.flashinguserdanger		{color: #BA55D3; text-shadow: 0 0 6px #c75be2; font-size: 125%; animation: userdanger 250ms infinite;}
	@keyframes userdanger {
	0% {color: #BA55D3;text-shadow: 0 0 6px #c75be2;}
	50% {color: #ff56ff;text-shadow: 0 0 8px #ff4aff;}
	100% {color: #BA55D3;text-shadow: 0 0 6px #c75be2;}
}
.lowpain				{color: #a4a562; text-shadow: 0 0 0px #a4a562;}
.lowestpain				{color: #a4a562; font-size: 85%; text-shadow: 0 0 0px #a4a562;}
.artery					{color: #9B5455; text-shadow: 0 0 3px #9B5455;}
.userdanger				{color: #ba55d3; text-shadow: 0 0 6px #c75be2; font-size: 110%}
.bolddanger 			{color: #c51e1e; text-shadow: 0 0 3px #ff4747; font-weight: bold;}
.danger					{color: #ff0000; text-shadow: 0 0 3px #ff4747;}
.flashingdanger 		{color: #c51e1e; font-weight: bold; text-shadow: 0 0 3px #a81010; animation: danger 1000ms infinite;}
	@keyframes danger {
		0% {color: #ff4f4f; text-shadow: 0 0 4px #ff4444;}
		50% {color: #c51e1e; text-shadow: 0 0 3px #ff4444;}
		100% {color: #ff4f4f; text-shadow: 0 0 4px #ff4444;}
}
.infection				{color: #77c72b; text-shadow: 0 0 3px #68af26;}
.necrosis				{color: #497a1a; text-shadow: 0 0 6px #558d20;}
.dead					{color: #b280df; text-shadow: 0 0 1px #b280df;}
.tinydanger				{color: #ff0000; text-shadow: 0 0 3px #ff4747; font-size: 85%;}
.smalldanger			{color: #ff0000; text-shadow: 0 0 3px #ff4747; font-size: 90%;}
.warning				{color: #ff0000; text-shadow: 0 0 3px #ff4747; font-style: italic;}
.boldwarning			{color: #ff0000; text-shadow: 0 0 3px #ff4747; font-style: italic; font-weight: bold}
.announce				{color: #228b22;	font-weight: bold;}
.boldannounce			{color: #ff0000;	font-weight: bold;}
.minorannounce			{					font-weight: bold;  font-size: 3;}
.greenannounce			{color: #00ff00;	font-weight: bold;}
.rose					{color: #ff5050;}
.info					{color: #0000CC; text-shadow: 0 0 3px #3e3eb1;}
.notice					{color: #000099; text-shadow: 0 0 3px #262697;}
.tinynotice				{color: #000099; text-shadow: 0 0 3px #262697; font-size: 85%;}
.tinynoticeital			{color: #000099; text-shadow: 0 0 3px #262697; font-style: italic; font-size: 85%;}
.smallnotice			{color: #000099; text-shadow: 0 0 3px #262697; font-size: 90%;}
.smallnoticeital		{color: #000099; text-shadow: 0 0 3px #262697; font-style: italic;	font-size: 90%;}
.boldnotice				{color: #000099; text-shadow: 0 0 3px #262697; font-weight: bold;}
.hear					{color: #000099; font-style: italic;}
.adminnotice			{color: #0000ff;}
.adminhelp				{color: #ff0000;	font-weight: bold;}
.unconscious			{color: #0000ff;	font-weight: bold;}
.suicide				{color: #ff5050;	font-style: italic;}
.green					{color: #03ff39;}
.nicegreen				{color: #14a833; text-shadow: 0 0 3px #1f8134;}
.cult					{color: #973e3b;}
.cultlarge				{color: #973e3b;	font-weight: bold;	font-size: 3;}
.narsie					{color: #973e3b;	font-weight: bold;	font-size: 15;}
.narsiesmall			{color: #973e3b;	font-weight: bold;	font-size: 6;}
.colossus				{color: #7F282A;	font-size: 5;}
.hierophant				{color: #660099;	font-weight: bold;	font-style: italic;}
.hierophant_warning		{color: #660099;	font-style: italic;}
.purple					{color: #5e2d79;}
.holoparasite			{color: #35333a;}
.bounty					{color: #ab6613;	font-style: italic;}

.revennotice			{color: #1d2953;}
.revenboldnotice		{color: #1d2953;	font-weight: bold;}
.revenbignotice			{color: #1d2953;	font-weight: bold;	font-size: 3;}
.revenminor				{color: #823abb}
.revenwarning			{color: #760fbb;	font-style: italic;}
.revendanger			{color: #760fbb;	font-weight: bold;	font-size: 3;}

.sentientdisease		{color: #446600;}

.deconversion_message	{color: #5000A0;	font-size: 3;	font-style: italic;}

.ghostalert				{color: #5c00e6;	font-style: italic;	font-weight: bold;}

.alien					{color: #543354;}
.noticealien			{color: #00c000;}
.alertalien				{color: #00c000;	font-weight: bold;}
.changeling				{color: #800080;	font-style: italic;}

.spider					{color: #4d004d;}

.interface				{color: #330033;}

.sans					{font-family: "Comic Sans MS", cursive, sans-serif;}
.papyrus				{font-family: "Papyrus", cursive, sans-serif;}
.robot					{font-family: "Courier New", cursive, sans-serif;}

.command_headset		{font-weight: bold;	font-size: 3;}
.small					{font-size: 1;}
.big					{font-size: 3;}
.reallybig				{font-size: 4;}
.extremelybig			{font-size: 5;}
.greentext				{color: #00FF00;	font-size: 3;}
.redtext				{color: #FF0000;	font-size: 3;}
.clown					{color: #FF69Bf;	font-size: 3;	font-family: "Comic Sans MS", cursive, sans-serif;	font-weight: bold;}
.singing				{font-family: "Trebuchet MS", cursive, sans-serif; font-style: italic;}
.his_grace				{color: #15D512;	font-family: "Courier New", cursive, sans-serif;	font-style: italic;}
.hypnophrase			{color: #3bb5d3;	font-weight: bold;	animation: hypnocolor 1500ms infinite; animation-direction: alternate;}
	@keyframes hypnocolor {
		0%		{color: #0d0d0d;}
		25%		{color: #410194;}
		50%		{color: #7f17d8;}
		75%		{color: #410194;}
		100%	{color: #3bb5d3;}
}

.phobia			{color: #dd0000;	font-weight: bold;	animation: phobia 750ms infinite;}
	@keyframes phobia {
		0%		{color: #0d0d0d;}
		50%		{color: #dd0000;}
		100%	{color: #0d0d0d;}
}
.icon					{height: 1em;	width: auto;}
.infobox				{border: 1px ridge #383243; background: rgba(40, 40, 60, 0.5); margin: 2px 8px; padding: 8px 12px; max-width: 550px;}

.infohr 				{border: 0; height: 1px; background-image: linear-gradient(to right, rgba(187, 187, 255, 0), rgba(187, 187, 255, 0.65), rgba(187, 187, 255, 0));}

.memo					{color: #638500;	text-align: center;}
.memoedit				{text-align: center;	font-size: 2;}
.abductor				{color: #800080;	font-style: italic;}
.mind_control			{color: #A00D6F;	font-size: 3;	font-weight: bold;	font-style: italic;}
.slime					{color: #00CED1;}
.drone					{color: #848482;}
.monkey					{color: #975032;}
.swarmer				{color: #2C75FF;}
.resonate				{color: #298F85;}

.monkeyhive				{color: #774704;}
.monkeylead				{color: #774704;	font-size: 2;}
</style>"}


code:
/proc/initialize_attributes()
	. = list()
	var/list/attr = init_subtypes(/datum/attribute)
	for(var/thing in attr)
		var/datum/attribute/attri = thing
		if(isnull(attri.name))
			qdel(attri)
			continue
		.[attri.type] = attri

/proc/initialize_skills()
	. = list()
	for(var/skill in GLOB.all_attributes)
		//no want stat
		if(!ispath(skill, /datum/attribute/skill))
			continue
		.[skill] = GLOB.all_attributes[skill]

/proc/initialize_stats()
	. = list()
	for(var/attribute in GLOB.all_attributes)
		//no want skill
		if(!ispath(attribute, /datum/attribute/stat))
			continue
		.[attribute] = GLOB.all_attributes[attribute]


code:
/proc/mix_color_from_reagent_list(list/reagent_list)
	var/mixcolor
	var/vol_counter = 0
	var/vol_temp
	var/cached_color

	var/datum/reagent/raw_reagent //Faster declaration
	for(var/reagent_type in reagent_list)
		raw_reagent = reagent_type //Not initialized
		vol_temp = reagent_list[reagent_type]
		vol_counter += vol_temp
		cached_color = initial(raw_reagent.color)

		if(!mixcolor)
			mixcolor = cached_color
		else if (length(mixcolor) >= length(cached_color))
			mixcolor = BlendRGB(mixcolor, cached_color, vol_temp/vol_counter)
		else
			mixcolor = BlendRGB(cached_color, mixcolor, vol_temp/vol_counter)

	return sanitize_hexcolor(mixcolor, 8, TRUE)


code:
/proc/translate_knob_size(size)
	if(istext(size))
		size = text2num(size)
	return "[size]cm"

/proc/detranslate_knob_size(size)
	return text2num(size)

/proc/translate_gonad_size(size)
	switch(text2num(size))
		if(-INFINITY to 0)
			return "small"
		if(1)
			return "average sized"
		if(2)
			return "big"
		if(3)
			return "huge"
		if(4 to INFINITY)
			return "balls of steel sized"
		else
			return "average sized"

/proc/detranslate_gonad_size(size)
	size = lowertext(size)
	switch(size)
		if("small")
			return 0
		if("average sized")
			return 1
		if("big")
			return 2
		if("huge")
			return 3
		if("balls of steel sized")
			return 4
		else
			return 1

/proc/translate_jug_size(size)
	switch(text2num(size))
		if(-INFINITY to 0)
			return "a"
		if(1)
			return "b"
		if(2)
			return "c"
		if(3)
			return "d"
		if(4)
			return "e"
		if(5)
			return "f"
		if(6)
			return "g"
		if(7 to INFINITY)
			return "h"
		else
			return "a"

/proc/detranslate_jug_size(size)
	size = lowertext(size)
	switch(size)
		if("a")
			return 0
		if("b")
			return 1
		if("c")
			return 2
		if("d")
			return 3
		if("e")
			return 4
		if("f")
			return 5
		if("g")
			return 6
		if("h")
			return 7
		else
			return 0


code:
/proc/make_preferences_datum_references()
	make_sprite_accessory_references()
	make_body_marking_references()
	make_body_marking_set_references()
	make_body_marking_dna_block_references()
	make_augment_references()
	make_culture_references()

/proc/make_culture_references()
	if(!LAZYLEN(GLOB.culture_birthsigns))
		for(var/path in subtypesof(/datum/cultural_info/birthsign))
			var/datum/cultural_info/birthsign = path
			if(!initial(birthsign.name))
				continue
			birthsign = new path()
			GLOB.culture_birthsigns[path] = birthsign

/proc/make_sprite_accessory_references()
	// Here we build the global list for all accessories
	for(var/path in subtypesof(/datum/sprite_accessory))
		var/datum/sprite_accessory/P = path
		if(initial(P.key) && initial(P.name))
			P = new path()
			if(!GLOB.sprite_accessories[P.key])
				GLOB.sprite_accessories[P.key] = list()
			GLOB.sprite_accessories[P.key][P.name] = P
			if(P.genetic)
				if(!GLOB.dna_mutant_bodypart_blocks[P.key])
					GLOB.dna_mutant_bodypart_blocks[P.key] = GLOB.dna_total_feature_blocks+1
				if(!GLOB.genetic_accessories[P.key])
					GLOB.genetic_accessories[P.key] = list()
					GLOB.dna_total_feature_blocks += DNA_BLOCKS_PER_FEATURE
				GLOB.genetic_accessories[P.key] += P.name
			//TODO: Replace "generic" definitions with something better
			if(P.generic && !GLOB.generic_accessories[P.key])
				GLOB.generic_accessories[P.key] = P.generic

/proc/make_body_marking_references()
	// Here we build the global list for all body markings
	for(var/path in subtypesof(/datum/body_marking))
		var/datum/body_marking/body_marking = path
		if(initial(body_marking.name))
			body_marking = new path()
			GLOB.body_markings[body_marking.name] = body_marking
			//We go through all the possible affected bodyparts and a name reference where applicable
			for(var/marking_zone in GLOB.marking_zones)
				var/bitflag = GLOB.bodyzone_to_bitflag[marking_zone]
				if(body_marking.affected_bodyparts & bitflag)
					LAZYINITLIST(GLOB.body_markings_per_limb[marking_zone])
					GLOB.body_markings_per_limb[marking_zone] += body_marking.name

/proc/make_body_marking_set_references()
	// Here we build the global list for all body markings sets
	for(var/path in subtypesof(/datum/body_marking_set))
		var/datum/body_marking_set/body_marking_set = new path()
		if(body_marking_set.name)
			body_marking_set = new path()
			GLOB.body_marking_sets[body_marking_set.name] = body_marking_set

/proc/make_body_marking_dna_block_references()
	for(var/marking_zone in GLOB.marking_zones)
		GLOB.dna_body_marking_blocks[marking_zone] = GLOB.dna_total_feature_blocks+1
		GLOB.dna_total_feature_blocks += DNA_BLOCKS_PER_MARKING_ZONE

/proc/make_augment_references()
	// Here we build the global augment lists
	for(var/path in subtypesof(/datum/augment_item))
		var/datum/augment_item/augment_item = path
		//Should not be displayed to player
		if(!initial(augment_item.name))
			continue
		augment_item = new path()
		GLOB.augment_item_datums[augment_item.type] = augment_item
		if(!GLOB.augment_slot_to_items[augment_item.slot])
			GLOB.augment_slot_to_items[augment_item.slot] = list()
		GLOB.augment_slot_to_items[augment_item.slot] += augment_item.type
		if(!GLOB.augment_categories_to_slots_to_items[augment_item.category])
			GLOB.augment_categories_to_slots_to_items[augment_item.category] = list()
		if(!GLOB.augment_categories_to_slots_to_items[augment_item.category][augment_item.slot])
			GLOB.augment_categories_to_slots_to_items[augment_item.category][augment_item.slot] = list()
		GLOB.augment_categories_to_slots_to_items[augment_item.category][augment_item.slot] += augment_item.type

/proc/generate_selectable_species()
	var/list/selectable_species = list()
	for(var/species_type in subtypesof(/datum/species))
		var/datum/species/species = new species_type()
		if(species.check_roundstart_eligible())
			selectable_species += species.id
			GLOB.customizable_races += species.id
		else if(species.always_customizable)
			GLOB.customizable_races[species.id] += species.id
		qdel(species)
	if(!LAZYLEN(selectable_species))
		selectable_species += SPECIES_HUMAN
	return selectable_species


code:
/proc/get_typing_indicator()
	var/image/I = image(icon = 'modular_septic/icons/mob/indicators.dmi', icon_state = "typing", layer = FLOAT_LAYER)
	I.plane = FLOAT_PLANE
	return I

/proc/get_ssd_indicator()
	var/image/I = image(icon = 'modular_septic/icons/mob/indicators.dmi', icon_state = "ssd", layer = FLOAT_LAYER)
	I.plane = FLOAT_PLANE
	return I


code:
/proc/setup_interactions()
	. = list()
	for(var/category in INTERACTION_CATEGORY_ORDER)
		for(var/thing in subtypesof(/datum/interaction))
			var/datum/interaction/new_interaction = thing
			if(!initial(new_interaction.name) || (initial(new_interaction.category) != category))
				continue
			new_interaction = new thing()
			.[new_interaction.name] = new_interaction


code:
/proc/setup_bodyparts()
	. = list()
	for(var/thing in BODYPARTS_PATH)
		var/obj/item/bodypart/part = new thing()
		part.moveToNullspace()
		STOP_PROCESSING(SSobj, part)
		if(!part.body_zone)
			continue
		.[initial(part.body_zone)] = part

/proc/setup_bodyzone_to_parent_bodyzone()
	. = list()
	for(var/thing in ALL_BODYPARTS)
		var/obj/item/bodypart/part = GLOB.bodyparts_by_zone[thing]
		if(!part.parent_body_zone)
			continue
		.[initial(part.body_zone)] = part.parent_body_zone

/proc/setup_bodyzone_to_bitflag()
	. = list()
	for(var/thing in ALL_BODYPARTS)
		var/obj/item/bodypart/part = GLOB.bodyparts_by_zone[thing]
		if(!initial(part.body_part))
			continue
		.[initial(part.body_zone)] = part.body_part

/proc/setup_bodyzone_to_children()
	. = list()
	for(var/thing in ALL_BODYPARTS)
		var/obj/item/bodypart/part = GLOB.bodyparts_by_zone[thing]
		if(!length(part.children_zones))
			continue
		.[initial(part.body_zone)] = part.children_zones.Copy()

/proc/parse_handedness(handedness_flags = DEFAULT_HANDEDNESS)
	if(handedness_flags & AMBIDEXTROUS)
		return "Poorly Ambidextrous"
	else if(CHECK_MULTIPLE_BITFIELDS(handedness_flags, RIGHT_HANDED|LEFT_HANDED))
		return "Ambidextrous"
	else if(handedness_flags & RIGHT_HANDED)
		return "Right Handed"
	else
		return "Left Handed"

/proc/unparse_handedness(handedness_text = "Right Handed")
	switch(handedness_text)
		if("Poorly Ambidextrous")
			return AMBIDEXTROUS|RIGHT_HANDED|LEFT_HANDED
		if("Ambidextrous")
			return RIGHT_HANDED|LEFT_HANDED
		if("Left Handed")
			return LEFT_HANDED
		else
			return LEFT_HANDED

/proc/ran_zone(zone, probability = 80)
	if(prob(probability))
		zone = check_zone(zone)
	else
		zone = pick_weight(GLOB.bodyzone_to_relative_size)
	return zone

/proc/above_neck(zone)
	var/static/list/zones = list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_FACE, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_R_EYE)
	if(zones.Find(zone))
		return TRUE
	else
		return FALSE

/proc/check_zone(zone)
	if(!zone)
		return BODY_ZONE_CHEST
	return zone

/proc/body_parts_covered2organ_names(bpc)
	var/list/covered_parts = list()

	if(!bpc)
		return covered_parts

	if(bpc & FULL_BODY)
		covered_parts |= ALL_BODYPARTS
	else
		if(bpc & HEAD)
			covered_parts |= list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_FACE)
		if(bpc & JAW)
			covered_parts |= list(BODY_ZONE_PRECISE_MOUTH)
		if(bpc & NECK)
			covered_parts |= list(BODY_ZONE_PRECISE_NECK)
		if(bpc & CHEST)
			covered_parts |= list(BODY_ZONE_CHEST)
		if(bpc & GROIN)
			covered_parts |= list(BODY_ZONE_PRECISE_GROIN)

		if(bpc & EYES)
			covered_parts |= list(BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_R_EYE)
		else
			if(bpc & EYE_LEFT)
				covered_parts |= list(BODY_ZONE_PRECISE_L_EYE)
			if(bpc & EYE_RIGHT)
				covered_parts |= list(BODY_ZONE_PRECISE_R_EYE)

		if(bpc & ARMS)
			covered_parts |= list(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM)
		else
			if(bpc & ARM_LEFT)
				covered_parts |= list(BODY_ZONE_L_ARM)
			if(bpc & ARM_RIGHT)
				covered_parts |= list(BODY_ZONE_R_ARM)

		if(bpc & HANDS)
			covered_parts |= list(BODY_ZONE_PRECISE_R_HAND,BODY_ZONE_PRECISE_L_HAND)
		else
			if(bpc & HAND_LEFT)
				covered_parts |= list(BODY_ZONE_PRECISE_L_HAND)
			if(bpc & HAND_RIGHT)
				covered_parts |= list(BODY_ZONE_PRECISE_R_HAND)

		if(bpc & LEGS)
			covered_parts |= list(BODY_ZONE_L_LEG,BODY_ZONE_R_LEG)
		else
			if(bpc & LEG_LEFT)
				covered_parts |= list(BODY_ZONE_L_LEG)
			if(bpc & LEG_RIGHT)
				covered_parts |= list(BODY_ZONE_R_LEG)

		if(bpc & FEET)
			covered_parts |= list(BODY_ZONE_PRECISE_L_FOOT,BODY_ZONE_PRECISE_R_FOOT)
		else
			if(bpc & FOOT_LEFT)
				covered_parts |= list(BODY_ZONE_PRECISE_L_FOOT)
			if(bpc & FOOT_RIGHT)
				covered_parts |= list(BODY_ZONE_PRECISE_R_FOOT)

	return covered_parts

/proc/zone2body_parts_covered(def_zone)
	switch(def_zone)
		if(BODY_ZONE_CHEST)
			return list(CHEST)
		if(BODY_ZONE_PRECISE_GROIN)
			return list(GROIN)
		if(BODY_ZONE_PRECISE_NECK)
			return list(NECK)
		if(BODY_ZONE_PRECISE_FACE)
			return list(FACE)
		if(BODY_ZONE_PRECISE_MOUTH)
			return list(JAW)
		if(BODY_ZONE_PRECISE_L_EYE)
			return list(EYE_LEFT)
		if(BODY_ZONE_PRECISE_R_EYE)
			return list(EYE_RIGHT)
		if(BODY_ZONE_HEAD)
			return list(HEAD)
		if(BODY_ZONE_L_ARM)
			return list(ARM_LEFT)
		if(BODY_ZONE_PRECISE_L_HAND)
			return list(HAND_LEFT)
		if(BODY_ZONE_R_ARM)
			return list(ARM_RIGHT)
		if(BODY_ZONE_PRECISE_R_HAND)
			return list(HAND_RIGHT)
		if(BODY_ZONE_L_LEG)
			return list(LEG_LEFT)
		if(BODY_ZONE_PRECISE_L_FOOT)
			return list(FOOT_LEFT)
		if(BODY_ZONE_R_LEG)
			return list(LEG_RIGHT)
		if(BODY_ZONE_PRECISE_R_FOOT)
			return list(FOOT_RIGHT)

/proc/slot2body_zone(slot)
	switch(slot)
		if(ITEM_SLOT_BACK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_ICLOTHING, ITEM_SLOT_ID)
			return BODY_ZONE_CHEST
		if(ITEM_SLOT_BELT)
			return BODY_ZONE_PRECISE_GROIN
		if(ITEM_SLOT_GLOVES, ITEM_SLOT_HANDS, ITEM_SLOT_HANDCUFFED)
			return pick(BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND)
		if(ITEM_SLOT_HEAD)
			return BODY_ZONE_HEAD
		if(ITEM_SLOT_EARS, ITEM_SLOT_LEAR, ITEM_SLOT_REAR)
			return BODY_ZONE_PRECISE_FACE
		if(ITEM_SLOT_NECK)
			return BODY_ZONE_PRECISE_NECK
		if(ITEM_SLOT_EYES)
			return pick(BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_R_EYE)
		if(ITEM_SLOT_FEET)
			return pick(BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT)
		if(ITEM_SLOT_LEGCUFFED)
			return pick(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)


code:
/proc/accessory_list_of_key_for_species(key, datum/species/S, mismatched, ckey)
	var/list/accessory_list = list()
	for(var/name in GLOB.sprite_accessories[key])
		var/datum/sprite_accessory/SP = GLOB.sprite_accessories[key][name]
		if(!mismatched && SP.recommended_species && !(S.id in SP.recommended_species))
			continue
		accessory_list += SP.name
	return accessory_list

/proc/random_accessory_of_key_for_species(key, datum/species/S, mismatched=FALSE, ckey)
	var/list/accessory_list = accessory_list_of_key_for_species(key, S, mismatched, ckey)
	if(!length(accessory_list))
		return
	var/datum/sprite_accessory/SP = GLOB.sprite_accessories[key][pick(accessory_list)]
	if(!SP)
		CRASH("Cant find random accessory of [key] key, for species [S.id]")
	return SP

/proc/assemble_body_markings_from_set(datum/body_marking_set/body_marking_set, list/features, datum/species/pref_species)
	var/list/body_markings = list()
	for(var/name in body_marking_set.body_marking_list)
		var/datum/body_marking/body_marking = GLOB.body_markings[name]
		for(var/zone in GLOB.body_markings_per_limb)
			var/list/marking_list = GLOB.body_markings_per_limb[zone]
			if(name in marking_list)
				if(!body_markings[zone])
					body_markings[zone] = list()
				body_markings[zone][name] = body_marking.get_default_color(features, pref_species)
	return body_markings


code:
/proc/setup_bones()
	. = list()
	for(var/thing in init_subtypes(/obj/item/organ/bone))
		var/obj/item/organ/bone = thing
		.[bone.type] = bone
	.[/obj/item/organ/bone] = new /obj/item/organ/bone()

/proc/setup_tendons()
	. = list()
	for(var/thing in init_subtypes(/obj/item/organ/tendon))
		var/obj/item/organ/tendon = thing
		.[tendon.type] = tendon
	.[/obj/item/organ/tendon] = new /obj/item/organ/tendon()

/proc/setup_nerves()
	. = list()
	for(var/thing in init_subtypes(/obj/item/organ/nerve))
		var/obj/item/organ/nerve = thing
		.[nerve.type] = nerve
	.[/obj/item/organ/nerve] = new /obj/item/organ/nerve()

/proc/setup_arteries()
	. = list()
	for(var/thing in init_subtypes(/obj/item/organ/artery))
		var/obj/item/organ/artery = thing
		.[artery.type] = artery
	.[/obj/item/organ/artery] = new /obj/item/organ/artery()


code:
/datum/proc/p_themselves(capitalized, temp_gender)
	. = "itself"
	if(capitalized)
		. = capitalize(.)

/mob/p_themselves(capitalized, temp_gender)
	if(!temp_gender)
		temp_gender = gender
	. = "itself"
	switch(temp_gender)
		if(FEMALE)
			. = "herself"
		if(MALE)
			. = "himself"
		if(PLURAL)
			. = "themselves"
	if(capitalized)
		. = capitalize(.)


code:
//Sometimes, \an does not work like you'd expect
/proc/prefix_a_or_an(text)
	var/start = lowertext(text[1])
	if(!start)
		return "a"
	if(start == "a" || start == "e" || start == "i" || start == "o" || start == "u")
		return "an"
	else
		return "a"

//Like capitalize, but you capitalize EVERYTHING
/proc/capitalize_like_old_man(t)
	. = t
	if(t)
		var/list/binguslist = splittext(t, " ")
		for(var/bingus in binguslist)
			binguslist -= bingus
			var/chonker = uppertext(bingus[1])
			bingus = chonker + copytext(bingus, 1 + length(chonker))
			binguslist += bingus
		return jointext(binguslist, " ")

//Get only the initials of t joined together
/proc/get_name_initials(t)
	. = t
	if(t)
		var/list/binguslist = splittext(t, " ")
		for(var/bingus in binguslist)
			binguslist -= bingus
			binguslist += uppertext(bingus[1])
		return jointext(binguslist, "")

/proc/fail_string(capitalize = FALSE)
	var/string = pick("crap", "dang", "damn", "damn it", "shit", "piss", "ugh", "unf", "agh", "fuck", "hell on earth", "misery", "tarnation", "curse", "agony", "failure", "no")
	return (capitalize ? capitalize(string) : string)

/proc/fail_msg()
	return "[fail_string(TRUE)]!"

/proc/click_fail_msg()
	return span_alert(pick("I'm not ready!", "No!", "I did all i could!", "I can't!", "Not yet!"))

/proc/get_signs_from_number(num, index = 0)
	var/signs = num
	var/symbol = span_green("+")
	if(!signs)
		symbol = ""
	else if(signs < 0)
		symbol = span_red("-")
	signs = abs(signs)
	var/total_symbols = ""
	if(signs && symbol)
		if(index)
			signs = CEILING(signs/2, 1)
		else
			signs = FLOOR(signs/2, 1)
		var/bingus = 0
		while(bingus < signs)
			bingus++
			total_symbols += symbol
	return total_symbols


code:
/proc/calculate_current_station_year()
	return GLOB.year_integer + YEAR_OFFSET


code:
GLOBAL_LIST_INIT(all_attributes, initialize_attributes())
GLOBAL_LIST_INIT(all_skills, initialize_skills())
GLOBAL_LIST_INIT(all_stats, initialize_stats())

GLOBAL_LIST_EMPTY(attribute_sheets)
GLOBAL_LIST_EMPTY(attribute_modification_cache)
GLOBAL_LIST_EMPTY(diceroll_modification_cache)


code:
GLOBAL_LIST_INIT(bodyparts_by_zone, setup_bodyparts())
GLOBAL_LIST_INIT(bodyzone_to_parent, setup_bodyzone_to_parent_bodyzone())
GLOBAL_LIST_INIT(bodyzone_to_bitflag, setup_bodyzone_to_bitflag())
GLOBAL_LIST_INIT(bodyzone_to_children, setup_bodyzone_to_parent_bodyzone())
GLOBAL_LIST_INIT(bodyzone_to_relative_size, list(BODY_ZONE_PRECISE_R_EYE = 1,
												BODY_ZONE_PRECISE_L_EYE = 1,
												BODY_ZONE_PRECISE_FACE = 10,
												BODY_ZONE_PRECISE_MOUTH = 10,
												BODY_ZONE_HEAD = 10,
												BODY_ZONE_PRECISE_NECK = 10,
												BODY_ZONE_CHEST = 70,
												BODY_ZONE_PRECISE_GROIN = 30,
												BODY_ZONE_L_ARM = 20,
												BODY_ZONE_PRECISE_L_HAND = 10,
												BODY_ZONE_R_ARM = 20,
												BODY_ZONE_PRECISE_R_HAND = 10,
												BODY_ZONE_L_LEG = 25,
												BODY_ZONE_PRECISE_L_FOOT = 5,
												BODY_ZONE_R_LEG = 25,
												BODY_ZONE_PRECISE_R_FOOT = 5,
												))


code:
/// Organ slot processing order for life proc
GLOBAL_LIST_INIT(organ_process_order, list(
	ORGAN_SLOT_BRAIN,
	ORGAN_SLOT_APPENDIX,
	ORGAN_SLOT_RIGHT_ARM_AUG,
	ORGAN_SLOT_LEFT_ARM_AUG,
	ORGAN_SLOT_STOMACH,
	ORGAN_SLOT_STOMACH_AID,
	ORGAN_SLOT_BREATHING_TUBE,
	ORGAN_SLOT_EARS,
	ORGAN_SLOT_EYES,
	ORGAN_SLOT_LUNGS,
	ORGAN_SLOT_HEART,
	ORGAN_SLOT_ZOMBIE,
	ORGAN_SLOT_THRUSTERS,
	ORGAN_SLOT_HUD,
	ORGAN_SLOT_KIDNEYS,
	ORGAN_SLOT_LIVER,
	ORGAN_SLOT_SPLEEN,
	ORGAN_SLOT_TONGUE,
	ORGAN_SLOT_VOICE,
	ORGAN_SLOT_ARTERY,
	ORGAN_SLOT_TENDON,
	ORGAN_SLOT_NERVE,
	ORGAN_SLOT_BONE,
	ORGAN_SLOT_ADAMANTINE_RESONATOR,
	ORGAN_SLOT_HEART_AID,
	ORGAN_SLOT_BRAIN_ANTIDROP,
	ORGAN_SLOT_BRAIN_ANTISTUN,
	ORGAN_SLOT_TAIL,
	ORGAN_SLOT_EXTERNAL_WINGS,
	ORGAN_SLOT_PENIS,
	ORGAN_SLOT_TESTICLES,
	ORGAN_SLOT_VAGINA,
	ORGAN_SLOT_WOMB,
	ORGAN_SLOT_BREASTS,
	ORGAN_SLOT_PARASITE_EGG,
	ORGAN_SLOT_REGENERATIVE_CORE,
	ORGAN_SLOT_XENO_PLASMAVESSEL,
	ORGAN_SLOT_XENO_HIVENODE,
	ORGAN_SLOT_XENO_RESINSPINNER,
	ORGAN_SLOT_XENO_ACIDGLAND,
	ORGAN_SLOT_XENO_NEUROTOXINGLAND,
	ORGAN_SLOT_XENO_EGGSAC,
	))

GLOBAL_LIST_INIT(organ_process_datum_order, list(
	ORGAN_SLOT_BRAIN,
	ORGAN_SLOT_HEART,
	ORGAN_SLOT_LUNGS,
	ORGAN_SLOT_KIDNEYS,
	ORGAN_SLOT_LIVER,
	ORGAN_SLOT_STOMACH,
	ORGAN_SLOT_SPLEEN,
	ORGAN_SLOT_EARS,
	ORGAN_SLOT_INTESTINES,
	ORGAN_SLOT_BLADDER,
	ORGAN_SLOT_PENIS,
	))

GLOBAL_LIST_INIT_TYPED(bones_by_path, /obj/item/organ/bone, setup_bones())
GLOBAL_LIST_INIT_TYPED(tendons_by_path, /obj/item/organ/tendon, setup_tendons())
GLOBAL_LIST_INIT_TYPED(nerves_by_path, /obj/item/organ/nerve, setup_nerves())
GLOBAL_LIST_INIT_TYPED(arteries_by_path, /obj/item/organ/artery, setup_arteries())


code:
GLOBAL_LIST_EMPTY(sprite_accessories)
GLOBAL_LIST_EMPTY(generic_accessories)
GLOBAL_LIST_EMPTY(genetic_accessories)

GLOBAL_LIST_EMPTY(body_markings)
GLOBAL_LIST_EMPTY_TYPED(body_markings_per_limb, /list)
GLOBAL_LIST_EMPTY(body_marking_sets)

GLOBAL_LIST_EMPTY_TYPED(augment_item_datums, /datum/augment_item)
GLOBAL_LIST_EMPTY_TYPED(augment_slot_to_items, /list)
GLOBAL_LIST_EMPTY_TYPED(augment_categories_to_slots_to_items, /list)

GLOBAL_LIST_INIT(marking_zones, MARKING_BODYPARTS)

GLOBAL_LIST_INIT(robotic_styles_list, list(
	"None" = "None",
	"Surplus" = 'modular_septic/icons/mob/human/augments/surplus_augments.dmi',
	"Cyborg" = 'modular_septic/icons/mob/human/augments/augments.dmi',
	"Engineering" = 'modular_septic/icons/mob/human/augments/augments_engineer.dmi',
	"Mining" = 'modular_septic/icons/mob/human/augments/augments_mining.dmi',
	"Security" = 'modular_septic/icons/mob/human/augments/augments_security.dmi',
	"Morpheus Cyberkinetics" = 'modular_septic/icons/mob/human/augments/mcgipc.dmi',
	"Bishop Cyberkinetics" = 'modular_septic/icons/mob/human/augments/bshipc.dmi',
	"Bishop Cyberkinetics 2.0" = 'modular_septic/icons/mob/human/augments/bs2ipc.dmi',
	"Hephaestus Industries" = 'modular_septic/icons/mob/human/augments/hsiipc.dmi',
	"Hephaestus Industries 2.0" = 'modular_septic/icons/mob/human/augments/hi2ipc.dmi',
	"Shellguard Munitions Standard Series" = 'modular_septic/icons/mob/human/augments/sgmipc.dmi',
	"Ward-Takahashi Manufacturing" = 'modular_septic/icons/mob/human/augments/wtmipc.dmi',
	"Xion Manufacturing Group" = 'modular_septic/icons/mob/human/augments/xmgipc.dmi',
	"Xion Manufacturing Group 2.0" = 'modular_septic/icons/mob/human/augments/xm2ipc.dmi',
	"Zeng-Hu Pharmaceuticals" = 'modular_septic/icons/mob/human/augments/zhpipc.dmi'
))

GLOBAL_LIST_EMPTY(culture_birthsigns)

GLOBAL_LIST_EMPTY(customizable_races)

GLOBAL_LIST_INIT(food_tastes, list(
		"Meat" = MEAT,
		"Vegetables" = VEGETABLES,
		"Raw" = RAW,
		"Junk Food" = JUNKFOOD,
		"Grain" = GRAIN,
		"Fruit" = FRUIT,
		"Dairy" = DAIRY,
		"Fried" = FRIED,
		"Alcohol" = ALCOHOL,
		"Sugar" = SUGAR,
		"Gross" = GROSS,
		"Toxic" = TOXIC,
		"Pineapple" = PINEAPPLE,
		"Breakfast" = BREAKFAST,
		"Cloth" = CLOTH,
		"Nuts" = NUTS,
		"Sewage" = SEWAGE,
	))

GLOBAL_LIST_INIT(genital_sets, list(
	GENITALS_MALE = GENITAL_SET_MALE,
	GENITALS_FEMALE = GENITAL_SET_FEMALE,
	GENITALS_CUNTBOY = GENITAL_SET_CUNTBOY,
	GENITALS_DICKGIRL = GENITAL_SET_DICKGIRL,
	GENITALS_FUTA = GENITAL_SET_FUTA,
))


code:
//list of all cold objects, that freeze organs when inside
GLOBAL_LIST_INIT(freezing_objects, typecacheof(list(/obj/structure/closet/crate/freezer, /obj/structure/closet/secure_closet/freezer, /obj/structure/bodycontainer, /obj/item/autosurgeon, /obj/machinery/smartfridge/organ)))
GLOBAL_LIST_INIT(creamed_types, typesof(/datum/component/creamed))


code:
GLOBAL_LIST_INIT(path_to_wield_info, world.setup_wield_info())

/world/proc/setup_wield_info()
	. = list()
	for(var/thing in init_subtypes(/datum/wield_info))
		var/datum/wield_info/wield_info = thing
		.[wield_info.type] = wield_info


code:
GLOBAL_VAR_INIT(brazil_ooc_color, "#00b300")
GLOBAL_VAR_INIT(niger_ooc_color, "#85be00")
GLOBAL_VAR_INIT(ukraine_ooc_color, "#85be00")
GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8")
GLOBAL_VAR_INIT(OOC_COLOR, "[COLOR_THEME_CODEC_GREEN]") //If this is null, use the CSS for OOC
GLOBAL_VAR_INIT(connection_ooc_color, "[COLOR_THEME_CODEC_BLUE]")


code: GLOBAL_DATUM_INIT(breathing_sound, /sound, sound('modular_septic/sound/misc/tank_breathe.ogg', FALSE, 0, 40))