From 30dc79dc663e20a2114fc1f2cdba722da7063faa Mon Sep 17 00:00:00 2001 From: EdgeLordExe <42111655+EdgeLordExe@users.noreply.github.com> Date: Sun, 3 May 2020 19:43:57 +0200 Subject: [PATCH] [READY]Major explosive rebalanance and changes patch: Edge strikes back (#50775) * Explosion rebalance patch * more rebalancing * reee * removes ghetto bpp * next balance * Exotic Stabilizer * forgot about this * Maintainer suggestions Co-authored-by: moo <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com> * appveyor ree Co-authored-by: moo <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com> --- .../objects/structures/lavaland/geyser.dm | 2 +- .../chemistry/reagents/other_reagents.dm | 12 +++ .../chemistry/reagents/toxin_reagents.dm | 4 +- code/modules/reagents/chemistry/recipes.dm | 76 +++++++++++++++++-- .../reagents/chemistry/recipes/others.dm | 3 + .../chemistry/recipes/pyrotechnics.dm | 42 +++++----- 6 files changed, 107 insertions(+), 32 deletions(-) diff --git a/code/game/objects/structures/lavaland/geyser.dm b/code/game/objects/structures/lavaland/geyser.dm index b49730480f4..672fc9392a5 100644 --- a/code/game/objects/structures/lavaland/geyser.dm +++ b/code/game/objects/structures/lavaland/geyser.dm @@ -44,7 +44,7 @@ /obj/structure/geyser/random erupting_state = null - var/list/options = list(/datum/reagent/clf3 = 10, /datum/reagent/water/hollowwater = 10, /datum/reagent/medicine/omnizine/protozine = 6, /datum/reagent/wittel = 1) + var/list/options = list(/datum/reagent/clf3 = 10, /datum/reagent/water/hollowwater = 10,/datum/reagent/plasma_oxide = 8, /datum/reagent/medicine/omnizine/protozine = 6, /datum/reagent/wittel = 1) /obj/structure/geyser/random/Initialize() . = ..() diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index eb1fb43d5fb..b5503cfd0a4 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -2174,6 +2174,18 @@ taste_description = "bananas" can_synth = TRUE +/datum/reagent/plasma_oxide + name = "Hyper-Plasmium Oxide" + description = "Compound created deep in the cores of demon-class planets. Commonly found through deep geysers." + color = "#470750" // rgb: 255, 255, 255 + taste_description = "hell" + +/datum/reagent/exotic_stabilizer + name = "Exotic Stabilizer" + description = "Advanced compound created by mixing stabilizing agent and hyper-plasmium oxide." + color = "#180000" // rgb: 255, 255, 255 + taste_description = "blood" + /datum/reagent/wittel name = "Wittel" description = "An extremely rare metallic-white substance only found on demon-class planets." diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 1fbf3c262a1..6e4a0ff06d1 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -852,7 +852,7 @@ mytray.adjustWeeds(-rand(1,4)) /datum/reagent/toxin/acid/fluacid/on_mob_life(mob/living/carbon/M) - M.adjustFireLoss(current_cycle/10, 0) + M.adjustFireLoss(current_cycle/15, 0) . = 1 ..() @@ -864,7 +864,7 @@ acidpwr = 5.0 /datum/reagent/toxin/acid/nitracid/on_mob_life(mob/living/carbon/M) - M.adjustFireLoss(current_cycle/15, FALSE) //here you go nervar + M.adjustFireLoss(volume/10, FALSE) //here you go nervar . = TRUE ..() diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 7ca683dac98..d5133b35a65 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -1,23 +1,74 @@ +/** + * #Chemical Reaction + * + * Datum that makes the magic between reagents happen. + * + * Chemical reactions is a class that is instantiated and stored in a global list 'chemical_reactions_list' + */ /datum/chemical_reaction + ///Results of the chemical reactions var/list/results = new/list() + ///Required chemicals that are USED in the reaction var/list/required_reagents = new/list() + ///Required chemicals that must be present in the container but are not USED. var/list/required_catalysts = new/list() // Both of these variables are mostly going to be used with slime cores - but if you want to, you can use them for other things - var/required_container = null // the exact container path required for the reaction to happen - var/required_other = 0 // an integer required for the reaction to happen - - var/mob_react = TRUE //Determines if a chemical reaction can occur inside a mob + /// the exact container path required for the reaction to happen + var/required_container + /// an integer required for the reaction to happen + var/required_other = 0 + ///Determines if a chemical reaction can occur inside a mob + var/mob_react = TRUE + ///Required temperature for the reaction to begin var/required_temp = 0 - var/is_cold_recipe = 0 // Set to 1 if you want the recipe to only react when it's BELOW the required temp. - var/mix_message = "The solution begins to bubble." //The message shown to nearby people upon mixing, if applicable - var/mix_sound = 'sound/effects/bubbles.ogg' //The sound played upon mixing, if applicable + /// Set to TRUE if you want the recipe to only react when it's BELOW the required temp. + var/is_cold_recipe = FALSE + ///The message shown to nearby people upon mixing, if applicable + var/mix_message = "The solution begins to bubble." + ///The sound played upon mixing, if applicable + var/mix_sound = 'sound/effects/bubbles.ogg' +/datum/chemical_reaction/New() + . = ..() + SSticker.OnRoundstart(CALLBACK(src,.proc/update_info)) + +/** + * Updates information during the roundstart + * + * This proc is mainly used by explosives but can be used anywhere else + * You should generally use the special reactions in [/datum/chemical_reaction/randomized] + * But for simple variable edits, like changing the temperature or adding/subtracting required reagents it is better to use this. + */ +/datum/chemical_reaction/proc/update_info() + return + +/** + * Shit that happens on reaction + * + * Proc where the additional magic happens. + * You dont want to handle mob spawning in this since there is a dedicated proc for that.client + * Arguments: + * * holder - the datum that holds this reagent, be it a beaker or anything else + * * created_volume - volume created when this is mixed. look at 'var/list/results'. + */ /datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume) return //I recommend you set the result amount to the total volume of all components. +/** + * Magical mob spawning when chemicals react + * + * Your go to proc when you want to create new mobs from chemicals. please dont use on_reaction. + * Arguments: + * * holder - the datum that holds this reagent, be it a beaker or anything else + * * amount_to_spawn - how much /mob to spawn + * * reaction_name - what is the name of this reaction. be creative, the world is your oyster after all! + * * mob_class - determines if the mob will be friendly, neutral or hostile + * * mob_faction - used in determining targets, mobs from the same faction wont harm eachother. + * * random - creates random mobs. self explanatory. + */ /datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_class = HOSTILE_SPAWN, mob_faction = "chemicalsummon", random = TRUE) if(holder && holder.my_atom) var/atom/A = holder.my_atom @@ -50,7 +101,16 @@ for(var/j = 1, j <= rand(1, 3), j++) step(S, pick(NORTH,SOUTH,EAST,WEST)) -///Simulates a vortex that moves nearby movable atoms towards or away from the turf T. Range also determines the strength of the effect. High values cause nearby objects to be thrown. +/** + * Magical move-wooney that happens sometimes. + * + * Simulates a vortex that moves nearby movable atoms towards or away from the turf T. + * Range also determines the strength of the effect. High values cause nearby objects to be thrown. + * Arguments: + * * T - turf where it happens + * * setting_type - does it suck or does it blow? + * * range - range. + */ /proc/goonchem_vortex(turf/T, setting_type, range) for(var/atom/movable/X in orange(range, T)) if(X.anchored) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index 1c48b519356..08b5ccb98f3 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -578,3 +578,6 @@ results = list(/datum/reagent/consumable/gravy = 3) required_reagents = list(/datum/reagent/consumable/milk = 1, /datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/flour = 1) +/datum/chemical_reaction/exotic_stabilizer + results = list(/datum/reagent/exotic_stabilizer = 2) + required_reagents = list(/datum/reagent/plasma_oxide = 1,/datum/reagent/stabilizing_agent = 1) diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index dba45bfd615..e14b3b620c1 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -30,7 +30,8 @@ strengthdiv = 2 /datum/chemical_reaction/reagent_explosion/nitroglycerin/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent(/datum/reagent/stabilizing_agent)) + + if(holder.has_reagent(/datum/reagent/exotic_stabilizer,round(created_volume / 25, CHEMICAL_QUANTISATION_LEVEL))) return holder.remove_reagent(/datum/reagent/nitroglycerin, created_volume*2) ..() @@ -43,6 +44,7 @@ /datum/chemical_reaction/reagent_explosion/rdx results = list(/datum/reagent/rdx= 2) required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/acetone_oxide = 1 ) + required_catalysts = list(/datum/reagent/gold) //royal explosive required_temp = 404 strengthdiv = 8 @@ -55,15 +57,15 @@ /datum/chemical_reaction/reagent_explosion/rdx_explosion required_reagents = list(/datum/reagent/rdx = 1) required_temp = 474 - strengthdiv = 8 + strengthdiv = 7 /datum/chemical_reaction/reagent_explosion/rdx_explosion2 //makes rdx unique , on its own it is a good bomb, but when combined with liquid electricity it becomes truly destructive required_reagents = list(/datum/reagent/rdx = 1 , /datum/reagent/consumable/liquidelectricity = 1) - strengthdiv = 4 + strengthdiv = 3.5 //actually a decrease of 1 becaused of how explosions are calculated. This is due to the fact we require 2 reagents modifier = 2 /datum/chemical_reaction/reagent_explosion/rdx_explosion2/on_reaction(datum/reagents/holder, created_volume) - var/fire_range = round(created_volume/100) + var/fire_range = round(created_volume/50) var/turf/T = get_turf(holder.my_atom) for(var/turf/turf in range(fire_range,T)) new /obj/effect/hotspot(turf) @@ -72,11 +74,12 @@ /datum/chemical_reaction/reagent_explosion/rdx_explosion3 required_reagents = list(/datum/reagent/rdx = 1 , /datum/reagent/teslium = 1) + strengthdiv = 3.5 //actually a decrease of 1 becaused of how explosions are calculated. This is due to the fact we require 2 reagents modifier = 4 - strengthdiv = 4 + /datum/chemical_reaction/reagent_explosion/rdx_explosion3/on_reaction(datum/reagents/holder, created_volume) - var/fire_range = round(created_volume/50) + var/fire_range = round(created_volume/30) var/turf/T = get_turf(holder.my_atom) for(var/turf/turf in range(fire_range,T)) new /obj/effect/hotspot(turf) @@ -89,15 +92,11 @@ required_temp = 450 strengthdiv = 3 -/datum/chemical_reaction/reagent_explosion/tatp/New() - SSticker.OnRoundstart(CALLBACK(src,.proc/UpdateInfo)) //method used by secret sauce. - -/datum/chemical_reaction/reagent_explosion/tatp/proc/UpdateInfo() +/datum/chemical_reaction/reagent_explosion/tatp/update_info() required_temp = 450 + rand(-49,49) //this gets loaded only on round start - /datum/chemical_reaction/reagent_explosion/tatp/on_reaction(datum/reagents/holder, created_volume) - if(holder.has_reagent(/datum/reagent/stabilizing_agent)) + if(holder.has_reagent(/datum/reagent/exotic_stabilizer,round(created_volume / 50, CHEMICAL_QUANTISATION_LEVEL))) // we like exotic stabilizer return holder.remove_reagent(/datum/reagent/tatp, created_volume) ..() @@ -107,14 +106,15 @@ required_temp = 550 // this makes making tatp before pyro nades, and extreme pain in the ass to make strengthdiv = 3 -/datum/chemical_reaction/reagent_explosion/tatp_explosion/New() - SSticker.OnRoundstart(CALLBACK(src,.proc/UpdateInfo)) +/datum/chemical_reaction/reagent_explosion/tatp_explosion/on_reaction(datum/reagents/holder, created_volume) + var/strengthdiv_adjust = created_volume / ( 2100 / initial(strengthdiv)) + strengthdiv = max(initial(strengthdiv) - strengthdiv_adjust + 1.5 ,1.5) //Slightly better than nitroglycerin + . = ..() + return - -/datum/chemical_reaction/reagent_explosion/tatp_explosion/proc/UpdateInfo() +/datum/chemical_reaction/reagent_explosion/tatp_explosion/update_info() required_temp = 550 + rand(-49,49) - /datum/chemical_reaction/reagent_explosion/penthrite_explosion_epinephrine required_reagents = list(/datum/reagent/medicine/C2/penthrite = 1, /datum/reagent/medicine/epinephrine = 1) strengthdiv = 5 @@ -162,8 +162,8 @@ /datum/chemical_reaction/reagent_explosion/gunpowder_explosion required_reagents = list(/datum/reagent/gunpowder = 1) required_temp = 474 - strengthdiv = 6 - modifier = 1 + strengthdiv = 10 + modifier = 5 mix_message = "Sparks start flying around the gunpowder!" /datum/chemical_reaction/reagent_explosion/gunpowder_explosion/on_reaction(datum/reagents/holder, created_volume) @@ -224,8 +224,8 @@ /datum/chemical_reaction/reagent_explosion/methsplosion required_temp = 380 //slightly above the meth mix time. required_reagents = list(/datum/reagent/drug/methamphetamine = 1) - strengthdiv = 6 - modifier = 1 + strengthdiv = 12 + modifier = 5 mob_react = FALSE /datum/chemical_reaction/reagent_explosion/methsplosion/on_reaction(datum/reagents/holder, created_volume)