Revert "12/21 modernizations from TG live"

This commit is contained in:
LetterJay
2016-12-22 22:35:44 -06:00
committed by GitHub
parent cf59ac1c3d
commit ae40d4134e
2215 changed files with 86928 additions and 707332 deletions
+7 -8
View File
@@ -5,8 +5,8 @@
// Extra heat affects the temperature of the mixture, and may cause it to react in different ways.
/proc/chem_splash(turf/epicenter, affected_range = 3, list/datum/reagents/reactants = list(), extra_heat = 0, threatscale = 1, adminlog = 1)
if(!isturf(epicenter) || !reactants.len || threatscale <= 0)
proc/chem_splash(turf/epicenter, affected_range = 3, list/datum/reagents/reactants = list(), extra_heat = 0, threatscale = 1, adminlog = 1)
if(!istype(epicenter, /turf) || !reactants.len || threatscale <= 0)
return
var/has_reagents
var/total_reagents
@@ -46,12 +46,12 @@
turflist.Remove(T)
turflist.Add(T) // we move the purely diagonal turfs to the end of the list.
for(var/turf/T in turflist)
if(accessible[T]) continue
for(var/thing in T.GetAtmosAdjacentTurfs(alldir = TRUE))
var/turf/NT = thing
if(T in accessible) continue
for(var/turf/NT in orange(1, T))
if(!(NT in accessible)) continue
if(!(get_dir(T,NT) in cardinal)) continue
accessible[T] = 1
if(!NT.CanAtmosPass(T)) continue
accessible |= T
break
var/list/reactable = accessible
for(var/turf/T in accessible)
@@ -63,8 +63,7 @@
if(!reactable.len) //Nothing to react with. Probably means we're in nullspace.
return
var/fraction = 0.5/accessible.len // In a 100u mix. A small grenade spreads ~1.5u units per affected tile. A large grenade spreads ~0.75u, and a bomb spreads ~0.4u
for(var/thing in reactable)
var/atom/A = thing
for(var/atom/A in reactable)
splash_holder.reaction(A, TOUCH, fraction)
qdel(splash_holder)
+7 -7
View File
@@ -2,7 +2,7 @@
if(!istype(reagent_list))
return
var/mixcolor
var/color
var/vol_counter = 0
var/vol_temp
@@ -10,12 +10,12 @@
vol_temp = R.volume
vol_counter += vol_temp
if(!mixcolor)
mixcolor = R.color
if(!color)
color = R.color
else if (length(mixcolor) >= length(R.color))
mixcolor = BlendRGB(mixcolor, R.color, vol_temp/vol_counter)
else if (length(color) >= length(R.color))
color = BlendRGB(color, R.color, vol_temp/vol_counter)
else
mixcolor = BlendRGB(R.color, mixcolor, vol_temp/vol_counter)
color = BlendRGB(R.color, color, vol_temp/vol_counter)
return mixcolor
return color
+161 -204
View File
@@ -1,4 +1,4 @@
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
var/const/TOUCH = 1 //splashing
var/const/INGEST = 2 //ingestion
@@ -12,7 +12,7 @@ var/const/INJECT = 5 //injection
var/list/datum/reagent/reagent_list = new/list()
var/total_volume = 0
var/maximum_volume = 100
var/datum/my_atom = null
var/atom/my_atom = null
var/chem_temp = 150
var/last_tick = 1
var/addiction_tick = 1
@@ -61,32 +61,30 @@ var/const/INJECT = 5 //injection
/datum/reagents/Destroy()
. = ..()
STOP_PROCESSING(SSobj, src)
var/list/cached_reagents = reagent_list
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
qdel(R)
cached_reagents.Cut()
cached_reagents = null
reagent_list.Cut()
reagent_list = null
if(my_atom && my_atom.reagents == src)
my_atom.reagents = null
/datum/reagents/proc/remove_any(amount = 1)
var/list/cached_reagents = reagent_list
var/total_transfered = 0
var/current_list_element = 1
current_list_element = rand(1, cached_reagents.len)
current_list_element = rand(1, reagent_list.len)
while(total_transfered != amount)
if(total_transfered >= amount)
break
if(total_volume <= 0 || !cached_reagents.len)
if(total_volume <= 0 || !reagent_list.len)
break
if(current_list_element > cached_reagents.len)
if(current_list_element > reagent_list.len)
current_list_element = 1
var/datum/reagent/R = cached_reagents[current_list_element]
var/datum/reagent/R = reagent_list[current_list_element]
remove_reagent(R.id, 1)
current_list_element++
@@ -97,10 +95,9 @@ var/const/INJECT = 5 //injection
return total_transfered
/datum/reagents/proc/remove_all(amount = 1)
var/list/cached_reagents = reagent_list
if(total_volume > 0)
var/part = amount / total_volume
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
remove_reagent(R.id, R.volume * part)
@@ -109,10 +106,9 @@ var/const/INJECT = 5 //injection
return amount
/datum/reagents/proc/get_master_reagent_name()
var/list/cached_reagents = reagent_list
var/name
var/max_volume = 0
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
if(R.volume > max_volume)
max_volume = R.volume
@@ -121,10 +117,9 @@ var/const/INJECT = 5 //injection
return name
/datum/reagents/proc/get_master_reagent_id()
var/list/cached_reagents = reagent_list
var/id
var/max_volume = 0
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
if(R.volume > max_volume)
max_volume = R.volume
@@ -133,12 +128,8 @@ var/const/INJECT = 5 //injection
return id
/datum/reagents/proc/trans_to(obj/target, amount=1, multiplier=1, preserve_data=1, no_react = 0)//if preserve_data=0, the reagents data will be lost. Usefull if you use data for some strange stuff and don't want it to be transferred.
var/list/cached_reagents = reagent_list
if(!target || !total_volume)
return
if(amount < 0)
return
var/datum/reagents/R
if(istype(target, /datum/reagents))
R = target
@@ -149,7 +140,7 @@ var/const/INJECT = 5 //injection
amount = min(min(amount, src.total_volume), R.maximum_volume-R.total_volume)
var/part = amount / src.total_volume
var/trans_data = null
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/T = reagent
var/transfer_amount = T.volume * part
if(preserve_data)
@@ -165,18 +156,15 @@ var/const/INJECT = 5 //injection
return amount
/datum/reagents/proc/copy_to(obj/target, amount=1, multiplier=1, preserve_data=1)
var/list/cached_reagents = reagent_list
if(!target)
return
if(!target.reagents || src.total_volume<=0)
return
if(amount < 0)
return
var/datum/reagents/R = target.reagents
amount = min(min(amount, total_volume), R.maximum_volume-R.total_volume)
var/part = amount / total_volume
var/trans_data = null
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/T = reagent
var/copy_amount = T.volume * part
if(preserve_data)
@@ -190,41 +178,68 @@ var/const/INJECT = 5 //injection
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
var/list/cached_reagents = reagent_list
if (!target)
return
if (!target.reagents || src.total_volume<=0 || !src.get_reagent_amount(reagent))
return
if(amount < 0)
return
var/datum/reagents/R = target.reagents
if(src.get_reagent_amount(reagent)<amount)
amount = src.get_reagent_amount(reagent)
amount = min(amount, R.maximum_volume-R.total_volume)
var/trans_data = null
for (var/CR in cached_reagents)
var/datum/reagent/current_reagent = CR
for (var/datum/reagent/current_reagent in src.reagent_list)
if(current_reagent.id == reagent)
if(preserve_data)
trans_data = current_reagent.data
R.add_reagent(current_reagent.id, amount, trans_data, src.chem_temp)
remove_reagent(current_reagent.id, amount, 1)
src.remove_reagent(current_reagent.id, amount, 1)
break
src.update_total()
R.update_total()
R.handle_reactions()
//src.handle_reactions() Don't need to handle reactions on the source since you're (presumably isolating and) transferring a specific reagent.
return amount
/*
if (!target) return
var/total_transfered = 0
var/current_list_element = 1
var/datum/reagents/R = target.reagents
var/trans_data = null
//if(R.total_volume + amount > R.maximum_volume) return 0
current_list_element = rand(1,reagent_list.len) //Eh, bandaid fix.
while(total_transfered != amount)
if(total_transfered >= amount) break //Better safe than sorry.
if(total_volume <= 0 || !reagent_list.len) break
if(R.total_volume >= R.maximum_volume) break
if(current_list_element > reagent_list.len) current_list_element = 1
var/datum/reagent/current_reagent = reagent_list[current_list_element]
if(preserve_data)
trans_data = current_reagent.data
R.add_reagent(current_reagent.id, (1 * multiplier), trans_data)
src.remove_reagent(current_reagent.id, 1)
current_list_element++
total_transfered++
src.update_total()
R.update_total()
R.handle_reactions()
handle_reactions()
return total_transfered
*/
/datum/reagents/proc/metabolize(mob/living/carbon/C, can_overdose = 0)
var/list/cached_reagents = reagent_list
var/list/cached_addictions = addiction_list
if(C)
chem_temp = C.bodytemperature
handle_reactions()
var/need_mob_update = 0
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
if(!R.holder)
continue
@@ -238,13 +253,13 @@ var/const/INJECT = 5 //injection
R.overdosed = 1
need_mob_update += R.overdose_start(C)
if(R.addiction_threshold)
if(R.volume >= R.addiction_threshold && !is_type_in_list(R, cached_addictions))
if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list))
var/datum/reagent/new_reagent = new R.type()
cached_addictions.Add(new_reagent)
addiction_list.Add(new_reagent)
if(R.overdosed)
need_mob_update += R.overdose_process(C)
if(is_type_in_list(R,cached_addictions))
for(var/addiction in cached_addictions)
if(is_type_in_list(R,addiction_list))
for(var/addiction in addiction_list)
var/datum/reagent/A = addiction
if(istype(R, A))
A.addiction_stage = -15 // you're satisfied for a good while.
@@ -253,7 +268,7 @@ var/const/INJECT = 5 //injection
if(can_overdose)
if(addiction_tick == 6)
addiction_tick = 1
for(var/addiction in cached_addictions)
for(var/addiction in addiction_list)
var/datum/reagent/R = addiction
if(C && R)
R.addiction_stage++
@@ -268,7 +283,7 @@ var/const/INJECT = 5 //injection
need_mob_update += R.addiction_act_stage4(C)
if(40 to INFINITY)
C << "<span class='notice'>You feel like you've gotten over your need for [R.name].</span>"
cached_addictions.Remove(R)
addiction_list.Remove(R)
addiction_tick++
if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates.
C.updatehealth()
@@ -277,12 +292,11 @@ var/const/INJECT = 5 //injection
update_total()
/datum/reagents/process()
var/list/cached_reagents = reagent_list
if(flags & REAGENT_NOREACT)
STOP_PROCESSING(SSobj, src)
return
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
R.on_tick()
@@ -297,146 +311,129 @@ var/const/INJECT = 5 //injection
flags |= REAGENT_NOREACT
/datum/reagents/proc/conditional_update_move(atom/A, Running = 0)
var/list/cached_reagents = reagent_list
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
R.on_move (A, Running)
update_total()
/datum/reagents/proc/conditional_update(atom/A)
var/list/cached_reagents = reagent_list
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
R.on_update (A)
update_total()
/datum/reagents/proc/handle_reactions()
var/list/cached_reagents = reagent_list
var/list/cached_reactions = chemical_reactions_list
var/datum/cached_my_atom = my_atom
if(flags & REAGENT_NOREACT)
return //Yup, no reactions here. No siree.
var/reaction_occurred = 0
var/reaction_occured = 0
do
reaction_occurred = 0
for(var/reagent in cached_reagents)
reaction_occured = 0
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
for(var/reaction in cached_reactions[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id
for(var/reaction in chemical_reactions_list[R.id]) // Was a big list but now it should be smaller since we filtered it with our reagent id
if(!reaction)
continue
var/datum/chemical_reaction/C = reaction
var/list/cached_required_reagents = C.required_reagents
var/total_required_reagents = cached_required_reagents.len
var/total_required_reagents = C.required_reagents.len
var/total_matching_reagents = 0
var/list/cached_required_catalysts = C.required_catalysts
var/total_required_catalysts = cached_required_catalysts.len
var/total_required_catalysts = C.required_catalysts.len
var/total_matching_catalysts= 0
var/matching_container = 0
var/matching_other = 0
var/list/multipliers = new/list()
var/required_temp = C.required_temp
var/is_cold_recipe = C.is_cold_recipe
var/meets_temp_requirement = 0
var/list/cached_results = C.results
for(var/B in cached_required_reagents)
if(!has_reagent(B, cached_required_reagents[B]))
for(var/B in C.required_reagents)
if(!has_reagent(B, C.required_reagents[B]))
break
total_matching_reagents++
multipliers += round(get_reagent_amount(B) / cached_required_reagents[B])
for(var/B in cached_required_catalysts)
if(!has_reagent(B, cached_required_catalysts[B]))
multipliers += round(get_reagent_amount(B) / C.required_reagents[B])
for(var/B in C.required_catalysts)
if(!has_reagent(B, C.required_catalysts[B]))
break
total_matching_catalysts++
if(cached_my_atom)
if(!C.required_container)
matching_container = 1
else
if(cached_my_atom.type == C.required_container)
matching_container = 1
if (isliving(cached_my_atom)) //Makes it so certain chemical reactions don't occur in mobs
if (C.mob_react)
return
if(!C.required_other)
matching_other = 1
if(!C.required_container)
matching_container = 1
else if(istype(cached_my_atom, /obj/item/slime_extract))
var/obj/item/slime_extract/M = cached_my_atom
if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this
matching_other = 1
else
if(!C.required_container)
if(my_atom.type == C.required_container)
matching_container = 1
if(!C.required_other)
if (isliving(my_atom)) //Makes it so certain chemical reactions don't occur in mobs
if (C.mob_react)
return
if(!C.required_other)
matching_other = 1
else if(istype(my_atom, /obj/item/slime_extract))
var/obj/item/slime_extract/M = my_atom
if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this
matching_other = 1
if(required_temp == 0 || (is_cold_recipe && chem_temp <= required_temp) || (!is_cold_recipe && chem_temp >= required_temp))
meets_temp_requirement = 1
if(required_temp == 0)
required_temp = chem_temp
if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && meets_temp_requirement)
if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && chem_temp >= required_temp)
var/multiplier = min(multipliers)
for(var/B in cached_required_reagents)
remove_reagent(B, (multiplier * cached_required_reagents[B]), safety = 1)
for(var/B in C.required_reagents)
remove_reagent(B, (multiplier * C.required_reagents[B]), safety = 1)
for(var/P in C.results)
feedback_add_details("chemical_reaction", "[P]|[cached_results[P]*multiplier]")
var/created_volume = C.result_amount*multiplier
if(C.result)
feedback_add_details("chemical_reaction","[C.result]|[C.result_amount*multiplier]")
multiplier = max(multiplier, 1) //this shouldnt happen ...
add_reagent(P, cached_results[P]*multiplier, null, chem_temp)
add_reagent(C.result, C.result_amount*multiplier, null, chem_temp)
var/list/seen = viewers(4, get_turf(my_atom))
if(cached_my_atom)
if(!ismob(cached_my_atom)) // No bubbling mobs
if(C.mix_sound)
playsound(get_turf(cached_my_atom), C.mix_sound, 80, 1)
if(!istype(my_atom, /mob)) // No bubbling mobs
if(C.mix_sound)
playsound(get_turf(my_atom), C.mix_sound, 80, 1)
for(var/mob/M in seen)
M << "<span class='notice'>\icon[my_atom] [C.mix_message]</span>"
if(istype(my_atom, /obj/item/slime_extract))
var/obj/item/slime_extract/ME2 = my_atom
ME2.Uses--
if(ME2.Uses <= 0) // give the notification that the slime core is dead
for(var/mob/M in seen)
M << "<span class='notice'>\icon[my_atom] [C.mix_message]</span>"
M << "<span class='notice'>\icon[my_atom] \The [my_atom]'s power is consumed in the reaction.</span>"
ME2.name = "used slime extract"
ME2.desc = "This extract has been used up."
if(istype(cached_my_atom, /obj/item/slime_extract))
var/obj/item/slime_extract/ME2 = my_atom
ME2.Uses--
if(ME2.Uses <= 0) // give the notification that the slime core is dead
for(var/mob/M in seen)
M << "<span class='notice'>\icon[my_atom] \The [my_atom]'s power is consumed in the reaction.</span>"
ME2.name = "used slime extract"
ME2.desc = "This extract has been used up."
C.on_reaction(src, multiplier)
reaction_occurred = 1
C.on_reaction(src, created_volume)
reaction_occured = 1
break
while(reaction_occurred)
while(reaction_occured)
update_total()
return 0
/datum/reagents/proc/isolate_reagent(reagent)
var/list/cached_reagents = reagent_list
for(var/_reagent in cached_reagents)
for(var/_reagent in reagent_list)
var/datum/reagent/R = _reagent
if(R.id != reagent)
del_reagent(R.id)
update_total()
/datum/reagents/proc/del_reagent(reagent)
var/list/cached_reagents = reagent_list
for(var/_reagent in cached_reagents)
for(var/_reagent in reagent_list)
var/datum/reagent/R = _reagent
if(R.id == reagent)
if(my_atom && isliving(my_atom))
if(istype(my_atom, /mob/living))
var/mob/living/M = my_atom
R.on_mob_delete(M)
qdel(R)
reagent_list -= R
update_total()
if(my_atom)
my_atom.on_reagent_change()
check_ignoreslow(my_atom)
check_gofast(my_atom)
check_goreallyfast(my_atom)
my_atom.on_reagent_change()
check_ignoreslow(my_atom)
check_gofast(my_atom)
check_goreallyfast(my_atom)
return 1
/datum/reagents/proc/check_ignoreslow(mob/M)
@@ -461,9 +458,8 @@ var/const/INJECT = 5 //injection
M.status_flags &= ~GOTTAGOREALLYFAST
/datum/reagents/proc/update_total()
var/list/cached_reagents = reagent_list
total_volume = 0
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
if(R.volume < 0.1)
del_reagent(R.id)
@@ -473,68 +469,54 @@ var/const/INJECT = 5 //injection
return 0
/datum/reagents/proc/clear_reagents()
var/list/cached_reagents = reagent_list
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
del_reagent(R.id)
return 0
/datum/reagents/proc/reaction(atom/A, method = TOUCH, volume_modifier = 1, show_message = 1)
var/react_type
if(isliving(A))
react_type = "LIVING"
var/touch_protection = 0
if(method == VAPOR)
var/mob/living/L = A
touch_protection = L.get_permeability_protection()
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection)
else if(isturf(A))
react_type = "TURF"
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
R.reaction_turf(A, R.volume * volume_modifier, show_message)
else if(isobj(A))
react_type = "OBJ"
else
return
var/list/cached_reagents = reagent_list
for(var/reagent in cached_reagents)
var/datum/reagent/R = reagent
switch(react_type)
if("LIVING")
var/touch_protection = 0
if(method == VAPOR)
var/mob/living/L = A
touch_protection = L.get_permeability_protection()
R.reaction_mob(A, method, R.volume * volume_modifier, show_message, touch_protection)
if("TURF")
R.reaction_turf(A, R.volume * volume_modifier, show_message)
if("OBJ")
R.reaction_obj(A, R.volume * volume_modifier, show_message)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
R.reaction_obj(A, R.volume * volume_modifier, show_message)
/datum/reagents/proc/add_reagent(reagent, amount, list/data=null, reagtemp = 300, no_react = 0)
if(!isnum(amount) || !amount)
return FALSE
if(amount < 0)
return FALSE
var/list/cached_reagents = reagent_list
return 1
update_total()
if(total_volume + amount > maximum_volume)
amount = (maximum_volume - total_volume) //Doesnt fit in. Make it disappear. Shouldnt happen. Will happen.
chem_temp = round(((amount * reagtemp) + (total_volume * chem_temp)) / (total_volume + amount)) //equalize with new chems
for(var/A in cached_reagents)
for(var/A in reagent_list)
var/datum/reagent/R = A
if (R.id == reagent)
R.volume += amount
update_total()
if(my_atom)
my_atom.on_reagent_change()
my_atom.on_reagent_change()
R.on_merge(data)
if(!no_react)
handle_reactions()
return TRUE
return 0
var/datum/reagent/D = chemical_reagents_list[reagent]
if(D)
var/datum/reagent/R = new D.type(data)
cached_reagents += R
reagent_list += R
R.holder = src
R.volume = amount
if(data)
@@ -542,15 +524,17 @@ var/const/INJECT = 5 //injection
R.on_new(data)
update_total()
if(my_atom)
my_atom.on_reagent_change()
my_atom.on_reagent_change()
if(!no_react)
handle_reactions()
return TRUE
return 0
else
WARNING("[my_atom] attempted to add a reagent called ' [reagent] ' which doesn't exist. ([usr])")
return FALSE
if(!no_react)
handle_reactions()
return 1
/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)
for(var/r_id in list_reagents)
@@ -558,39 +542,27 @@ var/const/INJECT = 5 //injection
add_reagent(r_id, amt, data)
/datum/reagents/proc/remove_reagent(reagent, amount, safety)//Added a safety check for the trans_id_to
if(isnull(amount))
amount = 0
throw EXCEPTION("null amount passed to reagent code")
return FALSE
amount = INFINITY
if(!isnum(amount))
return FALSE
return 1
if(amount < 0)
return FALSE
var/list/cached_reagents = reagent_list
for(var/A in cached_reagents)
for(var/A in reagent_list)
var/datum/reagent/R = A
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
amount = Clamp(amount, 0, R.volume)
R.volume -= amount
update_total()
if(!safety)//So it does not handle reactions when it need not to
handle_reactions()
if(my_atom)
my_atom.on_reagent_change()
return TRUE
my_atom.on_reagent_change()
return 0
return FALSE
return 1
/datum/reagents/proc/has_reagent(reagent, amount = -1)
var/list/cached_reagents = reagent_list
for(var/_reagent in cached_reagents)
for(var/_reagent in reagent_list)
var/datum/reagent/R = _reagent
if (R.id == reagent)
if(!amount)
@@ -604,8 +576,7 @@ var/const/INJECT = 5 //injection
return 0
/datum/reagents/proc/get_reagent_amount(reagent)
var/list/cached_reagents = reagent_list
for(var/_reagent in cached_reagents)
for(var/_reagent in reagent_list)
var/datum/reagent/R = _reagent
if (R.id == reagent)
return R.volume
@@ -614,8 +585,7 @@ var/const/INJECT = 5 //injection
/datum/reagents/proc/get_reagents()
var/list/names = list()
var/list/cached_reagents = reagent_list
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
names += R.name
@@ -623,10 +593,10 @@ var/const/INJECT = 5 //injection
/datum/reagents/proc/remove_all_type(reagent_type, amount, strict = 0, safety = 1) // Removes all reagent of X type. @strict set to 1 determines whether the childs of the type are included.
if(!isnum(amount)) return 1
var/list/cached_reagents = reagent_list
var/has_removed_reagent = 0
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
var/matches = 0
// Switch between how we check the reagent type
@@ -645,16 +615,14 @@ var/const/INJECT = 5 //injection
//two helper functions to preserve data across reactions (needed for xenoarch)
/datum/reagents/proc/get_data(reagent_id)
var/list/cached_reagents = reagent_list
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
if(R.id == reagent_id)
//world << "proffering a data-carrying reagent ([reagent_id])"
return R.data
/datum/reagents/proc/set_data(reagent_id, new_data)
var/list/cached_reagents = reagent_list
for(var/reagent in cached_reagents)
for(var/reagent in reagent_list)
var/datum/reagent/R = reagent
if(R.id == reagent_id)
//world << "reagent data set ([reagent_id])"
@@ -682,8 +650,7 @@ var/const/INJECT = 5 //injection
return trans_data
/datum/reagents/proc/get_reagent(type)
var/list/cached_reagents = reagent_list
. = locate(type) in cached_reagents
. = locate(type) in reagent_list
///////////////////////////////////////////////////////////////////////////////////
@@ -691,18 +658,8 @@ var/const/INJECT = 5 //injection
// Convenience proc to create a reagents holder for an atom
// Max vol is maximum volume of holder
/datum/proc/create_reagents(max_vol)
/atom/proc/create_reagents(max_vol)
if(reagents)
qdel(reagents)
reagents = new/datum/reagents(max_vol)
reagents.my_atom = src
/proc/get_random_reagent_id() // Returns a random reagent ID minus blacklisted reagents
var/static/list/random_reagents = list()
if(!random_reagents.len)
for(var/thing in subtypesof(/datum/reagent))
var/datum/reagent/R = thing
if(initial(R.can_synth))
random_reagents += initial(R.id)
var/picked_reagent = pick(random_reagents)
return picked_reagent
@@ -8,7 +8,6 @@
use_power = 1
idle_power_usage = 40
interact_offline = 1
resistance_flags = FIRE_PROOF | ACID_PROOF
var/energy = 100
var/max_energy = 100
var/amount = 30
@@ -85,16 +84,9 @@
if(severity < 3)
..()
/obj/machinery/chem_dispenser/contents_explosion(severity, target)
..()
if(beaker)
beaker.ex_act(severity, target)
/obj/machinery/chem_dispenser/handle_atom_del(atom/A)
..()
if(A == beaker)
beaker = null
cut_overlays()
/obj/machinery/chem_dispenser/blob_act(obj/effect/blob/B)
if(prob(50))
qdel(src)
/obj/machinery/chem_dispenser/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
datum/tgui/master_ui = null, datum/ui_state/state = default_state)
@@ -161,7 +153,7 @@
. = TRUE
if("eject")
if(beaker)
beaker.forceMove(loc)
beaker.loc = loc
beaker = null
cut_overlays()
. = TRUE
@@ -188,7 +180,7 @@
icon_beaker = image('icons/obj/chemical.dmi', src, "disp_beaker") //randomize beaker overlay position.
icon_beaker.pixel_x = rand(-10,5)
add_overlay(icon_beaker)
else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/weapon/card/emag))
else if(user.a_intent != "harm" && !istype(I, /obj/item/weapon/card/emag))
user << "<span class='warning'>You can't load \the [I] into the machine!</span>"
else
return ..()
@@ -292,7 +284,7 @@
return
return ..()
/obj/machinery/chem_dispenser/constructable/on_deconstruction()
/obj/machinery/chem_dispenser/constructable/deconstruction()
if(beaker)
beaker.loc = loc
beaker = null
@@ -6,7 +6,6 @@
icon_state = "mixer0b"
use_power = 1
idle_power_usage = 40
resistance_flags = FIRE_PROOF | ACID_PROOF
var/obj/item/weapon/reagent_containers/beaker = null
var/target_temperature = 300
var/heater_coefficient = 0.10
@@ -69,7 +68,7 @@
return
return ..()
/obj/machinery/chem_heater/on_deconstruction()
/obj/machinery/chem_heater/deconstruction()
eject_beaker()
/obj/machinery/chem_heater/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \
@@ -7,7 +7,6 @@
icon_state = "mixer0"
use_power = 1
idle_power_usage = 20
resistance_flags = FIRE_PROOF | ACID_PROOF
var/obj/item/weapon/reagent_containers/beaker = null
var/obj/item/weapon/storage/pill_bottle/bottle = null
var/mode = 1
@@ -15,13 +14,16 @@
var/screen = "home"
var/analyzeVars[0]
var/useramount = 30 // Last used amount
use_auto_lights = 1
light_power_on = 1
light_range_on = 2
light_color = LIGHT_COLOR_BLUE
/obj/machinery/chem_master/New()
create_reagents(100)
add_overlay("waitlight")
var/obj/item/weapon/circuitboard/machine/B = new /obj/item/weapon/circuitboard/machine/chem_master(null)
B.apply_default_parts(src)
..()
/obj/item/weapon/circuitboard/machine/chem_master
name = "circuit board (ChemMaster 3000)"
@@ -56,24 +58,7 @@
if(severity < 3)
..()
/obj/machinery/chem_master/contents_explosion(severity, target)
..()
if(beaker)
beaker.ex_act(severity, target)
if(bottle)
bottle.ex_act(severity, target)
/obj/machinery/chem_master/handle_atom_del(atom/A)
..()
if(A == beaker)
beaker = null
reagents.clear_reagents()
icon_state = "mixer0"
else if(A == bottle)
bottle = null
/obj/machinery/chem_master/blob_act(obj/structure/blob/B)
/obj/machinery/chem_master/blob_act(obj/effect/blob/B)
if (prob(50))
qdel(src)
@@ -201,9 +186,8 @@
. = 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)
beaker.reagents.trans_id_to(src, id, useramount)
. = TRUE
beaker.reagents.trans_id_to(src, id, useramount)
. = TRUE
if("transferFromBuffer")
var/id = params["id"]
@@ -222,18 +206,17 @@
if("createPill")
var/many = params["many"]
if(reagents.total_volume == 0)
return
if(reagents.total_volume == 0) return
if(!condi)
var/amount = 1
var/vol_each = min(reagents.total_volume, 50)
if(text2num(many))
amount = Clamp(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many pills?", amount) as num|null), 0, 10)
amount = min(max(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many pills?", amount) as num|null), 0), 10)
if(!amount)
return
vol_each = min(reagents.total_volume / amount, 50)
var/name = stripped_input(usr,"Name:","Name your pill!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)
if(!name || !reagents.total_volume || !src || qdeleted(src) || !usr.canUseTopic(src, be_close=TRUE))
if(!name || !reagents.total_volume)
return
var/obj/item/weapon/reagent_containers/pill/P
@@ -248,7 +231,7 @@
reagents.trans_to(P,vol_each)
else
var/name = stripped_input(usr, "Name:", "Name your pack!", reagents.get_master_reagent_name(), MAX_NAME_LEN)
if(!name || !reagents.total_volume || !src || qdeleted(src) || !usr.canUseTopic(src, be_close=TRUE))
if(!name || !reagents.total_volume)
return
var/obj/item/weapon/reagent_containers/food/condiment/pack/P = new/obj/item/weapon/reagent_containers/food/condiment/pack(src.loc)
@@ -260,17 +243,16 @@
if("createPatch")
var/many = params["many"]
if(reagents.total_volume == 0)
return
if(reagents.total_volume == 0) return
var/amount = 1
var/vol_each = min(reagents.total_volume, 40)
if(text2num(many))
amount = Clamp(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many patches?", amount) as num|null), 0, 10)
amount = min(max(round(input(usr, "Max 10. Buffer content will be split evenly.", "How many patches?", amount) as num|null), 0), 10)
if(!amount)
return
vol_each = min(reagents.total_volume / amount, 40)
var/name = stripped_input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)
if(!name || !reagents.total_volume || !src || qdeleted(src) || !usr.canUseTopic(src, be_close=TRUE))
if(!name || !reagents.total_volume)
return
var/obj/item/weapon/reagent_containers/pill/P
@@ -283,40 +265,21 @@
. = TRUE
if("createBottle")
var/many = params["many"]
if(reagents.total_volume == 0)
var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)
if(!name)
return
var/obj/item/weapon/reagent_containers/P
if(condi)
var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)
if(!name || !reagents.total_volume || !src || qdeleted(src) || !usr.canUseTopic(src, be_close=TRUE))
return
var/obj/item/weapon/reagent_containers/food/condiment/P = new(src.loc)
P.originalname = name
P.name = trim("[name] bottle")
reagents.trans_to(P, P.volume)
var/obj/item/weapon/reagent_containers/food/condiment/C = new(src.loc)
C.originalname = name
P = C
else
var/amount_full = 0
var/vol_part = min(reagents.total_volume, 30)
if(text2num(many))
amount_full = round(reagents.total_volume / 30)
vol_part = reagents.total_volume % 30
var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)
if(!name || !reagents.total_volume || !src || qdeleted(src) || !usr.canUseTopic(src, be_close=TRUE))
return
P = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
var/obj/item/weapon/reagent_containers/glass/bottle/P
for(var/i = 0; i < amount_full; i++)
P = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
P.pixel_x = rand(-7, 7) //random position
P.pixel_y = rand(-7, 7)
P.name = trim("[name] bottle")
reagents.trans_to(P, 30)
if(vol_part)
P = new/obj/item/weapon/reagent_containers/glass/bottle(src.loc)
P.name = trim("[name] bottle")
reagents.trans_to(P, vol_part)
P.pixel_x = rand(-7, 7) //random position
P.pixel_y = rand(-7, 7)
P.name = trim("[name] bottle")
reagents.trans_to(P, P.volume)
. = TRUE
if("analyze")
@@ -8,7 +8,6 @@
circuit = /obj/item/weapon/circuitboard/computer/pandemic
use_power = 1
idle_power_usage = 20
resistance_flags = ACID_PROOF
var/temp_html = ""
var/wait = null
var/obj/item/weapon/reagent_containers/beaker = null
@@ -47,7 +46,7 @@
wait = 1
update_icon()
spawn(waittime)
wait = null
src.wait = null
update_icon()
playsound(src.loc, 'sound/machines/ping.ogg', 30, 1)
@@ -97,8 +96,8 @@
B.reagents.add_reagent("vaccine", 15, list(vaccine_type))
replicator_cooldown(200)
else
temp_html = "The replicator is not ready yet."
updateUsrDialog()
src.temp_html = "The replicator is not ready yet."
src.updateUsrDialog()
return
else if (href_list["create_virus_culture"])
if(!wait)
@@ -126,31 +125,24 @@
B.name = "[name] culture bottle"
B.desc = "A small bottle. Contains [D.agent] culture in synthblood medium."
B.reagents.add_reagent("blood",20,data)
updateUsrDialog()
src.updateUsrDialog()
else
temp_html = "The replicator is not ready yet."
updateUsrDialog()
src.temp_html = "The replicator is not ready yet."
src.updateUsrDialog()
return
else if (href_list["empty_beaker"])
beaker.reagents.clear_reagents()
updateUsrDialog()
src.updateUsrDialog()
return
else if (href_list["eject"])
beaker.forceMove(get_turf(loc))
beaker:loc = src.loc
beaker = null
icon_state = "mixer0"
updateUsrDialog()
return
else if (href_list["emptyeject_beaker"])
beaker.reagents.clear_reagents()
beaker.forceMove(get_turf(loc))
beaker = null
icon_state = "mixer0"
updateUsrDialog()
src.updateUsrDialog()
return
else if(href_list["clear"])
temp_html = ""
updateUsrDialog()
src.temp_html = ""
src.updateUsrDialog()
return
else if(href_list["name_disease"])
var/new_name = stripped_input(usr, "Name the Disease", "New Name", "", MAX_NAME_LEN)
@@ -164,15 +156,15 @@
A.AssignName(new_name)
for(var/datum/disease/advance/AD in SSdisease.processing)
AD.Refresh()
updateUsrDialog()
src.updateUsrDialog()
else
usr << browse(null, "window=pandemic")
updateUsrDialog()
src.updateUsrDialog()
return
add_fingerprint(usr)
src.add_fingerprint(usr)
return
/obj/machinery/computer/pandemic/attack_hand(mob/user)
@@ -180,7 +172,7 @@
return
user.set_machine(src)
var/dat = ""
if(temp_html)
if(src.temp_html)
dat = "[src.temp_html]<BR><BR><A href='?src=\ref[src];clear=1'>Main Menu</A>"
else if(!beaker)
dat += "Please insert beaker.<BR>"
@@ -227,12 +219,9 @@
dat += "<b>Description: </b> [(D.desc||"none")]<BR>"
dat += "<b>Spread:</b> [(D.spread_text||"none")]<BR>"
dat += "<b>Possible cure:</b> [(D.cure_text||"none")]<BR><BR>"
if(istype(D, /datum/disease/advance))
var/datum/disease/advance/A = D
dat += "<b>Stealth:</b> [(A.totalStealth())]<BR>"
dat += "<b>Resistance:</b> [(A.totalResistance())]<BR>"
dat += "<b>Stage Speed:</b> [(A.totalStageSpeed())]<BR>"
dat += "<b>Transmission:</b> [(A.totalTransmittable())]<BR><BR>"
dat += "<b>Symptoms:</b> "
var/english_symptoms = list()
for(var/datum/symptom/S in A.symptoms)
@@ -268,8 +257,7 @@
dat += "nothing<BR>"
else
dat += "nothing<BR>"
dat += "<BR><A href='?src=\ref[src];eject=1'>Eject beaker</A>[((R.total_volume&&R.reagent_list.len) ? "-- <A href='?src=\ref[src];empty_beaker=1'>Empty beaker</A>":"")]"
dat += "[((R.total_volume&&R.reagent_list.len) ? "-- <A href='?src=\ref[src];emptyeject_beaker=1'>Empty and Eject beaker</A>":"")]<BR>"
dat += "<BR><A href='?src=\ref[src];eject=1'>Eject beaker</A>[((R.total_volume&&R.reagent_list.len) ? "-- <A href='?src=\ref[src];empty_beaker=1'>Empty beaker</A>":"")]<BR>"
dat += "<A href='?src=\ref[user];mach_close=pandemic'>Close</A>"
user << browse("<TITLE>[src.name]</TITLE><BR>[dat]", "window=pandemic;size=575x400")
@@ -291,12 +279,12 @@
beaker = I
beaker.loc = src
user << "<span class='notice'>You add the beaker to the machine.</span>"
updateUsrDialog()
src.updateUsrDialog()
icon_state = "mixer1"
else
return ..()
/obj/machinery/computer/pandemic/on_deconstruction()
/obj/machinery/computer/pandemic/deconstruction()
if(beaker)
beaker.loc = get_turf(src)
..()
@@ -9,7 +9,6 @@
idle_power_usage = 5
active_power_usage = 100
pass_flags = PASSTABLE
resistance_flags = ACID_PROOF
var/operating = 0
var/obj/item/weapon/reagent_containers/beaker = null
var/limit = 10
@@ -27,7 +26,7 @@
/obj/item/stack/sheet/mineral/silver = list("silver" = 20),
/obj/item/stack/sheet/mineral/gold = list("gold" = 20),
/obj/item/weapon/grown/nettle/basic = list("sacid" = 0),
/obj/item/weapon/grown/nettle/death = list("facid" = 0, "sacid" = 0),
/obj/item/weapon/grown/nettle/death = list("facid" = 0),
/obj/item/weapon/grown/novaflower = list("capsaicin" = 0, "condensedcapsaicin" = 0),
//Blender Stuff
@@ -47,7 +46,6 @@
//All types that you can put into the grinder to transfer the reagents to the beaker. !Put all recipes above this.!
/obj/item/slime_extract = list(),
/obj/item/weapon/reagent_containers/pill = list(),
/obj/item/weapon/reagent_containers/food = list(),
/obj/item/weapon/reagent_containers/honeycomb = list()
@@ -70,9 +68,6 @@
/obj/item/weapon/reagent_containers/food/snacks/grown/berries/poison = list("poisonberryjuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin = list("pumpkinjuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/blumpkin = list("blumpkinjuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/apple = list("applejuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/grapes = list("grapejuice" = 0),
/obj/item/weapon/reagent_containers/food/snacks/grown/grapes/green = list("grapejuice" = 0),
)
var/list/dried_items = list(
@@ -86,36 +81,14 @@
var/list/holdingitems = list()
/obj/machinery/reagentgrinder/New()
..()
beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
return
/obj/machinery/reagentgrinder/Destroy()
if(beaker)
qdel(beaker)
beaker = null
return ..()
/obj/machinery/reagentgrinder/contents_explosion(severity, target)
if(beaker)
beaker.ex_act(severity, target)
/obj/machinery/reagentgrinder/handle_atom_del(atom/A)
..()
if(A == beaker)
beaker = null
update_icon()
updateUsrDialog()
/obj/machinery/reagentgrinder/deconstruct(disassembled = TRUE)
new /obj/item/stack/sheet/metal (loc, 3)
qdel(src)
..()
beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src)
return
/obj/machinery/reagentgrinder/update_icon()
if(beaker)
icon_state = "juicer1"
else
icon_state = "juicer0"
icon_state = "juicer"+num2text(!isnull(beaker))
return
/obj/machinery/reagentgrinder/attackby(obj/item/I, mob/user, params)
if(default_unfasten_wrench(user, I))
@@ -161,7 +134,7 @@
return 1
if (!is_type_in_list(I, blend_items) && !is_type_in_list(I, juice_items))
if(user.a_intent == INTENT_HARM)
if(user.a_intent == "harm")
return ..()
else
user << "<span class='warning'>Cannot refine into a reagent!</span>"
@@ -432,18 +405,6 @@
break
remove_object(O)
//Slime Extractis
for (var/obj/item/slime_extract/O in holdingitems)
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
break
var/space = beaker.reagents.maximum_volume - beaker.reagents.total_volume
if (O.reagents != null)
var/amount = O.reagents.total_volume
O.reagents.trans_to(beaker, min(amount, space))
if (O.Uses > 0)
beaker.reagents.add_reagent("slimejelly",min(20, space))
remove_object(O)
//Everything else - Transfers reagents from it into beaker
for (var/obj/item/weapon/reagent_containers/O in holdingitems)
if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume)
+6 -3
View File
@@ -193,9 +193,8 @@ About Recipes:
name & id
Should be pretty obvious.
results
This var contains a list of the id(s) of the resulting reagents and their result amounts.
I recommend you set this to the total volume of all required reagent.
result
This var contains the id of the resulting reagent.
required_reagents
This is a list of ids of the required reagents.
@@ -209,6 +208,10 @@ About Recipes:
for the reaction. However, unlike required_reagents, catalysts are NOT consumed.
They mearly have to be present in the container.
result_amount
This is the amount of the resulting reagent this recipe will produce.
I recommend you set this to the total volume of all required reagent.
required_container
The container the recipe has to take place in in order to happen. Leave this blank/null
if you want the reaction to happen anywhere.
@@ -54,20 +54,10 @@ All effects don't start immediately, but rather get worse over time; the rate is
return
/datum/reagent/consumable/ethanol/reaction_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with ethanol isn't quite as good as fuel.
if(!isliving(M))
if(!istype(M, /mob/living))
return
if(method in list(TOUCH, VAPOR, PATCH))
if(method == TOUCH || method == VAPOR)
M.adjust_fire_stacks(reac_volume / 15)
if(iscarbon(M))
var/mob/living/carbon/C = M
var/power_multiplier = boozepwr / 65 // Weak alcohol has less sterilizing power
for(var/s in C.surgeries)
var/datum/surgery/S = s
S.success_multiplier = max(0.10*power_multiplier, S.success_multiplier)
// +10% success propability on each step, useful while operating in less-than-perfect conditions
return ..()
/datum/reagent/consumable/ethanol/beer
@@ -86,11 +76,11 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/beer/green/on_mob_life(mob/living/M)
if(M.color != color)
M.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY)
M.color = color
return ..()
/datum/reagent/consumable/ethanol/beer/green/on_mob_delete(mob/living/M)
M.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, color)
M.color = initial(M.color)
/datum/reagent/consumable/ethanol/kahlua
name = "Kahlua"
@@ -150,7 +140,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/bilk/on_mob_life(mob/living/M)
if(M.getBruteLoss() && prob(10))
M.heal_bodypart_damage(1,0, 0)
M.heal_organ_damage(1,0, 0)
. = 1
return ..() || .
@@ -196,7 +186,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/wine
name = "Wine"
id = "wine"
description = "A premium alcoholic beverage made from distilled grape juice."
description = "An premium alcoholic beverage made from distilled grape juice."
color = "#7E4043" // rgb: 126, 64, 67
boozepwr = 35
@@ -217,7 +207,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/cognac
name = "Cognac"
id = "cognac"
description = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing. Classy as fornication."
description = "A sweet and strongly alchoholic drink, made after numerous distillations and years of maturing. Classy as fornication."
color = "#AB3C05" // rgb: 171, 60, 5
boozepwr = 75
@@ -236,14 +226,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/hooch
name = "Hooch"
id = "hooch"
description = "Either someone's failure at cocktail making or attempt in alcohol production. In any case, do you really want to drink that?"
description = "Either someone's failure at cocktail making or attempt in alchohol production. In any case, do you really want to drink that?"
color = "#664300" // rgb: 102, 67, 0
boozepwr = 100
/datum/reagent/consumable/ethanol/ale
name = "Ale"
id = "ale"
description = "A dark alcoholic beverage made with malted barley and yeast."
description = "A dark alchoholic beverage made by malted barley and yeast."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 65
@@ -341,7 +331,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/brave_bull
name = "Brave Bull"
id = "bravebull"
description = "It's just as effective as Dutch-Courage!"
description = "It's just as effective as Dutch-Courage!."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 80
@@ -599,7 +589,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/andalusia
name = "Andalusia"
id = "andalusia"
description = "A nice, strangely named drink."
description = "A nice, strange named drink."
color = "#664300" // rgb: 102, 67, 0
boozepwr = 40
@@ -680,8 +670,8 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 60
/datum/reagent/consumable/ethanol/bananahonk/on_mob_life(mob/living/M)
if((ishuman(M) && M.job in list("Clown") ) || ismonkey(M))
M.heal_bodypart_damage(1,1, 0)
if( ( istype(M, /mob/living/carbon/human) && M.job in list("Clown") ) || istype(M, /mob/living/carbon/monkey) )
M.heal_organ_damage(1,1, 0)
. = 1
return ..() || .
@@ -694,8 +684,8 @@ All effects don't start immediately, but rather get worse over time; the rate is
boozepwr = 59 //Proof that clowns are better than mimes right here
/datum/reagent/consumable/ethanol/silencer/on_mob_life(mob/living/M)
if(ishuman(M) && M.job in list("Mime"))
M.heal_bodypart_damage(1,1)
if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
M.heal_organ_damage(1,1)
. = 1
return ..() || .
@@ -725,7 +715,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
/datum/reagent/consumable/ethanol/fetching_fizz //A reference to one of my favorite games of all time. Pulls nearby ores to the imbiber!
name = "Fetching Fizz"
id = "fetching_fizz"
description = "Whiskey sour/iron/uranium mixture resulting in a highly magnetic slurry. Mild alcohol content." //Requires no alcohol to make but has alcohol anyway because ~magic~
description = "Whiskey sour/iron/uranium mixture resulting in highly magnetic slurry. Mild alcohol content." //Requires no alcohol to make but has alcohol anyway because ~magic~
color = rgb(255, 91, 15)
boozepwr = 10
metabolization_rate = 0.1 * REAGENTS_METABOLISM
@@ -760,126 +750,3 @@ All effects don't start immediately, but rather get worse over time; the rate is
description = "Unidentifiable mixture. Unmeasurably high alcohol content."
color = rgb(51, 19, 3) //Sickly brown
boozepwr = 300 //I warned you
/datum/reagent/consumable/ethanol/atomicbomb
name = "Atomic Bomb"
id = "atomicbomb"
description = "Nuclear proliferation never tasted so good."
color = "#666300" // rgb: 102, 99, 0
boozepwr = 0 //custom drunk effect
/datum/reagent/consumable/ethanol/atomicbomb/on_mob_life(mob/living/M)
M.set_drugginess(50)
M.confused = max(M.confused+2,0)
M.Dizzy(10)
if (!M.slurring)
M.slurring = 1
M.slurring += 3
switch(current_cycle)
if(51 to 200)
M.Sleeping(5, 0)
. = 1
if(201 to INFINITY)
M.AdjustSleeping(2, 0)
M.adjustToxLoss(2, 0)
. = 1
..()
/datum/reagent/consumable/ethanol/gargle_blaster
name = "Pan-Galactic Gargle Blaster"
id = "gargleblaster"
description = "Whoah, this stuff looks volatile!"
color = "#664300" // rgb: 102, 67, 0
boozepwr = 0 //custom drunk effect
/datum/reagent/consumable/ethanol/gargle_blaster/on_mob_life(mob/living/M)
M.dizziness +=6
switch(current_cycle)
if(15 to 45)
if(!M.slurring)
M.slurring = 1
M.slurring += 3
if(45 to 55)
if(prob(50))
M.confused = max(M.confused+3,0)
if(55 to 200)
M.set_drugginess(55)
if(200 to INFINITY)
M.adjustToxLoss(2, 0)
. = 1
..()
/datum/reagent/consumable/ethanol/neurotoxin
name = "Neurotoxin"
id = "neurotoxin"
description = "A strong neurotoxin that puts the subject into a death-like state."
color = "#2E2E61" // rgb: 46, 46, 97
boozepwr = 0 //custom drunk effect
/datum/reagent/consumable/ethanol/neurotoxin/on_mob_life(mob/living/carbon/M)
M.Weaken(3, 1, 0)
M.dizziness +=6
switch(current_cycle)
if(15 to 45)
if(!M.slurring)
M.slurring = 1
M.slurring += 3
if(45 to 55)
if(prob(50))
M.confused = max(M.confused+3,0)
if(55 to 200)
M.set_drugginess(55)
if(200 to INFINITY)
M.adjustToxLoss(2, 0)
..()
. = 1
/datum/reagent/consumable/ethanol/hippies_delight
name = "Hippie's Delight"
id = "hippiesdelight"
description = "You just don't get it maaaan."
color = "#664300" // rgb: 102, 67, 0
nutriment_factor = 0
boozepwr = 0 //custom drunk effect
metabolization_rate = 0.2 * REAGENTS_METABOLISM
/datum/reagent/consumable/ethanol/hippies_delight/on_mob_life(mob/living/M)
if (!M.slurring)
M.slurring = 1
switch(current_cycle)
if(1 to 5)
M.Dizzy(10)
M.set_drugginess(30)
if(prob(10))
M.emote(pick("twitch","giggle"))
if(5 to 10)
M.Jitter(20)
M.Dizzy(20)
M.set_drugginess(45)
if(prob(20))
M.emote(pick("twitch","giggle"))
if (10 to 200)
M.Jitter(40)
M.Dizzy(40)
M.set_drugginess(60)
if(prob(30))
M.emote(pick("twitch","giggle"))
if(200 to INFINITY)
M.Jitter(60)
M.Dizzy(60)
M.set_drugginess(75)
if(prob(40))
M.emote(pick("twitch","giggle"))
if(prob(30))
M.adjustToxLoss(2, 0)
. = 1
..()
/datum/reagent/consumable/ethanol/eggnog
name = "Eggnog"
id = "eggnog"
description = "For enjoying the most wonderful time of the year."
color = "#fcfdc6" // rgb: 252, 253, 198
nutriment_factor = 2 * REAGENTS_METABOLISM
boozepwr = 1
@@ -5,51 +5,73 @@
color = "#FFFFFF"
var/complementary_color = "#000000" //a color that's complementary to the normal blob color
var/shortdesc = null //just damage and on_mob effects, doesn't include special, blob-tile only effects
var/effectdesc = null //any long, blob-tile specific effects
var/analyzerdescdamage = "Unknown. Report this bug to a coder, or just adminhelp."
var/analyzerdesceffect = "N/A"
var/blobbernaut_message = "slams" //blobbernaut attack verb
var/message = "The blob strikes you" //message sent to any mob hit by the blob
var/message_living = null //extension to first mob sent to only living mobs i.e. silicons have no skin to be burnt
can_synth = 0
/datum/reagent/blob/proc/send_message(mob/living/M)
var/totalmessage = message
if(message_living && !issilicon(M))
totalmessage += message_living
totalmessage += "!"
M << "<span class='userdanger'>[totalmessage]</span>"
/datum/reagent/blob/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
if(M.stat == DEAD || istype(M, /mob/living/simple_animal/hostile/blob))
return 0 //the dead, and blob mobs, don't cause reactions
return round(reac_volume * min(1.5 - touch_protection, 1), 0.1) //full touch protection means 50% volume, any prot below 0.5 means 100% volume.
/datum/reagent/blob/proc/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) //when the blob takes damage, do this
/datum/reagent/blob/proc/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause) //when the blob takes damage, do this
return damage
/datum/reagent/blob/proc/death_reaction(obj/structure/blob/B, damage_flag) //when a blob dies, do this
/datum/reagent/blob/proc/death_reaction(obj/effect/blob/B, cause) //when a blob dies, do this
return
/datum/reagent/blob/proc/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O) //when the blob expands, do this
/datum/reagent/blob/proc/expand_reaction(obj/effect/blob/B, obj/effect/blob/newB, turf/T) //when the blob expands, do this
return
/datum/reagent/blob/proc/tesla_reaction(obj/structure/blob/B, power) //when the blob is hit by a tesla bolt, do this
/datum/reagent/blob/proc/tesla_reaction(obj/effect/blob/B, power) //when the blob is hit by a tesla bolt, do this
return 1 //return 0 to ignore damage
/datum/reagent/blob/proc/extinguish_reaction(obj/structure/blob/B) //when the blob is hit with water, do this
/datum/reagent/blob/proc/extinguish_reaction(obj/effect/blob/B) //when the blob is hit with water, do this
return
/datum/reagent/blob/proc/emp_reaction(obj/structure/blob/B, severity) //when the blob is hit with an emp, do this
/datum/reagent/blob/proc/emp_reaction(obj/effect/blob/B, severity) //when the blob is hit with an emp, do this
return
//does low toxin damage, but creates fragile spores when expanding or killed by weak attacks
/datum/reagent/blob/sporing_pods
name = "Sporing Pods"
id = "sporing_pods"
description = "will do very low toxin damage and produce fragile spores when killed or on expanding."
shortdesc = "will do very low toxin damage."
analyzerdescdamage = "Does very low toxin damage."
analyzerdesceffect = "Produces spores when expanding and when killed."
color = "#E88D5D"
complementary_color = "#5DB8E8"
message_living = ", and you feel sick"
/datum/reagent/blob/sporing_pods/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.apply_damage(0.2*reac_volume, TOX)
/datum/reagent/blob/sporing_pods/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
if(!isnull(cause) && damage <= 20 && original_health - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 30% chance of a shitty spore.
B.visible_message("<span class='warning'><b>A spore floats free of the blob!</b></span>")
var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc)
BS.overmind = B.overmind
BS.update_icons()
B.overmind.blob_mobs.Add(BS)
return ..()
/datum/reagent/blob/sporing_pods/expand_reaction(obj/effect/blob/B, obj/effect/blob/newB, turf/T)
if(prob(12))
var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(T)
BS.overmind = B.overmind
BS.update_icons()
newB.overmind.blob_mobs.Add(BS)
//does brute damage but can replicate when damaged and has a chance of expanding again
/datum/reagent/blob/replicating_foam
name = "Replicating Foam"
id = "replicating_foam"
description = "will do medium brute damage and occasionally expand again when expanding."
description = "will do medium brute damage, take increased brute damage, and expand when burned."
shortdesc = "will do medium brute damage."
effectdesc = "will also expand when attacked with burn damage, but takes more brute damage."
analyzerdescdamage = "Does medium brute damage."
analyzerdesceffect = "Expands when attacked with burn damage, will occasionally expand again when expanding, and is fragile to brute damage."
color = "#7B5A57"
@@ -57,61 +79,30 @@
/datum/reagent/blob/replicating_foam/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.apply_damage(0.7*reac_volume, BRUTE)
M.apply_damage(0.5*reac_volume, BRUTE)
/datum/reagent/blob/replicating_foam/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
/datum/reagent/blob/replicating_foam/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
var/effectivedamage = damage
if(damage_type == BRUTE)
damage = damage * 2
else if(damage_type == BURN && damage > 0 && B.obj_integrity - damage > 0 && prob(60))
var/obj/structure/blob/newB = B.expand(null, null, 0)
effectivedamage = damage * 2
if(damage_type == BURN && effectivedamage > 0 && original_health - effectivedamage > 0 && prob(75))
var/obj/effect/blob/newB = B.expand(null, null, 0)
if(newB)
newB.obj_integrity = B.obj_integrity - damage
newB.health = original_health - effectivedamage
newB.check_health(cause)
newB.update_icon()
return ..()
return effectivedamage
/datum/reagent/blob/replicating_foam/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O)
/datum/reagent/blob/replicating_foam/expand_reaction(obj/effect/blob/B, obj/effect/blob/newB, turf/T)
if(prob(30))
newB.expand(null, null, 0) //do it again!
//does massive brute and burn damage, but can only expand manually
/datum/reagent/blob/networked_fibers
name = "Networked Fibers"
id = "networked_fibers"
description = "will do high brute and burn damage but non-manual expansion will only generate resources."
shortdesc = "will do high brute and burn damage."
effectdesc = "will move your core when manually expanding near it."
analyzerdescdamage = "Does high brute and burn damage."
analyzerdesceffect = "Is highly mobile and generates resources rapidly."
color = "#CDC0B0"
complementary_color = "#FFF68F"
/datum/reagent/blob/networked_fibers/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.apply_damage(0.6*reac_volume, BRUTE)
if(M)
M.apply_damage(0.6*reac_volume, BURN)
/datum/reagent/blob/networked_fibers/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O)
if(!O && newB.overmind)
if(!istype(B, /obj/structure/blob/node))
newB.overmind.add_points(1)
qdel(newB)
else
var/area/A = get_area(T)
if(!isspaceturf(T) && !istype(A, /area/shuttle))
for(var/obj/structure/blob/core/C in range(1, newB))
if(C.overmind == O)
newB.forceMove(get_turf(C))
C.forceMove(T)
C.setDir(get_dir(newB, C))
O.add_points(1)
newB.expand() //do it again!
//does brute damage, shifts away when damaged
/datum/reagent/blob/shifting_fragments
name = "Shifting Fragments"
id = "shifting_fragments"
description = "will do medium brute damage."
effectdesc = "will also cause blob parts to shift away when attacked."
description = "will do medium brute damage and shift away from damage."
shortdesc = "will do medium brute damage."
analyzerdescdamage = "Does medium brute damage."
analyzerdesceffect = "When attacked, may shift away from the attacker."
color = "#C8963C"
@@ -119,79 +110,123 @@
/datum/reagent/blob/shifting_fragments/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.apply_damage(0.7*reac_volume, BRUTE)
M.apply_damage(0.6*reac_volume, BRUTE)
/datum/reagent/blob/shifting_fragments/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O)
if(istype(B, /obj/structure/blob/normal) || (istype(B, /obj/structure/blob/shield) && prob(25)))
/datum/reagent/blob/shifting_fragments/expand_reaction(obj/effect/blob/B, obj/effect/blob/newB, turf/T)
if(istype(B, /obj/effect/blob/normal) || (istype(B, /obj/effect/blob/shield) && prob(20)))
newB.forceMove(get_turf(B))
B.forceMove(T)
/datum/reagent/blob/shifting_fragments/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage))
/datum/reagent/blob/shifting_fragments/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
if(cause && damage > 0 && original_health - damage > 0 && prob(40))
var/list/blobstopick = list()
for(var/obj/structure/blob/OB in orange(1, B))
if((istype(OB, /obj/structure/blob/normal) || (istype(OB, /obj/structure/blob/shield) && prob(25))) && OB.overmind && OB.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id)
for(var/obj/effect/blob/OB in orange(1, B))
if((istype(OB, /obj/effect/blob/normal) || istype(OB, /obj/effect/blob/shield)) && OB.overmind && OB.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id)
blobstopick += OB //as long as the blob picked is valid; ie, a normal or shield blob that has the same chemical as we do, we can swap with it
if(blobstopick.len)
var/obj/structure/blob/targeted = pick(blobstopick) //randomize the blob chosen, because otherwise it'd tend to the lower left
var/obj/effect/blob/targeted = pick(blobstopick) //randomize the blob chosen, because otherwise it'd tend to the lower left
var/turf/T = get_turf(targeted)
targeted.forceMove(get_turf(B))
B.forceMove(T) //swap the blobs
return ..()
//sets you on fire, does burn damage, explodes into flame when burnt, weak to water
/datum/reagent/blob/blazing_oil
name = "Blazing Oil"
id = "blazing_oil"
description = "will do medium burn damage and set targets on fire."
effectdesc = "will also release bursts of flame when burnt, but takes damage from water."
//does low burn and a lot of stamina damage, immune to tesla bolts, weak to EMP
/datum/reagent/blob/energized_fibers
name = "Energized Fibers"
id = "energized_fibers"
description = "will do low burn and high stamina damage and conduct electricity, but is weak to EMPs."
shortdesc = "will do low burn and high stamina damage."
analyzerdescdamage = "Does low burn damage and massively drains stamina."
analyzerdesceffect = "Is immune to electricity and will easily conduct it, but is weak to EMPs."
color = "#EFD65A"
complementary_color = "#5A73EF"
blobbernaut_message = "shocks"
message_living = ", and you feel a strong tingling sensation"
/datum/reagent/blob/energized_fibers/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.apply_damage(0.6*reac_volume, BURN)
if(M)
M.adjustStaminaLoss(0.6*reac_volume)
/datum/reagent/blob/energized_fibers/tesla_reaction(obj/effect/blob/B, power)
return 0
/datum/reagent/blob/energized_fibers/emp_reaction(obj/effect/blob/B, severity)
var/damage = rand(30, 50) - severity * rand(10, 15)
B.take_damage(damage, BURN)
//sets you on fire, does burn damage, weak to water
/datum/reagent/blob/boiling_oil
name = "Boiling Oil"
id = "boiling_oil"
description = "will do medium burn damage and set targets on fire, but is weak to water."
shortdesc = "will do medium burn damage and set targets on fire."
analyzerdescdamage = "Does medium burn damage and sets targets on fire."
analyzerdesceffect = "Releases fire when burnt, but takes damage from water and other extinguishing liquids."
analyzerdesceffect = "Takes damage from water and other extinguishing liquids."
color = "#B68D00"
complementary_color = "#BE5532"
complementary_color = "#0029B6"
blobbernaut_message = "splashes"
message = "The blob splashes you with burning oil"
message_living = ", and you feel your skin char and melt"
/datum/reagent/blob/blazing_oil/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
/datum/reagent/blob/boiling_oil/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.adjust_fire_stacks(round(reac_volume/10))
M.IgniteMob()
if(M)
M.apply_damage(0.8*reac_volume, BURN)
M.apply_damage(0.6*reac_volume, BURN)
if(iscarbon(M))
M.emote("scream")
/datum/reagent/blob/blazing_oil/extinguish_reaction(obj/structure/blob/B)
B.take_damage(rand(1, 3), BURN, "energy")
/datum/reagent/blob/boiling_oil/extinguish_reaction(obj/effect/blob/B)
B.take_damage(rand(1, 3), BURN)
/datum/reagent/blob/blazing_oil/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_type == BURN && damage_flag != "energy")
//does burn and toxin damage, explodes into flame when hit with burn damage
/datum/reagent/blob/flammable_goo
name = "Flammable Goo"
id = "flammable_goo"
description = "will do medium burn and toxin damage, make targets flammable, and ignite when burned."
shortdesc = "will do medium burn and toxin damage, and make targets flammable."
analyzerdescdamage = "Does medium burn damage, medium toxin damage, and makes targets flammable."
analyzerdesceffect = "Releases bursts of flame when attacked with burn damage, but takes additional burn damage."
color = "#BE5532"
complementary_color = "#329BBE"
blobbernaut_message = "splashes"
message = "The blob splashes you with a thin goo"
message_living = ", and you smell a faint, sweet scent"
/datum/reagent/blob/flammable_goo/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.adjust_fire_stacks(round(reac_volume/8)) //apply, but don't ignite
M.apply_damage(0.4*reac_volume, TOX)
if(M)
M.apply_damage(0.4*reac_volume, BURN)
/datum/reagent/blob/flammable_goo/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
if(cause && damage_type == BURN)
for(var/turf/open/T in range(1, B))
var/obj/structure/blob/C = locate() in T
var/obj/effect/blob/C = locate() in T
if(!(C && C.overmind && C.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id) && prob(80))
PoolOrNew(/obj/effect/hotspot, T)
if(damage_flag == "fire")
return 0
return damage * 1.5
return ..()
//does toxin damage, hallucination, targets think they're not hurt at all
//does toxin damage, targets think they're not hurt at all
/datum/reagent/blob/regenerative_materia
name = "Regenerative Materia"
id = "regenerative_materia"
description = "will do toxin damage and cause targets to believe they are fully healed."
analyzerdescdamage = "Does toxin damage and injects a toxin that causes the target to believe they are fully healed."
description = "will do low toxin damage and cause targets to believe they are fully healed."
analyzerdescdamage = "Does low toxin damage and injects a toxin that causes the target to believe they are fully healed."
color = "#C8A5DC"
complementary_color = "#CD7794"
complementary_color = "#B9DCA5"
message_living = ", and you feel <i>alive</i>"
/datum/reagent/blob/regenerative_materia/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.adjust_drugginess(reac_volume)
if(M.reagents)
M.reagents.add_reagent("regenerative_materia", 0.2*reac_volume)
M.reagents.add_reagent("spore", 0.2*reac_volume)
M.apply_damage(0.7*reac_volume, TOX)
M.apply_damage(0.5*reac_volume, TOX)
/datum/reagent/blob/regenerative_materia/on_mob_life(mob/living/M)
M.adjustToxLoss(1*REM)
@@ -206,151 +241,211 @@
N.hal_screwyhud = 0
..()
//kills sleeping targets and turns them into blob zombies, produces fragile spores when killed or on expanding
/datum/reagent/blob/zombifying_pods
name = "Zombifying Pods"
id = "zombifying_pods"
description = "will do very low toxin damage and harvest sleeping targets for additional resources and a blob zombie."
effectdesc = "will also produce fragile spores when killed and on expanding."
shortdesc = "will do very low toxin damage and harvest sleeping targets for additional resources(for your overmind) and a blob zombie."
analyzerdescdamage = "Does very low toxin damage and kills unconscious humans, turning them into blob zombies."
analyzerdesceffect = "Produces spores when expanding and when killed."
color = "#E88D5D"
complementary_color = "#823ABB"
//toxin, hallucination, and some bonus spore toxin
/datum/reagent/blob/hallucinogenic_nectar
name = "Hallucinogenic Nectar"
id = "hallucinogenic_nectar"
description = "will do low toxin damage, vivid hallucinations, and inject targets with toxins."
analyzerdescdamage = "Does low toxin damage and injects a toxin that causes vivid hallucinations and blurried vision."
color = "#CD7794"
complementary_color = "#77CDB0"
blobbernaut_message = "splashes"
message = "The blob splashes you with sticky nectar"
message_living = ", and you feel really good"
/datum/reagent/blob/hallucinogenic_nectar/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.hallucination += reac_volume
M.adjust_drugginess(reac_volume)
if(M.reagents)
M.reagents.add_reagent("spore", 0.2*reac_volume)
M.apply_damage(0.5*reac_volume, TOX)
//kills sleeping targets and turns them into blob zombies
/datum/reagent/blob/zombifying_feelers
name = "Zombifying Feelers"
id = "zombifying_feelers"
description = "will do low toxin damage and turn sleeping targets into blob zombies."
analyzerdescdamage = "Does low toxin damage and kills unconscious humans, turning them into blob zombies."
color = "#828264"
complementary_color = "#646482"
message_living = ", and you feel tired"
/datum/reagent/blob/zombifying_pods/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
/datum/reagent/blob/zombifying_feelers/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.apply_damage(0.6*reac_volume, TOX)
if(O && ishuman(M) && M.stat == UNCONSCIOUS)
M.death() //sleeping in a fight? bad plan.
var/points = rand(5, 10)
var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(get_turf(M))
BS.overmind = O
BS.update_icons()
O.blob_mobs.Add(BS)
BS.Zombify(M)
O.add_points(points)
O << "<span class='notice'>Gained [points] resources from the zombification of [M].</span>"
if(M)
M.apply_damage(0.4*reac_volume, TOX)
/datum/reagent/blob/zombifying_pods/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore.
B.visible_message("<span class='warning'><b>A spore floats free of the blob!</b></span>")
var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc)
BS.overmind = B.overmind
BS.update_icons()
B.overmind.blob_mobs.Add(BS)
return ..()
//toxin, stamina, and some bonus spore toxin
/datum/reagent/blob/envenomed_filaments
name = "Envenomed Filaments"
id = "envenomed_filaments"
description = "will do medium toxin and stamina damage, and inject targets with toxins."
analyzerdescdamage = "Does medium toxin damage, drains stamina, and injects a weak toxin."
color = "#9ACD32"
complementary_color = "#6532CD"
message_living = ", and you feel sick and nauseated"
/datum/reagent/blob/zombifying_pods/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O)
if(prob(10))
var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(T)
BS.overmind = B.overmind
BS.update_icons()
newB.overmind.blob_mobs.Add(BS)
/datum/reagent/blob/envenomed_filaments/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
if(M.reagents)
M.reagents.add_reagent("spore", 0.2*reac_volume)
M.apply_damage(0.4*reac_volume, TOX)
if(M)
M.adjustStaminaLoss(0.4*reac_volume)
//does tons of oxygen damage and a little stamina, immune to tesla bolts, weak to EMP
/datum/reagent/blob/energized_jelly
name = "Energized Jelly"
id = "energized_jelly"
description = "will cause low stamina and high oxygen damage, and cause targets to be unable to breathe."
effectdesc = "will also conduct electricity, but takes damage from EMPs."
analyzerdescdamage = "Does low stamina damage, high oxygen damage, and prevents targets from breathing."
analyzerdesceffect = "Is immune to electricity and will easily conduct it, but is weak to EMPs."
color = "#EFD65A"
complementary_color = "#00E5B1"
message_living = ", and you feel a horrible tingling sensation"
var/datum/effect_system/spark_spread/spark_system = new/datum/effect_system/spark_spread()
//does brute, fire, and toxin over a few seconds
/datum/reagent/blob/poisonous_strands
name = "Poisonous Strands"
id = "poisonous_strands"
description = "will inject targets with poison."
analyzerdescdamage = "Injects a highly lethal poison that will gradually liquify the target's internal organs."
color = "#7D6EB4"
complementary_color = "#A5B46E"
blobbernaut_message = "injects"
message_living = ", and you feel like your insides are melting"
/datum/reagent/blob/energized_jelly/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
/datum/reagent/blob/poisonous_strands/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
if(M.reagents)
M.reagents.add_reagent("poisonous_strands", 0.12*reac_volume)
/datum/reagent/blob/poisonous_strands/on_mob_life(mob/living/M)
M.adjustBruteLoss(1.5*REM)
M.adjustFireLoss(1.5*REM)
M.adjustToxLoss(1.5*REM)
..()
//does oxygen damage, randomly pushes or pulls targets
/datum/reagent/blob/cyclonic_grid
name = "Cyclonic Grid"
id = "cyclonic_grid"
description = "will cause high oxygen damage and randomly throw targets to or from it."
analyzerdescdamage = "Does high oxygen damage and randomly throws targets at or away from it."
color = "#9BCD9B"
complementary_color = "#CD9BCD"
message = "The blob blasts you with a gust of air"
message_living = ", and you can't catch your breath"
/datum/reagent/blob/cyclonic_grid/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
reagent_vortex(M, rand(0, 1), reac_volume)
M.losebreath += round(0.05*reac_volume)
M.apply_damage(0.6*reac_volume, OXY)
//does tons of oxygen damage and a little brute
/datum/reagent/blob/lexorin_jelly
name = "Lexorin Jelly"
id = "lexorin_jelly"
description = "will cause low brute and high oxygen damage, and cause targets to be unable to breathe."
analyzerdescdamage = "Does low brute damage, high oxygen damage, and prevents targets from breathing."
color = "#00E5B1"
complementary_color = "#E50034"
message_living = ", and your lungs feel heavy and weak"
/datum/reagent/blob/lexorin_jelly/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.losebreath += round(0.2*reac_volume)
M.adjustStaminaLoss(0.4*reac_volume)
M.apply_damage(0.2*reac_volume, BRUTE)
if(M)
M.apply_damage(0.6*reac_volume, OXY)
/datum/reagent/blob/energized_jelly/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && B.obj_integrity - damage <= 0 && prob(10))
spark_system.set_up(rand(2, 4), 0, B)
spark_system.start()
return ..()
/datum/reagent/blob/energized_jelly/tesla_reaction(obj/structure/blob/B, power)
return 0
/datum/reagent/blob/energized_jelly/emp_reaction(obj/structure/blob/B, severity)
var/damage = rand(30, 50) - severity * rand(10, 15)
B.take_damage(damage, BURN, "energy")
//does aoe brute damage when hitting targets, is immune to explosions
/datum/reagent/blob/explosive_lattice
name = "Explosive Lattice"
id = "explosive_lattice"
description = "will do brute damage in an area around targets."
effectdesc = "will also resist explosions, but takes increased damage from fire and other energy sources."
description = "will do brute damage in an area around targets and is resistant to explosions."
shortdesc = "will do brute damage in an area around targets."
analyzerdescdamage = "Does medium brute damage and causes damage to everyone near its targets."
analyzerdesceffect = "Is highly resistant to explosions, but takes increased damage from fire and other energy sources."
analyzerdesceffect = "Is highly resistant to explosions."
color = "#8B2500"
complementary_color = "#00668B"
blobbernaut_message = "blasts"
message = "The blob blasts you"
/datum/reagent/blob/explosive_lattice/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
var/initial_volume = reac_volume
reac_volume = ..()
if(reac_volume >= 10) //if it's not a spore cloud, bad time incoming
var/obj/effect/overlay/temp/explosion/fast/E = PoolOrNew(/obj/effect/overlay/temp/explosion/fast, get_turf(M))
var/obj/effect/overlay/temp/explosion/E = PoolOrNew(/obj/effect/overlay/temp/explosion, get_turf(M))
E.alpha = 150
for(var/mob/living/L in orange(get_turf(M), 1))
for(var/mob/living/L in orange(M, 1))
if("blob" in L.faction) //no friendly fire
continue
var/aoe_volume = ..(L, TOUCH, initial_volume, 0, L.get_permeability_protection(), O)
L.apply_damage(0.4*aoe_volume, BRUTE)
L.apply_damage(0.6*reac_volume, BRUTE)
if(M)
M.apply_damage(0.6*reac_volume, BRUTE)
else
M.apply_damage(0.6*reac_volume, BRUTE)
M.apply_damage(0.8*reac_volume, BRUTE)
/datum/reagent/blob/explosive_lattice/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_flag == "bomb")
return 0
else if(damage_flag != "melee" || damage_flag != "bullet" || damage_flag != "laser")
return damage * 1.5
/datum/reagent/blob/explosive_lattice/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
if(isnull(cause))
if(damage_type == BRUTE)
return 0 //no-sell the explosion we do not take damage
if(damage_type == BURN)
return damage * 1.5 //take more from fire, tesla, and flashbangs
return ..()
//does brute, burn, and toxin damage, and cools targets down
/datum/reagent/blob/cryogenic_poison
name = "Cryogenic Poison"
id = "cryogenic_poison"
description = "will inject targets with a freezing poison that does high damage over time."
analyzerdescdamage = "Injects targets with a freezing poison that will gradually solidify the target's internal organs."
color = "#8BA6E9"
complementary_color = "#7D6EB4"
blobbernaut_message = "injects"
message = "The blob stabs you"
message_living = ", and you feel like your insides are solidifying"
//does semi-random brute damage and reacts to brute damage
/datum/reagent/blob/reactive_gelatin
name = "Reactive Gelatin"
id = "reactive_gelatin"
description = "will do random brute damage and react to brute damage."
shortdesc = "will do random brute damage."
analyzerdescdamage = "Does random brute damage."
analyzerdesceffect = "When attacked with brute damage, will lash out, attacking everything near it."
color = "#FFA500"
complementary_color = "#005AFF"
blobbernaut_message = "pummels"
message = "The blob pummels you"
/datum/reagent/blob/cryogenic_poison/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
/datum/reagent/blob/reactive_gelatin/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
var/damage = rand(5, 35)/25
M.apply_damage(damage*reac_volume, BRUTE)
/datum/reagent/blob/reactive_gelatin/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
if(damage && damage_type == BRUTE && original_health - damage > 0) //is there any damage, is it brute, and will we be alive
if(isliving(cause))
B.visible_message("<span class='warning'><b>The blob retaliates, lashing out!</b></span>")
for(var/atom/A in range(1, B))
A.blob_act(B)
return ..()
//does low burn damage and stamina damage and cools targets down
/datum/reagent/blob/cryogenic_liquid
name = "Cryogenic Liquid"
id = "cryogenic_liquid"
description = "will do low burn and stamina damage, and cause targets to freeze."
analyzerdescdamage = "Does low burn damage, drains stamina, and injects targets with a freezing liquid."
color = "#8BA6E9"
complementary_color = "#E9CE8B"
blobbernaut_message = "splashes"
message = "The blob splashes you with an icy liquid"
message_living = ", and you feel cold and tired"
/datum/reagent/blob/cryogenic_liquid/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
if(M.reagents)
M.reagents.add_reagent("frostoil", 0.3*reac_volume)
M.reagents.add_reagent("ice", 0.3*reac_volume)
M.reagents.add_reagent("cryogenic_poison", 0.3*reac_volume)
M.apply_damage(0.2*reac_volume, BRUTE)
/datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/M)
M.adjustBruteLoss(0.3*REM, 0)
M.adjustFireLoss(0.3*REM, 0)
M.adjustToxLoss(0.3*REM, 0)
. = 1
..()
M.apply_damage(0.4*reac_volume, BURN)
if(M)
M.adjustStaminaLoss(0.3*reac_volume)
//does burn damage and EMPs, slightly fragile
/datum/reagent/blob/electromagnetic_web
name = "Electromagnetic Web"
id = "electromagnetic_web"
description = "will do high burn damage and EMP targets."
effectdesc = "will also take massively increased damage and release an EMP when killed."
description = "will do low burn damage and EMP targets, but is very fragile."
shortdesc = "will do low burn damage and EMP targets."
analyzerdescdamage = "Does low burn damage and EMPs targets."
analyzerdesceffect = "Is fragile to all types of damage, but takes massive damage from brute. In addition, releases a small EMP when killed."
color = "#83ECEC"
@@ -364,9 +459,9 @@
if(prob(reac_volume*2))
M.emp_act(2)
if(M)
M.apply_damage(reac_volume, BURN)
M.apply_damage(0.6*reac_volume, BURN)
/datum/reagent/blob/electromagnetic_web/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
/datum/reagent/blob/electromagnetic_web/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
if(damage_type == BRUTE) //take full brute
switch(B.brute_resist)
if(0.5)
@@ -377,16 +472,16 @@
return damage * 10
return damage * 1.25 //a laser will do 25 damage, which will kill any normal blob
/datum/reagent/blob/electromagnetic_web/death_reaction(obj/structure/blob/B, damage_flag)
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser")
/datum/reagent/blob/electromagnetic_web/death_reaction(obj/effect/blob/B, cause)
if(cause)
empulse(B.loc, 1, 3) //less than screen range, so you can stand out of range to avoid it
//does brute damage, bonus damage for each nearby blob, and spreads damage out
/datum/reagent/blob/synchronous_mesh
name = "Synchronous Mesh"
id = "synchronous_mesh"
description = "will do massively increased brute damage for each blob near the target."
effectdesc = "will also spread damage between each blob near the attacked blob."
description = "will do brute damage for each nearby blob and spread damage between nearby blobs."
shortdesc = "will do brute damage for each nearby blob."
analyzerdescdamage = "Does brute damage, increasing for each blob near the target."
analyzerdesceffect = "When attacked, spreads damage between all blobs near the attacked blob."
color = "#65ADA2"
@@ -396,58 +491,68 @@
/datum/reagent/blob/synchronous_mesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
M.apply_damage(0.2*reac_volume, BRUTE)
M.apply_damage(0.1*reac_volume, BRUTE)
if(M && reac_volume)
for(var/obj/structure/blob/B in range(1, M)) //if the target is completely surrounded, this is 2.4*reac_volume bonus damage, total of 2.6*reac_volume
for(var/obj/effect/blob/B in range(1, M)) //if the target is completely surrounded, this is 2.4*reac_volume bonus damage, total of 2.5*reac_volume
if(M)
B.blob_attack_animation(M) //show them they're getting a bad time
M.apply_damage(0.3*reac_volume, BRUTE)
/datum/reagent/blob/synchronous_mesh/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") //the cause isn't fire or bombs, so split the damage
/datum/reagent/blob/synchronous_mesh/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
if(!isnull(cause)) //the cause isn't fire or bombs, so split the damage
var/damagesplit = 1 //maximum split is 9, reducing the damage each blob takes to 11% but doing that damage to 9 blobs
for(var/obj/structure/blob/C in orange(1, B))
if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id) //if it doesn't have the same chemical or is a core or node, don't split damage to it
for(var/obj/effect/blob/C in orange(1, B))
if(!istype(C, /obj/effect/blob/core) && !istype(C, /obj/effect/blob/node) && C.overmind && C.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id) //if it doesn't have the same chemical or is a core or node, don't split damage to it
damagesplit += 1
for(var/obj/structure/blob/C in orange(1, B))
if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id) //only hurt blobs that have the same overmind chemical and aren't cores or nodes
C.take_damage(damage/damagesplit, CLONE, 0, 0)
for(var/obj/effect/blob/C in orange(1, B))
if(!istype(C, /obj/effect/blob/core) && !istype(C, /obj/effect/blob/node) && C.overmind && C.overmind.blob_reagent_datum.id == B.overmind.blob_reagent_datum.id) //only hurt blobs that have the same overmind chemical and aren't cores or nodes
C.take_damage(damage/damagesplit, CLONE, B, 0)
return damage / damagesplit
else
return damage * 1.25
//does brute damage through armor and bio resistance
/datum/reagent/blob/reactive_spines
name = "Reactive Spines"
id = "reactive_spines"
/datum/reagent/blob/penetrating_spines
name = "Penetrating Spines"
id = "penetrating_spines"
description = "will do medium brute damage through armor and bio resistance."
effectdesc = "will also react when attacked with brute damage, attacking all near the attacked blob."
analyzerdescdamage = "Does medium brute damage, ignoring armor and bio resistance."
analyzerdesceffect = "When attacked with brute damage, will lash out, attacking everything near it."
color = "#9ACD32"
complementary_color = "#FFA500"
color = "#6E4664"
complementary_color = "#466E50"
blobbernaut_message = "stabs"
message = "The blob stabs you"
/datum/reagent/blob/reactive_spines/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
/datum/reagent/blob/penetrating_spines/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
if(M.stat == DEAD || istype(M, /mob/living/simple_animal/hostile/blob))
return 0 //the dead, and blob mobs, don't cause reactions
M.adjustBruteLoss(0.8*reac_volume)
M.adjustBruteLoss(0.7*reac_volume)
/datum/reagent/blob/reactive_spines/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if(damage && damage_type == BRUTE && B.obj_integrity - damage > 0) //is there any damage, is it brute, and will we be alive
if(damage_flag == "melee")
B.visible_message("<span class='boldwarning'>The blob retaliates, lashing out!</span>")
for(var/atom/A in range(1, B))
A.blob_act(B)
return ..()
/datum/reagent/blob/adaptive_nexuses
name = "Adaptive Nexuses"
id = "adaptive_nexuses"
description = "will do medium brute damage and kill unconscious targets, giving you bonus resources."
shortdesc = "will do medium brute damage and kill unconscious targets, giving your overmind bonus resources."
analyzerdescdamage = "Does medium brute damage and kills unconscious humans, reaping resources from them."
color = "#4A64C0"
complementary_color = "#823ABB"
/datum/reagent/blob/adaptive_nexuses/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
if(O && ishuman(M) && M.stat == UNCONSCIOUS)
PoolOrNew(/obj/effect/overlay/temp/revenant, get_turf(M))
var/points = rand(5, 10)
O.add_points(points)
O << "<span class='notice'>Gained [points] resources from the death of [M].</span>"
M.death()
if(M)
M.apply_damage(0.5*reac_volume, BRUTE)
//does low brute damage, oxygen damage, and stamina damage and wets tiles when damaged
/datum/reagent/blob/pressurized_slime
name = "Pressurized Slime"
id = "pressurized_slime"
description = "will do low brute, oxygen, and stamina damage, and wet tiles under targets."
effectdesc = "will also wet tiles near blobs that are attacked or killed."
description = "will do low brute, oxygen, and stamina damage, and wet tiles when damaged or killed."
shortdesc = "will do low brute, oxygen, and stamina damage, and wet tiles under targets."
analyzerdescdamage = "Does low brute damage, low oxygen damage, drains stamina, and wets tiles under targets, extinguishing them."
analyzerdesceffect = "When attacked or killed, wets nearby tiles, extinguishing anything on them."
color = "#AAAABB"
@@ -463,23 +568,22 @@
T.MakeSlippery(min_wet_time = 10, wet_time_to_add = 5)
M.adjust_fire_stacks(-(reac_volume / 10))
M.ExtinguishMob()
M.apply_damage(0.4*reac_volume, BRUTE)
M.apply_damage(0.1*reac_volume, BRUTE)
if(M)
M.apply_damage(0.4*reac_volume, OXY)
M.apply_damage(0.3*reac_volume, OXY)
if(M)
M.adjustStaminaLoss(0.2*reac_volume)
M.adjustStaminaLoss(0.3*reac_volume)
/datum/reagent/blob/pressurized_slime/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") || damage_type != BURN)
extinguisharea(B, damage)
/datum/reagent/blob/pressurized_slime/damage_reaction(obj/effect/blob/B, original_health, damage, damage_type, cause)
extinguisharea(B, damage)
return ..()
/datum/reagent/blob/pressurized_slime/death_reaction(obj/structure/blob/B, damage_flag)
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser")
B.visible_message("<span class='boldwarning'>The blob ruptures, spraying the area with liquid!</span>")
extinguisharea(B, 50)
/datum/reagent/blob/pressurized_slime/death_reaction(obj/effect/blob/B, cause)
if(!isnull(cause))
B.visible_message("<span class='warning'><b>The blob ruptures, spraying the area with liquid!</b></span>")
extinguisharea(B, 50)
/datum/reagent/blob/pressurized_slime/proc/extinguisharea(obj/structure/blob/B, probchance)
/datum/reagent/blob/pressurized_slime/proc/extinguisharea(obj/effect/blob/B, probchance)
for(var/turf/open/T in range(1, B))
if(prob(probchance))
T.MakeSlippery(min_wet_time = 10, wet_time_to_add = 5)
@@ -488,3 +592,75 @@
for(var/mob/living/L in T)
L.adjust_fire_stacks(-2.5)
L.ExtinguishMob()
//does brute damage and throws or pulls nearby objects at the target
/datum/reagent/blob/dark_matter
name = "Dark Matter"
id = "dark_matter"
description = "will do medium brute damage and pull nearby objects and enemies at the target."
analyzerdescdamage = "Does medium brute damage and pulls nearby objects and creatures at the target."
color = "#61407E"
complementary_color = "#5D7E40"
message = "You feel a thrum as the blob strikes you, and everything flies at you"
/datum/reagent/blob/dark_matter/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
reagent_vortex(M, 0, reac_volume)
M.apply_damage(0.3*reac_volume, BRUTE)
//does brute damage and throws or pushes nearby objects away from the target
/datum/reagent/blob/b_sorium
name = "Sorium"
id = "b_sorium"
description = "will do medium brute damage and throw nearby objects and enemies away from the target."
analyzerdescdamage = "Does medium brute damage and pushes nearby objects and creatures away from the target."
color = "#808000"
complementary_color = "#000080"
message = "The blob slams into you and sends you flying"
/datum/reagent/blob/b_sorium/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
reac_volume = ..()
reagent_vortex(M, 1, reac_volume)
M.apply_damage(0.3*reac_volume, BRUTE)
/datum/reagent/blob/proc/reagent_vortex(mob/living/M, setting_type, reac_volume)
if(M && reac_volume)
var/turf/pull = get_turf(M)
var/range_power = Clamp(round(reac_volume/5, 1), 1, 5)
for(var/atom/movable/X in range(range_power,pull))
if(istype(X, /obj/effect))
continue
if(isliving(X))
var/mob/living/L = X
if("blob" in L.faction) //no friendly throwpulling
continue
if(!X.anchored)
var/distance = get_dist(X, pull)
var/moving_power = max(range_power - distance, 1)
if(moving_power > 2) //if the vortex is powerful and we're close, we get thrown
if(setting_type)
var/atom/throw_target = get_edge_target_turf(X, get_dir(X, get_step_away(X, pull)))
var/throw_range = 5 - distance
X.throw_at_fast(throw_target, throw_range, 1)
else
X.throw_at_fast(pull, distance, 1)
else
spawn(0)
if(setting_type)
for(var/i in 0 to moving_power-1)
sleep(2)
if(!step_away(X, pull))
break
else
for(var/i in 0 to moving_power-1)
sleep(2)
if(!step_towards(X, pull))
break
/datum/reagent/blob/proc/send_message(mob/living/M)
var/totalmessage = message
if(message_living && !issilicon(M))
totalmessage += message_living
totalmessage += "!"
M << "<span class='userdanger'>[totalmessage]</span>"
@@ -5,7 +5,7 @@
/////////////////////////////////////////////////////////////////////////////////////////////////////////
/datum/reagent/consumable/orangejuice
name = "Orange Juice"
name = "Orange juice"
id = "orangejuice"
description = "Both delicious AND rich in Vitamin C, what more do you need?"
color = "#E78108" // rgb: 231, 129, 8
@@ -24,7 +24,7 @@
/datum/reagent/consumable/tomatojuice/on_mob_life(mob/living/M)
if(M.getFireLoss() && prob(20))
M.heal_bodypart_damage(0,1, 0)
M.heal_organ_damage(0,1, 0)
. = 1
..()
@@ -41,7 +41,7 @@
..()
/datum/reagent/consumable/carrotjuice
name = "Carrot Juice"
name = "Carrot juice"
id = "carrotjuice"
description = "It is just like a carrot but without crunching."
color = "#973800" // rgb: 151, 56, 0
@@ -64,12 +64,6 @@
description = "A delicious blend of several different kinds of berries."
color = "#863333" // rgb: 134, 51, 51
/datum/reagent/consumable/applejuice
name = "Apple Juice"
id = "applejuice"
description = "The sweet juice of an apple, fit for all ages."
color = "#ECFF56" // rgb: 236, 255, 86
/datum/reagent/consumable/poisonberryjuice
name = "Poison Berry Juice"
id = "poisonberryjuice"
@@ -100,8 +94,8 @@
color = "#863333" // rgb: 175, 175, 0
/datum/reagent/consumable/banana/on_mob_life(mob/living/M)
if((ishuman(M) && M.job in list("Clown") ) || ismonkey(M))
M.heal_bodypart_damage(1,1, 0)
if( ( istype(M, /mob/living/carbon/human) && M.job in list("Clown") ) || istype(M, /mob/living/carbon/monkey) )
M.heal_organ_damage(1,1, 0)
. = 1
..()
@@ -111,35 +105,11 @@
description = "Absolutely nothing."
/datum/reagent/consumable/nothing/on_mob_life(mob/living/M)
if(ishuman(M) && M.job in list("Mime"))
M.heal_bodypart_damage(1,1, 0)
if(istype(M, /mob/living/carbon/human) && M.job in list("Mime"))
M.heal_organ_damage(1,1, 0)
. = 1
..()
/datum/reagent/consumable/laughter
name = "Laughter"
id = "laughter"
description = "Some say that this is the best medicine, but recent studies have proven that to be untrue."
metabolization_rate = INFINITY
color = "#FF4DD2"
/datum/reagent/consumable/laughter/on_mob_life(mob/living/carbon/M)
if(!iscarbon(M))
return
if(!M.silent)//cant laugh if you're mute
M.emote("laugh")
var/laughnum = rand(1,2)
if(M.gender == MALE)
if(laughnum == 1)
playsound(get_turf(M), 'sound/voice/human/manlaugh1.ogg', 50, 1)
if(laughnum == 2)
playsound(get_turf(M), 'sound/voice/human/manlaugh2.ogg', 50, 1)
else if(M.gender == FEMALE)
playsound(get_turf(M), 'sound/voice/human/womanlaugh.ogg', 65, 1)
else//non-binary gender just sounds like a man
playsound(get_turf(M), 'sound/voice/human/manlaugh1.ogg', 50, 1)
..()
/datum/reagent/consumable/potato_juice
name = "Potato Juice"
id = "potato"
@@ -148,7 +118,7 @@
color = "#302000" // rgb: 48, 32, 0
/datum/reagent/consumable/grapejuice
name = "Grape Juice"
name = "Grape juice"
id = "grapejuice"
description = "The juice of a bunch of grapes. Guaranteed non-alcoholic."
color = "#290029" // dark purple
@@ -161,13 +131,13 @@
/datum/reagent/consumable/milk/on_mob_life(mob/living/M)
if(M.getBruteLoss() && prob(20))
M.heal_bodypart_damage(1,0, 0)
M.heal_organ_damage(1,0, 0)
. = 1
if(holder.has_reagent("capsaicin"))
holder.remove_reagent("capsaicin", 2)
var/datum/dna/Mdna = M.has_dna()
if(Mdna && Mdna.species && (Mdna.species.id == "plasmaman" || Mdna.species.id == "skeleton"))
M.heal_bodypart_damage(1,0, 0)
M.heal_organ_damage(1,0, 0)
. = 1
..()
@@ -179,7 +149,7 @@
/datum/reagent/consumable/soymilk/on_mob_life(mob/living/M)
if(M.getBruteLoss() && prob(20))
M.heal_bodypart_damage(1,0, 0)
M.heal_organ_damage(1,0, 0)
. = 1
..()
@@ -191,7 +161,7 @@
/datum/reagent/consumable/cream/on_mob_life(mob/living/M)
if(M.getBruteLoss() && prob(20))
M.heal_bodypart_damage(1,0, 0)
M.heal_organ_damage(1,0, 0)
. = 1
..()
@@ -270,7 +240,7 @@
/datum/reagent/consumable/icetea
name = "Iced Tea"
id = "icetea"
description = "No relation to a certain rap artist/actor."
description = "No relation to a certain rap artist/ actor."
color = "#104038" // rgb: 16, 64, 56
nutriment_factor = 0
@@ -417,7 +387,7 @@
M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
M.Jitter(5)
if(M.getBruteLoss() && prob(20))
M.heal_bodypart_damage(1,0, 0)
M.heal_organ_damage(1,0, 0)
..()
. = 1
@@ -435,7 +405,7 @@
M.bodytemperature = min(310, M.bodytemperature + (5 * TEMPERATURE_DAMAGE_COEFFICIENT))
M.Jitter(5)
if(M.getBruteLoss() && prob(20))
M.heal_bodypart_damage(1,0, 0)
M.heal_organ_damage(1,0, 0)
..()
. = 1
@@ -522,8 +492,115 @@
description = "Beloved of children and teetotalers."
color = "#E6CDFF"
/datum/reagent/consumable/milk/chocolate_milk
name = "Chocolate Milk"
id = "chocolate_milk"
description = "Milk for cool kids."
color = "#7D4E29"
//////////////////////////////////////////////The ten friggen million reagents that get you drunk//////////////////////////////////////////////
/datum/reagent/consumable/atomicbomb
name = "Atomic Bomb"
id = "atomicbomb"
description = "Nuclear proliferation never tasted so good."
color = "#666300" // rgb: 102, 99, 0
/datum/reagent/consumable/atomicbomb/on_mob_life(mob/living/M)
M.set_drugginess(50)
M.confused = max(M.confused+2,0)
M.Dizzy(10)
if (!M.slurring)
M.slurring = 1
M.slurring += 3
switch(current_cycle)
if(51 to 200)
M.Sleeping(5, 0)
. = 1
if(201 to INFINITY)
M.AdjustSleeping(2, 0)
M.adjustToxLoss(2, 0)
. = 1
..()
/datum/reagent/consumable/gargle_blaster
name = "Pan-Galactic Gargle Blaster"
id = "gargleblaster"
description = "Whoah, this stuff looks volatile!"
color = "#664300" // rgb: 102, 67, 0
/datum/reagent/consumable/gargle_blaster/on_mob_life(mob/living/M)
M.dizziness +=6
switch(current_cycle)
if(15 to 45)
if(!M.slurring)
M.slurring = 1
M.slurring += 3
if(45 to 55)
if(prob(50))
M.confused = max(M.confused+3,0)
if(55 to 200)
M.set_drugginess(55)
if(200 to INFINITY)
M.adjustToxLoss(2, 0)
. = 1
..()
/datum/reagent/consumable/neurotoxin
name = "Neurotoxin"
id = "neurotoxin"
description = "A strong neurotoxin that puts the subject into a death-like state."
color = "#2E2E61" // rgb: 46, 46, 97
/datum/reagent/consumable/neurotoxin/on_mob_life(mob/living/carbon/M)
M.Weaken(3, 1, 0)
M.dizziness +=6
switch(current_cycle)
if(15 to 45)
if(!M.slurring)
M.slurring = 1
M.slurring += 3
if(45 to 55)
if(prob(50))
M.confused = max(M.confused+3,0)
if(55 to 200)
M.set_drugginess(55)
if(200 to INFINITY)
M.adjustToxLoss(2, 0)
..()
. = 1
/datum/reagent/consumable/hippies_delight
name = "Hippie's Delight"
id = "hippiesdelight"
description = "You just don't get it maaaan."
color = "#664300" // rgb: 102, 67, 0
nutriment_factor = 0
metabolization_rate = 0.2 * REAGENTS_METABOLISM
/datum/reagent/consumable/hippies_delight/on_mob_life(mob/living/M)
if (!M.slurring)
M.slurring = 1
switch(current_cycle)
if(1 to 5)
M.Dizzy(10)
M.set_drugginess(30)
if(prob(10))
M.emote(pick("twitch","giggle"))
if(5 to 10)
M.Jitter(20)
M.Dizzy(20)
M.set_drugginess(45)
if(prob(20))
M.emote(pick("twitch","giggle"))
if (10 to 200)
M.Jitter(40)
M.Dizzy(40)
M.set_drugginess(60)
if(prob(30))
M.emote(pick("twitch","giggle"))
if(200 to INFINITY)
M.Jitter(60)
M.Dizzy(60)
M.set_drugginess(75)
if(prob(40))
M.emote(pick("twitch","giggle"))
if(prob(30))
M.adjustToxLoss(2, 0)
. = 1
..()
@@ -12,7 +12,7 @@
/datum/reagent/drug/space_drugs/on_mob_life(mob/living/M)
M.set_drugginess(15)
if(isturf(M.loc) && !isspaceturf(M.loc))
if(isturf(M.loc) && !istype(M.loc, /turf/open/space))
if(M.canmove)
if(prob(10)) step(M, pick(cardinal))
if(prob(7))
@@ -40,9 +40,7 @@
if(prob(1))
var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.")
M << "<span class='notice'>[smoke_message]</span>"
M.AdjustParalysis(-1, 0)
M.AdjustStunned(-1, 0)
M.AdjustWeakened(-1, 0)
M.adjustStaminaLoss(-0.5*REM, 0)
..()
. = 1
@@ -173,13 +171,13 @@
/datum/reagent/drug/methamphetamine/overdose_process(mob/living/M)
if(M.canmove && !istype(M.loc, /atom/movable))
for(var/i in 1 to 4)
for(var/i = 0, i < 4, i++)
step(M, pick(cardinal))
if(prob(20))
M.emote("laugh")
if(prob(33))
M.visible_message("<span class='danger'>[M]'s hands flip out and flail everywhere!</span>")
var/obj/item/I = M.get_active_held_item()
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
..()
@@ -252,12 +250,12 @@
/datum/reagent/drug/bath_salts/overdose_process(mob/living/M)
M.hallucination += 10
if(M.canmove && !istype(M.loc, /atom/movable))
for(var/i in 1 to 8)
for(var/i = 0, i < 8, i++)
step(M, pick(cardinal))
if(prob(20))
M.emote(pick("twitch","drool","moan"))
if(prob(33))
var/obj/item/I = M.get_active_held_item()
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
..()
@@ -27,7 +27,7 @@
/datum/reagent/consumable/nutriment/on_mob_life(mob/living/M)
if(prob(50))
M.heal_bodypart_damage(1,0, 0)
M.heal_organ_damage(1,0, 0)
. = 1
if(iscarbon(M))
var/mob/living/carbon/C = M
@@ -44,7 +44,7 @@
/datum/reagent/consumable/vitamin/on_mob_life(mob/living/M)
if(prob(50))
M.heal_bodypart_damage(1,1, 0)
M.heal_organ_damage(1,1, 0)
. = 1
if(M.satiety < 600)
M.satiety += 30
@@ -161,7 +161,7 @@
for(var/mob/living/simple_animal/slime/M in T)
M.adjustToxLoss(rand(15,30))
if(reac_volume >= 1) // Make Freezy Foam and anti-fire grenades!
if(isopenturf(T))
if(istype(T, /turf/open))
var/turf/open/OT = T
OT.MakeSlippery(wet_setting=TURF_WET_ICE, min_wet_time=10, wet_time_to_add=reac_volume) // Is less effective in high pressure/high heat capacity environments. More effective in low pressure.
OT.air.temperature -= MOLES_CELLSTANDARD*100*reac_volume/OT.air.heat_capacity() // reduces environment temperature by 5K per unit.
@@ -173,7 +173,7 @@
color = "#B31008" // rgb: 179, 16, 8
/datum/reagent/consumable/condensedcapsaicin/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(!ishuman(M) && !ismonkey(M))
if(!istype(M, /mob/living/carbon/human) && !istype(M, /mob/living/carbon/monkey))
return
var/mob/living/carbon/victim = M
@@ -193,7 +193,7 @@
safe_thing = victim.wear_mask
//only humans can have helmets and glasses
if(ishuman(victim))
if(istype(victim, /mob/living/carbon/human))
var/mob/living/carbon/human/H = victim
if( H.head )
if ( H.head.flags_cover & MASKCOVERSEYES )
@@ -324,8 +324,8 @@
color = "#FF00FF" // rgb: 255, 0, 255
/datum/reagent/consumable/sprinkles/on_mob_life(mob/living/M)
if(ishuman(M) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden"))
M.heal_bodypart_damage(1,1, 0)
if(istype(M, /mob/living/carbon/human) && M.job in list("Security Officer", "Head of Security", "Detective", "Warden"))
M.heal_organ_damage(1,1, 0)
. = 1
..()
@@ -392,7 +392,7 @@
color = "#FFFFFF" // rgb: 0, 0, 0
/datum/reagent/consumable/flour/reaction_turf(turf/T, reac_volume)
if(!isspaceturf(T))
if(!istype(T, /turf/open/space))
var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/flour(T)
reagentdecal.reagents.add_reagent("flour", reac_volume)
@@ -457,53 +457,5 @@
/datum/reagent/consumable/honey/on_mob_life(mob/living/M)
M.reagents.add_reagent("sugar",3)
if(prob(20))
M.heal_bodypart_damage(3,1)
M.heal_organ_damage(3,1)
..()
////Lavaland Flora Reagents////
/datum/reagent/consumable/entpoly
name = "Entropic Polypnium"
id = "entpoly"
description = "An ichor, derived from a certain mushroom, makes for a bad time."
color = "#1d043d"
/datum/reagent/consumable/entpoly/on_mob_life(mob/living/M)
if(current_cycle >= 10)
M.Paralyse(2, 0)
. = 1
if(prob(20))
M.losebreath += 4
M.adjustBrainLoss(2*REM)
M.adjustToxLoss(3*REM,0)
M.adjustStaminaLoss(10*REM,0)
M.blur_eyes(5)
. = TRUE
..()
/datum/reagent/consumable/tinlux
name = "Tinea Luxor"
id = "tinlux"
description = "A stimulating ichor which causes luminescent fungi to grow on the skin. "
color = "#b5a213"
/datum/reagent/consumable/tinlux/reaction_mob(mob/living/M)
M.AddLuminosity(2)
/datum/reagent/consumable/tinlux/on_mob_delete(mob/living/M)
M.AddLuminosity(-2)
/datum/reagent/consumable/vitfro
name = "Vitrium Froth"
id = "vitfro"
description = "A bubbly paste that heals wounds of the skin."
color = "#d3a308"
nutriment_factor = 3 * REAGENTS_METABOLISM
/datum/reagent/consumable/vitfro/on_mob_life(mob/living/M)
if(prob(80))
M.adjustBruteLoss(-1*REM, 0)
M.adjustFireLoss(-1*REM, 0)
. = TRUE
..()
@@ -31,14 +31,13 @@
id = "adminordrazine"
description = "It's magic. We don't have to explain it."
color = "#C8A5DC" // rgb: 200, 165, 220
can_synth = 0
/datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/M)
M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1)
M.setCloneLoss(0, 0)
M.setOxyLoss(0, 0)
M.radiation = 0
M.heal_bodypart_damage(5,5, 0)
M.heal_organ_damage(5,5, 0)
M.adjustToxLoss(-5, 0)
M.hallucination = 0
M.setBrainLoss(0)
@@ -163,7 +162,7 @@
/datum/reagent/medicine/rezadone/on_mob_life(mob/living/M)
M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that.
M.heal_bodypart_damage(1,1, 0)
M.heal_organ_damage(1,1, 0)
M.status_flags &= ~DISFIGURED
..()
. = 1
@@ -275,7 +274,7 @@
/datum/reagent/medicine/salglu_solution/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
if(ishuman(M) && method == INJECT)
var/mob/living/carbon/human/H = M
if(H.dna && !(NOBLOOD in H.dna.species.species_traits))
if(H.dna && !(NOBLOOD in H.dna.species.specflags))
var/efficiency = (BLOOD_VOLUME_NORMAL-H.blood_volume)/700 + 0.2//The lower the blood of the patient, the better it is as a blood substitute.
efficiency = min(0.75,efficiency)
//As it's designed for an IV drip, make large injections not as effective as repeated small injections.
@@ -307,12 +306,6 @@
if(show_message)
M << "<span class='warning'>Your stomach agonizingly cramps!</span>"
else
var/mob/living/carbon/C = M
for(var/s in C.surgeries)
var/datum/surgery/S = s
S.success_multiplier = max(0.10, S.success_multiplier)
// +10% success propability on each step, useful while operating in less-than-perfect conditions
if(show_message)
M << "<span class='danger'>You feel your wounds fade away to nothing!</span>" //It's a painkiller, after all
..()
@@ -331,9 +324,7 @@
color = "#FFEBEB"
/datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1)
if(iscarbon(M))
if (M.stat == DEAD)
show_message = 0
if(iscarbon(M) && M.stat != DEAD)
if(method in list(PATCH, TOUCH))
M.adjustBruteLoss(-1.25 * reac_volume)
M.adjustFireLoss(-1.25 * reac_volume)
@@ -581,7 +572,7 @@
/datum/reagent/medicine/morphine/overdose_process(mob/living/M)
if(prob(33))
var/obj/item/I = M.get_active_held_item()
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
M.Dizzy(2)
@@ -590,7 +581,7 @@
/datum/reagent/medicine/morphine/addiction_act_stage1(mob/living/M)
if(prob(33))
var/obj/item/I = M.get_active_held_item()
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
M.Dizzy(2)
@@ -599,7 +590,7 @@
/datum/reagent/medicine/morphine/addiction_act_stage2(mob/living/M)
if(prob(33))
var/obj/item/I = M.get_active_held_item()
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
M.adjustToxLoss(1*REM, 0)
@@ -610,7 +601,7 @@
/datum/reagent/medicine/morphine/addiction_act_stage3(mob/living/M)
if(prob(33))
var/obj/item/I = M.get_active_held_item()
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
M.adjustToxLoss(2*REM, 0)
@@ -621,7 +612,7 @@
/datum/reagent/medicine/morphine/addiction_act_stage4(mob/living/M)
if(prob(33))
var/obj/item/I = M.get_active_held_item()
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
M.adjustToxLoss(3*REM, 0)
@@ -883,7 +874,7 @@
..()
//Trek Chems, used primarily by medibots. Only heals a specific damage type, but is very efficient.
/datum/reagent/medicine/bicaridine
datum/reagent/medicine/bicaridine
name = "Bicaridine"
id = "bicaridine"
description = "Restores bruising. Overdose causes it instead."
@@ -891,17 +882,17 @@
color = "#C8A5DC"
overdose_threshold = 30
/datum/reagent/medicine/bicaridine/on_mob_life(mob/living/M)
datum/reagent/medicine/bicaridine/on_mob_life(mob/living/M)
M.adjustBruteLoss(-2*REM, 0)
..()
. = 1
/datum/reagent/medicine/bicaridine/overdose_process(mob/living/M)
datum/reagent/medicine/bicaridine/overdose_process(mob/living/M)
M.adjustBruteLoss(4*REM, 0)
..()
. = 1
/datum/reagent/medicine/dexalin
datum/reagent/medicine/dexalin
name = "Dexalin"
id = "dexalin"
description = "Restores oxygen loss. Overdose causes it instead."
@@ -909,17 +900,17 @@
color = "#C8A5DC"
overdose_threshold = 30
/datum/reagent/medicine/dexalin/on_mob_life(mob/living/M)
datum/reagent/medicine/dexalin/on_mob_life(mob/living/M)
M.adjustOxyLoss(-2*REM, 0)
..()
. = 1
/datum/reagent/medicine/dexalin/overdose_process(mob/living/M)
datum/reagent/medicine/dexalin/overdose_process(mob/living/M)
M.adjustOxyLoss(4*REM, 0)
..()
. = 1
/datum/reagent/medicine/kelotane
datum/reagent/medicine/kelotane
name = "Kelotane"
id = "kelotane"
description = "Restores fire damage. Overdose causes it instead."
@@ -927,17 +918,17 @@
color = "#C8A5DC"
overdose_threshold = 30
/datum/reagent/medicine/kelotane/on_mob_life(mob/living/M)
datum/reagent/medicine/kelotane/on_mob_life(mob/living/M)
M.adjustFireLoss(-2*REM, 0)
..()
. = 1
/datum/reagent/medicine/kelotane/overdose_process(mob/living/M)
datum/reagent/medicine/kelotane/overdose_process(mob/living/M)
M.adjustFireLoss(4*REM, 0)
..()
. = 1
/datum/reagent/medicine/antitoxin
datum/reagent/medicine/antitoxin
name = "Anti-Toxin"
id = "antitoxin"
description = "Heals toxin damage and removes toxins in the bloodstream. Overdose causes toxin damage."
@@ -945,7 +936,7 @@
color = "#C8A5DC"
overdose_threshold = 30
/datum/reagent/medicine/antitoxin/on_mob_life(mob/living/M)
datum/reagent/medicine/antitoxin/on_mob_life(mob/living/M)
M.adjustToxLoss(-2*REM, 0)
for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
if(R != src)
@@ -953,24 +944,24 @@
..()
. = 1
/datum/reagent/medicine/antitoxin/overdose_process(mob/living/M)
datum/reagent/medicine/antitoxin/overdose_process(mob/living/M)
M.adjustToxLoss(4*REM, 0) // End result is 2 toxin loss taken, because it heals 2 and then removes 4.
..()
. = 1
/datum/reagent/medicine/inaprovaline
datum/reagent/medicine/inaprovaline
name = "Inaprovaline"
id = "inaprovaline"
description = "Stabilizes the breathing of patients. Good for those in critical condition."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/reagent/medicine/inaprovaline/on_mob_life(mob/living/M)
datum/reagent/medicine/inaprovaline/on_mob_life(mob/living/M)
if(M.losebreath >= 5)
M.losebreath -= 5
..()
/datum/reagent/medicine/tricordrazine
datum/reagent/medicine/tricordrazine
name = "Tricordrazine"
id = "tricordrazine"
description = "Has a high chance to heal all types of damage. Overdose instead causes it."
@@ -978,7 +969,7 @@
color = "#C8A5DC"
overdose_threshold = 30
/datum/reagent/medicine/tricordrazine/on_mob_life(mob/living/M)
datum/reagent/medicine/tricordrazine/on_mob_life(mob/living/M)
if(prob(80))
M.adjustBruteLoss(-1*REM, 0)
M.adjustFireLoss(-1*REM, 0)
@@ -987,7 +978,7 @@
. = 1
..()
/datum/reagent/medicine/tricordrazine/overdose_process(mob/living/M)
datum/reagent/medicine/tricordrazine/overdose_process(mob/living/M)
M.adjustToxLoss(2*REM, 0)
M.adjustOxyLoss(2*REM, 0)
M.adjustBruteLoss(2*REM, 0)
@@ -995,14 +986,14 @@
..()
. = 1
/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs
datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs
name = "Restorative Nanites"
id = "syndicate_nanites"
description = "Miniature medical robots that swiftly restore bodily damage."
reagent_state = SOLID
color = "#555555"
/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/M)
datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/M)
M.adjustBruteLoss(-5*REM, 0) //A ton of healing - this is a 50 telecrystal investment.
M.adjustFireLoss(-5*REM, 0)
M.adjustOxyLoss(-15, 0)
@@ -1060,26 +1051,6 @@
..()
. = 1
/datum/reagent/medicine/miningnanites
name = "Nanites"
id = "miningnanites"
description = "It's mining magic. We don't have to explain it."
color = "#C8A5DC" // rgb: 200, 165, 220
overdose_threshold = 3 //To prevent people stacking massive amounts of a very strong healing reagent
can_synth = 0
/datum/reagent/medicine/miningnanites/on_mob_life(mob/living/M)
M.heal_bodypart_damage(5,5, 0)
..()
. = 1
/datum/reagent/medicine/miningnanites/overdose_process(mob/living/M)
M.adjustBruteLoss(3*REM, 0)
M.adjustFireLoss(3*REM, 0)
M.adjustToxLoss(3*REM, 0)
..()
. = 1
//used for changeling's adrenaline power
/datum/reagent/medicine/changelingAdrenaline
name = "Adrenaline"
@@ -119,23 +119,22 @@
M.apply_water()
var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot && !isspaceturf(T))
if(hotspot && !istype(T, /turf/open/space))
if(T.air)
var/datum/gas_mixture/G = T.air
G.temperature = max(min(G.temperature-(CT*1000),G.temperature/CT),0)
G.react()
qdel(hotspot)
var/obj/effect/acid/A = (locate(/obj/effect/acid) in T)
if(A)
A.acid_level = max(A.acid_level - reac_volume*50, 0)
return
/*
* Water reaction to an object
*/
/datum/reagent/water/reaction_obj(obj/O, reac_volume)
O.extinguish()
O.acid_level = 0
if(istype(O))
O.extinguish()
// Monkey cube
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
@@ -176,30 +175,36 @@
if(data >= 30) // 12 units, 54 seconds @ metabolism 0.4 units & tick rate 1.8 sec
if(!M.stuttering)
M.stuttering = 1
M.stuttering = min(M.stuttering+4, 10)
M.stuttering += 4
M.Dizzy(5)
if(iscultist(M) && prob(5))
M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","R'ge Na'sie","Diabo us Vo'iscum","Eld' Mon Nobis"))
else if(is_servant_of_ratvar(M) && prob(8))
else if(is_servant_of_ratvar(M) && prob(5))
switch(pick("speech", "message", "emote"))
if("speech")
clockwork_say(M, "...[text2ratvar(pick("Engine... your light grows dark...", "Where are you, master?", "He lies rusting in Error...", "Purge all untruths and... and... something..."))]")
M.say("...[pick("Ratvar... lbhe yvtug tebjf qnex", "Jurer ner lbh, znfgre?", "Ur yvrf ehfgvat va Reebe", "Chetr nyy hagehguf naq... naq... fbzrguvat")]...")
if("message")
M << "<span class='boldwarning'>[pick("Ratvar's illumination of your mind has begun to flicker", "He lies rusting in Reebe, derelict and forgotten. And there he shall stay", \
"You can't save him. Nothing can save him now", "It seems that Nar-Sie will triumph after all")].</span>"
M << "<span class='warning'><b>[pick("Ratvar's illumination of your mind has begun to flicker.", "He lies rusting in Reebe, derelict and forgotten. And there he shall stay.", \
"You can't save him. Nothing can save him now.", "It seems that Nar-Sie will triumph after all.")]</b></span>"
if("emote")
M.visible_message("<span class='warning'>[M] [pick("whimpers quietly", "shivers as though cold", "glances around in paranoia")].</span>")
M.visible_message("<span class='warning'>[M] [pick("whimpers quietly", "shivers as though cold", "glances around in paranoia")]</span>")
if(data >= 75) // 30 units, 135 seconds
if(iscultist(M) || is_servant_of_ratvar(M))
if (!M.confused)
M.confused = 1
M.confused += 3
if(iscultist(M) || is_handofgod_cultist(M) || is_handofgod_prophet(M) || is_servant_of_ratvar(M))
if(iscultist(M))
ticker.mode.remove_cultist(M.mind, 1, 1)
else if(is_handofgod_cultist(M) || is_handofgod_prophet(M))
ticker.mode.remove_hog_follower(M.mind)
else if(is_servant_of_ratvar(M))
remove_servant_of_ratvar(M)
holder.remove_reagent(id, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
M.jitteriness = 0
M.stuttering = 0
M.confused = 0
return
holder.remove_reagent(id, 0.4) //fixed consumption to prevent balancing going out of whack
holder.remove_reagent(src.id, 0.4) //fixed consumption to prevent balancing going out of whack
/datum/reagent/water/holywater/reaction_turf(turf/T, reac_volume)
..()
@@ -272,7 +277,7 @@
overdose_threshold = 11 //Slightly more than one un-nozzled spraybottle.
/datum/reagent/spraytan/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
if(ishuman(M))
if(istype(M, /mob/living/carbon/human))
if(method == PATCH || method == VAPOR)
var/mob/living/carbon/human/N = M
if(N.dna.species.id == "human")
@@ -300,7 +305,7 @@
if ("albino")
N.skin_tone = "caucasian1"
if(MUTCOLORS in N.dna.species.species_traits) //take current alien color and darken it slightly
if(MUTCOLORS in N.dna.species.specflags) //take current alien color and darken it slightly
var/newcolor = ""
var/len = length(N.dna.features["mcolor"])
for(var/i=1, i<=len, i+=1)
@@ -337,178 +342,61 @@
/datum/reagent/spraytan/overdose_process(mob/living/M)
metabolization_rate = 1 * REAGENTS_METABOLISM
if(ishuman(M))
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/N = M
if(N.dna.species.id == "human") // If they're human, turn em to the "orange" race, and give em spiky black hair
N.skin_tone = "orange"
N.hair_style = "Spiky"
N.hair_color = "000"
if(MUTCOLORS in N.dna.species.species_traits) //Aliens with custom colors simply get turned orange
if(MUTCOLORS in N.dna.species.specflags) //Aliens with custom colors simply get turned orange
N.dna.features["mcolor"] = "f80"
N.regenerate_icons()
if(prob(7))
if(N.w_uniform)
M.visible_message(pick("<b>[M]</b>'s collar pops up without warning.</span>", "<b>[M]</b> flexes [M.p_their()] arms."))
M.visible_message(pick("<b>[M]</b>'s collar pops up without warning.</span>", "<b>[M]</b> flexes their arms."))
else
M.visible_message("<b>[M]</b> [M.p_their()] their arms.")
M.visible_message("<b>[M]</b> flexes their arms.")
if(prob(10))
M.say(pick("Check these sweet biceps bro!", "Deal with it.", "CHUG! CHUG! CHUG! CHUG!", "Winning!", "NERDS!", "My name is John and I hate every single one of you."))
..()
return
/datum/reagent/stableslimetoxin
name = "Stable Mutation Toxin"
id = "stablemutationtoxin"
description = "A humanizing toxin produced by slimes."
/datum/reagent/slimetoxin
name = "Mutation Toxin"
id = "mutationtoxin"
description = "A corruptive toxin produced by slimes."
color = "#13BC5E" // rgb: 19, 188, 94
/datum/reagent/unstableslimetoxin
name = "Unstable Mutation Toxin"
id = "unstablemutationtoxin"
description = "An unstable and unpredictable corruptive toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
metabolization_rate = INFINITY //So it instantly removes all of itself
var/datum/species/race = /datum/species/human
var/mutationtext = "<span class='danger'>The pain subsides. You feel... human.</span>"
/datum/reagent/stableslimetoxin/on_mob_life(mob/living/carbon/human/H)
/datum/reagent/unstableslimetoxin/on_mob_life(mob/living/carbon/human/H)
..()
H << "<span class='warning'><b>You crumple in agony as your flesh wildly morphs into new forms!</b></span>"
H.visible_message("<b>[H]</b> falls to the ground and screams as [H.p_their()] skin bubbles and froths!") //'froths' sounds painful when used with SKIN.
H.visible_message("<b>[H]</b> falls to the ground and screams as their skin bubbles and froths!") //'froths' sounds painful when used with SKIN.
H.Weaken(3, 0)
spawn(30)
if(!H || qdeleted(H))
return
var/current_species = H.dna.species.type
var/datum/species/mutation = race
if(mutation && mutation != current_species)
H << mutationtext
var/list/possible_morphs = list()
for(var/type in subtypesof(/datum/species))
var/datum/species/S = type
if(initial(S.blacklisted))
continue
possible_morphs += S
var/datum/species/mutation = pick(possible_morphs)
if(prob(90) && mutation)
H << "<span class='danger'>The pain subsides. You feel... different.</span>"
H.set_species(mutation)
else
H << "<span class='danger'>The pain vanishes suddenly. You feel no different.</span>"
return 1
/datum/reagent/stableslimetoxin/classic //The one from plasma on green slimes
name = "Mutation Toxin"
id = "mutationtoxin"
description = "A corruptive toxin produced by slimes."
color = "#13BC5E" // rgb: 19, 188, 94
race = /datum/species/jelly/slime
mutationtext = "<span class='danger'>The pain subsides. Your whole body feels like slime.</span>"
/datum/reagent/stableslimetoxin/lizard
name = "Lizard Mutation Toxin"
id = "lizardmutationtoxin"
description = "A lizarding toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/lizard
mutationtext = "<span class='danger'>The pain subsides. You feel... scaly.</span>"
/datum/reagent/stableslimetoxin/fly
name = "Fly Mutation Toxin"
id = "flymutationtoxin"
description = "An insectifying toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/fly
mutationtext = "<span class='danger'>The pain subsides. You feel... buzzy.</span>"
/datum/reagent/stableslimetoxin/pod
name = "Podperson Mutation Toxin"
id = "podmutationtoxin"
description = "A vegetalizing toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/pod
mutationtext = "<span class='danger'>The pain subsides. You feel... plantlike.</span>"
/datum/reagent/stableslimetoxin/jelly
name = "Imperfect Mutation Toxin"
id = "jellymutationtoxin"
description = "An jellyfying toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/jelly
mutationtext = "<span class='danger'>The pain subsides. You feel... wobbly.</span>"
/datum/reagent/stableslimetoxin/golem
name = "Golem Mutation Toxin"
id = "golemmutationtoxin"
description = "A crystal toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/golem/random
mutationtext = "<span class='danger'>The pain subsides. You feel... rocky.</span>"
/datum/reagent/stableslimetoxin/abductor
name = "Abductor Mutation Toxin"
id = "abductormutationtoxin"
description = "An alien toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/abductor
mutationtext = "<span class='danger'>The pain subsides. You feel... alien.</span>"
/datum/reagent/stableslimetoxin/android
name = "Android Mutation Toxin"
id = "androidmutationtoxin"
description = "A robotic toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/android
mutationtext = "<span class='danger'>The pain subsides. You feel... artificial.</span>"
//BLACKLISTED RACES
/datum/reagent/stableslimetoxin/skeleton
name = "Skeleton Mutation Toxin"
id = "skeletonmutationtoxin"
description = "A scary toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/skeleton
mutationtext = "<span class='danger'>The pain subsides. You feel... spooky.</span>"
/datum/reagent/stableslimetoxin/zombie
name = "Zombie Mutation Toxin"
id = "zombiemutationtoxin"
description = "An undead toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/zombie //Not the infectious kind. The days of xenobio zombie outbreaks are long past.
mutationtext = "<span class='danger'>The pain subsides. You feel... undead.</span>"
/datum/reagent/stableslimetoxin/ash
name = "Ash Mutation Toxin"
id = "ashmutationtoxin"
description = "An ashen toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/lizard/ashwalker
mutationtext = "<span class='danger'>The pain subsides. You feel... savage.</span>"
//DANGEROUS RACES
/datum/reagent/stableslimetoxin/shadow
name = "Shadow Mutation Toxin"
id = "shadowmutationtoxin"
description = "A dark toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/shadow
mutationtext = "<span class='danger'>The pain subsides. You feel... darker.</span>"
/datum/reagent/stableslimetoxin/plasma
name = "Plasma Mutation Toxin"
id = "plasmamutationtoxin"
description = "A plasma-based toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
race = /datum/species/plasmaman
mutationtext = "<span class='danger'>The pain subsides. You feel... flammable.</span>"
/datum/reagent/stableslimetoxin/unstable //PSYCH
name = "Unstable Mutation Toxin"
id = "unstablemutationtoxin"
description = "An unstable and unpredictable corruptive toxin produced by slimes."
color = "#5EFF3B" //RGB: 94, 255, 59
mutationtext = "<span class='danger'>The pain subsides. You feel... different.</span>"
/datum/reagent/stableslimetoxin/unstable/on_mob_life(mob/living/carbon/human/H)
var/list/possible_morphs = list()
for(var/type in subtypesof(/datum/species))
var/datum/species/S = type
if(initial(S.blacklisted))
continue
possible_morphs += S
race = pick(possible_morphs)
..()
/datum/reagent/mulligan
name = "Mulligan Toxin"
id = "mulligan"
@@ -537,7 +425,6 @@
id = "gluttonytoxin"
description = "An advanced corruptive toxin produced by something terrible."
color = "#5EFF3B" //RGB: 94, 255, 59
can_synth = 0
/datum/reagent/gluttonytoxin/reaction_mob(mob/M, method=TOUCH, reac_volume)
M.ForceContractDisease(new /datum/disease/transformation/morph(0))
@@ -558,7 +445,7 @@
/datum/reagent/oxygen
name = "Oxygen"
id = "oxygen"
description = "A colorless, odorless gas. Grows on trees but is still pretty valuable."
description = "A colorless, odorless gas."
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
@@ -575,14 +462,14 @@
/datum/reagent/copper
name = "Copper"
id = "copper"
description = "A highly ductile metal. Things made out of copper aren't very durable, but it makes a decent material for electrical wiring."
description = "A highly ductile metal."
reagent_state = SOLID
color = "#6E3B08" // rgb: 110, 59, 8
/datum/reagent/nitrogen
name = "Nitrogen"
id = "nitrogen"
description = "A colorless, odorless, tasteless gas. A simple asphyxiant that can silently displace vital oxygen."
description = "A colorless, odorless, tasteless gas."
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
@@ -613,11 +500,11 @@
/datum/reagent/mercury
name = "Mercury"
id = "mercury"
description = "A curious metal that's a liquid at room temperature. Neurodegenerative and very bad for the mind."
description = "A chemical element."
color = "#484848" // rgb: 72, 72, 72
/datum/reagent/mercury/on_mob_life(mob/living/M)
if(M.canmove && isspaceturf(M.loc))
if(M.canmove && istype(M.loc, /turf/open/space))
step(M, pick(cardinal))
if(prob(5))
M.emote(pick("twitch","drool","moan"))
@@ -627,19 +514,19 @@
/datum/reagent/sulfur
name = "Sulfur"
id = "sulfur"
description = "A sickly yellow solid mostly known for its nasty smell. It's actually much more helpful than it looks in biochemisty."
description = "A chemical element."
reagent_state = SOLID
color = "#BF8C00" // rgb: 191, 140, 0
/datum/reagent/carbon
name = "Carbon"
id = "carbon"
description = "A crumbly black solid that, while unexciting on an physical level, forms the base of all known life. Kind of a big deal."
description = "A chemical element."
reagent_state = SOLID
color = "#1C1300" // rgb: 30, 20, 0
/datum/reagent/carbon/reaction_turf(turf/T, reac_volume)
if(!isspaceturf(T))
if(!istype(T, /turf/open/space))
var/obj/effect/decal/cleanable/dirt/D = locate() in T.contents
if(!D)
new /obj/effect/decal/cleanable/dirt(T)
@@ -647,19 +534,19 @@
/datum/reagent/chlorine
name = "Chlorine"
id = "chlorine"
description = "A pale yellow gas that's well known as an oxidizer. While it forms many harmless molecules in its elemental form it is far from harmless."
description = "A chemical element."
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
/datum/reagent/chlorine/on_mob_life(mob/living/M)
M.take_bodypart_damage(1*REM, 0, 0)
M.take_organ_damage(1*REM, 0, 0)
. = 1
..()
/datum/reagent/fluorine
name = "Fluorine"
id = "fluorine"
description = "A comically-reactive chemical element. The universe does not want this stuff to exist in this form in the slightest."
description = "A highly-reactive chemical element."
reagent_state = GAS
color = "#808080" // rgb: 128, 128, 128
@@ -671,26 +558,26 @@
/datum/reagent/sodium
name = "Sodium"
id = "sodium"
description = "A soft silver metal that can easily be cut with a knife. It's not salt just yet, so refrain from putting in on your chips."
description = "A chemical element."
reagent_state = SOLID
color = "#808080" // rgb: 128, 128, 128
/datum/reagent/phosphorus
name = "Phosphorus"
id = "phosphorus"
description = "A ruddy red powder that burns readily. Though it comes in many colors, the general theme is always the same."
description = "A chemical element."
reagent_state = SOLID
color = "#832828" // rgb: 131, 40, 40
/datum/reagent/lithium
name = "Lithium"
id = "lithium"
description = "A silver metal, it's claim to fame is its remarkably low density. Using it is a bit too effective in calming oneself down."
description = "A chemical element."
reagent_state = SOLID
color = "#808080" // rgb: 128, 128, 128
/datum/reagent/lithium/on_mob_life(mob/living/M)
if(M.canmove && isspaceturf(M.loc))
if(M.canmove && istype(M.loc, /turf/open/space))
step(M, pick(cardinal))
if(prob(5))
M.emote(pick("twitch","drool","moan"))
@@ -715,27 +602,18 @@
/datum/reagent/radium/reaction_turf(turf/T, reac_volume)
if(reac_volume >= 3)
if(!isspaceturf(T))
if(!istype(T, /turf/open/space))
var/obj/effect/decal/cleanable/greenglow/GG = locate() in T.contents
if(!GG)
GG = new/obj/effect/decal/cleanable/greenglow(T)
GG.reagents.add_reagent("radium", reac_volume)
/datum/reagent/space_cleaner/sterilizine
/datum/reagent/sterilizine
name = "Sterilizine"
id = "sterilizine"
description = "Sterilizes wounds in preparation for surgery."
color = "#C8A5DC" // rgb: 200, 165, 220
/datum/reagent/space_cleaner/sterilizine/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(iscarbon(M) && (method in list(TOUCH, VAPOR, PATCH)))
var/mob/living/carbon/C = M
for(var/s in C.surgeries)
var/datum/surgery/S = s
S.success_multiplier = max(0.20, S.success_multiplier)
// +20% success propability on each step, useful while operating in less-than-perfect conditions
..()
/datum/reagent/iron
name = "Iron"
id = "iron"
@@ -752,7 +630,7 @@
..()
/datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(!isliving(M))
if(!istype(M, /mob/living))
return
if(M.has_bane(BANE_IRON)) //If the target is weak to cold iron, then poison them.
if(holder && holder.chem_temp < 100) // COLD iron.
@@ -774,7 +652,7 @@
color = "#D0D0D0" // rgb: 208, 208, 208
/datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(!isliving(M))
if(!istype(M, /mob/living))
return
if(M.has_bane(BANE_SILVER))
M.reagents.add_reagent("toxin", reac_volume)
@@ -793,7 +671,7 @@
/datum/reagent/uranium/reaction_turf(turf/T, reac_volume)
if(reac_volume >= 3)
if(!isspaceturf(T))
if(!istype(T, /turf/open/space))
var/obj/effect/decal/cleanable/greenglow/GG = locate() in T.contents
if(!GG)
GG = new/obj/effect/decal/cleanable/greenglow(T)
@@ -820,7 +698,7 @@
color = "#660000" // rgb: 102, 0, 0
/datum/reagent/fuel/reaction_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with welding fuel to make them easy to ignite!
if(!isliving(M))
if(!istype(M, /mob/living))
return
if(method == TOUCH || method == VAPOR)
M.adjust_fire_stacks(reac_volume / 10)
@@ -843,12 +721,10 @@
qdel(O)
else
if(O)
O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
O.clean_blood()
/datum/reagent/space_cleaner/reaction_turf(turf/T, reac_volume)
if(reac_volume >= 1)
T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
T.clean_blood()
for(var/obj/effect/decal/cleanable/C in T)
qdel(C)
@@ -858,16 +734,17 @@
/datum/reagent/space_cleaner/reaction_mob(mob/M, method=TOUCH, reac_volume)
if(method == TOUCH || method == VAPOR)
M.remove_atom_colour(WASHABLE_COLOUR_PRIORITY)
if(iscarbon(M))
var/mob/living/carbon/C = M
if(ishuman(M))
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.lip_style)
H.lip_style = null
H.update_body()
for(var/obj/item/I in C.held_items)
I.clean_blood()
if(C.r_hand)
C.r_hand.clean_blood()
if(C.l_hand)
C.l_hand.clean_blood()
if(C.wear_mask)
if(C.wear_mask.clean_blood())
C.update_inv_wear_mask()
@@ -924,7 +801,6 @@
id = "nanomachines"
description = "Microscopic construction robots."
color = "#535E66" // rgb: 83, 94, 102
can_synth = 0
/datum/reagent/nanites/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
@@ -935,7 +811,6 @@
id = "xenomicrobes"
description = "Microbes with an entirely alien cellular structure."
color = "#535E66" // rgb: 83, 94, 102
can_synth = 0
/datum/reagent/xenomicrobes/reaction_mob(mob/M, method=TOUCH, reac_volume, show_message = 1, touch_protection = 0)
if(method==PATCH || method==INGEST || method==INJECT || (method == VAPOR && prob(min(reac_volume,100)*(1 - touch_protection))))
@@ -981,7 +856,7 @@
name = "Carbon Dioxide"
id = "co2"
reagent_state = GAS
description = "A gas commonly produced by burning carbon fuels. You're constantly producing this in your lungs."
description = "A gas commonly produced by burning carbon fuels."
color = "#B0B0B0" // rgb : 192, 192, 192
/datum/reagent/carbondioxide/reaction_obj(obj/O, reac_volume)
@@ -994,23 +869,6 @@
T.atmos_spawn_air("co2=[reac_volume/5];TEMP=[T20C]")
return
/datum/reagent/nitrous_oxide
name = "Nitrous Oxide"
id = "nitrous_oxide"
description = "A potent oxidizer used as fuel in rockets and as an anaesthetic during surgery."
reagent_state = LIQUID
color = "#808080"
/datum/reagent/nitrous_oxide/reaction_obj(obj/O, reac_volume)
if((!O) || (!reac_volume))
return 0
O.atmos_spawn_air("n2o=[reac_volume/5];TEMP=[T20C]")
/datum/reagent/nitrous_oxide/reaction_turf(turf/open/T, reac_volume)
if(istype(T))
T.atmos_spawn_air("n2o=[reac_volume/5];TEMP=[T20C]")
return
/////////////////////////Coloured Crayon Powder////////////////////////////
@@ -1143,14 +1001,21 @@
/datum/reagent/iodine
name = "Iodine"
id = "iodine"
description = "Commonly added to table salt as a nutrient. On its own it tastes far less pleasing."
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/reagent/fluorine
name = "Fluorine"
id = "fluorine"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/reagent/carpet
name = "Carpet"
id = "carpet"
description = "For those that need a more creative way to roll out a red carpet."
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC"
@@ -1164,35 +1029,35 @@
/datum/reagent/bromine
name = "Bromine"
id = "bromine"
description = "A brownish liquid that's highly reactive. Useful for stopping free radicals, but not intended for human consumption."
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/reagent/phenol
name = "Phenol"
id = "phenol"
description = "An aromatic ring of carbon with a hydroxyl group. A useful precursor to some medicines, but has no healing properties on its own."
description = "Used for certain medical recipes."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/reagent/ash
name = "Ash"
id = "ash"
description = "Supposedly pheonixes rise from these, but you've never seen it."
description = "Basic ingredient in a couple of recipes."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/reagent/acetone
name = "Acetone"
id = "acetone"
description = "A slick, slightly carcinogenic liquid. Has a multitude of mundane uses in everyday life."
description = "Common ingredient in other recipes."
reagent_state = LIQUID
color = "#C8A5DC"
/datum/reagent/colorful_reagent
name = "Colorful Reagent"
id = "colorful_reagent"
description = "Thoroughly sample the rainbow."
description = "A solution."
reagent_state = LIQUID
color = "#C8A5DC"
var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700")
@@ -1200,29 +1065,29 @@
/datum/reagent/colorful_reagent/on_mob_life(mob/living/M)
if(M && isliving(M))
M.add_atom_colour(pick(random_color_list), WASHABLE_COLOUR_PRIORITY)
M.color = pick(random_color_list)
..()
return
/datum/reagent/colorful_reagent/reaction_mob(mob/living/M, reac_volume)
if(M && isliving(M))
M.add_atom_colour(pick(random_color_list), WASHABLE_COLOUR_PRIORITY)
M.color = pick(random_color_list)
..()
/datum/reagent/colorful_reagent/reaction_obj(obj/O, reac_volume)
if(O)
O.add_atom_colour(pick(random_color_list), WASHABLE_COLOUR_PRIORITY)
O.color = pick(random_color_list)
..()
/datum/reagent/colorful_reagent/reaction_turf(turf/T, reac_volume)
if(T)
T.add_atom_colour(pick(random_color_list), WASHABLE_COLOUR_PRIORITY)
T.color = pick(random_color_list)
..()
/datum/reagent/hair_dye
name = "Quantum Hair Dye"
id = "hair_dye"
description = "Has a high chance of making you look like a mad scientist."
description = "A solution."
reagent_state = LIQUID
color = "#C8A5DC"
var/list/potential_colors = list("0ad","a0f","f73","d14","d14","0b5","0ad","f73","fc2","084","05e","d22","fa0") // fucking hair code
@@ -1270,21 +1135,21 @@
/datum/reagent/saltpetre
name = "Saltpetre"
id = "saltpetre"
description = "Volatile. Controversial. Third Thing."
description = "Volatile."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
/datum/reagent/lye
name = "Lye"
id = "lye"
description = "Also known as sodium hydroxide. As a profession making this is somewhat underwhelming."
description = "Also known as sodium hydroxide."
reagent_state = LIQUID
color = "#FFFFD6" // very very light yellow
/datum/reagent/drying_agent
name = "Drying agent"
id = "drying_agent"
description = "A desiccant. Can be used to dry things."
description = "Can be used to dry things."
reagent_state = LIQUID
color = "#A70FFF"
@@ -1304,6 +1169,7 @@
/datum/reagent/toxin/mutagen/mutagenvirusfood
name = "mutagenic agar"
id = "mutagenvirusfood"
description = "mutates blood"
color = "#A3C00F" // rgb: 163,192,15
/datum/reagent/toxin/mutagen/mutagenvirusfood/sugar
@@ -1314,11 +1180,13 @@
/datum/reagent/medicine/synaptizine/synaptizinevirusfood
name = "virus rations"
id = "synaptizinevirusfood"
description = "mutates blood"
color = "#D18AA5" // rgb: 209,138,165
/datum/reagent/toxin/plasma/plasmavirusfood
name = "virus plasma"
id = "plasmavirusfood"
description = "mutates blood"
color = "#A69DA9" // rgb: 166,157,169
/datum/reagent/toxin/plasma/plasmavirusfood/weak
@@ -1326,23 +1194,6 @@
id = "weakplasmavirusfood"
color = "#CEC3C6" // rgb: 206,195,198
/datum/reagent/uranium/uraniumvirusfood
name = "decaying uranium gel"
id = "uraniumvirusfood"
color = "#67ADBA" // rgb: 103,173,186
/datum/reagent/uranium/uraniumvirusfood/unstable
name = "unstable uranium gel"
id = "uraniumplasmavirusfood_unstable"
color = "#2FF2CB" // rgb: 47,242,203
/datum/reagent/uranium/uraniumvirusfood/stable
name = "stable uranium gel"
id = "uraniumplasmavirusfood_stable"
color = "#04506C" // rgb: 4,80,108
// Bee chemicals
/datum/reagent/royal_bee_jelly
name = "royal bee jelly"
id = "royal_bee_jelly"
@@ -1354,9 +1205,7 @@
M.say(pick("Bzzz...","BZZ BZZ","Bzzzzzzzzzzz..."))
..()
//Misc reagents
/datum/reagent/romerol
datum/reagent/romerol
name = "romerol"
// the REAL zombie powder
id = "romerol"
@@ -1367,40 +1216,8 @@
of the host body."
color = "#123524" // RGB (18, 53, 36)
metabolization_rate = INFINITY
can_synth = 0
/datum/reagent/romerol/on_mob_life(mob/living/carbon/human/H)
// Silently add the zombie infection organ to be activated upon death
new /obj/item/organ/body_egg/zombie_infection(H)
..()
/datum/reagent/growthserum
name = "Growth serum"
id = "growthserum"
description = "A commercial chemical designed to help older men in the bedroom."//not really it just makes you a giant
color = "#ff0000"//strong red. rgb 255, 0, 0
var/current_size = 1
/datum/reagent/growthserum/on_mob_life(mob/living/carbon/H)
var/newsize = current_size
switch(volume)
if(0 to 19)
newsize = 1.25
if(20 to 49)
newsize = 1.5
if(50 to 99)
newsize = 2
if(100 to 199)
newsize = 2.5
if(200 to INFINITY)
newsize = 3.5
H.resize = newsize/current_size
current_size = newsize
H.update_transform()
..()
/datum/reagent/growthserum/on_mob_delete(mob/living/M)
M.resize = 1/current_size
M.update_transform()
..()
@@ -7,7 +7,7 @@
color = "#550000"
/datum/reagent/thermite/reaction_turf(turf/T, reac_volume)
if(reac_volume >= 1 && iswallturf(T))
if(reac_volume >= 1 && istype(T, /turf/closed/wall))
var/turf/closed/wall/Wall = T
if(istype(Wall, /turf/closed/wall/r_wall))
Wall.thermite = Wall.thermite+(reac_volume*2.5)
@@ -54,17 +54,17 @@
var/turf/open/floor/plating/F = T
if(prob(10 + F.burnt + 5*F.broken)) //broken or burnt plating is more susceptible to being destroyed
F.ChangeTurf(F.baseturf)
if(isfloorturf(T))
if(istype(T, /turf/open/floor/))
var/turf/open/floor/F = T
if(prob(reac_volume))
F.make_plating()
else if(prob(reac_volume))
F.burn_tile()
if(isfloorturf(F))
if(istype(F, /turf/open/floor/))
for(var/turf/turf in range(1,F))
if(!locate(/obj/effect/hotspot) in turf)
PoolOrNew(/obj/effect/hotspot, F)
if(iswallturf(T))
if(istype(T, /turf/closed/wall/))
var/turf/closed/wall/W = T
if(prob(reac_volume))
W.ChangeTurf(/turf/open/floor/plating)
@@ -164,7 +164,7 @@
/datum/reagent/cryostylane
name = "Cryostylane"
id = "cryostylane"
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the container 0K."
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K."
color = "#0000DC"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
@@ -190,7 +190,7 @@
/datum/reagent/pyrosium
name = "Pyrosium"
id = "pyrosium"
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly heats all other reagents in the container."
description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K."
color = "#64FAC8"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
@@ -206,20 +206,3 @@
holder.chem_temp += 10
holder.handle_reactions()
..()
/datum/reagent/teslium //Teslium. Causes periodic shocks, and makes shocks against the target much more effective.
name = "Teslium"
id = "teslium"
description = "An unstable, electrically-charged metallic slurry. Periodically electrocutes its victim, and makes electrocutions against them more deadly. Excessively heating teslium results in dangerous destabilization. Do not allow to come into contact with water."
reagent_state = LIQUID
color = "#20324D" //RGB: 32, 50, 77
metabolization_rate = 0.5 * REAGENTS_METABOLISM
var/shock_timer = 0
/datum/reagent/teslium/on_mob_life(mob/living/M)
shock_timer++
if(shock_timer >= rand(5,30)) //Random shocks are wildly unpredictable
shock_timer = 0
M.electrocute_act(rand(5,20), "Teslium in their body", 1, 1) //Override because it's caused from INSIDE of you
playsound(M, "sparks", 50, 1)
..()
@@ -34,11 +34,11 @@
if(!M.has_dna())
return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
if((method==VAPOR && prob(min(33, reac_volume))) || method==INGEST || method==PATCH || method==INJECT)
M.randmuti()
randmuti(M)
if(prob(98))
M.randmutb()
randmutb(M)
else
M.randmutg()
randmutg(M)
M.updateappearance()
M.domutcheck()
..()
@@ -58,6 +58,7 @@
/datum/reagent/toxin/plasma/on_mob_life(mob/living/M)
if(holder.has_reagent("epinephrine"))
holder.remove_reagent("epinephrine", 2*REM)
M.apply_effect(0.5*REM/M.metabolism_efficiency,IRRADIATE,0)
if(iscarbon(M))
var/mob/living/carbon/C = M
C.adjustPlasma(20)
@@ -74,7 +75,7 @@
return
/datum/reagent/toxin/plasma/reaction_mob(mob/living/M, method=TOUCH, reac_volume)//Splashing people with plasma is stronger than fuel!
if(!isliving(M))
if(!istype(M, /mob/living))
return
if(method == TOUCH || method == VAPOR)
M.adjust_fire_stacks(reac_volume / 5)
@@ -94,7 +95,7 @@
if(iscarbon(M))
C = M
CHECK_DNA_AND_SPECIES(C)
if(NOBREATH in C.dna.species.species_traits)
if(NOBREATH in C.dna.species.specflags)
. = FALSE
if(.)
@@ -118,7 +119,7 @@
M.adjustToxLoss(rand(20,60)*REM, 0)
. = 1
else if(prob(40))
M.heal_bodypart_damage(5*REM,0, 0)
M.heal_organ_damage(5*REM,0, 0)
. = 1
..()
@@ -184,10 +185,10 @@
if(istype(O,/obj/structure/alien/weeds))
var/obj/structure/alien/weeds/alien_weeds = O
alien_weeds.take_damage(rand(15,35), BRUTE, 0) // Kills alien weeds pretty fast
else if(istype(O,/obj/structure/glowshroom)) //even a small amount is enough to kill it
else if(istype(O,/obj/effect/glowshroom)) //even a small amount is enough to kill it
qdel(O)
else if(istype(O,/obj/structure/spacevine))
var/obj/structure/spacevine/SV = O
else if(istype(O,/obj/effect/spacevine))
var/obj/effect/spacevine/SV = O
SV.on_chem_effect(src)
/datum/reagent/toxin/plantbgone/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
@@ -520,12 +521,12 @@
M.adjustOxyLoss(rand(5,25), 0)
. = 1
if(3)
if(ishuman(M))
if(istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(!H.heart_attack)
H.heart_attack = 1 // rip in pepperoni
if(H.stat == CONSCIOUS)
H.visible_message("<span class='userdanger'>[H] clutches at [H.p_their()] chest as if [H.p_their()] heart stopped!</span>")
H.visible_message("<span class='userdanger'>[H] clutches at their chest as if their heart stopped!</span>")
else
H.losebreath += 10
H.adjustOxyLoss(rand(5,25), 0)
@@ -589,10 +590,7 @@
metabolization_rate = 0.5 * REAGENTS_METABOLISM
/datum/reagent/toxin/amanitin/on_mob_delete(mob/living/M)
var/toxdamage = current_cycle*3*REM
M.adjustToxLoss(toxdamage)
if(M)
add_logs(M, get_turf(M), "has taken [toxdamage] toxin damage from amanitin toxin")
M.adjustToxLoss(current_cycle*3*REM)
..()
/datum/reagent/toxin/lipolicide
@@ -605,9 +603,9 @@
toxpwr = 0.5
/datum/reagent/toxin/lipolicide/on_mob_life(mob/living/M)
if(M.nutrition <= NUTRITION_LEVEL_STARVING)
if(!holder.has_reagent("nutriment"))
M.adjustToxLoss(0.5*REM, 0)
M.nutrition = max(M.nutrition - 3, 0) // making the chef more valuable, one meme trap at a time
M.nutrition = max( M.nutrition - 5 * REAGENTS_METABOLISM, 0)
M.overeatduration = 0
return ..()
@@ -657,50 +655,25 @@
. = 1
return ..() || .
/datum/reagent/toxin/rotatium //Rotatium. Fucks up your rotation and is hilarious
name = "Rotatium"
id = "rotatium"
description = "A constantly swirling, oddly colourful fluid. Causes the consumer's sense of direction and hand-eye coordination to become wild."
/datum/reagent/toxin/teslium //Teslium. Causes periodic shocks, and makes shocks against the target much more effective.
name = "Teslium"
id = "teslium"
description = "An unstable, electrically-charged metallic slurry. Periodically electrocutes its victim, and makes electrocutions against them more deadly."
reagent_state = LIQUID
color = "#AC88CA" //RGB: 172, 136, 202
metabolization_rate = 0.6 * REAGENTS_METABOLISM
toxpwr = 0.5
color = "#20324D" //RGB: 32, 50, 77
metabolization_rate = 0.5 * REAGENTS_METABOLISM
toxpwr = 0
var/shock_timer = 0
/datum/reagent/toxin/rotatium/on_mob_life(mob/living/M)
if(M.hud_used)
if(current_cycle >= 20 && current_cycle%20 == 0)
var/list/screens = list(M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
var/rotation = min(round(current_cycle/20), 89) // By this point the player is probably puking and quitting anyway
for(var/whole_screen in screens)
animate(whole_screen, transform = matrix(rotation, MATRIX_ROTATE), time = 5, easing = QUAD_EASING, loop = -1)
animate(transform = matrix(-rotation, MATRIX_ROTATE), time = 5, easing = QUAD_EASING)
return ..()
/datum/reagent/toxin/rotatium/on_mob_delete(mob/living/M)
if(M && M.hud_used)
var/list/screens = list(M.hud_used.plane_masters["[GAME_PLANE]"], M.hud_used.plane_masters["[LIGHTING_PLANE]"])
for(var/whole_screen in screens)
animate(whole_screen, transform = matrix(), time = 5, easing = QUAD_EASING)
/datum/reagent/toxin/teslium/on_mob_life(mob/living/M)
shock_timer++
if(shock_timer >= rand(5,30)) //Random shocks are wildly unpredictable
shock_timer = 0
M.electrocute_act(rand(5,20), "Teslium in their body", 1, 1) //Override because it's caused from INSIDE of you
playsound(M, "sparks", 50, 1)
..()
/datum/reagent/toxin/anacea
name = "Anacea"
id = "anacea"
description = "A toxin that quickly purges medicines and metabolizes very slowly."
reagent_state = LIQUID
color = "#3C5133"
metabolization_rate = 0.08 * REAGENTS_METABOLISM
toxpwr = 0.15
/datum/reagent/toxin/anacea/on_mob_life(mob/living/M)
var/remove_amt = 5
if(holder.has_reagent("calomel") || holder.has_reagent("pen_acid"))
remove_amt = 0.5
for(var/datum/reagent/medicine/R in M.reagents.reagent_list)
M.reagents.remove_reagent(R.id,remove_amt)
return ..()
//ACID
@@ -715,6 +688,8 @@
/datum/reagent/toxin/acid/reaction_mob(mob/living/carbon/C, method=TOUCH, reac_volume)
if(!istype(C))
return
if(C.dna && C.dna.species.id == "xeno")
return
reac_volume = round(reac_volume,0.1)
if(method == INGEST)
C.adjustBruteLoss(min(6*toxpwr, reac_volume * toxpwr))
@@ -722,7 +697,7 @@
if(method == INJECT)
C.adjustBruteLoss(1.5 * min(6*toxpwr, reac_volume * toxpwr))
return
C.acid_act(acidpwr, reac_volume)
C.acid_act(acidpwr, toxpwr, reac_volume)
/datum/reagent/toxin/acid/reaction_obj(obj/O, reac_volume)
if(istype(O.loc, /mob)) //handled in human acid_act()
@@ -734,7 +709,8 @@
if (!istype(T))
return
reac_volume = round(reac_volume,0.1)
T.acid_act(acidpwr, reac_volume)
for(var/obj/O in T)
O.acid_act(acidpwr, reac_volume)
/datum/reagent/toxin/acid/fluacid
name = "Fluorosulfuric acid"
@@ -757,10 +733,8 @@
metabolization_rate = 1.5 * REAGENTS_METABOLISM
/datum/reagent/toxin/peaceborg/confuse/on_mob_life(mob/living/M)
if(M.confused < 6)
M.confused = Clamp(M.confused + 3, 0, 5)
if(M.dizziness < 6)
M.dizziness = Clamp(M.dizziness + 3, 0, 5)
M.confused += 1
M.Dizzy(1)
if(prob(20))
M << "You feel confused and disorientated."
..()
@@ -773,9 +747,8 @@
metabolization_rate = 1.5 * REAGENTS_METABOLISM
/datum/reagent/toxin/peaceborg/tire/on_mob_life(mob/living/M)
var/healthcomp = (100 - M.health) //DOES NOT ACCOUNT FOR ADMINBUS THINGS THAT MAKE YOU HAVE MORE THAN 200/210 HEALTH, OR SOMETHING OTHER THAN A HUMAN PROCESSING THIS.
if(M.staminaloss < (45 - healthcomp)) //At 50 health you would have 200 - 150 health meaning 50 compensation. 60 - 50 = 10, so would only do 10-19 stamina.)
if(M.staminaloss < 50)
M.adjustStaminaLoss(10)
if(prob(30))
M << "You should sit down and take a rest..."
..()
..()
+6 -6
View File
@@ -1,7 +1,7 @@
/datum/chemical_reaction
var/name = null
var/id = null
var/list/results = new/list()
var/result = null
var/list/required_reagents = new/list()
var/list/required_catalysts = new/list()
@@ -9,11 +9,11 @@
var/atom/required_container = null // the container required for the reaction to happen
var/required_other = 0 // an integer required for the reaction to happen
var/result_amount = 0
var/secondary = 0 // set to nonzero if secondary reaction
var/mob_react = 0 //Determines if a chemical reaction can occur inside a mob
var/required_temp = 0
var/is_cold_recipe = 0 // Set to 1 if you want the recipe to only react when it's BELOW the required temp.
var/mix_message = "The solution begins to bubble." //The message shown to nearby people upon mixing, if applicable
var/mix_sound = 'sound/effects/bubbles.ogg' //The sound played upon mixing, if applicable
@@ -36,7 +36,7 @@ var/list/chemical_mob_spawn_nicecritters = list() // and possible friendly mobs
var/atom/A = holder.my_atom
var/turf/T = get_turf(A)
var/area/my_area = get_area(T)
var/message = "A [reaction_name] reaction has occurred in [my_area.name]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</A>)"
var/message = "A [reaction_name] reaction has occured in [my_area.name]. (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</A>)"
message += " (<A HREF='?_src_=vars;Vars=\ref[A]'>VV</A>)"
var/mob/M = get(A, /mob)
@@ -50,16 +50,16 @@ var/list/chemical_mob_spawn_nicecritters = list() // and possible friendly mobs
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
C.flash_act()
C.flash_eyes()
for(var/i = 1, i <= amount_to_spawn, i++)
var/chosen
if (reaction_name == "Friendly Gold Slime")
chosen = pick(chemical_mob_spawn_nicecritters)
else
chosen = pick(chemical_mob_spawn_meancritters)
var/spawnloc = get_turf(holder.my_atom)
var/mob/living/simple_animal/C = new chosen(spawnloc)
var/mob/living/simple_animal/C = new chosen
C.faction |= mob_faction
C.loc = get_turf(holder.my_atom)
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(C, pick(NORTH,SOUTH,EAST,WEST))
@@ -1,14 +1,16 @@
/datum/chemical_reaction/space_drugs
name = "Space Drugs"
id = "space_drugs"
results = list("space_drugs" = 3)
result = "space_drugs"
required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1)
result_amount = 3
/datum/chemical_reaction/crank
name = "Crank"
id = "crank"
results = list("crank" = 5)
result = "crank"
required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "welding_fuel" = 1)
result_amount = 5
mix_message = "The mixture violently reacts, leaving behind a few crystalline shards."
required_temp = 390
@@ -16,27 +18,31 @@
/datum/chemical_reaction/krokodil
name = "Krokodil"
id = "krokodil"
results = list("krokodil" = 6)
result = "krokodil"
required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "welding_fuel" = 1)
result_amount = 6
mix_message = "The mixture dries into a pale blue powder."
required_temp = 380
/datum/chemical_reaction/methamphetamine
name = "methamphetamine"
id = "methamphetamine"
results = list("methamphetamine" = 4)
result = "methamphetamine"
required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1)
result_amount = 4
required_temp = 374
/datum/chemical_reaction/bath_salts
name = "bath_salts"
id = "bath_salts"
results = list("bath_salts" = 7)
result = "bath_salts"
required_reagents = list("????" = 1, "saltpetre" = 1, "nutriment" = 1, "cleaner" = 1, "enzyme" = 1, "tea" = 1, "mercury" = 1)
result_amount = 7
required_temp = 374
/datum/chemical_reaction/aranesp
name = "aranesp"
id = "aranesp"
results = list("aranesp" = 3)
result = "aranesp"
required_reagents = list("epinephrine" = 1, "atropine" = 1, "morphine" = 1)
result_amount = 3
@@ -2,214 +2,249 @@
/datum/chemical_reaction/leporazine
name = "Leporazine"
id = "leporazine"
results = list("leporazine" = 2)
result = "leporazine"
required_reagents = list("silicon" = 1, "copper" = 1)
required_catalysts = list("plasma" = 5)
result_amount = 2
/datum/chemical_reaction/rezadone
name = "Rezadone"
id = "rezadone"
results = list("rezadone" = 3)
result = "rezadone"
required_reagents = list("carpotoxin" = 1, "cryptobiolin" = 1, "copper" = 1)
result_amount = 3
/datum/chemical_reaction/spaceacillin
name = "Spaceacillin"
id = "spaceacillin"
results = list("spaceacillin" = 2)
result = "spaceacillin"
required_reagents = list("cryptobiolin" = 1, "epinephrine" = 1)
result_amount = 2
/datum/chemical_reaction/inacusiate
name = "inacusiate"
id = "inacusiate"
results = list("inacusiate" = 2)
result = "inacusiate"
required_reagents = list("water" = 1, "carbon" = 1, "charcoal" = 1)
result_amount = 2
/datum/chemical_reaction/synaptizine
name = "Synaptizine"
id = "synaptizine"
results = list("synaptizine" = 3)
result = "synaptizine"
required_reagents = list("sugar" = 1, "lithium" = 1, "water" = 1)
result_amount = 3
/datum/chemical_reaction/charcoal
name = "Charcoal"
id = "charcoal"
results = list("charcoal" = 2)
result = "charcoal"
required_reagents = list("ash" = 1, "sodiumchloride" = 1)
result_amount = 2
mix_message = "The mixture yields a fine black powder."
required_temp = 380
/datum/chemical_reaction/silver_sulfadiazine
name = "Silver Sulfadiazine"
id = "silver_sulfadiazine"
results = list("silver_sulfadiazine" = 5)
result = "silver_sulfadiazine"
required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1)
result_amount = 5
/datum/chemical_reaction/salglu_solution
name = "Saline-Glucose Solution"
id = "salglu_solution"
results = list("salglu_solution" = 3)
result = "salglu_solution"
required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1)
result_amount = 3
/datum/chemical_reaction/mine_salve
name = "Miner's Salve"
id = "mine_salve"
results = list("mine_salve" = 3)
result = "mine_salve"
required_reagents = list("oil" = 1, "water" = 1, "iron" = 1)
result_amount = 3
/datum/chemical_reaction/mine_salve2
name = "Miner's Salve"
id = "mine_salve"
results = list("mine_salve" = 15)
result = "mine_salve"
required_reagents = list("plasma" = 5, "iron" = 5, "sugar" = 1) // A sheet of plasma, a twinkie and a sheet of metal makes four of these
result_amount = 15
/datum/chemical_reaction/synthflesh
name = "Synthflesh"
id = "synthflesh"
results = list("synthflesh" = 3)
result = "synthflesh"
required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1)
result_amount = 3
/datum/chemical_reaction/styptic_powder
name = "Styptic Powder"
id = "styptic_powder"
results = list("styptic_powder" = 4)
result = "styptic_powder"
required_reagents = list("aluminium" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1)
result_amount = 4
mix_message = "The solution yields an astringent powder."
/datum/chemical_reaction/calomel
name = "Calomel"
id = "calomel"
results = list("calomel" = 2)
result = "calomel"
required_reagents = list("mercury" = 1, "chlorine" = 1)
result_amount = 2
required_temp = 374
/datum/chemical_reaction/potass_iodide
name = "Potassium Iodide"
id = "potass_iodide"
results = list("potass_iodide" = 2)
result = "potass_iodide"
required_reagents = list("potassium" = 1, "iodine" = 1)
result_amount = 2
/datum/chemical_reaction/pen_acid
name = "Pentetic Acid"
id = "pen_acid"
results = list("pen_acid" = 6)
result = "pen_acid"
required_reagents = list("welding_fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1)
result_amount = 6
/datum/chemical_reaction/sal_acid
name = "Salicyclic Acid"
id = "sal_acid"
results = list("sal_acid" = 5)
result = "sal_acid"
required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1)
result_amount = 5
/datum/chemical_reaction/oxandrolone
name = "Oxandrolone"
id = "oxandrolone"
results = list("oxandrolone" = 6)
result = "oxandrolone"
required_reagents = list("carbon" = 3, "phenol" = 1, "hydrogen" = 1, "oxygen" = 1)
result_amount = 6
/datum/chemical_reaction/salbutamol
name = "Salbutamol"
id = "salbutamol"
results = list("salbutamol" = 5)
result = "salbutamol"
required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminium" = 1, "bromine" = 1, "ammonia" = 1)
result_amount = 5
/datum/chemical_reaction/perfluorodecalin
name = "Perfluorodecalin"
id = "perfluorodecalin"
results = list("perfluorodecalin" = 3)
result = "perfluorodecalin"
required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1)
result_amount = 3
required_temp = 370
mix_message = "The mixture rapidly turns into a dense pink liquid."
/datum/chemical_reaction/ephedrine
name = "Ephedrine"
id = "ephedrine"
results = list("ephedrine" = 4)
result = "ephedrine"
required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1)
result_amount = 4
mix_message = "The solution fizzes and gives off toxic fumes."
/datum/chemical_reaction/diphenhydramine
name = "Diphenhydramine"
id = "diphenhydramine"
results = list("diphenhydramine" = 4)
result = "diphenhydramine"
required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1)
result_amount = 4
mix_message = "The mixture dries into a pale blue powder."
/datum/chemical_reaction/oculine
name = "Oculine"
id = "oculine"
results = list("oculine" = 3)
result = "oculine"
required_reagents = list("charcoal" = 1, "carbon" = 1, "hydrogen" = 1)
result_amount = 3
mix_message = "The mixture sputters loudly and becomes a pale pink color."
/datum/chemical_reaction/atropine
name = "Atropine"
id = "atropine"
results = list("atropine" = 5)
result = "atropine"
required_reagents = list("ethanol" = 1, "acetone" = 1, "diethylamine" = 1, "phenol" = 1, "sacid" = 1)
result_amount = 5
/datum/chemical_reaction/epinephrine
name = "Epinephrine"
id = "epinephrine"
results = list("epinephrine" = 6)
result = "epinephrine"
required_reagents = list("phenol" = 1, "acetone" = 1, "diethylamine" = 1, "oxygen" = 1, "chlorine" = 1, "hydrogen" = 1)
result_amount = 6
/datum/chemical_reaction/strange_reagent
name = "Strange Reagent"
id = "strange_reagent"
results = list("strange_reagent" = 3)
result = "strange_reagent"
required_reagents = list("omnizine" = 1, "holywater" = 1, "mutagen" = 1)
result_amount = 3
/datum/chemical_reaction/mannitol
name = "Mannitol"
id = "mannitol"
results = list("mannitol" = 3)
result = "mannitol"
required_reagents = list("sugar" = 1, "hydrogen" = 1, "water" = 1)
result_amount = 3
mix_message = "The solution slightly bubbles, becoming thicker."
/datum/chemical_reaction/mutadone
name = "Mutadone"
id = "mutadone"
results = list("mutadone" = 3)
result = "mutadone"
required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1)
result_amount = 3
/datum/chemical_reaction/antihol
name = "antihol"
id = "antihol"
results = list("antihol" = 3)
result = "antihol"
required_reagents = list("ethanol" = 1, "charcoal" = 1, "copper" = 1)
result_amount = 3
/datum/chemical_reaction/cryoxadone
name = "Cryoxadone"
id = "cryoxadone"
results = list("cryoxadone" = 3)
result = "cryoxadone"
required_reagents = list("stable_plasma" = 1, "acetone" = 1, "mutagen" = 1)
result_amount = 3
/datum/chemical_reaction/haloperidol
name = "Haloperidol"
id = "haloperidol"
results = list("haloperidol" = 5)
result = "haloperidol"
required_reagents = list("chlorine" = 1, "fluorine" = 1, "aluminium" = 1, "potass_iodide" = 1, "oil" = 1)
result_amount = 5
/datum/chemical_reaction/bicaridine
name = "Bicaridine"
id = "bicaridine"
results = list("bicaridine" = 3)
result = "bicaridine"
required_reagents = list("carbon" = 1, "oxygen" = 1, "sugar" = 1)
result_amount = 3
/datum/chemical_reaction/kelotane
name = "Kelotane"
id = "kelotane"
results = list("kelotane" = 2)
result = "kelotane"
required_reagents = list("carbon" = 1, "silicon" = 1)
result_amount = 2
/datum/chemical_reaction/antitoxin
name = "Antitoxin"
id = "antitoxin"
results = list("antitoxin" = 3)
result = "antitoxin"
required_reagents = list("nitrogen" = 1, "silicon" = 1, "potassium" = 1)
result_amount = 3
/datum/chemical_reaction/tricordrazine
name = "Tricordrazine"
id = "tricordrazine"
results = list("tricordrazine" = 3)
required_reagents = list("bicaridine" = 1, "kelotane" = 1, "antitoxin" = 1)
result = "tricordrazine"
required_reagents = list("bicaridine" = 1, "kelotane" = 1, "antitoxin" = 1)
result_amount = 3
+111 -218
View File
@@ -2,293 +2,183 @@
/datum/chemical_reaction/sterilizine
name = "Sterilizine"
id = "sterilizine"
results = list("sterilizine" = 3)
result = "sterilizine"
required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1)
result_amount = 3
/datum/chemical_reaction/lube
name = "Space Lube"
id = "lube"
results = list("lube" = 4)
result = "lube"
required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1)
result_amount = 4
/datum/chemical_reaction/spraytan
name = "Spray Tan"
id = "spraytan"
results = list("spraytan" = 2)
result = "spraytan"
required_reagents = list("orangejuice" = 1, "oil" = 1)
result_amount = 2
/datum/chemical_reaction/spraytan2
name = "Spray Tan"
id = "spraytan"
results = list("spraytan" = 2)
result = "spraytan"
required_reagents = list("orangejuice" = 1, "cornoil" = 1)
result_amount = 2
/datum/chemical_reaction/impedrezene
name = "Impedrezene"
id = "impedrezene"
results = list("impedrezene" = 2)
result = "impedrezene"
required_reagents = list("mercury" = 1, "oxygen" = 1, "sugar" = 1)
result_amount = 2
/datum/chemical_reaction/cryptobiolin
name = "Cryptobiolin"
id = "cryptobiolin"
results = list("cryptobiolin" = 3)
result = "cryptobiolin"
required_reagents = list("potassium" = 1, "oxygen" = 1, "sugar" = 1)
result_amount = 3
/datum/chemical_reaction/glycerol
name = "Glycerol"
id = "glycerol"
results = list("glycerol" = 1)
result = "glycerol"
required_reagents = list("cornoil" = 3, "sacid" = 1)
result_amount = 1
/datum/chemical_reaction/sodiumchloride
name = "Sodium Chloride"
id = "sodiumchloride"
results = list("sodiumchloride" = 3)
result = "sodiumchloride"
required_reagents = list("water" = 1, "sodium" = 1, "chlorine" = 1)
result_amount = 3
/datum/chemical_reaction/plasmasolidification
name = "Solid Plasma"
id = "solidplasma"
result = null
required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20)
result_amount = 1
mob_react = 1
/datum/chemical_reaction/plasmasolidification/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/stack/sheet/mineral/plasma(location)
new /obj/item/stack/sheet/mineral/plasma(location)
return
/datum/chemical_reaction/goldsolidification
name = "Solid Gold"
id = "solidgold"
required_reagents = list("frostoil" = 5, "gold" = 20, "iron" = 1)
mob_react = 1
/datum/chemical_reaction/goldsolidification/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/stack/sheet/mineral/gold(location)
/datum/chemical_reaction/capsaicincondensation
name = "Capsaicincondensation"
id = "capsaicincondensation"
results = list("condensedcapsaicin" = 5)
result = "condensedcapsaicin"
required_reagents = list("capsaicin" = 1, "ethanol" = 5)
result_amount = 5
/datum/chemical_reaction/soapification
name = "Soapification"
id = "soapification"
result = null
required_reagents = list("liquidgibs" = 10, "lye" = 10) // requires two scooped gib tiles
required_temp = 374
result_amount = 1
mob_react = 1
/datum/chemical_reaction/soapification/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/weapon/soap/homemade(location)
new /obj/item/weapon/soap/homemade(location)
return
/datum/chemical_reaction/candlefication
name = "Candlefication"
id = "candlefication"
result = null
required_reagents = list("liquidgibs" = 5, "oxygen" = 5) //
required_temp = 374
result_amount = 1
mob_react = 1
/datum/chemical_reaction/candlefication/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/candle(location)
new /obj/item/candle(location)
return
/datum/chemical_reaction/meatification
name = "Meatification"
id = "meatification"
result = null
required_reagents = list("liquidgibs" = 10, "nutriment" = 10, "carbon" = 10)
result_amount = 1
mob_react = 1
/datum/chemical_reaction/meatification/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = 1, i <= created_volume, i++)
new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatproduct(location)
new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/meatproduct(location)
return
/datum/chemical_reaction/carbondioxide
name = "Direct Carbon Oxidation"
id = "burningcarbon"
results = list("co2" = 3)
result = "co2"
required_reagents = list("carbon" = 1, "oxygen" = 2)
required_temp = 777 // pure carbon isn't especially reactive.
/datum/chemical_reaction/nitrous_oxide
name = "Nitrous Oxide"
id = "nitrous_oxide"
results = list("nitrous_oxide" = 2, "water" = 4)
required_reagents = list("ammonia" = 3, "nitrogen" = 1, "oxygen" = 2)
required_temp = 525
////////////////////////////////// Mutation Toxins ///////////////////////////////////
/datum/chemical_reaction/stable_mutation_toxin
name = "Stable Mutation Toxin"
id = "stablemutationtoxin"
results = list("stablemutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "blood" = 1) //classic
/datum/chemical_reaction/lizard_mutation_toxin
name = "Lizard Mutation Toxin"
id = "lizardmutationtoxin"
results = list("lizardmutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "radium" = 1) //mutant
/datum/chemical_reaction/fly_mutation_toxin
name = "Fly Mutation Toxin"
id = "flymutationtoxin"
results = list("flymutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "mutagen" = 1) //VERY mutant
/datum/chemical_reaction/jelly_mutation_toxin
name = "Imperfect Mutation Toxin"
id = "jellymutationtoxin"
results = list("jellymutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "slimejelly" = 1) //why would you even make this
/datum/chemical_reaction/abductor_mutation_toxin
name = "Abductor Mutation Toxin"
id = "abductormutationtoxin"
results = list("abductormutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "morphine" = 1)
/datum/chemical_reaction/android_mutation_toxin
name = "Android Mutation Toxin"
id = "androidmutationtoxin"
results = list("androidmutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "teslium" = 1) //beep boop
/datum/chemical_reaction/pod_mutation_toxin
name = "Podperson Mutation Toxin"
id = "podmutationtoxin"
results = list("podmutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "eznutriment" = 1) //plant food
/datum/chemical_reaction/golem_mutation_toxin
name = "Golem Mutation Toxin"
id = "golemmutationtoxin"
results = list("golemmutationtoxin" = 1)
required_reagents = list("unstablemutationtoxin" = 1, "silver" = 1) //not too hard to get but also not just there in xenobio
//BLACKLISTED RACES
/datum/chemical_reaction/skeleton_mutation_toxin
name = "Skeleton Mutation Toxin"
id = "skeletonmutationtoxin"
results = list("skeletonmutationtoxin" = 1)
required_reagents = list("amutationtoxin" = 1, "milk" = 1) //good for yer bones
/datum/chemical_reaction/zombie_mutation_toxin
name = "Zombie Mutation Toxin"
id = "zombiemutationtoxin"
results = list("zombiemutationtoxin" = 1)
required_reagents = list("amutationtoxin" = 1, "toxin" = 1)
/datum/chemical_reaction/ash_mutation_toxin //ash lizard
name = "Ash Mutation Toxin"
id = "ashmutationtoxin"
results = list("ashmutationtoxin" = 1)
required_reagents = list("amutationtoxin" = 1, "lizardmutationtoxin" = 1, "ash" = 1)
//DANGEROUS RACES
/datum/chemical_reaction/plasma_mutation_toxin
name = "Plasma Mutation Toxin"
id = "plasmamutationtoxin"
results = list("plasmamutationtoxin" = 1)
required_reagents = list("skeletonmutationtoxin" = 1, "plasma" = 1, "uranium" = 1) //this is very fucking powerful, so it's hard to make
/datum/chemical_reaction/shadow_mutation_toxin
name = "Shadow Mutation Toxin"
id = "shadowmutationtoxin"
results = list("shadowmutationtoxin" = 1)
required_reagents = list("amutationtoxin" = 1, "liquid_dark_matter" = 1, "holywater" = 1)
//Technically a mutation toxin
/datum/chemical_reaction/mulligan
name = "Mulligan"
id = "mulligan"
results = list("mulligan" = 1)
required_reagents = list("humanmutationtoxin" = 1, "mutagen" = 1)
result_amount = 3
////////////////////////////////// VIROLOGY //////////////////////////////////////////
/datum/chemical_reaction/virus_food
name = "Virus Food"
id = "virusfood"
results = list("virusfood" = 15)
result = "virusfood"
required_reagents = list("water" = 5, "milk" = 5)
result_amount = 15
/datum/chemical_reaction/virus_food_mutagen
name = "mutagenic agar"
id = "mutagenvirusfood"
results = list("mutagenvirusfood" = 1)
result = "mutagenvirusfood"
required_reagents = list("mutagen" = 1, "virusfood" = 1)
result_amount = 1
/datum/chemical_reaction/virus_food_synaptizine
name = "virus rations"
id = "synaptizinevirusfood"
results = list("synaptizinevirusfood" = 1)
result = "synaptizinevirusfood"
required_reagents = list("synaptizine" = 1, "virusfood" = 1)
result_amount = 1
/datum/chemical_reaction/virus_food_plasma
name = "virus plasma"
id = "plasmavirusfood"
results = list("plasmavirusfood" = 1)
result = "plasmavirusfood"
required_reagents = list("plasma" = 1, "virusfood" = 1)
result_amount = 1
/datum/chemical_reaction/virus_food_plasma_synaptizine
name = "weakened virus plasma"
id = "weakplasmavirusfood"
results = list("weakplasmavirusfood" = 2)
result = "weakplasmavirusfood"
required_reagents = list("synaptizine" = 1, "plasmavirusfood" = 1)
result_amount = 2
/datum/chemical_reaction/virus_food_mutagen_sugar
name = "sucrose agar"
id = "sugarvirusfood"
results = list("sugarvirusfood" = 2)
result = "sugarvirusfood"
required_reagents = list("sugar" = 1, "mutagenvirusfood" = 1)
result_amount = 2
/datum/chemical_reaction/virus_food_mutagen_salineglucose
name = "sucrose agar"
id = "salineglucosevirusfood"
results = list("sugarvirusfood" = 2)
result = "sugarvirusfood"
required_reagents = list("salglu_solution" = 1, "mutagenvirusfood" = 1)
/datum/chemical_reaction/virus_food_uranium
name = "Decaying uranium gel"
id = "uraniumvirusfood"
results = list("uraniumvirusfood" = 1)
required_reagents = list("uranium" = 1, "virusfood" = 1)
/datum/chemical_reaction/virus_food_uranium_plasma
name = "Unstable uranium gel"
id = "uraniumvirusfood_plasma"
results = list("uraniumplasmavirusfood_unstable" = 1)
required_reagents = list("uranium" = 5, "plasmavirusfood" = 1)
/datum/chemical_reaction/virus_food_uranium_plasma_gold
name = "Stable uranium gel"
id = "uraniumvirusfood_gold"
results = list("uraniumplasmavirusfood_stable" = 1)
required_reagents = list("uranium" = 10, "gold" = 10, "plasma" = 1)
/datum/chemical_reaction/virus_food_uranium_plasma_silver
name = "Stable uranium gel"
id = "uraniumvirusfood_silver"
results = list("uraniumplasmavirusfood_stable" = 1)
required_reagents = list("uranium" = 10, "silver" = 10, "plasma" = 1)
result_amount = 2
/datum/chemical_reaction/mix_virus
name = "Mix Virus"
id = "mixvirus"
results = list("blood" = 1)
result = "blood"
required_reagents = list("virusfood" = 1)
required_catalysts = list("blood" = 1)
var/level_min = 0
@@ -367,30 +257,6 @@
level_min = 1
level_max = 1
/datum/chemical_reaction/mix_virus/mix_virus_10
name = "Mix Virus 10"
id = "mixvirus10"
required_reagents = list("uraniumvirusfood" = 5)
level_min = 6
level_max = 7
/datum/chemical_reaction/mix_virus/mix_virus_11
name = "Mix Virus 11"
id = "mixvirus11"
required_reagents = list("uraniumplasmavirusfood_unstable" = 5)
level_min = 7
level_max = 7
/datum/chemical_reaction/mix_virus/mix_virus_12
name = "Mix Virus 12"
id = "mixvirus12"
required_reagents = list("uraniumplasmavirusfood_stable" = 5)
level_min = 8
level_max = 8
/datum/chemical_reaction/mix_virus/rem_virus
name = "Devolve Virus"
@@ -414,13 +280,17 @@
/datum/chemical_reaction/surfactant
name = "Foam surfactant"
id = "foam surfactant"
results = list("fluorosurfactant" = 5)
result = "fluorosurfactant"
required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1)
result_amount = 5
/datum/chemical_reaction/foam
name = "Foam"
id = "foam"
result = null
required_reagents = list("fluorosurfactant" = 1, "water" = 1)
result_amount = 2
mob_react = 1
/datum/chemical_reaction/foam/on_reaction(datum/reagents/holder, created_volume)
@@ -428,7 +298,7 @@
for(var/mob/M in viewers(5, location))
M << "<span class='danger'>The solution spews out foam!</span>"
var/datum/effect_system/foam_spread/s = new()
s.set_up(created_volume*2, location, holder)
s.set_up(created_volume, location, holder)
s.start()
holder.clear_reagents()
return
@@ -437,7 +307,9 @@
/datum/chemical_reaction/metalfoam
name = "Metal Foam"
id = "metalfoam"
result = null
required_reagents = list("aluminium" = 3, "foaming_agent" = 1, "facid" = 1)
result_amount = 5
mob_react = 1
/datum/chemical_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume)
@@ -447,14 +319,16 @@
M << "<span class='danger'>The solution spews out a metallic foam!</span>"
var/datum/effect_system/foam_spread/metal/s = new()
s.set_up(created_volume*5, location, holder, 1)
s.set_up(created_volume, location, holder, 1)
s.start()
holder.clear_reagents()
/datum/chemical_reaction/ironfoam
name = "Iron Foam"
id = "ironlfoam"
result = null
required_reagents = list("iron" = 3, "foaming_agent" = 1, "facid" = 1)
result_amount = 5
mob_react = 1
/datum/chemical_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume)
@@ -462,15 +336,16 @@
for(var/mob/M in viewers(5, location))
M << "<span class='danger'>The solution spews out a metallic foam!</span>"
var/datum/effect_system/foam_spread/metal/s = new()
s.set_up(created_volume*5, location, holder, 2)
s.set_up(created_volume, location, holder, 2)
s.start()
holder.clear_reagents()
/datum/chemical_reaction/foaming_agent
name = "Foaming Agent"
id = "foaming_agent"
results = list("foaming_agent" = 1)
result = "foaming_agent"
required_reagents = list("lithium" = 1, "hydrogen" = 1)
result_amount = 1
/////////////////////////////// Cleaning and hydroponics /////////////////////////////////////////////////
@@ -478,149 +353,167 @@
/datum/chemical_reaction/ammonia
name = "Ammonia"
id = "ammonia"
results = list("ammonia" = 3)
result = "ammonia"
required_reagents = list("hydrogen" = 3, "nitrogen" = 1)
result_amount = 3
/datum/chemical_reaction/diethylamine
name = "Diethylamine"
id = "diethylamine"
results = list("diethylamine" = 2)
result = "diethylamine"
required_reagents = list ("ammonia" = 1, "ethanol" = 1)
result_amount = 2
/datum/chemical_reaction/space_cleaner
name = "Space cleaner"
id = "cleaner"
results = list("cleaner" = 2)
result = "cleaner"
required_reagents = list("ammonia" = 1, "water" = 1)
result_amount = 2
/datum/chemical_reaction/plantbgone
name = "Plant-B-Gone"
id = "plantbgone"
results = list("plantbgone" = 5)
result = "plantbgone"
required_reagents = list("toxin" = 1, "water" = 4)
result_amount = 5
/datum/chemical_reaction/weedkiller
name = "Weed Killer"
id = "weedkiller"
results = list("weedkiller" = 5)
result = "weedkiller"
required_reagents = list("toxin" = 1, "ammonia" = 4)
result_amount = 5
/datum/chemical_reaction/pestkiller
name = "Pest Killer"
id = "pestkiller"
results = list("pestkiller" = 5)
result = "pestkiller"
required_reagents = list("toxin" = 1, "ethanol" = 4)
result_amount = 5
/datum/chemical_reaction/drying_agent
name = "Drying agent"
id = "drying_agent"
results = list("drying_agent" = 3)
result = "drying_agent"
required_reagents = list("stable_plasma" = 2, "ethanol" = 1, "sodium" = 1)
result_amount = 3
//////////////////////////////////// Other goon stuff ///////////////////////////////////////////
/datum/chemical_reaction/acetone
name = "acetone"
id = "acetone"
results = list("acetone" = 3)
result = "acetone"
required_reagents = list("oil" = 1, "welding_fuel" = 1, "oxygen" = 1)
result_amount = 3
/datum/chemical_reaction/carpet
name = "carpet"
id = "carpet"
results = list("carpet" = 2)
result = "carpet"
required_reagents = list("space_drugs" = 1, "blood" = 1)
result_amount = 2
/datum/chemical_reaction/oil
name = "Oil"
id = "oil"
results = list("oil" = 3)
result = "oil"
required_reagents = list("welding_fuel" = 1, "carbon" = 1, "hydrogen" = 1)
result_amount = 3
/datum/chemical_reaction/phenol
name = "phenol"
id = "phenol"
results = list("phenol" = 3)
result = "phenol"
required_reagents = list("water" = 1, "chlorine" = 1, "oil" = 1)
result_amount = 3
/datum/chemical_reaction/ash
name = "Ash"
id = "ash"
results = list("ash" = 1)
result = "ash"
required_reagents = list("oil" = 1)
result_amount = 1
required_temp = 480
/datum/chemical_reaction/colorful_reagent
name = "colorful_reagent"
id = "colorful_reagent"
results = list("colorful_reagent" = 5)
result = "colorful_reagent"
required_reagents = list("stable_plasma" = 1, "radium" = 1, "space_drugs" = 1, "cryoxadone" = 1, "triple_citrus" = 1)
result_amount = 5
/datum/chemical_reaction/life
name = "Life"
id = "life"
result = null
required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1)
result_amount = 1
required_temp = 374
/datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume)
chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life") // Lol.
chemical_mob_spawn(holder, 1, "Life")
/datum/chemical_reaction/corgium
name = "corgium"
id = "corgium"
result = null
required_reagents = list("nutriment" = 1, "colorful_reagent" = 1, "strange_reagent" = 1, "blood" = 1)
result_amount = 1
required_temp = 374
/datum/chemical_reaction/corgium/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
for(var/i = rand(1, created_volume), i <= created_volume, i++) // More lulz.
new /mob/living/simple_animal/pet/dog/corgi(location)
new /mob/living/simple_animal/pet/dog/corgi(location)
..()
/datum/chemical_reaction/hair_dye
name = "hair_dye"
id = "hair_dye"
results = list("hair_dye" = 5)
result = "hair_dye"
required_reagents = list("colorful_reagent" = 1, "radium" = 1, "space_drugs" = 1)
result_amount = 5
/datum/chemical_reaction/barbers_aid
name = "barbers_aid"
id = "barbers_aid"
results = list("barbers_aid" = 5)
result = "barbers_aid"
required_reagents = list("carpet" = 1, "radium" = 1, "space_drugs" = 1)
result_amount = 5
/datum/chemical_reaction/concentrated_barbers_aid
name = "concentrated_barbers_aid"
id = "concentrated_barbers_aid"
results = list("concentrated_barbers_aid" = 2)
result = "concentrated_barbers_aid"
required_reagents = list("barbers_aid" = 1, "mutagen" = 1)
result_amount = 2
/datum/chemical_reaction/saltpetre
name = "saltpetre"
id = "saltpetre"
results = list("saltpetre" = 3)
result = "saltpetre"
required_reagents = list("potassium" = 1, "nitrogen" = 1, "oxygen" = 3)
result_amount = 3
/datum/chemical_reaction/lye
name = "lye"
id = "lye"
results = list("lye" = 3)
result = "lye"
required_reagents = list("sodium" = 1, "hydrogen" = 1, "oxygen" = 1)
result_amount = 3
/datum/chemical_reaction/lye2
name = "lye"
id = "lye"
results = list("lye" = 2)
result = "lye"
required_reagents = list("ash" = 1, "water" = 1)
result_amount = 2
/datum/chemical_reaction/royal_bee_jelly
name = "royal bee jelly"
id = "royal_bee_jelly"
results = list("royal_bee_jelly" = 5)
result = "royal_bee_jelly"
required_reagents = list("mutagen" = 10, "honey" = 40)
/datum/chemical_reaction/laughter
name = "laughter"
id = "laughter"
results = list("laughter" = 10) // Fuck it. I'm not touching this one.
required_reagents = list("sugar" = 1, "banana" = 1)
result_amount = 5
@@ -1,6 +1,7 @@
/datum/chemical_reaction/reagent_explosion
name = "Generic explosive"
id = "reagent_explosion"
result = null
var/strengthdiv = 10
var/modifier = 0
@@ -15,8 +16,8 @@
if(lastkey)
var/mob/toucher = get_mob_by_key(lastkey)
touch_msg = "[key_name_admin(lastkey)]<A HREF='?_src_=holder;adminmoreinfo=\ref[toucher]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[toucher]'>FLW</A>)"
message_admins("Reagent explosion reaction occurred at <a href='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[T.loc.name] (JMP)</a>[inside_msg]. Last Fingerprint: [touch_msg].")
log_game("Reagent explosion reaction occurred at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"]." )
message_admins("Reagent explosion reaction occured at <a href='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[T.loc.name] (JMP)</a>[inside_msg]. Last Fingerprint: [touch_msg].")
log_game("Reagent explosion reaction occured at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"]." )
var/datum/effect_system/reagents_explosion/e = new()
e.set_up(modifier + round(created_volume/strengthdiv, 1), T, 0, 0)
e.start()
@@ -26,20 +27,22 @@
/datum/chemical_reaction/reagent_explosion/nitroglycerin
name = "Nitroglycerin"
id = "nitroglycerin"
results = list("nitroglycerin" = 2)
result = "nitroglycerin"
required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1)
result_amount = 2
strengthdiv = 2
/datum/chemical_reaction/reagent_explosion/nitroglycerin/on_reaction(datum/reagents/holder, created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
holder.remove_reagent("nitroglycerin", created_volume*2)
holder.remove_reagent("nitroglycerin", created_volume)
..()
/datum/chemical_reaction/reagent_explosion/nitroglycerin_explosion
name = "Nitroglycerin explosion"
id = "nitroglycerin_explosion"
required_reagents = list("nitroglycerin" = 1)
result_amount = 1
required_temp = 474
strengthdiv = 2
@@ -48,6 +51,7 @@
name = "Explosion"
id = "potassium_explosion"
required_reagents = list("water" = 1, "potassium" = 1)
result_amount = 2
strengthdiv = 10
/datum/chemical_reaction/reagent_explosion/potassium_explosion/holyboom
@@ -60,18 +64,16 @@
playsound(get_turf(holder.my_atom), 'sound/effects/pray.ogg', 80, 0, round(created_volume/48))
strengthdiv = 8
for(var/mob/living/simple_animal/revenant/R in get_hearers_in_view(7,get_turf(holder.my_atom)))
var/deity
if(SSreligion.Bible_deity_name)
deity = SSreligion.Bible_deity_name
else
deity = "Christ"
R << "<span class='userdanger'>The power of [deity] compels you!</span>"
var/diety = ticker.Bible_deity_name
if(!ticker.Bible_deity_name)
diety = "Christ"
R << "<span class='userdanger'>The power of [diety] compels you!</span>"
R.stun(20)
R.reveal(100)
R.adjustHealth(50)
sleep(20)
for(var/mob/living/carbon/C in get_hearers_in_view(round(created_volume/48,1),get_turf(holder.my_atom)))
if(iscultist(C))
if(iscultist(C) || is_handofgod_cultist(C))
C << "<span class='userdanger'>The divine explosion sears you!</span>"
C.Weaken(2)
C.adjust_fire_stacks(5)
@@ -82,13 +84,15 @@
/datum/chemical_reaction/blackpowder
name = "Black Powder"
id = "blackpowder"
results = list("blackpowder" = 3)
result = "blackpowder"
required_reagents = list("saltpetre" = 1, "charcoal" = 1, "sulfur" = 1)
result_amount = 3
/datum/chemical_reaction/reagent_explosion/blackpowder_explosion
name = "Black Powder Kaboom"
id = "blackpowder_explosion"
required_reagents = list("blackpowder" = 1)
result_amount = 1
required_temp = 474
strengthdiv = 6
modifier = 1
@@ -101,32 +105,38 @@
/datum/chemical_reaction/thermite
name = "Thermite"
id = "thermite"
results = list("thermite" = 3)
result = "thermite"
required_reagents = list("aluminium" = 1, "iron" = 1, "oxygen" = 1)
result_amount = 3
/datum/chemical_reaction/emp_pulse
name = "EMP Pulse"
id = "emp_pulse"
result = null
required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense
result_amount = 2
/datum/chemical_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
// 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes.
// 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades.
empulse(location, round(created_volume / 12), round(created_volume / 7), 1)
empulse(location, round(created_volume / 24), round(created_volume / 14), 1)
holder.clear_reagents()
/datum/chemical_reaction/stabilizing_agent
name = "stabilizing_agent"
id = "stabilizing_agent"
results = list("stabilizing_agent" = 3)
result = "stabilizing_agent"
required_reagents = list("iron" = 1, "oxygen" = 1, "hydrogen" = 1)
result_amount = 3
/datum/chemical_reaction/clf3
name = "Chlorine Trifluoride"
id = "clf3"
results = list("clf3" = 4)
result = "clf3"
required_reagents = list("chlorine" = 1, "fluorine" = 3)
result_amount = 4
required_temp = 424
/datum/chemical_reaction/clf3/on_reaction(datum/reagents/holder, created_volume)
@@ -135,10 +145,12 @@
PoolOrNew(/obj/effect/hotspot, turf)
holder.chem_temp = 1000 // hot as shit
/datum/chemical_reaction/reagent_explosion/methsplosion
/datum/chemical_reaction/reagent_explosion/methsplosion/
name = "Meth explosion"
id = "methboom1"
results = list("methboom1" = 1)
result = "methboom1"
result_amount = 1
required_temp = 380 //slightly above the meth mix time.
required_reagents = list("methamphetamine" = 1)
strengthdiv = 6
@@ -154,25 +166,28 @@
/datum/chemical_reaction/reagent_explosion/methsplosion/methboom2
required_reagents = list("diethylamine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) //diethylamine is often left over from mixing the ephedrine.
required_temp = 300 //room temperature, chilling it even a little will prevent the explosion
results = list("methboom1" = 4) // this is ugly. Sorry goof.
result_amount = 4
/datum/chemical_reaction/sorium
name = "Sorium"
id = "sorium"
results = list("sorium" = 4)
result = "sorium"
required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1)
result_amount = 4
/datum/chemical_reaction/sorium/on_reaction(datum/reagents/holder, created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
holder.remove_reagent("sorium", created_volume*4)
holder.remove_reagent("sorium", created_volume)
var/turf/T = get_turf(holder.my_atom)
var/range = Clamp(sqrt(created_volume*4), 1, 6)
var/range = Clamp(sqrt(created_volume), 1, 6)
goonchem_vortex(T, 1, range)
/datum/chemical_reaction/sorium_vortex
name = "sorium_vortex"
id = "sorium_vortex"
result = null
result_amount = 1
required_reagents = list("sorium" = 1)
required_temp = 474
@@ -181,23 +196,27 @@
var/range = Clamp(sqrt(created_volume), 1, 6)
goonchem_vortex(T, 1, range)
/datum/chemical_reaction/liquid_dark_matter
name = "Liquid Dark Matter"
id = "liquid_dark_matter"
results = list("liquid_dark_matter" = 3)
result = "liquid_dark_matter"
required_reagents = list("stable_plasma" = 1, "radium" = 1, "carbon" = 1)
result_amount = 3
/datum/chemical_reaction/liquid_dark_matter/on_reaction(datum/reagents/holder, created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
holder.remove_reagent("liquid_dark_matter", created_volume*3)
holder.remove_reagent("liquid_dark_matter", created_volume)
var/turf/T = get_turf(holder.my_atom)
var/range = Clamp(sqrt(created_volume*3), 1, 6)
var/range = Clamp(sqrt(created_volume), 1, 6)
goonchem_vortex(T, 0, range)
/datum/chemical_reaction/ldm_vortex
name = "LDM Vortex"
id = "ldm_vortex"
result = null
result_amount = 1
required_reagents = list("liquid_dark_matter" = 1)
required_temp = 474
@@ -209,8 +228,9 @@
/datum/chemical_reaction/flash_powder
name = "Flash powder"
id = "flash_powder"
results = list("flash_powder" = 3)
result = "flash_powder"
required_reagents = list("aluminium" = 1, "potassium" = 1, "sulfur" = 1 )
result_amount = 3
/datum/chemical_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume)
if(holder.has_reagent("stabilizing_agent"))
@@ -219,18 +239,20 @@
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(2, 1, location)
s.start()
for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/3, location))
if(C.flash_act())
for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location))
if(C.flash_eyes())
if(get_dist(C, location) < 4)
C.Weaken(5)
else
C.Stun(5)
holder.remove_reagent("flash_powder", created_volume*3)
holder.remove_reagent("flash_powder", created_volume)
/datum/chemical_reaction/flash_powder_flash
name = "Flash powder activation"
id = "flash_powder_flash"
result = null
required_reagents = list("flash_powder" = 1)
result_amount = 1
required_temp = 374
/datum/chemical_reaction/flash_powder_flash/on_reaction(datum/reagents/holder, created_volume)
@@ -239,7 +261,7 @@
s.set_up(2, 1, location)
s.start()
for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location))
if(C.flash_act())
if(C.flash_eyes())
if(get_dist(C, location) < 4)
C.Weaken(5)
else
@@ -248,20 +270,21 @@
/datum/chemical_reaction/smoke_powder
name = "smoke_powder"
id = "smoke_powder"
results = list("smoke_powder" = 3)
result = "smoke_powder"
required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1)
result_amount = 3
/datum/chemical_reaction/smoke_powder/on_reaction(datum/reagents/holder, created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
holder.remove_reagent("smoke_powder", created_volume*3)
var/smoke_radius = round(sqrt(created_volume * 1.5), 1)
holder.remove_reagent("smoke_powder", created_volume)
var/smoke_radius = round(sqrt(created_volume / 2), 1)
var/location = get_turf(holder.my_atom)
var/datum/effect_system/smoke_spread/chem/S = new
S.attach(location)
playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)
if(S)
S.set_up(holder, smoke_radius, location, 0)
S.set_up(holder, smoke_radius, 0, location)
S.start()
if(holder && holder.my_atom)
holder.clear_reagents()
@@ -269,8 +292,10 @@
/datum/chemical_reaction/smoke_powder_smoke
name = "smoke_powder_smoke"
id = "smoke_powder_smoke"
result = null
required_reagents = list("smoke_powder" = 1)
required_temp = 374
result_amount = 1
secondary = 1
mob_react = 1
@@ -281,43 +306,68 @@
S.attach(location)
playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)
if(S)
S.set_up(holder, smoke_radius, location, 0)
S.set_up(holder, smoke_radius, 0, location)
S.start()
if(holder && holder.my_atom)
holder.clear_reagents()
/datum/chemical_reaction/sonic_powder
name = "sonic_powder"
id = "sonic_powder"
results = list("sonic_powder" = 3)
result = "sonic_powder"
required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1)
result_amount = 3
/datum/chemical_reaction/sonic_powder/on_reaction(datum/reagents/holder, created_volume)
if(holder.has_reagent("stabilizing_agent"))
return
holder.remove_reagent("sonic_powder", created_volume*3)
holder.remove_reagent("sonic_powder", created_volume)
var/location = get_turf(holder.my_atom)
playsound(location, 'sound/effects/bang.ogg', 25, 1)
for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/3, location))
C.soundbang_act(1, 5, rand(0, 5))
for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location))
if(C.check_ear_prot())
continue
C.show_message("<span class='warning'>BANG</span>", 2)
C.Stun(5)
C.Weaken(5)
C.setEarDamage(C.ear_damage + rand(0, 5), max(C.ear_deaf,15))
if(C.ear_damage >= 15)
C << "<span class='warning'>Your ears start to ring badly!</span>"
else if(C.ear_damage >= 5)
C << "<span class='warning'>Your ears start to ring!</span>"
/datum/chemical_reaction/sonic_powder_deafen
name = "sonic_powder_deafen"
id = "sonic_powder_deafen"
result = null
required_reagents = list("sonic_powder" = 1)
required_temp = 374
result_amount = 1
/datum/chemical_reaction/sonic_powder_deafen/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
playsound(location, 'sound/effects/bang.ogg', 25, 1)
for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location))
C.soundbang_act(1, 5, rand(0, 5))
if(C.check_ear_prot())
continue
C.show_message("<span class='warning'>BANG</span>", 2)
C.Stun(5)
C.Weaken(5)
C.setEarDamage(C.ear_damage + rand(0, 5), max(C.ear_deaf,15))
if(C.ear_damage >= 15)
C << "<span class='warning'>Your ears start to ring badly!</span>"
else if(C.ear_damage >= 5)
C << "<span class='warning'>Your ears start to ring!</span>"
/datum/chemical_reaction/phlogiston
name = "phlogiston"
id = "phlogiston"
results = list("phlogiston" = 3)
result = "phlogiston"
required_reagents = list("phosphorus" = 1, "sacid" = 1, "stable_plasma" = 1)
result_amount = 3
/datum/chemical_reaction/phlogiston/on_reaction(datum/reagents/holder, created_volume)
if(holder.has_reagent("stabilizing_agent"))
@@ -328,17 +378,21 @@
holder.clear_reagents()
return
/datum/chemical_reaction/napalm
name = "Napalm"
id = "napalm"
results = list("napalm" = 3)
result = "napalm"
required_reagents = list("oil" = 1, "welding_fuel" = 1, "ethanol" = 1 )
result_amount = 3
/datum/chemical_reaction/cryostylane
name = "cryostylane"
id = "cryostylane"
results = list("cryostylane" = 3)
result = "cryostylane"
required_reagents = list("water" = 1, "stable_plasma" = 1, "nitrogen" = 1)
result_amount = 3
/datum/chemical_reaction/cryostylane/on_reaction(datum/reagents/holder, created_volume)
holder.chem_temp = 20 // cools the fuck down
@@ -348,58 +402,10 @@
/datum/chemical_reaction/pyrosium
name = "pyrosium"
id = "pyrosium"
results = list("pyrosium" = 3)
result = "pyrosium"
required_reagents = list("stable_plasma" = 1, "radium" = 1, "phosphorus" = 1)
result_amount = 3
/datum/chemical_reaction/pyrosium/on_reaction(datum/reagents/holder, created_volume)
holder.chem_temp = 20 // also cools the fuck down
return
/datum/chemical_reaction/teslium
name = "Teslium"
id = "teslium"
results = list("teslium" = 3)
required_reagents = list("stable_plasma" = 1, "silver" = 1, "blackpowder" = 1)
mix_message = "<span class='danger'>A jet of sparks flies from the mixture as it merges into a flickering slurry.</span>"
required_temp = 400
/datum/chemical_reaction/reagent_explosion/teslium_lightning
name = "Teslium Destabilization"
id = "teslium_lightning"
required_reagents = list("teslium" = 1, "water" = 1)
results = list("destabilized_teslium" = 1)
strengthdiv = 100
modifier = -100
mix_message = "<span class='boldannounce'>The teslium starts to spark as electricity arcs away from it!</span>"
mix_sound = 'sound/machines/defib_zap.ogg'
/datum/chemical_reaction/reagent_explosion/teslium_lightning/on_reaction(datum/reagents/holder, created_volume)
var/T1 = created_volume * 20 //100 units : Zap 3 times, with powers 2000/5000/12000. Tesla revolvers have a power of 10000 for comparison.
var/T2 = created_volume * 50
var/T3 = created_volume * 120
sleep(5)
if(created_volume >= 75)
tesla_zap(holder.my_atom, 7, T1)
playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1)
sleep(15)
if(created_volume >= 40)
tesla_zap(holder.my_atom, 7, T2)
playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1)
sleep(15)
if(created_volume >= 10) //10 units minimum for lightning, 40 units for secondary blast, 75 units for tertiary blast.
tesla_zap(holder.my_atom, 7, T3)
playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1)
..()
/datum/chemical_reaction/reagent_explosion/teslium_lightning/heat
id = "teslium_lightning2"
required_temp = 474
required_reagents = list("teslium" = 1)
/datum/chemical_reaction/reagent_explosion/nitrous_oxide
name = "N2O explosion"
id = "n2o_explosion"
required_reagents = list("nitrous_oxide" = 1)
strengthdiv = 7
required_temp = 575
modifier = 1
@@ -1,172 +1,152 @@
/datum/chemical_reaction/slime
/datum/chemical_reaction/slime/on_reaction(datum/reagents/holder)
delete_extract(holder)
/datum/chemical_reaction/slime/proc/delete_extract(datum/reagents/holder)
var/obj/item/slime_extract/M = holder.my_atom
if(M.Uses <= 0)
if (!results.len) //if the slime doesn't output chemicals
qdel(M)
//Grey
/datum/chemical_reaction/slime/slimespawn
/datum/chemical_reaction/slimespawn
name = "Slime Spawn"
id = "m_spawn"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/grey
required_other = 1
/datum/chemical_reaction/slime/slimespawn/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimespawn/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/mob/living/simple_animal/slime/S
S = new(get_turf(holder.my_atom), "grey")
S.visible_message("<span class='danger'>Infused with plasma, the \
core begins to quiver and grow, and soon a new baby slime \
emerges from it!</span>")
..()
/datum/chemical_reaction/slime/slimeinaprov
/datum/chemical_reaction/slimeinaprov
name = "Slime epinephrine"
id = "m_inaprov"
results = list("epinephrine" = 3)
result = "epinephrine"
required_reagents = list("water" = 5)
result_amount = 3
required_other = 1
required_container = /obj/item/slime_extract/grey
/datum/chemical_reaction/slime/slimeinaprov/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimeinaprov/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
/datum/chemical_reaction/slime/slimemonkey
/datum/chemical_reaction/slimemonkey
name = "Slime Monkey"
id = "m_monkey"
result = null
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/grey
required_other = 1
/datum/chemical_reaction/slime/slimemonkey/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimemonkey/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
for(var/i = 1, i <= 3, i++)
var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube
M.loc = get_turf(holder.my_atom)
..()
//Green
/datum/chemical_reaction/slime/slimemutate
/datum/chemical_reaction/slimemutate
name = "Mutation Toxin"
id = "mutationtoxin"
results = list("mutationtoxin" = 1)
result = "mutationtoxin"
required_reagents = list("plasma" = 1)
result_amount = 1
required_other = 1
required_container = /obj/item/slime_extract/green
/datum/chemical_reaction/slime/slimemutate/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimemutate/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
//Mutated Green
/datum/chemical_reaction/slime/slimemutate_unstable
/datum/chemical_reaction/slimemutate_unstable
name = "Unstable Mutation Toxin"
id = "unstablemutationtoxin"
results = list("unstablemutationtoxin" = 1)
result = "unstablemutationtoxin"
required_reagents = list("radium" = 1)
result_amount = 1
required_other = 1
required_container = /obj/item/slime_extract/green
mix_message = "<span class='info'>The mixture rapidly expands and contracts, its appearance shifting into a sickening green.</span>"
/datum/chemical_reaction/slime/slimemutate_unstable/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimemutate_unstable/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
//Metal
/datum/chemical_reaction/slime/slimemetal
/datum/chemical_reaction/slimemetal
name = "Slime Metal"
id = "m_metal"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/metal
required_other = 1
/datum/chemical_reaction/slime/slimemetal/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimemetal/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/location = get_turf(holder.my_atom)
new /obj/item/stack/sheet/plasteel (location, 5)
new /obj/item/stack/sheet/metal (location, 15)
..()
/datum/chemical_reaction/slime/slimeglass
name = "Slime Glass"
id = "m_glass"
required_reagents = list("water" = 1)
required_container = /obj/item/slime_extract/metal
required_other = 1
/datum/chemical_reaction/slime/slimeglass/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/location = get_turf(holder.my_atom)
new /obj/item/stack/sheet/rglass (location, 5)
new /obj/item/stack/sheet/glass (location, 15)
..()
var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal
M.amount = 15
M.loc = get_turf(holder.my_atom)
var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel
P.amount = 5
P.loc = get_turf(holder.my_atom)
//Gold
/datum/chemical_reaction/slime/slimecrit
/datum/chemical_reaction/slimecrit
name = "Slime Crit"
id = "m_tele"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/gold
required_other = 1
/datum/chemical_reaction/slime/slimecrit/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimecrit/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='danger'>The slime extract begins to vibrate violently !</span>")
addtimer(src, "chemical_mob_spawn", 50, TIMER_NORMAL, holder, 5, "Gold Slime")
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
M.qdel_timer = addtimer(src, "delete_extract", 55, TIMER_NORMAL, holder)
addtimer(src, "chemical_mob_spawn", 50, FALSE, holder, 5, "Gold Slime")
/datum/chemical_reaction/slime/slimecritlesser
/datum/chemical_reaction/slimecritlesser
name = "Slime Crit Lesser"
id = "m_tele3"
result = null
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/gold
required_other = 1
/datum/chemical_reaction/slime/slimecritlesser/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimecritlesser/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='danger'>The slime extract begins to vibrate violently !</span>")
addtimer(src, "chemical_mob_spawn", 50, TIMER_NORMAL, holder, 3, "Lesser Gold Slime", "neutral")
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
M.qdel_timer = addtimer(src, "delete_extract", 55, TIMER_NORMAL, holder)
addtimer(src, "chemical_mob_spawn", 50, FALSE, holder, 3, "Lesser Gold Slime", "neutral")
/datum/chemical_reaction/slime/slimecritfriendly
/datum/chemical_reaction/slimecritfriendly
name = "Slime Crit Friendly"
id = "m_tele5"
result = null
required_reagents = list("water" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/gold
required_other = 1
/datum/chemical_reaction/slime/slimecritfriendly/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimecritfriendly/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='danger'>The slime extract begins to vibrate adorably !</span>")
addtimer(src, "chemical_mob_spawn", 50, TIMER_NORMAL, holder, 1, "Friendly Gold Slime", "neutral")
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
M.qdel_timer = addtimer(src, "delete_extract", 55, TIMER_NORMAL, holder)
addtimer(src, "chemical_mob_spawn", 50, FALSE, holder, 1, "Friendly Gold Slime", "neutral")
//Silver
/datum/chemical_reaction/slime/slimebork
/datum/chemical_reaction/slimebork
name = "Slime Bork"
id = "m_tele2"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/silver
required_other = 1
/datum/chemical_reaction/slime/slimebork/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimebork/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/list/blocked = list(/obj/item/weapon/reagent_containers/food/snacks,
@@ -194,7 +174,7 @@
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null))
C.flash_act()
C.flash_eyes()
for(var/i = 1, i <= 4 + rand(1,2), i++)
var/chosen = pick(borks)
@@ -204,17 +184,18 @@
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(B, pick(NORTH,SOUTH,EAST,WEST))
..()
/datum/chemical_reaction/slime/slimebork2
/datum/chemical_reaction/slimebork2
name = "Slime Bork 2"
id = "m_tele4"
result = null
required_reagents = list("water" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/silver
required_other = 1
/datum/chemical_reaction/slime/slimebork2/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimebork2/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/list/borks = subtypesof(/obj/item/weapon/reagent_containers/food/drinks)
@@ -223,7 +204,7 @@
playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1)
for(var/mob/living/carbon/M in viewers(get_turf(holder.my_atom), null))
M.flash_act()
M.flash_eyes()
for(var/i = 1, i <= 4 + rand(1,2), i++)
var/chosen = pick(borks)
@@ -233,314 +214,288 @@
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(B, pick(NORTH,SOUTH,EAST,WEST))
..()
//Blue
/datum/chemical_reaction/slime/slimefrost
/datum/chemical_reaction/slimefrost
name = "Slime Frost Oil"
id = "m_frostoil"
results = list("frostoil" = 10)
result = "frostoil"
required_reagents = list("plasma" = 1)
result_amount = 10
required_container = /obj/item/slime_extract/blue
required_other = 1
/datum/chemical_reaction/slime/slimefrost/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimefrost/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
/datum/chemical_reaction/slime/slimestabilizer
/datum/chemical_reaction/slimestabilizer
name = "Slime Stabilizer"
id = "m_slimestabilizer"
result = null
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/blue
required_other = 1
/datum/chemical_reaction/slime/slimestabilizer/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimestabilizer/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/stabilizer/P = new /obj/item/slimepotion/stabilizer
P.loc = get_turf(holder.my_atom)
..()
/datum/chemical_reaction/slime/slimefoam
name = "Slime Foam"
id = "m_foam"
results = list("fluorosurfactant" = 20, "water" = 20)
required_reagents = list("water" = 5)
required_container = /obj/item/slime_extract/blue
required_other = 1
/datum/chemical_reaction/slime/slimefoam/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
//Dark Blue
/datum/chemical_reaction/slime/slimefreeze
/datum/chemical_reaction/slimefreeze
name = "Slime Freeze"
id = "m_freeze"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/darkblue
required_other = 1
/datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimefreeze/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='danger'>The slime extract begins to vibrate adorably!</span>")
addtimer(src, "freeze", 50, TIMER_NORMAL, holder)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
M.qdel_timer = addtimer(src, "delete_extract", 55, TIMER_NORMAL, holder)
/datum/chemical_reaction/slime/slimefreeze/proc/freeze(datum/reagents/holder)
addtimer(src, "freeze", 50, FALSE, holder)
/datum/chemical_reaction/slimefreeze/proc/freeze(datum/reagents/holder)
if(holder && holder.my_atom)
var/turf/open/T = get_turf(holder.my_atom)
if(istype(T))
T.atmos_spawn_air("freon=50;TEMP=120")
var/turf/T = get_turf(holder.my_atom)
playsound(T, 'sound/effects/phasein.ogg', 100, 1)
for(var/mob/living/M in range(T, 7))
M.bodytemperature -= 240
M << "<span class='notice'>You feel a chill!</span>"
/datum/chemical_reaction/slime/slimefireproof
/datum/chemical_reaction/slimefireproof
name = "Slime Fireproof"
id = "m_fireproof"
result = null
required_reagents = list("water" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/darkblue
required_other = 1
/datum/chemical_reaction/slime/slimefireproof/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimefireproof/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/fireproof/P = new /obj/item/slimepotion/fireproof
P.loc = get_turf(holder.my_atom)
..()
//Orange
/datum/chemical_reaction/slime/slimecasp
/datum/chemical_reaction/slimecasp
name = "Slime Capsaicin Oil"
id = "m_capsaicinoil"
results = list("capsaicin" = 10)
result = "capsaicin"
required_reagents = list("blood" = 1)
result_amount = 10
required_container = /obj/item/slime_extract/orange
required_other = 1
/datum/chemical_reaction/slime/slimecasp/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimecasp/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
/datum/chemical_reaction/slime/slimefire
/datum/chemical_reaction/slimefire
name = "Slime fire"
id = "m_fire"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/orange
required_other = 1
/datum/chemical_reaction/slime/slimefire/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimefire/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/TU = get_turf(holder.my_atom)
TU.visible_message("<span class='danger'>The slime extract begins to vibrate adorably!</span>")
addtimer(src, "slime_burn", 50, TIMER_NORMAL, holder)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
M.qdel_timer = addtimer(src, "delete_extract", 55, TIMER_NORMAL, holder)
addtimer(src, "burn", 50, FALSE, holder)
/datum/chemical_reaction/slime/slimefire/proc/slime_burn(datum/reagents/holder)
/datum/chemical_reaction/slimefire/proc/burn(datum/reagents/holder)
if(holder && holder.my_atom)
var/turf/open/T = get_turf(holder.my_atom)
if(istype(T))
T.atmos_spawn_air("plasma=50;TEMP=1000")
/datum/chemical_reaction/slime/slimesmoke
name = "Slime Smoke"
id = "m_smoke"
results = list("phosphorus" = 10, "potassium" = 10, "sugar" = 10)
required_reagents = list("water" = 5)
required_container = /obj/item/slime_extract/orange
required_other = 1
/datum/chemical_reaction/slime/slimesmoke/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
//Yellow
/datum/chemical_reaction/slime/slimeoverload
/datum/chemical_reaction/slimeoverload
name = "Slime EMP"
id = "m_emp"
result = null
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/yellow
required_other = 1
/datum/chemical_reaction/slime/slimeoverload/on_reaction(datum/reagents/holder, created_volume)
/datum/chemical_reaction/slimeoverload/on_reaction(datum/reagents/holder, created_volume)
feedback_add_details("slime_cores_used","[type]")
empulse(get_turf(holder.my_atom), 3, 7)
..()
/datum/chemical_reaction/slime/slimecell
/datum/chemical_reaction/slimecell
name = "Slime Powercell"
id = "m_cell"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/yellow
required_other = 1
/datum/chemical_reaction/slime/slimecell/on_reaction(datum/reagents/holder, created_volume)
/datum/chemical_reaction/slimecell/on_reaction(datum/reagents/holder, created_volume)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/weapon/stock_parts/cell/high/slime/P = new /obj/item/weapon/stock_parts/cell/high/slime
P.loc = get_turf(holder.my_atom)
..()
/datum/chemical_reaction/slime/slimeglow
/datum/chemical_reaction/slimeglow
name = "Slime Glow"
id = "m_glow"
result = null
required_reagents = list("water" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/yellow
required_other = 1
/datum/chemical_reaction/slime/slimeglow/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimeglow/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
T.visible_message("<span class='danger'>The slime begins to emit a soft light. Squeezing it will cause it to grow brightly.</span>")
var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime
F.loc = get_turf(holder.my_atom)
..()
//Purple
/datum/chemical_reaction/slime/slimepsteroid
/datum/chemical_reaction/slimepsteroid
name = "Slime Steroid"
id = "m_steroid"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/purple
required_other = 1
/datum/chemical_reaction/slime/slimepsteroid/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimepsteroid/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/steroid/P = new /obj/item/slimepotion/steroid
P.loc = get_turf(holder.my_atom)
..()
/datum/chemical_reaction/slime/slimejam
/datum/chemical_reaction/slimejam
name = "Slime Jam"
id = "m_jam"
results = list("slimejelly" = 10)
result = "slimejelly"
required_reagents = list("sugar" = 1)
result_amount = 10
required_container = /obj/item/slime_extract/purple
required_other = 1
/datum/chemical_reaction/slime/slimejam/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimejam/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
//Dark Purple
/datum/chemical_reaction/slime/slimeplasma
/datum/chemical_reaction/slimeplasma
name = "Slime Plasma"
id = "m_plasma"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/darkpurple
required_other = 1
/datum/chemical_reaction/slime/slimeplasma/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimeplasma/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/location = get_turf(holder.my_atom)
new /obj/item/stack/sheet/mineral/plasma (location, 3)
..()
var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma
P.amount = 3
P.loc = get_turf(holder.my_atom)
//Red
/datum/chemical_reaction/slime/slimemutator
/datum/chemical_reaction/slimemutator
name = "Slime Mutator"
id = "m_slimemutator"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/red
required_other = 1
/datum/chemical_reaction/slime/slimemutator/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimemutator/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/mutator/P = new /obj/item/slimepotion/mutator
P.loc = get_turf(holder.my_atom)
..()
/datum/chemical_reaction/slime/slimebloodlust
/datum/chemical_reaction/slimebloodlust
name = "Bloodlust"
id = "m_bloodlust"
result = null
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/red
required_other = 1
/datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimebloodlust/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null))
slime.rabid = 1
slime.visible_message("<span class='danger'>The [slime] is driven into a frenzy!</span>")
..()
/datum/chemical_reaction/slime/slimespeed
/datum/chemical_reaction/slimespeed
name = "Slime Speed"
id = "m_speed"
result = null
required_reagents = list("water" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/red
required_other = 1
/datum/chemical_reaction/slime/slimespeed/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimespeed/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/speed/P = new /obj/item/slimepotion/speed
P.loc = get_turf(holder.my_atom)
..()
//Pink
/datum/chemical_reaction/slime/docility
/datum/chemical_reaction/docility
name = "Docility Potion"
id = "m_potion"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/pink
required_other = 1
/datum/chemical_reaction/slime/docility/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/docility/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/docility/P = new /obj/item/slimepotion/docility
P.loc = get_turf(holder.my_atom)
..()
/datum/chemical_reaction/slime/gender
name = "Gender Potion"
id = "m_gender"
required_reagents = list("blood" = 1)
required_container = /obj/item/slime_extract/pink
required_other = 1
/datum/chemical_reaction/slime/gender/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/genderchange/G = new /obj/item/slimepotion/genderchange
G.loc = get_turf(holder.my_atom)
..()
//Black
/datum/chemical_reaction/slime/slimemutate2
/datum/chemical_reaction/slimemutate2
name = "Advanced Mutation Toxin"
id = "mutationtoxin2"
results = list("amutationtoxin" = 1)
result = "amutationtoxin"
required_reagents = list("plasma" = 1)
result_amount = 1
required_other = 1
required_container = /obj/item/slime_extract/black
/datum/chemical_reaction/slime/slimemutate2/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimemutate2/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
//Oil
/datum/chemical_reaction/slime/slimeexplosion
/datum/chemical_reaction/slimeexplosion
name = "Slime Explosion"
id = "m_explosion"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/oil
required_other = 1
/datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimeexplosion/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/turf/T = get_turf(holder.my_atom)
var/lastkey = holder.my_atom.fingerprintslast
@@ -551,240 +506,206 @@
message_admins("Slime Explosion reaction started at <a href='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[T.loc.name] (JMP)</a>. Last Fingerprint: [touch_msg]")
log_game("Slime Explosion reaction started at [T.loc.name] ([T.x],[T.y],[T.z]). Last Fingerprint: [lastkey ? lastkey : "N/A"].")
T.visible_message("<span class='danger'>The slime extract begins to vibrate violently !</span>")
addtimer(src, "boom", 50, TIMER_NORMAL, holder)
var/obj/item/slime_extract/M = holder.my_atom
deltimer(M.qdel_timer)
M.qdel_timer = addtimer(src, "delete_extract", 55, TIMER_NORMAL, holder)
addtimer(src, "boom", 50, FALSE, holder)
/datum/chemical_reaction/slime/slimeexplosion/proc/boom(datum/reagents/holder)
/datum/chemical_reaction/slimeexplosion/proc/boom(datum/reagents/holder)
if(holder && holder.my_atom)
explosion(get_turf(holder.my_atom), 1 ,3, 6)
/datum/chemical_reaction/slime/slimecornoil
name = "Slime Corn Oil"
id = "m_cornoil"
results = list("cornoil" = 10)
required_reagents = list("blood" = 1)
required_container = /obj/item/slime_extract/oil
required_other = 1
/datum/chemical_reaction/slime/slimecornoil/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
..()
//Light Pink
/datum/chemical_reaction/slime/slimepotion2
/datum/chemical_reaction/slimepotion2
name = "Slime Potion 2"
id = "m_potion2"
result = null
result_amount = 1
required_container = /obj/item/slime_extract/lightpink
required_reagents = list("plasma" = 1)
required_other = 1
/datum/chemical_reaction/slime/slimepotion2/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimepotion2/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/sentience/P = new /obj/item/slimepotion/sentience
P.loc = get_turf(holder.my_atom)
..()
//Adamantine
/datum/chemical_reaction/slime/slimegolem
/datum/chemical_reaction/slimegolem
name = "Slime Golem"
id = "m_golem"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/adamantine
required_other = 1
/datum/chemical_reaction/slime/slimegolem/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimegolem/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/effect/golemrune/Z = new /obj/effect/golemrune
Z.loc = get_turf(holder.my_atom)
notify_ghosts("Golem rune created in [get_area(Z)].", 'sound/effects/ghost2.ogg', source = Z)
..()
/datum/chemical_reaction/slime/slimegolem2
name = "Slime Golem 2"
id = "m_golem2"
required_reagents = list("iron" = 1)
required_container = /obj/item/slime_extract/adamantine
required_other = 1
/datum/chemical_reaction/slime/slimegolem2/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/golem_shell/artificial/Z = new /obj/item/golem_shell/artificial
Z.loc = get_turf(holder.my_atom)
notify_ghosts("Artificial golem shell created in [get_area(Z)].", 'sound/effects/ghost2.ogg', source = Z)
..()
//Bluespace
/datum/chemical_reaction/slime/slimefloor2
/datum/chemical_reaction/slimefloor2
name = "Bluespace Floor"
id = "m_floor2"
result = null
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/bluespace
required_other = 1
/datum/chemical_reaction/slime/slimefloor2/on_reaction(datum/reagents/holder, created_volume)
/datum/chemical_reaction/slimefloor2/on_reaction(datum/reagents/holder, created_volume)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/stack/tile/bluespace/P = new /obj/item/stack/tile/bluespace
P.amount = 25
P.loc = get_turf(holder.my_atom)
..()
/datum/chemical_reaction/slime/slimecrystal
/datum/chemical_reaction/slimecrystal
name = "Slime Crystal"
id = "m_crystal"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/bluespace
required_other = 1
/datum/chemical_reaction/slime/slimecrystal/on_reaction(datum/reagents/holder, created_volume)
/datum/chemical_reaction/slimecrystal/on_reaction(datum/reagents/holder, created_volume)
feedback_add_details("slime_cores_used","[type]")
if(holder.my_atom)
var/obj/item/weapon/ore/bluespace_crystal/BC = new(get_turf(holder.my_atom))
BC.visible_message("<span class='notice'>The [BC.name] appears out of thin air!</span>")
..()
//Cerulean
/datum/chemical_reaction/slime/slimepsteroid2
/datum/chemical_reaction/slimepsteroid2
name = "Slime Steroid 2"
id = "m_steroid2"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/cerulean
required_other = 1
/datum/chemical_reaction/slime/slimepsteroid2/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimepsteroid2/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/enhancer/P = new /obj/item/slimepotion/enhancer
P.loc = get_turf(holder.my_atom)
..()
/datum/chemical_reaction/slime/slime_territory
/datum/chemical_reaction/slime_territory
name = "Slime Territory"
id = "s_territory"
result = null
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/cerulean
required_other = 1
/datum/chemical_reaction/slime/slime_territory/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slime_territory/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/areaeditor/blueprints/slime/P = new /obj/item/areaeditor/blueprints/slime
P.loc = get_turf(holder.my_atom)
..()
//Sepia
/datum/chemical_reaction/slime/slimestop
/datum/chemical_reaction/slimestop
name = "Slime Stop"
id = "m_stop"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
/datum/chemical_reaction/slime/slimestop/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimestop/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/mob/mob = get_mob_by_key(holder.my_atom.fingerprintslast)
var/obj/effect/timestop/T = new /obj/effect/timestop
T.loc = get_turf(holder.my_atom)
T.immune += mob
T.timestop()
..()
/datum/chemical_reaction/slime/slimecamera
/datum/chemical_reaction/slimecamera
name = "Slime Camera"
id = "m_camera"
result = null
required_reagents = list("water" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
/datum/chemical_reaction/slime/slimecamera/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimecamera/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/device/camera/P = new /obj/item/device/camera
P.loc = get_turf(holder.my_atom)
var/obj/item/device/camera_film/Z = new /obj/item/device/camera_film
Z.loc = get_turf(holder.my_atom)
..()
/datum/chemical_reaction/slime/slimefloor
/datum/chemical_reaction/slimefloor
name = "Sepia Floor"
id = "m_floor"
result = null
required_reagents = list("blood" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/sepia
required_other = 1
/datum/chemical_reaction/slime/slimefloor/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimefloor/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/stack/tile/sepia/P = new /obj/item/stack/tile/sepia
P.amount = 25
P.loc = get_turf(holder.my_atom)
..()
//Pyrite
/datum/chemical_reaction/slime/slimepaint
/datum/chemical_reaction/slimepaint
name = "Slime Paint"
id = "s_paint"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_container = /obj/item/slime_extract/pyrite
required_other = 1
/datum/chemical_reaction/slime/slimepaint/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimepaint/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/list/paints = subtypesof(/obj/item/weapon/paint)
var/chosen = pick(paints)
var/obj/P = new chosen
if(P)
P.loc = get_turf(holder.my_atom)
..()
/datum/chemical_reaction/slime/slimecrayon
name = "Slime Crayon"
id = "s_crayon"
required_reagents = list("blood" = 1)
required_container = /obj/item/slime_extract/pyrite
required_other = 1
/datum/chemical_reaction/slime/slimecrayon/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/list/crayons = difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan))
var/chosen = pick(crayons)
var/obj/P = new chosen
if(P)
P.loc = get_turf(holder.my_atom)
..()
//Rainbow :o)
/datum/chemical_reaction/slime/slimeRNG
/datum/chemical_reaction/slimeRNG
name = "Random Core"
id = "slimerng"
result = null
required_reagents = list("plasma" = 1)
result_amount = 1
required_other = 1
required_container = /obj/item/slime_extract/rainbow
/datum/chemical_reaction/slime/slimeRNG/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slimeRNG/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/mob/living/simple_animal/slime/random/S
S = new(get_turf(holder.my_atom))
S.visible_message("<span class='danger'>Infused with plasma, the \
core begins to quiver and grow, and soon a new baby slime emerges \
from it!</span>")
..()
/datum/chemical_reaction/slime/slime_transfer
/datum/chemical_reaction/slime_transfer
name = "Transfer Potion"
id = "slimetransfer"
result = null
required_reagents = list("blood" = 1)
result_amount = 1
required_other = 1
required_container = /obj/item/slime_extract/rainbow
/datum/chemical_reaction/slime/slime_transfer/on_reaction(datum/reagents/holder)
/datum/chemical_reaction/slime_transfer/on_reaction(datum/reagents/holder)
feedback_add_details("slime_cores_used","[type]")
var/obj/item/slimepotion/transference/P = new /obj/item/slimepotion/transference
P.loc = get_turf(holder.my_atom)
..()
@@ -2,101 +2,111 @@
/datum/chemical_reaction/formaldehyde
name = "formaldehyde"
id = "Formaldehyde"
results = list("formaldehyde" = 3)
result = "formaldehyde"
required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1)
result_amount = 3
required_temp = 420
/datum/chemical_reaction/neurotoxin2
name = "neurotoxin2"
id = "neurotoxin2"
results = list("neurotoxin2" = 1)
result = "neurotoxin2"
required_reagents = list("space_drugs" = 1)
result_amount = 1
required_temp = 674
/datum/chemical_reaction/cyanide
name = "Cyanide"
id = "cyanide"
results = list("cyanide" = 3)
result = "cyanide"
required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1)
result_amount = 3
required_temp = 380
/datum/chemical_reaction/itching_powder
name = "Itching Powder"
id = "itching_powder"
results = list("itching_powder" = 3)
result = "itching_powder"
required_reagents = list("welding_fuel" = 1, "ammonia" = 1, "charcoal" = 1)
result_amount = 3
/datum/chemical_reaction/facid
name = "Fluorosulfuric acid"
id = "facid"
results = list("facid" = 4)
result = "facid"
required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1)
result_amount = 4
required_temp = 380
/datum/chemical_reaction/sulfonal
name = "sulfonal"
id = "sulfonal"
results = list("sulfonal" = 3)
result = "sulfonal"
required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1)
result_amount = 3
/datum/chemical_reaction/lipolicide
name = "lipolicide"
id = "lipolicide"
results = list("lipolicide" = 3)
result = "lipolicide"
required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1)
result_amount = 3
/datum/chemical_reaction/mutagen
name = "Unstable mutagen"
id = "mutagen"
results = list("mutagen" = 3)
result = "mutagen"
required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1)
result_amount = 3
/datum/chemical_reaction/lexorin
name = "Lexorin"
id = "lexorin"
results = list("lexorin" = 3)
result = "lexorin"
required_reagents = list("plasma" = 1, "hydrogen" = 1, "nitrogen" = 1)
result_amount = 3
/datum/chemical_reaction/chloralhydrate
name = "Chloral Hydrate"
id = "chloralhydrate"
results = list("chloralhydrate" = 1)
result = "chloralhydrate"
required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1)
result_amount = 1
/datum/chemical_reaction/mutetoxin //i'll just fit this in here snugly between other unfun chemicals :v
name = "Mute toxin"
id = "mutetoxin"
results = list("mutetoxin" = 2)
result = "mutetoxin"
required_reagents = list("uranium" = 2, "water" = 1, "carbon" = 1)
result_amount = 2
/datum/chemical_reaction/zombiepowder
name = "Zombie Powder"
id = "zombiepowder"
results = list("zombiepowder" = 2)
result = "zombiepowder"
required_reagents = list("carpotoxin" = 5, "morphine" = 5, "copper" = 5)
result_amount = 2
/datum/chemical_reaction/mindbreaker
name = "Mindbreaker Toxin"
id = "mindbreaker"
results = list("mindbreaker" = 5)
result = "mindbreaker"
required_reagents = list("silicon" = 1, "hydrogen" = 1, "charcoal" = 1)
result_amount = 5
/datum/chemical_reaction/teslium
name = "Teslium"
id = "teslium"
result = "teslium"
required_reagents = list("plasma" = 1, "silver" = 1, "blackpowder" = 1)
result_amount = 3
mix_message = "<span class='danger'>A jet of sparks flies from the mixture as it merges into a flickering slurry.</span>"
required_temp = 400
/datum/chemical_reaction/heparin
name = "Heparin"
id = "Heparin"
results = list("heparin" = 4)
result = "heparin"
required_reagents = list("formaldehyde" = 1, "sodium" = 1, "chlorine" = 1, "lithium" = 1)
result_amount = 4
mix_message = "<span class='danger'>The mixture thins and loses all color.</span>"
/datum/chemical_reaction/rotatium
name = "Rotatium"
id = "Rotatium"
results = list("rotatium" = 3)
required_reagents = list("mindbreaker" = 1, "teslium" = 1, "neurotoxin2" = 1)
mix_message = "<span class='danger'>After sparks, fire, and the smell of mindbreaker, the mix is constantly spinning with no stop in sight.</span>"
/datum/chemical_reaction/anacea
name = "Anacea"
id = "anacea"
results = list("anacea" = 3)
required_reagents = list("haloperidol" = 1, "impedrezene" = 1, "radium" = 1)
+5 -12
View File
@@ -3,7 +3,7 @@
desc = "..."
icon = 'icons/obj/chemical.dmi'
icon_state = null
w_class = WEIGHT_CLASS_TINY
w_class = 1
var/amount_per_transfer_from_this = 5
var/list/possible_transfer_amounts = list(5,10,15,20,25,30)
var/volume = 30
@@ -38,7 +38,7 @@
return
/obj/item/weapon/reagent_containers/attack(mob/M, mob/user, def_zone)
if(user.a_intent == INTENT_HARM)
if(user.a_intent == "harm")
return ..()
/obj/item/weapon/reagent_containers/afterattack(obj/target, mob/user , flag)
@@ -62,7 +62,7 @@
else if(C.is_mouth_covered(mask_only = 1))
covered = "mask"
if(covered)
var/who = (isnull(user) || eater == user) ? "your" : "[eater.p_their()]"
var/who = (isnull(user) || eater == user) ? "your" : "their"
user << "<span class='warning'>You have to remove [who] [covered] first!</span>"
return 0
return 1
@@ -71,10 +71,9 @@
if(reagents)
for(var/datum/reagent/R in reagents.reagent_list)
R.on_ex_act()
if(!qdeleted(src))
..()
..()
/obj/item/weapon/reagent_containers/fire_act(exposed_temperature, exposed_volume)
/obj/item/weapon/reagent_containers/fire_act()
reagents.chem_temp += 30
reagents.handle_reactions()
..()
@@ -110,9 +109,3 @@
return
reagents.clear_reagents()
/obj/item/weapon/reagent_containers/microwave_act(obj/machinery/microwave/M)
if(is_open_container())
reagents.chem_temp = max(reagents.chem_temp, 1000)
reagents.handle_reactions()
..()
@@ -78,7 +78,7 @@
var/t = stripped_input(user, "What would you like to label the blood pack?", name, null, 53)
if(!user.canUseTopic(src))
return
if(user.get_active_held_item() != I)
if(user.get_active_hand() != I)
return
if(loc != user)
return
@@ -25,7 +25,6 @@ Borg Hypospray
var/list/datum/reagents/reagent_list = list()
var/list/reagent_ids = list("dexalin", "kelotane", "bicaridine", "antitoxin", "epinephrine", "spaceacillin")
var/accepts_reagent_upgrades = TRUE //If upgrades can increase number of reagents dispensed.
var/list/modes = list() //Basically the inverse of reagent_ids. Instead of having numbers as "keys" and strings as values it has strings as keys and numbers as values.
//Used as list for input() in shakers.
@@ -33,8 +32,11 @@ Borg Hypospray
/obj/item/weapon/reagent_containers/borghypo/New()
..()
var/iteration = 1
for(var/R in reagent_ids)
add_reagent(R)
modes[R] = iteration
iteration++
START_PROCESSING(SSobj, src)
@@ -71,10 +73,8 @@ Borg Hypospray
var/datum/reagents/R = reagent_list[reagent_list.len]
R.add_reagent(reagent, 30)
modes[reagent] = modes.len + 1
/obj/item/weapon/reagent_containers/borghypo/proc/regenerate_reagents()
if(iscyborg(src.loc))
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
for(var/i in 1 to reagent_ids.len)
@@ -90,7 +90,7 @@ Borg Hypospray
return
if(!istype(M))
return
if(R.total_volume && M.can_inject(user, 1, user.zone_selected,bypass_protection))
if(R.total_volume && M.can_inject(user, 1, bypass_protection))
M << "<span class='warning'>You feel a tiny prick!</span>"
user << "<span class='notice'>You inject [M] with the injector.</span>"
var/fraction = min(amount_per_transfer_from_this/R.total_volume, 1)
@@ -134,7 +134,6 @@ Borg Hypospray
/obj/item/weapon/reagent_containers/borghypo/hacked
icon_state = "borghypo_s"
reagent_ids = list ("facid", "mutetoxin", "cyanide", "sodium_thiopental", "heparin", "lexorin")
accepts_reagent_upgrades = FALSE
/obj/item/weapon/reagent_containers/borghypo/syndicate
name = "syndicate cyborg hypospray"
@@ -144,7 +143,6 @@ Borg Hypospray
recharge_time = 2
reagent_ids = list("syndicate_nanites", "potass_iodide", "morphine")
bypass_protection = 1
accepts_reagent_upgrades = FALSE
/*
Borg Shaker
@@ -157,7 +155,6 @@ Borg Shaker
possible_transfer_amounts = list(5,10,20)
charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster.
recharge_time = 3
accepts_reagent_upgrades = FALSE
reagent_ids = list("beer", "orangejuice", "limejuice", "tomatojuice", "cola", "tonic", "sodawater", "ice", "cream", "whiskey", "vodka", "rum", "gin", "tequila", "vermouth", "wine", "kahlua", "cognac", "ale")
@@ -165,7 +162,7 @@ Borg Shaker
return //Can't inject stuff with a shaker, can we? //not with that attitude
/obj/item/weapon/reagent_containers/borghypo/borgshaker/regenerate_reagents()
if(iscyborg(src.loc))
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
for(var/i in modes) //Lots of reagents in this one, so it's best to regenrate them all at once to keep it from being tedious.
@@ -212,7 +209,6 @@ Borg Shaker
possible_transfer_amounts = list(5,10,20)
charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster.
recharge_time = 3
accepts_reagent_upgrades = FALSE
reagent_ids = list("beer2")
@@ -220,16 +216,13 @@ Borg Shaker
name = "Peace Hypospray"
reagent_ids = list("dizzysolution","tiresolution")
accepts_reagent_upgrades = FALSE
/obj/item/weapon/reagent_containers/borghypo/peace/hacked
desc = "Everything's peaceful in death!"
icon_state = "borghypo_s"
reagent_ids = list("dizzysolution","tiresolution","tirizene","sulfonal","sodium_thiopental","cyanide","neurotoxin2")
accepts_reagent_upgrades = FALSE
/obj/item/weapon/reagent_containers/borghypo/epi
name = "epinephrine injector"
desc = "An advanced chemical synthesizer and injection system, designed to stabilize patients.."
reagent_ids = list("epinephrine")
accepts_reagent_upgrades = FALSE
reagent_ids = list("epinephrine")
@@ -19,7 +19,7 @@
update_icon()
/obj/item/weapon/reagent_containers/glass/bottle/update_icon()
cut_overlays()
overlays.Cut()
if(reagents.total_volume)
var/image/filling = image('icons/obj/reagentfillings.dmi', src, "[icon_state]-10")
@@ -5,7 +5,6 @@
volume = 50
flags = OPENCONTAINER
spillable = 1
resistance_flags = ACID_PROOF
/obj/item/weapon/reagent_containers/glass/attack(mob/M, mob/user, obj/target)
@@ -20,7 +19,7 @@
return
if(istype(M))
if(user.a_intent == INTENT_HARM)
if(user.a_intent == "harm")
var/R
M.visible_message("<span class='danger'>[user] splashes the contents of [src] onto [M]!</span>", \
"<span class='userdanger'>[user] splashes the contents of [src] onto [M]!</span>")
@@ -79,7 +78,7 @@
user << "<span class='notice'>You transfer [trans] unit\s of the solution to [target].</span>"
else if(reagents.total_volume)
if(user.a_intent == INTENT_HARM)
if(user.a_intent == "harm")
user.visible_message("<span class='danger'>[user] splashes the contents of [src] onto [target]!</span>", \
"<span class='notice'>You splash the contents of [src] onto [target].</span>")
reagents.reaction(target, TOUCH)
@@ -214,9 +213,6 @@
name = "epinephrine reserve tank"
list_reagents = list("epinephrine" = 50)
/obj/item/weapon/reagent_containers/glass/beaker/synthflesh
list_reagents = list("synthflesh" = 50)
/obj/item/weapon/reagent_containers/glass/bucket
name = "bucket"
desc = "It's a bucket."
@@ -224,24 +220,23 @@
icon_state = "bucket"
item_state = "bucket"
materials = list(MAT_METAL=200)
w_class = WEIGHT_CLASS_NORMAL
w_class = 3
amount_per_transfer_from_this = 20
possible_transfer_amounts = list(10,15,20,25,30,50,70)
volume = 70
flags = OPENCONTAINER
flags_inv = HIDEHAIR
slot_flags = SLOT_HEAD
resistance_flags = 0
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 75, acid = 50) //Weak melee protection, because you can wear it on your head
armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) //Weak melee protection, because you can wear it on your head
slot_equipment_priority = list( \
slot_back, slot_wear_id,\
slot_w_uniform, slot_wear_suit,\
slot_wear_mask, slot_head, slot_neck,\
slot_wear_mask, slot_head,\
slot_shoes, slot_gloves,\
slot_ears, slot_glasses,\
slot_belt, slot_s_store,\
slot_l_store, slot_r_store,\
slot_generic_dextrous_storage
slot_drone_storage
)
/obj/item/weapon/reagent_containers/glass/bucket/attackby(obj/O, mob/user, params)
@@ -7,7 +7,6 @@
amount_per_transfer_from_this = 5
volume = 30
possible_transfer_amounts = list()
resistance_flags = ACID_PROOF
flags = OPENCONTAINER
slot_flags = SLOT_BELT
var/ignore_flags = 0
@@ -47,7 +46,6 @@
/obj/item/weapon/reagent_containers/hypospray/CMO
list_reagents = list("omnizine" = 30)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
/obj/item/weapon/reagent_containers/hypospray/combat
name = "combat stimulant injector"
@@ -83,7 +81,7 @@
..()
update_icon()
spawn(80)
if(iscyborg(user) && !reagents.total_volume)
if(isrobot(user) && !reagents.total_volume)
var/mob/living/silicon/robot/R = user
if(R.cell.use(100))
reagents.add_reagent_list(list_reagents)
@@ -130,11 +128,11 @@
/obj/item/weapon/reagent_containers/hypospray/medipen/survival
name = "survival medipen"
desc = "A medipen for surviving in the harshest of environments, heals and protects from environmental hazards. WARNING: Do not inject more than one pen in quick succession."
desc = "A medipen for surviving in the harshest of environments, heals and protects from environmental hazards. "
icon_state = "stimpen"
volume = 57
amount_per_transfer_from_this = 57
list_reagents = list("salbutamol" = 10, "leporazine" = 15, "tricordrazine" = 15, "epinephrine" = 10, "miningnanites" = 2, "omnizine" = 5)
volume = 82
amount_per_transfer_from_this = 82
list_reagents = list("nanites" = 2, "salbutamol" = 10, "coffee" = 20, "leporazine" = 20, "tricordrazine" = 15, "epinephrine" = 10, "omnizine" = 5, "stimulants" = 10)
/obj/item/weapon/reagent_containers/hypospray/medipen/species_mutator
name = "species mutator medipen"
@@ -7,7 +7,7 @@
flags = OPENCONTAINER | NOBLUDGEON
slot_flags = SLOT_BELT
throwforce = 0
w_class = WEIGHT_CLASS_SMALL
w_class = 2
throw_speed = 3
throw_range = 7
var/stream_mode = 0 //whether we use the more focused mode
@@ -17,7 +17,7 @@
var/stream_amount = 10 //the amount of reagents transfered when in stream mode.
amount_per_transfer_from_this = 5
volume = 250
possible_transfer_amounts = list(5,10,15,20,25,30,50,100)
possible_transfer_amounts = list()
/obj/item/weapon/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user)
@@ -117,6 +117,7 @@
user << "<span class='notice'>You switch the nozzle setting to [stream_mode ? "\"stream\"":"\"spray\""]. You'll now use [amount_per_transfer_from_this] units per use.</span>"
/obj/item/weapon/reagent_containers/spray/verb/empty()
set name = "Empty Spray Bottle"
set category = "Object"
set src in usr
@@ -135,7 +136,6 @@
desc = "BLAM!-brand non-foaming space cleaner!"
list_reagents = list("cleaner" = 250)
//spray tan
/obj/item/weapon/reagent_containers/spray/spraytan
name = "spray tan"
volume = 50
@@ -143,19 +143,6 @@
list_reagents = list("spraytan" = 50)
/obj/item/weapon/reagent_containers/spray/medical
name = "medical spray"
icon = 'icons/obj/chemical.dmi'
icon_state = "medspray"
volume = 100
/obj/item/weapon/reagent_containers/spray/medical/sterilizer
name = "sterilizer spray"
desc = "Spray bottle loaded with non-toxic sterilizer. Useful in preparation for surgery."
list_reagents = list("sterilizine" = 100)
//pepperspray
/obj/item/weapon/reagent_containers/spray/pepper
name = "pepperspray"
@@ -190,7 +177,7 @@
icon_state = "chemsprayer"
item_state = "chemsprayer"
throwforce = 0
w_class = WEIGHT_CLASS_NORMAL
w_class = 3
stream_mode = 1
current_range = 7
spray_range = 4
@@ -224,3 +211,23 @@
item_state = "plantbgone"
volume = 100
list_reagents = list("plantbgone" = 100)
/obj/item/weapon/reagent_containers/spray/thermite
name = "Thermite Spray"
desc = "A 50u spray bottle loaded with thermite, for melting walls. "
icon = 'icons/obj/weapons.dmi'
icon_state = "thermitespray"
item_state = "thermitespray"
volume = 50
list_reagents = list("thermite" = 50)
/obj/item/weapon/reagent_containers/spray/thermite/afterattack(atom/A as mob|obj, mob/user)
if(istype(A, /turf/closed/wall))
if(reagents.get_reagent_amount("thermite") >= 10)
user.visible_message("<span class='notice'>You spray the thermite on [A].</span>")
reagents.reaction(A, TOUCH)
reagents.remove_reagent("thermite", 10)
else
user.visible_message("<span class='warning'>You don't have enough thermite left!</span>")
return
else return ..()
@@ -12,7 +12,7 @@
volume = 15
var/mode = SYRINGE_DRAW
var/busy = 0 // needed for delayed drawing of blood
var/proj_piercing = 0 //does it pierce through thick clothes when shot with syringe gun
var/projectile_type = /obj/item/projectile/bullet/dart/syringe
materials = list(MAT_METAL=10, MAT_GLASS=20)
/obj/item/weapon/reagent_containers/syringe/New()
@@ -207,9 +207,6 @@
/obj/item/weapon/reagent_containers/syringe/lethal/choral
list_reagents = list("chloralhydrate" = 50)
/obj/item/weapon/reagent_containers/syringe/lethal/execution
list_reagents = list("plasma" = 15, "formaldehyde" = 15, "cyanide" = 10, "facid" = 10)
/obj/item/weapon/reagent_containers/syringe/mulligan
name = "Mulligan"
desc = "A syringe used to completely change the users identity."
@@ -245,5 +242,5 @@
name = "piercing syringe"
desc = "A diamond-tipped syringe that pierces armor when launched at high velocity. It can hold up to 10 units."
volume = 10
proj_piercing = 1
projectile_type = /obj/item/projectile/bullet/dart/syringe/piercing
origin_tech = "combat=3;materials=4;engineering=5"
+59 -41
View File
@@ -6,16 +6,28 @@
density = 1
anchored = 0
pressure_resistance = 2*ONE_ATMOSPHERE
obj_integrity = 300
max_integrity = 300
var/tank_volume = 1000 //In units, how much the dispenser can hold
var/reagent_id = "water" //The ID of the reagent that the dispenser uses
/obj/structure/reagent_dispensers/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
. = ..()
if(. && obj_integrity > 0)
if(tank_volume && (damage_flag == "bullet" || damage_flag == "laser"))
boom()
/obj/structure/reagent_dispensers/ex_act(severity, target)
switch(severity)
if(1)
qdel(src)
return
if(2)
if (prob(50))
qdel(src)
return
if(3)
if (prob(5))
qdel(src)
return
else
return
/obj/structure/reagent_dispensers/blob_act(obj/effect/blob/B)
if(prob(50))
qdel(src)
/obj/structure/reagent_dispensers/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/reagent_containers))
@@ -36,62 +48,72 @@
user << "<span class='danger'>It's empty.</span>"
/obj/structure/reagent_dispensers/proc/boom()
visible_message("<span class='danger'>\The [src] ruptures!</span>")
chem_splash(loc, 5, list(reagents))
qdel(src)
/obj/structure/reagent_dispensers/deconstruct(disassembled = TRUE)
if(!(flags & NODECONSTRUCT))
if(!disassembled)
boom()
else
qdel(src)
/obj/structure/reagent_dispensers/watertank
name = "water tank"
desc = "A water tank."
icon_state = "water"
/obj/structure/reagent_dispensers/watertank/ex_act(severity, target)
switch(severity)
if(1)
qdel(src)
return
if(2)
if (prob(50))
PoolOrNew(/obj/effect/particle_effect/water, src.loc)
qdel(src)
return
if(3)
if (prob(5))
PoolOrNew(/obj/effect/particle_effect/water, src.loc)
qdel(src)
return
else
return
/obj/structure/reagent_dispensers/watertank/blob_act(obj/effect/blob/B)
if(prob(50))
PoolOrNew(/obj/effect/particle_effect/water, loc)
qdel(src)
/obj/structure/reagent_dispensers/watertank/high
name = "high-capacity water tank"
desc = "A highly-pressurized water tank made to hold gargantuan amounts of water.."
icon_state = "water_high" //I was gonna clean my room...
tank_volume = 100000
/obj/structure/reagent_dispensers/fueltank
name = "fuel tank"
desc = "A tank full of industrial welding fuel. Do not consume."
icon_state = "fuel"
reagent_id = "welding_fuel"
/obj/structure/reagent_dispensers/fueltank/boom()
/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/Proj)
..()
if(istype(Proj) && !Proj.nodamage && ((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)))
message_admins("[key_name_admin(Proj.firer)] triggered a fueltank explosion via projectile.")
log_game("[key_name(Proj.firer)] triggered a fueltank explosion via projectile.")
boom()
/obj/structure/reagent_dispensers/fueltank/proc/boom()
explosion(get_turf(src), 0, 1, 5, flame_range = 5)
qdel(src)
/obj/structure/reagent_dispensers/fueltank/blob_act(obj/structure/blob/B)
/obj/structure/reagent_dispensers/fueltank/blob_act(obj/effect/blob/B)
boom()
/obj/structure/reagent_dispensers/fueltank/ex_act()
boom()
/obj/structure/reagent_dispensers/fueltank/fire_act(exposed_temperature, exposed_volume)
/obj/structure/reagent_dispensers/fueltank/fire_act()
boom()
/obj/structure/reagent_dispensers/fueltank/tesla_act()
..() //extend the zap
boom()
/obj/structure/reagent_dispensers/fueltank/bullet_act(obj/item/projectile/P)
..()
if(!qdeleted(src)) //wasn't deleted by the projectile's effects.
if(!P.nodamage && ((P.damage_type == BURN) || (P.damage_type == BRUTE)))
var/boom_message = "[key_name_admin(P.firer)] triggered a fueltank explosion via projectile."
bombers += boom_message
message_admins(boom_message)
log_game("[key_name(P.firer)] triggered a fueltank explosion via projectile.")
boom()
/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/weapon/weldingtool))
if(!reagents.has_reagent("welding_fuel"))
@@ -103,14 +125,12 @@
user << "<span class='warning'>Your [W.name] is already full!</span>"
return
reagents.trans_to(W, W.max_fuel)
user.visible_message("<span class='notice'>[user] refills [user.p_their()] [W.name].</span>", "<span class='notice'>You refill [W].</span>")
user.visible_message("<span class='notice'>[user] refills \his [W.name].</span>", "<span class='notice'>You refill [W].</span>")
playsound(src, 'sound/effects/refill.ogg', 50, 1)
update_icon()
else
user.visible_message("<span class='warning'>[user] catastrophically fails at refilling [user.p_their()] [W.name]!</span>", "<span class='userdanger'>That was stupid of you.</span>")
var/message = "[key_name_admin(user)] triggered a fueltank explosion via welding tool."
bombers += message
message_admins(message)
user.visible_message("<span class='warning'>[user] catastrophically fails at refilling \his [W.name]!</span>", "<span class='userdanger'>That was stupid of you.</span>")
message_admins("[key_name_admin(user)] triggered a fueltank explosion via welding tool.")
log_game("[key_name(user)] triggered a fueltank explosion via welding tool.")
boom()
return
@@ -160,10 +180,8 @@
icon_state = "beer"
reagent_id = "beer"
/obj/structure/reagent_dispensers/beerkeg/blob_act(obj/structure/blob/B)
/obj/structure/reagent_dispensers/beerkeg/blob_act(obj/effect/blob/B)
explosion(src.loc,0,3,5,7,10)
if(!qdeleted(src))
qdel(src)
/obj/structure/reagent_dispensers/virusfood
@@ -171,4 +189,4 @@
desc = "A dispenser of low-potency virus mutagenic."
icon_state = "virus_food"
anchored = 1
reagent_id = "virusfood"
reagent_id = "virusfood"