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"