From 4d1511c4fc204cf8c7474ac4f9b10a66968711a2 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 1 May 2024 16:44:44 -0400 Subject: [PATCH 01/69] Update Chemistry-Generator.dm --- code/modules/reagents/Chemistry-Generator.dm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/code/modules/reagents/Chemistry-Generator.dm b/code/modules/reagents/Chemistry-Generator.dm index b2e6402d4b06..78d25a27b759 100644 --- a/code/modules/reagents/Chemistry-Generator.dm +++ b/code/modules/reagents/Chemistry-Generator.dm @@ -342,7 +342,9 @@ PROPERTY_NEUROSHIELDING = list(PROPERTY_ALCOHOLIC, PROPERTY_BALDING),\ PROPERTY_ANTIADDICTIVE = list(PROPERTY_PSYCHOSTIMULATING, PROPERTY_ANTIHALLUCINOGENIC),\ PROPERTY_ADDICTIVE = list(PROPERTY_PSYCHOSTIMULATING, PROPERTY_NEUROTOXIC),\ - PROPERTY_CIPHERING_PREDATOR = list(PROPERTY_CIPHERING, PROPERTY_CROSSMETABOLIZING)) + PROPERTY_CIPHERING_PREDATOR = list(PROPERTY_CIPHERING, PROPERTY_CROSSMETABOLIZING),\ + PROPERTY_FIRE_PENETRATING = list(PROPERTY_OXYGENATING, PROPERTY_VISCOUS),\ + PROPERTY_BONEMENDING = list(PROPERTY_HYPERDENSIFICATING, PROPERTY_NUTRITIOUS)) var/datum/chem_property/match var/datum/chem_property/initial_property for(var/datum/chem_property/P in properties) From e8bf8f6ba38d53055eb503285826afddcbd8c0db Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 1 May 2024 16:45:10 -0400 Subject: [PATCH 02/69] Update other.dm --- code/modules/reagents/chemistry_reagents/other.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/reagents/chemistry_reagents/other.dm b/code/modules/reagents/chemistry_reagents/other.dm index dc70d65452fe..86002a65d98f 100644 --- a/code/modules/reagents/chemistry_reagents/other.dm +++ b/code/modules/reagents/chemistry_reagents/other.dm @@ -254,7 +254,7 @@ color = "#484848" // rgb: 72, 72, 72 overdose = REAGENTS_OVERDOSE chemclass = CHEM_CLASS_BASIC - properties = list(PROPERTY_NEUROTOXIC = 4) + properties = list(PROPERTY_NEUROTOXIC = 4, PROPERTY_NEUROCRYOGENIC = 1, PROPERTY_DISRUPTING = 1) /datum/reagent/sulfur name = "Sulfur" @@ -310,7 +310,7 @@ overdose = REAGENTS_OVERDOSE overdose_critical = REAGENTS_OVERDOSE_CRITICAL chemclass = CHEM_CLASS_BASIC - properties = list(PROPERTY_TOXIC = 1) + properties = list(PROPERTY_TOXIC = 1, PROPERTY_NEUTRALIZING = 1) /datum/reagent/sodium name = "Sodium" @@ -380,7 +380,7 @@ reagent_state = SOLID color = "#C7C7C7" // rgb: 199,199,199 chemclass = CHEM_CLASS_BASIC - properties = list(PROPERTY_CARCINOGENIC = 2) + properties = list(PROPERTY_CARCINOGENIC = 2, PROPERTY_HEMORRAGING = 1) /datum/reagent/thermite name = "Thermite" From 73e887fbd0f070da235dab7f824ea7673df26f97 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 1 May 2024 16:45:25 -0400 Subject: [PATCH 03/69] Update other.dm --- .../reagents/chemistry_reagents/other.dm | 1555 ++++++----------- 1 file changed, 497 insertions(+), 1058 deletions(-) diff --git a/code/modules/reagents/chemistry_reagents/other.dm b/code/modules/reagents/chemistry_reagents/other.dm index 86002a65d98f..eb4810b1774a 100644 --- a/code/modules/reagents/chemistry_reagents/other.dm +++ b/code/modules/reagents/chemistry_reagents/other.dm @@ -1,1071 +1,510 @@ +/datum/chem_property/negative + rarity = PROPERTY_DISABLED + category = PROPERTY_TYPE_TOXICANT + value = -2 + +/datum/chem_property/negative/process(mob/living/M, potency = 1, delta_time) + M.last_damage_data = create_cause_data("Harmful substance", holder.last_source_mob?.resolve()) + +/datum/chem_property/negative/hypoxemic + name = PROPERTY_HYPOXEMIC + code = "HPX" + description = "Reacts with hemoglobin in red blood cells preventing oxygen from being absorbed, resulting in hypoxemia." + rarity = PROPERTY_COMMON + value = -1 + +/datum/chem_property/negative/hypoxemic/process(mob/living/M, potency = 1, delta_time) + ..() + M.apply_damage(POTENCY_MULTIPLIER_MEDIUM * potency, OXY) + if(prob(10)) + M.emote("gasp") + +/datum/chem_property/negative/hypoxemic/process_overdose(mob/living/M, potency = 1) + M.apply_damages(potency, 0, potency) + M.apply_damage(POTENCY_MULTIPLIER_VHIGH * potency, OXY) + +/datum/chem_property/negative/hypoxemic/process_critical(mob/living/M, potency = 1) + M.apply_damages(POTENCY_MULTIPLIER_VHIGH * potency, 0, POTENCY_MULTIPLIER_MEDIUM*potency) + +/datum/chem_property/negative/toxic + name = PROPERTY_TOXIC + code = "TXC" + description = "Poisonous substance which causes harm on contact with or through absorption by organic tissues, resulting in bad health or severe illness." + rarity = PROPERTY_COMMON + starter = TRUE + value = -1 + +/datum/chem_property/negative/toxic/process(mob/living/M, potency = 1, delta_time) + ..() + M.apply_damage(0.5 * potency * delta_time, TOX) + +/datum/chem_property/negative/toxic/process_overdose(mob/living/M, potency = 1, delta_time) + M.apply_damage(potency * delta_time, TOX) + +/datum/chem_property/negative/toxic/process_critical(mob/living/M, potency = 1) + M.apply_damage(potency * POTENCY_MULTIPLIER_VHIGH, TOX) + +/datum/chem_property/negative/toxic/reaction_obj(obj/O, volume, potency = 1) + if(istype(O,/obj/effect/alien/weeds/)) + var/obj/effect/alien/weeds/alien_weeds = O + alien_weeds.take_damage(25 * potency) // Kills alien weeds on touch + return + if(istype(O,/obj/effect/glowshroom)) + qdel(O) + return + if(istype(O,/obj/effect/plantsegment)) + if(prob(50)) qdel(O) + return + if(istype(O,/obj/structure/machinery/portable_atmospherics/hydroponics)) + var/obj/structure/machinery/portable_atmospherics/hydroponics/tray = O -//*****************************************************************************************************/ -//********************************************Blood****************************************************/ -//*****************************************************************************************************/ - -/datum/reagent/blood - name = "Blood" - id = "blood" - description = "Blood is classified as a connective tissue and consists of two main components: Plasma, which is a clear extracellular fluid. Formed elements, which are made up of the blood cells and platelets." - reagent_state = LIQUID - color = "#A10808" - data_properties = new/list("blood_type"=null,"blood_color"= "#A10808","viruses"=null,"resistances"=null) - chemclass = CHEM_CLASS_RARE - - -/datum/reagent/blood/reaction_mob(mob/M, method=TOUCH, volume, permeable) - var/datum/reagent/blood/self = src - src = null - if(self.data_properties && self.data_properties["viruses"]) - for(var/datum/disease/D in self.data_properties["viruses"]) - //var/datum/disease/virus = new D.type(0, D, 1) - // We don't spread. - if(D.spread_type == SPECIAL || D.spread_type == NON_CONTAGIOUS) continue - - if(method == TOUCH) - M.contract_disease(D) - else //injected - M.contract_disease(D, 1, 0) - - -/datum/reagent/blood/reaction_turf(turf/T, volume)//splash the blood all over the place - if(!istype(T)) return - var/datum/reagent/blood/self = src - src = null - if(!(volume >= 3)) return - - T.add_blood(self.color) - - - -/datum/reagent/blood/yaut_blood - name = "Green Blood" - id = "greenblood" - description = "A thick green blood, definitely not human." - color = BLOOD_COLOR_YAUTJA - chemclass = CHEM_CLASS_SPECIAL - objective_value = OBJECTIVE_HIGH_VALUE - -/datum/reagent/blood/synth_blood - name = "Synthetic Blood" - id = "whiteblood" - color = BLOOD_COLOR_SYNTHETIC - description = "A synthetic blood-like liquid used by all Synthetics. Very effective as a medium for liquid cooling of electronics." - chemclass = CHEM_CLASS_NONE - -/datum/reagent/blood/zomb_blood - name = "Grey Blood" - id = "greyblood" - color = "#333333" - description = "A greyish liquid with the same consistency as blood." - chemclass = CHEM_CLASS_NONE - -/datum/reagent/blood/xeno_blood - name = "Acidic Blood" - id = "xenoblood" - color = BLOOD_COLOR_XENO - description = "A corrosive blood like substance. Makeup appears to be made out of acids and blood plasma." - chemclass = CHEM_CLASS_SPECIAL - objective_value = OBJECTIVE_HIGH_VALUE - properties = list(PROPERTY_CORROSIVE = 3) - -/datum/reagent/blood/xeno_blood/royal - name = "Dark Acidic Blood" - id = "xenobloodroyal" - color = BLOOD_COLOR_XENO_ROYAL - chemclass = CHEM_CLASS_SPECIAL - objective_value = OBJECTIVE_EXTREME_VALUE - properties = list(PROPERTY_CORROSIVE = 6) - -/datum/reagent/vaccine - //data must contain virus type - name = "Vaccine" - id = "vaccine" - reagent_state = LIQUID - color = "#C81040" // rgb: 200, 16, 64 - properties = list(PROPERTY_CURING = 4) - -/datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, volume, permeable) - if(has_species(M,"Horror")) + if(!tray.seed) + return + tray.health -= rand(30,50) + if(tray.pestlevel > 0) + tray.pestlevel -= 2 + if(tray.weedlevel > 0) + tray.weedlevel -= 3 + tray.toxins += 4 + tray.check_level_sanity() + tray.update_icon() + +/datum/chem_property/negative/toxic/reaction_mob(mob/living/M, method=TOUCH, volume, potency = 1) + if(!iscarbon(M)) return - var/datum/reagent/vaccine/self = src - src = null - if(self.data_properties && method == INGEST) - for(var/datum/disease/D in M.viruses) - if(istype(D, /datum/disease/advance)) - var/datum/disease/advance/A = D - if(A.GetDiseaseID() == self.data_properties) - D.cure() - else - if(D.type == self.data_properties) - D.cure() - - M.resistances += self.data_properties - return - -/datum/reagent/water - name = "Water" - id = "water" - description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen. It is a vital component to all known forms of organic life, even though it provides no calories or organic nutrients. It is also an effective solvent and can be used for cleaning." - reagent_state = LIQUID - color = "#0064C8" // rgb: 0, 100, 200 - custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) - chemclass = CHEM_CLASS_BASIC - chemfiresupp = TRUE - intensitymod = -3 - -/datum/reagent/water/reaction_turf(turf/T, volume) - if(!istype(T)) return - src = null - if(volume >= 3) - T.wet_floor(FLOOR_WET_WATER) - -/datum/reagent/water/reaction_obj(obj/O, volume) - src = null - O.extinguish() - -/datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume, permeable)//Splashing people with water can help put them out! + var/mob/living/carbon/C = M + if(C.wear_mask) // Wearing a mask + return + C.apply_damage(potency, TOX) // applies potency toxin damage + +/datum/chem_property/negative/corrosive + name = PROPERTY_CORROSIVE + code = "CRS" + description = "Damages or destroys other substances on contact through a chemical reaction. Causes chemical burns on contact with living tissue." + rarity = PROPERTY_COMMON + starter = TRUE + value = 1 //has a combat use + cost_penalty = FALSE + +/datum/chem_property/negative/corrosive/process(mob/living/M, potency = 1, delta_time) + ..() + M.take_limb_damage(0, 0.5 * potency * delta_time) + +/datum/chem_property/negative/corrosive/process_overdose(mob/living/M, potency = 1) + M.take_limb_damage(0,POTENCY_MULTIPLIER_MEDIUM*potency) + +/datum/chem_property/negative/corrosive/process_critical(mob/living/M, potency = 1) + M.take_limb_damage(0,POTENCY_MULTIPLIER_VHIGH*potency) + +/datum/chem_property/negative/corrosive/reaction_mob(mob/living/M, method=TOUCH, volume, potency) //from sacid + var/meltprob = potency * POTENCY_MULTIPLIER_HIGH if(!istype(M, /mob/living)) return if(method == TOUCH) - M.adjust_fire_stacks(-(volume / 10)) - if(M.fire_stacks <= 0) - M.ExtinguishMob() - -/datum/reagent/water/holywater - name = "Holy Water" - id = "holywater" - description = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality." - color = "#E0E8EF" // rgb: 224, 232, 239 - chemclass = CHEM_CLASS_NONE - -/datum/reagent/plasticide - name = "Plasticide" - id = "plasticide" - description = "Liquid plastic. Not safe to eat." - reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 - custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) - properties = list(PROPERTY_TOXIC = 1) - -/datum/reagent/space_drugs - name = "Space drugs" - id = "space_drugs" - description = "An illegal compound that causes hallucinations, visual artefacts and loss of balance." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_UNCOMMON - properties = list(PROPERTY_HALLUCINOGENIC = 2) - -/datum/reagent/sleen - name = "Sleen" - id = "sleen" - description = " A favorite of marine medics, it is an illicit mixture of name brand lime soda and oxycodone, known for it's distinct red hue. Overdosing can cause hallucinations, loss of coordination, seizures, brain damage, respiratory failure, and death." - reagent_state = LIQUID - color = "#C21D24" // rgb: 194, 29, 36 - overdose = MED_REAGENTS_OVERDOSE - overdose_critical = MED_REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_UNCOMMON - properties = list(PROPERTY_PAINKILLING = 6) - -/datum/reagent/serotrotium - name = "Serotrotium" - id = "serotrotium" - description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." - reagent_state = LIQUID - color = "#202040" // rgb: 20, 20, 40 - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - properties = list(PROPERTY_ALLERGENIC = 2) - -/datum/reagent/oxygen - name = "Oxygen" - id = "oxygen" - description = "Chemical element of atomic number 8. It is an oxidizing agent that forms oxides with most elements and many other compounds. Dioxygen is used in cellular respiration and is nessesary to sustain organic life." - reagent_state = GAS - color = COLOR_GRAY - chemfiresupp = TRUE - properties = list(PROPERTY_OXIDIZING = 2) - intensitymod = 0.75 - radiusmod = -0.08 - burncolor = "#58daff" - burncolormod = 2 - chemclass = CHEM_CLASS_BASIC - custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) - -/datum/reagent/copper - name = "Copper" - id = "copper" - description = "Chemical element of atomic number 29. A solfe malleable red metal with high thermal and electrical conductivity." - color = "#6E3B08" // rgb: 110, 59, 8 - chemfiresupp = TRUE - burncolor = "#78be5a" - burncolormod = 4 - chemclass = CHEM_CLASS_BASIC - - custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) - -/datum/reagent/nitrogen - name = "Nitrogen" - id = "nitrogen" - description = "Chemical element of atomic number 7. Liquid nitrogen is commonly used in cryogenics, with its melting point of 63.15 kelvin. Nitrogen is a component of many explosive compounds and fertilizers." - reagent_state = GAS - color = COLOR_GRAY - chemclass = CHEM_CLASS_BASIC - - custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) - - -/datum/reagent/hydrogen - name = "Hydrogen" - id = "hydrogen" - description = "Chemical element of atomic number 1. Is the most abundant chemical element in the Universe. Liquid hydrogen was used as one of the first fuel sources for space travel. Very combustible and is used in many chemical reactions." - reagent_state = GAS - color = COLOR_GRAY - chemfiresupp = TRUE - durationmod = -0.5 - radiusmod = 0.2 - intensitymod = -0.5 - burncolor = "#b6f8ff" - burncolormod = 2 - explosive = TRUE - power = 0.15 - chemclass = CHEM_CLASS_BASIC - - custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) - -/datum/reagent/potassium - name = "Potassium" - id = "potassium" - description = "Chemical element of atomic number 19. Is a soft and highly reactive metal and causes an extremely violent exothermic reaction with water." - reagent_state = SOLID - color = "#A0A0A0" // rgb: 160, 160, 160 - chemclass = CHEM_CLASS_BASIC - - custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) - -/datum/reagent/mercury - name = "Mercury" - id = "mercury" - description = "Chemical element of atomic number 80. It is the only elemental metal that is liquid at room temperature. Used in many industrial chemical purposes. The low vapor pressure of mercury causes it to create toxic fumes. Mercury poisoning is extremely dangerous and can cause large amounts of brain damage." - reagent_state = LIQUID - color = "#484848" // rgb: 72, 72, 72 - overdose = REAGENTS_OVERDOSE - chemclass = CHEM_CLASS_BASIC - properties = list(PROPERTY_NEUROTOXIC = 4, PROPERTY_NEUROCRYOGENIC = 1, PROPERTY_DISRUPTING = 1) - -/datum/reagent/sulfur - name = "Sulfur" - id = "sulfur" - description = "Chemical element of atomic number 16. Sulfur is an essential element for all life, as a component in amino acids and vitamins. Industrial uses of sulfur include the production of gunpowder and sulfuric acid." - reagent_state = SOLID - color = "#BF8C00" // rgb: 191, 140, 0 - chemclass = CHEM_CLASS_BASIC - - custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) - -/datum/reagent/carbon - name = "Carbon" - id = "carbon" - description = "Chemical element of atomic number 6. A very abundant element that occurs in all known organic life and in more than half of all known compounds. Used as fuel, in the production of steel, for nanotechnology and many other industrial purposes." - reagent_state = SOLID - color = "#1C1300" // rgb: 30, 20, 0 - chemfiresupp = TRUE - durationmod = 1 - burncolor = "#ffd700" - burncolormod = 3 - chemclass = CHEM_CLASS_BASIC - - custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) - -/datum/reagent/carbon/reaction_turf(turf/T, volume) - src = null - if(!istype(T, /turf/open/space)) - var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, T) - if(!dirtoverlay) - dirtoverlay = new/obj/effect/decal/cleanable/dirt(T) - dirtoverlay.alpha = volume*30 - else - dirtoverlay.alpha = min(dirtoverlay.alpha+volume*30, 255) - -/datum/reagent/chlorine - name = "Chlorine" - id = "chlorine" - description = "Chemical element of atomic number 17. High concentrations of elemental chlorine is highly reactive and poisonous for all living organisms. Chlorine gas has been used as a chemical warfare agent. Industrially used in the production of disinfectants, medicines, plastics and purification of water." - reagent_state = GAS - color = COLOR_GRAY - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_BASIC - properties = list(PROPERTY_BIOCIDIC = 1) - -/datum/reagent/fluorine - name = "Fluorine" - id = "fluorine" - description = "Chemical element of atomic number 9. It is a very reactive and highly toxic pale yellow gas at standard conditions. Mostly used for medical and dental purposes." - reagent_state = GAS - color = COLOR_GRAY - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_BASIC - properties = list(PROPERTY_TOXIC = 1, PROPERTY_NEUTRALIZING = 1) - -/datum/reagent/sodium - name = "Sodium" - id = "sodium" - description = "Chemical element of atomic number 11. Pure it is a soft and very reactive metal. Many salt compounds contain sodium, such as sodium chloride and sodium bicarbonate. There are more uses for sodium as a salt than as a metal." - reagent_state = SOLID - color = COLOR_GRAY - chemclass = CHEM_CLASS_BASIC - - custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) - -/datum/reagent/phosphorus - name = "Phosphorus" - id = "phosphorus" - description = "Chemical element of atomic number 15. A highly reactive element, that is essential for life as a component of DNA, RNA and ATP. White phospherous is used in many types of tracer and incendiary munitions due to its smoke production and high flammability." - reagent_state = SOLID - color = "#832828" // rgb: 131, 40, 40 - chemfiresupp = TRUE - intensitymod = 1 - durationmod = 0.1 - radiusmod = -0.12 - burncolor = "#ffdba4" - burncolormod = 5 - chemclass = CHEM_CLASS_BASIC - - custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) - -/datum/reagent/lithium - name = "Lithium" - id = "lithium" - description = "Chemical element of atomic number 3. Is a soft alkali metal commonly used in the production of batteries. Highly reactive and flammable. Used as an antidepressant and for treating bipolar disorder." - reagent_state = SOLID - color = COLOR_GRAY - chemfiresupp = TRUE - intensitymod = 0.15 - burncolor = "#ff356f" - burncolormod = 5 - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_BASIC - properties = list(PROPERTY_OXIDIZING = 1, PROPERTY_PSYCHOSTIMULATING = 1) - -/datum/reagent/sugar - name = "Sugar" - id = "sugar" - description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste. The most simple form of sugar, glucose, is the only form of nutriment for red blood cells as they have no mitocondria. Sugar can therefore be used to improve blood regeneration as a nutriment, although ineffective." - reagent_state = SOLID - color = COLOR_WHITE - chemclass = CHEM_CLASS_BASIC - properties = list(PROPERTY_NUTRITIOUS = 1) - flags = REAGENT_TYPE_MEDICAL - -/datum/reagent/glycerol - name = "Glycerol" - id = "glycerol" - description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity, often used in medicines and beverages. Used in the production of plastic, nitroglycerin and other explosives." - reagent_state = LIQUID - color = COLOR_GRAY - chemclass = CHEM_CLASS_RARE - - custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) - -/datum/reagent/radium - name = "Radium" - id = "radium" - description = "Chemical element of atomic number 88. Radium is a highly radioactive metal that emits alpha and gamma radiation upon decay. Exposure to radium can cause cancer and other disorders." - reagent_state = SOLID - color = "#C7C7C7" // rgb: 199,199,199 - chemclass = CHEM_CLASS_BASIC - properties = list(PROPERTY_CARCINOGENIC = 2, PROPERTY_HEMORRAGING = 1) - -/datum/reagent/thermite - name = "Thermite" - id = "thermite" - description = "Thermite is a pyrotechnic composition of powdered iron oxides that is an extremely volatile explosive. It is used in hand grenades, incendiary bombs, for welding and ore processing." - reagent_state = SOLID - color = "#673910" // rgb: 103, 57, 16 - chemfiresupp = TRUE - burncolor = "#ffb300" - explosive = TRUE - power = 0.5 - falloff_modifier = 1 - chemclass = CHEM_CLASS_UNCOMMON - properties = list(PROPERTY_FUELING = 7, PROPERTY_OXIDIZING = 5, PROPERTY_VISCOUS = 4, PROPERTY_CORROSIVE = 2) - -/datum/reagent/thermite/reaction_turf(turf/T, volume) - src = null - if(istype(T, /turf/closed/wall)) - var/turf/closed/wall/W = T - W.thermite += volume - W.overlays += image('icons/effects/effects.dmi',icon_state = "#673910") - -/datum/reagent/virus_food - name = "Virus Food" - id = "virusfood" - description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce." - reagent_state = LIQUID - nutriment_factor = 2 * REAGENTS_METABOLISM - color = "#899613" // rgb: 137, 150, 19 - chemclass = CHEM_CLASS_RARE - properties = list(PROPERTY_NUTRITIOUS = 2) - -/datum/reagent/iron - name = "Iron" - id = "iron" - description = "Chemical element of atomic number 26. Has a broad range of uses in multiple industries particularly in engineering and construction. Iron is an important component of hemoglobin, the substance in red blood cells that carries oxygen. Overdosing on iron is extremely toxic." - reagent_state = SOLID - color = "#C8A5DC" // rgb: 200, 165, 220 - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_BASIC - properties = list(PROPERTY_HEMOGENIC = 3) - flags = REAGENT_TYPE_MEDICAL | REAGENT_SCANNABLE - -/datum/reagent/gold - name = "Gold" - id = "gold" - description = "Chemical element of atomic number 79. Gold is a dense, soft, shiny metal and the most malleable and ductile metal known. Used many industries including electronics, jewelry and medical." - reagent_state = SOLID - color = "#F7C430" // rgb: 247, 196, 48 - chemclass = CHEM_CLASS_RARE - -/datum/reagent/silver - name = "Silver" - id = "silver" - description = "Chemical element of atomic number 47. A soft, white, lustrous transition metal. Has the highest electrical conductivity of any element and the highest thermal conductivity of any metal." - reagent_state = SOLID - color = "#D0D0D0" // rgb: 208, 208, 208 - chemclass = CHEM_CLASS_RARE - -/datum/reagent/uranium - name ="Uranium" - id = "uranium" - description = "Chemical element of atomic number 92. A silvery-white metallic chemical element in the actinide series, weakly radioactive. Has been historically used for nuclear power and in the creation of nuclear bombs." - reagent_state = SOLID - color = "#B8B8C0" // rgb: 184, 184, 192 - chemclass = CHEM_CLASS_RARE - properties = list(PROPERTY_CARCINOGENIC = 2) - -/datum/reagent/uranium/reaction_turf(turf/T, volume) - src = null - if(volume >= 3) - if(!istype(T, /turf/open/space)) - var/obj/effect/decal/cleanable/greenglow/glow = locate(/obj/effect/decal/cleanable/greenglow, T) - if(!glow) - new /obj/effect/decal/cleanable/greenglow(T) - -/datum/reagent/aluminum - name = "Aluminum" - id = "aluminum" - description = "Chemical element of atomic number 13. A silvery-white soft metal of the boron group. Because of its low density it is often uses as a structural material in aircrafts." - reagent_state = SOLID - color = "#A8A8A8" // rgb: 168, 168, 168 - chemclass = CHEM_CLASS_BASIC - -/datum/reagent/silicon - name = "Silicon" - id = "silicon" - description = "Chemical element of atomic number 14. Commonly used as a semiconductor in electronics and is the main component of sand and glass." - reagent_state = SOLID - color = "#A8A8A8" // rgb: 168, 168, 168 - chemclass = CHEM_CLASS_BASIC - -/datum/reagent/fuel - name = "Welding fuel" - id = "fuel" - description = "Liquid industrial grade blowtorch fuel." - reagent_state = LIQUID - color = "#660000" // rgb: 102, 0, 0 - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemfiresupp = TRUE - //------------------// - intensityfire = BURN_LEVEL_TIER_1 - durationfire = BURN_TIME_TIER_1 - burn_sprite = "red" - rangefire = 4 - //------------------// - explosive = TRUE - power = 0.12 - falloff_modifier = -0.1 - burncolor = "#ff9900" - chemclass = CHEM_CLASS_RARE - properties = list(PROPERTY_FUELING = 5, PROPERTY_OXIDIZING = 3, PROPERTY_VISCOUS = 4, PROPERTY_TOXIC = 1) - -/datum/reagent/space_cleaner - name = "Space cleaner" - id = "cleaner" - description = "A synthetic cleaner that vaporizes quickly and isn't slippery like water. It is therefore used compound for cleaning in space and low gravity environments. Very effective at sterilizing surfaces." - reagent_state = LIQUID - color = "#A5F0EE" // rgb: 165, 240, 238 - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_UNCOMMON - -/datum/reagent/space_cleaner/reaction_obj(obj/O, volume) - if(istype(O, /obj/effect/decal/cleanable)) - var/obj/effect/decal/cleanable/C = O - C.cleanup_cleanable() - else if(O) - O.clean_blood() - -/datum/reagent/space_cleaner/reaction_turf(turf/T, volume) - if(volume >= 1 && istype(T)) - T.clean_cleanables() - -/datum/reagent/space_cleaner/reaction_mob(mob/M, method=TOUCH, volume, permeable) - if(iscarbon(M)) - var/mob/living/carbon/C = M - if(C.r_hand) - C.r_hand.clean_blood() - if(C.l_hand) - C.l_hand.clean_blood() - if(C.wear_mask) - if(C.wear_mask.clean_blood()) - C.update_inv_wear_mask(0) if(ishuman(M)) - var/mob/living/carbon/human/H = C + var/mob/living/carbon/human/H = M if(H.head) - if(H.head.clean_blood()) + if(prob(meltprob) && !H.head.unacidable) + to_chat(H, SPAN_DANGER("Your headgear melts away but protects you from the acid!")) + qdel(H.head) H.update_inv_head(0) - if(H.wear_suit) - if(H.wear_suit.clean_blood()) - H.update_inv_wear_suit(0) - else if(H.w_uniform) - if(H.w_uniform.clean_blood()) - H.update_inv_w_uniform(0) - if(H.shoes) - if(H.shoes.clean_blood()) - H.update_inv_shoes(0) - else - H.clean_blood(1) + H.update_hair(0) + else + to_chat(H, SPAN_WARNING("Your headgear protects you from the acid.")) return - M.clean_blood() - -/datum/reagent/cryptobiolin - name = "Cryptobiolin" - id = "cryptobiolin" - description = "A component to making spaceacilin." - reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_UNCOMMON - -/datum/reagent/impedrezene - name = "Impedrezene" - id = "impedrezene" - description = "Impedrezene is a narcotic that impedes one's neural abilities by slowing down the higher brain cell functions. Can cause serious brain damage." - reagent_state = LIQUID - color = "#C8A5DC" // rgb: 200, 165, 220 - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_UNCOMMON - properties = list(PROPERTY_NEUROTOXIC = 2, PROPERTY_RELAXING = 1) - -//*****************************************************************************************************/ - -/datum/reagent/oxidizing_agent - name = "Oxidizing Agent" - id = "oxidizing_agent" - description = "A synthesized, highly-refined oxidizing agent that is most likely extremely unhealthy for human consumption." - reagent_state = GAS - color = "#c4c4c4" - chemfiresupp = TRUE - properties = list(PROPERTY_OXIDIZING = 6) - intensitymod = 1 - radiusmod = -0.12 - burncolor = "#a9ecff" - burncolormod = 2 - chemclass = CHEM_CLASS_RARE - custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) - flags = REAGENT_NO_GENERATION - -/datum/reagent/xenomicrobes - name = "Xenomicrobes" - id = "xenomicrobes" - description = "Microbes with an entirely alien cellular structure." - reagent_state = LIQUID - color = "#535E66" // rgb: 83, 94, 102 - -/datum/reagent/xenomicrobes/reaction_mob(mob/M, method=TOUCH, volume, permeable) - src = null - if((prob(10) && method==TOUCH) || method==INGEST) - M.contract_disease(new /datum/disease/xeno_transformation(0),1) - -/datum/reagent/fluorosurfactant//foam precursor - name = "Fluorosurfactant" - id = "fluorosurfactant" - description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." - reagent_state = LIQUID - color = "#9E6B38" // rgb: 158, 107, 56 - chemclass = CHEM_CLASS_UNCOMMON - -/datum/reagent/foaming_agent// Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. - name = "Foaming agent" - id = "foaming_agent" - description = "An agent that yields metallic foam when mixed with light metal and a strong acid." - reagent_state = SOLID - color = "#664B63" // rgb: 102, 75, 99 - chemclass = CHEM_CLASS_UNCOMMON - -/datum/reagent/foaming_agent/stabilized - name = "Stabilized metallic foam" - id = "stablefoam" - description = "Stabilized metallic foam that solidifies when exposed to an open flame" - reagent_state = LIQUID - color = "#d4b8d1" - chemclass = CHEM_CLASS_UNCOMMON - properties = list(PROPERTY_TOXIC = 8) - -/datum/reagent/nicotine - name = "Nicotine" - id = "nicotine" - description = "A legal highly addictive stimulant extracted from the tobacco plant. It is one of the most commonly abused drugs." - reagent_state = LIQUID - color = "#181818" // rgb: 24, 24, 24 - chemclass = CHEM_CLASS_RARE - flags = REAGENT_SCANNABLE - -/datum/reagent/ammonia - name = "Ammonia" - id = "ammonia" - description = "A caustic substance commonly used in fertilizers or household cleaners." - reagent_state = GAS - color = "#404030" // rgb: 64, 64, 48 - chemclass = CHEM_CLASS_COMMON - -/datum/reagent/hexamine - name = "Hexamine" - id = "hexamine" - description = "A crystalline compound that sees many uses varying from food additives, making plastics, treating urinary tract infections, as a smokeless heating element in military rations, and the creation of several explosives." - reagent_state = SOLID - color = "#F0F0F0" - chemfiresupp = TRUE - durationmod = 0.5 - burncolor = "#ff9900" - chemclass = CHEM_CLASS_UNCOMMON - -/datum/reagent/ultraglue - name = "Ultra Glue" - id = "glue" - description = "An extremely powerful bonding agent." - color = "#FFFFCC" // rgb: 255, 255, 204 - -/datum/reagent/diethylamine - name = "Diethylamine" - id = "diethylamine" - description = "Diethylamine is used as a potent fertilizer and as an alternative to ammonia. Also used in the preparation rubber processing chemicals, agricultural chemicals, and pharmaceuticals." - reagent_state = LIQUID - color = "#604030" // rgb: 96, 64, 48 - chemclass = CHEM_CLASS_UNCOMMON - -/datum/reagent/blackgoo - name = "Black goo" - id = "blackgoo" - description = "A strange dark liquid of unknown origin and effect." - reagent_state = LIQUID - color = "#222222" - custom_metabolism = 100 //disappears immediately - properties = list(PROPERTY_RAVENING = 1) - -/datum/reagent/blackgoo/reaction_mob(mob/M, method=TOUCH, volume, permeable) - if(ishuman(M)) + + if(H.wear_mask) + if(prob(meltprob) && !H.wear_mask.unacidable) + to_chat(H, SPAN_DANGER("Your mask melts away but protects you from the acid!")) + qdel(H.wear_mask) + H.update_inv_wear_mask(0) + H.update_hair(0) + else + to_chat(H, SPAN_WARNING("Your mask protects you from the acid.")) + return + + if(H.glasses) + if(prob(meltprob) && !H.glasses.unacidable) + to_chat(H, SPAN_DANGER("Your glasses melts away!")) + qdel(H.glasses) + H.update_inv_glasses(0) + return + + if(!M.unacidable) //nothing left to melt, apply acid effects + if(istype(M, /mob/living/carbon/human) && volume >= 10) + var/mob/living/carbon/human/H = M + var/obj/limb/affecting = H.get_limb("head") + if(affecting) + if(affecting.take_damage(4, 2)) + H.UpdateDamageIcon() + if(prob(meltprob)) //Applies disfigurement + if(H.pain.feels_pain) + H.emote("scream") + H.status_flags |= DISFIGURED + H.name = H.get_visible_name() + else + M.take_limb_damage(min(6, volume)) + return + else + if(!M.unacidable) + M.take_limb_damage(min(6, volume)) + if(isxeno(M)) + var/mob/living/carbon/xenomorph/X = M + if(potency > POTENCY_MAX_TIER_1) //Needs level 7+ to have any effect + X.AddComponent(/datum/component/toxic_buildup, potency * volume * 0.25) + to_chat(X, SPAN_XENODANGER("The corrosive substance damages your carapace!")) + +/datum/chem_property/negative/corrosive/reaction_obj(obj/O, volume, potency) + if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(potency * 10)) + if(O.unacidable) + return + 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." + for(var/mob/M as anything in viewers(5, O)) + to_chat(M, SPAN_WARNING("\The [O] melts.")) + qdel(O) + +/datum/chem_property/negative/biocidic + name = PROPERTY_BIOCIDIC + code = "BCD" + description = "Ruptures cell membranes on contact, destroying most types of organic tissue." + rarity = PROPERTY_COMMON + starter = TRUE + value = -1 + +/datum/chem_property/negative/biocidic/process(mob/living/M, potency = 1, delta_time) + ..() + M.take_limb_damage(0.5 * potency * delta_time) + +/datum/chem_property/negative/biocidic/process_overdose(mob/living/M, potency = 1) + M.take_limb_damage(POTENCY_MULTIPLIER_MEDIUM * potency) + +/datum/chem_property/negative/biocidic/process_critical(mob/living/M, potency = 1) + M.take_limb_damage(POTENCY_MULTIPLIER_VHIGH * potency) + +/datum/chem_property/negative/paining + name = PROPERTY_PAINING + code = "PNG" + description = "Activates the somatosensory system causing neuropathic pain all over the body. Unlike nociceptive pain, this is not caused to any tissue damage and is solely perceptive." + rarity = PROPERTY_UNCOMMON + category = PROPERTY_TYPE_STIMULANT + value = -1 + +/datum/chem_property/negative/paining/on_delete(mob/living/M) + ..() + + M.pain.recalculate_pain() + +/datum/chem_property/negative/paining/process(mob/living/M, potency = 1, delta_time) + if(!(..())) + return + + M.pain.apply_pain(PROPERTY_PAINING_PAIN * potency) + +/datum/chem_property/negative/paining/process_overdose(mob/living/M, potency = 1, delta_time) + if(!(..())) + return + + M.pain.apply_pain(PROPERTY_PAINING_PAIN_OD * potency) + M.take_limb_damage(0.5 * potency * delta_time) + +/datum/chem_property/negative/paining/process_critical(mob/living/M, potency = 1) + M.take_limb_damage(POTENCY_MULTIPLIER_MEDIUM * potency) + +/datum/chem_property/negative/hemolytic + name = PROPERTY_HEMOLYTIC + code = "HML" + description = "Causes intravascular hemolysis, resulting in the destruction of erythrocytes (red blood cells) in the bloodstream. This can result in Hemoglobinemia, where a high concentration of hemoglobin is released into the blood plasma." + rarity = PROPERTY_UNCOMMON + +/datum/chem_property/negative/hemolytic/process(mob/living/M, potency = 1, delta_time) + if(!iscarbon(M)) + return + var/mob/living/carbon/C = M + ..() + C.blood_volume = max(C.blood_volume - POTENCY_MULTIPLIER_VHIGH * potency,0) + +/datum/chem_property/negative/hemolytic/process_overdose(mob/living/M, potency = 1, delta_time) + if(!iscarbon(M)) + return + var/mob/living/carbon/C = M + C.blood_volume = max(C.blood_volume - 4 * potency * delta_time, 0) + M.drowsyness = min(M.drowsyness + 0.5 * potency * delta_time, 15 * potency) + M.reagent_move_delay_modifier += potency + M.recalculate_move_delay = TRUE + if(prob(5 * delta_time)) + M.emote(pick("yawn","gasp")) + +/datum/chem_property/negative/hemolytic/process_critical(mob/living/M, potency = 1) + M.apply_damage(POTENCY_MULTIPLIER_VHIGH * potency, OXY) + +/datum/chem_property/negative/hemorrhaging + name = PROPERTY_HEMORRAGING + code = "HMR" + description = "Ruptures endothelial cells making up bloodvessels, causing blood to escape from the circulatory system." + rarity = PROPERTY_UNCOMMON + value = 2 + cost_penalty = FALSE + +/datum/chem_property/negative/hemorrhaging/process(mob/living/M, potency = 1, delta_time) + if(!ishuman(M)) + return + var/mob/living/carbon/human/H = M + var/obj/limb/L = pick(H.limbs) + if(!L || L.status & (LIMB_ROBOT|LIMB_SYNTHSKIN)) + return + ..() + if(prob(POTENCY_MULTIPLIER_VHIGH * potency)) + var/datum/wound/internal_bleeding/I = new (0) + L.add_bleeding(I, TRUE) + L.wounds += I + if(prob(POTENCY_MULTIPLIER_VHIGH * potency)) + spawn L.owner.emote("me", 1, "coughs up blood!") + L.owner.drip(10) + +/datum/chem_property/negative/hemorrhaging/process_overdose(mob/living/M, potency = 1, delta_time) + if(!ishuman(M)) + return + var/mob/living/carbon/human/H = M + var/obj/limb/L = pick(H.limbs) + if(L.internal_organs) + var/datum/internal_organ/O = pick(L.internal_organs)//Organs can't bleed, so we just damage them + O.take_damage(POTENCY_MULTIPLIER_LOW * potency) + +/datum/chem_property/negative/hemorrhaging/process_critical(mob/living/M, potency = 1, delta_time) + if(prob(10 * potency * delta_time) && ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.name == "Human") - H.contract_disease(new /datum/disease/black_goo) - -/datum/reagent/blackgoo/reaction_turf(turf/T, volume) - if(!istype(T)) return - if(volume < 3) return - if(!(locate(/obj/effect/decal/cleanable/blackgoo) in T)) - new /obj/effect/decal/cleanable/blackgoo(T) - - -// Chemfire supplements - -/datum/reagent/napalm - name = "Napalm" - id = "napalm" - description = "This will probably ignite before you get to read this." - reagent_state = LIQUID - color = "#ffb300" - chemfiresupp = TRUE - burncolor = "#D05006" - burn_sprite = "red" - properties = list(PROPERTY_OXIDIZING = 6, PROPERTY_FUELING = 7, PROPERTY_FLOWING = 1) - -/datum/reagent/napalm/sticky - name = "Sticky-Napalm" - id = "stickynapalm" - description = "A custom napalm mix, stickier and lasts longer but lower damage" - reagent_state = LIQUID - color = "#f8e3b2" - burncolor = "#f8e3b2" - burn_sprite = "dynamic" - intensitymod = -1.5 - durationmod = -5 - radiusmod = -0.5 - properties = list( - PROPERTY_INTENSITY = BURN_LEVEL_TIER_2, - PROPERTY_DURATION = BURN_TIME_TIER_5, - PROPERTY_RADIUS = 5, - ) - -/datum/reagent/napalm/high_damage - name = "High-Combustion Napalm Fuel" - id = "highdamagenapalm" - description = "A custom napalm mix, higher damage but not as sticky" - reagent_state = LIQUID - color = "#c51c1c" - burncolor = "#c51c1c" - burn_sprite = "dynamic" - intensitymod = -4.5 - durationmod = -1 - radiusmod = -0.5 - properties = list( - PROPERTY_INTENSITY = BURN_LEVEL_TIER_8, - PROPERTY_DURATION = BURN_TIME_TIER_1, - PROPERTY_RADIUS = 5, - ) - -// This is the regular flamer fuel and pyro regular flamer fuel. -/datum/reagent/napalm/ut - name = "UT-Napthal Fuel" - id = "utnapthal" - description = "Known as Ultra Thick Napthal Fuel, a sticky combustible liquid chemical, typically used with flamethrowers." - burncolor = "#EE6515" - properties = list( - PROPERTY_INTENSITY = BURN_LEVEL_TIER_5, - PROPERTY_DURATION = BURN_TIME_TIER_2, - PROPERTY_RADIUS = 5, - ) - -// This is gellie fuel. Green Flames. -/datum/reagent/napalm/gel - name = "Napalm B-Gel" - id = "napalmgel" - description = "Unlike its liquid contemporaries, this gelled variant of napalm is easily extinguished, but shoots far and lingers on the ground in a viscous mess, while reacting with inorganic materials to ignite them." - flameshape = FLAMESHAPE_LINE - color = COLOR_GREEN - burncolor = COLOR_GREEN - burn_sprite = "green" - properties = list( - PROPERTY_INTENSITY = BURN_LEVEL_TIER_2, - PROPERTY_DURATION = BURN_TIME_TIER_5, - PROPERTY_RADIUS = 7, - ) - fire_type = FIRE_VARIANT_TYPE_B //Armor Shredding Greenfire - -// This is the blue flamer fuel for the pyro. -/datum/reagent/napalm/blue - name = "Napalm X" - id = "napalmx" - description = "A sticky combustible liquid chemical that burns extremely hot." - color = "#00b8ff" - burncolor = "#00b8ff" - burn_sprite = "blue" - properties = list( - PROPERTY_INTENSITY = BURN_LEVEL_TIER_7, - PROPERTY_DURATION = BURN_TIME_TIER_4, - PROPERTY_RADIUS = 6, - ) - -// This is the green flamer fuel for the pyro. -/datum/reagent/napalm/green - name = "Napalm B" - id = "napalmb" - description = "A special variant of napalm that's unable to cling well to anything, but disperses over a wide area while burning slowly. The composition reacts with inorganic materials to ignite them, causing severe damage." - flameshape = FLAMESHAPE_TRIANGLE - color = COLOR_GREEN - burncolor = COLOR_GREEN - burn_sprite = "green" - properties = list( - PROPERTY_INTENSITY = BURN_LEVEL_TIER_2, - PROPERTY_DURATION = BURN_TIME_TIER_5, - PROPERTY_RADIUS = 6, - ) - fire_type = FIRE_VARIANT_TYPE_B //Armor Shredding Greenfire - -/datum/reagent/napalm/penetrating - name = "Napalm E" - id = "napalme" - description = "A sticky combustible liquid chemical that penetrates the best fire retardants." - color = COLOR_PURPLE - burncolor = COLOR_PURPLE - burn_sprite = "dynamic" - properties = list( - PROPERTY_INTENSITY = BURN_LEVEL_TIER_2, - PROPERTY_DURATION = BURN_TIME_TIER_5, - PROPERTY_RADIUS = 6, - PROPERTY_FIRE_PENETRATING = 1, - ) - -/datum/reagent/napalm/deathsquad //version of fuel for dsquad flamers. - name = "Napalm EX" - id = "napalmex" - description = "A sticky combustible liquid chemical made up of a combonation of rare and dangerous reagents both that penetrates the best fire retardants, and burns extremely hot." - color = "#641dd6" - burncolor = "#641dd6" - burn_sprite = "dynamic" - properties = list( - PROPERTY_INTENSITY = BURN_LEVEL_TIER_7, - PROPERTY_DURATION = BURN_TIME_TIER_4, - PROPERTY_RADIUS = 6, - PROPERTY_FIRE_PENETRATING = 1 - ) - -/datum/reagent/napalm/upp - name = "R189" - id = "R189" - description = "A UPP chemical, it burns at an extremely high tempature and is designed to melt directly through fortified positions or bunkers." - color = "#ffe49c" - burncolor = "#ffe49c" - burn_sprite = "dynamic" - properties = list( - PROPERTY_INTENSITY = BURN_LEVEL_TIER_9, - PROPERTY_DURATION = BURN_TIME_TIER_3, - PROPERTY_RADIUS = 6, - PROPERTY_FIRE_PENETRATING = 1, - ) - -/datum/reagent/chlorinetrifluoride - name = "Chlorine Trifluoride" - id = "chlorine trifluoride" - description = "A highly reactive interhalogen compound capaple of self ignition. A very strong oxidizer and is extremely reactive with most organic and inorganic materials." - reagent_state = LIQUID - color = COLOR_CYAN - custom_metabolism = 100 - chemfiresupp = TRUE - burncolor = "#ff9300" - chemclass = CHEM_CLASS_UNCOMMON - properties = list(PROPERTY_CORROSIVE = 8, PROPERTY_TOXIC = 6, PROPERTY_OXIDIZING = 9) - -/datum/reagent/chlorinetrifluoride/on_mob_life(mob/living/M) // Not a good idea, instantly messes you up from the inside out. - . = ..() - M.adjust_fire_stacks(max(M.fire_stacks, 15)) - M.IgniteMob(TRUE) - to_chat(M, SPAN_DANGER("It burns! It burns worse than you could ever have imagined!")) - -/datum/reagent/methane - name = "Methane" - id = "methane" - description = "An easily combustible hydrocarbon that can very rapidly expand a fire, even explosively at the right concentrations. It is used primarily as fuel to make heat and light or manufacturing of organic chemicals." - reagent_state = LIQUID - color = "#0064C8" - custom_metabolism = AMOUNT_PER_TIME(1, 5 SECONDS) - chemfiresupp = TRUE - burncolor = "#00a5ff" - burncolormod = 1.5 - explosive = TRUE - power = 0.15 - chemclass = CHEM_CLASS_COMMON - properties = list(PROPERTY_TOXIC = 2, PROPERTY_FLOWING = 3, PROPERTY_VISCOUS = 3, PROPERTY_FUELING = 2) - -//*****************************************************************************************************/ -//*****************************************Explosives**************************************************/ -//*****************************************************************************************************/ - -/datum/reagent/potassium_hydroxide - name = "Potassium hydroxide" - id = "potassium_hydroxide" - description = "This will probably explode before you manage to read this." - explosive = TRUE - power = 0.5 - -/datum/reagent/ammoniumnitrate - name = "Ammonium Nitrate" - id = "ammonium_nitrate" - description = "A white crystalline compound that is used in agriculture as a high-nitrogen fertilizer. On its own, ammonium nitrate is not explosive, but rapidly becomes so when mixed with fuel oil." - reagent_state = SOLID - color = "#E5E5E5" - explosive = TRUE - power = 0.4 - falloff_modifier = 1.5 - chemfiresupp = TRUE - durationmod = -0.2 - intensitymod = 0.5 - burncolor = "#ff9900" - -/datum/reagent/anfo - name = "Ammonium nitrate fuel oil" - id = "anfo" - color = "#E0E0E0" - description = "Ammonium nitrate fuel oil (ANFO) is a low cost bulk explosive commonly used for mining and construction operations." - explosive = TRUE - power = 1 - falloff_modifier = -0.6 - -/datum/reagent/nitroglycerin - name = "Nitroglycerin" - id = "nitroglycerin" - description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol. Despite being a highly volatile material, it is used for many medical purposes." - reagent_state = LIQUID - color = COLOR_GRAY - custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) - explosive = TRUE - power = 1 - falloff_modifier = -0.5 - -/datum/reagent/cyclonite - name = "Cyclonite" - id = "cyclonite" - description = "Cyclonite is a low sensitivity highly explosive compound, commonly known as RDX. It is considered as one of the most energetic military high explosives. It is also sometimes used as a rat poison by civilians." - reagent_state = SOLID - color = "#E3E0BA" - explosive = TRUE - power = 1.5 - falloff_modifier = -0.4 - -/datum/reagent/cyclonite/on_mob_life(mob/living/M) - . = ..() - M.apply_damage(1, TOX) - -/datum/reagent/octogen - name = "Octogen" - id = "octogen" - description = "Octogen, also known as HMX or Her Majesty's Explosive, is a powerful and relatively insensitive explosive. It is one of the most potent chemical explosives available, exceeding that of cyclonite (RDX)." - reagent_state = SOLID - color = "#F5F5F5" - explosive = TRUE - power = 2 - falloff_modifier = -0.2 - chemfiresupp = TRUE - properties = list(PROPERTY_OXIDIZING = 2) - -//*****************************************************************************************************/ -//****************************************Blood plasmas************************************************/ -//*****************************************************************************************************/ - -/datum/reagent/plasma - name = "plasma" - id = "plasma" - description = "A clear extracellular fluid separated from blood." - reagent_state = LIQUID - color = "#f1e8cf" - custom_metabolism = AMOUNT_PER_TIME(1, 5 SECONDS) - -/datum/reagent/plasma/pheromone - name = "Pheromone Plasma" - id = PLASMA_PHEROMONE - description = "A funny smelling plasma..." - color = "#a2e7d6" - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_SPECIAL - objective_value = OBJECTIVE_EXTREME_VALUE - properties = list(PROPERTY_HALLUCINOGENIC = 8, PROPERTY_NERVESTIMULATING = 6) - -/datum/reagent/plasma/chitin - name = "Chitin Plasma" - id = PLASMA_CHITIN - description = "A very thick fibrous plasma..." - color = "#6d7694" - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_SPECIAL - objective_value = OBJECTIVE_EXTREME_VALUE - properties = list(PROPERTY_HYPERDENSIFICATING = 1) - -/datum/reagent/plasma/catecholamine - name = "Catecholamine Plasma" - id = PLASMA_CATECHOLAMINE - description = "A red-ish plasma..." - color = "#cf7551" - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_SPECIAL - objective_value = OBJECTIVE_EXTREME_VALUE - properties = list(PROPERTY_PAINING = 2, PROPERTY_MUSCLESTIMULATING = 6) - -/datum/reagent/plasma/egg - name = "Egg Plasma" - id = PLASMA_EGG - description = "A white-ish plasma high with a high concentration of protein..." - color = "#c3c371" - overdose = 80 - overdose_critical = 100 - chemclass = CHEM_CLASS_SPECIAL - objective_value = OBJECTIVE_EXTREME_VALUE - properties = list(PROPERTY_HEMOSITIC = 4) - -/datum/reagent/plasma/egg/on_mob_life(mob/living/M) - . = ..() - if(!.) + var/obj/limb/L = pick(H.limbs) + var/datum/wound/internal_bleeding/I = new (0) + L.add_bleeding(I, TRUE) + L.wounds += I + +/datum/chem_property/negative/hemorrhaging/reaction_mob(mob/M, method = TOUCH, volume, potency) + M.AddComponent(/datum/component/healing_reduction, potency * volume * POTENCY_MULTIPLIER_VLOW) //deals brute DOT to humans, prevents healing for xenos + +/datum/chem_property/negative/carcinogenic + name = PROPERTY_CARCINOGENIC + code = "CRG" + description = "Penetrates the cell nucleus causing direct damage to the deoxyribonucleic acid in cells resulting in cancer and abnormal cell proliferation. In extreme cases causing hyperactive apoptosis and potentially atrophy." + rarity = PROPERTY_COMMON + +/datum/chem_property/negative/carcinogenic/process(mob/living/M, potency = 1, delta_time) + ..() + M.adjustCloneLoss(POTENCY_MULTIPLIER_LOW*potency) + +/datum/chem_property/negative/carcinogenic/process_overdose(mob/living/M, potency = 1) + M.adjustCloneLoss(POTENCY_MULTIPLIER_MEDIUM * potency) + +/datum/chem_property/negative/carcinogenic/process_critical(mob/living/M, potency = 1) + M.take_limb_damage(POTENCY_MULTIPLIER_MEDIUM * potency)//Hyperactive apoptosis + +/datum/chem_property/negative/hepatotoxic + name = PROPERTY_HEPATOTOXIC + code = "HPT" + description = "Damages hepatocytes in the liver, resulting in liver deterioration and eventually liver failure." + rarity = PROPERTY_UNCOMMON + +/datum/chem_property/negative/hepatotoxic/process(mob/living/M, potency = 1, delta_time) + if(!ishuman(M)) + return + ..() + M.apply_internal_damage(POTENCY_MULTIPLIER_LOW * potency, "liver") + +/datum/chem_property/negative/hepatotoxic/process_overdose(mob/living/M, potency = 1) + M.apply_damage(POTENCY_MULTIPLIER_MEDIUM * potency, TOX) + +/datum/chem_property/negative/hepatotoxic/process_critical(mob/living/M, potency = 1) + M.apply_damage(POTENCY_MULTIPLIER_VHIGH * potency, TOX) + +/datum/chem_property/negative/intravenous + name = PROPERTY_INTRAVENOUS + code = "INV" + description = "Due to chemical composition, this chemical can only be administered intravenously." + rarity = PROPERTY_COMMON + category = PROPERTY_TYPE_METABOLITE + max_level = 1 + +/datum/chem_property/negative/intravenous/reset_reagent() + holder.flags = initial(holder.flags) + return ..() + +/datum/chem_property/negative/intravenous/update_reagent() + holder.flags |= REAGENT_NOT_INGESTIBLE + return ..() + +/datum/chem_property/negative/nephrotoxic + name = PROPERTY_NEPHROTOXIC + code = "NPT" + description = "Causes deterioration and damage to podocytes in the kidney resulting in potential kidney failure." + rarity = PROPERTY_UNCOMMON + +/datum/chem_property/negative/nephrotoxic/process(mob/living/M, potency = 1, delta_time) + if(!ishuman(M)) + return + ..() + M.apply_internal_damage(POTENCY_MULTIPLIER_LOW * potency, "kidneys") + +/datum/chem_property/negative/nephrotoxic/process_overdose(mob/living/M, potency = 1) + M.apply_damage(POTENCY_MULTIPLIER_MEDIUM * potency, TOX) + +/datum/chem_property/negative/nephrotoxic/process_critical(mob/living/M, potency = 1) + M.apply_damage(POTENCY_MULTIPLIER_VHIGH * potency, TOX) + +/datum/chem_property/negative/pneumotoxic + name = PROPERTY_PNEUMOTOXIC + code = "PNT" + description = "Toxic substance which causes damage to connective tissue that forms the support structure (the interstitium) of the alveoli in the lungs." + rarity = PROPERTY_UNCOMMON + +/datum/chem_property/negative/pneumotoxic/process(mob/living/M, potency = 1, delta_time) + if(!ishuman(M)) + return + ..() + M.apply_internal_damage(POTENCY_MULTIPLIER_LOW * potency, "lungs") + +/datum/chem_property/negative/pneumotoxic/process_overdose(mob/living/M, potency = 1) + M.apply_damage(POTENCY_MULTIPLIER_MEDIUM * potency, OXY) + +/datum/chem_property/negative/pneumotoxic/process_critical(mob/living/M, potency = 1) + M.apply_damage(POTENCY_MULTIPLIER_VHIGH * potency, OXY) + +/datum/chem_property/negative/oculotoxic + name = PROPERTY_OCULOTOXIC + code = "OCT" + description = "Damages the photoreceptive cells in the eyes impairing neural transmissions to the brain, resulting in loss of sight or blindness." + rarity = PROPERTY_UNCOMMON + +/datum/chem_property/negative/oculotoxic/process(mob/living/M, potency = 1, delta_time) + if(!ishuman(M)) return + ..() + var/mob/living/carbon/human/H = M + var/datum/internal_organ/eyes/L = H.internal_organs_by_name["eyes"] + if(L) + L.take_damage(POTENCY_MULTIPLIER_LOW * potency) + +/datum/chem_property/negative/oculotoxic/process_overdose(mob/living/M, potency = 1, delta_time) + M.sdisabilities |= DISABILITY_BLIND + +/datum/chem_property/negative/oculotoxic/process_critical(mob/living/M, potency = 1) + M.apply_damage(POTENCY_MULTIPLIER_LOW * potency, BRAIN) + +/datum/chem_property/negative/cardiotoxic + name = PROPERTY_CARDIOTOXIC + code = "CDT" + description = "Attacks cardiomyocytes when passing through the heart in the bloodstream. This disrupts the cardiac cycle and can lead to cardiac arrest." + rarity = PROPERTY_COMMON + +/datum/chem_property/negative/cardiotoxic/process(mob/living/M, potency = 1, delta_time) + if(!ishuman(M)) + return + ..() + M.apply_internal_damage(POTENCY_MULTIPLIER_LOW * potency, "heart") + +/datum/chem_property/negative/cardiotoxic/process_overdose(mob/living/M, potency = 1) + M.apply_damage(POTENCY_MULTIPLIER_MEDIUM * potency, OXY) + +/datum/chem_property/negative/cardiotoxic/process_critical(mob/living/M, potency = 1) + M.apply_damage(POTENCY_MULTIPLIER_VHIGH * potency, OXY) + +/datum/chem_property/negative/neurotoxic + name = PROPERTY_NEUROTOXIC + code = "NRT" + description = "Breaks down neurons causing widespread damage to the central nervous system and brain functions. Exposure may cause disorientation or unconsciousness to affected persons." + rarity = PROPERTY_COMMON + category = PROPERTY_TYPE_TOXICANT|PROPERTY_TYPE_STIMULANT + cost_penalty = FALSE + +/datum/chem_property/negative/neurotoxic/process(mob/living/M, potency = 1) + M.apply_damage(POTENCY_MULTIPLIER_MEDIUM * potency, BRAIN) + +/datum/chem_property/negative/neurotoxic/process_overdose(mob/living/M, potency = 1) + M.apply_damage(POTENCY_MULTIPLIER_HIGH * potency, BRAIN) + M.jitteriness = min(M.jitteriness + potency, POTENCY_MULTIPLIER_HIGH * potency) + if(prob(50)) + M.drowsyness = min(M.drowsyness + potency, POTENCY_MULTIPLIER_HIGH * potency) + if(prob(10)) + M.emote("drool") + +/datum/chem_property/negative/neurotoxic/process_critical(mob/living/M, potency = 1) + if(prob(15*potency)) + apply_neuro(M, POTENCY_MULTIPLIER_MEDIUM * potency, FALSE) + +/datum/chem_property/negative/neurotoxic/reaction_mob(mob/M, method = TOUCH, volume, potency) if(ishuman(M)) var/mob/living/carbon/human/H = M - if((locate(/obj/item/alien_embryo) in H.contents) || (H.species.flags & IS_SYNTHETIC) || !H.huggable) - volume = 0 - return - if(volume < overdose_critical) - return - //it turns into an actual embryo at this point - volume = 0 - var/obj/item/alien_embryo/embryo = new /obj/item/alien_embryo(H) - if(data_properties && data_properties["hive_number"]) - embryo.hivenumber = data_properties["hive_number"] - else - embryo.hivenumber = XENO_HIVE_NORMAL - to_chat(H, SPAN_WARNING("Your stomach cramps and you suddenly feel very sick!")) - -/datum/reagent/plasma/neurotoxin - name = "Neurotoxin Plasma" - id = PLASMA_NEUROTOXIN - description = "A plasma containing an unknown but potent neurotoxin." - color = "#ba8216" - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_SPECIAL - objective_value = OBJECTIVE_EXTREME_VALUE - properties = list(PROPERTY_NEUROTOXIC = 4, PROPERTY_TOXIC = 1, PROPERTY_HALLUCINOGENIC = 6) - -/datum/reagent/plasma/antineurotoxin - name = "Anti-Neurotoxin" - id = "antineurotoxin" - description = "A counteragent to Neurotoxin Plasma." - color = "#afffc9" - chemclass = CHEM_CLASS_SPECIAL - objective_value = OBJECTIVE_MEDIUM_VALUE - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - properties = list(PROPERTY_NEUROSHIELDING = 1) - -/datum/reagent/plasma/purple - name = "Purple Plasma" - id = PLASMA_PURPLE - description = "A purple-ish plasma..." - color = "#a65d7f" - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_SPECIAL - objective_value = OBJECTIVE_EXTREME_VALUE - properties = list(PROPERTY_BIOCIDIC = 2) - -/datum/reagent/plasma/royal - name = "Royal Plasma" - id = PLASMA_ROYAL - description = "A dark purple-ish plasma..." - color = "#ffeb9c" - overdose = REAGENTS_OVERDOSE - overdose_critical = REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_SPECIAL - objective_value = OBJECTIVE_ABSOLUTE_VALUE - properties = list(PROPERTY_BIOCIDIC = 4, PROPERTY_ADDICTIVE = 1, PROPERTY_HALLUCINOGENIC = 4, PROPERTY_CIPHERING = 1) - -/datum/reagent/fruit_resin - name = "Fruit Resin" - id = "fruit_resin" - description = "A strange green fluid found in certain xenomorphic structures. Seems to have regenerative properties." - reagent_state = LIQUID - nutriment_factor = 15 * REAGENTS_METABOLISM - color = "#12911d" // rgb: 102, 67, 48 - overdose = MED_REAGENTS_OVERDOSE - overdose_critical = MED_REAGENTS_OVERDOSE_CRITICAL - chemclass = CHEM_CLASS_SPECIAL - properties = list(PROPERTY_TRANSFORMATIVE = 4, PROPERTY_NUTRITIOUS = 3, PROPERTY_HEMOGENIC = 1) - flags = REAGENT_SCANNABLE + H.apply_damage(potency, BRAIN) + to_chat(M, SPAN_WARNING("You start to go numb.")) + M.apply_effect(potency * volume * POTENCY_MULTIPLIER_LOW, DAZE) + +/datum/chem_property/negative/hypermetabolic + name = PROPERTY_HYPERMETABOLIC + code = "EMB" + description = "Takes less time for this chemical to metabolize, resulting in it being in the bloodstream for less time per unit." + rarity = PROPERTY_UNCOMMON + category = PROPERTY_TYPE_METABOLITE + +/datum/chem_property/negative/hypermetabolic/reset_reagent() + holder.custom_metabolism = initial(holder.custom_metabolism) + ..() + +/datum/chem_property/negative/hypermetabolic/update_reagent() + holder.custom_metabolism = holder.custom_metabolism * (1 + POTENCY_MULTIPLIER_VLOW * level) + ..() + +/datum/chem_property/negative/addictive + name = PROPERTY_ADDICTIVE + code = "ADT" + description = "Causes addiction. Higher potency results in a higher chance of causing an addiction when metabolized." + rarity = PROPERTY_RARE + category = PROPERTY_TYPE_STIMULANT + +/datum/chem_property/negative/addictive/process(mob/living/M, potency = 1, delta_time) + var/has_addiction + for(var/datum/disease/addiction/D in M.viruses) + if(D.chemical_id == holder.id) + D.handle_chem() + has_addiction = TRUE + break + if(!has_addiction) + var/datum/disease/addiction/D = new /datum/disease/addiction(holder.id, potency) + M.contract_disease(D, TRUE) + +/datum/chem_property/negative/addictive/process_overdose(mob/living/M, potency = 1, delta_time) + M.apply_damage(0.5 * potency * delta_time, BRAIN) + +/datum/chem_property/negative/addictive/process_critical(mob/living/M, potency = 1, delta_time) + M.disabilities |= NERVOUS + +//PROPERTY_DISABLED (in generation) +/datum/chem_property/negative/hemositic + name = PROPERTY_HEMOSITIC + code = "HST" + description = "The chemical shows parasitic behavior towards live erythrocytes (red blood cells) in order to produce more of itself." + rarity = PROPERTY_DISABLED + category = PROPERTY_TYPE_REACTANT|PROPERTY_TYPE_ANOMALOUS + value = 1 + +/datum/chem_property/negative/hemositic/pre_process(mob/living/M) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.species.flags & IS_SYNTHETIC) + return list(REAGENT_CANCEL = TRUE) + +/datum/chem_property/negative/hemositic/process(mob/living/M, potency = 1, delta_time) + if(!iscarbon(M)) + return + ..() + var/mob/living/carbon/C = M + C.blood_volume = max(C.blood_volume - POTENCY_MULTIPLIER_VHIGH * potency, 0) + holder.volume++ + +/datum/chem_property/negative/hemositic/process_overdose(mob/living/M, potency = 1, delta_time) + if(!iscarbon(M)) + return + var/mob/living/carbon/C = M + C.blood_volume = max(C.blood_volume-10*potency,0) + holder.volume += potency * POTENCY_MULTIPLIER_MEDIUM + +/datum/chem_property/negative/hemositic/process_critical(mob/living/M, potency = 1, delta_time) + M.disabilities |= NERVOUS From 2b60b53d55219fab30fad9ac7e691f3ac22e0998 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 1 May 2024 16:45:42 -0400 Subject: [PATCH 04/69] Update other.dm --- .../reagents/chemistry_reagents/other.dm | 1555 +++++++++++------ 1 file changed, 1058 insertions(+), 497 deletions(-) diff --git a/code/modules/reagents/chemistry_reagents/other.dm b/code/modules/reagents/chemistry_reagents/other.dm index eb4810b1774a..86002a65d98f 100644 --- a/code/modules/reagents/chemistry_reagents/other.dm +++ b/code/modules/reagents/chemistry_reagents/other.dm @@ -1,510 +1,1071 @@ -/datum/chem_property/negative - rarity = PROPERTY_DISABLED - category = PROPERTY_TYPE_TOXICANT - value = -2 - -/datum/chem_property/negative/process(mob/living/M, potency = 1, delta_time) - M.last_damage_data = create_cause_data("Harmful substance", holder.last_source_mob?.resolve()) - -/datum/chem_property/negative/hypoxemic - name = PROPERTY_HYPOXEMIC - code = "HPX" - description = "Reacts with hemoglobin in red blood cells preventing oxygen from being absorbed, resulting in hypoxemia." - rarity = PROPERTY_COMMON - value = -1 - -/datum/chem_property/negative/hypoxemic/process(mob/living/M, potency = 1, delta_time) - ..() - M.apply_damage(POTENCY_MULTIPLIER_MEDIUM * potency, OXY) - if(prob(10)) - M.emote("gasp") - -/datum/chem_property/negative/hypoxemic/process_overdose(mob/living/M, potency = 1) - M.apply_damages(potency, 0, potency) - M.apply_damage(POTENCY_MULTIPLIER_VHIGH * potency, OXY) - -/datum/chem_property/negative/hypoxemic/process_critical(mob/living/M, potency = 1) - M.apply_damages(POTENCY_MULTIPLIER_VHIGH * potency, 0, POTENCY_MULTIPLIER_MEDIUM*potency) - -/datum/chem_property/negative/toxic - name = PROPERTY_TOXIC - code = "TXC" - description = "Poisonous substance which causes harm on contact with or through absorption by organic tissues, resulting in bad health or severe illness." - rarity = PROPERTY_COMMON - starter = TRUE - value = -1 - -/datum/chem_property/negative/toxic/process(mob/living/M, potency = 1, delta_time) - ..() - M.apply_damage(0.5 * potency * delta_time, TOX) - -/datum/chem_property/negative/toxic/process_overdose(mob/living/M, potency = 1, delta_time) - M.apply_damage(potency * delta_time, TOX) - -/datum/chem_property/negative/toxic/process_critical(mob/living/M, potency = 1) - M.apply_damage(potency * POTENCY_MULTIPLIER_VHIGH, TOX) - -/datum/chem_property/negative/toxic/reaction_obj(obj/O, volume, potency = 1) - if(istype(O,/obj/effect/alien/weeds/)) - var/obj/effect/alien/weeds/alien_weeds = O - alien_weeds.take_damage(25 * potency) // Kills alien weeds on touch - return - if(istype(O,/obj/effect/glowshroom)) - qdel(O) - return - if(istype(O,/obj/effect/plantsegment)) - if(prob(50)) qdel(O) - return - if(istype(O,/obj/structure/machinery/portable_atmospherics/hydroponics)) - var/obj/structure/machinery/portable_atmospherics/hydroponics/tray = O - if(!tray.seed) - return - tray.health -= rand(30,50) - if(tray.pestlevel > 0) - tray.pestlevel -= 2 - if(tray.weedlevel > 0) - tray.weedlevel -= 3 - tray.toxins += 4 - tray.check_level_sanity() - tray.update_icon() - -/datum/chem_property/negative/toxic/reaction_mob(mob/living/M, method=TOUCH, volume, potency = 1) - if(!iscarbon(M)) +//*****************************************************************************************************/ +//********************************************Blood****************************************************/ +//*****************************************************************************************************/ + +/datum/reagent/blood + name = "Blood" + id = "blood" + description = "Blood is classified as a connective tissue and consists of two main components: Plasma, which is a clear extracellular fluid. Formed elements, which are made up of the blood cells and platelets." + reagent_state = LIQUID + color = "#A10808" + data_properties = new/list("blood_type"=null,"blood_color"= "#A10808","viruses"=null,"resistances"=null) + chemclass = CHEM_CLASS_RARE + + +/datum/reagent/blood/reaction_mob(mob/M, method=TOUCH, volume, permeable) + var/datum/reagent/blood/self = src + src = null + if(self.data_properties && self.data_properties["viruses"]) + for(var/datum/disease/D in self.data_properties["viruses"]) + //var/datum/disease/virus = new D.type(0, D, 1) + // We don't spread. + if(D.spread_type == SPECIAL || D.spread_type == NON_CONTAGIOUS) continue + + if(method == TOUCH) + M.contract_disease(D) + else //injected + M.contract_disease(D, 1, 0) + + +/datum/reagent/blood/reaction_turf(turf/T, volume)//splash the blood all over the place + if(!istype(T)) return + var/datum/reagent/blood/self = src + src = null + if(!(volume >= 3)) return + + T.add_blood(self.color) + + + +/datum/reagent/blood/yaut_blood + name = "Green Blood" + id = "greenblood" + description = "A thick green blood, definitely not human." + color = BLOOD_COLOR_YAUTJA + chemclass = CHEM_CLASS_SPECIAL + objective_value = OBJECTIVE_HIGH_VALUE + +/datum/reagent/blood/synth_blood + name = "Synthetic Blood" + id = "whiteblood" + color = BLOOD_COLOR_SYNTHETIC + description = "A synthetic blood-like liquid used by all Synthetics. Very effective as a medium for liquid cooling of electronics." + chemclass = CHEM_CLASS_NONE + +/datum/reagent/blood/zomb_blood + name = "Grey Blood" + id = "greyblood" + color = "#333333" + description = "A greyish liquid with the same consistency as blood." + chemclass = CHEM_CLASS_NONE + +/datum/reagent/blood/xeno_blood + name = "Acidic Blood" + id = "xenoblood" + color = BLOOD_COLOR_XENO + description = "A corrosive blood like substance. Makeup appears to be made out of acids and blood plasma." + chemclass = CHEM_CLASS_SPECIAL + objective_value = OBJECTIVE_HIGH_VALUE + properties = list(PROPERTY_CORROSIVE = 3) + +/datum/reagent/blood/xeno_blood/royal + name = "Dark Acidic Blood" + id = "xenobloodroyal" + color = BLOOD_COLOR_XENO_ROYAL + chemclass = CHEM_CLASS_SPECIAL + objective_value = OBJECTIVE_EXTREME_VALUE + properties = list(PROPERTY_CORROSIVE = 6) + +/datum/reagent/vaccine + //data must contain virus type + name = "Vaccine" + id = "vaccine" + reagent_state = LIQUID + color = "#C81040" // rgb: 200, 16, 64 + properties = list(PROPERTY_CURING = 4) + +/datum/reagent/vaccine/reaction_mob(mob/M, method=TOUCH, volume, permeable) + if(has_species(M,"Horror")) return - var/mob/living/carbon/C = M - if(C.wear_mask) // Wearing a mask - return - C.apply_damage(potency, TOX) // applies potency toxin damage - -/datum/chem_property/negative/corrosive - name = PROPERTY_CORROSIVE - code = "CRS" - description = "Damages or destroys other substances on contact through a chemical reaction. Causes chemical burns on contact with living tissue." - rarity = PROPERTY_COMMON - starter = TRUE - value = 1 //has a combat use - cost_penalty = FALSE - -/datum/chem_property/negative/corrosive/process(mob/living/M, potency = 1, delta_time) - ..() - M.take_limb_damage(0, 0.5 * potency * delta_time) - -/datum/chem_property/negative/corrosive/process_overdose(mob/living/M, potency = 1) - M.take_limb_damage(0,POTENCY_MULTIPLIER_MEDIUM*potency) - -/datum/chem_property/negative/corrosive/process_critical(mob/living/M, potency = 1) - M.take_limb_damage(0,POTENCY_MULTIPLIER_VHIGH*potency) - -/datum/chem_property/negative/corrosive/reaction_mob(mob/living/M, method=TOUCH, volume, potency) //from sacid - var/meltprob = potency * POTENCY_MULTIPLIER_HIGH + var/datum/reagent/vaccine/self = src + src = null + if(self.data_properties && method == INGEST) + for(var/datum/disease/D in M.viruses) + if(istype(D, /datum/disease/advance)) + var/datum/disease/advance/A = D + if(A.GetDiseaseID() == self.data_properties) + D.cure() + else + if(D.type == self.data_properties) + D.cure() + + M.resistances += self.data_properties + return + +/datum/reagent/water + name = "Water" + id = "water" + description = "A ubiquitous chemical substance that is composed of hydrogen and oxygen. It is a vital component to all known forms of organic life, even though it provides no calories or organic nutrients. It is also an effective solvent and can be used for cleaning." + reagent_state = LIQUID + color = "#0064C8" // rgb: 0, 100, 200 + custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) + chemclass = CHEM_CLASS_BASIC + chemfiresupp = TRUE + intensitymod = -3 + +/datum/reagent/water/reaction_turf(turf/T, volume) + if(!istype(T)) return + src = null + if(volume >= 3) + T.wet_floor(FLOOR_WET_WATER) + +/datum/reagent/water/reaction_obj(obj/O, volume) + src = null + O.extinguish() + +/datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume, permeable)//Splashing people with water can help put them out! if(!istype(M, /mob/living)) return if(method == TOUCH) + M.adjust_fire_stacks(-(volume / 10)) + if(M.fire_stacks <= 0) + M.ExtinguishMob() + +/datum/reagent/water/holywater + name = "Holy Water" + id = "holywater" + description = "An ashen-obsidian-water mix, this solution will alter certain sections of the brain's rationality." + color = "#E0E8EF" // rgb: 224, 232, 239 + chemclass = CHEM_CLASS_NONE + +/datum/reagent/plasticide + name = "Plasticide" + id = "plasticide" + description = "Liquid plastic. Not safe to eat." + reagent_state = LIQUID + color = "#CF3600" // rgb: 207, 54, 0 + custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) + properties = list(PROPERTY_TOXIC = 1) + +/datum/reagent/space_drugs + name = "Space drugs" + id = "space_drugs" + description = "An illegal compound that causes hallucinations, visual artefacts and loss of balance." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_UNCOMMON + properties = list(PROPERTY_HALLUCINOGENIC = 2) + +/datum/reagent/sleen + name = "Sleen" + id = "sleen" + description = " A favorite of marine medics, it is an illicit mixture of name brand lime soda and oxycodone, known for it's distinct red hue. Overdosing can cause hallucinations, loss of coordination, seizures, brain damage, respiratory failure, and death." + reagent_state = LIQUID + color = "#C21D24" // rgb: 194, 29, 36 + overdose = MED_REAGENTS_OVERDOSE + overdose_critical = MED_REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_UNCOMMON + properties = list(PROPERTY_PAINKILLING = 6) + +/datum/reagent/serotrotium + name = "Serotrotium" + id = "serotrotium" + description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans." + reagent_state = LIQUID + color = "#202040" // rgb: 20, 20, 40 + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + properties = list(PROPERTY_ALLERGENIC = 2) + +/datum/reagent/oxygen + name = "Oxygen" + id = "oxygen" + description = "Chemical element of atomic number 8. It is an oxidizing agent that forms oxides with most elements and many other compounds. Dioxygen is used in cellular respiration and is nessesary to sustain organic life." + reagent_state = GAS + color = COLOR_GRAY + chemfiresupp = TRUE + properties = list(PROPERTY_OXIDIZING = 2) + intensitymod = 0.75 + radiusmod = -0.08 + burncolor = "#58daff" + burncolormod = 2 + chemclass = CHEM_CLASS_BASIC + custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) + +/datum/reagent/copper + name = "Copper" + id = "copper" + description = "Chemical element of atomic number 29. A solfe malleable red metal with high thermal and electrical conductivity." + color = "#6E3B08" // rgb: 110, 59, 8 + chemfiresupp = TRUE + burncolor = "#78be5a" + burncolormod = 4 + chemclass = CHEM_CLASS_BASIC + + custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) + +/datum/reagent/nitrogen + name = "Nitrogen" + id = "nitrogen" + description = "Chemical element of atomic number 7. Liquid nitrogen is commonly used in cryogenics, with its melting point of 63.15 kelvin. Nitrogen is a component of many explosive compounds and fertilizers." + reagent_state = GAS + color = COLOR_GRAY + chemclass = CHEM_CLASS_BASIC + + custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) + + +/datum/reagent/hydrogen + name = "Hydrogen" + id = "hydrogen" + description = "Chemical element of atomic number 1. Is the most abundant chemical element in the Universe. Liquid hydrogen was used as one of the first fuel sources for space travel. Very combustible and is used in many chemical reactions." + reagent_state = GAS + color = COLOR_GRAY + chemfiresupp = TRUE + durationmod = -0.5 + radiusmod = 0.2 + intensitymod = -0.5 + burncolor = "#b6f8ff" + burncolormod = 2 + explosive = TRUE + power = 0.15 + chemclass = CHEM_CLASS_BASIC + + custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) + +/datum/reagent/potassium + name = "Potassium" + id = "potassium" + description = "Chemical element of atomic number 19. Is a soft and highly reactive metal and causes an extremely violent exothermic reaction with water." + reagent_state = SOLID + color = "#A0A0A0" // rgb: 160, 160, 160 + chemclass = CHEM_CLASS_BASIC + + custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) + +/datum/reagent/mercury + name = "Mercury" + id = "mercury" + description = "Chemical element of atomic number 80. It is the only elemental metal that is liquid at room temperature. Used in many industrial chemical purposes. The low vapor pressure of mercury causes it to create toxic fumes. Mercury poisoning is extremely dangerous and can cause large amounts of brain damage." + reagent_state = LIQUID + color = "#484848" // rgb: 72, 72, 72 + overdose = REAGENTS_OVERDOSE + chemclass = CHEM_CLASS_BASIC + properties = list(PROPERTY_NEUROTOXIC = 4, PROPERTY_NEUROCRYOGENIC = 1, PROPERTY_DISRUPTING = 1) + +/datum/reagent/sulfur + name = "Sulfur" + id = "sulfur" + description = "Chemical element of atomic number 16. Sulfur is an essential element for all life, as a component in amino acids and vitamins. Industrial uses of sulfur include the production of gunpowder and sulfuric acid." + reagent_state = SOLID + color = "#BF8C00" // rgb: 191, 140, 0 + chemclass = CHEM_CLASS_BASIC + + custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) + +/datum/reagent/carbon + name = "Carbon" + id = "carbon" + description = "Chemical element of atomic number 6. A very abundant element that occurs in all known organic life and in more than half of all known compounds. Used as fuel, in the production of steel, for nanotechnology and many other industrial purposes." + reagent_state = SOLID + color = "#1C1300" // rgb: 30, 20, 0 + chemfiresupp = TRUE + durationmod = 1 + burncolor = "#ffd700" + burncolormod = 3 + chemclass = CHEM_CLASS_BASIC + + custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) + +/datum/reagent/carbon/reaction_turf(turf/T, volume) + src = null + if(!istype(T, /turf/open/space)) + var/obj/effect/decal/cleanable/dirt/dirtoverlay = locate(/obj/effect/decal/cleanable/dirt, T) + if(!dirtoverlay) + dirtoverlay = new/obj/effect/decal/cleanable/dirt(T) + dirtoverlay.alpha = volume*30 + else + dirtoverlay.alpha = min(dirtoverlay.alpha+volume*30, 255) + +/datum/reagent/chlorine + name = "Chlorine" + id = "chlorine" + description = "Chemical element of atomic number 17. High concentrations of elemental chlorine is highly reactive and poisonous for all living organisms. Chlorine gas has been used as a chemical warfare agent. Industrially used in the production of disinfectants, medicines, plastics and purification of water." + reagent_state = GAS + color = COLOR_GRAY + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_BASIC + properties = list(PROPERTY_BIOCIDIC = 1) + +/datum/reagent/fluorine + name = "Fluorine" + id = "fluorine" + description = "Chemical element of atomic number 9. It is a very reactive and highly toxic pale yellow gas at standard conditions. Mostly used for medical and dental purposes." + reagent_state = GAS + color = COLOR_GRAY + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_BASIC + properties = list(PROPERTY_TOXIC = 1, PROPERTY_NEUTRALIZING = 1) + +/datum/reagent/sodium + name = "Sodium" + id = "sodium" + description = "Chemical element of atomic number 11. Pure it is a soft and very reactive metal. Many salt compounds contain sodium, such as sodium chloride and sodium bicarbonate. There are more uses for sodium as a salt than as a metal." + reagent_state = SOLID + color = COLOR_GRAY + chemclass = CHEM_CLASS_BASIC + + custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) + +/datum/reagent/phosphorus + name = "Phosphorus" + id = "phosphorus" + description = "Chemical element of atomic number 15. A highly reactive element, that is essential for life as a component of DNA, RNA and ATP. White phospherous is used in many types of tracer and incendiary munitions due to its smoke production and high flammability." + reagent_state = SOLID + color = "#832828" // rgb: 131, 40, 40 + chemfiresupp = TRUE + intensitymod = 1 + durationmod = 0.1 + radiusmod = -0.12 + burncolor = "#ffdba4" + burncolormod = 5 + chemclass = CHEM_CLASS_BASIC + + custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) + +/datum/reagent/lithium + name = "Lithium" + id = "lithium" + description = "Chemical element of atomic number 3. Is a soft alkali metal commonly used in the production of batteries. Highly reactive and flammable. Used as an antidepressant and for treating bipolar disorder." + reagent_state = SOLID + color = COLOR_GRAY + chemfiresupp = TRUE + intensitymod = 0.15 + burncolor = "#ff356f" + burncolormod = 5 + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_BASIC + properties = list(PROPERTY_OXIDIZING = 1, PROPERTY_PSYCHOSTIMULATING = 1) + +/datum/reagent/sugar + name = "Sugar" + id = "sugar" + description = "The organic compound commonly known as table sugar and sometimes called saccharose. This white, odorless, crystalline powder has a pleasing, sweet taste. The most simple form of sugar, glucose, is the only form of nutriment for red blood cells as they have no mitocondria. Sugar can therefore be used to improve blood regeneration as a nutriment, although ineffective." + reagent_state = SOLID + color = COLOR_WHITE + chemclass = CHEM_CLASS_BASIC + properties = list(PROPERTY_NUTRITIOUS = 1) + flags = REAGENT_TYPE_MEDICAL + +/datum/reagent/glycerol + name = "Glycerol" + id = "glycerol" + description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity, often used in medicines and beverages. Used in the production of plastic, nitroglycerin and other explosives." + reagent_state = LIQUID + color = COLOR_GRAY + chemclass = CHEM_CLASS_RARE + + custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) + +/datum/reagent/radium + name = "Radium" + id = "radium" + description = "Chemical element of atomic number 88. Radium is a highly radioactive metal that emits alpha and gamma radiation upon decay. Exposure to radium can cause cancer and other disorders." + reagent_state = SOLID + color = "#C7C7C7" // rgb: 199,199,199 + chemclass = CHEM_CLASS_BASIC + properties = list(PROPERTY_CARCINOGENIC = 2, PROPERTY_HEMORRAGING = 1) + +/datum/reagent/thermite + name = "Thermite" + id = "thermite" + description = "Thermite is a pyrotechnic composition of powdered iron oxides that is an extremely volatile explosive. It is used in hand grenades, incendiary bombs, for welding and ore processing." + reagent_state = SOLID + color = "#673910" // rgb: 103, 57, 16 + chemfiresupp = TRUE + burncolor = "#ffb300" + explosive = TRUE + power = 0.5 + falloff_modifier = 1 + chemclass = CHEM_CLASS_UNCOMMON + properties = list(PROPERTY_FUELING = 7, PROPERTY_OXIDIZING = 5, PROPERTY_VISCOUS = 4, PROPERTY_CORROSIVE = 2) + +/datum/reagent/thermite/reaction_turf(turf/T, volume) + src = null + if(istype(T, /turf/closed/wall)) + var/turf/closed/wall/W = T + W.thermite += volume + W.overlays += image('icons/effects/effects.dmi',icon_state = "#673910") + +/datum/reagent/virus_food + name = "Virus Food" + id = "virusfood" + description = "A mixture of water, milk, and oxygen. Virus cells can use this mixture to reproduce." + reagent_state = LIQUID + nutriment_factor = 2 * REAGENTS_METABOLISM + color = "#899613" // rgb: 137, 150, 19 + chemclass = CHEM_CLASS_RARE + properties = list(PROPERTY_NUTRITIOUS = 2) + +/datum/reagent/iron + name = "Iron" + id = "iron" + description = "Chemical element of atomic number 26. Has a broad range of uses in multiple industries particularly in engineering and construction. Iron is an important component of hemoglobin, the substance in red blood cells that carries oxygen. Overdosing on iron is extremely toxic." + reagent_state = SOLID + color = "#C8A5DC" // rgb: 200, 165, 220 + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_BASIC + properties = list(PROPERTY_HEMOGENIC = 3) + flags = REAGENT_TYPE_MEDICAL | REAGENT_SCANNABLE + +/datum/reagent/gold + name = "Gold" + id = "gold" + description = "Chemical element of atomic number 79. Gold is a dense, soft, shiny metal and the most malleable and ductile metal known. Used many industries including electronics, jewelry and medical." + reagent_state = SOLID + color = "#F7C430" // rgb: 247, 196, 48 + chemclass = CHEM_CLASS_RARE + +/datum/reagent/silver + name = "Silver" + id = "silver" + description = "Chemical element of atomic number 47. A soft, white, lustrous transition metal. Has the highest electrical conductivity of any element and the highest thermal conductivity of any metal." + reagent_state = SOLID + color = "#D0D0D0" // rgb: 208, 208, 208 + chemclass = CHEM_CLASS_RARE + +/datum/reagent/uranium + name ="Uranium" + id = "uranium" + description = "Chemical element of atomic number 92. A silvery-white metallic chemical element in the actinide series, weakly radioactive. Has been historically used for nuclear power and in the creation of nuclear bombs." + reagent_state = SOLID + color = "#B8B8C0" // rgb: 184, 184, 192 + chemclass = CHEM_CLASS_RARE + properties = list(PROPERTY_CARCINOGENIC = 2) + +/datum/reagent/uranium/reaction_turf(turf/T, volume) + src = null + if(volume >= 3) + if(!istype(T, /turf/open/space)) + var/obj/effect/decal/cleanable/greenglow/glow = locate(/obj/effect/decal/cleanable/greenglow, T) + if(!glow) + new /obj/effect/decal/cleanable/greenglow(T) + +/datum/reagent/aluminum + name = "Aluminum" + id = "aluminum" + description = "Chemical element of atomic number 13. A silvery-white soft metal of the boron group. Because of its low density it is often uses as a structural material in aircrafts." + reagent_state = SOLID + color = "#A8A8A8" // rgb: 168, 168, 168 + chemclass = CHEM_CLASS_BASIC + +/datum/reagent/silicon + name = "Silicon" + id = "silicon" + description = "Chemical element of atomic number 14. Commonly used as a semiconductor in electronics and is the main component of sand and glass." + reagent_state = SOLID + color = "#A8A8A8" // rgb: 168, 168, 168 + chemclass = CHEM_CLASS_BASIC + +/datum/reagent/fuel + name = "Welding fuel" + id = "fuel" + description = "Liquid industrial grade blowtorch fuel." + reagent_state = LIQUID + color = "#660000" // rgb: 102, 0, 0 + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemfiresupp = TRUE + //------------------// + intensityfire = BURN_LEVEL_TIER_1 + durationfire = BURN_TIME_TIER_1 + burn_sprite = "red" + rangefire = 4 + //------------------// + explosive = TRUE + power = 0.12 + falloff_modifier = -0.1 + burncolor = "#ff9900" + chemclass = CHEM_CLASS_RARE + properties = list(PROPERTY_FUELING = 5, PROPERTY_OXIDIZING = 3, PROPERTY_VISCOUS = 4, PROPERTY_TOXIC = 1) + +/datum/reagent/space_cleaner + name = "Space cleaner" + id = "cleaner" + description = "A synthetic cleaner that vaporizes quickly and isn't slippery like water. It is therefore used compound for cleaning in space and low gravity environments. Very effective at sterilizing surfaces." + reagent_state = LIQUID + color = "#A5F0EE" // rgb: 165, 240, 238 + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_UNCOMMON + +/datum/reagent/space_cleaner/reaction_obj(obj/O, volume) + if(istype(O, /obj/effect/decal/cleanable)) + var/obj/effect/decal/cleanable/C = O + C.cleanup_cleanable() + else if(O) + O.clean_blood() + +/datum/reagent/space_cleaner/reaction_turf(turf/T, volume) + if(volume >= 1 && istype(T)) + T.clean_cleanables() + +/datum/reagent/space_cleaner/reaction_mob(mob/M, method=TOUCH, volume, permeable) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(C.r_hand) + C.r_hand.clean_blood() + if(C.l_hand) + C.l_hand.clean_blood() + if(C.wear_mask) + if(C.wear_mask.clean_blood()) + C.update_inv_wear_mask(0) if(ishuman(M)) - var/mob/living/carbon/human/H = M + var/mob/living/carbon/human/H = C if(H.head) - if(prob(meltprob) && !H.head.unacidable) - to_chat(H, SPAN_DANGER("Your headgear melts away but protects you from the acid!")) - qdel(H.head) + if(H.head.clean_blood()) H.update_inv_head(0) - H.update_hair(0) - else - to_chat(H, SPAN_WARNING("Your headgear protects you from the acid.")) - return - - if(H.wear_mask) - if(prob(meltprob) && !H.wear_mask.unacidable) - to_chat(H, SPAN_DANGER("Your mask melts away but protects you from the acid!")) - qdel(H.wear_mask) - H.update_inv_wear_mask(0) - H.update_hair(0) - else - to_chat(H, SPAN_WARNING("Your mask protects you from the acid.")) - return - - if(H.glasses) - if(prob(meltprob) && !H.glasses.unacidable) - to_chat(H, SPAN_DANGER("Your glasses melts away!")) - qdel(H.glasses) - H.update_inv_glasses(0) - return - - if(!M.unacidable) //nothing left to melt, apply acid effects - if(istype(M, /mob/living/carbon/human) && volume >= 10) - var/mob/living/carbon/human/H = M - var/obj/limb/affecting = H.get_limb("head") - if(affecting) - if(affecting.take_damage(4, 2)) - H.UpdateDamageIcon() - if(prob(meltprob)) //Applies disfigurement - if(H.pain.feels_pain) - H.emote("scream") - H.status_flags |= DISFIGURED - H.name = H.get_visible_name() + if(H.wear_suit) + if(H.wear_suit.clean_blood()) + H.update_inv_wear_suit(0) + else if(H.w_uniform) + if(H.w_uniform.clean_blood()) + H.update_inv_w_uniform(0) + if(H.shoes) + if(H.shoes.clean_blood()) + H.update_inv_shoes(0) else - M.take_limb_damage(min(6, volume)) - return - else - if(!M.unacidable) - M.take_limb_damage(min(6, volume)) - if(isxeno(M)) - var/mob/living/carbon/xenomorph/X = M - if(potency > POTENCY_MAX_TIER_1) //Needs level 7+ to have any effect - X.AddComponent(/datum/component/toxic_buildup, potency * volume * 0.25) - to_chat(X, SPAN_XENODANGER("The corrosive substance damages your carapace!")) - -/datum/chem_property/negative/corrosive/reaction_obj(obj/O, volume, potency) - if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(potency * 10)) - if(O.unacidable) - return - 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." - for(var/mob/M as anything in viewers(5, O)) - to_chat(M, SPAN_WARNING("\The [O] melts.")) - qdel(O) - -/datum/chem_property/negative/biocidic - name = PROPERTY_BIOCIDIC - code = "BCD" - description = "Ruptures cell membranes on contact, destroying most types of organic tissue." - rarity = PROPERTY_COMMON - starter = TRUE - value = -1 - -/datum/chem_property/negative/biocidic/process(mob/living/M, potency = 1, delta_time) - ..() - M.take_limb_damage(0.5 * potency * delta_time) - -/datum/chem_property/negative/biocidic/process_overdose(mob/living/M, potency = 1) - M.take_limb_damage(POTENCY_MULTIPLIER_MEDIUM * potency) - -/datum/chem_property/negative/biocidic/process_critical(mob/living/M, potency = 1) - M.take_limb_damage(POTENCY_MULTIPLIER_VHIGH * potency) - -/datum/chem_property/negative/paining - name = PROPERTY_PAINING - code = "PNG" - description = "Activates the somatosensory system causing neuropathic pain all over the body. Unlike nociceptive pain, this is not caused to any tissue damage and is solely perceptive." - rarity = PROPERTY_UNCOMMON - category = PROPERTY_TYPE_STIMULANT - value = -1 - -/datum/chem_property/negative/paining/on_delete(mob/living/M) - ..() - - M.pain.recalculate_pain() - -/datum/chem_property/negative/paining/process(mob/living/M, potency = 1, delta_time) - if(!(..())) - return - - M.pain.apply_pain(PROPERTY_PAINING_PAIN * potency) - -/datum/chem_property/negative/paining/process_overdose(mob/living/M, potency = 1, delta_time) - if(!(..())) - return - - M.pain.apply_pain(PROPERTY_PAINING_PAIN_OD * potency) - M.take_limb_damage(0.5 * potency * delta_time) - -/datum/chem_property/negative/paining/process_critical(mob/living/M, potency = 1) - M.take_limb_damage(POTENCY_MULTIPLIER_MEDIUM * potency) - -/datum/chem_property/negative/hemolytic - name = PROPERTY_HEMOLYTIC - code = "HML" - description = "Causes intravascular hemolysis, resulting in the destruction of erythrocytes (red blood cells) in the bloodstream. This can result in Hemoglobinemia, where a high concentration of hemoglobin is released into the blood plasma." - rarity = PROPERTY_UNCOMMON - -/datum/chem_property/negative/hemolytic/process(mob/living/M, potency = 1, delta_time) - if(!iscarbon(M)) - return - var/mob/living/carbon/C = M - ..() - C.blood_volume = max(C.blood_volume - POTENCY_MULTIPLIER_VHIGH * potency,0) - -/datum/chem_property/negative/hemolytic/process_overdose(mob/living/M, potency = 1, delta_time) - if(!iscarbon(M)) - return - var/mob/living/carbon/C = M - C.blood_volume = max(C.blood_volume - 4 * potency * delta_time, 0) - M.drowsyness = min(M.drowsyness + 0.5 * potency * delta_time, 15 * potency) - M.reagent_move_delay_modifier += potency - M.recalculate_move_delay = TRUE - if(prob(5 * delta_time)) - M.emote(pick("yawn","gasp")) - -/datum/chem_property/negative/hemolytic/process_critical(mob/living/M, potency = 1) - M.apply_damage(POTENCY_MULTIPLIER_VHIGH * potency, OXY) - -/datum/chem_property/negative/hemorrhaging - name = PROPERTY_HEMORRAGING - code = "HMR" - description = "Ruptures endothelial cells making up bloodvessels, causing blood to escape from the circulatory system." - rarity = PROPERTY_UNCOMMON - value = 2 - cost_penalty = FALSE - -/datum/chem_property/negative/hemorrhaging/process(mob/living/M, potency = 1, delta_time) - if(!ishuman(M)) - return - var/mob/living/carbon/human/H = M - var/obj/limb/L = pick(H.limbs) - if(!L || L.status & (LIMB_ROBOT|LIMB_SYNTHSKIN)) - return - ..() - if(prob(POTENCY_MULTIPLIER_VHIGH * potency)) - var/datum/wound/internal_bleeding/I = new (0) - L.add_bleeding(I, TRUE) - L.wounds += I - if(prob(POTENCY_MULTIPLIER_VHIGH * potency)) - spawn L.owner.emote("me", 1, "coughs up blood!") - L.owner.drip(10) - -/datum/chem_property/negative/hemorrhaging/process_overdose(mob/living/M, potency = 1, delta_time) - if(!ishuman(M)) - return - var/mob/living/carbon/human/H = M - var/obj/limb/L = pick(H.limbs) - if(L.internal_organs) - var/datum/internal_organ/O = pick(L.internal_organs)//Organs can't bleed, so we just damage them - O.take_damage(POTENCY_MULTIPLIER_LOW * potency) - -/datum/chem_property/negative/hemorrhaging/process_critical(mob/living/M, potency = 1, delta_time) - if(prob(10 * potency * delta_time) && ishuman(M)) - var/mob/living/carbon/human/H = M - var/obj/limb/L = pick(H.limbs) - var/datum/wound/internal_bleeding/I = new (0) - L.add_bleeding(I, TRUE) - L.wounds += I - -/datum/chem_property/negative/hemorrhaging/reaction_mob(mob/M, method = TOUCH, volume, potency) - M.AddComponent(/datum/component/healing_reduction, potency * volume * POTENCY_MULTIPLIER_VLOW) //deals brute DOT to humans, prevents healing for xenos - -/datum/chem_property/negative/carcinogenic - name = PROPERTY_CARCINOGENIC - code = "CRG" - description = "Penetrates the cell nucleus causing direct damage to the deoxyribonucleic acid in cells resulting in cancer and abnormal cell proliferation. In extreme cases causing hyperactive apoptosis and potentially atrophy." - rarity = PROPERTY_COMMON - -/datum/chem_property/negative/carcinogenic/process(mob/living/M, potency = 1, delta_time) - ..() - M.adjustCloneLoss(POTENCY_MULTIPLIER_LOW*potency) - -/datum/chem_property/negative/carcinogenic/process_overdose(mob/living/M, potency = 1) - M.adjustCloneLoss(POTENCY_MULTIPLIER_MEDIUM * potency) - -/datum/chem_property/negative/carcinogenic/process_critical(mob/living/M, potency = 1) - M.take_limb_damage(POTENCY_MULTIPLIER_MEDIUM * potency)//Hyperactive apoptosis - -/datum/chem_property/negative/hepatotoxic - name = PROPERTY_HEPATOTOXIC - code = "HPT" - description = "Damages hepatocytes in the liver, resulting in liver deterioration and eventually liver failure." - rarity = PROPERTY_UNCOMMON - -/datum/chem_property/negative/hepatotoxic/process(mob/living/M, potency = 1, delta_time) - if(!ishuman(M)) - return - ..() - M.apply_internal_damage(POTENCY_MULTIPLIER_LOW * potency, "liver") - -/datum/chem_property/negative/hepatotoxic/process_overdose(mob/living/M, potency = 1) - M.apply_damage(POTENCY_MULTIPLIER_MEDIUM * potency, TOX) - -/datum/chem_property/negative/hepatotoxic/process_critical(mob/living/M, potency = 1) - M.apply_damage(POTENCY_MULTIPLIER_VHIGH * potency, TOX) - -/datum/chem_property/negative/intravenous - name = PROPERTY_INTRAVENOUS - code = "INV" - description = "Due to chemical composition, this chemical can only be administered intravenously." - rarity = PROPERTY_COMMON - category = PROPERTY_TYPE_METABOLITE - max_level = 1 - -/datum/chem_property/negative/intravenous/reset_reagent() - holder.flags = initial(holder.flags) - return ..() - -/datum/chem_property/negative/intravenous/update_reagent() - holder.flags |= REAGENT_NOT_INGESTIBLE - return ..() - -/datum/chem_property/negative/nephrotoxic - name = PROPERTY_NEPHROTOXIC - code = "NPT" - description = "Causes deterioration and damage to podocytes in the kidney resulting in potential kidney failure." - rarity = PROPERTY_UNCOMMON - -/datum/chem_property/negative/nephrotoxic/process(mob/living/M, potency = 1, delta_time) - if(!ishuman(M)) - return - ..() - M.apply_internal_damage(POTENCY_MULTIPLIER_LOW * potency, "kidneys") - -/datum/chem_property/negative/nephrotoxic/process_overdose(mob/living/M, potency = 1) - M.apply_damage(POTENCY_MULTIPLIER_MEDIUM * potency, TOX) - -/datum/chem_property/negative/nephrotoxic/process_critical(mob/living/M, potency = 1) - M.apply_damage(POTENCY_MULTIPLIER_VHIGH * potency, TOX) - -/datum/chem_property/negative/pneumotoxic - name = PROPERTY_PNEUMOTOXIC - code = "PNT" - description = "Toxic substance which causes damage to connective tissue that forms the support structure (the interstitium) of the alveoli in the lungs." - rarity = PROPERTY_UNCOMMON - -/datum/chem_property/negative/pneumotoxic/process(mob/living/M, potency = 1, delta_time) - if(!ishuman(M)) - return - ..() - M.apply_internal_damage(POTENCY_MULTIPLIER_LOW * potency, "lungs") - -/datum/chem_property/negative/pneumotoxic/process_overdose(mob/living/M, potency = 1) - M.apply_damage(POTENCY_MULTIPLIER_MEDIUM * potency, OXY) - -/datum/chem_property/negative/pneumotoxic/process_critical(mob/living/M, potency = 1) - M.apply_damage(POTENCY_MULTIPLIER_VHIGH * potency, OXY) - -/datum/chem_property/negative/oculotoxic - name = PROPERTY_OCULOTOXIC - code = "OCT" - description = "Damages the photoreceptive cells in the eyes impairing neural transmissions to the brain, resulting in loss of sight or blindness." - rarity = PROPERTY_UNCOMMON - -/datum/chem_property/negative/oculotoxic/process(mob/living/M, potency = 1, delta_time) - if(!ishuman(M)) - return - ..() - var/mob/living/carbon/human/H = M - var/datum/internal_organ/eyes/L = H.internal_organs_by_name["eyes"] - if(L) - L.take_damage(POTENCY_MULTIPLIER_LOW * potency) - -/datum/chem_property/negative/oculotoxic/process_overdose(mob/living/M, potency = 1, delta_time) - M.sdisabilities |= DISABILITY_BLIND - -/datum/chem_property/negative/oculotoxic/process_critical(mob/living/M, potency = 1) - M.apply_damage(POTENCY_MULTIPLIER_LOW * potency, BRAIN) - -/datum/chem_property/negative/cardiotoxic - name = PROPERTY_CARDIOTOXIC - code = "CDT" - description = "Attacks cardiomyocytes when passing through the heart in the bloodstream. This disrupts the cardiac cycle and can lead to cardiac arrest." - rarity = PROPERTY_COMMON - -/datum/chem_property/negative/cardiotoxic/process(mob/living/M, potency = 1, delta_time) - if(!ishuman(M)) - return - ..() - M.apply_internal_damage(POTENCY_MULTIPLIER_LOW * potency, "heart") - -/datum/chem_property/negative/cardiotoxic/process_overdose(mob/living/M, potency = 1) - M.apply_damage(POTENCY_MULTIPLIER_MEDIUM * potency, OXY) - -/datum/chem_property/negative/cardiotoxic/process_critical(mob/living/M, potency = 1) - M.apply_damage(POTENCY_MULTIPLIER_VHIGH * potency, OXY) - -/datum/chem_property/negative/neurotoxic - name = PROPERTY_NEUROTOXIC - code = "NRT" - description = "Breaks down neurons causing widespread damage to the central nervous system and brain functions. Exposure may cause disorientation or unconsciousness to affected persons." - rarity = PROPERTY_COMMON - category = PROPERTY_TYPE_TOXICANT|PROPERTY_TYPE_STIMULANT - cost_penalty = FALSE - -/datum/chem_property/negative/neurotoxic/process(mob/living/M, potency = 1) - M.apply_damage(POTENCY_MULTIPLIER_MEDIUM * potency, BRAIN) - -/datum/chem_property/negative/neurotoxic/process_overdose(mob/living/M, potency = 1) - M.apply_damage(POTENCY_MULTIPLIER_HIGH * potency, BRAIN) - M.jitteriness = min(M.jitteriness + potency, POTENCY_MULTIPLIER_HIGH * potency) - if(prob(50)) - M.drowsyness = min(M.drowsyness + potency, POTENCY_MULTIPLIER_HIGH * potency) - if(prob(10)) - M.emote("drool") - -/datum/chem_property/negative/neurotoxic/process_critical(mob/living/M, potency = 1) - if(prob(15*potency)) - apply_neuro(M, POTENCY_MULTIPLIER_MEDIUM * potency, FALSE) - -/datum/chem_property/negative/neurotoxic/reaction_mob(mob/M, method = TOUCH, volume, potency) + H.clean_blood(1) + return + M.clean_blood() + +/datum/reagent/cryptobiolin + name = "Cryptobiolin" + id = "cryptobiolin" + description = "A component to making spaceacilin." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_UNCOMMON + +/datum/reagent/impedrezene + name = "Impedrezene" + id = "impedrezene" + description = "Impedrezene is a narcotic that impedes one's neural abilities by slowing down the higher brain cell functions. Can cause serious brain damage." + reagent_state = LIQUID + color = "#C8A5DC" // rgb: 200, 165, 220 + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_UNCOMMON + properties = list(PROPERTY_NEUROTOXIC = 2, PROPERTY_RELAXING = 1) + +//*****************************************************************************************************/ + +/datum/reagent/oxidizing_agent + name = "Oxidizing Agent" + id = "oxidizing_agent" + description = "A synthesized, highly-refined oxidizing agent that is most likely extremely unhealthy for human consumption." + reagent_state = GAS + color = "#c4c4c4" + chemfiresupp = TRUE + properties = list(PROPERTY_OXIDIZING = 6) + intensitymod = 1 + radiusmod = -0.12 + burncolor = "#a9ecff" + burncolormod = 2 + chemclass = CHEM_CLASS_RARE + custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) + flags = REAGENT_NO_GENERATION + +/datum/reagent/xenomicrobes + name = "Xenomicrobes" + id = "xenomicrobes" + description = "Microbes with an entirely alien cellular structure." + reagent_state = LIQUID + color = "#535E66" // rgb: 83, 94, 102 + +/datum/reagent/xenomicrobes/reaction_mob(mob/M, method=TOUCH, volume, permeable) + src = null + if((prob(10) && method==TOUCH) || method==INGEST) + M.contract_disease(new /datum/disease/xeno_transformation(0),1) + +/datum/reagent/fluorosurfactant//foam precursor + name = "Fluorosurfactant" + id = "fluorosurfactant" + description = "A perfluoronated sulfonic acid that forms a foam when mixed with water." + reagent_state = LIQUID + color = "#9E6B38" // rgb: 158, 107, 56 + chemclass = CHEM_CLASS_UNCOMMON + +/datum/reagent/foaming_agent// Metal foaming agent. This is lithium hydride. Add other recipes (e.g. LiH + H2O -> LiOH + H2) eventually. + name = "Foaming agent" + id = "foaming_agent" + description = "An agent that yields metallic foam when mixed with light metal and a strong acid." + reagent_state = SOLID + color = "#664B63" // rgb: 102, 75, 99 + chemclass = CHEM_CLASS_UNCOMMON + +/datum/reagent/foaming_agent/stabilized + name = "Stabilized metallic foam" + id = "stablefoam" + description = "Stabilized metallic foam that solidifies when exposed to an open flame" + reagent_state = LIQUID + color = "#d4b8d1" + chemclass = CHEM_CLASS_UNCOMMON + properties = list(PROPERTY_TOXIC = 8) + +/datum/reagent/nicotine + name = "Nicotine" + id = "nicotine" + description = "A legal highly addictive stimulant extracted from the tobacco plant. It is one of the most commonly abused drugs." + reagent_state = LIQUID + color = "#181818" // rgb: 24, 24, 24 + chemclass = CHEM_CLASS_RARE + flags = REAGENT_SCANNABLE + +/datum/reagent/ammonia + name = "Ammonia" + id = "ammonia" + description = "A caustic substance commonly used in fertilizers or household cleaners." + reagent_state = GAS + color = "#404030" // rgb: 64, 64, 48 + chemclass = CHEM_CLASS_COMMON + +/datum/reagent/hexamine + name = "Hexamine" + id = "hexamine" + description = "A crystalline compound that sees many uses varying from food additives, making plastics, treating urinary tract infections, as a smokeless heating element in military rations, and the creation of several explosives." + reagent_state = SOLID + color = "#F0F0F0" + chemfiresupp = TRUE + durationmod = 0.5 + burncolor = "#ff9900" + chemclass = CHEM_CLASS_UNCOMMON + +/datum/reagent/ultraglue + name = "Ultra Glue" + id = "glue" + description = "An extremely powerful bonding agent." + color = "#FFFFCC" // rgb: 255, 255, 204 + +/datum/reagent/diethylamine + name = "Diethylamine" + id = "diethylamine" + description = "Diethylamine is used as a potent fertilizer and as an alternative to ammonia. Also used in the preparation rubber processing chemicals, agricultural chemicals, and pharmaceuticals." + reagent_state = LIQUID + color = "#604030" // rgb: 96, 64, 48 + chemclass = CHEM_CLASS_UNCOMMON + +/datum/reagent/blackgoo + name = "Black goo" + id = "blackgoo" + description = "A strange dark liquid of unknown origin and effect." + reagent_state = LIQUID + color = "#222222" + custom_metabolism = 100 //disappears immediately + properties = list(PROPERTY_RAVENING = 1) + +/datum/reagent/blackgoo/reaction_mob(mob/M, method=TOUCH, volume, permeable) if(ishuman(M)) var/mob/living/carbon/human/H = M - H.apply_damage(potency, BRAIN) - to_chat(M, SPAN_WARNING("You start to go numb.")) - M.apply_effect(potency * volume * POTENCY_MULTIPLIER_LOW, DAZE) - -/datum/chem_property/negative/hypermetabolic - name = PROPERTY_HYPERMETABOLIC - code = "EMB" - description = "Takes less time for this chemical to metabolize, resulting in it being in the bloodstream for less time per unit." - rarity = PROPERTY_UNCOMMON - category = PROPERTY_TYPE_METABOLITE - -/datum/chem_property/negative/hypermetabolic/reset_reagent() - holder.custom_metabolism = initial(holder.custom_metabolism) - ..() - -/datum/chem_property/negative/hypermetabolic/update_reagent() - holder.custom_metabolism = holder.custom_metabolism * (1 + POTENCY_MULTIPLIER_VLOW * level) - ..() - -/datum/chem_property/negative/addictive - name = PROPERTY_ADDICTIVE - code = "ADT" - description = "Causes addiction. Higher potency results in a higher chance of causing an addiction when metabolized." - rarity = PROPERTY_RARE - category = PROPERTY_TYPE_STIMULANT - -/datum/chem_property/negative/addictive/process(mob/living/M, potency = 1, delta_time) - var/has_addiction - for(var/datum/disease/addiction/D in M.viruses) - if(D.chemical_id == holder.id) - D.handle_chem() - has_addiction = TRUE - break - if(!has_addiction) - var/datum/disease/addiction/D = new /datum/disease/addiction(holder.id, potency) - M.contract_disease(D, TRUE) - -/datum/chem_property/negative/addictive/process_overdose(mob/living/M, potency = 1, delta_time) - M.apply_damage(0.5 * potency * delta_time, BRAIN) - -/datum/chem_property/negative/addictive/process_critical(mob/living/M, potency = 1, delta_time) - M.disabilities |= NERVOUS - -//PROPERTY_DISABLED (in generation) -/datum/chem_property/negative/hemositic - name = PROPERTY_HEMOSITIC - code = "HST" - description = "The chemical shows parasitic behavior towards live erythrocytes (red blood cells) in order to produce more of itself." - rarity = PROPERTY_DISABLED - category = PROPERTY_TYPE_REACTANT|PROPERTY_TYPE_ANOMALOUS - value = 1 - -/datum/chem_property/negative/hemositic/pre_process(mob/living/M) + if(H.species.name == "Human") + H.contract_disease(new /datum/disease/black_goo) + +/datum/reagent/blackgoo/reaction_turf(turf/T, volume) + if(!istype(T)) return + if(volume < 3) return + if(!(locate(/obj/effect/decal/cleanable/blackgoo) in T)) + new /obj/effect/decal/cleanable/blackgoo(T) + + +// Chemfire supplements + +/datum/reagent/napalm + name = "Napalm" + id = "napalm" + description = "This will probably ignite before you get to read this." + reagent_state = LIQUID + color = "#ffb300" + chemfiresupp = TRUE + burncolor = "#D05006" + burn_sprite = "red" + properties = list(PROPERTY_OXIDIZING = 6, PROPERTY_FUELING = 7, PROPERTY_FLOWING = 1) + +/datum/reagent/napalm/sticky + name = "Sticky-Napalm" + id = "stickynapalm" + description = "A custom napalm mix, stickier and lasts longer but lower damage" + reagent_state = LIQUID + color = "#f8e3b2" + burncolor = "#f8e3b2" + burn_sprite = "dynamic" + intensitymod = -1.5 + durationmod = -5 + radiusmod = -0.5 + properties = list( + PROPERTY_INTENSITY = BURN_LEVEL_TIER_2, + PROPERTY_DURATION = BURN_TIME_TIER_5, + PROPERTY_RADIUS = 5, + ) + +/datum/reagent/napalm/high_damage + name = "High-Combustion Napalm Fuel" + id = "highdamagenapalm" + description = "A custom napalm mix, higher damage but not as sticky" + reagent_state = LIQUID + color = "#c51c1c" + burncolor = "#c51c1c" + burn_sprite = "dynamic" + intensitymod = -4.5 + durationmod = -1 + radiusmod = -0.5 + properties = list( + PROPERTY_INTENSITY = BURN_LEVEL_TIER_8, + PROPERTY_DURATION = BURN_TIME_TIER_1, + PROPERTY_RADIUS = 5, + ) + +// This is the regular flamer fuel and pyro regular flamer fuel. +/datum/reagent/napalm/ut + name = "UT-Napthal Fuel" + id = "utnapthal" + description = "Known as Ultra Thick Napthal Fuel, a sticky combustible liquid chemical, typically used with flamethrowers." + burncolor = "#EE6515" + properties = list( + PROPERTY_INTENSITY = BURN_LEVEL_TIER_5, + PROPERTY_DURATION = BURN_TIME_TIER_2, + PROPERTY_RADIUS = 5, + ) + +// This is gellie fuel. Green Flames. +/datum/reagent/napalm/gel + name = "Napalm B-Gel" + id = "napalmgel" + description = "Unlike its liquid contemporaries, this gelled variant of napalm is easily extinguished, but shoots far and lingers on the ground in a viscous mess, while reacting with inorganic materials to ignite them." + flameshape = FLAMESHAPE_LINE + color = COLOR_GREEN + burncolor = COLOR_GREEN + burn_sprite = "green" + properties = list( + PROPERTY_INTENSITY = BURN_LEVEL_TIER_2, + PROPERTY_DURATION = BURN_TIME_TIER_5, + PROPERTY_RADIUS = 7, + ) + fire_type = FIRE_VARIANT_TYPE_B //Armor Shredding Greenfire + +// This is the blue flamer fuel for the pyro. +/datum/reagent/napalm/blue + name = "Napalm X" + id = "napalmx" + description = "A sticky combustible liquid chemical that burns extremely hot." + color = "#00b8ff" + burncolor = "#00b8ff" + burn_sprite = "blue" + properties = list( + PROPERTY_INTENSITY = BURN_LEVEL_TIER_7, + PROPERTY_DURATION = BURN_TIME_TIER_4, + PROPERTY_RADIUS = 6, + ) + +// This is the green flamer fuel for the pyro. +/datum/reagent/napalm/green + name = "Napalm B" + id = "napalmb" + description = "A special variant of napalm that's unable to cling well to anything, but disperses over a wide area while burning slowly. The composition reacts with inorganic materials to ignite them, causing severe damage." + flameshape = FLAMESHAPE_TRIANGLE + color = COLOR_GREEN + burncolor = COLOR_GREEN + burn_sprite = "green" + properties = list( + PROPERTY_INTENSITY = BURN_LEVEL_TIER_2, + PROPERTY_DURATION = BURN_TIME_TIER_5, + PROPERTY_RADIUS = 6, + ) + fire_type = FIRE_VARIANT_TYPE_B //Armor Shredding Greenfire + +/datum/reagent/napalm/penetrating + name = "Napalm E" + id = "napalme" + description = "A sticky combustible liquid chemical that penetrates the best fire retardants." + color = COLOR_PURPLE + burncolor = COLOR_PURPLE + burn_sprite = "dynamic" + properties = list( + PROPERTY_INTENSITY = BURN_LEVEL_TIER_2, + PROPERTY_DURATION = BURN_TIME_TIER_5, + PROPERTY_RADIUS = 6, + PROPERTY_FIRE_PENETRATING = 1, + ) + +/datum/reagent/napalm/deathsquad //version of fuel for dsquad flamers. + name = "Napalm EX" + id = "napalmex" + description = "A sticky combustible liquid chemical made up of a combonation of rare and dangerous reagents both that penetrates the best fire retardants, and burns extremely hot." + color = "#641dd6" + burncolor = "#641dd6" + burn_sprite = "dynamic" + properties = list( + PROPERTY_INTENSITY = BURN_LEVEL_TIER_7, + PROPERTY_DURATION = BURN_TIME_TIER_4, + PROPERTY_RADIUS = 6, + PROPERTY_FIRE_PENETRATING = 1 + ) + +/datum/reagent/napalm/upp + name = "R189" + id = "R189" + description = "A UPP chemical, it burns at an extremely high tempature and is designed to melt directly through fortified positions or bunkers." + color = "#ffe49c" + burncolor = "#ffe49c" + burn_sprite = "dynamic" + properties = list( + PROPERTY_INTENSITY = BURN_LEVEL_TIER_9, + PROPERTY_DURATION = BURN_TIME_TIER_3, + PROPERTY_RADIUS = 6, + PROPERTY_FIRE_PENETRATING = 1, + ) + +/datum/reagent/chlorinetrifluoride + name = "Chlorine Trifluoride" + id = "chlorine trifluoride" + description = "A highly reactive interhalogen compound capaple of self ignition. A very strong oxidizer and is extremely reactive with most organic and inorganic materials." + reagent_state = LIQUID + color = COLOR_CYAN + custom_metabolism = 100 + chemfiresupp = TRUE + burncolor = "#ff9300" + chemclass = CHEM_CLASS_UNCOMMON + properties = list(PROPERTY_CORROSIVE = 8, PROPERTY_TOXIC = 6, PROPERTY_OXIDIZING = 9) + +/datum/reagent/chlorinetrifluoride/on_mob_life(mob/living/M) // Not a good idea, instantly messes you up from the inside out. + . = ..() + M.adjust_fire_stacks(max(M.fire_stacks, 15)) + M.IgniteMob(TRUE) + to_chat(M, SPAN_DANGER("It burns! It burns worse than you could ever have imagined!")) + +/datum/reagent/methane + name = "Methane" + id = "methane" + description = "An easily combustible hydrocarbon that can very rapidly expand a fire, even explosively at the right concentrations. It is used primarily as fuel to make heat and light or manufacturing of organic chemicals." + reagent_state = LIQUID + color = "#0064C8" + custom_metabolism = AMOUNT_PER_TIME(1, 5 SECONDS) + chemfiresupp = TRUE + burncolor = "#00a5ff" + burncolormod = 1.5 + explosive = TRUE + power = 0.15 + chemclass = CHEM_CLASS_COMMON + properties = list(PROPERTY_TOXIC = 2, PROPERTY_FLOWING = 3, PROPERTY_VISCOUS = 3, PROPERTY_FUELING = 2) + +//*****************************************************************************************************/ +//*****************************************Explosives**************************************************/ +//*****************************************************************************************************/ + +/datum/reagent/potassium_hydroxide + name = "Potassium hydroxide" + id = "potassium_hydroxide" + description = "This will probably explode before you manage to read this." + explosive = TRUE + power = 0.5 + +/datum/reagent/ammoniumnitrate + name = "Ammonium Nitrate" + id = "ammonium_nitrate" + description = "A white crystalline compound that is used in agriculture as a high-nitrogen fertilizer. On its own, ammonium nitrate is not explosive, but rapidly becomes so when mixed with fuel oil." + reagent_state = SOLID + color = "#E5E5E5" + explosive = TRUE + power = 0.4 + falloff_modifier = 1.5 + chemfiresupp = TRUE + durationmod = -0.2 + intensitymod = 0.5 + burncolor = "#ff9900" + +/datum/reagent/anfo + name = "Ammonium nitrate fuel oil" + id = "anfo" + color = "#E0E0E0" + description = "Ammonium nitrate fuel oil (ANFO) is a low cost bulk explosive commonly used for mining and construction operations." + explosive = TRUE + power = 1 + falloff_modifier = -0.6 + +/datum/reagent/nitroglycerin + name = "Nitroglycerin" + id = "nitroglycerin" + description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol. Despite being a highly volatile material, it is used for many medical purposes." + reagent_state = LIQUID + color = COLOR_GRAY + custom_metabolism = AMOUNT_PER_TIME(1, 200 SECONDS) + explosive = TRUE + power = 1 + falloff_modifier = -0.5 + +/datum/reagent/cyclonite + name = "Cyclonite" + id = "cyclonite" + description = "Cyclonite is a low sensitivity highly explosive compound, commonly known as RDX. It is considered as one of the most energetic military high explosives. It is also sometimes used as a rat poison by civilians." + reagent_state = SOLID + color = "#E3E0BA" + explosive = TRUE + power = 1.5 + falloff_modifier = -0.4 + +/datum/reagent/cyclonite/on_mob_life(mob/living/M) + . = ..() + M.apply_damage(1, TOX) + +/datum/reagent/octogen + name = "Octogen" + id = "octogen" + description = "Octogen, also known as HMX or Her Majesty's Explosive, is a powerful and relatively insensitive explosive. It is one of the most potent chemical explosives available, exceeding that of cyclonite (RDX)." + reagent_state = SOLID + color = "#F5F5F5" + explosive = TRUE + power = 2 + falloff_modifier = -0.2 + chemfiresupp = TRUE + properties = list(PROPERTY_OXIDIZING = 2) + +//*****************************************************************************************************/ +//****************************************Blood plasmas************************************************/ +//*****************************************************************************************************/ + +/datum/reagent/plasma + name = "plasma" + id = "plasma" + description = "A clear extracellular fluid separated from blood." + reagent_state = LIQUID + color = "#f1e8cf" + custom_metabolism = AMOUNT_PER_TIME(1, 5 SECONDS) + +/datum/reagent/plasma/pheromone + name = "Pheromone Plasma" + id = PLASMA_PHEROMONE + description = "A funny smelling plasma..." + color = "#a2e7d6" + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_SPECIAL + objective_value = OBJECTIVE_EXTREME_VALUE + properties = list(PROPERTY_HALLUCINOGENIC = 8, PROPERTY_NERVESTIMULATING = 6) + +/datum/reagent/plasma/chitin + name = "Chitin Plasma" + id = PLASMA_CHITIN + description = "A very thick fibrous plasma..." + color = "#6d7694" + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_SPECIAL + objective_value = OBJECTIVE_EXTREME_VALUE + properties = list(PROPERTY_HYPERDENSIFICATING = 1) + +/datum/reagent/plasma/catecholamine + name = "Catecholamine Plasma" + id = PLASMA_CATECHOLAMINE + description = "A red-ish plasma..." + color = "#cf7551" + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_SPECIAL + objective_value = OBJECTIVE_EXTREME_VALUE + properties = list(PROPERTY_PAINING = 2, PROPERTY_MUSCLESTIMULATING = 6) + +/datum/reagent/plasma/egg + name = "Egg Plasma" + id = PLASMA_EGG + description = "A white-ish plasma high with a high concentration of protein..." + color = "#c3c371" + overdose = 80 + overdose_critical = 100 + chemclass = CHEM_CLASS_SPECIAL + objective_value = OBJECTIVE_EXTREME_VALUE + properties = list(PROPERTY_HEMOSITIC = 4) + +/datum/reagent/plasma/egg/on_mob_life(mob/living/M) + . = ..() + if(!.) + return if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - return list(REAGENT_CANCEL = TRUE) - -/datum/chem_property/negative/hemositic/process(mob/living/M, potency = 1, delta_time) - if(!iscarbon(M)) - return - ..() - var/mob/living/carbon/C = M - C.blood_volume = max(C.blood_volume - POTENCY_MULTIPLIER_VHIGH * potency, 0) - holder.volume++ - -/datum/chem_property/negative/hemositic/process_overdose(mob/living/M, potency = 1, delta_time) - if(!iscarbon(M)) - return - var/mob/living/carbon/C = M - C.blood_volume = max(C.blood_volume-10*potency,0) - holder.volume += potency * POTENCY_MULTIPLIER_MEDIUM - -/datum/chem_property/negative/hemositic/process_critical(mob/living/M, potency = 1, delta_time) - M.disabilities |= NERVOUS + if((locate(/obj/item/alien_embryo) in H.contents) || (H.species.flags & IS_SYNTHETIC) || !H.huggable) + volume = 0 + return + if(volume < overdose_critical) + return + //it turns into an actual embryo at this point + volume = 0 + var/obj/item/alien_embryo/embryo = new /obj/item/alien_embryo(H) + if(data_properties && data_properties["hive_number"]) + embryo.hivenumber = data_properties["hive_number"] + else + embryo.hivenumber = XENO_HIVE_NORMAL + to_chat(H, SPAN_WARNING("Your stomach cramps and you suddenly feel very sick!")) + +/datum/reagent/plasma/neurotoxin + name = "Neurotoxin Plasma" + id = PLASMA_NEUROTOXIN + description = "A plasma containing an unknown but potent neurotoxin." + color = "#ba8216" + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_SPECIAL + objective_value = OBJECTIVE_EXTREME_VALUE + properties = list(PROPERTY_NEUROTOXIC = 4, PROPERTY_TOXIC = 1, PROPERTY_HALLUCINOGENIC = 6) + +/datum/reagent/plasma/antineurotoxin + name = "Anti-Neurotoxin" + id = "antineurotoxin" + description = "A counteragent to Neurotoxin Plasma." + color = "#afffc9" + chemclass = CHEM_CLASS_SPECIAL + objective_value = OBJECTIVE_MEDIUM_VALUE + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + properties = list(PROPERTY_NEUROSHIELDING = 1) + +/datum/reagent/plasma/purple + name = "Purple Plasma" + id = PLASMA_PURPLE + description = "A purple-ish plasma..." + color = "#a65d7f" + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_SPECIAL + objective_value = OBJECTIVE_EXTREME_VALUE + properties = list(PROPERTY_BIOCIDIC = 2) + +/datum/reagent/plasma/royal + name = "Royal Plasma" + id = PLASMA_ROYAL + description = "A dark purple-ish plasma..." + color = "#ffeb9c" + overdose = REAGENTS_OVERDOSE + overdose_critical = REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_SPECIAL + objective_value = OBJECTIVE_ABSOLUTE_VALUE + properties = list(PROPERTY_BIOCIDIC = 4, PROPERTY_ADDICTIVE = 1, PROPERTY_HALLUCINOGENIC = 4, PROPERTY_CIPHERING = 1) + +/datum/reagent/fruit_resin + name = "Fruit Resin" + id = "fruit_resin" + description = "A strange green fluid found in certain xenomorphic structures. Seems to have regenerative properties." + reagent_state = LIQUID + nutriment_factor = 15 * REAGENTS_METABOLISM + color = "#12911d" // rgb: 102, 67, 48 + overdose = MED_REAGENTS_OVERDOSE + overdose_critical = MED_REAGENTS_OVERDOSE_CRITICAL + chemclass = CHEM_CLASS_SPECIAL + properties = list(PROPERTY_TRANSFORMATIVE = 4, PROPERTY_NUTRITIOUS = 3, PROPERTY_HEMOGENIC = 1) + flags = REAGENT_SCANNABLE From d334f6c123e4ab013a2ed8768fa1fa5722d732e9 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 1 May 2024 16:45:56 -0400 Subject: [PATCH 05/69] Update prop_negative.dm --- code/modules/reagents/chemistry_properties/prop_negative.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/reagents/chemistry_properties/prop_negative.dm b/code/modules/reagents/chemistry_properties/prop_negative.dm index 5b196bbfc9d6..eb4810b1774a 100644 --- a/code/modules/reagents/chemistry_properties/prop_negative.dm +++ b/code/modules/reagents/chemistry_properties/prop_negative.dm @@ -84,6 +84,7 @@ rarity = PROPERTY_COMMON starter = TRUE value = 1 //has a combat use + cost_penalty = FALSE /datum/chem_property/negative/corrosive/process(mob/living/M, potency = 1, delta_time) ..() @@ -243,6 +244,7 @@ description = "Ruptures endothelial cells making up bloodvessels, causing blood to escape from the circulatory system." rarity = PROPERTY_UNCOMMON value = 2 + cost_penalty = FALSE /datum/chem_property/negative/hemorrhaging/process(mob/living/M, potency = 1, delta_time) if(!ishuman(M)) @@ -411,6 +413,7 @@ description = "Breaks down neurons causing widespread damage to the central nervous system and brain functions. Exposure may cause disorientation or unconsciousness to affected persons." rarity = PROPERTY_COMMON category = PROPERTY_TYPE_TOXICANT|PROPERTY_TYPE_STIMULANT + cost_penalty = FALSE /datum/chem_property/negative/neurotoxic/process(mob/living/M, potency = 1) M.apply_damage(POTENCY_MULTIPLIER_MEDIUM * potency, BRAIN) From cc2b22200f8bfd026b9793db26f0211ef9e21e6c Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 1 May 2024 16:46:06 -0400 Subject: [PATCH 06/69] Update prop_special.dm --- .../chemistry_properties/prop_special.dm | 38 ++----------------- 1 file changed, 4 insertions(+), 34 deletions(-) diff --git a/code/modules/reagents/chemistry_properties/prop_special.dm b/code/modules/reagents/chemistry_properties/prop_special.dm index cee75ca58c06..adb8babe4303 100644 --- a/code/modules/reagents/chemistry_properties/prop_special.dm +++ b/code/modules/reagents/chemistry_properties/prop_special.dm @@ -6,29 +6,16 @@ /datum/chem_property/special/boosting name = PROPERTY_BOOSTING code = "BST" - description = "Boosts the potency of all other properties in this chemical when inside the body." + description = "Boosts the potency of all other properties in this chemical when inside the body by up to 4 levels." rarity = PROPERTY_LEGENDARY category = PROPERTY_TYPE_METABOLITE + max_level = 4 /datum/chem_property/special/boosting/pre_process(mob/living/M) + if(max_level > level) + level = max_level return list(REAGENT_BOOST = level) -/datum/chem_property/special/regulating - name = PROPERTY_REGULATING - code = "REG" - description = "The chemical regulates its own metabolization and can thus never cause overdosis." - rarity = PROPERTY_LEGENDARY - category = PROPERTY_TYPE_METABOLITE - max_level = 1 - -/datum/chem_property/special/regulating/reset_reagent() - holder.flags = initial(holder.flags) - ..() - -/datum/chem_property/special/regulating/update_reagent() - holder.flags |= REAGENT_CANNOT_OVERDOSE - ..() - /datum/chem_property/special/hypergenetic name = PROPERTY_HYPERGENETIC code = "HGN" @@ -352,20 +339,3 @@ holder.durationfire += 1 * level holder.durationmod += 0.1 * level ..() - -/datum/chem_property/special/firepenetrating - name = PROPERTY_FIRE_PENETRATING - code = "PTR" - description = "Gives the chemical a unique, anomalous combustion chemistry, causing the flame to react with flame-resistant material and obliterate through it." - rarity = PROPERTY_LEGENDARY - category = PROPERTY_TYPE_REACTANT - value = 8 - max_level = 1 - -/datum/chem_property/special/firepenetrating/reset_reagent() - holder.fire_penetrating = initial(holder.fire_penetrating) - ..() - -/datum/chem_property/special/firepenetrating/update_reagent() - holder.fire_penetrating = TRUE - ..() From 2bdea4332307d87c1f71840c67d903671e9b294e Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 1 May 2024 16:46:20 -0400 Subject: [PATCH 07/69] Update prop_neutral.dm --- code/modules/reagents/chemistry_properties/prop_neutral.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/reagents/chemistry_properties/prop_neutral.dm b/code/modules/reagents/chemistry_properties/prop_neutral.dm index e1e59b8b886c..0616b16895c3 100644 --- a/code/modules/reagents/chemistry_properties/prop_neutral.dm +++ b/code/modules/reagents/chemistry_properties/prop_neutral.dm @@ -592,6 +592,7 @@ rarity = PROPERTY_RARE starter = FALSE value = 3 + cost_penalty = FALSE var/heal_amount = 0.75 /datum/chem_property/neutral/transformative/process(mob/living/M, potency = 1, delta_time) From 62feeee2142e52dc10e5eb4faadeb1fbe404e03f Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 1 May 2024 16:46:41 -0400 Subject: [PATCH 08/69] Update chem_property.dm --- code/modules/reagents/chemistry_properties/chem_property.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/reagents/chemistry_properties/chem_property.dm b/code/modules/reagents/chemistry_properties/chem_property.dm index bf03b4a1c049..d8bf392cf2bc 100644 --- a/code/modules/reagents/chemistry_properties/chem_property.dm +++ b/code/modules/reagents/chemistry_properties/chem_property.dm @@ -12,6 +12,8 @@ var/updates_stats = FALSE //should the property change other variables in the reagent when added or removed? /// Should reagent with this property explode/start fire when mixed more than overdose threshold at once? var/volatile = FALSE + /// a cost penalty is added at each level above 5 (+1 at 6, +2 at 7, +4 at 8, +5 at 9, +7 at 10) + var/cost_penalty = TRUE /datum/chem_property/Destroy() holder = null From 04175d10f0a2e79d660e452169c70f665b63d4ae Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 1 May 2024 16:46:58 -0400 Subject: [PATCH 09/69] Update chem_simulator.dm --- code/modules/reagents/chemistry_machinery/chem_simulator.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry_machinery/chem_simulator.dm b/code/modules/reagents/chemistry_machinery/chem_simulator.dm index dd7f008e47d2..e15536b47169 100644 --- a/code/modules/reagents/chemistry_machinery/chem_simulator.dm +++ b/code/modules/reagents/chemistry_machinery/chem_simulator.dm @@ -441,7 +441,7 @@ min_creation_cost += slots_used - 2 for(var/datum/chem_property/P in creation_template) creation_cost += max(abs(P.value), 1) * P.level - if(P.level > 5) // a penalty is added at each level above 5 (+1 at 6, +2 at 7, +4 at 8, +5 at 9, +7 at 10) + if(P.level > 5 && P.cost_penalty) // a penalty is added at each level above 5 (+1 at 6, +2 at 7, +4 at 8, +5 at 9, +7 at 10) creation_cost += P.level - 6 + Ceiling((P.level - 5) / 2) creation_cost += ((new_od_level - 10) / 5) * 3 //3 cost for every 5 units above 10 for(var/rarity in creation_complexity) From 72dac279ed2e92e443d26040928748c66fd23a7e Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 1 May 2024 16:47:29 -0400 Subject: [PATCH 10/69] Update prop_positive.dm --- .../chemistry_properties/prop_positive.dm | 55 ++++++++++++++++--- 1 file changed, 47 insertions(+), 8 deletions(-) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index a8a11fc299ad..b861edd0ae4e 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -28,6 +28,7 @@ rarity = PROPERTY_COMMON starter = TRUE value = 1 + cost_penalty = FALSE /datum/chem_property/positive/anticorrosive/process(mob/living/M, potency = 1) M.heal_limb_damage(0, potency) @@ -47,6 +48,7 @@ rarity = PROPERTY_COMMON starter = TRUE value = 1 + cost_penalty = FALSE /datum/chem_property/positive/neogenetic/process(mob/living/M, potency = 1) M.heal_limb_damage(potency, 0) @@ -167,10 +169,9 @@ value = 3 /datum/chem_property/positive/nervestimulating/process(mob/living/M, potency = 1) - M.adjust_effect(potency*-1, PARALYZE) - M.adjust_effect(potency*-1, STUN) - M.adjust_effect(potency*-1, WEAKEN) - M.adjust_effect(-0.5*potency, STUN) + M.adjust_effect(potency*-0.80, PARALYZE) + M.adjust_effect(potency*-0.80, STUN) + M.adjust_effect(potency*-0.80, WEAKEN) if(potency > CREATE_MAX_TIER_1) M.stuttering = max(M.stuttering - POTENCY_MULTIPLIER_MEDIUM * potency, 0) M.confused = max(M.confused - POTENCY_MULTIPLIER_MEDIUM * potency, 0) @@ -201,7 +202,8 @@ /datum/chem_property/positive/musclestimulating/process(mob/living/M, potency = 1) M.reagent_move_delay_modifier -= POTENCY_MULTIPLIER_VLOW * potency M.recalculate_move_delay = TRUE - M.nutrition = max (0, M.nutrition - 0.5 * HUNGER_FACTOR) + M.take_limb_damage(1 * potency) // you're moving too hard and hurting yourself + M.nutrition = max (0, M.nutrition - 30 * HUNGER_FACTOR) if(prob(10)) M.emote(pick("twitch","blink_r","shiver")) @@ -399,7 +401,7 @@ L.time_to_knit = 600 // 6 mins if(L.time_to_knit && (L.status & LIMB_BROKEN) && L.knitting_time == -1) if(!(L.status & LIMB_SPLINTED)) - potency -= 2.5 // It'll work, but we're effectively 5 level lower. + potency -= 1 // It'll work, but we're effectively 2 levels lower. if(potency > 0) var/total_knitting_time = world.time + L.time_to_knit - min(150*potency, L.time_to_knit - 50) L.knitting_time = total_knitting_time @@ -450,6 +452,7 @@ description = "Causes a temporal freeze of all neurological processes and cellular respirations in the brain. This allows the brain to be preserved for long periods of time." rarity = PROPERTY_UNCOMMON category = PROPERTY_TYPE_REACTANT + cost_penalty = FALSE /datum/chem_property/positive/neurocryogenic/process(mob/living/M, potency = 1, delta_time) if(prob(10 * delta_time)) @@ -548,6 +551,7 @@ rarity = PROPERTY_RARE category = PROPERTY_TYPE_REACTANT value = 3 + cost_penalty = FALSE COOLDOWN_DECLARE(ghost_notif) /datum/chem_property/positive/defibrillating/on_delete(mob/living/M) @@ -684,6 +688,7 @@ rarity = PROPERTY_DISABLED category = PROPERTY_TYPE_REACTANT|PROPERTY_TYPE_COMBUSTIBLE value = 2 + cost_penalty = FALSE var/intensitymod_per_level = 0 var/radiusmod_per_level = 0 @@ -777,8 +782,6 @@ rarity = PROPERTY_COMMON value = 1 range_per_level = 1 - duration_per_level = -1 - intensity_per_level = -1 intensitymod_per_level = -0.05 radiusmod_per_level = 0.05 @@ -835,6 +838,7 @@ description = "Disrupts certain neurological processes related to communication in animals." rarity = PROPERTY_UNCOMMON category = PROPERTY_TYPE_TOXICANT + cost_penalty = FALSE /datum/chem_property/positive/disrupting/process(mob/living/M, potency = 1) to_chat(M, SPAN_NOTICE("Your mind feels oddly... quiet.")) @@ -857,6 +861,7 @@ description = "Neutralizes certain reactive chemicals and plasmas on contact. Unsafe to administer intravenously." rarity = PROPERTY_UNCOMMON category = PROPERTY_TYPE_IRRITANT + cost_penalty = FALSE /datum/chem_property/positive/neutralizing/process(mob/living/M, potency = 1) M.apply_damages(0, potency, potency * POTENCY_MULTIPLIER_LOW) @@ -992,3 +997,37 @@ /datum/chem_property/positive/anticarcinogenic/process_critical(mob/living/M, potency = 1) M.take_limb_damage(POTENCY_MULTIPLIER_MEDIUM * potency)//Hyperactive apoptosis + +/datum/chem_property/positive/regulating + name = PROPERTY_REGULATING + code = "REG" + description = "The chemical regulates its own metabolization, any ammount overdosed is turned into sugar." + rarity = PROPERTY_COMMON + category = PROPERTY_TYPE_METABOLITE + max_level = 1 + value = 0 + +/datum/chem_property/positive/regulating/reset_reagent() + holder.flags = initial(holder.flags) + ..() + +/datum/chem_property/positive/regulating/update_reagent() + holder.flags |= REAGENT_CANNOT_OVERDOSE + ..() + +/datum/chem_property/positive/firepenetrating + name = PROPERTY_FIRE_PENETRATING + code = "PTR" + description = "Gives the chemical a unique, anomalous combustion chemistry, causing the flame to react with flame-resistant material and obliterate through it." + rarity = PROPERTY_RARE + category = PROPERTY_TYPE_REACTANT + value = 8 + max_level = 1 + +/datum/chem_property/positive/firepenetrating/reset_reagent() + holder.fire_penetrating = initial(holder.fire_penetrating) + ..() + +/datum/chem_property/positive/firepenetrating/update_reagent() + holder.fire_penetrating = TRUE + ..() From 270565aec53360c23e5f7aa3972a8f690730aa41 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 1 May 2024 16:59:11 -0400 Subject: [PATCH 11/69] Update prop_positive.dm --- code/modules/reagents/chemistry_properties/prop_positive.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index b861edd0ae4e..7a9b4839c8ef 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -202,8 +202,7 @@ /datum/chem_property/positive/musclestimulating/process(mob/living/M, potency = 1) M.reagent_move_delay_modifier -= POTENCY_MULTIPLIER_VLOW * potency M.recalculate_move_delay = TRUE - M.take_limb_damage(1 * potency) // you're moving too hard and hurting yourself - M.nutrition = max (0, M.nutrition - 30 * HUNGER_FACTOR) + M.nutrition = max (0, M.nutrition - 100 * HUNGER_FACTOR) if(prob(10)) M.emote(pick("twitch","blink_r","shiver")) From 44b134e352e2eeb085c7ede162f3615f68b5aada Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 1 May 2024 16:59:51 -0400 Subject: [PATCH 12/69] Update Chemistry-Reagents.dm --- code/modules/reagents/Chemistry-Reagents.dm | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 9825c12501c0..3e4fb8f300a3 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -182,14 +182,17 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) if(potency <= 0) continue P.process(M, potency, delta_time) - if(flags & REAGENT_CANNOT_OVERDOSE) - continue if(overdose && volume > overdose) - P.process_overdose(M, potency, delta_time) - if(overdose_critical && volume > overdose_critical) - P.process_critical(M, potency, delta_time) - var/overdose_message = "[istype(src, /datum/reagent/generated) ? "custom chemical" : initial(name)] overdose" - M.last_damage_data = create_cause_data(overdose_message, last_source_mob?.resolve()) + if(flags & REAGENT_CANNOT_OVERDOSE) + var/ammount_overdosed = volume - overdose + holder.remove_reagent(id, ammount_overdosed) + holder.add_reagent("sugar", ammount_overdosed) + else + P.process_overdose(M, potency, delta_time) + if(overdose_critical && volume > overdose_critical) + P.process_critical(M, potency, delta_time) + var/overdose_message = "[istype(src, /datum/reagent/generated) ? "custom chemical" : initial(name)] overdose" + M.last_damage_data = create_cause_data(overdose_message, last_source_mob?.resolve()) if(mods[REAGENT_PURGE]) holder.remove_all_type(/datum/reagent,mods[REAGENT_PURGE] * delta_time) From 1a1bf6e47e7ccaf171874cb5bcded7ba75ed5976 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 1 May 2024 18:06:07 -0400 Subject: [PATCH 13/69] Update prop_positive.dm --- code/modules/reagents/chemistry_properties/prop_positive.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 7a9b4839c8ef..1c2c401daf1a 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -200,9 +200,9 @@ category = PROPERTY_TYPE_STIMULANT /datum/chem_property/positive/musclestimulating/process(mob/living/M, potency = 1) - M.reagent_move_delay_modifier -= POTENCY_MULTIPLIER_VLOW * potency + M.reagent_move_delay_modifier -= 0.15 * potency M.recalculate_move_delay = TRUE - M.nutrition = max (0, M.nutrition - 100 * HUNGER_FACTOR) + M.nutrition = max (0, M.nutrition - 0.5 * HUNGER_FACTOR) if(prob(10)) M.emote(pick("twitch","blink_r","shiver")) From 90fd74c2c7a81bf429c4b121b7fdfff0e496d307 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Sat, 4 May 2024 21:52:15 -0400 Subject: [PATCH 14/69] Update prop_special.dm --- code/modules/reagents/chemistry_properties/prop_special.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry_properties/prop_special.dm b/code/modules/reagents/chemistry_properties/prop_special.dm index adb8babe4303..5cfd1ad31d4c 100644 --- a/code/modules/reagents/chemistry_properties/prop_special.dm +++ b/code/modules/reagents/chemistry_properties/prop_special.dm @@ -12,7 +12,7 @@ max_level = 4 /datum/chem_property/special/boosting/pre_process(mob/living/M) - if(max_level > level) + if(level > max_level) level = max_level return list(REAGENT_BOOST = level) From 08913d0324a3991ae239040be1f8d3d7accdc8dd Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Sat, 18 May 2024 11:10:57 -0400 Subject: [PATCH 15/69] Update prop_positive.dm --- code/modules/reagents/chemistry_properties/prop_positive.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 1c2c401daf1a..163d8ba91258 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -1004,7 +1004,7 @@ rarity = PROPERTY_COMMON category = PROPERTY_TYPE_METABOLITE max_level = 1 - value = 0 + value = 2 /datum/chem_property/positive/regulating/reset_reagent() holder.flags = initial(holder.flags) From a30ff95c37290925af87eb15ba73ce516b637def Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Sat, 18 May 2024 11:11:31 -0400 Subject: [PATCH 16/69] Update prop_positive.dm --- code/modules/reagents/chemistry_properties/prop_positive.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 163d8ba91258..8a5552c5060d 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -1004,7 +1004,7 @@ rarity = PROPERTY_COMMON category = PROPERTY_TYPE_METABOLITE max_level = 1 - value = 2 + value = 1 /datum/chem_property/positive/regulating/reset_reagent() holder.flags = initial(holder.flags) From fc5b03a81141e0ab97efd8f3a36c9db9022d6e1c Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Mon, 20 May 2024 21:34:27 -0400 Subject: [PATCH 17/69] Update chemsmoke.dm --- .../objects/effects/effect_system/chemsmoke.dm | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/code/game/objects/effects/effect_system/chemsmoke.dm b/code/game/objects/effects/effect_system/chemsmoke.dm index 55c38215415c..9508a173c05f 100644 --- a/code/game/objects/effects/effect_system/chemsmoke.dm +++ b/code/game/objects/effects/effect_system/chemsmoke.dm @@ -8,6 +8,8 @@ time_to_live = 300 anchored = TRUE smokeranking = SMOKE_RANK_HIGH + alpha = 100 + var/obj/chemholder /obj/effect/particle_effect/smoke/chem/Initialize() . = ..() @@ -138,10 +140,10 @@ var/dist = cheap_pythag(T.x - location.x, T.y - location.y) if(!dist) dist = 1 - R.reaction_mob(A, volume = R.volume / dist, permeable = FALSE) + R.reaction_mob(A, volume = R.volume * POTENCY_MULTIPLIER_VLOW / dist, permeable = FALSE) else if(istype(A, /obj)) R.reaction_obj(A, R.volume) - sleep(30) + sleep(3 SECONDS) //build smoke icon @@ -166,7 +168,7 @@ continue var/offset = 0 - var/points = round((radius * 2 * PI) / arcLength) + var/points = floor((radius * 2 * PI) / arcLength) var/angle = round(ToDegrees(arcLength / radius), 1) if(!IsInteger(radius)) @@ -199,10 +201,7 @@ smoke.pixel_x = -32 + rand(-8,8) smoke.pixel_y = -32 + rand(-8,8) walk_to(smoke, T) - smoke.set_opacity(1) //switching opacity on after the smoke has spawned, and then - sleep(150+rand(0,20)) // turning it off before it is deleted results in cleaner - if(smoke.opacity) - smoke.set_opacity(0) + sleep(150+rand(0,20)) fadeOut(smoke) qdel(smoke) @@ -259,3 +258,8 @@ targetTurfs = complete return + +/obj/effect/particle_effect/smoke/chem/affect(mob/living/carbon/M) + if(reagents.reagent_list.len) + for(var/datum/reagent/reagent in reagents.reagent_list) + reagent.reaction_mob(M, volume = reagent.volume * POTENCY_MULTIPLIER_VLOW, permeable = FALSE) From 8a10ee5801c85b6420a7358e37abe64dd9dab042 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Mon, 20 May 2024 21:35:26 -0400 Subject: [PATCH 18/69] Update chemsmoke.dm --- code/game/objects/effects/effect_system/chemsmoke.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/effect_system/chemsmoke.dm b/code/game/objects/effects/effect_system/chemsmoke.dm index 9508a173c05f..f902a8b8889e 100644 --- a/code/game/objects/effects/effect_system/chemsmoke.dm +++ b/code/game/objects/effects/effect_system/chemsmoke.dm @@ -168,7 +168,7 @@ continue var/offset = 0 - var/points = floor((radius * 2 * PI) / arcLength) + var/points = round((radius * 2 * PI) / arcLength) var/angle = round(ToDegrees(arcLength / radius), 1) if(!IsInteger(radius)) From 19e9ff2c60710a18fc79f02f56a42760835f93df Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Tue, 21 May 2024 16:20:21 -0400 Subject: [PATCH 19/69] slightly better now --- code/game/objects/effects/effect_system/chemsmoke.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/effect_system/chemsmoke.dm b/code/game/objects/effects/effect_system/chemsmoke.dm index 9508a173c05f..a653c78c573b 100644 --- a/code/game/objects/effects/effect_system/chemsmoke.dm +++ b/code/game/objects/effects/effect_system/chemsmoke.dm @@ -262,4 +262,4 @@ /obj/effect/particle_effect/smoke/chem/affect(mob/living/carbon/M) if(reagents.reagent_list.len) for(var/datum/reagent/reagent in reagents.reagent_list) - reagent.reaction_mob(M, volume = reagent.volume * POTENCY_MULTIPLIER_VLOW, permeable = FALSE) + reagent.reaction_mob(M, volume = reagent.volume * POTENCY_MULTIPLIER_LOW, permeable = FALSE) From 0a2cbd4a1b8eac09b56c0d8d7295e11578e1da0d Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Tue, 21 May 2024 19:12:42 -0400 Subject: [PATCH 20/69] way too punishing this gives you 30+ brain damage from just 1 smoke puff, no other property is this bad for FF, the daze is punishing enough --- code/modules/reagents/chemistry_properties/prop_negative.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/reagents/chemistry_properties/prop_negative.dm b/code/modules/reagents/chemistry_properties/prop_negative.dm index eb4810b1774a..2452f754ee05 100644 --- a/code/modules/reagents/chemistry_properties/prop_negative.dm +++ b/code/modules/reagents/chemistry_properties/prop_negative.dm @@ -431,9 +431,6 @@ apply_neuro(M, POTENCY_MULTIPLIER_MEDIUM * potency, FALSE) /datum/chem_property/negative/neurotoxic/reaction_mob(mob/M, method = TOUCH, volume, potency) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.apply_damage(potency, BRAIN) to_chat(M, SPAN_WARNING("You start to go numb.")) M.apply_effect(potency * volume * POTENCY_MULTIPLIER_LOW, DAZE) From 39bdf210492934e3f44bf406efb6d0c285bf4da2 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Tue, 21 May 2024 21:08:48 -0400 Subject: [PATCH 21/69] why was it like this anyways? --- code/modules/reagents/chemistry_properties/prop_positive.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 8a5552c5060d..93254526a8a4 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -878,7 +878,7 @@ L.ExtinguishMob() //Extinguishes mobs on contact if(isxeno(L)) var/mob/living/carbon/xenomorph/X = M - X.plasma_stored = max(X.plasma_stored - POTENCY_MULTIPLIER_VHIGH * POTENCY_MULTIPLIER_VHIGH * potency, 0) + X.plasma_stored = max(X.plasma_stored - POTENCY_MULTIPLIER_HIGH * volume * potency, 0) /datum/chem_property/positive/neutralizing/reaction_turf(turf/T, volume, potency) if(!istype(T)) From eb3ea3b256fe5775e5b267263e1b4093ef9183c1 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 22 May 2024 12:05:06 -0400 Subject: [PATCH 22/69] Update flamer.dm --- code/modules/projectiles/magazines/flamer.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/projectiles/magazines/flamer.dm b/code/modules/projectiles/magazines/flamer.dm index bf5663cad069..3b628f9966cb 100644 --- a/code/modules/projectiles/magazines/flamer.dm +++ b/code/modules/projectiles/magazines/flamer.dm @@ -13,6 +13,7 @@ w_class = SIZE_MEDIUM //making sure you can't sneak this onto your belt. gun_type = /obj/item/weapon/gun/flamer caliber = "UT-Napthal Fuel" //Ultra Thick Napthal Fuel, from the lore book. + var/custom = FALSE //accepts custom fuels if true var/flamer_chem = "utnapthal" flags_magazine = AMMUNITION_HIDE_AMMO @@ -90,6 +91,10 @@ to_chat(user, SPAN_WARNING("You can't mix fuel mixtures!")) return + if(istype(to_add, /datum/reagent/generated) && !custom) + to_chat(user, SPAN_WARNING("[src] cannot accept custom fuels!")) + return + if(!to_add.intensityfire && to_add.id != "stablefoam" && !istype(src, /obj/item/ammo_magazine/flamer_tank/smoke)) to_chat(user, SPAN_WARNING("This chemical is not potent enough to be used in a flamethrower!")) return @@ -161,6 +166,7 @@ max_rounds = 100 max_range = 5 fuel_pressure = 1 + custom = TRUE /obj/item/ammo_magazine/flamer_tank/custom/verb/set_fuel_pressure() set name = "Change Fuel Pressure" @@ -232,6 +238,7 @@ desc = "A large fuel tank for use in the M240-T incinerator unit. This one has been modified with a pressure regulator and a large internal propellant tank. Must be manually attached." gun_type = /obj/item/weapon/gun/flamer/M240T max_rounds = 250 + custom = TRUE max_intensity = 60 max_range = 8 @@ -242,3 +249,4 @@ desc = "A tank holding powdered smoke that expands when exposed to an open flame and carries any chemicals along with it." matter = list("metal" = 3750) flamer_chem = null + custom = TRUE From e428ff793ffd65985c45efe6cdf87fa57cd2d764 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 22 May 2024 12:06:33 -0400 Subject: [PATCH 23/69] Update prop_special.dm --- code/modules/reagents/chemistry_properties/prop_special.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/reagents/chemistry_properties/prop_special.dm b/code/modules/reagents/chemistry_properties/prop_special.dm index 5cfd1ad31d4c..b78c5a67f41a 100644 --- a/code/modules/reagents/chemistry_properties/prop_special.dm +++ b/code/modules/reagents/chemistry_properties/prop_special.dm @@ -12,9 +12,7 @@ max_level = 4 /datum/chem_property/special/boosting/pre_process(mob/living/M) - if(level > max_level) - level = max_level - return list(REAGENT_BOOST = level) + return list(REAGENT_BOOST = level * 0.5) /datum/chem_property/special/hypergenetic name = PROPERTY_HYPERGENETIC From 020625d155ea35a75b8132c8e491c54902d64867 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 22 May 2024 12:14:38 -0400 Subject: [PATCH 24/69] Update chemsmoke.dm --- code/game/objects/effects/effect_system/chemsmoke.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/effects/effect_system/chemsmoke.dm b/code/game/objects/effects/effect_system/chemsmoke.dm index a653c78c573b..702760333ccc 100644 --- a/code/game/objects/effects/effect_system/chemsmoke.dm +++ b/code/game/objects/effects/effect_system/chemsmoke.dm @@ -9,7 +9,6 @@ anchored = TRUE smokeranking = SMOKE_RANK_HIGH alpha = 100 - var/obj/chemholder /obj/effect/particle_effect/smoke/chem/Initialize() . = ..() From fedf7fa6d7cc4a29099f533cc9b3f17dee055b64 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 22 May 2024 12:16:58 -0400 Subject: [PATCH 25/69] Update prop_special.dm --- code/modules/reagents/chemistry_properties/prop_special.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry_properties/prop_special.dm b/code/modules/reagents/chemistry_properties/prop_special.dm index b78c5a67f41a..917478420586 100644 --- a/code/modules/reagents/chemistry_properties/prop_special.dm +++ b/code/modules/reagents/chemistry_properties/prop_special.dm @@ -6,10 +6,9 @@ /datum/chem_property/special/boosting name = PROPERTY_BOOSTING code = "BST" - description = "Boosts the potency of all other properties in this chemical when inside the body by up to 4 levels." + description = "Boosts the potency of all other properties in this chemical when inside the body by 0.5 levels for every level that this property has." rarity = PROPERTY_LEGENDARY category = PROPERTY_TYPE_METABOLITE - max_level = 4 /datum/chem_property/special/boosting/pre_process(mob/living/M) return list(REAGENT_BOOST = level * 0.5) From 46b7b2ed56a5a653860851955a21c68dffb615a3 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 22 May 2024 12:19:12 -0400 Subject: [PATCH 26/69] Update prop_positive.dm --- .../reagents/chemistry_properties/prop_positive.dm | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 93254526a8a4..aa88459c989c 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -169,9 +169,10 @@ value = 3 /datum/chem_property/positive/nervestimulating/process(mob/living/M, potency = 1) - M.adjust_effect(potency*-0.80, PARALYZE) - M.adjust_effect(potency*-0.80, STUN) - M.adjust_effect(potency*-0.80, WEAKEN) + M.adjust_effect(potency*-1, PARALYZE) + M.adjust_effect(potency*-1, STUN) + M.adjust_effect(potency*-1, WEAKEN) + M.adjust_effect(-0.5*potency, STUN) if(potency > CREATE_MAX_TIER_1) M.stuttering = max(M.stuttering - POTENCY_MULTIPLIER_MEDIUM * potency, 0) M.confused = max(M.confused - POTENCY_MULTIPLIER_MEDIUM * potency, 0) @@ -200,7 +201,7 @@ category = PROPERTY_TYPE_STIMULANT /datum/chem_property/positive/musclestimulating/process(mob/living/M, potency = 1) - M.reagent_move_delay_modifier -= 0.15 * potency + M.reagent_move_delay_modifier -= POTENCY_MULTIPLIER_VLOW * potency M.recalculate_move_delay = TRUE M.nutrition = max (0, M.nutrition - 0.5 * HUNGER_FACTOR) if(prob(10)) @@ -1000,7 +1001,7 @@ /datum/chem_property/positive/regulating name = PROPERTY_REGULATING code = "REG" - description = "The chemical regulates its own metabolization, any ammount overdosed is turned into sugar." + description = "The chemical regulates its own metabolization, any amount overdosed is turned into sugar." rarity = PROPERTY_COMMON category = PROPERTY_TYPE_METABOLITE max_level = 1 From 8f528b184fc0176de156c18252e5b273c3bc4506 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 22 May 2024 12:22:39 -0400 Subject: [PATCH 27/69] Update Chemistry-Generator.dm --- code/modules/reagents/Chemistry-Generator.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/Chemistry-Generator.dm b/code/modules/reagents/Chemistry-Generator.dm index da98f0458b02..f4cc32be3670 100644 --- a/code/modules/reagents/Chemistry-Generator.dm +++ b/code/modules/reagents/Chemistry-Generator.dm @@ -333,7 +333,7 @@ PROPERTY_HYPOMETABOLIC = PROPERTY_HYPERMETABOLIC, PROPERTY_HYPERTHROTTLING = PROPERTY_NEUROINHIBITING, PROPERTY_FOCUSING = PROPERTY_NERVESTIMULATING, PROPERTY_THERMOSTABILIZING = PROPERTY_HYPERTHERMIC, PROPERTY_THERMOSTABILIZING = PROPERTY_HYPOTHERMIC, PROPERTY_AIDING = PROPERTY_NEUROINHIBITING, PROPERTY_OXYGENATING = PROPERTY_HYPOXEMIC, PROPERTY_ANTICARCINOGENIC = PROPERTY_CARCINOGENIC, \ - PROPERTY_CIPHERING = PROPERTY_CIPHERING_PREDATOR, PROPERTY_TRANSFORMATIVE = PROPERTY_ANTITOXIC) + PROPERTY_CIPHERING = PROPERTY_CIPHERING_PREDATOR, PROPERTY_TRANSFORMATIVE = PROPERTY_ANTITOXIC, PROPERTY_MUSCLESTIMULATING = PROPERTY_NERVESTIMULATING) //The list below defines which properties should be combined into a combo property var/list/combining_properties = list( PROPERTY_DEFIBRILLATING = list(PROPERTY_MUSCLESTIMULATING, PROPERTY_CARDIOPEUTIC),\ PROPERTY_THANATOMETABOL = list(PROPERTY_HYPOXEMIC, PROPERTY_CRYOMETABOLIZING, PROPERTY_NEUROCRYOGENIC),\ From e67016b7d9f301274f8c9104780d1007fd3af29a Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 22 May 2024 12:54:45 -0400 Subject: [PATCH 28/69] Update flamer.dm --- code/modules/projectiles/magazines/flamer.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/projectiles/magazines/flamer.dm b/code/modules/projectiles/magazines/flamer.dm index 3b628f9966cb..feaaf7bc0a79 100644 --- a/code/modules/projectiles/magazines/flamer.dm +++ b/code/modules/projectiles/magazines/flamer.dm @@ -238,7 +238,6 @@ desc = "A large fuel tank for use in the M240-T incinerator unit. This one has been modified with a pressure regulator and a large internal propellant tank. Must be manually attached." gun_type = /obj/item/weapon/gun/flamer/M240T max_rounds = 250 - custom = TRUE max_intensity = 60 max_range = 8 From bc53b3b0419a14cdd60fd8c4e7c38db4c84b37db Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 22 May 2024 19:32:55 -0400 Subject: [PATCH 29/69] Update say.dm --- code/modules/mob/living/carbon/xenomorph/say.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/xenomorph/say.dm b/code/modules/mob/living/carbon/xenomorph/say.dm index c40a50ce7523..32dbee102438 100644 --- a/code/modules/mob/living/carbon/xenomorph/say.dm +++ b/code/modules/mob/living/carbon/xenomorph/say.dm @@ -95,7 +95,7 @@ //General proc for hivemind. Lame, but effective. /mob/living/carbon/xenomorph/proc/hivemind_talk(message) if(interference) - to_chat(src, SPAN_WARNING("A headhunter temporarily cut off your psychic connection!")) + to_chat(src, SPAN_WARNING("Our psychic connection has been temporarily disabled!")) return if(SEND_SIGNAL(src, COMSIG_XENO_TRY_HIVEMIND_TALK, message) & COMPONENT_OVERRIDE_HIVEMIND_TALK) From eae6d679aa57bdab483b67f0d4eabeb533f783a6 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 22 May 2024 19:33:38 -0400 Subject: [PATCH 30/69] Update xeno_verbs.dm --- code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm b/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm index 271b06973a6b..5b7733a37ee9 100644 --- a/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm +++ b/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm @@ -12,7 +12,7 @@ return if(interference) - to_chat(src, SPAN_WARNING("A headhunter temporarily cut off our psychic connection!")) + to_chat(src, SPAN_WARNING("Our psychic connection has been temporarily disabled!")) return hive.hive_ui.open_hive_status(src) @@ -37,7 +37,7 @@ return if(interference) - to_chat(src, SPAN_WARNING("A headhunter temporarily cut off your psychic connection!")) + to_chat(src, SPAN_WARNING("Our psychic connection has been temporarily disabled!")) return hive.faction_ui.tgui_interact(src) From f3bb6df35163fecff39ace1d6c0ef052e6854b54 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 22 May 2024 22:43:06 -0400 Subject: [PATCH 31/69] Update prop_positive.dm --- code/modules/reagents/chemistry_properties/prop_positive.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index aa88459c989c..2447dd925d38 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -854,6 +854,8 @@ return var/mob/living/carbon/xenomorph/X = M X.interference += (volume * potency) + if(X.interference > 90) + X.interference = 90 /datum/chem_property/positive/neutralizing name = PROPERTY_NEUTRALIZING From 184dba5a5a79a2ddb790cb50d28f73e601f982f1 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Wed, 22 May 2024 23:09:53 -0400 Subject: [PATCH 32/69] Update flamer.dm --- code/modules/projectiles/guns/flamer/flamer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/flamer/flamer.dm b/code/modules/projectiles/guns/flamer/flamer.dm index b15856af1637..28bcc76c42df 100644 --- a/code/modules/projectiles/guns/flamer/flamer.dm +++ b/code/modules/projectiles/guns/flamer/flamer.dm @@ -277,7 +277,7 @@ var/datum/effect_system/smoke_spread/chem/smoke = new() smoke.set_up(to_disperse, 1, loca = turf) smoke.start() - sleep(2) + sleep(4) distance++ From 0682c533e04390dff0ae51f25b78b4f87a9d12bf Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 17:56:31 -0400 Subject: [PATCH 33/69] Update XenoProcs.dm --- code/modules/mob/living/carbon/xenomorph/XenoProcs.dm | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index 31f49887b5b3..1f0bb388b187 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -747,3 +747,13 @@ /// Handler callback to reset immobilization status after a successful [/mob/living/carbon/xenomorph/proc/throw_carbon] /mob/living/carbon/xenomorph/proc/throw_carbon_end(mob/living/carbon/target) REMOVE_TRAIT(target, TRAIT_IMMOBILIZED, XENO_THROW_TRAIT) + +/mob/living/carbon/xenomorph/proc/clear_debuffs(grave_period = 6) + var/debuffs = list(/datum/component/healing_reduction, /datum/component/toxic_buildup, /datum/component/speed_modifier) + //speed modifier can be a buff but using it as a buff is considered an exploit so whatever + for(var/datum/component/debuff as anything in debuffs) + var/datum/component/instance = GetComponent(debuff) + if(instance) + instance.RemoveComponent() + SetDaze(0) //from neurotoxic property + debuff_grace_period += grace_period From 7ffdacec3b2d864232a75f41e8b88ffeb32c964e Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 17:57:23 -0400 Subject: [PATCH 34/69] Update Xenomorph.dm --- code/modules/mob/living/carbon/xenomorph/Xenomorph.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm index adfb65169c88..0fb3cc582bbf 100644 --- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm @@ -303,6 +303,9 @@ bubble_icon = "alien" + ///super snowflake used for research warcrimes debuffs + var/debuff_grace_period = 0 + ///////////////////////////////////////////////////////////////////// // // Phero related vars From 325ced47fdecbb9346f70eff1a71b5812b2e87f0 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 17:58:44 -0400 Subject: [PATCH 35/69] Update life.dm --- code/modules/mob/living/carbon/xenomorph/life.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/mob/living/carbon/xenomorph/life.dm b/code/modules/mob/living/carbon/xenomorph/life.dm index 1aa83065bf16..ed013af44a73 100644 --- a/code/modules/mob/living/carbon/xenomorph/life.dm +++ b/code/modules/mob/living/carbon/xenomorph/life.dm @@ -216,6 +216,7 @@ handle_statuses()//natural decrease of stunned, knocked_down, etc... handle_interference() + handle_debuff_grade_period() return TRUE @@ -547,6 +548,11 @@ Make sure their actual health updates immediately.*/ amount *= 2 / 3 return ..() +/mob/living/carbon/xenomorph/proc/handle_debuff_grace_period() + if(debuff_grace_period) + debuff_grace_period = max(debuff_grace_period-2, 0) + return debuff_grace_period + /mob/living/carbon/xenomorph/proc/handle_interference() if(interference) interference = max(interference-2, 0) From 336825e3353dae1ae22e9a28b4aa57b5de903211 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 18:00:59 -0400 Subject: [PATCH 36/69] Update XenoProcs.dm --- code/modules/mob/living/carbon/xenomorph/XenoProcs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index 1f0bb388b187..43441de07184 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -748,7 +748,7 @@ /mob/living/carbon/xenomorph/proc/throw_carbon_end(mob/living/carbon/target) REMOVE_TRAIT(target, TRAIT_IMMOBILIZED, XENO_THROW_TRAIT) -/mob/living/carbon/xenomorph/proc/clear_debuffs(grave_period = 6) +/mob/living/carbon/xenomorph/proc/clear_debuffs(grace_period = 6) var/debuffs = list(/datum/component/healing_reduction, /datum/component/toxic_buildup, /datum/component/speed_modifier) //speed modifier can be a buff but using it as a buff is considered an exploit so whatever for(var/datum/component/debuff as anything in debuffs) From 51aae0ef53e8639f5c6c6c4d023c35f70de06404 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 18:04:55 -0400 Subject: [PATCH 37/69] Update life.dm --- code/modules/mob/living/carbon/xenomorph/life.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/xenomorph/life.dm b/code/modules/mob/living/carbon/xenomorph/life.dm index ed013af44a73..17e075cae455 100644 --- a/code/modules/mob/living/carbon/xenomorph/life.dm +++ b/code/modules/mob/living/carbon/xenomorph/life.dm @@ -216,7 +216,7 @@ handle_statuses()//natural decrease of stunned, knocked_down, etc... handle_interference() - handle_debuff_grade_period() + handle_debuff_grace_period() return TRUE From 78386161558dc4ddbafe5a306e20f93e4a87d9eb Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 18:08:05 -0400 Subject: [PATCH 38/69] Update XenoProcs.dm --- code/modules/mob/living/carbon/xenomorph/XenoProcs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index 43441de07184..b7d76fa9bde4 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -748,7 +748,7 @@ /mob/living/carbon/xenomorph/proc/throw_carbon_end(mob/living/carbon/target) REMOVE_TRAIT(target, TRAIT_IMMOBILIZED, XENO_THROW_TRAIT) -/mob/living/carbon/xenomorph/proc/clear_debuffs(grace_period = 6) +/mob/living/carbon/xenomorph/proc/clear_debuffs(grace_period = 10) var/debuffs = list(/datum/component/healing_reduction, /datum/component/toxic_buildup, /datum/component/speed_modifier) //speed modifier can be a buff but using it as a buff is considered an exploit so whatever for(var/datum/component/debuff as anything in debuffs) From a51c70416fd6bc363932250013e4e8836edfc0f1 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 19:47:26 -0400 Subject: [PATCH 39/69] Update life.dm --- code/modules/mob/living/carbon/xenomorph/life.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/life.dm b/code/modules/mob/living/carbon/xenomorph/life.dm index 17e075cae455..1aa83065bf16 100644 --- a/code/modules/mob/living/carbon/xenomorph/life.dm +++ b/code/modules/mob/living/carbon/xenomorph/life.dm @@ -216,7 +216,6 @@ handle_statuses()//natural decrease of stunned, knocked_down, etc... handle_interference() - handle_debuff_grace_period() return TRUE @@ -548,11 +547,6 @@ Make sure their actual health updates immediately.*/ amount *= 2 / 3 return ..() -/mob/living/carbon/xenomorph/proc/handle_debuff_grace_period() - if(debuff_grace_period) - debuff_grace_period = max(debuff_grace_period-2, 0) - return debuff_grace_period - /mob/living/carbon/xenomorph/proc/handle_interference() if(interference) interference = max(interference-2, 0) From e1e1d5f872c8a5ebb29d00a5e958922f76ca8a2f Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 19:47:47 -0400 Subject: [PATCH 40/69] Update Xenomorph.dm --- code/modules/mob/living/carbon/xenomorph/Xenomorph.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm index 0fb3cc582bbf..adfb65169c88 100644 --- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm @@ -303,9 +303,6 @@ bubble_icon = "alien" - ///super snowflake used for research warcrimes debuffs - var/debuff_grace_period = 0 - ///////////////////////////////////////////////////////////////////// // // Phero related vars From cdea9a2790c9404f45e10f8f394d996cd7d47b79 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 20:47:21 -0400 Subject: [PATCH 41/69] Update colonialmarines.dme --- colonialmarines.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/colonialmarines.dme b/colonialmarines.dme index 82a9692c251a..ecaf9c1317b6 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -414,6 +414,7 @@ #include "code\datums\components\overlay_lighting.dm" #include "code\datums\components\rename.dm" #include "code\datums\components\speed_modifier.dm" +#include "code\datums\components\status_effect_component.dm" #include "code\datums\components\temporary_mute.dm" #include "code\datums\components\toxin_buildup.dm" #include "code\datums\components\tutorial_status.dm" From b46d704752bf6d39d6698feb493270cf8545dade Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 20:48:20 -0400 Subject: [PATCH 42/69] Add files via upload --- code/datums/components/status_effect_component.dm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 code/datums/components/status_effect_component.dm diff --git a/code/datums/components/status_effect_component.dm b/code/datums/components/status_effect_component.dm new file mode 100644 index 000000000000..dff8945326f1 --- /dev/null +++ b/code/datums/components/status_effect_component.dm @@ -0,0 +1,14 @@ +//exists only to handle immunities for now + +/datum/component/status_effect + var/has_immunity = FALSE + var/grace_period = 20 + +/datum/component/status_effect/proc/cleanse() + has_immunity = TRUE + +/datum/component/status_effect/process(delta_time) + if(has_immunity) + grace_period -= 1 * delta_time + if(grace_period <= 0) + RemoveComponent() From f2e3e2fb1edcc8e0015fba99fd3a58ecff2bddf1 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 20:49:24 -0400 Subject: [PATCH 43/69] Update toxin_buildup.dm --- code/datums/components/toxin_buildup.dm | 27 ++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/code/datums/components/toxin_buildup.dm b/code/datums/components/toxin_buildup.dm index a30f7397e9f6..65b920d24065 100644 --- a/code/datums/components/toxin_buildup.dm +++ b/code/datums/components/toxin_buildup.dm @@ -1,4 +1,4 @@ -/datum/component/toxic_buildup +/datum/component/status_effect/toxic_buildup dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS var/toxic_buildup = 0 var/toxic_buildup_dissipation = AMOUNT_PER_TIME(5, 10 SECONDS) @@ -7,13 +7,13 @@ var/max_alpha = 35 var/glow_color = "#00ff00" -/datum/component/toxic_buildup/Initialize(toxic_buildup, toxic_buildup_dissipation = AMOUNT_PER_TIME(1, 3 SECONDS), max_buildup = 75) +/datum/component/status_effect/toxic_buildup/Initialize(toxic_buildup, toxic_buildup_dissipation = AMOUNT_PER_TIME(1, 3 SECONDS), max_buildup = 75) . = ..() src.toxic_buildup = toxic_buildup src.toxic_buildup_dissipation = toxic_buildup_dissipation src.max_buildup = max_buildup -/datum/component/toxic_buildup/InheritComponent(datum/component/toxic_buildup/C, i_am_original, toxic_buildup) +/datum/component/status_effect/toxic_buildup/InheritComponent(datum/component/status_effect/toxic_buildup/C, i_am_original, toxic_buildup) . = ..() if(!C) src.toxic_buildup += toxic_buildup @@ -22,7 +22,12 @@ src.toxic_buildup = min(src.toxic_buildup, max_buildup) -/datum/component/toxic_buildup/process(delta_time) +/datum/component/status_effect/toxic_buildup/process(delta_time) + var/atom/A = parent + if(has_immunity) + A.remove_filter("toxic_buildup") + return ..() + toxic_buildup = max(toxic_buildup - toxic_buildup_dissipation * delta_time, 0) if(ishuman(parent)) @@ -37,10 +42,9 @@ color += num2text(max_alpha*intensity, 2, 16) if(parent) - var/atom/A = parent A.add_filter("toxic_buildup", 2, list("type" = "outline", "color" = color, "size" = 1)) -/datum/component/toxic_buildup/RegisterWithParent() +/datum/component/status_effect/toxic_buildup/RegisterWithParent() START_PROCESSING(SSdcs, src) RegisterSignal(parent, list( COMSIG_XENO_PRE_CALCULATE_ARMOURED_DAMAGE_PROJECTILE, @@ -48,7 +52,7 @@ ), PROC_REF(apply_toxic_buildup)) RegisterSignal(parent, COMSIG_XENO_APPEND_TO_STAT, PROC_REF(stat_append)) -/datum/component/toxic_buildup/UnregisterFromParent() +/datum/component/status_effect/toxic_buildup/UnregisterFromParent() STOP_PROCESSING(SSdcs, src) UnregisterSignal(parent, list( COMSIG_XENO_PRE_CALCULATE_ARMOURED_DAMAGE_PROJECTILE, @@ -58,10 +62,15 @@ var/atom/A = parent A.remove_filter("toxic_buildup") -/datum/component/toxic_buildup/proc/stat_append(mob/M, list/L) +/datum/component/status_effect/toxic_buildup/proc/stat_append(mob/M, list/L) SIGNAL_HANDLER + if(has_immunity) + L += "Toxin Buildup immunity [grace_period]/[initial(grace_period)]" + return L += "Toxin Buildup: [toxic_buildup]/[max_buildup]" -/datum/component/toxic_buildup/proc/apply_toxic_buildup(mob/living/carbon/xenomorph/X, list/damagedata) +/datum/component/status_effect/toxic_buildup/proc/apply_toxic_buildup(mob/living/carbon/xenomorph/X, list/damagedata) SIGNAL_HANDLER + if(has_immunity) + return damagedata["armor"] = max(damagedata["armor"] - toxic_buildup, 0) From ef1da7cd08197eab517ce03ec601d560a5acef08 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 20:49:35 -0400 Subject: [PATCH 44/69] Update speed_modifier.dm --- code/datums/components/speed_modifier.dm | 27 ++++++++++++++++-------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/code/datums/components/speed_modifier.dm b/code/datums/components/speed_modifier.dm index 3e96fbc56777..08879f720335 100644 --- a/code/datums/components/speed_modifier.dm +++ b/code/datums/components/speed_modifier.dm @@ -3,14 +3,14 @@ //Adjusts the speed of a xenomorph the component is on. Humans will take or heal stamina damage. -/datum/component/speed_modifier +/datum/component/status_effect/speed_modifier dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS var/speed_modifier = 0 var/speed_modifier_dissipation = AMOUNT_PER_TIME(1, 2.5 SECONDS) var/max_buildup = 10 var/increase_speed = FALSE -/datum/component/speed_modifier/Initialize(speed_modifier, increase_speed = FALSE, speed_modifier_dissipation = AMOUNT_PER_TIME(1, 2.5 SECONDS), max_buildup = 10) +/datum/component/status_effect/speed_modifier/Initialize(speed_modifier, increase_speed = FALSE, speed_modifier_dissipation = AMOUNT_PER_TIME(1, 2.5 SECONDS), max_buildup = 10) if(!isxeno_human(parent)) return COMPONENT_INCOMPATIBLE . = ..() @@ -19,7 +19,7 @@ src.max_buildup = max_buildup src.increase_speed = increase_speed -/datum/component/speed_modifier/InheritComponent(datum/component/speed_modifier/C, i_am_original, speed_modifier) +/datum/component/status_effect/speed_modifier/InheritComponent(datum/component/status_effect/speed_modifier/C, i_am_original, speed_modifier) . = ..() if(!C) src.speed_modifier += speed_modifier @@ -28,7 +28,12 @@ src.speed_modifier = min(src.speed_modifier, max_buildup) -/datum/component/speed_modifier/process(delta_time) +/datum/component/status_effect/speed_modifier/process(delta_time) + var/atom/A = parent + if(has_immunity) + A.remove_filter("speed_modifier") + return ..() + if(!parent) qdel(src) speed_modifier = max(speed_modifier - speed_modifier_dissipation * delta_time, 0) @@ -47,15 +52,14 @@ var/intensity = speed_modifier/max_buildup color += num2text(MAX_ALPHA*intensity, 2, 16) - var/atom/A = parent A.add_filter("speed_modifier", 2, list("type" = "outline", "color" = color, "size" = 1)) -/datum/component/speed_modifier/RegisterWithParent() +/datum/component/status_effect/speed_modifier/RegisterWithParent() START_PROCESSING(SSdcs, src) RegisterSignal(parent, COMSIG_XENO_MOVEMENT_DELAY, PROC_REF(apply_speed_modifier)) RegisterSignal(parent, COMSIG_XENO_APPEND_TO_STAT, PROC_REF(stat_append)) -/datum/component/speed_modifier/UnregisterFromParent() +/datum/component/status_effect/speed_modifier/UnregisterFromParent() STOP_PROCESSING(SSdcs, src) UnregisterSignal(parent, list( COMSIG_XENO_MOVEMENT_DELAY, @@ -64,15 +68,20 @@ var/atom/A = parent A.remove_filter("speed_modifier") -/datum/component/speed_modifier/proc/stat_append(mob/M, list/L) +/datum/component/status_effect/speed_modifier/proc/stat_append(mob/M, list/L) SIGNAL_HANDLER + if(has_immunity) + L += "Slow immunity: [grace_period]/[initial(grace_period)]" + return if(!increase_speed) L += "Slow: [speed_modifier]/[max_buildup]" else L += "Speed Boost: [speed_modifier]/[max_buildup]" -/datum/component/speed_modifier/proc/apply_speed_modifier(mob/living/carbon/xenomorph/X, list/speeds) +/datum/component/status_effect/speed_modifier/proc/apply_speed_modifier(mob/living/carbon/xenomorph/X, list/speeds) SIGNAL_HANDLER + if(has_immunity) + return if(!increase_speed) speeds["speed"] += speed_modifier * 0.075 else //increasing speed is more effective than decreasing speed From 3f3aa72eb2326f3dde7225d8bb61ac8ba655c1cc Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 20:49:47 -0400 Subject: [PATCH 45/69] Update healing_reduction.dm --- code/datums/components/healing_reduction.dm | 27 ++++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/code/datums/components/healing_reduction.dm b/code/datums/components/healing_reduction.dm index 54ea02dc6b73..e61cbb9052a7 100644 --- a/code/datums/components/healing_reduction.dm +++ b/code/datums/components/healing_reduction.dm @@ -7,13 +7,13 @@ Healing above this strength will be reduced by the strength of the buildup. Humans will take continuous damage instead. */ -/datum/component/healing_reduction +/datum/component/status_effect/healing_reduction dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS var/healing_reduction = 0 var/healing_reduction_dissipation = AMOUNT_PER_TIME(1, 5 SECONDS) var/max_buildup = 50 //up to 50 damage off of healing max by default -/datum/component/healing_reduction/Initialize(healing_reduction, healing_reduction_dissipation = AMOUNT_PER_TIME(1, 2.5 SECONDS), max_buildup = 50) +/datum/component/status_effect/healing_reduction/Initialize(healing_reduction, healing_reduction_dissipation = AMOUNT_PER_TIME(1, 2.5 SECONDS), max_buildup = 50) if(!isxeno_human(parent)) return COMPONENT_INCOMPATIBLE . = ..() @@ -21,7 +21,7 @@ Humans will take continuous damage instead. src.healing_reduction_dissipation = healing_reduction_dissipation src.max_buildup = max_buildup -/datum/component/healing_reduction/InheritComponent(datum/component/healing_reduction/inherit_component, i_am_original, healing_reduction) +/datum/component/status_effect/healing_reduction/InheritComponent(datum/component/status_effect/healing_reduction/inherit_component, i_am_original, healing_reduction) . = ..() if(!inherit_component) src.healing_reduction += healing_reduction @@ -30,7 +30,12 @@ Humans will take continuous damage instead. src.healing_reduction = min(src.healing_reduction, max_buildup) -/datum/component/healing_reduction/process(delta_time) +/datum/component/status_effect/healing_reduction/process(delta_time) + var/atom/parent_atom = parent + if(has_immunity) + parent_atom.remove_filter("healing_reduction") + return ..() + if(!parent) qdel(src) return @@ -49,10 +54,9 @@ Humans will take continuous damage instead. var/intensity = healing_reduction/max_buildup color += num2text(MAX_ALPHA*intensity, 2, 16) - var/atom/parent_atom = parent parent_atom.add_filter("healing_reduction", 2, list("type" = "outline", "color" = color, "size" = 1)) -/datum/component/healing_reduction/RegisterWithParent() +/datum/component/status_effect/healing_reduction/RegisterWithParent() START_PROCESSING(SSdcs, src) RegisterSignal(parent, list( COMSIG_XENO_ON_HEAL, @@ -60,7 +64,7 @@ Humans will take continuous damage instead. ), PROC_REF(apply_healing_reduction)) RegisterSignal(parent, COMSIG_XENO_APPEND_TO_STAT, PROC_REF(stat_append)) -/datum/component/healing_reduction/UnregisterFromParent() +/datum/component/status_effect/healing_reduction/UnregisterFromParent() STOP_PROCESSING(SSdcs, src) UnregisterSignal(parent, list( COMSIG_XENO_ON_HEAL, @@ -70,12 +74,17 @@ Humans will take continuous damage instead. var/atom/parent_atom = parent parent_atom.remove_filter("healing_reduction") -/datum/component/healing_reduction/proc/stat_append(mob/target_mob, list/stat_list) +/datum/component/status_effect/healing_reduction/proc/stat_append(mob/target_mob, list/stat_list) SIGNAL_HANDLER + if(has_immunity) + stat_list += "Healing Reduction Immunity: [grace_period]/[initial(grace_period)]" + return stat_list += "Healing Reduction: [healing_reduction]/[max_buildup]" -/datum/component/healing_reduction/proc/apply_healing_reduction(mob/living/carbon/xenomorph/xeno, list/healing) +/datum/component/status_effect/healing_reduction/proc/apply_healing_reduction(mob/living/carbon/xenomorph/xeno, list/healing) SIGNAL_HANDLER + if(has_immunity) + return healing["healing"] -= healing_reduction #undef MAX_ALPHA From e2ed294b4cb2f6ae7df675c1844804f47bc70291 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 20:51:03 -0400 Subject: [PATCH 46/69] Update XenoProcs.dm --- .../mob/living/carbon/xenomorph/XenoProcs.dm | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index b7d76fa9bde4..4c38ccd06b13 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -748,12 +748,13 @@ /mob/living/carbon/xenomorph/proc/throw_carbon_end(mob/living/carbon/target) REMOVE_TRAIT(target, TRAIT_IMMOBILIZED, XENO_THROW_TRAIT) +/// snowflake proc to clear effects from research warcrimes /mob/living/carbon/xenomorph/proc/clear_debuffs(grace_period = 10) - var/debuffs = list(/datum/component/healing_reduction, /datum/component/toxic_buildup, /datum/component/speed_modifier) - //speed modifier can be a buff but using it as a buff is considered an exploit so whatever - for(var/datum/component/debuff as anything in debuffs) - var/datum/component/instance = GetComponent(debuff) + var/debuffs = list(/datum/component/status_effect/healing_reduction, /datum/component/status_effect/toxic_buildup, /datum/component/status_effect/speed_modifier) + for(var/datum/component/status_effect/debuff as anything in debuffs) + var/datum/component/status_effect/instance = GetComponent(debuff) if(instance) - instance.RemoveComponent() - SetDaze(0) //from neurotoxic property - debuff_grace_period += grace_period + instance.cleanse() + if(interference) + interference = 0 + interference_grace_period = 20 From f59bef5c9c1332e3c050594ceafa5588b4ed2092 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 20:51:58 -0400 Subject: [PATCH 47/69] Update XenoProcs.dm --- code/modules/mob/living/carbon/xenomorph/XenoProcs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index 4c38ccd06b13..65f3209ff53a 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -749,7 +749,7 @@ REMOVE_TRAIT(target, TRAIT_IMMOBILIZED, XENO_THROW_TRAIT) /// snowflake proc to clear effects from research warcrimes -/mob/living/carbon/xenomorph/proc/clear_debuffs(grace_period = 10) +/mob/living/carbon/xenomorph/proc/clear_debuffs(grace_period = 20) var/debuffs = list(/datum/component/status_effect/healing_reduction, /datum/component/status_effect/toxic_buildup, /datum/component/status_effect/speed_modifier) for(var/datum/component/status_effect/debuff as anything in debuffs) var/datum/component/status_effect/instance = GetComponent(debuff) @@ -757,4 +757,4 @@ instance.cleanse() if(interference) interference = 0 - interference_grace_period = 20 + interference_grace_period = grace_period From 20b7835ef408259f26fb06237b6e1f5afa89c6aa Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 20:52:59 -0400 Subject: [PATCH 48/69] Update life.dm --- code/modules/mob/living/carbon/xenomorph/life.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/carbon/xenomorph/life.dm b/code/modules/mob/living/carbon/xenomorph/life.dm index 1aa83065bf16..c22d7b476364 100644 --- a/code/modules/mob/living/carbon/xenomorph/life.dm +++ b/code/modules/mob/living/carbon/xenomorph/life.dm @@ -551,6 +551,9 @@ Make sure their actual health updates immediately.*/ if(interference) interference = max(interference-2, 0) + if(interference_grace_period) + interference_grace_period = max(interference_grace_period - 2, 0) + if(observed_xeno && observed_xeno.interference) overwatch(observed_xeno,TRUE) From cb8702fe593126811d2b8f36e8210857b84c7bb1 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 20:53:43 -0400 Subject: [PATCH 49/69] Update Xenomorph.dm --- code/modules/mob/living/carbon/xenomorph/Xenomorph.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm index adfb65169c88..7ca97298255f 100644 --- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm @@ -223,6 +223,7 @@ var/acid_splash_cooldown = 5 SECONDS //Time it takes between acid splash retaliate procs var/acid_splash_last //Last recorded time that an acid splash procced var/interference = 0 // Stagger for predator weapons. Prevents hivemind usage, queen overwatching, etc. + var/interference_grace_period = 0 //interference immunity var/mob/living/carbon/xenomorph/observed_xeno // Overwatched xeno for xeno hivemind vision var/need_weeds = TRUE // Do we need weeds to regen HP? var/datum/behavior_delegate/behavior_delegate = null // Holds behavior delegate. Governs all 'unique' hooked behavior of the Xeno. Set by caste datums and strains. From 4daf778559577d8313d2114016d50ace582dba97 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 20:59:36 -0400 Subject: [PATCH 50/69] Update XenoProcs.dm --- code/modules/mob/living/carbon/xenomorph/XenoProcs.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index 65f3209ff53a..85cf88097506 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -758,3 +758,5 @@ if(interference) interference = 0 interference_grace_period = grace_period + if(HAS_TRAIT(src, TRAIT_DAZED)) + SetDaze(0) From 48d4e5b050df5552dfff3fa1849de59d742250ed Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 21:14:08 -0400 Subject: [PATCH 51/69] Update fruit.dm --- code/modules/cm_aliens/structures/fruit.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/cm_aliens/structures/fruit.dm b/code/modules/cm_aliens/structures/fruit.dm index 02fdb2da415b..f555cac64b8c 100644 --- a/code/modules/cm_aliens/structures/fruit.dm +++ b/code/modules/cm_aliens/structures/fruit.dm @@ -131,6 +131,7 @@ playsound(loc, 'sound/voice/alien_drool1.ogg', 50, 1) mature = FALSE picked = TRUE + recipient.clear_debuffs() // all froots clear debuffs icon_state = consumed_icon_state update_icon() if(!QDELETED(bound_xeno)) From bd3ac08a21fc83c9fa00f2e997d3f1d8da2db7e7 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 21:22:16 -0400 Subject: [PATCH 52/69] Update prop_negative.dm --- code/modules/reagents/chemistry_properties/prop_negative.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry_properties/prop_negative.dm b/code/modules/reagents/chemistry_properties/prop_negative.dm index 2452f754ee05..6d565dc32f0f 100644 --- a/code/modules/reagents/chemistry_properties/prop_negative.dm +++ b/code/modules/reagents/chemistry_properties/prop_negative.dm @@ -151,7 +151,7 @@ if(isxeno(M)) var/mob/living/carbon/xenomorph/X = M if(potency > POTENCY_MAX_TIER_1) //Needs level 7+ to have any effect - X.AddComponent(/datum/component/toxic_buildup, potency * volume * 0.25) + X.AddComponent(/datum/component/status_effect/toxic_buildup, potency * volume * 0.25) to_chat(X, SPAN_XENODANGER("The corrosive substance damages your carapace!")) /datum/chem_property/negative/corrosive/reaction_obj(obj/O, volume, potency) @@ -280,7 +280,7 @@ L.wounds += I /datum/chem_property/negative/hemorrhaging/reaction_mob(mob/M, method = TOUCH, volume, potency) - M.AddComponent(/datum/component/healing_reduction, potency * volume * POTENCY_MULTIPLIER_VLOW) //deals brute DOT to humans, prevents healing for xenos + M.AddComponent(/datum/component/status_effect/healing_reduction, potency * volume * POTENCY_MULTIPLIER_VLOW) //deals brute DOT to humans, prevents healing for xenos /datum/chem_property/negative/carcinogenic name = PROPERTY_CARCINOGENIC From 0f1955a9f50bfdfd430aa0c09f9e55871d8e94dd Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 21:23:10 -0400 Subject: [PATCH 53/69] Update prop_positive.dm --- code/modules/reagents/chemistry_properties/prop_positive.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 2447dd925d38..4a0d8ff864c4 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -476,7 +476,7 @@ /datum/chem_property/positive/neurocryogenic/reaction_mob(mob/M, method = TOUCH, volume, potency = 1) if(!isxeno_human(M)) return - M.AddComponent(/datum/component/speed_modifier, potency * volume * 0.5) //Brainfreeze + M.AddComponent(/datum/component/status_effect/speed_modifier, potency * volume * 0.5) //Brainfreeze /datum/chem_property/positive/antiparasitic name = PROPERTY_ANTIPARASITIC From 4445ac8d4ecc004afa6962eb3aa16e6222c12efa Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 21:23:35 -0400 Subject: [PATCH 54/69] Update prop_special.dm --- code/modules/reagents/chemistry_properties/prop_special.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry_properties/prop_special.dm b/code/modules/reagents/chemistry_properties/prop_special.dm index 917478420586..d3e5e6efcf00 100644 --- a/code/modules/reagents/chemistry_properties/prop_special.dm +++ b/code/modules/reagents/chemistry_properties/prop_special.dm @@ -37,7 +37,7 @@ /datum/chem_property/special/hypergenetic/reaction_mob(mob/M, method=TOUCH, volume, potency) if(!isxeno_human(M)) return - M.AddComponent(/datum/component/healing_reduction, -potency * volume * POTENCY_MULTIPLIER_LOW) //reduces heal reduction if present + M.AddComponent(/datum/component/status_effect/healing_reduction, -potency * volume * POTENCY_MULTIPLIER_LOW) //reduces heal reduction if present if(ishuman(M)) //heals on contact with humans/xenos var/mob/living/carbon/human/H = M H.heal_limb_damage(potency * volume * POTENCY_MULTIPLIER_LOW) From 0cb7ebcb7f136c27097bd20b851350dc7c56738f Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 21:28:37 -0400 Subject: [PATCH 55/69] Update pistol.dm --- code/datums/ammo/bullet/pistol.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/ammo/bullet/pistol.dm b/code/datums/ammo/bullet/pistol.dm index 1c014e00601f..ced951241754 100644 --- a/code/datums/ammo/bullet/pistol.dm +++ b/code/datums/ammo/bullet/pistol.dm @@ -62,7 +62,7 @@ /datum/ammo/bullet/pistol/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + M.AddComponent(/datum/component/status_effect/toxic_buildup, acid_per_hit) /datum/ammo/bullet/pistol/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) . = ..() @@ -194,7 +194,7 @@ /datum/ammo/bullet/pistol/squash/toxin/on_hit_mob(mob/M, obj/projectile/P) . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + M.AddComponent(/datum/component/status_effect/toxic_buildup, acid_per_hit) /datum/ammo/bullet/pistol/squash/toxin/on_hit_turf(turf/T, obj/projectile/P) . = ..() From b220a543093132daf722cd8ba1897c0f0fef2ffd Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 21:29:02 -0400 Subject: [PATCH 56/69] Update revolver.dm --- code/datums/ammo/bullet/revolver.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/ammo/bullet/revolver.dm b/code/datums/ammo/bullet/revolver.dm index def0a8e31952..f9ab0b12d34e 100644 --- a/code/datums/ammo/bullet/revolver.dm +++ b/code/datums/ammo/bullet/revolver.dm @@ -47,7 +47,7 @@ /datum/ammo/bullet/revolver/marksman/toxin/on_hit_mob(mob/M, obj/projectile/P) . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + M.AddComponent(/datum/component/status_effect/toxic_buildup, acid_per_hit) /datum/ammo/bullet/revolver/marksman/toxin/on_hit_turf(turf/T, obj/projectile/P) . = ..() From d4826dc7b233c9a97636274e8ae9c905a5a283cd Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 21:29:18 -0400 Subject: [PATCH 57/69] Update rifle.dm --- code/datums/ammo/bullet/rifle.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/ammo/bullet/rifle.dm b/code/datums/ammo/bullet/rifle.dm index 7711e082a596..e127a2ba2663 100644 --- a/code/datums/ammo/bullet/rifle.dm +++ b/code/datums/ammo/bullet/rifle.dm @@ -70,7 +70,7 @@ /datum/ammo/bullet/rifle/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + M.AddComponent(/datum/component/status_effect/toxic_buildup, acid_per_hit) /datum/ammo/bullet/rifle/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) . = ..() From feabd1a34292d051329404e9d9d1b612f13d2548 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 21:29:35 -0400 Subject: [PATCH 58/69] Update smg.dm --- code/datums/ammo/bullet/smg.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/ammo/bullet/smg.dm b/code/datums/ammo/bullet/smg.dm index 3fa087972fbe..0e8983a33a87 100644 --- a/code/datums/ammo/bullet/smg.dm +++ b/code/datums/ammo/bullet/smg.dm @@ -47,7 +47,7 @@ /datum/ammo/bullet/smg/ap/toxin/on_hit_mob(mob/M, obj/projectile/P) . = ..() - M.AddComponent(/datum/component/toxic_buildup, acid_per_hit) + M.AddComponent(/datum/component/status_effect/toxic_buildup, acid_per_hit) /datum/ammo/bullet/smg/ap/toxin/on_hit_turf(turf/T, obj/projectile/P) . = ..() From 6aeac91a9fb593cae3046aaa5e44d432dfe60a55 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Thu, 23 May 2024 21:30:28 -0400 Subject: [PATCH 59/69] Update prop_positive.dm --- code/modules/reagents/chemistry_properties/prop_positive.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 4a0d8ff864c4..b96fb78085b8 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -218,7 +218,7 @@ /datum/chem_property/positive/musclestimulating/reaction_mob(mob/M, method = TOUCH, volume, potency = 1) if(!isxeno_human(M)) return - M.AddComponent(/datum/component/speed_modifier, volume, TRUE, AMOUNT_PER_TIME(1, potency SECONDS), potency*volume) //Long-lasting speed for beans, stamina for humans + M.AddComponent(/datum/component/status_effect/speed_modifier, volume, TRUE, AMOUNT_PER_TIME(1, potency SECONDS), potency*volume) //Long-lasting speed for beans, stamina for humans /datum/chem_property/positive/painkilling name = PROPERTY_PAINKILLING From 33f2003aab249ddbe8ceb27172b1826d2b98908e Mon Sep 17 00:00:00 2001 From: iloveloopers Date: Fri, 24 May 2024 01:41:02 -0400 Subject: [PATCH 60/69] vsc test --- code/modules/mob/living/carbon/xenomorph/XenoProcs.dm | 4 ++-- code/modules/mob/living/living_health_procs.dm | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index 85cf88097506..d825e313aef8 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -749,7 +749,7 @@ REMOVE_TRAIT(target, TRAIT_IMMOBILIZED, XENO_THROW_TRAIT) /// snowflake proc to clear effects from research warcrimes -/mob/living/carbon/xenomorph/proc/clear_debuffs(grace_period = 20) +/mob/living/carbon/xenomorph/proc/clear_debuffs() var/debuffs = list(/datum/component/status_effect/healing_reduction, /datum/component/status_effect/toxic_buildup, /datum/component/status_effect/speed_modifier) for(var/datum/component/status_effect/debuff as anything in debuffs) var/datum/component/status_effect/instance = GetComponent(debuff) @@ -757,6 +757,6 @@ instance.cleanse() if(interference) interference = 0 - interference_grace_period = grace_period + interference_grace_period = 20 if(HAS_TRAIT(src, TRAIT_DAZED)) SetDaze(0) diff --git a/code/modules/mob/living/living_health_procs.dm b/code/modules/mob/living/living_health_procs.dm index 15cd243d6818..38bd9b07456a 100644 --- a/code/modules/mob/living/living_health_procs.dm +++ b/code/modules/mob/living/living_health_procs.dm @@ -526,7 +526,7 @@ jitteriness = 0 dizziness = 0 stamina.apply_damage(-stamina.max_stamina) - + // restore all of a human's blood if(ishuman(src)) var/mob/living/carbon/human/H = src @@ -537,6 +537,10 @@ H.chestburst = 0 H.update_headshot_overlay() //They don't have their brains blown out anymore, if they did. + if(isxeno(src)) + var/mob/living/carbon/xenomorph/xeno = src + xeno.clear_debuffs() + // fix all of our organs restore_all_organs() From 1f41ea6c427c89723523d59046ef575bb851f47c Mon Sep 17 00:00:00 2001 From: iloveloopers Date: Fri, 24 May 2024 23:26:47 -0400 Subject: [PATCH 61/69] interference component and stuff --- .../signals/atom/mob/living/signals_xeno.dm | 3 ++ code/__DEFINES/traits.dm | 5 ++ code/datums/ammo/energy.dm | 2 +- .../components/hivemind_interference.dm | 53 +++++++++++++++++++ code/datums/components/speed_modifier.dm | 6 +-- .../components/status_effect_component.dm | 7 ++- code/datums/components/toxin_buildup.dm | 6 +-- .../objects/effects/effect_system/smoke.dm | 5 +- code/modules/cm_preds/yaut_items.dm | 2 +- code/modules/cm_preds/yaut_weapons.dm | 10 ++-- .../living/carbon/xenomorph/XenoOverwatch.dm | 2 +- .../mob/living/carbon/xenomorph/XenoProcs.dm | 20 +++---- .../mob/living/carbon/xenomorph/Xenomorph.dm | 2 - .../abilities/praetorian/praetorian_powers.dm | 7 +-- .../mob/living/carbon/xenomorph/life.dm | 15 +----- .../mob/living/carbon/xenomorph/say.dm | 2 +- .../mob/living/carbon/xenomorph/xeno_verbs.dm | 4 +- .../modules/mob/living/living_health_procs.dm | 4 -- .../chemistry_properties/prop_positive.dm | 4 +- colonialmarines.dme | 1 + 20 files changed, 100 insertions(+), 60 deletions(-) create mode 100644 code/datums/components/hivemind_interference.dm diff --git a/code/__DEFINES/dcs/signals/atom/mob/living/signals_xeno.dm b/code/__DEFINES/dcs/signals/atom/mob/living/signals_xeno.dm index e6e1e64e9c7e..ab233e9cf82c 100644 --- a/code/__DEFINES/dcs/signals/atom/mob/living/signals_xeno.dm +++ b/code/__DEFINES/dcs/signals/atom/mob/living/signals_xeno.dm @@ -78,3 +78,6 @@ /// From /mob/living/carbon/xenomorph/proc/hivemind_talk(): (message) #define COMSIG_XENO_TRY_HIVEMIND_TALK "xeno_try_hivemind_talk" #define COMPONENT_OVERRIDE_HIVEMIND_TALK (1<<0) + +/// used in /datum/component/status_effect/cleanse() +#define COMSIG_XENO_DEBUFF_CLEANSE "xeno_debuff_cleanse" diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 988f82f3b73e..7b669124a2d0 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -179,6 +179,8 @@ // HIVE TRAITS /// If the Hive is a Xenonid Hive #define TRAIT_XENONID "t_xenonid" +/// if the xeno's connection to the hivemind is cut +#define TRAIT_HIVEMIND_INTERFERENCE "t_interference" /// If the hive or xeno can use objects. #define TRAIT_OPPOSABLE_THUMBS "t_thumbs" /// If the Hive delays round end (this is overridden for some hives). Does not occur naturally. Must be applied in events. @@ -355,6 +357,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_ABILITY_NO_PLASMA_TRANSFER" = TRAIT_ABILITY_NO_PLASMA_TRANSFER, "TRAIT_ABILITY_OVIPOSITOR" = TRAIT_ABILITY_OVIPOSITOR, "TRAIT_OPPOSABLE_THUMBS" = TRAIT_OPPOSABLE_THUMBS, + "TRAIT_INTERFERENCE" = TRAIT_HIVEMIND_INTERFERENCE, ), /datum/hive_status = list( "TRAIT_XENONID" = TRAIT_XENONID, @@ -434,6 +437,8 @@ GLOBAL_LIST(trait_name_map) #define TRAIT_SOURCE_TEMPORARY_MUTE "t_s_temporary_mute" ///Status trait forced by the xeno action charge #define TRAIT_SOURCE_XENO_ACTION_CHARGE "t_s_xeno_action_charge" +///Status trait coming from hivemind interference +#define TRAIT_SOURCE_HIVEMIND_INTERFERENCE "t_s_hivemind_interference" ///Status trait coming from a xeno nest #define XENO_NEST_TRAIT "xeno_nest" ///Status trait from a generic throw by xeno abilities diff --git a/code/datums/ammo/energy.dm b/code/datums/ammo/energy.dm index 1f48806d2d52..3ddd11eedf55 100644 --- a/code/datums/ammo/energy.dm +++ b/code/datums/ammo/energy.dm @@ -229,7 +229,7 @@ if(isxeno(hit_mob)) var/mob/living/carbon/xenomorph/xeno = hit_mob xeno.apply_damage(damage * 0.75, BURN) - xeno.interference = 30 + xeno.AddComponent(/datum/component/status_effect/interference, 30, 30) /datum/ammo/energy/yautja/rifle/bolt/set_bullet_traits() . = ..() diff --git a/code/datums/components/hivemind_interference.dm b/code/datums/components/hivemind_interference.dm new file mode 100644 index 000000000000..50582e25e30a --- /dev/null +++ b/code/datums/components/hivemind_interference.dm @@ -0,0 +1,53 @@ +/datum/component/status_effect/interference + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + var/interference = 0 + var/max_buildup = 100 + var/dissipation = AMOUNT_PER_TIME(2, 2 SECONDS) + +/datum/component/status_effect/interference/Initialize(interference, max_buildup = 100, dissipation = AMOUNT_PER_TIME(2, 2 SECONDS)) + . = ..() + if(!isxeno(parent)) + return COMPONENT_INCOMPATIBLE + ADD_TRAIT(parent, TRAIT_HIVEMIND_INTERFERENCE, TRAIT_SOURCE_HIVEMIND_INTERFERENCE) + src.interference = interference + src.max_buildup = max_buildup + src.dissipation = dissipation + +/datum/component/status_effect/interference/InheritComponent(datum/component/status_effect/interference/inter, i_am_original, amount, max_buildup) + . = ..() + + src.max_buildup = max(max_buildup, src.max_buildup) //if the new component's cap is higher, use that + + if(!inter) + interference += amount + else + interference += inter.interference + +/datum/component/status_effect/interference/process(delta_time) + if(has_immunity) + return ..() + + interference = clamp(interference - dissipation * delta_time, 0, max_buildup) + + if(interference <= 0) + REMOVE_TRAIT(parent, TRAIT_HIVEMIND_INTERFERENCE, TRAIT_SOURCE_HIVEMIND_INTERFERENCE) + qdel(src) + +/datum/component/status_effect/interference/RegisterWithParent() + START_PROCESSING(SSdcs, src) + RegisterSignal(parent, COMSIG_XENO_APPEND_TO_STAT, PROC_REF(stat_append)) + +/datum/component/status_effect/interference/UnregisterFromParent() + STOP_PROCESSING(SSdcs, src) + UnregisterSignal(parent, COMSIG_XENO_APPEND_TO_STAT) + +/datum/component/status_effect/interference/proc/stat_append(mob/M, list/L) + SIGNAL_HANDLER + if(has_immunity) + L += "Hivemind Interference immunity [grace_period]/[initial(grace_period)]" + return + L += "Hivemind Interference: [interference]/[max_buildup]" + +/datum/component/status_effect/interference/cleanse() + REMOVE_TRAIT(parent, TRAIT_HIVEMIND_INTERFERENCE, TRAIT_SOURCE_HIVEMIND_INTERFERENCE) + return ..() diff --git a/code/datums/components/speed_modifier.dm b/code/datums/components/speed_modifier.dm index 08879f720335..c19d85ffd38b 100644 --- a/code/datums/components/speed_modifier.dm +++ b/code/datums/components/speed_modifier.dm @@ -29,9 +29,9 @@ src.speed_modifier = min(src.speed_modifier, max_buildup) /datum/component/status_effect/speed_modifier/process(delta_time) - var/atom/A = parent + var/atom/parent_atom = parent if(has_immunity) - A.remove_filter("speed_modifier") + parent_atom.remove_filter("speed_modifier") return ..() if(!parent) @@ -52,7 +52,7 @@ var/intensity = speed_modifier/max_buildup color += num2text(MAX_ALPHA*intensity, 2, 16) - A.add_filter("speed_modifier", 2, list("type" = "outline", "color" = color, "size" = 1)) + parent_atom.add_filter("speed_modifier", 2, list("type" = "outline", "color" = color, "size" = 1)) /datum/component/status_effect/speed_modifier/RegisterWithParent() START_PROCESSING(SSdcs, src) diff --git a/code/datums/components/status_effect_component.dm b/code/datums/components/status_effect_component.dm index dff8945326f1..f1d488c82460 100644 --- a/code/datums/components/status_effect_component.dm +++ b/code/datums/components/status_effect_component.dm @@ -4,11 +4,16 @@ var/has_immunity = FALSE var/grace_period = 20 +/datum/component/status_effect/Initialize() + . = ..() + RegisterSignal(parent, list(COMSIG_XENO_DEBUFF_CLEANSE, COMSIG_LIVING_REJUVENATED), PROC_REF(cleanse)) + /datum/component/status_effect/proc/cleanse() + SIGNAL_HANDLER has_immunity = TRUE /datum/component/status_effect/process(delta_time) if(has_immunity) grace_period -= 1 * delta_time if(grace_period <= 0) - RemoveComponent() + qdel(src) diff --git a/code/datums/components/toxin_buildup.dm b/code/datums/components/toxin_buildup.dm index 65b920d24065..513d1ab0f64f 100644 --- a/code/datums/components/toxin_buildup.dm +++ b/code/datums/components/toxin_buildup.dm @@ -23,9 +23,9 @@ src.toxic_buildup = min(src.toxic_buildup, max_buildup) /datum/component/status_effect/toxic_buildup/process(delta_time) - var/atom/A = parent + var/atom/parent_atom = parent if(has_immunity) - A.remove_filter("toxic_buildup") + parent_atom.remove_filter("toxic_buildup") return ..() toxic_buildup = max(toxic_buildup - toxic_buildup_dissipation * delta_time, 0) @@ -42,7 +42,7 @@ color += num2text(max_alpha*intensity, 2, 16) if(parent) - A.add_filter("toxic_buildup", 2, list("type" = "outline", "color" = color, "size" = 1)) + parent_atom.add_filter("toxic_buildup", 2, list("type" = "outline", "color" = color, "size" = 1)) /datum/component/status_effect/toxic_buildup/RegisterWithParent() START_PROCESSING(SSdcs, src) diff --git a/code/game/objects/effects/effect_system/smoke.dm b/code/game/objects/effects/effect_system/smoke.dm index ac0d36ead1e3..f93e135ec3d9 100644 --- a/code/game/objects/effects/effect_system/smoke.dm +++ b/code/game/objects/effects/effect_system/smoke.dm @@ -295,9 +295,8 @@ var/effect_amt = floor(6 + amount*6) if(xeno_creature) - if(xeno_creature.interference < 4) - to_chat(xeno_creature, SPAN_XENOHIGHDANGER("Your awareness dims to a small area!")) - xeno_creature.interference = 10 + to_chat(xeno_creature, SPAN_XENOHIGHDANGER("Your awareness dims to a small area!")) + xeno_creature.AddComponent(/datum/component/status_effect/interference, 10, 10) xeno_creature.blinded = TRUE else creature.apply_damage(12, OXY) diff --git a/code/modules/cm_preds/yaut_items.dm b/code/modules/cm_preds/yaut_items.dm index 22e1318a7358..bab6934237ba 100644 --- a/code/modules/cm_preds/yaut_items.dm +++ b/code/modules/cm_preds/yaut_items.dm @@ -763,7 +763,7 @@ if(isxeno(C)) var/mob/living/carbon/xenomorph/X = C C.emote("needhelp") - X.interference = 100 // Some base interference to give pred time to get some damage in, if it cannot land a single hit during this time pred is cheeks + X.AddComponent(/datum/component/status_effect/interference, 100) // Some base interference to give pred time to get some damage in, if it cannot land a single hit during this time pred is cheeks RegisterSignal(X, COMSIG_XENO_PRE_HEAL, PROC_REF(block_heal)) message_all_yautja("A hunting trap has caught something in [get_area_name(loc)]!") diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 2eaf9a5920e0..2db3c2ca4b68 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -166,7 +166,7 @@ . = ..() if((human_adapted || isyautja(user)) && isxeno(target)) var/mob/living/carbon/xenomorph/xenomorph = target - xenomorph.interference = 30 + xenomorph.AddComponent(/datum/component/status_effect/interference, 30, 30) /obj/item/weapon/yautja/sword name = "clan sword" @@ -190,7 +190,7 @@ . = ..() if((human_adapted || isyautja(user)) && isxeno(target)) var/mob/living/carbon/xenomorph/xenomorph = target - xenomorph.interference = 30 + xenomorph.AddComponent(/datum/component/status_effect/interference, 30, 30) /obj/item/weapon/yautja/scythe name = "dual war scythe" @@ -214,7 +214,7 @@ ..() if((human_adapted || isyautja(user)) && isxeno(target)) var/mob/living/carbon/xenomorph/xenomorph = target - xenomorph.interference = 15 + xenomorph.AddComponent(/datum/component/status_effect/interference, 15, 15) if(prob(15)) user.visible_message(SPAN_DANGER("An opening in combat presents itself!"),SPAN_DANGER("You manage to strike at your foe once more!")) @@ -438,7 +438,7 @@ return if((human_adapted || isspeciesyautja(user)) && isxeno(target)) var/mob/living/carbon/xenomorph/xenomorph = target - xenomorph.interference = 30 + xenomorph.AddComponent(/datum/component/status_effect/interference, 30, 30) if(target == user || target.stat == DEAD) to_chat(user, SPAN_DANGER("You think you're smart?")) //very funny @@ -769,7 +769,7 @@ return if((human_adapted || isyautja(user)) && isxeno(target)) var/mob/living/carbon/xenomorph/xenomorph = target - xenomorph.interference = 30 + xenomorph.AddComponent(/datum/component/status_effect/interference, 30, 30) /obj/item/weapon/twohanded/yautja/glaive/alt icon_state = "glaive_alt" diff --git a/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm b/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm index 0da2b61142e8..ae568c076493 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm @@ -89,7 +89,7 @@ to_chat(src, SPAN_XENOWARNING("We can't watch ourselves!")) return - if(targetXeno.interference) + if(HAS_TRAIT(targetXeno, TRAIT_HIVEMIND_INTERFERENCE)) to_chat(src, SPAN_XENOWARNING("Our sister's psychic connection is cut off!")) return diff --git a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm index d825e313aef8..45edbfe7d9e3 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoProcs.dm @@ -750,13 +750,13 @@ /// snowflake proc to clear effects from research warcrimes /mob/living/carbon/xenomorph/proc/clear_debuffs() - var/debuffs = list(/datum/component/status_effect/healing_reduction, /datum/component/status_effect/toxic_buildup, /datum/component/status_effect/speed_modifier) - for(var/datum/component/status_effect/debuff as anything in debuffs) - var/datum/component/status_effect/instance = GetComponent(debuff) - if(instance) - instance.cleanse() - if(interference) - interference = 0 - interference_grace_period = 20 - if(HAS_TRAIT(src, TRAIT_DAZED)) - SetDaze(0) + SEND_SIGNAL(src, COMSIG_XENO_DEBUFF_CLEANSE) + SetKnockOut(0) + SetStun(0) + SetKnockDown(0) + SetDaze(0) + SetSlow(0) + SetSuperslow(0) + SetRoot(0) + SetEyeBlur(0) + updatehealth() diff --git a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm index 7ca97298255f..d33adcbce714 100644 --- a/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm +++ b/code/modules/mob/living/carbon/xenomorph/Xenomorph.dm @@ -222,8 +222,6 @@ var/list/xeno_shields = list() // List of /datum/xeno_shield that holds all active shields on the Xeno. var/acid_splash_cooldown = 5 SECONDS //Time it takes between acid splash retaliate procs var/acid_splash_last //Last recorded time that an acid splash procced - var/interference = 0 // Stagger for predator weapons. Prevents hivemind usage, queen overwatching, etc. - var/interference_grace_period = 0 //interference immunity var/mob/living/carbon/xenomorph/observed_xeno // Overwatched xeno for xeno hivemind vision var/need_weeds = TRUE // Do we need weeds to regen HP? var/datum/behavior_delegate/behavior_delegate = null // Holds behavior delegate. Governs all 'unique' hooked behavior of the Xeno. Set by caste datums and strains. diff --git a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm index 010f98c9c4e9..d9e342c1f7e6 100644 --- a/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm +++ b/code/modules/mob/living/carbon/xenomorph/abilities/praetorian/praetorian_powers.dm @@ -879,12 +879,7 @@ targetXeno.visible_message(SPAN_BOLDNOTICE("[X] points at [targetXeno], and it spasms as it recuperates unnaturally quickly!")) //marines probably should know if a xeno gets rejuvenated targetXeno.xeno_jitter(1 SECONDS) //it might confuse them as to why the queen got up half a second after being AT rocketed, and give them feedback on the Praetorian rejuvenating targetXeno.flick_heal_overlay(3 SECONDS, "#F5007A") //therefore making the Praetorian a priority target - targetXeno.set_effect(0, PARALYZE) - targetXeno.set_effect(0, STUN) - targetXeno.set_effect(0, WEAKEN) - targetXeno.set_effect(0, DAZE) - targetXeno.set_effect(0, SLOW) - targetXeno.set_effect(0, SUPERSLOW) + targetXeno.clear_debuffs() use_plasma = TRUE if (use_plasma) use_plasma_owner() diff --git a/code/modules/mob/living/carbon/xenomorph/life.dm b/code/modules/mob/living/carbon/xenomorph/life.dm index c22d7b476364..a6fd0d15877d 100644 --- a/code/modules/mob/living/carbon/xenomorph/life.dm +++ b/code/modules/mob/living/carbon/xenomorph/life.dm @@ -201,7 +201,7 @@ blinded = TRUE set_stat(UNCONSCIOUS) else - if(!interference)//If their connection to hivemind is affected, their vision should be too. + if(!HAS_TRAIT(src, TRAIT_HIVEMIND_INTERFERENCE))//If their connection to hivemind is affected, their vision should be too. blinded = FALSE set_stat(CONSCIOUS) if(regular_update && halloss > 0) @@ -215,7 +215,6 @@ src.ReduceEyeBlur(1) handle_statuses()//natural decrease of stunned, knocked_down, etc... - handle_interference() return TRUE @@ -547,18 +546,6 @@ Make sure their actual health updates immediately.*/ amount *= 2 / 3 return ..() -/mob/living/carbon/xenomorph/proc/handle_interference() - if(interference) - interference = max(interference-2, 0) - - if(interference_grace_period) - interference_grace_period = max(interference_grace_period - 2, 0) - - if(observed_xeno && observed_xeno.interference) - overwatch(observed_xeno,TRUE) - - return interference - /mob/living/carbon/xenomorph/handle_slowed() if(slowed) adjust_effect(life_slow_reduction, SLOW, EFFECT_FLAG_LIFE) diff --git a/code/modules/mob/living/carbon/xenomorph/say.dm b/code/modules/mob/living/carbon/xenomorph/say.dm index 32dbee102438..038567df84fd 100644 --- a/code/modules/mob/living/carbon/xenomorph/say.dm +++ b/code/modules/mob/living/carbon/xenomorph/say.dm @@ -94,7 +94,7 @@ //General proc for hivemind. Lame, but effective. /mob/living/carbon/xenomorph/proc/hivemind_talk(message) - if(interference) + if(HAS_TRAIT(src, TRAIT_HIVEMIND_INTERFERENCE)) to_chat(src, SPAN_WARNING("Our psychic connection has been temporarily disabled!")) return diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm b/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm index 5b7733a37ee9..8a1981fe512b 100644 --- a/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm +++ b/code/modules/mob/living/carbon/xenomorph/xeno_verbs.dm @@ -11,7 +11,7 @@ to_chat(src, SPAN_WARNING("There is no Queen. We are alone.")) return - if(interference) + if(HAS_TRAIT(src, TRAIT_HIVEMIND_INTERFERENCE)) to_chat(src, SPAN_WARNING("Our psychic connection has been temporarily disabled!")) return @@ -36,7 +36,7 @@ to_chat(src, SPAN_WARNING("There is no Queen. You are alone.")) return - if(interference) + if(HAS_TRAIT(src, TRAIT_HIVEMIND_INTERFERENCE)) to_chat(src, SPAN_WARNING("Our psychic connection has been temporarily disabled!")) return diff --git a/code/modules/mob/living/living_health_procs.dm b/code/modules/mob/living/living_health_procs.dm index 38bd9b07456a..ffe1a56b59f8 100644 --- a/code/modules/mob/living/living_health_procs.dm +++ b/code/modules/mob/living/living_health_procs.dm @@ -537,10 +537,6 @@ H.chestburst = 0 H.update_headshot_overlay() //They don't have their brains blown out anymore, if they did. - if(isxeno(src)) - var/mob/living/carbon/xenomorph/xeno = src - xeno.clear_debuffs() - // fix all of our organs restore_all_organs() diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index b96fb78085b8..016344301def 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -853,9 +853,7 @@ if(!isxeno(M)) return var/mob/living/carbon/xenomorph/X = M - X.interference += (volume * potency) - if(X.interference > 90) - X.interference = 90 + X.AddComponent(/datum/component/status_effect/interference, volume * potency, 90) /datum/chem_property/positive/neutralizing name = PROPERTY_NEUTRALIZING diff --git a/colonialmarines.dme b/colonialmarines.dme index ecaf9c1317b6..89673141ac36 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -408,6 +408,7 @@ #include "code\datums\components\disk_reader.dm" #include "code\datums\components\footstep.dm" #include "code\datums\components\healing_reduction.dm" +#include "code\datums\components\hivemind_interference.dm" #include "code\datums\components\id_lock.dm" #include "code\datums\components\label.dm" #include "code\datums\components\orbiter.dm" From 9062b75c97233f4a595f97f65d1d7e619e750d50 Mon Sep 17 00:00:00 2001 From: iloveloopers Date: Fri, 24 May 2024 23:43:29 -0400 Subject: [PATCH 62/69] quick fix --- code/game/objects/effects/effect_system/smoke.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/effects/effect_system/smoke.dm b/code/game/objects/effects/effect_system/smoke.dm index f93e135ec3d9..6a8099790084 100644 --- a/code/game/objects/effects/effect_system/smoke.dm +++ b/code/game/objects/effects/effect_system/smoke.dm @@ -295,7 +295,8 @@ var/effect_amt = floor(6 + amount*6) if(xeno_creature) - to_chat(xeno_creature, SPAN_XENOHIGHDANGER("Your awareness dims to a small area!")) + if(!HAS_TRAIT(xeno_creature, TRAIT_HIVEMIND_INTERFERENCE)) + to_chat(xeno_creature, SPAN_XENOHIGHDANGER("Your awareness dims to a small area!")) xeno_creature.AddComponent(/datum/component/status_effect/interference, 10, 10) xeno_creature.blinded = TRUE else From cc24c3230ea58d1594ca73a7ad23051a64bb7378 Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Sat, 25 May 2024 01:25:32 -0400 Subject: [PATCH 63/69] Apply suggestions from code review Co-authored-by: Drathek <76988376+Drulikar@users.noreply.github.com> --- code/modules/cm_preds/yaut_items.dm | 4 ++-- .../reagents/chemistry_properties/prop_negative.dm | 4 ++-- .../reagents/chemistry_properties/prop_positive.dm | 10 ++++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/code/modules/cm_preds/yaut_items.dm b/code/modules/cm_preds/yaut_items.dm index bab6934237ba..069a8e0e8d6b 100644 --- a/code/modules/cm_preds/yaut_items.dm +++ b/code/modules/cm_preds/yaut_items.dm @@ -761,9 +761,9 @@ if(ishuman(C)) C.emote("pain") if(isxeno(C)) - var/mob/living/carbon/xenomorph/X = C + var/mob/living/carbon/xenomorph/xeno = C C.emote("needhelp") - X.AddComponent(/datum/component/status_effect/interference, 100) // Some base interference to give pred time to get some damage in, if it cannot land a single hit during this time pred is cheeks + xeno.AddComponent(/datum/component/status_effect/interference, 100) // Some base interference to give pred time to get some damage in, if it cannot land a single hit during this time pred is cheeks RegisterSignal(X, COMSIG_XENO_PRE_HEAL, PROC_REF(block_heal)) message_all_yautja("A hunting trap has caught something in [get_area_name(loc)]!") diff --git a/code/modules/reagents/chemistry_properties/prop_negative.dm b/code/modules/reagents/chemistry_properties/prop_negative.dm index 6d565dc32f0f..d09334565698 100644 --- a/code/modules/reagents/chemistry_properties/prop_negative.dm +++ b/code/modules/reagents/chemistry_properties/prop_negative.dm @@ -149,9 +149,9 @@ if(!M.unacidable) M.take_limb_damage(min(6, volume)) if(isxeno(M)) - var/mob/living/carbon/xenomorph/X = M + var/mob/living/carbon/xenomorph/xeno = M if(potency > POTENCY_MAX_TIER_1) //Needs level 7+ to have any effect - X.AddComponent(/datum/component/status_effect/toxic_buildup, potency * volume * 0.25) + xeno.AddComponent(/datum/component/status_effect/toxic_buildup, potency * volume * 0.25) to_chat(X, SPAN_XENODANGER("The corrosive substance damages your carapace!")) /datum/chem_property/negative/corrosive/reaction_obj(obj/O, volume, potency) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 016344301def..13e9e7c3ea85 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -852,8 +852,10 @@ /datum/chem_property/positive/disrupting/reaction_mob(mob/M, method=TOUCH, volume, potency) if(!isxeno(M)) return - var/mob/living/carbon/xenomorph/X = M - X.AddComponent(/datum/component/status_effect/interference, volume * potency, 90) + var/mob/living/carbon/xenomorph/xeno = M + if(!HAS_TRAIT(xeno , TRAIT_HIVEMIND_INTERFERENCE)) + to_chat(xeno , SPAN_XENOHIGHDANGER("Your awareness dims to a small area!")) + xeno.AddComponent(/datum/component/status_effect/interference, volume * potency, 90) /datum/chem_property/positive/neutralizing name = PROPERTY_NEUTRALIZING @@ -878,8 +880,8 @@ var/mob/living/L = M L.ExtinguishMob() //Extinguishes mobs on contact if(isxeno(L)) - var/mob/living/carbon/xenomorph/X = M - X.plasma_stored = max(X.plasma_stored - POTENCY_MULTIPLIER_HIGH * volume * potency, 0) + var/mob/living/carbon/xenomorph/xeno = M + xeno.plasma_stored = max(xeno.plasma_stored - POTENCY_MULTIPLIER_HIGH * volume * potency, 0) /datum/chem_property/positive/neutralizing/reaction_turf(turf/T, volume, potency) if(!istype(T)) From 5b376bcf314959e6aa0ca380961c3c984c06856e Mon Sep 17 00:00:00 2001 From: iloveloopers Date: Sat, 25 May 2024 01:36:34 -0400 Subject: [PATCH 64/69] test --- code/modules/cm_preds/yaut_items.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cm_preds/yaut_items.dm b/code/modules/cm_preds/yaut_items.dm index 069a8e0e8d6b..db0153c4d504 100644 --- a/code/modules/cm_preds/yaut_items.dm +++ b/code/modules/cm_preds/yaut_items.dm @@ -764,7 +764,7 @@ var/mob/living/carbon/xenomorph/xeno = C C.emote("needhelp") xeno.AddComponent(/datum/component/status_effect/interference, 100) // Some base interference to give pred time to get some damage in, if it cannot land a single hit during this time pred is cheeks - RegisterSignal(X, COMSIG_XENO_PRE_HEAL, PROC_REF(block_heal)) + RegisterSignal(xeno, COMSIG_XENO_PRE_HEAL, PROC_REF(block_heal)) message_all_yautja("A hunting trap has caught something in [get_area_name(loc)]!") /obj/item/hunting_trap/proc/block_heal(mob/living/carbon/xenomorph/xeno) From 91b6f0d7ae19328af3c3294cf661bd0762a1e34c Mon Sep 17 00:00:00 2001 From: iloveloopers Date: Sat, 25 May 2024 02:01:44 -0400 Subject: [PATCH 65/69] overwatch fix and interference overflow fix --- code/datums/components/hivemind_interference.dm | 2 ++ code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm | 4 ++++ code/modules/reagents/chemistry_properties/prop_negative.dm | 2 +- code/modules/reagents/chemistry_properties/prop_positive.dm | 4 ++-- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/code/datums/components/hivemind_interference.dm b/code/datums/components/hivemind_interference.dm index 50582e25e30a..6fb2e30bbb8e 100644 --- a/code/datums/components/hivemind_interference.dm +++ b/code/datums/components/hivemind_interference.dm @@ -23,6 +23,8 @@ else interference += inter.interference + interference = min(interference, max_buildup) + /datum/component/status_effect/interference/process(delta_time) if(has_immunity) return ..() diff --git a/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm b/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm index ae568c076493..62b4115c7876 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm @@ -89,6 +89,10 @@ to_chat(src, SPAN_XENOWARNING("We can't watch ourselves!")) return + if(HAS_TRAIT(src, TRAIT_HIVEMIND_INTERFERENCE)) + to_chat(src, SPAN_XENOWARNING("Our psychic connection is cut off!")) + return + if(HAS_TRAIT(targetXeno, TRAIT_HIVEMIND_INTERFERENCE)) to_chat(src, SPAN_XENOWARNING("Our sister's psychic connection is cut off!")) return diff --git a/code/modules/reagents/chemistry_properties/prop_negative.dm b/code/modules/reagents/chemistry_properties/prop_negative.dm index d09334565698..c3efad7b0f47 100644 --- a/code/modules/reagents/chemistry_properties/prop_negative.dm +++ b/code/modules/reagents/chemistry_properties/prop_negative.dm @@ -152,7 +152,7 @@ var/mob/living/carbon/xenomorph/xeno = M if(potency > POTENCY_MAX_TIER_1) //Needs level 7+ to have any effect xeno.AddComponent(/datum/component/status_effect/toxic_buildup, potency * volume * 0.25) - to_chat(X, SPAN_XENODANGER("The corrosive substance damages your carapace!")) + to_chat(xeno, SPAN_XENODANGER("The corrosive substance damages your carapace!")) /datum/chem_property/negative/corrosive/reaction_obj(obj/O, volume, potency) if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(potency * 10)) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 13e9e7c3ea85..c68fc4a0252a 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -853,8 +853,8 @@ if(!isxeno(M)) return var/mob/living/carbon/xenomorph/xeno = M - if(!HAS_TRAIT(xeno , TRAIT_HIVEMIND_INTERFERENCE)) - to_chat(xeno , SPAN_XENOHIGHDANGER("Your awareness dims to a small area!")) + if(!HAS_TRAIT(xeno, TRAIT_HIVEMIND_INTERFERENCE)) + to_chat(xeno, SPAN_XENOHIGHDANGER("Your awareness dims to a small area!")) xeno.AddComponent(/datum/component/status_effect/interference, volume * potency, 90) /datum/chem_property/positive/neutralizing From 2294031ec3f9efee2fb58f4c3525b5c31f62107f Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Fri, 24 May 2024 23:43:26 -0700 Subject: [PATCH 66/69] Reduce awareness spam if immune while getting applied --- code/datums/components/hivemind_interference.dm | 1 + code/game/objects/effects/effect_system/smoke.dm | 2 -- code/modules/reagents/chemistry_properties/prop_positive.dm | 2 -- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/code/datums/components/hivemind_interference.dm b/code/datums/components/hivemind_interference.dm index 6fb2e30bbb8e..459383808163 100644 --- a/code/datums/components/hivemind_interference.dm +++ b/code/datums/components/hivemind_interference.dm @@ -12,6 +12,7 @@ src.interference = interference src.max_buildup = max_buildup src.dissipation = dissipation + to_chat(parent, SPAN_XENOHIGHDANGER("Your awareness dims to a small area!")) /datum/component/status_effect/interference/InheritComponent(datum/component/status_effect/interference/inter, i_am_original, amount, max_buildup) . = ..() diff --git a/code/game/objects/effects/effect_system/smoke.dm b/code/game/objects/effects/effect_system/smoke.dm index 6a8099790084..5deeff9617ca 100644 --- a/code/game/objects/effects/effect_system/smoke.dm +++ b/code/game/objects/effects/effect_system/smoke.dm @@ -295,8 +295,6 @@ var/effect_amt = floor(6 + amount*6) if(xeno_creature) - if(!HAS_TRAIT(xeno_creature, TRAIT_HIVEMIND_INTERFERENCE)) - to_chat(xeno_creature, SPAN_XENOHIGHDANGER("Your awareness dims to a small area!")) xeno_creature.AddComponent(/datum/component/status_effect/interference, 10, 10) xeno_creature.blinded = TRUE else diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index c68fc4a0252a..3aeb434aa5e8 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -853,8 +853,6 @@ if(!isxeno(M)) return var/mob/living/carbon/xenomorph/xeno = M - if(!HAS_TRAIT(xeno, TRAIT_HIVEMIND_INTERFERENCE)) - to_chat(xeno, SPAN_XENOHIGHDANGER("Your awareness dims to a small area!")) xeno.AddComponent(/datum/component/status_effect/interference, volume * potency, 90) /datum/chem_property/positive/neutralizing From 39aad113b30852d019436ced88747dd6da1735bf Mon Sep 17 00:00:00 2001 From: iloveloopers Date: Sat, 25 May 2024 12:46:45 -0400 Subject: [PATCH 67/69] grace period rework + overwatch fix --- code/datums/components/status_effect_component.dm | 6 +++++- code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/code/datums/components/status_effect_component.dm b/code/datums/components/status_effect_component.dm index f1d488c82460..098c2a7b0eb0 100644 --- a/code/datums/components/status_effect_component.dm +++ b/code/datums/components/status_effect_component.dm @@ -2,7 +2,11 @@ /datum/component/status_effect var/has_immunity = FALSE - var/grace_period = 20 + var/grace_period = 5 + +/datum/component/status_effect/InheritComponent(datum/component/C, i_am_original) + if(has_immunity) + grace_period = initial(grace_period) /datum/component/status_effect/Initialize() . = ..() diff --git a/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm b/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm index 62b4115c7876..f47b5c392aa5 100644 --- a/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm +++ b/code/modules/mob/living/carbon/xenomorph/XenoOverwatch.dm @@ -139,6 +139,13 @@ if (observed_xeno && (observed_xeno.stat == DEAD || QDELETED(observed_xeno))) overwatch(null, TRUE) + if(observed_xeno && HAS_TRAIT(observed_xeno, TRAIT_HIVEMIND_INTERFERENCE)) + to_chat(src, SPAN_XENOWARNING("Our sister's psychic connection is cut off!")) + overwatch(null, TRUE) + + if(HAS_TRAIT(src, TRAIT_HIVEMIND_INTERFERENCE)) + overwatch(null, TRUE) + /mob/living/carbon/xenomorph/proc/overwatch_handle_mob_move_or_look(mob/living/carbon/xenomorph/mover, actually_moving, direction, specific_direction) SIGNAL_HANDLER From 6f42d04dd0b2d79a14e15c515e98f2883ed4d9ee Mon Sep 17 00:00:00 2001 From: iloveloopers Date: Sun, 26 May 2024 00:49:48 -0400 Subject: [PATCH 68/69] grace period buff --- code/datums/components/status_effect_component.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/components/status_effect_component.dm b/code/datums/components/status_effect_component.dm index 098c2a7b0eb0..34c077f61935 100644 --- a/code/datums/components/status_effect_component.dm +++ b/code/datums/components/status_effect_component.dm @@ -2,11 +2,11 @@ /datum/component/status_effect var/has_immunity = FALSE - var/grace_period = 5 + var/grace_period = 30 /datum/component/status_effect/InheritComponent(datum/component/C, i_am_original) if(has_immunity) - grace_period = initial(grace_period) + grace_period = min(grace_period + 1, initial(grace_period)) /datum/component/status_effect/Initialize() . = ..() From ece7e03ac7de1eae64d0b42846bcc7aad125124c Mon Sep 17 00:00:00 2001 From: iloveloopers Date: Sun, 26 May 2024 14:24:39 -0400 Subject: [PATCH 69/69] daze component + some touch ups --- .../components/hivemind_interference.dm | 2 +- code/datums/components/toxin_buildup.dm | 1 + code/datums/components/xeno/xeno_daze.dm | 58 +++++++++++++++++++ .../mob/living/carbon/xenomorph/say.dm | 4 -- .../chemistry_properties/prop_negative.dm | 10 +++- .../chemistry_properties/prop_positive.dm | 1 + colonialmarines.dme | 1 + 7 files changed, 69 insertions(+), 8 deletions(-) create mode 100644 code/datums/components/xeno/xeno_daze.dm diff --git a/code/datums/components/hivemind_interference.dm b/code/datums/components/hivemind_interference.dm index 459383808163..9a8a0db25567 100644 --- a/code/datums/components/hivemind_interference.dm +++ b/code/datums/components/hivemind_interference.dm @@ -12,7 +12,7 @@ src.interference = interference src.max_buildup = max_buildup src.dissipation = dissipation - to_chat(parent, SPAN_XENOHIGHDANGER("Your awareness dims to a small area!")) + to_chat(parent, SPAN_XENOHIGHDANGER("Our awareness dims to a small area!")) /datum/component/status_effect/interference/InheritComponent(datum/component/status_effect/interference/inter, i_am_original, amount, max_buildup) . = ..() diff --git a/code/datums/components/toxin_buildup.dm b/code/datums/components/toxin_buildup.dm index 513d1ab0f64f..d761a4b0297e 100644 --- a/code/datums/components/toxin_buildup.dm +++ b/code/datums/components/toxin_buildup.dm @@ -12,6 +12,7 @@ src.toxic_buildup = toxic_buildup src.toxic_buildup_dissipation = toxic_buildup_dissipation src.max_buildup = max_buildup + to_chat(parent, SPAN_XENOHIGHDANGER("The toxic substance damages our armor!")) /datum/component/status_effect/toxic_buildup/InheritComponent(datum/component/status_effect/toxic_buildup/C, i_am_original, toxic_buildup) . = ..() diff --git a/code/datums/components/xeno/xeno_daze.dm b/code/datums/components/xeno/xeno_daze.dm new file mode 100644 index 000000000000..1295950ad62d --- /dev/null +++ b/code/datums/components/xeno/xeno_daze.dm @@ -0,0 +1,58 @@ +//snowflake used only for warcrime's effects + +/datum/component/status_effect/daze + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + var/daze = 0 + var/max_buildup = 20 + var/dissipation = AMOUNT_PER_TIME(2, 2 SECONDS) + +/datum/component/status_effect/daze/Initialize(daze, max_buildup = 30, dissipation = AMOUNT_PER_TIME(2, 2 SECONDS)) + . = ..() + if(!isxeno(parent)) + return COMPONENT_INCOMPATIBLE + ADD_TRAIT(parent, TRAIT_DAZED, TRAIT_STATUS_EFFECT("daze_warcrimes")) + src.daze = daze + src.max_buildup = max_buildup + src.dissipation = dissipation + to_chat(parent, SPAN_XENOHIGHDANGER("We feel weak and dazed!")) + +/datum/component/status_effect/daze/InheritComponent(datum/component/status_effect/daze/daze_new, i_am_original, amount, max_buildup) + . = ..() + + src.max_buildup = max(max_buildup, src.max_buildup) //if the new component's cap is higher, use that + + if(!daze_new) + daze += amount + else + daze += daze_new.daze + + daze = min(daze, max_buildup) + +/datum/component/status_effect/daze/process(delta_time) + if(has_immunity) + return ..() + + daze = clamp(daze - dissipation * delta_time, 0, max_buildup) + + if(daze <= 0) + REMOVE_TRAIT(parent, TRAIT_DAZED, TRAIT_STATUS_EFFECT("daze_warcrimes")) + qdel(src) + +/datum/component/status_effect/daze/RegisterWithParent() + START_PROCESSING(SSdcs, src) + RegisterSignal(parent, COMSIG_XENO_APPEND_TO_STAT, PROC_REF(stat_append)) + +/datum/component/status_effect/daze/UnregisterFromParent() + STOP_PROCESSING(SSdcs, src) + UnregisterSignal(parent, COMSIG_XENO_APPEND_TO_STAT) + +/datum/component/status_effect/daze/proc/stat_append(mob/M, list/L) + SIGNAL_HANDLER + if(has_immunity) + L += "Daze immunity [grace_period]/[initial(grace_period)]" + return + L += "Daze: [daze]/[max_buildup]" + +/datum/component/status_effect/daze/cleanse() + REMOVE_TRAIT(parent, TRAIT_DAZED, TRAIT_STATUS_EFFECT("daze_warcrimes")) + return ..() diff --git a/code/modules/mob/living/carbon/xenomorph/say.dm b/code/modules/mob/living/carbon/xenomorph/say.dm index 038567df84fd..2c9404b745ef 100644 --- a/code/modules/mob/living/carbon/xenomorph/say.dm +++ b/code/modules/mob/living/carbon/xenomorph/say.dm @@ -16,10 +16,6 @@ if(stat == UNCONSCIOUS) return //Unconscious? Nope. - if(HAS_TRAIT(src, TRAIT_DAZED)) - to_chat(src, SPAN_WARNING("You are too dazed to talk.")) - return - if(copytext(message, 1, 2) == "*") if(!findtext(message, "*", 2)) //Second asterisk means it is markup for *bold*, not an *emote. return emote(lowertext(copytext(message, 2)), intentional = TRUE) diff --git a/code/modules/reagents/chemistry_properties/prop_negative.dm b/code/modules/reagents/chemistry_properties/prop_negative.dm index c3efad7b0f47..783584102182 100644 --- a/code/modules/reagents/chemistry_properties/prop_negative.dm +++ b/code/modules/reagents/chemistry_properties/prop_negative.dm @@ -152,7 +152,6 @@ var/mob/living/carbon/xenomorph/xeno = M if(potency > POTENCY_MAX_TIER_1) //Needs level 7+ to have any effect xeno.AddComponent(/datum/component/status_effect/toxic_buildup, potency * volume * 0.25) - to_chat(xeno, SPAN_XENODANGER("The corrosive substance damages your carapace!")) /datum/chem_property/negative/corrosive/reaction_obj(obj/O, volume, potency) if((istype(O,/obj/item) || istype(O,/obj/effect/glowshroom)) && prob(potency * 10)) @@ -431,8 +430,13 @@ apply_neuro(M, POTENCY_MULTIPLIER_MEDIUM * potency, FALSE) /datum/chem_property/negative/neurotoxic/reaction_mob(mob/M, method = TOUCH, volume, potency) - to_chat(M, SPAN_WARNING("You start to go numb.")) - M.apply_effect(potency * volume * POTENCY_MULTIPLIER_LOW, DAZE) + if(ishuman(M)) + var/mob/living/carbon/human/human = M + human.Daze(potency * volume * POTENCY_MULTIPLIER_VLOW) + to_chat(human, SPAN_WARNING("You start to go numb.")) + if(isxeno(M)) + var/mob/living/carbon/xenomorph/xeno = M + xeno.AddComponent(/datum/component/status_effect/daze, volume * potency * POTENCY_MULTIPLIER_LOW, 30) /datum/chem_property/negative/hypermetabolic name = PROPERTY_HYPERMETABOLIC diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index 3aeb434aa5e8..d469daff494c 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -880,6 +880,7 @@ if(isxeno(L)) var/mob/living/carbon/xenomorph/xeno = M xeno.plasma_stored = max(xeno.plasma_stored - POTENCY_MULTIPLIER_HIGH * volume * potency, 0) + to_chat(xeno, SPAN_WARNING("You feel your plasma reserves being drained!")) /datum/chem_property/positive/neutralizing/reaction_turf(turf/T, volume, potency) if(!istype(T)) diff --git a/colonialmarines.dme b/colonialmarines.dme index 89673141ac36..80c10e6e8560 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -424,6 +424,7 @@ #include "code\datums\components\autofire\_automated_fire.dm" #include "code\datums\components\autofire\autofire.dm" #include "code\datums\components\xeno\shield_slash.dm" +#include "code\datums\components\xeno\xeno_daze.dm" #include "code\datums\construction\construction_template.dm" #include "code\datums\construction\xenomorph\construction_template_xenomorph.dm" #include "code\datums\decorators\decorator.dm"