Sanitizing the fermis code biohazard.

This commit is contained in:
Ghommie
2019-10-03 04:31:11 +02:00
parent 02df68a1cf
commit 6dbac16c74
9 changed files with 251 additions and 308 deletions
-21
View File
@@ -67,27 +67,6 @@
#define BREASTS_VOLUME_BASE 50 //base volume for the reagents in the breasts, multiplied by the size then multiplier. 50u for A cups, 850u for HH cups.
#define BREASTS_VOLUME_MULT 1 //global multiplier for breast volume.
#define BREASTS_SIZE_FLAT 0
#define BREASTS_SIZE_A 1
#define BREASTS_SIZE_AA 1.5
#define BREASTS_SIZE_B 2
#define BREASTS_SIZE_BB 2.5
#define BREASTS_SIZE_C 3
#define BREASTS_SIZE_CC 3.5
#define BREASTS_SIZE_D 4
#define BREASTS_SIZE_DD 4.5
#define BREASTS_SIZE_E 5
#define BREASTS_SIZE_EE 5.5
#define BREASTS_SIZE_F 6
#define BREASTS_SIZE_FF 6.5
#define BREASTS_SIZE_G 7
#define BREASTS_SIZE_GG 7.5//Are these even real sizes? The world may never know because cup sizes make no fucking sense.
#define BREASTS_SIZE_H 8
#define BREASTS_SIZE_HH 8.5//Largest size, ever. For now.
#define BREASTS_SIZE_MIN BREASTS_SIZE_A
#define BREASTS_SIZE_DEF BREASTS_SIZE_C
#define BREASTS_SIZE_MAX BREASTS_SIZE_HH
#define MILK_RATE 5
#define MILK_RATE_MULT 1
+3
View File
@@ -72,6 +72,9 @@
#define STATUS_EFFECT_ICHORIAL_STAIN /datum/status_effect/ichorial_stain //Prevents a servant from being revived by vitality matrices for one minute.
#define STATUS_EFFECT_BREASTS_ENLARGEMENT /datum/status_effect/chem/breast_enlarger //Applied slowdown due to the ominous bulk.
#define STATUS_EFFECT_PENIS_ENLARGEMENT //More applied slowdown, just like the above.
/////////////
// NEUTRAL //
/////////////
@@ -89,30 +89,23 @@
else
to_chat(user, "<span class='notice'>Anomalous error. Summon a coder.</span>")
if(istype(target, /mob/living))
var/mob/living/victim = target
if(istype(victim, /mob/living/carbon/human))
if(user.zone_selected == "groin") // pp smol. There's probably a smarter way to do this but im retarded. If you have a simpler method let me know.
var/list/organs = victim.getorganszone("groin")
for(var/internal_organ in organs)
if(istype(internal_organ, /obj/item/organ/genital/penis))
var/obj/item/organ/genital/penis/O = internal_organ
playsound(get_turf(src), 'sound/weapons/flash.ogg', 50, 1)
victim.visible_message("<span class='warning'>[user] is preparing to shrink [victim]\'s [O.name] with their bluespace compression kit!</span>")
if(do_mob(user, victim, 40) && charges > 0 && O.length > 0)
victim.visible_message("<span class='warning'>[user] has shrunk [victim]\'s [O.name]!</span>")
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 50, 1)
sparks()
flash_lighting_fx(3, 3, LIGHT_COLOR_CYAN)
charges -= 1
O.length -= 5
if(O.length < 1)
victim.visible_message("<span class='warning'>[user]\'s [O.name] vanishes!</span>")
qdel(O) // no pp for you
else
O.update_size()
O.update_appearance()
else if(ishuman(target) && user.zone_selected == BODY_ZONE_PRECISE_GROIN)
var/mob/living/carbon/human/H = target
var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS)
if(!P)
return
playsound(get_turf(src), 'sound/weapons/flash.ogg', 50, 1)
H.visible_message("<span class='warning'>[user] is preparing to shrink [H]\'s [P.name] with their bluespace compression kit!</span>")
if(do_mob(user, H, 40) && charges > 0 && P.length > 0)
H.visible_message("<span class='warning'>[user] has shrunk [H]\'s [P.name]!</span>")
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 50, 1)
sparks()
flash_lighting_fx(3, 3, LIGHT_COLOR_CYAN)
charges -= 1
var/p_name = P.name
P.modify_size(-5)
if(QDELETED(P))
H.visible_message("<span class='warning'>[H]\'s [p_name] vanishes!</span>")
/obj/item/compressionkit/attackby(obj/item/I, mob/user, params)
@@ -1965,24 +1965,6 @@
M.emote("nya")
..()
//Kept for legacy, I think it will break everything if you enable it.
/datum/reagent/penis_enlargement
name = "Penis Enlargement"
id = "penis_enlargement"
description = "A patented chemical forumula by Doctor Ronald Hyatt that is guaranteed to bring maximum GROWTH and LENGTH to your penis, today!"
color = "#888888"
taste_description = "chinese dragon powder"
metabolization_rate = INFINITY //So it instantly removes all of itself. Don't want to put strain on the system.
/datum/reagent/penis_enlargement/on_mob_life(mob/living/carbon/C)
var/obj/item/organ/genital/penis/P = C.getorganslot(ORGAN_SLOT_PENIS)
if(P)
var/added_length = round(volume/30,0.01) //Every 30u gives an extra inch. Rounded to the nearest 0.01 so float fuckery doesn't occur with the division by 30.
if(added_length >= 0.20) //Only add the length if it's greater than or equal to 0.2. This is to prevent people from smoking the reagents and causing the penis to update constantly.
P.length += added_length
P.update()
..()
/datum/reagent/changeling_string
name = "UNKNOWN"
id = "changeling_sting_real"
@@ -37,64 +37,62 @@
alert_type = null
var/moveCalc = 1
var/cachedmoveCalc = 1
var/last_checked_size //used to prevent potential cpu waste from happening every tick.
/datum/status_effect/chem/breast_enlarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now.
/datum/status_effect/chem/breast_enlarger/on_apply()//Removes clothes, they're too small to contain you. You belong to space now.
log_game("FERMICHEM: [owner]'s breasts has reached comical sizes. ID: [owner.key]")
var/mob/living/carbon/human/o = owner
var/items = o.get_contents()
for(var/obj/item/W in items)
if(W == o.w_uniform || W == o.wear_suit)
o.dropItemToGround(W, TRUE)
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
to_chat(o, "<span class='warning'>Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!</b></span>")
o.visible_message("<span class='boldnotice'>[o]'s chest suddenly bursts forth, ripping their clothes off!'</span>")
else
to_chat(o, "<span class='notice'>Your bountiful bosom is so rich with mass, you seriously doubt you'll be able to fit any clothes over it.</b></span>")
return ..()
var/mob/living/carbon/human/H = owner
var/message = FALSE
if(H.w_uniform)
H.dropItemToGround(H.w_uniform, TRUE)
message = TRUE
if(H.wear_suit)
H.dropItemToGround(H.wear_suit, TRUE)
message = TRUE
if(message)
playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1)
H.visible_message("<span class='boldnotice'>[H]'s chest suddenly bursts forth, ripping their clothes off!'</span>", \
"<span class='warning'>Your clothes give, ripping into peices under the strain of your swelling breasts! Unless you manage to reduce the size of your breasts, there's no way you're going to be able to put anything on over these melons..!</b></span>")
else
to_chat(H, "<span class='notice'>Your bountiful bosom is so rich with mass, you seriously doubt you'll be able to fit any clothes over it.</b></span>")
return ..()
/datum/status_effect/chem/breast_enlarger/tick(mob/living/carbon/human/H)//If you try to wear clothes, you fail. Slows you down if you're comically huge
var/mob/living/carbon/human/o = owner
var/obj/item/organ/genital/breasts/B = o.getorganslot("breasts")
moveCalc = 1+((round(B.cached_size) - 9)/3) //Afffects how fast you move, and how often you can click.
/datum/status_effect/chem/breast_enlarger/tick()//If you try to wear clothes, you fail. Slows you down if you're comically huge
var/mob/living/carbon/human/H = owner
var/obj/item/organ/genital/breasts/B = H.getorganslot(ORGAN_SLOT_BREASTS)
if(!B)
o.remove_movespeed_modifier(BREAST_MOVEMENT_SPEED)
sizeMoveMod(1)
owner.remove_status_effect(src)
var/items = o.get_contents()
for(var/obj/item/W in items)
if(W == o.w_uniform || W == o.wear_suit)
o.dropItemToGround(W, TRUE)
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
to_chat(owner, "<span class='warning'>Your enormous breasts are way too large to fit anything over them!</b></span>")
H.remove_status_effect(src)
return
moveCalc = 1+((round(B.cached_size) - 9)/3) //Afffects how fast you move, and how often you can click.
var/message = FALSE
if(H.w_uniform)
H.dropItemToGround(H.w_uniform, TRUE)
message = TRUE
if(H.wear_suit)
H.dropItemToGround(H.wear_suit, TRUE)
message = TRUE
if(message)
playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1)
to_chat(H, "<span class='warning'>Your enormous breasts are way too large to fit anything over them!</b></span>")
if(last_checked_size != B.cached_size)
H.add_movespeed_modifier(BREAST_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
sizeMoveMod(moveCalc)
if (B.size == "huge")
if(prob(1))
to_chat(owner, "<span class='notice'>Your back is feeling sore.</span>")
var/target = o.get_bodypart(BODY_ZONE_CHEST)
o.apply_damage(0.1, BRUTE, target)
if(!B.cached_size == B.breast_values[B.prev_size])
o.add_movespeed_modifier(BREAST_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
sizeMoveMod(moveCalc)
return ..()
else if (B.breast_values[B.size] > B.breast_values[B.prev_size])
o.add_movespeed_modifier(BREAST_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
sizeMoveMod(moveCalc)
else if (B.breast_values[B.size] < B.breast_values[B.prev_size])
o.add_movespeed_modifier(BREAST_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
sizeMoveMod(moveCalc)
if((B.cached_size) < 16)
switch(round(B.cached_size))
if(9)
if (B.breast_values[B.prev_size] != B.breast_values[B.size])
to_chat(o, "<span class='notice'>Your expansive chest has become a more managable size, liberating your movements.</b></span>")
if(10 to INFINITY)
if (B.breast_values[B.prev_size] != B.breast_values[B.size])
to_chat(H, "<span class='warning'>Your indulgent busom is so substantial, it's affecting your movements!</b></span>")
var/target = H.get_bodypart(BODY_ZONE_CHEST)
H.apply_damage(0.1, BRUTE, target)
else
if(prob(1))
to_chat(owner, "<span class='notice'>Your back is feeling a little sore.</span>")
..()
to_chat(H, "<span class='notice'>Your back is feeling a little sore.</span>")
last_checked_size = B.cached_size
..()
/datum/status_effect/chem/breast_enlarger/on_remove(mob/living/carbon/M)
/datum/status_effect/chem/breast_enlarger/on_remove()
log_game("FERMICHEM: [owner]'s breasts has reduced to an acceptable size. ID: [owner.key]")
to_chat(owner, "<span class='notice'>Your expansive chest has become a more managable size, liberating your movements.</b></span>")
owner.remove_movespeed_modifier(BREAST_MOVEMENT_SPEED)
sizeMoveMod(1)
@@ -112,51 +110,57 @@
alert_type = null
var/bloodCalc
var/moveCalc
var/last_checked_size //used to prevent potential cpu waste, just like the above.
/datum/status_effect/chem/penis_enlarger/on_apply(mob/living/carbon/human/H)//Removes clothes, they're too small to contain you. You belong to space now.
/datum/status_effect/chem/penis_enlarger/on_apply()//Removes clothes, they're too small to contain you. You belong to space now.
log_game("FERMICHEM: [owner]'s dick has reached comical sizes. ID: [owner.key]")
var/mob/living/carbon/human/o = owner
var/items = o.get_contents()
if(o.w_uniform || o.wear_suit)
to_chat(o, "<span class='warning'>Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!</b></span>")
owner.visible_message("<span class='boldnotice'>[o]'s schlong suddenly bursts forth, ripping their clothes off!'</span>")
var/mob/living/carbon/human/H = owner
var/message = FALSE
if(H.w_uniform)
H.dropItemToGround(H.w_uniform, TRUE)
message = TRUE
if(H.wear_suit)
H.dropItemToGround(H.wear_suit, TRUE)
message = TRUE
if(message)
playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1)
H.visible_message("<span class='boldnotice'>[H]'s schlong suddenly bursts forth, ripping their clothes off!'</span>", \
"<span class='warning'>Your clothes give, ripping into peices under the strain of your swelling pecker! Unless you manage to reduce the size of your emancipated trouser snake, there's no way you're going to be able to put anything on over this girth..!</b></span>")
else
to_chat(o, "<span class='notice'>Your emancipated trouser snake is so ripe with girth, you seriously doubt you'll be able to fit any clothes over it.</b></span>")
for(var/obj/item/W in items)
if(W == o.w_uniform || W == o.wear_suit)
o.dropItemToGround(W, TRUE)
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
to_chat(H, "<span class='notice'>Your emancipated trouser snake is so ripe with girth, you seriously doubt you'll be able to fit any clothes over it.</b></span>")
return ..()
/datum/status_effect/chem/penis_enlarger/tick(mob/living/carbon/M)
var/mob/living/carbon/human/o = owner
var/obj/item/organ/genital/penis/P = o.getorganslot("penis")
/datum/status_effect/chem/penis_enlarger/tick()
var/mob/living/carbon/human/H = owner
var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS)
if(!P)
owner.remove_status_effect(src)
return
moveCalc = 1+((round(P.length) - 21)/3) //effects how fast you can move
bloodCalc = 1+((round(P.length) - 21)/15) //effects how much blood you need (I didn' bother adding an arousal check because I'm spending too much time on this organ already.)
if(!P)
o.remove_movespeed_modifier(DICK_MOVEMENT_SPEED)
o.ResetBloodVol()
owner.remove_status_effect(src)
var/items = o.get_contents()
for(var/obj/item/W in items)
if(W == o.w_uniform || W == o.wear_suit)
o.dropItemToGround(W, TRUE)
playsound(o.loc, 'sound/items/poster_ripped.ogg', 50, 1)
to_chat(owner, "<span class='warning'>Your enormous package is way to large to fit anything over!</b></span>")
switch(round(P.cached_length))
if(21)
to_chat(o, "<span class='notice'>Your rascally willy has become a more managable size, liberating your movements.</b></span>")
o.remove_movespeed_modifier(DICK_MOVEMENT_SPEED)
o.AdjustBloodVol(bloodCalc)
if(22 to INFINITY)
if(prob(2))
to_chat(o, "<span class='warning'>Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!</b></span>")
o.add_movespeed_modifier(DICK_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
o.AdjustBloodVol(bloodCalc)
var/message = FALSE
if(H.w_uniform)
H.dropItemToGround(H.w_uniform, TRUE)
message = TRUE
if(H.wear_suit)
H.dropItemToGround(H.wear_suit, TRUE)
message = TRUE
if(message)
playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1)
to_chat(H, "<span class='warning'>Your enormous package is way to large to fit anything over!</b></span>")
if(P.length < 22 && H.has_movespeed_modifier(DICK_MOVEMENT_SPEED))
to_chat(owner, "<span class='notice'>Your rascally willy has become a more managable size, liberating your movements.</b></span>")
H.remove_movespeed_modifier(DICK_MOVEMENT_SPEED)
else if(P.length >= 22 && !H.has_movespeed_modifier(DICK_MOVEMENT_SPEED))
to_chat(H, "<span class='warning'>Your indulgent johnson is so substantial, it's taking all your blood and affecting your movements!</b></span>")
H.add_movespeed_modifier(DICK_MOVEMENT_SPEED, TRUE, 100, NONE, override = TRUE, multiplicative_slowdown = moveCalc)
H.AdjustBloodVol(bloodCalc)
..()
/datum/status_effect/chem/penis_enlarger/on_remove(mob/living/carbon/human/o)
/datum/status_effect/chem/penis_enlarger/on_remove()
log_game("FERMICHEM: [owner]'s dick has reduced to an acceptable size. ID: [owner.key]")
owner.remove_movespeed_modifier(DICK_MOVEMENT_SPEED)
owner.ResetBloodVol()
@@ -105,6 +105,9 @@
picked_organ.toggle_visibility(picked_visibility)
return
/obj/item/organ/genital/proc/modify_size(modifier, min = -INFINITY, max = INFINITY)
return
/obj/item/organ/genital/proc/update_size()
return
@@ -215,34 +218,23 @@
if(!QDELETED(src))
dna.species.handle_genitals(src)
//fermichem procs
/mob/living/carbon/human/proc/Force_update_genitals(mob/living/carbon/human/H) //called in fermiChem
dna.species.handle_genitals(src)//should work.
//dna.species.handle_breasts(src)
//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()
var/organCheck = FALSE
var/breastCheck = FALSE
var/willyCheck = FALSE
if(!canbearoused)
ADD_TRAIT(src, TRAIT_PHARMA, "pharma")//Prefs prevent unwanted organs.
return
for(var/O in internal_organs)
if(istype(O, /obj/item/organ/genital))
organCheck = TRUE
if(istype(O, /obj/item/organ/genital/penis))
willyCheck = TRUE
if(istype(O, /obj/item/organ/genital/breasts))
breastCheck = TRUE
return FALSE
var/organCheck = locate(/obj/item/organ/genital) in internal_organs
var/breastCheck = getorganslot(ORGAN_SLOT_BREASTS)
var/willyCheck = getorganslot(ORGAN_SLOT_PENIS)
if(organCheck == FALSE)
if(ishuman(src) && dna.species.id == "human")
dna.features["genitals_use_skintone"] = TRUE
dna.species.use_skintones = TRUE
if(MUTCOLORS)
if(src.dna.species.fixed_mut_color)
dna.features["cock_color"] = "[src.dna.species.fixed_mut_color]"
dna.features["breasts_color"] = "[src.dna.species.fixed_mut_color]"
dna.features["cock_color"] = "[dna.species.fixed_mut_color]"
dna.features["breasts_color"] = "[dna.species.fixed_mut_color]"
return
//So people who haven't set stuff up don't get rainbow surprises.
dna.features["cock_color"] = "[dna.features["mcolor"]]"
@@ -252,7 +244,7 @@
dna.features["breasts_color"] = dna.features["cock_color"]
else if (willyCheck == FALSE)
dna.features["cock_color"] = dna.features["breasts_color"]
return
return TRUE
/datum/species/proc/handle_genitals(mob/living/carbon/human/H)//more like handle sadness
if(!H)//no args
@@ -263,6 +255,7 @@
for(var/L in relevant_layers) //Less hardcode
H.remove_overlay(L)
H.remove_overlay(GENITALS_EXPOSED_LAYER)
//start scanning for genitals
var/list/gen_index[GENITAL_LAYER_INDEX_LENGTH]
@@ -329,6 +322,7 @@
if(LAZYLEN(fully_exposed))
H.overlays_standing[GENITALS_EXPOSED_LAYER] = fully_exposed
H.apply_overlay(GENITALS_EXPOSED_LAYER)
for(var/L in relevant_layers)
H.apply_overlay(L)
@@ -5,22 +5,21 @@
icon = 'modular_citadel/icons/obj/genitals/breasts.dmi'
zone = BODY_ZONE_CHEST
slot = ORGAN_SLOT_BREASTS
size = BREASTS_SIZE_DEF
size = "c" //refer to the breast_values static list below for the cups associated number values
fluid_id = "milk"
shape = "pair"
genital_flags = CAN_MASTURBATE_WITH|CAN_CLIMAX_WITH|GENITAL_FUID_PRODUCTION
masturbation_verb = "massage"
orgasm_verb = "leaking"
fluid_transfer_factor = 0.5
var/list/static/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)
var/cached_size //for enlargement SHOULD BE A NUMBER
var/prev_size //For flavour texts SHOULD BE A LETTER
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)
var/cached_size //these two vars pertain size modifications and so should be expressed in NUMBERS.
var/prev_size //former cached_size value, to allow update_size() to early return should be there no significant changes.
/obj/item/organ/genital/breasts/Initialize(mapload, mob/living/carbon/human/H)
if(!H)
cached_size = size
size = breast_values[size]
prev_size = size
cached_size = breast_values[size]
prev_size = cached_size
return ..()
/obj/item/organ/genital/breasts/update_appearance()
@@ -67,41 +66,47 @@
//Rediculous sizes makes you more cumbersome.
//this is far too lewd wah
/obj/item/organ/genital/breasts/modify_size(modifier, min = -INFINITY, max = INFINITY)
var/new_value = CLAMP(cached_size + modifier, min, max)
if(new_value == prev_size)
return
prev_size = cached_size
cached_size = new_value
update()
/obj/item/organ/genital/breasts/update_size()//wah
var/rounded_cached = round(cached_size)
if(cached_size < 0)//I don't actually know what round() does to negative numbers, so to be safe!!fixed
if(owner)
to_chat(owner, "<span class='warning'>You feel your breasts shrinking away from your body as your chest flattens out.</span>")
QDEL_IN(src, 1)
return
var/enlargement = FALSE
switch(round(cached_size))
switch(rounded_cached)
if(0) //flatchested
size = "flat"
if(1 to 8) //modest
size = breast_values[round(cached_size)]
size = breast_values[rounded_cached]
if(9 to 15) //massive
size = breast_values[round(cached_size)]
size = breast_values[rounded_cached]
enlargement = TRUE
if(16 to INFINITY) //rediculous
size = "huge"
enlargement = TRUE
if(owner)
var/status_effect = owner.has_status_effect(/datum/status_effect/chem/breast_enlarger)
var/status_effect = owner.has_status_effect(STATUS_EFFECT_BREASTS_ENLARGEMENT)
if(enlargement && !status_effect)
owner.apply_status_effect(/datum/status_effect/chem/breast_enlarger)
owner.apply_status_effect(STATUS_EFFECT_BREASTS_ENLARGEMENT)
else if(status_effect)
owner.remove_status_effect(/datum/status_effect/chem/breast_enlarger)
owner.remove_status_effect(STATUS_EFFECT_BREASTS_ENLARGEMENT)
if(round(cached_size) < 16)//Because byond doesn't count from 0, I have to do this.
if(owner)
var/mob/living/carbon/human/H = owner
if (breast_values[size] > breast_values[prev_size])
to_chat(H, "<span class='warning'>Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.</span>")
H.dna.species.handle_genitals(src)
else if (breast_values[size] > 0.5)
to_chat(H, "<span class='warning'>Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [uppertext(size)]-cup.</span>")
H.dna.species.handle_genitals(src)
prev_size = size
if(rounded_cached < 16 && owner)//Because byond doesn't count from 0, I have to do this.
var/mob/living/carbon/human/H = owner
var/r_prev_size = round(prev_size)
if (rounded_cached > r_prev_size)
to_chat(H, "<span class='warning'>Your breasts [pick("swell up to", "flourish into", "expand into", "burst forth into", "grow eagerly into", "amplify into")] a [uppertext(size)]-cup.</span>")
else if (rounded_cached < r_prev_size)
to_chat(H, "<span class='warning'>Your breasts [pick("shrink down to", "decrease into", "diminish into", "deflate into", "shrivel regretfully into", "contracts into")] a [uppertext(size)]-cup.</span>")
/obj/item/organ/genital/breasts/get_features(mob/living/carbon/human/H)
var/datum/dna/D = H.dna
@@ -112,15 +117,11 @@
size = D.features["breasts_size"]
shape = D.features["breasts_shape"]
fluid_id = D.features["breasts_fluid"]
if(!D.features["breasts_producing"])
DISABLE_BITFIELD(genital_flags, GENITAL_FUID_PRODUCTION)
if(!isnum(size))
if(size == "flat")
cached_size = 0
else if (size == "huge")
cached_size = 16
else
cached_size = breast_values[size]
prev_size = size
cached_size = breast_values[size]
else
cached_size = size
size = breast_values[size]
prev_size = size
prev_size = cached_size
@@ -12,42 +12,47 @@
layer_index = PENIS_LAYER_INDEX
var/length = 6 //inches
var/prev_length = 6 //really should be renamed to prev_length
var/cached_length //used to detect a change in length
var/girth = 4.38
var/girth_ratio = COCK_GIRTH_RATIO_DEF //0.73; check citadel_defines.dm
var/knot_girth_ratio = KNOT_GIRTH_RATIO_DEF
var/list/knotted_types = list("knotted", "barbed, knotted")
/obj/item/organ/genital/penis/modify_size(modifier, min = -INFINITY, max = INFINITY)
var/new_value = CLAMP(length + modifier, min, max)
if(new_value == prev_length)
return
prev_length = length
length = CLAMP(length + modifier, min, max)
update()
/obj/item/organ/genital/penis/update_size()
if(cached_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, "<span class='warning'>You feel your tallywacker shrinking away from your body as your groin flattens out!</b></span>")
QDEL_IN(src, 1)
if(linked_organ)
QDEL_IN(linked_organ, 1)
return
var/rounded_length = round(length)
var/new_size
var/enlargement = FALSE
switch(round(cached_length))
switch(rounded_length)
if(0 to 6) //If modest size
new_size = 1
if(7 to 10) //If large
size = 2
new_size = 2
if(11 to 19) //If massive
size = 3
new_size = 3
if(20 to 34) //If massive and due for large effects
size = 3
new_size = 3
enlargement = TRUE
if(35 to INFINITY) //If comical
size = 4 //no new sprites for anything larger yet
new_size = 4 //no new sprites for anything larger yet
enlargement = TRUE
length = cached_length
if(owner)
var/status_effect = owner.has_status_effect(/datum/status_effect/chem/penis_enlarger)
var/status_effect = owner.has_status_effect(STATUS_EFFECT_PENIS_ENLARGEMENT)
if(enlargement && !status_effect)
owner.apply_status_effect(/datum/status_effect/chem/penis_enlarger)
owner.apply_status_effect(STATUS_EFFECT_PENIS_ENLARGEMENT)
else if(status_effect)
owner.remove_status_effect(/datum/status_effect/chem/penis_enlarger)
owner.remove_status_effect(STATUS_EFFECT_PENIS_ENLARGEMENT)
if(linked_organ)
linked_organ.update_size(new_size - size)
size = new_size
@@ -57,7 +62,6 @@
to_chat(owner, "<span class='warning'>Your [pick(GLOB.gentlemans_organ_names)] [pick("swells up to", "flourishes into", "expands into", "bursts forth into", "grows eagerly into", "amplifys into")] a [uppertext(round(length))] inch penis.</b></span>")
else if ((round(length) < round(prev_length)) && (length > 0.5))
to_chat(owner, "<span class='warning'>Your [pick(GLOB.gentlemans_organ_names)] [pick("shrinks down to", "decreases into", "diminishes into", "deflates into", "shrivels regretfully into", "contracts into")] a [uppertext(round(length))] inch penis.</b></span>")
prev_length = length
icon_state = sanitize_text("penis_[shape]_[size]")
girth = (length * girth_ratio)//Is it just me or is this ludicous, why not make it exponentially decay?
@@ -92,4 +96,3 @@
girth_ratio = D.features["cock_girth_ratio"]
shape = D.features["cock_shape"]
prev_length = length
cached_length = length
@@ -30,6 +30,7 @@
InverseChemVal = 0.35
InverseChem = "BEsmaller" //At really impure vols, it just becomes 100% inverse
can_synth = FALSE
var/message_spam = FALSE
/datum/reagent/fermi/breast_enlarger/on_mob_metabolize(mob/living/M)
. = ..()
@@ -45,13 +46,9 @@
B.throw_at(T2, 8, 1)
M.reagents.remove_reagent(id, volume)
return
log_game("FERMICHEM: [M] ckey: [M.key] has ingested Sucubus milk")
var/mob/living/carbon/human/H = M
H.genital_override = TRUE
var/obj/item/organ/genital/breasts/B = H.getorganslot(ORGAN_SLOT_BREASTS)
if(!B)
H.emergent_genital_call()
return
if(!H.getorganslot(ORGAN_SLOT_BREASTS) && H.emergent_genital_call())
H.genital_override = TRUE
/datum/reagent/fermi/breast_enlarger/on_mob_life(mob/living/carbon/M) //Increases breast size
if(!ishuman(M))//Just in case
@@ -62,46 +59,45 @@
if(!B) //If they don't have breasts, give them breasts.
//If they have Acute hepatic pharmacokinesis, then route processing though liver.
if(HAS_TRAIT(M, TRAIT_PHARMA))
var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER)
if(HAS_TRAIT(H, TRAIT_PHARMA) || !H.canbearoused)
var/obj/item/organ/liver/L = H.getorganslot(ORGAN_SLOT_LIVER)
if(L)
L.swelling+= 0.05
return..()
L.swelling += 0.05
else
M.adjustToxLoss(1)
return..()
H.adjustToxLoss(1)
return..()
//otherwise proceed as normal
var/obj/item/organ/genital/breasts/nB = new
nB.Insert(M)
if(nB)
if(M.dna.species.use_skintones && M.dna.features["genitals_use_skintone"])
nB.color = skintone2hex(H.skin_tone)
else if(M.dna.features["breasts_color"])
nB.color = "#[M.dna.features["breasts_color"]]"
else
nB.color = skintone2hex(H.skin_tone)
nB.size = "flat"
nB.cached_size = 0
nB.prev_size = "flat"
to_chat(M, "<span class='warning'>Your chest feels warm, tingling with newfound sensitivity.</b></span>")
M.reagents.remove_reagent(id, 5)
B = nB
B = new
if(H.dna.species.use_skintones && H.dna.features["genitals_use_skintone"])
B.color = skintone2hex(H.skin_tone)
else if(M.dna.features["breasts_color"])
B.color = "#[M.dna.features["breasts_color"]]"
else
B.color = skintone2hex(H.skin_tone)
B.size = "flat"
B.cached_size = 0
B.prev_size = 0
to_chat(H, "<span class='warning'>Your chest feels warm, tingling with newfound sensitivity.</b></span>")
H.reagents.remove_reagent(id, 5)
B.Insert(H)
//If they have them, increase size. If size is comically big, limit movement and rip clothes.
B.cached_size = B.cached_size + 0.05
if (B.cached_size >= 8.5 && B.cached_size < 9)
if(H.w_uniform || H.wear_suit)
var/target = M.get_bodypart(BODY_ZONE_CHEST)
to_chat(M, "<span class='warning'>Your breasts begin to strain against your clothes tightly!</b></span>")
M.adjustOxyLoss(5, 0)
M.apply_damage(1, BRUTE, target)
B.update()
B.modify_size(0.05)
if (ISINRANGE_EX(B.cached_size, 8.5, 9) && (H.w_uniform || H.wear_suit))
var/target = H.get_bodypart(BODY_ZONE_CHEST)
if(!message_spam)
to_chat(H, "<span class='danger'>Your breasts begin to strain against your clothes tightly!</b></span>")
message_spam = TRUE
H.adjustOxyLoss(5, 0)
H.apply_damage(1, BRUTE, target)
return ..()
/datum/reagent/fermi/breast_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders.
//Acute hepatic pharmacokinesis.
if(HAS_TRAIT(M, TRAIT_PHARMA))
if(HAS_TRAIT(M, TRAIT_PHARMA) || !M.canbearoused)
var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER)
L.swelling+= 0.05
return ..()
@@ -116,8 +112,7 @@
M.visible_message("<span class='boldnotice'>[M] suddenly looks more feminine!</span>", "<span class='boldwarning'>You suddenly feel more feminine!</span>")
if(P)
P.cached_length = P.cached_length - 0.05
P.update()
P.modify_size(-0.05)
if(T)
qdel(T)
if(!V)
@@ -141,15 +136,14 @@
var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS)
if(!B)
//Acute hepatic pharmacokinesis.
if(HAS_TRAIT(M, TRAIT_PHARMA))
if(HAS_TRAIT(M, TRAIT_PHARMA) || !M.canbearoused)
var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER)
L.swelling-= 0.05
return ..()
//otherwise proceed as normal
return..()
B.cached_size = B.cached_size - 0.05
B.update()
B.modify_size(-0.05)
return ..()
/datum/reagent/fermi/BEsmaller_hypo
@@ -176,15 +170,13 @@
var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS)
if(!B)
return..()
if(!M.dna.features["has_breasts"])//Fast fix for those who don't want it.
B.cached_size = B.cached_size - 0.1
B.update()
else if(B.cached_size > (sizeConv[M.dna.features["breasts_size"]]+0.1))
B.cached_size = B.cached_size - 0.05
B.update()
else if(B.cached_size < (sizeConv[M.dna.features["breasts_size"]])+0.1)
B.cached_size = B.cached_size + 0.05
B.update()
var/optimal_size = B.breast_values[M.dna.features["breasts_size"]]
if(!optimal_size)//Fast fix for those who don't want it.
B.modify_size(-0.1)
else if(B.cached_size > optimal_size)
B.modify_size(-0.05, optimal_size)
else if(B.cached_size < optimal_size)
B.modify_size(0.05, 0, optimal_size)
return ..()
////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -205,6 +197,7 @@
InverseChemVal = 0.35
InverseChem = "PEsmaller" //At really impure vols, it just becomes 100% inverse and shrinks instead.
can_synth = FALSE
var/message_spam = FALSE
/datum/reagent/fermi/penis_enlarger/on_mob_metabolize(mob/living/M)
. = ..()
@@ -221,55 +214,48 @@
M.reagents.remove_reagent(id, volume)
return
var/mob/living/carbon/human/H = M
H.genital_override = TRUE
var/obj/item/organ/genital/penis/P = M.getorganslot(ORGAN_SLOT_PENIS)
if(!P)
H.emergent_genital_call()
return
if(!H.getorganslot(ORGAN_SLOT_PENIS) && H.emergent_genital_call())
H.genital_override = TRUE
/datum/reagent/fermi/penis_enlarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch.
if(!ishuman(M))
return
return ..()
var/mob/living/carbon/human/H = M
var/obj/item/organ/genital/penis/P = M.getorganslot(ORGAN_SLOT_PENIS)
var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS)
if(!P)//They do have a preponderance for escapism, or so I've heard.
//If they have Acute hepatic pharmacokinesis, then route processing though liver.
if(HAS_TRAIT(M, TRAIT_PHARMA))
var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER)
if(HAS_TRAIT(H, TRAIT_PHARMA) || !H.canbearoused)
var/obj/item/organ/liver/L = H.getorganslot(ORGAN_SLOT_LIVER)
if(L)
L.swelling+= 0.05
return..()
L.swelling += 0.05
else
M.adjustToxLoss(1)
return..()
H.adjustToxLoss(1)
return ..()
//otherwise proceed as normal
var/obj/item/organ/genital/penis/nP = new
nP.Insert(M)
if(nP)
nP.length = 1
to_chat(M, "<span class='warning'>Your groin feels warm, as you feel a newly forming bulge down below.</b></span>")
nP.cached_length = 1
nP.prev_length = 1
M.reagents.remove_reagent(id, 5)
P = nP
P = new
P.length = 1
to_chat(H, "<span class='warning'>Your groin feels warm, as you feel a newly forming bulge down below.</b></span>")
P.prev_length = 1
H.reagents.remove_reagent(id, 5)
P.Insert(H)
P.cached_length = P.cached_length + 0.1
if (P.cached_length >= 20.5 && P.cached_length < 21)
if(H.w_uniform || H.wear_suit)
var/target = M.get_bodypart(BODY_ZONE_CHEST)
to_chat(M, "<span class='warning'>Your cock begin to strain against your clothes tightly!</b></span>")
M.apply_damage(2.5, BRUTE, target)
P.modify_size(0.1)
if (ISINRANGE_EX(P.length, 20.5, 21) && (H.w_uniform || H.wear_suit))
var/target = H.get_bodypart(BODY_ZONE_CHEST)
if(!message_spam)
to_chat(H, "<span class='danger'>Your cock begin to strain against your clothes tightly!</b></span>")
message_spam = TRUE
H.apply_damage(2.5, BRUTE, target)
P.update()
return ..()
/datum/reagent/fermi/penis_enlarger/overdose_process(mob/living/carbon/human/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders.
if(!istype(M))
return ..()
//Acute hepatic pharmacokinesis.
if(HAS_TRAIT(M, TRAIT_PHARMA))
if(HAS_TRAIT(M, TRAIT_PHARMA) || !M.canbearoused)
var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER)
L.swelling+= 0.05
return..()
@@ -284,8 +270,7 @@
M.visible_message("<span class='boldnotice'>[M] suddenly looks more masculine!</span>", "<span class='boldwarning'>You suddenly feel more masculine!</span>")
if(B)
B.cached_size = B.cached_size - 0.05
B.update()
B.modify_size(-0.05)
if(M.getorganslot(ORGAN_SLOT_VAGINA))
qdel(V)
if(W)
@@ -305,6 +290,8 @@
can_synth = FALSE
/datum/reagent/fermi/PEsmaller/on_mob_life(mob/living/carbon/M)
if(!ishuman(M))
return ..()
var/mob/living/carbon/human/H = M
var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS)
if(!P)
@@ -312,12 +299,9 @@
if(HAS_TRAIT(M, TRAIT_PHARMA))
var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER)
L.swelling-= 0.05
return..()
//otherwise proceed as normal
return..()
P.cached_length = P.cached_length - 0.1
P.update()
P.modify_size(-0.1)
..()
/datum/reagent/fermi/PEsmaller_hypo
@@ -334,6 +318,8 @@
if(!ishuman(M))
return
var/mob/living/carbon/human/H = M
if(!H.getorganslot(ORGAN_SLOT_PENIS) && H.dna.features["has_cock"])
H.give_genital(/obj/item/organ/genital/penis)
if(!H.getorganslot(ORGAN_SLOT_TESTICLES) && H.dna.features["has_balls"])
H.give_genital(/obj/item/organ/genital/testicles)
@@ -341,13 +327,11 @@
var/obj/item/organ/genital/penis/P = M.getorganslot(ORGAN_SLOT_PENIS)
if(!P)
return ..()
if(!M.dna.features["has_cock"])//Fast fix for those who don't want it.
P.cached_length = P.cached_length - 0.2
P.update()
else if(P.cached_length > (M.dna.features["cock_length"]+0.1))
P.cached_length = P.cached_length - 0.1
P.update()
else if(P.cached_length < (M.dna.features["cock_length"]+0.1))
P.cached_length = P.cached_length + 0.1
P.update()
var/optimal_size = M.dna.features["cock_length"]
if(!optimal_size)//Fast fix for those who don't want it.
P.modify_size(-0.2)
else if(P.length > optimal_size)
P.modify_size(-0.1, optimal_size)
else if(P.length < optimal_size)
P.modify_size(0.1, 0, optimal_size)
return ..()