diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index e58225068c..6466ac8b61 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -48,7 +48,7 @@
var/maximum_volume = 100
var/atom/my_atom = null
var/chem_temp = 150
- var/pH = REAGENT_NORMAL_PH
+ var/pH = REAGENT_NORMAL_PH//This is definately 7, right?
var/last_tick = 1
var/addiction_tick = 1
var/list/datum/reagent/addiction_list = new/list()
@@ -545,6 +545,7 @@
var/list/cached_required_reagents = C.required_reagents//update reagents list
var/list/cached_results = C.results//resultant chemical list
var/multiplier = INFINITY
+ var/special_react_result = C.check_special_react(src)
message_admins("updating targetVol from [targetVol]")
for(var/B in cached_required_reagents) //
@@ -557,6 +558,8 @@
targetVol = 0
handle_reactions()
update_total()
+
+ C.on_reaction(src, multiplier, special_react_result)
return
for(var/P in cached_results)
targetVol = cached_results[P]*multiplier
@@ -578,6 +581,7 @@
targetVol = 0
handle_reactions()
update_total()
+ C.on_reaction(src, multiplier, special_react_result)
return
else
STOP_PROCESSING(SSprocessing, src)
@@ -587,6 +591,7 @@
targetVol = 0
handle_reactions()
update_total()
+ C.on_reaction(src, multiplier, special_react_result)
return
//handle_reactions()
@@ -827,48 +832,54 @@
chem_temp = thermal_energy / (specific_heat * new_total)
////
- pH = round(-log(10, ((cached_total * (10^(-cached_pH))) + (amount * (10^(-other_pH)))) / new_total), REAGENT_PH_ACCURACY)
+ //pH = round(-log(10, ((cached_total * (10^(-cached_pH))) + (amount * (10^(-other_pH)))) / new_total), REAGENT_PH_ACCURACY) I think this is wrong? I'm getting negative numbers?
+ pH = ((cached_pH * cached_total)+(D.pH * amount))/(cached_total + amount)//should be right
//add the reagent to the existing if it exists
- if(cached_reagents[reagent]) //if it's already in us, merge
- var/datum/reagent/R = cached_reagents[reagent]
- //WIP_TAG //check my maths for purity calculations
- //Add amount and equalize purity
- //var/our_pure_moles = R.volume * R.purity
- //var/their_pure_moles = amount * other_purity
- R.volume += amount
- //R.purity = (our_pure_moles + their_pure_moles) / (R.volume)
- R.purity = ((R.purity * R.volume) + (other_purity * amount)) /((R.volume + amount)) //This should add the purity to the product
- ////
+ for(var/A in cached_reagents)
+ var/datum/reagent/R = A
+ if (R.id == reagent)
+ //WIP_TAG //check my maths for purity calculations
+ //Add amount and equalize purity
+ R.volume += amount
+ //Maybe make a pH for reagents, not sure. it's hard to imagine where the H+ ions would go. I'm okay with this solution for now.
+ //R.purity = (our_pure_moles + their_pure_moles) / (R.volume)
+ R.purity = ((R.purity * R.volume) + (other_purity * amount)) /((R.volume + amount)) //This should add the purity to the product
+ ////
- update_total()
- if(my_atom)
- my_atom.on_reagent_change(ADD_REAGENT)
- R.on_merge(data, amount)
- if(!no_react)
- handle_reactions()
- return TRUE
+ update_total()
+ if(my_atom)
+ my_atom.on_reagent_change(ADD_REAGENT)
+ R.on_merge(data, amount)
+ if(!no_react)
+ handle_reactions()
+ return TRUE
- else
- var/datum/reagent/R = new D.type(data)
- cached_reagents[R.id] = R
- R.holder = src
- R.volume = amount
- R.purity = other_purity
- if(data)
- R.data = data
- R.on_new(data)
- update_total()
- if(my_atom)
- my_atom.on_reagent_change(ADD_REAGENT)
- if(!no_react)
- handle_reactions()
- if(isliving(my_atom))
- R.on_mob_add(my_atom)
- return TRUE
+ //otherwise make a new one
+ var/datum/reagent/R = new D.type(data)
+ cached_reagents += R
+ R.holder = src
+ R.volume = amount
+ R.purity = other_purity
+ R.loc = get_turf(my_atom)
+ if(data)
+ R.data = data
+ R.on_new(data)
+ if(istype(D, /datum/reagent/fermi))//Is this a fermichem?
+ var/datum/reagent/fermi/FermiTime = D //It's Fermi time!
+ FermiTime.fermiCreate(R.holder) //Seriously what is "data" ????
+ //This is how I keep myself sane.
- return FALSE
+
+ update_total()
+ if(my_atom)
+ my_atom.on_reagent_change(ADD_REAGENT)
+ if(!no_react)
+ handle_reactions()
+ if(isliving(my_atom))
+ R.on_mob_add(my_atom)
+ return TRUE
/datum/reagents/proc/add_reagent_list(list/list_reagents, list/data=null) // Like add_reagent but you can enter a list. Format it like this: list("toxin" = 10, "beer" = 15)
@@ -896,8 +907,11 @@
if (R.id == reagent)
//clamp the removal amount to be between current reagent amount
//and zero, to prevent removing more than the holder has stored
+ if((total_volume - amount) == 0)//Because this can result in 0, I don't want it to crash.
+ pH = 7
+ else
+ pH = ((pH * total_volume)-(R.pH * amount))/(total_volume - amount)
amount = CLAMP(amount, 0, R.volume)
- pH = ((pH * total_volume)-(R.pH * amount))/(total_volume - amount)
R.volume -= amount
update_total()
if(!safety)//So it does not handle reactions when it need not to
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index d95a18dc3e..dd1bd31aaf 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -36,7 +36,7 @@
//Fermichem vars:
var/purity = 1
var/impureChem = "toxin"
- //var/loc = null
+ var/loc = null //Should be the creation location!
var/pH
/datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index 98c85b875f..03bbd6f6a8 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -45,6 +45,49 @@
if(user.a_intent == INTENT_HARM)
return ..()
+/obj/item/reagent_containers/attack(obj/item/W, mob/user, params)
+ ..()
+ if(!istype(W, /obj/item/pHpaper))
+ return
+ var/obj/item/pHpaper/P = W
+ if(P.used == TRUE)
+ to_chat(user, "[src] has already been used!")
+ return
+ switch(src.reagents.pH)
+ if(14 to INFINITY)
+ P.color = "#462c83"
+ if(13 to 14)
+ P.color = "#63459b"
+ if(12 to 13)
+ P.color = "#5a51a2"
+ if(11 to 12)
+ P.color = "#3853a4"
+ if(10 to 11)
+ P.color = "#3f93cf"
+ if(9 to 10)
+ P.color = "#0bb9b7"
+ if(8 to 9)
+ P.color = "#23b36e"
+ if(7 to 8)
+ P.color = "#3aa651"
+ if(6 to 7)
+ P.color = "#4cb849"
+ if(5 to 6)
+ P.color = "#b5d335"
+ if(4 to 5)
+ P.color = "#b5d333"
+ if(3 to 4)
+ P.color = "#f7ec1e"
+ if(2 to 3)
+ P.color = "#fbc314"
+ if(1 to 2)
+ P.color = "#f26724"
+ if(-INFINITY to 1)
+ P.color = "#ef1d26"
+ P.used = TRUE
+
+
+
/obj/item/reagent_containers/proc/canconsume(mob/eater, mob/user)
if(!iscarbon(eater))
return 0
@@ -127,4 +170,4 @@
..()
/obj/item/reagent_containers/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
- reagents.expose_temperature(exposed_temperature)
\ No newline at end of file
+ reagents.expose_temperature(exposed_temperature)
diff --git a/modular_citadel/code/datums/mood_events/chem_events.dm b/modular_citadel/code/datums/mood_events/chem_events.dm
index e46bf023f7..e0e4622495 100644
--- a/modular_citadel/code/datums/mood_events/chem_events.dm
+++ b/modular_citadel/code/datums/mood_events/chem_events.dm
@@ -9,7 +9,7 @@
/datum/mood_event/enthrallpraise
mood_change = 12
description = "I feel so happy! I'm a good pet who Master loves!\n"
- timeout = 400
+ timeout = 600
/datum/mood_event/enthrallscold
mood_change = -12
@@ -30,4 +30,4 @@
/datum/mood_event/enthrallmissing4
mood_change = -25
- description = "You're all alone, It's so hard to continute without your Master...\n"
+ description = "I'm all alone, It's so hard to continute without Master...\n"
diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm
index 9b71ebd457..2070e0dda0 100644
--- a/modular_citadel/code/datums/status_effects/chems.dm
+++ b/modular_citadel/code/datums/status_effects/chems.dm
@@ -207,9 +207,9 @@
to_chat(owner, "Your mind starts to restore some of it's clarity as you feel the effects of the drug wain.")
if (mental_capacity <= 500 || phase == 4)
if (owner.reagents.has_reagent("mannitol"))
- mental_capacity += 1
+ mental_capacity += 5
if (owner.reagents.has_reagent("neurine"))
- mental_capacity += 2
+ mental_capacity += 10
//mindshield check
if(M.has_trait(TRAIT_MINDSHIELD))
@@ -409,13 +409,12 @@
//qdel(redirect_component2.resolve())
//redirect_component2 = null
-/*
+
/datum/status_effect/chem/enthrall/mob/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null)
- if(enthrallID.name in message || enthrallID.first_name in message)
+ if(master in message || master in message)
return
else
. = ..()
-*/
/datum/status_effect/chem/enthrall/proc/on_hear(message, atom/movable/speaker, message_language, raw_message, radio_freq, list/spans, message_mode)
var/mob/living/carbon/C = owner
diff --git a/modular_citadel/code/modules/arousal/organs/genitals.dm b/modular_citadel/code/modules/arousal/organs/genitals.dm
index 8923d196c2..7c6cc74392 100644
--- a/modular_citadel/code/modules/arousal/organs/genitals.dm
+++ b/modular_citadel/code/modules/arousal/organs/genitals.dm
@@ -269,8 +269,8 @@
/mob/living/carbon/human/proc/Force_update_genitals(mob/living/carbon/human/H)
dna.species.handle_genitals(src)
- dna.species.handle_breasts(src)
- H.update_body()
+ //dna.species.handle_breasts(src)
+ //H.update_body()
/datum/species/proc/handle_genitals(mob/living/carbon/human/H)
message_admins("attempting to update sprite")
@@ -351,6 +351,7 @@
for(var/L in relevant_layers)
H.apply_overlay(L)
+/* Behold the maddness I went through.
/datum/species/proc/handle_breasts(mob/living/carbon/human/H)
//check for breasts first!
@@ -420,3 +421,4 @@
H.apply_overlay(L)
H.update_icons()
///obj/item/organ/genital/breasts/update_icon(/obj/item/organ/genital) //Where did this come from?
+*/
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 43aac65143..511aec2b62 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/fermi_reagents.dm
@@ -7,6 +7,8 @@
//And tips their hat
//Naninte chem
+
+
/datum/reagent/fermi
name = "Fermi" //Why did I putthis here?
id = "fermi" //It's meeee
@@ -20,6 +22,9 @@
//holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency, FALSE) //fermi reagents stay longer if you have a better metabolism
//return ..()
+/datum/reagent/fermi/proc/fermiCreate(holder) //You can get holder by reagents.holder WHY DID I LEARN THIS NOW???
+ return
+
//This should process fermichems to find out how pure they are and what effect to do.
//TODO: add this to the main on_mob_add proc, and check if Fermichem = TRUE
/datum/reagent/fermi/on_mob_add(mob/living/carbon/M)
@@ -27,7 +32,7 @@
return
else if (src.InverseChemVal > src.purity)
holder.remove_reagent(src.id, volume, FALSE)
- holder.add_reagent(src.InverseChem)
+ holder.add_reagent(src.InverseChem, volume, FALSE)
return
else
var/pureVol = volume * purity
@@ -41,14 +46,25 @@
///datum/reagent/fermi/overdose_start(mob/living/carbon/M)
//current_cycle++
-//eigenstate Chem
-//Teleports you to chemistry and back
-//OD teleports you randomly around the Station
-//Addiction send you on a wild ride and replaces you with an alternative reality version of yourself.
+
////////////////////////////////////////////////////////////////////////////////////////////////////
// EIGENSTASIUM
///////////////////////////////////////////////////////////////////////////////////////////////////
+//eigenstate Chem
+//Teleports you to chemistry and back
+//OD teleports you randomly around the Station
+//Addiction send you on a wild ride and replaces you with an alternative reality version of yourself.
+//During the process you get really hungry, then your items start teleporting randomly,
+//then alternative versions of yourself are brought in from a different universe and they yell at you.
+//and finally you yourself get teleported to an alternative universe, and character your playing is replaced with said alternative (this used to reroll objectives, but Kevin said prooobably not).
+//Currently the creation loc doesn't work, so it teleports you back to where you took it. Which is fine too.
+//Bugginess level: low - I can't get the remove all status effects and moodlets to work. Basically I'd like to reset the character to roundstart if possible.
+
+//Important factors to consider while balancing:
+//1.It's... Fun. And thats mostly it. The teleport thing isn't that useful, since you have to be not stunned to take it.
+//You could use it as an antag and OD someone, but you have to inject 20u, which is 5 more than a syringe, and it doesn't kill you.
+//I'd like to make it reroll your objectives or expand upon the alternative version of you.
/datum/reagent/fermi/eigenstate
name = "Eigenstasium"
@@ -105,7 +121,7 @@
to_chat(M, "Oh god, you feel like your wavefunction is about to tear.")
M.Jitter(10)
-/datum/reagent/fermi/eigenstate/overdose_process(mob/living/M) //Overdose, makes you teleport randomly
+/datum/reagent/fermi/eigenstate/overdose_process(mob/living/M) //Overdose, makes you teleport randomly, probably one of my favourite effects. Sometimes kills you.
do_sparks(5,FALSE,src)
do_teleport(M, get_turf(M), 10, asoundin = 'sound/effects/phasein.ogg')
do_sparks(5,FALSE,src)
@@ -210,6 +226,8 @@
////////////////////////////////////////////////////
// synthetic-derived growth factor //
//////////////////////////////////////////////////
+other files that are relivant:
+modular_citadel/code/datums/status_effects/chems.dm - SDGF
WHAT IT DOES
Several outcomes are possible (in priority order):
@@ -349,7 +367,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
//qdel(src)
else if(src.playerClone == FALSE) //No candidates leads to two outcomes; if there's already a braincless clone, it heals the user, as well as being a rare souce of clone healing (thematic!).
- message_admins("Failed to find clone Candidate")
+ //message_admins("Failed to find clone Candidate")
src.unitCheck = TRUE
if(M.has_status_effect(/datum/status_effect/chem/SGDF)) // Heal the user if they went to all this trouble to make it and can't get a clone, the poor fellow.
switch(current_cycle)
@@ -387,7 +405,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
to_chat(M, "Your body splits away from the cell clone of yourself, leaving you with a drained and hollow feeling inside.")
M.apply_status_effect(/datum/status_effect/chem/SGDF)
if(87 to INFINITY)
- holder.remove_reagent(src.id, 1)//removes SGDF on completion.
+ holder.remove_reagent(src.id, 1000)//removes SGDF on completion. Has to do it this way because of how i've coded it. If some madlab gets over 1k of SDGF, they can have the clone healing.
message_admins("Purging SGDF [volume]")
message_admins("Growth nucleation occuring (SDGF), step [current_cycle] of 77")
@@ -524,11 +542,28 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
////////////////////////////////////////////////////////////////////////////////////////////////////
// BREAST ENLARGE
///////////////////////////////////////////////////////////////////////////////////////////////////
+//Other files that are relivant:
+//modular_citadel/code/datums/status_effects/chems.dm
+//modular_citadel/code/modules/arousal/organs/breasts.dm
//breast englargement
//Honestly the most requested chems
//I'm not a very kinky person, sorry if it's not great
//I tried to make it interesting..!!
+
+//Normal function increases your breast size by 0.1, 1 unit = 1 cup.
+//If you get stupid big, it presses against your clothes, causing brute and oxydamage. Then rips them off.
+//If you keep going, it makes you slower, in speed and action.
+//decreasing your size will return you to normal.
+//(see the status effect in chem.dm)
+//Need to add something that checks to see if the breasts are gone to remove negative debuffs, as well as improve how they're added instead of a flat +/-
+//I think most of the layering stuff Works
+//but by god does it make me mad, never again.
+//Overdosing on (what is essentially space estrogen) makes you female, removes balls and shrinks your dick.
+//OD is low for a reason. I'd like fermichems to have low ODs, and dangerous ODs, and since this is a meme chem that everyone will rush to make, it'll be a lesson learnt early.
+
+//Bug status: Maybe a bit buggy with the spritecode, and the sprites themselves need touching up.
+//TODO - fail reaction explosion makes breasts and baps you with them.
/datum/reagent/fermi/BElarger
name = "Sucubus milk"
id = "BEenlager"
@@ -611,12 +646,15 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
////////////////////////////////////////////////////////////////////////////////////////////////////
// PENIS ENLARGE
///////////////////////////////////////////////////////////////////////////////////////////////////
-
+//See breast explanation, it's the same but with taliwhackers
+//Oh and I refuse to draw dicks. Someone else can or I'll replace large sprites with a redtail.
+//Since someone else made this in the time it took me to PR it, I merged the two ideas.
+//Which basically means I took the description.
//TODO: failing the reaction creates a penis instead.
/datum/reagent/fermi/PElarger // Due to popular demand...!
name = "Incubus draft"
id = "PElarger"
- description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermicem corp and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny?
+ description = "A volatile collodial mixture derived from various masculine solutions that encourages a larger gentleman's package via a potent testosterone mix, formula derived from a collaboration from Fermichem and Doctor Ronald Hyatt, who is well known for his phallus palace." //The toxic masculinity thing is a joke because I thought it would be funny to include it in the reagents, but I don't think many would find it funny? dumb
color = "#888888" // This is greyish..?
taste_description = "chinese dragon powder"
overdose_threshold = 12 //ODing makes you male and removes female genitals
@@ -682,10 +720,22 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
nT.Insert(M)
T = nT
..()
-
+/*
////////////////////////////////////////////////////////////////////////////////////////////////////
// ASTROGEN
///////////////////////////////////////////////////////////////////////////////////////////////////
+More fun chems!
+When you take it, it spawns a ghost that shouldn't be able to interact with the world, it can talk cause eh, it's space whattya gonna do
+This ghost moves pretty quickly and is mostly invisible, but is still visible for people with eyes.
+When it's out of your system, you return back to yourself. It doesn't last long and metabolism of the chem is exponential.
+ODing doesn't seem to work, I dunno why, I'd like it to frustrate your attempts to move around and make you fall aleep after.
+Addiction is particularlly brutal, it slowly turns you invisible with flavour text, then kills you at a low enough alpha. (i've also added something to prevent geneticists speeding this up)
+There's afairly major catch regarding the death though. I'm not gonna say here, go read the code, it explains it and puts my comments on it in context. I know that anyone reading it without understanding it is going to freak out so, this is my attempt to get you to read it and understand it.
+I'd like to point out from my calculations it'll take about 60-80 minutes to die this way too. Plenty of time to visit me and ask for some pills to quench your addiction.
+
+Buginess level: low
+*/
+
/datum/reagent/fermi/astral // Gives you the ability to astral project for a moment!
name = "Astrogen"
id = "astral"
@@ -694,19 +744,20 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
taste_description = "velvety brambles"
metabolization_rate = 0//Removal is exponential, see code
overdose_threshold = 20
- addiction_threshold = 30
- addiction_stage1_end = 9999//Should never end.
+ addiction_threshold = 25
+ addiction_stage1_end = 9999//Should never end. There is no escape make your time
var/mob/living/carbon/origin
var/mob/living/simple_animal/hostile/retaliate/ghost/G = null
var/ODing = FALSE
+ var/antiGenetics = 255
+ var/sleepytime = 0
//var/Svol = volume
/datum/reagent/fermi/astral/on_mob_life(mob/living/M) // Gives you the ability to astral project for a moment!
M.alpha = 255//Reset addiction
switch(current_cycle)
if(0)//Require a minimum
- //var/mob/living/carbon/H = M
- //M.alpha = 255
+ M.alpha = 255
origin = M
if (G == null)
G = new(get_turf(M.loc))
@@ -723,52 +774,57 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
G.alpha = 35
G.name = "[M]'s astral projection"
M.mind.transfer_to(G)
+ sleepytime = 10*volume
+ if(overdosed)
+ if(prob(50))
+ to_chat(M, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!")
+ do_teleport(G, M.loc)
holder.remove_reagent(src.id, current_cycle, FALSE)
..()
/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M)
G.mind.transfer_to(origin)
qdel(G)
- if(ODing == TRUE)
- M.Sleeping(10*volume, 0)
+ if(overdosed)
+ M.Sleeping(sleepytime, 0)
ODing = FALSE
..()
-/datum/reagent/fermi/astral/overdose_process(mob/living/carbon/M)
- ODing = TRUE
- if (!G == null)
- if(prob(70))
- to_chat(M, "The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!")
- do_teleport(G, M.loc)
- ..()
-
//Okay so, this might seem a bit too good, but my counterargument is that it'll likely take all round to eventually kill you this way, then you have to be revived without a body. It takes approximately 60-80 minutes to die from this.
/datum/reagent/fermi/astral/addiction_act_stage1(mob/living/carbon/M)
if(prob(65))
- M.alpha = M.alpha - 1
- switch(M.alpha)
+ M.alpha--
+ antiGenetics--
+ switch(antiGenetics)
if(245)
to_chat(M, "You notice your body starting to disappear, maybe you took too much Astrogen...?")
- M.alpha = M.alpha - 1
+ M.alpha--
+ antiGenetics--
if(220)
to_chat(M, "Your addiction is only getting worse as your body disappears. Maybe you should get some more, and fast?")
- M.alpha = M.alpha - 1
+ M.alpha--
+ antiGenetics--
if(180)
to_chat(M, "You're starting to get scared as more and more of your body and consciousness begins to fade.")
- M.alpha = M.alpha - 1
+ M.alpha--
+ antiGenetics--
if(120)
to_chat(M, "As you lose more and more of yourself, you start to think that maybe shedding your mortality isn't too bad.")
- M.alpha = M.alpha - 1
+ M.alpha--
+ antiGenetics--
if(100)
to_chat(M, "You feel a substantial part of your soul flake off into the ethereal world, rendering yourself unclonable.")
- M.alpha = M.alpha - 1
+ M.alpha--
+ antiGenetics--
M.add_trait(TRAIT_NOCLONE) //So you can't scan yourself, then die, to metacomm. You can only use your memories if you come back as something else.
if(80)
to_chat(M, "You feel a thrill shoot through your body as what's left of your mind contemplates the forthcoming oblivion.")
- M.alpha = M.alpha - 1
+ M.alpha--
+ antiGenetics--
if(45)
to_chat(M, "The last vestiges of your mind eagerly await your imminent annihilation.")
- M.alpha = M.alpha - 1
+ M.alpha--
+ antiGenetics--
if(0 to 30)
to_chat(M, "Your body disperses from existence, as you become one with the universe.")
to_chat(M, "As your body disappears, your consciousness doesn't. Should you find a way back into the mortal coil, your memories of your previous life and afterlife remain with you. (At the cost of staying in character while dead. Failure to do this may get you banned from this chem. You are still obligated to follow your directives if you play a midround antag)")//Legalised IC OOK? I have a suspicion this won't make it past the review. At least it'll be presented as a neat idea! If this is unacceptable how about the player can retain living memories across lives if they die in this way only.
@@ -778,10 +834,148 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
qdel(M) //Approx 60minutes till death from initial addiction
..()
-
+/*
////////////////////////////////////////
// MKULTA //
////////////////////////////////////////
+The magnum opus of FermiChem -
+Long and complicated, I highly recomend you look at the two other files heavily involved in this
+modular_citadel/code/datums/status_effects/chems.dm - handles the subject's reactions
+code/modules/surgery/organs/vocal_cords.dm - handles the enchanter speaking
+What started as a chem for bhijin became way too ambitious, because I live in the sky with pie.
+
+HOW IT WORKS
+Fermis_Reagent.dm
+There's 3 main ways this chemical works; I'll start off with discussing how it's set up.
+Upon reacting with blood as a catalyst, the blood is used to define who the enthraller is - thus only the creator is/can choose who the master will be. As a side note, you can't adminbus this chem, even admins have to earn it.
+This uses the fermichem only proc; FermiCreate, which is basically the same as On_new, except it doesn't require "data" which is something to do with blood and breaks everything so I said bugger it and made my own proc. It basically sets up vars.
+When it's first made, the creator has to drink some of it, in order to give them the vocal chords needed.
+When it's given to someone, it gives them the status effect and kicks off that side of things. For every metabolism tick, it increases the enthrall tally.
+Finally, if you manage to pump 150u into some poor soul, you overload them, and mindbreak them. Making them your willing, but broken slave. Which can only be reversed by; fixing their brain with mannitol and neurine (100 / 50u respectively) (or less with both),
+
+vocal_cords.dm
+This handles when the enchanter speaks - basically uses code from voice of god, but only for people with the staus effect. Most of the words are self explainitory, and has a smaller range of commands. If you're not sure what one does, it likely affects the enthrall tally, or the resist tally.
+list of commands:
+
+-mixables-
+enthral_words
+reward_words
+punish_words
+0
+saymyname_words
+wakeup_words
+1
+silence_words
+antiresist_words
+resist_words
+forget_words
+attract_words
+orgasm_words
+2
+awoo_words
+nya_words
+sleep_words
+strip_words
+walk_words
+run_words
+knockdown_words
+3
+statecustom_words
+custom_words
+objective_words
+heal_words
+stun_words
+hallucinate_words
+hot_words
+cold_words
+getup_words
+pacify_words
+charge_words
+
+Mixables can be used intersperced with other commands, 0 is commands that work on sleeper against (i.e. players enthralled to state 3, then ordered to wake up and forget, they can be triggered back instantly)
+1 is for players who immediately are injected with the chem - no stuns, only a silence and something that draws them towrds them. This is the best time to try to fight it and you're likely to win by spamming resist, unless the enchantress has plans.
+2 is the seconds stage, which allows removal of clothes, slowdown and light stunning. You can also make them nya and awoo, because cute.
+3 is the finaly state, which allows application of a few status effects (see chem.dm) and allows custom triggers to be installed (kind of like nanites), again, see chem.dm
+In a nutshell, this is the way you enthrall people, by typing messages into chat and managing cooldowns on the stronger words. You have to type words and your message strength is increases with the number of characters - if you type short messages the cooldown will be too much and the other player will overcome the chem.
+I suppose people could spam gdjshogndjoadphgiuaodp but, the truth of this chem is that it mostly allows a casus beli for subs to give in, and everyones a sub on cit (mostly), so if you aujigbnadjgipagdsjk then they might resist harder cause you're a baddie and baddies don't deserve pets.
+Also, the use of this chem as a murder aid is antithetic to it's design, the subject gains bonus resistance if they're hurt or hungry (I'd like to expland this more, I like the idea that you have to look after all of them otherwise they aren't as effective, kind of like tamagachis!). If this becomes a problem, I'll deal with it, I'm not happy with people abusing this chem for an easy murder. (I might make it so you an't strike your pet when health is too low.)
+Additionaly, in lieu of previous statement - the pet is ordered to not kill themselves, even if ordered to.
+
+chem.dm
+oof
+There's a few basic things that have to be understood with this status effect
+1. There is a min loop which calculates the enthrall state of the subject, when the entrall tally is over a certain amount, it will push you up 1 phase.
+0 - Sleeper
+1 - initial
+2 - enthralled
+3 - Fully entranced
+4 - mindbroken
+4 can only be reached via OD, whereas you can increment up from 1 > 2 > 3. 0 is only obtainable on a state 3 pet, and it toggles between the two.
+
+1.5 Chem warfare
+Since this is a chem, it's expected that you will use all of the chemicals at your disposal. Using aphro and aphro+ will weaken the resistance of the subject, while ananphro, anaphro+, mannitol and neurine will strengthen it.
+Additionally, the more aroused you are, the weaker your resistance will be, as a result players immune to aphro and anaphro give a flat bonus to the enthraller.
+using furranium and hatmium on the enchanter weakens their power considerably, because they sound rediculous. "Youwe fweewing wery sweepy uwu" This completely justifies their existance.
+The impure toxin for this chem increases resistance too, so if they're a bad chemist it'll be unlikely they have a good ratio (and as a secret bonus, really good chemists cann purposely make the impure chem, to use either to combat the use of it against them, or as smoke grenades to deal with a large party)
+
+2. There is a resistance proc which occurs whenever the player presses resist. You have to press it a lot, this is intentional. If you're trying to fight the enchanter, then you can't click both. You usually will win if you just mash resist and the enchanter does nothing, so you've got to react.
+Each step futher it becomes harder to resist, in state 2 it's longer, but resisting is still worthwhile. If you're not in state 3, and you've not got MKultra inside of you, you generate resistance very fast. So in some cases the better option will be to stall out any attempts to entrance you.
+At the moment, resistance doesn't affect the commands - mostly because it's a way to tell if a state 3 is trying to resist. But this might change if it gets too hard to fight them off.
+Durign state 3, it's impossible to resist if the enthraller is in your presence (8 tiles), you generate no resistance if so. If they're out of your range, then you start to go into the addiction processed
+As your resistance is tied to your arousal, sometimes your best option is to wah
+
+3. The addition process starts when the enthraller is out of range, it roughtly follows the five stages of grief; denial, anger, bargaining, depression and acceptance.
+What it mostly does makes you sad, hurts your brain, and sometimes you lash out in anger.
+Denial - minor brain damaged
+bargaining - 50:50 chance of brain damage and brain healing
+anger - randomly lashing out and hitting people
+depression - massive mood loss, stuttering, jittering, hallucinations and brain damage
+depression, again - random stunning and crying, brain damage, and resistance
+acceptance - minor brain damage and resistance.
+You can also resist while out of range, but you can only break free of a stange 3 enthrallment by hitting the acceptance phase with a high enough resistance.
+Finally, being near your enthraller reverts the damages caused.
+It is expected that if you intend to break free you'll need to use psicodine and mannitol or you'll end up in a bad, but not dead, state. This gives more work for medical!! Finally the true rational of this complicated chem comes out.
+
+4. Status effects in status effects.
+There's a few commands that give status effects, such as antiresist, which will cause resistance presses to increase the enthrallment instead, theses are called from the vocal chords.
+They're mostly self explainitory; antiresist, charge, pacify and heal. Heals quite weak for obvious reasons. I'd like to add more, maybe some weak adneals with brute/exhaustion costs after the status is over. A truth serum might be neat too.
+State 4 pets don't get status effects.
+
+5. Custom triggers
+Because it wasnt complicated enough already.
+Custom triggers are set by stating a trigger word, which will call a sub proc, which is also defined when the trigger is Called
+The effects avalible at the moment are:
+Speak - forces pet to say a preallocated phrase in response to the trigger
+Echo - sends a message to that player only (i.e. makes them think something)
+Shock - gives them a seizure/zaps them
+You can look this one up yourself - it's what you expect, it's cit
+kneel - gives a short knockdown
+strip - strips jumpsuit only
+objective - gives the pet a new objective. This requires a high ammount of mental capasity - which is determined by how much you resist. If you resist enough during phase 1 and 2, then they can't give you an objective.
+Feel free to add more.
+triggers work when said by ANYONE, not just the enchanter.
+This is only state 3 pets, state 4 pets cannot get custom triggers, you broke them you bully.
+
+6. One other thing that I can't get to work - replacing the mention of your enthraller with Master/Mistress. Maybe it's too much trouble.
+
+7. If you're an antage you get a bonus to resistance AND to enthralling. Thus it can be worth using this on both sides. It shouldn't be hard to resist as an antag. There are futher bonuses to command, Chaplains and chemist.
+If you give your pet a collar then their resistance reduced too.
+(I think thats everything?)
+
+How buggy is it?
+Probably very, it's hard to test this by myself.
+
+BALANCE ISSUES:
+There are none, but I'm glad you asked.
+
+Okay, seriously, unless you're an antag, it will be difficult to enthrall people, you'll need to put a lot of work into it, and really it's supposed to be a mix of rp and combat(?) use. If you get a small army of pets then it can be useful, but equally, they can revered with a ananphro + mannitol grenade.
+If it becomes an issue, I'll make all pets pacifists and apply more weakness effects based on mood and state. I'll probably do this anyways as I want the bond between the two to be imperative.
+As stated earlier the biggest concern is the use as a murder aid, which I have ideas for. (weaken the enthraller during the enthrallment process?)
+
+And as stated earlier, this chem is hard to make, and is punishing on failure. You fall in love with the chem dispencer and have to stay within 8 tiles of it. Additionally, you hug the dispencer instead of using it - thus making you unable to continue chemistry for that round, and likely getting the CMO mad as hecc at you.
+(thats not written yet but thats the idea.)
+*/
+
/datum/reagent/fermi/enthrall
name = "MKUltra"
id = "enthral"
@@ -797,7 +991,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
var/creatorName
var/mob/living/creator
-/datum/reagent/fermi/enthrall/on_new()
+/datum/reagent/fermi/enthrall/fermiCreate()
message_admins("On new for enthral proc'd")
var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list
//var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in holder.reagent_list
@@ -866,6 +1060,12 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
////////////////////////////////////////////////////////////////////////////////////////////////////
// HATIMUIM
///////////////////////////////////////////////////////////////////////////////////////////////////
+//Fun chem, simply adds a heat upon your head, and tips their hat
+//Also has a speech alteration effect when the hat is there
+//Should, but doesn't currently, increase armour; 1 armour per 10u
+//but if you OD it becomes negative.
+//please help fix that
+
/datum/reagent/fermi/hatmium //for hatterhat
name = "Hat growth serium"
@@ -891,16 +1091,20 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
//hat.armor = list("melee" = (1+(current_cycle/20)), "bullet" = (1+(current_cycle/20)), "laser" = (1+(current_cycle/20)), "energy" = (1+(current_cycle/20)), "bomb" = (1+(current_cycle/20)), "bio" = (1+(current_cycle/20)), "rad" = (1+(current_cycle/20)), "fire" = (1+(current_cycle/20)), "acid" = (1+(current_cycle/20)))
if(!overdosed)
for (var/i in hat.armor)
- hat.armor[i] = (1+(current_cycle*20)) //Doesn't work aaarghhhhh!!!!
+ hat.armor[i] = -(1+(current_cycle/10)) //Doesn't work aaarghhhhh!!!!
else
for (var/i in hat.armor)
- hat.armor[i] = (1/(current_cycle*10))
+ hat.armor[i] = (1+(current_cycle/10))
..()
////////////////////////////////////////////////////////////////////////////////////////////////////
// FURRANIUM
///////////////////////////////////////////////////////////////////////////////////////////////////
+//OwO whats this?
//Works as intended!!
+//Makes you nya and awoo
+//At a certain amount of time in your system it gives you a fluffy tongue owo!
+
/datum/reagent/fermi/furranium
name = "Furranium"
id = "furranium"
@@ -946,71 +1150,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
///////////////////////////////////////////////////////////////////////////////////////////////
-/datum/reagent/fermi/secretcatchem //Should I hide this from code divers? A secret cit chem?
- //name = "Catgirl" //an attempt at hiding it
- id = "secretcatchem"
- description = "An illegal and hidden chem that turns people into catgirls. It's said you see the light if you take too much of it."
- color = "#A0B0E4" // rgb: , 0, 255
- taste_description = "hairballs and cream"
- overdose_threshold = 10
-
-/datum/reagent/fermi/secretcatchem/New()
- name = "Catgirli[pick("a","u","e","y")]m [pick("apex", "prime", "meow")]"
-
-/datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H)
- . = ..()
- var/current_species = H.dna.species.type
- var/datum/species/mutation = /datum/species/human/felinid
- if(mutation && mutation != current_species)
- to_chat(H, "You crumple in agony as your flesh wildly morphs into new forms!")
- H.visible_message("[H] falls to the ground and screams as [H.p_their()] skin bubbles and froths!")
- H.Knockdown(60)
- H.set_species(mutation)
- else
- to_chat(H, "The pain vanishes suddenly. You feel no different.")
-
-/datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/M)
- if(prob(10))
- playsound(get_turf(M), 'modular_citadel/sound/voice/nya.ogg', 50, 1, -1)
- M.emote("me","lets out a nya!")
- if(prob(10))
- playsound(get_turf(M), 'sound/effects/meow1.ogg', 50, 1, -1)
- M.emote("me","lets out a mewl!")
- if(prob(10))
- playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1)
- M.emote("me","lets out a meowrowr!")
- ..()
-
-/datum/reagent/fermi/secretcatchem/overdose_start(mob/living/carbon/human/H) //I couldn't resist - should I hide this somewhere else?
- . = ..()
- to_chat(H, "You suddenly see the light and realise that everyone will be better off, and much happier, if they were only a cat girl.")
- var/objective = "Aid in the production of more chemicals and turn everyone on the station into catgirls. Avoid any and all attempts at renoucing your newfound catgirl form for this is your true form now."
- if (H.mind.assigned_role in GLOB.antagonists)
- objective += "Complete your objectives in tandem with this new objective. If you are tasked with murdering someone turning someone into a catgirl is now an alternative to you."
- brainwash(H, objective)
-
-/*
-/proc/secretcatchem(mob/living/carbon/C) //Explosion turns you into a cat. Meow.
- C.unequip_everything()
- //var/cat = new /mob/living/simple_animal/pet/cat(C.loc)
- var/mob/living/simple_animal/pet/cat = new(get_turf(C.loc))
- C.mind.transfer_to(cat)
- cat.name = C.name
- qdel(C)
- //Add to chat lines
- //Maybe teleport player away instead?
-*/
-
-
-/*
-/mob/living/simple_animal/hostile/retaliate/ghost
-incorporeal_move = 1
-name
-alpha = 20
-reduce viewrange?
-*/
-
-/* Needs to be fixed:
+/* Needs to be fixed, I cannot get it to work and it's giving me compile errors aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
//Nanite removal
//Writen by Trilby!!
/datum/reagent/fermi/naninte_b_gone
@@ -1025,13 +1165,13 @@ reduce viewrange?
var/component/nanites/nane = C.GetComponent(/component/nanites)
if(isnull(nane))
return
- nane.regen_rate = -5.0
+ nane.regen_rate = -5.0//This seems really high
/datum/reagent/fermi/naninte_b_gone/overdose_start(mob/living/carbon/C)
var/component/nanites/nane = C.GetComponent(/component/nanites)
if(isnull(nane))
return
- nane.regen_rate = -7.5
+ nane.regen_rate = -7.5//12.5 seems crazy high?
*/
/*
diff --git a/modular_citadel/code/modules/reagents/objects/items.dm b/modular_citadel/code/modules/reagents/objects/items.dm
index 3dd4c41029..2ea13b92c1 100644
--- a/modular_citadel/code/modules/reagents/objects/items.dm
+++ b/modular_citadel/code/modules/reagents/objects/items.dm
@@ -1,67 +1,40 @@
/obj/item/pHbooklet
name = "pH indicator booklet"
- desc = "A piece of paper that will change colour depending on the pH of what it's added to."
+ desc = "A booklet containing paper soaked in universal indicator."
icon_state = "pHbooklet"
icon = 'modular_citadel/icons/obj/FermiChem.dmi'
item_flags = NOBLUDGEON
- var/numberOfPages = 100
+ var/numberOfPages = 50
+ //set flammable somehow
/obj/item/pHbooklet/attack_hand(mob/user)
- if(numberOfPages >= 1)
- var/obj/item/pHpaper/P = new /obj/item/pHpaper
- //P.add_fingerprint(user)
- P.forceMove(user.loc)
- user.put_in_hands(P)
- to_chat(user, "You take [P] out of \the [src].")
- numberOfPages--
- else
- to_chat(user, "[src] is empty!")
- add_fingerprint(user)
- return ..()
+ ..()
+ if(user.get_held_index_of_item(src))
+ if(numberOfPages >= 1)
+ var/obj/item/pHpaper/P = new /obj/item/pHpaper
+ P.add_fingerprint(user)
+ P.forceMove(user.loc)
+ user.put_in_active_hand(P)
+ to_chat(user, "You take [P] out of \the [src].")
+ numberOfPages--
+ playsound(user.loc, 'sound/items/poster_ripped.ogg', 50, 1)
+ add_fingerprint(user)
+ return
+ else
+ to_chat(user, "[src] is empty!")
+ add_fingerprint(user)
+ return
+ var/I = user.get_active_held_item()
+ if(!I)
+ user.put_in_active_hand(src)
+ return
/obj/item/pHpaper
name = "pH indicator strip"
desc = "A piece of paper that will change colour depending on the pH of a solution."
icon_state = "pHpaper"
icon = 'modular_citadel/icons/obj/FermiChem.dmi'
- item_flags = NOBLUDGEON
+ //item_flags = NOBLUDGEON
color = "#f5c352"
var/used = FALSE
-
-/obj/item/pHpaper/attack_hand(mob/user, obj/I)
- if(!I.reagents.pH)
- return
- if(used == TRUE)
- to_chat(user, "[src] has already been used!")
- return
- switch(I.reagents.pH)
- if(14 to INFINITY)
- src.color = "#462c83"
- if(13 to 14)
- src.color = "#63459b"
- if(12 to 13)
- src.color = "#5a51a2"
- if(11 to 12)
- src.color = "#3853a4"
- if(10 to 11)
- src.color = "#3f93cf"
- if(9 to 10)
- src.color = "#0bb9b7"
- if(8 to 9)
- src.color = "#23b36e"
- if(7 to 8)
- src.color = "#3aa651"
- if(6 to 7)
- src.color = "#4cb849"
- if(5 to 6)
- src.color = "#b5d335"
- if(4 to 5)
- src.color = "#b5d333"
- if(3 to 4)
- src.color = "#f7ec1e"
- if(2 to 3)
- src.color = "#fbc314"
- if(1 to 2)
- src.color = "#f26724"
- if(0 to 1)
- src.color = "#ef1d26"
+ //set flammable somehow