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"