mirror of
https://github.com/KabKebab/GS13.git
synced 2026-07-12 00:20:55 +01:00
Merge branch 'master' into Kristopher-Uniform-Patreon
This commit is contained in:
@@ -3,7 +3,8 @@ SUBSYSTEM_DEF(economy)
|
||||
wait = 5 MINUTES
|
||||
init_order = INIT_ORDER_ECONOMY
|
||||
runlevels = RUNLEVEL_GAME
|
||||
flags = SS_NO_FIRE //Let's not forget this. This subsystem does not use fire and was needlessly using CPU.
|
||||
var/roundstart_paychecks = 5
|
||||
var/budget_pool = 35000
|
||||
var/list/generated_accounts = list()
|
||||
var/list/bank_accounts = list() //List of normal accounts (not department accounts)
|
||||
var/list/bank_accounts = list() //List of normal accounts (not department accounts)
|
||||
|
||||
@@ -47,3 +47,38 @@
|
||||
M.nutrition = rand(NUTRITION_LEVEL_FAT + NUTRITION_LEVEL_START_MIN, NUTRITION_LEVEL_FAT + NUTRITION_LEVEL_START_MAX)
|
||||
M.overeatduration = 100
|
||||
ADD_TRAIT(M, TRAIT_FAT, OBESITY)
|
||||
|
||||
/datum/quirk/virile
|
||||
name = "Virile"
|
||||
desc = "Either through higher quality sperms, more of them, or just being more horny, your impregnation chance will increase by 20-30%."
|
||||
value = 0
|
||||
medical_record_text = "Patient has a higher sperm count."
|
||||
mob_trait = TRAIT_VIRILE
|
||||
gain_text = "<span class='notice'>You feel more potent."
|
||||
lose_text = "<span class='notice'>You feel less potent."
|
||||
var/ichange = 0
|
||||
|
||||
/datum/quirk/virile/add()
|
||||
ichange = rand(20,30)
|
||||
quirk_holder.impregchance += ichange
|
||||
|
||||
/datum/quirk/virile/remove()
|
||||
if(quirk_holder)
|
||||
quirk_holder.impregchance -= ichange
|
||||
|
||||
|
||||
/datum/quirk/macrophile
|
||||
name = "Macrophile"
|
||||
desc = "You are attracted to larger people, and being stepped on by them."
|
||||
value = 0
|
||||
mob_trait = TRAIT_MACROPHILE
|
||||
gain_text = "<span class='notice'>You feel attracted to people larger than you."
|
||||
lose_text = "<span class='notice'>You feel less attracted to people larger than you."
|
||||
|
||||
/datum/quirk/microphile
|
||||
name = "Microphile"
|
||||
desc = "You are attracted to smaller people, and stepping on them."
|
||||
value = 0
|
||||
mob_trait = TRAIT_MICROPHILE
|
||||
gain_text = "<span class='notice'>You feel attracted to people smaller than you."
|
||||
lose_text = "<span class='notice'>You feel less attracted to people smaller than you."
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
//hyperstation 13 nail polish
|
||||
|
||||
/obj/item/nailpolish
|
||||
name = "nail polish"
|
||||
desc = "Paint with a fine brush to do your nails, or someone elses."
|
||||
icon = 'hyperstation/icons/obj/cosmetic.dmi'
|
||||
icon_state = "nailcap"
|
||||
item_state = "nailpolish"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
var/paint = "black"
|
||||
price = 5
|
||||
var/mutable_appearance/bottle //show the colour on the bottle.
|
||||
|
||||
/obj/item/nailpolish/red
|
||||
name = "red nail polish"
|
||||
paint = "red"
|
||||
|
||||
/obj/item/nailpolish/blue
|
||||
name = "blue nail polish"
|
||||
paint = "blue"
|
||||
|
||||
/obj/item/nailpolish/aqua
|
||||
name = "cyan nail polish"
|
||||
paint = "aqua"
|
||||
|
||||
/obj/item/nailpolish/black
|
||||
name = "black nail polish"
|
||||
paint = "black"
|
||||
|
||||
/obj/item/nailpolish/white
|
||||
name = "white nail polish"
|
||||
paint = "white"
|
||||
|
||||
/obj/item/nailpolish/navy
|
||||
name = "navy nail polish"
|
||||
paint = "navy"
|
||||
|
||||
/obj/item/nailpolish/yellow
|
||||
name = "yellow nail polish"
|
||||
paint = "yellow"
|
||||
|
||||
/obj/item/nailpolish/purple
|
||||
name = "purple nail polish"
|
||||
paint = "purple"
|
||||
|
||||
/obj/item/nailpolish/Initialize()
|
||||
. = ..()
|
||||
bottle = mutable_appearance('hyperstation/icons/obj/cosmetic.dmi', "nailpolish")
|
||||
bottle.color = paint
|
||||
add_overlay(bottle)
|
||||
|
||||
|
||||
/obj/item/nailpolish/attack(mob/M, mob/user)
|
||||
if(!ismob(M))
|
||||
return
|
||||
if(ishuman(M))
|
||||
var/mob/living/carbon/human/H = M
|
||||
if(H.nail_style) //to stop stacking bugs
|
||||
to_chat(user, "<span class='warning'>Remove the old nail polish first!</span>")
|
||||
|
||||
if(H == user)
|
||||
user.visible_message("<span class='notice'>[user] does [user.p_their()] nails with \the [src].</span>", \
|
||||
"<span class='notice'>You take a moment to apply \the [src]. Perfect!</span>")
|
||||
H.nail_style = "nails"
|
||||
H.nail_color = paint
|
||||
H.update_body()
|
||||
else
|
||||
user.visible_message("<span class='warning'>[user] begins to do [H]'s nails with \the [src].</span>", \
|
||||
"<span class='notice'>You begin to apply \the [src] on [H]'s nails...</span>")
|
||||
if(do_after(user, 20, target = H))
|
||||
user.visible_message("[user] does [H]'s nails with \the [src].", \
|
||||
"<span class='notice'>You apply \the [src] on [H]'s nails.</span>")
|
||||
H.nail_style = "nails"
|
||||
H.nail_color = paint
|
||||
H.update_body()
|
||||
else
|
||||
to_chat(user, "<span class='warning'>Where are the nail on that?</span>")
|
||||
@@ -0,0 +1,16 @@
|
||||
//not the most effient bot in the world, but it does its job.
|
||||
|
||||
/client/proc/discordmessage(input as message)
|
||||
set category = "Special Verbs"
|
||||
set name = "Hyperbot Message"
|
||||
set desc = "Makes the local bot say something in general chat on discord."
|
||||
|
||||
if(input)
|
||||
world.hypermessage(input)
|
||||
message_admins("[key_name_admin(usr)] has made the Hyperbot post '[input]' in General.")
|
||||
|
||||
/world/proc/hypermessage(message)
|
||||
fdel("Hyperbot/message.txt") //cleaning up old message
|
||||
if(message)
|
||||
var botmsg = "![message]"
|
||||
text2file(botmsg,"Hyperbot/message.txt") //the bot on local reads a new text file and sends it to the discord.
|
||||
@@ -0,0 +1,56 @@
|
||||
/mob/living/dancercaptain
|
||||
name = "Captain Beats"
|
||||
desc = "A captain cursed to dance for all eternity!"
|
||||
icon = 'hyperstation/icons/mobs/dancer/captain.dmi'
|
||||
icon_state = "idle"
|
||||
var/danceaction = 1
|
||||
var/lastaction = 0 //when the last action was!
|
||||
var/actiontime = 4
|
||||
var/list/dancefloor_turfs
|
||||
var/list/dancefloor_turfs_types
|
||||
var/dancefloor_exists = FALSE
|
||||
|
||||
/mob/living/dancercaptain/Move(atom/newloc, direct)
|
||||
|
||||
if(!danceaction)
|
||||
if(!(world.time > lastaction))
|
||||
return // no move for you!
|
||||
|
||||
animate(src, pixel_x, pixel_y = pixel_y + 10, time = 0.7, 0)
|
||||
. = ..()
|
||||
danceaction = 0 //you did your move
|
||||
lastaction = world.time+actiontime //next action time
|
||||
sleep(1)
|
||||
animate(src, pixel_x, pixel_y = pixel_y - 10, time = 0.7, 0)
|
||||
sleep(1)
|
||||
|
||||
LAZYINITLIST(dancefloor_turfs)
|
||||
LAZYINITLIST(dancefloor_turfs_types)
|
||||
|
||||
if(dancefloor_exists) //remove the old one!
|
||||
dancefloor_exists = FALSE
|
||||
for(var/i in 1 to dancefloor_turfs.len)
|
||||
var/turf/T = dancefloor_turfs[i]
|
||||
T.ChangeTurf(dancefloor_turfs_types[i])
|
||||
var/list/funky_turfs = RANGE_TURFS(2, src)
|
||||
|
||||
|
||||
dancefloor_exists = TRUE
|
||||
var/i = 1
|
||||
dancefloor_turfs.len = funky_turfs.len
|
||||
dancefloor_turfs_types.len = funky_turfs.len
|
||||
for(var/t in funky_turfs)
|
||||
if(!(istype(t, /turf/closed))) //dont change walls
|
||||
var/turf/T = t
|
||||
dancefloor_turfs[i] = T
|
||||
dancefloor_turfs_types[i] = T.type
|
||||
T.ChangeTurf((i % 2 == 0) ? /turf/open/floor/light/colour_cycle/dancefloor_a : /turf/open/floor/light/colour_cycle/dancefloor_b)
|
||||
i++
|
||||
|
||||
|
||||
/mob/living/dancercaptain/Initialize()
|
||||
. = ..()
|
||||
|
||||
lastaction = round(world.time) //round to the nearest second! to keep in beat!
|
||||
|
||||
/mob/living/dancercaptain/proc/mtimer()
|
||||
@@ -32,10 +32,14 @@
|
||||
if(user.pulling)
|
||||
dat += "<a href='byond://?src=[REF(src)];kiss=1'>Kiss [user.pulling]</A>"
|
||||
dat += "(Kiss a partner, or object.)<BR>"
|
||||
else
|
||||
dat += "<span class='linkOff'>Kiss</span></A>"
|
||||
dat += "(Requires a partner)<BR>"
|
||||
|
||||
|
||||
if(user.pulling)
|
||||
dat += "<a href='byond://?src=[REF(src)];climaxover=1'>Climax over [user.pulling]</A>" //you can cum on objects if you really want...
|
||||
dat += "(Orgasm over a person or object.)<BR>"
|
||||
|
||||
if(isliving(user.pulling))
|
||||
if(iscarbon(user.pulling))
|
||||
dat += "<a href='byond://?src=[REF(src)];climaxwith=1'>Climax with [user.pulling]</A>"
|
||||
@@ -43,8 +47,13 @@
|
||||
|
||||
var/mob/living/carbon/human/H = user.pulling
|
||||
if(H.breedable && P && H)
|
||||
dat += "<a href='byond://?src=[REF(src)];impreg=1'>Impregnate [user.pulling]</A>"
|
||||
dat += "(Climax inside another person, knocking them up.)<BR>"
|
||||
dat += "<a href='byond://?src=[REF(src)];impreg=1'>Impregnate [U.pulling] ([clamp(U.impregchance,0,100)]%)</A>"
|
||||
dat += "(Climax inside another person, and attempt to knock them up.)<BR>"
|
||||
else
|
||||
dat += "<span class='linkOff'>Climax over</span></A>"
|
||||
dat += "(Requires a partner)<BR>"
|
||||
dat += "<span class='linkOff'>Climax with</span></A>"
|
||||
dat += "(Requires a partner)<BR>"
|
||||
|
||||
//old code needs to be cleaned
|
||||
if(P)
|
||||
@@ -54,7 +63,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 +210,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"])
|
||||
@@ -305,8 +317,6 @@ obj/screen/arousal/proc/kiss()
|
||||
src.visible_message("<span class='notice'>[src] is about to kiss [L]!</span>", \
|
||||
"<span class='notice'>You're attempting to kiss [L]!</span>", \
|
||||
"<span class='notice'>You're attempting to kiss with something!</span>")
|
||||
if(!do_mob(src, L, 2 SECONDS)) //I think two seconds is enough time to pull away if its unwanted.
|
||||
return
|
||||
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "kissed", /datum/mood_event/kiss) //how cute, affection is nice.
|
||||
//Well done you kissed it/them!
|
||||
src.visible_message("<span class='notice'>[src] kisses [L]!</span>", \
|
||||
|
||||
@@ -7,6 +7,5 @@
|
||||
metabolization_rate = 1 * REAGENTS_METABOLISM
|
||||
taste_description = "sweetness"
|
||||
|
||||
/datum/reagent/consumable/alienhoney/on_mob_life(mob/living/carbon/M) //can still be eaten/drank, but will provide no benefits like normal honey. Still good for a food sauce.
|
||||
M.reagents.add_reagent(/datum/reagent/consumable/sugar,2) //metabolisms in the system as sugar.
|
||||
/datum/reagent/consumable/alienhoney/on_mob_life(mob/living/carbon/M)
|
||||
..()
|
||||
@@ -44,7 +44,7 @@ mob/living/get_effective_size()
|
||||
if(size_multiplier == previous_size)
|
||||
return 1
|
||||
src.update_transform() //WORK DAMN YOU
|
||||
src.update_mobsize()
|
||||
src.update_mobsize()
|
||||
//Going to change the health and speed values too
|
||||
src.remove_movespeed_modifier(MOVESPEED_ID_SIZE)
|
||||
src.add_movespeed_modifier(MOVESPEED_ID_SIZE, multiplicative_slowdown = (abs(size_multiplier - 1) * 0.8 ))
|
||||
@@ -67,7 +67,7 @@ mob/living/get_effective_size()
|
||||
|
||||
if(tmob.pulledby == H)
|
||||
return 0
|
||||
|
||||
|
||||
//Micro is on a table.
|
||||
var/turf/steppyspot = tmob.loc
|
||||
for(var/thing in steppyspot.contents)
|
||||
@@ -91,6 +91,7 @@ mob/living/get_effective_size()
|
||||
tmob.visible_message("<span class='notice'>[src] carefully slithers around [tmob].</span>", "<span class='notice'>[src]'s huge tail slithers besides you.</span>")
|
||||
else
|
||||
tmob.visible_message("<span class='notice'>[src] carefully steps over [tmob].</span>", "<span class='notice'>[src] steps over you carefully.</span>")
|
||||
|
||||
return 1
|
||||
|
||||
//Smaller person stepping under a larger person
|
||||
@@ -133,7 +134,20 @@ mob/living/get_effective_size()
|
||||
tmob.visible_message("<span class='danger'>[src] carefully rolls their tail over [tmob]!</span>", "<span class='danger'>[src]'s huge tail rolls over you!</span>")
|
||||
else
|
||||
tmob.visible_message("<span class='danger'>[src] carefully steps on [tmob]!</span>", "<span class='danger'>[src] steps onto you with force!</span>")
|
||||
return 1
|
||||
|
||||
//horny traits
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_MICROPHILE))
|
||||
src.adjustArousalLoss(8)
|
||||
if (src.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
|
||||
src.mob_climax(forced_climax=TRUE)
|
||||
|
||||
if(HAS_TRAIT(tmob, TRAIT_MACROPHILE))
|
||||
tmob.adjustArousalLoss(10)
|
||||
if (tmob.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
|
||||
tmob.mob_climax(forced_climax=TRUE)
|
||||
|
||||
return 1
|
||||
|
||||
if(H.a_intent == "harm" && H.canmove && !H.buckled)
|
||||
now_pushing = 0
|
||||
@@ -149,6 +163,19 @@ mob/living/get_effective_size()
|
||||
tmob.visible_message("<span class='danger'>[src] mows down [tmob] under their tail!</span>", "<span class='userdanger'>[src] plows their tail over you mercilessly!</span>")
|
||||
else
|
||||
tmob.visible_message("<span class='danger'>[src] slams their foot down on [tmob], crushing them!</span>", "<span class='userdanger'>[src] crushes you under their foot!</span>")
|
||||
|
||||
//horny traits
|
||||
|
||||
if(HAS_TRAIT(src, TRAIT_MICROPHILE))
|
||||
src.adjustArousalLoss((get_effective_size()/tmob.get_effective_size()*3))
|
||||
if (src.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
|
||||
src.mob_climax(forced_climax=TRUE)
|
||||
|
||||
if(HAS_TRAIT(tmob, TRAIT_MACROPHILE))
|
||||
tmob.adjustArousalLoss((get_effective_size()/tmob.get_effective_size()*3))
|
||||
if (tmob.getArousalLoss() >= 100 && ishuman(tmob) && tmob.has_dna())
|
||||
tmob.mob_climax(forced_climax=TRUE)
|
||||
|
||||
return 1
|
||||
|
||||
if(H.a_intent == "grab" && H.canmove && !H.buckled)
|
||||
@@ -215,7 +242,7 @@ mob/living/get_effective_size()
|
||||
mob_size = 2 //the default human size
|
||||
if(size_multiplier > 1)
|
||||
mob_size = 3
|
||||
|
||||
|
||||
//Proc for instantly grabbing valid size difference. Code optimizations soon(TM)
|
||||
/*
|
||||
/mob/living/proc/sizeinteractioncheck(var/mob/living/tmob)
|
||||
|
||||
@@ -0,0 +1,300 @@
|
||||
//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
|
||||
|
||||
/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)
|
||||
. = ..()
|
||||
. += "<span class='notice'>Alt-Click \the [src.name] to customize it.</span>"
|
||||
|
||||
/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")
|
||||
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("<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")
|
||||
|
||||
C.do_jitter_animation()
|
||||
C.adjustArousalLoss(20) //make the target more aroused.
|
||||
if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna())
|
||||
C.mob_climax(forced_climax=TRUE) //make them cum if they are over the edge.
|
||||
|
||||
return
|
||||
|
||||
else
|
||||
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
|
||||
var/option = ""
|
||||
|
||||
/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>")
|
||||
|
||||
if(C == user)//if your using it on yourself, more options! otherwise, just fuck.
|
||||
option = input(usr, "Choose action", "Portal Fleshlight", "Fuck") in list("Fuck", "Lick", "Touch")
|
||||
else
|
||||
option = "Fuck"
|
||||
|
||||
var/obj/item/organ/genital/vagina/V = portalunderwear.loc
|
||||
if(!V)
|
||||
return
|
||||
var/mob/living/carbon/human/M = V.owner
|
||||
|
||||
if(option == "Fuck"&&!P.is_exposed()) //we are trying to fuck with no penis!
|
||||
to_chat(user, "<span class='notice'>You don't see anywhere to use this on.</span>")
|
||||
return
|
||||
else //other options dont need checks
|
||||
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.
|
||||
if(option == "Fuck")
|
||||
playsound(src, 'sound/lewd/slaps.ogg', 30, 1, -1) //slapping sound for fuck.
|
||||
|
||||
inuse = 0
|
||||
if(!(C == user))
|
||||
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
|
||||
if(option == "Fuck")
|
||||
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(option == "Lick")
|
||||
user.visible_message("<span class='userlove'>[user] licks into [src].</span>", "<span class='userlove'>You lick into [src].</span>")
|
||||
if(option == "Touch")
|
||||
user.visible_message("<span class='userlove'>[user] touches softly against [src].</span>", "<span class='userlove'>You touch softly on [src].</span>")
|
||||
|
||||
|
||||
if(prob(30)) //30% chance to make your partner moan.
|
||||
M.emote("moan")
|
||||
|
||||
if(option == "Fuck")// normal fuck
|
||||
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!
|
||||
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")
|
||||
C.adjustArousalLoss(20)
|
||||
M.adjustArousalLoss(20)
|
||||
M.do_jitter_animation() //make your partner shake too!
|
||||
if(option == "Lick")
|
||||
to_chat(M, "<span class='love'>You feel a tongue lick you through the portal against your vagina.</span>")
|
||||
M.adjustArousalLoss(10)
|
||||
if(option == "Touch")
|
||||
to_chat(M, "<span class='love'>You feel someone touching your vagina through the portal.</span>")
|
||||
M.adjustArousalLoss(5)
|
||||
|
||||
if (C.getArousalLoss() >= 100 && ishuman(C) && C.has_dna())
|
||||
var/mob/living/carbon/human/O = C
|
||||
O.mob_climax_partner(P, M, FALSE, FALSE, FALSE, TRUE) //climax with their partner remotely!
|
||||
return
|
||||
..()
|
||||
|
||||
/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.
|
||||
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_normal")
|
||||
if(H.dna.species.name == "Lizardperson") // lizard nerd
|
||||
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_lizard")
|
||||
|
||||
if(H.dna.species.name == "Slimeperson") // slime nerd
|
||||
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_slime")
|
||||
|
||||
if(H.dna.species.name == "Avian") // bird nerd
|
||||
sleeve = mutable_appearance('hyperstation/icons/obj/fleshlight.dmi', "portal_sleeve_avian")
|
||||
|
||||
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"
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
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"
|
||||
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!<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."
|
||||
@@ -31,7 +31,7 @@
|
||||
item_state = "highheels"
|
||||
icon = 'hyperstation/icons/obj/clothing/shoes.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/feet.dmi'
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
|
||||
/obj/item/clothing/shoes/highheels/Initialize()
|
||||
. = ..()
|
||||
@@ -39,7 +39,7 @@
|
||||
//the classic click clack
|
||||
|
||||
obj/item/clothing/neck/stole
|
||||
name = "white stole"
|
||||
name = "white boa"
|
||||
desc = "Fluffy neck wear to keep you warm, and attract others."
|
||||
icon = 'hyperstation/icons/obj/clothing/neck.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
@@ -48,11 +48,22 @@ obj/item/clothing/neck/stole
|
||||
price = 3
|
||||
|
||||
obj/item/clothing/neck/stole/black
|
||||
name = "black stole"
|
||||
name = "black boa"
|
||||
desc = "Fluffy neck wear to keep you warm, and attract others."
|
||||
icon = 'hyperstation/icons/obj/clothing/neck.dmi'
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
icon_state = "stole"
|
||||
item_state = "" //no inhands
|
||||
color = "#3d3d3d"
|
||||
price = 3
|
||||
price = 3
|
||||
|
||||
/obj/item/clothing/suit/fluffyhalfcrop
|
||||
name = "fluffy half-crop jacket"
|
||||
desc = "A fluffy synthetic fur half-cropped jacket, less about warmth, more about style!"
|
||||
icon_state = "fluffy"
|
||||
item_state = "fluffy"
|
||||
icon = 'hyperstation/icons/obj/clothing/suits.dmi'
|
||||
alternate_worn_icon = 'hyperstation/icons/mobs/suits.dmi'
|
||||
body_parts_covered = CHEST|LEGS|ARMS
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
mutantrace_variation = NO_MUTANTRACE_VARIATION
|
||||
|
||||
@@ -29,20 +29,7 @@
|
||||
squeak_override = list('sound/weapons/plasma_cutter.ogg' = 1) // The sound the crusher uses is the same as the plasma cutter :P
|
||||
|
||||
|
||||
/obj/item/toy/plush/slimeplushie/tania
|
||||
desc = "An adorable stuffed toy of a slimegirl. She seems oddly damp..." // Milky slime
|
||||
icon = 'hyperstation/icons/obj/plushes.dmi'
|
||||
icon_state = "tania"
|
||||
item_state = "tania"
|
||||
attack_verb = list("hugged", "cuddled", "embraced")
|
||||
squeak_override = list('sound/weapons/thudswoosh.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/slimeplushie/tania/love(obj/item/toy/plush/Kisser, mob/living/user)
|
||||
/* if (istype(Kisser, /obj/item/toy/plush/vladin) ) // Vladin plushie isn't real, Vladin plushie cannot hug you ;-;
|
||||
..()
|
||||
else */
|
||||
user.show_message("<span class='notice'>[src] hugs [Kisser]!</span>", 1,
|
||||
"<span class='notice'>[src] hugs [Kisser]!</span>", 0)
|
||||
//society has progressed past the need for Tania
|
||||
|
||||
/obj/item/toy/plush/mammal/grug
|
||||
name = "Grug S. Cavemannington Plushie"
|
||||
@@ -53,7 +40,7 @@
|
||||
attack_verb = list("thomped", "ook'd", "stoned")
|
||||
squeak_override = list('sound/voice/gorillaplush.ogg' = 1)
|
||||
|
||||
/obj/item/toy/plush/mammal/lyricalpaws
|
||||
/obj/item/toy/plush/mammal/winterdawn
|
||||
name = "hyena plushie"
|
||||
desc = "An adorable stuffed toy of a mammal that seems to resemble a crew member! She's a little yeen in a big labcoat."
|
||||
gender = FEMALE //probably a girl
|
||||
@@ -66,10 +53,6 @@
|
||||
'modular_citadel/sound/voice/bark2.ogg' = 1
|
||||
)
|
||||
|
||||
/obj/item/toy/plush/mammal/lyricalpaws/attack_self(mob/user)
|
||||
to_chat(user, "<span class='notice'>You pet [src]. You swear she looks up at you.</span>")
|
||||
|
||||
|
||||
/obj/item/toy/plush/mammal/chemlight
|
||||
desc = "An adorable stuffed toy of a mammal that seems to resemble a crew member! It looks to glow and sport four arms."
|
||||
gender = MALE //he's a boy, right?
|
||||
|
||||
@@ -105,9 +105,9 @@
|
||||
flags_inv = HIDEFACE|HIDEFACIALHAIR
|
||||
w_class = WEIGHT_CLASS_SMALL
|
||||
|
||||
/obj/item/clothing/suit/hooded/wintercoat/chloe
|
||||
/obj/item/clothing/suit/chloe
|
||||
name = "Fleet Commander's Overcoat"
|
||||
desc = "Custom tailored to warm the cold commanding hearts of the Syndicate's feared XIV'th battle group. Its armour plating has been removed, but its beret remains inside."
|
||||
desc = "Custom tailored to warm the cold commanding hearts of the Syndicate's feared XIV'th battle group. Its armour plating has been removed."
|
||||
icon_state = "commissar_greatcoat"
|
||||
item_state = "commissar_greatcoat"
|
||||
allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/melee/classic_baton/telescopic, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/screwdriver, /obj/item/crowbar, /obj/item/wrench, /obj/item/stack/cable_coil, /obj/item/weldingtool, /obj/item/multitool)
|
||||
@@ -115,9 +115,8 @@
|
||||
body_parts_covered = CHEST|GROIN|ARMS|LEGS
|
||||
mutantrace_variation = MUTANTRACE_VARIATION
|
||||
tauric = TRUE
|
||||
hoodtype = /obj/item/clothing/head/hooded/winterhood/chloe
|
||||
|
||||
/obj/item/clothing/head/hooded/winterhood/chloe
|
||||
/obj/item/clothing/head/chloe
|
||||
name = "Fleet Commander's Beret"
|
||||
desc = "A beret bearing a worn golden symbol that stikes fear in the hearts of many. It smells faintly of plasma and gunpowder."
|
||||
icon = 'hyperstation/icons/obj/clothing/rewards.dmi'
|
||||
@@ -131,4 +130,25 @@
|
||||
icon_state = "touchinfuzzyuni"
|
||||
item_state = "touchinfuzzyuni"
|
||||
body_parts_covered = CHEST|GROIN|ARMS|LEGS
|
||||
fitted = NO_FEMALE_UNIFORM
|
||||
fitted = NO_FEMALE_UNIFORM
|
||||
|
||||
/obj/item/toy/sword/chloesabre
|
||||
name = "Fleet Commander's Sabre"
|
||||
desc = "An elegant weapon, similar in design to the Captain's Sabre, but with a syndicate twist."
|
||||
icon = 'icons/obj/custom.dmi'
|
||||
alternate_worn_icon = 'icons/mob/custom_w.dmi'
|
||||
icon_state = "darksabre"
|
||||
item_state = "darksabre"
|
||||
force = 5
|
||||
throwforce = 5
|
||||
hitsound = 'sound/weapons/rapierhit.ogg'
|
||||
lefthand_file = 'modular_citadel/icons/mob/inhands/stunsword_left.dmi'
|
||||
righthand_file = 'modular_citadel/icons/mob/inhands/stunsword_right.dmi'
|
||||
obj_flags = UNIQUE_RENAME
|
||||
attack_verb = list("slashed", "cut")
|
||||
|
||||
/obj/item/toy/sword/chloesabre/get_belt_overlay()
|
||||
return mutable_appearance('icons/obj/custom.dmi', "darksheath-darksabre")
|
||||
|
||||
/obj/item/toy/sword/chloesabre/get_worn_belt_overlay(icon_file)
|
||||
return mutable_appearance(icon_file, "darksheath-darksabre")
|
||||
|
||||
Reference in New Issue
Block a user