From a01b8ef43501780ad150c1dfd6b672562778aee7 Mon Sep 17 00:00:00 2001 From: phil235 Date: Thu, 16 Apr 2015 22:07:24 +0200 Subject: [PATCH] Reorganizing the reagents files. Goon chems are no longer in separate files. All reagents are back to being metabolized every tick. I adjusted the goon chem so their effects aren't changed too much. Removing some probability and randomness from goon chem effects to make it more predictable. Adding overdose to space drug. Making a drug reagent category. Changed check_ear_prot() for carbons: alien are now immune, and monkey checks their head for ear protection. Changed flashpowder flashing code and blackpowder explosion code to use already existing procs. Moved chemical_mob_spawn and goon_vortex procs to /datum/chemical_reaction/ Fixes double overdose message for sugar. Remove the "if(!M) M = holder.my_atom" at the beginning of a lot of on_mob_life procs, you already can't call on_mob_life if M is null (Chemistry-Holder.dm). Moved random_color_list to datum/reagent/colorful_reagent Nerfed healing power of stimulant. Buffed ephedrine a bit. Fixes some goon chem on_reaction() proc leaving resulting chem behind when they shouldn't. Removes Life, nitroglycerin and Corgium reagents. They're now only a chemical reaction. Moved grenade launcher and syringe gun from reagents module folder to gun folder. Added a message for the ghost when someone is trying to revive its corpse with strange reagent. (like defib) Fixes Frost oil and other consumable reagents using current_cycle var. Fixes runtime where during metabolization a reagent removes another then the latter still calls on_mob_life(). --- .../effects/effect_system/effects_other.dm | 12 +- .../food&drinks/recipes/drinks_recipes.dm | 9 +- .../food&drinks/recipes/food_mixtures.dm | 8 + .../living/carbon/alien/humanoid/humanoid.dm | 3 + code/modules/mob/living/carbon/carbon.dm | 4 + .../guns}/grenade_launcher.dm | 121 ++- .../guns}/syringe_gun.dm | 154 +-- .../reagents/Chemistry-Goon-Medicine.dm | 831 --------------- code/modules/reagents/Chemistry-Goon-Other.dm | 286 ----- .../modules/reagents/Chemistry-Goon-Readme.dm | 34 - .../modules/reagents/Chemistry-Goon-Toxins.dm | 369 ------- code/modules/reagents/Chemistry-Holder.dm | 38 +- code/modules/reagents/Chemistry-Readme.dm | 23 +- code/modules/reagents/Chemistry-Reagents.dm | 140 +++ .../Chemistry-Reagents/Blob-Reagents.dm | 4 + .../Drink-Reagents/Drinks.dm | 14 +- .../Consumable-Reagents/Food-Reagents.dm | 19 +- .../Drug-Reagents.dm} | 233 ++--- .../Chemistry-Reagents/Medicine-Reagents.dm | 594 ++++++++++- ...hemistry-Reagents.dm => Other-Reagents.dm} | 353 +++---- .../Pyrotechnic-Reagents.dm | 189 ++++ .../Chemistry-Reagents/Toxin-Reagents.dm | 288 +++++- code/modules/reagents/Chemistry-Recipes.dm | 978 ++---------------- .../reagents/Chemistry-Recipes/Drugs.dm | 48 + .../reagents/Chemistry-Recipes/Medicine.dm | 197 ++++ .../reagents/Chemistry-Recipes/Others.dm | 342 ++++++ .../Pyrotechnics.dm} | 401 +++---- .../Chemistry-Recipes/Slime_extracts.dm | 548 ++++++++++ .../reagents/Chemistry-Recipes/Toxins.dm | 95 ++ tgstation.dme | 21 +- 30 files changed, 3136 insertions(+), 3220 deletions(-) rename code/modules/{reagents => projectiles/guns}/grenade_launcher.dm (87%) rename code/modules/{reagents => projectiles/guns}/syringe_gun.dm (96%) delete mode 100644 code/modules/reagents/Chemistry-Goon-Medicine.dm delete mode 100644 code/modules/reagents/Chemistry-Goon-Other.dm delete mode 100644 code/modules/reagents/Chemistry-Goon-Readme.dm delete mode 100644 code/modules/reagents/Chemistry-Goon-Toxins.dm create mode 100644 code/modules/reagents/Chemistry-Reagents.dm rename code/modules/reagents/{Chemistry-Goon-420BlazeIt.dm => Chemistry-Reagents/Drug-Reagents.dm} (59%) rename code/modules/reagents/Chemistry-Reagents/{Chemistry-Reagents.dm => Other-Reagents.dm} (80%) create mode 100644 code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm create mode 100644 code/modules/reagents/Chemistry-Recipes/Drugs.dm create mode 100644 code/modules/reagents/Chemistry-Recipes/Medicine.dm create mode 100644 code/modules/reagents/Chemistry-Recipes/Others.dm rename code/modules/reagents/{Chemistry-Goon-Pyrotechnics.dm => Chemistry-Recipes/Pyrotechnics.dm} (57%) create mode 100644 code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm create mode 100644 code/modules/reagents/Chemistry-Recipes/Toxins.dm diff --git a/code/game/objects/effects/effect_system/effects_other.dm b/code/game/objects/effects/effect_system/effects_other.dm index 0b54d310233..740a6da9566 100644 --- a/code/game/objects/effects/effect_system/effects_other.dm +++ b/code/game/objects/effects/effect_system/effects_other.dm @@ -57,9 +57,11 @@ var/amount // TNT equivalent var/flashing = 0 // does explosion creates flash effect? var/flashing_factor = 0 // factor of how powerful the flash effect relatively to the explosion + var/explosion_message = 1 //whether we show a message to mobs. -/datum/effect/effect/system/reagents_explosion/set_up (amt, loc, flash = 0, flash_fact = 0) +/datum/effect/effect/system/reagents_explosion/set_up (amt, loc, flash = 0, flash_fact = 0, message = 1) amount = amt + explosion_message = message if(istype(loc, /turf/)) location = loc else @@ -71,13 +73,14 @@ return /datum/effect/effect/system/reagents_explosion/start() + if(explosion_message) + location.visible_message("The solution violently explodes!", \ + "You hear an explosion!") if (amount <= 2) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, location) s.start() - location.visible_message("The solution violently explodes!", \ - "You hear an explosion!") for(var/mob/M in viewers(1, location)) if (prob (50 * amount)) M << "The explosion knocks you down." @@ -102,7 +105,4 @@ if (flash && flashing_factor) flash += (round(amount/4) * flashing_factor) - location.visible_message("The solution violently explodes!", \ - "You hear an explosion!") - explosion(location, devastation, heavy, light, flash) diff --git a/code/modules/food&drinks/recipes/drinks_recipes.dm b/code/modules/food&drinks/recipes/drinks_recipes.dm index 31baf3caefc..6af179bf2f1 100644 --- a/code/modules/food&drinks/recipes/drinks_recipes.dm +++ b/code/modules/food&drinks/recipes/drinks_recipes.dm @@ -554,4 +554,11 @@ id = "gibbfloats" result = "gibbfloats" required_reagents = list("dr_gibb" = 5, "ice" = 5, "cream" = 5) - result_amount = 15 \ No newline at end of file + result_amount = 15 + +/datum/chemical_reaction/triple_citrus + name = "triple_citrus" + id = "triple_citrus" + result = "triple_citrus" + required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1) + result_amount = 5 \ No newline at end of file diff --git a/code/modules/food&drinks/recipes/food_mixtures.dm b/code/modules/food&drinks/recipes/food_mixtures.dm index 081049325e2..f6d4bf2145f 100644 --- a/code/modules/food&drinks/recipes/food_mixtures.dm +++ b/code/modules/food&drinks/recipes/food_mixtures.dm @@ -71,6 +71,14 @@ required_reagents = list("soymilk" = 4, "sacid" = 1) result_amount = 5 +/datum/chemical_reaction/corn_syrup + name = "corn_syrup" + id = "corn_syrup" + result = "corn_syrup" + required_reagents = list("corn_starch" = 1, "sacid" = 1) + result_amount = 5 + required_temp = 374 + /datum/chemical_reaction/cheesewheel name = "Cheesewheel" id = "cheesewheel" diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 310fa31f610..04060d26cef 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -130,3 +130,6 @@ /mob/living/carbon/alien/humanoid/cuff_resist(obj/item/I) playsound(src, 'sound/voice/hiss5.ogg', 40, 1, 1) //Alien roars when starting to break free ..(I, cuff_break = 1) + +/mob/living/carbon/alien/humanoid/check_ear_prot() + return 1 diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6a5c8adf054..b14567a3b9a 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -495,3 +495,7 @@ var/const/GALOSHES_DONT_HELP = 8 /mob/living/carbon/proc/is_mouth_covered(head_only = 0, mask_only = 0) if( (!mask_only && head && (head.flags & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags & MASKCOVERSMOUTH)) ) return 1 + +/mob/living/carbon/check_ear_prot() + if(head && (head.flags & HEADBANGPROTECT)) + return 1 \ No newline at end of file diff --git a/code/modules/reagents/grenade_launcher.dm b/code/modules/projectiles/guns/grenade_launcher.dm similarity index 87% rename from code/modules/reagents/grenade_launcher.dm rename to code/modules/projectiles/guns/grenade_launcher.dm index 0ae8523e6f8..7e4071a78a9 100644 --- a/code/modules/reagents/grenade_launcher.dm +++ b/code/modules/projectiles/guns/grenade_launcher.dm @@ -1,61 +1,60 @@ -/obj/item/weapon/gun/grenadelauncher - name = "grenade launcher" - desc = "a terrible, terrible thing. it's really awful!" - icon = 'icons/obj/guns/projectile.dmi' - icon_state = "riotgun" - item_state = "riotgun" - w_class = 4.0 - throw_speed = 2 - throw_range = 7 - force = 5.0 - var/list/grenades = new/list() - var/max_grenades = 3 - m_amt = 2000 - -/obj/item/weapon/gun/grenadelauncher/examine(mob/user) - ..() - user << "[grenades] / [max_grenades] grenades loaded." - -/obj/item/weapon/gun/grenadelauncher/attackby(obj/item/I as obj, mob/user as mob, params) - - if((istype(I, /obj/item/weapon/grenade))) - if(grenades.len < max_grenades) - user.drop_item() - I.loc = src - grenades += I - user << "You put the grenade in the grenade launcher." - user << "[grenades.len] / [max_grenades] Grenades." - else - usr << "The grenade launcher cannot hold more grenades." - -/obj/item/weapon/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) - - if (istype(target, /obj/item/weapon/storage/backpack )) - return - - else if (locate (/obj/structure/table, src.loc)) - return - - else if(target == user) - return - - if(grenades.len) - spawn(0) fire_grenade(target,user) - else - usr << "The grenade launcher is empty." - -/obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) - for(var/mob/O in viewers(world.view, user)) - O.show_message(text("[] fired a grenade!", user), 1) - user << "You fire the grenade launcher!" - var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! - grenades -= F - F.loc = user.loc - F.throw_at(target, 30, 2) - message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") - log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") - F.active = 1 - F.icon_state = initial(icon_state) + "_active" - playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) - spawn(15) - F.prime() +/obj/item/weapon/gun/grenadelauncher + name = "grenade launcher" + desc = "a terrible, terrible thing. it's really awful!" + icon = 'icons/obj/guns/projectile.dmi' + icon_state = "riotgun" + item_state = "riotgun" + w_class = 4.0 + throw_speed = 2 + throw_range = 7 + force = 5.0 + var/list/grenades = new/list() + var/max_grenades = 3 + m_amt = 2000 + +/obj/item/weapon/gun/grenadelauncher/examine(mob/user) + ..() + user << "[grenades] / [max_grenades] grenades loaded." + +/obj/item/weapon/gun/grenadelauncher/attackby(obj/item/I as obj, mob/user as mob, params) + + if((istype(I, /obj/item/weapon/grenade))) + if(grenades.len < max_grenades) + user.drop_item() + I.loc = src + grenades += I + user << "You put the grenade in the grenade launcher." + user << "[grenades.len] / [max_grenades] Grenades." + else + usr << "The grenade launcher cannot hold more grenades." + +/obj/item/weapon/gun/grenadelauncher/afterattack(obj/target, mob/user , flag) + + if (istype(target, /obj/item/weapon/storage/backpack )) + return + + else if (locate (/obj/structure/table, src.loc)) + return + + else if(target == user) + return + + if(grenades.len) + spawn(0) fire_grenade(target,user) + else + usr << "The grenade launcher is empty." + +/obj/item/weapon/gun/grenadelauncher/proc/fire_grenade(atom/target, mob/user) + user.visible_message("[user] fired a grenade!", \ + "You fire the grenade launcher!") + var/obj/item/weapon/grenade/chem_grenade/F = grenades[1] //Now with less copypasta! + grenades -= F + F.loc = user.loc + F.throw_at(target, 30, 2) + message_admins("[key_name_admin(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") + log_game("[key_name(user)] fired a grenade ([F.name]) from a grenade launcher ([src.name]).") + F.active = 1 + F.icon_state = initial(icon_state) + "_active" + playsound(user.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3) + spawn(15) + F.prime() diff --git a/code/modules/reagents/syringe_gun.dm b/code/modules/projectiles/guns/syringe_gun.dm similarity index 96% rename from code/modules/reagents/syringe_gun.dm rename to code/modules/projectiles/guns/syringe_gun.dm index 3786555a0e8..a662d77099d 100644 --- a/code/modules/reagents/syringe_gun.dm +++ b/code/modules/projectiles/guns/syringe_gun.dm @@ -1,77 +1,77 @@ -/obj/item/weapon/gun/syringe - name = "syringe gun" - desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance." - icon_state = "syringegun" - item_state = "syringegun" - w_class = 3 - throw_speed = 3 - throw_range = 7 - force = 4 - m_amt = 2000 - clumsy_check = 0 - fire_sound = 'sound/items/syringeproj.ogg' - var/list/syringes = list() - var/max_syringes = 1 - -/obj/item/weapon/gun/syringe/New() - ..() - chambered = new /obj/item/ammo_casing/syringegun(src) - -/obj/item/weapon/gun/syringe/proc/newshot() - if(!syringes.len) return - - var/obj/item/weapon/reagent_containers/syringe/S = syringes[1] - - if(!S) return - - chambered.BB = new /obj/item/projectile/bullet/dart/syringe(src) - S.reagents.trans_to(chambered.BB, S.reagents.total_volume) - chambered.BB.name = S.name - syringes.Remove(S) - - qdel(S) - return - -/obj/item/weapon/gun/syringe/process_chamber() - return - -/obj/item/weapon/gun/syringe/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, params) - newshot() - ..() - -/obj/item/weapon/gun/syringe/examine(mob/user) - ..() - user << "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining." - -/obj/item/weapon/gun/syringe/attack_self(mob/living/user as mob) - if(!syringes.len) - user << "[src] is empty." - return 0 - - var/obj/item/weapon/reagent_containers/syringe/S = syringes[syringes.len] - - if(!S) return 0 - S.loc = user.loc - - syringes.Remove(S) - user << "You unload [S] from \the [src]!" - - return 1 - -/obj/item/weapon/gun/syringe/attackby(var/obj/item/A as obj, mob/user as mob, params, var/show_msg = 1) - if(istype(A, /obj/item/weapon/reagent_containers/syringe)) - if(syringes.len < max_syringes) - user.drop_item() - user << "You load [A] into \the [src]." - syringes.Add(A) - A.loc = src - return 1 - else - usr << "[src] cannot hold more syringes." - return 0 - -/obj/item/weapon/gun/syringe/rapidsyringe - name = "rapid syringe gun" - desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes." - icon_state = "rapidsyringegun" - max_syringes = 6 +/obj/item/weapon/gun/syringe + name = "syringe gun" + desc = "A spring loaded rifle designed to fit syringes, used to incapacitate unruly patients from a distance." + icon_state = "syringegun" + item_state = "syringegun" + w_class = 3 + throw_speed = 3 + throw_range = 7 + force = 4 + m_amt = 2000 + clumsy_check = 0 + fire_sound = 'sound/items/syringeproj.ogg' + var/list/syringes = list() + var/max_syringes = 1 + +/obj/item/weapon/gun/syringe/New() + ..() + chambered = new /obj/item/ammo_casing/syringegun(src) + +/obj/item/weapon/gun/syringe/proc/newshot() + if(!syringes.len) return + + var/obj/item/weapon/reagent_containers/syringe/S = syringes[1] + + if(!S) return + + chambered.BB = new /obj/item/projectile/bullet/dart/syringe(src) + S.reagents.trans_to(chambered.BB, S.reagents.total_volume) + chambered.BB.name = S.name + syringes.Remove(S) + + qdel(S) + return + +/obj/item/weapon/gun/syringe/process_chamber() + return + +/obj/item/weapon/gun/syringe/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, params) + newshot() + ..() + +/obj/item/weapon/gun/syringe/examine(mob/user) + ..() + user << "Can hold [max_syringes] syringe\s. Has [syringes.len] syringe\s remaining." + +/obj/item/weapon/gun/syringe/attack_self(mob/living/user as mob) + if(!syringes.len) + user << "[src] is empty." + return 0 + + var/obj/item/weapon/reagent_containers/syringe/S = syringes[syringes.len] + + if(!S) return 0 + S.loc = user.loc + + syringes.Remove(S) + user << "You unload [S] from \the [src]!" + + return 1 + +/obj/item/weapon/gun/syringe/attackby(var/obj/item/A as obj, mob/user as mob, params, var/show_msg = 1) + if(istype(A, /obj/item/weapon/reagent_containers/syringe)) + if(syringes.len < max_syringes) + user.drop_item() + user << "You load [A] into \the [src]." + syringes.Add(A) + A.loc = src + return 1 + else + usr << "[src] cannot hold more syringes." + return 0 + +/obj/item/weapon/gun/syringe/rapidsyringe + name = "rapid syringe gun" + desc = "A modification of the syringe gun design, using a rotating cylinder to store up to six syringes." + icon_state = "rapidsyringegun" + max_syringes = 6 diff --git a/code/modules/reagents/Chemistry-Goon-Medicine.dm b/code/modules/reagents/Chemistry-Goon-Medicine.dm deleted file mode 100644 index 2659fed7197..00000000000 --- a/code/modules/reagents/Chemistry-Goon-Medicine.dm +++ /dev/null @@ -1,831 +0,0 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 - -#define REM REAGENTS_EFFECT_MULTIPLIER - -datum/reagent/silver_sulfadiazine - name = "Silver Sulfadiazine" - id = "silver_sulfadiazine" - description = "On touch, quickly heals burn damage. Basic anti-burn healing drug. On ingestion, deals minor toxin damage." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 2 - -datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) - if(iscarbon(M)) - if(method == TOUCH) - M.adjustFireLoss(-volume) - if(show_message) - M << "You feel your burns healing!" - M.emote("scream") - if(method == INGEST) - M.adjustToxLoss(0.5*volume) - if(show_message) - M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" - ..() - return - -datum/reagent/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustFireLoss(-2*REM) - ..() - return - -datum/reagent/styptic_powder - name = "Styptic Powder" - id = "styptic_powder" - description = "On touch, quickly heals brute damage. Basic anti-brute healing drug. On ingestion, deals minor toxin damage." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 2 - -datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) - if(iscarbon(M)) - if(method == TOUCH) - M.adjustBruteLoss(-volume) - if(show_message) - M << "You feel your wounds knitting back together!" - M.emote("scream") - if(method == INGEST) - M.adjustToxLoss(0.5*volume) - if(show_message) - M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" - ..() - return - -datum/reagent/styptic_powder/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(55)) - M.adjustBruteLoss(-8*REM) - ..() - return - -datum/reagent/salglu_solution - name = "Saline-Glucose Solution" - id = "salglu_solution" - description = "Has a 33% chance per metabolism cycle to heal brute and burn damage." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(33)) - M.adjustBruteLoss(-1*REM) - M.adjustFireLoss(-1*REM) - ..() - return - -datum/reagent/synthflesh - name = "Synthflesh" - id = "synthflesh" - description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume,var/show_message = 1) - if(!M) M = holder.my_atom - if(iscarbon(M)) - if(method == TOUCH) - M.adjustBruteLoss(-1.5*volume) - M.adjustFireLoss(-1.5*volume) - if(show_message) - M << "You feel your burns healing and your flesh knitting together!" - ..() - return - -datum/reagent/charcoal - name = "Charcoal" - id = "charcoal" - description = "Heals toxin damage, and will also slowly remove any other chemicals." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(-3*REM) - for(var/datum/reagent/R in M.reagents.reagent_list) - if(R != src) - M.reagents.remove_reagent(R.id,1) - ..() - return - -/datum/chemical_reaction/charcoal - name = "Charcoal" - id = "charcoal" - result = "charcoal" - required_reagents = list("ash" = 1, "sodiumchloride" = 1) - result_amount = 2 - mix_message = "The mixture yields a fine black powder." - required_temp = 380 - -/datum/chemical_reaction/silver_sulfadiazine - name = "Silver Sulfadiazine" - id = "silver_sulfadiazine" - result = "silver_sulfadiazine" - required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1) - result_amount = 5 - -/datum/chemical_reaction/salglu_solution - name = "Saline-Glucose Solution" - id = "salglu_solution" - result = "salglu_solution" - required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1) - result_amount = 3 - -/datum/chemical_reaction/synthflesh - name = "Synthflesh" - id = "synthflesh" - result = "synthflesh" - required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1) - result_amount = 3 - -/datum/chemical_reaction/styptic_powder - name = "Styptic Powder" - id = "styptic_powder" - result = "styptic_powder" - required_reagents = list("aluminium" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1) - result_amount = 4 - mix_message = "The solution yields an astringent powder." - -datum/reagent/omnizine - name = "Omnizine" - id = "omnizine" - description = "Heals 1 of each damage type a cycle. If overdosed it will deal significant amounts of each damage type." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.2 - overdose_threshold = 30 - -datum/reagent/omnizine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(-1*REM) - M.adjustOxyLoss(-1*REM) - M.adjustBruteLoss(-1*REM) - M.adjustFireLoss(-1*REM) - ..() - return - -datum/reagent/omnizine/overdose_process(var/mob/living/M as mob) - M.adjustToxLoss(3*REM) - M.adjustOxyLoss(3*REM) - M.adjustBruteLoss(3*REM) - M.adjustFireLoss(3*REM) - ..() - return - -datum/reagent/calomel - name = "Calomel" - id = "calomel" - description = "Quickly purges the body of all chemicals. If your health is above 20, toxin damage is dealt. When you hit 20 health or lower, the damage will cease." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/calomel/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - for(var/datum/reagent/R in M.reagents.reagent_list) - if(R != src) - M.reagents.remove_reagent(R.id,5) - if(M.health > 20) - M.adjustToxLoss(5*REM) - ..() - return - -/datum/chemical_reaction/calomel - name = "Calomel" - id = "calomel" - result = "calomel" - required_reagents = list("mercury" = 1, "chlorine" = 1) - result_amount = 2 - required_temp = 374 - -datum/reagent/potass_iodide - name = "Potassium Iodide" - id = "potass_iodide" - description = "Reduces low radiation damage very effectively." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/potass_iodide/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.radiation > 0) - if(prob(80)) - M.radiation-- - if(M.radiation < 0) - M.radiation = 0 - ..() - return - -/datum/chemical_reaction/potass_iodide - name = "Potassium Iodide" - id = "potass_iodide" - result = "potass_iodide" - required_reagents = list("potassium" = 1, "iodine" = 1) - result_amount = 2 - -datum/reagent/pen_acid - name = "Pentetic Acid" - id = "pen_acid" - description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body. Has a chance of dealing brute damage." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/pen_acid/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.radiation > 0) - M.radiation -= 7 - M.adjustToxLoss(-4*REM) - if(prob(33)) - M.adjustBruteLoss(1*REM) - if(M.radiation < 0) - M.radiation = 0 - for(var/datum/reagent/R in M.reagents.reagent_list) - if(R != src) - M.reagents.remove_reagent(R.id,4) - ..() - return - -/datum/chemical_reaction/pen_acid - name = "Pentetic Acid" - id = "pen_acid" - result = "pen_acid" - required_reagents = list("fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1) - result_amount = 6 - -datum/reagent/sal_acid - name = "Salicyclic Acid" - id = "sal_acid" - description = "If you have less than 50 brute damage, there is a 50% chance to heal one unit. If overdosed it will have a 50% chance to deal 2 brute damage if the patient has less than 50 brute damage already." - reagent_state = LIQUID - color = "#C8A5DC" - overdose_threshold = 25 - -datum/reagent/sal_acid/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.getBruteLoss() < 50) - if(prob(50)) - M.adjustBruteLoss(-1*REM) - ..() - return - -datum/reagent/sal_acid/overdose_process(var/mob/living/M as mob) - if(M.getBruteLoss() < 50) - if(prob(50)) - M.adjustBruteLoss(2*REM) - ..() - return - -/datum/chemical_reaction/sal_acid - name = "Salicyclic Acid" - id = "sal_acid" - result = "sal_acid" - required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1) - result_amount = 5 - -datum/reagent/salbutamol - name = "Salbutamol" - id = "salbutamol" - description = "Quickly heals oxygen damage while slowing down suffocation. Great for stabilizing critical patients!" - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.2 - -datum/reagent/salbutamol/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustOxyLoss(-6*REM) - if(M.losebreath >= 4) - M.losebreath -= 4 - ..() - return - -/datum/chemical_reaction/salbutamol - name = "Salbutamol" - id = "salbutamol" - result = "salbutamol" - required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminium" = 1, "bromine" = 1, "ammonia" = 1) - result_amount = 5 - -datum/reagent/perfluorodecalin - name = "Perfluorodecalin" - id = "perfluorodecalin" - description = "Heals suffocation damage so quickly that you could have a spacewalk, but it mutes your voice. Has a 33% chance of healing brute and burn damage per cycle as well." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.2 - -datum/reagent/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob) - if(!M) M = holder.my_atom - M.adjustOxyLoss(-25*REM) - M.silent = max(M.silent, 5) - if(prob(33)) - M.adjustBruteLoss(-1*REM) - M.adjustFireLoss(-1*REM) - ..() - return - -/datum/chemical_reaction/perfluorodecalin - name = "Perfluorodecalin" - id = "perfluorodecalin" - result = "perfluorodecalin" - required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1) - result_amount = 3 - required_temp = 370 - mix_message = "The mixture rapidly turns into a dense pink liquid." - -datum/reagent/ephedrine - name = "Ephedrine" - id = "ephedrine" - description = "Reduces stun times, increases run speed. If overdosed it will deal toxin and oxyloss damage." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.3 - overdose_threshold = 45 - addiction_threshold = 30 - -datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.status_flags |= IGNORESLOWDOWN - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - M.adjustStaminaLoss(-1*REM) - ..() - return - -datum/reagent/ephedrine/overdose_process(var/mob/living/M as mob) - if(prob(33)) - M.adjustToxLoss(1*REM) - M.losebreath++ - ..() - return - -datum/reagent/ephedrine/addiction_act_stage1(var/mob/living/M as mob) - if(prob(33)) - M.adjustToxLoss(2*REM) - M.losebreath += 2 - ..() - return -datum/reagent/ephedrine/addiction_act_stage2(var/mob/living/M as mob) - if(prob(33)) - M.adjustToxLoss(3*REM) - M.losebreath += 3 - ..() - return -datum/reagent/ephedrine/addiction_act_stage3(var/mob/living/M as mob) - if(prob(33)) - M.adjustToxLoss(4*REM) - M.losebreath += 4 - ..() - return -datum/reagent/ephedrine/addiction_act_stage4(var/mob/living/M as mob) - if(prob(33)) - M.adjustToxLoss(5*REM) - M.losebreath += 5 - ..() - return - -/datum/chemical_reaction/ephedrine - name = "Ephedrine" - id = "ephedrine" - result = "ephedrine" - required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1) - result_amount = 4 - mix_message = "The solution fizzes and gives off toxic fumes." - -datum/reagent/diphenhydramine - name = "Diphenhydramine" - id = "diphenhydramine" - description = "Purges body of lethal Histamine and reduces jitteriness while causing minor drowsiness." - reagent_state = LIQUID - color = "#C8A5DC" -datum/reagent/diphenhydramine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.drowsyness += 1 - M.jitteriness -= 1 - M.reagents.remove_reagent("histamine",3) - ..() - return - -/datum/chemical_reaction/diphenhydramine - name = "Diphenhydramine" - id = "diphenhydramine" - result = "diphenhydramine" - required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1) - result_amount = 4 - mix_message = "The mixture dries into a pale blue powder." - -datum/reagent/morphine - name = "Morphine" - id = "morphine" - description = "Will allow you to ignore slowdown from equipment and damage. Will eventually knock you out if you take too much. If overdosed it will cause jitteriness, dizziness, force the victim to drop items in their hands and eventually deal toxin damage." - reagent_state = LIQUID - color = "#C8A5DC" - var/cycle_count = 0 - overdose_threshold = 30 - addiction_threshold = 25 - - -datum/reagent/morphine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.status_flags |= IGNORESLOWDOWN - if(cycle_count >= 36) - M.sleeping += 3 - cycle_count++ - ..() - return - -datum/reagent/morphine/overdose_process(var/mob/living/M as mob) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - M.Dizzy(1) - M.Jitter(1) - ..() - return - -datum/reagent/morphine/addiction_act_stage1(var/mob/living/M as mob) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - M.Dizzy(2) - M.Jitter(2) - ..() - return -datum/reagent/morphine/addiction_act_stage2(var/mob/living/M as mob) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - M.adjustToxLoss(1*REM) - M.Dizzy(3) - M.Jitter(3) - ..() - return -datum/reagent/morphine/addiction_act_stage3(var/mob/living/M as mob) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - M.adjustToxLoss(2*REM) - M.Dizzy(4) - M.Jitter(4) - ..() - return -datum/reagent/morphine/addiction_act_stage4(var/mob/living/M as mob) - if(prob(33)) - var/obj/item/I = M.get_active_hand() - if(I) - M.drop_item() - M.adjustToxLoss(3*REM) - M.Dizzy(5) - M.Jitter(5) - ..() - return - -datum/reagent/oculine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - cycle_amount++ - if(M.eye_blind > 0 && cycle_amount > 20) - if(prob(30)) - M.eye_blind = 0 - else if(prob(80)) - M.eye_blind = 0 - M.eye_blurry = 1 - if(M.eye_blurry > 0) - if(prob(80)) - M.eye_blurry = 0 - ..() - return - -/datum/chemical_reaction/oculine - name = "Oculine" - id = "oculine" - result = "oculine" - required_reagents = list("charcoal" = 1, "carbon" = 1, "hydrogen" = 1) - result_amount = 3 - mix_message = "The mixture sputters loudly and becomes a pale pink color." - -datum/reagent/oculine - name = "Oculine" - id = "oculine" - description = "Cures blindness and heals eye damage over time." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.4 - var/cycle_amount = 0 - -datum/reagent/atropine - name = "Atropine" - id = "atropine" - description = "If patients health is below -25 it will heal 3 brute and burn damage per cycle, as well as stop any oxyloss. Good for stabilising critical patients." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.2 - overdose_threshold = 35 - -datum/reagent/atropine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.health > -60) - M.adjustToxLoss(1*REM) - if(M.health < -25) - M.adjustBruteLoss(-3*REM) - M.adjustFireLoss(-3*REM) - if(M.oxyloss > 65) - M.setOxyLoss(65) - if(M.losebreath > 5) - M.losebreath = 5 - if(prob(30)) - M.Dizzy(5) - M.Jitter(5) - ..() - return - -datum/reagent/atropine/overdose_process(var/mob/living/M as mob) - if(prob(50)) - M.adjustToxLoss(2*REM) - M.Dizzy(1) - M.Jitter(1) - ..() - return - -/datum/chemical_reaction/atropine - name = "Atropine" - id = "atropine" - result = "atropine" - required_reagents = list("ethanol" = 1, "acetone" = 1, "diethylamine" = 1, "phenol" = 1, "sacid" = 1) - result_amount = 5 - -datum/reagent/epinephrine - name = "Epinephrine" - id = "epinephrine" - description = "mReduces most of the knockout/stun effects, minor stamina regeneration buff. Attempts to stop you taking too much oxygen damage. If the patient is in low to severe crit, heals toxins, brute, and burn very effectively. Will not heal patients who are almost dead. If overdosed will stun and deal toxin damage" - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.2 - overdose_threshold = 30 - -datum/reagent/epinephrine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.health < -10 && M.health > -65) - M.adjustToxLoss(-1*REM) - M.adjustBruteLoss(-1*REM) - M.adjustFireLoss(-1*REM) - if(M.oxyloss > 35) - M.setOxyLoss(35) - if(M.losebreath >= 4) - M.losebreath -= 4 - if(M.losebreath < 0) - M.losebreath = 0 - M.adjustStaminaLoss(-1*REM) - if(prob(30)) - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - ..() - return - -datum/reagent/epinephrine/overdose_process(var/mob/living/M as mob) - if(prob(33)) - M.adjustStaminaLoss(5*REM) - M.adjustToxLoss(2*REM) - M.losebreath++ - ..() - return - -/datum/chemical_reaction/epinephrine - name = "Epinephrine" - id = "epinephrine" - result = "epinephrine" - required_reagents = list("phenol" = 1, "acetone" = 1, "diethylamine" = 1, "oxygen" = 1, "chlorine" = 1, "hydrogen" = 1) - result_amount = 6 - -datum/reagent/strange_reagent - name = "Strange Reagent" - id = "strange_reagent" - description = "A miracle drug that can bring a dead body back to life! If the corpse has suffered too much damage, however, no change will occur to the body. If used on a living person it will deal Brute and Burn damage." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/strange_reagent/reaction_mob(var/mob/living/carbon/human/M as mob, var/method=TOUCH, var/volume) - if(M.stat == DEAD) - if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100) - M.visible_message("[M]'s body convulses a bit, and then falls still once more.") - return - var/mob/dead/observer/ghost = M.get_ghost() - M.visible_message("[M]'s body convulses a bit.") - if(!M.suiciding && !ghost && !(NOCLONE in M.mutations)) - M.stat = 1 - M.adjustOxyLoss(-20) - M.adjustToxLoss(-20) - dead_mob_list -= M - living_mob_list |= list(M) - M.emote("gasp") - add_logs(M, M, "revived", object="strange reagent") - ..() - return -datum/reagent/strange_reagent/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(50)) - M.adjustBruteLoss(2*REM) - M.adjustFireLoss(2*REM) - ..() - return - -/datum/chemical_reaction/strange_reagent - name = "Strange Reagent" - id = "strange_reagent" - result = "strange_reagent" - required_reagents = list("omnizine" = 1, "holywater" = 1, "mutagen" = 1) - result_amount = 3 - -datum/reagent/life - name = "Life" - id = "life" - description = "Can create a life form, however it is not guaranteed to be friendly. May want to have Security on hot standby." - reagent_state = LIQUID - color = "#C8A5DC" - metabolization_rate = 0.2 - -/datum/chemical_reaction/life - name = "Life" - id = "life" - result = "life" - required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1) - result_amount = 3 - required_temp = 374 - -/datum/chemical_reaction/life/on_reaction(var/datum/reagents/holder, var/created_volume) - chemical_mob_spawn(holder, 1, "Life") - -proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reaction_name, var/mob_faction = "chemicalsummon") - if(holder && holder.my_atom) - var/blocked = list(/mob/living/simple_animal/hostile, - /mob/living/simple_animal/hostile/pirate, - /mob/living/simple_animal/hostile/pirate/ranged, - /mob/living/simple_animal/hostile/russian, - /mob/living/simple_animal/hostile/russian/ranged, - /mob/living/simple_animal/hostile/syndicate, - /mob/living/simple_animal/hostile/syndicate/melee, - /mob/living/simple_animal/hostile/syndicate/melee/space, - /mob/living/simple_animal/hostile/syndicate/ranged, - /mob/living/simple_animal/hostile/syndicate/ranged/space, - /mob/living/simple_animal/hostile/alien/queen/large, - /mob/living/simple_animal/hostile/retaliate, - /mob/living/simple_animal/hostile/retaliate/clown, - /mob/living/simple_animal/hostile/mushroom, - /mob/living/simple_animal/hostile/asteroid, - /mob/living/simple_animal/hostile/asteroid/basilisk, - /mob/living/simple_animal/hostile/asteroid/goldgrub, - /mob/living/simple_animal/hostile/asteroid/goliath, - /mob/living/simple_animal/hostile/asteroid/hivelord, - /mob/living/simple_animal/hostile/asteroid/hivelordbrood, - /mob/living/simple_animal/hostile/carp/holocarp, - /mob/living/simple_animal/hostile/mining_drone, - /mob/living/simple_animal/hostile/poison, - /mob/living/simple_animal/hostile/blob, - /mob/living/simple_animal/ascendant_shadowling - )//exclusion list for things you don't want the reaction to create. - var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs - var/atom/A = holder.my_atom - var/turf/T = get_turf(A) - var/area/my_area = get_area(T) - var/message = "A [reaction_name] reaction has occured in [my_area.name]. (JMP)" - message += " (VV)" - - var/mob/M = get(A, /mob) - if(M) - message += " - Carried By: [M.real_name] ([M.key]) (PP) (?)" - else - message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]" - - message_admins(message, 0, 1) - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/human/H in viewers(get_turf(holder.my_atom), null)) - H.flash_eyes() - for(var/i = 1, i <= amount_to_spawn, i++) - var/chosen = pick(critters) - var/mob/living/simple_animal/hostile/C = new chosen - C.faction |= mob_faction - C.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(C, pick(NORTH,SOUTH,EAST,WEST)) - -/datum/reagent/mannitol/on_mob_life(mob/living/M as mob) - M.adjustBrainLoss(-3) - ..() - return - -/datum/chemical_reaction/mannitol - name = "Mannitol" - id = "mannitol" - result = "mannitol" - required_reagents = list("sugar" = 1, "hydrogen" = 1, "water" = 1) - result_amount = 3 - mix_message = "The solution slightly bubbles, becoming thicker." - -/datum/reagent/mannitol - name = "Mannitol" - id = "mannitol" - description = "Heals brain damage effectively. Use it in cyro tubes alongside Cryoxadone." - color = "#C8A5DC" - -/datum/reagent/mutadone/on_mob_life(var/mob/living/carbon/human/M as mob) - M.jitteriness = 0 - if(istype(M) && M.dna) - M.dna.remove_all_mutations() - ..() - return - -/datum/chemical_reaction/mutadone - name = "Mutadone" - id = "mutadone" - result = "mutadone" - required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1) - result_amount = 3 - - -/datum/reagent/mutadone - name = "Mutadone" - id = "mutadone" - description = "Heals your genetic defects." - color = "#C8A5DC" - -datum/reagent/antihol - name = "Antihol" - id = "antihol" - description = "Helps remove Alcohol from someone's body, as well as eliminating its side effects." - color = "#C8A5DC" - -datum/reagent/antihol/on_mob_life(var/mob/living/M as mob) - M.dizziness = 0 - M.drowsyness = 0 - M.slurring = 0 - M.confused = 0 - M.reagents.remove_reagent("ethanol", 8) - M.adjustToxLoss(-0.2*REM) - ..() - -/datum/chemical_reaction/antihol - name = "antihol" - id = "antihol" - result = "antihol" - required_reagents = list("ethanol" = 1, "charcoal" = 1) - result_amount = 2 - -/datum/chemical_reaction/cryoxadone - name = "Cryoxadone" - id = "cryoxadone" - result = "cryoxadone" - required_reagents = list("stable_plasma" = 1, "acetone" = 1, "mutagen" = 1) - result_amount = 3 - -/datum/reagent/stimulants - name = "Stimulants" - id = "stimulants" - description = "Increases run speed and eliminates stuns, can heal minor damage. If overdosed it will deal toxin damage and stun." - color = "#C8A5DC" - metabolization_rate = 0.4 - overdose_threshold = 60 - -datum/reagent/stimulants/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.status_flags |= IGNORESLOWDOWN - if(M.health < 50 && M.health > 0) - if(prob(50)) - M.adjustOxyLoss(-5*REM) - M.adjustToxLoss(-5*REM) - M.adjustBruteLoss(-5*REM) - M.adjustFireLoss(-5*REM) - M.adjustFireLoss(-3*REM) - M.AdjustParalysis(-1) - M.AdjustStunned(-1) - M.AdjustWeakened(-1) - M.adjustStaminaLoss(-3*REM) - ..() - -datum/reagent/stimulants/overdose_process(var/mob/living/M as mob) - if(prob(33)) - M.adjustStaminaLoss(5*REM) - M.adjustToxLoss(2*REM) - M.losebreath++ - ..() - return - -datum/reagent/insulin - name = "Insulin" - id = "insulin" - description = "Increases sugar depletion rates." - reagent_state = LIQUID - color = "#C8A5DC" -datum/reagent/insulin/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(M.sleeping) - M.sleeping-- - M.reagents.remove_reagent("sugar", 5) - ..() - return diff --git a/code/modules/reagents/Chemistry-Goon-Other.dm b/code/modules/reagents/Chemistry-Goon-Other.dm deleted file mode 100644 index bda6a4441d8..00000000000 --- a/code/modules/reagents/Chemistry-Goon-Other.dm +++ /dev/null @@ -1,286 +0,0 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 -#define REM REAGENTS_EFFECT_MULTIPLIER - -var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700") - -datum/reagent/oil - name = "Oil" - id = "oil" - description = "Burns in a small smoky fire, mostly used to get Ash." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/stable_plasma - name = "Stable Plasma" - id = "stable_plasma" - description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/iodine - name = "Iodine" - id = "iodine" - description = "A slippery solution." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/fluorine - name = "Fluorine" - id = "fluorine" - description = "A slippery solution." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/carpet - name = "Carpet" - id = "carpet" - description = "A slippery solution." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/reagent/carpet/reaction_turf(var/turf/simulated/T, var/volume) - if(istype(T, /turf/simulated/floor/plating) || istype(T, /turf/simulated/floor/plasteel)) - var/turf/simulated/floor/F = T - F.ChangeTurf(/turf/simulated/floor/fancy/carpet) - ..() - return - -datum/reagent/bromine - name = "Bromine" - id = "bromine" - description = "A slippery solution." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/phenol - name = "Phenol" - id = "phenol" - description = "Used for certain medical recipes." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/ash - name = "Ash" - id = "ash" - description = "Basic ingredient in a couple of recipes." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/acetone - name = "Acetone" - id = "acetone" - description = "Common ingredient in other recipes." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/acetone - name = "acetone" - id = "acetone" - result = "acetone" - required_reagents = list("oil" = 1, "fuel" = 1, "oxygen" = 1) - result_amount = 3 - -/datum/chemical_reaction/carpet - name = "carpet" - id = "carpet" - result = "carpet" - required_reagents = list("space_drugs" = 1, "blood" = 1) - result_amount = 2 - - -/datum/chemical_reaction/oil - name = "Oil" - id = "oil" - result = "oil" - required_reagents = list("fuel" = 1, "carbon" = 1, "hydrogen" = 1) - result_amount = 3 - -/datum/chemical_reaction/phenol - name = "phenol" - id = "phenol" - result = "phenol" - required_reagents = list("water" = 1, "chlorine" = 1, "oil" = 1) - result_amount = 3 - -/datum/chemical_reaction/ash - name = "Ash" - id = "ash" - result = "ash" - required_reagents = list("oil" = 1) - result_amount = 1 - required_temp = 480 - -datum/reagent/colorful_reagent - name = "Colorful Reagent" - id = "colorful_reagent" - description = "A solution." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/colorful_reagent - name = "colorful_reagent" - id = "colorful_reagent" - result = "colorful_reagent" - required_reagents = list("stable_plasma" = 1, "radium" = 1, "space_drugs" = 1, "cryoxadone" = 1, "triple_citrus" = 1) - result_amount = 5 - -datum/reagent/colorful_reagent/on_mob_life(var/mob/living/M as mob) - if(M && isliving(M)) - M.color = pick(random_color_list) - ..() - return - -datum/reagent/colorful_reagent/reaction_mob(var/mob/living/M, var/volume) - if(M && isliving(M)) - M.color = pick(random_color_list) - ..() - return -datum/reagent/colorful_reagent/reaction_obj(var/obj/O, var/volume) - if(O) - O.color = pick(random_color_list) - ..() - return -datum/reagent/colorful_reagent/reaction_turf(var/turf/T, var/volume) - if(T) - T.color = pick(random_color_list) - ..() - return - - -datum/reagent/triple_citrus - name = "Triple Citrus" - id = "triple_citrus" - description = "A solution." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/triple_citrus - name = "triple_citrus" - id = "triple_citrus" - result = "triple_citrus" - required_reagents = list("lemonjuice" = 1, "limejuice" = 1, "orangejuice" = 1) - result_amount = 5 - -datum/reagent/corn_starch - name = "Corn Starch" - id = "corn_starch" - description = "A slippery solution." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/corn_syrup - name = "corn_syrup" - id = "corn_syrup" - result = "corn_syrup" - required_reagents = list("corn_starch" = 1, "sacid" = 1) - result_amount = 5 - required_temp = 374 - -datum/reagent/corn_syrup - name = "Corn Syrup" - id = "corn_syrup" - description = "Decays into sugar." - reagent_state = LIQUID - color = "#C8A5DC" - -datum/reagent/corn_syrup/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.reagents.add_reagent("sugar", 3) - M.reagents.remove_reagent("corn_syrup", 1) - ..() - return - -/datum/chemical_reaction/corgium - name = "corgium" - id = "corgium" - result = "corgium" - required_reagents = list("nutriment" = 1, "colorful_reagent" = 1, "strange_reagent" = 1, "blood" = 1) - result_amount = 3 - required_temp = 374 - -datum/reagent/corgium - name = "Corgium" - id = "corgium" - description = "Creates a corgi at the reaction location." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/corgium/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - new /mob/living/simple_animal/pet/corgi(location) - ..() - return - -datum/reagent/hair_dye - name = "Quantum Hair Dye" - id = "hair_dye" - description = "A solution." - reagent_state = LIQUID - color = "#C8A5DC" - var/list/potential_colors = list("0ad","a0f","f73","d14","d14","0b5","0ad","f73","fc2","084","05e","d22","fa0") // fucking hair code - -/datum/chemical_reaction/hair_dye - name = "hair_dye" - id = "hair_dye" - result = "hair_dye" - required_reagents = list("colorful_reagent" = 1, "radium" = 1, "space_drugs" = 1) - result_amount = 5 - -datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume) - if(M && ishuman(M)) - var/mob/living/carbon/human/H = M - H.hair_color = pick(potential_colors) - H.facial_hair_color = pick(potential_colors) - H.update_hair() - ..() - return - -datum/reagent/barbers_aid - name = "Barber's Aid" - id = "barbers_aid" - description = "A solution to hair loss across the world." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/barbers_aid - name = "barbers_aid" - id = "barbers_aid" - result = "barbers_aid" - required_reagents = list("carpet" = 1, "radium" = 1, "space_drugs" = 1) - result_amount = 5 - -datum/reagent/barbers_aid/reaction_mob(var/mob/living/M, var/volume) - if(M && ishuman(M)) - var/mob/living/carbon/human/H = M - var/datum/sprite_accessory/hair/picked_hair = pick(hair_styles_list) - var/datum/sprite_accessory/facial_hair/picked_beard = pick(facial_hair_styles_list) - H.hair_style = picked_hair - H.facial_hair_style = picked_beard - H.update_hair() - ..() - return - -datum/reagent/concentrated_barbers_aid - name = "Concentrated Barber's Aid" - id = "concentrated_barbers_aid" - description = "A concentrated solution to hair loss across the world." - reagent_state = LIQUID - color = "#C8A5DC" - -/datum/chemical_reaction/concentrated_barbers_aid - name = "concentrated_barbers_aid" - id = "concentrated_barbers_aid" - result = "concentrated_barbers_aid" - required_reagents = list("barbers_aid" = 1, "mutagen" = 1) - result_amount = 2 - -datum/reagent/concentrated_barbers_aid/reaction_mob(var/mob/living/M, var/volume) - if(M && ishuman(M)) - var/mob/living/carbon/human/H = M - H.hair_style = "Very Long Hair" - H.facial_hair_style = "Very Long Beard" - H.update_hair() - ..() - return \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Goon-Readme.dm b/code/modules/reagents/Chemistry-Goon-Readme.dm deleted file mode 100644 index 0731e28ba93..00000000000 --- a/code/modules/reagents/Chemistry-Goon-Readme.dm +++ /dev/null @@ -1,34 +0,0 @@ -/* - Credit goes to Cogwerks, and all the other goonstation coders - for the original idea and implementation of this over at goonstation. - - THE REQUESTED DON'T PORT LIST: IF YOU PORT THESE THE GOONS WILL MURDER US IN OUR SLEEP SO PLEASE DON'T KTHX - Iamgoofball - Any of the Secret Chems - Goon in-joke chems (Eg. Cat Drugs, Hairgrownium) - Liquid Electricity - Rajajajah - - -/datum/reagent/blankgoonchembase - name = "blank goonchem base" - id = "blankgoonchembase" - description = "A blank chem" - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - - -/datum/reagent/blankgoonchembase/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - ..() - return - -/datum/chemical_reaction/blankgoonchembase - name = "blank goonchem base" - id = "blankgoonchembase" - result = "blankgoonchembase" - required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1) - result_amount = 3 - mix_message = "The mixture dries into a pale blue powder." - required_temp = 420 - -*/ \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Goon-Toxins.dm b/code/modules/reagents/Chemistry-Goon-Toxins.dm deleted file mode 100644 index 7693d241c0b..00000000000 --- a/code/modules/reagents/Chemistry-Goon-Toxins.dm +++ /dev/null @@ -1,369 +0,0 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 - -#define REM REAGENTS_EFFECT_MULTIPLIER - -datum/reagent/polonium - name = "Polonium" - id = "polonium" - description = "Cause significant Radiation damage over time." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.1 - -datum/reagent/polonium/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.radiation += 8 - ..() - return - - -datum/reagent/histamine - name = "Histamine" - id = "histamine" - description = "A dose-dependent toxin, ranges from annoying to incredibly lethal." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.2 - overdose_threshold = 30 - -datum/reagent/histamine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - switch(pick(1, 2, 3, 4)) - if(1) - M << "You can barely see!" - M.eye_blurry = 3 - if(2) - M.emote("cough") - if(3) - M.emote("sneeze") - if(4) - if(prob(75)) - M << "You scratch at an itch." - M.adjustBruteLoss(2*REM) - ..() - return -datum/reagent/histamine/overdose_process(var/mob/living/M as mob) - M.adjustOxyLoss(pick(1,3)*REM) - M.adjustBruteLoss(pick(1,3)*REM) - M.adjustToxLoss(pick(1,3)*REM) - ..() - return - -datum/reagent/formaldehyde - name = "Formaldehyde" - id = "formaldehyde" - description = "Deals a moderate amount of Toxin damage over time. 10% chance to decay into 10-15 histamine." - reagent_state = LIQUID - color = "#CF3600" - -datum/reagent/formaldehyde/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(1*REM) - if(prob(10)) - M.reagents.add_reagent("histamine",pick(5,15)) - M.reagents.remove_reagent("formaldehyde",1) - ..() - return - -/datum/chemical_reaction/formaldehyde - name = "formaldehyde" - id = "Formaldehyde" - result = "formaldehyde" - required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1) - result_amount = 3 - required_temp = 420 - -datum/reagent/venom - name = "Venom" - id = "venom" - description = "Will deal scaling amounts of Toxin and Brute damage over time. 25% chance to decay into 5-10 histamine." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.2 -datum/reagent/venom/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss((0.1*volume)*REM) - M.adjustBruteLoss((0.1*volume)*REM) - if(prob(25)) - M.reagents.add_reagent("histamine",pick(5,10)) - M.reagents.remove_reagent("venom",1) - ..() - return - -datum/reagent/neurotoxin2 - name = "Neurotoxin" - id = "neurotoxin2" - description = "Deals toxin and brain damage up to 60 before it slows down, causing confusion and a knockout after 17 elapsed cycles." - reagent_state = LIQUID - color = "#CF3600" - var/cycle_count = 0 - metabolization_rate = 1 - -datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob) - cycle_count++ - if(M.brainloss + M.toxloss <= 60) - M.adjustBrainLoss(1*REM) - M.adjustToxLoss(1*REM) - if(cycle_count == 17) - M.sleeping += 10 // buffed so it works - ..() - return - -/datum/chemical_reaction/neurotoxin2 - name = "neurotoxin2" - id = "neurotoxin2" - result = "neurotoxin2" - required_reagents = list("space_drugs" = 1) - result_amount = 1 - required_temp = 674 - -datum/reagent/cyanide - name = "Cyanide" - id = "cyanide" - description = "Deals toxin damage, alongside some oxygen loss. 8% chance of stun and some extra toxin damage." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.1 - -datum/reagent/cyanide/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(1.5*REM) - if(prob(10)) - M.losebreath += 1 - if(prob(8)) - M << "You feel horrendously weak!" - M.Stun(2) - M.adjustToxLoss(2*REM) - ..() - return - -/datum/chemical_reaction/cyanide - name = "Cyanide" - id = "cyanide" - result = "cyanide" - required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1) - result_amount = 3 - required_temp = 380 - -/datum/reagent/questionmark // food poisoning - name = "Bad Food" - id = "????" - description = "????" - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.2 - -datum/reagent/questionmark/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(1*REM) - ..() - return - -datum/reagent/itching_powder - name = "Itching Powder" - id = "itching_powder" - description = "Lots of annoying random effects, chances to do some brute damage from scratching. 6% chance to decay into 1-3 units of histamine." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.3 - -/datum/reagent/itching_powder/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(method == TOUCH) - M.reagents.add_reagent("itching_powder", volume) - return - -datum/reagent/itching_powder/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(27)) - M << "You scratch at your head." - M.adjustBruteLoss(0.2*REM) - if(prob(27)) - M << "You scratch at your leg." - M.adjustBruteLoss(0.2*REM) - if(prob(27)) - M << "You scratch at your arm." - M.adjustBruteLoss(0.2*REM) - if(prob(6)) - M.reagents.add_reagent("histamine",rand(1,3)) - M.reagents.remove_reagent("itching_powder",1) - ..() - return - -/datum/chemical_reaction/itching_powder - name = "Itching Powder" - id = "itching_powder" - result = "itching_powder" - required_reagents = list("fuel" = 1, "ammonia" = 1, "charcoal" = 1) - result_amount = 3 - -/datum/chemical_reaction/facid - name = "Fluorosulfuric acid" - id = "facid" - result = "facid" - required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1) - result_amount = 4 - required_temp = 380 - -datum/reagent/initropidril - name = "Initropidril" - id = "initropidril" - description = "33% chance to hit with a random amount of toxin damage, 5-10% chances to cause stunning, suffocation, or immediate heart failure." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.4 - -datum/reagent/initropidril/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(prob(33)) - M.adjustToxLoss(rand(5,25)) - if(prob(7)) - var/picked_option = rand(1,3) - switch(picked_option) - if(1) - M.Stun(3) - M.Weaken(3) - if(2) - M.losebreath += 10 - M.adjustOxyLoss(rand(5,25)) - if(3) - var/mob/living/carbon/human/H = M - if(!H.heart_attack) - H.visible_message("[H] clutches at their chest as if their heart stopped!") - H.heart_attack = 1 // rip in pepperoni - else - H.losebreath += 10 - H.adjustOxyLoss(rand(5,25)) - ..() - return - -datum/reagent/pancuronium - name = "Pancuronium" - id = "pancuronium" - description = "Knocks you out after 30 seconds, 7% chance to cause some oxygen loss." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.2 - -datum/reagent/pancuronium/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(current_cycle >= 10) - M.SetParalysis(3) - if(prob(7)) - M.losebreath += rand(3,5) - ..() - return - -datum/reagent/sodium_thiopental - name = "Sodium Thiopental" - id = "sodium_thiopental" - description = "Puts you to sleep after 30 seconds, along with some major stamina loss." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.7 - -datum/reagent/sodium_thiopental/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(current_cycle >= 10) - M.sleeping += 3 - M.adjustStaminaLoss(10) - ..() - return - -datum/reagent/sulfonal - name = "Sulfonal" - id = "sulfonal" - description = "Deals some toxin damage, and puts you to sleep after 66 seconds." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.1 - -/datum/chemical_reaction/sulfonal - name = "sulfonal" - id = "sulfonal" - result = "sulfonal" - required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1) - result_amount = 3 - -datum/reagent/sulfonal/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(current_cycle >= 22) - M.sleeping += 3 - M.adjustToxLoss(1) - ..() - return - -datum/reagent/amanitin - name = "Amanitin" - id = "amanitin" - description = "On the last second that it's in you, it hits you with a stack of toxin damage based on how long it's been in you. The more you use, the longer it takes before anything happens, but the harder it hits when it does." - reagent_state = LIQUID - color = "#CF3600" - -datum/reagent/amanitin/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - ..() - return - -datum/reagent/amanitin/on_mob_delete(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjustToxLoss(current_cycle*rand(2,4)) - ..() - -datum/reagent/lipolicide - name = "Lipolicide" - id = "lipolicide" - description = "Deals some toxin damage unless they keep eating food. Will reduce nutrition values." - reagent_state = LIQUID - color = "#CF3600" - -/datum/chemical_reaction/lipolicide - name = "lipolicide" - id = "lipolicide" - result = "lipolicide" - required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1) - result_amount = 3 - -datum/reagent/lipolicide/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(!holder.has_reagent("nutriment")) - M.adjustToxLoss(1) - M.nutrition -= 10 * REAGENTS_METABOLISM - M.overeatduration = 0 - if(M.nutrition < 0)//Prevent from going into negatives. - M.nutrition = 0 - ..() - return - -datum/reagent/coniine - name = "Coniine" - id = "coniine" - description = "Does moderate toxin damage and oxygen loss." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.05 - -datum/reagent/coniine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.losebreath += 5 - M.adjustToxLoss(2) - ..() - return - -datum/reagent/curare - name = "Curare" - id = "curare" - description = "Does some oxygen and toxin damage, weakens you after 33 seconds." - reagent_state = LIQUID - color = "#CF3600" - metabolization_rate = 0.1 - -datum/reagent/curare/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(current_cycle >= 11) - M.Weaken(3) - M.adjustToxLoss(1) - M.adjustOxyLoss(1) - ..() - return \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 98496d254fe..a43266291d2 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -215,26 +215,31 @@ datum/reagents/proc/metabolize(var/mob/M) if(M) chem_temp = M.bodytemperature handle_reactions() - if(last_tick == 3) - last_tick = 1 - for(var/A in reagent_list) - var/datum/reagent/R = A - if(M && R) - if(M.reagent_check(R) != 1) - if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) + + for(var/A in reagent_list) + var/datum/reagent/R = A + if(!R.holder) + continue + if(!M) + M = R.holder.my_atom + if(M && R) + if(M.reagent_check(R) != 1) + if(R.overdose_threshold) + if(R.volume >= R.overdose_threshold && !R.overdosed) R.overdosed = 1 - M << "You feel like you took too much of [R.name]!" R.overdose_start(M) - if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0) + if(R.addiction_threshold) + if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list)) var/datum/reagent/new_reagent = new R.type() addiction_list.Add(new_reagent) - if(R.overdosed) - R.overdose_process(M) - if(is_type_in_list(R,addiction_list)) - for(var/datum/reagent/addicted_reagent in addiction_list) - if(istype(R, addicted_reagent)) - addicted_reagent.addiction_stage = -15 // you're satisfied for a good while. - R.on_mob_life(M) + if(R.overdosed) + R.overdose_process(M) + if(is_type_in_list(R,addiction_list)) + for(var/datum/reagent/addicted_reagent in addiction_list) + if(istype(R, addicted_reagent)) + addicted_reagent.addiction_stage = -15 // you're satisfied for a good while. + R.on_mob_life(M) + if(addiction_tick == 6) addiction_tick = 1 for(var/A in addiction_list) @@ -258,7 +263,6 @@ datum/reagents/proc/metabolize(var/mob/M) M << "You feel like you've gotten over your need for [R.name]." addiction_list.Remove(R) addiction_tick++ - last_tick++ update_total() datum/reagents/process() diff --git a/code/modules/reagents/Chemistry-Readme.dm b/code/modules/reagents/Chemistry-Readme.dm index e3eab685c7b..74e9fe0b093 100644 --- a/code/modules/reagents/Chemistry-Readme.dm +++ b/code/modules/reagents/Chemistry-Readme.dm @@ -11,7 +11,7 @@ Structure: /////////////////// ////////////////////////// | | | V V V - reagents (datums) Reagents. I.e. Water , antitoxins or mercury. + reagents (datums) Reagents. I.e. Water , cryoxadone or mercury. Random important notes: @@ -198,7 +198,7 @@ About Recipes: of that reagent. The handle_reaction proc can detect mutiples of the same recipes so for most cases you want to set the required amount to 1. - required_catalysts (Added May 2011) + required_catalysts This is a list of the ids of the required catalysts. Functionally similar to required_reagents, it is a list of reagents that are required for the reaction. However, unlike required_reagents, catalysts are NOT consumed. @@ -216,6 +216,9 @@ About Recipes: Basically like a reagent's data variable. You can set extra requirements for a reaction with this. + required_temp + This is the required temperature. + About the Tools: @@ -244,4 +247,20 @@ About the Tools: transfer code since you will not be able to use the standard tools to manipulate it. +*/ + + + + +/* GOON CHEMS README: + + Credit goes to Cogwerks, and all the other goonstation coders + for the original idea and implementation of this over at goonstation. + + THE REQUESTED DON'T PORT LIST: IF YOU PORT THESE THE GOONS WILL MURDER US IN OUR SLEEP SO PLEASE DON'T KTHX - Iamgoofball + Any of the Secret Chems + Goon in-joke chems (Eg. Cat Drugs, Hairgrownium) + Liquid Electricity + Rajajajah + */ \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm new file mode 100644 index 00000000000..899f1312670 --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -0,0 +1,140 @@ +#define SOLID 1 +#define LIQUID 2 +#define GAS 3 + +#define REM REAGENTS_EFFECT_MULTIPLIER + +//The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent) +//so that it can continue working when the reagent is deleted while the proc is still active. + + +//Various reagents +//Toxin & acid reagents +//Hydroponics stuff + +datum/reagent + var/name = "Reagent" + var/id = "reagent" + var/description = "" + var/datum/reagents/holder = null + var/reagent_state = LIQUID + var/list/data + var/current_cycle = 0 + var/volume = 0 + var/color = "#000000" // rgb: 0, 0, 0 + var/can_synth = 1 + var/metabolization_rate = REAGENTS_METABOLISM //how fast the reagent is metabolized by the mob + var/overrides_metab = 0 + var/overdose_threshold = 0 + var/addiction_threshold = 0 + var/addiction_stage = 0 + var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick. + +datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references + ..() + holder = null + +datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume, var/show_message = 1) //By default we have a chance to transfer some + if(!istype(M, /mob/living)) + return 0 + var/datum/reagent/self = src + src = null //of the reagent to the mob on TOUCHING it. + + if(!istype(self.holder.my_atom, /obj/effect/effect/chem_smoke)) + // If the chemicals are in a smoke cloud, do not try to let the chemicals "penetrate" into the mob's system (balance station 13) -- Doohl + + if(method == TOUCH) + + var/chance = 1 + var/block = 0 + + for(var/obj/item/clothing/C in M.get_equipped_items()) + if(C.permeability_coefficient < chance) chance = C.permeability_coefficient + if(istype(C, /obj/item/clothing/suit/bio_suit)) + // bio suits are just about completely fool-proof - Doohl + // kind of a hacky way of making bio suits more resistant to chemicals but w/e + if(prob(75)) + block = 1 + + if(istype(C, /obj/item/clothing/head/bio_hood)) + if(prob(75)) + block = 1 + + chance = chance * 100 + + if(prob(chance) && !block) + if(M.reagents) + M.reagents.add_reagent(self.id,self.volume/2) + return 1 + +datum/reagent/proc/reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object + src = null //if it can hold reagents. nope! + //if(O.reagents) + // O.reagents.add_reagent(id,volume/3) + return + +datum/reagent/proc/reaction_turf(var/turf/T, var/volume) + src = null + return + +datum/reagent/proc/on_mob_life(var/mob/living/M as mob) + current_cycle++ + if(!istype(M, /mob/living)) + return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO + holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. + return + +// Called when this reagent is removed while inside a mob +datum/reagent/proc/on_mob_delete(mob/M) + return + +datum/reagent/proc/on_move(var/mob/M) + return + +// Called after add_reagents creates a new reagent. +datum/reagent/proc/on_new(var/data) + return + +// Called when two reagents of the same are mixing. +datum/reagent/proc/on_merge(var/data) + return + +datum/reagent/proc/on_update(var/atom/A) + return + +// Called every time reagent containers process. +datum/reagent/proc/on_tick(var/data) + return + +// Called when the reagent container is hit by an explosion +datum/reagent/proc/on_ex_act(var/severity) + return + +// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects +datum/reagent/proc/overdose_process(var/mob/living/M as mob) + return + +datum/reagent/proc/overdose_start(var/mob/living/M as mob) + M << "You feel like you took too much of [name]!" + return + +datum/reagent/proc/addiction_act_stage1(var/mob/living/M as mob) + if(prob(30)) + M << "You feel like some [name] right about now." + return + +datum/reagent/proc/addiction_act_stage2(var/mob/living/M as mob) + if(prob(30)) + M << "You feel like you need [name]. You just can't get enough." + return + +datum/reagent/proc/addiction_act_stage3(var/mob/living/M as mob) + if(prob(30)) + M << "You have an intense craving for [name]." + return + +datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob) + if(prob(30)) + M << "You're not feeling good at all! You really need some [name]." + return + diff --git a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm index 5625f754f29..02c41c45711 100644 --- a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm @@ -197,3 +197,7 @@ datum/reagent/blob/spacedrugs/reaction_mob(var/mob/living/M as mob, var/method=T step_away(X,pull) else X.throw_at(pull) + + + + diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm index f7201bb2b71..53c56a9ff70 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Drink-Reagents/Drinks.dm @@ -1,8 +1,4 @@ -#define REM REAGENTS_EFFECT_MULTIPLIER - - - ///////////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////// DRINKS BELOW, Beer is up there though, along with cola. Cap'n Pete's Cuban Spiced Rum//////////////////////////////// @@ -454,6 +450,12 @@ datum/reagent/consumable/blumpkinjuice description = "Juiced from real blumpkin." color = "#00BFFF" +datum/reagent/consumable/triple_citrus + name = "Triple Citrus" + id = "triple_citrus" + description = "A solution." + color = "#C8A5DC" + //////////////////////////////////////////////The ten friggen million reagents that get you drunk////////////////////////////////////////////// @@ -562,7 +564,3 @@ datum/reagent/consumable/hippies_delight/on_mob_life(var/mob/living/M as mob) if(prob(30)) M.adjustToxLoss(2) ..() return - - -// Undefine the alias for REAGENTS_EFFECT_MULTIPLER -#undef REM \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm index 3dd2fdc7fa4..af94ba121fa 100644 --- a/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Consumable-Reagents/Food-Reagents.dm @@ -13,6 +13,7 @@ datum/reagent/consumable var/nutriment_factor = 1 * REAGENTS_METABOLISM datum/reagent/consumable/on_mob_life(var/mob/living/M as mob) + current_cycle++ M.nutrition += nutriment_factor holder.remove_reagent(src.id, metabolization_rate) @@ -58,7 +59,6 @@ datum/reagent/consumable/sugar datum/reagent/consumable/sugar/overdose_start(var/mob/living/M as mob) M << "You go into hyperglycaemic shock! Lay off the twinkies!" M.sleeping += 30 - ..() return datum/reagent/consumable/sugar/overdose_process(var/mob/living/M as mob) @@ -410,3 +410,20 @@ datum/reagent/consumable/eggyolk id = "eggyolk" description = "It's full of protein." color = "#FFB500" + +datum/reagent/consumable/corn_starch + name = "Corn Starch" + id = "corn_starch" + description = "A slippery solution." + color = "#C8A5DC" + +datum/reagent/consumable/corn_syrup + name = "Corn Syrup" + id = "corn_syrup" + description = "Decays into sugar." + color = "#C8A5DC" + +datum/reagent/consumable/corn_syrup/on_mob_life(var/mob/living/M as mob) + M.reagents.add_reagent("sugar", 3) + M.reagents.remove_reagent("corn_syrup", 1) + ..() diff --git a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm b/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm similarity index 59% rename from code/modules/reagents/Chemistry-Goon-420BlazeIt.dm rename to code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm index dacb964d7ab..4992c8cfb14 100644 --- a/code/modules/reagents/Chemistry-Goon-420BlazeIt.dm +++ b/code/modules/reagents/Chemistry-Reagents/Drug-Reagents.dm @@ -1,10 +1,38 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 -#define REM REAGENTS_EFFECT_MULTIPLIER -datum/reagent/nicotine +datum/reagent/drug + name = "Drug" + id = "drug" + +datum/reagent/drug/on_mob_life(var/mob/living/M as mob) + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/drug/space_drugs + name = "Space drugs" + id = "space_drugs" + description = "An illegal chemical compound used as drug." + color = "#60A584" // rgb: 96, 165, 132 + overdose_threshold = 25 + +datum/reagent/drug/space_drugs/on_mob_life(var/mob/living/M as mob) + M.druggy = max(M.druggy, 15) + if(isturf(M.loc) && !istype(M.loc, /turf/space)) + if(M.canmove) + if(prob(10)) step(M, pick(cardinal)) + if(prob(7)) + M.emote(pick("twitch","drool","moan","giggle")) + ..() + return + +datum/reagent/drug/space_drugs/overdose_process(var/mob/living/M as mob) + if(prob(20)) + M.hallucination = max(M.hallucination, 5) + M.adjustBrainLoss(0.25*REM) + M.adjustToxLoss(0.25*REM) + ..() + return + +datum/reagent/drug/nicotine name = "Nicotine" id = "nicotine" description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage." @@ -13,25 +41,24 @@ datum/reagent/nicotine overdose_threshold = 35 addiction_threshold = 30 -datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom +datum/reagent/drug/nicotine/on_mob_life(var/mob/living/M as mob) var/smoke_message = pick("You can just feel your lungs dying!", "You feel relaxed.", "You feel calmed.", "You feel the lung cancer forming.", "You feel the money you wasted.", "You feel like a space cowboy.", "You feel rugged.") if(prob(5)) M << "[smoke_message]" M.AdjustStunned(-1) - M.adjustStaminaLoss(-1*REM) + M.adjustStaminaLoss(-0.5*REM) ..() return -datum/reagent/nicotine/overdose_process(var/mob/living/M as mob) +datum/reagent/drug/nicotine/overdose_process(var/mob/living/M as mob) if(prob(20)) M << "You feel like you smoked too much." - M.adjustToxLoss(1*REM) - M.adjustOxyLoss(1*REM) + M.adjustToxLoss(0.5*REM) + M.adjustOxyLoss(0.5*REM) ..() return -datum/reagent/crank +datum/reagent/drug/crank name = "Crank" id = "crank" description = "Reduces stun times by about 200%. If overdosed or addicted it will deal significant Toxin, Brute and Brain damage." @@ -40,51 +67,42 @@ datum/reagent/crank overdose_threshold = 20 addiction_threshold = 10 -datum/reagent/crank/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom +datum/reagent/drug/crank/on_mob_life(var/mob/living/M as mob) var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.") if(prob(5)) M << "[high_message]" - M.AdjustParalysis(-2) - M.AdjustStunned(-2) - M.AdjustWeakened(-2) + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) ..() return -datum/reagent/crank/overdose_process(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,10)*REM) - M.adjustToxLoss(rand(1,10)*REM) - M.adjustBruteLoss(rand(1,10)*REM) +datum/reagent/drug/crank/overdose_process(var/mob/living/M as mob) + M.adjustBrainLoss(2*REM) + M.adjustToxLoss(2*REM) + M.adjustBruteLoss(2*REM) ..() return -datum/reagent/crank/addiction_act_stage1(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,10)*REM) +datum/reagent/drug/crank/addiction_act_stage1(var/mob/living/M as mob) + M.adjustBrainLoss(5*REM) ..() return -datum/reagent/crank/addiction_act_stage2(var/mob/living/M as mob) - M.adjustToxLoss(rand(1,10)*REM) +datum/reagent/drug/crank/addiction_act_stage2(var/mob/living/M as mob) + M.adjustToxLoss(5*REM) ..() return -datum/reagent/crank/addiction_act_stage3(var/mob/living/M as mob) - M.adjustBruteLoss(rand(1,10)*REM) +datum/reagent/drug/crank/addiction_act_stage3(var/mob/living/M as mob) + M.adjustBruteLoss(5*REM) ..() return -datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,10)*REM) - M.adjustToxLoss(rand(1,10)*REM) - M.adjustBruteLoss(rand(1,10)*REM) +datum/reagent/drug/crank/addiction_act_stage4(var/mob/living/M as mob) + M.adjustBrainLoss(5*REM) + M.adjustToxLoss(5*REM) + M.adjustBruteLoss(5*REM) ..() return -/datum/chemical_reaction/crank - name = "Crank" - id = "crank" - result = "crank" - required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "fuel" = 1) - result_amount = 5 - mix_message = "The mixture violently reacts, leaving behind a few crystalline shards." - required_temp = 390 -/datum/reagent/krokodil +/datum/reagent/drug/krokodil name = "Krokodil" id = "krokodil" description = "Cools and calms you down. If overdosed it will deal significant Brain and Toxin damage. If addicted it will begin to deal fatal amounts of Brute damage as the subject's skin falls off." @@ -94,25 +112,23 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) addiction_threshold = 15 -/datum/reagent/krokodil/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom +/datum/reagent/drug/krokodil/on_mob_life(var/mob/living/M as mob) var/high_message = pick("You feel calm.", "You feel collected.", "You feel like you need to relax.") if(prob(5)) M << "[high_message]" ..() return -/datum/reagent/krokodil/overdose_process(var/mob/living/M as mob) - if(prob(10)) - M.adjustBrainLoss(rand(1,5)*REM) - M.adjustToxLoss(rand(1,5)*REM) +/datum/reagent/drug/krokodil/overdose_process(var/mob/living/M as mob) + M.adjustBrainLoss(0.25*REM) + M.adjustToxLoss(0.25*REM) ..() return -/datum/reagent/krokodil/addiction_act_stage1(var/mob/living/M as mob) - M.adjustBrainLoss(rand(1,5)*REM) - M.adjustToxLoss(rand(1,5)*REM) +/datum/reagent/drug/krokodil/addiction_act_stage1(var/mob/living/M as mob) + M.adjustBrainLoss(2*REM) + M.adjustToxLoss(2*REM) ..() return /datum/reagent/krokodil/addiction_act_stage2(var/mob/living/M as mob) @@ -120,32 +136,24 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M << "Your skin feels loose..." ..() return -/datum/reagent/krokodil/addiction_act_stage3(var/mob/living/M as mob) +/datum/reagent/drug/krokodil/addiction_act_stage3(var/mob/living/M as mob) if(prob(25)) M << "Your skin starts to peel away..." M.adjustBruteLoss(3*REM) ..() return -/datum/reagent/krokodil/addiction_act_stage4(var/mob/living/carbon/human/M as mob) +/datum/reagent/drug/krokodil/addiction_act_stage4(var/mob/living/carbon/human/M as mob) if(!istype(M.dna.species, /datum/species/cosmetic_zombie)) M << "Your skin falls off easily!" - M.adjustBruteLoss(rand(50,80)*REM) // holy shit your skin just FELL THE FUCK OFF + M.adjustBruteLoss(50*REM) // holy shit your skin just FELL THE FUCK OFF hardset_dna(M, null, null, null, null, /datum/species/cosmetic_zombie) else M.adjustBruteLoss(5*REM) ..() return -/datum/chemical_reaction/krokodil - name = "Krokodil" - id = "krokodil" - result = "krokodil" - required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "fuel" = 1) - result_amount = 6 - mix_message = "The mixture dries into a pale blue powder." - required_temp = 380 -/datum/reagent/methamphetamine +/datum/reagent/drug/methamphetamine name = "Methamphetamine" id = "methamphetamine" description = "Reduces stun times by about 300%, speeds the user up, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage." @@ -153,26 +161,25 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) color = "#60A584" // rgb: 96, 165, 132 overdose_threshold = 20 addiction_threshold = 10 - metabolization_rate = 0.6 + metabolization_rate = 0.75 * REAGENTS_METABOLISM -/datum/reagent/methamphetamine/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom +/datum/reagent/drug/methamphetamine/on_mob_life(var/mob/living/M as mob) var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.") if(prob(5)) M << "[high_message]" - M.AdjustParalysis(-3) - M.AdjustStunned(-3) - M.AdjustWeakened(-3) - M.adjustStaminaLoss(-3) + M.AdjustParalysis(-2) + M.AdjustStunned(-2) + M.AdjustWeakened(-2) + M.adjustStaminaLoss(-2) M.status_flags |= GOTTAGOREALLYFAST - M.Jitter(3) - M.adjustBrainLoss(0.5) + M.Jitter(2) + M.adjustBrainLoss(0.25) if(prob(5)) M.emote(pick("twitch", "shiver")) ..() return -/datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob) +/datum/reagent/drug/methamphetamine/overdose_process(var/mob/living/M as mob) if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 4, i++) step(M, pick(cardinal)) @@ -184,25 +191,24 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) if(I) M.drop_item() ..() - if(prob(20)) - M.adjustToxLoss(5) + M.adjustToxLoss(1) M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) return -/datum/reagent/methamphetamine/addiction_act_stage1(var/mob/living/M as mob) +/datum/reagent/drug/methamphetamine/addiction_act_stage1(var/mob/living/M as mob) M.Jitter(5) if(prob(20)) M.emote(pick("twitch","drool","moan")) ..() return -/datum/reagent/methamphetamine/addiction_act_stage2(var/mob/living/M as mob) +/datum/reagent/drug/methamphetamine/addiction_act_stage2(var/mob/living/M as mob) M.Jitter(10) M.Dizzy(10) if(prob(30)) M.emote(pick("twitch","drool","moan")) ..() return -/datum/reagent/methamphetamine/addiction_act_stage3(var/mob/living/M as mob) +/datum/reagent/drug/methamphetamine/addiction_act_stage3(var/mob/living/M as mob) if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 4, i++) step(M, pick(cardinal)) @@ -212,7 +218,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M.emote(pick("twitch","drool","moan")) ..() return -/datum/reagent/methamphetamine/addiction_act_stage4(var/mob/living/carbon/human/M as mob) +/datum/reagent/drug/methamphetamine/addiction_act_stage4(var/mob/living/carbon/human/M as mob) if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 8, i++) step(M, pick(cardinal)) @@ -224,29 +230,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) ..() return -/datum/chemical_reaction/methamphetamine - name = "methamphetamine" - id = "methamphetamine" - result = "methamphetamine" - required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) - result_amount = 4 - required_temp = 374 - -/datum/chemical_reaction/saltpetre - name = "saltpetre" - id = "saltpetre" - result = "saltpetre" - required_reagents = list("potassium" = 1, "nitrogen" = 1, "oxygen" = 3) - result_amount = 3 - -/datum/reagent/saltpetre - name = "Saltpetre" - id = "saltpetre" - description = "Volatile." - reagent_state = LIQUID - color = "#60A584" // rgb: 96, 165, 132 - -/datum/reagent/bath_salts +/datum/reagent/drug/bath_salts name = "Bath Salts" id = "bath_salts" description = "Makes you nearly impervious to stuns and grants a stamina regeneration buff, but you will be a nearly uncontrollable tramp-bearded raving lunatic." @@ -256,16 +240,15 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) addiction_threshold = 10 -/datum/reagent/bath_salts/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom +/datum/reagent/drug/bath_salts/on_mob_life(var/mob/living/M as mob) var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") if(prob(5)) M << "[high_message]" - M.AdjustParalysis(-5) - M.AdjustStunned(-5) - M.AdjustWeakened(-5) - M.adjustStaminaLoss(-10) - M.adjustBrainLoss(1) + M.AdjustParalysis(-3) + M.AdjustStunned(-3) + M.AdjustWeakened(-3) + M.adjustStaminaLoss(-5) + M.adjustBrainLoss(0.5) M.adjustToxLoss(0.1) M.hallucination += 10 if(M.canmove && !istype(M.loc, /atom/movable)) @@ -274,15 +257,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) ..() return -/datum/chemical_reaction/bath_salts - name = "bath_salts" - id = "bath_salts" - result = "bath_salts" - required_reagents = list("????" = 1, "saltpetre" = 1, "nutriment" = 1, "cleaner" = 1, "enzyme" = 1, "tea" = 1, "mercury" = 1) - result_amount = 7 - required_temp = 374 - -/datum/reagent/bath_salts/overdose_process(var/mob/living/M as mob) +/datum/reagent/drug/bath_salts/overdose_process(var/mob/living/M as mob) M.hallucination += 10 if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 8, i++) @@ -296,7 +271,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) ..() return -/datum/reagent/bath_salts/addiction_act_stage1(var/mob/living/M as mob) +/datum/reagent/drug/bath_salts/addiction_act_stage1(var/mob/living/M as mob) M.hallucination += 10 if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 8, i++) @@ -307,7 +282,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M.emote(pick("twitch","drool","moan")) ..() return -/datum/reagent/bath_salts/addiction_act_stage2(var/mob/living/M as mob) +/datum/reagent/drug/bath_salts/addiction_act_stage2(var/mob/living/M as mob) M.hallucination += 20 if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 8, i++) @@ -319,7 +294,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M.emote(pick("twitch","drool","moan")) ..() return -/datum/reagent/bath_salts/addiction_act_stage3(var/mob/living/M as mob) +/datum/reagent/drug/bath_salts/addiction_act_stage3(var/mob/living/M as mob) M.hallucination += 30 if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 12, i++) @@ -331,7 +306,7 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) M.emote(pick("twitch","drool","moan")) ..() return -/datum/reagent/bath_salts/addiction_act_stage4(var/mob/living/carbon/human/M as mob) +/datum/reagent/drug/bath_salts/addiction_act_stage4(var/mob/living/carbon/human/M as mob) M.hallucination += 40 if(M.canmove && !istype(M.loc, /atom/movable)) for(var/i = 0, i < 16, i++) @@ -345,29 +320,21 @@ datum/reagent/crank/addiction_act_stage4(var/mob/living/M as mob) ..() return -/datum/chemical_reaction/aranesp - name = "aranesp" - id = "aranesp" - result = "aranesp" - required_reagents = list("epinephrine" = 1, "atropine" = 1, "morphine" = 1) - result_amount = 3 - -/datum/reagent/aranesp +/datum/reagent/drug/aranesp name = "Aranesp" id = "aranesp" description = "Amps you up and gets you going, fixes all stamina damage you might have but can cause toxin and oxygen damage.." reagent_state = LIQUID color = "#60A584" // rgb: 96, 165, 132 -/datum/reagent/aranesp/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom +/datum/reagent/drug/aranesp/on_mob_life(var/mob/living/M as mob) var/high_message = pick("You feel amped up.", "You feel ready.", "You feel like you can push it to the limit.") if(prob(5)) M << "[high_message]" - M.adjustStaminaLoss(-35) - M.adjustToxLoss(1) + M.adjustStaminaLoss(-18) + M.adjustToxLoss(0.5) if(prob(50)) M.losebreath++ - M.adjustOxyLoss(20) + M.adjustOxyLoss(1) ..() return diff --git a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm index 1765a0929af..c4425c6d595 100644 --- a/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Medicine-Reagents.dm @@ -1,6 +1,4 @@ -#define REM REAGENTS_EFFECT_MULTIPLIER - ////////////////////////////////////////////////////////////////////////////////////////// // MEDICINE REAGENTS ////////////////////////////////////////////////////////////////////////////////////// @@ -12,6 +10,7 @@ datum/reagent/medicine id = "medicine" datum/reagent/medicine/on_mob_life(var/mob/living/M as mob) + current_cycle++ holder.remove_reagent(src.id, metabolization_rate / M.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism datum/reagent/medicine/leporazine @@ -34,7 +33,6 @@ datum/reagent/medicine/adminordrazine //An OP chemical for admins color = "#C8A5DC" // rgb: 200, 165, 220 datum/reagent/medicine/adminordrazine/on_mob_life(var/mob/living/carbon/M as mob) - if(!M) M = holder.my_atom ///This can even heal dead people. M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1) M.setCloneLoss(0) M.setOxyLoss(0) @@ -152,5 +150,591 @@ datum/reagent/medicine/spaceacillin metabolization_rate = 0.5 * REAGENTS_METABOLISM -// Undefine the alias for REAGENTS_EFFECT_MULTIPLER -#undef REM \ No newline at end of file + + +//------------------------------------------------------------------------------------------------------ + //GOON MEDICINE +//------------------------------------------------------------------------------------------------------ + + +datum/reagent/medicine/silver_sulfadiazine + name = "Silver Sulfadiazine" + id = "silver_sulfadiazine" + description = "On touch, quickly heals burn damage. Basic anti-burn healing drug. On ingestion, deals minor toxin damage." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 5 * REAGENTS_METABOLISM + +datum/reagent/medicine/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) + if(iscarbon(M)) + if(method == TOUCH) + M.adjustFireLoss(-volume) + if(show_message) + M << "You feel your burns healing!" + M.emote("scream") + if(method == INGEST) + M.adjustToxLoss(0.5*volume) + if(show_message) + M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" + ..() + return + +datum/reagent/medicine/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob) + M.adjustFireLoss(-1*REM) + ..() + return + +datum/reagent/medicine/styptic_powder + name = "Styptic Powder" + id = "styptic_powder" + description = "On touch, quickly heals brute damage. Basic anti-brute healing drug. On ingestion, deals minor toxin damage." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 5 * REAGENTS_METABOLISM + +datum/reagent/medicine/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1) + if(iscarbon(M)) + if(method == TOUCH) + M.adjustBruteLoss(-volume) + if(show_message) + M << "You feel your wounds knitting back together!" + M.emote("scream") + if(method == INGEST) + M.adjustToxLoss(0.5*volume) + if(show_message) + M << "You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?" + ..() + return + +datum/reagent/medicine/styptic_powder/on_mob_life(var/mob/living/M as mob) + M.adjustBruteLoss(-2*REM) + ..() + return + +datum/reagent/medicine/salglu_solution + name = "Saline-Glucose Solution" + id = "salglu_solution" + description = "Has a 33% chance per metabolism cycle to heal brute and burn damage." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/medicine/salglu_solution/on_mob_life(var/mob/living/M as mob) + if(prob(33)) + M.adjustBruteLoss(-0.5*REM) + M.adjustFireLoss(-0.5*REM) + ..() + return + +datum/reagent/medicine/synthflesh + name = "Synthflesh" + id = "synthflesh" + description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/medicine/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume,var/show_message = 1) + if(iscarbon(M)) + if(method == TOUCH) + M.adjustBruteLoss(-1.5*volume) + M.adjustFireLoss(-1.5*volume) + if(show_message) + M << "You feel your burns healing and your flesh knitting together!" + ..() + return + +datum/reagent/medicine/charcoal + name = "Charcoal" + id = "charcoal" + description = "Heals toxin damage, and will also slowly remove any other chemicals." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/medicine/charcoal/on_mob_life(var/mob/living/M as mob) + M.adjustToxLoss(-1.5*REM) + for(var/datum/reagent/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.id,0.5) + ..() + return + +datum/reagent/medicine/omnizine + name = "Omnizine" + id = "omnizine" + description = "Heals 1 of each damage type a cycle. If overdosed it will deal significant amounts of each damage type." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 30 + +datum/reagent/medicine/omnizine/on_mob_life(var/mob/living/M as mob) + M.adjustToxLoss(-0.5*REM) + M.adjustOxyLoss(-0.5*REM) + M.adjustBruteLoss(-0.5*REM) + M.adjustFireLoss(-0.5*REM) + ..() + return + +datum/reagent/medicine/omnizine/overdose_process(var/mob/living/M as mob) + M.adjustToxLoss(1.5*REM) + M.adjustOxyLoss(1.5*REM) + M.adjustBruteLoss(1.5*REM) + M.adjustFireLoss(1.5*REM) + ..() + return + +datum/reagent/medicine/calomel + name = "Calomel" + id = "calomel" + description = "Quickly purges the body of all chemicals. If your health is above 20, toxin damage is dealt. When you hit 20 health or lower, the damage will cease." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/medicine/calomel/on_mob_life(var/mob/living/M as mob) + for(var/datum/reagent/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.id,2.5) + if(M.health > 20) + M.adjustToxLoss(2.5*REM) + ..() + return + +datum/reagent/medicine/potass_iodide + name = "Potassium Iodide" + id = "potass_iodide" + description = "Reduces low radiation damage very effectively." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 2 * REAGENTS_METABOLISM + +datum/reagent/medicine/potass_iodide/on_mob_life(var/mob/living/M as mob) + if(M.radiation > 0) + M.radiation-- + if(M.radiation < 0) + M.radiation = 0 + ..() + return + +datum/reagent/medicine/pen_acid + name = "Pentetic Acid" + id = "pen_acid" + description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body. Has a chance of dealing brute damage." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/medicine/pen_acid/on_mob_life(var/mob/living/M as mob) + if(M.radiation > 0) + M.radiation -= 4 + M.adjustToxLoss(-2*REM) + if(prob(33)) + M.adjustBruteLoss(0.5*REM) + if(M.radiation < 0) + M.radiation = 0 + for(var/datum/reagent/R in M.reagents.reagent_list) + if(R != src) + M.reagents.remove_reagent(R.id,2) + ..() + return + +datum/reagent/medicine/sal_acid + name = "Salicyclic Acid" + id = "sal_acid" + description = "If you have less than 50 brute damage, it heals 0.25 unit. If overdosed it will deal 0.5 brute damage if the patient has less than 50 brute damage already." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 25 + +datum/reagent/medicine/sal_acid/on_mob_life(var/mob/living/M as mob) + if(M.getBruteLoss() < 50) + M.adjustBruteLoss(-0.25*REM) + ..() + return + +datum/reagent/medicine/sal_acid/overdose_process(var/mob/living/M as mob) + if(M.getBruteLoss() < 50) + M.adjustBruteLoss(0.5*REM) + ..() + return + +datum/reagent/medicine/salbutamol + name = "Salbutamol" + id = "salbutamol" + description = "Quickly heals oxygen damage while slowing down suffocation. Great for stabilizing critical patients!" + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + +datum/reagent/medicine/salbutamol/on_mob_life(var/mob/living/M as mob) + M.adjustOxyLoss(-3*REM) + if(M.losebreath >= 4) + M.losebreath -= 2 + ..() + return + +datum/reagent/medicine/perfluorodecalin + name = "Perfluorodecalin" + id = "perfluorodecalin" + description = "Heals suffocation damage so quickly that you could have a spacewalk, but it mutes your voice. Has a 33% chance of healing brute and burn damage per cycle as well." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + +datum/reagent/medicine/perfluorodecalin/on_mob_life(var/mob/living/carbon/human/M as mob) + M.adjustOxyLoss(-12*REM) + M.silent = max(M.silent, 5) + if(prob(33)) + M.adjustBruteLoss(-0.5*REM) + M.adjustFireLoss(-0.5*REM) + ..() + return + +datum/reagent/medicine/ephedrine + name = "Ephedrine" + id = "ephedrine" + description = "Reduces stun times, increases run speed. If overdosed it will deal toxin and oxyloss damage." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 45 + addiction_threshold = 30 + +datum/reagent/medicine/ephedrine/on_mob_life(var/mob/living/M as mob) + M.status_flags |= IGNORESLOWDOWN + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + M.adjustStaminaLoss(-1*REM) + ..() + return + +datum/reagent/medicine/ephedrine/overdose_process(var/mob/living/M as mob) + if(prob(33)) + M.adjustToxLoss(0.5*REM) + M.losebreath++ + ..() + return + +datum/reagent/medicine/ephedrine/addiction_act_stage1(var/mob/living/M as mob) + if(prob(33)) + M.adjustToxLoss(2*REM) + M.losebreath += 2 + ..() + return +datum/reagent/medicine/ephedrine/addiction_act_stage2(var/mob/living/M as mob) + if(prob(33)) + M.adjustToxLoss(3*REM) + M.losebreath += 3 + ..() + return +datum/reagent/medicine/ephedrine/addiction_act_stage3(var/mob/living/M as mob) + if(prob(33)) + M.adjustToxLoss(4*REM) + M.losebreath += 4 + ..() + return +datum/reagent/medicine/ephedrine/addiction_act_stage4(var/mob/living/M as mob) + if(prob(33)) + M.adjustToxLoss(5*REM) + M.losebreath += 5 + ..() + return + +datum/reagent/medicine/diphenhydramine + name = "Diphenhydramine" + id = "diphenhydramine" + description = "Purges body of lethal Histamine and reduces jitteriness while causing minor drowsiness." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/medicine/diphenhydramine/on_mob_life(var/mob/living/M as mob) + if(prob(50)) + M.drowsyness += 1 + M.jitteriness -= 1 + M.reagents.remove_reagent("histamine",1.5) + ..() + return + +datum/reagent/medicine/morphine + name = "Morphine" + id = "morphine" + description = "Will allow you to ignore slowdown from equipment and damage. Will eventually knock you out if you take too much. If overdosed it will cause jitteriness, dizziness, force the victim to drop items in their hands and eventually deal toxin damage." + reagent_state = LIQUID + color = "#C8A5DC" + var/cycle_count = 0 + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 30 + addiction_threshold = 25 + + +datum/reagent/medicine/morphine/on_mob_life(var/mob/living/M as mob) + M.status_flags |= IGNORESLOWDOWN + if(cycle_count >= 36) + M.sleeping += 3 + cycle_count++ + ..() + return + +datum/reagent/medicine/morphine/overdose_process(var/mob/living/M as mob) + if(prob(33)) + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + M.Dizzy(2) + M.Jitter(2) + ..() + return + +datum/reagent/medicine/morphine/addiction_act_stage1(var/mob/living/M as mob) + if(prob(33)) + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + M.Dizzy(2) + M.Jitter(2) + ..() + return +datum/reagent/medicine/morphine/addiction_act_stage2(var/mob/living/M as mob) + if(prob(33)) + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + M.adjustToxLoss(1*REM) + M.Dizzy(3) + M.Jitter(3) + ..() + return +datum/reagent/medicine/morphine/addiction_act_stage3(var/mob/living/M as mob) + if(prob(33)) + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + M.adjustToxLoss(2*REM) + M.Dizzy(4) + M.Jitter(4) + ..() + return +datum/reagent/medicine/morphine/addiction_act_stage4(var/mob/living/M as mob) + if(prob(33)) + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + M.adjustToxLoss(3*REM) + M.Dizzy(5) + M.Jitter(5) + ..() + return + +datum/reagent/medicine/oculine + name = "Oculine" + id = "oculine" + description = "Cures blindness and heals eye damage over time." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + var/cycle_amount = 0 + +datum/reagent/medicine/oculine/on_mob_life(var/mob/living/M as mob) + cycle_amount++ + if(M.eye_blind > 0 && cycle_amount > 20) + if(prob(30)) + M.eye_blind = 0 + else if(prob(80)) + M.eye_blind = 0 + M.eye_blurry = 1 + if(M.eye_blurry > 0) + if(prob(80)) + M.eye_blurry = 0 + ..() + return + +datum/reagent/medicine/atropine + name = "Atropine" + id = "atropine" + description = "If patients health is below -25 it will heal 1.5 brute and burn damage per cycle, as well as stop any oxyloss. Good for stabilising critical patients." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 35 + +datum/reagent/medicine/atropine/on_mob_life(var/mob/living/M as mob) + if(M.health > -60) + M.adjustToxLoss(0.5*REM) + if(M.health < -25) + M.adjustBruteLoss(-1.5*REM) + M.adjustFireLoss(-1.5*REM) + if(M.oxyloss > 65) + M.setOxyLoss(65) + if(M.losebreath > 5) + M.losebreath = 5 + if(prob(20)) + M.Dizzy(5) + M.Jitter(5) + ..() + return + +datum/reagent/medicine/atropine/overdose_process(var/mob/living/M as mob) + M.adjustToxLoss(0.5*REM) + M.Dizzy(1) + M.Jitter(1) + ..() + return + +datum/reagent/medicine/epinephrine + name = "Epinephrine" + id = "epinephrine" + description = "Reduces most of the knockout/stun effects, minor stamina regeneration buff. Attempts to stop you taking too much oxygen damage. If the patient is in low to severe crit, heals toxins, brute, and burn very effectively. Will not heal patients who are almost dead. If overdosed will stun and deal toxin damage" + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 30 + +datum/reagent/medicine/epinephrine/on_mob_life(var/mob/living/M as mob) + if(M.health < -10 && M.health > -65) + M.adjustToxLoss(-0.5*REM) + M.adjustBruteLoss(-0.5*REM) + M.adjustFireLoss(-0.5*REM) + if(M.oxyloss > 35) + M.setOxyLoss(35) + if(M.losebreath >= 4) + M.losebreath -= 2 + if(M.losebreath < 0) + M.losebreath = 0 + M.adjustStaminaLoss(-0.5*REM) + if(prob(20)) + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + ..() + return + +datum/reagent/medicine/epinephrine/overdose_process(var/mob/living/M as mob) + if(prob(33)) + M.adjustStaminaLoss(2.5*REM) + M.adjustToxLoss(1*REM) + M.losebreath++ + ..() + return + +datum/reagent/medicine/strange_reagent + name = "Strange Reagent" + id = "strange_reagent" + description = "A miracle drug that can bring a dead body back to life! If the corpse has suffered too much damage, however, no change will occur to the body. If used on a living person it will deal Brute and Burn damage." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/medicine/strange_reagent/reaction_mob(var/mob/living/carbon/human/M as mob, var/method=TOUCH, var/volume) + if(M.stat == DEAD) + if(M.getBruteLoss() >= 100 || M.getFireLoss() >= 100) + M.visible_message("[M]'s body convulses a bit, and then falls still once more.") + return + var/mob/dead/observer/ghost = M.get_ghost() + M.visible_message("[M]'s body convulses a bit.") + if(!M.suiciding && !(NOCLONE in M.mutations)) + if(ghost) + ghost << "Someone is trying to revive you. Return to your body if you want to be revived! (Verbs -> Ghost -> Re-enter corpse)" + ghost << sound('sound/effects/genetics.ogg') + else + M.stat = 1 + M.adjustOxyLoss(-20) + M.adjustToxLoss(-20) + dead_mob_list -= M + living_mob_list |= list(M) + M.emote("gasp") + add_logs(M, M, "revived", object="strange reagent") + ..() + return + +datum/reagent/medicine/strange_reagent/on_mob_life(var/mob/living/M as mob) + M.adjustBruteLoss(0.5*REM) + M.adjustFireLoss(0.5*REM) + ..() + return + +/datum/reagent/medicine/mannitol + name = "Mannitol" + id = "mannitol" + description = "Heals brain damage effectively. Use it in cyro tubes alongside Cryoxadone." + color = "#C8A5DC" + +/datum/reagent/medicine/mannitol/on_mob_life(mob/living/M as mob) + M.adjustBrainLoss(-3*REM) + ..() + return + +/datum/reagent/medicine/mutadone + name = "Mutadone" + id = "mutadone" + description = "Heals your genetic defects." + color = "#C8A5DC" + +/datum/reagent/medicine/mutadone/on_mob_life(var/mob/living/carbon/human/M as mob) + M.jitteriness = 0 + if(istype(M) && M.dna) + M.dna.remove_all_mutations() + ..() + return + +datum/reagent/medicine/antihol + name = "Antihol" + id = "antihol" + description = "Helps remove Alcohol from someone's body, as well as eliminating its side effects." + color = "#C8A5DC" + +datum/reagent/medicine/antihol/on_mob_life(var/mob/living/M as mob) + M.dizziness = 0 + M.drowsyness = 0 + M.slurring = 0 + M.confused = 0 + M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3*REM, 0, 1) + M.adjustToxLoss(-0.2*REM) + ..() + +/datum/reagent/medicine/stimulants + name = "Stimulants" + id = "stimulants" + description = "Increases run speed and eliminates stuns, can heal minor damage. If overdosed it will deal toxin damage and stun." + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + overdose_threshold = 60 + +datum/reagent/medicine/stimulants/on_mob_life(var/mob/living/M as mob) + M.status_flags |= IGNORESLOWDOWN + if(M.health < 50 && M.health > 0) + M.adjustOxyLoss(-1*REM) + M.adjustToxLoss(-1*REM) + M.adjustBruteLoss(-1*REM) + M.adjustFireLoss(-1*REM) + M.AdjustParalysis(-1) + M.AdjustStunned(-1) + M.AdjustWeakened(-1) + M.adjustStaminaLoss(-1.5*REM) + ..() + +datum/reagent/medicine/stimulants/overdose_process(var/mob/living/M as mob) + if(prob(33)) + M.adjustStaminaLoss(2.5*REM) + M.adjustToxLoss(1*REM) + M.losebreath++ + ..() + return + +datum/reagent/medicine/insulin + name = "Insulin" + id = "insulin" + description = "Increases sugar depletion rates." + reagent_state = LIQUID + color = "#C8A5DC" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/medicine/insulin/on_mob_life(var/mob/living/M as mob) + if(M.sleeping) + M.sleeping-- + M.reagents.remove_reagent("sugar", 3) + ..() + return diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm similarity index 80% rename from code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm rename to code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm index d86016f96ab..43650c72067 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm @@ -1,141 +1,3 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 - -#define REM REAGENTS_EFFECT_MULTIPLIER - -//The reaction procs must ALWAYS set src = null, this detaches the proc from the object (the reagent) -//so that it can continue working when the reagent is deleted while the proc is still active. - - -//Various reagents -//Toxin & acid reagents -//Hydroponics stuff - -datum/reagent - var/name = "Reagent" - var/id = "reagent" - var/description = "" - var/datum/reagents/holder = null - var/reagent_state = LIQUID - var/list/data - var/current_cycle = 0 - var/volume = 0 - var/color = "#000000" // rgb: 0, 0, 0 - var/can_synth = 1 - var/metabolization_rate = REAGENTS_METABOLISM - var/overrides_metab = 0 - var/overdose_threshold = 0 - var/addiction_threshold = 0 - var/addiction_stage = 0 - var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick. - -datum/reagent/Destroy() // This should only be called by the holder, so it's already handled clearing its references - ..() - holder = null - -datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume, var/show_message = 1) //By default we have a chance to transfer some - if(!istype(M, /mob/living)) - return 0 - var/datum/reagent/self = src - src = null //of the reagent to the mob on TOUCHING it. - - if(!istype(self.holder.my_atom, /obj/effect/effect/chem_smoke)) - // If the chemicals are in a smoke cloud, do not try to let the chemicals "penetrate" into the mob's system (balance station 13) -- Doohl - - if(method == TOUCH) - - var/chance = 1 - var/block = 0 - - for(var/obj/item/clothing/C in M.get_equipped_items()) - if(C.permeability_coefficient < chance) chance = C.permeability_coefficient - if(istype(C, /obj/item/clothing/suit/bio_suit)) - // bio suits are just about completely fool-proof - Doohl - // kind of a hacky way of making bio suits more resistant to chemicals but w/e - if(prob(75)) - block = 1 - - if(istype(C, /obj/item/clothing/head/bio_hood)) - if(prob(75)) - block = 1 - - chance = chance * 100 - - if(prob(chance) && !block) - if(M.reagents) - M.reagents.add_reagent(self.id,self.volume/2) - return 1 - -datum/reagent/proc/reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object - src = null //if it can hold reagents. nope! - //if(O.reagents) - // O.reagents.add_reagent(id,volume/3) - return - -datum/reagent/proc/reaction_turf(var/turf/T, var/volume) - src = null - return - -datum/reagent/proc/on_mob_life(var/mob/living/M as mob) - current_cycle++ - if(!istype(M, /mob/living)) - return //Noticed runtime errors from facid trying to damage ghosts, this should fix. --NEO - holder.remove_reagent(src.id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears. - return - -// Called when this reagent is removed while inside a mob -datum/reagent/proc/on_mob_delete(mob/M) - return - -datum/reagent/proc/on_move(var/mob/M) - return - -// Called after add_reagents creates a new reagent. -datum/reagent/proc/on_new(var/data) - return - -// Called when two reagents of the same are mixing. -datum/reagent/proc/on_merge(var/data) - return - -datum/reagent/proc/on_update(var/atom/A) - return - -// Called every time reagent containers process. -datum/reagent/proc/on_tick(var/data) - return - -// Called when the reagent container is hit by an explosion -datum/reagent/proc/on_ex_act(var/severity) - return - -// Called if the reagent has passed the overdose threshold and is set to be triggering overdose effects -datum/reagent/proc/overdose_process(var/mob/living/M as mob) - return - -datum/reagent/proc/overdose_start(var/mob/living/M as mob) - return - -datum/reagent/proc/addiction_act_stage1(var/mob/living/M as mob) - if(prob(30)) - M << "You feel like some [name] right about now." - return - -datum/reagent/proc/addiction_act_stage2(var/mob/living/M as mob) - if(prob(30)) - M << "You feel like you need [name]. You just can't get enough." - return - -datum/reagent/proc/addiction_act_stage3(var/mob/living/M as mob) - if(prob(30)) - M << "You have an intense craving for [name]." - return - -datum/reagent/proc/addiction_act_stage4(var/mob/living/M as mob) - if(prob(30)) - M << "You're not feeling good at all! You really need some [name]." - return datum/reagent/blood data = list("donor"=null,"viruses"=null,"blood_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null) @@ -433,22 +295,6 @@ datum/reagent/aslimetoxin/reaction_mob(var/mob/M, var/volume) src = null M.ForceContractDisease(new /datum/disease/transformation/slime(0)) -datum/reagent/space_drugs - name = "Space drugs" - id = "space_drugs" - description = "An illegal chemical compound used as drug." - color = "#60A584" // rgb: 96, 165, 132 - metabolization_rate = 0.5 * REAGENTS_METABOLISM - -datum/reagent/space_drugs/on_mob_life(var/mob/living/M as mob) - M.druggy = max(M.druggy, 15) - if(isturf(M.loc) && !istype(M.loc, /turf/space)) - if(M.canmove) - if(prob(10)) step(M, pick(cardinal)) - if(prob(7)) M.emote(pick("twitch","drool","moan","giggle")) - ..() - return - datum/reagent/serotrotium name = "Serotrotium" id = "serotrotium" @@ -590,12 +436,6 @@ datum/reagent/glycerol description = "Glycerol is a simple polyol compound. Glycerol is sweet-tasting and of low toxicity." color = "#808080" // rgb: 128, 128, 128 -datum/reagent/nitroglycerin - name = "Nitroglycerin" - id = "nitroglycerin" - description = "Nitroglycerin is a heavy, colorless, oily, explosive liquid obtained by nitrating glycerol." - color = "#808080" // rgb: 128, 128, 128 - datum/reagent/radium name = "Radium" id = "radium" @@ -615,30 +455,6 @@ datum/reagent/radium/reaction_turf(var/turf/T, var/volume) var/obj/effect/decal/cleanable/reagentdecal = new/obj/effect/decal/cleanable/greenglow(T) reagentdecal.reagents.add_reagent("uranium", volume) -datum/reagent/thermite - name = "Thermite" - id = "thermite" - description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls." - reagent_state = SOLID - color = "#673910" // rgb: 103, 57, 16 - -datum/reagent/thermite/reaction_turf(var/turf/T, var/volume) - src = null - if(volume >= 1 && istype(T, /turf/simulated/wall)) - var/turf/simulated/wall/Wall = T - if(istype(Wall, /turf/simulated/wall/r_wall)) - Wall.thermite = Wall.thermite+(volume*2.5) - else - Wall.thermite = Wall.thermite+(volume*10) - Wall.overlays = list() - Wall.overlays += image('icons/effects/effects.dmi',"thermite") - return - -datum/reagent/thermite/on_mob_life(var/mob/living/M as mob) - M.adjustFireLoss(1) - ..() - return - datum/reagent/sterilizine name = "Sterilizine" id = "sterilizine" @@ -952,5 +768,170 @@ datum/reagent/plantnutriment/robustharvestnutriment -// Undefine the alias for REAGENTS_EFFECT_MULTIPLER -#undef REM + + + + +// GOON OTHERS + + + +datum/reagent/oil + name = "Oil" + id = "oil" + description = "Burns in a small smoky fire, mostly used to get Ash." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/stable_plasma + name = "Stable Plasma" + id = "stable_plasma" + description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/iodine + name = "Iodine" + id = "iodine" + description = "A slippery solution." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/fluorine + name = "Fluorine" + id = "fluorine" + description = "A slippery solution." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/carpet + name = "Carpet" + id = "carpet" + description = "A slippery solution." + reagent_state = LIQUID + color = "#C8A5DC" + +/datum/reagent/carpet/reaction_turf(var/turf/simulated/T, var/volume) + if(istype(T, /turf/simulated/floor/plating) || istype(T, /turf/simulated/floor/plasteel)) + var/turf/simulated/floor/F = T + F.ChangeTurf(/turf/simulated/floor/fancy/carpet) + ..() + return + +datum/reagent/bromine + name = "Bromine" + id = "bromine" + description = "A slippery solution." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/phenol + name = "Phenol" + id = "phenol" + description = "Used for certain medical recipes." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/ash + name = "Ash" + id = "ash" + description = "Basic ingredient in a couple of recipes." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/acetone + name = "Acetone" + id = "acetone" + description = "Common ingredient in other recipes." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/colorful_reagent + name = "Colorful Reagent" + id = "colorful_reagent" + description = "A solution." + reagent_state = LIQUID + color = "#C8A5DC" + var/list/random_color_list = list("#00aedb","#a200ff","#f47835","#d41243","#d11141","#00b159","#00aedb","#f37735","#ffc425","#008744","#0057e7","#d62d20","#ffa700") + + +datum/reagent/colorful_reagent/on_mob_life(var/mob/living/M as mob) + if(M && isliving(M)) + M.color = pick(random_color_list) + ..() + return + +datum/reagent/colorful_reagent/reaction_mob(var/mob/living/M, var/volume) + if(M && isliving(M)) + M.color = pick(random_color_list) + ..() + return +datum/reagent/colorful_reagent/reaction_obj(var/obj/O, var/volume) + if(O) + O.color = pick(random_color_list) + ..() + return +datum/reagent/colorful_reagent/reaction_turf(var/turf/T, var/volume) + if(T) + T.color = pick(random_color_list) + ..() + return + +datum/reagent/hair_dye + name = "Quantum Hair Dye" + id = "hair_dye" + description = "A solution." + reagent_state = LIQUID + color = "#C8A5DC" + var/list/potential_colors = list("0ad","a0f","f73","d14","d14","0b5","0ad","f73","fc2","084","05e","d22","fa0") // fucking hair code + +datum/reagent/hair_dye/reaction_mob(var/mob/living/M, var/volume) + if(M && ishuman(M)) + var/mob/living/carbon/human/H = M + H.hair_color = pick(potential_colors) + H.facial_hair_color = pick(potential_colors) + H.update_hair() + ..() + return + +datum/reagent/barbers_aid + name = "Barber's Aid" + id = "barbers_aid" + description = "A solution to hair loss across the world." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/barbers_aid/reaction_mob(var/mob/living/M, var/volume) + if(M && ishuman(M)) + var/mob/living/carbon/human/H = M + var/datum/sprite_accessory/hair/picked_hair = pick(hair_styles_list) + var/datum/sprite_accessory/facial_hair/picked_beard = pick(facial_hair_styles_list) + H.hair_style = picked_hair + H.facial_hair_style = picked_beard + H.update_hair() + ..() + return + +datum/reagent/concentrated_barbers_aid + name = "Concentrated Barber's Aid" + id = "concentrated_barbers_aid" + description = "A concentrated solution to hair loss across the world." + reagent_state = LIQUID + color = "#C8A5DC" + +datum/reagent/concentrated_barbers_aid/reaction_mob(var/mob/living/M, var/volume) + if(M && ishuman(M)) + var/mob/living/carbon/human/H = M + H.hair_style = "Very Long Hair" + H.facial_hair_style = "Very Long Beard" + H.update_hair() + ..() + return + +/datum/reagent/saltpetre + name = "Saltpetre" + id = "saltpetre" + description = "Volatile." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + diff --git a/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm new file mode 100644 index 00000000000..16eafd9398e --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm @@ -0,0 +1,189 @@ + +datum/reagent/thermite + name = "Thermite" + id = "thermite" + description = "Thermite produces an aluminothermic reaction known as a thermite reaction. Can be used to melt walls." + reagent_state = SOLID + color = "#673910" // rgb: 103, 57, 16 + +datum/reagent/thermite/reaction_turf(var/turf/T, var/volume) + src = null + if(volume >= 1 && istype(T, /turf/simulated/wall)) + var/turf/simulated/wall/Wall = T + if(istype(Wall, /turf/simulated/wall/r_wall)) + Wall.thermite = Wall.thermite+(volume*2.5) + else + Wall.thermite = Wall.thermite+(volume*10) + Wall.overlays = list() + Wall.overlays += image('icons/effects/effects.dmi',"thermite") + +datum/reagent/thermite/on_mob_life(var/mob/living/M as mob) + M.adjustFireLoss(1) + ..() + +/datum/reagent/stabilizing_agent + name = "Stabilizing Agent" + id = "stabilizing_agent" + description = "Keeps unstable chemicals stable. This does not work on everything." + reagent_state = LIQUID + color = "#FFFFFF" + +/datum/reagent/clf3 + name = "Chlorine Trifluoride" + id = "clf3" + description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space." + reagent_state = LIQUID + color = "#FF0000" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +/datum/reagent/clf3/on_mob_life(var/mob/living/M as mob) + M.adjust_fire_stacks(2) + M.adjustFireLoss(0.3*M.fire_stacks) + ..() + +/datum/reagent/clf3/reaction_turf(var/turf/simulated/T, var/volume) + if(istype(T, /turf/simulated/floor/plating)) + var/turf/simulated/floor/plating/F = T + if(prob(1)) + F.ChangeTurf(/turf/space) + if(istype(T, /turf/simulated/floor/)) + var/turf/simulated/floor/F = T + if(prob(volume/10)) + F.make_plating() + if(istype(F, /turf/simulated/floor/)) + new /obj/effect/hotspot(F) + if(istype(T, /turf/simulated/wall/)) + var/turf/simulated/wall/W = T + if(prob(volume/10)) + W.ChangeTurf(/turf/simulated/floor) + +/datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(method == TOUCH && isliving(M)) + M.adjust_fire_stacks(5) + M.IgniteMob() + new /obj/effect/hotspot(M.loc) + +/datum/reagent/sorium + name = "Sorium" + id = "sorium" + description = "Sends everything flying from the detonation point." + reagent_state = LIQUID + color = "#FFA500" + +/datum/reagent/liquid_dark_matter + name = "Liquid Dark Matter" + id = "liquid_dark_matter" + description = "Sucks everything into the detonation point." + reagent_state = LIQUID + color = "#800080" + +/datum/reagent/blackpowder + name = "Black Powder" + id = "blackpowder" + description = "Explodes. Violently." + reagent_state = LIQUID + color = "#000000" + metabolization_rate = 0.05 + +/datum/reagent/blackpowder/on_ex_act() + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/reagents_explosion/e = new() + e.set_up(round(volume/8, 1), location, 1, 4, message = 0) + e.start() + holder.clear_reagents() + +/datum/reagent/flash_powder + name = "Flash Powder" + id = "flash_powder" + description = "Makes a very bright flash." + reagent_state = LIQUID + color = "#FFFF00" + +/datum/reagent/smoke_powder + name = "Smoke Powder" + id = "smoke_powder" + description = "Makes a large cloud of smoke that can carry reagents." + reagent_state = LIQUID + color = "#808080" + +/datum/reagent/sonic_powder + name = "Sonic Powder" + id = "sonic_powder" + description = "Makes a deafening noise." + reagent_state = LIQUID + color = "#0000FF" + +/datum/reagent/phlogiston + name = "Phlogiston" + id = "phlogiston" + description = "Catches you on fire and makes you ignite." + reagent_state = LIQUID + color = "#FF9999" + +/datum/reagent/phlogiston/on_mob_life(var/mob/living/M as mob) + M.adjust_fire_stacks(1) + M.IgniteMob() + M.adjustFireLoss(0.2*M.fire_stacks) + ..() + return + +/datum/reagent/napalm + name = "Napalm" + id = "napalm" + description = "Very flammable." + reagent_state = LIQUID + color = "#FF9999" + +/datum/reagent/napalm/on_mob_life(var/mob/living/M as mob) + M.adjust_fire_stacks(1) + ..() + +/datum/reagent/napalm/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(method == TOUCH && isliving(M)) + M.adjust_fire_stacks(7) + +datum/reagent/cryostylane + name = "Cryostylane" + id = "cryostylane" + description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K." + color = "#B2B2FF" // rgb: 139, 166, 233 + metabolization_rate = 0.5 * REAGENTS_METABOLISM + + +datum/reagent/cryostylane/on_mob_life(var/mob/living/M as mob) //TODO: code freezing into an ice cube + if(M.reagents.has_reagent("oxygen")) + M.reagents.remove_reagent("oxygen", 0.5) + M.bodytemperature -= 15 + ..() + +datum/reagent/cryostylane/on_tick() + if(holder.has_reagent("oxygen")) + holder.remove_reagent("oxygen", 1) + holder.chem_temp -= 10 + holder.handle_reactions() + ..() + +datum/reagent/cryostylane/reaction_turf(var/turf/simulated/T, var/volume) + if(volume >= 5) + for(var/mob/living/simple_animal/slime/M in T) + M.adjustToxLoss(rand(15,30)) + +datum/reagent/pyrosium + name = "Pyrosium" + id = "pyrosium" + description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K." + color = "#B20000" // rgb: 139, 166, 233 + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/pyrosium/on_mob_life(var/mob/living/M as mob) + if(M.reagents.has_reagent("oxygen")) + M.reagents.remove_reagent("oxygen", 0.5) + M.bodytemperature += 15 + ..() + +datum/reagent/pyrosium/on_tick() + if(holder.has_reagent("oxygen")) + holder.remove_reagent("oxygen", 1) + holder.chem_temp += 10 + holder.handle_reactions() + ..() diff --git a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm index 96a1095694e..7f53a393efd 100644 --- a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm @@ -1,7 +1,4 @@ -#define REM REAGENTS_EFFECT_MULTIPLIER - - //////////////////////////Poison stuff (Toxins & Acids)/////////////////////// datum/reagent/toxin @@ -327,6 +324,289 @@ datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/M) data = max(data - 1, 3) ..() +datum/reagent/toxin/polonium + name = "Polonium" + id = "polonium" + description = "Cause significant Radiation damage over time." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.125 * REAGENTS_METABOLISM + toxpwr = 0 + +datum/reagent/toxin/polonium/on_mob_life(var/mob/living/M as mob) + M.radiation += 4 + ..() + +datum/reagent/toxin/histamine + name = "Histamine" + id = "histamine" + description = "A dose-dependent toxin, ranges from annoying to incredibly lethal." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + overdose_threshold = 30 + toxpwr = 0 + +datum/reagent/toxin/histamine/on_mob_life(var/mob/living/M as mob) + if(prob(50)) + switch(pick(1, 2, 3, 4)) + if(1) + M << "You can barely see!" + M.eye_blurry = 3 + if(2) + M.emote("cough") + if(3) + M.emote("sneeze") + if(4) + if(prob(75)) + M << "You scratch at an itch." + M.adjustBruteLoss(2*REM) + ..() + +datum/reagent/toxin/histamine/overdose_process(var/mob/living/M as mob) + M.adjustOxyLoss(1*REM) + M.adjustBruteLoss(1*REM) + M.adjustToxLoss(1*REM) + ..() + +datum/reagent/toxin/formaldehyde + name = "Formaldehyde" + id = "formaldehyde" + description = "Deals a moderate amount of Toxin damage over time. 10% chance to decay into 10-15 histamine." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + toxpwr = 0.5 + +datum/reagent/toxin/formaldehyde/on_mob_life(var/mob/living/M as mob) + if(prob(5)) + M.reagents.add_reagent("histamine",pick(5,15)) + M.reagents.remove_reagent("formaldehyde",1) + ..() + +datum/reagent/toxin/venom + name = "Venom" + id = "venom" + description = "Will deal scaling amounts of Toxin and Brute damage over time. 15% chance to decay into 5-10 histamine." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + toxpwr = 0 + +datum/reagent/toxin/venom/on_mob_life(var/mob/living/M as mob) + toxpwr = 0.05*volume + M.adjustBruteLoss((0.1*volume)*REM) + if(prob(15)) + M.reagents.add_reagent("histamine",pick(5,10)) + M.reagents.remove_reagent("venom",1) + ..() + +datum/reagent/toxin/neurotoxin2 + name = "Neurotoxin" + id = "neurotoxin2" + description = "Deals toxin and brain damage up to 60 before it slows down, causing confusion and a knockout after 54 elapsed cycles." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + toxpwr = 0 + +datum/reagent/toxin/neurotoxin2/on_mob_life(var/mob/living/M as mob) + if(M.brainloss + M.toxloss <= 60) + M.adjustBrainLoss(1*REM) + M.adjustToxLoss(1*REM) + if(current_cycle == 54) + M.sleeping += 5 + ..() + +datum/reagent/toxin/cyanide + name = "Cyanide" + id = "cyanide" + description = "Deals toxin damage, alongside some oxygen loss. 8% chance of stun and some extra toxin damage." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.125 * REAGENTS_METABOLISM + toxpwr = 0.75 + +datum/reagent/toxin/cyanide/on_mob_life(var/mob/living/M as mob) + if(prob(5)) + M.losebreath += 1 + if(prob(4)) + M << "You feel horrendously weak!" + M.Stun(2) + M.adjustToxLoss(2*REM) + ..() + +/datum/reagent/toxin/questionmark // food poisoning + name = "Bad Food" + id = "????" + description = "????" + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + toxpwr = 0.5 + +datum/reagent/toxin/itching_powder + name = "Itching Powder" + id = "itching_powder" + description = "Lots of annoying random effects, chances to do some brute damage from scratching. 6% chance to decay into 1-3 units of histamine." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.4 * REAGENTS_METABOLISM + toxpwr = 0 + +/datum/reagent/toxin/itching_powder/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) + if(method == TOUCH) + M.reagents.add_reagent("itching_powder", volume) + return + +datum/reagent/toxin/itching_powder/on_mob_life(var/mob/living/M as mob) + if(prob(15)) + M << "You scratch at your head." + M.adjustBruteLoss(0.2*REM) + if(prob(15)) + M << "You scratch at your leg." + M.adjustBruteLoss(0.2*REM) + if(prob(15)) + M << "You scratch at your arm." + M.adjustBruteLoss(0.2*REM) + if(prob(3)) + M.reagents.add_reagent("histamine",rand(1,3)) + M.reagents.remove_reagent("itching_powder",1) + ..() + +datum/reagent/toxin/initropidril + name = "Initropidril" + id = "initropidril" + description = "Causes some toxin damage, 5% chances to cause stunning, suffocation, or immediate heart failure." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + toxpwr = 2.5 + +datum/reagent/toxin/initropidril/on_mob_life(var/mob/living/M as mob) + if(prob(5)) + var/picked_option = rand(1,3) + switch(picked_option) + if(1) + M.Stun(3) + M.Weaken(3) + if(2) + M.losebreath += 10 + M.adjustOxyLoss(rand(5,25)) + if(3) + var/mob/living/carbon/human/H = M + if(!H.heart_attack) + H.visible_message("[H] clutches at their chest as if their heart stopped!") + H.heart_attack = 1 // rip in pepperoni + else + H.losebreath += 10 + H.adjustOxyLoss(rand(5,25)) + ..() + +datum/reagent/toxin/pancuronium + name = "Pancuronium" + id = "pancuronium" + description = "Knocks you out after 30 seconds, 7% chance to cause some oxygen loss." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.25 * REAGENTS_METABOLISM + toxpwr = 0 + +datum/reagent/toxin/pancuronium/on_mob_life(var/mob/living/M as mob) + if(current_cycle >= 30) + M.SetParalysis(3) + if(prob(7)) + M.losebreath += 4 + ..() + +datum/reagent/toxin/sodium_thiopental + name = "Sodium Thiopental" + id = "sodium_thiopental" + description = "Puts you to sleep after 30 seconds, along with some major stamina loss." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.75 * REAGENTS_METABOLISM + toxpwr = 0 + +datum/reagent/toxin/sodium_thiopental/on_mob_life(var/mob/living/M as mob) + if(current_cycle >= 30) + M.sleeping += 1.5 + M.adjustStaminaLoss(5*REM) + ..() + +datum/reagent/toxin/sulfonal + name = "Sulfonal" + id = "sulfonal" + description = "Deals some toxin damage, and puts you to sleep after 66 seconds." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.125 * REAGENTS_METABOLISM + toxpwr = 0.5 + +datum/reagent/toxin/sulfonal/on_mob_life(var/mob/living/M as mob) + if(current_cycle >= 66) + M.sleeping += 1.5 + ..() + +datum/reagent/toxin/amanitin + name = "Amanitin" + id = "amanitin" + description = "On the last second that it's in you, it hits you with a stack of toxin damage based on how long it's been in you. The more you use, the longer it takes before anything happens, but the harder it hits when it does." + reagent_state = LIQUID + color = "#CF3600" + toxpwr = 0 + metabolization_rate = 0.5 * REAGENTS_METABOLISM + +datum/reagent/toxin/amanitin/on_mob_delete(var/mob/living/M as mob) + M.adjustToxLoss(current_cycle*3*REM) + ..() + +datum/reagent/toxin/lipolicide + name = "Lipolicide" + id = "lipolicide" + description = "Deals some toxin damage unless they keep eating food. Will reduce nutrition values." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.5 * REAGENTS_METABOLISM + toxpwr = 0.5 + +datum/reagent/toxin/lipolicide/on_mob_life(var/mob/living/M as mob) + if(!holder.has_reagent("nutriment")) + M.adjustToxLoss(0.5*REM) + M.nutrition -= 5 * REAGENTS_METABOLISM + M.overeatduration = 0 + if(M.nutrition < 0)//Prevent from going into negatives. + M.nutrition = 0 + ..() + +datum/reagent/toxin/coniine + name = "Coniine" + id = "coniine" + description = "Does moderate toxin damage and oxygen loss." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.06 * REAGENTS_METABOLISM + toxpwr = 1 + +datum/reagent/toxin/coniine/on_mob_life(var/mob/living/M as mob) + M.losebreath += 3 + ..() + +datum/reagent/toxin/curare + name = "Curare" + id = "curare" + description = "Does some oxygen and toxin damage, weakens you after 33 seconds." + reagent_state = LIQUID + color = "#CF3600" + metabolization_rate = 0.125 * REAGENTS_METABOLISM + toxpwr = 0.5 + +datum/reagent/toxin/curare/on_mob_life(var/mob/living/M as mob) + if(current_cycle >= 33) + M.Weaken(3) + M.adjustOxyLoss(0.5*REM) + ..() + //ACID @@ -361,5 +641,3 @@ datum/reagent/toxin/acid/fluacid toxpwr = 2 acidpwr = 20 -// Undefine the alias for REAGENTS_EFFECT_MULTIPLER -#undef REM \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index c3240ad51ea..7cdb73ae78a 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -19,922 +19,74 @@ /datum/chemical_reaction/proc/on_reaction(var/datum/reagents/holder, var/created_volume) return - //I recommend you set the result amount to the total volume of all components. -/datum/chemical_reaction/explosion_potassium - name = "Explosion" - id = "explosion_potassium" - result = null - required_reagents = list("water" = 1, "potassium" = 1) - result_amount = 2 -/datum/chemical_reaction/explosion_potassium/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/reagents_explosion/e = new() - e.set_up(round (created_volume/10, 1), location, 0, 0) - e.start() - holder.clear_reagents() - return -/datum/chemical_reaction/emp_pulse - name = "EMP Pulse" - id = "emp_pulse" - result = null - required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense - result_amount = 2 - -/datum/chemical_reaction/emp_pulse/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. - // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. - empulse(location, round(created_volume / 24), round(created_volume / 14), 1) - holder.clear_reagents() - return -/* -silicate - name = "Silicate" - id = "silicate" - result = "silicate" - required_reagents = list("aluminium" = 1, "silicon" = 1, "oxygen" = 1) - result_amount = 3 -*/ - -/datum/chemical_reaction/sterilizine - name = "Sterilizine" - id = "sterilizine" - result = "sterilizine" - required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1) - result_amount = 3 - -/datum/chemical_reaction/mutagen - name = "Unstable mutagen" - id = "mutagen" - result = "mutagen" - required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1) - result_amount = 3 - -//cyanide -// name = "Cyanide" -// id = "cyanide" -// result = "cyanide" -// required_reagents = list("hydrogen" = 1, "carbon" = 1, "nitrogen" = 1) -// result_amount = 1 - -/datum/chemical_reaction/thermite - name = "Thermite" - id = "thermite" - result = "thermite" - required_reagents = list("aluminium" = 1, "iron" = 1, "oxygen" = 1) - result_amount = 3 - -/datum/chemical_reaction/lexorin - name = "Lexorin" - id = "lexorin" - result = "lexorin" - required_reagents = list("plasma" = 1, "hydrogen" = 1, "nitrogen" = 1) - result_amount = 3 - -/datum/chemical_reaction/space_drugs - name = "Space Drugs" - id = "space_drugs" - result = "space_drugs" - required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1) - result_amount = 3 - -/datum/chemical_reaction/lube - name = "Space Lube" - id = "lube" - result = "lube" - required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1) - result_amount = 4 - -/datum/chemical_reaction/synaptizine - name = "Synaptizine" - id = "synaptizine" - result = "synaptizine" - required_reagents = list("sugar" = 1, "lithium" = 1, "water" = 1) - result_amount = 3 - -/datum/chemical_reaction/impedrezene - name = "Impedrezene" - id = "impedrezene" - result = "impedrezene" - required_reagents = list("mercury" = 1, "oxygen" = 1, "sugar" = 1) - result_amount = 2 - -/datum/chemical_reaction/leporazine - name = "Leporazine" - id = "leporazine" - result = "leporazine" - required_reagents = list("silicon" = 1, "copper" = 1) - required_catalysts = list("plasma" = 5) - result_amount = 2 - -/datum/chemical_reaction/cryptobiolin - name = "Cryptobiolin" - id = "cryptobiolin" - result = "cryptobiolin" - required_reagents = list("potassium" = 1, "oxygen" = 1, "sugar" = 1) - result_amount = 3 - -/datum/chemical_reaction/spaceacillin - name = "Spaceacillin" - id = "spaceacillin" - result = "spaceacillin" - required_reagents = list("cryptobiolin" = 1, "epinephrine" = 1) - result_amount = 2 - -/datum/chemical_reaction/inacusiate - name = "inacusiate" - id = "inacusiate" - result = "inacusiate" - required_reagents = list("water" = 1, "carbon" = 1, "charcoal" = 1) - result_amount = 2 - -/datum/chemical_reaction/glycerol - name = "Glycerol" - id = "glycerol" - result = "glycerol" - required_reagents = list("cornoil" = 3, "sacid" = 1) - result_amount = 1 - -/datum/chemical_reaction/nitroglycerin - name = "Nitroglycerin" - id = "nitroglycerin" - result = "nitroglycerin" - required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1) - result_amount = 2 -/datum/chemical_reaction/nitroglycerin/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/reagents_explosion/e = new() - e.set_up(round (created_volume/2, 1), location, 0, 0) - e.start() - - holder.clear_reagents() - return - -/datum/chemical_reaction/sodiumchloride - name = "Sodium Chloride" - id = "sodiumchloride" - result = "sodiumchloride" - required_reagents = list("water" = 1, "sodium" = 1, "chlorine" = 1) - result_amount = 3 - -/datum/chemical_reaction/chloralhydrate - name = "Chloral Hydrate" - id = "chloralhydrate" - result = "chloralhydrate" - required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1) - result_amount = 1 - -/datum/chemical_reaction/mutetoxin //i'll just fit this in here snugly between other unfun chemicals :v - name = "Mute toxin" - id = "mutetoxin" - result = "mutetoxin" - required_reagents = list("uranium" = 2, "water" = 1, "carbon" = 1) - result_amount = 2 - -/datum/chemical_reaction/zombiepowder - name = "Zombie Powder" - id = "zombiepowder" - result = "zombiepowder" - required_reagents = list("carpotoxin" = 5, "morphine" = 5, "copper" = 5) - result_amount = 2 - -/datum/chemical_reaction/rezadone - name = "Rezadone" - id = "rezadone" - result = "rezadone" - required_reagents = list("carpotoxin" = 1, "cryptobiolin" = 1, "copper" = 1) - result_amount = 3 - -/datum/chemical_reaction/mindbreaker - name = "Mindbreaker Toxin" - id = "mindbreaker" - result = "mindbreaker" - required_reagents = list("silicon" = 1, "hydrogen" = 1, "charcoal" = 1) - result_amount = 5 - -/datum/chemical_reaction/plasmasolidification - name = "Solid Plasma" - id = "solidplasma" - result = null - required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20) - result_amount = 1 - mob_react = 1 - -/datum/chemical_reaction/plasmasolidification/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - new /obj/item/stack/sheet/mineral/plasma(location) - return - -/datum/chemical_reaction/capsaicincondensation - name = "Capsaicincondensation" - id = "capsaicincondensation" - result = "condensedcapsaicin" - required_reagents = list("capsaicin" = 1, "ethanol" = 5) - result_amount = 5 - -/datum/chemical_reaction/virus_food - name = "Virus Food" - id = "virusfood" - result = "virusfood" - required_reagents = list("water" = 5, "milk" = 5) - result_amount = 15 - -/datum/chemical_reaction/mix_virus - name = "Mix Virus" - id = "mixvirus" - result = "blood" - required_reagents = list("virusfood" = 1) - required_catalysts = list("blood" = 1) - var/level_min = 0 - var/level_max = 2 - -/datum/chemical_reaction/mix_virus/on_reaction(var/datum/reagents/holder, var/created_volume) - - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - if(B && B.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] - if(D) - D.Evolve(level_min, level_max) - - -/datum/chemical_reaction/mix_virus/mix_virus_2 - - name = "Mix Virus 2" - id = "mixvirus2" - required_reagents = list("mutagen" = 1) - level_min = 2 - level_max = 4 - -/datum/chemical_reaction/mix_virus/mix_virus_3 - - name = "Mix Virus 3" - id = "mixvirus3" - required_reagents = list("plasma" = 1) - level_min = 4 - level_max = 6 - -/datum/chemical_reaction/mix_virus/rem_virus - - name = "Devolve Virus" - id = "remvirus" - required_reagents = list("synaptizine" = 1) - required_catalysts = list("blood" = 1) - -/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(var/datum/reagents/holder, var/created_volume) - - var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list - if(B && B.data) - var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] - if(D) - D.Devolve() - - - -/////////////////////////////////////////////////////////////////////////////////// - -// foam and foam precursor - -/datum/chemical_reaction/surfactant - name = "Foam surfactant" - id = "foam surfactant" - result = "fluorosurfactant" - required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1) - result_amount = 5 - - -/datum/chemical_reaction/foam - name = "Foam" - id = "foam" - result = null - required_reagents = list("fluorosurfactant" = 1, "water" = 1) - result_amount = 2 - mob_react = 1 - -/datum/chemical_reaction/foam/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - - for(var/mob/M in viewers(5, location)) - M << "The solution spews out foam!" - - var/datum/effect/effect/system/foam_spread/s = new() - s.set_up(created_volume, location, holder) - s.start() - holder.clear_reagents() - return - - -/datum/chemical_reaction/metalfoam - name = "Metal Foam" - id = "metalfoam" - result = null - required_reagents = list("aluminium" = 3, "foaming_agent" = 1, "facid" = 1) - result_amount = 5 - mob_react = 1 - -/datum/chemical_reaction/metalfoam/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - - for(var/mob/M in viewers(5, location)) - M << "The solution spews out a metallic foam!" - - var/datum/effect/effect/system/foam_spread/metal/s = new() - s.set_up(created_volume, location, holder, 1) - s.start() - holder.clear_reagents() - return - - -/datum/chemical_reaction/ironfoam - name = "Iron Foam" - id = "ironlfoam" - result = null - required_reagents = list("iron" = 3, "foaming_agent" = 1, "facid" = 1) - result_amount = 5 - mob_react = 1 - -/datum/chemical_reaction/ironfoam/on_reaction(var/datum/reagents/holder, var/created_volume) - var/location = get_turf(holder.my_atom) - - for(var/mob/M in viewers(5, location)) - M << "The solution spews out a metallic foam!" - - var/datum/effect/effect/system/foam_spread/metal/s = new() - s.set_up(created_volume, location, holder, 2) - s.start() - holder.clear_reagents() - return - - -/datum/chemical_reaction/foaming_agent - name = "Foaming Agent" - id = "foaming_agent" - result = "foaming_agent" - required_reagents = list("lithium" = 1, "hydrogen" = 1) - result_amount = 1 - -// Synthesizing these three chemicals is pretty complex in real life, but fuck it, it's just a game! -/datum/chemical_reaction/ammonia - name = "Ammonia" - id = "ammonia" - result = "ammonia" - required_reagents = list("hydrogen" = 3, "nitrogen" = 1) - result_amount = 3 - -/datum/chemical_reaction/diethylamine - name = "Diethylamine" - id = "diethylamine" - result = "diethylamine" - required_reagents = list ("ammonia" = 1, "ethanol" = 1) - result_amount = 2 - -/datum/chemical_reaction/space_cleaner - name = "Space cleaner" - id = "cleaner" - result = "cleaner" - required_reagents = list("ammonia" = 1, "water" = 1) - result_amount = 2 - -/datum/chemical_reaction/plantbgone - name = "Plant-B-Gone" - id = "plantbgone" - result = "plantbgone" - required_reagents = list("toxin" = 1, "water" = 4) - result_amount = 5 - -datum/chemical_reaction/weedkiller - name = "Weed Killer" - id = "weedkiller" - result = "weedkiller" - required_reagents = list("toxin" = 1, "ammonia" = 4) - result_amount = 5 - -datum/chemical_reaction/pestkiller - name = "Pest Killer" - id = "pestkiller" - result = "pestkiller" - required_reagents = list("toxin" = 1, "ethanol" = 4) - result_amount = 5 - -/////////////////////////////////////////////NEW SLIME CORE REACTIONS///////////////////////////////////////////// - -//Grey -/datum/chemical_reaction/slimespawn - name = "Slime Spawn" - id = "m_spawn" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/grey - required_other = 1 -/datum/chemical_reaction/slimespawn/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1) - var/mob/living/simple_animal/slime/S = new /mob/living/simple_animal/slime - S.loc = get_turf(holder.my_atom) - -/datum/chemical_reaction/slimeinaprov - name = "Slime epinephrine" - id = "m_inaprov" - result = "epinephrine" - required_reagents = list("water" = 5) - result_amount = 3 - required_other = 1 - required_container = /obj/item/slime_extract/grey -/datum/chemical_reaction/slimeinaprov/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - -/datum/chemical_reaction/slimemonkey - name = "Slime Monkey" - id = "m_monkey" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/grey - required_other = 1 -/datum/chemical_reaction/slimemonkey/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/i = 1, i <= 3, i++) - var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube - M.loc = get_turf(holder.my_atom) - -//Green -/datum/chemical_reaction/slimemutate - name = "Mutation Toxin" - id = "mutationtoxin" - result = "mutationtoxin" - required_reagents = list("plasma" = 1) - result_amount = 1 - required_other = 1 - required_container = /obj/item/slime_extract/green -/datum/chemical_reaction/slimemutate/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - -//Mutated Green -/datum/chemical_reaction/slimemutate_unstable - name = "Unstable Mutation Toxin" - id = "unstablemutationtoxin" - result = "unstablemutationtoxin" - required_reagents = list("radium" = 1) - result_amount = 1 - required_other = 1 - required_container = /obj/item/slime_extract/green - mix_message = "The mixture rapidly expands and contracts, its appearance shifting into a sickening green." -/datum/chemical_reaction/slimemutate_unstable/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - -//Metal -/datum/chemical_reaction/slimemetal - name = "Slime Metal" - id = "m_metal" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/metal - required_other = 1 -/datum/chemical_reaction/slimemetal/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal - M.amount = 15 - M.loc = get_turf(holder.my_atom) - var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel - P.amount = 5 - P.loc = get_turf(holder.my_atom) - -//Gold -/datum/chemical_reaction/slimecrit - name = "Slime Crit" - id = "m_tele" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/gold - required_other = 1 -/datum/chemical_reaction/slimecrit/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) - spawn(50) - - chemical_mob_spawn(holder, 5, "Gold Slime") - -/datum/chemical_reaction/slimecritlesser - name = "Slime Crit Lesser" - id = "m_tele3" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/gold - required_other = 1 -/datum/chemical_reaction/slimecritlesser/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) - spawn(50) - - chemical_mob_spawn(holder, 1, "Lesser Gold Slime", "neutral") - -//Silver -/datum/chemical_reaction/slimebork - name = "Slime Bork" - id = "m_tele2" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/silver - required_other = 1 -/datum/chemical_reaction/slimebork/on_reaction(var/datum/reagents/holder) - - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/list/blocked = list(/obj/item/weapon/reagent_containers/food/snacks, - /obj/item/weapon/reagent_containers/food/snacks/store/bread, - /obj/item/weapon/reagent_containers/food/snacks/breadslice, - /obj/item/weapon/reagent_containers/food/snacks/store/cake, - /obj/item/weapon/reagent_containers/food/snacks/cakeslice, - /obj/item/weapon/reagent_containers/food/snacks/store, - /obj/item/weapon/reagent_containers/food/snacks/pie, - /obj/item/weapon/reagent_containers/food/snacks/kebab, - /obj/item/weapon/reagent_containers/food/snacks/pizza, - /obj/item/weapon/reagent_containers/food/snacks/pizzaslice, - /obj/item/weapon/reagent_containers/food/snacks/salad, - /obj/item/weapon/reagent_containers/food/snacks/meat, - /obj/item/weapon/reagent_containers/food/snacks/soup, - /obj/item/weapon/reagent_containers/food/snacks/grown, - /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom - ) - blocked |= typesof(/obj/item/weapon/reagent_containers/food/snacks/customizable) - - var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - blocked - // BORK BORK BORK - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - M.flash_eyes() - - for(var/i = 1, i <= 4 + rand(1,2), i++) - var/chosen = pick(borks) - var/obj/B = new chosen - if(B) - B.loc = get_turf(holder.my_atom) +/datum/chemical_reaction/proc/chemical_mob_spawn(var/datum/reagents/holder, var/amount_to_spawn, var/reaction_name, var/mob_faction = "chemicalsummon") + if(holder && holder.my_atom) + var/blocked = list(/mob/living/simple_animal/hostile, + /mob/living/simple_animal/hostile/pirate, + /mob/living/simple_animal/hostile/pirate/ranged, + /mob/living/simple_animal/hostile/russian, + /mob/living/simple_animal/hostile/russian/ranged, + /mob/living/simple_animal/hostile/syndicate, + /mob/living/simple_animal/hostile/syndicate/melee, + /mob/living/simple_animal/hostile/syndicate/melee/space, + /mob/living/simple_animal/hostile/syndicate/ranged, + /mob/living/simple_animal/hostile/syndicate/ranged/space, + /mob/living/simple_animal/hostile/alien/queen/large, + /mob/living/simple_animal/hostile/retaliate, + /mob/living/simple_animal/hostile/retaliate/clown, + /mob/living/simple_animal/hostile/mushroom, + /mob/living/simple_animal/hostile/asteroid, + /mob/living/simple_animal/hostile/asteroid/basilisk, + /mob/living/simple_animal/hostile/asteroid/goldgrub, + /mob/living/simple_animal/hostile/asteroid/goliath, + /mob/living/simple_animal/hostile/asteroid/hivelord, + /mob/living/simple_animal/hostile/asteroid/hivelordbrood, + /mob/living/simple_animal/hostile/carp/holocarp, + /mob/living/simple_animal/hostile/mining_drone, + /mob/living/simple_animal/hostile/poison, + /mob/living/simple_animal/hostile/blob, + /mob/living/simple_animal/ascendant_shadowling + )//exclusion list for things you don't want the reaction to create. + var/list/critters = typesof(/mob/living/simple_animal/hostile) - blocked // list of possible hostile mobs + var/atom/A = holder.my_atom + var/turf/T = get_turf(A) + var/area/my_area = get_area(T) + var/message = "A [reaction_name] reaction has occured in [my_area.name]. (JMP)" + message += " (VV)" + + var/mob/M = get(A, /mob) + if(M) + message += " - Carried By: [M.real_name] ([M.key]) (PP) (?)" + else + message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]" + + message_admins(message, 0, 1) + + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/human/H in viewers(get_turf(holder.my_atom), null)) + H.flash_eyes() + for(var/i = 1, i <= amount_to_spawn, i++) + var/chosen = pick(critters) + var/mob/living/simple_animal/hostile/C = new chosen + C.faction |= mob_faction + C.loc = get_turf(holder.my_atom) if(prob(50)) for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH,SOUTH,EAST,WEST)) - - -/datum/chemical_reaction/slimebork2 - name = "Slime Bork 2" - id = "m_tele4" - result = null - required_reagents = list("water" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/silver - required_other = 1 -/datum/chemical_reaction/slimebork2/on_reaction(var/datum/reagents/holder) - - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - - var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/drinks) - /obj/item/weapon/reagent_containers/food/drinks - // BORK BORK BORK - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - - for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) - M.flash_eyes() - - for(var/i = 1, i <= 4 + rand(1,2), i++) - var/chosen = pick(borks) - var/obj/B = new chosen - if(B) - B.loc = get_turf(holder.my_atom) - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(B, pick(NORTH,SOUTH,EAST,WEST)) - - -//Blue -/datum/chemical_reaction/slimefrost - name = "Slime Frost Oil" - id = "m_frostoil" - result = "frostoil" - required_reagents = list("plasma" = 1) - result_amount = 10 - required_container = /obj/item/slime_extract/blue - required_other = 1 -/datum/chemical_reaction/slimefrost/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - -//Dark Blue -/datum/chemical_reaction/slimefreeze - name = "Slime Freeze" - id = "m_freeze" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/darkblue - required_other = 1 -/datum/chemical_reaction/slimefreeze/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) - spawn(50) - if(holder && holder.my_atom) - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) - for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) - M.bodytemperature -= 240 - M << "You feel a chill!" - -//Orange -/datum/chemical_reaction/slimecasp - name = "Slime Capsaicin Oil" - id = "m_capsaicinoil" - result = "capsaicin" - required_reagents = list("blood" = 1) - result_amount = 10 - required_container = /obj/item/slime_extract/orange - required_other = 1 -/datum/chemical_reaction/slimecasp/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - -/datum/chemical_reaction/slimefire - name = "Slime fire" - id = "m_fire" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/orange - required_other = 1 -/datum/chemical_reaction/slimefire/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) - spawn(50) - if(holder && holder.my_atom) - var/turf/simulated/T = get_turf(holder.my_atom) - if(istype(T)) - T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50) - -//Yellow - -/datum/chemical_reaction/slimeoverload - name = "Slime EMP" - id = "m_emp" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 -/datum/chemical_reaction/slimeoverload/on_reaction(var/datum/reagents/holder, var/created_volume) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - empulse(get_turf(holder.my_atom), 3, 7) - - -/datum/chemical_reaction/slimecell - name = "Slime Powercell" - id = "m_cell" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 -/datum/chemical_reaction/slimecell/on_reaction(var/datum/reagents/holder, var/created_volume) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/weapon/stock_parts/cell/high/slime/P = new /obj/item/weapon/stock_parts/cell/high/slime - P.loc = get_turf(holder.my_atom) - -/datum/chemical_reaction/slimeglow - name = "Slime Glow" - id = "m_glow" - result = null - required_reagents = list("water" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/yellow - required_other = 1 -/datum/chemical_reaction/slimeglow/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly."), 1) - var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime - F.loc = get_turf(holder.my_atom) - -//Purple - -/datum/chemical_reaction/slimepsteroid - name = "Slime Steroid" - id = "m_steroid" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/purple - required_other = 1 -/datum/chemical_reaction/slimepsteroid/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/weapon/slimesteroid/P = new /obj/item/weapon/slimesteroid - P.loc = get_turf(holder.my_atom) - -/datum/chemical_reaction/slimejam - name = "Slime Jam" - id = "m_jam" - result = "slimejelly" - required_reagents = list("sugar" = 1) - result_amount = 10 - required_container = /obj/item/slime_extract/purple - required_other = 1 -/datum/chemical_reaction/slimejam/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - - -//Dark Purple -/datum/chemical_reaction/slimeplasma - name = "Slime Plasma" - id = "m_plasma" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/darkpurple - required_other = 1 -/datum/chemical_reaction/slimeplasma/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma - P.amount = 10 - P.loc = get_turf(holder.my_atom) - -//Red -/datum/chemical_reaction/slimeglycerol - name = "Slime Glycerol" - id = "m_glycerol" - result = "glycerol" - required_reagents = list("plasma" = 1) - result_amount = 8 - required_container = /obj/item/slime_extract/red - required_other = 1 -/datum/chemical_reaction/slimeglycerol/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - - -/datum/chemical_reaction/slimebloodlust - name = "Bloodlust" - id = "m_bloodlust" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/red - required_other = 1 -/datum/chemical_reaction/slimebloodlust/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) - slime.rabid = 1 - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The [slime] is driven into a frenzy!"), 1) - -//Pink -/datum/chemical_reaction/slimeppotion - name = "Slime Potion" - id = "m_potion" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/pink - required_other = 1 -/datum/chemical_reaction/slimeppotion/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/slimepotion/P = new /obj/item/slimepotion - P.loc = get_turf(holder.my_atom) - - -//Black -/datum/chemical_reaction/slimemutate2 - name = "Advanced Mutation Toxin" - id = "mutationtoxin2" - result = "amutationtoxin" - required_reagents = list("plasma" = 1) - result_amount = 1 - required_other = 1 - required_container = /obj/item/slime_extract/black -/datum/chemical_reaction/slimemutate2/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - -//Oil -/datum/chemical_reaction/slimeexplosion - name = "Slime Explosion" - id = "m_explosion" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/oil - required_other = 1 -/datum/chemical_reaction/slimeexplosion/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - for(var/mob/O in viewers(get_turf(holder.my_atom), null)) - O.show_message(text("The slime extract begins to vibrate violently !"), 1) - spawn(50) - if(holder && holder.my_atom) - explosion(get_turf(holder.my_atom), 1 ,3, 6) -//Light Pink -/datum/chemical_reaction/slimepotion2 - name = "Slime Potion 2" - id = "m_potion2" - result = null - result_amount = 1 - required_container = /obj/item/slime_extract/lightpink - required_reagents = list("plasma" = 1) - required_other = 1 -/datum/chemical_reaction/slimepotion2/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/slimepotion2/P = new /obj/item/slimepotion2 - P.loc = get_turf(holder.my_atom) -//Adamantine -/datum/chemical_reaction/slimegolem - name = "Slime Golem" - id = "m_golem" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/adamantine - required_other = 1 -/datum/chemical_reaction/slimegolem/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/effect/golemrune/Z = new /obj/effect/golemrune - Z.loc = get_turf(holder.my_atom) - notify_ghosts("Golem rune created in [get_area(Z)].", 'sound/effects/ghost2.ogg') - -//Bluespace - -/datum/chemical_reaction/slimecrystal - name = "Slime Crystal" - id = "m_crystal" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/bluespace - required_other = 1 -/datum/chemical_reaction/slimecrystal/on_reaction(var/datum/reagents/holder, var/created_volume) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - if(holder.my_atom) - var/obj/item/bluespace_crystal/BC = new(get_turf(holder.my_atom)) - BC.visible_message("The [BC.name] appears out of thin air!") - -//Cerulean - -/datum/chemical_reaction/slimepsteroid2 - name = "Slime Steroid 2" - id = "m_steroid2" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/cerulean - required_other = 1 -/datum/chemical_reaction/slimepsteroid2/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/weapon/slimesteroid2/P = new /obj/item/weapon/slimesteroid2 - P.loc = get_turf(holder.my_atom) - -//Sepia -/datum/chemical_reaction/slimecamera - name = "Slime Camera" - id = "m_camera" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/sepia - required_other = 1 -/datum/chemical_reaction/slimecamera/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/device/camera/P = new /obj/item/device/camera - P.loc = get_turf(holder.my_atom) - -/datum/chemical_reaction/slimefilm - name = "Slime Film" - id = "m_film" - result = null - required_reagents = list("blood" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/sepia - required_other = 1 -/datum/chemical_reaction/slimefilm/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/obj/item/device/camera_film/P = new /obj/item/device/camera_film - P.loc = get_turf(holder.my_atom) - - -//Pyrite - -/datum/chemical_reaction/slimepaint - name = "Slime Paint" - id = "s_paint" - result = null - required_reagents = list("plasma" = 1) - result_amount = 1 - required_container = /obj/item/slime_extract/pyrite - required_other = 1 -/datum/chemical_reaction/slimepaint/on_reaction(var/datum/reagents/holder) - feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") - var/list/paints = typesof(/obj/item/weapon/paint) - /obj/item/weapon/paint - var/chosen = pick(paints) - var/obj/P = new chosen - if(P) - P.loc = get_turf(holder.my_atom) + step(C, pick(NORTH,SOUTH,EAST,WEST)) +/datum/chemical_reaction/proc/goonchem_vortex(var/turf/simulated/T, var/setting_type, var/range, var/pull_times) + for(var/atom/movable/X in orange(range, T)) + if(istype(X, /obj/effect)) + continue //stop pulling smoke and hotspots please + if(istype(X, /atom/movable)) + if((X) && !X.anchored) + if(setting_type) + for(var/i = 0, i < pull_times, i++) + step_away(X,T) + else + for(var/i = 0, i < pull_times, i++) + step_towards(X,T) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Recipes/Drugs.dm b/code/modules/reagents/Chemistry-Recipes/Drugs.dm new file mode 100644 index 00000000000..6916187a7eb --- /dev/null +++ b/code/modules/reagents/Chemistry-Recipes/Drugs.dm @@ -0,0 +1,48 @@ +/datum/chemical_reaction/space_drugs + name = "Space Drugs" + id = "space_drugs" + result = "space_drugs" + required_reagents = list("mercury" = 1, "sugar" = 1, "lithium" = 1) + result_amount = 3 + +/datum/chemical_reaction/crank + name = "Crank" + id = "crank" + result = "crank" + required_reagents = list("diphenhydramine" = 1, "ammonia" = 1, "lithium" = 1, "sacid" = 1, "fuel" = 1) + result_amount = 5 + mix_message = "The mixture violently reacts, leaving behind a few crystalline shards." + required_temp = 390 + + +/datum/chemical_reaction/krokodil + name = "Krokodil" + id = "krokodil" + result = "krokodil" + required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "fuel" = 1) + result_amount = 6 + mix_message = "The mixture dries into a pale blue powder." + required_temp = 380 + +/datum/chemical_reaction/methamphetamine + name = "methamphetamine" + id = "methamphetamine" + result = "methamphetamine" + required_reagents = list("ephedrine" = 1, "iodine" = 1, "phosphorus" = 1, "hydrogen" = 1) + result_amount = 4 + required_temp = 374 + +/datum/chemical_reaction/bath_salts + name = "bath_salts" + id = "bath_salts" + result = "bath_salts" + required_reagents = list("????" = 1, "saltpetre" = 1, "nutriment" = 1, "cleaner" = 1, "enzyme" = 1, "tea" = 1, "mercury" = 1) + result_amount = 7 + required_temp = 374 + +/datum/chemical_reaction/aranesp + name = "aranesp" + id = "aranesp" + result = "aranesp" + required_reagents = list("epinephrine" = 1, "atropine" = 1, "morphine" = 1) + result_amount = 3 diff --git a/code/modules/reagents/Chemistry-Recipes/Medicine.dm b/code/modules/reagents/Chemistry-Recipes/Medicine.dm new file mode 100644 index 00000000000..04e739fa5e4 --- /dev/null +++ b/code/modules/reagents/Chemistry-Recipes/Medicine.dm @@ -0,0 +1,197 @@ + +/datum/chemical_reaction/leporazine + name = "Leporazine" + id = "leporazine" + result = "leporazine" + required_reagents = list("silicon" = 1, "copper" = 1) + required_catalysts = list("plasma" = 5) + result_amount = 2 + +/datum/chemical_reaction/rezadone + name = "Rezadone" + id = "rezadone" + result = "rezadone" + required_reagents = list("carpotoxin" = 1, "cryptobiolin" = 1, "copper" = 1) + result_amount = 3 + +/datum/chemical_reaction/spaceacillin + name = "Spaceacillin" + id = "spaceacillin" + result = "spaceacillin" + required_reagents = list("cryptobiolin" = 1, "epinephrine" = 1) + result_amount = 2 + +/datum/chemical_reaction/inacusiate + name = "inacusiate" + id = "inacusiate" + result = "inacusiate" + required_reagents = list("water" = 1, "carbon" = 1, "charcoal" = 1) + result_amount = 2 + +/datum/chemical_reaction/synaptizine + name = "Synaptizine" + id = "synaptizine" + result = "synaptizine" + required_reagents = list("sugar" = 1, "lithium" = 1, "water" = 1) + result_amount = 3 + +/datum/chemical_reaction/charcoal + name = "Charcoal" + id = "charcoal" + result = "charcoal" + required_reagents = list("ash" = 1, "sodiumchloride" = 1) + result_amount = 2 + mix_message = "The mixture yields a fine black powder." + required_temp = 380 + +/datum/chemical_reaction/silver_sulfadiazine + name = "Silver Sulfadiazine" + id = "silver_sulfadiazine" + result = "silver_sulfadiazine" + required_reagents = list("ammonia" = 1, "silver" = 1, "sulfur" = 1, "oxygen" = 1, "chlorine" = 1) + result_amount = 5 + +/datum/chemical_reaction/salglu_solution + name = "Saline-Glucose Solution" + id = "salglu_solution" + result = "salglu_solution" + required_reagents = list("sodiumchloride" = 1, "water" = 1, "sugar" = 1) + result_amount = 3 + +/datum/chemical_reaction/synthflesh + name = "Synthflesh" + id = "synthflesh" + result = "synthflesh" + required_reagents = list("blood" = 1, "carbon" = 1, "styptic_powder" = 1) + result_amount = 3 + +/datum/chemical_reaction/styptic_powder + name = "Styptic Powder" + id = "styptic_powder" + result = "styptic_powder" + required_reagents = list("aluminium" = 1, "hydrogen" = 1, "oxygen" = 1, "sacid" = 1) + result_amount = 4 + mix_message = "The solution yields an astringent powder." + +/datum/chemical_reaction/calomel + name = "Calomel" + id = "calomel" + result = "calomel" + required_reagents = list("mercury" = 1, "chlorine" = 1) + result_amount = 2 + required_temp = 374 + +/datum/chemical_reaction/potass_iodide + name = "Potassium Iodide" + id = "potass_iodide" + result = "potass_iodide" + required_reagents = list("potassium" = 1, "iodine" = 1) + result_amount = 2 + +/datum/chemical_reaction/pen_acid + name = "Pentetic Acid" + id = "pen_acid" + result = "pen_acid" + required_reagents = list("fuel" = 1, "chlorine" = 1, "ammonia" = 1, "formaldehyde" = 1, "sodium" = 1, "cyanide" = 1) + result_amount = 6 + +/datum/chemical_reaction/sal_acid + name = "Salicyclic Acid" + id = "sal_acid" + result = "sal_acid" + required_reagents = list("sodium" = 1, "phenol" = 1, "carbon" = 1, "oxygen" = 1, "sacid" = 1) + result_amount = 5 + + +/datum/chemical_reaction/salbutamol + name = "Salbutamol" + id = "salbutamol" + result = "salbutamol" + required_reagents = list("sal_acid" = 1, "lithium" = 1, "aluminium" = 1, "bromine" = 1, "ammonia" = 1) + result_amount = 5 + +/datum/chemical_reaction/perfluorodecalin + name = "Perfluorodecalin" + id = "perfluorodecalin" + result = "perfluorodecalin" + required_reagents = list("hydrogen" = 1, "fluorine" = 1, "oil" = 1) + result_amount = 3 + required_temp = 370 + mix_message = "The mixture rapidly turns into a dense pink liquid." + +/datum/chemical_reaction/ephedrine + name = "Ephedrine" + id = "ephedrine" + result = "ephedrine" + required_reagents = list("sugar" = 1, "oil" = 1, "hydrogen" = 1, "diethylamine" = 1) + result_amount = 4 + mix_message = "The solution fizzes and gives off toxic fumes." + +/datum/chemical_reaction/diphenhydramine + name = "Diphenhydramine" + id = "diphenhydramine" + result = "diphenhydramine" + required_reagents = list("oil" = 1, "carbon" = 1, "bromine" = 1, "diethylamine" = 1, "ethanol" = 1) + result_amount = 4 + mix_message = "The mixture dries into a pale blue powder." + +/datum/chemical_reaction/oculine + name = "Oculine" + id = "oculine" + result = "oculine" + required_reagents = list("charcoal" = 1, "carbon" = 1, "hydrogen" = 1) + result_amount = 3 + mix_message = "The mixture sputters loudly and becomes a pale pink color." + +/datum/chemical_reaction/atropine + name = "Atropine" + id = "atropine" + result = "atropine" + required_reagents = list("ethanol" = 1, "acetone" = 1, "diethylamine" = 1, "phenol" = 1, "sacid" = 1) + result_amount = 5 + +/datum/chemical_reaction/epinephrine + name = "Epinephrine" + id = "epinephrine" + result = "epinephrine" + required_reagents = list("phenol" = 1, "acetone" = 1, "diethylamine" = 1, "oxygen" = 1, "chlorine" = 1, "hydrogen" = 1) + result_amount = 6 + +/datum/chemical_reaction/strange_reagent + name = "Strange Reagent" + id = "strange_reagent" + result = "strange_reagent" + required_reagents = list("omnizine" = 1, "holywater" = 1, "mutagen" = 1) + result_amount = 3 + +/datum/chemical_reaction/mannitol + name = "Mannitol" + id = "mannitol" + result = "mannitol" + required_reagents = list("sugar" = 1, "hydrogen" = 1, "water" = 1) + result_amount = 3 + mix_message = "The solution slightly bubbles, becoming thicker." + +/datum/chemical_reaction/mutadone + name = "Mutadone" + id = "mutadone" + result = "mutadone" + required_reagents = list("mutagen" = 1, "acetone" = 1, "bromine" = 1) + result_amount = 3 + +/datum/chemical_reaction/antihol + name = "antihol" + id = "antihol" + result = "antihol" + required_reagents = list("ethanol" = 1, "charcoal" = 1) + result_amount = 2 + +/datum/chemical_reaction/cryoxadone + name = "Cryoxadone" + id = "cryoxadone" + result = "cryoxadone" + required_reagents = list("stable_plasma" = 1, "acetone" = 1, "mutagen" = 1) + result_amount = 3 + + + diff --git a/code/modules/reagents/Chemistry-Recipes/Others.dm b/code/modules/reagents/Chemistry-Recipes/Others.dm new file mode 100644 index 00000000000..8a44606fcbc --- /dev/null +++ b/code/modules/reagents/Chemistry-Recipes/Others.dm @@ -0,0 +1,342 @@ + +/datum/chemical_reaction/sterilizine + name = "Sterilizine" + id = "sterilizine" + result = "sterilizine" + required_reagents = list("ethanol" = 1, "charcoal" = 1, "chlorine" = 1) + result_amount = 3 + +/datum/chemical_reaction/lube + name = "Space Lube" + id = "lube" + result = "lube" + required_reagents = list("water" = 1, "silicon" = 1, "oxygen" = 1) + result_amount = 4 + +/datum/chemical_reaction/impedrezene + name = "Impedrezene" + id = "impedrezene" + result = "impedrezene" + required_reagents = list("mercury" = 1, "oxygen" = 1, "sugar" = 1) + result_amount = 2 + +/datum/chemical_reaction/cryptobiolin + name = "Cryptobiolin" + id = "cryptobiolin" + result = "cryptobiolin" + required_reagents = list("potassium" = 1, "oxygen" = 1, "sugar" = 1) + result_amount = 3 + +/datum/chemical_reaction/glycerol + name = "Glycerol" + id = "glycerol" + result = "glycerol" + required_reagents = list("cornoil" = 3, "sacid" = 1) + result_amount = 1 + +/datum/chemical_reaction/sodiumchloride + name = "Sodium Chloride" + id = "sodiumchloride" + result = "sodiumchloride" + required_reagents = list("water" = 1, "sodium" = 1, "chlorine" = 1) + result_amount = 3 + +/datum/chemical_reaction/plasmasolidification + name = "Solid Plasma" + id = "solidplasma" + result = null + required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20) + result_amount = 1 + mob_react = 1 + +/datum/chemical_reaction/plasmasolidification/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + new /obj/item/stack/sheet/mineral/plasma(location) + return + +/datum/chemical_reaction/capsaicincondensation + name = "Capsaicincondensation" + id = "capsaicincondensation" + result = "condensedcapsaicin" + required_reagents = list("capsaicin" = 1, "ethanol" = 5) + result_amount = 5 + + +////////////////////////////////// VIROLOGY ////////////////////////////////////////// + +/datum/chemical_reaction/virus_food + name = "Virus Food" + id = "virusfood" + result = "virusfood" + required_reagents = list("water" = 5, "milk" = 5) + result_amount = 15 + +/datum/chemical_reaction/mix_virus + name = "Mix Virus" + id = "mixvirus" + result = "blood" + required_reagents = list("virusfood" = 1) + required_catalysts = list("blood" = 1) + var/level_min = 0 + var/level_max = 2 + +/datum/chemical_reaction/mix_virus/on_reaction(var/datum/reagents/holder, var/created_volume) + + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + if(B && B.data) + var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + if(D) + D.Evolve(level_min, level_max) + + +/datum/chemical_reaction/mix_virus/mix_virus_2 + + name = "Mix Virus 2" + id = "mixvirus2" + required_reagents = list("mutagen" = 1) + level_min = 2 + level_max = 4 + +/datum/chemical_reaction/mix_virus/mix_virus_3 + + name = "Mix Virus 3" + id = "mixvirus3" + required_reagents = list("plasma" = 1) + level_min = 4 + level_max = 6 + +/datum/chemical_reaction/mix_virus/rem_virus + + name = "Devolve Virus" + id = "remvirus" + required_reagents = list("synaptizine" = 1) + required_catalysts = list("blood" = 1) + +/datum/chemical_reaction/mix_virus/rem_virus/on_reaction(var/datum/reagents/holder, var/created_volume) + + var/datum/reagent/blood/B = locate(/datum/reagent/blood) in holder.reagent_list + if(B && B.data) + var/datum/disease/advance/D = locate(/datum/disease/advance) in B.data["viruses"] + if(D) + D.Devolve() + + + +////////////////////////////////// foam and foam precursor /////////////////////////////////////////////////// + + +/datum/chemical_reaction/surfactant + name = "Foam surfactant" + id = "foam surfactant" + result = "fluorosurfactant" + required_reagents = list("fluorine" = 2, "carbon" = 2, "sacid" = 1) + result_amount = 5 + + +/datum/chemical_reaction/foam + name = "Foam" + id = "foam" + result = null + required_reagents = list("fluorosurfactant" = 1, "water" = 1) + result_amount = 2 + mob_react = 1 + +/datum/chemical_reaction/foam/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + + for(var/mob/M in viewers(5, location)) + M << "The solution spews out foam!" + + var/datum/effect/effect/system/foam_spread/s = new() + s.set_up(created_volume, location, holder) + s.start() + holder.clear_reagents() + return + + +/datum/chemical_reaction/metalfoam + name = "Metal Foam" + id = "metalfoam" + result = null + required_reagents = list("aluminium" = 3, "foaming_agent" = 1, "facid" = 1) + result_amount = 5 + mob_react = 1 + +/datum/chemical_reaction/metalfoam/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + + for(var/mob/M in viewers(5, location)) + M << "The solution spews out a metallic foam!" + + var/datum/effect/effect/system/foam_spread/metal/s = new() + s.set_up(created_volume, location, holder, 1) + s.start() + holder.clear_reagents() + +/datum/chemical_reaction/ironfoam + name = "Iron Foam" + id = "ironlfoam" + result = null + required_reagents = list("iron" = 3, "foaming_agent" = 1, "facid" = 1) + result_amount = 5 + mob_react = 1 + +/datum/chemical_reaction/ironfoam/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + for(var/mob/M in viewers(5, location)) + M << "The solution spews out a metallic foam!" + var/datum/effect/effect/system/foam_spread/metal/s = new() + s.set_up(created_volume, location, holder, 2) + s.start() + holder.clear_reagents() + +/datum/chemical_reaction/foaming_agent + name = "Foaming Agent" + id = "foaming_agent" + result = "foaming_agent" + required_reagents = list("lithium" = 1, "hydrogen" = 1) + result_amount = 1 + + +/////////////////////////////// Cleaning and hydroponics ///////////////////////////////////////////////// + +/datum/chemical_reaction/ammonia + name = "Ammonia" + id = "ammonia" + result = "ammonia" + required_reagents = list("hydrogen" = 3, "nitrogen" = 1) + result_amount = 3 + +/datum/chemical_reaction/diethylamine + name = "Diethylamine" + id = "diethylamine" + result = "diethylamine" + required_reagents = list ("ammonia" = 1, "ethanol" = 1) + result_amount = 2 + +/datum/chemical_reaction/space_cleaner + name = "Space cleaner" + id = "cleaner" + result = "cleaner" + required_reagents = list("ammonia" = 1, "water" = 1) + result_amount = 2 + +/datum/chemical_reaction/plantbgone + name = "Plant-B-Gone" + id = "plantbgone" + result = "plantbgone" + required_reagents = list("toxin" = 1, "water" = 4) + result_amount = 5 + +datum/chemical_reaction/weedkiller + name = "Weed Killer" + id = "weedkiller" + result = "weedkiller" + required_reagents = list("toxin" = 1, "ammonia" = 4) + result_amount = 5 + +datum/chemical_reaction/pestkiller + name = "Pest Killer" + id = "pestkiller" + result = "pestkiller" + required_reagents = list("toxin" = 1, "ethanol" = 4) + result_amount = 5 + + +//////////////////////////////////// Other goon stuff /////////////////////////////////////////// + +/datum/chemical_reaction/acetone + name = "acetone" + id = "acetone" + result = "acetone" + required_reagents = list("oil" = 1, "fuel" = 1, "oxygen" = 1) + result_amount = 3 + +/datum/chemical_reaction/carpet + name = "carpet" + id = "carpet" + result = "carpet" + required_reagents = list("space_drugs" = 1, "blood" = 1) + result_amount = 2 + + +/datum/chemical_reaction/oil + name = "Oil" + id = "oil" + result = "oil" + required_reagents = list("fuel" = 1, "carbon" = 1, "hydrogen" = 1) + result_amount = 3 + +/datum/chemical_reaction/phenol + name = "phenol" + id = "phenol" + result = "phenol" + required_reagents = list("water" = 1, "chlorine" = 1, "oil" = 1) + result_amount = 3 + +/datum/chemical_reaction/ash + name = "Ash" + id = "ash" + result = "ash" + required_reagents = list("oil" = 1) + result_amount = 1 + required_temp = 480 + +/datum/chemical_reaction/colorful_reagent + name = "colorful_reagent" + id = "colorful_reagent" + result = "colorful_reagent" + required_reagents = list("stable_plasma" = 1, "radium" = 1, "space_drugs" = 1, "cryoxadone" = 1, "triple_citrus" = 1) + result_amount = 5 + +/datum/chemical_reaction/life + name = "Life" + id = "life" + result = null + required_reagents = list("strange_reagent" = 1, "synthflesh" = 1, "blood" = 1) + result_amount = 1 + required_temp = 374 + +/datum/chemical_reaction/life/on_reaction(var/datum/reagents/holder, var/created_volume) + chemical_mob_spawn(holder, 1, "Life") + +/datum/chemical_reaction/corgium + name = "corgium" + id = "corgium" + result = null + required_reagents = list("nutriment" = 1, "colorful_reagent" = 1, "strange_reagent" = 1, "blood" = 1) + result_amount = 1 + required_temp = 374 + +/datum/chemical_reaction/corgium/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + new /mob/living/simple_animal/pet/corgi(location) + ..() + +/datum/chemical_reaction/hair_dye + name = "hair_dye" + id = "hair_dye" + result = "hair_dye" + required_reagents = list("colorful_reagent" = 1, "radium" = 1, "space_drugs" = 1) + result_amount = 5 + +/datum/chemical_reaction/barbers_aid + name = "barbers_aid" + id = "barbers_aid" + result = "barbers_aid" + required_reagents = list("carpet" = 1, "radium" = 1, "space_drugs" = 1) + result_amount = 5 + +/datum/chemical_reaction/concentrated_barbers_aid + name = "concentrated_barbers_aid" + id = "concentrated_barbers_aid" + result = "concentrated_barbers_aid" + required_reagents = list("barbers_aid" = 1, "mutagen" = 1) + result_amount = 2 + +/datum/chemical_reaction/saltpetre + name = "saltpetre" + id = "saltpetre" + result = "saltpetre" + required_reagents = list("potassium" = 1, "nitrogen" = 1, "oxygen" = 3) + result_amount = 3 \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm similarity index 57% rename from code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm rename to code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm index 0e3b34e44cb..3f5d1e03f51 100644 --- a/code/modules/reagents/Chemistry-Goon-Pyrotechnics.dm +++ b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm @@ -1,15 +1,54 @@ -#define SOLID 1 -#define LIQUID 2 -#define GAS 3 -#define REM REAGENTS_EFFECT_MULTIPLIER +/datum/chemical_reaction/thermite + name = "Thermite" + id = "thermite" + result = "thermite" + required_reagents = list("aluminium" = 1, "iron" = 1, "oxygen" = 1) + result_amount = 3 + +/datum/chemical_reaction/explosion_nitroglycerin + name = "Nitroglycerin explosion" + id = "explosion_nitroglycerin" + result = null + required_reagents = list("glycerol" = 1, "facid" = 1, "sacid" = 1) + result_amount = 2 + +/datum/chemical_reaction/explosion_nitroglycerin/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/reagents_explosion/e = new() + e.set_up(round(created_volume/2, 1), location, 0, 0) + e.start() + holder.clear_reagents() + +/datum/chemical_reaction/explosion_potassium + name = "Explosion" + id = "explosion_potassium" + result = null + required_reagents = list("water" = 1, "potassium" = 1) + result_amount = 2 + +/datum/chemical_reaction/explosion_potassium/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/reagents_explosion/e = new() + e.set_up(round (created_volume/10, 1), location, 0, 0) + e.start() + holder.clear_reagents() + +/datum/chemical_reaction/emp_pulse + name = "EMP Pulse" + id = "emp_pulse" + result = null + required_reagents = list("uranium" = 1, "iron" = 1) // Yes, laugh, it's the best recipe I could think of that makes a little bit of sense + result_amount = 2 + +/datum/chemical_reaction/emp_pulse/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + // 100 created volume = 4 heavy range & 7 light range. A few tiles smaller than traitor EMP grandes. + // 200 created volume = 8 heavy range & 14 light range. 4 tiles larger than traitor EMP grenades. + empulse(location, round(created_volume / 24), round(created_volume / 14), 1) + holder.clear_reagents() + -/datum/reagent/stabilizing_agent - name = "Stabilizing Agent" - id = "stabilizing_agent" - description = "Keeps unstable chemicals stable. This does not work on everything." - reagent_state = LIQUID - color = "#FFFFFF" /datum/chemical_reaction/stabilizing_agent name = "stabilizing_agent" @@ -18,13 +57,6 @@ required_reagents = list("iron" = 1, "oxygen" = 1, "hydrogen" = 1) result_amount = 3 -/datum/reagent/clf3 - name = "Chlorine Trifluoride" - id = "clf3" - description = "Makes a temporary 3x3 fireball when it comes into existence, so be careful when mixing. ClF3 applied to a surface burns things that wouldn't otherwise burn, sometimes through the very floors of the station and exposing it to the vacuum of space." - reagent_state = LIQUID - color = "#FF0000" - metabolization_rate = 4 /datum/chemical_reaction/clf3 name = "Chlorine Trifluoride" @@ -34,50 +66,11 @@ result_amount = 4 required_temp = 424 -/datum/reagent/clf3/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjust_fire_stacks(4) - M.adjustFireLoss(0.35*M.fire_stacks) - ..() - return - /datum/chemical_reaction/clf3/on_reaction(var/datum/reagents/holder, var/created_volume) var/turf/T = get_turf(holder.my_atom) for(var/turf/turf in range(1,T)) new /obj/effect/hotspot(turf) holder.chem_temp = 1000 // hot as shit - return - -/datum/reagent/clf3/reaction_turf(var/turf/simulated/T, var/volume) - if(istype(T, /turf/simulated/floor/plating)) - var/turf/simulated/floor/plating/F = T - if(prob(1)) - F.ChangeTurf(/turf/space) - if(istype(T, /turf/simulated/floor/)) - var/turf/simulated/floor/F = T - if(prob(volume/10)) - F.make_plating() - if(istype(F, /turf/simulated/floor/)) - new /obj/effect/hotspot(F) - if(istype(T, /turf/simulated/wall/)) - var/turf/simulated/wall/W = T - if(prob(volume/10)) - W.ChangeTurf(/turf/simulated/floor) - return - -/datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(method == TOUCH && isliving(M)) - M.adjust_fire_stacks(5) - M.IgniteMob() - new /obj/effect/hotspot(M.loc) - return - -/datum/reagent/sorium - name = "Sorium" - id = "sorium" - description = "Sends everything flying from the detonation point." - reagent_state = LIQUID - color = "#FFA500" /datum/chemical_reaction/sorium name = "Sorium" @@ -86,6 +79,13 @@ required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1) result_amount = 4 +/datum/chemical_reaction/sorium/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + holder.remove_reagent("sorium", created_volume) + var/turf/simulated/T = get_turf(holder.my_atom) + goonchem_vortex(T, 1, 5, 6) + /datum/chemical_reaction/sorium_vortex name = "sorium_vortex" id = "sorium_vortex" @@ -97,19 +97,6 @@ var/turf/simulated/T = get_turf(holder.my_atom) goonchem_vortex(T, 1, 5, 6) -/datum/chemical_reaction/sorium/on_reaction(var/datum/reagents/holder, var/created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - holder.remove_reagent("sorium", created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 1, 5, 6) - -/datum/reagent/liquid_dark_matter - name = "Liquid Dark Matter" - id = "liquid_dark_matter" - description = "Sucks everything into the detonation point." - reagent_state = LIQUID - color = "#800080" /datum/chemical_reaction/liquid_dark_matter name = "Liquid Dark Matter" @@ -118,6 +105,13 @@ required_reagents = list("stable_plasma" = 1, "radium" = 1, "carbon" = 1) result_amount = 3 +/datum/chemical_reaction/liquid_dark_matter/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + holder.remove_reagent("liquid_dark_matter", created_volume) + var/turf/simulated/T = get_turf(holder.my_atom) + goonchem_vortex(T, 0, 5, 6) + /datum/chemical_reaction/ldm_vortex name = "LDM Vortex" id = "ldm_vortex" @@ -128,35 +122,6 @@ /datum/chemical_reaction/ldm_vortex/on_reaction(var/datum/reagents/holder, var/created_volume) var/turf/simulated/T = get_turf(holder.my_atom) goonchem_vortex(T, 0, 5, 6) - return -/datum/chemical_reaction/liquid_dark_matter/on_reaction(var/datum/reagents/holder, var/created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - holder.remove_reagent("liquid_dark_matter", created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - goonchem_vortex(T, 0, 5, 6) - return - -/proc/goonchem_vortex(var/turf/simulated/T, var/setting_type, var/range, var/pull_times) - for(var/atom/movable/X in orange(range, T)) - if(istype(X, /obj/effect)) - continue //stop pulling smoke and hotspots please - if(istype(X, /atom/movable)) - if((X) && !X.anchored) - if(setting_type) - for(var/i = 0, i < pull_times, i++) - step_away(X,T) - else - for(var/i = 0, i < pull_times, i++) - step_towards(X,T) - -/datum/reagent/blackpowder - name = "Black Powder" - id = "blackpowder" - description = "Explodes. Violently." - reagent_state = LIQUID - color = "#000000" - metabolization_rate = 0.05 /datum/chemical_reaction/blackpowder name = "Black Powder" @@ -176,27 +141,12 @@ /datum/chemical_reaction/blackpowder_explosion/on_reaction(var/datum/reagents/holder, var/created_volume) sleep(rand(50,100)) - blackpowder_detonate(holder, created_volume) - return + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/reagents_explosion/e = new() + e.set_up(round(created_volume/8, 1), location, 1, 4, message = 0) + e.start() + holder.clear_reagents() -/datum/reagent/blackpowder/on_ex_act() - blackpowder_detonate(holder, volume) - return - -/proc/blackpowder_detonate(var/datum/reagents/holder, var/created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - var/ex_severe = round(created_volume / 100) - var/ex_heavy = round(created_volume / 42) - var/ex_light = round(created_volume / 21) - var/ex_flash = round(created_volume / 8) - explosion(T,ex_severe,ex_heavy,ex_light,ex_flash, 1) - return -/datum/reagent/flash_powder - name = "Flash Powder" - id = "flash_powder" - description = "Makes a very bright flash." - reagent_state = LIQUID - color = "#FFFF00" /datum/chemical_reaction/flash_powder name = "Flash powder" @@ -205,6 +155,21 @@ required_reagents = list("aluminium" = 1, "potassium" = 1, "sulfur" = 1 ) result_amount = 3 +/datum/chemical_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, location) + s.start() + for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) + if(C.flash_eyes()) + if(get_dist(C, location) < 4) + C.Weaken(5) + else + C.Stun(5) + holder.remove_reagent("flash_powder", created_volume) + /datum/chemical_reaction/flash_powder_flash name = "Flash powder activation" id = "flash_powder_flash" @@ -218,37 +183,11 @@ s.set_up(2, 1, location) s.start() for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) - if(C.check_eye_prot()) - continue - flick("e_flash", C.flash) - if(get_dist(C, location) < 4) - C.Weaken(5) - continue - C.Stun(5) - -/datum/chemical_reaction/flash_powder/on_reaction(var/datum/reagents/holder, var/created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(2, 1, location) - s.start() - for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) - if(C.check_eye_prot()) - continue - flick("e_flash", C.flash) - if(get_dist(C, location) < 4) - C.Weaken(5) - continue - C.Stun(5) - holder.remove_reagent("flash_powder", created_volume) - -/datum/reagent/smoke_powder - name = "Smoke Powder" - id = "smoke_powder" - description = "Makes a large cloud of smoke that can carry reagents." - reagent_state = LIQUID - color = "#808080" + if(C.flash_eyes()) + if(get_dist(C, location) < 4) + C.Weaken(5) + else + C.Stun(5) /datum/chemical_reaction/smoke_powder name = "smoke_powder" @@ -257,6 +196,23 @@ required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1) result_amount = 3 +/datum/chemical_reaction/smoke_powder/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + holder.remove_reagent("smoke_powder", created_volume) + var/location = get_turf(holder.my_atom) + var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread + S.attach(location) + playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) + spawn(0) + if(S) + S.set_up(holder, 10, 0, location) + S.start() + sleep(10) + S.start() + if(holder && holder.my_atom) + holder.clear_reagents() + return /datum/chemical_reaction/smoke_powder_smoke name = "smoke_powder_smoke" @@ -282,30 +238,6 @@ holder.clear_reagents() return -/datum/chemical_reaction/smoke_powder/on_reaction(var/datum/reagents/holder, var/created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - holder.remove_reagent("smoke_powder", created_volume) - var/location = get_turf(holder.my_atom) - var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread - S.attach(location) - playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - if(S) - S.set_up(holder, 10, 0, location) - S.start() - sleep(10) - S.start() - if(holder && holder.my_atom) - holder.clear_reagents() - return - -/datum/reagent/sonic_powder - name = "Sonic Powder" - id = "sonic_powder" - description = "Makes a deafening noise." - reagent_state = LIQUID - color = "#0000FF" /datum/chemical_reaction/sonic_powder name = "sonic_powder" @@ -314,6 +246,23 @@ required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1) result_amount = 3 +/datum/chemical_reaction/sonic_powder/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + holder.remove_reagent("sonic_powder", created_volume) + var/location = get_turf(holder.my_atom) + playsound(location, 'sound/effects/bang.ogg', 25, 1) + for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) + if(C.check_ear_prot()) + continue + C.show_message("BANG", 2) + C.Stun(5) + C.Weaken(5) + C.setEarDamage(C.ear_damage + rand(0, 5), max(C.ear_deaf,15)) + if(C.ear_damage >= 15) + C << "Your ears start to ring badly!" + else if(C.ear_damage >= 5) + C << "Your ears start to ring!" /datum/chemical_reaction/sonic_powder_deafen name = "sonic_powder_deafen" @@ -326,10 +275,8 @@ var/location = get_turf(holder.my_atom) playsound(location, 'sound/effects/bang.ogg', 25, 1) for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if((H.ears && (H.ears.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) - continue + if(C.check_ear_prot()) + continue C.show_message("BANG", 2) C.Stun(5) C.Weaken(5) @@ -339,32 +286,6 @@ else if(C.ear_damage >= 5) C << "Your ears start to ring!" -/datum/chemical_reaction/sonic_powder/on_reaction(var/datum/reagents/holder, var/created_volume) - if(holder.has_reagent("stabilizing_agent")) - return - holder.remove_reagent("sonic_powder", created_volume) - var/location = get_turf(holder.my_atom) - playsound(location, 'sound/effects/bang.ogg', 25, 1) - for(var/mob/living/carbon/C in get_hearers_in_view(created_volume/10, location)) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if((H.ears && (H.ears.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) - continue - C.show_message("BANG", 2) - C.Stun(5) - C.Weaken(5) - C.setEarDamage(C.ear_damage + rand(0, 5), max(C.ear_deaf,15)) - if(C.ear_damage >= 15) - C << "Your ears start to ring badly!" - else if(C.ear_damage >= 5) - C << "Your ears start to ring!" - -/datum/reagent/phlogiston - name = "Phlogiston" - id = "phlogiston" - description = "Catches you on fire and makes you ignite." - reagent_state = LIQUID - color = "#FF9999" /datum/chemical_reaction/phlogiston name = "phlogiston" @@ -381,31 +302,6 @@ T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, created_volume) return -/datum/reagent/phlogiston/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjust_fire_stacks(1) - M.IgniteMob() - M.adjustFireLoss(0.2*M.fire_stacks) - ..() - return - -/datum/reagent/napalm - name = "Napalm" - id = "napalm" - description = "Very flammable." - reagent_state = LIQUID - color = "#FF9999" - -/datum/reagent/napalm/on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.adjust_fire_stacks(1) - ..() - return - -/datum/reagent/napalm/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume) - if(method == TOUCH && isliving(M)) - M.adjust_fire_stacks(7) - return /datum/chemical_reaction/napalm name = "Napalm" @@ -414,11 +310,6 @@ required_reagents = list("sugar" = 1, "fuel" = 1, "ethanol" = 1 ) result_amount = 3 -datum/reagent/cryostylane - name = "Cryostylane" - id = "cryostylane" - description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Cryostylane slowly cools all other reagents in the mob down to 0K." - color = "#B2B2FF" // rgb: 139, 166, 233 /datum/chemical_reaction/cryostylane name = "cryostylane" @@ -432,33 +323,6 @@ datum/reagent/cryostylane return -datum/reagent/cryostylane/on_mob_life(var/mob/living/M as mob) //TODO: code freezing into an ice cube - if(M.reagents.has_reagent("oxygen")) - M.reagents.remove_reagent("oxygen", 1) - M.bodytemperature -= 30 - ..() - return - -datum/reagent/cryostylane/on_tick() - if(holder.has_reagent("oxygen")) - holder.remove_reagent("oxygen", 1) - holder.chem_temp -= 10 - holder.handle_reactions() - ..() - return - - -datum/reagent/cryostylane/reaction_turf(var/turf/simulated/T, var/volume) - if(volume >= 5) - for(var/mob/living/simple_animal/slime/M in T) - M.adjustToxLoss(rand(15,30)) - -datum/reagent/pyrosium - name = "Pyrosium" - id = "pyrosium" - description = "Comes into existence at 20K. As long as there is sufficient oxygen for it to react with, Pyrosium slowly cools all other reagents in the mob down to 0K." - color = "#B20000" // rgb: 139, 166, 233 - /datum/chemical_reaction/pyrosium name = "pyrosium" id = "pyrosium" @@ -468,19 +332,4 @@ datum/reagent/pyrosium /datum/chemical_reaction/pyrosium/on_reaction(var/datum/reagents/holder, var/created_volume) holder.chem_temp = 20 // also cools the fuck down - return - -datum/reagent/pyrosium/on_mob_life(var/mob/living/M as mob) - if(M.reagents.has_reagent("oxygen")) - M.reagents.remove_reagent("oxygen", 1) - M.bodytemperature += 30 - ..() - return - -datum/reagent/pyrosium/on_tick() - if(holder.has_reagent("oxygen")) - holder.remove_reagent("oxygen", 1) - holder.chem_temp += 10 - holder.handle_reactions() - ..() - return + return \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm new file mode 100644 index 00000000000..732d6c39b48 --- /dev/null +++ b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm @@ -0,0 +1,548 @@ + +//Grey +/datum/chemical_reaction/slimespawn + name = "Slime Spawn" + id = "m_spawn" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/grey + required_other = 1 + +/datum/chemical_reaction/slimespawn/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1) + var/mob/living/simple_animal/slime/S = new /mob/living/simple_animal/slime + S.loc = get_turf(holder.my_atom) + +/datum/chemical_reaction/slimeinaprov + name = "Slime epinephrine" + id = "m_inaprov" + result = "epinephrine" + required_reagents = list("water" = 5) + result_amount = 3 + required_other = 1 + required_container = /obj/item/slime_extract/grey + +/datum/chemical_reaction/slimeinaprov/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + +/datum/chemical_reaction/slimemonkey + name = "Slime Monkey" + id = "m_monkey" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/grey + required_other = 1 + +/datum/chemical_reaction/slimemonkey/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/i = 1, i <= 3, i++) + var /obj/item/weapon/reagent_containers/food/snacks/monkeycube/M = new /obj/item/weapon/reagent_containers/food/snacks/monkeycube + M.loc = get_turf(holder.my_atom) + +//Green +/datum/chemical_reaction/slimemutate + name = "Mutation Toxin" + id = "mutationtoxin" + result = "mutationtoxin" + required_reagents = list("plasma" = 1) + result_amount = 1 + required_other = 1 + required_container = /obj/item/slime_extract/green + +/datum/chemical_reaction/slimemutate/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + +//Mutated Green +/datum/chemical_reaction/slimemutate_unstable + name = "Unstable Mutation Toxin" + id = "unstablemutationtoxin" + result = "unstablemutationtoxin" + required_reagents = list("radium" = 1) + result_amount = 1 + required_other = 1 + required_container = /obj/item/slime_extract/green + mix_message = "The mixture rapidly expands and contracts, its appearance shifting into a sickening green." + +/datum/chemical_reaction/slimemutate_unstable/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + +//Metal +/datum/chemical_reaction/slimemetal + name = "Slime Metal" + id = "m_metal" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/metal + required_other = 1 + +/datum/chemical_reaction/slimemetal/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal + M.amount = 15 + M.loc = get_turf(holder.my_atom) + var/obj/item/stack/sheet/plasteel/P = new /obj/item/stack/sheet/plasteel + P.amount = 5 + P.loc = get_turf(holder.my_atom) + +//Gold +/datum/chemical_reaction/slimecrit + name = "Slime Crit" + id = "m_tele" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/gold + required_other = 1 + +/datum/chemical_reaction/slimecrit/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) + spawn(50) + + chemical_mob_spawn(holder, 5, "Gold Slime") + +/datum/chemical_reaction/slimecritlesser + name = "Slime Crit Lesser" + id = "m_tele3" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/gold + required_other = 1 + +/datum/chemical_reaction/slimecritlesser/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) + spawn(50) + + chemical_mob_spawn(holder, 1, "Lesser Gold Slime", "neutral") + +//Silver +/datum/chemical_reaction/slimebork + name = "Slime Bork" + id = "m_tele2" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/silver + required_other = 1 + +/datum/chemical_reaction/slimebork/on_reaction(var/datum/reagents/holder) + + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/list/blocked = list(/obj/item/weapon/reagent_containers/food/snacks, + /obj/item/weapon/reagent_containers/food/snacks/store/bread, + /obj/item/weapon/reagent_containers/food/snacks/breadslice, + /obj/item/weapon/reagent_containers/food/snacks/store/cake, + /obj/item/weapon/reagent_containers/food/snacks/cakeslice, + /obj/item/weapon/reagent_containers/food/snacks/store, + /obj/item/weapon/reagent_containers/food/snacks/pie, + /obj/item/weapon/reagent_containers/food/snacks/kebab, + /obj/item/weapon/reagent_containers/food/snacks/pizza, + /obj/item/weapon/reagent_containers/food/snacks/pizzaslice, + /obj/item/weapon/reagent_containers/food/snacks/salad, + /obj/item/weapon/reagent_containers/food/snacks/meat, + /obj/item/weapon/reagent_containers/food/snacks/soup, + /obj/item/weapon/reagent_containers/food/snacks/grown, + /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom + ) + blocked |= typesof(/obj/item/weapon/reagent_containers/food/snacks/customizable) + + var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/snacks) - blocked + // BORK BORK BORK + + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) + M.flash_eyes() + + for(var/i = 1, i <= 4 + rand(1,2), i++) + var/chosen = pick(borks) + var/obj/B = new chosen + if(B) + B.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(B, pick(NORTH,SOUTH,EAST,WEST)) + + +/datum/chemical_reaction/slimebork2 + name = "Slime Bork 2" + id = "m_tele4" + result = null + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/silver + required_other = 1 + +/datum/chemical_reaction/slimebork2/on_reaction(var/datum/reagents/holder) + + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + + var/list/borks = typesof(/obj/item/weapon/reagent_containers/food/drinks) - /obj/item/weapon/reagent_containers/food/drinks + // BORK BORK BORK + + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + + for(var/mob/living/carbon/human/M in viewers(get_turf(holder.my_atom), null)) + M.flash_eyes() + + for(var/i = 1, i <= 4 + rand(1,2), i++) + var/chosen = pick(borks) + var/obj/B = new chosen + if(B) + B.loc = get_turf(holder.my_atom) + if(prob(50)) + for(var/j = 1, j <= rand(1, 3), j++) + step(B, pick(NORTH,SOUTH,EAST,WEST)) + + +//Blue +/datum/chemical_reaction/slimefrost + name = "Slime Frost Oil" + id = "m_frostoil" + result = "frostoil" + required_reagents = list("plasma" = 1) + result_amount = 10 + required_container = /obj/item/slime_extract/blue + required_other = 1 + +/datum/chemical_reaction/slimefrost/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + +//Dark Blue +/datum/chemical_reaction/slimefreeze + name = "Slime Freeze" + id = "m_freeze" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/darkblue + required_other = 1 + +/datum/chemical_reaction/slimefreeze/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) + spawn(50) + if(holder && holder.my_atom) + playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, 1) + for(var/mob/living/M in range (get_turf(holder.my_atom), 7)) + M.bodytemperature -= 240 + M << "You feel a chill!" + +//Orange +/datum/chemical_reaction/slimecasp + name = "Slime Capsaicin Oil" + id = "m_capsaicinoil" + result = "capsaicin" + required_reagents = list("blood" = 1) + result_amount = 10 + required_container = /obj/item/slime_extract/orange + required_other = 1 + +/datum/chemical_reaction/slimecasp/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + +/datum/chemical_reaction/slimefire + name = "Slime fire" + id = "m_fire" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/orange + required_other = 1 + +/datum/chemical_reaction/slimefire/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) + spawn(50) + if(holder && holder.my_atom) + var/turf/simulated/T = get_turf(holder.my_atom) + if(istype(T)) + T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, 50) + +//Yellow + +/datum/chemical_reaction/slimeoverload + name = "Slime EMP" + id = "m_emp" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 + +/datum/chemical_reaction/slimeoverload/on_reaction(var/datum/reagents/holder, var/created_volume) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + empulse(get_turf(holder.my_atom), 3, 7) + + +/datum/chemical_reaction/slimecell + name = "Slime Powercell" + id = "m_cell" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 + +/datum/chemical_reaction/slimecell/on_reaction(var/datum/reagents/holder, var/created_volume) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/weapon/stock_parts/cell/high/slime/P = new /obj/item/weapon/stock_parts/cell/high/slime + P.loc = get_turf(holder.my_atom) + +/datum/chemical_reaction/slimeglow + name = "Slime Glow" + id = "m_glow" + result = null + required_reagents = list("water" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/yellow + required_other = 1 + +/datum/chemical_reaction/slimeglow/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly."), 1) + var/obj/item/device/flashlight/slime/F = new /obj/item/device/flashlight/slime + F.loc = get_turf(holder.my_atom) + +//Purple + +/datum/chemical_reaction/slimepsteroid + name = "Slime Steroid" + id = "m_steroid" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/purple + required_other = 1 + +/datum/chemical_reaction/slimepsteroid/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/weapon/slimesteroid/P = new /obj/item/weapon/slimesteroid + P.loc = get_turf(holder.my_atom) + +/datum/chemical_reaction/slimejam + name = "Slime Jam" + id = "m_jam" + result = "slimejelly" + required_reagents = list("sugar" = 1) + result_amount = 10 + required_container = /obj/item/slime_extract/purple + required_other = 1 + +/datum/chemical_reaction/slimejam/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + + +//Dark Purple +/datum/chemical_reaction/slimeplasma + name = "Slime Plasma" + id = "m_plasma" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/darkpurple + required_other = 1 + +/datum/chemical_reaction/slimeplasma/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/stack/sheet/mineral/plasma/P = new /obj/item/stack/sheet/mineral/plasma + P.amount = 10 + P.loc = get_turf(holder.my_atom) + +//Red +/datum/chemical_reaction/slimeglycerol + name = "Slime Glycerol" + id = "m_glycerol" + result = "glycerol" + required_reagents = list("plasma" = 1) + result_amount = 8 + required_container = /obj/item/slime_extract/red + required_other = 1 + +/datum/chemical_reaction/slimeglycerol/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + + +/datum/chemical_reaction/slimebloodlust + name = "Bloodlust" + id = "m_bloodlust" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/red + required_other = 1 + +/datum/chemical_reaction/slimebloodlust/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) + slime.rabid = 1 + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The [slime] is driven into a frenzy!"), 1) + +//Pink +/datum/chemical_reaction/slimeppotion + name = "Slime Potion" + id = "m_potion" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/pink + required_other = 1 + +/datum/chemical_reaction/slimeppotion/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/slimepotion/P = new /obj/item/slimepotion + P.loc = get_turf(holder.my_atom) + + +//Black +/datum/chemical_reaction/slimemutate2 + name = "Advanced Mutation Toxin" + id = "mutationtoxin2" + result = "amutationtoxin" + required_reagents = list("plasma" = 1) + result_amount = 1 + required_other = 1 + required_container = /obj/item/slime_extract/black + +/datum/chemical_reaction/slimemutate2/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + +//Oil +/datum/chemical_reaction/slimeexplosion + name = "Slime Explosion" + id = "m_explosion" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/oil + required_other = 1 + +/datum/chemical_reaction/slimeexplosion/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + for(var/mob/O in viewers(get_turf(holder.my_atom), null)) + O.show_message(text("The slime extract begins to vibrate violently !"), 1) + spawn(50) + if(holder && holder.my_atom) + explosion(get_turf(holder.my_atom), 1 ,3, 6) + +//Light Pink +/datum/chemical_reaction/slimepotion2 + name = "Slime Potion 2" + id = "m_potion2" + result = null + result_amount = 1 + required_container = /obj/item/slime_extract/lightpink + required_reagents = list("plasma" = 1) + required_other = 1 + +/datum/chemical_reaction/slimepotion2/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/slimepotion2/P = new /obj/item/slimepotion2 + P.loc = get_turf(holder.my_atom) + +//Adamantine +/datum/chemical_reaction/slimegolem + name = "Slime Golem" + id = "m_golem" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/adamantine + required_other = 1 + +/datum/chemical_reaction/slimegolem/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/effect/golemrune/Z = new /obj/effect/golemrune + Z.loc = get_turf(holder.my_atom) + notify_ghosts("Golem rune created in [get_area(Z)].", 'sound/effects/ghost2.ogg') + +//Bluespace +/datum/chemical_reaction/slimecrystal + name = "Slime Crystal" + id = "m_crystal" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/bluespace + required_other = 1 + +/datum/chemical_reaction/slimecrystal/on_reaction(var/datum/reagents/holder, var/created_volume) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + if(holder.my_atom) + var/obj/item/bluespace_crystal/BC = new(get_turf(holder.my_atom)) + BC.visible_message("The [BC.name] appears out of thin air!") + +//Cerulean +/datum/chemical_reaction/slimepsteroid2 + name = "Slime Steroid 2" + id = "m_steroid2" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/cerulean + required_other = 1 + +/datum/chemical_reaction/slimepsteroid2/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/weapon/slimesteroid2/P = new /obj/item/weapon/slimesteroid2 + P.loc = get_turf(holder.my_atom) + +//Sepia +/datum/chemical_reaction/slimecamera + name = "Slime Camera" + id = "m_camera" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/sepia + required_other = 1 + +/datum/chemical_reaction/slimecamera/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/device/camera/P = new /obj/item/device/camera + P.loc = get_turf(holder.my_atom) + +/datum/chemical_reaction/slimefilm + name = "Slime Film" + id = "m_film" + result = null + required_reagents = list("blood" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/sepia + required_other = 1 + +/datum/chemical_reaction/slimefilm/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/obj/item/device/camera_film/P = new /obj/item/device/camera_film + P.loc = get_turf(holder.my_atom) + +//Pyrite +/datum/chemical_reaction/slimepaint + name = "Slime Paint" + id = "s_paint" + result = null + required_reagents = list("plasma" = 1) + result_amount = 1 + required_container = /obj/item/slime_extract/pyrite + required_other = 1 + +/datum/chemical_reaction/slimepaint/on_reaction(var/datum/reagents/holder) + feedback_add_details("slime_cores_used","[replacetext(name," ","_")]") + var/list/paints = typesof(/obj/item/weapon/paint) - /obj/item/weapon/paint + var/chosen = pick(paints) + var/obj/P = new chosen + if(P) + P.loc = get_turf(holder.my_atom) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Recipes/Toxins.dm b/code/modules/reagents/Chemistry-Recipes/Toxins.dm new file mode 100644 index 00000000000..95f2a28507a --- /dev/null +++ b/code/modules/reagents/Chemistry-Recipes/Toxins.dm @@ -0,0 +1,95 @@ + +/datum/chemical_reaction/formaldehyde + name = "formaldehyde" + id = "Formaldehyde" + result = "formaldehyde" + required_reagents = list("ethanol" = 1, "oxygen" = 1, "silver" = 1) + result_amount = 3 + required_temp = 420 + +/datum/chemical_reaction/neurotoxin2 + name = "neurotoxin2" + id = "neurotoxin2" + result = "neurotoxin2" + required_reagents = list("space_drugs" = 1) + result_amount = 1 + required_temp = 674 + +/datum/chemical_reaction/cyanide + name = "Cyanide" + id = "cyanide" + result = "cyanide" + required_reagents = list("oil" = 1, "ammonia" = 1, "oxygen" = 1) + result_amount = 3 + required_temp = 380 + +/datum/chemical_reaction/itching_powder + name = "Itching Powder" + id = "itching_powder" + result = "itching_powder" + required_reagents = list("fuel" = 1, "ammonia" = 1, "charcoal" = 1) + result_amount = 3 + +/datum/chemical_reaction/facid + name = "Fluorosulfuric acid" + id = "facid" + result = "facid" + required_reagents = list("sacid" = 1, "fluorine" = 1, "hydrogen" = 1, "potassium" = 1) + result_amount = 4 + required_temp = 380 + +/datum/chemical_reaction/sulfonal + name = "sulfonal" + id = "sulfonal" + result = "sulfonal" + required_reagents = list("acetone" = 1, "diethylamine" = 1, "sulfur" = 1) + result_amount = 3 + +/datum/chemical_reaction/lipolicide + name = "lipolicide" + id = "lipolicide" + result = "lipolicide" + required_reagents = list("mercury" = 1, "diethylamine" = 1, "ephedrine" = 1) + result_amount = 3 + +/datum/chemical_reaction/mutagen + name = "Unstable mutagen" + id = "mutagen" + result = "mutagen" + required_reagents = list("radium" = 1, "phosphorus" = 1, "chlorine" = 1) + result_amount = 3 + +/datum/chemical_reaction/lexorin + name = "Lexorin" + id = "lexorin" + result = "lexorin" + required_reagents = list("plasma" = 1, "hydrogen" = 1, "nitrogen" = 1) + result_amount = 3 + +/datum/chemical_reaction/chloralhydrate + name = "Chloral Hydrate" + id = "chloralhydrate" + result = "chloralhydrate" + required_reagents = list("ethanol" = 1, "chlorine" = 3, "water" = 1) + result_amount = 1 + +/datum/chemical_reaction/mutetoxin //i'll just fit this in here snugly between other unfun chemicals :v + name = "Mute toxin" + id = "mutetoxin" + result = "mutetoxin" + required_reagents = list("uranium" = 2, "water" = 1, "carbon" = 1) + result_amount = 2 + +/datum/chemical_reaction/zombiepowder + name = "Zombie Powder" + id = "zombiepowder" + result = "zombiepowder" + required_reagents = list("carpotoxin" = 5, "morphine" = 5, "copper" = 5) + result_amount = 2 + +/datum/chemical_reaction/mindbreaker + name = "Mindbreaker Toxin" + id = "mindbreaker" + result = "mindbreaker" + required_reagents = list("silicon" = 1, "hydrogen" = 1, "charcoal" = 1) + result_amount = 5 \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 21d4257cfbe..53a6bc40261 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1330,8 +1330,10 @@ #include "code\modules\projectiles\ammunition\magazines.dm" #include "code\modules\projectiles\ammunition\special.dm" #include "code\modules\projectiles\guns\energy.dm" +#include "code\modules\projectiles\guns\grenade_launcher.dm" #include "code\modules\projectiles\guns\magic.dm" #include "code\modules\projectiles\guns\projectile.dm" +#include "code\modules\projectiles\guns\syringe_gun.dm" #include "code\modules\projectiles\guns\energy\laser.dm" #include "code\modules\projectiles\guns\energy\nuclear.dm" #include "code\modules\projectiles\guns\energy\pulse.dm" @@ -1353,27 +1355,28 @@ #include "code\modules\projectiles\projectile\reusable.dm" #include "code\modules\projectiles\projectile\special.dm" #include "code\modules\reagents\Chemistry-Colours.dm" -#include "code\modules\reagents\Chemistry-Goon-420BlazeIt.dm" -#include "code\modules\reagents\Chemistry-Goon-Medicine.dm" -#include "code\modules\reagents\Chemistry-Goon-Other.dm" -#include "code\modules\reagents\Chemistry-Goon-Pyrotechnics.dm" -#include "code\modules\reagents\Chemistry-Goon-Readme.dm" -#include "code\modules\reagents\Chemistry-Goon-Toxins.dm" #include "code\modules\reagents\Chemistry-Holder.dm" #include "code\modules\reagents\Chemistry-Machinery.dm" #include "code\modules\reagents\Chemistry-Readme.dm" +#include "code\modules\reagents\Chemistry-Reagents.dm" #include "code\modules\reagents\Chemistry-Recipes.dm" -#include "code\modules\reagents\grenade_launcher.dm" #include "code\modules\reagents\reagent_containers.dm" #include "code\modules\reagents\reagent_dispenser.dm" -#include "code\modules\reagents\syringe_gun.dm" #include "code\modules\reagents\Chemistry-Reagents\Blob-Reagents.dm" -#include "code\modules\reagents\Chemistry-Reagents\Chemistry-Reagents.dm" +#include "code\modules\reagents\Chemistry-Reagents\Drug-Reagents.dm" #include "code\modules\reagents\Chemistry-Reagents\Medicine-Reagents.dm" +#include "code\modules\reagents\Chemistry-Reagents\Other-Reagents.dm" +#include "code\modules\reagents\Chemistry-Reagents\Pyrotechnic-Reagents.dm" #include "code\modules\reagents\Chemistry-Reagents\Toxin-Reagents.dm" #include "code\modules\reagents\Chemistry-Reagents\Consumable-Reagents\Food-Reagents.dm" #include "code\modules\reagents\Chemistry-Reagents\Consumable-Reagents\Drink-Reagents\Alcohols.dm" #include "code\modules\reagents\Chemistry-Reagents\Consumable-Reagents\Drink-Reagents\Drinks.dm" +#include "code\modules\reagents\Chemistry-Recipes\Drugs.dm" +#include "code\modules\reagents\Chemistry-Recipes\Medicine.dm" +#include "code\modules\reagents\Chemistry-Recipes\Others.dm" +#include "code\modules\reagents\Chemistry-Recipes\Pyrotechnics.dm" +#include "code\modules\reagents\Chemistry-Recipes\Slime_extracts.dm" +#include "code\modules\reagents\Chemistry-Recipes\Toxins.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" #include "code\modules\reagents\reagent_containers\borghydro.dm" #include "code\modules\reagents\reagent_containers\bottle.dm"