diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm
index e29be375e6..c3bf3d2891 100644
--- a/code/__DEFINES/citadel_defines.dm
+++ b/code/__DEFINES/citadel_defines.dm
@@ -72,9 +72,6 @@
#define MILK_RATE_MULT 1
#define MILK_EFFICIENCY 1
-#define AROUSAL_MINIMUM_DEFAULT 0
-#define AROUSAL_MAXIMUM_DEFAULT 100
-#define AROUSAL_START_VALUE 1
//Individual logging define
#define INDIVIDUAL_LOOC_LOG "LOOC log"
@@ -82,9 +79,6 @@
#define ADMIN_IC(client) "(IC)"//marks and adminhelp as an IC issue
#define ADMIN_REJECT(client) "(REJT)"//Rejects an adminhelp for being unclear or otherwise unhelpful. resets their adminhelp timer
-//Damage stuffs
-#define AROUSAL "arousal"
-
//Citadel istypes
#define isgenital(A) (istype(A, /obj/item/organ/genital))
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 4f66482f51..4a7afd5762 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -161,9 +161,8 @@
#define TRAIT_TAGGER "tagger"
#define TRAIT_PHOTOGRAPHER "photographer"
#define TRAIT_MUSICIAN "musician"
-#define TRAIT_NYMPHO "nymphomania"
-#define TRAIT_MASO "masochism"
-#define TRAIT_EXHIBITIONIST "exhibitionist"
+#define TRAIT_PERMABONER "permanent_arousal"
+#define TRAIT_NEVERBONER "never_aroused"
#define TRAIT_HIGH_BLOOD "high_blood"
#define TRAIT_PARA "paraplegic"
#define TRAIT_EMPATH "empath"
diff --git a/code/__HELPERS/_cit_helpers.dm b/code/__HELPERS/_cit_helpers.dm
index 8134494306..6b0c8cd848 100644
--- a/code/__HELPERS/_cit_helpers.dm
+++ b/code/__HELPERS/_cit_helpers.dm
@@ -99,7 +99,7 @@ GLOBAL_LIST_INIT(meat_types, list(
"Mammalian" = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/mammal,
"Aquatic" = /obj/item/reagent_containers/food/snacks/carpmeat/aquatic,
"Avian" = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/avian,
- "Inesct" = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect))
+ "Insect" = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/insect))
//Crew objective and miscreants stuff
GLOBAL_VAR_INIT(miscreants_allowed, FALSE)
diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm
index 09794444d1..1d1836716b 100644
--- a/code/_onclick/hud/hud.dm
+++ b/code/_onclick/hud/hud.dm
@@ -61,9 +61,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list(
// subtypes can override this to force a specific UI style
var/ui_style
- //Citadel stuff
- var/obj/screen/arousal
-
/datum/hud/New(mob/owner)
mymob = owner
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index 78a2d2fd17..809c9161aa 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -336,11 +336,6 @@
healths = new /obj/screen/healths()
healths.hud = src
infodisplay += healths
- //CIT CHANGE - adds arousal and stamina to hud
- arousal = new /obj/screen/arousal()
- arousal.icon_state = (owner.canbearoused == 1 ? "arousal0" : "")
- arousal.hud = src
- infodisplay += arousal
staminas = new /obj/screen/staminas()
staminas.hud = src
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index feac1de972..8bed902207 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -96,7 +96,6 @@
CLONE:[M.getCloneLoss()]
BRAIN:[M.getOrganLoss(ORGAN_SLOT_BRAIN)]
STAMINA:[M.getStaminaLoss()]
- AROUSAL:[M.getArousalLoss()]
"}
if(GLOB.Debug2)
atomsnowflake += {"
@@ -1355,9 +1354,6 @@
if("stamina")
L.adjustStaminaLoss(amount)
newamt = L.getStaminaLoss()
- if("arousal")
- L.adjustArousalLoss(amount)
- newamt = L.getArousalLoss()
if("heart")
L.adjustOrganLoss(ORGAN_SLOT_HEART, amount)
newamt = L.getOrganLoss(ORGAN_SLOT_HEART)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index a0aa729a8d..33ebff17ca 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -132,12 +132,8 @@
//CIT CHANGE - makes arousal update when transfering bodies
if(isliving(new_character)) //New humans and such are by default enabled arousal. Let's always use the new mind's prefs.
var/mob/living/L = new_character
- if(L.client && L.client.prefs)
- L.canbearoused = L.client.prefs.arousable //Technically this should make taking over a character mean the body gain the new minds setting...
- L.update_arousal_hud() //Removes the old icon
- if (L.client.prefs.auto_ooc)
- if (L.client.prefs.chat_toggles & CHAT_OOC)
- L.client.prefs.chat_toggles ^= CHAT_OOC
+ if(L.client && L.client.prefs & L.client.prefs.auto_ooc & L.client.prefs.chat_toggles & CHAT_OOC)
+ DISABLE_BITFIELD(L.client.prefs.chat_toggles,CHAT_OOC)
SEND_SIGNAL(src, COMSIG_MIND_TRANSFER, new_character, old_character)
diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm
index 911929896b..91146d55a0 100644
--- a/code/datums/traits/neutral.dm
+++ b/code/datums/traits/neutral.dm
@@ -87,37 +87,3 @@
/datum/quirk/monochromatic/remove()
if(quirk_holder)
quirk_holder.remove_client_colour(/datum/client_colour/monochrome)
-
-/datum/quirk/libido
- name = "Nymphomania"
- desc = "You're always feeling a bit in heat. Also, you get aroused faster than usual."
- value = 0
- mob_trait = TRAIT_NYMPHO
- gain_text = "You are feeling extra wild."
- lose_text = "You don't feel that burning sensation anymore."
-
-/datum/quirk/libido/add()
- quirk_holder.min_arousal = 16
- quirk_holder.arousal_rate = 3
-
-/datum/quirk/libido/remove()
- if(quirk_holder)
- quirk_holder.min_arousal = initial(quirk_holder.min_arousal)
- quirk_holder.arousal_rate = initial(quirk_holder.arousal_rate)
-
-/datum/quirk/maso
- name = "Masochism"
- desc = "You are aroused by pain."
- value = 0
- mob_trait = TRAIT_MASO
- gain_text = "You desire to be hurt."
- lose_text = "Pain has become less exciting for you."
-
-/datum/quirk/exhibitionism
- name = "Exhibitionism"
- desc = "You don't mind showing off your bare body to strangers, in fact you find it quite satistying."
- value = 0
- medical_record_text = "Patient has been diagnosed with exhibitionistic disorder."
- mob_trait = TRAIT_EXHIBITIONIST
- gain_text = "You feel like exposing yourself to the world."
- lose_text = "Indecent exposure doesn't sound as charming to you anymore."
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index d78b9fe6fd..ed8042b360 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -109,11 +109,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
else if(current_version < 23) // we are fixing a gamebreaking bug.
job_preferences = list() //It loaded null from nonexistant savefile field.
- if(current_version < 24 && S["feature_exhibitionist"])
- var/datum/quirk/exhibitionism/E
- var/quirk_name = initial(E.name)
- all_quirks += quirk_name
-
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
return
diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm
index 46f8017b10..4f9afd9ed5 100644
--- a/code/modules/integrated_electronics/subtypes/input.dm
+++ b/code/modules/integrated_electronics/subtypes/input.dm
@@ -1310,34 +1310,3 @@
set_pin_data(IC_OUTPUT, 2, regurgitated_contents)
push_data()
activate_pin(2)
-
-//Degens
-/obj/item/integrated_circuit/input/bonermeter
- name = "bonermeter"
- desc = "Detects the target's arousal and various statistics about the target's arousal levels. Invasive!"
- icon_state = "medscan"
- complexity = 4
- inputs = list("target" = IC_PINTYPE_REF)
- outputs = list(
- "current arousal" = IC_PINTYPE_NUMBER,
- "minimum arousal" = IC_PINTYPE_NUMBER,
- "maximum arousal" = IC_PINTYPE_NUMBER,
- "can be aroused" = IC_PINTYPE_BOOLEAN
- )
- activators = list("scan" = IC_PINTYPE_PULSE_IN, "on scanned" = IC_PINTYPE_PULSE_OUT)
- spawn_flags = IC_SPAWN_RESEARCH
- power_draw_per_use = 40
-
-/obj/item/integrated_circuit/input/bonermeter/do_work()
-
- var/mob/living/L = get_pin_data_as_type(IC_INPUT, 1, /mob/living)
-
- if(!istype(L) || !L.Adjacent(get_turf(src)) ) //Invalid input
- return
-
- set_pin_data(IC_OUTPUT, 1, L.getArousalLoss())
- set_pin_data(IC_OUTPUT, 2, L.min_arousal)
- set_pin_data(IC_OUTPUT, 3, L.max_arousal)
- set_pin_data(IC_OUTPUT, 4, L.canbearoused)
- push_data()
- activate_pin(2)
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm
index d893108bcd..5bffc4e276 100644
--- a/code/modules/mob/living/carbon/damage_procs.dm
+++ b/code/modules/mob/living/carbon/damage_procs.dm
@@ -41,9 +41,6 @@
update_damage_overlays()
else
adjustStaminaLoss(damage_amount, forced = forced)
- //citadel code
- if(AROUSAL)
- adjustArousalLoss(damage_amount)
return TRUE
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 821a3472e4..7507067597 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -39,10 +39,6 @@
//Stuff jammed in your limbs hurts
handle_embedded_objects()
- if(stat != DEAD)
- //process your dick energy
- handle_arousal(times_fired)
-
//Update our name based on whether our face is obscured/disfigured
name = get_visible_name()
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 2e069297b3..a8603a2a41 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -323,12 +323,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
for(var/datum/disease/A in C.diseases)
A.cure(FALSE)
-//CITADEL EDIT
- if(NOAROUSAL in species_traits)
- C.canbearoused = FALSE
- else
- if(C.client)
- C.canbearoused = C.client.prefs.arousable
if(ishuman(C))
var/mob/living/carbon/human/H = C
if(NOGENITALS in H.dna.species.species_traits)
@@ -1586,8 +1580,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
"You slap [user == target ? "yourself" : "\the [target]"] in the face! ",\
"You hear a slap."
)
- if (!HAS_TRAIT(target, TRAIT_NYMPHO))
- stop_wagging_tail(target)
user.do_attack_animation(target, ATTACK_EFFECT_FACE_SLAP)
user.adjustStaminaLossBuffered(3)
return FALSE
@@ -1602,14 +1594,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
"\The [user] slaps \the [target]'s ass!",\
"You slap [user == target ? "your" : "\the [target]'s"] ass!",\
"You hear a slap."
- )
- if (target.canbearoused)
- target.adjustArousalLoss(5)
- if (target.getArousalLoss() >= 100 && ishuman(target) && HAS_TRAIT(target, TRAIT_MASO) && target.has_dna())
- target.mob_climax(forced_climax=TRUE)
- if (!HAS_TRAIT(target, TRAIT_NYMPHO))
- stop_wagging_tail(target)
-
+ )
return FALSE
else if(attacker_style && attacker_style.disarm_act(user,target))
return 1
@@ -1962,10 +1947,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(BP)
if(damage > 0 ? BP.receive_damage(damage_amount, 0) : BP.heal_damage(abs(damage_amount), 0))
H.update_damage_overlays()
- if(HAS_TRAIT(H, TRAIT_MASO))
- H.adjustArousalLoss(damage_amount, 0)
- if (H.getArousalLoss() >= 100 && ishuman(H) && H.has_dna())
- H.mob_climax(forced_climax=TRUE)
else//no bodypart, we deal damage with a more general method.
H.adjustBruteLoss(damage_amount)
@@ -1996,8 +1977,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
if(BRAIN)
var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brain_mod
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, damage_amount)
- if(AROUSAL) //Citadel edit - arousal
- H.adjustArousalLoss(damage * hit_percent)
return 1
/datum/species/proc/on_hit(obj/item/projectile/P, mob/living/carbon/human/H)
diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
index e8551074e7..07d4b13b14 100644
--- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm
@@ -966,7 +966,12 @@
M.emote("nya")
if(prob(20))
to_chat(M, "[pick("Headpats feel nice.", "Backrubs would be nice.", "Mew")]")
- M.adjustArousalLoss(5)
+ if(M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO) && prob(5))
+ for(var/obj/item/organ/genital/G in M.internal_organs)
+ if(!G.aroused_state && prob(5))
+ G.aroused_state = TRUE
+ to_chat(M, "You feel like playing with your [G.name]!")
+
..()
/datum/reagent/consumable/monkey_energy
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index bd6eb4244c..60ef8053b1 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -2280,5 +2280,10 @@
M.emote("nya")
if(prob(20))
to_chat(M, "[pick("Headpats feel nice.", "The feeling of a hairball...", "Backrubs would be nice.", "Whats behind those doors?")]")
- M.adjustArousalLoss(2)
+ if(M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO && ishuman(M)))
+ var/mob/living/carbon/human/H = M
+ for(var/obj/item/organ/genital/G in H.internal_organs)
+ if(!G.aroused_state && prob(2))
+ G.aroused_state = TRUE
+ to_chat(M, "You feel like playing with your [G.name]!")
..()
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 161461d099..7df7421c69 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -578,7 +578,8 @@
cooldown = COOLDOWN_MEME
for(var/V in listeners)
var/mob/living/carbon/human/H = V
- if(H.canbearoused && H.has_dna() && HAS_TRAIT(H, TRAIT_NYMPHO)) // probably a redundant check but for good measure
+
+ if(H.client && H.client.prefs && H.client.prefs.cit_toggles & HYPNO) // probably a redundant check but for good measure
H.mob_climax(forced_climax=TRUE)
//DAB
@@ -807,7 +808,7 @@
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 && E.lewd)
+ if(E.lewd)
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] is so nice to listen to."), 5)
E.cooldown += 1
@@ -821,12 +822,6 @@
continue
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)
- if(HAS_TRAIT(L, TRAIT_MASO))
- E.enthrallTally -= power_multiplier
- E.resistanceTally += power_multiplier
- E.cooldown += 1
else
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've been praised for doing a good job!"), 5)
E.resistanceTally -= power_multiplier
@@ -844,14 +839,7 @@
if(L == user)
continue
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?
- E.enthrallTally += power_multiplier
- E.resistanceTally -= power_multiplier
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've let [E.enthrallGender] down...!"), 5)
- else
- addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've let [E.enthrallGender] down..."), 5)
+ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've let [E.enthrallGender] down..."), 5)
else
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've failed [E.master]..."), 5)
E.resistanceTally += power_multiplier
@@ -1001,16 +989,6 @@
if(160 to INFINITY)
speaktrigger += "I feel like I'm on the brink of losing my mind, "
- //horny
- if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && E.lewd)
- switch(H.getArousalLoss())
- if(40 to 60)
- speaktrigger += "I'm feeling a little horny, "
- if(60 to 80)
- speaktrigger += "I'm feeling horny, "
- if(80 to INFINITY)
- speaktrigger += "I'm really, really horny, "
-
//collar
if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar) && E.lewd)
speaktrigger += "I love the collar you gave me, "
@@ -1111,11 +1089,10 @@
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 && E.lewd) // probably a redundant check but for good measure
+ if(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)
- H.setArousalLoss(H.min_arousal)
E.resistanceTally = 0 //makes resistance 0, but resets arousal, resistance buildup is faster unaroused (massively so).
E.enthrallTally += power_multiplier
E.cooldown += 6
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
index 8adc7c0745..4e43b6a8b7 100644
--- a/modular_citadel/code/datums/status_effects/chems.dm
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -268,10 +268,6 @@
RegisterSignal(owner, COMSIG_LIVING_RESIST, .proc/owner_resist) //Do resistance calc if resist is pressed#
RegisterSignal(owner, COMSIG_MOVABLE_HEAR, .proc/owner_hear)
mental_capacity = 500 - M.getOrganLoss(ORGAN_SLOT_BRAIN)//It's their brain!
- var/mob/living/carbon/human/H = owner
- if(H)//Prefs
- if(!H.canbearoused)
- 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)
@@ -625,8 +621,6 @@
//Speak (Forces player to talk)
if (lowertext(customTriggers[trigger][1]) == "speak")//trigger2
var/saytext = "Your mouth moves on it's own before you can even catch it."
- if(HAS_TRAIT(C, TRAIT_NYMPHO))
- saytext += " You find yourself fully believing in the validity of what you just said and don't think to question it."
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "[saytext]"), 5)
addtimer(CALLBACK(C, /atom/movable/proc/say, "[customTriggers[trigger][2]]"), 5)
log_game("FERMICHEM: MKULTRA: [owner] ckey: [owner.key] has been forced to say: \"[customTriggers[trigger][2]]\" from previous trigger.")
@@ -639,8 +633,6 @@
//Shocking truth!
else if (lowertext(customTriggers[trigger]) == "shock")
- if (C.canbearoused && lewd)
- C.adjustArousalLoss(5)
C.jitteriness += 100
C.stuttering += 25
C.Knockdown(60)
@@ -649,13 +641,11 @@
//wah intensifies wah-rks
else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
- 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.
- else
- C.adjustArousalLoss(10)
- to_chat(C, "You feel a surge of arousal!")
+ if (lewd)
+ if(ishuman(C))
+ var/mob/living/carbon/human/H = C
+ H.mob_climax(forced_climax=TRUE)
+ C.SetStun(10)//We got your stun effects in somewhere, Kev.
else
C.throw_at(get_step_towards(hearing_args[HEARING_SPEAKER],C), 3, 1) //cut this if it's too hard to get working
@@ -734,16 +724,13 @@
if(prob(5))
M.emote("me",1,"squints, shaking their head for a moment.")//shows that you're trying to resist sometimes
deltaResist *= 1.5
- //nymphomania
- if (M.canbearoused && HAS_TRAIT(M, TRAIT_NYMPHO))//I'm okay with this being removed.
- deltaResist*= 0.5-(((2/200)*M.arousalloss)/1)//more aroused you are, the weaker resistance you can give, the less you are, the more you gain. (+/- 0.5)
//chemical resistance, brain and annaphros are the key to undoing, but the subject has to to be willing to resist.
if (owner.reagents.has_reagent("mannitol"))
deltaResist *= 1.25
if (owner.reagents.has_reagent("neurine"))
deltaResist *= 1.5
- if (!(owner.client?.prefs.cit_toggles & NO_APHRO) && M.canbearoused && lewd)
+ if (!(owner.client?.prefs.cit_toggles & NO_APHRO) && lewd)
if (owner.reagents.has_reagent("anaphro"))
deltaResist *= 1.5
if (owner.reagents.has_reagent("anaphro+"))
diff --git a/modular_citadel/code/modules/arousal/arousal.dm b/modular_citadel/code/modules/arousal/arousal.dm
index ed28185bb7..5f58121fd4 100644
--- a/modular_citadel/code/modules/arousal/arousal.dm
+++ b/modular_citadel/code/modules/arousal/arousal.dm
@@ -1,17 +1,8 @@
-//Mob vars
/mob/living
- var/arousalloss = 0 //How aroused the mob is.
- var/min_arousal = AROUSAL_MINIMUM_DEFAULT //The lowest this mobs arousal will get. default = 0
- var/max_arousal = AROUSAL_MAXIMUM_DEFAULT //The highest this mobs arousal will get. default = 100
- var/arousal_rate = AROUSAL_START_VALUE //The base rate that arousal will increase in this mob.
- var/arousal_loss_rate = AROUSAL_START_VALUE //How easily arousal can be relieved for this mob.
- var/canbearoused = FALSE //Mob-level disabler for arousal. Starts off and can be enabled as features are added for different mob types.
var/mb_cd_length = 5 SECONDS //5 second cooldown for masturbating because fuck spam.
var/mb_cd_timer = 0 //The timer itself
/mob/living/carbon/human
- canbearoused = TRUE
-
var/saved_underwear = ""//saves their underwear so it can be toggled later
var/saved_undershirt = ""
var/saved_socks = ""
@@ -21,8 +12,6 @@
//Species vars
/datum/species
- var/arousal_gain_rate = AROUSAL_START_VALUE //Rate at which this species becomes aroused
- var/arousal_lose_rate = AROUSAL_START_VALUE //Multiplier for how easily arousal can be relieved
var/list/cum_fluids = list("semen")
var/list/milk_fluids = list("milk")
var/list/femcum_fluids = list("femcum")
@@ -30,7 +19,7 @@
//Mob procs
/mob/living/carbon/human/proc/underwear_toggle()
set name = "Toggle undergarments"
- set category = "IC"
+ set category = "Arousal"
var/confirm = input(src, "Select what part of your form to alter", "Undergarment Toggling") as null|anything in list("Top", "Bottom", "Socks", "All")
if(!confirm)
@@ -52,131 +41,6 @@
update_body()
-/mob/living/proc/handle_arousal(times_fired)
- return
-
-/mob/living/carbon/handle_arousal(times_fired)
- if(!canbearoused || !dna)
- return
- var/datum/species/S = dna.species
- if(!S || (times_fired % 36) || !getArousalLoss() >= max_arousal)//Totally stolen from breathing code. Do this every 36 ticks.
- return
- var/our_loss = arousal_rate * S.arousal_gain_rate
- if(HAS_TRAIT(src, TRAIT_EXHIBITIONIST) && client)
- var/amt_nude = 0
- for(var/obj/item/organ/genital/G in internal_organs)
- if(G.is_exposed())
- amt_nude++
- if(amt_nude)
- var/watchers = 0
- for(var/mob/living/L in view(src))
- if(L.client && !L.stat && !L.eye_blind && (src in view(L)))
- watchers++
- if(watchers)
- our_loss += (amt_nude * watchers) + S.arousal_gain_rate
- adjustArousalLoss(our_loss)
-
-/mob/living/proc/getArousalLoss()
- return arousalloss
-
-/mob/living/proc/adjustArousalLoss(amount, updating_arousal=1)
- if(status_flags & GODMODE || !canbearoused)
- return FALSE
- arousalloss = CLAMP(arousalloss + amount, min_arousal, max_arousal)
- if(updating_arousal)
- updatearousal()
-
-/mob/living/proc/setArousalLoss(amount, updating_arousal=1)
- if(status_flags & GODMODE || !canbearoused)
- return FALSE
- arousalloss = CLAMP(amount, min_arousal, max_arousal)
- if(updating_arousal)
- updatearousal()
-
-/mob/living/proc/getPercentAroused()
- var/percentage = ((100 / max_arousal) * arousalloss)
- return percentage
-
-/mob/living/proc/isPercentAroused(percentage)//returns true if the mob's arousal (measured in a percent of 100) is greater than the arg percentage.
- if(!isnum(percentage) || percentage > 100 || percentage < 0)
- CRASH("Provided percentage is invalid")
- if(getPercentAroused() >= percentage)
- return TRUE
- return FALSE
-
-//H U D//
-/mob/living/proc/updatearousal()
- update_arousal_hud()
-
-/mob/living/carbon/updatearousal()
- . = ..()
- for(var/obj/item/organ/genital/G in internal_organs)
- if(istype(G))
- var/datum/sprite_accessory/S
- switch(G.type)
- if(/obj/item/organ/genital/penis)
- S = GLOB.cock_shapes_list[G.shape]
- if(/obj/item/organ/genital/testicles)
- S = GLOB.balls_shapes_list[G.shape]
- if(/obj/item/organ/genital/vagina)
- S = GLOB.vagina_shapes_list[G.shape]
- if(/obj/item/organ/genital/breasts)
- S = GLOB.breasts_shapes_list[G.shape]
- if(S?.alt_aroused)
- G.aroused_state = isPercentAroused(G.aroused_amount)
- else
- G.aroused_state = FALSE
- G.update_appearance()
-
-/mob/living/proc/update_arousal_hud()
- return FALSE
-
-/mob/living/carbon/human/update_arousal_hud()
- if(!client || !(hud_used?.arousal))
- return FALSE
- if(!canbearoused)
- hud_used.arousal.icon_state = ""
- return FALSE
- else
- var/value = FLOOR(getPercentAroused(), 10)
- hud_used.arousal.icon_state = "arousal[value]"
- return TRUE
-
-/obj/screen/arousal
- name = "arousal"
- icon_state = "arousal0"
- icon = 'modular_citadel/icons/obj/genitals/hud.dmi'
- screen_loc = ui_arousal
-
-/obj/screen/arousal/Click()
- if(!isliving(usr))
- return FALSE
- var/mob/living/M = usr
- if(M.canbearoused)
- M.mob_climax()
- return TRUE
- else
- to_chat(M, "Arousal is disabled. Feature is unavailable.")
-
-
-/mob/living/proc/mob_climax(forced_climax = FALSE)//This is just so I can test this shit without being forced to add actual content to get rid of arousal. Will be a very basic proc for a while.
- set name = "Masturbate"
- set category = "IC"
- if(canbearoused && !restrained() && !stat)
- if(mb_cd_timer <= world.time)
- //start the cooldown even if it fails
- mb_cd_timer = world.time + mb_cd_length
- if(getArousalLoss() >= 33)//one third of average max_arousal or greater required
- visible_message("[src] starts masturbating!", \
- "You start masturbating.")
- if(do_after(src, 30, target = src))
- visible_message("[src] relieves [p_them()]self!", \
- "You have relieved yourself.")
- SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
- setArousalLoss(min_arousal)
- else
- to_chat(src, "You aren't aroused enough for that.")
-
/obj/item/organ/genital/proc/climaxable(mob/living/carbon/human/H, silent = FALSE) //returns the fluid source (ergo reagents holder) if found.
if(CHECK_BITFIELD(genital_flags, GENITAL_FUID_PRODUCTION))
. = reagents
@@ -189,97 +53,38 @@
/mob/living/carbon/human/proc/do_climax(datum/reagents/R, atom/target, obj/item/organ/genital/G, spill = TRUE)
if(!G)
return
- SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
- setArousalLoss(min_arousal)
if(!target || !R)
return
var/turfing = isturf(target)
- if(spill & R.total_volume >= 5)
+ if(spill && R.total_volume >= 5)
R.reaction(turfing ? target : target.loc, TOUCH, 1, 0)
if(!turfing)
R.trans_to(target, R.total_volume * (spill ? G.fluid_transfer_factor : 1))
R.clear_reagents()
-//These are various procs that we'll use later, split up for readability instead of having one, huge proc.
-//For all of these, we assume the arguments given are proper and have been checked beforehand.
-/mob/living/carbon/human/proc/mob_masturbate(obj/item/organ/genital/G, mb_time = 30) //Masturbation, keep it gender-neutral
- var/datum/reagents/fluid_source = G.climaxable(src)
- if(!fluid_source)
- return
- var/obj/item/organ/genital/PP = CHECK_BITFIELD(G.genital_flags, MASTURBATE_LINKED_ORGAN) ? G.linked_organ : G
- if(!PP)
- to_chat(src, "You shudder, unable to cum with your [name].")
- if(mb_time)
- visible_message("[src] starts to [G.masturbation_verb] [p_their()] [G.name].", \
- "You start to [G.masturbation_verb] your [G.name].")
- if(!do_after(src, mb_time, target = src) || !G.climaxable(src, TRUE))
- return
- visible_message("[src] orgasms, [PP.orgasm_verb][isturf(loc) ? " onto [loc]" : ""] with [p_their()] [PP.name]!", \
- "You orgasm, [PP.orgasm_verb][isturf(loc) ? " onto [loc]" : ""] with your [PP.name].")
- do_climax(fluid_source, loc, G)
-
/mob/living/carbon/human/proc/mob_climax_outside(obj/item/organ/genital/G, mb_time = 30) //This is used for forced orgasms and other hands-free climaxes
var/datum/reagents/fluid_source = G.climaxable(src, TRUE)
if(!fluid_source)
- visible_message("[src] shudders, their [G.name] unable to cum.", \
- "Your [G.name] cannot cum, giving no relief.")
+ to_chat(src,"Your [G.name] cannot cum.")
return
if(mb_time) //as long as it's not instant, give a warning
- visible_message("[src] looks like they're about to cum.", \
- "You feel yourself about to orgasm.")
+ to_chat(src,"You feel yourself about to orgasm.")
if(!do_after(src, mb_time, target = src) || !G.climaxable(src, TRUE))
return
- visible_message("[src] orgasms[isturf(loc) ? " onto [loc]" : ""], using [p_their()] [G.name]!", \
- "You climax[isturf(loc) ? " onto [loc]" : ""] with your [G.name].")
+ to_chat(src,"You climax[isturf(loc) ? " onto [loc]" : ""] with your [G.name].")
do_climax(fluid_source, loc, G)
-/mob/living/carbon/human/proc/mob_climax_partner(obj/item/organ/genital/G, mob/living/L, spillage = TRUE, mb_time = 30) //Used for climaxing with any living thing
- var/datum/reagents/fluid_source = G.climaxable(src)
- if(!fluid_source)
- return
- if(mb_time) //Skip warning if this is an instant climax.
- visible_message("[src] is about to climax with [L]!", \
- "You're about to climax with [L]!")
- if(!do_after(src, mb_time, target = src) || !in_range(src, L) || !G.climaxable(src, TRUE))
- return
- if(spillage)
- visible_message("[src] climaxes with [L], overflowing and spilling, using [p_their()] [G.name]!", \
- "You orgasm with [L], spilling out of them, using your [G.name].")
- else //knots and other non-spilling orgasms
- visible_message("[src] climaxes with [L], [p_their()] [G.name] spilling nothing!", \
- "You ejaculate with [L], your [G.name] spilling nothing.")
- SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "orgasm", /datum/mood_event/orgasm)
- do_climax(fluid_source, spillage ? loc : L, G, spillage)
-
-
/mob/living/carbon/human/proc/mob_fill_container(obj/item/organ/genital/G, obj/item/reagent_containers/container, mb_time = 30) //For beaker-filling, beware the bartender
var/datum/reagents/fluid_source = G.climaxable(src)
if(!fluid_source)
return
if(mb_time)
- visible_message("[src] starts to [G.masturbation_verb] their [G.name] over [container].", \
- "You start to [G.masturbation_verb] your [G.name] over [container].")
+ to_chat(src,"You start to [G.masturbation_verb] your [G.name] over [container].")
if(!do_after(src, mb_time, target = src) || !in_range(src, container) || !G.climaxable(src, TRUE))
return
- visible_message("[src] uses [p_their()] [G.name] to fill [container]!", \
- "You used your [G.name] to fill [container].")
+ to_chat(src,"You used your [G.name] to fill [container].")
do_climax(fluid_source, container, G, FALSE)
-/mob/living/carbon/human/proc/pick_masturbate_genitals(silent = FALSE)
- var/list/genitals_list
- var/list/worn_stuff = get_equipped_items()
-
- for(var/obj/item/organ/genital/G in internal_organs)
- if(CHECK_BITFIELD(G.genital_flags, CAN_MASTURBATE_WITH) && G.is_exposed(worn_stuff)) //filter out what you can't masturbate with
- if(CHECK_BITFIELD(G.genital_flags, MASTURBATE_LINKED_ORGAN) && !G.linked_organ)
- continue
- LAZYADD(genitals_list, G)
- if(LAZYLEN(genitals_list))
- var/obj/item/organ/genital/ret_organ = input(src, "with what?", "Masturbate", null) as null|obj in genitals_list
- return ret_organ
- else if(!silent)
- to_chat(src, "You cannot masturbate without available genitals.")
-
/mob/living/carbon/human/proc/pick_climax_genitals(silent = FALSE)
var/list/genitals_list
var/list/worn_stuff = get_equipped_items()
@@ -293,27 +98,6 @@
else if(!silent)
to_chat(src, "You cannot climax without available genitals.")
-/mob/living/carbon/human/proc/pick_partner(silent = FALSE)
- var/list/partners = list()
- if(pulling)
- partners += pulling
- if(pulledby)
- partners += pulledby
- //Now we got both of them, let's check if they're proper
- for(var/mob/living/L in partners)
- if(iscarbon(L))
- var/mob/living/carbon/C = L
- if(!C.exposed_genitals.len && !C.is_groin_exposed() && !C.is_chest_exposed()) //Nothing through_clothing, no proper partner.
- partners -= C
- //NOW the list should only contain correct partners
- if(!partners.len)
- if(!silent)
- to_chat(src, "You cannot do this alone.")
- return //No one left.
- var/mob/living/target = input(src, "With whom?", "Sexual partner", null) as null|anything in partners //pick one, default to null
- if(target && in_range(src, target))
- return target
-
/mob/living/carbon/human/proc/pick_climax_container(silent = FALSE)
var/list/containers_list = list()
@@ -349,13 +133,13 @@
return TRUE
//Here's the main proc itself
-/mob/living/carbon/human/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints
+/mob/living/carbon/human/proc/mob_climax(forced_climax=FALSE) //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints
if(mb_cd_timer > world.time)
if(!forced_climax) //Don't spam the message to the victim if forced to come too fast
to_chat(src, "You need to wait [DisplayTimeText((mb_cd_timer - world.time), TRUE)] before you can do that again!")
return
- if(!canbearoused || !has_dna())
+ if(!client?.prefs.arousable || !has_dna())
return
if(stat == DEAD)
if(!forced_climax)
@@ -363,31 +147,6 @@
return
if(forced_climax) //Something forced us to cum, this is not a masturbation thing and does not progress to the other checks
for(var/obj/item/organ/genital/G in internal_organs)
- if(!CHECK_BITFIELD(G.genital_flags, CAN_CLIMAX_WITH)) //Skip things like wombs and testicles
- continue
- var/mob/living/partner
- var/check_target
- var/list/worn_stuff = get_equipped_items()
-
- if(G.is_exposed(worn_stuff))
- if(pulling) //Are we pulling someone? Priority target, we can't be making option menus for this, has to be quick
- if(isliving(pulling)) //Don't fuck objects
- check_target = pulling
- if(pulledby && !check_target) //prioritise pulled over pulledby
- if(isliving(pulledby))
- check_target = pulledby
- //Now we should have a partner, or else we have to come alone
- if(check_target)
- if(iscarbon(check_target)) //carbons can have clothes
- var/mob/living/carbon/C = check_target
- if(C.exposed_genitals.len || C.is_groin_exposed() || C.is_chest_exposed()) //Are they naked enough?
- partner = C
- else //A cat is fine too
- partner = check_target
- if(partner) //Did they pass the clothing checks?
- mob_climax_partner(G, partner, mb_time = 0) //Instant climax due to forced
- continue //You've climaxed once with this organ, continue on
- //not exposed OR if no partner was found while exposed, climax alone
mob_climax_outside(G, mb_time = 0) //removed climax timer for sudden, forced orgasms
//Now all genitals that could climax, have.
//Since this was a forced climax, we do not need to continue with the other stuff
@@ -398,42 +157,20 @@
if(stat == UNCONSCIOUS) //No sleep-masturbation, you're unconscious.
to_chat(src, "You must be conscious to do that!")
return
- if(getArousalLoss() < 33) //flat number instead of percentage
- to_chat(src, "You aren't aroused enough for that!")
- return
//Ok, now we check what they want to do.
- var/choice = input(src, "Select sexual activity", "Sexual activity:") as null|anything in list("Masturbate", "Climax alone", "Climax with partner", "Fill container")
+ var/choice = input(src, "Select sexual activity", "Sexual activity:") as null|anything in list("Climax", "Fill container")
if(!choice)
return
switch(choice)
- if("Masturbate")
- if(!available_rosie_palms())
- return
- //We got hands, let's pick an organ
- var/obj/item/organ/genital/picked_organ = pick_masturbate_genitals()
- if(picked_organ && available_rosie_palms(TRUE))
- mob_masturbate(picked_organ)
- return
-
- if("Climax alone")
+ if("Climax")
if(!available_rosie_palms())
return
var/obj/item/organ/genital/picked_organ = pick_climax_genitals()
if(picked_organ && available_rosie_palms(TRUE))
mob_climax_outside(picked_organ)
- if("Climax with partner")
- //We need no hands, we can be restrained and so on, so let's pick an organ
- var/obj/item/organ/genital/picked_organ = pick_climax_genitals()
- if(picked_organ)
- var/mob/living/partner = pick_partner() //Get someone
- if(partner)
- var/spillage = input(src, "Would your fluids spill outside?", "Choose overflowing option", "Yes") as null|anything in list("Yes", "No")
- if(spillage && in_range(src, partner))
- mob_climax_partner(picked_organ, partner, spillage == "Yes" ? TRUE : FALSE)
-
if("Fill container")
//We'll need hands and no restraints.
if(!available_rosie_palms(FALSE, /obj/item/reagent_containers))
@@ -447,4 +184,10 @@
if(fluid_container && available_rosie_palms(TRUE, /obj/item/reagent_containers))
mob_fill_container(picked_organ, fluid_container)
- mb_cd_timer = world.time + mb_cd_length
\ No newline at end of file
+ mb_cd_timer = world.time + mb_cd_length
+
+/mob/living/carbon/human/verb/climax_verb()
+ set category = "Arousal"
+ set name = "Climax"
+ set desc = "Lets you choose a couple ways to ejaculate."
+ mob_climax()
diff --git a/modular_citadel/code/modules/arousal/genitals.dm b/modular_citadel/code/modules/arousal/genitals.dm
index 8d70464a2d..af9646fa51 100644
--- a/modular_citadel/code/modules/arousal/genitals.dm
+++ b/modular_citadel/code/modules/arousal/genitals.dm
@@ -2,10 +2,11 @@
color = "#fcccb3"
w_class = WEIGHT_CLASS_NORMAL
var/shape = "human"
- var/sensitivity = AROUSAL_START_VALUE
+ var/sensitivity = 1 // wow if this were ever used that'd be cool but it's not but i'm keeping it for my unshit code
var/genital_flags //see citadel_defines.dm
var/masturbation_verb = "masturbate"
var/orgasm_verb = "cumming" //present continous
+ var/arousal_verb = "feel aroused"
var/fluid_transfer_factor = 0 //How much would a partner get in them if they climax using this?
var/size = 2 //can vary between num or text, just used in icon_state strings
var/fluid_id = null
@@ -14,7 +15,6 @@
var/fluid_rate = CUM_RATE
var/fluid_mult = 1
var/aroused_state = FALSE //Boolean used in icon_state strings
- var/aroused_amount = 50 //This is a num from 0 to 100 for arousal percentage for when to use arousal state icons.
var/obj/item/organ/genital/linked_organ
var/linked_organ_slot //used for linking an apparatus' organ to its other half on update_link().
var/layer_index = GENITAL_LAYER_INDEX //Order should be very important. FIRST vagina, THEN testicles, THEN penis, as this affects the order they are rendered in.
@@ -85,16 +85,14 @@
H.update_genitals()
/mob/living/carbon/verb/toggle_genitals()
- set category = "IC"
+ set category = "Arousal"
set name = "Expose/Hide genitals"
set desc = "Allows you to toggle which genitals should show through clothes or not."
var/list/genital_list = list()
- for(var/obj/item/organ/O in internal_organs)
- if(isgenital(O))
- var/obj/item/organ/genital/G = O
- if(!CHECK_BITFIELD(G.genital_flags, GENITAL_INTERNAL))
- genital_list += G
+ for(var/obj/item/organ/genital/G in internal_organs)
+ if(!CHECK_BITFIELD(G.genital_flags, GENITAL_INTERNAL))
+ genital_list += G
if(!genital_list.len) //There is nothing to expose
return
//Full list of exposable genitals created
@@ -105,6 +103,35 @@
picked_organ.toggle_visibility(picked_visibility)
return
+/mob/living/carbon/verb/toggle_arousal_state()
+ set category = "Arousal"
+ set name = "Toggle genital arousal"
+ set desc = "Allows you to toggle which genitals are showing signs of arousal."
+ var/list/genital_list = list()
+ for(var/obj/item/organ/genital/G in internal_organs)
+ var/datum/sprite_accessory/S
+ switch(G.type)
+ if(/obj/item/organ/genital/penis)
+ S = GLOB.cock_shapes_list[G.shape]
+ if(/obj/item/organ/genital/testicles)
+ S = GLOB.balls_shapes_list[G.shape]
+ if(/obj/item/organ/genital/vagina)
+ S = GLOB.vagina_shapes_list[G.shape]
+ if(/obj/item/organ/genital/breasts)
+ S = GLOB.breasts_shapes_list[G.shape]
+ if(S?.alt_aroused)
+ genital_list += G
+ if(!genital_list.len) //There's nothing that can show arousal
+ return
+ var/obj/item/organ/genital/picked_organ
+ picked_organ = input(src, "Choose which genitalia to toggle arousal on", "Set genital arousal", null) in genital_list
+ if(picked_organ)
+ picked_organ.aroused_state = !picked_organ.aroused_state
+ to_chat(src,"You [picked_organ.arousal_verb].")
+ picked_organ.update_appearance()
+ return
+
+
/obj/item/organ/genital/proc/modify_size(modifier, min = -INFINITY, max = INFINITY)
fluid_max_volume += modifier*2.5
fluid_rate += modifier/10
@@ -233,7 +260,7 @@
//Checks to see if organs are new on the mob, and changes their colours so that they don't get crazy colours.
/mob/living/carbon/human/proc/emergent_genital_call()
- if(!canbearoused)
+ if(!client.prefs.arousable)
return FALSE
var/organCheck = locate(/obj/item/organ/genital) in internal_organs
diff --git a/modular_citadel/code/modules/arousal/organs/breasts.dm b/modular_citadel/code/modules/arousal/organs/breasts.dm
index 105f5e157d..19c3ff80a9 100644
--- a/modular_citadel/code/modules/arousal/organs/breasts.dm
+++ b/modular_citadel/code/modules/arousal/organs/breasts.dm
@@ -11,6 +11,7 @@
shape = "pair"
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION
masturbation_verb = "massage"
+ arousal_verb = "feel very sensitive in your breasts"
orgasm_verb = "leaking"
fluid_transfer_factor = 0.5
var/static/list/breast_values = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5, "f" = 6, "g" = 7, "h" = 8, "i" = 9, "j" = 10, "k" = 11, "l" = 12, "m" = 13, "n" = 14, "o" = 15, "huge" = 16, "flat" = 0)
diff --git a/modular_citadel/code/modules/arousal/organs/penis.dm b/modular_citadel/code/modules/arousal/organs/penis.dm
index 408d6521d0..d2d827e66d 100644
--- a/modular_citadel/code/modules/arousal/organs/penis.dm
+++ b/modular_citadel/code/modules/arousal/organs/penis.dm
@@ -6,6 +6,7 @@
zone = BODY_ZONE_PRECISE_GROIN
slot = ORGAN_SLOT_PENIS
masturbation_verb = "stroke"
+ arousal_verb = "pop a boner"
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH
linked_organ_slot = ORGAN_SLOT_TESTICLES
fluid_transfer_factor = 0.5
@@ -26,7 +27,7 @@
..()
/obj/item/organ/genital/penis/update_size(modified = FALSE)
- if(length < 0)//I don't actually know what round() does to negative numbers, so to be safe!!
+ if(length <= 0)//I don't actually know what round() does to negative numbers, so to be safe!!
if(owner)
to_chat(owner, "You feel your tallywacker shrinking away from your body as your groin flattens out!")
QDEL_IN(src, 1)
diff --git a/modular_citadel/code/modules/arousal/organs/vagina.dm b/modular_citadel/code/modules/arousal/organs/vagina.dm
index 0df954fd79..7ecc0c155c 100644
--- a/modular_citadel/code/modules/arousal/organs/vagina.dm
+++ b/modular_citadel/code/modules/arousal/organs/vagina.dm
@@ -8,6 +8,7 @@
size = 1 //There is only 1 size right now
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH
masturbation_verb = "finger"
+ arousal_verb = "feel wet"
fluid_transfer_factor = 0.1 //Yes, some amount is exposed to you, go get your AIDS
layer_index = VAGINA_LAYER_INDEX
var/cap_length = 8//D E P T H (cap = capacity)
diff --git a/modular_citadel/code/modules/arousal/toys/dildos.dm b/modular_citadel/code/modules/arousal/toys/dildos.dm
index 964c9964ad..58245c0c5f 100644
--- a/modular_citadel/code/modules/arousal/toys/dildos.dm
+++ b/modular_citadel/code/modules/arousal/toys/dildos.dm
@@ -5,8 +5,7 @@
name = "dildo"
desc = "Floppy!"
icon = 'modular_citadel/icons/obj/genitals/dildo.dmi'
- damtype = AROUSAL
- force = 5
+ force = 0
hitsound = 'sound/weapons/tap.ogg'
throwforce = 0
icon_state = "dildo_knotted_2"
diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm
index eef8664fbb..4e7cb2972f 100644
--- a/modular_citadel/code/modules/client/preferences.dm
+++ b/modular_citadel/code/modules/client/preferences.dm
@@ -49,10 +49,9 @@
if(L[slot_to_string(slot)] < DEFAULT_SLOT_AMT)
return TRUE
-datum/preferences/copy_to(mob/living/carbon/human/character, icon_updates = 1)
+/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
if(icon_updates)
character.update_genitals()
diff --git a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm
deleted file mode 100644
index 547c1a5768..0000000000
--- a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ /dev/null
@@ -1,53 +0,0 @@
-/obj/item/integrated_circuit/manipulation/electric_stimulator
- name = "electronic stimulation module"
- desc = "Used to induce sexual stimulation in a target via electricity."
- icon_state = "power_relay"
- extended_desc = "The circuit accepts a reference to a person, as well as a number representing the strength of the shock, and upon activation, attempts to stimulate them to orgasm. The number ranges from -35 to 35, with negative numbers reducing arousal and positive numbers increasing it by that amount."
- complexity = 15
- size = 2
- inputs = list("target" = IC_PINTYPE_REF, "strength" = IC_PINTYPE_NUMBER)
- outputs = list("arousal gain"=IC_PINTYPE_NUMBER)
- activators = list("fire" = IC_PINTYPE_PULSE_IN, "on success" = IC_PINTYPE_PULSE_OUT, "on fail" = IC_PINTYPE_PULSE_OUT, "on orgasm" = IC_PINTYPE_PULSE_OUT)
- spawn_flags = IC_SPAWN_RESEARCH
- power_draw_per_use = 500
- cooldown_per_use = 50
- ext_cooldown = 25
-
-/obj/item/integrated_circuit/manipulation/electric_stimulator/do_work()
- set_pin_data(IC_OUTPUT, 1, 0)
- var/mob/living/M = get_pin_data_as_type(IC_INPUT, 1, /mob/living)
- if(!check_target(M))
- return
-
- var/arousal_gain = CLAMP(get_pin_data(IC_INPUT, 2),-35,35)
- set_pin_data(IC_OUTPUT, 1, arousal_gain)
-
- if(ismob(M) && M.canbearoused && arousal_gain != 0)
- var/orgasm = FALSE
- if(arousal_gain > 0)
- if(M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna())
- var/mob/living/carbon/human/H = M
- var/orgasm_message = pick("A sharp pulse of electricity pushes you to orgasm!", "You feel a jolt of electricity force you into orgasm!")
- H.visible_message("\The [assembly] electrodes shock [H]!", "[orgasm_message]")
- playsound(src, "sound/effects/light_flicker.ogg", 30, 1)
- H.mob_climax(forced_climax=TRUE)
- orgasm = TRUE
- else
- M.adjustArousalLoss(arousal_gain)
- var/stimulate_message = pick("You feel a sharp warming tingle of electricity through your body!", "A burst of arousing electricity flows through your body!")
- M.visible_message("\The [assembly] electrodes shock [M]!", "[stimulate_message]")
-
- else
- var/stimulate_message = pick("You feel a dull prickle of electricity through your body!", "A burst of dull electricity flows through your body!")
- M.visible_message("\The [assembly] electrodes shock [M]!", "[stimulate_message]")
- M.adjustArousalLoss(arousal_gain)
-
- playsound(src, "sound/effects/light_flicker.ogg", 30, 1)
- push_data()
- activate_pin(2)
- if(orgasm) activate_pin(4)
-
- else
- visible_message("\The [assembly] electrodes fail to shock [M]!")
- push_data()
- activate_pin(3)
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
index 65c652434b..66f0908a8e 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm
@@ -312,8 +312,6 @@ Creating a chem with a low purity will make you permanently fall in love with so
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 = "[(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")
diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
index f6b70eb7b6..b9619805c6 100644
--- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
+++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm
@@ -100,14 +100,18 @@
color = "#FFADFF"//PINK, rgb(255, 173, 255)
/datum/reagent/drug/aphrodisiac/on_mob_life(mob/living/M)
- if(M && M.canbearoused && !(M.client?.prefs.cit_toggles & NO_APHRO))
- if(prob(33))
- M.adjustArousalLoss(2)
- if(prob(5))
+ if(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO))
+ if((prob(min(current_cycle/2,5))))
M.emote(pick("moan","blush"))
- if(prob(5))
+ if(prob(min(current_cycle/4,10)))
var/aroused_message = pick("You feel frisky.", "You're having trouble suppressing your urges.", "You feel in the mood.")
to_chat(M, "[aroused_message]")
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ for(var/obj/item/organ/genital/G in H.internal_organs)
+ if(!G.aroused_state && prob(current_cycle))
+ G.aroused_state = TRUE
+ to_chat(M, "You suddenly [G.arousal_verb]!")
..()
/datum/reagent/drug/aphrodisiacplus
@@ -122,21 +126,26 @@
overdose_threshold = 20
/datum/reagent/drug/aphrodisiacplus/on_mob_life(mob/living/M)
- 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(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO))
if(prob(5))
- if(M.getArousalLoss() > 75)
+ if(prob(current_cycle))
M.say(pick("Hnnnnngghh...", "Ohh...", "Mmnnn..."))
else
M.emote(pick("moan","blush"))
if(prob(5))
var/aroused_message
- if(M.getArousalLoss() > 90)
+ if(current_cycle>25)
aroused_message = pick("You need to fuck someone!", "You're bursting with sexual tension!", "You can't get sex off your mind!")
else
aroused_message = pick("You feel a bit hot.", "You feel strong sexual urges.", "You feel in the mood.", "You're ready to go down on someone.")
to_chat(M, "[aroused_message]")
+ REMOVE_TRAIT(M,TRAIT_NEVERBONER,"aphro")
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ for(var/obj/item/organ/genital/G in H.internal_organs)
+ if(!G.aroused_state)
+ G.aroused_state = TRUE
+ to_chat(M, "You suddenly [G.arousal_verb]!")
..()
/datum/reagent/drug/aphrodisiacplus/addiction_act_stage2(mob/living/M)
@@ -154,15 +163,11 @@
..()
/datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M)
- 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(M && M.client?.prefs.arousable && !(M.client?.prefs.cit_toggles & NO_APHRO) && prob(33))
+ if(prob(5) && ishuman(M) && M.has_dna())
if(prob(5)) //Less spam
to_chat(M, "Your libido is going haywire!")
- if(M.min_arousal < 50)
- M.min_arousal += 1
- if(M.min_arousal < M.max_arousal)
- M.min_arousal += 1
- M.adjustArousalLoss(2)
+ ADD_TRAIT(M,TRAIT_PERMABONER,"aphro")
..()
/datum/reagent/drug/anaphrodisiac
@@ -176,8 +181,16 @@
reagent_state = SOLID
/datum/reagent/drug/anaphrodisiac/on_mob_life(mob/living/M)
- if(M && M.canbearoused && prob(33))
- M.adjustArousalLoss(-2)
+ if(M && M.client?.prefs.arousable && prob(16))
+ if(ishuman(M))
+ var/unboner = FALSE
+ var/mob/living/carbon/human/H = M
+ for(var/obj/item/organ/genital/G in H.internal_organs)
+ if(G.aroused_state)
+ G.aroused_state = FALSE
+ unboner = TRUE
+ if(unboner)
+ to_chat(M, "You no longer feel aroused.")
..()
/datum/reagent/drug/anaphrodisiacplus
@@ -190,17 +203,22 @@
overdose_threshold = 20
/datum/reagent/drug/anaphrodisiacplus/on_mob_life(mob/living/M)
- if(M && M.canbearoused && prob(33))
- M.adjustArousalLoss(-4)
+ if(M && M.client?.prefs.arousable)
+ REMOVE_TRAIT(M,TRAIT_PERMABONER,"aphro")
+ if(ishuman(M))
+ var/unboner = FALSE
+ var/mob/living/carbon/human/H = M
+ for(var/obj/item/organ/genital/G in H.internal_organs)
+ if(G.aroused_state)
+ G.aroused_state = FALSE
+ unboner = TRUE
+ if(unboner)
+ to_chat(M, "You no longer feel aroused.")
..()
/datum/reagent/drug/anaphrodisiacplus/overdose_process(mob/living/M)
- if(M && M.canbearoused && prob(33))
- if(M.min_arousal > 0)
- M.min_arousal -= 1
- if(M.min_arousal > 50)
- M.min_arousal -= 1
- M.adjustArousalLoss(-2)
+ if(M && M.client?.prefs.arousable && prob(5))
+ ADD_TRAIT(M,TRAIT_NEVERBONER,"aphro")
..()
//recipes
diff --git a/tgstation.dme b/tgstation.dme
index 30fcc602ce..4cfc15af8d 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3126,7 +3126,6 @@
#include "modular_citadel\code\modules\custom_loadout\custom_items.dm"
#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm"
#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm"
-#include "modular_citadel\code\modules\integrated_electronics\subtypes\manipulation.dm"
#include "modular_citadel\code\modules\mentor\follow.dm"
#include "modular_citadel\code\modules\mentor\mentor.dm"
#include "modular_citadel\code\modules\mentor\mentor_memo.dm"