diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm
index 6e8b0cb777..a7c58e8669 100644
--- a/code/modules/integrated_electronics/subtypes/input.dm
+++ b/code/modules/integrated_electronics/subtypes/input.dm
@@ -1309,4 +1309,35 @@
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/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm
index 79d229c757..246205f7b6 100644
--- a/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm
+++ b/modular_citadel/code/modules/integrated_electronics/subtypes/manipulation.dm
@@ -1,33 +1,54 @@
/obj/item/integrated_circuit/manipulation/electric_stimulator
name = "electronic stimulation module"
- desc = "Used to induce sexual stimulation with electricity."
+ 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 and upon activation, attempts to stimulate them to orgasm."
- complexity = 10
- size = 3
- inputs = list("target" = IC_PINTYPE_REF)
- outputs = list()
- activators = list("fire" = IC_PINTYPE_PULSE_IN)
+ 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
- if(ismob(M) && M.canbearoused)
- 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)
+
+ 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
- M.adjustArousalLoss(35)
- var/stimulate_message = pick("You feel a sharp warming tingle of electricity through your body!", "A burst of arousing electricity flows through your body!")
+ 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]")
- playsound(src, "sound/effects/light_flicker.ogg", 30, 1)
+ 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)