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"