diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index b9c822bfcb..551e01c3ef 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -53,24 +53,24 @@
//Effects of bloodloss
var/word = pick("dizzy","woozy","faint")
- switch(blood_volume)
- if((BLOOD_VOLUME_OKAY * blood_ratio) to (BLOOD_VOLUME_SAFE * blood_ratio))
- if(prob(5))
- to_chat(src, "You feel [word].")
- adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.01, 1))
- if((BLOOD_VOLUME_BAD * blood_ratio) to (BLOOD_VOLUME_OKAY*blood_ratio))
- adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1))
- if(prob(5))
- blur_eyes(6)
- to_chat(src, "You feel very [word].")
- if((BLOOD_VOLUME_SURVIVE * blood_ratio) to (BLOOD_VOLUME_BAD * blood_ratio))
- adjustOxyLoss(5)
- if(prob(15))
- Unconscious(rand(20,60))
- to_chat(src, "You feel extremely [word].")
- if(-INFINITY to (BLOOD_VOLUME_SURVIVE * blood_ratio))
- if(!has_trait(TRAIT_NODEATH))
- death()
+ //switch(blood_volume) Used to be a switch statement; now it uses ifs (so blood ratio can work.) Check my logic please.
+ if(((BLOOD_VOLUME_OKAY * blood_ratio) < blood_volume) && (blood_volume <= (BLOOD_VOLUME_SAFE * blood_ratio)))
+ if(prob(5))
+ to_chat(src, "You feel [word].")
+ adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.01, 1))
+ else if(((BLOOD_VOLUME_BAD * blood_ratio) < blood_volume) && (blood_volume <=(BLOOD_VOLUME_OKAY*blood_ratio)))
+ adjustOxyLoss(round(((BLOOD_VOLUME_NORMAL * blood_ratio) - blood_volume) * 0.02, 1))
+ if(prob(5))
+ blur_eyes(6)
+ to_chat(src, "You feel very [word].")
+ else if( ((BLOOD_VOLUME_SURVIVE * blood_ratio) < blood_volume) && (blood_volume <= (BLOOD_VOLUME_BAD * blood_ratio)))
+ adjustOxyLoss(5)
+ if(prob(15))
+ Unconscious(rand(20,60))
+ to_chat(src, "You feel extremely [word].")
+ else if((-INFINITY < blood_volume) && (blood_volume <= (BLOOD_VOLUME_SURVIVE * blood_ratio)))
+ if(!has_trait(TRAIT_NODEATH))
+ death()
var/temp_bleed = 0
//Bleeding out
@@ -309,12 +309,23 @@
/mob/living/proc/DecreaseBloodVol(var/value)
blood_ratio -= value
+//This is a terrible way of handling it.
/mob/living/proc/ResetBloodVol()
- if(ishuman(src) && src.has_trait(TRAIT_HIGH_BLOOD))
- blood_ratio = 1.2
+ if(ishuman(src))
+ var/mob/living/carbon/human/H = src
+ if (src.has_trait(TRAIT_HIGH_BLOOD))
+ blood_ratio = 1.2
+ H.handle_blood()
+ return
+ blood_ratio = 1
+ H.handle_blood()
+ return
blood_ratio = 1
/mob/living/proc/AdjustBloodVol(var/value)
if(blood_ratio == value)
return
blood_ratio = value
+ if(ishuman(src))
+ var/mob/living/carbon/human/H = src
+ H.handle_blood()
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index e9ef720616..96e8c5fa1b 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -353,7 +353,8 @@ im
var/iconhtml = icon2html(A, seen)
for(var/mob/M in seen)
to_chat(M, "[iconhtml] \The [my_atom]'s melts from the temperature!")
- playsound(get_turf(A), 'sound/effects/bubbles.ogg', 80, 1)
+ playsound(get_turf(A), 'sound/FermiChem/heatmelt.ogg', 80, 1)
+
qdel(A)
return
else if(istype(A, /obj/item/reagent_containers/glass) && ((pH < 0.5) || (pH > 13.5)))//maybe make it higher? Though..Hmm!
@@ -361,7 +362,7 @@ im
var/iconhtml = icon2html(A, seen)
for(var/mob/M in seen)
to_chat(M, "[iconhtml] \The [my_atom]'s melts from the extreme pH!")
- playsound(get_turf(A), 'sound/effects/bubbles.ogg', 80, 1)
+ playsound(get_turf(A), 'sound/FermiChem/acidmelt.ogg', 80, 1)
qdel(A)
return
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 1aba4c5a95..73b221866d 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -167,12 +167,12 @@
/obj/item/reagent_containers/glass/beaker/plastic
name = "x-large beaker"
- desc = "An extra-large beaker. Can hold up to 150 units."
+ desc = "An extra-large beaker. Can hold up to 150 units. Is able to resist acid and alkaline solutions, but melts at 444K"
icon_state = "beakerwhite"
materials = list(MAT_GLASS=2500, MAT_PLASTIC=3000)
volume = 150
amount_per_transfer_from_this = 10
- possible_transfer_amounts = list(5,10,15,20,25,30,60,120,150)
+ possible_transfer_amounts = list(5,10,15,20,25,30,50,100,150)
/obj/item/reagent_containers/glass/beaker/plastic/update_icon()
icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states
@@ -186,7 +186,7 @@
materials = list(MAT_GLASS=2500, MAT_PLASTIC=3000, MAT_GOLD=1000, MAT_TITANIUM=1000)
volume = 200
amount_per_transfer_from_this = 10
- possible_transfer_amounts = list(5,10,15,20,25,30,60,120,150,200)
+ possible_transfer_amounts = list(5,10,15,20,25,30,50,100,200)
/obj/item/reagent_containers/glass/beaker/noreact
name = "cryostasis beaker"
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
index a7d77be496..8008c4a422 100644
--- a/modular_citadel/code/datums/status_effects/chems.dm
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -121,15 +121,15 @@
message_admins("PElarge started!")
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)
if(o.w_uniform || o.wear_suit)
to_chat(o, "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..!")
owner.visible_message("[o]'s schlong suddenly bursts forth, ripping their clothes off!'")
else
to_chat(o, "Your emancipated trouser snake is so ripe with girth, you seriously doubt you'll be able to fit any clothes over it.")
+ 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)
return ..()
@@ -286,11 +286,8 @@
else
else if (resistanceTally > 150)
- enthrallTally *= 0.5
phase = -1
- resistanceTally = 0
to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!")
- to_chat(owner, "You're now free of [master]'s influence, and fully independant oncemore.'")
owner.remove_status_effect(src) //If resisted in phase 1, effect is removed.
if(prob(10))
if(owner.lewd)
@@ -311,6 +308,7 @@
enthrallTally *= 0.5
phase -= 1
resistanceTally = 0
+ resistGrowth = 0
to_chat(owner, "You manage to shake some of the effects from your addled mind, however you can still feel yourself drawn towards [master].")
//owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. Not at the moment,
if(prob(10))
@@ -321,6 +319,7 @@
enthrallTally = 0
phase -= 1
resistanceTally = 0
+ resistGrowth = 0
to_chat(owner, "The separation from [(owner.lewd?"your [enthrallGender]":"[master]")] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.")
owner.remove_trait(TRAIT_PACIFISM, "MKUltra")
if(prob(2))
@@ -334,6 +333,7 @@
to_chat(owner, "Your mind starts to heal, fixing the damage caused by the massive ammounts of chem injected into your system earlier, .")
M.slurring = 0
M.confused = 0
+ resistGrowth = 0
else
return//If you break the mind of someone, you can't use status effects on them.
@@ -521,6 +521,7 @@
redirect_component = null
UnregisterSignal(owner, COMSIG_MOVABLE_HEAR)
owner.remove_trait(TRAIT_PACIFISM, "MKUltra")
+ to_chat(owner, "You're now free of [master]'s influence, and fully independant oncemore!'")
//UnregisterSignal(owner, COMSIG_GLOB_LIVING_SAY_SPECIAL) //Should still make custom commands work after freedom, need to check.
/*
@@ -643,7 +644,7 @@
return
else
deltaResist = 2 + resistGrowth
- resistGrowth += 0.1
+ resistGrowth += 0.05
//distance modifer
switch(DistApart)
diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm
index 4b54ea38f0..dddbda5d6f 100644
--- a/modular_citadel/code/modules/arousal/organs/genitals.dm
+++ b/modular_citadel/code/modules/arousal/organs/genitals.dm
@@ -284,8 +284,13 @@
if(istype(O, /obj/item/organ/genital))
organCheck = TRUE
if (organCheck == FALSE)
- dna.features["genitals_use_skintone"] = TRUE
- dna.species.use_skintones = TRUE
+ if(ishuman(src))
+ dna.features["genitals_use_skintone"] = TRUE
+ dna.species.use_skintones = TRUE
+ return
+ //So people who haven't set stuff up don't get rainbow surprises.
+ dna.features["cock_color"] = "#[dna.features["mcolor"]]"
+ dna.features["breasts_color"] = "#[dna.features["mcolor"]]"
return
/datum/species/proc/handle_genitals(mob/living/carbon/human/H)
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
index 759232327e..0a1e32eda7 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
@@ -630,6 +630,20 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
/datum/reagent/fermi/BElarger/on_mob_add(mob/living/carbon/M)
. = ..()
+ if(!ishuman(M)) //The monkey clause
+ if(volume >= 10)
+ var/turf/T = get_turf(M)
+ var/obj/item/organ/genital/breasts/B = new /obj/item/organ/genital/breasts(T)
+ var/list/seen = viewers(8, T)
+ for(var/mob/S in seen)
+ to_chat(S, "A pair of breasts suddenly fly out of the [M]!")
+ //var/turf/T2 = pick(turf in view(5, M))
+ var/T2 = get_random_station_turf()
+ M.adjustBruteLoss(5)
+ M.Knockdown(50)
+ B.throw_at(T2, 8, 1)
+ M.reagents.remove_reagent(src.id, 1000)
+ return
var/mob/living/carbon/human/H = M
H.genital_override = TRUE
var/obj/item/organ/genital/breasts/B = H.getorganslot("breasts")
@@ -637,13 +651,14 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
H.emergent_genital_call()
message_admins("No breasts found on init!")
return
-
var/sizeConv = list("a" = 1, "b" = 2, "c" = 3, "d" = 4, "e" = 5)
B.prev_size = B.size
B.cached_size = sizeConv[B.size]
message_admins("init B size: [B.size], prev: [B.prev_size], cache = [B.cached_size], raw: [sizeConv[B.size]]") //if this runtimes it's cause someone's breasts are too big!
/datum/reagent/fermi/BElarger/on_mob_life(mob/living/carbon/M) //Increases breast size
+ if(!ishuman(M))//Just in case
+ return
var/mob/living/carbon/human/H = M
var/obj/item/organ/genital/breasts/B = M.getorganslot("breasts")
if(!B) //If they don't have breasts, give them breasts.
@@ -742,6 +757,19 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
/datum/reagent/fermi/PElarger/on_mob_add(mob/living/carbon/M)
. = ..()
+ if(!ishuman(M)) //Just monkeying around.
+ if(volume >= 10)
+ var/turf/T = get_turf(M)
+ var/obj/item/organ/genital/penis/P = new /obj/item/organ/genital/penis(T)
+ var/list/seen = viewers(8, T)
+ for(var/mob/S in seen)
+ to_chat(S, "A penis suddenly flies out of the [M]!")
+ var/T2 = get_random_station_turf()
+ M.adjustBruteLoss(5)
+ M.Knockdown(50)
+ P.throw_at(T2, 8, 1)
+ M.reagents.remove_reagent(src.id, 1000)
+ return
var/mob/living/carbon/human/H = M
H.genital_override = TRUE
var/obj/item/organ/genital/penis/P = M.getorganslot("penis")
@@ -754,6 +782,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
message_admins("init P len chem: [P.length], prev: [P.prev_size], cache = [P.cached_length]")
/datum/reagent/fermi/PElarger/on_mob_life(mob/living/carbon/M) //Increases penis size, 5u = +1 inch.
+ if(!ishuman(M))
+ return
var/mob/living/carbon/human/H = M
var/obj/item/organ/genital/penis/P = M.getorganslot("penis")
if(!P)
diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
index b6d888ef88..f9655777c7 100644
--- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm
@@ -85,7 +85,7 @@
CurveSharppH = 2 // How sharp the pH exponential curve is (to the power of value)
ThermicConstant = 5 //Temperature change per 1u produced
HIonRelease = -0.1 //pH change per 1u reaction
- RateUpLim = 5.5 //Optimal/max rate possible if all conditions are perfect
+ RateUpLim = 55 //Optimal/max rate possible if all conditions are perfect (NEEDS TO BE A MULTIPLE OF 10 IF RESULTS IS DOWN BY A FACTOR OF 10)
FermiChem = TRUE//If the chemical uses the Fermichem reaction mechanics
FermiExplode = FALSE //If the chemical explodes in a special way
@@ -115,7 +115,7 @@
CurveSharppH = 4 // How sharp the pH exponential curve is (to the power of value)
ThermicConstant = -5 // Temperature change per 1u produced
HIonRelease = 0.05 // pH change per 1u reaction
- RateUpLim = 5 // Optimal/max rate possible if all conditions are perfect
+ RateUpLim = 20 // Optimal/max rate possible if all conditions are perfect
FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics
FermiExplode = TRUE // If the chemical explodes in a special way
PurityMin = 0.25
@@ -151,7 +151,7 @@
CurveSharppH = 2
ThermicConstant = 1
HIonRelease = 0.5
- RateUpLim = 5
+ RateUpLim = 50
FermiChem = TRUE
FermiExplode = TRUE
PurityMin = 0.1
@@ -183,7 +183,7 @@
CurveSharppH = 2
ThermicConstant = 1
HIonRelease = -0.5
- RateUpLim = 5
+ RateUpLim = 50
FermiChem = TRUE
FermiExplode = TRUE
PurityMin = 0.1
@@ -215,7 +215,7 @@
CurveSharppH = 1
ThermicConstant = 20
HIonRelease = -0.5
- RateUpLim = 10
+ RateUpLim = 20
FermiChem = TRUE
FermiExplode = TRUE
PurityMin = 0.25 // explode purity!
@@ -297,7 +297,7 @@
CurveSharppH = 0.5
ThermicConstant = -2
HIonRelease = -0.05
- RateUpLim = 5
+ RateUpLim = 50
FermiChem = TRUE
FermiExplode = TRUE
PurityMin = 0.5
@@ -328,7 +328,7 @@
CurveSharppH = 0.5
ThermicConstant = -10
HIonRelease = -0.1
- RateUpLim = 10
+ RateUpLim = 20
FermiChem = TRUE
PurityMin = 0.30
@@ -352,7 +352,7 @@
CurveSharppH = 1
ThermicConstant = 5
HIonRelease = 0.01
- RateUpLim = 100
+ RateUpLim = 200
FermiChem = TRUE
PurityMin = 0.15
@@ -373,7 +373,7 @@
CurveSharppH = 0
ThermicConstant = 0
HIonRelease = -0.01
- RateUpLim = 20
+ RateUpLim = 200
FermiChem = TRUE
/datum/chemical_reaction/fermi/fermiABuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this
@@ -398,7 +398,7 @@
CurveSharppH = 0
ThermicConstant = 0
HIonRelease = 0.01
- RateUpLim = 20
+ RateUpLim = 200
FermiChem = TRUE
/datum/chemical_reaction/fermi/fermiBBuffer/FermiFinish(datum/reagents/holder, var/atom/my_atom) //might need this
diff --git a/sound/FermiChem/SoundSources.txt b/sound/FermiChem/SoundSources.txt
new file mode 100644
index 0000000000..15b25ccd05
--- /dev/null
+++ b/sound/FermiChem/SoundSources.txt
@@ -0,0 +1,9 @@
+heatmelt.ogg - from https://freesound.org/people/toiletrolltube/sounds/181483/
+ from https://freesound.org/people/MrVasLuk/sounds/304619/
+ from https://freesound.org/people/Benboncan/sounds/74899/
+ from bubbles2.ogg
+heatacid.ogg - from https://freesound.org/people/klankbeeld/sounds/233697/
+ from bubbles2.ogg
+ from fuse.ogg
+
+Work is licensed under the Creative Commons and Attribution License.
\ No newline at end of file
diff --git a/sound/FermiChem/acidmelt.ogg b/sound/FermiChem/acidmelt.ogg
new file mode 100644
index 0000000000..bef257be55
Binary files /dev/null and b/sound/FermiChem/acidmelt.ogg differ
diff --git a/sound/FermiChem/heatmelt.ogg b/sound/FermiChem/heatmelt.ogg
new file mode 100644
index 0000000000..87dab3a18f
Binary files /dev/null and b/sound/FermiChem/heatmelt.ogg differ