diff --git a/hyperstation/code/obj/condom.dm b/hyperstation/code/obj/condom.dm
new file mode 100644
index 00000000..41c645ff
--- /dev/null
+++ b/hyperstation/code/obj/condom.dm
@@ -0,0 +1,103 @@
+//Made by quotefox
+//Really needs some work, mainly because condoms should be a container for semen, but I dont know how that works yet. Feel free to improve upon.
+
+/obj/item/condom
+ name = "condom"
+ desc = "Dont be silly, cover your willy!"
+ icon = 'hyperstation/icons/obj/condom.dmi'
+ throwforce = 0
+ icon_state = "b_condom_wrapped"
+ var/unwrapped = 0
+ w_class = WEIGHT_CLASS_TINY
+
+/obj/item/condom/attack_self(mob/user) //Unwrap The Condom in hands
+ if(!istype(user))
+ return
+ if(isliving(user))
+ if(unwrapped == 0)
+ icon_state = "b_condom"
+ unwrapped = 1
+ to_chat(user, "You unwrap the condom.")
+ playsound(user, 'sound/items/poster_ripped.ogg', 50, 1, -1)
+ return
+ if(unwrapped == 1)
+ new /obj/item/clothing/head/condom(usr.loc)
+ qdel(src)
+ to_chat(user, "You roll the condom out.")
+ playsound(user, 'sound/lewd/latex.ogg', 50, 1, -1)
+ return
+
+/obj/item/condom/attack(mob/living/carbon/C, mob/living/user) //apply the johnny on another person or yourself
+
+ if(unwrapped == 0 )
+ to_chat(user, "You must remove the condom from the package first!")
+ return
+ var/obj/item/organ/genital/penis/P = C.getorganslot("penis")
+ if(P&&P.is_exposed())
+ if(P.condom)
+ to_chat(user, "They already have a condom on!")
+ return
+ if(isliving(C)&&isliving(user)&&unwrapped == 1)
+ C.visible_message("[user] is trying to put a condom on [C]!",\
+ "[user] is trying to put a condom on you!")
+ if(!do_mob(user, C, 4 SECONDS)) //if Failed to put the condom on
+ return
+ var/mob/living/carbon/human/L = C
+ playsound(C, 'sound/lewd/latex.ogg', 50, 1, -1)
+ P.condom = 1 //apply condom
+ P.colourtint = "87ceeb"
+ if(L)
+ L.update_genitals() // apply the colour!
+ to_chat(C, "Your penis feels more safe!")
+ qdel(src)
+
+ return
+ to_chat(user, "You can't find anywhere to put the condom on.") //Trying to put it on something without/or with a hidden
+
+/obj/item/clothing/head/condom //this is ss13, it would be a sin to not include this..
+ name = "condom"
+ icon = 'hyperstation/icons/obj/condom.dmi'
+ desc = "Looks like someone had abit of some fun!"
+ alternate_worn_icon = 'hyperstation/icons/obj/clothing/head.dmi'
+ icon_state = "b_condom_out"
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 5, "rad" = 0, "fire" = 0, "acid" = 0)
+
+
+/mob/living/carbon/human/proc/removecondom()
+
+ var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
+ if(P.condom)
+ new /obj/item/clothing/head/condom(usr.loc)
+ to_chat(src, "The condom slips off the end of your penis.")
+ P.condom = 0
+ P.colourtint = ""
+ src.update_genitals()
+
+/obj/item/condom/filled
+ name = "filled condom"
+ icon_state = "b_condom_inflated"
+ unwrapped = 2
+ w_class = WEIGHT_CLASS_TINY
+
+/obj/item/condom/filled/throw_impact(atom/hit_atom)
+ . = ..()
+ if(!.) //if we're not being caught
+ splat(hit_atom)
+
+/obj/item/condom/filled/proc/splat(atom/movable/hit_atom)
+ if(isliving(loc))
+ return
+ var/turf/T = get_turf(hit_atom)
+ new/obj/effect/decal/cleanable/semen(T)
+ playsound(T, "sound/misc/splort", 50, TRUE)
+ qdel(src)
+
+/mob/living/carbon/human/proc/condomclimax()
+
+ var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
+ if(P.condom)
+ new /obj/item/condom/filled(usr.loc)
+ to_chat(src, "The condom bubbled outwards and filled with your cum.")
+ P.condom = 0
+ P.colourtint = ""
+ src.update_genitals()
\ No newline at end of file
diff --git a/hyperstation/icons/obj/clothing/head.dmi b/hyperstation/icons/obj/clothing/head.dmi
index 7fee1914..aa31b4fb 100644
Binary files a/hyperstation/icons/obj/clothing/head.dmi and b/hyperstation/icons/obj/clothing/head.dmi differ
diff --git a/hyperstation/icons/obj/condom.dmi b/hyperstation/icons/obj/condom.dmi
index e4a246bd..0646484a 100644
Binary files a/hyperstation/icons/obj/condom.dmi and b/hyperstation/icons/obj/condom.dmi differ
diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm
index f9239206..a621f249 100644
--- a/modular_citadel/code/game/machinery/vending.dm
+++ b/modular_citadel/code/game/machinery/vending.dm
@@ -42,6 +42,7 @@
product_slogans = "Kinky!;Sexy!;Check me out, big boy!"
vend_reply = "Have fun, you shameless pervert!"
products = list(
+ /obj/item/condom = 10,
/obj/item/clothing/head/maidband = 5,
/obj/item/clothing/under/maid = 5,
/obj/item/clothing/under/stripper_pink = 5,
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
index 4044f146..752ad0bb 100644
--- a/modular_citadel/code/modules/arousal/arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -238,7 +238,12 @@
/mob/living/carbon/human/proc/mob_masturbate(obj/item/organ/genital/G, mb_time = 30) //Masturbation, keep it gender-neutral
var/total_fluids = 0
var/datum/reagents/fluid_source = null
+ var/condomed = 0
+ if(G.name == "penis")//if the select organ is a penis
+ var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
+ if(P.condom) //if the penis is condomed
+ condomed = 1
if(G.producing) //Can it produce its own fluids, such as breasts?
fluid_source = G.reagents
else
@@ -253,12 +258,20 @@
"You start to [G.masturbation_verb] your [G.name].")
if(do_after(src, mb_time, target = src))
- if(total_fluids > 5)
+ if(total_fluids > 5 &&!condomed)
fluid_source.reaction(src.loc, TOUCH, 1, 0)
fluid_source.clear_reagents()
- src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \
+ if(!condomed)
+ src.visible_message("[src] orgasms, cumming[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""]!", \
"You cum[istype(src.loc, /turf/open/floor) ? " onto [src.loc]" : ""].", \
"You have relieved yourself.")
+ if(condomed) //condomed
+ src.visible_message("[src] orgasms, climaxing into [p_their()] condom ", \
+ "You cum into your condom.", \
+ "You have relieved yourself.")
+ if(total_fluids > 0 &&condomed)
+ src.condomclimax()
+
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
if(G.can_climax)
setArousalLoss(min_arousal)
@@ -331,7 +344,6 @@
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
if(G.can_climax)
-
setArousalLoss(min_arousal)
else //knots and other non-spilling orgasms
@@ -347,13 +359,14 @@
if(G.can_climax)
setArousalLoss(min_arousal)
+
if(impreg)
//Role them odds, only people with the dicks can send the chance to the person with the settings enabled at the momment.
var/obj/item/organ/genital/womb/W = L.getorganslot("womb")
if (L.breedable == 1 && W.pregnant == 0) //Dont get pregnant again, if you are pregnant.
log_game("Debug: [L] has been impregnated by [src]")
to_chat(L, "You feel your hormones change, and a motherly instinct take over.") //leting them know magic has happened.
- W.pregnant = 1 //self insert fetish
+ W.pregnant = 1
var/obj/item/organ/genital/breasts/B = L.getorganslot("womb")
@@ -366,6 +379,12 @@
var/total_fluids = 0
var/datum/reagents/fluid_source = null
+
+ if(G.name == "penis")//if the select organ is a penis
+ var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
+ if(P.condom) //if the penis is condomed
+ to_chat(src, "You cannot fill containers when there is a condom over your [G.name].")
+ return
if(G.producing) //Can it produce its own fluids, such as breasts?
fluid_source = G.reagents
else
@@ -515,9 +534,27 @@
return
//Ok, now we check what they want to do.
- var/choice = input(src, "Select sexual activity", "Sexual activity:") in list("Masturbate", "Climax alone", "Climax with partner", "Fill container")
+ var/choice = input(src, "Select sexual activity", "Sexual activity:") in list("Masturbate", "Climax alone", "Climax with partner", "Fill container", "Remove condom")
switch(choice)
+ if("Remove condom")
+ if(restrained(TRUE)) //TRUE ignores grabs
+ to_chat(src, "You can't do that while restrained!")
+ return
+ var/free_hands = get_num_arms()
+ if(!free_hands)
+ to_chat(src, "You need at least one free arm.")
+ return
+ var/obj/item/organ/genital/penis/P = src.getorganslot("penis")
+ if(!P.condom)
+ to_chat(src, "You don't have a condom on!")
+ return
+ if(P.condom)
+ to_chat(src, "You tug the condom off the end of your penis!")
+ src.removecondom()
+ return
+ return
+
if("Masturbate")
if(restrained(TRUE)) //TRUE ignores grabs
to_chat(src, "You can't do that while restrained!")
@@ -573,7 +610,8 @@
if(picked_organ)
var/mob/living/partner = pick_partner() //Get someone
if(partner)
- if(partner.breedable == 1 && picked_organ.name == "penis")
+ var/obj/item/organ/genital/penis/P = picked_organ
+ if(partner.breedable == 1 && picked_organ.name == "penis"&&!P.condom == 1)
var/impreg = input(src, "Would this action carry the risk of pregnancy?", "Choose a option", "Yes") as anything in list("Yes", "No")
if(impreg == "Yes") //If we are impregging
var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as anything in list("Yes", "No")
diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm
index 5b4f0929..436fdfbc 100644
--- a/modular_citadel/code/modules/arousal/organs/genitals.dm
+++ b/modular_citadel/code/modules/arousal/organs/genitals.dm
@@ -21,6 +21,7 @@
var/through_clothes = FALSE
var/internal = FALSE
var/hidden = FALSE
+ var/colourtint = ""
/obj/item/organ/genital/Initialize()
. = ..()
@@ -355,6 +356,7 @@
var/list/standing = list()
var/size
var/aroused_state
+ var/colourtint
for(var/L in relevant_layers) //Less hardcode
H.remove_overlay(L)
@@ -374,6 +376,7 @@
var/datum/sprite_accessory/S
size = G.size
aroused_state = G.aroused_state
+ colourtint = G.colourtint
switch(G.type)
if(/obj/item/organ/genital/penis)
S = GLOB.cock_shapes_list[G.shape]
@@ -399,10 +402,14 @@
if(use_skintones && H.dna.features["genitals_use_skintone"])
genital_overlay.color = "#[skintone2hex(H.skin_tone)]"
genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]-s_[aroused_state]_[layertext]"
+ if (colourtint)
+ genital_overlay.color = "#[colourtint]"
else
switch(S.color_src)
if("cock_color")
genital_overlay.color = "#[H.dna.features["cock_color"]]"
+ if (colourtint)
+ genital_overlay.color = "#[colourtint]"
if("balls_color")
genital_overlay.color = "#[H.dna.features["balls_color"]]"
if("breasts_color")
diff --git a/sound/lewd/latex.ogg b/sound/lewd/latex.ogg
new file mode 100644
index 00000000..d9a60224
Binary files /dev/null and b/sound/lewd/latex.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 8db13612..ff15b12a 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2903,6 +2903,7 @@
#include "hyperstation\code\modules\resize\sizechems.dm"
#include "hyperstation\code\modules\resize\sizegun.dm"
#include "hyperstation\code\obj\bluespace sewing kit.dm"
+#include "hyperstation\code\obj\condom.dm"
#include "hyperstation\code\obj\decal.dm"
#include "hyperstation\code\obj\fluff.dm"
#include "hyperstation\code\obj\kinkyclothes.dm"