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"