"
+ dat += "Fetish content prefs"
+ dat += "Arousal:[arousable == TRUE ? "Enabled" : "Disabled"] "
+ dat += "Voracious MediHound sleepers: [(cit_toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"] "
+ dat += "Hear Vore Sounds: [(cit_toggles & EATING_NOISES) ? "Yes" : "No"] "
+ dat += "Hear Vore Digestion Sounds: [(cit_toggles & DIGESTION_NOISES) ? "Yes" : "No"] "
+ dat += "Forced Feminization: [(cit_toggles & FORCED_FEM) ? "Allowed" : "Disallowed"] "
+ dat += "Forced Masculinization: [(cit_toggles & FORCED_MASC) ? "Allowed" : "Disallowed"] "
+ dat += "Lewd Hypno: [(cit_toggles & HYPNO) ? "Allowed" : "Disallowed"] "
+ dat += " | "
+ dat +=""
+ dat += "Other content prefs"
+ dat += "Breast Enlargement: [(cit_toggles & BREAST_ENLARGEMENT) ? "Allowed" : "Disallowed"] "
+ dat += "Penis Enlargement: [(cit_toggles & PENIS_ENLARGEMENT) ? "Allowed" : "Disallowed"] "
+ dat += "Hypno: [(cit_toggles & NEVER_HYPNO) ? "Disallowed" : "Allowed"] "
+ dat += "Aphrodisiacs: [(cit_toggles & NO_APHRO) ? "Disallowed" : "Allowed"] "
+ dat += "Ass Slapping: [(cit_toggles & NO_ASS_SLAP) ? "Disallowed" : "Allowed"] "
+ dat += " "
+
dat += " "
@@ -2036,8 +2052,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["genitals_use_skintone"] = !features["genitals_use_skintone"]
if("arousable")
arousable = !arousable
- if("lewdchem")
- lewdchem = !lewdchem
if("has_cock")
features["has_cock"] = !features["has_cock"]
if(features["has_cock"] == FALSE)
@@ -2184,6 +2198,22 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("toggledigestionnoise")
cit_toggles ^= DIGESTION_NOISES
+
+ if("breast_enlargement")
+ cit_toggles ^= BREAST_ENLARGEMENT
+
+ if("penis_enlargement")
+ cit_toggles ^= PENIS_ENLARGEMENT
+
+ if("feminization")
+ cit_toggles ^= FORCED_FEM
+
+ if("masculinization")
+ cit_toggles ^= FORCED_MASC
+
+ if("hypno")
+ cit_toggles ^= HYPNO
+
//END CITADEL EDIT
if("ambientocclusion")
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index c88d246b96..87bba6c5ba 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -181,7 +181,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["widescreenpref"] >> widescreenpref
S["autostand"] >> autostand
S["cit_toggles"] >> cit_toggles
- S["lewdchem"] >> lewdchem
S["preferred_chaos"] >> preferred_chaos
@@ -278,7 +277,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["widescreenpref"], widescreenpref)
WRITE_FILE(S["autostand"], autostand)
WRITE_FILE(S["cit_toggles"], cit_toggles)
- WRITE_FILE(S["lewdchem"], lewdchem)
WRITE_FILE(S["preferred_chaos"], preferred_chaos)
return 1
@@ -517,6 +515,21 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
all_quirks = SANITIZE_LIST(all_quirks)
+ for(var/V in all_quirks) // quirk migration
+ switch(V)
+ if("Acute hepatic pharmacokinesis")
+ DISABLE_BITFIELD(cit_toggles, PENIS_ENLARGEMENT)
+ DISABLE_BITFIELD(cit_toggles, BREAST_ENLARGEMENT)
+ ENABLE_BITFIELD(cit_toggles,FORCED_FEM)
+ ENABLE_BITFIELD(cit_toggles,FORCED_MASC)
+ all_quirks -= V
+ if("Crocin Immunity")
+ ENABLE_BITFIELD(cit_toggles,NO_APHRO)
+ all_quirks -= V
+ if("Buns of Steel")
+ ENABLE_BITFIELD(cit_toggles,NO_ASS_SLAP)
+ all_quirks -= V
+
cit_character_pref_load(S)
return 1
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 36e67048a6..68eddfca8e 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -298,6 +298,33 @@ BLIND // can't see anything
user.regenerate_icons()
return TRUE
+/obj/item/clothing/neck/AltClick(mob/user)
+ . = ..()
+ if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user)))
+ return
+ // Polychrome stuff:
+ if(hasprimary | hassecondary | hastertiary)
+ var/choice = input(user,"polychromic thread options", "Clothing Recolor") as null|anything in list("[hasprimary ? "Primary Color" : ""]", "[hassecondary ? "Secondary Color" : ""]", "[hastertiary ? "Tertiary Color" : ""]") //generates a list depending on the enabled overlays
+ switch(choice) //Lets the list's options actually lead to something
+ if("Primary Color")
+ var/primary_color_input = input(usr,"","Choose Primary Color",primary_color) as color|null //color input menu, the "|null" adds a cancel button to it.
+ if(primary_color_input) //Checks if the color selected is NULL, rejects it if it is NULL.
+ primary_color = sanitize_hexcolor(primary_color_input, desired_format=6, include_crunch=1) //formats the selected color properly
+ update_icon() //updates the item icon
+ user.regenerate_icons() //updates the worn icon. Probably a bad idea, but it works.
+ if("Secondary Color")
+ var/secondary_color_input = input(usr,"","Choose Secondary Color",secondary_color) as color|null
+ if(secondary_color_input)
+ secondary_color = sanitize_hexcolor(secondary_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+ user.regenerate_icons()
+ if("Tertiary Color")
+ var/tertiary_color_input = input(usr,"","Choose Tertiary Color",tertiary_color) as color|null
+ if(tertiary_color_input)
+ tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1)
+ update_icon()
+ user.regenerate_icons()
+ return TRUE
/obj/item/clothing/under/verb/jumpsuit_adjust()
set name = "Adjust Jumpsuit Style"
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 3d318db761..43c99fe7fd 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -89,12 +89,12 @@
/obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot)
. = ..()
- if(user.mind && user.mind.assigned_role == "Clown")
+ if(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY))
SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "noshoes")
/obj/item/clothing/shoes/clown_shoes/dropped(mob/user)
. = ..()
- if(user.mind && user.mind.assigned_role == "Clown")
+ if(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY))
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "noshoes", /datum/mood_event/noshoes)
/obj/item/clothing/shoes/clown_shoes/jester
diff --git a/code/modules/clothing/shoes/taeclowndo.dm b/code/modules/clothing/shoes/taeclowndo.dm
index f2bbdf0ceb..7c891dbde4 100644
--- a/code/modules/clothing/shoes/taeclowndo.dm
+++ b/code/modules/clothing/shoes/taeclowndo.dm
@@ -13,7 +13,7 @@
if(!ishuman(user))
return
var/mob/living/carbon/human/H = user
- if(!(HAS_TRAIT(H, TRAIT_CLUMSY)) && !(H.mind && H.mind.assigned_role == "Clown"))
+ if(!(HAS_TRAIT(H, TRAIT_CLUMSY)) && !(H.mind && HAS_TRAIT(H.mind, TRAIT_CLOWN_MENTALITY)))
return
if(slot == SLOT_SHOES)
spells = new
diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm
index 9a5c919720..bf52b26ae9 100644
--- a/code/modules/clothing/spacesuits/hardsuit.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -590,8 +590,7 @@
/obj/item/clothing/suit/space/hardsuit/clown/mob_can_equip(mob/M, slot)
if(!..() || !ishuman(M))
return FALSE
- var/mob/living/carbon/human/H = M
- if(H.mind.assigned_role == "Clown")
+ if(M.mind && HAS_TRAIT(M.mind, TRAIT_CLOWN_MENTALITY))
return TRUE
else
return FALSE
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 58df911412..177bce672f 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -467,6 +467,33 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+/obj/item/clothing/under/sundresswhite
+ name = "white sundress"
+ desc = "Makes you want to frolic in a field of lillies."
+ icon_state = "sundress_white"
+ item_color = "sundress_white"
+ body_parts_covered = CHEST|GROIN
+ fitted = FEMALE_UNIFORM_TOP
+ can_adjust = FALSE
+
+/obj/item/clothing/under/greendress
+ name = "green dress"
+ desc = "A tight green dress"
+ icon_state = "dress_green"
+ item_color = "dress_green"
+ body_parts_covered = CHEST|GROIN
+ fitted = FEMALE_UNIFORM_TOP
+ can_adjust = FALSE
+
+/obj/item/clothing/under/pinkdress
+ name = "pink dress"
+ desc = "A tight pink dress"
+ icon_state = "dress_pink"
+ item_color = "dress_pink"
+ body_parts_covered = CHEST|GROIN
+ fitted = FEMALE_UNIFORM_TOP
+ can_adjust = FALSE
+
/obj/item/clothing/under/captainparade
name = "captain's parade uniform"
desc = "A captain's luxury-wear, for special occasions."
@@ -509,6 +536,24 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+/obj/item/clothing/under/westernbustle
+ name = "western bustle dress"
+ desc = "Filled with Western fire."
+ icon_state = "western_bustle"
+ item_state = "wcoat"
+ item_color = "western_bustle"
+ fitted = FEMALE_UNIFORM_TOP
+ can_adjust = FALSE
+
+/obj/item/clothing/under/flamenco
+ name = "flamenco dress"
+ desc = "Filled with Latin fire."
+ icon_state = "flamenco"
+ item_state = "wcoat"
+ item_color = "flamenco"
+ fitted = FEMALE_UNIFORM_TOP
+ can_adjust = FALSE
+
/obj/item/clothing/under/stripeddress
name = "striped dress"
desc = "Fashion in space."
@@ -529,6 +574,44 @@
fitted = FEMALE_UNIFORM_TOP
can_adjust = FALSE
+/obj/item/clothing/under/flowerdress
+ name = "flower dress"
+ desc = "Lovely dress"
+ icon_state = "flower_dress"
+ item_state = "sailordress"
+ item_color = "flower_dress"
+ body_parts_covered = CHEST|GROIN
+ fitted = FEMALE_UNIFORM_TOP
+ can_adjust = FALSE
+
+/obj/item/clothing/under/sweptskirt
+ name = "swept skirt"
+ desc = "Formal skirt"
+ icon_state = "skirt_swept"
+ item_color = "skirt_swept"
+ body_parts_covered = GROIN
+ fitted = FEMALE_UNIFORM_TOP
+ can_adjust = FALSE
+
+/obj/item/clothing/under/corset
+ name = "black corset"
+ desc = "Nanotrasen is not resposible for any organ damage"
+ icon_state = "corset"
+ item_color = "corset"
+ body_parts_covered = CHEST|GROIN
+ fitted = FEMALE_UNIFORM_TOP
+ can_adjust = FALSE
+
+/obj/item/clothing/under/croptop
+ name = "crop top"
+ desc = "We've saved money by giving you half a shirt!"
+ icon_state = "sailor_dress"
+ item_state = "sailordress"
+ item_color = "sailor_dress"
+ body_parts_covered = CHEST|GROIN|ARMS
+ fitted = FEMALE_UNIFORM_TOP
+ can_adjust = FALSE
+
/obj/item/clothing/under/redeveninggown
name = "red evening gown"
desc = "Fancy dress for space bar singers."
diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm
index 05616337db..97bb4c48bc 100644
--- a/code/modules/clothing/under/pants.dm
+++ b/code/modules/clothing/under/pants.dm
@@ -75,3 +75,34 @@
desc = "A pair of woodland camouflage pants. Probably not the best choice for a space station."
icon_state = "camopants"
item_color = "camopants"
+
+/obj/item/clothing/under/pants/jeanripped
+ name = "ripped jeans"
+ desc = "If you're wearing this you're poor or a rebel"
+ icon_state = "jean_ripped"
+ item_color = "jean_ripped"
+
+/obj/item/clothing/under/pants/jeanshort
+ name = "jean shorts"
+ desc = "These are really just jeans cut in half"
+ icon_state = "jean_shorts"
+ item_color = "jean_shorts"
+
+/obj/item/clothing/under/pants/denimskirt
+ name = "denim skirt"
+ desc = "These are really just a jean leg hole cut from a pair"
+ icon_state = "denim_skirt"
+ item_color = "denim_skirt"
+
+/obj/item/clothing/under/pants/chaps
+ name = "black chaps"
+ body_parts_covered = LEGS
+ desc = "Yeehaw"
+ icon_state = "chaps"
+ item_color = "chaps"
+
+/obj/item/clothing/under/pants/yoga
+ name = "yoga pants"
+ desc = "Comfy!"
+ icon_state = "yoga_pants"
+ item_color = "yoga_pants"
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index 07a399a1b6..00e3698e1e 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -37,6 +37,8 @@
continue
if(!H.client)
continue
+ if(HAS_TRAIT(H,TRAIT_EXEMPT_HEALTH_EVENTS))
+ continue
if(H.stat == DEAD)
continue
if(HAS_TRAIT(H, TRAIT_VIRUSIMMUNE)) //Don't pick someone who's virus immune, only for it to not do anything.
diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm
index 8db2d98bf0..a47a8b81b4 100644
--- a/code/modules/events/heart_attack.dm
+++ b/code/modules/events/heart_attack.dm
@@ -9,7 +9,7 @@
/datum/round_event/heart_attack/start()
var/list/heart_attack_contestants = list()
for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list))
- if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.diseases) || H.undergoing_cardiac_arrest())
+ if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.diseases) || H.undergoing_cardiac_arrest() || HAS_TRAIT(H,TRAIT_EXEMPT_HEALTH_EVENTS))
continue
if(H.satiety <= -60) //Multiple junk food items recently
heart_attack_contestants[H] = 3
diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm
index 2b0c16ebfc..0553f69b5b 100644
--- a/code/modules/events/mass_hallucination.dm
+++ b/code/modules/events/mass_hallucination.dm
@@ -35,4 +35,6 @@
/datum/hallucination/delusion,
/datum/hallucination/oh_yeah)
for(var/mob/living/carbon/C in GLOB.alive_mob_list)
+ if (HAS_TRAIT(C,TRAIT_EXEMPT_HEALTH_EVENTS))
+ continue
new picked_hallucination(C, TRUE)
\ No newline at end of file
diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm
index 901337cd52..8ee943beb9 100644
--- a/code/modules/events/spontaneous_appendicitis.dm
+++ b/code/modules/events/spontaneous_appendicitis.dm
@@ -15,6 +15,8 @@
continue
if(H.stat == DEAD)
continue
+ if (HAS_TRAIT(H,TRAIT_EXEMPT_HEALTH_EVENTS))
+ continue
if(!H.getorgan(/obj/item/organ/appendix)) //Don't give the disease to some who lacks it, only for it to be auto-cured
continue
if(!(MOB_ORGANIC in H.mob_biotypes)) //biotype sleeper bugs strike again, once again making appendicitis pick a target that can't take it
diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm
index 9ee55c2b6e..3b5159465c 100644
--- a/code/modules/hydroponics/grown/grass_carpet.dm
+++ b/code/modules/hydroponics/grown/grass_carpet.dm
@@ -27,7 +27,7 @@
bitesize_mod = 2
var/stacktype = /obj/item/stack/tile/grass
var/tile_coefficient = 0.02 // 1/50
- wine_power = 15
+ distill_reagent = /datum/reagent/consumable/ethanol/beer/light
/obj/item/reagent_containers/food/snacks/grown/grass/attack_self(mob/user)
to_chat(user, "You prepare the astroturf.")
diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm
index 922b335a39..f8a7e70473 100644
--- a/code/modules/jobs/job_types/clown.dm
+++ b/code/modules/jobs/job_types/clown.dm
@@ -14,6 +14,8 @@
access = list(ACCESS_THEATRE)
minimal_access = list(ACCESS_THEATRE)
+ mind_traits = list(TRAIT_CLOWN_MENTALITY)
+
display_order = JOB_DISPLAY_ORDER_CLOWN
/datum/outfit/job/clown
diff --git a/code/modules/jobs/jobs.dm b/code/modules/jobs/jobs.dm
index 23d20cd27a..ca4280a2a1 100644
--- a/code/modules/jobs/jobs.dm
+++ b/code/modules/jobs/jobs.dm
@@ -71,7 +71,7 @@ GLOBAL_LIST_INIT(exp_jobsmap, list(
GLOBAL_LIST_INIT(exp_specialmap, list(
EXP_TYPE_LIVING = list(), // all living mobs
EXP_TYPE_ANTAG = list(),
- EXP_TYPE_SPECIAL = list("Lifebringer","Ash Walker","Exile","Servant Golem","Free Golem","Hermit","Translocated Vet","Escaped Prisoner","Hotel Staff","SuperFriend","Space Syndicate","Ancient Crew","Space Doctor","Space Bartender","Beach Bum","Skeleton","Zombie","Space Bar Patron","Lavaland Syndicate","Ghost Role"), // Ghost roles
+ EXP_TYPE_SPECIAL = list("Lifebringer","Ash Walker","Exile","Servant Golem","Free Golem","Hermit","Translocated Vet","Escaped Prisoner","Hotel Staff","SuperFriend","Space Syndicate","Ancient Crew","Space Doctor","Space Bartender","Beach Bum","Skeleton","Zombie","Space Bar Patron","Lavaland Syndicate","Ghost Role", "Ghost Cafe Visitor"), // Ghost roles
EXP_TYPE_GHOST = list() // dead people, observers
))
GLOBAL_PROTECT(exp_jobsmap)
diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm
index c1a336eb69..00f63510b6 100644
--- a/code/modules/language/language_holder.dm
+++ b/code/modules/language/language_holder.dm
@@ -134,7 +134,7 @@
/datum/language_holder/synthetic
languages = list(/datum/language/common)
- shadow_languages = list(/datum/language/common, /datum/language/machine, /datum/language/draconic)
+ shadow_languages = list(/datum/language/common, /datum/language/machine, /datum/language/draconic, /datum/language/slime)
/datum/language_holder/empty
languages = list()
diff --git a/code/modules/mob/dead/observer/login.dm b/code/modules/mob/dead/observer/login.dm
index 1b328dbc69..bf86a97574 100644
--- a/code/modules/mob/dead/observer/login.dm
+++ b/code/modules/mob/dead/observer/login.dm
@@ -18,3 +18,6 @@
update_icon(preferred_form)
updateghostimages()
+
+ client.reenter_round_timeout = max(client.reenter_round_timeout, clientless_round_timeout)
+ clientless_round_timeout = client.reenter_round_timeout
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 2b9b01dc18..499236e8ac 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -3,8 +3,6 @@ GLOBAL_LIST_EMPTY(ghost_images_simple) //this is a list of all ghost images as t
GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
-#define CANT_REENTER_ROUND -1
-
/mob/dead/observer
name = "ghost"
desc = "It's a g-g-g-g-ghooooost!" //jinkies!
@@ -21,7 +19,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER)
hud_type = /datum/hud/ghost
movement_type = GROUND | FLYING
var/can_reenter_corpse
- var/reenter_round_timeout = 0 // used to prevent people from coming back through ghost roles/midround antags as they suicide/cryo for a duration set by CONFIG_GET(number/suicide_reenter_round_timer) and CONFIG_GET(number/roundstart_suicide_time_limit)
+ var/clientless_round_timeout = 0 //mobs will lack a client as long as their player is disconnected. See client_defines.dm "reenter_round_timeout"
var/datum/hud/living/carbon/hud = null // hud
var/bootime = 0
var/started_as_observer //This variable is set to 1 when you enter the game as an observer.
@@ -278,9 +276,13 @@ Works together with spawning an observer, noted above.
if(world.time < roundstart_quit_limit) //add up the time difference to their antag rolling penalty if they quit before half a (ingame) hour even passed.
penalty += roundstart_quit_limit - world.time
if(penalty)
- ghost.reenter_round_timeout = world.realtime + penalty
- if(ghost.reenter_round_timeout - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime)
- ghost.reenter_round_timeout = CANT_REENTER_ROUND
+ penalty += world.realtime
+ if(penalty - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime)
+ penalty = CANT_REENTER_ROUND
+ if(client)
+ client.reenter_round_timeout = penalty
+ else //A disconnected player (quite likely for cryopods)
+ ghost.clientless_round_timeout = penalty
transfer_ckey(ghost, FALSE)
return ghost
@@ -339,10 +341,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
ghostize(0, penalize = TRUE)
/mob/dead/observer/proc/can_reenter_round(silent = FALSE)
- if(reenter_round_timeout != CANT_REENTER_ROUND && reenter_round_timeout <= world.realtime)
+ var/timeout = clientless_round_timeout
+ if(client)
+ timeout = client.reenter_round_timeout
+ if(timeout != CANT_REENTER_ROUND && timeout <= world.realtime)
return TRUE
- if(!silent)
- to_chat(src, "You are unable to reenter the round[reenter_round_timeout != CANT_REENTER_ROUND ? " yet. Your ghost role blacklist will expire in [DisplayTimeText(reenter_round_timeout - world.realtime)]" : ""].")
+ if(!silent && client)
+ to_chat(src, "You are unable to reenter the round[timeout != CANT_REENTER_ROUND ? " yet. Your ghost role blacklist will expire in [DisplayTimeText(timeout - world.realtime)]" : ""].")
return FALSE
/mob/dead/observer/Move(NewLoc, direct)
@@ -898,5 +903,3 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
spawners_menu = new(src)
spawners_menu.ui_interact(src)
-
-#undef CANT_REENTER_ROUND
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index d1a483bb1d..eca3a81c4b 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -308,7 +308,7 @@
var/obj/item/organ/vocal_cords/Vc = user.getorganslot(ORGAN_SLOT_VOICE)
if(Vc)
if(istype(Vc, /obj/item/organ/vocal_cords/velvet))
- if(client?.prefs.lewdchem)
+ if(client.prefs.cit_toggles & HYPNO)
msg += "You feel your chords resonate looking at them.\n"
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 93f33c3a3d..165e1fdd31 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -652,7 +652,7 @@
if(mind)
if((mind.assigned_role == "Station Engineer") || (mind.assigned_role == "Chief Engineer") )
gain = 100
- if(mind.assigned_role == "Clown")
+ if(HAS_TRAIT(mind, TRAIT_CLOWN_MENTALITY))
gain = rand(-300, 300)
investigate_log("([key_name(src)]) has been consumed by the singularity.", INVESTIGATE_SINGULO) //Oh that's where the clown ended up!
gib()
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 0ec8cd5f87..e151809885 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1589,20 +1589,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
user.adjustStaminaLossBuffered(3)
return FALSE
else if(aim_for_groin && (target == user || target.lying || same_dir) && (target_on_help || target_restrained || target_aiming_for_groin))
+ if(target.client?.prefs.cit_toggles & NO_ASS_SLAP)
+ to_chat(user,"A force stays your hand, preventing you from slapping \the [target]'s ass!")
+ return FALSE
user.do_attack_animation(target, ATTACK_EFFECT_ASS_SLAP)
user.adjustStaminaLossBuffered(3)
- if(HAS_TRAIT(target, TRAIT_ASSBLASTUSA))
- var/hit_zone = (user.held_index_to_dir(user.active_hand_index) == "l" ? "l_":"r_") + "arm"
- user.adjustStaminaLoss(20, affected_zone = hit_zone)
- user.visible_message(\
- "\The [user] slaps \the [target]'s ass, but their hand bounces off like they hit metal!",\
- "You slap [user == target ? "your" : "\the [target]'s"] ass, but feel an intense amount of pain as you realise their buns are harder than steel!",\
- "You hear a slap."
- )
- playsound(target.loc, 'sound/weapons/tap.ogg', 50, 1, -1)
- user.emote("scream")
- return FALSE
-
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
user.visible_message(\
"\The [user] slaps \the [target]'s ass!",\
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 3247c96632..52ae32b23c 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -51,11 +51,7 @@
. = ..()
to_chat(C, "[info_text]")
- C.real_name = "[pick(GLOB.nightmare_names)]"
- C.name = C.real_name
- if(C.mind)
- C.mind.name = C.real_name
- C.dna.real_name = C.real_name
+ C.fully_replace_character_name("[pick(GLOB.nightmare_names)]")
/datum/species/shadow/nightmare/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
var/turf/T = H.loc
@@ -127,8 +123,8 @@
/obj/item/organ/heart/nightmare/Remove(mob/living/carbon/M, special = 0)
respawn_progress = 0
if(blade && special != HEART_SPECIAL_SHADOWIFY)
- QDEL_NULL(blade)
M.visible_message("\The [blade] disintegrates!")
+ QDEL_NULL(blade)
..()
/obj/item/organ/heart/nightmare/Stop()
@@ -183,15 +179,21 @@
. = ..()
if(!proximity)
return
- if(isopenturf(AM)) //So you can actually melee with it
- return
- if(isliving(AM))
+ if(isopenturf(AM))
+ var/turf/open/T = AM
+ if(T.light_range && !isspaceturf(T)) //no fairy grass or light tile can escape the fury of the darkness.
+ to_chat(user, "You scrape away [T] with your [name] and snuff out its lights.")
+ T.ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
+ else if(isliving(AM))
var/mob/living/L = AM
if(iscyborg(AM))
var/mob/living/silicon/robot/borg = AM
- if(!borg.lamp_cooldown)
+ if(borg.lamp_intensity)
borg.update_headlamp(TRUE, INFINITY)
to_chat(borg, "Your headlamp is fried! You'll need a human to help replace it.")
+ for(var/obj/item/assembly/flash/cyborg/F in borg.held_items)
+ if(!F.crit_fail)
+ F.burn_out()
else
for(var/obj/item/O in AM)
if(O.light_range && O.light_power)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 397d40925b..7cfae9310a 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -594,12 +594,15 @@ Difficulty: Normal
var/list/hit_things = list() //we hit these already, ignore them
var/friendly_fire_check = FALSE
var/bursting = FALSE //if we're bursting and need to hit anyone crossing us
+ var/list/nohurt
-/obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire, list/only_hit_once)
+/obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire, list/only_hit_once, list/donthurt = null)
. = ..()
if(only_hit_once)
hit_things = only_hit_once
friendly_fire_check = friendly_fire
+ if(donthurt)
+ hit_things += donthurt
if(new_caster)
hit_things += new_caster
if(ismineralturf(loc)) //drill mineral turfs
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
index 04a1b4a468..0a8320788e 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm
@@ -24,7 +24,8 @@
var/list/attack_action_types = list()
var/can_talk = FALSE
var/obj/loot_drop = null
-
+ var/owner
+
//Gives player-controlled variants the ability to swap attacks
/mob/living/simple_animal/hostile/asteroid/elite/Initialize(mapload)
. = ..()
@@ -53,14 +54,14 @@
if(ismineralturf(target))
var/turf/closed/mineral/M = target
M.gets_drilled()
-
+
//Elites can't talk (normally)!
/mob/living/simple_animal/hostile/asteroid/elite/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
if(can_talk)
. = ..()
return TRUE
return FALSE
-
+
/*Basic setup for elite attacks, based on Whoneedspace's megafauna attack setup.
While using this makes the system rely on OnFire, it still gives options for timers not tied to OnFire, and it makes using attacks consistent accross the board for player-controlled elites.*/
@@ -82,11 +83,11 @@ While using this makes the system rely on OnFire, it still gives options for tim
/datum/action/innate/elite_attack/Activate()
M.chosen_attack = chosen_attack_num
to_chat(M, chosen_message)
-
+
/mob/living/simple_animal/hostile/asteroid/elite/updatehealth()
. = ..()
update_health_hud()
-
+
/mob/living/simple_animal/hostile/asteroid/elite/update_health_hud()
if(hud_used)
var/severity = 0
@@ -144,7 +145,7 @@ While using this makes the system rely on OnFire, it still gives options for tim
gpstag = "Menacing Signal"
desc = "You're not quite sure how a signal can be menacing."
invisibility = 100
-
+
/obj/structure/elite_tumor/attack_hand(mob/user)
. = ..()
if(ishuman(user))
@@ -179,7 +180,7 @@ While using this makes the system rely on OnFire, it still gives options for tim
activity = TUMOR_INACTIVE
activator = null
-
+
obj/structure/elite_tumor/proc/spawn_elite(var/mob/dead/observer/elitemind)
var/selectedspawn = pick(potentialspawns)
mychild = new selectedspawn(loc)
@@ -199,18 +200,18 @@ obj/structure/elite_tumor/proc/return_elite()
if(boosted)
mychild.maxHealth = mychild.maxHealth * 2
mychild.health = mychild.maxHealth
-
+
/obj/structure/elite_tumor/Initialize(mapload)
. = ..()
internal = new/obj/item/gps/internal/elite(src)
START_PROCESSING(SSobj, src)
-
+
/obj/structure/elite_tumor/Destroy()
STOP_PROCESSING(SSobj, src)
mychild = null
activator = null
return ..()
-
+
/obj/structure/elite_tumor/process()
if(isturf(loc))
for(var/mob/living/simple_animal/hostile/asteroid/elite/elitehere in loc)
@@ -218,7 +219,7 @@ obj/structure/elite_tumor/proc/return_elite()
mychild.adjustHealth(-mychild.maxHealth*0.05)
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(mychild))
H.color = "#FF0000"
-
+
/obj/structure/elite_tumor/attackby(obj/item/I, mob/user, params)
. = ..()
if(istype(I, /obj/item/organ/regenerative_core) && activity == TUMOR_INACTIVE && !boosted)
@@ -232,7 +233,7 @@ obj/structure/elite_tumor/proc/return_elite()
desc = "[desc] This one seems to glow with a strong intensity."
qdel(core)
return TRUE
-
+
/obj/structure/elite_tumor/proc/arena_checks()
if(activity != TUMOR_ACTIVE || QDELETED(src))
return
@@ -240,13 +241,13 @@ obj/structure/elite_tumor/proc/return_elite()
INVOKE_ASYNC(src, .proc/arena_trap) //Gets another arena trap queued up for when this one runs out.
INVOKE_ASYNC(src, .proc/border_check) //Checks to see if our fighters got out of the arena somehow.
addtimer(CALLBACK(src, .proc/arena_checks), 50)
-
+
/obj/structure/elite_tumor/proc/fighters_check()
if(activator != null && activator.stat == DEAD || activity == TUMOR_ACTIVE && QDELETED(activator))
onEliteWon()
if(mychild != null && mychild.stat == DEAD || activity == TUMOR_ACTIVE && QDELETED(mychild))
onEliteLoss()
-
+
/obj/structure/elite_tumor/proc/arena_trap()
var/turf/T = get_turf(src)
if(loc == null)
@@ -257,7 +258,7 @@ obj/structure/elite_tumor/proc/return_elite()
newwall = new /obj/effect/temp_visual/elite_tumor_wall(t, src)
newwall.activator = src.activator
newwall.ourelite = src.mychild
-
+
/obj/structure/elite_tumor/proc/border_check()
if(activator != null && get_dist(src, activator) >= 12)
activator.forceMove(loc)
@@ -267,7 +268,7 @@ obj/structure/elite_tumor/proc/return_elite()
mychild.forceMove(loc)
visible_message("[mychild] suddenly reappears above [src]!")
playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE)
-
+
obj/structure/elite_tumor/proc/onEliteLoss()
playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, 0, 50, TRUE, TRUE)
visible_message("[src] begins to convulse violently before beginning to dissipate.")
@@ -286,7 +287,7 @@ obj/structure/elite_tumor/proc/onEliteLoss()
mychild = null
activator = null
qdel(src)
-
+
obj/structure/elite_tumor/proc/onEliteWon()
activity = TUMOR_PASSIVE
activator = null
@@ -300,7 +301,7 @@ obj/structure/elite_tumor/proc/onEliteWon()
to_chat(mychild, "As the life in the activator's eyes fade, the forcefield around you dies out and you feel your power subside.\nDespite this inferno being your home, you feel as if you aren't welcome here anymore.\nWithout any guidance, your purpose is now for you to decide.")
to_chat(mychild, "Your max health has been halved, but can now heal by standing on your tumor. Note, it's your only way to heal.\nBear in mind, if anyone interacts with your tumor, you'll be resummoned here to carry out another fight. In such a case, you will regain your full max health.\nAlso, be weary of your fellow inhabitants, they likely won't be happy to see you!")
to_chat(mychild, "Note that you are a lavaland monster, and thus not allied to the station. You should not cooperate or act friendly with any station crew unless under extreme circumstances!")
-
+
/obj/item/tumor_shard
name = "tumor shard"
desc = "A strange, sharp, crystal shard from an odd tumor on Lavaland. Stabbing the corpse of a lavaland elite with this will revive them, assuming their soul still lingers. Revived lavaland elites only have half their max health, but are completely loyal to their reviver."
@@ -313,7 +314,7 @@ obj/structure/elite_tumor/proc/onEliteWon()
w_class = WEIGHT_CLASS_SMALL
throw_speed = 3
throw_range = 5
-
+
/obj/item/tumor_shard/afterattack(atom/target, mob/user, proximity_flag)
. = ..()
if(istype(target, /mob/living/simple_animal/hostile/asteroid/elite) && proximity_flag)
@@ -331,10 +332,11 @@ obj/structure/elite_tumor/proc/onEliteWon()
E.health = E.maxHealth
E.desc = "[E.desc] However, this one appears appears less wild in nature, and calmer around people."
E.sentience_type = SENTIENCE_ORGANIC
+ E.owner = user
qdel(src)
else
to_chat(user, "[src] only works on the corpse of a sentient lavaland elite.")
-
+
/obj/effect/temp_visual/elite_tumor_wall
name = "magic wall"
icon = 'icons/turf/walls/hierophant_wall_temp.dmi'
@@ -347,7 +349,7 @@ obj/structure/elite_tumor/proc/onEliteWon()
color = rgb(255,0,0)
light_range = MINIMUM_USEFUL_LIGHT_RANGE
light_color = LIGHT_COLOR_RED
-
+
/obj/effect/temp_visual/elite_tumor_wall/Initialize(mapload, new_caster)
. = ..()
queue_smooth_neighbors(src)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
index 540470d505..e65c4f5b20 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
@@ -44,34 +44,34 @@
/datum/action/innate/elite_attack/magic_box,
/datum/action/innate/elite_attack/pandora_teleport,
/datum/action/innate/elite_attack/aoe_squares)
-
+
var/sing_shot_length = 8
var/cooldown_time = 20
-
+
/datum/action/innate/elite_attack/singular_shot
name = "Singular Shot"
button_icon_state = "singular_shot"
chosen_message = "You are now creating a single linear magic square."
chosen_attack_num = SINGULAR_SHOT
-
+
/datum/action/innate/elite_attack/magic_box
name = "Magic Box"
button_icon_state = "magic_box"
chosen_message = "You are now attacking with a box of magic squares."
chosen_attack_num = MAGIC_BOX
-
+
/datum/action/innate/elite_attack/pandora_teleport
name = "Line Teleport"
button_icon_state = "pandora_teleport"
chosen_message = "You will now teleport to your target."
chosen_attack_num = PANDORA_TELEPORT
-
+
/datum/action/innate/elite_attack/aoe_squares
name = "AOE Blast"
button_icon_state = "aoe_squares"
chosen_message = "Your attacks will spawn an AOE blast at your target location."
chosen_attack_num = AOE_SQUARES
-
+
/mob/living/simple_animal/hostile/asteroid/elite/pandora/OpenFire()
if(client)
switch(chosen_attack)
@@ -94,7 +94,7 @@
pandora_teleport(target)
if(AOE_SQUARES)
aoe_squares(target)
-
+
/mob/living/simple_animal/hostile/asteroid/elite/pandora/Life()
. = ..()
if(health >= maxHealth * 0.5)
@@ -105,28 +105,28 @@
return
else
cooldown_time = 10
-
-/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot(target)
+
+/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot(target)
ranged_cooldown = world.time + (cooldown_time * 0.5)
var/dir_to_target = get_dir(get_turf(src), get_turf(target))
var/turf/T = get_step(get_turf(src), dir_to_target)
singular_shot_line(sing_shot_length, dir_to_target, T)
-
+
/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot_line(var/procsleft, var/angleused, var/turf/T)
if(procsleft <= 0)
return
- new /obj/effect/temp_visual/hierophant/blast/pandora(T, src)
+ new /obj/effect/temp_visual/hierophant/blast/pandora(T, src, null, null, list(owner))
T = get_step(T, angleused)
procsleft = procsleft - 1
addtimer(CALLBACK(src, .proc/singular_shot_line, procsleft, angleused, T), 2)
-
+
/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/magic_box(target)
ranged_cooldown = world.time + cooldown_time
var/turf/T = get_turf(target)
for(var/t in spiral_range_turfs(3, T))
if(get_dist(t, T) > 1)
- new /obj/effect/temp_visual/hierophant/blast/pandora(t, src)
-
+ new /obj/effect/temp_visual/hierophant/blast/pandora(t, src, null, null, list(owner))
+
/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport(target)
ranged_cooldown = world.time + cooldown_time
var/turf/T = get_turf(target)
@@ -135,45 +135,45 @@
new /obj/effect/temp_visual/hierophant/telegraph(source, src)
playsound(source,'sound/machines/airlockopen.ogg', 200, 1)
addtimer(CALLBACK(src, .proc/pandora_teleport_2, T, source), 2)
-
+
/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_2(var/turf/T, var/turf/source)
new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src)
new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, src)
for(var/t in RANGE_TURFS(1, T))
- new /obj/effect/temp_visual/hierophant/blast/pandora(t, src)
+ new /obj/effect/temp_visual/hierophant/blast/pandora(t, src, null, null, list(owner))
for(var/t in RANGE_TURFS(1, source))
- new /obj/effect/temp_visual/hierophant/blast/pandora(t, src)
+ new /obj/effect/temp_visual/hierophant/blast/pandora(t, src, null, null, list(owner))
animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out
visible_message("[src] fades out!")
density = FALSE
addtimer(CALLBACK(src, .proc/pandora_teleport_3, T), 2)
-
+
/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_3(var/turf/T)
forceMove(T)
animate(src, alpha = 255, time = 2, easing = EASE_IN) //fade IN
density = TRUE
visible_message("[src] fades in!")
-
+
/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares(target)
ranged_cooldown = world.time + cooldown_time
var/turf/T = get_turf(target)
- new /obj/effect/temp_visual/hierophant/blast/pandora(T, src)
+ new /obj/effect/temp_visual/hierophant/blast/pandora(T, src, null, null, list(owner))
var/max_size = 2
addtimer(CALLBACK(src, .proc/aoe_squares_2, T, 0, max_size), 2)
-
+
/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares_2(var/turf/T, var/ring, var/max_size)
if(ring > max_size)
return
for(var/t in spiral_range_turfs(ring, T))
if(get_dist(t, T) == ring)
- new /obj/effect/temp_visual/hierophant/blast/pandora(t, src)
+ new /obj/effect/temp_visual/hierophant/blast/pandora(t, src, null, null, list(owner))
addtimer(CALLBACK(src, .proc/aoe_squares_2, T, (ring + 1), max_size), 2)
-
+
//The specific version of hiero's squares pandora uses
/obj/effect/temp_visual/hierophant/blast/pandora
damage = 20
monster_damage_boost = FALSE
-
+
//Pandora's loot: Hope
/obj/item/clothing/accessory/pandora_hope
name = "Hope"
@@ -181,7 +181,7 @@
icon = 'icons/obj/lavaland/elite_trophies.dmi'
icon_state = "hope"
resistance_flags = FIRE_PROOF
-
+
/obj/item/clothing/accessory/pandora_hope/on_uniform_equip(obj/item/clothing/under/U, user)
var/mob/living/L = user
if(L && L.mind)
diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm
index d1a5f12888..c2206fcea8 100644
--- a/code/modules/projectiles/guns/ballistic/revolver.dm
+++ b/code/modules/projectiles/guns/ballistic/revolver.dm
@@ -352,7 +352,7 @@
clumsy_check = 0
/obj/item/gun/ballistic/revolver/reverse/can_trigger_gun(mob/living/user)
- if((HAS_TRAIT(user, TRAIT_CLUMSY)) || (user.mind && user.mind.assigned_role == "Clown"))
+ if((HAS_TRAIT(user, TRAIT_CLUMSY)) || (user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY)))
return ..()
if(process_fire(user, user, FALSE, null, BODY_ZONE_HEAD))
user.visible_message("[user] somehow manages to shoot [user.p_them()]self in the face!", "You somehow shoot yourself in the face! How the hell?!")
diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm
index 1e2070de1b..0465a611cd 100644
--- a/code/modules/projectiles/pins.dm
+++ b/code/modules/projectiles/pins.dm
@@ -135,7 +135,7 @@
// A gun with ultra-honk pin is useful for clown and useless for everyone else.
/obj/item/firing_pin/clown/ultra/pin_auth(mob/living/user)
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
- if(user && (!(HAS_TRAIT(user, TRAIT_CLUMSY)) && !(user.mind && user.mind.assigned_role == "Clown")))
+ if(user && (!(HAS_TRAIT(user, TRAIT_CLUMSY)) && !(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY))))
return FALSE
return TRUE
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index cd50acca1d..b627339b1f 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -589,7 +589,7 @@
M.adjustBruteLoss(-1*REM, 0)
M.adjustFireLoss(-1*REM, 0)
M.adjustOxyLoss(-1*REM, 0)
- M.adjustToxLoss(-1*REM, 0)
+ M.adjustToxLoss(-1*REM, 0, TRUE) //heals TOXINLOVERs
..()
/datum/reagent/consumable/honey/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index b1443534d6..980e823a82 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -27,12 +27,11 @@ Borg Hypospray
var/list/datum/reagents/reagent_list = list()
var/list/reagent_ids = list(/datum/reagent/medicine/dexalin, /datum/reagent/medicine/kelotane, /datum/reagent/medicine/bicaridine, /datum/reagent/medicine/antitoxin,
- /datum/reagent/medicine/epinephrine, /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution)
+ /datum/reagent/medicine/epinephrine, /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution, /datum/reagent/medicine/insulin)
var/accepts_reagent_upgrades = TRUE //If upgrades can increase number of reagents dispensed.
var/list/modes = list() //Basically the inverse of reagent_ids. Instead of having numbers as "keys" and strings as values it has strings as keys and numbers as values.
//Used as list for input() in shakers.
-
/obj/item/reagent_containers/borghypo/Initialize()
. = ..()
@@ -41,12 +40,10 @@ Borg Hypospray
START_PROCESSING(SSobj, src)
-
/obj/item/reagent_containers/borghypo/Destroy()
STOP_PROCESSING(SSobj, src)
return ..()
-
/obj/item/reagent_containers/borghypo/process() //Every [recharge_time] seconds, recharge some reagents for the cyborg
charge_tick++
if(charge_tick >= recharge_time)
@@ -163,7 +160,7 @@ Borg Hypospray
icon_state = "borghypo_s"
charge_cost = 20
recharge_time = 2
- reagent_ids = list(/datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/potass_iodide, /datum/reagent/medicine/morphine)
+ reagent_ids = list(/datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/potass_iodide, /datum/reagent/medicine/morphine, /datum/reagent/medicine/insulin)
bypass_protection = 1
accepts_reagent_upgrades = FALSE
@@ -179,7 +176,6 @@ Borg Shaker
charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster.
recharge_time = 3
accepts_reagent_upgrades = FALSE
-
reagent_ids = list(/datum/reagent/consumable/ethanol/beer, /datum/reagent/consumable/orangejuice, /datum/reagent/consumable/grenadine,
/datum/reagent/consumable/limejuice, /datum/reagent/consumable/tomatojuice, /datum/reagent/consumable/space_cola,
/datum/reagent/consumable/tonic, /datum/reagent/consumable/sodawater, /datum/reagent/consumable/ice,
@@ -242,13 +238,12 @@ Borg Shaker
charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster.
recharge_time = 3
accepts_reagent_upgrades = FALSE
-
reagent_ids = list(/datum/reagent/toxin/fakebeer, /datum/reagent/consumable/ethanol/fernet)
/obj/item/reagent_containers/borghypo/peace
name = "Peace Hypospray"
- reagent_ids = list(/datum/reagent/peaceborg_confuse, /datum/reagent/peaceborg_tire, /datum/reagent/pax/peaceborg)
+ reagent_ids = list(/datum/reagent/peaceborg_confuse, /datum/reagent/peaceborg_tire, /datum/reagent/pax/peaceborg, /datum/reagent/medicine/insulin)
accepts_reagent_upgrades = FALSE
/obj/item/reagent_containers/borghypo/peace/hacked
@@ -260,7 +255,7 @@ Borg Shaker
accepts_reagent_upgrades = FALSE
/obj/item/reagent_containers/borghypo/epi
- name = "epinephrine injector"
+ name = "Stabilizer injector"
desc = "An advanced chemical synthesizer and injection system, designed to stabilize patients."
- reagent_ids = list(/datum/reagent/medicine/epinephrine)
+ reagent_ids = list(/datum/reagent/medicine/epinephrine, /datum/reagent/medicine/insulin)
accepts_reagent_upgrades = FALSE
diff --git a/code/modules/security_levels/security_levels.dm b/code/modules/security_levels/security_levels.dm
index 70b06e6438..13d1543c92 100644
--- a/code/modules/security_levels/security_levels.dm
+++ b/code/modules/security_levels/security_levels.dm
@@ -49,7 +49,7 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN)
else
SSshuttle.emergency.modTimer(1.5)
GLOB.security_level = SEC_LEVEL_BLUE
- sound_to_playing_players('sound/misc/voybluealert.ogg') // Citadel change - Makes alerts play a sound
+ sound_to_playing_players('sound/misc/voybluealert.ogg', volume = 50) // Citadel change - Makes alerts play a sound
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
FA.update_icon()
@@ -66,7 +66,7 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN)
if(SSshuttle.emergency.mode == SHUTTLE_CALL || SSshuttle.emergency.mode == SHUTTLE_RECALL)
SSshuttle.emergency.modTimer(1.6)
GLOB.security_level = SEC_LEVEL_AMBER
- sound_to_playing_players('sound/effects/alert.ogg') // Citadel change - Makes alerts play a sound
+ sound_to_playing_players('sound/effects/alert.ogg', volume = 50) // Citadel change - Makes alerts play a sound
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
FA.update_icon()
@@ -83,7 +83,7 @@ GLOBAL_VAR_INIT(security_level, SEC_LEVEL_GREEN)
else
minor_announce(CONFIG_GET(string/alert_red_downto), "Attention! Code red!")
GLOB.security_level = SEC_LEVEL_RED
- sound_to_playing_players('sound/misc/voyalert.ogg') // Citadel change - Makes alerts play a sound
+ sound_to_playing_players('sound/misc/voyalert.ogg', volume = 50) // Citadel change - Makes alerts play a sound
for(var/obj/machinery/firealarm/FA in GLOB.machines)
if(is_station_level(FA.z))
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index dedff3ae04..161461d099 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -560,7 +560,7 @@
else if((findtext(message, honk_words)))
cooldown = COOLDOWN_MEME
addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, get_turf(user), 'sound/items/bikehorn.ogg', 300, 1), 25)
- if(user.mind && user.mind.assigned_role == "Clown")
+ if(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY))
for(var/mob/living/carbon/C in listeners)
C.slip(140 * power_multiplier)
cooldown = COOLDOWN_MEME
@@ -807,9 +807,8 @@
E.enthrallTally += (power_multiplier*(((length(message))/200) + 1)) //encourage players to say more than one word.
else
E.enthrallTally += power_multiplier*1.25 //thinking about it, I don't know how this can proc
- if(L.canbearoused)
- if(L.client?.prefs.lewdchem)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] is so nice to listen to."), 5)
+ if(L.canbearoused && E.lewd)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] is so nice to listen to."), 5)
E.cooldown += 1
//REWARD mixable works
@@ -820,7 +819,7 @@
power_multiplier *= distancelist[get_dist(user, V)+1]
if(L == user)
continue
- if (L.client?.prefs.lewdchem)
+ if (E.lewd)
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] has praised me!!"), 5)
if(HAS_TRAIT(L, TRAIT_NYMPHO))
L.adjustArousalLoss(2*power_multiplier)
@@ -832,7 +831,7 @@
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've been praised for doing a good job!"), 5)
E.resistanceTally -= power_multiplier
E.enthrallTally += power_multiplier
- var/descmessage = "[(L.client?.prefs.lewdchem?"I feel so happy! I'm a good pet who [E.enthrallGender] loves!":"I did a good job!")]"
+ var/descmessage = "[(E.lewd?"I feel so happy! I'm a good pet who [E.enthrallGender] loves!":"I did a good job!")]"
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise, descmessage)
E.cooldown += 1
@@ -841,10 +840,10 @@
for(var/V in listeners)
var/mob/living/L = V
var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall)
- var/descmessage = "[(L.client?.prefs.lewdchem?"I've failed [E.enthrallGender]... What a bad, bad pet!":"I did a bad job...")]"
+ var/descmessage = "[(E.lewd?"I've failed [E.enthrallGender]... What a bad, bad pet!":"I did a bad job...")]"
if(L == user)
continue
- if (L.client?.prefs.lewdchem)
+ if (E.lewd)
if(HAS_TRAIT(L, TRAIT_MASO))
L.adjustArousalLoss(3*power_multiplier)
descmessage += "And yet, it feels so good..!" //I don't really understand masco, is this the right sort of thing they like?
@@ -871,7 +870,7 @@
var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall)
REMOVE_TRAIT(C, TRAIT_MUTE, "enthrall")
C.silent = 0
- if(C.client?.prefs.lewdchem)
+ if(E.lewd)
addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.enthrallGender]"), 5)
else
addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.master]"), 5)
@@ -887,7 +886,7 @@
E.phase = 3
E.status = null
user.emote("snap")
- if(L.client?.prefs.lewdchem)
+ if(E.lewd)
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve."), 5)
else
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of [E.master]'s fingers brings you back to being under their influence."), 5)
@@ -910,11 +909,11 @@
addtimer(CALLBACK(H, /atom/movable/proc/say, "I feel happy being with you."), 5)
continue
if(2)
- speaktrigger += "[(H.client?.prefs.lewdchem?"I think I'm in love with you... ":"I find you really inspirational, ")]" //'
+ speaktrigger += "[(E.lewd?"I think I'm in love with you... ":"I find you really inspirational, ")]" //'
if(3)
- speaktrigger += "[(H.client?.prefs.lewdchem?"I'm devoted to being your pet":"I'm commited to following your cause!")]! "
+ speaktrigger += "[(E.lewd?"I'm devoted to being your pet":"I'm commited to following your cause!")]! "
if(4)
- speaktrigger += "[(H.client?.prefs.lewdchem?"You are my whole world and all of my being belongs to you, ":"I cannot think of anything else but aiding your cause, ")] "//Redflags!!
+ speaktrigger += "[(E.lewd?"You are my whole world and all of my being belongs to you, ":"I cannot think of anything else but aiding your cause, ")] "//Redflags!!
//mood
var/datum/component/mood/mood = H.GetComponent(/datum/component/mood)
@@ -1003,7 +1002,7 @@
speaktrigger += "I feel like I'm on the brink of losing my mind, "
//horny
- if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && H.client?.prefs.lewdchem)
+ if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && E.lewd)
switch(H.getArousalLoss())
if(40 to 60)
speaktrigger += "I'm feeling a little horny, "
@@ -1013,10 +1012,10 @@
speaktrigger += "I'm really, really horny, "
//collar
- if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar) && H.client?.prefs.lewdchem)
+ if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar) && E.lewd)
speaktrigger += "I love the collar you gave me, "
//End
- if(H.client?.prefs.lewdchem)
+ if(E.lewd)
speaktrigger += "[E.enthrallGender]!"
else
speaktrigger += "[user.first_name()]!"
@@ -1044,7 +1043,7 @@
REMOVE_TRAIT(C, TRAIT_MUTE, "enthrall")
C.silent = 0
E.cooldown += 3
- to_chat(user, "You [(C.client?.prefs.lewdchem?"allow [C] to speak again":"encourage [C] to speak again")].")
+ to_chat(user, "You [(E.lewd?"allow [C] to speak again":"encourage [C] to speak again")].")
//Antiresist
@@ -1074,7 +1073,7 @@
for(var/mob/living/carbon/C in listeners)
var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall)
if(E.phase == 4)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You're unable to forget about [(C.client?.prefs.lewdchem?"the dominating presence of [E.enthrallGender]":"[E.master]")]!"), 5)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You're unable to forget about [(E.lewd?"the dominating presence of [E.enthrallGender]":"[E.master]")]!"), 5)
continue
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!"), 5)
C.Sleeping(50)
@@ -1086,7 +1085,7 @@
if(3)
E.phase = 0
E.cooldown = 0
- if(C.client?.prefs.lewdchem)
+ if(E.lewd)
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5)
else
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You revert to who you were before, with no memory of what happened with [E.master]."), 5)
@@ -1112,7 +1111,7 @@
var/mob/living/carbon/human/H = V
var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall)
if(E.phase > 1)
- if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && H.client?.prefs.lewdchem) // probably a redundant check but for good measure
+ if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && E.lewd) // probably a redundant check but for good measure
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Your [E.enthrallGender] pushes you over the limit, overwhelming your body with pleasure."), 5)
H.mob_climax(forced_climax=TRUE)
H.SetStun(20)
@@ -1168,7 +1167,7 @@
for(var/obj/item/W in items)
if(W == H.wear_suit)
H.dropItemToGround(W, TRUE)
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Before you can even think about it, you quickly remove your clothes in response to [(H.client?.prefs.lewdchem?"your [E.enthrallGender]'s command'":"[E.master]'s directive'")]."), 5)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Before you can even think about it, you quickly remove your clothes in response to [(E.lewd?"your [E.enthrallGender]'s command'":"[E.master]'s directive'")]."), 5)
E.cooldown += 10
//WALK
@@ -1206,7 +1205,7 @@
if(2 to INFINITY)
L.lay_down()
E.cooldown += 10
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[(L.client?.prefs.lewdchem?"You eagerly lie down!":"You suddenly lie down!")]"), 5)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[(E.lewd?"You eagerly lie down!":"You suddenly lie down!")]"), 5)
to_chat(user, "You encourage [L] to lie down.")
//KNOCKDOWN
@@ -1237,7 +1236,7 @@
for (var/trigger in E.customTriggers)
speaktrigger += "[trigger], "
to_chat(user, "[C] whispers, \"[speaktrigger] are my triggers.\"")//So they don't trigger themselves!
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You whisper your triggers to [(C.client?.prefs.lewdchem?"Your [E.enthrallGender]":"[E.master]")]."), 5)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You whisper your triggers to [(E.lewd?"Your [E.enthrallGender]":"[E.master]")]."), 5)
//CUSTOM TRIGGERS
@@ -1249,7 +1248,7 @@
if (get_dist(user, H) > 1)//Requires user to be next to their pet.
to_chat(user, "You need to be next to your pet to give them a new trigger!")
continue
- if(!H.client?.prefs.lewdchem)
+ if(!E.lewd)
to_chat(user, "[H] seems incapable of being implanted with triggers.")
continue
else
@@ -1272,7 +1271,7 @@
E.customTriggers[trigger] = trigger2
log_game("FERMICHEM: [H] has been implanted by [user] with [trigger], triggering [trigger2].")
E.mental_capacity -= 5
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.client?.prefs.lewdchem?"your [E.enthrallGender]":"[E.master]")] whispers you a new trigger."), 5)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(E.lewd?"your [E.enthrallGender]":"[E.master]")] whispers you a new trigger."), 5)
to_chat(user, "You sucessfully set the trigger word [trigger] in [H]")
else
to_chat(user, "Your pet looks at you confused, it seems they don't understand that effect!")
@@ -1290,7 +1289,7 @@
if (get_dist(user, H) > 1)//Requires user to be next to their pet.
to_chat(user, "You need to be next to your pet to give them a new echophrase!")
continue
- if(!H.client?.prefs.lewdchem)
+ if(!E.lewd)
to_chat(user, "[H] seems incapable of being implanted with an echoing phrase.")
continue
else
@@ -1334,7 +1333,7 @@
objective = replacetext(lowertext(objective), "suicide", "self-love")
message_admins("[H] has been implanted by [user] with the objective [objective].")
log_game("FERMICHEM: [H] has been implanted by [user] with the objective [objective] via MKUltra.")
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.client?.prefs.lewdchem?"Your [E.enthrallGender]":"[E.master]")] whispers you a new objective."), 5)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(E.lewd?"Your [E.enthrallGender]":"[E.master]")] whispers you a new objective."), 5)
brainwash(H, objective)
E.mental_capacity -= 200
to_chat(user, "You sucessfully give an objective to [H]")
@@ -1348,7 +1347,7 @@
for(var/V in listeners)
var/mob/living/carbon/human/H = V
var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall)
- if(E.phase >= 3 && H.client?.prefs.lewdchem)
+ if(E.phase >= 3 && E.lewd)
var/instill = stripped_input(user, "Instill an emotion in [H].", MAX_MESSAGE_LEN)
to_chat(H, "[instill]")
to_chat(user, "You sucessfully instill a feeling in [H]")
@@ -1363,7 +1362,7 @@
if(E.phase > 1)
if(user.ckey == E.enthrallID && user.real_name == E.master.real_name)
E.master = user
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.client?.prefs.lewdchem?"You hear the words of your [E.enthrallGender] again!! They're back!!":"You recognise the voice of [E.master].")]"), 5)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(E.lewd?"You hear the words of your [E.enthrallGender] again!! They're back!!":"You recognise the voice of [E.master].")]"), 5)
to_chat(user, "[H] looks at you with sparkling eyes, recognising you!")
//I dunno how to do state objectives without them revealing they're an antag
diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm
index 58c483491d..73ba785ec2 100644
--- a/code/modules/vehicles/cars/clowncar.dm
+++ b/code/modules/vehicles/cars/clowncar.dm
@@ -21,7 +21,7 @@
/obj/vehicle/sealed/car/clowncar/auto_assign_occupant_flags(mob/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.mind && H.mind.assigned_role == "Clown") //Ensures only clowns can drive the car. (Including more at once)
+ if(H.mind && HAS_TRAIT(H.mind, TRAIT_CLOWN_MENTALITY)) //Ensures only clowns can drive the car. (Including more at once)
add_control_flags(M, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_PERMISSION)
return
add_control_flags(M, VEHICLE_CONTROL_KIDNAPPED)
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index 626abd51ef..6144f4c57a 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -70,14 +70,22 @@
/obj/item/clothing/under/skirt/red = 3,
/obj/item/clothing/under/skirt/purple = 3,
/obj/item/clothing/under/sundress = 4,
+ /obj/item/clothing/under/sundresswhite = 4,
/obj/item/clothing/under/stripeddress = 3,
/obj/item/clothing/under/sailordress = 3,
+ /obj/item/clothing/under/sweptskirt = 3,
+ /obj/item/clothing/under/greendress = 3,
+ /obj/item/clothing/under/pinkdress = 3,
/obj/item/clothing/under/redeveninggown = 3,
/obj/item/clothing/under/blacktango = 3,
+ /obj/item/clothing/under/westernbustle = 3,
+ /obj/item/clothing/under/flamenco = 3,
+ /obj/item/clothing/under/flowerdress = 3,
/obj/item/clothing/under/plaid_skirt = 3,
/obj/item/clothing/under/plaid_skirt/blue = 3,
/obj/item/clothing/under/plaid_skirt/purple = 3,
/obj/item/clothing/under/plaid_skirt/green = 3,
+ /obj/item/clothing/under/croptop = 3,
/obj/item/clothing/glasses/regular = 2,
/obj/item/clothing/glasses/regular/jamjar = 2,
/obj/item/clothing/head/sombrero = 3,
diff --git a/html/changelogs/AutoChangeLog-pr-10091.yml b/html/changelogs/AutoChangeLog-pr-10091.yml
new file mode 100644
index 0000000000..8787d9bdba
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10091.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - soundadd: "Blue, Amber and Red security alert sounds should be half as loud now."
diff --git a/html/changelogs/AutoChangeLog-pr-10095.yml b/html/changelogs/AutoChangeLog-pr-10095.yml
new file mode 100644
index 0000000000..5b2ee8f053
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10095.yml
@@ -0,0 +1,5 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - balance: "Buffed clown ops by removing their clumsiness and adding a new trait to be used in place of several clown role checks."
+ - tweak: "Clown ops too also suffer from not holding or wearing clown shoes now."
diff --git a/html/changelogs/AutoChangeLog-pr-10168.yml b/html/changelogs/AutoChangeLog-pr-10168.yml
new file mode 100644
index 0000000000..3e6e5b9af5
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10168.yml
@@ -0,0 +1,4 @@
+author: "Ghommie"
+delete-after: True
+changes:
+ - admin: "Ghost mentors can now orbit around the target instead of setting their view to theirs'."
diff --git a/html/changelogs/AutoChangeLog-pr-10239.yml b/html/changelogs/AutoChangeLog-pr-10239.yml
new file mode 100644
index 0000000000..19172ec379
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10239.yml
@@ -0,0 +1,6 @@
+author: "Ghommie (also porting PRs by AnturK and Arkatos)"
+delete-after: True
+changes:
+ - bugfix: "Fixed light eaters not burning out borg lamplights and flashes.
+fix Fixed light eater not affecting open turfs emitting lights such as light tiles and fairy grass."
+ - bugfix: "Fixed an empty reference about light eater armblade disintegration after Heart of Darkness removal."
diff --git a/html/changelogs/AutoChangeLog-pr-10243.yml b/html/changelogs/AutoChangeLog-pr-10243.yml
new file mode 100644
index 0000000000..86bc608f02
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10243.yml
@@ -0,0 +1,8 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - rscadd: "New tab in preferences screen: \"ERP preferences\""
+ - rscadd: "New opt-outs for individual effects of incubus draught, succubus milk"
+ - rscdel: "Acute hepatic pharmacokinesis has been removed, replaced with above"
+ - tweak: "Renamed \"Toggle Lewdchem\" to \"Toggle Lewd MKUltra\", since that's what it actually means, and made it toggle the \"hypno\" setting (rename it again if more hypno mechanics are added)."
+ - tweak: "Made MKUltra's lewd messages require both people involved to have hypno opted-in."
diff --git a/html/changelogs/AutoChangeLog-pr-10312.yml b/html/changelogs/AutoChangeLog-pr-10312.yml
new file mode 100644
index 0000000000..9de774f355
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10312.yml
@@ -0,0 +1,4 @@
+author: "Commandersand"
+delete-after: True
+changes:
+ - rscadd: "Added new things to loadouts, check em"
diff --git a/html/changelogs/AutoChangeLog-pr-10318.yml b/html/changelogs/AutoChangeLog-pr-10318.yml
new file mode 100644
index 0000000000..8dc58b9922
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10318.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Silicons now know what a slime is saying!"
diff --git a/html/changelogs/AutoChangeLog-pr-10320.yml b/html/changelogs/AutoChangeLog-pr-10320.yml
new file mode 100644
index 0000000000..473791dc3b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10320.yml
@@ -0,0 +1,4 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - bugfix: "fixes some ghost roles from dying of stupid shit"
diff --git a/html/changelogs/AutoChangeLog-pr-10323.yml b/html/changelogs/AutoChangeLog-pr-10323.yml
new file mode 100644
index 0000000000..50385665d6
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10323.yml
@@ -0,0 +1,4 @@
+author: "Seris02"
+delete-after: True
+changes:
+ - bugfix: "pandoras attacking their owners"
diff --git a/html/changelogs/AutoChangeLog-pr-10324.yml b/html/changelogs/AutoChangeLog-pr-10324.yml
new file mode 100644
index 0000000000..f012bc272b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10324.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - balance: "honey now will not kill slimes. Honey slimepeople can be a thing now, go sci."
diff --git a/html/changelogs/AutoChangeLog-pr-10328.yml b/html/changelogs/AutoChangeLog-pr-10328.yml
new file mode 100644
index 0000000000..740a07ddce
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10328.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - bugfix: "Ghost cafe spawns are actual ghost roles by the game's reckoning now"
diff --git a/html/changelogs/AutoChangeLog-pr-10331.yml b/html/changelogs/AutoChangeLog-pr-10331.yml
new file mode 100644
index 0000000000..1d69c40f29
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10331.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Added insulin into many of the borg hypo's"
diff --git a/html/changelogs/AutoChangeLog-pr-10333.yml b/html/changelogs/AutoChangeLog-pr-10333.yml
new file mode 100644
index 0000000000..b5c11a4646
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10333.yml
@@ -0,0 +1,4 @@
+author: "Trilbyspaceclone"
+delete-after: True
+changes:
+ - rscadd: "Grass now makes light beer when distilled"
diff --git a/html/changelogs/AutoChangeLog-pr-10334.yml b/html/changelogs/AutoChangeLog-pr-10334.yml
new file mode 100644
index 0000000000..0d4bb069ff
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10334.yml
@@ -0,0 +1,4 @@
+author: "keronshb"
+delete-after: True
+changes:
+ - rscadd: "Adds reflector blobs to shield blob upgrades"
diff --git a/html/changelogs/AutoChangeLog-pr-10335.yml b/html/changelogs/AutoChangeLog-pr-10335.yml
new file mode 100644
index 0000000000..28fdf169a2
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10335.yml
@@ -0,0 +1,4 @@
+author: "kappa-sama"
+delete-after: True
+changes:
+ - bugfix: "throats are no longer slit happy"
diff --git a/html/changelogs/AutoChangeLog-pr-10336.yml b/html/changelogs/AutoChangeLog-pr-10336.yml
new file mode 100644
index 0000000000..a7271759bd
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10336.yml
@@ -0,0 +1,4 @@
+author: "ItzGabby"
+delete-after: True
+changes:
+ - bugfix: "Fixed AltClick on polychromic collars so they actually work now."
diff --git a/html/changelogs/AutoChangeLog-pr-10348.yml b/html/changelogs/AutoChangeLog-pr-10348.yml
new file mode 100644
index 0000000000..82898a971c
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-10348.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - bugfix: "a runtime in radioactive contamination"
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index c5981b06a3..fb2f4ab0d6 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ
diff --git a/icons/mob/uniform_digi.dmi b/icons/mob/uniform_digi.dmi
index b4f3e6130b..e568d70310 100644
Binary files a/icons/mob/uniform_digi.dmi and b/icons/mob/uniform_digi.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 60753839d2..2dcd8b9a06 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
index 2231a1f0bf..4449ca801a 100644
--- a/modular_citadel/code/datums/status_effects/chems.dm
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -209,12 +209,12 @@
//Preamble
-/mob/living/verb/toggle_lewd()
+/mob/living/verb/toggle_hypno()
set category = "IC"
- set name = "Toggle Lewdchem"
- set desc = "Allows you to toggle if you'd like lewd flavour messages."
- client.prefs.lewdchem = !(client.prefs.lewdchem)
- to_chat(usr, "You [(client.prefs.lewdchem?"will":"no longer")] receive lewdchem messages.")
+ set name = "Toggle Lewd MKUltra"
+ set desc = "Allows you to toggle if you'd like lewd flavour messages for MKUltra."
+ client.prefs.cit_toggles ^= HYPNO
+ to_chat(usr, "You [((client.prefs.cit_toggles & HYPNO) ?"will":"no longer")] receive lewd flavour messages for MKUltra.")
/datum/status_effect/chem/enthrall
id = "enthrall"
@@ -252,6 +252,8 @@
var/customEcho //Custom looping text in owner
var/customSpan //Custom spans for looping text
+ var/lewd = FALSE // Set on on_apply. Will only be true if both individuals involved have opted in.
+
/datum/status_effect/chem/enthrall/on_apply()
var/mob/living/carbon/M = owner
var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in M.reagents.reagent_list
@@ -269,10 +271,11 @@
var/mob/living/carbon/human/H = owner
if(H)//Prefs
if(!H.canbearoused)
- H.client?.prefs.lewdchem = FALSE
- var/message = "[(owner.client?.prefs.lewdchem?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]"
+ H.client?.prefs.cit_toggles &= ~HYPNO
+ lewd = (owner.client?.prefs.cit_toggles & HYPNO) && (master.client?.prefs.cit_toggles & HYPNO)
+ var/message = "[(lewd ? "I am a good pet for [enthrallGender]." : "[master] is a really inspirational person!")]"
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message)
- to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!")
+ to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!")
log_game("FERMICHEM: MKULTRA: Status applied on [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].")
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Enthrall attempts")
return ..()
@@ -318,7 +321,7 @@
resistanceTally /= 2
enthrallTally = 0
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Enthralled to state 2")
- if(owner.client?.prefs.lewdchem)
+ if(lewd)
to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.")
else
to_chat(owner, "Your conciousness slips, as you feel more drawn to following [master].")
@@ -327,11 +330,11 @@
phase = -1
to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!")
if(DistApart < 10)
- to_chat(master, "[(master.client?.prefs.lewdchem?"Your pet":"Your thrall")] seems to have broken free of your enthrallment!")
+ to_chat(master, "[(lewd?"Your pet":"Your thrall")] seems to have broken free of your enthrallment!")
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Thralls broken free")
owner.remove_status_effect(src) //If resisted in phase 1, effect is removed.
if(prob(10))
- if(owner.client?.prefs.lewdchem)
+ if(lewd)
to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].")
if (2) //partially enthralled
if(enthrallTally > 200)
@@ -339,12 +342,12 @@
mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity.
enthrallTally = 0
resistanceTally /= 2
- if(owner.client?.prefs.lewdchem)
+ if(lewd)
to_chat(owner, "Your mind gives, eagerly obeying and serving [master].")
to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP.
else
to_chat(owner, "You are unable to put up a resistance any longer, and now are under the influence of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot follow [master] in death. ")
- to_chat(master, "Your [(master.client?.prefs.lewdchem?"pet":"follower")] [owner] appears to have fully fallen under your sway.")
+ to_chat(master, "Your [(lewd?"pet":"follower")] [owner] appears to have fully fallen under your sway.")
log_game("FERMICHEM: MKULTRA: Status on [owner] ckey: [owner.key] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].")
SSblackbox.record_feedback("tally", "fermi_chem", 1, "thralls fully enthralled.")
else if (resistanceTally > 200)
@@ -353,20 +356,18 @@
resistanceTally = 0
resistGrowth = 0
to_chat(owner, "You manage to shake some of the effects from your addled mind, however you can still feel yourself drawn towards [master].")
- if(prob(10))
- if(owner.client?.prefs.lewdchem)
- to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].")
+ if(lewd && prob(10))
+ to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].")
if (3)//fully entranced
if ((resistanceTally >= 200 && withdrawalTick >= 150) || (HAS_TRAIT(M, TRAIT_MINDSHIELD) && (resistanceTally >= 100)))
enthrallTally = 0
phase -= 1
resistanceTally = 0
resistGrowth = 0
- to_chat(owner, "The separation from [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.")
+ to_chat(owner, "The separation from [(lewd?"your [enthrallGender]":"[master]")] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.")
REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra")
- if(prob(1))
- if(owner.client?.prefs.lewdchem && !customEcho)
- to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].")
+ if(lewd && prob(1) && !customEcho)
+ to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].")
if (4) //mindbroken
if (mental_capacity >= 499 && (owner.getOrganLoss(ORGAN_SLOT_BRAIN) <=0 || HAS_TRAIT(M, TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent(/datum/reagent/fermi/enthrall))
phase = 2
@@ -382,7 +383,7 @@
cooldownMsg = FALSE
else if (cooldownMsg == FALSE)
if(DistApart < 10)
- if(master.client?.prefs.lewdchem)
+ if(lewd)
to_chat(master, "Your pet [owner] appears to have finished internalising your last command.")
cooldownMsg = TRUE
else
@@ -390,7 +391,7 @@
cooldownMsg = TRUE
if(get_dist(master, owner) > 10)
if(prob(10))
- to_chat(owner, "You feel [(owner.client?.prefs.lewdchem?"a deep NEED to return to your [enthrallGender]":"like you have to return to [master]")].")
+ to_chat(owner, "You feel [(lewd ?"a deep NEED to return to your [enthrallGender]":"like you have to return to [master]")].")
M.throw_at(get_step_towards(master,owner), 5, 1)
return//If you break the mind of someone, you can't use status effects on them.
@@ -423,29 +424,29 @@
if (withdrawal == TRUE)//Your minions are really REALLY needy.
switch(withdrawalTick)//denial
if(5)//To reduce spam
- to_chat(owner, "You are unable to complete [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")]'s orders without their presence, and any commands and objectives given to you prior are not in effect until you are back with them.")
+ to_chat(owner, "You are unable to complete [(lewd?"your [enthrallGender]":"[master]")]'s orders without their presence, and any commands and objectives given to you prior are not in effect until you are back with them.")
ADD_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") //IMPORTANT
if(10 to 35)//Gives wiggle room, so you're not SUPER needy
if(prob(5))
- to_chat(owner, "You're starting to miss [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")].")
+ to_chat(owner, "You're starting to miss [(lewd?"your [enthrallGender]":"[master]")].")
if(prob(5))
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.1)
- to_chat(owner, "[(owner.client?.prefs.lewdchem?"[enthrallGender]":"[master]")] will surely be back soon") //denial
+ to_chat(owner, "[(lewd?"[enthrallGender]":"[master]")] will surely be back soon") //denial
if(36)
- var/message = "[(owner.client?.prefs.lewdchem?"I feel empty when [enthrallGender]'s not around..":"I miss [master]'s presence")]"
+ var/message = "[(lewd?"I feel empty when [enthrallGender]'s not around..":"I miss [master]'s presence")]"
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1, message)
if(37 to 65)//barganing
if(prob(10))
to_chat(owner, "They are coming back, right...?")
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5)
if(prob(10))
- if(owner.client?.prefs.lewdchem)
+ if(lewd)
to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.")
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1.5)
if(66)
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1")
- var/message = "[(owner.client?.prefs.lewdchem?"I feel so lost in this complicated world without [enthrallGender]..":"I have to return to [master]!")]"
- to_chat(owner, "You start to feel really angry about how you're not with [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")]!")
+ var/message = "[(lewd?"I feel so lost in this complicated world without [enthrallGender]..":"I have to return to [master]!")]"
+ to_chat(owner, "You start to feel really angry about how you're not with [(lewd?"your [enthrallGender]":"[master]")]!")
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2, message)
owner.stuttering += 50
owner.jitteriness += 250
@@ -453,15 +454,15 @@
if(prob(10))
addtimer(CALLBACK(M, /mob/verb/a_intent_change, INTENT_HARM), 2)
addtimer(CALLBACK(M, /mob/proc/click_random_mob), 2)
- if(owner.client?.prefs.lewdchem)
+ if(lewd)
to_chat(owner, "You are overwhelmed with anger at the lack of [enthrallGender]'s presence and suddenly lash out!")
else
to_chat(owner, "You are overwhelmed with anger and suddenly lash out!")
if(90)
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2")
- var/message = "[(owner.client?.prefs.lewdchem?"Where are you [enthrallGender]??!":"I need to find [master]!")]"
+ var/message = "[(lewd?"Where are you [enthrallGender]??!":"I need to find [master]!")]"
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing3", /datum/mood_event/enthrallmissing3, message)
- if(owner.client?.prefs.lewdchem)
+ if(lewd)
to_chat(owner, "You need to find your [enthrallGender] at all costs, you can't hold yourself back anymore!")
else
to_chat(owner, "You need to find [master] at all costs, you can't hold yourself back anymore!")
@@ -474,15 +475,15 @@
M.hallucination += 10
if(101)
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3")
- var/message = "[(owner.client?.prefs.lewdchem?"I'm all alone, It's so hard to continute without [enthrallGender]...":"I really need to find [master]!!!")]"
+ var/message = "[(lewd?"I'm all alone, It's so hard to continute without [enthrallGender]...":"I really need to find [master]!!!")]"
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4, message)
- to_chat(owner, "You can hardly find the strength to continue without [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")].")
+ to_chat(owner, "You can hardly find the strength to continue without [(lewd?"your [enthrallGender]":"[master]")].")
M.gain_trauma_type(BRAIN_TRAUMA_SEVERE)
if(102 to 140) //depression 2, revengeance
if(prob(20))
owner.Stun(50)
owner.emote("cry")//does this exist?
- if(owner.client?.prefs.lewdchem)
+ if(lewd)
to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.")
else
to_chat(owner, "You are overwheled with withdrawl from [master].")
@@ -504,7 +505,7 @@
deltaResist += 5
owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1)
if(prob(20))
- if(owner.client?.prefs.lewdchem)
+ if(lewd)
to_chat(owner, "Maybe you'll be okay without your [enthrallGender].")
else
to_chat(owner, "You feel your mental functions slowly begin to return.")
@@ -537,7 +538,7 @@
else if(status == "charge")
owner.add_movespeed_modifier(MOVESPEED_ID_MKULTRA, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING))
status = "charged"
- if(master.client?.prefs.lewdchem)
+ if(lewd)
to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!")
else
to_chat(owner, "[master]'s command fills you with a burst of speed!")
@@ -560,7 +561,7 @@
//adrenals?
//customEcho
- if(customEcho && withdrawal == FALSE && owner.client?.prefs.lewdchem)
+ if(customEcho && withdrawal == FALSE && lewd)
if(prob(2))
if(!customSpan) //just in case!
customSpan = "notice"
@@ -576,7 +577,7 @@
cooldownMsg = FALSE
else if (cooldownMsg == FALSE)
if(DistApart < 10)
- if(master.client?.prefs.lewdchem)
+ if(lewd)
to_chat(master, "Your pet [owner] appears to have finished internalising your last command.")
else
to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.")
@@ -609,7 +610,7 @@
/datum/status_effect/chem/enthrall/proc/owner_hear(datum/source, list/hearing_args)
- if(owner.client?.prefs.lewdchem == FALSE)
+ if(lewd == FALSE)
return
if (cTriggered > 0)
return
@@ -638,7 +639,7 @@
//Shocking truth!
else if (lowertext(customTriggers[trigger]) == "shock")
- if (C.canbearoused && C.client?.prefs.lewdchem)
+ if (C.canbearoused && lewd)
C.adjustArousalLoss(5)
C.jitteriness += 100
C.stuttering += 25
@@ -648,7 +649,7 @@
//wah intensifies wah-rks
else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- if (HAS_TRAIT(C, TRAIT_NYMPHO) && C.client?.prefs.lewdchem)
+ if (HAS_TRAIT(C, TRAIT_NYMPHO) && lewd)
if (C.getArousalLoss() > 80)
C.mob_climax(forced_climax=TRUE)
C.SetStun(10)//We got your stun effects in somewhere, Kev.
@@ -689,20 +690,20 @@
if (status == "Sleeper" || phase == 0)
return
else if (phase == 4)
- if(owner.client?.prefs.lewdchem)
+ if(lewd)
to_chat(owner, "Your mind is too far gone to even entertain the thought of resisting. Unless you can fix the brain damage, you won't be able to break free of your [enthrallGender]'s control.")
else
to_chat(owner, "Your brain is too overwhelmed with from the high volume of chemicals in your system, rendering you unable to resist, unless you can fix the brain damage.")
return
else if (phase == 3 && withdrawal == FALSE)
- if(owner.client?.prefs.lewdchem)
+ if(lewd)
to_chat(owner, "The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance. If you get split up from them, then you might be able to entertain the idea of resisting.")
else
to_chat(owner, "You are unable to resist [master] in your current state. If you get split up from them, then you might be able to resist.")
return
else if (status == "Antiresist")//If ordered to not resist; resisting while ordered to not makes it last longer, and increases the rate in which you are enthralled.
if (statusStrength > 0)
- if(owner.client?.prefs.lewdchem)
+ if(lewd)
to_chat(owner, "The order from your [enthrallGender] to give in is conflicting with your attempt to resist, drawing you deeper into trance! You'll have to wait a bit before attemping again, lest your attempts become frustrated again.")
else
to_chat(owner, "The order from your [master] to give in is conflicting with your attempt to resist. You'll have to wait a bit before attemping again, lest your attempts become frustrated again.")
@@ -742,7 +743,7 @@
deltaResist *= 1.25
if (owner.reagents.has_reagent(/datum/reagent/medicine/neurine))
deltaResist *= 1.5
- if (!HAS_TRAIT(owner, TRAIT_CROCRIN_IMMUNE) && M.canbearoused && owner.client?.prefs.lewdchem)
+ if (!(owner.client?.prefs.cit_toggles & NO_APHRO) && M.canbearoused && lewd)
if (owner.reagents.has_reagent(/datum/reagent/drug/anaphrodisiac))
deltaResist *= 1.5
if (owner.reagents.has_reagent(/datum/reagent/drug/anaphrodisiacplus))
diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm
index 53fe6a8f56..e75ba17801 100755
--- a/modular_citadel/code/game/machinery/vending.dm
+++ b/modular_citadel/code/game/machinery/vending.dm
@@ -52,6 +52,7 @@
/obj/item/clothing/mask/muzzle = 4,
/obj/item/clothing/under/stripper_pink = 3,
/obj/item/clothing/under/stripper_green = 3,
+ /obj/item/clothing/under/corset = 3,
/obj/item/clothing/under/gear_harness = 10,
/obj/item/dildo/custom = 5,
/obj/item/electropack/shockcollar = 3,
@@ -71,7 +72,8 @@
)
premium = list(
/obj/item/clothing/accessory/skullcodpiece/fake = 3,
- /obj/item/reagent_containers/glass/bottle/hexacrocin = 10
+ /obj/item/reagent_containers/glass/bottle/hexacrocin = 10,
+ /obj/item/clothing/under/pants/chaps = 5
)
refill_canister = /obj/item/vending_refill/kink
diff --git a/modular_citadel/code/modules/client/client_procs.dm b/modular_citadel/code/modules/client/client_procs.dm
index 3b91deb6e5..f20dd08a51 100644
--- a/modular_citadel/code/modules/client/client_procs.dm
+++ b/modular_citadel/code/modules/client/client_procs.dm
@@ -19,6 +19,12 @@
mentor_follow(M)
return TRUE
+ if(href_list["mentor_unfollow"])
+ var/mob/living/M = locate(href_list["mentor_follow"])
+ if(M && mentor_datum.following == M)
+ mentor_unfollow()
+ return TRUE
+
/client/proc/mentor_datum_set(admin)
mentor_datum = GLOB.mentor_datums[ckey]
if(!mentor_datum && check_rights_for(src, R_ADMIN,0)) // admin with no mentor datum?let's fix that
diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm
index 72709069eb..64ed0d363d 100644
--- a/modular_citadel/code/modules/client/loadout/uniform.dm
+++ b/modular_citadel/code/modules/client/loadout/uniform.dm
@@ -103,6 +103,45 @@
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/stripeddress
+/datum/gear/sundresswhite
+ name = "White Sundress"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/sundresswhite
+
+/datum/gear/sundress
+ name = "Sundress"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/sundress
+
+/datum/gear/greendress
+ name = "Green Dress"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/greendress
+
+/datum/gear/pinkdress
+ name = "Pink Dress"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/pinkdress
+/datum/gear/flowerdress
+ name = "Flower Dress"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/flowerdress
+
+/datum/gear/sweptskirt
+ name = "Swept skirt"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/sweptskirt
+
+/datum/gear/croptop
+ name = "Croptop"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/croptop
+
+/datum/gear/yoga
+ name = "Yoga Pants"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/pants/yoga
+
/datum/gear/kilt
name = "Kilt"
category = SLOT_W_UNIFORM
@@ -116,7 +155,7 @@
/datum/gear/athleticshorts
name = "Athletic Shorts"
category = SLOT_W_UNIFORM
- path = /obj/item/clothing/under/shorts
+ path = /obj/item/clothing/under/shorts/red
/datum/gear/bjeans
name = "Black Jeans"
@@ -153,6 +192,26 @@
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/pants/track
+/datum/gear/rippedjeans
+ name = "Ripped Jeans"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/pants/jeanripped
+
+/datum/gear/jeanshort
+ name = "Jean Shorts"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/pants/jeanshort
+
+/datum/gear/denimskirt
+ name = "Denim Skirt"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/pants/denimskirt
+
+/datum/gear/yoga
+ name = "Yoga Pants"
+ category = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/pants/yoga
+
// Pantsless Sweaters
/datum/gear/turtleneck
@@ -362,4 +421,4 @@
category = SLOT_W_UNIFORM
path = /obj/item/clothing/under/stripper_green
cost = 3
-
+
diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm
index 29f8a113e8..dfe419964e 100644
--- a/modular_citadel/code/modules/client/preferences.dm
+++ b/modular_citadel/code/modules/client/preferences.dm
@@ -15,7 +15,6 @@
var/arousable = TRUE
var/widescreenpref = TRUE
var/autostand = TRUE
- var/lewdchem = FALSE
//vore prefs
var/toggleeatingnoise = TRUE
@@ -54,6 +53,5 @@ datum/preferences/copy_to(mob/living/carbon/human/character, icon_updates = 1)
character.give_genitals(TRUE)
character.flavor_text = features["flavor_text"] //Let's update their flavor_text at least initially
character.canbearoused = arousable
- character.client?.prefs.lewdchem = lewdchem
if(icon_updates)
character.update_genitals()
diff --git a/modular_citadel/code/modules/mentor/follow.dm b/modular_citadel/code/modules/mentor/follow.dm
index 6695155ad0..5da3ce4726 100644
--- a/modular_citadel/code/modules/mentor/follow.dm
+++ b/modular_citadel/code/modules/mentor/follow.dm
@@ -1,16 +1,18 @@
/client/proc/mentor_follow(mob/living/M)
if(!is_mentor())
return
- if(isnull(M))
- return
- if(!ismob(usr))
- return
- mentor_datum.following = M
- usr.reset_perspective(M)
- verbs += /client/proc/mentor_unfollow
- to_chat(GLOB.admins, "MENTOR: [key_name(usr)] is now following [key_name(M)]")
- to_chat(usr, "Click the \"Stop Following\" button in the Mentor tab to stop following [key_name(M)].")
- log_mentor("[key_name(usr)] began following [key_name(M)]")
+ var/orbiting = TRUE
+ if(!isobserver(usr))
+ mentor_datum.following = M
+ usr.reset_perspective(M)
+ verbs += /client/proc/mentor_unfollow
+ to_chat(usr, "Click the \"Stop Following\" button here or in the Mentor tab to stop following [key_name(M)].")
+ orbiting = FALSE
+ else
+ var/mob/dead/observer/O = usr
+ O.ManualFollow(M)
+ to_chat(GLOB.admins, "MENTOR: [key_name(usr)] is now [orbiting ? "orbiting" : "following"] [key_name(M)][key_name(M)][orbiting ? " as a ghost" : ""].")
+ log_mentor("[key_name(usr)] [orbiting ? "is now orbiting" : "began following"][key_name(M)][orbiting ? " as a ghost" : ""].")
/client/proc/mentor_unfollow()
set category = "Mentor"
@@ -21,6 +23,6 @@
return
usr.reset_perspective()
verbs -= /client/proc/mentor_unfollow
- to_chat(GLOB.admins, "MENTOR: [key_name(usr)] is no longer following [key_name(mentor_datum.following)]")
- log_mentor("[key_name(usr)] stopped following [key_name(mentor_datum.following)]")
+ to_chat(GLOB.admins, "MENTOR: [key_name(usr)] is no longer following [key_name(mentor_datum.following)].")
+ log_mentor("[key_name(usr)] stopped following [key_name(mentor_datum.following)].")
mentor_datum.following = null
\ No newline at end of file
diff --git a/modular_citadel/code/modules/mentor/mentorhelp.dm b/modular_citadel/code/modules/mentor/mentorhelp.dm
index 87b05a3f26..eb2b8546da 100644
--- a/modular_citadel/code/modules/mentor/mentorhelp.dm
+++ b/modular_citadel/code/modules/mentor/mentorhelp.dm
@@ -19,7 +19,7 @@
log_mentor("MENTORHELP: [key_name_mentor(src, 0, 0, 0, 0)]: [msg]")
for(var/client/X in GLOB.mentors | GLOB.admins)
- X << 'sound/items/bikehorn.ogg'
+ SEND_SOUND(X, 'sound/items/bikehorn.ogg')
to_chat(X, mentor_msg)
to_chat(src, "PM to-Mentors: [msg]")
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
index 31c0e70939..facc2db1db 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
@@ -167,6 +167,9 @@ Creating a chem with a low purity will make you permanently fall in love with so
/datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M)
. = ..()
+ if(M.client?.prefs.cit_toggles & NEVER_HYPNO) // Just in case people are opting out of this
+ holder.remove_reagent(id, 10000000)
+ return
if(!ishuman(M))//Just to make sure screwy stuff doesn't happen.
return
if(!creatorID)
@@ -180,7 +183,7 @@ Creating a chem with a low purity will make you permanently fall in love with so
E.enthrallID = creatorID
E.enthrallGender = creatorGender
E.master = get_mob_by_key(creatorID)
- to_chat(M, to_chat(M, "Your aldled, plastic, mind bends under the chemical influence of a new [(M.client?.prefs.lewdchem?"master":"leader")]. Your highest priority is now to stay by [creatorName]'s side, following and aiding them at all costs.")) //THIS SHOULD ONLY EVER APPEAR IF YOU MINDBREAK YOURSELF AND THEN GET INJECTED FROM SOMEONE ELSE.
+ to_chat(M, "Your addled, plastic, mind bends under the chemical influence of a new [(E.lewd?"master":"leader")]. Your highest priority is now to stay by [creatorName]'s side, following and aiding them at all costs.") //THIS SHOULD ONLY EVER APPEAR IF YOU MINDBREAK YOURSELF AND THEN GET INJECTED FROM SOMEONE ELSE.
log_game("FERMICHEM: Narcissist [M] ckey: [M.key] been rebound to [creatorName], ID: [creatorID]")
return
if((M.ckey == creatorID) && (creatorName == M.real_name)) //same name AND same player - same instance of the player. (should work for clones?)
@@ -191,7 +194,7 @@ Creating a chem with a low purity will make you permanently fall in love with so
Vc.Remove(M)
nVc.Insert(M)
qdel(Vc)
- to_chat(M, "You feel your vocal chords tingle you speak in a more charasmatic and sultry tone.)]")
+ to_chat(M, "You feel your vocal chords tingle you speak in a more charasmatic and sultry tone.")
else
log_game("FERMICHEM: MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]")
M.apply_status_effect(/datum/status_effect/chem/enthrall)
@@ -227,7 +230,6 @@ Creating a chem with a low purity will make you permanently fall in love with so
M.reagents.del_reagent(type)
FallInLove(C, M)
return
-
if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it supresses the vocal effects, for stealth. NEVERMIND ADD THIS LATER I CAN'T GET IT TO WORK
return
if(!M.client)
@@ -258,7 +260,7 @@ Creating a chem with a low purity will make you permanently fall in love with so
E.master = creator
else
E = M.has_status_effect(/datum/status_effect/chem/enthrall)
- if(M.client?.prefs.lewdchem)
+ if(E.lewd)
to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side and protect them at all costs.")
else
to_chat(M, "The might volume of chemicals in your system overwhelms your mind, and you suddenly agree with what [creatorName] has been saying. Your highest priority is now to stay by their side and protect them at all costs.")
@@ -284,6 +286,7 @@ Creating a chem with a low purity will make you permanently fall in love with so
chemical_flags = REAGENT_DONOTSPLIT
can_synth = FALSE
var/mob/living/carbon/love
+ var/lewd = FALSE
/datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M)//Love gas, only affects while it's in your system,Gives a positive moodlet if close, gives brain damagea and a negative moodlet if not close enough.
if(HAS_TRAIT(M, TRAIT_MINDSHIELD))
@@ -299,24 +302,25 @@ Creating a chem with a low purity will make you permanently fall in love with so
if(!love)
return
M.apply_status_effect(STATUS_EFFECT_INLOVE, love)
- to_chat(M, "[(M.client?.prefs.lewdchem?"":"")][(M.client?.prefs.lewdchem?"You develop a sudden crush on [love], your heart beginning to race as you look upon them with new eyes.":"You suddenly feel like making friends with [love].")] You feel strangely drawn towards them.")
+ lewd = (M.client?.prefs.cit_toggles & HYPNO) && (love.client?.prefs.cit_toggles & HYPNO)
+ to_chat(M, "[(lewd?"":"")][(lewd?"You develop a sudden crush on [love], your heart beginning to race as you look upon them with new eyes.":"You suddenly feel like making friends with [love].")] You feel strangely drawn towards them.")
log_game("FERMICHEM: [M] ckey: [M.key] has temporarily bonded with [love] ckey: [love.key]")
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have bonded")
else
if(get_dist(M, love) < 8)
if(HAS_TRAIT(M, TRAIT_NYMPHO)) //Add this back when merged/updated.
M.adjustArousalLoss(5)
- var/message = "[(M.client?.prefs.lewdchem?"I'm next to my crush..! Eee!":"I'm making friends with [love]!")]"
+ var/message = "[(lewd?"I'm next to my crush..! Eee!":"I'm making friends with [love]!")]"
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "InLove", /datum/mood_event/InLove, message)
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove")
else
- var/message = "[(M.client?.prefs.lewdchem?"I can't keep my crush off my mind, I need to see them again!":"I really want to make friends with [love]!")]"
+ var/message = "[(lewd?"I can't keep my crush off my mind, I need to see them again!":"I really want to make friends with [love]!")]"
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove, message)
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove")
if(prob(5))
M.Stun(10)
M.emote("whimper")//does this exist?
- to_chat(M, "[(M.client?.prefs.lewdchem?"":"")] You're overcome with a desire to see [love].")
+ to_chat(M, "[(lewd?"":"")] You're overcome with a desire to see [love].")
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5)//I found out why everyone was so damaged!
..()
@@ -326,7 +330,7 @@ Creating a chem with a low purity will make you permanently fall in love with so
M.remove_status_effect(STATUS_EFFECT_INLOVE)
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove")
SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove")
- to_chat(M, "[(M.client?.prefs.lewdchem?"":"")]Your feelings for [love] suddenly vanish!")
+ to_chat(M, "[(lewd?"":"")]Your feelings for [love] suddenly vanish!")
log_game("FERMICHEM: [M] ckey: [M.key] is no longer in temp bond")
..()
@@ -334,7 +338,8 @@ Creating a chem with a low purity will make you permanently fall in love with so
if(Lover.has_status_effect(STATUS_EFFECT_INLOVE))
to_chat(Lover, "You are already fully devoted to someone else!")
return
- to_chat(Lover, "[(Lover.client?.prefs.lewdchem?"":"")]You develop a deep and sudden bond with [Love][(Lover.client?.prefs.lewdchem?", your heart beginning to race as your mind filles with thoughts about them.":".")] You are determined to keep them safe and happy, and feel drawn towards them.")
+ var/lewd = (Lover.client?.prefs.cit_toggles & HYPNO) && (Love.client?.prefs.cit_toggles & HYPNO)
+ to_chat(Lover, "[(lewd?"":"")]You develop a deep and sudden bond with [Love][(lewd?", your heart beginning to race as your mind filles with thoughts about them.":".")] You are determined to keep them safe and happy, and feel drawn towards them.")
if(Lover.mind)
Lover.mind.store_memory("You are in love with [Love].")
Lover.faction |= "[REF(Love)]"
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
index 8e1b879448..b6b9c0bf34 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm
@@ -55,8 +55,8 @@
var/mob/living/carbon/human/H = M
var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS)
- //If they have Acute hepatic pharmacokinesis, then route processing though liver.
- if(HAS_TRAIT(H, TRAIT_PHARMA) || !H.canbearoused)
+ //If they've opted out, then route processing though liver.
+ if(!(H.client?.prefs.cit_toggles & BREAST_ENLARGEMENT))
var/obj/item/organ/liver/L = H.getorganslot(ORGAN_SLOT_LIVER)
if(L)
L.swelling += 0.05
@@ -93,9 +93,7 @@
return ..()
/datum/reagent/fermi/breast_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders.
-
- //Acute hepatic pharmacokinesis.
- if(HAS_TRAIT(M, TRAIT_PHARMA) || !M.canbearoused)
+ if(!(M.client?.prefs.cit_toggles & FORCED_FEM))
var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER)
L.swelling+= 0.05
return ..()
@@ -131,15 +129,10 @@
/datum/reagent/fermi/BEsmaller/on_mob_life(mob/living/carbon/M)
var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS)
- if(!B)
- //Acute hepatic pharmacokinesis.
- if(HAS_TRAIT(M, TRAIT_PHARMA) || !M.canbearoused)
- var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER)
- L.swelling-= 0.05
- return ..()
-
- //otherwise proceed as normal
- return..()
+ if(!(M.client?.prefs.cit_toggles & BREAST_ENLARGEMENT) || !B)
+ var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER)
+ L.swelling-= 0.05
+ return ..()
B.modify_size(-0.05)
return ..()
@@ -217,8 +210,7 @@
return ..()
var/mob/living/carbon/human/H = M
var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS)
- //If they have Acute hepatic pharmacokinesis, then route processing though liver.
- if(HAS_TRAIT(H, TRAIT_PHARMA) || !H.canbearoused)
+ if(!(H.client?.prefs.cit_toggles & PENIS_ENLARGEMENT))
var/obj/item/organ/liver/L = H.getorganslot(ORGAN_SLOT_LIVER)
if(L)
L.swelling += 0.05
@@ -248,8 +240,7 @@
/datum/reagent/fermi/penis_enlarger/overdose_process(mob/living/carbon/human/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders.
if(!istype(M))
return ..()
- //Acute hepatic pharmacokinesis.
- if(HAS_TRAIT(M, TRAIT_PHARMA) || !M.canbearoused)
+ if(!(M.client?.prefs.cit_toggles & FORCED_MASC))
var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER)
L.swelling+= 0.05
return..()
@@ -287,11 +278,9 @@
return ..()
var/mob/living/carbon/human/H = M
var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS)
- if(!P)
- //Acute hepatic pharmacokinesis.
- if(HAS_TRAIT(M, TRAIT_PHARMA))
- var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER)
- L.swelling-= 0.05
+ if(!(H.client?.prefs.cit_toggles & PENIS_ENLARGEMENT) || !P)
+ var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER)
+ L.swelling-= 0.05
return..()
P.modify_size(-0.1)
diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
index dd27d195e5..b907c27329 100644
--- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
+++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
@@ -97,7 +97,7 @@
color = "#FFADFF"//PINK, rgb(255, 173, 255)
/datum/reagent/drug/aphrodisiac/on_mob_life(mob/living/M)
- if(M && M.canbearoused && !HAS_TRAIT(M, TRAIT_CROCRIN_IMMUNE))
+ if(M && M.canbearoused && !(M.client?.prefs.cit_toggles & NO_APHRO))
if(prob(33))
M.adjustArousalLoss(2)
if(prob(5))
@@ -118,7 +118,7 @@
overdose_threshold = 20
/datum/reagent/drug/aphrodisiacplus/on_mob_life(mob/living/M)
- if(M && M.canbearoused && !HAS_TRAIT(M, TRAIT_CROCRIN_IMMUNE))
+ if(M && M.canbearoused && !(M.client?.prefs.cit_toggles & NO_APHRO))
if(prob(33))
M.adjustArousalLoss(6)//not quite six times as powerful, but still considerably more powerful.
if(prob(5))
@@ -150,7 +150,7 @@
..()
/datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M)
- if(M && M.canbearoused && !HAS_TRAIT(M, TRAIT_CROCRIN_IMMUNE) && prob(33))
+ if(M && M.canbearoused && !(M.client?.prefs.cit_toggles & NO_APHRO) && prob(33))
if(prob(5) && M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna())
if(prob(5)) //Less spam
to_chat(M, "Your libido is going haywire!")
|