diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index bf3c4220..fa99489c 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -237,7 +237,7 @@
src.handle_reactions()
return amount
-/datum/reagents/proc/trans_id_to(obj/target, reagent, amount=1, preserve_data=1)//Not sure why this proc didn't exist before. It does now! /N
+/datum/reagents/proc/trans_id_to(obj/target, reagent, amount = 1, preserve_data = TRUE)//Not sure why this proc didn't exist before. It does now! /N
var/list/cached_reagents = reagent_list
if (!target)
return
@@ -257,7 +257,6 @@
if(preserve_data)
trans_data = current_reagent.data
R.add_reagent(current_reagent.type, amount, trans_data, chem_temp, current_reagent.purity, pH, no_react = TRUE)
-
remove_reagent(current_reagent.type, amount, 1)
break
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index e6b19417..90e540f0 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -148,8 +148,8 @@
/obj/machinery/chem_master/on_deconstruction()
var/atom/A = drop_location()
- beaker.forceMove(A)
- bottle.forceMove(A)
+ beaker?.forceMove(A)
+ bottle?.forceMove(A)
return ..()
/obj/machinery/chem_master/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
@@ -216,15 +216,18 @@
if(beaker)
var/reagent = GLOB.name2reagent[params["id"]]
var/amount = text2num(params["amount"])
+ message_admins("[amount] + [reagent]")
if (amount > 0)
end_fermi_reaction()
beaker.reagents.trans_id_to(src, reagent, amount)
+ message_admins("Passed Transfer Phase")
. = TRUE
else if (amount == -1) // -1 means custom amount
useramount = input("Enter the Amount you want to transfer:", name, useramount) as num|null
if (useramount > 0)
end_fermi_reaction()
beaker.reagents.trans_id_to(src, reagent, useramount)
+ message_admins("Passed Transfer Phase")
. = TRUE
if("transferFromBuffer")
@@ -434,11 +437,11 @@
state = "Gas"
var/const/P = 3 //The number of seconds between life ticks
var/T = initial(R.metabolization_rate) * (60 / P)
- var/datum/chemical_reaction/Rcr = get_chemical_reaction(R.type)
+ var/datum/chemical_reaction/Rcr = get_chemical_reaction(R)
if(Rcr && Rcr.FermiChem)
fermianalyze = TRUE
var/pHpeakCache = (Rcr.OptimalpHMin + Rcr.OptimalpHMax)/2
- var/datum/reagent/targetReagent = beaker.reagents.has_reagent(R.type)
+ var/datum/reagent/targetReagent = beaker.reagents.has_reagent(R)
if(!targetReagent)
CRASH("Tried to find a reagent that doesn't exist in the chem_master!")
@@ -463,9 +466,9 @@
var/T = initial(R.metabolization_rate) * (60 / P)
if(istype(R, /datum/reagent/fermi))
fermianalyze = TRUE
- var/datum/chemical_reaction/Rcr = get_chemical_reaction(R.type)
+ var/datum/chemical_reaction/Rcr = get_chemical_reaction(R)
var/pHpeakCache = (Rcr.OptimalpHMin + Rcr.OptimalpHMax)/2
- var/datum/reagent/targetReagent = reagents.has_reagent(R.type)
+ var/datum/reagent/targetReagent = reagents.has_reagent(R)
if(!targetReagent)
CRASH("Tried to find a reagent that doesn't exist in the chem_master!")
@@ -483,7 +486,9 @@
/obj/machinery/chem_master/proc/end_fermi_reaction()//Ends any reactions upon moving.
- if(beaker.reagents.fermiIsReacting)
+ message_admins("fermi reaction end called")
+ if(beaker && beaker.reagents.fermiIsReacting)
+ message_admins("fermi is reacting, calling end")
beaker.reagents.fermiEnd()
/obj/machinery/chem_master/proc/isgoodnumber(num)
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 5eb2c135..4aabd82d 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -1,5 +1,4 @@
#define REM REAGENTS_EFFECT_MULTIPLIER
-
GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
/proc/build_name2reagent()
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index 2571dfaf..37b42570 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -86,7 +86,7 @@
CurveSharppH = 2.5 // How sharp the pH exponential curve is (to the power of value)
ThermicConstant = 0.01 // Temperature change per 1u produced
HIonRelease = 0.015 // pH change per 1u reaction (inverse for some reason)
- RateUpLim = 0.05 // Optimal/max rate possible if all conditions are perfect
+ RateUpLim = 0.1 // Optimal/max rate possible if all conditions are perfect
FermiChem = TRUE // If the chemical uses the Fermichem reaction mechanics
PurityMin = 0
@@ -101,7 +101,8 @@
if(St.purity < 1)
St.volume *= St.purity
St.purity = 1
- N.volume -= 0.002
+ var/amount = CLAMP(0.002, 0, N.volume)
+ N.volume -= amount
St.data["grown_volume"] = St.data["grown_volume"] + added_volume
St.name = "[initial(St.name)] [round(St.data["grown_volume"], 0.1)]u colony"
diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
index be765cfc..7d5f71aa 100644
--- a/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
+++ b/modular_citadel/code/modules/reagents/chemistry/reagents/healing.dm
@@ -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, "You feel your [target] heal! It stings like hell!")
+ 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, "You feel your flesh merge with the synthetic tissue! It stings like hell!")
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, "You feel something reform inside of you!")
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()
..()
+/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()