//Hyperstation 13 fleshlight //Humbley request this doesnt get ported to other code bases, we strive to make things unique on our server and we dont have alot of coders //but if you absolutely must. please give us some credit~ <3 //made by quotefox /obj/item/fleshlight name = "fleshlight" desc = "A sex toy disguised as a flashlight, used to stimulate someones penis, complete with colour changing sleeve." icon = 'hyperstation/icons/obj/fleshlight.dmi' icon_state = "fleshlight_base" item_state = "fleshlight" w_class = WEIGHT_CLASS_SMALL var/sleevecolor = "#ffcbd4" //pink price = 8 var/mutable_appearance/sleeve var/inuse = 0 /obj/item/fleshlight/examine(mob/user) . = ..() . += "Alt-Click \the [src.name] to customize it." /obj/item/fleshlight/Initialize() . = ..() sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "vagina") sleeve.color = sleevecolor add_overlay(sleeve) /obj/item/fleshlight/AltClick(mob/user) . = ..() var/style = input(usr, "Choose style", "Customize Fleshlight", "vagina") in list("vagina", "anus","lips") var/new_color = input(user, "Choose color.", "Customize Fleshlight", sleevecolor) as color|null if(new_color) cut_overlays() sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', style) sleevecolor = new_color sleeve.color = new_color add_overlay(sleeve) return TRUE /obj/item/fleshlight/attack(mob/living/carbon/C, mob/living/user) var/obj/item/organ/genital/penis/P = C.getorganslot("penis") if(inuse == 1) //just to stop stacking and causing people to cum instantly return 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") C.do_jitter_animation() C.adjustArousalLoss(20) //make the target more aroused. if(C.can_orgasm() && ishuman(C)) var/mob/living/carbon/human/user_human = C user_human.mob_climax_outside(P, mb_time=0) // instant, because we already did a warmup return else to_chat(user, "You don't see anywhere to use this on.") 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 var/organ_type var/last_use /obj/item/portallight/examine(mob/user) . = ..() if(!portalunderwear) . += "The device is unpaired, to pair, swipe against a pair of portal panties. " else . += "The device is paired, and awaiting input. " /obj/item/portallight/attack(mob/living/carbon/user, mob/living/holder) if(inuse) //just to stop stacking and causing people to cum instantly return if(!UpdateUsability()) to_chat(holder, "\The [src] appears to be currently unusable.") return var/option = "Fuck" if(user == holder) if (organ_type != "lips") option = input(usr, "Choose action", "Portal Fleshlight", "Fuck") in list("Fuck", "Lick", "Touch") else option = input(usr, "Choose action", "Portal Fleshlight", "Fuck") in list("Fuck", "Lick", "Touch","Kiss") var/obj/item/organ/genital/target_genital = portalunderwear.loc var/mob/living/carbon/human/target = target_genital.owner var/obj/item/organ/genital/penis/P = user.getorganslot("penis") if(option == "Fuck" && !P.is_exposed()) to_chat(holder, "You don't see anywhere to use this on.") return /* WARMUP START - prevents spam/instant climax */ inuse = TRUE if(user != holder) user.visible_message("[holder] is trying to use [src] on [user]'s penis.",\ "[holder] is trying to use [src] on your penis.") if(!do_mob(holder, user, 3 SECONDS)) inuse = FALSE return //stop spamming idiot... if(last_use <= world.time) last_use = world.time + 3 SECONDS else to_chat(holder, "You don't want to break it, you are going to fast!") return inuse = FALSE /* WARMUP END - proceed with the action */ switch(option) if("Fuck") playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1) if(user == holder) holder.visible_message("[holder] pumps [src] on their penis.", "You pump the fleshlight on your penis.") else user.visible_message("[holder] pumps [src] on [user]'s penis.",\ "[holder] pumps [src] up and down on your penis.") to_chat(target, "You feel a [P.length] inch, [P.shape] shaped penis pumping through the portal into your [target_genital.name].") if (organ_type != "lips") if(prob(30)) target.emote("moan") else if(prob(30)) target.emote("gags") target.adjust_blurriness(2) user.adjustArousalLoss(20) target.adjustArousalLoss(20) target.do_jitter_animation() if(target.can_orgasm() && prob(5)) target.mob_climax_outside(target_genital, spillage=target_genital.is_exposed()) if(user.can_orgasm()) var/mob/living/carbon/human/O = user var/impreg_chance = target_genital.name == "vagina" && !P.condom && !P.sounding if(O.mob_climax_in_partner(P, target, spillage=FALSE, remote=TRUE) && impreg_chance) target.impregnate(by=O) if("Lick") holder.visible_message("[holder] licks into [src].",\ "You lick into [src].") to_chat(target, "You feel a tongue lick you through the portal against your [target_genital.name].") target.adjustArousalLoss(10) if("Touch") holder.visible_message("[holder] touches softly against [src].",\ "You touch softly on [src].") to_chat(target, "You feel someone touching your [target_genital.name] through the portal.") target.adjustArousalLoss(5) if("Kiss") holder.visible_message("[holder] kisses the [src].",\ "You kiss the [src].") to_chat(target, "You feel someone kissing you through the portal.") target.adjustArousalLoss(2) ..() /obj/item/portallight/proc/updatesleeve() //get their looks and vagina colour! cut_overlays() if(!UpdateUsability()) return var/obj/item/organ/genital/G = portalunderwear.loc var/mob/living/carbon/human/H = G.owner // H is verified by UpdateUsability() var/sleeve_species = "normal" switch(H.dna.species.name) if("Lizardperson") sleeve_species = "lizard" if("Slimeperson") sleeve_species = "slime" if("Avian") sleeve_species = "avian" sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_[sleeve_species]") sleeve.color = "#" + H.dna.features["mcolor"] add_overlay(sleeve) //set type organ_type = G.name if(G.name == "vagina") organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_vag") organ.color = portalunderwear.loc.color if(G.name == "anus") organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_anus") organ.color = "#" + H.dna.features["mcolor"] if(G.name == "lips") var/lowershape = lowertext(G.shape) switch(lowershape) if("nonexistant") organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "mouth_0") organ.color = "#" + H.dna.features["lips_color"] if("average") organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "mouth_0") organ.color = "#" + H.dna.features["lips_color"] if("puffy") organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "mouth_1") organ.color = "#" + H.dna.features["lips_color"] if("hyper") organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "mouth_2") organ.color = "#" + H.dna.features["lips_color"] //a felinid is fine too.. if (H.dna.species.name == "Felinid") organ = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "a_felinid_is_fine_too") organ.color = "#FFFFFF" add_overlay(organ) /obj/item/portallight/proc/UpdateUsability() var/useable = FALSE if(portalunderwear && istype(portalunderwear.loc, /obj/item/organ/genital)) var/obj/item/organ/genital/loc_genitals = portalunderwear.loc if(loc_genitals.owner && ishuman(loc_genitals.owner)) useable = TRUE src.useable = useable return useable //Hyperstation 13 portal underwear //can be attached to vagina or anus, 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" w_class = WEIGHT_CLASS_SMALL var/obj/item/portallight var/attached = FALSE var/shapetype = "vagina" /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) 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, 3 SECONDS))//warn them and have a delay of 5 seconds to apply. return if((picked_organ.name == "vagina")||(picked_organ.name == "anus")||(picked_organ.name == "lips")) //only fits on a vagina or anus, and lips src.shapetype = picked_organ.name if(!picked_organ.equipment) to_chat(user, "You wrap [src] around [T]'s [picked_organ.name].") else to_chat(user, "They already have [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, "[src] can only be attached to a vagina, anus, or mouth.") return 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" price = 15 // 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."