diff --git a/README.md b/README.md
new file mode 100644
index 00000000..c5b9cd86
--- /dev/null
+++ b/README.md
@@ -0,0 +1,177 @@
+## Hyper Station 13
+
+Based and maintained from Citadel Station.
+
+[](https://www.reddit.com/r/SS13/comments/5oplxp/what_is_the_main_problem_with_byond_as_an_engine/dclbu1a)
+
+[](http://www.krihelinator.xyz)
+
+[](http://isitmaintained.com/project/quotefox/Hyper-Station-13 "Percentage of issues still open") [](http://isitmaintained.com/project/quotefox/Hyper-Station-13 "Average time to resolve an issue")
+
+**Hyper Station Information**
+**Website:** http://hyperstation13.com
+**Code:** https://github.com/quotefox/Hyper-Station-13
+**Discord:** [Here](https://discord.gg/PCtX2fH).
+
+**Upstream Information**
+**/tg/ Station**
+**Website:** http://www.tgstation13.org
+**Code:** https://github.com/tgstation/tgstation
+**Wiki** http://tgstation13.org/wiki/Main_Page
+**IRC:** irc://irc.rizon.net/coderbus or if you dont have an IRC client, you can click [here](https://kiwiirc.com/client/irc.rizon.net:6667/?&theme=cli#coderbus).
+
+**Citadel Station**
+**Website:** http://citadel-station.net
+**Code:** https://github.com/Citadel-Station-13/Citadel-Station-13
+**Discord:** [Here](https://discord.gg/E6SQuhz).
+
+## DOWNLOADING
+
+There are a number of ways to download the source code. Some are described here, an alternative all-inclusive guide is also located at http://www.tgstation13.org/wiki/Downloading_the_source_code
+
+Option 1:
+Follow this: http://www.tgstation13.org/wiki/Setting_up_git
+
+Option 2: Download the source code as a zip by clicking the ZIP button in the
+code tab of https://github.com/tgstation/tgstation
+(note: this will use a lot of bandwidth if you wish to update and is a lot of
+hassle if you want to make any changes at all, so it's not recommended.)
+
+Option 3: Download a pre-compiled nightly at https://tgstation13.download/nightlies/ (same caveats as option 2)
+
+## INSTALLATION
+
+First-time installation should be fairly straightforward. First, you'll need
+BYOND installed. You can get it from https://www.byond.com/download. Once you've done
+that, extract the game files to wherever you want to keep them. This is a
+sourcecode-only release, so the next step is to compile the server files.
+Open tgstation.dme by double-clicking it, open the Build menu, and click
+compile. This'll take a little while, and if everything's done right you'll get
+a message like this:
+
+```
+saving tgstation.dmb (DEBUG mode)
+tgstation.dmb - 0 errors, 0 warnings
+```
+
+If you see any errors or warnings, something has gone wrong - possibly a corrupt
+download or the files extracted wrong. If problems persist, ask for assistance
+in irc://irc.rizon.net/coderbus
+
+Once that's done, open up the config folder. You'll want to edit config.txt to
+set the probabilities for different gamemodes in Secret and to set your server
+location so that all your players don't get disconnected at the end of each
+round. It's recommended you don't turn on the gamemodes with probability 0,
+except Extended, as they have various issues and aren't currently being tested,
+so they may have unknown and bizarre bugs. Extended is essentially no mode, and
+isn't in the Secret rotation by default as it's just not very fun.
+
+You'll also want to edit config/admins.txt to remove the default admins and add
+your own. "Game Master" is the highest level of access, and probably the one
+you'll want to use for now. You can set up your own ranks and find out more in
+config/admin_ranks.txt
+
+The format is
+
+```
+byondkey = Rank
+```
+
+where the admin rank must be properly capitalised.
+
+This codebase also depends on a native library called rust-g. A precompiled
+Windows DLL is included in this repository, but Linux users will need to build
+and install it themselves. Directions can be found at the [rust-g
+repo](https://github.com/tgstation13/rust-g).
+
+Finally, to start the server, run Dream Daemon and enter the path to your
+compiled tgstation.dmb file. Make sure to set the port to the one you
+specified in the config.txt, and set the Security box to 'Safe'. Then press GO
+and the server should start up and be ready to join. It is also recommended that
+you set up the SQL backend (see below).
+
+## UPDATING
+
+To update an existing installation, first back up your /config and /data folders
+as these store your server configuration, player preferences and banlist.
+
+Then, extract the new files (preferably into a clean directory, but updating in
+place should work fine), copy your /config and /data folders back into the new
+install, overwriting when prompted except if we've specified otherwise, and
+recompile the game. Once you start the server up again, you should be running
+the new version.
+
+## HOSTING
+
+If you'd like a more robust server hosting option for tgstation and its
+derivatives. Check out our server tools suite at
+https://github.com/tgstation/tgstation-server
+
+## MAPS
+
+/tg/station currently comes equipped with five maps.
+
+* [BoxStation (default)](http://tgstation13.org/wiki/Boxstation)
+* [MetaStation](https://tgstation13.org/wiki/MetaStation)
+* [DeltaStation](https://tgstation13.org/wiki/DeltaStation)
+* [OmegaStation](https://tgstation13.org/wiki/OmegaStation)
+* [PubbyStation](https://tgstation13.org/wiki/PubbyStation)
+
+
+All maps have their own code file that is in the base of the _maps directory. Maps are loaded dynamically when the game starts. Follow this guideline when adding your own map, to your fork, for easy compatibility.
+
+The map that will be loaded for the upcoming round is determined by reading data/next_map.json, which is a copy of the json files found in the _maps tree. If this file does not exist, the default map from config/maps.txt will be loaded. Failing that, BoxStation will be loaded. If you want to set a specific map to load next round you can use the Change Map verb in game before restarting the server or copy a json from _maps to data/next_map.json before starting the server. Also, for debugging purposes, ticking a corresponding map's code file in Dream Maker will force that map to load every round.
+
+If you are hosting a server, and want randomly picked maps to be played each round, you can enable map rotation in [config.txt](config/config.txt) and then set the maps to be picked in the [maps.txt](config/maps.txt) file.
+
+Anytime you want to make changes to a map it's imperative you use the [Map Merging tools](http://tgstation13.org/wiki/Map_Merger)
+
+## AWAY MISSIONS
+
+/tg/station supports loading away missions however they are disabled by default.
+
+Map files for away missions are located in the _maps/RandomZLevels directory. Each away mission includes it's own code definitions located in /code/modules/awaymissions/mission_code. These files must be included and compiled with the server beforehand otherwise the server will crash upon trying to load away missions that lack their code.
+
+To enable an away mission open `config/awaymissionconfig.txt` and uncomment one of the .dmm lines by removing the #. If more than one away mission is uncommented then the away mission loader will randomly select one the enabled ones to load.
+
+## SQL SETUP
+
+The SQL backend requires a Mariadb server running 10.2 or later. Mysql is not supported but Mariadb is a drop in replacement for mysql. SQL is required for the library, stats tracking, admin notes, and job-only bans, among other features, mostly related to server administration. Your server details go in /config/dbconfig.txt, and the SQL schema is in /SQL/tgstation_schema.sql and /SQL/tgstation_schema_prefix.sql depending on if you want table prefixes. More detailed setup instructions are located here: https://www.tgstation13.org/wiki/Downloading_the_source_code#Setting_up_the_database
+
+## WEB/CDN RESOURCE DELIVERY
+
+Web delivery of game resources makes it quicker for players to join and reduces some of the stress on the game server.
+
+1. Edit compile_options.dm to set the `PRELOAD_RSC` define to `0`
+1. Add a url to config/external_rsc_urls pointing to a .zip file containing the .rsc.
+ * If you keep up to date with /tg/ you could reuse /tg/'s rsc cdn at http://tgstation13.download/byond/tgstation.zip. Otherwise you can use cdn services like CDN77 or cloudflare (requires adding a page rule to enable caching of the zip), or roll your own cdn using route 53 and vps providers.
+ * Regardless even offloading the rsc to a website without a CDN will be a massive improvement over the in game system for transferring files.
+
+## IRC BOT SETUP
+
+Included in the repository is a python3 compatible IRC bot capable of relaying adminhelps to a specified
+IRC channel/server, see the /tools/minibot folder for more
+
+## CONTRIBUTING
+
+Please see [CONTRIBUTING.md](.github/CONTRIBUTING.md)
+
+## LICENSE
+
+All code after [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU AGPL v3](http://www.gnu.org/licenses/agpl-3.0.html).
+
+All code before [commit 333c566b88108de218d882840e61928a9b759d8f on 2014/31/12 at 4:38 PM PST](https://github.com/tgstation/tgstation/commit/333c566b88108de218d882840e61928a9b759d8f) is licensed under [GNU GPL v3](https://www.gnu.org/licenses/gpl-3.0.html).
+(Including tools unless their readme specifies otherwise.)
+
+See LICENSE and GPLv3.txt for more details.
+
+tgui clientside is licensed as a subproject under the MIT license.
+Font Awesome font files, used by tgui, are licensed under the SIL Open Font License v1.1
+tgui assets are licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](http://creativecommons.org/licenses/by-sa/4.0/).
+The TGS3 API is licensed as a subproject under the MIT license.
+
+See tgui/LICENSE.md for the MIT license.
+See tgui/assets/fonts/SIL-OFL-1.1-LICENSE.md for the SIL Open Font License.
+See the footers of code/\_\_DEFINES/server\_tools.dm, code/modules/server\_tools/st\_commands.dm, and code/modules/server\_tools/st\_inteface.dm for the MIT license.
+
+All assets including icons and sound are under a [Creative Commons 3.0 BY-SA license](http://creativecommons.org/licenses/by-sa/3.0/) unless otherwise indicated.
diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index da5981ff..e4d902f1 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -21,9 +21,9 @@
#define COCK_SIZE_MIN 1
#define COCK_SIZE_MAX 20
-#define COCK_GIRTH_RATIO_MAX 1.25
-#define COCK_GIRTH_RATIO_DEF 0.75
-#define COCK_GIRTH_RATIO_MIN 0.5
+#define COCK_GIRTH_RATIO_MAX 0.6
+#define COCK_GIRTH_RATIO_DEF 0.25
+#define COCK_GIRTH_RATIO_MIN 0.2
#define KNOT_GIRTH_RATIO_MAX 3
#define KNOT_GIRTH_RATIO_DEF 2.1
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index f2a86883..7a2fa674 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -527,6 +527,21 @@
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
flags_inv = HIDEHAIR|HIDEEARS
+/obj/item/clothing/suit/hooded/wintercoat/centcom
+ name = "centcom winter coat"
+ icon_state = "coatcentcom"
+ item_state = "coatcentcom"
+ armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/centcom
+
+/obj/item/clothing/suit/hooded/wintercoat/centcom/Initialize()
+ . = ..()
+ allowed = GLOB.security_wintercoat_allowed
+
+/obj/item/clothing/head/hooded/winterhood/centcom
+ icon_state = "winterhood_centcom"
+ armor = list("melee" = 40, "bullet" = 45, "laser" = 45, "energy" = 35, "bomb" = 40, "bio" = 25, "rad" = 25, "fire" = 35, "acid" = 50)
+
/obj/item/clothing/suit/hooded/wintercoat/captain
name = "captain's winter coat"
icon_state = "coatcaptain"
@@ -745,6 +760,16 @@
/obj/item/clothing/head/hooded/winterhood/qm
icon_state = "winterhood_qm"
+/obj/item/clothing/suit/hooded/wintercoat/aformal
+ name = "assistant's formal winter coat"
+ icon_state = "coataformal"
+ item_state = "coataformal"
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter,/obj/item/clothing/gloves/color/yellow)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/aformal
+
+/obj/item/clothing/head/hooded/winterhood/aformal
+ icon_state = "winterhood_aformal"
+
/obj/item/clothing/suit/hooded/wintercoat/miner
name = "mining winter coat"
icon_state = "coatminer"
@@ -756,6 +781,73 @@
/obj/item/clothing/head/hooded/winterhood/miner
icon_state = "winterhood_miner"
+/obj/item/clothing/suit/hooded/wintercoat/ratvar
+ name = "ratvarian winter coat"
+ icon_state = "coatratvar"
+ item_state = "coatratvar"
+ armor = list("melee" = 30, "bullet" = 45, "laser" = -10, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 60, "acid" = 60)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/clockwork/replica_fabricator, /obj/item/clockwork/integration_cog, /obj/item/clockwork/slab, /obj/item/clockwork/weapon/ratvarian_spear)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/ratvar
+ var/real = TRUE
+
+/obj/item/clothing/head/hooded/winterhood/ratvar
+ icon_state = "winterhood_ratvar"
+ light_range = 3
+ light_power = 1
+ light_color = "#B18B25" //clockwork slab background top color
+
+/obj/item/clothing/suit/hooded/wintercoat/ratvar/equipped(mob/living/user,slot)
+ ..()
+ if (slot != SLOT_WEAR_SUIT || !real)
+ return
+ if (is_servant_of_ratvar(user))
+ return
+ else
+ user.dropItemToGround(src)
+ to_chat(user,"\"Amusing that you think you are fit to wear this.\"")
+ to_chat(user,"Your skin burns where the coat touched your skin!")
+ user.adjustFireLoss(rand(10,16))
+
+/obj/item/clothing/suit/hooded/wintercoat/narsie
+ name = "narsian winter coat"
+ icon_state = "coatnarsie"
+ item_state = "coatnarsie"
+ armor = list("melee" = 30, "bullet" = 20, "laser" = 30,"energy" = 10, "bomb" = 30, "bio" = 10, "rad" = 10, "fire" = 30, "acid" = 30)
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/restraints/legcuffs/bola/cult,/obj/item/melee/cultblade,/obj/item/melee/cultblade/dagger,/obj/item/reagent_containers/glass/beaker/unholywater,/obj/item/cult_shift,/obj/item/flashlight/flare/culttorch,/obj/item/twohanded/cult_spear)
+ hoodtype = /obj/item/clothing/head/hooded/winterhood/narsie
+ var/real = TRUE
+
+/obj/item/clothing/suit/hooded/wintercoat/narsie/equipped(mob/living/user,slot)
+ ..()
+ if (slot != SLOT_WEAR_SUIT || !real)
+ return
+ if (iscultist(user))
+ return
+ else
+ user.dropItemToGround(src)
+ to_chat(user,"\"You are not fit to wear my follower's coat!\"")
+ to_chat(user,"Sharp spines jab you from within the coat!")
+ user.adjustBruteLoss(rand(10,16))
+
+/obj/item/clothing/head/hooded/winterhood/narsie
+ icon_state = "winterhood_narsie"
+
+/obj/item/clothing/suit/hooded/wintercoat/ratvar/fake
+ name = "brass winter coat"
+ icon_state = "coatratvar"
+ item_state = "coatratvar"
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ real = FALSE
+
+/obj/item/clothing/suit/hooded/wintercoat/narsie/fake
+ name = "runed winter coat"
+ icon_state = "coatnarsie"
+ item_state = "coatnarsie"
+ allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter)
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ real = FALSE
+
/obj/item/clothing/suit/spookyghost
name = "spooky ghost"
desc = "This is obviously just a bedsheet, but maybe try it on?"
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index 3afe64a9..3fdbacc9 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -261,7 +261,7 @@
desc = "A wing ripped from a watcher. Suitable as a trophy for a kinetic crusher."
icon_state = "watcher_wing"
denied_type = /obj/item/crusher_trophy/watcher_wing
- bonus_value = 10
+ bonus_value = 50
/obj/item/crusher_trophy/watcher_wing/effect_desc()
return "mark detonation to prevent certain creatures from using certain attacks for [bonus_value*0.1] second\s"
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index 82238701..0345fe82 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -4,7 +4,7 @@
say_mod = "rattles"
sexes = 0
meat = /obj/item/stack/sheet/mineral/plasma
- species_traits = list(NOBLOOD,NOTRANSSTING,NOGENITALS)
+ species_traits = list(NOBLOOD,NOTRANSSTING)
inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_RADIMMUNE,TRAIT_NOHUNGER)
inherent_biotypes = list(MOB_INORGANIC, MOB_HUMANOID)
mutantlungs = /obj/item/organ/lungs/plasmaman
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index add7128d..9eb5de65 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 4376b9aa..e4b6f7da 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 24909c0c..57530d4c 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 36c3465d..60b6d2b7 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm
index 3df22187..7dfa025a 100644
--- a/modular_citadel/code/modules/arousal/organs/breasts.dm
+++ b/modular_citadel/code/modules/arousal/organs/breasts.dm
@@ -14,35 +14,49 @@
var/statuscheck = FALSE
fluid_id = "milk"
var/amount = 2
+ fluid_mult = 0.25 // Set to a lower value due to production scaling with size (I.E. D cups produce the "normal" amount)
producing = TRUE
shape = "Pair"
can_masturbate_with = TRUE
masturbation_verb = "massage"
can_climax = TRUE
fluid_transfer_factor = 0.5
+ var/sent_full_message = TRUE //defaults to 1 since they're full to start
/obj/item/organ/genital/breasts/on_life()
if(QDELETED(src))
return
if(!reagents || !owner)
return
- reagents.maximum_volume = fluid_max_volume
+ reagents.maximum_volume = fluid_max_volume * cached_size * fluid_mult // fluid amount is also scaled by the size of the organ
if(fluid_id && producing)
if(reagents.total_volume == 0) // Apparently, 0.015 gets rounded down to zero and no reagents are created if we don't start it with 0.1 in the tank.
fluid_rate = 0.1
else
- fluid_rate = CUM_RATE
- if(reagents.total_volume >= 5)
- fluid_mult = 0.5
- else
- fluid_mult = 1
+ fluid_rate = CUM_RATE * cached_size * fluid_mult // fluid rate is scaled by the size of the organ
generate_milk()
/obj/item/organ/genital/breasts/proc/generate_milk()
if(owner.stat == DEAD)
return FALSE
+ if(reagents.total_volume >= reagents.maximum_volume)
+ if(!sent_full_message)
+ send_full_message()
+ sent_full_message = TRUE
+ return FALSE
+ sent_full_message = FALSE
reagents.isolate_reagent(fluid_id)
- reagents.add_reagent(fluid_id, (fluid_mult * fluid_rate))
+ reagents.add_reagent(fluid_id, (fluid_rate))
+
+/obj/item/organ/genital/breasts/proc/send_full_message(msg = "Your breasts finally feel full, again.")
+ if(owner && istext(msg))
+ to_chat(owner, msg)
+ return TRUE
+
+/obj/item/organ/genital/breasts/proc/send_full_message(msg = "Your breasts finally feel full, again.")
+ if(owner && istext(msg))
+ to_chat(owner, msg)
+ return TRUE
/obj/item/organ/genital/breasts/update_appearance()
var/lowershape = lowertext(shape)
@@ -64,7 +78,7 @@
desc += " You estimate that they're [uppertext(size)]-cups."
//string = "breasts_[lowertext(shape)]_[size]-s"
- if(producing && aroused_state)
+ if(producing && sent_full_message)
desc += " They're leaking [fluid_id]."
var/string
if(owner)
@@ -91,7 +105,6 @@
//this is far too lewd wah
/obj/item/organ/genital/breasts/update_size()//wah
-
if(!ishuman(owner) || !owner)
return
if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!fixed
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
index 43a512ac..8d7a9e24 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -12,8 +12,8 @@
size = 2 //arbitrary value derived from length and girth for sprites.
var/length = 6 //inches
var/cached_length //used to detect a change in length
- var/girth = 4.38
- var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm
+ var/girth = 1.5
+ var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.25; check citadel_defines.dm; why was it .73?
var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
var/list/dickflags = list()
var/list/knotted_types = list("knotted", "barbed, knotted")
diff --git a/modular_citadel/code/modules/client/loadout/suit.dm b/modular_citadel/code/modules/client/loadout/suit.dm
index cf9627ce..bcbd8f4d 100644
--- a/modular_citadel/code/modules/client/loadout/suit.dm
+++ b/modular_citadel/code/modules/client/loadout/suit.dm
@@ -64,6 +64,21 @@
category = SLOT_WEAR_SUIT
path = /obj/item/clothing/suit/hooded/wintercoat
+/datum/gear/coat/aformal
+ name = "Assistant's formal winter coat"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/hooded/wintercoat/aformal
+
+/datum/gear/coat/runed
+ name = "Runed winter coat"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/hooded/wintercoat/narsie/fake
+
+/datum/gear/coat/brass
+ name = "Brass winter coat"
+ category = SLOT_WEAR_SUIT
+ path = /obj/item/clothing/suit/hooded/wintercoat/ratvar/fake
+
/datum/gear/militaryjacket
name = "Military Jacket"
category = SLOT_WEAR_SUIT
diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
index 0e823a65..38751db9 100644
--- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
+++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
@@ -85,6 +85,36 @@
S = new(T)
if(data["blood_DNA"])
S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
+
+/datum/reagent/consumable/milk/reaction_turf(turf/T, reac_volume)
+ if(!istype(T))
+ return
+ if(reac_volume < 3)
+ return
+
+ var/obj/effect/decal/cleanable/milk/S = locate() in T
+ if(!S)
+ S = new(T)
+ if(data["blood_DNA"])
+ S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
+
+/obj/effect/decal/cleanable/milk
+ name = "milk"
+ desc = null
+ gender = PLURAL
+ density = 0
+ layer = ABOVE_NORMAL_TURF_LAYER
+ icon = 'modular_citadel/icons/obj/genitals/effects.dmi'
+ icon_state = "milk1"
+ random_icon_states = list("milk1", "milk2", "milk3", "milk4")
+
+/obj/effect/decal/cleanable/milk/New()
+ ..()
+ dir = pick(1,2,4,8)
+ add_blood_DNA(list("Non-human DNA" = "A+"))
+
+/obj/effect/decal/cleanable/milk/replace_decal(obj/effect/decal/cleanable/milk/S)
+ S.add_blood_DNA(return_blood_DNA())
//aphrodisiac & anaphrodisiac