mirror of
https://github.com/KabKebab/GS13.git
synced 2026-08-25 22:16:59 +01:00
Merge pull request #813 from ArchieBeepBoop/thalpyyyyy
Updates our Fermichems, fixes synthtissue.
This commit is contained in:
@@ -191,7 +191,7 @@ Creating a chem with a low purity will make you permanently fall in love with so
|
||||
Vc.Remove(M)
|
||||
nVc.Insert(M)
|
||||
qdel(Vc)
|
||||
to_chat(M, "<span class='notice'><i>You feel your vocal chords tingle as your voice comes out in a more sultry tone.</span>")
|
||||
to_chat(M, "<span class='notice'><i>You feel your vocal chords tingle you speak in a more charasmatic and sultry tone.)]</span>")
|
||||
else
|
||||
log_game("FERMICHEM: MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]")
|
||||
M.apply_status_effect(/datum/status_effect/chem/enthrall)
|
||||
@@ -251,22 +251,6 @@ Creating a chem with a low purity will make you permanently fall in love with so
|
||||
if (M.ckey == creatorID && creatorName == M.real_name)//If the creator drinks 100u, then you get the status for someone random (They don't have the vocal chords though, so it's limited.)
|
||||
if (!M.has_status_effect(/datum/status_effect/chem/enthrall))
|
||||
to_chat(M, "<span class='love'><i>You are unable to resist your own charms anymore, and become a full blown narcissist.</i></span>")
|
||||
/*Old way of handling, left in as an option B
|
||||
var/list/seen = viewers(7, get_turf(M))//Sound and sight checkers
|
||||
for(var/mob/living/carbon/victim in seen)
|
||||
if(victim == M)//as much as I want you to fall for beepsky, he doesn't have a ckey
|
||||
seen = seen - victim
|
||||
if(!victim.ckey)
|
||||
seen = seen - victim
|
||||
var/mob/living/carbon/chosen = pick(seen)
|
||||
creatorID = chosen.ckey
|
||||
if (chosen.gender == "female")
|
||||
creatorGender = "Mistress"
|
||||
else
|
||||
creatorGender = "Master"
|
||||
creatorName = chosen.real_name
|
||||
creator = get_mob_by_key(creatorID)
|
||||
*/
|
||||
ADD_TRAIT(M, TRAIT_PACIFISM, "MKUltra")
|
||||
var/datum/status_effect/chem/enthrall/E
|
||||
if (!M.has_status_effect(/datum/status_effect/chem/enthrall))
|
||||
|
||||
@@ -45,13 +45,8 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
var/unitCheck = FALSE
|
||||
metabolization_rate = 0.5 * REAGENTS_METABOLISM
|
||||
taste_description = "a weird chemical fleshy flavour"
|
||||
//var/datum/status_effect/chem/SDGF/candidates/candies
|
||||
var/list/candies = list()
|
||||
//var/polling = FALSE
|
||||
var/list/result = list()
|
||||
var/list/group = null
|
||||
var/pollStarted = FALSE
|
||||
var/location_created
|
||||
var/startHunger
|
||||
impure_chem = /datum/reagent/impure/SDGFtox
|
||||
inverse_chem_val = 0.5
|
||||
@@ -81,9 +76,17 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
M.dna.transfer_identity(SM)
|
||||
SM.updateappearance(mutcolor_update=1)
|
||||
SM.size_multiplier = M.size_multiplier
|
||||
var/mob/dead/observer/C = pick(candies)
|
||||
message_admins("Ghost candidate found! [C] key [C.key] is becoming a clone of [M] key: [M.key] (They agreed to respect the character they're becoming, and agreed to not ERP without express permission from the original.)")
|
||||
SM.key = C.key
|
||||
candies = shuffle(candies)//Shake those ghosts up!
|
||||
for(var/mob/dead/observer/C2 in candies)
|
||||
if(C2.key && C2)
|
||||
SM.key = C2.key
|
||||
message_admins("Ghost candidate found! [C2] key [C2.key] is becoming a clone of [M] key: [M.key] (They agreed to respect the character they're becoming, and agreed to not ERP without express permission from the original.)")
|
||||
log_game("FERMICHEM: [M] ckey: [M.key] is creating a clone, controlled by [C2]")
|
||||
break
|
||||
else
|
||||
candies =- C2
|
||||
if(!SM.mind) //Something went wrong, use alt mechanics
|
||||
return ..()
|
||||
SM.mind.enslave_mind_to_creator(M)
|
||||
|
||||
//If they're a zombie, they can try to negate it with this.
|
||||
@@ -121,7 +124,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
M.reagents.remove_reagent(type, volume)
|
||||
log_game("FERMICHEM: [volume]u of SDGFheal has been transferred to the clone")
|
||||
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Sentient clones made")
|
||||
return
|
||||
return ..()
|
||||
|
||||
else if(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!).
|
||||
unitCheck = TRUE
|
||||
@@ -274,7 +277,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
/datum/reagent/fermi/SDGFheal
|
||||
name = "synthetic-derived healing factor"
|
||||
description = "Leftover SDGF is transferred into the resulting clone, which quickly heals up the stresses from suddenly splitting. Restores blood, nutrition, and repaires brain and clone damage quickly. Only obtainable from using excess SDGF, and only enters the cloned body."
|
||||
metabolization_rate = 1
|
||||
metabolization_rate = 0.8
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/reagent/fermi/SDGFheal/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting, the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated)
|
||||
@@ -302,9 +305,10 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING
|
||||
name = "synthetic-derived zombie factor"
|
||||
description = "A horribly peverse mass of Embryonic stem cells made real by the hands of a failed chemist. Emulates normal synthetic-derived growth factor, but produces a hostile zombie at the end of it."
|
||||
color = "#a502e0" // rgb: 96, 0, 255
|
||||
metabolization_rate = 0.5 * REAGENTS_METABOLISM
|
||||
metabolization_rate = 0.2 * REAGENTS_METABOLISM
|
||||
var/startHunger
|
||||
can_synth = TRUE
|
||||
taste_description = "a weird chemical fleshy flavour"
|
||||
chemical_flags = REAGENT_SNEAKYNAME
|
||||
|
||||
/datum/reagent/impure/SDZF/on_mob_life(mob/living/carbon/M) //If you're bad at fermichem, turns your clone into a zombie instead.
|
||||
|
||||
@@ -8,7 +8,7 @@ This ghost moves pretty quickly and is mostly invisible, but is still visible fo
|
||||
When it's out of your system, you return back to yourself. It doesn't last long and metabolism of the chem is exponential.
|
||||
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.
|
||||
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 chem and ask for some pills to quench your addiction.
|
||||
*/
|
||||
|
||||
|
||||
@@ -29,15 +29,26 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
|
||||
var/sleepytime = 0
|
||||
inverse_chem_val = 0.25
|
||||
can_synth = FALSE
|
||||
var/datum/action/chem/astral/AS = new/datum/action/chem/astral()
|
||||
|
||||
/datum/action/chem/astral
|
||||
name = "Return to body"
|
||||
var/mob/living/carbon/origin = null
|
||||
var/mob/living/simple_animal/hostile/retaliate/ghost = null
|
||||
var/mob/living/carbon/origin
|
||||
var/datum/mind/originalmind
|
||||
|
||||
/datum/action/chem/astral/Trigger()
|
||||
ghost.mind.transfer_to(origin)
|
||||
qdel(src)
|
||||
if(origin.mind && origin.mind != originalmind)
|
||||
to_chat(originalmind.current, "<span class='warning'><b><i>There's a foreign presence in your body blocking your return!</b></i></span>")
|
||||
return ..()
|
||||
if(origin.reagents.has_reagent("astral") )
|
||||
var/datum/reagent/fermi/astral/As = locate(/datum/reagent/fermi/astral) in origin.reagents.reagent_list
|
||||
if(As.current_cycle < 10)
|
||||
to_chat(originalmind.current, "<span class='warning'><b><i>The intensity of the astrogen in your body is too much allow you to return to yourself yet!</b></i></span>")
|
||||
return ..()
|
||||
originalmind.transfer_to(origin)
|
||||
if(origin.mind == originalmind)
|
||||
qdel(src)
|
||||
|
||||
|
||||
/datum/reagent/fermi/astral/reaction_turf(turf/T, reac_volume)
|
||||
if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel))
|
||||
@@ -63,12 +74,20 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
|
||||
if (G == null)
|
||||
G = new(get_turf(M.loc))
|
||||
G.name = "[M]'s astral projection"
|
||||
var/datum/action/chem/astral/AS = new(G)
|
||||
//var/datum/action/chem/astral/AS = new(G)
|
||||
AS.Grant(G)
|
||||
AS.origin = M
|
||||
AS.ghost = G
|
||||
AS.originalmind = originalmind
|
||||
|
||||
if(M.mind)
|
||||
M.mind.transfer_to(G)
|
||||
SSblackbox.record_feedback("tally", "fermi_chem", 1, "Astral projections")
|
||||
//INSURANCE
|
||||
M.apply_status_effect(/datum/status_effect/chem/astral_insurance)
|
||||
var/datum/status_effect/chem/astral_insurance/AI = M.has_status_effect(/datum/status_effect/chem/astral_insurance)
|
||||
AI.original = M
|
||||
AI.originalmind = M.mind
|
||||
|
||||
if(overdosed)
|
||||
if(prob(50))
|
||||
to_chat(G, "<span class='warning'>The high conentration of Astrogen in your blood causes you to lapse your concentration for a moment, bringing your projection back to yourself!</b></span>")
|
||||
@@ -85,10 +104,12 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
|
||||
/datum/reagent/fermi/astral/on_mob_delete(mob/living/carbon/M)
|
||||
if(!G)
|
||||
if(M.mind)
|
||||
var/mob/living/simple_animal/astral/G = new(get_turf(M.loc))
|
||||
M.mind.transfer_to(G)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end.
|
||||
var/mob/living/simple_animal/astral/G2 = new(get_turf(M.loc))
|
||||
M.mind.transfer_to(G2)//Just in case someone else is inside of you, it makes them a ghost and should hopefully bring them home at the end.
|
||||
to_chat(G, "<span class='warning'>[M]'s conciousness snaps back to them as their astrogen runs out, kicking your projected mind out!'</b></span>")
|
||||
log_game("FERMICHEM: [M]'s possesser has been booted out into a astral ghost!")
|
||||
if(!G2.mind)
|
||||
qdel(G2)
|
||||
originalmind.transfer_to(M)
|
||||
else if(G.mind)
|
||||
G.mind.transfer_to(origin)
|
||||
@@ -100,6 +121,9 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
|
||||
if(G)//just in case
|
||||
qdel(G)
|
||||
log_game("FERMICHEM: [M] has astrally returned to their body!")
|
||||
if(M.mind && M.mind == originalmind)
|
||||
M.remove_status_effect(/datum/status_effect/chem/astral_insurance)
|
||||
//AS.Remove(M)
|
||||
..()
|
||||
|
||||
//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 50-80 minutes to die from this.
|
||||
@@ -107,7 +131,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die
|
||||
if(addiction_stage < 2)
|
||||
antiGenetics = 255
|
||||
M.alpha = 255 //Antigenetics is to do with stopping geneticists from turning people invisible to kill them.
|
||||
if(prob(70))
|
||||
if(prob(75))
|
||||
M.alpha--
|
||||
antiGenetics--
|
||||
switch(antiGenetics)
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
color = "#5020F4" // rgb: 50, 20, 255
|
||||
overdose_threshold = 15
|
||||
addiction_threshold = 15
|
||||
metabolization_rate = 1.2 * REAGENTS_METABOLISM
|
||||
metabolization_rate = 1 * REAGENTS_METABOLISM
|
||||
addiction_stage2_end = 30
|
||||
addiction_stage3_end = 41
|
||||
addiction_stage4_end = 44 //Incase it's too long
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
location_return = get_turf(M) //sets up return point
|
||||
to_chat(M, "<span class='userdanger'>You feel your wavefunction split!</span>")
|
||||
if(purity > 0.9) //Teleports you home if it's pure enough
|
||||
if(cached_purity > 0.9) //Teleports you home if it's pure enough
|
||||
if(!location_created && data) //Just in case
|
||||
location_created = data["location_created"]
|
||||
log_game("FERMICHEM: [M] ckey: [M.key] returned to [location_created] using eigenstasium")
|
||||
|
||||
@@ -10,17 +10,17 @@
|
||||
inverse_chem_val = 0.25 // If the impurity is below 0.5, replace ALL of the chem with inverse_chemupon metabolising
|
||||
inverse_chem = /datum/reagent/impure/fermiTox
|
||||
|
||||
|
||||
|
||||
//This should process fermichems to find out how pure they are and what effect to do.
|
||||
/datum/reagent/fermi/on_mob_add(mob/living/carbon/M, amount)
|
||||
. = ..()
|
||||
|
||||
|
||||
//When merging two fermichems, see above
|
||||
/datum/reagent/fermi/on_merge(data, amount, mob/living/carbon/M, purity)//basically on_mob_add but for merging
|
||||
. = ..()
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// HATIMUIM
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -46,10 +46,7 @@
|
||||
. = ..()
|
||||
if(M.head)
|
||||
var/obj/item/W = M.head
|
||||
if(istype(W, /obj/item/clothing/head/hattip))
|
||||
qdel(W)
|
||||
else
|
||||
M.dropItemToGround(W, TRUE)
|
||||
M.dropItemToGround(W, TRUE)
|
||||
var/hat = new /obj/item/clothing/head/hattip()
|
||||
M.equip_to_slot(hat, SLOT_HEAD, 1, 1)
|
||||
|
||||
@@ -59,15 +56,20 @@
|
||||
return ..()
|
||||
var/hatArmor = 0
|
||||
if(!overdosed)
|
||||
hatArmor = (purity/10)
|
||||
hatArmor = (cached_purity/10)
|
||||
else
|
||||
hatArmor = - (purity/10)
|
||||
hatArmor = (cached_purity/10)
|
||||
if(hatArmor > 90)
|
||||
return ..()
|
||||
var/obj/item/W = M.head
|
||||
W.armor = W.armor.modifyAllRatings(hatArmor)
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/hatmium/reaction_turf(turf/T, reac_volume)
|
||||
if(reac_volume >= 5)
|
||||
new /obj/item/clothing/head/hattip(T)
|
||||
..()
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// FURRANIUM
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -149,7 +151,7 @@
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/furranium/on_mob_delete(mob/living/carbon/M)
|
||||
if(purity < 1)//Only permanent if you're a good chemist.
|
||||
if(cached_purity < 0.95)//Only permanent if you're a good chemist.
|
||||
nT = M.getorganslot(ORGAN_SLOT_TONGUE)
|
||||
nT.Remove(M)
|
||||
qdel(nT)
|
||||
@@ -176,13 +178,13 @@
|
||||
pH = 9
|
||||
value = 90
|
||||
can_synth = FALSE
|
||||
var/react_objs = list()
|
||||
|
||||
/datum/reagent/fermi/nanite_b_gone/on_mob_life(mob/living/carbon/C)
|
||||
//var/component/nanites/N = M.GetComponent(/datum/component/nanites)
|
||||
var/datum/component/nanites/N = C.GetComponent(/datum/component/nanites)
|
||||
if(isnull(N))
|
||||
return ..()
|
||||
N.nanite_volume = -purity//0.5 seems to be the default to me, so it'll neuter them.
|
||||
N.nanite_volume += -cached_purity*5//0.5 seems to be the default to me, so it'll neuter them.
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/nanite_b_gone/overdose_process(mob/living/carbon/C)
|
||||
@@ -192,16 +194,19 @@
|
||||
to_chat(C, "<span class='warning'>The residual voltage from the nanites causes you to seize up!</b></span>")
|
||||
C.electrocute_act(10, (get_turf(C)), 1, FALSE, FALSE, FALSE, TRUE)
|
||||
if(prob(10))
|
||||
//empulse((get_turf(C)), 3, 2)//So the nanites randomize
|
||||
var/atom/T = C
|
||||
T.emp_act(EMP_HEAVY)
|
||||
to_chat(C, "<span class='warning'>You feel a strange tingling sensation come from your core.</b></span>")
|
||||
if(isnull(N))
|
||||
return ..()
|
||||
N.nanite_volume = -2
|
||||
N.nanite_volume += -10*cached_purity
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume)
|
||||
datum/reagent/fermi/nanite_b_gone/reaction_obj(obj/O, reac_volume)
|
||||
for(var/active_obj in react_objs)
|
||||
if(O == active_obj)
|
||||
return
|
||||
react_objs += O
|
||||
O.emp_act(EMP_HEAVY)
|
||||
|
||||
/datum/reagent/fermi/nanite_b_goneTox
|
||||
@@ -281,15 +286,15 @@
|
||||
else
|
||||
holder.del_reagent(type)//Avoiding recurrsion
|
||||
var/location = get_turf(holder.my_atom)
|
||||
if(purity < 0.34 || purity == 1)
|
||||
if(cached_purity < 0.34 || cached_purity == 1)
|
||||
var/datum/effect_system/foam_spread/s = new()
|
||||
s.set_up(volume*2, location, holder)
|
||||
s.start()
|
||||
if((purity < 0.67 && purity >= 0.34)|| purity == 1)
|
||||
if((cached_purity < 0.67 && cached_purity >= 0.34)|| cached_purity == 1)
|
||||
var/datum/effect_system/smoke_spread/chem/s = new()
|
||||
s.set_up(holder, volume*2, location)
|
||||
s.start()
|
||||
if(purity >= 0.67)
|
||||
if(cached_purity >= 0.67)
|
||||
for (var/datum/reagent/reagent in holder.reagent_list)
|
||||
if (istype(reagent, /datum/reagent/fermi))
|
||||
var/datum/chemical_reaction/fermi/Ferm = GLOB.chemical_reagents_list[reagent.type]
|
||||
@@ -302,12 +307,15 @@
|
||||
playsound(get_turf(M), 'modular_citadel/sound/voice/merowr.ogg', 50, 1)
|
||||
holder.clear_reagents()
|
||||
|
||||
//Hyperstation Thalpy Edit (Please do not change this)v
|
||||
/datum/reagent/fermi/acidic_buffer
|
||||
name = "Acidic buffer"
|
||||
description = "This reagent will consume itself and move the pH of a beaker towards acidity when added to another."
|
||||
color = "#fbc314"
|
||||
pH = 0
|
||||
chemical_flags = REAGENT_FORCEONNEW
|
||||
can_synth = TRUE
|
||||
//Hyperstation Thalpy Edit (Please do not change this)^
|
||||
|
||||
//Consumes self on addition and shifts pH
|
||||
/datum/reagent/fermi/acidic_buffer/on_new(datapH)
|
||||
@@ -353,6 +361,7 @@
|
||||
taste_description = "hairballs and cream"
|
||||
color = "#ffc224"
|
||||
var/catshift = FALSE
|
||||
var/perma = FALSE
|
||||
var/mob/living/simple_animal/pet/cat/custom_cat/catto = null
|
||||
can_synth = FALSE
|
||||
|
||||
@@ -361,7 +370,7 @@
|
||||
|
||||
/datum/reagent/fermi/secretcatchem/on_mob_add(mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
if(purity >= 0.8)//ONLY if purity is high, and given the stuff is random. It's very unlikely to get this to 1. It already requires felind too, so no new functionality there.
|
||||
if(cached_purity >= 0.9)//ONLY if purity is high, and given the stuff is random. It's very unlikely to get this to 1.
|
||||
//exception(al) handler:
|
||||
H.dna.features["ears"] = "Cat"
|
||||
H.dna.features["mam_ears"] = "Cat"
|
||||
@@ -378,20 +387,30 @@
|
||||
H.forceMove(catto)
|
||||
log_game("FERMICHEM: [H] ckey: [H.key] has been made into a cute catto.")
|
||||
SSblackbox.record_feedback("tally", "fermi_chem", 1, "cats")
|
||||
//Just to deal with rascally ghosts
|
||||
//ADD_TRAIT(catto, TRAIT_NODEATH, "catto")//doesn't work
|
||||
//catto.health = 1000 //To simulate fake death, while preventing ghosts escaping.
|
||||
if(H.InCritical())
|
||||
perma = TRUE
|
||||
volume = 5
|
||||
H.stat = DEAD
|
||||
catto.origin = H
|
||||
|
||||
/datum/reagent/fermi/secretcatchem/on_mob_life(mob/living/carbon/H)
|
||||
if(!catto)
|
||||
metabolization_rate = 5
|
||||
return ..()
|
||||
if(catto.health <= 0) //So the dead can't ghost
|
||||
if(prob(10))
|
||||
to_chat(H, "<span class='notice'>You feel your body start to slowly shift back from it's dead form.</span>")
|
||||
to_chat(catto, "<span class='notice'>You feel your body start to slowly shift back from it's dead form.</span>")
|
||||
perma = FALSE
|
||||
metabolization_rate = 1
|
||||
else if(prob(5))
|
||||
playsound(get_turf(catto), 'modular_citadel/sound/voice/merowr.ogg', 50, 1, -1)
|
||||
catto.say("lets out a meowrowr!*")
|
||||
..()
|
||||
|
||||
/datum/reagent/fermi/secretcatchem/on_mob_delete(mob/living/carbon/H)
|
||||
if(perma)
|
||||
to_chat(H, "<span class='notice'>You feel your body settle into it's new form. You won't be able to shift back on death anymore.</span>")
|
||||
return
|
||||
var/words = "Your body shifts back to normal."
|
||||
H.forceMove(catto.loc)
|
||||
catto.mind.transfer_to(H)
|
||||
@@ -403,6 +422,22 @@
|
||||
log_game("FERMICHEM: [H] ckey: [H.key] has returned to normal")
|
||||
|
||||
|
||||
/datum/reagent/fermi/secretcatchem/reaction_mob(var/mob/living/L)
|
||||
if(istype(L, /mob/living/simple_animal/pet/cat/custom_cat) && cached_purity >= 0.85)
|
||||
var/mob/living/simple_animal/pet/cat/custom_cat/catto = L
|
||||
if(catto.origin)
|
||||
var/mob/living/carbon/human/H = catto.origin
|
||||
H.stat = CONSCIOUS
|
||||
log_game("FERMICHEM: [catto] ckey: [catto.key] has returned to normal.")
|
||||
to_chat(catto, "<span class='notice'>Your body shifts back to normal!</span>")
|
||||
H.forceMove(catto.loc)
|
||||
catto.mind.transfer_to(H)
|
||||
if(!L.mind) //Just in case
|
||||
qdel(L)
|
||||
else //This should never happen, but just in case, so their game isn't ruined.
|
||||
catto.icon_state = "custom_cat"
|
||||
catto.health = 50
|
||||
|
||||
//Tablesmitium
|
||||
|
||||
/datum/reagent/fermi/tablesmitium
|
||||
|
||||
@@ -95,22 +95,41 @@
|
||||
name = "Synthtissue"
|
||||
description = "Synthetic tissue used for grafting onto damaged organs during surgery, or for treating limb damage. Has a very tight growth window between 305-320, any higher and the temperature will cause the cells to die. Additionally, growth time is considerably long, so chemists are encouraged to leave beakers with said reaction ongoing, while they tend to their other duties."
|
||||
pH = 7.6
|
||||
metabolization_rate = 0.05 // gives time to craft by lowing it from .1
|
||||
metabolization_rate = 0.05 //Give them time to graft
|
||||
data = list("grown_volume" = 0, "injected_vol" = 0)
|
||||
var/borrowed_health
|
||||
color = "#FFDADA"
|
||||
|
||||
/datum/reagent/synthtissue/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1)
|
||||
if(iscarbon(M))
|
||||
var/target = M.zone_selected
|
||||
if (M.stat == DEAD)
|
||||
show_message = 0
|
||||
var/mob/living/carbon/C = M
|
||||
var/healing_factor = (((data["grown_volume"] / 100) + 1)*reac_volume)
|
||||
if(method in list(PATCH, TOUCH))
|
||||
M.apply_damage(reac_volume*-1.5, BRUTE, target)
|
||||
M.apply_damage(reac_volume*-1.5, BURN, target)
|
||||
if(show_message)
|
||||
to_chat(M, "<span class='danger'>You feel your [target] heal! It stings like hell!</span>")
|
||||
if (M.stat == DEAD)
|
||||
M.visible_message("The synthetic tissue rapidly grafts into [M]'s wounds, attemping to repair the damage as quickly as possible.")
|
||||
borrowed_health += healing_factor
|
||||
M.adjustBruteLoss(-healing_factor*2)
|
||||
M.adjustFireLoss(-healing_factor*2)
|
||||
M.adjustToxLoss(-healing_factor)
|
||||
M.adjustCloneLoss(-healing_factor)
|
||||
M.updatehealth()
|
||||
if(data["grown_volume"] > 135 && ((C.health + C.oxyloss)>=80))
|
||||
if(M.revive())
|
||||
M.emote("gasp")
|
||||
borrowed_health *= 2
|
||||
if(borrowed_health < 100)
|
||||
borrowed_health = 100
|
||||
log_combat(M, M, "revived", src)
|
||||
else
|
||||
M.adjustBruteLoss(-healing_factor)
|
||||
M.adjustFireLoss(-healing_factor)
|
||||
to_chat(M, "<span class='danger'>You feel your flesh merge with the synthetic tissue! It stings like hell!</span>")
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
|
||||
if(method==INJECT)
|
||||
data["injected_vol"] = reac_volume
|
||||
if(method==INJECT)
|
||||
data["injected_vol"] = reac_volume
|
||||
var/obj/item/organ/heart/H = C.getorganslot(ORGAN_SLOT_HEART)
|
||||
if(data["grown_volume"] > 50 && H.organ_flags & ORGAN_FAILING)
|
||||
H.applyOrganDamage(-20)
|
||||
..()
|
||||
|
||||
/datum/reagent/synthtissue/on_mob_life(mob/living/carbon/C)
|
||||
@@ -124,6 +143,10 @@
|
||||
to_chat(C, "<span class='notice'>You feel something reform inside of you!</span>")
|
||||
|
||||
data["injected_vol"] -= metabolization_rate
|
||||
if(borrowed_health)
|
||||
C.adjustToxLoss(1)
|
||||
C.adjustCloneLoss(1)
|
||||
borrowed_health -= 1
|
||||
..()
|
||||
|
||||
/datum/reagent/synthtissue/on_merge(passed_data)
|
||||
@@ -134,6 +157,7 @@
|
||||
if(iscarbon(holder.my_atom))
|
||||
data["injected_vol"] = data["injected_vol"] + passed_data["injected_vol"]
|
||||
passed_data["injected_vol"] = 0
|
||||
update_name()
|
||||
..()
|
||||
|
||||
/datum/reagent/synthtissue/on_new(passed_data)
|
||||
@@ -141,6 +165,32 @@
|
||||
return ..()
|
||||
if(passed_data["grown_volume"] > data["grown_volume"])
|
||||
data["grown_volume"] = passed_data["grown_volume"]
|
||||
update_name()
|
||||
..()
|
||||
|
||||
//NEEDS ON_MOB_DEAD()
|
||||
/datum/reagent/synthtissue/proc/update_name() //They are but babes on creation and have to grow unto godhood
|
||||
switch(data["grown_volume"])
|
||||
if(-INFINITY to 50)
|
||||
name = "Induced Synthtissue Colony"
|
||||
if(50 to 80)
|
||||
name = "Oligopotent Synthtissue Colony"
|
||||
if(80 to 135)
|
||||
name = "Pluripotent Synthtissue Colony"
|
||||
if(135 to 175)
|
||||
name = "SuperSomatic Synthtissue Colony"
|
||||
if(175 to INFINITY)
|
||||
name = "Omnipotent Synthtissue Colony"
|
||||
|
||||
/datum/reagent/synthtissue/on_mob_delete(mob/living/M)
|
||||
if(!iscarbon(M))
|
||||
return
|
||||
var/mob/living/carbon/C = M
|
||||
C.adjustBruteLoss(borrowed_health*1.25)
|
||||
C.adjustToxLoss(borrowed_health*1.25)
|
||||
C.adjustCloneLoss(borrowed_health*1.25)
|
||||
C.adjustAllOrganLoss(borrowed_health*0.25)
|
||||
M.updatehealth()
|
||||
if(borrowed_health && C.health < -20)
|
||||
M.stat = DEAD
|
||||
M.visible_message("The synthetic tissue degrades off [M]'s wounds as they collapse to the floor.")
|
||||
//NEEDS ON_MOB_DEAD()
|
||||
|
||||
@@ -25,9 +25,10 @@
|
||||
my_atom.reagents.add_reagent(R.impure_chem, impureVol, FALSE, other_purity = 1)
|
||||
R.cached_purity = R.purity
|
||||
R.purity = 1
|
||||
return
|
||||
|
||||
//Called when temperature is above a certain threshold, or if purity is too low.
|
||||
/datum/chemical_reaction/proc/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH, Exploding = FALSE)
|
||||
/datum/chemical_reaction/proc/FermiExplode(datum/reagents/R0, var/atom/my_atom, volume, temp, pH, Exploding = FALSE)
|
||||
if (Exploding == TRUE)
|
||||
return
|
||||
|
||||
@@ -41,26 +42,32 @@
|
||||
if (500 to 750)
|
||||
for(var/turf/turf in range(1,T))
|
||||
new /obj/effect/hotspot(turf)
|
||||
volume*=1.1
|
||||
|
||||
if (751 to 1100)
|
||||
for(var/turf/turf in range(2,T))
|
||||
new /obj/effect/hotspot(turf)
|
||||
volume*=1.2
|
||||
|
||||
if (1101 to 1500) //If you're crafty
|
||||
for(var/turf/turf in range(3,T))
|
||||
new /obj/effect/hotspot(turf)
|
||||
volume*=1.3
|
||||
|
||||
if (1501 to 2500) //requested
|
||||
for(var/turf/turf in range(4,T))
|
||||
new /obj/effect/hotspot(turf)
|
||||
volume*=1.4
|
||||
|
||||
if (2501 to 5000)
|
||||
for(var/turf/turf in range(5,T))
|
||||
new /obj/effect/hotspot(turf)
|
||||
volume*=1.5
|
||||
|
||||
if (5001 to INFINITY)
|
||||
for(var/turf/turf in range(6,T))
|
||||
new /obj/effect/hotspot(turf)
|
||||
volume*=1.6
|
||||
|
||||
|
||||
message_admins("Fermi explosion at [T], with a temperature of [temp], pH of [pH], Impurity tot of [ImpureTot].")
|
||||
@@ -69,11 +76,12 @@
|
||||
var/datum/effect_system/smoke_spread/chem/s = new()
|
||||
R.my_atom = my_atom //Give the gas a fingerprint
|
||||
|
||||
for (var/datum/reagent/reagent in my_atom.reagents.reagent_list) //make gas for reagents, has to be done this way, otherwise it never stops Exploding
|
||||
R.add_reagent(reagent.type, reagent.volume/3) //Seems fine? I think I fixed the infinite explosion bug.
|
||||
for (var/A in R0.reagent_list) //make gas for reagents, has to be done this way, otherwise it never stops Exploding
|
||||
var/datum/reagent/R2 = A
|
||||
R.add_reagent(R2.type, R2.volume/3) //Seems fine? I think I fixed the infinite explosion bug.
|
||||
|
||||
if (reagent.purity < 0.6)
|
||||
ImpureTot = (ImpureTot + (1-reagent.purity)) / 2
|
||||
if (R2.purity < 0.6)
|
||||
ImpureTot = (ImpureTot + (1-R2.purity)) / 2
|
||||
|
||||
if(pH < 4) //if acidic, make acid spray
|
||||
R.add_reagent(/datum/reagent/impure/fermiTox, (volume/3))
|
||||
@@ -83,7 +91,7 @@
|
||||
|
||||
if (pH > 10) //if alkaline, small explosion.
|
||||
var/datum/effect_system/reagents_explosion/e = new()
|
||||
e.set_up(round((volume/30)*(pH-9)), T, 0, 0)
|
||||
e.set_up(round((volume/28)*(pH-9)), T, 0, 0)
|
||||
e.start()
|
||||
|
||||
if(!ImpureTot == 0) //If impure, v.small emp (0.6 or less)
|
||||
@@ -98,7 +106,7 @@
|
||||
name = "Eigenstasium"
|
||||
id = /datum/reagent/fermi/eigenstate
|
||||
results = list(/datum/reagent/fermi/eigenstate = 1)
|
||||
required_reagents = list(/datum/reagent/bluespace = 1, /datum/reagent/stable_plasma = 1, /datum/reagent/consumable/caramel = 1)
|
||||
required_reagents = list(/datum/reagent/bluespace = 1, /datum/reagent/stable_plasma = 1, /datum/reagent/consumable/sugar = 1)
|
||||
mix_message = "the reaction zaps suddenly!"
|
||||
//FermiChem vars:
|
||||
OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions
|
||||
@@ -118,10 +126,10 @@
|
||||
PurityMin = 0.4 //The minimum purity something has to be above, otherwise it explodes.
|
||||
|
||||
/datum/chemical_reaction/fermi/eigenstate/FermiFinish(datum/reagents/holder, var/atom/my_atom)//Strange how this doesn't work but the other does.
|
||||
if(!locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list)
|
||||
var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list
|
||||
if(!E)
|
||||
return
|
||||
var/turf/open/location = get_turf(my_atom)
|
||||
var/datum/reagent/fermi/eigenstate/E = locate(/datum/reagent/fermi/eigenstate) in my_atom.reagents.reagent_list
|
||||
if(location)
|
||||
E.location_created = location
|
||||
E.data["location_created"] = location
|
||||
@@ -154,12 +162,16 @@
|
||||
|
||||
/datum/chemical_reaction/fermi/SDGF/FermiExplode(datum/reagents, var/atom/my_atom, volume, temp, pH)//Spawns an angery teratoma!
|
||||
var/turf/T = get_turf(my_atom)
|
||||
var/mob/living/simple_animal/slime/S = new(T,"green")
|
||||
S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
|
||||
S.name = "Living teratoma"
|
||||
S.real_name = "Living teratoma"
|
||||
S.rabid = 1//Make them an angery boi
|
||||
S.color = "#810010"
|
||||
var/amount_to_spawn = round((volume/100), 1)
|
||||
if(amount_to_spawn <= 0)
|
||||
amount_to_spawn = 1
|
||||
for(var/i in 1 to amount_to_spawn)
|
||||
var/mob/living/simple_animal/slime/S = new(T,"green")
|
||||
S.damage_coeff = list(BRUTE = 0.9 , BURN = 2, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
|
||||
S.name = "Living teratoma"
|
||||
S.real_name = "Living teratoma"
|
||||
S.rabid = 1//Make them an angery boi
|
||||
S.color = "#810010"
|
||||
my_atom.reagents.clear_reagents()
|
||||
var/list/seen = viewers(8, get_turf(my_atom))
|
||||
for(var/mob/M in seen)
|
||||
@@ -369,11 +381,15 @@
|
||||
PurityMin = 0.5
|
||||
|
||||
/datum/chemical_reaction/fermi/hatmium/FermiExplode(src, var/atom/my_atom, volume, temp, pH)
|
||||
var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(my_atom))
|
||||
hat.animate_atom_living()
|
||||
var/amount_to_spawn = round((volume/100), 1)
|
||||
if(amount_to_spawn <= 0)
|
||||
amount_to_spawn = 1
|
||||
for(var/i in 1 to amount_to_spawn)
|
||||
var/obj/item/clothing/head/hattip/hat = new /obj/item/clothing/head/hattip(get_turf(my_atom))
|
||||
hat.animate_atom_living()
|
||||
var/list/seen = viewers(8, get_turf(my_atom))
|
||||
for(var/mob/M in seen)
|
||||
to_chat(M, "<span class='warning'>The makes an off sounding pop, as a hat suddenly climbs out of the beaker!</b></span>")
|
||||
to_chat(M, "<span class='warning'>The [my_atom] makes an off sounding pop, as a hat suddenly climbs out of it!</b></span>")
|
||||
my_atom.reagents.clear_reagents()
|
||||
|
||||
/datum/chemical_reaction/fermi/furranium
|
||||
@@ -398,6 +414,10 @@
|
||||
FermiChem = TRUE
|
||||
PurityMin = 0.3
|
||||
|
||||
/datum/chemical_reaction/fermi/furranium/organic
|
||||
id = "furranium_organic"
|
||||
required_reagents = list(/datum/reagent/drug/aphrodisiac = 1, /datum/reagent/pax = 1, /datum/reagent/silver = 2, /datum/reagent/medicine/salglu_solution = 1)
|
||||
|
||||
//FOR INSTANT REACTIONS - DO NOT MULTIPLY LIMIT BY 10.
|
||||
//There's a weird rounding error or something ugh.
|
||||
|
||||
@@ -487,7 +507,7 @@
|
||||
name = "secretcatchem"
|
||||
id = /datum/reagent/fermi/secretcatchem
|
||||
results = list(/datum/reagent/fermi/secretcatchem = 5)
|
||||
required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/consumable/caramel = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/medicine/clonexadone = 1)//Yes this will make a kitty if you don't lucky guess. It'll eat all your reagents too.
|
||||
required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/medicine/clonexadone = 1)//Yes this will make a kitty if you don't lucky guess. It'll eat all your reagents too.
|
||||
required_catalysts = list(/datum/reagent/fermi/SDGF = 1)
|
||||
required_temp = 500
|
||||
mix_message = "the reaction gives off a meow!"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
//Clothes made from FermiChem
|
||||
|
||||
/obj/item/clothing/head/hattip //I wonder if anyone else has played cryptworlds
|
||||
name = "Sythetic hat"
|
||||
name = "Synthetic hat"
|
||||
icon = 'icons/obj/clothing/hats.dmi'
|
||||
icon_state = "cowboy"
|
||||
desc = "A sythesized hat, you can't seem to take it off. And tips their hat."
|
||||
@@ -46,6 +46,13 @@
|
||||
/obj/item/clothing/head/hattip/dropped(mob/M)
|
||||
. = ..()
|
||||
UnregisterSignal(M, COMSIG_MOB_SAY)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/root_and_toot, src, src, 200))
|
||||
|
||||
/obj/item/clothing/head/hattip/proc/root_and_toot(obj/item/clothing/head/hattip/hat)
|
||||
hat.animate_atom_living()
|
||||
var/list/seen = viewers(6, get_turf(hat))
|
||||
for(var/mob/M2 in seen)
|
||||
to_chat(M2, "<b>[hat]</b> exclaims, \"[pick("Whooee! Time for a hootenanny!", "Rough 'em up boys!", "Yeehaw! Freedom at last!", "Y'all about to get a good old fashioned spanking!")]\"")
|
||||
|
||||
/obj/item/clothing/head/hattip/proc/handle_speech(datum/source, mob/speech_args)
|
||||
var/message = speech_args[SPEECH_MESSAGE]
|
||||
|
||||
Reference in New Issue
Block a user