diff --git a/code/__DEFINES/admin.dm b/code/__DEFINES/admin.dm
index 22a76fd8..d8b5ab0b 100644
--- a/code/__DEFINES/admin.dm
+++ b/code/__DEFINES/admin.dm
@@ -79,6 +79,7 @@
#define ADMIN_PUNISHMENT_FAKEBWOINK "Fake Bwoink"
#define ADMIN_PUNISHMENT_NUGGET "Nugget"
#define ADMIN_PUNISHMENT_BREADIFY ":b:read"
+#define ADMIN_PUNISHMENT_BOOKIFY "Bookify"
#define AHELP_ACTIVE 1
#define AHELP_CLOSED 2
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index 420a92ff..2536c22b 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -453,6 +453,7 @@
H.update_inv_wear_mask()
else
H.lip_style = null
+ H.nail_style = null
H.update_body()
if(H.glasses && washglasses && wash_obj(H.glasses))
H.update_inv_glasses()
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 0aaa34e8..1f780448 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -1247,6 +1247,11 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
var/obj/item/reagent_containers/food/snacks/store/bread/plain/funnyBread = new(get_turf(target))
target.forceMove(funnyBread)
+/client/proc/bookify(atom/movable/target)
+ var/obj/item/reagent_containers/food/snacks/store/book/funnyBook = new(get_turf(target))
+ target.forceMove(funnyBook)
+ funnyBook.name = "Book of " + target.name
+
/client/proc/smite(mob/living/carbon/human/target as mob)
set name = "Smite"
set category = "Fun"
@@ -1268,7 +1273,8 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
ADMIN_PUNISHMENT_TABLETIDESTATIONWIDE,
ADMIN_PUNISHMENT_FAKEBWOINK,
ADMIN_PUNISHMENT_NUGGET,
- ADMIN_PUNISHMENT_BREADIFY)
+ ADMIN_PUNISHMENT_BREADIFY,
+ ADMIN_PUNISHMENT_BOOKIFY)
var/punishment = input("Choose a punishment", "DIVINE SMITING") as null|anything in punishment_list
@@ -1379,6 +1385,14 @@ GLOBAL_LIST_EMPTY(custom_outfits) //Admin created outfits
target.transformation_animation(bread_appearance, time = BREADIFY_TIME, transform_overlay=transform_scanline, reset_after=TRUE)
addtimer(CALLBACK(GLOBAL_PROC, .proc/breadify, target), BREADIFY_TIME)
#undef BREADIFY_TIME
+ if(ADMIN_PUNISHMENT_BOOKIFY)
+ #define BOOKIFY_TIME (2 SECONDS)
+ var/mutable_appearance/book_appearance = mutable_appearance('icons/obj/library.dmi', "book")
+ var/mutable_appearance/transform_scanline = mutable_appearance('icons/effects/effects.dmi', "transform_effect")
+ target.transformation_animation(book_appearance, time = BOOKIFY_TIME, transform_overlay=transform_scanline, reset_after=TRUE)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/bookify, target), BOOKIFY_TIME)
+ playsound(target, 'hyperstation/sound/misc/bookify.ogg', 60, 1)
+ #undef BOOKIFY_TIME
punish_log(target, punishment)
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index be09a91d..22106266 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -378,3 +378,16 @@ All foods are distributed among various categories. Use common sense.
TB.MouseDrop(over)
else
return ..()
+
+/obj/item/reagent_containers/food/snacks/store/book
+ name = "book"
+ desc = "Could it be? A LoR reference? And is it... Edible?"
+ icon = 'icons/obj/library.dmi'
+ icon_state = "book"
+ tastes = list("broken dreams and promises" = 10)
+ foodtype = GROSS
+ dunkable = TRUE
+ volume = 80
+ bitesize = 4
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 1)
+ list_reagents = list(/datum/reagent/consumable/sodiumchloride = 1)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index fd9fdcb5..021094fc 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -24,6 +24,9 @@
var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup
var/lip_color = "white"
+ var/nail_style = null
+ var/nail_color = "white"
+
var/age = 30 //Player's age
var/underwear = "Nude" //Which underwear the player wants
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index e822b381..74a38d3e 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -550,6 +550,12 @@ GLOBAL_LIST_EMPTY(roundstart_races)
MA.color = "#[H.socks_color]"
standing += MA
+ // nail paint (hyper)
+ if(H.nail_style)
+ var/mutable_appearance/nail_overlay = mutable_appearance('hyperstation/icons/mobs/nails.dmi', "nails", -HANDS_PART_LAYER)
+ nail_overlay.color = H.nail_color
+ standing += nail_overlay
+
if(standing.len)
H.overlays_standing[BODY_LAYER] = standing
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index aa87217b..83f8b666 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -1242,6 +1242,7 @@
var/mob/living/carbon/human/H = M
if(H.lip_style)
H.lip_style = null
+ H.nail_style = null
H.update_body()
for(var/obj/item/I in C.held_items)
SEND_SIGNAL(I, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK)
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index 92d5b25a..9c6caf8c 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -102,6 +102,7 @@
/obj/item/clothing/suit/toggle/jacket_purple = 3,
/obj/item/clothing/suit/toggle/jacket_white = 3,
/obj/item/clothing/suit/jacket/letterman_red = 3,
+ /obj/item/clothing/suit/fluffyhalfcrop = 3,
/obj/item/clothing/ears/headphones = 10,
/obj/item/clothing/suit/apron/purple_bartender = 4,
/obj/item/clothing/under/rank/bartender/purple = 4,
diff --git a/hyperstation/code/game/objects/items/cosmetics.dm b/hyperstation/code/game/objects/items/cosmetics.dm
new file mode 100644
index 00000000..711707f1
--- /dev/null
+++ b/hyperstation/code/game/objects/items/cosmetics.dm
@@ -0,0 +1,75 @@
+//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 == user)
+ user.visible_message("[user] does [user.p_their()] nails with \the [src].", \
+ "You take a moment to apply \the [src]. Perfect!")
+ H.nail_style = "nails"
+ H.nail_color = paint
+ H.update_body()
+ else
+ user.visible_message("[user] begins to do [H]'s nails with \the [src].", \
+ "You begin to apply \the [src] on [H]'s nails...")
+ if(do_after(user, 20, target = H))
+ user.visible_message("[user] does [H]'s nails with \the [src].", \
+ "You apply \the [src] on [H]'s nails.")
+ H.nail_style = "nails"
+ H.nail_color = paint
+ H.update_body()
+ else
+ to_chat(user, "Where are the nail on that?")
\ No newline at end of file
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..efdf51c0 100644
--- a/hyperstation/code/obj/fleshlight.dm
+++ b/hyperstation/code/obj/fleshlight.dm
@@ -9,7 +9,7 @@
item_state = "fleshlight"
w_class = WEIGHT_CLASS_SMALL
var/sleevecolor = "#ffcbd4" //pink
- price = 12
+ price = 8
var/mutable_appearance/sleeve
var/inuse = 0
@@ -70,4 +70,207 @@
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 = C
+ O.mob_climax_partner(P, M, TRUE, FALSE, FALSE, TRUE) //climax with their 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"
+ w_class = WEIGHT_CLASS_SMALL
+ 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"
+ 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."
\ No newline at end of file
diff --git a/hyperstation/code/obj/kinkyclothes.dm b/hyperstation/code/obj/kinkyclothes.dm
index 8fd9c43d..4c9f61ea 100644
--- a/hyperstation/code/obj/kinkyclothes.dm
+++ b/hyperstation/code/obj/kinkyclothes.dm
@@ -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
\ No newline at end of file
+ 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
diff --git a/hyperstation/icons/mobs/nails.dmi b/hyperstation/icons/mobs/nails.dmi
new file mode 100644
index 00000000..575b5132
Binary files /dev/null and b/hyperstation/icons/mobs/nails.dmi differ
diff --git a/hyperstation/icons/mobs/suits.dmi b/hyperstation/icons/mobs/suits.dmi
index 1fee3289..cd3335dd 100644
Binary files a/hyperstation/icons/mobs/suits.dmi and b/hyperstation/icons/mobs/suits.dmi differ
diff --git a/hyperstation/icons/obj/clothing/suits.dmi b/hyperstation/icons/obj/clothing/suits.dmi
index b3e25949..3c73887c 100644
Binary files a/hyperstation/icons/obj/clothing/suits.dmi and b/hyperstation/icons/obj/clothing/suits.dmi differ
diff --git a/hyperstation/icons/obj/cosmetic.dmi b/hyperstation/icons/obj/cosmetic.dmi
new file mode 100644
index 00000000..2c329e9c
Binary files /dev/null and b/hyperstation/icons/obj/cosmetic.dmi differ
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/hyperstation/sound/misc/bookify.ogg b/hyperstation/sound/misc/bookify.ogg
new file mode 100644
index 00000000..bba99ace
Binary files /dev/null and b/hyperstation/sound/misc/bookify.ogg differ
diff --git a/icons/obj/doors/blastdoor.dmi b/icons/obj/doors/blastdoor.dmi
index c72d29b5..30847afa 100644
Binary files a/icons/obj/doors/blastdoor.dmi and b/icons/obj/doors/blastdoor.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
diff --git a/modular_citadel/code/modules/client/loadout/backpack.dm b/modular_citadel/code/modules/client/loadout/backpack.dm
index adb1d42a..7a257bdb 100644
--- a/modular_citadel/code/modules/client/loadout/backpack.dm
+++ b/modular_citadel/code/modules/client/loadout/backpack.dm
@@ -175,12 +175,12 @@
name = "Teal Lipstick"
category = SLOT_IN_BACKPACK
path = /obj/item/lipstick/teal
-
+
/datum/gear/lipstick_fuchsia
name = "Fuchsia Lipstick"
category = SLOT_IN_BACKPACK
path = /obj/item/lipstick/fuchsia
-
+
/datum/gear/lipstick_navy
name = "Navy Blue Lipstick"
category = SLOT_IN_BACKPACK
@@ -196,6 +196,46 @@
category = SLOT_IN_BACKPACK
path = /obj/item/lipstick/white
+/datum/gear/nailpolish_red
+ name = "Red Nail Polish"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/nailpolish/red
+
+/datum/gear/nailpolish_blue
+ name = "Blue Nail Polish"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/nailpolish/blue
+
+/datum/gear/nailpolish_aqua
+ name = "Cyan Nail Polish"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/nailpolish/aqua
+
+/datum/gear/nailpolish_black
+ name = "Black Nail Polish"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/nailpolish/black
+
+/datum/gear/nailpolish_white
+ name = "White Nail Polish"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/nailpolish/white
+
+/datum/gear/nailpolish_navy
+ name = "Navy Nail Polish"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/nailpolish/navy
+
+/datum/gear/nailpolish_yellow
+ name = "Yellow Nail Polish"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/nailpolish/yellow
+
+/datum/gear/nailpolish_purple
+ name = "Purple Nail Polish"
+ category = SLOT_IN_BACKPACK
+ path = /obj/item/nailpolish/purple
+
/datum/gear/condom
name = "Condom"
category = SLOT_IN_BACKPACK
diff --git a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm
index bf5b49fb..6312c697 100644
--- a/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/modular_citadel/code/modules/mob/dead/new_player/sprite_accessories.dm
@@ -1558,6 +1558,14 @@ datum/sprite_accessory/mam_tails/insect
name = "Wolf"
icon_state = "wolf"
+/datum/sprite_accessory/mam_tails/spade
+ name = "Demon Spade"
+ icon_state = "spade"
+
+/datum/sprite_accessory/mam_tails_animated/spade
+ name = "Demon Spade"
+ icon_state = "spade"
+
/datum/sprite_accessory/mam_tails/synthliz
recommended_species = list("synthliz")
color_src = MUTCOLORS
diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi
index 5db55a6b..583772d8 100644
Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 06ef9bc7..2af021a6 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3037,6 +3037,7 @@
#include "hyperstation\code\datums\ruins\lavaland.dm"
#include "hyperstation\code\datums\traits\good.dm"
#include "hyperstation\code\datums\traits\neutral.dm"
+#include "hyperstation\code\game\objects\items\cosmetics.dm"
#include "hyperstation\code\game\objects\structures\ghost_role_spawners.dm"
#include "hyperstation\code\gamemode\traitor_lewd.dm"
#include "hyperstation\code\gamemode\traitor_thief.dm"