From e5264815ee9765337e3ac6c25b6f635440ff7d69 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 24 Mar 2015 02:04:47 -0700 Subject: [PATCH 1/7] GOONCHEM --- code/game/objects/items/weapons/defib.dm | 2 + code/modules/mob/living/carbon/carbon.dm | 2 + .../mob/living/carbon/carbon_defines.dm | 1 + .../mob/living/carbon/human/human_movement.dm | 4 + code/modules/mob/living/carbon/human/life.dm | 16 +- code/modules/mob/living/living.dm | 1 + code/modules/reagents/Chemistry-Holder.dm | 35 +- .../Chemistry-Reagents-Antidepressants.dm | 91 -- code/modules/reagents/Chemistry-Reagents.dm | 46 +- code/modules/reagents/Chemistry-Recipes.dm | 37 +- code/modules/reagents/newchem/chem_heater.dm | 118 +++ code/modules/reagents/newchem/drugs.dm | 370 ++++++++ code/modules/reagents/newchem/medicine.dm | 837 ++++++++++++++++++ .../modules/reagents/newchem/newchem_procs.dm | 123 +++ code/modules/reagents/newchem/other.dm | 280 ++++++ code/modules/reagents/newchem/pyro.dm | 505 +++++++++++ code/modules/reagents/newchem/toxins.dm | 370 ++++++++ code/modules/reagents/reagent_containers.dm | 11 + .../reagents/reagent_containers/glass.dm | 3 +- .../research/xenoarchaeology/chemistry.dm | 2 +- code/setup.dm | 2 + nano/templates/chem_heater.tmpl | 47 + paradise.dme | 81 +- 23 files changed, 2719 insertions(+), 265 deletions(-) delete mode 100644 code/modules/reagents/Chemistry-Reagents-Antidepressants.dm create mode 100644 code/modules/reagents/newchem/chem_heater.dm create mode 100644 code/modules/reagents/newchem/drugs.dm create mode 100644 code/modules/reagents/newchem/medicine.dm create mode 100644 code/modules/reagents/newchem/newchem_procs.dm create mode 100644 code/modules/reagents/newchem/other.dm create mode 100644 code/modules/reagents/newchem/pyro.dm create mode 100644 code/modules/reagents/newchem/toxins.dm create mode 100644 nano/templates/chem_heater.tmpl diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index b4d773e1973..a596df8b15a 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -355,6 +355,8 @@ busy = 0 update_icon() return + if(H.heart_attack) + H.heart_attack = 0 if(H.stat == 2) var/health = H.health M.visible_message("[M]'s body convulses a bit.") diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 3e06137e7db..b90f67948e1 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -88,6 +88,8 @@ src.apply_damage(shock_damage, BURN, def_zone, used_weapon="Electrocution") + if(heart_attack && prob(25)) + heart_attack = 0 playsound(loc, "sparks", 50, 1, -1) if (shock_damage < 10) src.visible_message( diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 293e7cc960b..14c877ab7ab 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -21,3 +21,4 @@ var/pulse = PULSE_NORM //current pulse level var/list/internal_organs = list() //List of /obj/item/organ in the mob. they don't go in the contents. + var/heart_attack = 0 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 64043e02bc2..a34b1c25545 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -2,6 +2,8 @@ var/tally = 0 if(status_flags & GOTTAGOFAST) tally -= 1 + if(status_flags & GOTTAGOREALLYFAST) + tally -= 2 if(species && species.flags & IS_SLOW) tally = 5 @@ -62,6 +64,8 @@ if(RUN in mutations) tally = 0 + if(status_flags & IGNORESLOWDOWN) // make sure this is always at the end so we don't have ignore slowdown getting ignored itself + tally = 0 return (tally+config.human_delay) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 6ee4125aeaa..e05fe59b2ac 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -113,6 +113,8 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc handle_heartbeat() + handle_heartattack() + if(stat == DEAD) handle_decay() @@ -812,7 +814,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc proc/handle_chemicals_in_body() - if(reagents && !(species.flags & IS_SYNTHETIC)) //Synths don't process reagents. + if(reagents) //Synths don't process reagents. // fuck you they do now - Iamgoofball var/alien = 0 if(species && species.reagent_tag) alien = species.reagent_tag @@ -1611,7 +1613,7 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc break for(var/datum/reagent/R in reagents.reagent_list) //Conditional heart-stoppage if(R.id in cheartstopper) - if(R.volume >= R.overdose) + if(R.volume >= R.overdose_threshold) temp = PULSE_NONE break @@ -1899,6 +1901,16 @@ var/global/list/brutefireloss_overlays = list("1" = image("icon" = 'icons/mob/sc return stuttering +/mob/living/carbon/human/proc/handle_heartattack() + if(!heart_attack) + return + else + losebreath += 5 + adjustOxyLoss(5) + adjustBrainLoss(10) + return + + // Need this in species. //#undef HUMAN_MAX_OXYLOSS //#undef HUMAN_CRIT_MAX_OXYLOSS diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e3917bf373f..135f3f0e85c 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -336,6 +336,7 @@ if(iscarbon(src)) var/mob/living/carbon/C = src C.handcuffed = initial(C.handcuffed) + C.heart_attack = 0 // restore all of the human's blood and reset their shock stage if(ishuman(src)) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 51cb5012af4..eec7eb1415d 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -247,12 +247,6 @@ datum return total_transfered */ - metabolize(var/mob/M,var/alien) - for(var/A in reagent_list) - var/datum/reagent/R = A - if(M && R) - R.on_mob_life(M,alien) - update_total() conditional_update_move(var/atom/A, var/Running = 0) for(var/datum/reagent/R in reagent_list) @@ -278,14 +272,6 @@ datum var/datum/chemical_reaction/C = reaction - //check if this recipe needs to be heated to mix - if(C.requires_heating) - if(istype(my_atom.loc, /obj/machinery/bunsen_burner)) - if(!my_atom.loc:heated) - continue - else - continue - var/total_required_reagents = C.required_reagents.len var/total_matching_reagents = 0 var/total_required_catalysts = C.required_catalysts.len @@ -293,7 +279,7 @@ datum var/matching_container = 0 var/matching_other = 0 var/list/multipliers = new/list() - + var/required_temp = C.required_temp for(var/B in C.required_reagents) if(!has_reagent(B, C.required_reagents[B])) break total_matching_reagents++ @@ -324,10 +310,10 @@ datum if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this matching_other = 1 + if(required_temp == 0) + required_temp = chem_temp - - - if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other) + if(total_matching_reagents == total_required_reagents && total_matching_catalysts == total_required_catalysts && matching_container && matching_other && chem_temp >= required_temp) var/multiplier = min(multipliers) var/preserved_data = null for(var/B in C.required_reagents) @@ -348,7 +334,7 @@ datum var/list/seen = viewers(4, get_turf(my_atom)) for(var/mob/M in seen) - M << "\blue \icon[my_atom] The solution begins to bubble." + M << "\blue \icon[my_atom] [C.mix_message]." /* if(istype(my_atom, /obj/item/slime_core)) var/obj/item/slime_core/ME = my_atom @@ -387,6 +373,9 @@ datum for(var/A in reagent_list) var/datum/reagent/R = A if (R.id == reagent) + if(istype(my_atom, /mob/living)) + var/mob/living/M = my_atom + R.reagent_deleted(M) reagent_list -= A del(A) update_total() @@ -397,14 +386,6 @@ datum return 1 - check_gofast(var/mob/M) - if(M && istype(M, /mob)) - if(M.reagents) - if(M.reagents.has_reagent("hyperzine")||M.reagents.has_reagent("nuka_cola")) - return 1 - else - M.status_flags &= ~GOTTAGOFAST - update_total() total_volume = 0 for(var/datum/reagent/R in reagent_list) diff --git a/code/modules/reagents/Chemistry-Reagents-Antidepressants.dm b/code/modules/reagents/Chemistry-Reagents-Antidepressants.dm deleted file mode 100644 index 392d9101c6d..00000000000 --- a/code/modules/reagents/Chemistry-Reagents-Antidepressants.dm +++ /dev/null @@ -1,91 +0,0 @@ -#define ANTIDEPRESSANT_MESSAGE_DELAY 5*60*10 - -/datum/reagent/antidepressant/methylphenidate - name = "Methylphenidate" - id = "methylphenidate" - description = "Improves the ability to concentrate." - reagent_state = LIQUID - color = "#C8A5DC" - custom_metabolism = 0.01 - data = 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(src.volume <= 0.1) if(data != -1) - data = -1 - M << "\red You lose focus.." - else - if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY) - data = world.time - M << "\blue Your mind feels focused and undivided." - ..() - return - -/datum/chemical_reaction/methylphenidate - name = "Methylphenidate" - id = "methylphenidate" - result = "methylphenidate" - required_reagents = list("mindbreaker" = 1, "hydrogen" = 1) - result_amount = 3 - -/datum/reagent/antidepressant/citalopram - name = "Citalopram" - id = "citalopram" - description = "Stabilizes the mind a little, reducing hallucinations." - reagent_state = LIQUID - color = "#C8A5DC" - custom_metabolism = 0.01 - data = 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - M.hallucination = max(0, M.hallucination - 10) - ..() - return - -/datum/chemical_reaction/citalopram - name = "Citalopram" - id = "citalopram" - result = "citalopram" - required_reagents = list("mindbreaker" = 1, "carbon" = 1) - result_amount = 3 - - -/datum/reagent/antidepressant/paroxetine - name = "Paroxetine" - id = "paroxetine" - description = "Stabilizes the mind greatly, but has a chance of adverse effects." - reagent_state = LIQUID - color = "#C8A5DC" - custom_metabolism = 0.01 - data = 0 - - on_mob_life(var/mob/living/M as mob) - if(!M) M = holder.my_atom - if(src.volume <= 0.1) if(data != -1) - data = -1 - M << "\red Your mind feels much less stable.." - else - if(world.time > data + ANTIDEPRESSANT_MESSAGE_DELAY) - data = world.time - if(volume > 5) // Bone White - Added any concentrations over 5 units to cause higher chance of mind breakage. - if (prob(min(100, volume * 5))) - M << "\red Your mind breaks apart.." - M.hallucination += 200 - else - M << "\blue Your mind feels much more stable." - else - if (prob(90)) - M << "\blue Your mind feels much more stable." - else - M << "\red Your mind breaks apart.." - M.hallucination += 200 - ..() - return - -/datum/chemical_reaction/paroxetine - name = "Paroxetine" - id = "paroxetine" - result = "paroxetine" - required_reagents = list("mindbreaker" = 1, "oxygen" = 1, "inaprovaline" = 1) - result_amount = 3 diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index 141da47284a..bb1fe15e4be 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -10,7 +10,7 @@ //Some on_mob_life() procs check for alien races. #define IS_DIONA 1 #define IS_VOX 2 - +// ^ fuck this shit holy fuck - Iamgoofball datum reagent var/name = "Reagent" @@ -21,8 +21,7 @@ datum var/list/data = null var/volume = 0 var/nutriment_factor = 0 - var/custom_metabolism = REAGENTS_METABOLISM - var/overdose = 0 + var/metabolization_rate = REAGENTS_METABOLISM var/scannable = 0 //shows up on health analyzers //var/list/viruses = list() var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!) @@ -86,10 +85,10 @@ datum return on_mob_life(var/mob/living/M as mob, var/alien) - if(!istype(M, /mob/living)) + if(!istype(M, /mob/living)) // YOU'RE A FUCKING RETARD NEO WHY CAN'T YOU JUST FIX THE PROBLEM ON THE REAGENT - Iamgoofball return //Noticed runtime errors from pacid trying to damage ghosts, this should fix. --NEO // Certain elements in too large amounts cause side-effects - holder.remove_reagent(src.id, custom_metabolism) //By default it slowly disappears. + holder.remove_reagent(src.id, metabolization_rate) //By default it slowly disappears. return // Called when two reagents of the same are mixing. @@ -381,29 +380,6 @@ datum ..() return - chefspecial - // Quiet and lethal, needs atleast 4 units in the person before they'll die - name = "Chef's Special" - id = "chefspecial" - description = "An extremely toxic chemical that will surely end in death." - reagent_state = LIQUID - color = "#CF3600" // rgb: 207, 54, 0 - custom_metabolism = 0.39 - - on_mob_life(var/mob/living/M as mob) - var/random = rand(150,180) - if(!M) M = holder.my_atom - if(!data) data = 1 - switch(data) - if(0 to 5) - ..() - if(data >= random) - if(M.stat != DEAD) - M.death(0) - M.attack_log += "\[[time_stamp()]\]Died a quick and painless death by Chef Excellence's Special Sauce." - data++ - return - minttoxin name = "Mint Toxin" id = "minttoxin" @@ -1063,7 +1039,7 @@ datum reagent_state = LIQUID color = "#C855DC" scannable = 1 - custom_metabolism = 0.2 // Lasts 2.5 minutes for 15 units + metabolization_rate = 0.2 // Lasts 2.5 minutes for 15 units on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -1104,7 +1080,7 @@ datum reagent_state = LIQUID color = "#C8A5DC" scannable = 1 - custom_metabolism = 0.2 // Lasts 2.5 minutes for 15 units + metabolization_rate = 0.2 // Lasts 2.5 minutes for 15 units on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -1118,7 +1094,7 @@ datum description = "An effective and very addictive painkiller." reagent_state = LIQUID color = "#C805DC" - custom_metabolism = 0.3 // Lasts 1.5 minutes for 15 units + metabolization_rate = 0.3 // Lasts 1.5 minutes for 15 units scannable = 1 on_mob_life(var/mob/living/M as mob) @@ -3229,7 +3205,7 @@ datum id = "absinthe" description = "Watch out that the Green Fairy doesn't come for you!" color = "#33EE00" // rgb: lots, ??, ?? - overdose = 30 + overdose_threshold = 30 dizzy_adj = 5 slur_start = 25 confused_start = 100 @@ -3240,7 +3216,7 @@ datum if(!data) data = 1 data++ M:hallucination += 5 - if(volume > overdose) + if(volume > overdose_threshold) M:adjustToxLoss(1) ..() return @@ -3250,12 +3226,12 @@ datum id = "rum" description = "Popular with the sailors. Not very popular with everyone else." color = "#664300" // rgb: 102, 67, 0 - overdose = 30 + overdose_threshold = 30 on_mob_life(var/mob/living/M as mob) ..() M.dizziness +=5 - if(volume > overdose) + if(volume > overdose_threshold) M:adjustToxLoss(1) return diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 288e5a98c70..0b0f661a303 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -14,7 +14,9 @@ datum var/result_amount = 0 var/secondary = 0 // set to nonzero if secondary reaction var/list/secondary_results = list() //additional reagents produced by the reaction - var/requires_heating = 0 + var/required_temp = 0 + var/mix_message = "The solution begins to bubble." + proc on_reaction(var/datum/reagents/holder, var/created_volume) @@ -375,39 +377,6 @@ datum continue C.Stun(5) - napalm - name = "Napalm" - id = "napalm" - result = null - required_reagents = list("aluminum" = 1, "plasma" = 1, "sacid" = 1 ) - result_amount = 1 - on_reaction(var/datum/reagents/holder, var/created_volume) - var/turf/simulated/T = get_turf(holder.my_atom) - for(var/turf/simulated/turf in range(created_volume/10,T)) - new /obj/fire(turf) - holder.del_reagent("napalm") - return - - chemsmoke - name = "Chemsmoke" - id = "chemsmoke" - result = null - required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1) - result_amount = null - secondary = 1 - on_reaction(var/datum/reagents/holder, var/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) - S.set_up(holder, 10, 0, location) - playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3) - spawn(0) - S.start() - sleep(10) - S.start() - holder.clear_reagents() - return - chloralhydrate name = "Chloral Hydrate" id = "chloralhydrate" diff --git a/code/modules/reagents/newchem/chem_heater.dm b/code/modules/reagents/newchem/chem_heater.dm new file mode 100644 index 00000000000..6368ccce6c9 --- /dev/null +++ b/code/modules/reagents/newchem/chem_heater.dm @@ -0,0 +1,118 @@ +/obj/machinery/chem_heater + name = "chemical heater" + density = 1 + anchored = 1 + icon = 'icons/obj/chemical.dmi' + icon_state = "mixer0b" + use_power = 1 + idle_power_usage = 40 + var/obj/item/weapon/reagent_containers/beaker = null + var/temperature = 300 + var/rate = 10 //heating/cooling rate, default is 10 kelvin per tick + var/on = FALSE + + +/obj/machinery/chem_heater/process() + ..() + if(stat & NOPOWER) + return + var/state_change = 0 + if(on) + if(beaker) + if(beaker.reagents.chem_temp > temperature) + beaker.reagents.chem_temp = max(beaker.reagents.chem_temp-rate, temperature) + beaker.reagents.handle_reactions() + state_change = 1 + else if(beaker.reagents.chem_temp < temperature) + beaker.reagents.chem_temp = min(beaker.reagents.chem_temp+rate, temperature) + beaker.reagents.handle_reactions() + state_change = 1 + if(state_change) + nanomanager.update_uis(src) + +/obj/machinery/chem_heater/proc/eject_beaker() + if(beaker) + beaker.loc = get_turf(src) + beaker.reagents.handle_reactions() + beaker = null + icon_state = "mixer0b" + nanomanager.update_uis(src) + +/obj/machinery/chem_heater/power_change() + if(powered()) + stat &= ~NOPOWER + else + spawn(rand(0, 15)) + stat |= NOPOWER + nanomanager.update_uis(src) + +/obj/machinery/chem_heater/attackby(var/obj/item/I as obj, var/mob/user as mob) + if(isrobot(user)) + return + + if(istype(I, /obj/item/weapon/reagent_containers/glass)) + if(beaker) + user << "A beaker is already loaded into the machine." + return + + if(user.drop_item()) + beaker = I + I.loc = src + user << "You add the beaker to the machine!" + icon_state = "mixer1b" + nanomanager.update_uis(src) + +/obj/machinery/chem_heater/attack_hand(var/mob/user as mob) + ui_interact(user) + +/obj/machinery/chem_heater/attack_ai(mob/user as mob) + src.add_hiddenprint(user) + return src.attack_hand(user) + +/obj/machinery/chem_heater/Topic(href, href_list) + if(..()) + return 0 + + if(href_list["toggle_on"]) + on = !on + . = 1 + + if(href_list["adjust_temperature"]) + var/val = href_list["adjust_temperature"] + if(isnum(val)) + temperature = Clamp(temperature+val, 0, 1000) + else if(val == "input") + temperature = Clamp(input("Please input the target temperature", name) as num, 0, 1000) + else + return 0 + . = 1 + + if(href_list["eject_beaker"]) + eject_beaker() + . = 0 //updated in eject_beaker() already + +/obj/machinery/chem_heater/ui_interact(var/mob/user, ui_key = "main", var/datum/nanoui/ui = null) + if(user.stat || user.restrained()) return + + var/data[0] + data["targetTemp"] = temperature + data["isActive"] = on + data["isBeakerLoaded"] = beaker ? 1 : 0 + + data["currentTemp"] = beaker ? beaker.reagents.chem_temp : null + data["beakerCurrentVolume"] = beaker ? beaker.reagents.total_volume : null + data["beakerMaxVolume"] = beaker ? beaker.volume : null + + //copy-pasted from chem dispenser + var beakerContents[0] + if(beaker) + for(var/datum/reagent/R in beaker.reagents.reagent_list) + beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list... + data["beakerContents"] = beakerContents + + // update the ui if it exists, returns null if no ui is passed/found + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data) + if (!ui) + ui = new(user, src, ui_key, "chem_heater.tmpl", "ChemHeater", 350, 270) + ui.set_initial_data(data) + ui.open() \ No newline at end of file diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm new file mode 100644 index 00000000000..c9f51162080 --- /dev/null +++ b/code/modules/reagents/newchem/drugs.dm @@ -0,0 +1,370 @@ +#define SOLID 1 +#define LIQUID 2 +#define GAS 3 + +#define REM REAGENTS_EFFECT_MULTIPLIER + +datum/reagent/nicotine + name = "Nicotine" + id = "nicotine" + description = "Slightly reduces stun times. If overdosed it will deal toxin and oxygen damage." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + overdose_threshold = 35 + addiction_threshold = 30 + +datum/reagent/nicotine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + 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) + ..() + return + +datum/reagent/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) + ..() + return + +datum/reagent/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." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + overdose_threshold = 20 + addiction_threshold = 10 + +datum/reagent/crank/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + 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) + ..() + 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) + ..() + return + +datum/reagent/crank/addiction_act_stage1(var/mob/living/M as mob) + M.adjustBrainLoss(rand(1,10)*REM) + ..() + return +datum/reagent/crank/addiction_act_stage2(var/mob/living/M as mob) + M.adjustToxLoss(rand(1,10)*REM) + ..() + return +datum/reagent/crank/addiction_act_stage3(var/mob/living/M as mob) + M.adjustBruteLoss(rand(1,10)*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) + ..() + 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 + 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." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + overdose_threshold = 20 + addiction_threshold = 15 + + +/datum/reagent/krokodil/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + 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) + ..() + 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) + ..() + return +/datum/reagent/krokodil/addiction_act_stage2(var/mob/living/M as mob) + if(prob(25)) + M << "Your skin feels loose..." + ..() + return +/datum/reagent/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) + if(prob(25)) + M << "Your skin falls off easily!" + 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 + 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." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + overdose_threshold = 20 + addiction_threshold = 10 + metabolization_rate = 0.6 + +/datum/reagent/methamphetamine/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + 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.status_flags |= GOTTAGOREALLYFAST + M.Jitter(3) + M.adjustBrainLoss(0.5) + if(prob(5)) + M.emote(pick("twitch", "shiver")) + ..() + return + +/datum/reagent/methamphetamine/overdose_process(var/mob/living/M as mob) + if(M.canmove && !istype(M.loc, /turf/space)) + for(var/i = 0, i < 4, i++) + step(M, pick(cardinal)) + if(prob(20)) + M.emote("laugh") + if(prob(33)) + M.visible_message("[M]'s hands flip out and flail everywhere!") + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + ..() + if(prob(20)) + M.adjustToxLoss(5) + 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) + 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) + 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) + if(M.canmove && !istype(M.loc, /turf/space)) + for(var/i = 0, i < 4, i++) + step(M, pick(cardinal)) + M.Jitter(15) + M.Dizzy(15) + if(prob(40)) + M.emote(pick("twitch","drool","moan")) + ..() + return +/datum/reagent/methamphetamine/addiction_act_stage4(var/mob/living/carbon/human/M as mob) + if(M.canmove && !istype(M.loc, /turf/space)) + for(var/i = 0, i < 8, i++) + step(M, pick(cardinal)) + M.Jitter(20) + M.Dizzy(20) + M.adjustToxLoss(5) + if(prob(50)) + M.emote(pick("twitch","drool","moan")) + ..() + 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 + 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." + reagent_state = LIQUID + color = "#60A584" // rgb: 96, 165, 132 + overdose_threshold = 20 + addiction_threshold = 10 + + +/datum/reagent/bath_salts/on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + 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.adjustToxLoss(0.1) + M.hallucination += 10 + if(M.canmove && !istype(M.loc, /turf/space)) + step(M, pick(cardinal)) + step(M, pick(cardinal)) + ..() + 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) + M.hallucination += 10 + if(M.canmove && !istype(M.loc, /turf/space)) + for(var/i = 0, i < 8, i++) + step(M, pick(cardinal)) + if(prob(20)) + M.emote(pick("twitch","drool","moan")) + if(prob(33)) + var/obj/item/I = M.get_active_hand() + if(I) + M.drop_item() + ..() + return + +/datum/reagent/bath_salts/addiction_act_stage1(var/mob/living/M as mob) + M.hallucination += 10 + if(M.canmove && !istype(M.loc, /turf/space)) + for(var/i = 0, i < 8, i++) + step(M, pick(cardinal)) + M.Jitter(5) + M.adjustBrainLoss(10) + if(prob(20)) + M.emote(pick("twitch","drool","moan")) + ..() + return +/datum/reagent/bath_salts/addiction_act_stage2(var/mob/living/M as mob) + M.hallucination += 20 + if(M.canmove && !istype(M.loc, /turf/space)) + for(var/i = 0, i < 8, i++) + step(M, pick(cardinal)) + M.Jitter(10) + M.Dizzy(10) + M.adjustBrainLoss(10) + if(prob(30)) + M.emote(pick("twitch","drool","moan")) + ..() + return +/datum/reagent/bath_salts/addiction_act_stage3(var/mob/living/M as mob) + M.hallucination += 30 + if(M.canmove && !istype(M.loc, /turf/space)) + for(var/i = 0, i < 12, i++) + step(M, pick(cardinal)) + M.Jitter(15) + M.Dizzy(15) + M.adjustBrainLoss(10) + if(prob(40)) + M.emote(pick("twitch","drool","moan")) + ..() + return +/datum/reagent/bath_salts/addiction_act_stage4(var/mob/living/carbon/human/M as mob) + M.hallucination += 40 + if(M.canmove && !istype(M.loc, /turf/space)) + for(var/i = 0, i < 16, i++) + step(M, pick(cardinal)) + M.Jitter(50) + M.Dizzy(50) + M.adjustToxLoss(5) + M.adjustBrainLoss(10) + if(prob(50)) + M.emote(pick("twitch","drool","moan")) + ..() + 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 + 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 + 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) + if(prob(rand(1,100))) + M.losebreath++ + M.adjustOxyLoss(20) + ..() + return diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm new file mode 100644 index 00000000000..348ca65f073 --- /dev/null +++ b/code/modules/reagents/newchem/medicine.dm @@ -0,0 +1,837 @@ +#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 = "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.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(rand(1,100))) + 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 + )//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/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 + var/needs_update = 1 //M.mutations.len > 0 + + for(var/block=1;block<=DNA_SE_LENGTH;block++) + M.dna.SetSEState(block,0) + genemutcheck(M,block,null,MUTCHK_FORCED) + M.update_mutations() + + M.dna.struc_enzymes = M.dna.struc_enzymes_original + + // Might need to update appearance for hulk etc. + if(needs_update && ishuman(M)) + var/mob/living/carbon/human/H = M + H.update_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("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/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm new file mode 100644 index 00000000000..3a627e16b87 --- /dev/null +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -0,0 +1,123 @@ +datum/reagent + 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. + var/current_cycle = 0 +datum/reagents + var/chem_temp = 150 + var/addiction_tick = 1 + var/list/datum/reagent/addiction_list = new/list() + +datum/reagent/on_mob_life() + current_cycle++ + +datum/reagents/proc/metabolize(var/mob/M) + if(M) + chem_temp = M.bodytemperature + handle_reactions() + for(var/A in reagent_list) + var/datum/reagent/R = A + if(M && R) + if(R.volume >= R.overdose_threshold && !R.overdosed && R.overdose_threshold > 0) + R.overdosed = 1 + M << "You feel like you took too much [R.name]!" + R.overdose_start(M) + if(R.volume >= R.addiction_threshold && !is_type_in_list(R, addiction_list) && R.addiction_threshold > 0) + 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(addiction_tick == 6) + addiction_tick = 1 + for(var/A in addiction_list) + var/datum/reagent/R = A + if(M && R) + if(R.addiction_stage <= 0) + R.addiction_stage++ + if(R.addiction_stage > 0 && R.addiction_stage <= 10) + R.addiction_act_stage1(M) + R.addiction_stage++ + if(R.addiction_stage > 10 && R.addiction_stage <= 20) + R.addiction_act_stage2(M) + R.addiction_stage++ + if(R.addiction_stage > 20 && R.addiction_stage <= 30) + R.addiction_act_stage3(M) + R.addiction_stage++ + if(R.addiction_stage > 30 && R.addiction_stage <= 40) + R.addiction_act_stage4(M) + R.addiction_stage++ + if(R.addiction_stage > 40) + M << "You feel like you've gotten over your need for [R.name]." + addiction_list.Remove(R) + addiction_tick++ + update_total() + +datum/reagents/proc/reagent_on_tick() + for(var/datum/reagent/R in reagent_list) + R.on_tick() + return + +datum/reagents/proc/check_ignoreslow(var/mob/M) + if(istype(M, /mob)) + if(M.reagents.has_reagent("morphine")||M.reagents.has_reagent("ephedrine")) + return 1 + else + M.status_flags &= ~IGNORESLOWDOWN + +datum/reagents/proc/check_gofast(var/mob/M) + if(istype(M, /mob)) + if(M.reagents.has_reagent("unholywater")||M.reagents.has_reagent("nuka_cola")) + return 1 + else + M.status_flags &= ~GOTTAGOFAST + +datum/reagents/proc/check_goreallyfast(var/mob/M) + if(istype(M, /mob)) + if(M.reagents.has_reagent("methamphetamine")) + return 1 + else + M.status_flags &= ~GOTTAGOREALLYFAST + +// 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/proc/reagent_deleted() + return \ No newline at end of file diff --git a/code/modules/reagents/newchem/other.dm b/code/modules/reagents/newchem/other.dm new file mode 100644 index 00000000000..9ef1a8b76bb --- /dev/null +++ b/code/modules/reagents/newchem/other.dm @@ -0,0 +1,280 @@ +#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/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(T.is_plating() || T.is_plasteel_floor()) + var/turf/simulated/floor/F = T + F.ChangeTurf(/turf/simulated/floor/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("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/corgi(location) + ..() + return + +datum/reagent/hair_dye + name = "Quantum Hair Dye" + id = "hair_dye" + description = "A solution." + reagent_state = LIQUID + color = "#C8A5DC" + +/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.r_facial = rand(0,255) + H.g_facial = rand(0,255) + H.b_facial = rand(0,255) + H.r_hair = rand(0,255) + H.g_hair = rand(0,255) + H.b_hair = rand(0,255) + H.update_hair() + ..() + return + +datum/reagent/hairgrownium + name = "Hairgrownium" + id = "hairgrownium" + description = "A solution to hair loss across the world." + reagent_state = LIQUID + color = "#C8A5DC" + +/datum/chemical_reaction/hairgrownium + name = "hairgrownium" + id = "hairgrownium" + result = "hairgrownium" + required_reagents = list("carpet" = 1, "synthflesh" = 1, "ephedrine" = 1) + result_amount = 3 + +datum/reagent/hairgrownium/reaction_mob(var/mob/living/M, var/volume) + if(M && ishuman(M)) + var/mob/living/carbon/human/H = M + H.h_style = random_hair_style(H.gender, H.species) + H.f_style = random_facial_hair_style(H.gender, H.species) + H.update_hair() + ..() + return + +datum/reagent/super_hairgrownium + name = "Super Hairgrownium" + id = "super_hairgrownium" + description = "A concentrated solution to hair loss across the world." + reagent_state = LIQUID + color = "#C8A5DC" + +/datum/chemical_reaction/super_hairgrownium + name = "Super Hairgrownium" + id = "super_hairgrownium" + result = "super_hairgrownium" + required_reagents = list("iron" = 1, "methamphetamine " = 1, "hairgrownium" = 1) + result_amount = 3 + +datum/reagent/super_hairgrownium/reaction_mob(var/mob/living/M, var/volume) + if(M && ishuman(M)) + var/mob/living/carbon/human/H = M + H.h_style = "Very Long Hair" + H.f_style = "Very Long Beard" + H.update_hair() + ..() + return \ No newline at end of file diff --git a/code/modules/reagents/newchem/pyro.dm b/code/modules/reagents/newchem/pyro.dm new file mode 100644 index 00000000000..fa3cc08a176 --- /dev/null +++ b/code/modules/reagents/newchem/pyro.dm @@ -0,0 +1,505 @@ +#define SOLID 1 +#define LIQUID 2 +#define GAS 3 + +#define REM REAGENTS_EFFECT_MULTIPLIER + +/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" + id = "stabilizing_agent" + result = "stabilizing_agent" + 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" + id = "clf3" + result = "clf3" + required_reagents = list("chlorine" = 1, "fluorine" = 3) + 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/fire(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/fire(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/fire(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" + id = "sorium" + result = "sorium" + required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1) + result_amount = 4 + +/datum/chemical_reaction/sorium_vortex + name = "sorium_vortex" + id = "sorium_vortex" + result = null + required_reagents = list("sorium" = 1) + required_temp = 474 + +/datum/chemical_reaction/sorium_vortex/on_reaction(var/datum/reagents/holder, var/created_volume) + 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" + id = "liquid_dark_matter" + result = "liquid_dark_matter" + required_reagents = list("plasma" = 1, "radium" = 1, "carbon" = 1) + result_amount = 3 + +/datum/chemical_reaction/ldm_vortex + name = "LDM Vortex" + id = "ldm_vortex" + result = null + required_reagents = list("liquid_dark_matter" = 1) + required_temp = 474 + +/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" + id = "blackpowder" + result = "blackpowder" + required_reagents = list("saltpetre" = 1, "charcoal" = 1, "sulfur" = 1) + result_amount = 3 + +/datum/chemical_reaction/blackpowder_explosion + name = "Black Powder Kaboom" + id = "blackpowder_explosion" + result = null + required_reagents = list("blackpowder" = 1) + result_amount = 1 + required_temp = 474 + mix_message = "Sparks start flying around the black powder!" + +/datum/chemical_reaction/blackpowder_explosion/on_reaction(var/datum/reagents/holder, var/created_volume) + sleep(rand(50,100)) + blackpowder_detonate(holder, created_volume) + return + +/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" + id = "flash_powder" + result = "flash_powder" + required_reagents = list("aluminium" = 1, "potassium" = 1, "sulfur" = 1 ) + result_amount = 3 + +/datum/chemical_reaction/flash_powder_flash + name = "Flash powder activation" + id = "flash_powder_flash" + result = null + required_reagents = list("flash_powder" = 1) + required_temp = 374 + +/datum/chemical_reaction/flash_powder_flash/on_reaction(var/datum/reagents/holder, var/created_volume) + 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 viewers(5, location)) + if(C.eyecheck()) + 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 viewers(5, location)) + if(C.eyecheck()) + 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" + +/datum/chemical_reaction/smoke_powder + name = "smoke_powder" + id = "smoke_powder" + result = "smoke_powder" + required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1) + result_amount = 3 + + +/datum/chemical_reaction/smoke_powder_smoke + name = "smoke_powder_smoke" + id = "smoke_powder_smoke" + result = null + required_reagents = list("smoke_powder" = 1) + required_temp = 374 + secondary = 1 + +/datum/chemical_reaction/smoke_powder_smoke/on_reaction(var/datum/reagents/holder, var/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/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" + id = "sonic_powder" + result = "sonic_powder" + required_reagents = list("oxygen" = 1, "cola" = 1, "phosphorus" = 1) + result_amount = 3 + + +/datum/chemical_reaction/sonic_powder_deafen + name = "sonic_powder_deafen" + id = "sonic_powder_deafen" + result = null + required_reagents = list("sonic_powder" = 1) + required_temp = 374 + +/datum/chemical_reaction/sonic_powder_deafen/on_reaction(var/datum/reagents/holder, var/created_volume) + var/location = get_turf(holder.my_atom) + playsound(location, 'sound/effects/bang.ogg', 25, 1) + for(var/mob/living/M in hearers(5, location)) + var/ear_safety = 0 + var/distance = max(1,get_dist(src,T)) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) + ear_safety++ + M << "BANG" + if(!ear_safety) + M.Stun(max(10/distance, 3)) + M.Weaken(max(10/distance, 3)) + M.ear_damage += rand(0, 5) + M.ear_deaf = max(M.ear_deaf,15) + if (M.ear_damage >= 15) + M << "Your ears start to ring badly!" + if(prob(M.ear_damage - 10 + 5)) + M << "You can't hear anything!" + M.disabilities |= DEAF + else + if (M.ear_damage >= 5) + M << "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 + var/location = get_turf(holder.my_atom) + playsound(location, 'sound/effects/bang.ogg', 25, 1) + for(var/mob/living/M in hearers(5, location)) + var/ear_safety = 0 + var/distance = max(1,get_dist(src,T)) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if((H.r_ear && (H.r_ear.flags & EARBANGPROTECT)) || (H.l_ear && (H.l_ear.flags & EARBANGPROTECT)) || (H.head && (H.head.flags & HEADBANGPROTECT))) + ear_safety++ + C << "BANG" + if(!ear_safety) + M.Stun(max(10/distance, 3)) + M.Weaken(max(10/distance, 3)) + M.ear_damage += rand(0, 5) + M.ear_deaf = max(M.ear_deaf,15) + if (M.ear_damage >= 15) + M << "Your ears start to ring badly!" + if(prob(M.ear_damage - 10 + 5)) + M << "You can't hear anything!" + M.disabilities |= DEAF + else + if (M.ear_damage >= 5) + M << "Your ears start to ring!" + holder.remove_reagent("sonic_powder", created_volume) + +/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" + id = "phlogiston" + result = "phlogiston" + required_reagents = list("phosphorus" = 1, "sacid" = 1, "plasma" = 1) + result_amount = 3 + +/datum/chemical_reaction/phlogiston/on_reaction(var/datum/reagents/holder, var/created_volume) + if(holder.has_reagent("stabilizing_agent")) + return + var/turf/simulated/T = get_turf(holder.my_atom) + for(var/turf/simulated/turf in range(created_volume/10,T)) + new /obj/fire(turf) + 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" + id = "napalm" + result = null + required_reagents = list("aluminium" = 1, "plasma" = 1, "sacid" = 1 ) + result_amount = 1 + +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" + id = "cryostylane" + result = "cryostylane" + required_reagents = list("water" = 1, "plasma" = 1, "nitrogen" = 1) + result_amount = 3 + +/datum/chemical_reaction/cryostylane/on_reaction(var/datum/reagents/holder, var/created_volume) + holder.chem_temp = 20 // cools the fuck down + 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/carbon/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" + result = "pyrosium" + required_reagents = list("plasma" = 1, "radium" = 1, "phosphorus" = 1) + result_amount = 3 + +/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 diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm new file mode 100644 index 00000000000..0c9901e71d7 --- /dev/null +++ b/code/modules/reagents/newchem/toxins.dm @@ -0,0 +1,370 @@ +#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(rand(5,50))) + M << "You scratch at your head." + M.adjustBruteLoss(0.2*REM) + if(prob(rand(5,50))) + M << "You scratch at your leg." + M.adjustBruteLoss(0.2*REM) + if(prob(rand(5,50))) + 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(rand(5,10))) + 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/reagent_deleted(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.adjustToxLoss(current_cycle*rand(2,4)) + ..() + return + +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/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 76c4b2bcb6f..53ab223809a 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -26,6 +26,17 @@ var/datum/reagents/R = new/datum/reagents(volume) reagents = R R.my_atom = src + processing_objects.Add(src) + +/obj/item/weapon/reagent_containers/Destroy() + processing_objects.Remove(src) + ..() + +/obj/item/weapon/reagent_containers/process() + if(reagents) + reagents.reagent_on_tick() + ..() + return /obj/item/weapon/reagent_containers/attack_self(mob/user as mob) return diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 4369f788590..b9d5c648e59 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -15,9 +15,10 @@ flags = OPENCONTAINER var/label_text = "" - + // the fucking asshole who designed this can go die in a fire - Iamgoofball var/list/can_be_placed_into = list( /obj/machinery/chem_master/, + /obj/machinery/chem_heater/, /obj/machinery/chem_dispenser/, /obj/machinery/reagentgrinder, /obj/structure/table, diff --git a/code/modules/research/xenoarchaeology/chemistry.dm b/code/modules/research/xenoarchaeology/chemistry.dm index 9bd0a22a9c2..53c688d54ad 100644 --- a/code/modules/research/xenoarchaeology/chemistry.dm +++ b/code/modules/research/xenoarchaeology/chemistry.dm @@ -74,7 +74,7 @@ datum secondary_results = list("chemical_waste" = 1) required_reagents = list("density_separated_sample" = 5) result_amount = 4 - requires_heating = 1 + required_temp = 375 /obj/item/weapon/reagent_containers/glass/solution_tray name = "solution tray" diff --git a/code/setup.dm b/code/setup.dm index 2e9e692fa8f..9f6992e63d2 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -516,6 +516,8 @@ var/list/global_mutations = list() // list of hidden mutation things #define LEAPING 16 #define PASSEMOTES 32 //Mob has a cortical borer or holders inside of it that need to see emotes. #define GOTTAGOFAST 64 +#define GOTTAGOREALLYFAST 128 +#define IGNORESLOWDOWN 256 #define GODMODE 4096 #define FAKEDEATH 8192 //Replaces stuff like changeling.changeling_fakedeath #define DISFIGURED 16384 //I'll probably move this elsewhere if I ever get wround to writing a bitflag mob-damage system diff --git a/nano/templates/chem_heater.tmpl b/nano/templates/chem_heater.tmpl new file mode 100644 index 00000000000..2ad1b6606de --- /dev/null +++ b/nano/templates/chem_heater.tmpl @@ -0,0 +1,47 @@ + +
+
+ Status: +
+
+ {{:helper.link(data.isActive ? 'On' : 'Off', 'power', {'toggle_on' : 1}, data.isBeakerLoaded ? null : 'disabled')}} +
+
+
+
+ Target: +
+
+ {{:helper.link(data.targetTemp + 'K', 'gear', {'adjust_temperature' : 'input'}, null)}} +
+
+
+
+ Beaker +
+
+ {{:helper.link('Eject', 'eject', {'eject_beaker' : 1}, data.isBeakerLoaded ? null : 'disabled', 'floatRight')}} +
+
+
+
+
+
+
+ {{if data.isBeakerLoaded}} + Volume: {{:data.beakerCurrentVolume}} / {{:data.beakerMaxVolume}}
+ Temperature: {{:data.currentTemp}} Kelvin
+ {{for data.beakerContents}} + {{:value.volume}} units of {{:value.name}}
+ {{/for}} + {{else}} + No beaker loaded + {{/if}} +
+
+
+
+
\ No newline at end of file diff --git a/paradise.dme b/paradise.dme index ce33dc10412..06224d8e1af 100644 --- a/paradise.dme +++ b/paradise.dme @@ -5,79 +5,6 @@ // END_INTERNALS // BEGIN_FILE_DIR #define FILE_DIR . -#define FILE_DIR "code" -#define FILE_DIR "code/modules" -#define FILE_DIR "code/modules/jungle" -#define FILE_DIR "code/modules/shieldgen" -#define FILE_DIR "html" -#define FILE_DIR "html/images" -#define FILE_DIR "icons" -#define FILE_DIR "icons/48x48" -#define FILE_DIR "icons/ass" -#define FILE_DIR "icons/atmos" -#define FILE_DIR "icons/effects" -#define FILE_DIR "icons/mecha" -#define FILE_DIR "icons/misc" -#define FILE_DIR "icons/mob" -#define FILE_DIR "icons/mob/human_races" -#define FILE_DIR "icons/mob/in-hand" -#define FILE_DIR "icons/mob/in-hand/left" -#define FILE_DIR "icons/mob/in-hand/right" -#define FILE_DIR "icons/mob/otherHuman" -#define FILE_DIR "icons/mob/species" -#define FILE_DIR "icons/mob/species/armalis" -#define FILE_DIR "icons/mob/species/skrell" -#define FILE_DIR "icons/mob/species/tajaran" -#define FILE_DIR "icons/mob/species/unathi" -#define FILE_DIR "icons/mob/species/vox" -#define FILE_DIR "icons/mob/spirits" -#define FILE_DIR "icons/NTOS" -#define FILE_DIR "icons/NTOS/battery_icons" -#define FILE_DIR "icons/obj" -#define FILE_DIR "icons/obj/assemblies" -#define FILE_DIR "icons/obj/atmospherics" -#define FILE_DIR "icons/obj/clothing" -#define FILE_DIR "icons/obj/clothing/species" -#define FILE_DIR "icons/obj/clothing/species/skrell" -#define FILE_DIR "icons/obj/clothing/species/tajaran" -#define FILE_DIR "icons/obj/clothing/species/unathi" -#define FILE_DIR "icons/obj/clothing/species/vox" -#define FILE_DIR "icons/obj/doors" -#define FILE_DIR "icons/obj/flora" -#define FILE_DIR "icons/obj/machines" -#define FILE_DIR "icons/obj/pipes" -#define FILE_DIR "icons/obj/power_cond" -#define FILE_DIR "icons/pda_icons" -#define FILE_DIR "icons/pods" -#define FILE_DIR "icons/spideros_icons" -#define FILE_DIR "icons/stamp_icons" -#define FILE_DIR "icons/Testing" -#define FILE_DIR "icons/turf" -#define FILE_DIR "icons/vehicles" -#define FILE_DIR "icons/vending_icons" -#define FILE_DIR "nano" -#define FILE_DIR "nano/images" -#define FILE_DIR "sound" -#define FILE_DIR "sound/AI" -#define FILE_DIR "sound/ambience" -#define FILE_DIR "sound/effects" -#define FILE_DIR "sound/effects/turret" -#define FILE_DIR "sound/effects/wind" -#define FILE_DIR "sound/hallucinations" -#define FILE_DIR "sound/items" -#define FILE_DIR "sound/machines" -#define FILE_DIR "sound/mecha" -#define FILE_DIR "sound/misc" -#define FILE_DIR "sound/music" -#define FILE_DIR "sound/piano" -#define FILE_DIR "sound/turntable" -#define FILE_DIR "sound/violin" -#define FILE_DIR "sound/voice" -#define FILE_DIR "sound/voice/complionator" -#define FILE_DIR "sound/voice/Serithi" -#define FILE_DIR "sound/vox" -#define FILE_DIR "sound/vox_fem" -#define FILE_DIR "sound/weapons" // END_FILE_DIR // BEGIN_PREFERENCES #define DEBUG @@ -1528,7 +1455,6 @@ #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-Antidepressants.dm" #include "code\modules\reagents\Chemistry-Reagents.dm" #include "code\modules\reagents\Chemistry-Recipes.dm" #include "code\modules\reagents\dartgun.dm" @@ -1536,6 +1462,13 @@ #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\newchem\chem_heater.dm" +#include "code\modules\reagents\newchem\drugs.dm" +#include "code\modules\reagents\newchem\medicine.dm" +#include "code\modules\reagents\newchem\newchem_procs.dm" +#include "code\modules\reagents\newchem\other.dm" +#include "code\modules\reagents\newchem\pyro.dm" +#include "code\modules\reagents\newchem\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\dropper.dm" From 20afecd6509776bf1add57164bfd3c9595524410 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 24 Mar 2015 13:02:09 -0700 Subject: [PATCH 2/7] help this guy died of styptic pills worst coder 2015 --- code/modules/reagents/Chemistry-Machinery.dm | 20 ++++++++- code/modules/reagents/newchem/patch.dm | 17 ++++++++ code/modules/reagents/reagent_containers.dm | 12 +++++- .../reagents/reagent_containers/pill.dm | 40 +++++++----------- icons/obj/chemical.dmi | Bin 35708 -> 35957 bytes paradise.dme | 1 + 6 files changed, 63 insertions(+), 27 deletions(-) create mode 100644 code/modules/reagents/newchem/patch.dm diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index ef7dd044bd7..06f03537c98 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -19,7 +19,7 @@ var/hackedcheck = 0 var/list/dispensable_reagents = list("hydrogen","lithium","carbon","nitrogen","oxygen","fluorine", "sodium","aluminum","silicon","phosphorus","sulfur","chlorine","potassium","iron", - "copper","mercury","radium","water","ethanol","sugar","sacid","tungsten") + "copper","mercury","radium","water","ethanol","sugar","sacid","tungsten","iodine","bromine") var/list/hacked_reagents = list("plasma","toxin") var/hack_message = "You disable the safety safeguards, enabling the \"Mad Scientist\" mode." var/unhack_message = "You re-enable the safety safeguards, enabling the \"NT Standard\" mode." @@ -364,6 +364,7 @@ var/condi = 0 var/useramount = 30 // Last used amount var/pillamount = 10 + var/patchamount = 10 var/bottlesprite = "1" //yes, strings var/pillsprite = "1" var/client/has_sprites = list() @@ -566,6 +567,21 @@ P.name = "[name] pack" P.desc = "A small condiment pack. The label says it contains [name]." reagents.trans_to(P,10) + else if (href_list["createpatch"] || href_list["createpatch_multiple"]) + if(!condi) + var/count = 1 + if (href_list["createpatch_multiple"]) count = isgoodnumber(input("Select the number of patches to make.", 10, patchamount) as num) + if (count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines? + var/amount_per_patch = reagents.total_volume/count + if (amount_per_patch > 50) amount_per_patch = 50 + var/name = reject_bad_text(input(usr,"Name:","Name your patch!","[reagents.get_master_reagent_name()] ([amount_per_patch] units)")) + while (count--) + var/obj/item/weapon/reagent_containers/pill/patch/P = new/obj/item/weapon/reagent_containers/pill/patch(src.loc) + if(!name) name = reagents.get_master_reagent_name() + P.name = "[name] patch" + P.pixel_x = rand(-7, 7) //random position + P.pixel_y = rand(-7, 7) + reagents.trans_to(P,amount_per_patch) else if (href_list["createbottle"]) if(!condi) var/name = reject_bad_text(input(usr,"Name:","Name your bottle!",reagents.get_master_reagent_name())) @@ -663,6 +679,8 @@ if(!condi) dat += "

Create pill (50 units max)
" dat += "Create multiple pills
" + dat += "

Create patch (50 units max)
" + dat += "Create multiple patches
" dat += "Create bottle (30 units max)" else dat += "

Create pack (10 units max)
" diff --git a/code/modules/reagents/newchem/patch.dm b/code/modules/reagents/newchem/patch.dm new file mode 100644 index 00000000000..cba1cf6ee6d --- /dev/null +++ b/code/modules/reagents/newchem/patch.dm @@ -0,0 +1,17 @@ +/obj/item/weapon/reagent_containers/pill/patch + name = "chemical patch" + desc = "A chemical patch for touch based applications." + icon = 'icons/obj/chemical.dmi' + icon_state = "bandaid" + item_state = "bandaid" + possible_transfer_amounts = null + volume = 50 + apply_type = TOUCH + apply_method = "apply" + +/obj/item/weapon/reagent_containers/pill/patch/New() + ..() + icon_state = "bandaid" + +/obj/item/weapon/reagent_containers/pill/patch/afterattack(obj/target, mob/user , proximity) + return // thanks inheritance again \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 53ab223809a..f554e9acc4c 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -35,9 +35,19 @@ /obj/item/weapon/reagent_containers/process() if(reagents) reagents.reagent_on_tick() - ..() return +/obj/item/weapon/reagent_containers/ex_act() + if(reagents) + for(var/datum/reagent/R in reagents.reagent_list) + R.on_ex_act() + ..() + +/obj/item/weapon/reagent_containers/fire_act() + reagents.chem_temp += 30 + reagents.handle_reactions() + ..() + /obj/item/weapon/reagent_containers/attack_self(mob/user as mob) return diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 5f4bdc09166..1545683f537 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -9,6 +9,8 @@ item_state = "pill" possible_transfer_amounts = null volume = 50 + var/apply_type = INGEST + var/apply_method = "swallow" New() ..() @@ -19,39 +21,27 @@ return attack(mob/M as mob, mob/user as mob, def_zone) if(M == user) - - if(istype(M, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - H << "\red You have a monitor for a head, where do you think you're going to put that?" - return - - M << "\blue You swallow [src]." + M << "\blue You [apply_type] [src]." M.unEquip(src) //icon update if(reagents.total_volume) - reagents.reaction(M, INGEST) + reagents.reaction(M, apply_type) spawn(5) - reagents.trans_to_ingest(M, reagents.total_volume) - del(src) + reagents.trans_to(M, reagents.total_volume) + qdel(src) else - del(src) + qdel(src) return 1 else if(istype(M, /mob/living/carbon/human) ) - var/mob/living/carbon/human/H = M - if(H.species.flags & IS_SYNTHETIC) - H << "\red They have a monitor for a head, where do you think you're going to put that?" - return - for(var/mob/O in viewers(world.view, user)) - O.show_message("\red [user] attempts to force [M] to swallow [src].", 1) + O.show_message("\red [user] attempts to force [M] to [apply_method] [src].", 1) if(!do_mob(user, M)) return user.unEquip(src) //icon update for(var/mob/O in viewers(world.view, user)) - O.show_message("\red [user] forces [M] to swallow [src].", 1) + O.show_message("\red [user] forces [M] to [apply_method] [src].", 1) M.attack_log += text("\[[time_stamp()]\] Has been fed [src.name] by [user.name] ([user.ckey]) Reagents: [reagentlist(src)]") user.attack_log += text("\[[time_stamp()]\] Fed [M.name] by [M.name] ([M.ckey]) Reagents: [reagentlist(src)]") @@ -63,12 +53,12 @@ M.LAssailant = user if(reagents.total_volume) - reagents.reaction(M, INGEST) + reagents.reaction(M, apply_type) spawn(5) reagents.trans_to_ingest(M, reagents.total_volume) - del(src) + qdel(src) else - del(src) + qdel(src) return 1 @@ -79,7 +69,7 @@ if(target.is_open_container() != 0 && target.reagents) if(!target.reagents.total_volume) - user << "\red [target] is empty. Cant dissolve pill." + user << "\red [target] is empty. Cant dissolve [src]." return // /vg/: Logging transfers of bad things @@ -93,12 +83,12 @@ message_admins("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].[hl] (JMP)") log_game("[user.name] ([user.ckey]) added [reagents.get_reagent_ids(1)] to \a [target] with [src].") - user << "\blue You dissolve the pill in [target]" + user << "\blue You dissolve [src] in [target]" reagents.trans_to(target, reagents.total_volume) for(var/mob/O in viewers(2, user)) O.show_message("\red [user] puts something in [target].", 1) spawn(5) - del(src) + qdel(src) return diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 584ee26023e1de0abd06efc022c67b77225826a6..a639e4bf6233b9e22098914e3f1f8493f42edfee 100644 GIT binary patch delta 17505 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 R0)T$h9zA{dQ_;l#{{uspBH{o5 delta 17231 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 diff --git a/paradise.dme b/paradise.dme index 06224d8e1af..e248dd782e5 100644 --- a/paradise.dme +++ b/paradise.dme @@ -1467,6 +1467,7 @@ #include "code\modules\reagents\newchem\medicine.dm" #include "code\modules\reagents\newchem\newchem_procs.dm" #include "code\modules\reagents\newchem\other.dm" +#include "code\modules\reagents\newchem\patch.dm" #include "code\modules\reagents\newchem\pyro.dm" #include "code\modules\reagents\newchem\toxins.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" From ae2240f51356fa4d7266d1308ee1de94422fec1a Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 24 Mar 2015 14:03:40 -0700 Subject: [PATCH 3/7] fuck shit goddamn salglu --- code/modules/reagents/newchem/medicine.dm | 26 +++++++++---------- .../modules/reagents/newchem/newchem_procs.dm | 2 +- code/modules/reagents/newchem/toxins.dm | 6 ++--- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/code/modules/reagents/newchem/medicine.dm b/code/modules/reagents/newchem/medicine.dm index 348ca65f073..3dfc173651b 100644 --- a/code/modules/reagents/newchem/medicine.dm +++ b/code/modules/reagents/newchem/medicine.dm @@ -71,8 +71,8 @@ datum/reagent/salglu_solution 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) + M.adjustBruteLoss(-2*REM) + M.adjustFireLoss(-2*REM) ..() return @@ -234,7 +234,8 @@ 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(70)) + M.adjustToxLoss(-4*REM) if(prob(33)) M.adjustBruteLoss(1*REM) if(M.radiation < 0) @@ -486,19 +487,16 @@ datum/reagent/morphine/addiction_act_stage4(var/mob/living/M as mob) 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 + M.eye_blurry = max(M.eye_blurry-5 , 0) + M.eye_blind = max(M.eye_blind-5 , 0) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/datum/organ/internal/eyes/E = H.internal_organs_by_name["eyes"] + if(istype(E)) + if(E.damage > 0) + E.damage -= 1 ..() return - /datum/chemical_reaction/oculine name = "Oculine" id = "oculine" diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index 3a627e16b87..a061f2c3ffe 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -5,7 +5,7 @@ datum/reagent var/overdosed = 0 // You fucked up and this is now triggering it's overdose effects, purge that shit quick. var/current_cycle = 0 datum/reagents - var/chem_temp = 150 + var/chem_temp = 300 var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm index 0c9901e71d7..e8b26c70533 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/newchem/toxins.dm @@ -103,9 +103,9 @@ datum/reagent/neurotoxin2 datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob) cycle_count++ - if(M.brainloss + M.toxloss <= 60) + if(M.brainloss < 60) M.adjustBrainLoss(1*REM) - M.adjustToxLoss(1*REM) + M.adjustToxLoss(1*REM) if(cycle_count == 17) M.sleeping += 10 // buffed so it works ..() @@ -249,7 +249,7 @@ datum/reagent/pancuronium 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) + M.Weaken(3) if(prob(7)) M.losebreath += rand(3,5) ..() From f5f172652e41e9654dd73450762fb24ef75d2612 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 24 Mar 2015 17:58:10 -0700 Subject: [PATCH 4/7] snowflake code makes me *scream --- code/game/objects/items/devices/scanners.dm | 25 ++++++++++++++----- code/modules/reagents/Chemistry-Reagents.dm | 19 ++------------ .../modules/reagents/newchem/newchem_procs.dm | 3 --- 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index ada6dcfce83..d6446c64134 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -92,6 +92,23 @@ REAGENT SCANNER M.invisibility = INVISIBILITY_LEVEL_TWO +/proc/chemscan(var/mob/living/user, var/mob/living/M) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.reagents) + if(H.reagents.reagent_list.len) + user.show_message("Subject contains the following reagents:") + for(var/datum/reagent/R in H.reagents.reagent_list) + user.show_message("[R.volume]u of [R.name][R.overdosed == 1 ? " - OVERDOSING" : ".
"]") + else + user.show_message("Subject contains no reagents.") + if(H.reagents.addiction_list.len) + user.show_message("Subject is addicted to the following reagents:") + for(var/datum/reagent/R in H.reagents.addiction_list) + user.show_message("[R.name]") + else + user.show_message("Subject is not addicted to any reagents.") + /obj/item/device/healthanalyzer name = "Health Analyzer" icon_state = "health" @@ -172,12 +189,8 @@ REAGENT SCANNER OX = fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal" user.show_message("[OX] | [TX] | [BU] | [BR]") if (istype(M, /mob/living/carbon)) - if(M:reagents.total_volume > 0 && upgraded) - user.show_message("\blue Reagents detected in subject's blood:") - for(var/A in M.reagents.reagent_list) - var/datum/reagent/R = A - user.show_message("\t \blue [M.reagents.get_reagent_amount(R.id)]u [R.name]") - if(M:virus2.len) + chemscan(user, M) + if(M:virus2.len) // WHAT IS TYPECASTING var/mob/living/carbon/C = M for (var/ID in C.virus2) if (ID in virusDB) diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index bd7e7b9fba6..e1fc9891302 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -22,7 +22,6 @@ datum var/volume = 0 var/nutriment_factor = 0 var/metabolization_rate = REAGENTS_METABOLISM - var/scannable = 1 //shows up on health analyzers //var/list/viruses = list() var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!) @@ -89,6 +88,7 @@ datum return //Noticed runtime errors from pacid trying to damage ghosts, this should fix. --NEO // Certain elements in too large amounts cause side-effects holder.remove_reagent(src.id, metabolization_rate) //By default it slowly disappears. + current_cycle++ return // Called when two reagents of the same are mixing. @@ -1035,14 +1035,9 @@ datum description = "Most probably know this as Tylenol, but this chemical is a mild, simple painkiller." reagent_state = LIQUID color = "#C855DC" -<<<<<<< HEAD - scannable = 1 metabolization_rate = 0.2 // Lasts 2.5 minutes for 15 units -======= - custom_metabolism = 0.2 // Lasts 2.5 minutes for 15 units ->>>>>>> 8c265bf6aac1e630b2627439f8a95d5e2d917aab - on_mob_life(var/mob/living/M as mob) + on_mob_life(var/mob/living/M as mob) // what the fuck are you idiots smoking if(!M) M = holder.my_atom ..() return @@ -1080,12 +1075,7 @@ datum description = "A simple, yet effective painkiller." reagent_state = LIQUID color = "#C8A5DC" -<<<<<<< HEAD - scannable = 1 metabolization_rate = 0.2 // Lasts 2.5 minutes for 15 units -======= - custom_metabolism = 0.2 // Lasts 2.5 minutes for 15 units ->>>>>>> 8c265bf6aac1e630b2627439f8a95d5e2d917aab on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom @@ -1099,12 +1089,7 @@ datum description = "An effective and very addictive painkiller." reagent_state = LIQUID color = "#C805DC" -<<<<<<< HEAD metabolization_rate = 0.3 // Lasts 1.5 minutes for 15 units - scannable = 1 -======= - custom_metabolism = 0.3 // Lasts 1.5 minutes for 15 units ->>>>>>> 8c265bf6aac1e630b2627439f8a95d5e2d917aab on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index a061f2c3ffe..9ed35668e76 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -9,9 +9,6 @@ datum/reagents var/addiction_tick = 1 var/list/datum/reagent/addiction_list = new/list() -datum/reagent/on_mob_life() - current_cycle++ - datum/reagents/proc/metabolize(var/mob/M) if(M) chem_temp = M.bodytemperature From 44d9ef204e223ef8a4c326cfe64b74d7367f93c4 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 24 Mar 2015 17:59:07 -0700 Subject: [PATCH 5/7] snowflake code makes me *scream V2 --- code/game/objects/items/devices/scanners.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index d6446c64134..c6fdcc0a701 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -103,7 +103,7 @@ REAGENT SCANNER else user.show_message("Subject contains no reagents.") if(H.reagents.addiction_list.len) - user.show_message("Subject is addicted to the following reagents:") + user.show_message("Subject is addicted to the following reagents:") for(var/datum/reagent/R in H.reagents.addiction_list) user.show_message("[R.name]") else From 015c9d4a11db469d611e3052078ac5fc4b7c7247 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 24 Mar 2015 18:20:50 -0700 Subject: [PATCH 6/7] muh spans --- code/game/objects/items/devices/scanners.dm | 2 +- code/modules/reagents/newchem/newchem_procs.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index c6fdcc0a701..f59c368a0b2 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -103,7 +103,7 @@ REAGENT SCANNER else user.show_message("Subject contains no reagents.") if(H.reagents.addiction_list.len) - user.show_message("Subject is addicted to the following reagents:") + user.show_message("Subject is addicted to the following reagents:") for(var/datum/reagent/R in H.reagents.addiction_list) user.show_message("[R.name]") else diff --git a/code/modules/reagents/newchem/newchem_procs.dm b/code/modules/reagents/newchem/newchem_procs.dm index 9ed35668e76..47bde2059b2 100644 --- a/code/modules/reagents/newchem/newchem_procs.dm +++ b/code/modules/reagents/newchem/newchem_procs.dm @@ -113,7 +113,7 @@ datum/reagent/proc/addiction_act_stage3(var/mob/living/M as mob) 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]." + M << "You're not feeling good at all! You really need some [name]." return /datum/reagent/proc/reagent_deleted() From 617f2b8aec43549bf87fb20aed5c7bd4c42fef13 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 24 Mar 2015 18:44:39 -0700 Subject: [PATCH 7/7] guys, the medical analyzer upgrade, go get it --- code/game/objects/items/devices/scanners.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index f59c368a0b2..b40efbb0ffc 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -189,7 +189,8 @@ REAGENT SCANNER OX = fake_oxy > 50 ? "\red Severe oxygen deprivation detected\blue" : "Subject bloodstream oxygen level normal" user.show_message("[OX] | [TX] | [BU] | [BR]") if (istype(M, /mob/living/carbon)) - chemscan(user, M) + if(upgraded) + chemscan(user, M) if(M:virus2.len) // WHAT IS TYPECASTING var/mob/living/carbon/C = M for (var/ID in C.virus2)