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"