Portal Fleshlights

This commit is contained in:
QuoteFox
2021-04-16 20:40:01 +01:00
parent 919cbae1ab
commit bee56ad0f6
6 changed files with 215 additions and 7 deletions
@@ -54,7 +54,7 @@
dat += "<a href='byond://?src=[REF(src)];removesound=1'>Remove sounding rod (penis)</A><BR>"
for(var/obj/item/organ/genital/G in U.internal_organs)
if(G.equipment) //they have equipment
dat += "<a href='byond://?src=[REF(src)];removeequipment[G.name]=1;'>Remove [G.equipment.name] ([G.name]).</A><BR>"
dat += "<a href='byond://?src=[REF(src)];removeequipment[G.name]=1;'>Remove [G.equipment.name] ([G.name])</A><BR>"
dat += {"<HR>"}//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"])
+202 -1
View File
@@ -70,4 +70,205 @@
to_chat(user, "<span class='notice'>You don't see anywhere to use this on.</span>")
inuse = 0
..()
..()
//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)
. += "<span class='notice'>The device is unpaired, to pair, swipe against a pair of portal panties(TM). </span>"
else
. += "<span class='notice'>The device is paired, and awaiting input. </span>"
/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, "<span class='notice'>It seems the device has failed or your partner is not wearing their device.</span>")
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("<span class='userlove'>[user] is trying to use [src] on [C]'s penis.</span>", "<span class='userlove'>[user] is trying to use [src] on your penis.</span>")
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("<span class='userlove'>[user] pumps [src] on [C]'s penis.</span>", "<span class='userlove'>[user] pumps [src] up and down on your penis.</span>")
else
user.visible_message("<span class='userlove'>[user] pumps [src] on their penis.</span>", "<span class='userlove'>You pump the fleshlight on your penis.</span>")
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, "<span class='love'>You feel a [P.shape] shaped penis pumping through the portal into your vagina.</span>")//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, "<span class='notice'>You don't see anywhere to use this on.</span>")
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)
. += "<span class='notice'>The device is unpaired, to pair, swipe the fleshlight against this pair of portal panties(TM). </span>"
else
. += "<span class='notice'>The device is paired, and awaiting attachment. </span>"
/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, "<span class='notice'>[P] has been linked up successfully.</span>")
else
to_chat(user, "<span class='notice'>[P] has already been linked to another pair of underwear.</span>")
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, "<span class='warning'>[src] can only be attached once paired with a portal fleshlight.</span>")
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("<span class='warning'>[user] is trying to attach [src] to [T]!</span>",\
"<span class='warning'>[user] is trying to put [src] on you!</span>")
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, "<span class='warning'>[src] can only be attached to a vagina.</span>")
return
if(!picked_organ.equipment)
to_chat(user, "<span class='love'>You wrap [src] around [T]'s [picked_organ.name].</span>")
else
to_chat(user, "<span class='notice'>They already have a [picked_organ.equipment.name] there.</span>")
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, "<span class='notice'>You don't see anywhere to attach this.</span>")
/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!<BR>To use, simply register your new portal fleshlight with the provided underwear to link them together. The ask your lover to wear the underwear.<BR>Have fun lovers,<BR><BR>Wilhelmina Steiner."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

@@ -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,
@@ -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, "<span class='userlove'>You feel deep satisfaction with yourself.</span>")
//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
@@ -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