reagent split into files (#35753)

This commit is contained in:
jwhitak
2024-01-10 20:27:12 -06:00
committed by GitHub
parent 93e8d9f8a2
commit 4df7f00474
23 changed files with 10228 additions and 10436 deletions

View File

@@ -600,3 +600,5 @@ var/list/cheartstopper = list(/*"potassium_chloride",*/ CHEESYGLOOP) //this stop
#define INCENSE_CRAVE "vales"
#define INCENSE_CORNOIL "cornoils"
#define INCENSE_MUSTARDPLANT "mustardplant"
#define PAINT_CLEANER_THRESHOLD 0.7 // How much of the reagent should be water or some cleaner to clean paint off a canvas or brush

File diff suppressed because it is too large Load Diff

View File

@@ -1,26 +0,0 @@
/datum/reagent/trinitrine
name = "Trinitrine"
id = TRINITRINE
description = "Glyceryl Trinitrate, also known as diluted nitroglycerin, is a medication used for heart failure and to treat and prevent chest pain due to hyperzine."
reagent_state = REAGENT_STATE_LIQUID
overdose_tick = 50
color = "#CED7D5" //rgb: 206, 215, 213
alpha = 142
density = 1.33
specheatcap = 3.88
/datum/reagent/trinitrine/on_mob_life(var/mob/living/M)
if(prob(10))
M.adjustOxyLoss(REM)
if(prob(50))
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/datum/organ/internal/heart/E = H.internal_organs_by_name["heart"]
if(prob(5))
H.custom_pain("You feel a pain in your head", 0)
if(istype(E) && !E.robotic)
if(E.damage > 0)
E.damage = max(0, E.damage - 0.2)
if(prob(10))
M.drowsyness = max(M.drowsyness, 2)

View File

@@ -0,0 +1,362 @@
//Basic chems, basic dispenser buttons
/datum/reagent/aluminum
name = "Aluminum"
id = ALUMINUM
description = "A silvery white and ductile member of the boron group of chemical elements."
reagent_state = REAGENT_STATE_SOLID
color = "#A8A8A8" //rgb: 168, 168, 168
specheatcap = 0.902
density = 2.7
/datum/reagent/carbon
name = "Carbon"
id = CARBON
description = "A chemical element, the builing block of life."
reagent_state = REAGENT_STATE_SOLID
color = "#1C1300" //rgb: 30, 20, 0
specheatcap = 0.71
density = 2.26
/datum/reagent/carbon/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
//Only add one dirt per turf. Was causing people to crash
if(!(locate(/obj/effect/decal/cleanable/dirt) in T))
new /obj/effect/decal/cleanable/dirt(T)
/datum/reagent/chlorine
name = "Chlorine"
id = CHLORINE
description = "A chemical element with a characteristic odour."
reagent_state = REAGENT_STATE_GAS
color = "#808080" //rgb: 128, 128, 128
overdose_am = REAGENTS_OVERDOSE
density = 3.214
specheatcap = 1.34
/datum/reagent/chlorine/on_mob_life(var/mob/living/M)
if(..())
return 1
M.take_organ_damage(REM, 0, ignore_inorganics = TRUE)
/datum/reagent/chlorine/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
T.add_toxinlevel(8)
T.add_weedlevel(-2)
/datum/reagent/copper
name = "Copper"
id = COPPER
description = "A highly ductile metal."
color = "#6E3B08" //rgb: 110, 59, 8
specheatcap = 0.385
density = 8.96
/datum/reagent/fluorine
name = "Fluorine"
id = FLUORINE
description = "A highly-reactive chemical element."
reagent_state = REAGENT_STATE_GAS
color = "#808080" //rgb: 128, 128, 128
overdose_am = REAGENTS_OVERDOSE
density = 1.696
specheatcap = 0.824
/datum/reagent/fluorine/on_mob_life(var/mob/living/M)
if(..())
return 1
M.adjustToxLoss(REM)
if(prob(5) && !M.isUnconscious())
M.emote("stare")
/datum/reagent/fluorine/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
T.add_toxinlevel(25)
/datum/reagent/hydrogen
name = "Hydrogen"
id = HYDROGEN
description = "A colorless, odorless, nonmetallic, tasteless, highly combustible diatomic gas."
reagent_state = REAGENT_STATE_GAS
color = "#808080" //rgb: 128, 128, 128
density = 0.08988
specheatcap = 13.83
/datum/reagent/lithium
name = "Lithium"
id = LITHIUM
description = "A chemical element, used as antidepressant."
reagent_state = REAGENT_STATE_SOLID
color = "#808080" //rgb: 128, 128, 128
overdose_am = REAGENTS_OVERDOSE
specheatcap = 3.56
density = 0.535
/datum/reagent/lithium/on_mob_life(var/mob/living/M)
if(..())
return 1
if(M.canmove && !M.restrained() && istype(M.loc, /turf/space))
step(M, pick(cardinal))
if(prob(5))
M.emote(pick("twitch","drool","moan"), null, null, TRUE)
/datum/reagent/nitrogen
name = "Nitrogen"
id = NITROGEN
description = "A colorless, odorless, tasteless gas."
reagent_state = REAGENT_STATE_GAS
color = "#808080" //rgb: 128, 128, 128
density = 1.251
specheatcap = 1.040
/datum/reagent/nitrogen/on_mob_life(var/mob/living/M, var/alien)
if(..())
return 1
if(alien && alien == IS_VOX)
M.adjustOxyLoss(-2 * REM)
M.adjustToxLoss(-2 * REM)
/datum/reagent/oxygen
name = "Oxygen"
id = OXYGEN
description = "A colorless, odorless gas."
reagent_state = REAGENT_STATE_GAS
color = "#808080" //rgb: 128, 128, 128
density = 1.141
specheatcap = 0.911
/datum/reagent/oxygen/on_mob_life(var/mob/living/M, var/alien)
if(..())
return 1
if(alien && alien == IS_VOX)
M.adjustToxLoss(REM)
/datum/reagent/phosphorus
name = "Phosphorus"
id = PHOSPHORUS
description = "A chemical element, the backbone of biological energy carriers."
reagent_state = REAGENT_STATE_SOLID
color = "#832828" //rgb: 131, 40, 40
density = 1.823
specheatcap = 0.769
/datum/reagent/phosphorus/on_plant_life(var/obj/machinery/portable_atmospherics/hydroponics/T)
..()
T.add_nutrientlevel(1)
T.add_weedlevel(3)
/datum/reagent/potassium
name = "Potassium"
id = POTASSIUM
description = "A soft, low-melting solid that can easily be cut with a knife. Reacts violently with water."
reagent_state = REAGENT_STATE_SOLID
color = "#A0A0A0" //rgb: 160, 160, 160
specheatcap = 0.75
density = 0.89
/datum/reagent/radium
name = "Radium"
id = RADIUM
description = "Radium is an alkaline earth metal. It is extremely radioactive."
reagent_state = REAGENT_STATE_SOLID
color = COLOR_RADIUM//"#61F09A" //rgb: 101, 242, 156
density = 5
specheatcap = 94
flags = CHEMFLAG_PIGMENT
paint_light = PAINTLIGHT_LIMITED
/datum/reagent/radium/on_mob_life(var/mob/living/M)
if(..())
return 1
M.apply_radiation(2 * REM, RAD_INTERNAL)
if (!M.immune_system.overloaded && M.virus2.len)
for(var/ID in M.virus2)
var/datum/disease2/disease/V = M.virus2[ID]
if (prob(V.strength / 2))//the stronger the virus, the better higher the chance to trigger
M.immune_system.Overload()
return
/datum/reagent/radium/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
if(volume >= 3)
if(!(locate(/obj/effect/decal/cleanable/greenglow) in T))
new /obj/effect/decal/cleanable/greenglow(T)
/datum/reagent/radium/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
if(!holder)
return
if(!T)
T = holder.my_atom //Try to find the mob through the holder
if(!istype(T)) //Still can't find it, abort
return
T.add_toxinlevel(2)
if(T.reagents.get_reagent_amount(id) > 0)
if(prob(15))
T.mutate(GENE_MORPHOLOGY)
T.reagents.remove_reagent(id, 1)
/datum/reagent/silicon
name = "Silicon"
id = SILICON
description = "A tetravalent metalloid, silicon is less reactive than its chemical analog carbon."
reagent_state = REAGENT_STATE_SOLID
color = "#A8A8A8" //rgb: 168, 168, 168
density = 2.33
specheatcap = 0.712
/datum/reagent/sodium
name = "Sodium"
id = SODIUM
description = "A chemical element, readily reacts with water."
reagent_state = REAGENT_STATE_SOLID
color = "#808080" //rgb: 128, 128, 128
specheatcap = 1.23
density = 0.968
/datum/reagent/sulfur
name = "Sulfur"
id = SULFUR
description = "A chemical element with a pungent smell."
reagent_state = REAGENT_STATE_SOLID
color = "#BF8C00" //rgb: 191, 140, 0
specheatcap = 0.73
density = 1.96
/datum/reagent/water
name = "Water"
id = WATER
description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen."
reagent_state = REAGENT_STATE_LIQUID
color = "#DEF7F5" //rgb: 192, 227, 233
alpha = 128
specheatcap = 4.184
density = 1
glass_desc = "The father of all refreshments."
/datum/reagent/water/on_mob_life(var/mob/living/M, var/alien)
if(..())
return 1
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species && H.species.anatomy_flags & ACID4WATER)
M.adjustToxLoss(REM)
M.take_organ_damage(0, REM, ignore_inorganics = TRUE)
/datum/reagent/water/reaction_mob(var/mob/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
//Put out fire
if(method == TOUCH)
if(iscarbon(M))
var/mob/living/carbon/C = M
var/datum/disease2/effect/E = C.has_active_symptom(/datum/disease2/effect/thick_skin)
C.make_visible(INVISIBLESPRAY,FALSE)
if(E)
E.multiplier = max(E.multiplier - rand(1,3), 1)
to_chat(C, "<span class='notice'>The water quenches your dry skin.</span>")
else
M.make_visible(INVISIBLESPRAY)
if(isliving(M))
var/mob/living/L = M
L.ExtinguishMob()
//Water now directly damages slimes instead of being a turf check
if(isslime(M))
var/mob/living/L = M
L.adjustToxLoss(rand(15, 20))
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species && H.species.anatomy_flags & ACID4WATER) //oof ouch, water is spicy now
if(method == TOUCH)
if(H.check_body_part_coverage(EYES|MOUTH))
to_chat(H, "<span class='warning'>Your face is protected from a splash of water!</span>")
return
if(prob(15) && volume >= 30)
var/datum/organ/external/head/head_organ = H.get_organ(LIMB_HEAD)
if(head_organ)
if(head_organ.take_damage(0, 25))
H.UpdateDamageIcon(1)
head_organ.disfigure("burn")
H.audible_scream()
else
H.take_organ_damage(0, min(15, volume * 2))
else if(isslimeperson(H))
H.adjustToxLoss(rand(1,3))
M.clean_act(CLEANLINESS_WATER)
/datum/reagent/water/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
if(volume >= 3) //Hardcoded
T.wet(800)
for (var/obj/effect/decal/cleanable/glue/G in T)
qdel(G)
T.clean_act(CLEANLINESS_WATER)
var/hotspot = (locate(/obj/effect/fire) in T)
if(hotspot)
var/datum/gas_mixture/lowertemp = T.remove_air(T:air:total_moles())
lowertemp.temperature = max(min(lowertemp.temperature-2000, lowertemp.temperature / 2), 0)
lowertemp.react()
T.assume_air(lowertemp)
qdel(hotspot)
/datum/reagent/water/reaction_obj(var/obj/O, var/volume)
if(..())
return 1
if(O.invisibility)
O.make_visible(INVISIBLESPRAY)
O.clean_act(CLEANLINESS_WATER)
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
if(!cube.wrapped)
cube.Expand()
else if(istype(O,/obj/machinery/space_heater/campfire))
var/obj/machinery/space_heater/campfire/campfire = O
campfire.putOutFire()
else if(istype(O, /obj/item/weapon/book/manual/snow))
var/obj/item/weapon/book/manual/snow/S = O
S.trigger()
else if(O.on_fire) // For extinguishing objects on fire
O.extinguish()
else if(O.molten) // Molten shit.
O.molten=0
O.solidify()
else if(O.dissolvable() == WATER && prob(15))
O.acid_melt()
/datum/reagent/water/reaction_animal(var/mob/living/simple_animal/M, var/method=TOUCH, var/volume)
..()
if(istype(M,/mob/living/simple_animal/hostile/slime))
var/mob/living/simple_animal/hostile/slime/S = M
S.calm()
if(istype(M,/mob/living/simple_animal/bee))
var/mob/living/simple_animal/bee/B = M
B.calming()
/datum/reagent/water/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
T.add_waterlevel(2)

View File

@@ -0,0 +1,571 @@
//Biological reagents such as blood
/datum/reagent/blob_essence
name = "Blob Essence"
id = BLOB_ESSENCE
description = "A thick, transparent liquid extracted from live blob cores."
reagent_state = REAGENT_STATE_LIQUID
color = "#FFD6A0"
/datum/reagent/blob_essence/on_mob_life(var/mob/living/M)
if (..() || !ishuman(M))
return
/datum/reagent/blobanine
name = "Blobanine"
id = BLOBANINE
description = "An oily, green substance extracted from a blob."
reagent_state = REAGENT_STATE_LIQUID
color = "#81EB00"
/datum/reagent/blobanine/on_mob_life(var/mob/living/M)
if (..() || !ishuman(M))
return
var/mob/living/carbon/human/H = M
change_eye_color_to_green(H)
/datum/reagent/blobanine/proc/change_eye_color_to_green(var/mob/living/carbon/human/H)
var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
if (!E)
return
H.my_appearance.r_eyes = 129
H.my_appearance.g_eyes = 235
H.my_appearance.b_eyes = 0
H.update_body()
/datum/reagent/blood
name = "Blood"
description = "Tomatoes made into juice. Probably. What a waste of big, juicy tomatoes, huh?"
id = BLOOD
reagent_state = REAGENT_STATE_LIQUID
flags = CHEMFLAG_PIGMENT
color = DEFAULT_BLOOD //rgb: 161, 8, 8
density = 1.05
specheatcap = 3.49
glass_name = "Tomato Juice Glass"
glass_desc = "Are you sure this is tomato juice?"
mug_name = "mug of tomato juice"
mug_desc = "Are you sure this is tomato juice?"
flags = CHEMFLAG_PIGMENT
data = list(
"viruses" = null,
"blood_DNA" = null,
"blood_type" = null,
"blood_colour" = DEFAULT_BLOOD,
"resistances" = null,
"trace_chem" = null,
"virus2" = null,
"immunity" = null,
"occult" = null,
)
/datum/reagent/blood/handle_data_mix(var/list/added_data=null, var/added_volume, var/mob/admin)
//to do: add better ways for blood colors to interact with each other //moved from Chemistry-Holder.dm
//right now we don't support blood mixing or something similar at all.//update, we now at least support color mixing
if (admin)
var/list/species_list = list()
for(var/species_name in all_species)
var/datum/species/S = all_species[species_name]
if (!(S.anatomy_flags & NO_BLOOD))
species_list["[S.name] ([S.blood_color])"] = S.blood_color
var/chosen = input(admin,"Blood Color","Choose the Blood Color","#FFFFFF") as null|anything in species_list
if (chosen)
data["blood_colour"] = BlendRYB(species_list[chosen], data["blood_colour"], added_volume / (added_volume+volume))
color = data["blood_colour"]
else if(added_data)
if(added_data["virus2"])
if (!data["virus2"])
data["virus2"] = list()
data["virus2"] |= virus_copylist(added_data["virus2"])
if (added_data["blood_type"])
data["blood_type"] = combine_blood_types(data["blood_type"], added_data["blood_type"])
if (added_data["blood_colour"])
data["blood_colour"] = BlendRYB(added_data["blood_colour"], data["blood_colour"], added_volume / (added_volume+volume))
color = data["blood_colour"]
/datum/reagent/blood/handle_data_copy(var/list/added_data=null, var/added_volume, var/mob/admin)
if (admin)
var/list/species_list = list()
for(var/species_name in all_species)
var/datum/species/S = all_species[species_name]
if (!(S.anatomy_flags & NO_BLOOD))
species_list["[S.name] ([S.blood_color])"] = S.blood_color
var/chosen = input(admin,"Blood Color","Choose the Blood Color","#FFFFFF") as null|anything in species_list
if (chosen)
data["blood_colour"] = species_list[chosen]
color = data["blood_colour"]
else if (added_data)
data = added_data.Copy()
if(added_data["virus2"])
data["virus2"] = virus_copylist(added_data["virus2"])
if(added_data["blood_colour"])
data["blood_colour"] = added_data["blood_colour"]
color = data["blood_colour"]
/datum/reagent/blood/when_drinkingglass_master_reagent(var/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/D)
var/totally_not_blood = "Tomato Juice"
switch(color)
if (VOX_BLOOD)//#2299FC
totally_not_blood = "Space Lube"
if (INSECT_BLOOD)//#EBECE6
totally_not_blood = "Milk"
if (MUSHROOM_BLOOD)//#D3D3D3
totally_not_blood = "Milk"
if (PALE_BLOOD)//#272727
totally_not_blood = "Carbon"
if (GHOUL_BLOOD)//#7FFF00
totally_not_blood = "Piccolyn"
glass_name = "glass of [totally_not_blood]"
glass_desc = "Are you sure this is [totally_not_blood]?"
mug_name = "mug of [totally_not_blood]"
mug_desc = "Are you sure this is [totally_not_blood]?"
/datum/reagent/blood/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
var/datum/reagent/blood/self = src
if(..())
return 1
//--------------OLD DISEASE CODE----------------------
if(self.data && self.data["viruses"])
for(var/datum/disease/D in self.data["viruses"])
//var/datum/disease/virus = new D.type(0, D, 1)
if(D.spread_type == SPECIAL || D.spread_type == NON_CONTAGIOUS) //We don't spread
continue
if(method == TOUCH)
M.contract_disease(D)
else //Injected
M.contract_disease(D, 1, 0)
//----------------------------------------------------
if(iscarbon(M))
var/mob/living/L = M
if(L.can_be_infected() && self.data && self.data["virus2"]) //Infecting
var/list/blood_viruses = self.data["virus2"]
if (istype(blood_viruses) && blood_viruses.len > 0)
for (var/ID in blood_viruses)
var/datum/disease2/disease/D = blood_viruses[ID]
if(method == TOUCH)
var/block = TRUE
var/bleeding = FALSE
for(var/part in zone_sels)
if(!L.check_contact_sterility(limb_define_to_part_define(part)))
block = FALSE //Checking all targeted parts for at least one place not sterile
if(L.check_bodypart_bleeding(limb_define_to_part_define(part)))
bleeding = TRUE //Checking them all for at least one bleeding
if(!block && bleeding)
break
if(attempt_colony(L,D,"splashed with infected blood"))
else if (!block)
if (D.spread & SPREAD_CONTACT)
L.infect_disease2(D, notes="(Contact, splashed with infected blood)")
else if (bleeding && (D.spread & SPREAD_BLOOD))
L.infect_disease2(D, notes="(Blood, splashed with infected blood)")
else
L.infect_disease2(D, 1, notes="(Drank/Injected with infected blood)")
if(ishuman(L))
var/mob/living/carbon/human/H = L
if(method == TOUCH)
H.bloody_body_from_data(data,0,src)
if((LIMB_RIGHT_HAND in zone_sels) || (LIMB_LEFT_HAND in zone_sels))
H.bloody_hands_from_data(data,2,src)
spawn() //Bloody feet, result of the blood that fell on the floor
var/obj/effect/decal/cleanable/blood/B = locate() in get_turf(H)
if(B)
B.Crossed(H)
H.update_icons()
else if(self.data["blood_DNA"])
var/datum/role/vampire/V = isvampire(H)
if(V)
var/mob/living/carbon/human/foundmob
for(var/datum/data/record/R in sortRecord(data_core.medical))
if(R.fields["b_dna"] == self.data["blood_DNA"])
for(var/mob/living/carbon/human/other in player_list)
if(other.name == R.fields["name"] && other != M)
foundmob = other
break
if(foundmob)
break
if(foundmob)
var/targetref = "/ref[foundmob]"
var/blood_total_before = V.blood_total
var/blood_usable_before = V.blood_usable
var/divisor = (locate(/datum/power/vampire/mature) in V.current_powers) ? min(2,foundmob.stat + 1) : (min(2,foundmob.stat + 1)*2)
if (!(targetref in V.feeders))
V.feeders[targetref] = 0
if (V.feeders[targetref] < MAX_BLOOD_PER_TARGET)
V.blood_total += volume/divisor
else
to_chat(H, "<span class='warning'>Their blood quenches your thirst but won't let you become any stronger. You need to find new prey.</span>")
if(foundmob.stat < DEAD) //alive
V.blood_usable += volume/divisor
V.feeders[targetref] += volume/divisor
if(blood_total_before != V.blood_total)
to_chat(H, "<span class='notice'>You have accumulated [V.blood_total] unit[V.blood_total > 1 ? "s" : ""] of blood[blood_usable_before != V.blood_usable ?", and have [V.blood_usable] left to use." : "."]</span>")
V.check_vampire_upgrade()
V.update_vamp_hud()
else
to_chat(H, "<span class='warning'>This blood is lifeless and has no power.</span>")
/datum/reagent/blood/reaction_animal(var/mob/living/simple_animal/M, var/method = TOUCH, var/volume)
var/datum/reagent/blood/self = src
if(..())
return 1
if(M.can_be_infected())//for now, only mice can be infected among simple_animals.
var/mob/living/L = M
if(self.data && self.data["virus2"]) //Infecting
var/list/blood_viruses = self.data["virus2"]
if (istype(blood_viruses) && blood_viruses.len > 0)
for (var/ID in blood_viruses)
var/datum/disease2/disease/D = blood_viruses[ID]
if(method == TOUCH)
var/block = L.check_contact_sterility(FULL_TORSO)
var/bleeding = L.check_bodypart_bleeding(FULL_TORSO)
if (!block)
if (D.spread & SPREAD_CONTACT)
L.infect_disease2(D, notes="(Contact, splashed with infected blood)")
else if (bleeding && (D.spread & SPREAD_BLOOD))
L.infect_disease2(D, notes="(Blood, splashed with infected blood)")
else
L.infect_disease2(D, 1, notes="(Drank/Injected with infected blood)")
// Was unused as of 2021
///datum/reagent/blood/on_merge(var/data)
// if(data["blood_colour"])
// color = data["blood_colour"]
// return ..()
///datum/reagent/blood/on_update(var/atom/A)
// if(data["blood_colour"])
// color = data["blood_colour"]
// return ..()
/datum/reagent/blood/reaction_turf(var/turf/simulated/T, var/volume) //Splash the blood all over the place
var/datum/reagent/self = src
if(..())
return TRUE
if(volume < 3) //Hardcoded
return
blood_splatter(T, self, 1)
T.had_blood = TRUE
if(volume >= 5 && !istype(T.loc, /area/chapel)) //Blood desanctifies non-chapel tiles
T.holy = 0
return
/datum/reagent/blood/reaction_obj(var/obj/O, var/volume)
if(..())
return 1
O.add_blood_from_data(data)
if(istype(O, /obj/item/clothing/mask/stone))
var/obj/item/clothing/mask/stone/S = O
S.spikes()
/datum/reagent/blood/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
T.add_nutrientlevel(5, TRUE)
T.add_waterlevel(1)
/datum/reagent/carp_pheromones
name = "Carp Pheromones"
id = CARPPHEROMONES
description = "A disgusting liquid with a horrible smell, which is used by space carps to mark their territory and food."
reagent_state = REAGENT_STATE_LIQUID
color = "#6AAA96" //rgb: 106, 170, 150
custom_metabolism = 0.05
density = 109.06
specheatcap = ARBITRARILY_LARGE_NUMBER //Contains leporazine, better this than 6 digits
/datum/reagent/carp_pheromones/on_mob_life(var/mob/living/M)
if(..())
return 1
if(!tick)
to_chat(M,"<span class='good'><b>You feel more carplike! [pick("Do you, perhaps...?","Maybe... just maybe...")]</b></span>")
if(volume < 3)
if(volume <= custom_metabolism)
to_chat(M,"<span class='danger'>You feel not at all carplike!</span>")
else if(!(tick%4))
to_chat(M,"<span class='warning'>You feel less carplike...</span>")
var/stench_radius = clamp(tick * 0.1, 1, 6) //Stench starts out with 1 tile radius and grows after every 10 life ticks
if(prob(5)) //5% chance of stinking per life()
for(var/mob/living/carbon/C in oview(stench_radius, M)) //All other carbons in 4 tile radius (excluding our mob)
if(C.stat)
return
if(istype(C.wear_mask))
var/obj/item/clothing/mask/c_mask = C.wear_mask
if(c_mask.body_parts_covered & MOUTH)
continue //If the carbon's mouth is covered, let's assume they don't smell it
to_chat(C, "<span class='warning'>You are engulfed by a [pick("tremendous", "foul", "disgusting", "horrible")] stench emanating from [M]!</span>")
/datum/reagent/ectoplasm
name = "Ectoplasm"
id = ECTOPLASM
description = "Pure, distilled spooky."
reagent_state = REAGENT_STATE_LIQUID
color = "#21d389b4"
density = 0.05
custom_metabolism = 0.01
var/spookvision = FALSE
/datum/reagent/ectoplasm/on_mob_life(var/mob/living/M)
if(..())
return 1
if(!spookvision && tick >= 5 && volume >= 1) //ghostsight after 10s and having more than 1u inside
spookvision = TRUE
to_chat(M, "<span class='notice'>You start seeing through the veil!</span>")
M.see_invisible = SEE_INVISIBLE_OBSERVER
M.see_invisible_override = SEE_INVISIBLE_OBSERVER
if(spookvision && volume < 1)
spookvision = FALSE
to_chat(M, "<span class='notice'>Your otherworldly sight suddenly vanishes!</span>")
M.see_invisible = initial(M.see_invisible)
M.see_invisible_override = 0
if(isskellington(M) || isskelevox(M) || islich(M)) //Slightly better than DD for spooks
playsound(M, 'sound/effects/rattling_bones.ogg', 100, 1)
if(M.getOxyLoss())
M.adjustOxyLoss(-3)
holder.remove_reagent(ECTOPLASM, 0.1)
if(M.getBruteLoss())
M.heal_organ_damage(3, 0)
holder.remove_reagent(ECTOPLASM, 0.1)
if(M.getFireLoss())
M.heal_organ_damage(0, 3)
holder.remove_reagent(ECTOPLASM, 0.1)
if(M.getToxLoss())
M.adjustToxLoss(-3)
holder.remove_reagent(ECTOPLASM, 0.1)
/datum/reagent/greygoo // A very powerful mothership neurostimulant and anti hallucinogenic. Toxic for other species and less effective, but still usable
name = "Grey Goo"
id = GREYGOO
description = "A viscous grey substance of unknown origin."
reagent_state = REAGENT_STATE_LIQUID
dupeable = FALSE
color = "#B5B5B5" //rgb: 181, 181, 181
custom_metabolism = 0.1
pain_resistance = 50
/datum/reagent/greygoo/on_mob_life(var/mob/living/M, var/alien)
if(..())
return 1
if(holder.has_any_reagents(list(MERCURY, IMPEDREZENE, SPACE_DRUGS)))
holder.remove_reagents(list(MERCURY, IMPEDREZENE, SPACE_DRUGS), 5 * REM)
if(holder.has_any_reagents(list(MINDBREAKER, SPIRITBREAKER)))
holder.remove_reagents(list(MINDBREAKER, SPIRITBREAKER), 3 * REM) // The only chemical that removes spiritbreaker besides adminordrazine
if(alien && alien == IS_GREY) // A nice brain scrub for greys, cleaning out any damage, hallucinations, confusion, and dizziness
if(ishuman(M))
M.adjustBrainLoss(-10)
M.hallucination = 0
M.dizziness = 0
M.confused = 0
if(prob(5))
to_chat(M, "<span class='notice'>[pick("You feel a pleasant equilibrium settle across your mind.","You feel much more focused.","Your mind is clear and lucid.")]</span>")
else // Still a pretty effective brain scrub for other species, but cures brain damage half as effectively and causes some toxin damage
if(ishuman(M))
M.adjustBrainLoss(-5)
M.hallucination = 0
M.dizziness = 0
M.confused = 0
M.adjustToxLoss(1)
/datum/reagent/grue_bile
name = "Grue Bile"
id = GRUE_BILE
description = "A noxious substance produced in the body of a grue."
reagent_state = REAGENT_STATE_LIQUID
color = GRUE_BLOOD
custom_metabolism = 0.01
density = 1.25
specheatcap = 2.2
pain_resistance = -25 //increases pain a bit
/datum/reagent/grue_bile/on_mob_life(var/mob/living/M)
if(..())
return 1
M.adjustToxLoss(0.1) //Does some toxin damage
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/datum/organ/internal/eyes/E= H.internal_organs_by_name["eyes"] //damages the eyes
if(E && !istype(E, /datum/organ/internal/eyes/monstrous) && !E.robotic) //doesn't harm monstrous or robotic eyes
E.damage += 0.5
/datum/reagent/ironrot
name = "Ironrot"
id = IRONROT
description = "A mutated fungal compound that causes rapid rotting in iron infrastructures."
reagent_state = REAGENT_STATE_LIQUID
color = "#005200" //moldy green
/datum/reagent/ironrot/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
if(volume >= 5 && T.can_thermite && istype(T, /turf/simulated/wall))
var/turf/simulated/wall/W = T
W.rot()
/datum/reagent/ironrot/on_mob_life(var/mob/living/M)
if(..())
return 1
M.adjustToxLoss(2 * REM)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/datum/organ/external/chest/C = H.get_organ(LIMB_CHEST)
for(var/datum/organ/internal/I in C.internal_organs)
if(I.robotic == 2)
I.take_damage(10, 0)//robo organs get damaged by ingested ironrot
/datum/reagent/ironrot/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
if(method == TOUCH)
if(issilicon(M))//borgs are hurt on touch by this chem
M.adjustFireLoss(10)
M.adjustBruteLoss(10)
//todo : mech and pod damage
/datum/reagent/mucus
name = "Mucus"
id = MUCUS
description = "A slippery aqueous secretion produced by, and covering, mucous membranes. Problematic for Asthmatics."
reagent_state = REAGENT_STATE_LIQUID
color = "#13BC5E"
custom_metabolism = 0.01
/datum/reagent/mucus/on_mob_life(var/mob/living/M)
if(..())
return 1
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(M_ASTHMA in H.mutations)
H.adjustOxyLoss(2)
if(prob(30))
H.emote("gasp", null, null, TRUE)
//Petritricin = cockatrice juice
//Lore explanation for it affecting worn items (like hardsuits), but not items dropped on the ground that it was splashed over:
//Pure petritricin can stonify any matter, organic or unorganic. However, if it's outside of a living organism, it rapidly deterogates
//until it is only strong enough to affect organic matter.
//When introduced to organic matter, petritricin converts living cells to produce more of itself, and the freshly produced substance
//can affect items worn close enough to the body
/datum/reagent/petritricin
name = "Petritricin"
id = PETRITRICIN
description = "Petritricin is a venom produced by cockatrices. The extraction process causes a major potency loss, but a right dose of this can still petrify somebody."
color = "#002000" //rgb: 0, 32, 0
dupeable = FALSE
var/min_to_start = 1 //At least 1 unit is needed for petriication to start
var/is_being_petrified = FALSE
var/stage
/datum/reagent/petritricin/on_mob_life(var/mob/living/M)
if(..())
return 1
if(issilicon(M))
return
var/mob/living/carbon/C
if(iscarbon(M))
C = M
if(volume >= min_to_start && !is_being_petrified)
is_being_petrified = TRUE
if(is_being_petrified)
if(holder.has_any_reagents(ACIDS))
to_chat(M, "<span class='notice'>You feel a wave of relief as your muscles loosen up.</span>")
C.pain_shock_stage = max(0, C.pain_shock_stage - 300)
is_being_petrified = FALSE
holder.del_reagent(PETRITRICIN)
return
switch(stage)
if(1)
//Second message is shown to hallucinating mobs
M.simple_message("<span class='userdanger'>You are slowing down. Moving is extremely painful for you.</span>",\
"<span class='notice'>You feel like Michelangelo di Lodovico Buonarroti Simoni trapped in a foreign body.</span>")
if(istype(C))
C.pain_shock_stage += 300
M.audible_scream()
if(2)
M.simple_message("<span class='userdanger'>Your skin starts losing color and cracking. Your body becomes numb.</span>",\
"<span class='notice'>You decide to channel your inner Italian sculptor to create a beautiful statue.</span>")
M.Stun(3)
if(3)
if(M.turn_into_statue(1))
M.simple_message("<span class='userdanger'>You have been turned to stone by ingesting petritricin.</span>",\
"<span class='notice'>You've created a masterwork statue of David!</span>")
is_being_petrified = FALSE
stage = stage + 1
/datum/reagent/roach_shell
name = "Cockroach Chitin"
id = ROACHSHELL
description = "Looks like somebody's been shelling peanuts."
reagent_state = REAGENT_STATE_SOLID
color = "#8B4513"
/datum/reagent/slimejelly
name = "Slime Jelly"
id = SLIMEJELLY
description = "A gooey semi-liquid produced from one of the deadliest lifeforms in existence. SO REAL."
reagent_state = REAGENT_STATE_LIQUID
color = "#801E28" //rgb: 128, 30, 40
density = 0.8
specheatcap = 1.24
/datum/reagent/slimejelly/on_mob_life(var/mob/living/M, var/alien)
if(..())
return 1
var/mob/living/carbon/human/human = M
if(!isslimeperson(human))
if(prob(10))
to_chat(M, "<span class='warning'>Your insides are burning!</span>")
M.adjustToxLoss(rand(20, 60) * REM)
if(prob(40))
M.heal_organ_damage(5 * REM, 0)
/datum/reagent/vomit
name = "Vomit"
id = VOMIT
description = "Stomach acid mixed with partially digested chunks of food."
reagent_state = REAGENT_STATE_LIQUID
color = "#EACF9D" //rgb: 234, 207, 157. Pale yellow
density = 1.35
specheatcap = 5.2
/datum/reagent/vomit/on_mob_life(var/mob/living/M)
if(..())
return 1
M.adjustToxLoss(0.1)
/datum/reagent/vomit/reaction_turf(turf/simulated/T, volume)
if(..())
return 1
if(volume >= 3)
if(!(locate(/obj/effect/decal/cleanable/vomit) in T))
new /obj/effect/decal/cleanable/vomit(T)

View File

@@ -0,0 +1,206 @@
//Discount Dan! He's our man!
/datum/reagent/discount
name = "Discount Dan's Special Sauce"
id = DISCOUNT
description = "You can almost feel your liver failing, just by looking at it."
reagent_state = REAGENT_STATE_LIQUID
color = "#6F884F" //rgb: 111, 136, 79
nutriment_factor = 4 * REAGENTS_METABOLISM
/datum/reagent/discount/New()
..()
density = rand(12,48)
specheatcap = rand(25,2500)/100
/datum/reagent/discount/on_mob_life(var/mob/living/M)
if(..())
return 1
if(ishuman(M))
var/mob/living/carbon/human/H = M
switch(volume)
if(1 to 20)
if(prob(5))
to_chat(H,"<span class='warning'>You don't feel very good.</span>")
holder.remove_reagent(src.id, 0.1 * FOOD_METABOLISM)
if(20 to 35)
if(prob(10))
to_chat(H,"<span class='warning'>You really don't feel very good.</span>")
if(prob(5))
H.adjustToxLoss(0.1)
H.visible_message("[H] groans.")
holder.remove_reagent(src.id, 0.3 * FOOD_METABOLISM)
if(35 to INFINITY)
if(prob(10))
to_chat(H,"<span class='warning'>Your stomach grumbles unsettlingly.</span>")
if(prob(5))
to_chat(H,"<span class='warning'>Something feels wrong with your body.</span>")
var/datum/organ/internal/liver/L = H.internal_organs_by_name["liver"]
if(istype(L))
L.take_damage(0.1, 1)
H.adjustToxLoss(0.13)
holder.remove_reagent(src.id, 0.5 * FOOD_METABOLISM)
/datum/reagent/discount/mannitol
name = "Mannitol"
id = MANNITOL
description = "The only medicine a <B>REAL MAN</B> needs."
/datum/reagent/irradiatedbeans
name = "Irradiated Beans"
id = IRRADIATEDBEANS
description = "You can almost taste the lead sheet behind it!"
reagent_state = REAGENT_STATE_LIQUID
color = "#6F884F" //rgb: 255,255,255 //to-do
nutriment_factor = 1 * REAGENTS_METABOLISM
/datum/reagent/irradiatedbeans/on_mob_life(var/mob/living/M)
if(..())
return 1
if(prob(5))
M.apply_radiation(2, RAD_INTERNAL)
/datum/reagent/toxicwaste
name = "Toxic Waste"
id = TOXICWASTE
description = "A type of sludge."
reagent_state = REAGENT_STATE_LIQUID
color = "#6F884F" //rgb: 255,255,255 //to-do
density = 5.59
specheatcap = 2.71
/datum/reagent/toxicwaste/on_mob_life(var/mob/living/M)
if(..())
return 1
if(prob(20))
M.adjustToxLoss(1)
/datum/reagent/refriedbeans
name = "Re-Fried Beans"
id = REFRIEDBEANS
description = "Mmm.."
reagent_state = REAGENT_STATE_LIQUID
color = "#6F884F" //rgb: 255,255,255 //to-do
nutriment_factor = 1 * REAGENTS_METABOLISM
/datum/reagent/mutatedbeans
name = "Mutated Beans"
id = MUTATEDBEANS
description = "Mutated flavor."
reagent_state = REAGENT_STATE_LIQUID
color = "#6F884F" //rgb: 255,255,255 //to-do
nutriment_factor = 1 * REAGENTS_METABOLISM
/datum/reagent/mutatedbeans/on_mob_life(var/mob/living/M)
if(..())
return 1
if(prob(10))
M.adjustToxLoss(1)
/datum/reagent/beff
name = "Beff"
id = BEFF
description = "What's beff? Find out!"
reagent_state = REAGENT_STATE_LIQUID
color = "#6F884F" //rgb: 255,255,255 //to-do
nutriment_factor = 2 * REAGENTS_METABOLISM
/datum/reagent/horsemeat
name = "Horse Meat"
id = HORSEMEAT
description = "Tastes excellent in lasagna."
reagent_state = REAGENT_STATE_LIQUID
color = "#6F884F" //rgb: 255,255,255 //to-do
nutriment_factor = 3 * REAGENTS_METABOLISM
/datum/reagent/moonrocks
name = "Moon Rocks"
id = MOONROCKS
description = "We don't know much about it, but we damn well know that it hates the human skeleton."
reagent_state = REAGENT_STATE_LIQUID
color = "#6F884F" //rgb: 255,255,255 //to-do
/datum/reagent/moonrocks/on_mob_life(var/mob/living/M)
if(..())
return 1
if(prob(15))
M.adjustBruteLoss(2) //Brute damage since it hates the human skeleton
/datum/reagent/offcolorcheese
name = "Off-Color Cheese"
id = OFFCOLORCHEESE
description = "American Cheese."
reagent_state = REAGENT_STATE_LIQUID
color = "#6F884F" //rgb: 255,255,255 //to-do
nutriment_factor = 1 * REAGENTS_METABOLISM
/datum/reagent/bonemarrow
name = "Bone Marrow"
id = BONEMARROW
description = "Looks like a skeleton got stuck in the production line."
reagent_state = REAGENT_STATE_LIQUID
color = "#6F884F" //rgb: 255,255,255 //to-do
nutriment_factor = 1 * REAGENTS_METABOLISM
/datum/reagent/greenramen
name = "Greenish Ramen Noodles"
id = GREENRAMEN
description = "That green isn't organic."
reagent_state = REAGENT_STATE_LIQUID
color = "#6F884F" //rgb: 255,255,255 //to-do
nutriment_factor = 2 * REAGENTS_METABOLISM
/datum/reagent/greenramen/on_mob_life(var/mob/living/M)
if(..())
return 1
if(prob(5))
M.adjustToxLoss(1)
if(prob(5))
M.apply_radiation(1, RAD_INTERNAL) //Call it uranium contamination so heavy metal poisoning for the tox and the uranium radiation for the radiation damage
/datum/reagent/glowingramen
name = "Glowing Ramen Noodles"
id = GLOWINGRAMEN
description = "That glow 'aint healthy."
reagent_state = REAGENT_STATE_LIQUID
color = "#6F884F" //rgb: 255,255,255 //to-do
nutriment_factor = 2 * REAGENTS_METABOLISM
/datum/reagent/glowingramen/on_mob_life(var/mob/living/M)
if(..())
return 1
if(prob(10))
M.apply_radiation(1, RAD_INTERNAL)
/datum/reagent/deepfriedramen
name = "Deep Fried Ramen Noodles"
id = DEEPFRIEDRAMEN
description = "Ramen, deep fried."
reagent_state = REAGENT_STATE_LIQUID
color = "#6F884F" //rgb: 255,255,255 //to-do
nutriment_factor = 2 * REAGENTS_METABOLISM
/datum/reagent/fake_creep // Used to spread xenomorph creep. Why? Well, why not?
name = "Dan's Grape Drank"
id = FAKE_CREEP
description = "Discount Dan's award-winning grape drink. Limited production run! Now with added peanuts!"
reagent_state = REAGENT_STATE_LIQUID
color = "#6F2DA8" // 111, 45, 168
/datum/reagent/fake_creep/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
if(volume >= 1)
if(!locate(/obj/effect/alien/weeds) in T)
new /obj/effect/alien/weeds(T)
if(!locate(/obj/effect/decal/cleanable/purpledrank) in T)
new /obj/effect/decal/cleanable/purpledrank(T)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,510 @@
//Illicit chemicals, with the exception of toxins
/datum/reagent/caffeine
name = "Caffeine"
id = CAFFEINE
description = "Caffeine is a common stimulant. It works by making your metabolism faster so it also increases your appetite."
color = "#E8E8E8" //rgb: 232, 232, 232
// it also makes you hungry because it speeds up your metabolism
nutriment_factor = -5 * REAGENTS_METABOLISM
density = 1.23
specheatcap = 0.89
custom_metabolism = 0.1
/datum/reagent/caffeine/on_mob_life(var/mob/living/M)
if(..())
return 1
// you just ingested pure caffeine so you're gonna get the BIG shakes
M.Jitter(10)
/datum/reagent/creatine
name = "Creatine"
id = CREATINE
description = "Highly toxic substance that grants the user enormous strength, before their muscles seize and tear their own body to shreds."
reagent_state = REAGENT_STATE_LIQUID
color = "#6F884F" //rgb: 255, 255, 255
var/has_been_hulk = 0
var/has_ripped_and_torn = 0 //We've applied permanent damage.
var/hulked_at = 0 //world.time
var/has_mouse_bulked = 0
custom_metabolism = 0.1
density = 6.82
specheatcap = 678.67
/datum/reagent/creatine/reagent_deleted()
if(..())
return 1
if(!holder)
return
var/mob/M = holder.my_atom
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(!has_been_hulk || has_ripped_and_torn || (!(M_HULK in H.mutations)))
return
var/timedmg = ((30 SECONDS) - (H.hulk_time - world.time)) / 10
dehulk(H, timedmg * 3, 1, 0)
/datum/reagent/creatine/on_mob_life(var/mob/living/M)
if(..())
return 1
switch(volume)
if(1 to 25)
M.adjustToxLoss(1)
M.Dizzy(5)
M.Jitter(5)
if(prob(5) && M.feels_pain())
to_chat(M, "<span class='warning'>Oh god, the pain!</span>")
if(25 to INFINITY)
if(ishuman(M)) //If human and not diona, hulk out
var/mob/living/carbon/human/H = M
if(H.species.name != "Diona") //Dionae are broken as fuck
if(H.hulk_time<world.time && !has_been_hulk)
H.hulk_time = world.time + (30 SECONDS)
hulked_at = H.hulk_time
if(!(M_HULK in H.mutations))
has_been_hulk = 1
has_ripped_and_torn = 0 //Fuck them UP after they dehulk.
H.mutations.Add(M_HULK)
H.update_mutations() //Update our mutation overlays
H.update_body()
message_admins("[key_name(M)] is TOO SWOLE TO CONTROL (on creatine)! ([formatJumpTo(M)])")
else if(H.hulk_time<world.time && has_been_hulk) //TIME'S UP
dehulk(H)
else if(prob(1))
H.say(pick("YOU TRYIN' BUILD SUM MUSSLE?", "TOO SWOLE TO CONTROL", "HEY MANG", "HEY MAAAANG"))
if(ismouse(M)) //If mouse, become a gym rat. With a 1 in 20 chance of becoming a roid rat
if(has_mouse_bulked == 0)
if(prob(95))
has_mouse_bulked = 1
if(prob(95))
M.visible_message("<span class='warning'>[M] suddenly grows significantly in size, the color draining from its fur as its muscles expand!</span>")
M.transmogrify(/mob/living/simple_animal/hostile/retaliate/gym_rat)
else
M.visible_message("<span class='warning'>[M] suddenly grows significantly in size, the color draining from its fur as its muscles expand! A pomadour also sprouts from the top of its head!</span>")
M.transmogrify(/mob/living/simple_animal/hostile/retaliate/gym_rat/pompadour_rat)
else
has_mouse_bulked = 1
M.visible_message("<span class='danger'>[M] grows to the size of a dog, and its muscles expand to ridiculous proportions! It's ripped!</span>")
M.transmogrify(/mob/living/simple_animal/hostile/retaliate/gym_rat/roid_rat)
else //You only bulk once, fella. If you lose the bulk, you're outta luck
return
/datum/reagent/creatine/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
if(!holder)
return
if(!T)
T = holder.my_atom //Try to find the mob through the holder
if(!istype(T)) //Still can't find it, abort
return
var/amount = T.reagents.get_reagent_amount(id)
if(amount >= 1)
if(prob(15))
T.mutate(GENE_DEVELOPMENT)
T.reagents.remove_reagent(id, 1)
else if(amount > 0)
T.reagents.remove_reagent(id, amount)
/datum/reagent/creatine/proc/dehulk(var/mob/living/carbon/human/H, damage = 200, override_remove = 0, gib = 1)
if(has_been_hulk && !has_ripped_and_torn)
to_chat(H, "<span class='warning'>You feel like your muscles are ripping apart!</span>")
has_ripped_and_torn = 1
if(!override_remove)
holder.remove_reagent(src.id) //Clean them out
H.adjustBruteLoss(damage) //Crit
if(gib)
for(var/datum/organ/external/E in H.organs)
if(prob(50))
//Override the current limb status and don't cause an explosion
E.droplimb(1, 1)
if(H.species)
hgibs(H.loc, H.virus2, H.dna, H.species.flesh_color, H.species.blood_color)
else
hgibs(H.loc, H.virus2, H.dna)
H.hulk_time = 0 //Just to be sure.
H.mutations.Remove(M_HULK)
//M.dna.SetSEState(HULKBLOCK,0)
H.update_mutations() //update our mutation overlays
H.update_body()
/datum/reagent/danbacco
name = "Tobacco"
id = DANBACCO //This product may or may not cause cancer.
description = "The cured and ground leaves of a tobacco plant with additional Discount Dan flavors."
reagent_state = REAGENT_STATE_SOLID
color = "#4c1e00" //rgb: 76, 30, 0
density = 1.01
/datum/reagent/danbacco/on_mob_life(var/mob/living/M)
if(..())
return 1
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(prob(50)) //Discount dan's special blend.
H.add_cancer(1, LIMB_CHEST)
/datum/reagent/hippies_delight
name = "Hippie's Delight"
id = HIPPIESDELIGHT
description = "You just don't get it, maaaan."
reagent_state = REAGENT_STATE_LIQUID
color = "#664300" //rgb: 102, 67, 0
glass_icon_state = "hippiesdelightglass"
glass_name = "\improper Hippie's Delight"
glass_desc = "A drink popular in the 1960s."
/datum/reagent/hippies_delight/on_mob_life(var/mob/living/M)
if(..())
return 1
M.druggy = max(M.druggy, 50)
switch(tick)
if(1 to 5)
if(!M.stuttering)
M.stuttering = 1
M.Dizzy(10)
if(prob(10))
M.emote(pick("twitch", "giggle"))
if(5 to 10)
if(!M.stuttering)
M.stuttering = 1
M.Jitter(20)
M.Dizzy(20)
M.druggy = max(M.druggy, 45)
if(prob(20))
M.emote(pick("twitch", "giggle"))
if(10 to INFINITY)
if(!M.stuttering)
M.stuttering = 1
M.Jitter(40)
M.Dizzy(40)
M.druggy = max(M.druggy, 60)
if(prob(30))
M.emote(pick("twitch", "giggle"))
/datum/reagent/hyperzine
name = "Hyperzine"
id = HYPERZINE
description = "Hyperzine is a highly effective, long lasting, muscle stimulant."
reagent_state = REAGENT_STATE_LIQUID
color = "#C8A5DC" //rgb: 200, 165, 220
custom_metabolism = 0.03
overdose_am = REAGENTS_OVERDOSE/2
density = 1.79
specheatcap = 0.70
/datum/reagent/hyperzine/on_mob_life(var/mob/living/M)
if(..())
return 1
if(prob(5) && M.stat == CONSCIOUS)
M.emote(pick("twitch","blink_r","shiver")) //See movement_tally_multiplier for the rest
/datum/reagent/hyperzine/on_overdose(var/mob/living/M)
..() //calls parent to give everyone toxin damage
if(ishuman(M) && M.get_heart()) // Got a heart?
var/mob/living/carbon/human/H = M
var/datum/organ/internal/heart/damagedheart = H.get_heart()
if(H.species.name != "Diona" && damagedheart) // Not on dionae
if(prob(15) && M.stat == CONSCIOUS)
to_chat(H, "<span class='danger'>You feel a sharp pain in your chest!</span>")
damagedheart.damage += 1
else
M.adjustFireLoss(1) // Burn damage for dionae
/datum/reagent/hyperzine/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
if(!holder)
return
if(!T)
T = holder.my_atom //Try to find the mob through the holder
if(!istype(T)) //Still can't find it, abort
return
var/amount = T.reagents.get_reagent_amount(id)
if(amount >= 1)
if(prob(15))
T.mutate(GENE_METABOLISM)
T.reagents.remove_reagent(id, 1)
if(prob(15))
T.mutate(GENE_METABOLISM)
else if(amount > 0)
T.reagents.remove_reagent(id, amount)
/datum/reagent/hyperzine/pcp
name = "Liquid PCP"
id = LIQUIDPCP
description = "I didn't even know it came in liquid form!"
reagent_state = REAGENT_STATE_LIQUID
color = "#7a6d23" //rgb: 200, 165, 220
/datum/reagent/hyperzine/pcp/on_mob_life(var/mob/living/M)
if(..())
return 1
if(holder.has_reagent(CHILLWAX))
holder.remove_reagent(CHILLWAX, REM)
if(M)
M.a_intent = I_HURT
if(M?.hud_used?.action_intent)
M.hud_used.action_intent.icon_state = "intent_hurt"
M.hallucination += 10
/datum/reagent/hyperzine/methamphetamine //slightly better than 'zine
name = "Methamphetamine" //Only used on the Laundromat spess vault
id = METHAMPHETAMINE
description = "It uses a different manufacture method but it is every bit as pure."
color = "#89CBF0" //baby blue
custom_metabolism = 0.01
overdose_am = 30
/datum/reagent/hypozine //syndie hyperzine
name = "Hypozine"
id = HYPOZINE
description = "Hypozine is an extremely effective, short lasting, muscle stimulant."
reagent_state = REAGENT_STATE_LIQUID
color = "#C8A5DC" //rgb: 200, 165, 220
var/has_been_hypozined = 0
var/has_had_heart_explode = 0 //We've applied permanent damage.
custom_metabolism = 0.04
var/oldspeed = 0
/datum/reagent/hypozine/reagent_deleted()
if(..())
return 1
if(!holder)
return
var/mob/M = holder.my_atom
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(!has_been_hypozined)
return
var/timedmg = ((tick - 60) / 2)
if (timedmg > 0)
dehypozine(H, timedmg, 1, 0)
/datum/reagent/hypozine/on_mob_life(var/mob/living/M)
if(..())
return 1
M.reagents.add_reagent ("hyperzine", 0.03) //To pretend it's all okay.
if(ishuman(M))
if(tick<121 && !has_been_hypozined)
has_been_hypozined = 1
has_had_heart_explode = 0 //Fuck them UP after they're done going fast.
switch(tick)
if(60 to 99) //Speed up after a minute
if(tick==60)
to_chat(M, "<span class='notice'>You feel faster.")
M.movement_speed_modifier += 0.5
oldspeed += 0.5
if(prob(5))
to_chat(M, "<span class='notice'>[pick("Your leg muscles pulsate", "You feel invigorated", "You feel like running")].")
if(100 to 114) //painfully fast
if(tick==100)
to_chat(M, "<span class='notice'>Your muscles start to feel pretty hot.")
M.movement_speed_modifier += 0.5
oldspeed += 0.5
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(prob(10))
if (M.get_heart())
to_chat(M, "<span class='notice'>[pick("Your legs are heating up", "You feel your heart racing", "You feel like running as far as you can")]!")
else
to_chat(M, "<span class='notice'>[pick("Your legs are heating up", "Your body is aching to move", "You feel like running as far as you can")]!")
H.adjustFireLoss(0.1)
if(115 to 120) //traverse at a velocity exceeding the norm
if(tick==115)
to_chat(M, "<span class='alert'>Your muscles are burning up!")
M.movement_speed_modifier += 2
oldspeed += 2
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(prob(25))
if (M.get_heart())
to_chat(M, "<span class='alert'>[pick("Your legs are burning", "All you feel is your heart racing", "Run! Run through the pain")]!")
else
to_chat(M, "<span class='alert'>[pick("Your legs are burning", "You feel like you're on fire", "Run! Run through the heat")]!")
H.adjustToxLoss(1)
H.adjustFireLoss(2)
if(121 to INFINITY) //went2fast
dehypozine(M)
/datum/reagent/hypozine/proc/dehypozine(var/mob/living/M, heartdamage = 30, override_remove = 0, explodeheart = 1)
M.movement_speed_modifier -= oldspeed
if(has_been_hypozined && !has_had_heart_explode)
has_had_heart_explode = 1
if(!override_remove)
holder.remove_reagent(src.id) //Clean them out
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.get_heart())//Got a heart?
var/datum/organ/internal/heart/damagedheart = H.get_heart()
if (heartdamage >= 30)
if(H.species.name != "Diona" && damagedheart) //fuck dionae
to_chat(H, "<span class='danger'>You feel a terrible pain in your chest!</span>")
damagedheart.damage += heartdamage //Bye heart.
if(explodeheart)
qdel(H.remove_internal_organ(H,damagedheart,H.get_organ(LIMB_CHEST)))
H.adjustOxyLoss(heartdamage*2)
H.adjustBruteLoss(heartdamage)
else
to_chat(H, "<span class='danger'>The heat engulfs you!</span>")
for(var/datum/organ/external/E in H.organs)
E.droplimb(1, 1) //Bye limbs!
H.adjustFireLoss(heartdamage)
H.adjustBruteLoss(heartdamage)
H.adjustToxLoss(heartdamage)
if(explodeheart)
qdel(H.remove_internal_organ(H,damagedheart,H.get_organ(LIMB_CHEST))) //and heart!
else if (heartdamage < 30)
if(H.species.name != "Diona")
to_chat(H, "<span class='danger'>You feel a sharp pain in your chest!</span>")
else
to_chat(H, "<span class='danger'>The heat engulfs you!</span>")
H.adjustFireLoss(heartdamage)
damagedheart.damage += heartdamage
H.adjustToxLoss(heartdamage)
H.adjustBruteLoss(heartdamage)
else//No heart?
to_chat(H, "<span class='danger'>The heat engulfs you!</span>")
if (heartdamage >= 30)
for(var/datum/organ/external/E in H.organs)
E.droplimb(1, 1) //Bye limbs!
H.adjustBruteLoss(heartdamage)
H.adjustFireLoss(heartdamage)
else if (heartdamage < 30)
H.adjustBruteLoss(heartdamage)
H.adjustFireLoss(heartdamage)
H.adjustToxLoss(heartdamage)
else
M.gib()
tick = 0
oldspeed = 0
/datum/reagent/impedrezene
name = "Impedrezene"
id = IMPEDREZENE
description = "Impedrezene is a narcotic that impedes one's ability by slowing down the higher brain cell functions."
reagent_state = REAGENT_STATE_LIQUID
color = "#C8A5DC" //rgb: 200, 165, 220
overdose_am = REAGENTS_OVERDOSE
density = 8.15
specheatcap = 0.16
/datum/reagent/impedrezene/on_mob_life(var/mob/living/M)
if(..())
return 1
M.jitteriness = max(M.jitteriness - 5,0)
if(prob(80))
M.adjustBrainLoss(5 * REM)
if(prob(50))
M.drowsyness = max(M.drowsyness, 3)
if(prob(10))
M.emote("drool", null, null, TRUE)
/datum/reagent/nicotine
name = "Nicotine"
id = NICOTINE
description = "A highly addictive stimulant extracted from the tobacco plant."
reagent_state = REAGENT_STATE_LIQUID
color = "#181818" //rgb: 24, 24, 24
density = 1.01
/datum/reagent/psilocybin
name = "Psilocybin"
id = PSILOCYBIN
description = "A strong psycotropic derived from certain species of mushroom."
color = "#E700E7" //rgb: 231, 0, 231
/datum/reagent/psilocybin/on_mob_life(var/mob/living/M)
if(..())
return 1
M.druggy = max(M.druggy, 30)
switch(tick)
if(1 to 5)
if(!M.stuttering)
M.stuttering = 1
M.Dizzy(5)
if(prob(10))
M.emote(pick("twitch", "giggle"))
if(5 to 10)
if(!M.stuttering)
M.stuttering = 1
M.Jitter(10)
M.Dizzy(10)
M.druggy = max(M.druggy, 35)
if(prob(20))
M.emote(pick("twitch", "giggle"))
if (10 to INFINITY)
if(!M.stuttering)
M.stuttering = 1
M.Jitter(20)
M.Dizzy(20)
M.druggy = max(M.druggy, 40)
if(prob(30))
M.emote(pick("twitch", "giggle"))
/datum/reagent/serotrotium
name = "Serotrotium"
id = SEROTROTIUM
description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans."
reagent_state = REAGENT_STATE_LIQUID
color = "#202040" //rgb: 20, 20, 40
custom_metabolism = 0.25
overdose_am = REAGENTS_OVERDOSE
density = 1.8
specheatcap = 2.84
/datum/reagent/serotrotium/on_mob_life(var/mob/living/M)
if(..())
return 1
if(prob(7))
M.emote(pick("twitch", "drool", "moan", "gasp"), null, null, TRUE)
M.druggy = max(M.druggy, 50)
/datum/reagent/space_drugs
name = "Space Drugs"
id = SPACE_DRUGS
description = "An illegal chemical compound used as drug."
reagent_state = REAGENT_STATE_LIQUID
color = "#60A584" //rgb: 96, 165, 132
custom_metabolism = 0.5
overdose_am = REAGENTS_OVERDOSE
density = 5.23
specheatcap = 0.62
/datum/reagent/space_drugs/on_mob_life(var/mob/living/M)
if(..())
return 1
M.druggy = max(M.druggy, 15)
if(isturf(M.loc) && !istype(M.loc, /turf/space))
if(M.canmove && !M.restrained())
if(prob(10))
step(M, pick(cardinal))
if(prob(7))
M.emote(pick("twitch", "drool", "moan", "giggle"), null, null, TRUE)
//Solely for flavor.
/datum/reagent/tobacco
name = "Tobacco"
id = TOBACCO
description = "The cured and ground leaves of a tobacco plant."
reagent_state = REAGENT_STATE_SOLID
color = "#4c1e00" //rgb: 76, 30, 0
density = 1.01

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,172 @@
//Reagents that handle physical construction materials like glass, iron, diamond, etc
/datum/reagent/diamond
name = "Diamond Dust"
id = DIAMONDDUST
description = "An allotrope of carbon, one of the hardest minerals known."
reagent_state = REAGENT_STATE_SOLID
color = "#C4D4E0" //196 212 224
density = 3.51
specheatcap = 6.57
/datum/reagent/diamond/on_mob_life(var/mob/living/M)
if(..())
return 1
if(isgolem(M)) //golems metabolize the diamond into very expensive doctor's delight
if(M.getOxyLoss())
M.adjustOxyLoss(-2)
if(M.getBruteLoss())
M.heal_organ_damage(2, 0)
if(M.getFireLoss())
M.heal_organ_damage(0, 2)
if(M.getToxLoss())
M.adjustToxLoss(-2)
if(M.dizziness != 0)
M.dizziness = max(0, M.dizziness - 15)
if(M.confused != 0)
M.remove_confused(5)
else
M.adjustBruteLoss(5 * REM) //Not a good idea to eat crystal powder
if(prob(30))
M.audible_scream()
/datum/reagent/gold
name = "Gold Powder"
id = GOLD
description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known."
reagent_state = REAGENT_STATE_SOLID
color = "#F7C430" //rgb: 247, 196, 48
specheatcap = 0.129
density = 19.3
/datum/reagent/iron
name = "Iron"
id = IRON
description = "Pure iron in powdered form, a metal."
reagent_state = REAGENT_STATE_SOLID
color = "#666666" //rgb: 102, 102, 102
specheatcap = 0.45
density = 7.874
/datum/reagent/phazon
name = "Phazon Salt"
id = PHAZON
description = "The properties of this rare metal are not well-known."
reagent_state = REAGENT_STATE_SOLID
color = "#5E02F8" //rgb: 94, 2, 248
dupeable = FALSE
/datum/reagent/phazon/New()
..()
density = rand(1,250)/rand(1,35)
specheatcap = rand(1,250)/rand(1,35)
/datum/reagent/phazon/on_mob_life(var/mob/living/M)
if(..())
return 1
M.apply_radiation(5, RAD_INTERNAL)
if(prob(20))
M.advanced_mutate()
/datum/reagent/phazon/reaction_animal(var/mob/living/M)
on_mob_life(M)
/datum/reagent/plasma
name = "Plasma"
id = PLASMA
description = "Plasma in its liquid form."
reagent_state = REAGENT_STATE_LIQUID
color = "#500064" //rgb: 80, 0, 100
/datum/reagent/plasma/New()
..()
specheatcap = rand(1,150)/rand(1,25)
density = rand(1,150)/rand(1,25)
/datum/reagent/plasma/on_mob_life(var/mob/living/M)
if(..())
return 1
var/mob/living/carbon/human/H = M
if(istype(H) && H.species.flags & PLASMA_IMMUNE)
return 1
else
M.adjustToxLoss(3 * REM)
if(holder.has_reagent("inaprovaline"))
holder.remove_reagent("inaprovaline", 2 * REM)
/datum/reagent/plasticide
name = "Plasticide"
id = PLASTICIDE
description = "Liquid plastic, do not eat."
reagent_state = REAGENT_STATE_LIQUID
color = "#CF3600" //rgb: 207, 54, 0
custom_metabolism = 0.01
density = 0.4
specheatcap = 1.67
/datum/reagent/plasticide/on_mob_life(var/mob/living/M)
if(..())
return 1
//Toxins are really weak, but without being treated, last very long
M.adjustToxLoss(0.2)
/datum/reagent/silicate
name = "Silicate"
id = SILICATE
description = "A compound that can be used to repair and reinforce glass."
reagent_state = REAGENT_STATE_LIQUID
color = "#C7FFFF" //rgb: 199, 255, 255
overdose_am = 0
density = 0.69
specheatcap = 0.59
/datum/reagent/silver
name = "Silver Powder"
id = SILVER
description = "A soft, white, lustrous transition metal, it has the highest electrical conductivity of any element and the highest thermal conductivity of any metal."
reagent_state = REAGENT_STATE_SOLID
color = "#D0D0D0" //rgb: 208, 208, 208
specheatcap = 0.24
density = 10.49
/datum/reagent/uranium
name ="Uranium salt"
id = URANIUM
description = "A silvery-white metallic chemical element in the actinide series, weakly radioactive."
reagent_state = REAGENT_STATE_SOLID
color = "#B8B8C0" //rgb: 184, 184, 192
density = 19.05
specheatcap = 124
/datum/reagent/uranium/on_mob_life(var/mob/living/M)
if(..())
return 1
M.apply_radiation(1, RAD_INTERNAL)
/datum/reagent/uranium/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
if(volume >= 3)
if(!(locate(/obj/effect/decal/cleanable/greenglow) in T))
new /obj/effect/decal/cleanable/greenglow(T)
/datum/reagent/uranium/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
if(!holder)
return
if(!T)
T = holder.my_atom //Try to find the mob through the holder
if(!istype(T)) //Still can't find it, abort
return
var/amount = T.reagents.get_reagent_amount(id)
if(amount >= 1)
if(prob(15))
T.mutate(GENE_BIOLUMINESCENCE)
T.reagents.remove_reagent(id, 1)
else if(amount > 0)
T.reagents.remove_reagent(id, amount)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,491 @@
//The unsorted chems... Stuff that just didn't fit any of the other categories
//A chemical for curing petrification. It only works after you've been fully petrified
//Items on corpses will survive the process, but the corpses itself will be damaged and uncloneable after unstoning
/datum/reagent/apetrine
name = "Apetrine"
id = APETRINE
description = "Apetrine is a chemical used to partially reverse the post-mortem effects of petritricin."
color = "#240080" //rgb: 36, 0, 128
dupeable = FALSE
density = 7.94
specheatcap = 1.39
/datum/reagent/apetrine/reaction_obj(var/obj/O, var/volume)
if(..())
return 1
if(istype(O, /obj/structure/closet/statue))
var/obj/structure/closet/statue/statue = O
statue.dissolve()
if(istype(O, /obj/structure/mannequin))
var/obj/structure/mannequin/statue = O
statue.dissolve()
/datum/reagent/apetrine/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
if(istype(M, /mob/living/simple_animal/hostile/mannequin))
var/mob/living/simple_animal/hostile/mannequin/statue = M
statue.dissolve()
/datum/reagent/anthracene
name = "Anthracene"
id = ANTHRACENE
description = "Anthracene is a fluorophore which emits a weak green glow."
reagent_state = REAGENT_STATE_LIQUID
color = "#00ff00" //rgb: 0, 255, 0
var/light_intensity = 4
var/initial_color = null
density = 3.46
specheatcap = 512.3
flags = CHEMFLAG_PIGMENT
paint_light = PAINTLIGHT_LIMITED
/datum/reagent/anthracene/on_mob_life(var/mob/living/M)
if(..())
return 1
if(!tick)
initial_color = M.light_color
M.light_color = LIGHT_COLOR_GREEN
M.set_light(light_intensity)
/datum/reagent/anthracene/reagent_deleted()
if(..())
return 1
if(!holder)
return
var/atom/A = holder.my_atom
A.light_color = initial_color
A.set_light(0)
/datum/reagent/anthracene/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
if(method == TOUCH)
var/init_color = M.light_color
M.light_color = LIGHT_COLOR_GREEN
M.set_light(light_intensity)
spawn(volume * 10)
M.light_color = init_color
M.set_light(0)
/datum/reagent/anthracene/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
var/init_color = T.light_color
T.light_color = LIGHT_COLOR_GREEN
T.set_light(light_intensity)
spawn(volume * 10)
T.light_color = init_color
T.set_light(0)
/datum/reagent/anthracene/reaction_obj(var/obj/O, var/volume)
if(..())
return 1
var/init_color = O.light_color
O.light_color = LIGHT_COLOR_GREEN
O.set_light(light_intensity)
spawn(volume * 10)
O.light_color = init_color
O.set_light(0)
/datum/reagent/bumcivilian
name = "Bumcivilian"
id = BUMCIVILIAN
description = "The most basic form of iron, also known as 'brown iron'. It has the unusual property of absorbing sound particles when it is produced by reactions with sulfuric acid."
color = "#786228" //120, 98, 40
specheatcap = 0.45
density = 7.874
var/mute_duration = 300 //30 seconds
/datum/reagent/calciumcarbonate
name = "Calcium Carbonate"
id = CALCIUMCARBONATE
description = "An odorless, fine, white micro-crystalline powder. Usually obtained by grinding limestone, or egg shells."
color = "#FFFFFF"
density = 2.73
specheatcap = 83.43
/datum/reagent/calciumhydroxide
name = "Calcium Hydroxide"
id = CALCIUMHYDROXIDE
description = "Hydrated lime, non-toxic."
color = "#FFFFFF"
density = 2.211
specheatcap = 87.45
/datum/reagent/calciumoxide
name = "Calcium Oxide"
id = CALCIUMOXIDE
description = "Quicklime. Reacts strongly with water forming calcium hydrate and generating heat in the process"
color = "#FFFFFF"
density = 3.34
specheatcap = 42.09
/datum/reagent/calciumoxide/on_mob_life(var/mob/living/M)
if(..())
return 1
if(ishuman(M))
var/mob/living/carbon/human/H = M
if((H.species && H.species.flags & NO_BREATHE) || (M_NO_BREATH in H.mutations))
return
M.adjustFireLoss(0.5 * REM)
if(prob(10))
M.visible_message("<span class='warning'>[M] [pick("dry heaves!", "coughs!", "splutters!")]</span>")
/datum/reagent/colorful_reagent
name = "Colorful Reagent"
id = COLORFUL_REAGENT
description = "Thoroughly sample the rainbow."
reagent_state = REAGENT_STATE_LIQUID
flags = CHEMFLAG_PIGMENT
color = "#C8A5DC"
var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700")
/datum/reagent/colorful_reagent/special_behaviour()
color = pick(random_color_list)
/datum/reagent/colorful_reagent/on_mob_life(mob/living/M)
if(M && isliving(M))
M.color = pick(random_color_list)
..()
/datum/reagent/colorful_reagent/reaction_mob(mob/living/M, reac_volume)
if(M && isliving(M))
M.color = pick(random_color_list)
..()
/datum/reagent/colorful_reagent/reaction_obj(obj/O, reac_volume)
if(O)
O.color = pick(random_color_list)
..()
/datum/reagent/colorful_reagent/reaction_turf(turf/T, reac_volume, var/list/splashplosion=list())
if(..())
return TRUE
var/picked_color = pick(random_color_list)
var/turf/U = get_turf(holder.my_atom)
if(isfloor(T))
T.apply_paint_overlay(picked_color, 255)
if (splashplosion.len > 0)
for (var/direction in cardinal)
var/turf/R = get_step(T,direction)
if (isfloor(R) && !(R in splashplosion) && T.Adjacent(R))
if (get_dir(R,U) & get_dir(R,T))
R.apply_paint_stroke(picked_color, 255, get_dir_cardinal(R,T), "border_splatter")
else if (iswall(R) && !(R in splashplosion))
if (get_dir(R,U) & get_dir(R,T))
R.apply_paint_stroke(picked_color, 255, get_dir_cardinal(R,T), "wall_splatter")
else if(iswall(T))
if (T == U)
T.apply_paint_overlay(picked_color, 255, list(), id == NANOPAINT)//if we're on top somehow, paint the whole tile
else if (splashplosion.len > 0)
for (var/direction in cardinal)
var/turf/R = get_step(T,direction)
if (isfloor(R) && (R in splashplosion))
if (get_dir(T,U) & direction)
T.apply_paint_stroke(picked_color, 255, get_dir_cardinal(T,R), "wall_splatter")
else
T.apply_paint_stroke(picked_color, 255, get_dir_cardinal(T,U), "wall_splatter")
/datum/reagent/dsyrup
name = "Delightful Mix"
id = DSYRUP
description = "This syrupy stuff is everyone's favorite tricord additive."
reagent_state = REAGENT_STATE_LIQUID
color = "#571212" //like a dark red
density = 1.00 //basically water
specheatcap = 4.184
/datum/reagent/ethylcyanoacrylate
name = "Ethyl Cyanoacrylate"
id = ETHYLCYANOACRYLATE
description = "An esther of low viscosity used as an intermediate component of glue production."
color = "#DDDDDD"
alpha = 50
/datum/reagent/glycerol
name = "Glycerol"
id = GLYCEROL
description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity."
reagent_state = REAGENT_STATE_LIQUID
color = "#808080" //rgb: 128, 128, 128
density = 4.84
specheatcap = 1.38
//Just for fun
var/list/procizine_calls = list()
var/list/procizine_args = list()
var/procizine_name = ""
var/procizine_overdose = 0
var/procizine_metabolism = 0
var/procizine_color = "#C8A5DC"
var/procizine_addictive = FALSE
var/procizine_tolerance = 0
/client/proc/set_procizine_call()
set name = "Set Procizine Call"
set category = "Fun"
if(!check_rights(R_DEBUG))
return
var/ourproc = input("Proc path to call on target reaction, eg: /proc/fake_blood (To make effective, add the reagent procizine to the atom)","Path:", null) as text|null
if(!ourproc)
return
procizine_calls["life"] = ourproc
var/argnum = input("Number of arguments","Number:",0) as num|null
var/list/ourargs = list()
ourargs.len = !argnum && (argnum!=0) ? 0 : argnum // Expand to right length
var/i
for(i = 1, i < argnum + 1, i++) // Lists indexed from 1 forwards in byond
ourargs[i] = variable_set(src)
procizine_args["life"] = ourargs.Copy()
var/static/list/other_call_types = list("plant","mob","object","turf","mob dropper","object dropper","removal","overdose","withdrawal")
var/goahead = alert("Do you wish to customise this further? (The previous input will only be used for mob life)", "Advanced procizine calls", "Yes", "No") == "Yes"
for(var/calltype in other_call_types)
if(goahead)
ourproc = input("Proc path to call on [calltype] reaction, eg: /proc/fake_blood (To make effective, add the reagent procizine to the atom)","Path:", null) as text|null
argnum = input("Number of arguments","Number:",0) as num|null
ourargs.len = !argnum && (argnum!=0) ? 0 : argnum // Expand to right length
for(i = 1, i < argnum + 1, i++) // Lists indexed from 1 forwards in byond
ourargs[i] = variable_set(src)
procizine_calls[calltype] = ourproc
procizine_args[calltype] = ourargs.Copy()
/client/proc/set_procizine_properties()
set name = "Set Procizine Properties"
set category = "Fun"
if(!check_rights(R_DEBUG))
return
procizine_name = input(src, "Reagent name","Procizine attributes", procizine_name) as text|null
procizine_overdose = input(src, "Overdose threshold","Procizine attributes", procizine_overdose) as num|null
procizine_metabolism = input(src, "Custom metabolism","Procizine attributes", procizine_metabolism) as num|null
procizine_addictive = alert(src, "Is addictive?","Procizine attributes", "Yes", "No") == "Yes"
procizine_tolerance = input(src, "Tolerance increase per metabolisation","Procizine attributes", procizine_metabolism) as num|null
procizine_color = input(src, "Reagent color", "Procizine attributes") as color|null
/datum/reagent/procizine
name = "Procizine"
id = PROCIZINE
description = "It is a mystery!"
reagent_state = REAGENT_STATE_LIQUID
color = "#C8A5DC" //rgb: 200, 165, 220
density = ARBITRARILY_LARGE_NUMBER
specheatcap = ARBITRARILY_LARGE_NUMBER
var/list/procnames
var/list/procargs
/datum/reagent/procizine/New()
..()
procnames = procizine_calls.Copy()
procargs = procizine_args.Copy()
name = procizine_name && procizine_name != "" ? procizine_name : initial(name)
overdose_am = procizine_overdose
custom_metabolism = procizine_metabolism || REAGENTS_METABOLISM
color = procizine_color || initial(color)
addictive = procizine_addictive
tolerance_increase = procizine_tolerance
/datum/reagent/procizine/proc/call_proc(var/atom/A, var/call_type)
if(procnames[call_type] && hascall(A, procnames[call_type]))
call(A,procnames[call_type])(arglist(procargs[call_type]))
/datum/reagent/procizine/on_mob_life(var/mob/living/carbon/M)
if(..())
return 1
call_proc(M,"life")
/datum/reagent/procizine/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
call_proc(T,"plant")
/datum/reagent/procizine/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
call_proc(M,"mob")
/datum/reagent/procizine/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
call_proc(T,"turf")
/datum/reagent/procizine/reaction_obj(var/obj/O, var/volume)
if(..())
return 1
call_proc(O,"object")
/datum/reagent/procizine/reaction_dropper_mob(var/mob/living/M)
. = ..()
call_proc(M,"mob dropper")
/datum/reagent/procizine/reaction_dropper_obj(var/obj/O)
. = ..()
call_proc(O,"object dropper")
/datum/reagent/procizine/reagent_deleted()
call_proc(holder.my_atom,"removal")
/datum/reagent/procizine/on_overdose(mob/living/M)
call_proc(holder.my_atom,"overdose")
/datum/reagent/procizine/on_withdrawal(mob/living/M)
if(..())
return 1
call_proc(holder.my_atom,"withdrawal")
/datum/reagent/punctualite
name = "Punctualite"
id = PUNCTUALITE
description = "Nicknamed mad chemist's alarm clock. Explodes on the turn of the hour when within a living creature."
reagent_state = REAGENT_STATE_LIQUID
color = "#8d8791" //rgb: 200, 165, 220
custom_metabolism = 0 //Wouldn't be much fun if it all got metabolized beforehand
var/currentHour = 0 //The hour it was introduced into the system so it doesn't blow right away
/datum/reagent/punctualite/on_mob_life(var/mob/living/M)
if(..())
return 1
if(prob(5) && prob(5)) //0.25% chance per tick
var/mob/living/carbon/human/earProtMan = null
if(ishuman(M))
earProtMan = M
if(!M.is_deaf() && !earProtMan || !earProtMan.earprot())
if(prob(50))
to_chat(M, "<span class='notice'>You hear a ticking sound</span>")
else
to_chat(M, "<span class='notice'>You hear a tocking sound</span>")
if((floor(world.time / (1 HOURS)) + 1) > currentHour)
if(!currentHour)
currentHour = floor(world.time / (1 HOURS)) + 1
else
punctualiteExplode(M)
currentHour = floor(world.time / (1 HOURS)) + 1
/datum/reagent/punctualite/proc/punctualiteExplode(var/mob/living/H)
var/bigBoom = 0
var/medBoom = 0
var/litBoom = 0
bigBoom = min(floor(volume/150), 2) //Max breach is 2, twice a welder tank
medBoom = min(floor(volume/50), 4)
litBoom = min(floor(volume/20), 7)
explosion(get_turf(H), bigBoom, medBoom, litBoom)
/datum/reagent/saltwater
name = "Salt Water"
id = SALTWATER
description = "It's water mixed with salt. It's probably not healthy to drink."
reagent_state = REAGENT_STATE_LIQUID
color = "#FFFFFF" //rgb: 255, 255, 255
density = 1.122
specheatcap = 6.9036
/datum/reagent/saltwater/on_mob_life(var/mob/living/M)
if(..())
return 1
if(ishuman(M) && prob(20))
var/mob/living/carbon/human/H = M
H.vomit()
M.adjustToxLoss(2 * REM)
/datum/reagent/saltwater/saline
name = "Saline"
id = SALINE
description = "A solution composed of salt, water, and ammonia. Used in pickling and preservation"
reagent_state = REAGENT_STATE_LIQUID
color = "#DEF7F5" //rgb: 192, 227, 233
alpha = 64
density = 0.622
specheatcap = 99.27
/datum/reagent/self_replicating
id = EXPLICITLY_INVALID_REAGENT_ID
var/whitelisted_ids = list()
/datum/reagent/self_replicating/post_transfer(var/datum/reagents/donor)
..()
holder.convert_all_to_id(id, whitelisted_ids)
/datum/reagent/self_replicating/on_introduced(var/data)
..()
holder.convert_all_to_id(id, whitelisted_ids)
/datum/reagent/self_replicating/midazoline
name = "Midazoline"
id = MIDAZOLINE
description = "Chrysopoeia, the artificial production of gold, was one of the defining ambitions of ancient alchemy. Turns out, all it took was a little plasma. Converts all other reagents into Midazoline, except for Mercury, which will convert Midazoline into itself."
reagent_state = REAGENT_STATE_SOLID
color = "#F7C430" //rgb: 247, 196, 48
density = 19.3
specheatcap = 0.129
whitelisted_ids = list(MERCURY)
/datum/reagent/sodium_silicate
name = "Sodium Silicate"
id = SODIUMSILICATE
description = "A white powder, commonly used in cements."
reagent_state = REAGENT_STATE_SOLID
color = "#E5E5E5"
density = 2.61
specheatcap = 111.8
/datum/reagent/temp_hearer/
id = EXPLICITLY_INVALID_REAGENT_ID
data = list("stored_phrase" = null)
/datum/reagent/temp_hearer/on_introduced(var/data)
. = ..()
var/obj/item/weapon/reagent_containers/RC = holder.my_atom
if(!istype(RC))
return
if(!RC.virtualhearer)
RC.addHear(/mob/virtualhearer/one_time)
/datum/reagent/temp_hearer/proc/parent_heard(var/datum/speech/speech, var/rendered_speech="")
if(!data["stored_phrase"])
set_phrase(sanitize(speech.message))
var/atom/container = holder.my_atom
if(container.is_open_container() || ismob(container))
container.visible_message("<span class='notice'>[bicon(container)] The solution fizzles for a moment.</span>", "You hear something fizzling for a moment.", "<span class='notice'>[bicon(container)] \The [container] replies something, but you can't hear them.</span>")
if(!(container.flags & SILENTCONTAINER))
playsound(container, 'sound/effects/bubbles.ogg', 20, -3)
/datum/reagent/temp_hearer/proc/set_phrase(var/phrase)
data["stored_phrase"] = phrase
/datum/reagent/temp_hearer/locutogen
name = "Locutogen"
id = LOCUTOGEN
description = "Sound-activated solution. Permanently stores the first soundwaves it 'hears' into a long polymer chain, which reacts into a crude form of speech into the ears of a live host. Tastes sweet."
reagent_state = REAGENT_STATE_LIQUID
custom_metabolism = 0.01
color = "#8E18A9" //rgb: 142, 24, 169
density = 1.58
specheatcap = 1.44
/datum/reagent/temp_hearer/locutogen/on_mob_life(var/mob/living/M)
if(..())
return 1
if(!M.isUnconscious() && data["stored_phrase"])
to_chat(M, "You hear a voice in your head saying: <span class='bold'>'[data["stored_phrase"]]'</span>.")
M.reagents.del_reagent(LOCUTOGEN)

View File

@@ -207,7 +207,6 @@
data["alpha"] = (data["alpha"] + target_alpha) / 2
alpha = data["alpha"]
/datum/reagent/flaxoil/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
@@ -338,7 +337,6 @@
//----------------------------------------------------------------------------------------------------
#define PAINT_CLEANER_THRESHOLD 0.7 // How much of the reagent should be water or some cleaner to clean paint off a canvas or brush
#define PAINT_CLEANER_AGENT_MULTIPLIER 2 // How effective cleaning products are, compared to water (aka they count as if there was n times water instead)
/proc/get_reagent_paint_cleaning_percent(obj/container)

View File

@@ -0,0 +1,348 @@
//Plant-related chemicals
/datum/reagent/diethylamine
name = "Diethylamine"
id = DIETHYLAMINE
description = "A secondary amine, mildly corrosive."
reagent_state = REAGENT_STATE_LIQUID
color = "#604030" //rgb: 96, 64, 48
density = 0.65
specheatcap = 35.37
/datum/reagent/diethylamine/ammoniumnitrate
name = "Ammonium Nitrate"
id = AMMONIUMNITRATE
/datum/reagent/diethylamine/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
if(!holder)
return
if(!T)
T = holder.my_atom //Try to find the mob through the holder
if(!istype(T)) //Still can't find it, abort
return
T.reagents.remove_reagent(id, 0.1)
if(T.reagents.get_reagent_amount(id) > 0)
T.add_nutrientlevel(1)
T.add_planthealth(1)
if(prob(10))
T.add_pestlevel(-1)
if(T.seed && !T.dead)
if(prob(20))
T.affect_growth(1)
if(!T.seed.immutable)
var/chance
chance = unmix(T.seed.lifespan, 15, 125)*20
if(prob(chance))
T.check_for_divergence(1)
T.seed.lifespan ++
chance = unmix(T.seed.lifespan, 15, 125)*20
if(prob(chance))
T.check_for_divergence(1)
T.seed.endurance++
/datum/reagent/fertilizer
name = "Fertilizer"
id = FERTILIZER
description = "A chemical mix good for growing plants with."
reagent_state = REAGENT_STATE_LIQUID
color = "#664330" // rgb: 102, 67, 48
density = 5.4
specheatcap = 15
/datum/reagent/fertilizer/eznutrient
name = "EZ Nutrient"
id = EZNUTRIENT
color = "#A4AF1C" // rgb: 164, 175, 28
density = 1.32
specheatcap = 0.60
/datum/reagent/fertilizer/eznutrient/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
T.add_nutrientlevel(10)
/datum/reagent/fertilizer/left4zed
name = "Left-4-Zed"
id = LEFT4ZED
description = "A cocktail of mutagenic compounds, which cause plant life to become highly unstable."
color = "#5B406C" // rgb: 91, 64, 108
density = 1.32
specheatcap = 0.60
/datum/reagent/fertilizer/left4zed/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
if(!holder)
return
if(!T)
T = holder.my_atom //Try to find the mob through the holder
if(!istype(T)) //Still can't find it, abort
return
T.add_nutrientlevel(10)
if(T.reagents.get_reagent_amount(id) >= 1)
if(prob(1))
T.mutate(GENE_PHYTOCHEMISTRY)
if(prob(1))
T.mutate(GENE_MORPHOLOGY)
if(prob(1))
T.mutate(GENE_BIOLUMINESCENCE)
if(prob(1))
T.mutate(GENE_ECOLOGY)
if(prob(1))
T.mutate(GENE_ECOPHYSIOLOGY)
if(prob(1))
T.mutate(GENE_METABOLISM)
if(prob(1))
T.mutate(GENE_DEVELOPMENT)
if(prob(1))
T.mutate(GENE_XENOPHYSIOLOGY)
if(prob(5))
T.reagents.remove_reagent(id, 1)
/datum/reagent/fertilizer/robustharvest
name = "Robust Harvest"
id = ROBUSTHARVEST
description = "Plant-enhancing hormones, good for increasing potency."
color = "#3E901C" // rgb: 62, 144, 28
density = 1.32
specheatcap = 0.60
/datum/reagent/fertilizer/robustharvest/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
if(!holder)
return
if(!T)
T = holder.my_atom //Try to find the mob through the holder
if(!istype(T)) //Still can't find it, abort
return
T.reagents.remove_reagent(id, 0.1)
if(T.reagents.get_reagent_amount(id) > 0)
T.add_nutrientlevel(1)
if(prob(3))
T.add_weedlevel(10)
if(T.seed && !T.dead)
if(prob(3))
T.add_pestlevel(10)
var/chance = unmix(T.seed.potency, 15, 150)*35
if(!T.seed.immutable && prob(chance))
T.check_for_divergence(1)
T.seed.potency++
/datum/reagent/toxin/plantbgone
name = "Plant-B-Gone"
id = PLANTBGONE
description = "A harmful toxic mixture to kill plantlife. Do not ingest!"
reagent_state = REAGENT_STATE_LIQUID
color = "#49002E" //rgb: 73, 0, 46
density = 1.08
specheatcap = 4.18
//Clear off wallrot fungi
/datum/reagent/toxin/plantbgone/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
if(istype(T, /turf/simulated/wall))
var/turf/simulated/wall/W = T
if(W.rotting)
W.remove_rot()
W.visible_message("<span class='notice'>The fungi are burned away by the solution!</span>")
/datum/reagent/toxin/plantbgone/reaction_obj(var/obj/O, var/volume)
if(..())
return 1
if(istype(O, /obj/effect/alien/weeds/))
var/obj/effect/alien/weeds/alien_weeds = O
alien_weeds.health -= rand(15, 35) //Kills alien weeds pretty fast
alien_weeds.healthcheck()
else if(istype(O,/obj/effect/glowshroom)) //even a small amount is enough to kill it
qdel(O)
else if(istype(O,/obj/effect/plantsegment)) //Kills kudzu too.
var/obj/effect/plantsegment/K = O
var/dmg = 200
if(K.seed)
dmg -= 20*K.seed.toxin_affinity
for(var/obj/effect/plantsegment/KV in orange(O,1))
KV.health -= dmg*0.4
KV.try_break()
SSplant.add_plant(KV)
K.health -= dmg
K.try_break()
SSplant.add_plant(K)
else if(istype(O,/obj/machinery/portable_atmospherics/hydroponics))
var/obj/machinery/portable_atmospherics/hydroponics/tray = O
tray.die()
else if(istype(O, /obj/structure/cable/powercreeper))
var/obj/structure/cable/powercreeper/PC = O
if(prob(1*(PC.powernet.avail/1000))) //The less there is, the hardier it gets
PC.die()
/datum/reagent/toxin/plantbgone/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
if(iscarbon(M))
var/mob/living/carbon/C = M
if(!C.wear_mask) //If not wearing a mask
C.adjustToxLoss(REM) //4 toxic damage per application, doubled for some reason
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.dna)
if(H.species.flags & IS_PLANT) //Plantmen take a LOT of damage //aren't they toxin-proof anyways?
H.adjustToxLoss(10 * REM)
/datum/reagent/toxin/plantbgone/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
T.die()
/datum/reagent/toxin/insecticide
name = "Insecticide"
id = INSECTICIDE
description = "A broad pesticide. Do not ingest!"
reagent_state = REAGENT_STATE_LIQUID
color = "#49002E" //rgb: 73, 0, 46
density = 1.08
specheatcap = 4.18
/datum/reagent/toxin/insecticide/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
if(iscarbon(M))
var/mob/living/carbon/C = M
if(!C.wear_mask) //If not wearing a mask
C.adjustToxLoss(REM) //4 toxic damage per application, doubled for some reason
if(isinsectoid(C) || istype(C, /mob/living/carbon/monkey/roach)) //Insecticide being poisonous to bugmen, who'd've thunk
M.adjustToxLoss(10 * REM)
/datum/reagent/toxin/insecticide/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
T.add_pestlevel(-8)
//Plant-specific reagents
/datum/reagent/kelotane/tannic_acid
name = "Tannic Acid"
id = TANNIC_ACID
description = "Tannic acid is a natural burn remedy."
reagent_state = REAGENT_STATE_LIQUID
color = "#150A03" //rgb: 21, 10, 3
/datum/reagent/kelotane/tannic_acid/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
/datum/reagent/dermaline/kathalai
name = "Kathalai"
id = KATHALAI
description = "Kathalai is an exceptional natural burn remedy, it performs twice as well as tannic acid."
color = "#32BD08" //rgb: 50, 189, 8
/datum/reagent/bicaridine/opium
name = "Opium"
id = OPIUM
description = "Opium is an exceptional natural analgesic."
pain_resistance = 80
color = "#AE9260" //rgb: 174, 146, 96
/datum/reagent/bicaridine/opium/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
/datum/reagent/space_drugs/mescaline
name = "Mescaline"
id = MESCALINE
description = "Known to cause mild hallucinations, mescaline is often used recreationally."
color = "#B8CD93" //rgb: 184, 205, 147
/datum/reagent/synaptizine/cytisine
name = "Cytisine"
id = CYTISINE
description = "Cytisine is an alkaloid which mimics the effects of nicotine."
color = "#A49B50" //rgb: 164, 155, 80
/datum/reagent/hyperzine/cocaine
name = "Cocaine"
id = COCAINE
description = "Cocaine is a powerful nervous system stimulant."
color = "#FFFFFF" //rgb: 255, 255, 255
/datum/reagent/hyperzine/cocaine/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
/datum/reagent/imidazoline/zeaxanthin
name = "Zeaxanthin"
id = ZEAXANTHIN
description = "Zeaxanthin is a natural pigment which purportedly supports eye health."
color = "#CC4303" //rgb: 204, 67, 3
flags = CHEMFLAG_PIGMENT
/datum/reagent/stoxin/valerenic_acid
name = "Valerenic Acid"
id = VALERENIC_ACID
description = "An herbal sedative used to treat insomnia."
color = "#EAB160" //rgb: 234, 177, 96
/datum/reagent/sacid/formic_acid
name = "Formic Acid"
id = FORMIC_ACID
description = "A weak natural acid which causes a burning sensation upon contact."
color = "#9B3D00" //rgb: 155, 61, 0
/datum/reagent/pacid/phenol
name = "Phenol"
id = PHENOL
description = "Phenol is a corrosive acid which can cause chemical burns."
color = "#C71839" //rgb: 199, 24, 57
/datum/reagent/ethanol/drink/neurotoxin/curare
name = "Curare"
id = CURARE
description = "An alkaloid plant extract which causes weakness of the skeletal muscles."
color = "#94DC76" //rgb: 148, 220, 118
/datum/reagent/toxin/solanine
name = "Solanine"
id = SOLANINE
description = "A glycoalkaloid poison."
color = "#6C8347" //rgb: 108, 131, 71
/datum/reagent/cryptobiolin/physostigmine
name = "Physostigmine"
id = PHYSOSTIGMINE
description = "Physostigmine causes confusion and dizzyness."
color = "#0098D7" //rgb: 0, 152, 215
/datum/reagent/impedrezene/hyoscyamine
name = "Hyoscyamine"
id = HYOSCYAMINE
description = "Hyoscyamine is a tropane alkaloid which can disrupt the central nervous system."
color = "#BBD0C9" //rgb: 187, 208, 201
/datum/reagent/lexorin/coriamyrtin
name = "Coriamyrtin"
id = CORIAMYRTIN
description = "Coriamyrtin is a toxin which causes respiratory problems."
color = "#FB6892" //rgb: 251, 104, 146
/datum/reagent/dexalin/thymol
name = "Thymol"
id = THYMOL
description = "Thymol is used in the treatment of respiratory problems."
color = "#790D27" //rgb: 121, 13, 39
/datum/reagent/dexalin/thymol/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
/datum/reagent/synthocarisol/phytocarisol
name = "Phytocarisol"
id = PHYTOCARISOL
description = "A plant based alternative to carisol, a medicine made from rhino horn dust."
color = "#34D3B6" //rgb: 52, 211, 182
/datum/reagent/heartbreaker/defalexorin
name = "Defalexorin"
id = DEFALEXORIN
description = "Defalexorin is used for getting a mild high in low amounts."
color = "#000000" //rgb: 0, 0, 0
/datum/reagent/alkycosine/phytosine
name = "Phytosine"
id = PHYTOSINE
description = "Neurological medication made from mutated herbs."
color = "#9000ff" //rgb: 144, 0 255
//End of plant-specific reagents

View File

@@ -0,0 +1,101 @@
//Reagents whose primary purpose is to cause a specific reaction or are only useful to cause a reaction
/datum/reagent/aminomicin
name = "Aminomicin"
id = AMINOMICIN
description = "An experimental and unstable chemical, said to be able to create life. Potential reaction detected if mixed with nutriment."
reagent_state = REAGENT_STATE_LIQUID
color = "#634848" //rgb: 99, 72, 72
density = 13.49 //our ingredients are pretty dense
specheatcap = 208.4
custom_metabolism = 0.01 //oh shit what are you doin
/datum/reagent/aminomician
name = "Aminomician"
id = AMINOMICIAN
description = "An experimental and unstable chemical, said to be able to create companionship. Potential reaction detected if mixed with nutriment."
reagent_state = REAGENT_STATE_LIQUID
color = "#634848" //rgb: 99, 72, 72
density = 13.49 //our ingredients are pretty dense
specheatcap = 208.4
custom_metabolism = 0.01 //oh shit what are you doin
/datum/reagent/aminocyprinidol
name = "Aminocyprinidol"
id = AMINOCYPRINIDOL
description = "An extremely dangerous, flesh-replicating material, mutated by exposure to God-knows-what. Do not mix with nutriment under any circumstances."
reagent_state = REAGENT_STATE_LIQUID
color = "#cb42f4" //rgb: 203, 66, 244
density = 111.75 //our ingredients are extremely dense, especially carppheromones
specheatcap = ARBITRARILY_LARGE_NUMBER //Is partly made out of leporazine, so you're not heating this up.
custom_metabolism = 0.01 //oh shit what are you doin
/datum/reagent/aminoblatella
name = "Aminoblatella"
id = AMINOBLATELLA
description = "Developed in the darkest halls of maintenance by the Elder Greytide council, it is said to be able to create untold gunk. Potential reaction detected if mixed with equal parts nutriment or ten parts mutagen."
reagent_state = REAGENT_STATE_LIQUID
color = "#634848" //rgb: 99, 72, 72
density = 15.49 //our ingredients are pretty dense
specheatcap = 208.4
custom_metabolism = 0.01 //oh shit what are you doin
//Foam precursor
/datum/reagent/fluorosurfactant
name = "Fluorosurfactant"
id = FLUOROSURFACTANT
description = "A perfluoronated sulfonic acid that forms a foam when mixed with water."
reagent_state = REAGENT_STATE_LIQUID
color = "#9E6B38" //rgb: 158, 107, 56
density = 1.95
specheatcap = 0.81
//Metal foaming agent
//This is lithium hydride. Add other recipies (e.g. LiH + H2O -> LiOH + H2) eventually
/datum/reagent/foaming_agent
name = "Foaming Agent"
id = FOAMING_AGENT
description = "A agent that yields metallic foam when mixed with light metal and a strong acid."
reagent_state = REAGENT_STATE_SOLID
color = "#664B63" //rgb: 102, 75, 99
density = 0.62
specheatcap = 49.23
/datum/reagent/nitroglycerin
name = "Nitroglycerin"
id = NITROGLYCERIN
description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol."
reagent_state = REAGENT_STATE_LIQUID
color = "#808080" //rgb: 128, 128, 128
density = 4.33
specheatcap = 2.64
/datum/reagent/nitroglycerin/on_mob_life(var/mob/living/M)
M.adjustToxLoss(2 * REM)
if(prob(80))
M.adjustOxyLoss(2 * REM)
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/datum/organ/internal/heart/E = H.internal_organs_by_name["heart"]
if(istype(E) && !E.robotic)
if(E.damage > 0)
E.damage = max(0, E.damage - 0.2)
if(prob(15))
H.custom_pain("You feel a throbbing pain in your head", 1)
M.adjustBrainLoss(2 * REM)
if(prob(50))
M.drowsyness = max(M.drowsyness, 4)
/datum/reagent/paismoke
name = "Smoke"
id = PAISMOKE
description = "A chemical smoke synthesized by personal AIs."
reagent_state = REAGENT_STATE_GAS
color = "#FFFFFF" //rgb: 255, 255, 255
//When inside a person, instantly decomposes into the ingredients for smoke
/datum/reagent/paismoke/on_mob_life(var/mob/living/M)
M.reagents.del_reagent(src.id)
M.reagents.add_reagent("potassium", 5)
M.reagents.add_reagent("sugar", 5)
M.reagents.add_reagent("phosphorus", 5)

View File

@@ -0,0 +1,274 @@
//Religious-based chemicals
/datum/reagent/holywater
name = "Holy Water"
id = HOLYWATER
description = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality."
reagent_state = REAGENT_STATE_LIQUID
color = "#8497A9" //rgb: 52, 59, 63
custom_metabolism = 2
specheatcap = 4.183
alpha = 128
/datum/reagent/holywater/on_mob_life(mob/living/M)
if(..())
return 1
M.immune_system.ApplyAntipathogenics(100, list(ANTIGEN_CULT), 2)
/datum/reagent/holywater/reaction_obj(var/obj/O, var/volume)
if(..())
return 1
if(volume >= 1)
O.bless()
/datum/reagent/holywater/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
if(volume >= 5)
T.bless()
/datum/reagent/holywater/reaction_animal(var/mob/living/simple_animal/M, var/method=TOUCH, var/volume)
..()
if(volume >= 5)
if(istype(M,/mob/living/simple_animal/construct) || istype(M,/mob/living/simple_animal/shade))
var/mob/living/simple_animal/C = M
C.purge = 3
C.adjustBruteLoss(5)
C.visible_message("<span class='danger'>The holy water erodes \the [src].</span>")
/datum/reagent/holywater/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
T.add_waterlevel(1)
/datum/reagent/holysalts
name = "Holy Salts"
id = HOLYSALTS
description = "Blessed salts have been used for centuries as a sacramental. Pouring it on the floor in large enough quantity will offer protection from sources of evil and mend boundaries."
reagent_state = REAGENT_STATE_SOLID
color = "#C1CCD7" //rgb: 80, 80, 84
density = 2.09
specheatcap = 1.65
/datum/reagent/holysalts/reaction_obj(var/obj/O, var/volume)
if(..())
return 1
if(volume >= 1)
O.bless()
/datum/reagent/holysalts/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
if(!T.has_dense_content() && volume >= 10 && !(locate(/obj/effect/decal/cleanable/salt/holy) in T))
if(!T.density)
T.bless()
new /obj/effect/decal/cleanable/salt/holy(T)
/datum/reagent/holysalts/on_mob_life(var/mob/living/M)
if(..())
return 1
var/list/borers = M.get_brain_worms()
if(borers)
for(var/mob/living/simple_animal/borer/B in borers)
B.health -= 1
to_chat(B, "<span class='warning'>Something in your host's bloodstream burns you!</span>")
/datum/reagent/holysalts/reaction_animal(var/mob/living/simple_animal/M, var/method=TOUCH, var/volume)
..()
if(volume >= 5)
if(istype(M,/mob/living/simple_animal/construct) || istype(M,/mob/living/simple_animal/shade))
var/mob/living/simple_animal/C = M
C.purge = 3
C.adjustBruteLoss(5)
C.visible_message("<span class='danger'>The holy salts erode \the [src].</span>")
/datum/reagent/holysalts/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
T.add_waterlevel(-5)
T.add_nutrientlevel(5)
T.add_toxinlevel(8)
T.add_weedlevel(-20)
T.add_pestlevel(-10)
if(T.seed && !T.dead)
T.add_planthealth(-2)
/datum/reagent/incense
id = EXPLICITLY_INVALID_REAGENT_ID
reagent_state = REAGENT_STATE_GAS
density = 3.214
specheatcap = 1.34
color = "#E0D3D3" //rgb: 224, 211, 211
data = list("source" = null)
/datum/reagent/incense/on_introduced(var/data)
..()
if(!src.data["source"]) //src is necessary because of this terrible var name, but consistency!
src.data["source"] = holder.my_atom
/datum/reagent/incense/proc/OnDisperse(var/turf/location)
/datum/reagent/incense/harebells//similar effects as holy water to cultists and vampires
name = "Holy Incense"
id = INCENSE_HAREBELLS
description = "An incense used in holy rituals. Can be used to impede the occult."
/datum/reagent/incense/poppies//similar effects as chill wax and paracetamol
name = "Opium Incense"
id = INCENSE_POPPIES
description = "A pleasing fragrance that soothes the nerves and removes pain."
pain_resistance = 60
custom_metabolism = 0.15
/datum/reagent/incense/poppies/on_mob_life(var/mob/living/M)
if(..())
return 1
if(iscarbon(M))
var/mob/living/carbon/C = M
if(C.pain_level < BASE_CARBON_PAIN_RESIST)
C.pain_shock_stage--
if(ishuman(M))
var/mob/living/carbon/human/H = M
H.druggy = max(H.druggy, 5)
H.Dizzy(2)
if(prob(5))
H.emote(pick("stare", "giggle"), null, null, TRUE)
if(prob(5))
to_chat(H, "<span class='notice'>[pick("You feel at peace with the world.","Everyone is nice, everything is awesome.","You feel high and ecstatic.")]</span>")
if(prob(2))
to_chat(H, "<span class='notice'>You doze off for a second.</span>")
H.sleeping += 1
/datum/reagent/incense/sunflowers//flavor text, does nothing
name = "Incense"
id = INCENSE_SUNFLOWERS
description = "While it smells really nice, incense is known to increase the risk of lung cancer."
/datum/reagent/incense/mustardplant //same as sunflower, no connection to mustard gas
name = "Mustardplant Incense"
id = INCENSE_MUSTARDPLANT
description = "A sweet scent with a tinge of clover." //i have no idea what these smell like, im going off of forum posts, if anyone does know please edit the desc
/datum/reagent/incense/moonflowers//Basically mindbreaker
name = "Hallucinogenic Incense"
id = INCENSE_MOONFLOWERS
description = "This fragrance is so unsettling that it makes you question reality."
custom_metabolism = 0.15
/datum/reagent/incense/moonflowers/on_mob_life(var/mob/living/M)
if(..())
return 1
if (M.hallucination < 22)
M.hallucination += 10
/datum/reagent/incense/novaflowers//Converts itself to hyperzine, but makes you hungry
name = "Hyperactivity Incense"
id = INCENSE_NOVAFLOWERS
description = "This fragrance helps you focus and pull into your energy reserves to move quickly."
nutriment_factor = -5 * REAGENTS_METABOLISM
custom_metabolism = 0.15
/datum/reagent/incense/novaflowers/on_mob_life(var/mob/living/M)
if(..())
return 1
if(holder.get_reagent_amount(HYPERZINE) < 2)
holder.add_reagent(HYPERZINE, 0.5)
/datum/reagent/incense/banana
name = "Banana Incense"
id = INCENSE_BANANA
description = "This fragrance helps you be more clumsy, so you can laugh at yourself."
/datum/reagent/incense/banana/on_mob_life(var/mob/living/M)
if(..())
return 1
if(prob(5))
to_chat(M,"<span class='warning'>[pick("You feel like giggling!", "You feel clumsy!", "You want to honk!")]</span>")
/datum/reagent/incense/cabbage
name = "Leafy Incense"
id = INCENSE_LEAFY
description = "This fragrance smells of fresh greens, delicious to most animals."
/datum/reagent/incense/cabbage/reagent_deleted()
if(..())
return 1
if(!holder)
return
var/mob/M = holder.my_atom
walk(M,0) //Cancel walk if it ran out
/datum/reagent/incense/cabbage/on_mob_life(var/mob/living/M)
if(..())
return 1
if(isanimal(M) || ismonkey(M))
if(istype(M,/mob/living/simple_animal/hostile))
var/mob/living/simple_animal/hostile/H = M
switch(H.stance)
if(HOSTILE_STANCE_ATTACK,HOSTILE_STANCE_ATTACKING)
if(istype(M,/mob/living/simple_animal/hostile/retaliate/goat))
var/mob/living/simple_animal/hostile/retaliate/goat/G = M
G.Calm()
else
return
M.start_walk_to(get_turf(data["source"]),1,6)
/datum/reagent/incense/booze
name = "Alcoholic Incense"
id = INCENSE_BOOZE
description = "This fragrance is dense with the odor of ethanol."
/datum/reagent/incense/booze/on_mob_life(var/mob/living/M)
if(..())
return 1
if(M.slurring < 22)
M.slurring += 10
if(M.eye_blurry < 22)
M.eye_blurry += 10
/datum/reagent/incense/vapor
name = "Airy Incense"
id = INCENSE_VAPOR
description = "It burns your nostrils a little. The incense smells... clean."
/datum/reagent/incense/vapor/OnDisperse(var/turf/location)
for(var/turf/simulated/T in view(2,location))
if(T.is_wet())
T.dry(TURF_WET_LUBE)
T.turf_animation('icons/effects/water.dmi',"dry_floor",0,0,TURF_LAYER)
/datum/reagent/incense/dense
name = "Dense Incense"
id = INCENSE_DENSE
description = "This isn't really a fragrance so much as tactical smoke."
custom_metabolism = 0.25
/datum/reagent/incense/dense/OnDisperse(var/turf/location)
var/datum/effect/system/smoke_spread/smoke = new /datum/effect/system/smoke_spread()
smoke.set_up(2, 0, location) //Make 2 drifting clouds of smoke, direction
smoke.start()
/datum/reagent/incense/dense/on_mob_life(var/mob/living/M)
if(..())
return 1
if(prob(5))
M.visible_message("<span class='warning'>[M] [pick("dry heaves!", "coughs!", "splutters!")]</span>")
/datum/reagent/incense/vale
name = "Sporty Incense"
id = INCENSE_CRAVE
description = "This has what you crave. Electrolytes."
sport = SPORTINESS_SPORTS_DRINK
custom_metabolism = 0.15
/datum/reagent/incense/cornoil
name = "Corn Oil Incense"
id = INCENSE_CORNOIL
description = "This fragrance reminds you of a nice home-cooked meal, and sometimes even feels like it fills you up."
/datum/reagent/incense/cornoil/on_mob_life(var/mob/living/M)
if(..())
return 1
if(prob(5))
to_chat(M,"<span class='warning'>[pick("You feel fuller.", "You no longer feel snackish.")]</span>")
M.reagents.add_reagent(NUTRIMENT, 2)

View File

@@ -0,0 +1,543 @@
//Chemicals designed for utility/tool use, like cleaners.
/datum/reagent/ammonia
name = "Ammonia"
id = AMMONIA
description = "A caustic substance commonly used in fertilizer or household cleaners."
reagent_state = REAGENT_STATE_GAS
color = "#404030" //rgb: 64, 64, 48
density = 0.51
specheatcap = 14.38
/datum/reagent/ammonia/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
T.add_nutrientlevel(10)
T.add_planthealth(1)
/datum/reagent/fuel
name = "Welding Fuel"
id = FUEL
description = "Required for welders. Flamable."
reagent_state = REAGENT_STATE_LIQUID
color = "#660000" //rgb: 102, 0, 0
density = 1.1
specheatcap = 0.68
glass_icon_state = "dr_gibb_glass"
glass_desc = "Unless you are an industrial tool, this is probably not safe for consumption."
/datum/reagent/fuel/reaction_obj(var/obj/O, var/volume)
var/datum/reagent/self = src
if(..())
return 1
if(isturf(O.loc))
var/turf/T = get_turf(O)
self.reaction_turf(T, volume)
/datum/reagent/fuel/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
if(!(locate(/obj/effect/decal/cleanable/liquid_fuel) in T))
new /obj/effect/decal/cleanable/liquid_fuel(T, volume)
/datum/reagent/fuel/on_mob_life(var/mob/living/M)
if(..())
return 1
M.adjustToxLoss(1)
/datum/reagent/glue
name = "Glue"
id = GLUE
description = "A powerful and fast-acting bonding agent. Also used as a medium to produce acrylic paint."
color = COLOR_GLUE //rgb: 255, 255, 204
var/glue_duration = 1 MINUTES
var/glue_state_to_set = GLUE_STATE_TEMP
var/turning_into_paint = FALSE
/datum/reagent/glue/reaction_turf(var/turf/T, var/volume)
if(..())
return TRUE
if (isfloor(T))
if (!(locate(/obj/effect/decal/cleanable/glue) in T))
new /obj/effect/decal/cleanable/glue(T)
/datum/reagent/glue/reaction_obj(var/obj/O, var/volume)
if(..())
return TRUE
var/glue_data = list(
"viruses" =null,
"blood_DNA" ="glue",
"blood_colour" = COLOR_GLUE,
"blood_type" ="glue",
"resistances" =null,
"trace_chem" =null,
"virus2" =list(),
"immunity" =null,
)
O.add_blood_from_data(glue_data)//visible glue
O.glue_act(glue_duration, glue_state_to_set)
/datum/reagent/glue/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return TRUE
if(iscarbon(M))
var/glue_data = list(
"viruses" =null,
"blood_DNA" ="glue",
"blood_colour" = COLOR_GLUE,
"blood_type" ="glue",
"resistances" =null,
"trace_chem" =null,
"virus2" =list(),
"immunity" =null,
)
var/mob/living/carbon/H = M
for(var/obj/item/I in H.held_items)
I.add_blood_from_data(glue_data)
I.glue_act(glue_duration, glue_state_to_set)
for(var/obj/item/clothing/C in M.get_equipped_items())
C.add_blood_from_data(glue_data)
C.glue_act(glue_duration, glue_state_to_set)
H.regenerate_icons()
/datum/reagent/glue/special_behaviour()
if (turning_into_paint)
return
var/datum/reagent/paint_exists = null
var/list/non_paint_pigments = list()
for (var/datum/reagent/R in holder.reagent_list)
if ((R.id == ACRYLIC) || (R.id == NANOPAINT))//we exclude flax oil so players can turn it into acrylic if they want to get rid of any alpha
paint_exists = R
else if (R.flags & CHEMFLAG_PIGMENT)
non_paint_pigments += R
var/mixed_pigment_color = mix_color_from_reagents(non_paint_pigments)
if (!mixed_pigment_color)//no pigments?
if (paint_exists)
paint_exists.volume += volume//if there's already acrylic or nano paint we just increase its volume
holder.del_reagent(id)
else
turning_into_paint = TRUE
holder.add_reagent(ACRYLIC, volume, list("color" = mixed_pigment_color))
holder.del_reagent(id)
/datum/reagent/lube
name = "Space Lube"
id = LUBE
description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity."
reagent_state = REAGENT_STATE_LIQUID
color = "#009CA8" //rgb: 0, 156, 168
overdose_am = REAGENTS_OVERDOSE
density = 1.11775
specheatcap = 2.71388
/datum/reagent/lube/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
if(volume >= 1)
T.wet(800, TURF_WET_LUBE)
/datum/reagent/luminol
name = "Luminol"
id = LUMINOL
description = "A chemical that exhibits chemiluminescence in the presence of blood due to the iron and copper in the hemoglobin."
reagent_state = REAGENT_STATE_LIQUID
color = "#FFFFFF" //rgb: 255, 255, 255
/datum/reagent/luminol/reaction_mob(var/mob/living/M, var/method = TOUCH)
if(ishuman(M) && (method == TOUCH))
var/mob/living/carbon/human/H = M
H.apply_luminol()
/datum/reagent/luminol/reaction_turf(var/turf/simulated/T)
if(..())
return TRUE
T.apply_luminol()
/datum/reagent/luminol/reaction_obj(var/obj/O, var/volume)
if(..())
return TRUE
O.apply_luminol()
/datum/reagent/pacid
name = "Polytrinic Acid"
id = PACID
description = "Polytrinic acid is a an extremely corrosive chemical substance."
reagent_state = REAGENT_STATE_LIQUID
color = "#8E18A9" //rgb: 142, 24, 169
custom_metabolism = 0.5
density = 1.98
specheatcap = 1.39
/datum/reagent/pacid/on_mob_life(var/mob/living/M)
if(..())
return 1
M.adjustFireLoss(3 * REM)
/datum/reagent/pacid/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
if(method == TOUCH)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.wear_mask)
if(H.wear_mask.dissolvable() == PACID)
qdel(H.wear_mask)
H.wear_mask = null
H.update_inv_wear_mask()
to_chat(H, "<span class='warning'>Your mask melts away but protects you from the acid!</span>")
else
to_chat(H, "<span class='warning'>Your mask protects you from the acid!</span>")
return
if(H.head && !istype(H.head, /obj/item/weapon/reagent_containers/glass/bucket))
if(prob(15) && H.head.dissolvable() == PACID)
qdel(H.head)
H.head = null
H.update_inv_head()
to_chat(H, "<span class='warning'>Your helmet melts away but protects you from the acid</span>")
else
to_chat(H, "<span class='warning'>Your helmet protects you from the acid!</span>")
return
if(H.dissolvable() == PACID)
var/datum/organ/external/head/head_organ = H.get_organ(LIMB_HEAD)
if(head_organ.take_damage(min(15, volume * 4), 0))
H.UpdateDamageIcon(1)
H.audible_scream()
else if(ismonkey(M))
var/mob/living/carbon/monkey/MK = M
if(MK.wear_mask)
if(MK.wear_mask.dissolvable() == PACID)
qdel(MK.wear_mask)
MK.wear_mask = null
MK.update_inv_wear_mask()
to_chat(MK, "<span class='warning'>Your mask melts away but protects you from the acid!</span>")
else
to_chat(MK, "<span class='warning'>Your mask protects you from the acid!</span>")
return
if(MK.dissolvable() == PACID)
MK.take_organ_damage(min(15, volume * 4), 0) //Same deal as sulphuric acid
else
if(M.dissolvable() == PACID) //I think someone doesn't know what this does
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/datum/organ/external/head/head_organ = H.get_organ(LIMB_HEAD)
if(head_organ.take_damage(min(15, volume * 4), 0))
H.UpdateDamageIcon(1)
H.audible_scream()
head_organ.disfigure("burn")
else
M.take_organ_damage(min(15, volume * 4), 0)
/datum/reagent/pacid/reaction_obj(var/obj/O, var/volume)
if(..())
return 1
if(!(O.dissolvable() == PACID))
return
if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)))
O.acid_melt()
else if(istype(O,/obj/effect/plantsegment))
var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(get_turf(O))
I.desc = "Looks like these were some [O.name] some time ago."
var/obj/effect/plantsegment/K = O
K.die_off()
else if(istype(O,/obj/effect/dummy/chameleon))
var/obj/effect/dummy/chameleon/projection = O
projection.disrupt()
/datum/reagent/pacid/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
T.add_toxinlevel(20)
/datum/reagent/sacid
name = "Sulphuric Acid"
id = SACID
description = "A strong mineral acid with the molecular formula H2SO4."
reagent_state = REAGENT_STATE_LIQUID
color = "#DB5008" //rgb: 219, 80, 8
custom_metabolism = 0.5
density = 1.84
specheatcap = 1.38
/datum/reagent/sacid/on_mob_life(var/mob/living/M)
if(..())
return 1
if(M.dissolvable() == PACID) //not PACID but it'll do
M.adjustFireLoss(REM)
M.take_organ_damage(0, REM)
/datum/reagent/sacid/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
if(method == TOUCH)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.wear_mask)
if(H.wear_mask.dissolvable() == PACID)
qdel(H.wear_mask)
H.wear_mask = null
H.update_inv_wear_mask()
to_chat(H, "<span class='warning'>Your mask melts away but protects you from the acid!</span>")
else
to_chat(H, "<span class='warning'>Your mask protects you from the acid!</span>")
return
if(H.head && !istype(H.head, /obj/item/weapon/reagent_containers/glass/bucket))
if(prob(15) && H.head.dissolvable() == PACID)
qdel(H.head)
H.head = null
H.update_inv_head()
to_chat(H, "<span class='warning'>Your helmet melts away but protects you from the acid</span>")
else
to_chat(H, "<span class='warning'>Your helmet protects you from the acid!</span>")
return
else if(ismonkey(M))
var/mob/living/carbon/monkey/MK = M
if(MK.wear_mask)
if(MK.wear_mask.dissolvable() == PACID)
qdel(MK.wear_mask)
MK.wear_mask = null
MK.update_inv_wear_mask()
to_chat(MK, "<span class='warning'>Your mask melts away but protects you from the acid!</span>")
else
to_chat(MK, "<span class='warning'>Your mask protects you from the acid!</span>")
return
if(M.dissolvable() == PACID)
if(prob(15) && ishuman(M) && volume >= 30)
var/mob/living/carbon/human/H = M
var/datum/organ/external/head/head_organ = H.get_organ(LIMB_HEAD)
if(head_organ)
if(head_organ.take_damage(min(25, volume * 2), 0))
H.UpdateDamageIcon(1)
head_organ.disfigure("burn")
H.audible_scream()
else
M.take_organ_damage(min(15, volume * 2), 0) //uses min() and volume to make sure they aren't being sprayed in trace amounts (1 unit != insta rape) -- Doohl
else
if(M.dissolvable() == PACID)
M.take_organ_damage(min(15, volume * 2), 0)
/datum/reagent/sacid/reaction_obj(var/obj/O, var/volume)
if(..())
return 1
if(!(O.dissolvable() == PACID)) //not PACID but it will do
return
if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(10))
var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc)
I.desc = "Looks like this was \an [O] some time ago."
O.visible_message("<span class='warning'>\The [O] melts.</span>")
qdel(O)
else if(istype(O,/obj/effect/dummy/chameleon))
var/obj/effect/dummy/chameleon/projection = O
projection.disrupt()
/datum/reagent/sacid/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
T.add_toxinlevel(2)
/datum/reagent/sodium_polyacrylate
name = "Sodium Polyacrylate"
id = SODIUM_POLYACRYLATE
description = "A super absorbent polymer that can absorb water based substances."
reagent_state = REAGENT_STATE_SOLID
color = "#FFFFFF"
density = 1.22
specheatcap = 4.14
/datum/reagent/sodium_polyacrylate/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
if(T.is_wet())
if(!locate(/obj/effect/decal/cleanable/molten_item) in T)
var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(T)
I.desc = "A bit of gel left over from sodium polyacrylate absorbing liquid."
T.dry(TURF_WET_LUBE) //Absorbs water or lube
/datum/reagent/space_cleaner
name = "Space Cleaner"
id = CLEANER
description = "A compound used to clean things. Now with 50% more sodium hypochlorite!"
reagent_state = REAGENT_STATE_LIQUID
color = "#A5F0EE" //rgb: 165, 240, 238
density = 0.76
specheatcap = 60.17
var/clean_level = CLEANLINESS_SPACECLEANER
/datum/reagent/space_cleaner/reaction_obj(var/obj/O, var/volume)
if(..())
return 1
O.clean_blood()
O.clean_act(clean_level)
/datum/reagent/space_cleaner/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
if(volume >= 1)
for (var/obj/effect/decal/cleanable/C in T)
qdel(C)
if (T.advanced_graffiti)
T.overlays -= T.advanced_graffiti_overlay
T.advanced_graffiti_overlay = null
qdel(T.advanced_graffiti)
T.clean_blood()
for(var/mob/living/carbon/slime/M in T)
M.adjustToxLoss(rand(5, 10))
for(var/mob/living/carbon/human/H in T)
if(isslimeperson(H))
H.adjustToxLoss(rand(5, 10)/10)
T.clean_act(clean_level)
/datum/reagent/space_cleaner/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
if(iscarbon(M))
var/mob/living/carbon/H = M
for(var/obj/item/I in H.held_items)
I.clean_act(clean_level)
for(var/obj/item/clothing/C in M.get_equipped_items())
if(C.clean_blood())
H.update_inv_by_slot(C.slot_flags)
M.clean_act(clean_level)
/datum/reagent/space_cleaner/bleach
name = "Bleach"
id = BLEACH
description = "A strong cleaning compound. Corrosive and toxic when applied to soft tissue. Do not swallow."
reagent_state = REAGENT_STATE_LIQUID
color = "#FBFCFF" //rgb: 251, 252, 255
density = 6.84
specheatcap = 3.5
clean_level = CLEANLINESS_BLEACH
/datum/reagent/space_cleaner/bleach/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
for(var/atom/A in T)
A.clean_blood()
A.clean_act(clean_level)
for(var/obj/item/I in T)
I.decontaminate()
/datum/reagent/space_cleaner/bleach/on_mob_life(var/mob/living/M)
if(..())
return 1
M.color = ""
switch(tick)
if(1 to 10)
M.adjustBruteLoss(3 * REM) //soft tissue damage
if(10 to INFINITY)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(prob(5))
H.emote("me", 1, "coughs up blood!")
H.drip(10)
else if(prob(5))
H.vomit()
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(H.species.anatomy_flags & MULTICOLOR && !(initial(H.species.anatomy_flags) & MULTICOLOR))
H.species.anatomy_flags &= ~MULTICOLOR
H.update_body()
M.adjustToxLoss(4 * REM)
/datum/reagent/space_cleaner/bleach/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
if(method == TOUCH && ((TARGET_EYES in zone_sels) || (LIMB_HEAD in zone_sels)))
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/eyes_covered = H.get_body_part_coverage(EYES)
if(eyes_covered)
to_chat(H,"<span class='warning'>Your [eyes_covered] protects your eyes from the bleach!</span>")
return
else //This stuff is a little more corrosive but less irritative than pepperspray
H.audible_scream()
to_chat(H,"<span class='danger'>You are sprayed directly in the eyes with bleach!</span>")
H.eye_blurry = max(M.eye_blurry, 15)
H.eye_blind = max(M.eye_blind, 5)
H.adjustBruteLoss(2)
var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"]
E.take_damage(5, 1)
H.custom_pain("Your [E] burn horribly!", 1)
H.apply_damage(2, BRUTE, LIMB_HEAD)
/datum/reagent/thermite
name = "Thermite"
id = THERMITE
description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls."
reagent_state = REAGENT_STATE_SOLID
color = "#673910" //rgb: 103, 57, 16
density = 3.91
specheatcap = 0.37
/datum/reagent/thermite/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
if(volume >= 5 && T.can_thermite)
T.thermite = 1
T.overlays.len = 0
T.overlays = image('icons/effects/effects.dmi', icon_state = "thermite")
/datum/reagent/thermite/on_mob_life(var/mob/living/M)
if(..())
return 1
M.adjustFireLoss(2 * REM)
/datum/reagent/vaporsalt
name = "Vapor Salts"
id = VAPORSALT
description = "A strange mineral found in alien plantlife that has been observed to vaporize some liquids."
reagent_state = REAGENT_STATE_LIQUID
color = "#BDE5F2"
specheatcap = 1.02 //SHC of air
density = 1.225
/datum/reagent/vaporsalt/reaction_turf(var/turf/simulated/T, var/volume)
if(..())
return 1
if(T.is_wet())
T.dry(TURF_WET_LUBE) //Cleans water or lube
var/obj/effect/smoke/S = new /obj/effect/smoke(T)
S.time_to_live = 10 //unusually short smoke
//We don't need to start up the system because we only want to smoke one tile.

View File

@@ -0,0 +1,716 @@
//Poisonous chemicals
/datum/reagent/amanatin
name = "Alpha-Amanatin"
id = AMANATIN
description = "A deadly poison derived from certain species of Amanita. Sits in the victim's system for a long period of time, then ravages the body."
color = "#792300" //rgb: 121, 35, 0
custom_metabolism = 0.01
var/activated = 0
/datum/reagent/amanatin/on_mob_life(var/mob/living/M)
if(..())
return 1
if(volume <= 3 && tick >= 60 && !activated) //Minimum of 1 minute required to be useful
activated = 1
if(activated)
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(prob(8))
H << "<span class='warning'>You feel violently ill.</span>"
if(prob(min(tick / 10, 100)))
H.vomit()
var/datum/organ/internal/liver/L = H.internal_organs_by_name["liver"]
if(istype(L) && !L.is_broken())
L.take_damage(tick * 0.01, 0)
H.adjustToxLoss(round(tick / 20, 1))
else
H.adjustToxLoss(round(tick / 10, 1))
tick += 4
switch(tick)
if(1 to 30)
M.druggy = max(M.druggy, 10)
if(540 to 600) //Start barfing violently after 9 minutes
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(prob(12))
H << "<span class='warning'>You feel violently ill.</span>"
H.adjustToxLoss(0.1)
if(prob(8))
H.vomit()
if(600 to INFINITY) //Ded in 10 minutes with a minimum of 6 units
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(prob(20))
H << "<span class='sinister'>You feel deathly ill.</span>"
var/datum/organ/internal/liver/L = H.internal_organs_by_name["liver"]
if(istype(L) && !L.is_broken())
L.take_damage(10, 0)
else
H.adjustToxLoss(60)
/datum/reagent/amatoxin
name = "Amatoxin"
id = AMATOXIN
description = "A powerful poison derived from certain species of mushroom."
color = "#792300" //rgb: 121, 35, 0
/datum/reagent/amatoxin/on_mob_life(var/mob/living/M)
if(..())
return 1
M.adjustToxLoss(1.5)
/datum/reagent/aslimetoxin
name = "Advanced Mutation Toxin"
id = AMUTATIONTOXIN
description = "An advanced corruptive toxin produced by slimes."
reagent_state = REAGENT_STATE_LIQUID
color = "#13BC5E" //rgb: 19, 188, 94
overdose_am = REAGENTS_OVERDOSE
density = 1.35
specheatcap = 0.135
/datum/reagent/aslimetoxin/on_mob_life(var/mob/living/M)
if(..())
return 1
if(iscarbon(M) && M.stat != DEAD)
var/mob/living/carbon/C = M
if(ismanifested(C))
to_chat(C, "<span class='warning'>You can feel intriguing reagents seeping into your body, but they don't seem to react at all.</span>")
C.reagents.del_reagent("amutationtoxin")
else
if(C.monkeyizing)
return
to_chat(M, "<span class='warning'>Your flesh rapidly mutates!</span>")
C.monkeyizing = 1
C.canmove = 0
C.icon = null
C.overlays.len = 0
C.invisibility = 101
for(var/obj/item/W in C)
if(istype(W, /obj/item/weapon/implant)) //TODO: Carn. give implants a dropped() or something
qdel(W)
continue
W.reset_plane_and_layer()
W.forceMove(C.loc)
W.dropped(C)
var/mob/living/carbon/slime/new_mob = new /mob/living/carbon/slime(C.loc)
new_mob.a_intent = I_HURT
if(C.mind)
C.mind.transfer_to(new_mob)
else
new_mob.key = C.key
C.transferBorers(new_mob)
qdel(C)
/datum/reagent/bicarodyne
name = "Bicarodyne"
id = BICARODYNE
description = "Not to be confused with Bicaridine, Bicarodyne is a volatile chemical that reacts violently in the presence of most human endorphins."
reagent_state = REAGENT_STATE_LIQUID
color = "#C8A5DC" //rgb: 200, 165, 220
overdose_am = REAGENTS_OVERDOSE * 2 //No need for anyone to get suspicious.
custom_metabolism = 0.01
/datum/reagent/carpotoxin
name = "Carpotoxin"
id = CARPOTOXIN
description = "A deadly neurotoxin produced by the dreaded spess carp."
reagent_state = REAGENT_STATE_LIQUID
color = "#003333" //rgb: 0, 51, 51
density = 319.27 //Assuming it's Tetrodotoxin
specheatcap = 41.53
/datum/reagent/carpotoxin/on_mob_life(var/mob/living/M)
if(..())
return 1
M.adjustToxLoss(2 * REM)
//Quiet and lethal, needs at least 4 units in the person before they'll die
/datum/reagent/chefspecial
name = "Chef's Special"
id = CHEFSPECIAL
description = "An extremely toxic chemical that will surely end in death."
reagent_state = REAGENT_STATE_LIQUID
color = "#CF3600" //rgb: 207, 54, 0
custom_metabolism = 0.01
overdose_tick = 165
density = 0.687 //Let's assume it's a compound of cyanide
specheatcap = 1.335
/datum/reagent/chefspecial/on_overdose(var/mob/living/M)
M.death(0)
M.attack_log += "\[[time_stamp()]\]<font color='red'>Died a quick and painless death by <font color='green'>Chef Excellence's Special Sauce</font>.</font>"
//Otherwise known as a "Mickey Finn"
/datum/reagent/chloralhydrate
name = "Chloral Hydrate"
id = CHLORALHYDRATE
description = "A powerful sedative."
reagent_state = REAGENT_STATE_SOLID
color = "#000067" //rgb: 0, 0, 103
flags = CHEMFLAG_DISHONORABLE // NO CHEATING
density = 11.43
specheatcap = 13.79
/datum/reagent/chloralhydrate/on_mob_life(var/mob/living/M)
if(..())
return 1
switch(tick)
if(0)
M.confused += 2
M.drowsyness += 2
if(1 to 79)
M.sleeping++
if(80 to INFINITY)
M.sleeping++
M.toxloss += (tick - 50)
//Chloral hydrate disguised as normal beer for use by emagged brobots
/datum/reagent/chloralhydrate/beer2
name = "Beer"
id = BEER2
description = "An alcoholic beverage made from malted grains, hops, yeast, and water."
reagent_state = REAGENT_STATE_LIQUID
color = "#664300" //rgb: 102, 67, 0
glass_icon_state = "beerglass"
glass_desc = "A cold pint of pale lager."
/datum/reagent/chloramine
name = "Chloramine"
id = CHLORAMINE
description = "A chemical compound consisting of chlorine and ammonia. Very dangerous when inhaled."
reagent_state = REAGENT_STATE_GAS
color = "#808080" //rgb: 128, 128, 128
overdose_am = REAGENTS_OVERDOSE
density = 3.68
specheatcap = 1299.23
/datum/reagent/chloramine/on_mob_life(var/mob/living/M)
if(..())
return 1
M.take_organ_damage(REM, 0)
/datum/reagent/chloramine/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
if(ishuman(M))
var/mob/living/carbon/human/H = M
if((H.species && H.species.flags & NO_BREATHE) || (M_NO_BREATH in H.mutations))
return
for(var/datum/organ/internal/lungs/L in H.internal_organs)
L.take_damage(REM, 1)
//Fast and lethal
/datum/reagent/cyanide
name = "Cyanide"
id = CYANIDE
description = "A highly toxic chemical."
reagent_state = REAGENT_STATE_LIQUID
color = "#CF3600" //rgb: 207, 54, 0
custom_metabolism = 0.4
flags = CHEMFLAG_DISHONORABLE // NO CHEATING
density = 0.699
specheatcap = 1.328
/datum/reagent/cyanide/on_mob_life(var/mob/living/M)
if(..())
return 1
M.adjustToxLoss(4)
M.adjustOxyLoss(4)
M.sleeping += 1
/datum/reagent/hamserum
name = "Ham Serum"
id = HAMSERUM
description = "Concentrated legal discussions."
reagent_state = REAGENT_STATE_LIQUID
color = "#00FF21" //rgb: 0, 255, 33
/datum/reagent/hamserum/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
empulse(get_turf(M), 1, 2, 1)
return
/datum/reagent/heartbreaker
name = "Heartbreaker Toxin"
id = HEARTBREAKER
description = "A powerful hallucinogen and suffocant. Not a thing to be messed with."
reagent_state = REAGENT_STATE_LIQUID
color = "#ff91b7" //rgb: 255, 145, 183
density = 0.78
specheatcap = 5.47
/datum/reagent/heartbreaker/on_mob_life(var/mob/living/M)
if(..())
return 1
M.hallucination += 5
M.adjustOxyLoss(4 * REM)
/datum/reagent/hemoscyanine
name = "Hemoscyanine"
id = HEMOSCYANINE
description = "Hemoscyanine is a toxin which can destroy blood cells."
reagent_state = REAGENT_STATE_LIQUID
color = "#600000" //rgb: 96, 0, 0
density = 11.53
specheatcap = 0.22
/datum/reagent/hemoscyanine/on_mob_life(var/mob/living/M)
if(..())
return 1
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(!(H.species.anatomy_flags & NO_BLOOD))
H.vessel.remove_reagent(BLOOD, 2)
/datum/reagent/honkserum
name = "Honk Serum"
id = HONKSERUM
description = "Concentrated honking."
reagent_state = REAGENT_STATE_LIQUID
color = "#F2C900" //rgb: 242, 201, 0
custom_metabolism = 0.05
overdose_am = REAGENTS_OVERDOSE
/datum/reagent/honkserum/on_overdose(var/mob/living/H)
if (H?.mind?.miming)
H.mind.miming = 0
for(var/spell/aoe_turf/conjure/forcewall/mime/spell in H.spell_list)
H.remove_spell(spell)
for(var/spell/targeted/oathbreak/spell in H.spell_list)
H.remove_spell(spell)
if (istype(H.wear_mask, /obj/item/clothing/mask/gas/mime/stickymagic))
qdel(H.wear_mask)
H.visible_message("<span class='warning'>\The [H]'s mask melts!</span>")
H.visible_message("<span class='notice'>\The [H]'s face goes pale for a split second, and then regains some colour.</span>", "<span class='notice'><i>Where did Marcel go...?</i></span>'")
/datum/reagent/honkserum/on_mob_life(var/mob/living/M)
if(..())
return 1
if(prob(5))
M.say(pick("Honk", "HONK", "Hoooonk", "Honk?", "Henk", "Hunke?", "Honk!"))
playsound(M, 'sound/items/bikehorn.ogg', 50, -1)
/datum/reagent/mercury
name = "Mercury"
id = MERCURY
description = "A chemical element."
reagent_state = REAGENT_STATE_LIQUID
color = "#484848" //rgb: 72, 72, 72
overdose_am = REAGENTS_OVERDOSE
specheatcap = 0.14
density = 13.56
/datum/reagent/mercury/on_mob_life(var/mob/living/M)
if(..())
return 1
if(M.canmove && !M.restrained() && istype(M.loc, /turf/space))
step(M, pick(cardinal))
if(prob(5))
M.emote(pick("twitch","drool","moan"), null, null, TRUE)
M.adjustBrainLoss(2)
/datum/reagent/mindbreaker
name = "Mindbreaker Toxin"
id = MINDBREAKER
description = "A powerful hallucinogen. Not a thing to be messed with."
reagent_state = REAGENT_STATE_LIQUID
color = "#B31008" //rgb: 139, 166, 233
custom_metabolism = 0.05
density = 0.78
specheatcap = 5.47
/datum/reagent/mindbreaker/on_mob_life(var/mob/living/M)
if(..())
return 1
M.hallucination += 10
/datum/reagent/minttoxin
name = "Mint Toxin"
id = MINTTOXIN
description = "Useful for dealing with undesirable customers. The undiluted version of Mint Extract."
reagent_state = REAGENT_STATE_LIQUID
color = "#CF3600" //rgb: 207, 54, 0
density = 0.898
specheatcap = 3.58
custom_metabolism = 0.01 //so it lasts 10x as long as regular minttox
var/fatgokaboom = TRUE
nutriment_factor = 2.5 * REAGENTS_METABOLISM //about as nutritious as sugar
sport = SPORTINESS_SUGAR //a small performance boost from being COOL AND FRESH
var/chillcounter = 0
/datum/reagent/minttoxin/on_mob_life(var/mob/living/M, var/alien)
if(..())
return 1
if(prob(5))
to_chat(M, "<span class='notice'>[pick("You feel minty fresh!","If freshness could kill you'd be a serial killer!","You feel the strange urge to share this minty freshness with others!","You have a sudden craving to drink ice cold water.","Ahh, so refreshing!")]</span>")
if(M.bodytemperature > 310) //copypasted from the cold drinks check so I don't have to change minttox internally and maybe most certainly break shit in the process
M.bodytemperature = max(310, M.bodytemperature + (-5 * TEMPERATURE_DAMAGE_COEFFICIENT)) //that minty freshness my dude, chill out
if(fatgokaboom && (M_FAT in M.mutations))
M.gib()
if(ishuman(M))
var/mob/living/carbon/human/H = M
if(holder.has_any_reagents(COLDDRINKS) & prob(25))
var/datum/butchering_product/teeth/J = locate(/datum/butchering_product/teeth) in H.butchering_drops
if(J.amount == 0)
return
else
H.custom_pain(pick("AHHH YOUR TEETH HURT!","You didn't know you had a cavity. You do now.","DAMN YOUR TEETH HURT"),5)
holder.add_reagent(SACID,1) //just a smidgeon
chillcounter = 30 //60 seconds
if(chillcounter > 0)
chillcounter--
if(holder.has_any_reagents(HOTDRINKS) & prob(30))
var/datum/butchering_product/teeth/J = locate(/datum/butchering_product/teeth) in H.butchering_drops
if(J.amount == 0)
return
else
J.amount = 0
H.custom_pain("Your teeth crack and tremble before breaking all of a sudden! THE PAIN!", 100) //you dun fucked up lad
H.visible_message("<span class='warning'>[H]'s teeth start cracking and suddenly explode! That must hurt.</span>")
H.pain_level = 2 * BASE_CARBON_PAIN_RESIST //so you go into shock from pain
playsound(H, 'sound/effects/toothshatter.ogg', 50, 1)
H.audible_scream()
H.adjustBruteLoss(50) //imagine all your teeth violently exploding, shrapnel and shit
/datum/reagent/minttoxin/essence
name = "Mint Essence"
id = MINTESSENCE
description = "Minty freshness in liquid form!"
custom_metabolism = 0.1 //toxin lasts 10x as long
fatgokaboom = FALSE
/datum/reagent/mutagen
name = "Unstable Mutagen"
id = MUTAGEN
description = "Might cause unpredictable mutations. Keep away from children."
reagent_state = REAGENT_STATE_LIQUID
color = "#13BC5E" //rgb: 19, 188, 94
density = 3.35
specheatcap = 96.86
/datum/reagent/mutagen/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
if(!M.dna) //No robots, AIs, aliens, Ians or other mobs should be affected by this.
return
if((method == TOUCH && prob(33)) || method == INGEST)
if(prob(98))
randmutb(M)
else
randmutg(M)
domutcheck(M, null)
if(M.last_appearance_mutation + 1 SECONDS < world.time)
randmuti(M)
M.UpdateAppearance()
/datum/reagent/mutagen/on_mob_life(var/mob/living/M)
if(!M.dna)
return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
if(!M)
M = holder.my_atom
if(..())
return 1
M.apply_radiation(10,RAD_INTERNAL)
/datum/reagent/mutagen/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
if(!holder)
return
if(!T)
T = holder.my_atom //Try to find the mob through the holder
if(!istype(T)) //Still can't find it, abort
return
var/amount = T.reagents.get_reagent_amount(id)
if(amount >= 1)
if(prob(15))
T.mutate(GENE_PHYTOCHEMISTRY)
T.reagents.remove_reagent(id, 1)
else if(amount > 0)
T.reagents.remove_reagent(id, amount)
/datum/reagent/mutagen/untable
name = "Untable Mutagen"
id = UNTABLE_MUTAGEN
description = "Untable Mutagen is a substance that is highly corrosive to tables."
reagent_state = REAGENT_STATE_LIQUID
color = "#84121D" //rgb: 132, 18, 29
overdose_am = REAGENTS_OVERDOSE
/datum/reagent/mutagen/untable/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
/datum/reagent/mutagen/untable/reaction_obj(var/obj/O, var/volume)
if(..())
return 1
if(!(O.dissolvable() == PACID))
return
if(istype(O,/obj/structure/table))
var/obj/effect/decal/cleanable/molten_item/I = new/obj/effect/decal/cleanable/molten_item(O.loc)
I.desc = "Looks like this was \an [O] some time ago."
O.visible_message("<span class='warning'>\The [O] melts.</span>")
qdel(O)
/datum/reagent/nanites
name = "Nanites"
id = NANITES
description = "Microscopic construction robots."
reagent_state = REAGENT_STATE_SOLID
dupeable = FALSE
color = "#535E66" //rgb: 83, 94, 102
var/disease_type = DISEASE_CYBORG
/datum/reagent/nanites/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
if((prob(10) && method == TOUCH) || method == INGEST)
M.infect_disease2_predefined(disease_type, 1, "Robotic Nanites")
/datum/reagent/nanites/reaction_dropper_mob(var/mob/living/M)
if(prob(30))
M.infect_disease2_predefined(disease_type, 1, "Robotic Nanites")
return ..()
/datum/reagent/nanites/autist
name = "Autist Nanites"
id = AUTISTNANITES
description = "Microscopic construction robots. They look more autistic than usual."
disease_type = DISEASE_MOMMI
/datum/reagent/potassium_hydroxide
name = "Potassium Hydroxide"
id = POTASSIUM_HYDROXIDE
description = "A corrosive chemical used in making soap and batteries."
reagent_state = REAGENT_STATE_SOLID
overdose_am = REAGENTS_OVERDOSE
custom_metabolism = 0.1
color = "#ffffff" //rgb: 255, 255, 255
density = 2.12
specheatcap = 65.87 //how much energy in joules it takes to heat this thing up by 1 degree (J/g). round to 2dp
/datum/reagent/potassium_hydroxide/on_mob_life(var/mob/living/M)
if(..())
return 1
M.adjustFireLoss(1.5 * REM)
/datum/reagent/slimetoxin
name = "Mutation Toxin"
id = MUTATIONTOXIN
description = "A corruptive toxin produced by slimes."
reagent_state = REAGENT_STATE_LIQUID
color = "#13BC5E" //rgb: 19, 188, 94
overdose_am = REAGENTS_OVERDOSE
density = 1.245
specheatcap = 0.25
/datum/reagent/slimetoxin/on_mob_life(var/mob/living/M)
if(..())
return 1
if(ismanifested(M))
to_chat(M, "<span class='warning'>You can feel intriguing reagents seeping into your body, but they don't seem to react at all.</span>")
M.reagents.del_reagent("mutationtoxin")
if(ishuman(M))
var/mob/living/carbon/human/human = M
if(!isslimeperson(human))
to_chat(M, "<span class='warning'>Your flesh rapidly mutates!</span>")
human.set_species("Slime")
human.regenerate_icons()
//Let the player choose their new appearance
var/list/species_hair = valid_sprite_accessories(hair_styles_list, null, (human.species.name || null))
if(human.my_appearance.f_style && species_hair.len)
var/new_hstyle = input(M, "Select an ooze style", "Grooming") as null|anything in species_hair
if(new_hstyle)
human.my_appearance.h_style = new_hstyle
var/list/species_facial_hair = valid_sprite_accessories(facial_hair_styles_list, null, (human.species.name || null))
if(human.my_appearance.f_style && species_facial_hair.len)
var/new_fstyle = input(M, "Select a facial ooze style", "Grooming") as null|anything in species_facial_hair
if(new_fstyle)
human.my_appearance.f_style = new_fstyle
//Slime hair color is just darkened slime skin color (for now)
human.my_appearance.r_hair = round(human.multicolor_skin_r * 0.8)
human.my_appearance.g_hair = round(human.multicolor_skin_g * 0.8)
human.my_appearance.b_hair = round(human.multicolor_skin_b * 0.8)
human.regenerate_icons()
M.setCloneLoss(0)
/datum/reagent/spiritbreaker
name = "Spiritbreaker Toxin"
id = SPIRITBREAKER
description = "An extremely dangerous hallucinogen often used for torture. Extracted from the leaves of the rare Ambrosia Cruciatus plant."
reagent_state = REAGENT_STATE_LIQUID
color = "#3B0805" //rgb: 59, 8, 5
custom_metabolism = 0.05
/datum/reagent/spiritbreaker/on_mob_life(var/mob/living/M)
if(..())
return 1
if(tick >= 165)
M.adjustToxLoss(0.2)
M.adjustBrainLoss(5)
M.hallucination += 100
M.dizziness += 100
M.confused += 2
/datum/reagent/stoxin
name = "Sleep Toxin"
id = STOXIN
description = "An effective hypnotic used to treat insomnia."
reagent_state = REAGENT_STATE_LIQUID
color = "#E895CC" //rgb: 232, 149, 204
custom_metabolism = 0.1
density = 3.56
specheatcap = 17.15
overdose_am = REAGENTS_OVERDOSE // So you can't pretend that you "didn't know it was an OD"
/datum/reagent/stoxin/on_mob_life(var/mob/living/M, var/alien)
if(..())
return 1
switch(tick)
if(1 to 15)
M.eye_blurry = max(M.eye_blurry, 10)
if(15 to 25)
M.drowsyness = max(M.drowsyness, 20)
if (25 to 240)
M.Paralyse(20)
M.drowsyness = max(M.drowsyness, 30)
if(240 to INFINITY) // 8 minutes
var/mob/living/carbon/human/H = M
var/datum/organ/internal/heart/damagedheart = H.get_heart()
damagedheart.damage += 10
/datum/reagent/suxameth
name = "Suxameth"
id = SUX
description = "A name for Suxamethonium chloride. A medical full-body paralytic preferred because it is easy to purge."
reagent_state = REAGENT_STATE_LIQUID
color = "#CFC5E9" //rgb: 207, 197, 223
flags = CHEMFLAG_DISHONORABLE
overdose_am = 21
custom_metabolism = 1
/datum/reagent/suxameth/on_mob_life(var/mob/living/M)
if(..())
return 1
if(tick >= 2)
M.SetStunned(2)
M.SetKnockdown(2)
/datum/reagent/suxameth/on_overdose(var/mob/living/M)
M.adjustOxyLoss(6) //Paralyzes the diaphragm if they go over 20 units
/datum/reagent/toxin
name = "Toxin"
id = TOXIN
description = "A Toxic chemical."
reagent_state = REAGENT_STATE_LIQUID
color = "#CF3600" //rgb: 207, 54, 0
custom_metabolism = 0.01
density = 1.4 //Let's just assume it's alpha-solanine
/datum/reagent/toxin/on_mob_life(var/mob/living/M)
if(..())
return 1
//Toxins are really weak, but without being treated, last very long
M.adjustToxLoss(0.2)
/datum/reagent/toxin/on_plant_life(obj/machinery/portable_atmospherics/hydroponics/T)
..()
T.add_toxinlevel(2)
/datum/reagent/xenomicrobes
name = "Xenomicrobes"
id = XENOMICROBES
description = "Microbes with an entirely alien cellular structure."
reagent_state = REAGENT_STATE_LIQUID
color = "#535E66" //rgb: 83, 94, 102
/datum/reagent/xenomicrobes/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume, var/list/zone_sels = ALL_LIMBS)
if(..())
return 1
if((prob(10) && method == TOUCH) || method == INGEST)
M.infect_disease2_predefined(DISEASE_XENO, 1, "Xenimicrobes")
/datum/reagent/xenomicrobes/reaction_dropper_mob(var/mob/living/M)
if(prob(30))
M.infect_disease2_predefined(DISEASE_XENO, 1, "Xenimicrobes")
return ..()
/datum/reagent/zombiepowder
name = "Zombie Powder"
id = ZOMBIEPOWDER
description = "A strong neurotoxin that puts the subject into a death-like state."
color = "#669900" //rgb: 102, 153, 0
density = 829.48
specheatcap = 274.21
/datum/reagent/zombiepowder/on_mob_life(var/mob/living/carbon/M)
if(..())
return 1
if(volume >= 1) //Hotfix for Fakedeath never ending.
M.status_flags |= FAKEDEATH
else
M.status_flags &= ~FAKEDEATH
M.adjustOxyLoss(0.5 * REM)
M.adjustToxLoss(0.5 * REM)
M.Knockdown(10)
M.Stun(10)
M.silent = max(M.silent, 10)
M.tod = worldtime2text()
/datum/reagent/zombiepowder/reagent_deleted()
return on_removal(volume)
//Hotfix for Fakedeath never ending.
/datum/reagent/zombiepowder/on_removal(var/amount)
if(!..(amount))
return 0
var/newvol = max(0, volume - amount)
if(iscarbon(holder.my_atom))
var/mob/living/carbon/M = holder.my_atom
if(newvol >= 1)
M.status_flags |= FAKEDEATH
else
M.status_flags &= ~FAKEDEATH
return 1

View File

@@ -0,0 +1,45 @@
//Xenoarchaeology-related Chems
/datum/reagent/tungsten
name = "Tungsten"
id = TUNGSTEN
description = "A chemical element, and a strong oxidising agent."
reagent_state = REAGENT_STATE_SOLID
color = "#DCDCDC" // rgb: 220, 220, 220, silver
density = 19.25
/datum/reagent/lithiumsodiumtungstate
name = "Lithium Sodium Tungstate"
id = LITHIUMSODIUMTUNGSTATE
description = "A reducing agent for geological compounds."
reagent_state = REAGENT_STATE_LIQUID
color = "#C0C0C0" // rgb: 192, 192, 192, darker silver
density = 3.29
specheatcap = 3.99
/datum/reagent/ground_rock
name = "Ground Rock"
id = GROUND_ROCK
description = "A fine dust made of ground up rock. Adding a reducing agent would separate the waste from the useful elements."
reagent_state = REAGENT_STATE_SOLID
color = "#A0522D" //rgb: 160, 82, 45, brown
/datum/reagent/analysis_sample
name = "Analysis liquid"
id = ANALYSIS_SAMPLE
description = "A watery paste used in chemical analysis."
reagent_state = REAGENT_STATE_LIQUID
color = "#F5FFFA" //rgb: 245, 255, 250, almost white
density = 4.74
specheatcap = 3.99
/datum/reagent/analysis_sample/handle_additional_data(var/list/additional_data=null)
if (GROUND_ROCK in additional_data)
data = additional_data[GROUND_ROCK]
/datum/reagent/chemical_waste
name = "Chemical Waste"
id = CHEMICAL_WASTE
description = "A viscous, toxic liquid left over from many chemical processes."
reagent_state = REAGENT_STATE_LIQUID
color = "#ADFF2F" //rgb: 173, 255, 47, toxic green

View File

@@ -1,37 +0,0 @@
var/global/list/charcoal_doesnt_remove=list(
CHARCOAL,
BLOOD
)
/datum/reagent/proc/reagent_deleted()
return
/datum/reagent/charcoal
//data must contain virus type
name = "Activated Charcoal"
id = CHARCOAL
reagent_state = REAGENT_STATE_LIQUID
color = "#333333" // rgb: 51, 51, 51
custom_metabolism = 0.06
/datum/reagent/charcoal/on_mob_life(var/mob/living/M)
if(!M)
M = holder.my_atom
if(ishuman(M) && prob(5))
var/mob/living/carbon/human/H=M
H.vomit()
return
var/found_any = FALSE
for(var/datum/reagent/reagent in holder.reagent_list)
if(reagent.id in charcoal_doesnt_remove)
continue
holder.remove_reagent(reagent.id, 15*REM)
found_any = TRUE
if (!found_any)
holder.remove_reagent(CHARCOAL, volume)
M.adjustToxLoss(-2*REM)
..()

View File

@@ -1,49 +1,5 @@
//chemistry stuff here so that it can be easily viewed/modified
/datum/reagent/tungsten
name = "Tungsten"
id = TUNGSTEN
description = "A chemical element, and a strong oxidising agent."
reagent_state = REAGENT_STATE_SOLID
color = "#DCDCDC" // rgb: 220, 220, 220, silver
density = 19.25
/datum/reagent/lithiumsodiumtungstate
name = "Lithium Sodium Tungstate"
id = LITHIUMSODIUMTUNGSTATE
description = "A reducing agent for geological compounds."
reagent_state = REAGENT_STATE_LIQUID
color = "#C0C0C0" // rgb: 192, 192, 192, darker silver
density = 3.29
specheatcap = 3.99
/datum/reagent/ground_rock
name = "Ground Rock"
id = GROUND_ROCK
description = "A fine dust made of ground up rock. Adding a reducing agent would separate the waste from the useful elements."
reagent_state = REAGENT_STATE_SOLID
color = "#A0522D" //rgb: 160, 82, 45, brown
/datum/reagent/analysis_sample
name = "Analysis liquid"
id = ANALYSIS_SAMPLE
description = "A watery paste used in chemical analysis."
reagent_state = REAGENT_STATE_LIQUID
color = "#F5FFFA" //rgb: 245, 255, 250, almost white
density = 4.74
specheatcap = 3.99
/datum/reagent/analysis_sample/handle_additional_data(var/list/additional_data=null)
if (GROUND_ROCK in additional_data)
data = additional_data[GROUND_ROCK]
/datum/reagent/chemical_waste
name = "Chemical Waste"
id = CHEMICAL_WASTE
description = "A viscous, toxic liquid left over from many chemical processes."
reagent_state = REAGENT_STATE_LIQUID
color = "#ADFF2F" //rgb: 173, 255, 47, toxic green
/datum/chemical_reaction/lithiumsodiumtungstate //LiNa2WO4, not the easiest chem to mix
name = "Lithium Sodium Tungstate"
id = LITHIUMSODIUMTUNGSTATE

View File

@@ -2250,7 +2250,6 @@
#include "code\modules\painting\colors.dm"
#include "code\modules\painting\easel.dm"
#include "code\modules\painting\paint_bucket.dm"
#include "code\modules\painting\paint_reagents.dm"
#include "code\modules\painting\painting_brush.dm"
#include "code\modules\painting\paintings_custom.dm"
#include "code\modules\painting\palette.dm"
@@ -2489,8 +2488,23 @@
#include "code\modules\reagents\reagent_containers\glass\bottle.dm"
#include "code\modules\reagents\reagent_containers\glass\jar.dm"
#include "code\modules\reagents\reagent_containers\glass\bottle\robot.dm"
#include "code\modules\reagents\reagents\heart_medication.dm"
#include "code\modules\reagents\reagents\vg.dm"
#include "code\modules\reagents\reagents\reagents_basic.dm"
#include "code\modules\reagents\reagents\reagents_bio.dm"
#include "code\modules\reagents\reagents\reagents_dan.dm"
#include "code\modules\reagents\reagents\reagents_drink.dm"
#include "code\modules\reagents\reagents\reagents_drug.dm"
#include "code\modules\reagents\reagents\reagents_ethanol.dm"
#include "code\modules\reagents\reagents\reagents_food.dm"
#include "code\modules\reagents\reagents\reagents_material.dm"
#include "code\modules\reagents\reagents\reagents_medical.dm"
#include "code\modules\reagents\reagents\reagents_misc.dm"
#include "code\modules\reagents\reagents\reagents_paint.dm"
#include "code\modules\reagents\reagents\reagents_plant.dm"
#include "code\modules\reagents\reagents\reagents_reactive.dm"
#include "code\modules\reagents\reagents\reagents_religious.dm"
#include "code\modules\reagents\reagents\reagents_tools.dm"
#include "code\modules\reagents\reagents\reagents_toxin.dm"
#include "code\modules\reagents\reagents\reagents_xenoarch.dm"
#include "code\modules\recycling\compactor.dm"
#include "code\modules\recycling\conveyor2.dm"
#include "code\modules\recycling\conveyor_assembly.dm"