diff --git a/hyperstation/code/modules/arousal/arousalhud.dm b/hyperstation/code/modules/arousal/arousalhud.dm
index d5c609ea..faafdb4c 100644
--- a/hyperstation/code/modules/arousal/arousalhud.dm
+++ b/hyperstation/code/modules/arousal/arousalhud.dm
@@ -54,7 +54,7 @@
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 += "Remove [G.equipment.name] ([G.name])
"
dat += {"
"}//Newline for the objects
//bottom options
@@ -201,6 +201,9 @@
var/obj/item/organ/genital/vagina/O = usr.getorganslot("vagina")
var/obj/item/I = O.equipment
usr.put_in_hands(I)
+ if(istype(I, /obj/item/portalpanties))
+ var/obj/item/portalpanties/P = I
+ P.remove()
O.equipment = null
if(href_list["removeequipmentbelly"])
diff --git a/hyperstation/code/obj/fleshlight.dm b/hyperstation/code/obj/fleshlight.dm
index 4917f823..c70c8981 100644
--- a/hyperstation/code/obj/fleshlight.dm
+++ b/hyperstation/code/obj/fleshlight.dm
@@ -70,4 +70,205 @@
to_chat(user, "You don't see anywhere to use this on.")
inuse = 0
- ..()
\ No newline at end of file
+ ..()
+
+
+//Hyperstation 13 portal fleshlight
+//kinky!
+
+/obj/item/portallight
+ name = "portal fleshlight"
+ desc = "A silver love(TM) fleshlight, used to stimulate someones penis, with bluespace tech that allows lovers to hump at a distance."
+ icon = 'hyperstation/icons/obj/fleshlight.dmi'
+ icon_state = "unpaired"
+ item_state = "fleshlight"
+ w_class = WEIGHT_CLASS_SMALL
+ var/partnercolor = "#ffcbd4"
+ var/partnerbase = "normal"
+ var/partnerorgan = "portal_vag"
+ price = 20
+ var/mutable_appearance/sleeve
+ var/mutable_appearance/organ
+ var/inuse = 0
+ var/paired = 0
+ var/obj/item/portalunderwear
+ var/useable = FALSE
+
+/obj/item/portallight/examine(mob/user)
+ . = ..()
+ if(!portalunderwear)
+ . += "The device is unpaired, to pair, swipe against a pair of portal panties(TM). "
+ else
+ . += "The device is paired, and awaiting input. "
+
+/obj/item/portallight/attack(mob/living/carbon/C, mob/living/user) //use portallight! nearly the same as the fleshlight apart from you have a buddy!
+ var/obj/item/organ/genital/penis/P = C.getorganslot("penis")
+
+ if(inuse) //just to stop stacking and causing people to cum instantly
+ return
+ if(!useable)
+ to_chat(user, "It seems the device has failed or your partner is not wearing their device.")
+
+ var/obj/item/organ/genital/vagina/V = portalunderwear.loc
+ if(!V)
+ return
+ var/mob/living/carbon/human/M = V.owner
+ if(P&&P.is_exposed())
+ inuse = 1
+ if(!(C == user)) //if we are targeting someone else.
+ C.visible_message("[user] is trying to use [src] on [C]'s penis.", "[user] is trying to use [src] on your penis.")
+
+ if(!do_mob(user, C, 3 SECONDS)) //3 second delay
+ inuse = 0
+ return
+
+ //checked if not used on yourself, if not, carry on.
+ playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1) //slapping sound
+ inuse = 0
+ if(!(C == user)) //lewd flavour text
+ C.visible_message("[user] pumps [src] on [C]'s penis.", "[user] pumps [src] up and down on your penis.")
+ else
+ user.visible_message("[user] pumps [src] on their penis.", "You pump the fleshlight on your penis.")
+
+ if(prob(30)) //30% chance to make them moan.
+ C.emote("moan")
+ if(prob(30)) //30% chance to make your partner moan.
+ M.emote("moan")
+
+ to_chat(M, "You feel a [P.shape] shaped penis pumping through the portal into your vagina.")//message your partner and kinky!
+ M.adjustArousalLoss(20)
+ M.do_jitter_animation() //make your partner shake too!
+
+ C.do_jitter_animation()
+
+ C.adjustArousalLoss(20) //make the target more aroused.
+
+ if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna())
+ var/mob/living/carbon/human/O = user
+ O.mob_climax_partner(P, M, TRUE, FALSE, FALSE, TRUE) //climax with your partner remotely!
+ return
+
+ else
+ to_chat(user, "You don't see anywhere to use this on.")
+
+ inuse = 0
+ ..()
+
+/obj/item/portallight/proc/updatesleeve()
+ //get their looks and vagina colour!
+ cut_overlays()//remove current overlays
+
+ var/obj/item/organ/genital/vagina/V = portalunderwear.loc
+ var/mob/living/carbon/human/H = V.owner
+
+ if(H) //if the portal panties are on someone.
+
+ if(H.dna.species.name == "Lizardperson") // lizard nerd
+ sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_lizard")
+ else
+ sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_normal")
+
+ sleeve.color = "#" + H.dna.features["mcolor"]
+ add_overlay(sleeve)
+
+ organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_vag")
+ organ.color = portalunderwear.loc.color
+
+ useable = TRUE
+ add_overlay(organ)
+ else
+ useable = FALSE
+
+//Hyperstation 13 portal underwear
+//can be attached to vagina, just like the vibrator, still requires pairing with the portallight
+
+/obj/item/portalpanties
+ name = "portal panties"
+ desc = "A silver love(TM) pair of portal underwear, with bluespace tech allows lovers to hump at a distance. Needs to be paired with a portal fleshlight before use."
+ icon = 'hyperstation/icons/obj/fleshlight.dmi'
+ icon_state = "portalpanties"
+ item_state = "fleshlight"
+ var/obj/item/portallight
+ var/attached = FALSE
+
+/obj/item/portalpanties/examine(mob/user)
+ . = ..()
+ if(!portallight)
+ . += "The device is unpaired, to pair, swipe the fleshlight against this pair of portal panties(TM). "
+ else
+ . += "The device is paired, and awaiting attachment. "
+
+
+/obj/item/portalpanties/attackby(obj/item/I, mob/living/user) //pairing
+ if(istype(I, /obj/item/portallight))
+ var/obj/item/portallight/P = I
+ if(!P.portalunderwear) //make sure it aint linked to someone else
+ portallight = P //pair the fleshlight
+ P.portalunderwear = src //pair the panties on the fleshlight.
+ P.icon_state = "paired" //we are paired!
+ playsound(src, 'sound/machines/ping.ogg', 50, FALSE)
+ to_chat(user, "[P] has been linked up successfully.")
+ else
+ to_chat(user, "[P] has already been linked to another pair of underwear.")
+ else
+ ..() //just allows people to hit it with other objects, if they so wished.
+
+/obj/item/portalpanties/attack(mob/living/carbon/C, mob/living/user)
+
+ if(!portallight) //we arent paired yet! noobie trap, let them know.
+ to_chat(user, "[src] can only be attached once paired with a portal fleshlight.")
+ return
+
+ 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) //allowing to pick organ for anus down the line
+ 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(!(picked_organ.name == "vagina")) //only fits on a vagina
+ to_chat(user, "[src] can only be attached to a vagina.")
+ return
+
+ if(!picked_organ.equipment)
+ to_chat(user, "You wrap [src] around [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.attached = TRUE
+ picked_organ.equipment = src
+
+ var/obj/item/portallight/P = portallight
+ //now we need to send what they look like, but saddly if the person changes colour for what ever reason, it wont update. but dont tell people shh.
+ if(P) //just to make sure
+ P.updatesleeve()
+
+ else
+ to_chat(user, "You don't see anywhere to attach this.")
+
+/obj/item/portalpanties/proc/remove() //if taken off update it.
+ if(portallight)
+ var/obj/item/portallight/P = portallight
+ P.updatesleeve()
+
+/obj/item/storage/box/portallight
+ name = "Portal Fleshlight and Underwear"
+ icon = 'hyperstation/icons/obj/fleshlight.dmi'
+ desc = "A small silver box with Silver Love Co embossed."
+ icon_state = "box"
+
+// portal fleshlight box
+/obj/item/storage/box/portallight/PopulateContents()
+ new /obj/item/portallight/(src)
+ new /obj/item/portalpanties/(src)
+ new /obj/item/paper/fluff/portallight(src)
+
+/obj/item/paper/fluff/portallight
+ name = "Portal Fleshlight Instructions"
+ info = "Thank you for purchasing the Silver Love Portal Fleshlight!
To use, simply register your new portal fleshlight with the provided underwear to link them together. The ask your lover to wear the underwear.
Have fun lovers,
Wilhelmina Steiner."
\ No newline at end of file
diff --git a/hyperstation/icons/obj/fleshlight.dmi b/hyperstation/icons/obj/fleshlight.dmi
index a02bb49a..0115dfc0 100644
Binary files a/hyperstation/icons/obj/fleshlight.dmi and b/hyperstation/icons/obj/fleshlight.dmi differ
diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm
index bc7a3439..88c7e553 100644
--- a/modular_citadel/code/game/machinery/vending.dm
+++ b/modular_citadel/code/game/machinery/vending.dm
@@ -66,6 +66,7 @@
/obj/item/electropack/vibrator/small = 2,
/obj/item/electropack/vibrator = 2,
/obj/item/fleshlight = 2,
+ /obj/item/storage/box/portallight = 1,
)
contraband = list(
/obj/item/clothing/under/gear_harness = 3,
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
index a4518e6f..a9a5ca23 100644
--- a/modular_citadel/code/modules/arousal/arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -321,7 +321,7 @@
setArousalLoss(min_arousal)
-/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, impreg = FALSE,cover = FALSE, mb_time = 30) //Used for climaxing with any living thing
+/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, impreg = FALSE,cover = FALSE,remote = FALSE, mb_time = 30) //Used for climaxing with any living thing
var/total_fluids = 0
var/datum/reagents/fluid_source = null
@@ -369,7 +369,9 @@
setArousalLoss(min_arousal)
if(spillage && !cover)
- if(do_after(src, mb_time, target = src) && in_range(src, L))
+ if(do_after(src, mb_time, target = src))
+ if(!in_range(src, L) && !remote)
+ return
fluid_source.trans_to(L, total_fluids*G.fluid_transfer_factor)
total_fluids -= total_fluids*G.fluid_transfer_factor
if(total_fluids > 5)
@@ -408,6 +410,7 @@
if (L.mind == obj.target)
L.mind.sexed = TRUE //sexed
to_chat(src, "You feel deep satisfaction with yourself.")
+ //Hyper - remote
if(impreg)
//Role them odds, only people with the dicks can send the chance to the person with the settings enabled at the momment.
@@ -491,7 +494,7 @@
if(!G.dontlist)
genitals_list += G
if(genitals_list.len)
- ret_organ = input(src, "", "Gentials", null) as null|obj in genitals_list
+ ret_organ = input(src, "", "Genitals", null) as null|obj in genitals_list
return ret_organ
return null //error stuff
diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm
index 82d295a0..af313a3d 100644
--- a/modular_citadel/code/modules/arousal/organs/genitals.dm
+++ b/modular_citadel/code/modules/arousal/organs/genitals.dm
@@ -430,12 +430,12 @@
//otherwise, appear under clothing
if(G.slot == "penis" || G.slot == "testicles")
if(G.size < 3) //is actually "less than 11 inches"
- genital_overlay.layer = -GENITALS_UNDER_LAYER
+ genital_overlay.layer = -GENITALS_UNDER_LAYER
if(G.slot == "breasts")
var/obj/item/organ/genital/breasts/B = G
if(B.cached_size < 8) //anything smaller than a g-cup
genital_overlay.layer = -GENITALS_UNDER_LAYER
-
+
//Get the icon
genital_overlay.icon_state = "[G.slot]_[S.icon_state]_[size]_[aroused_state]_[layertext]"
colourcode = S.color_src