diff --git a/code/datums/ruins/space.dm b/code/datums/ruins/space.dm
index 3d4f6ade..b89e9453 100644
--- a/code/datums/ruins/space.dm
+++ b/code/datums/ruins/space.dm
@@ -316,4 +316,4 @@
id = "advancedlab"
suffix = "advancedlab.dmm"
name = "Abductor Replication Lab"
- description = "Some scientists tried and almost succeeded to recreate abductor tools. Somewhat slower and a bit less modern than their originals, these tools are the best you can get if you aren't an alien."
+ description = "Some scientists tried and almost succeeded to recreate abductor tools. Somewhat slower and a bit less modern than their originals, these tools are the best you can get if you aren't an alien."
\ No newline at end of file
diff --git a/code/game/area/areas/ruins/space.dm b/code/game/area/areas/ruins/space.dm
index d5ceb833..74b9e3a1 100644
--- a/code/game/area/areas/ruins/space.dm
+++ b/code/game/area/areas/ruins/space.dm
@@ -471,4 +471,4 @@
// Abductor Replication Lab
/area/ruin/space/has_grav/powered/advancedlab
name = "Abductor Replication Lab"
- icon_state = "yellow"
+ icon_state = "yellow"
\ No newline at end of file
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 48673f47..fbc30413 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -777,6 +777,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Testicles Color:
"
dat += " Change
"
dat += "Testicles showing:[features["balls_shape"]]"
+ dat += "Produces:[features["balls_fluid"]]"
dat += APPEARANCE_CATEGORY_COLUMN
dat += "
Vagina
"
dat += "[features["has_vag"] == TRUE ? "Yes" : "No"]"
@@ -807,7 +808,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Lactates:[features["breasts_producing"] == TRUE ? "Yes" : "No"]"
if(features["breasts_producing"] == TRUE)
dat += "Produces:[features["breasts_fluid"]]"
-
+
dat += ""
dat += ""
dat += ""
@@ -1996,6 +1997,12 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_shape)
features["balls_shape"] = new_shape
+ if("balls_fluid")
+ var/new_shape
+ new_shape = input(user, "Balls Fluid", "Character Preference") as null|anything in GLOB.genital_fluids_list
+ if(new_shape)
+ features["balls_fluid"] = new_shape
+
if("egg_size")
var/new_size
var/list/egg_sizes = list(1,2,3)
@@ -2023,7 +2030,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
new_shape = input(user, "Breast Shape", "Character Preference") as null|anything in GLOB.breasts_shapes_list
if(new_shape)
features["breasts_shape"] = new_shape
-
+
if("breasts_fluid")
var/new_shape
new_shape = input(user, "Breast Fluid", "Character Preference") as null|anything in GLOB.genital_fluids_list
diff --git a/hyperstation/code/modules/crafting/recipes.dm b/hyperstation/code/modules/crafting/recipes.dm
new file mode 100644
index 00000000..5be10633
--- /dev/null
+++ b/hyperstation/code/modules/crafting/recipes.dm
@@ -0,0 +1,11 @@
+/datum/crafting_recipe/milking_machine
+ name = "Milking Machine"
+ reqs = list(/obj/item/stack/cable_coil = 5, /obj/item/stack/rods = 2, /obj/item/stack/sheet/cardboard = 1, /obj/item/reagent_containers/glass/beaker = 2, /obj/item/stock_parts/manipulator = 1)
+ result = /obj/item/milking_machine
+ tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
+ category = CAT_MISC
+
+/datum/crafting_recipe/milking_machine/penis
+ name = "Penis Milking Machine"
+ reqs = list(/obj/item/stack/cable_coil = 5, /obj/item/stack/rods = 1, /obj/item/stack/sheet/cardboard = 1, /obj/item/reagent_containers/glass/beaker/large = 1, /obj/item/stock_parts/manipulator = 1)
+ result = /obj/item/milking_machine/penis
diff --git a/hyperstation/code/obj/milking machine.dm b/hyperstation/code/obj/milking machine.dm
new file mode 100644
index 00000000..87b56b8c
--- /dev/null
+++ b/hyperstation/code/obj/milking machine.dm
@@ -0,0 +1,83 @@
+/obj/item/milking_machine
+ icon = 'hyperstation/icons/obj/milking_machine.dmi'
+ name = "milking machine"
+ icon_state = "Off"
+ item_state = "Off"
+ desc = "A pocket sized pump and tubing assembly designed to collect and store products from mammary glands."
+
+ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_POCKET
+
+ var/on = FALSE
+ var/obj/item/reagent_containers/glass/inserted_item = null
+
+ var/transfer_rate = 0.25 // How much we transfer every 2 seconds
+ var/target_organ = "breasts" // What organ we are transfering from
+
+/obj/item/milking_machine/examine(mob/user)
+ . = ..()
+ to_chat(user, "[src] is currently [on ? "on" : "off"].")
+ if (inserted_item)
+ to_chat(user, "[inserted_item] contains [inserted_item.reagents.total_volume]/[inserted_item.reagents.maximum_volume] units")
+
+/obj/item/milker/attackby(obj/item/W, mob/user, params)
+ add_fingerprint(user)
+ if(istype(W, /obj/item/reagent_containers/glass) && !inserted_item)
+ if(!user.transferItemToLoc(W, src))
+ return ..()
+ inserted_item = W
+ UpdateIcon()
+ else
+ return ..()
+
+/obj/item/milking_machine/interact(mob/user)
+ if(!isAI(user) && inserted_item)
+ add_fingerprint(user)
+ on = !on
+ if (on)
+ to_chat(user, "You turn [src] on.")
+ START_PROCESSING(SSobj, src)
+ else
+ to_chat(user, "You turn [src] off.")
+ STOP_PROCESSING(SSobj, src)
+ UpdateIcon()
+ else
+ ..()
+
+/obj/item/milking_machine/proc/UpdateIcon()
+ icon_state = "[on ? "On" : "Off"][inserted_item ? "Beaker" : ""]"
+ item_state = icon_state
+
+
+/obj/item/milking_machine/AltClick(mob/living/user)
+ add_fingerprint(user)
+ user.put_in_hands(inserted_item)
+ inserted_item = null
+ on = FALSE
+ STOP_PROCESSING(SSobj, src)
+ UpdateIcon()
+
+/obj/item/milking_machine/process()
+ var/mob/living/carbon/W = loc
+ if (W)
+ var/obj/item/organ/genital/breasts/O = W.getorganslot(target_organ)
+ if (O)
+ if (O.reagents.total_volume >= transfer_rate * 2)
+ if (inserted_item.reagents.total_volume < inserted_item.reagents.maximum_volume)
+ O.reagents.trans_to(inserted_item.reagents, amount = transfer_rate)
+ else
+ to_chat(W, "[src] stops pumping. [inserted_item] is full.")
+ on = FALSE
+ STOP_PROCESSING(SSobj, src)
+ UpdateIcon()
+
+/obj/item/milking_machine/penis
+ name = "penis milking machine"
+ icon_state = "PenisOff"
+ item_state = "PenisOff"
+ desc = "A pocket sized pump and tubing assembly designed to collect and store products from the penis."
+
+ target_organ = "testicles" // Since semen is stored in the balls
+
+/obj/item/milking_machine/penis/UpdateIcon()
+ icon_state = "Penis[on ? "On" : "Off"][inserted_item ? "Beaker" : ""]"
+ item_state = icon_state
diff --git a/modular_citadel/icons/obj/milking machine.dmi b/hyperstation/icons/obj/milking_machine.dmi
similarity index 100%
rename from modular_citadel/icons/obj/milking machine.dmi
rename to hyperstation/icons/obj/milking_machine.dmi
diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm
index f4ef4b50..dd983e0e 100644
--- a/modular_citadel/code/modules/arousal/organs/testicles.dm
+++ b/modular_citadel/code/modules/arousal/organs/testicles.dm
@@ -9,6 +9,9 @@
var/size_name = "average"
shape = "single"
var/sack_size = BALLS_SACK_SIZE_DEF
+ var/cached_size = 6
+ fluid_mult = 0.133 // Set to a lower value due to production scaling with size (I.E. 6 inches the "normal" amount)
+ fluid_max_volume = 3
fluid_id = "semen"
producing = TRUE
can_masturbate_with = FALSE
@@ -19,15 +22,14 @@
/obj/item/organ/genital/testicles/on_life()
if(QDELETED(src))
return
- if(reagents && producing)
+ if(!reagents || !owner)
+ return
+ reagents.maximum_volume = fluid_max_volume * cached_size// 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_cum()
/obj/item/organ/genital/testicles/proc/generate_cum()
@@ -42,7 +44,7 @@
if(!linked_organ)
return FALSE
reagents.isolate_reagent(fluid_id)//remove old reagents if it changed and just clean up generally
- reagents.add_reagent(fluid_id, (fluid_mult * fluid_rate))//generate the cum
+ reagents.add_reagent(fluid_id, (fluid_rate))//generate the cum
/obj/item/organ/genital/testicles/update_link()
if(owner && !QDELETED(src))
@@ -50,7 +52,8 @@
if(linked_organ)
linked_organ.linked_organ = src
size = linked_organ.size
-
+ var/obj/item/organ/genital/penis/O = linked_organ
+ cached_size = O.length
else
if(linked_organ)
linked_organ.linked_organ = null
diff --git a/modular_citadel/code/modules/crafting/recipes.dm b/modular_citadel/code/modules/crafting/recipes.dm
index ccdfb480..bf04f706 100644
--- a/modular_citadel/code/modules/crafting/recipes.dm
+++ b/modular_citadel/code/modules/crafting/recipes.dm
@@ -10,14 +10,3 @@
result = /obj/item/aicard/potato
category = CAT_ROBOT
-/datum/crafting_recipe/milker
- name = "Milking Machine"
- reqs = list(/obj/item/stack/cable_coil = 5, /obj/item/stack/sheet/plastic = 2, /obj/item/stack/rods = 2, /obj/item/stack/sheet/cardboard = 1, /obj/item/reagent_containers/glass/beaker = 2, /obj/item/stock_parts/manipulator = 1)
- result = /obj/item/milker
- tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WIRECUTTER)
- category = CAT_MISC
-
-/datum/crafting_recipe/milker/penis
- name = "Penis Milking Machine"
- reqs = list(/obj/item/stack/cable_coil = 5, /obj/item/stack/sheet/plastic = 2, /obj/item/stack/rods = 1, /obj/item/stack/sheet/cardboard = 1, /obj/item/reagent_containers/glass/beaker/large = 1, /obj/item/stock_parts/manipulator = 1)
- result = /obj/item/milker/penis
diff --git a/modular_citadel/code/modules/reagents/reagent container/milking machine.dm b/modular_citadel/code/modules/reagents/reagent container/milking machine.dm
index 3f070be4..057c657e 100644
--- a/modular_citadel/code/modules/reagents/reagent container/milking machine.dm
+++ b/modular_citadel/code/modules/reagents/reagent container/milking machine.dm
@@ -9,7 +9,7 @@
var/on = FALSE
var/obj/item/reagent_containers/glass/inserted_item = null
-
+
var/transfer_rate = 0.25 // How much we transfer every 2 seconds
var/target_organ = "breasts" // What organ we are transfering from
@@ -42,11 +42,11 @@
UpdateIcon()
else
..()
-
+
/obj/item/milker/proc/UpdateIcon()
icon_state = "[on ? "On" : "Off"][inserted_item ? "Beaker" : ""]"
item_state = icon_state
-
+
/obj/item/milker/AltClick(mob/living/user)
add_fingerprint(user)
@@ -75,9 +75,9 @@
icon_state = "PenisOff"
item_state = "PenisOff"
desc = "A pocket sized pump and tubing assembly designed to collect and store products from the penis."
-
+
target_organ = "testicles" // Since semen is stored in the balls
-
+
/obj/item/milker/penis/UpdateIcon()
icon_state = "Penis[on ? "On" : "Off"][inserted_item ? "Beaker" : ""]"
item_state = icon_state
diff --git a/tgstation.dme b/tgstation.dme
index 360498ed..c99fcbcf 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2875,11 +2875,14 @@
#include "code\modules\zombie\items.dm"
#include "code\modules\zombie\organs.dm"
#include "hyperstation\code\gamemode\werewolf\werewolf.dm"
+#include "hyperstation\code\mobs\hugbot.dm"
#include "hyperstation\code\mobs\mimic.dm"
#include "hyperstation\code\mobs\werewolf.dm"
#include "hyperstation\code\modules\antagonists\werewolf\werewolf.dm"
+#include "hyperstation\code\modules\crafting\recipes.dm"
#include "hyperstation\code\obj\decal.dm"
#include "hyperstation\code\obj\fluff.dm"
+#include "hyperstation\code\obj\milking machine.dm"
#include "hyperstation\code\obj\plushes.dm"
#include "hyperstation\code\obj\pregnancytester.dm"
#include "hyperstation\code\obj\rewards.dm"
@@ -3020,6 +3023,7 @@
#include "modular_citadel\code\modules\clothing\under\trek_under.dm"
#include "modular_citadel\code\modules\clothing\under\turtlenecks.dm"
#include "modular_citadel\code\modules\clothing\under\under.dm"
+#include "modular_citadel\code\modules\crafting\recipes.dm"
#include "modular_citadel\code\modules\custom_loadout\custom_items.dm"
#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm"
#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm"