diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm index da4acc80..229898a7 100644 --- a/hyperstation/code/modules/arousal/arousalhud.dm +++ b/hyperstation/code/modules/arousal/arousalhud.dm @@ -7,30 +7,12 @@ . = ..() var/dat = {"Genitals

"} - //List genitals - var/obj/item/organ/genital/penis/P = user.getorganslot("penis") - if (P) //they have a pp - dat += "[P.mode == "hidden" ? "Penis (Hidden)" : (P.mode == "clothes" ? "Penis (Hidden by Clothes)" : (P.mode == "visable" ? "Penis (Visable)" : "Penis (Visable)"))]
" - - var/obj/item/organ/genital/testicles/T = user.getorganslot("testicles") - if (T) //they have teabags - if(!T.internal) - dat += "[T.mode == "hidden" ? "Testicles (Hidden)" : (T.mode == "clothes" ? "Testicles (Hidden by Clothes)" : (T.mode == "visable" ? "Testicles (Visable)" : "Testicles (Visable)"))]
" - else //internal balls - dat += "Internal Testicles
" - var/obj/item/organ/genital/vagina/V = user.getorganslot("vagina") - if (V) //they have a vjay - dat += "[V.mode == "hidden" ? "Vagina (Hidden)" : (V.mode == "clothes" ? "Vagina (Hidden by Clothes)" : (V.mode == "visable" ? "Vagina (Visable)" : "Vagina (Visable)"))]
" - - var/obj/item/organ/genital/breasts/B = user.getorganslot("breasts") - if (B) //they have a boobiedoo - dat += "[B.mode == "hidden" ? "Breasts (Hidden)" : (B.mode == "clothes" ? "Breasts (Hidden by Clothes)" : (B.mode == "visable" ? "Breasts (Visable)" : "Breasts (Visable)"))]
" - - var/obj/item/organ/genital/belly/E = user.getorganslot("belly") - if (E) - dat += "[E.mode == "hidden" ? "Belly (Hidden)" : (B.mode == "clothes" ? "Belly (Hidden by Clothes)" : (B.mode == "visable" ? "Belly (Visable)" : "Belly (Visable)"))]
" + var/mob/living/carbon/U = user + for(var/obj/item/organ/genital/G in U.internal_organs) + dat += "[G.mode == "hidden" ? "[G.name] (Hidden)" : (G.mode == "clothes" ? "[G.name] (Hidden by Clothes)" : (G.mode == "visable" ? "[G.name] (Visable)" : "[G.name] (Visable)"))]
" dat += {"
Contexual Options

"} + var/obj/item/organ/genital/penis/P = user.getorganslot("penis") //Options dat += "Masturbate" dat += "(Stimulate a sexual organ with your hands.)
" @@ -63,12 +45,16 @@ dat += "Impregnate [user.pulling]" dat += "(Climax inside another person, knocking them up.)
" - - if(P) // They have a dick (make sure to check or this will break everything) + //old code needs to be cleaned + if(P) if(P.condom == 1) - dat += "Remove Condom
" + dat += "Remove condom (penis)
" if(P.sounding == 1) - dat += "Remove Sounding Rod
" + dat += "Remove sounding rod (penis)
" + for(var/obj/item/organ/genital/G in U.internal_organs) + if(G.equipment) //they have equipment + dat += "Remove [G.equipment.name] ([G.name]).
" + dat += {"
"}//Newline for the objects //bottom options dat += "Refresh" @@ -197,6 +183,31 @@ if(href_list["removesound"]) H.menuremovesounding() + if(href_list["removeequipmentpenis"]) + var/obj/item/organ/genital/penis/O = usr.getorganslot("penis") + var/obj/item/I = O.equipment + usr.put_in_hands(I) + O.equipment = null + + if(href_list["removeequipmentbreasts"]) + var/obj/item/organ/genital/breasts/O = usr.getorganslot("breasts") + var/obj/item/I = O.equipment + usr.put_in_hands(I) + O.equipment = null + + + if(href_list["removeequipmentvagina"]) + var/obj/item/organ/genital/vagina/O = usr.getorganslot("vagina") + var/obj/item/I = O.equipment + usr.put_in_hands(I) + O.equipment = null + + if(href_list["removeequipmentbelly"]) + var/obj/item/organ/genital/belly/O = usr.getorganslot("belly") + var/obj/item/I = O.equipment + usr.put_in_hands(I) + O.equipment = null + if(href_list["omenu"]) usr << browse(null, "window=arousal") //closes the window H.mob_climax() @@ -313,7 +324,6 @@ obj/screen/arousal/proc/kiss() to_chat(src, "You cannot climax without choosing genitals.") return - /mob/living/carbon/human/proc/climaxwith(mob/living/T) var/mob/living/carbon/human/L = pick_partner() diff --git a/hyperstation/code/obj/economy.dm b/hyperstation/code/obj/economy.dm new file mode 100644 index 00000000..e69de29b diff --git a/hyperstation/code/obj/vibrator.dm b/hyperstation/code/obj/vibrator.dm new file mode 100644 index 00000000..532aeec4 --- /dev/null +++ b/hyperstation/code/obj/vibrator.dm @@ -0,0 +1,153 @@ +/obj/item/electropack/vibrator + name = "remote vibrator" + desc = "A remote device that can deliver pleasure at a fair. It has three intensities that can be set by twisting the base." + icon = 'hyperstation/icons/obj/vibrator.dmi' + icon_state = "vibe" + item_state = "vibe" + w_class = WEIGHT_CLASS_SMALL + slot_flags = ITEM_SLOT_DENYPOCKET //no more pocket shockers + var/mode = 1 + var/style = "long" + var/inside = FALSE + var/last = 0 + +/obj/item/electropack/vibrator/Initialize() //give the device its own code + . = ..() + code = rand(1,30) + +/obj/item/electropack/vibrator/small //can go anywhere + name = "small remote vibrator" + style = "small" + icon_state = "vibesmall" + item_state = "vibesmall" + +/obj/item/electropack/vibrator/AltClick(mob/living/user) + var/dat = {" + +Frequency/Code for vibrator:
+Frequency: +[format_frequency(src.frequency)] +Set
+ +Code: +[src.code] +Set
+
"} + user << browse(dat, "window=radio") + onclose(user, "radio") + return + +/obj/item/electropack/shockcollar/security + name = "security shock collar" + desc = "A reinforced security collar. It has two electrodes that press against the neck, for disobedient pets." + icon_state = "shockseccollar" + item_state = "shockseccollar" + +/obj/item/electropack/vibrator/attack_self(mob/user) + if(!istype(user)) + return + if(isliving(user)) + playsound(user, 'sound/effects/clock_tick.ogg', 50, 1, -1) + switch(mode) + if(1) + mode = 2 + to_chat(user, "You twist the bottom of [src], setting it to the medium setting.") + return + if(2) + mode = 3 + to_chat(user, "You twist the bottom of [src], setting it to the high setting.") + return + if(3) + mode = 1 + to_chat(user, "You twist the bottom of [src], setting it to the low setting.") + return + +/obj/item/electropack/vibrator/attack(mob/living/carbon/C, mob/living/user) + + var/obj/item/organ/genital/picked_organ + var/mob/living/carbon/human/S = user + var/mob/living/carbon/human/T = C + picked_organ = S.target_genitals(T) + if(picked_organ) + C.visible_message("[user] is trying to attach [src] to [T]!",\ + "[user] is trying to put [src] on you!") + if(!do_mob(user, C, 5 SECONDS))//warn them and have a delay of 5 seconds to apply. + return + + if(style == "long" && !(picked_organ.name == "vagina")) //long vibrators dont fit on anything but vaginas, but small ones fit everywhere + to_chat(user, "[src] is too big to fit there, use a smaller version.") + return + + if(!picked_organ.equipment) + if(!(style == "long")) + to_chat(user, "You attach [src] to [T]'s [picked_organ.name].") + else + to_chat(user, "You insert [src] into [T]'s [picked_organ.name].") + else + to_chat(user, "They already have a [picked_organ.equipment.name] there.") + return + + if(!user.transferItemToLoc(src, picked_organ)) //check if you can put it in + return + src.inside = TRUE + picked_organ.equipment = src + + else + to_chat(user, "You don't see anywhere to attach this.") + + +/obj/item/electropack/vibrator/receive_signal(datum/signal/signal) + if(!signal || signal.data["code"] != code) + return + + if(last > world.time) + return + + last = world.time + 3 SECONDS //lets stop spam. + + if(inside) + var/obj/item/organ/genital/G = src.loc + var/mob/living/carbon/U = G.owner + + if(G) + switch(G.name) //just being fancy + if("penis") + to_chat(U, "[src] vibrates against your [G.name]!") + if("breasts") + to_chat(U, "[src] vibrates against your nipples!") + if("vagina") + to_chat(U, "[src] vibrates inside you!") + + var/intencity = 10*mode + U.adjustArousalLoss(intencity) //give pleasure + playsound(U.loc, 'sound/lewd/vibrate.ogg', intencity, 1, -1) //vibe + + switch(mode) + if(1) //low + to_chat(U, "You feel pleasure surgest through your [G.name]") + if(2) //med, can make you cum + to_chat(U, "You feel intense pleasure surgest through your [G.name]") + U.Jitter(3) + if (U.getArousalLoss() >= 100 && ishuman(U) && U.has_dna()) + U.mob_climax(forced_climax=TRUE) + if(3) //high, makes you stun + to_chat(U, "You feel overpowering pleasure surgest through your [G.name]") + U.Jitter(3) + U.Stun(30) + if (U.getArousalLoss() >= 100 && ishuman(U) && U.has_dna()) + U.mob_climax(forced_climax=TRUE) + if(prob(50)) + U.emote("moan") + + + + playsound(src, 'sound/lewd/vibrate.ogg', 40, 1, -1) + if(style == "long") //haha vibrator go brrrrrrr + icon_state = "vibing" + + sleep(30) + icon_state = "vibe" + else + icon_state = "vibingsmall" + sleep(30) + icon_state = "vibesmall" \ No newline at end of file diff --git a/hyperstation/icons/obj/vibrator.dmi b/hyperstation/icons/obj/vibrator.dmi new file mode 100644 index 00000000..0a52ffb0 Binary files /dev/null and b/hyperstation/icons/obj/vibrator.dmi differ diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm index 17947ae6..1a8e4e2f 100644 --- a/modular_citadel/code/game/machinery/vending.dm +++ b/modular_citadel/code/game/machinery/vending.dm @@ -59,7 +59,9 @@ /obj/item/clothing/under/polychromic/bulge = 3, /obj/item/clothing/suit/maidapron = 3, /obj/item/clothing/under/corset = 3, - /obj/item/clothing/under/jabroni = 3 + /obj/item/clothing/under/jabroni = 3, + /obj/item/electropack/vibrator/small = 2, + /obj/item/electropack/vibrator = 2, ) contraband = list( /obj/item/restraints/handcuffs/fake/kinky = 5, diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm index 7c995246..a4518e6f 100644 --- a/modular_citadel/code/modules/arousal/arousal.dm +++ b/modular_citadel/code/modules/arousal/arousal.dm @@ -473,12 +473,27 @@ for(var/obj/item/organ/genital/G in internal_organs) if(G.can_masturbate_with) //filter out what you can't masturbate with if(G.is_exposed(worn_stuff)) //Nude or through_clothing - genitals_list += G + if(!G.dontlist) + genitals_list += G if(genitals_list.len) ret_organ = input(src, "with what?", "Masturbate", null) as null|obj in genitals_list return ret_organ return null //error stuff +/mob/living/carbon/human/proc/target_genitals(mob/living/carbon/human/T) //used for targeting others + var/obj/item/organ/genital/ret_organ + var/list/genitals_list = list() + var/list/worn_stuff = get_equipped_items() + + for(var/obj/item/organ/genital/G in T.internal_organs) + if(G.can_climax) //filter out what you can't masturbate with + if(G.is_exposed(worn_stuff)) //Nude or through_clothing + if(!G.dontlist) + genitals_list += G + if(genitals_list.len) + ret_organ = input(src, "", "Gentials", null) as null|obj in genitals_list + return ret_organ + return null //error stuff /mob/living/carbon/human/proc/pick_climax_genitals() var/obj/item/organ/genital/ret_organ @@ -488,7 +503,8 @@ for(var/obj/item/organ/genital/G in internal_organs) if(G.can_climax) //filter out what you can't masturbate with if(G.is_exposed(worn_stuff)) //Nude or through_clothing - genitals_list += G + if(!G.dontlist) + genitals_list += G if(genitals_list.len) ret_organ = input(src, "with what?", "Climax", null) as null|obj in genitals_list return ret_organ diff --git a/modular_citadel/code/modules/arousal/organs/belly.dm b/modular_citadel/code/modules/arousal/organs/belly.dm index f8132725..fa774b33 100644 --- a/modular_citadel/code/modules/arousal/organs/belly.dm +++ b/modular_citadel/code/modules/arousal/organs/belly.dm @@ -15,6 +15,7 @@ can_climax = TRUE fluid_transfer_factor = 0.5 var/sent_full_message = TRUE //defaults to 1 since they're full to start + dontlist = TRUE /obj/item/organ/genital/belly/on_life() if(QDELETED(src)) diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm index 1564079c..ffb64189 100644 --- a/modular_citadel/code/modules/arousal/organs/genitals.dm +++ b/modular_citadel/code/modules/arousal/organs/genitals.dm @@ -23,6 +23,8 @@ var/hidden = FALSE var/colourtint = "" var/mode = "clothes" + var/obj/item/equipment //for fun stuff that goes on the gentials/maybe rings down the line + var/dontlist = FALSE /obj/item/organ/genital/Initialize() . = ..() diff --git a/modular_citadel/code/modules/arousal/organs/testicles.dm b/modular_citadel/code/modules/arousal/organs/testicles.dm index be570831..b46c9623 100644 --- a/modular_citadel/code/modules/arousal/organs/testicles.dm +++ b/modular_citadel/code/modules/arousal/organs/testicles.dm @@ -19,6 +19,7 @@ masturbation_verb = "massage" can_climax = TRUE var/sent_full_message = TRUE //defaults to 1 since they're full to start + dontlist = TRUE /obj/item/organ/genital/testicles/on_life() diff --git a/sound/lewd/vibrate.ogg b/sound/lewd/vibrate.ogg new file mode 100644 index 00000000..87eb1a4a Binary files /dev/null and b/sound/lewd/vibrate.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 9ea813c0..d2fe1978 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3073,6 +3073,7 @@ #include "hyperstation\code\obj\rope.dm" #include "hyperstation\code\obj\sizeitems.dm" #include "hyperstation\code\obj\sounding.dm" +#include "hyperstation\code\obj\vibrator.dm" #include "interface\interface.dm" #include "interface\menu.dm" #include "interface\stylesheet.dm"