Merge pull request #6137 from Iamgoofball/byond

Goon Chemistry [FINISHED]
This commit is contained in:
tkdrg
2015-01-14 02:31:56 -03:00
25 changed files with 1146 additions and 38 deletions
@@ -128,8 +128,7 @@
/obj/item/weapon/reagent_containers/food/snacks/badrecipe/New()
..()
eatverb = pick("choke down","nibble","gnaw","chomp")
reagents.add_reagent("toxin", 1)
reagents.add_reagent("carbon", 3)
reagents.add_reagent("????", 30)
bitesize = 2
/obj/item/weapon/reagent_containers/food/snacks/spacylibertyduff
@@ -254,4 +253,4 @@
..()
reagents.add_reagent("nutriment", 4)
reagents.add_reagent("sugar", 2)
reagents.add_reagent("coco", 2)
reagents.add_reagent("coco", 2)
@@ -0,0 +1,100 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
datum/reagent/nicotine
name = "Nicotine"
id = "nicotine"
description = "Stun reduction per cycle, slight stamina regeneration buff. Overdoses become rapidly deadly."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
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 << "<span class='notice'>[smoke_message]</span>"
M.AdjustStunned(-1)
M.adjustStaminaLoss(-1*REM)
if(volume > 35)
M << "You feel like you smoked too much."
M.adjustToxLoss(2*REM)
M.adjustOxyLoss(2*REM)
..()
return
datum/reagent/crank
name = "Crank"
id = "crank"
description = "2x stun reduction per cycle. Warms you up, makes you jittery as hell."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
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 << "<span class='notice'>[high_message]</span>"
M.AdjustParalysis(-2)
M.AdjustStunned(-2)
M.AdjustWeakened(-2)
if(volume > 20)
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, occasional BRAIN and TOX damage."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
var/cycle_count = 0
var/overdosed
/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 << "<span class='notice'>[high_message]</span>"
if(prob(10))
M.adjustBrainLoss(rand(1,5)*REM)
M.adjustToxLoss(rand(1,5)*REM)
if(cycle_count == 10)
M.adjustBrainLoss(rand(1,10)*REM)
M.adjustToxLoss(rand(1,10)*REM)
if(cycle_count == 20)
M << "<span class='danger'>Your skin feels loose...</span>"
if(cycle_count == 50)
M << "<span class='userdanger'>Your skin falls off!</span>"
M.adjustBruteLoss(rand(10,30)*REM)
hardset_dna(M, null, null, null, null, /datum/species/skeleton)
if(volume > 20)
overdosed = 1
if(overdosed)
cycle_count++
..()
return
/datum/chemical_reaction/krokodil
name = "Krokodil"
id = "krokodil"
result = "krokodil"
required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1, "potassium" = 1, "phosphorous" = 1, "fuel" = 1)
result_amount = 6
mix_message = "The mixture dries into a pale blue powder."
required_temp = 380
@@ -0,0 +1,381 @@
#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 = "100% chance per cycle of healing 2 points of BURN damage."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 2
datum/reagent/silver_sulfadiazine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
M.adjustFireLoss((volume-(volume*2))*REM)
M << "<span class='notice'>You feel your burns healing!</span>"
M.emote("scream")
if(method == INGEST)
M.adjustToxLoss(0.5*volume)
M << "<span class='notice'>You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?</span>"
..()
return
datum/reagent/silver_sulfadiazine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(prob(55))
M.adjustFireLoss(-2*REM)
..()
return
datum/reagent/styptic_powder
name = "Styptic Powder"
id = "styptic_powder"
description = "100% chance per cycle of healing 2 points of BRUTE damage."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 2
datum/reagent/styptic_powder/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
M.heal_organ_damage(volume*REM,0)
M << "<span class='notice'>You feel your wounds knitting back together!</span>"
M.emote("scream")
if(method == INGEST)
M.adjustToxLoss(0.5*volume)
M << "<span class='notice'>You probably shouldn't have eaten that. Maybe you should of splashed it on, or applied a patch?</span>"
..()
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(-2*REM)
..()
return
datum/reagent/salglu_solution
name = "Saline-Glucose Solution"
id = "salglu_solution"
description = "100% chance per cycle of healing 1 point each of OXY and TOX damage."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/salglu_solution/on_mob_life(var/mob/living/M as mob)
if(M.stat == DEAD)
return
if(!M) M = holder.my_atom
if(M.getOxyLoss()) M.adjustOxyLoss(-1*REM)
if(M.getToxLoss()) M.adjustToxLoss(-1*REM)
..()
return
datum/reagent/synthflesh
name = "Synthflesh"
id = "synthflesh"
description = "100% chance per cycle of healing 1 point each of BRUTE and BURN damage."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/synthflesh/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!M) M = holder.my_atom
if(method == TOUCH)
M.heal_organ_damage(volume*REM,0)
M.adjustFireLoss((volume-(volume*2)*REM))
M << "<span class='notice'>You feel your burns healing and your flesh knitting together!</span>"
..()
return
datum/reagent/charcoal
name = "Charcoal"
id = "charcoal"
description = "Heals 2 TOX damage per cycle."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/charcoal/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.adjustToxLoss(-1.5*REM)
for(var/datum/reagent/R in M.reagents)
if(M != src)
M.reagents.remove_reagent(R.id,0.5)
..()
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 one each of OXY, TOX, BRUTE and BURN per cycle."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 0.2
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/calomel
name = "Calomel"
id = "calomel"
description = "Increases all depletion rates by 5. +5 TOX damage while health > 20."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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)
if(M != 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 = "80% chance of removing 1 RAD. Radiation is cumulative and causes tox+burn."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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 7 RAD, heals 4 TOX damage, increases all depletion rates by 4. 33% chance of taking 1 unit brute damage"
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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)
if(M != 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 BRUTE damage is under 50, 50% chance to heal one unit."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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/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 = "Heals 6 OXY damage, reduces LOSEBREATH by 4."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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 25 OXY damage, but you can't talk. 33% chance of healing 1 BRUTE and 1 BURN."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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 = "Stun reduction per cycle, increases run speed slightly, minor stamina regeneration buff, stabilizes crit."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 0.3
datum/reagent/ephedrine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.status_flags |= GOTTAGOFAST
if(M.losebreath >= 10)
M.losebreath = max(10, M.losebreath-5)
M.AdjustParalysis(-1)
M.AdjustStunned(-1)
M.AdjustWeakened(-1)
M.adjustStaminaLoss(-1*REM)
..()
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 = "Causes a little bit of drowsiness, reduces jitteriness. Raises histamine depletion rates by 3"
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
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 = "Dramatically counters movement reduction from severe injury. Reduces jitteriness if someone is shaking like crazy from whatever. Will knock you out within 36 cycles if any remains in you."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
var/cycle_count = 0
datum/reagent/morphine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
M.status_flags |= GOTTAGOFAST
if(cycle_count == 36)
M.sleeping += 1
if(volume > 20)
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
cycle_count++
..()
return
@@ -0,0 +1,104 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
datum/reagent/oil
name = "Oil"
id = "oil"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/stable_plasma
name = "Stable Plasma"
id = "stable_plasma"
description = "Non-flammable plasma locked into a liquid form that cannot ignite or become gaseous/solid."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/iodine
name = "Iodine"
id = "iodine"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/fluorine
name = "Fluorine"
id = "fluorine"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/carpet
name = "Carpet"
id = "carpet"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/bromine
name = "Bromine"
id = "bromine"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/phenol
name = "Phenol"
id = "phenol"
description = "A slippery solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/ash
name = "Ash"
id = "ash"
description = "A burnt solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
datum/reagent/acetone
name = "Acetone"
id = "acetone"
description = "A solution."
reagent_state = LIQUID
color = "#C8A5DC" // rgb: 200, 165, 220
/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
@@ -0,0 +1,119 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
/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 = "#60A584" // rgb: 96, 165, 132
/datum/reagent/clf3/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
..()
return
/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/chemical_reaction/clf3/on_reaction(var/datum/reagents/holder, var/created_volume)
var/turf/simulated/T = get_turf(holder.my_atom)
for(var/turf/simulated/turf in orange(1,T))
new /obj/effect/hotspot(turf)
return
/datum/reagent/clf3/reaction_turf(var/turf/simulated/T, var/volume)
if(istype(T, /turf/simulated/floor/))
var/turf/simulated/floor/F = T
if(prob(66))
F.make_plating()
if(prob(11))
F.ChangeTurf(/turf/space)
return
/datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return
if(method == TOUCH)
M.adjust_fire_stacks(20)
return
/datum/reagent/sorium
name = "Sorium"
id = "sorium"
description = "Sends everything flying from the detonation point."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
/datum/chemical_reaction/sorium
name = "Sorium"
id = "sorium"
result = "sorium"
required_reagents = list("mercury" = 1, "oxygen" = 1, "nitrogen" = 1, "carbon" = 1)
result_amount = 4
required_temp = 474
/datum/reagent/sorium/reaction_turf(var/turf/simulated/T, var/volume)
if(istype(T, /turf/simulated/floor/))
goonchem_vortex(T, 1, 5, 3)
/datum/reagent/sorium/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return
if(method == TOUCH)
var/turf/simulated/T = get_turf(M)
goonchem_vortex(T, 1, 5, 3)
/datum/chemical_reaction/sorium/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/reagent/liquid_dark_matter
name = "Liquid Dark Matter"
id = "liquid_dark_matter"
description = "Sucks everything into the detonation point."
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
/datum/chemical_reaction/liquid_dark_matter
name = "Liquid Dark Matter"
id = "liquid_dark_matter"
result = "liquid_dark_matter"
required_reagents = list("stable_plasma" = 1, "radium" = 1, "carbon" = 1)
result_amount = 3
required_temp = 474
/datum/reagent/liquid_dark_matter/reaction_turf(var/turf/simulated/T, var/volume)
if(istype(T, /turf/simulated/floor/))
goonchem_vortex(T, 0, 5, 3)
return
/datum/reagent/liquid_dark_matter/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(!istype(M, /mob/living))
return
if(method == TOUCH)
var/turf/simulated/T = get_turf(M)
goonchem_vortex(T, 0, 5, 3)
return
/datum/chemical_reaction/liquid_dark_matter/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
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, /atom/movable))
if((X))
if(setting_type)
for(var/i = 0, i < pull_times, i++)
step_towards(X,T)
else
X.throw_at(T)
@@ -0,0 +1,34 @@
/*
Credit goes to Cogwerks, and all the other goonstation coders
for the original idea and implementation of this over at goonstation.
THE REQUESTED DON'T PORT LIST: IF YOU PORT THESE THE GOONS WILL MURDER US IN OUR SLEEP SO PLEASE DON'T KTHX - Iamgoofball
Any of the Secret Chems
Goon in-joke chems (Eg. Cat Drugs, Hairgrownium)
Liquid Electricity
Rajajajah
/datum/reagent/blankgoonchembase
name = "blank goonchem base"
id = "blankgoonchembase"
description = "A blank chem"
reagent_state = LIQUID
color = "#60A584" // rgb: 96, 165, 132
/datum/reagent/blankgoonchembase/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
..()
return
/datum/chemical_reaction/blankgoonchembase
name = "blank goonchem base"
id = "blankgoonchembase"
result = "blankgoonchembase"
required_reagents = list("diphenhydramine" = 1, "morphine" = 1, "cleaner" = 1)
result_amount = 3
mix_message = "The mixture dries into a pale blue powder."
required_temp = 420
*/
@@ -0,0 +1,159 @@
#define SOLID 1
#define LIQUID 2
#define GAS 3
#define REM REAGENTS_EFFECT_MULTIPLIER
datum/reagent/polonium
name = "Polonium"
id = "polonium"
description = "+8 RAD."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
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 = "Dose-dependent, ranges from annoying to incredibly lethal."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
metabolization_rate = 0.2
datum/reagent/histamine/on_mob_life(var/mob/living/M as mob)
if(!M) M = holder.my_atom
if(volume >= 20)
M.adjustOxyLoss(pick(5,10)*REM)
M.adjustBruteLoss(pick(5,10)*REM)
M.adjustToxLoss(pick(5,10)*REM)
if(volume < 20)
switch(pick(1, 2, 3))
if(1)
M << "<span class='danger'>You are unable to look straight!</span>"
M.Dizzy(10)
if(2)
M.emote("cough")
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
if(3)
M.adjustBruteLoss(5*REM)
..()
return
datum/reagent/formaldehyde
name = "Formaldehyde"
id = "formaldehyde"
description = "+1 TOX, 10% chance to decay into 5-15 units of histamine."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
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 = "Scaling TOX and BRUTE damage with dose. 25% chance to decay into 5-10 histamine."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
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 = "+1 TOX, +1 BRAIN up to 60 before it slows down, confusion, knockout after 17 elapsed cycles."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
var/cycle_count = 0
metabolization_rate = 1
datum/reagent/neurotoxin2/on_mob_life(var/mob/living/M as mob)
cycle_count++
if(!M) M = holder.my_atom
if(!(M.brainloss + M.toxloss) >= 60)
M.adjustBrainLoss(1*REM)
M.adjustToxLoss(1*REM)
if(cycle_count == 17)
M.sleeping += 1
..()
return
/datum/chemical_reaction/neurotoxin2
name = "neurotoxin2"
id = "neurotoxin2"
result = "neurotoxin2"
required_reagents = list("space_drugs" = 1)
result_amount = 1
required_temp = 200
datum/reagent/cyanide
name = "Cyanide"
id = "cyanide"
description = "+1.5 TOX, 10% chance of +1 LOSEBREATH, 8% chance of stun and extra +2 TOX."
reagent_state = LIQUID
color = "#CF3600" // rgb: 207, 54, 0
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.adjustOxyLoss(1*REM)
if(prob(8))
M.sleeping += 1
M.adjustToxLoss(4*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" // rgb: 207, 54, 0
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
+6 -3
View File
@@ -10,6 +10,7 @@ datum/reagents
var/total_volume = 0
var/maximum_volume = 100
var/atom/my_atom = null
var/chem_temp = 150
datum/reagents/New(maximum=100)
maximum_volume = maximum
@@ -232,6 +233,7 @@ datum/reagents/proc/handle_reactions()
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
@@ -259,10 +261,11 @@ datum/reagents/proc/handle_reactions()
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)
for(var/B in C.required_reagents)
remove_reagent(B, (multiplier * C.required_reagents[B]), safety = 1)
@@ -277,7 +280,7 @@ datum/reagents/proc/handle_reactions()
if(!istype(my_atom, /mob)) // No bubbling mobs
for(var/mob/M in seen)
M << "<span class='notice'>\icon[my_atom] The solution begins to bubble.</span>"
M << "<span class='notice'>\icon[my_atom] [C.mix_message]</span>"
if(istype(my_atom, /obj/item/slime_extract))
var/obj/item/slime_extract/ME2 = my_atom
+85 -5
View File
@@ -11,16 +11,16 @@
icon_state = "dispenser"
use_power = 1
idle_power_usage = 40
var/energy = 50
var/max_energy = 50
var/energy = 100
var/max_energy = 100
var/amount = 30
var/beaker = null
var/recharged = 0
var/recharge_delay = 15 //Time it game ticks between recharges
var/recharge_delay = 5 //Time it game ticks between recharges
var/image/icon_beaker = null //cached overlay
var/list/dispensable_reagents = list("hydrogen","lithium","carbon","nitrogen","oxygen","fluorine",
"sodium","aluminium","silicon","phosphorus","sulfur","chlorine","potassium","iron",
"copper","mercury","radium","water","ethanol","sugar","sacid")
"copper","mercury","radium","water","ethanol","sugar","sacid","fuel","silver","iodine","bromine","fluorine","stable_plasma")
/obj/machinery/chem_dispenser/proc/recharge()
if(stat & (BROKEN|NOPOWER)) return
@@ -108,7 +108,7 @@
if (!ui)
// the ui does not exist, so we'll create a new() one
// for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm
ui = new(user, src, ui_key, "chem_dispenser.tmpl", "Chem Dispenser 5000", 390, 610)
ui = new(user, src, ui_key, "chem_dispenser.tmpl", "Chem Dispenser 5000", 490, 710)
// when the ui is first opened this is the data it will use
ui.set_initial_data(data)
// open the new ui window
@@ -276,6 +276,7 @@
spawn(rand(0, 15))
stat |= NOPOWER
/obj/machinery/chem_master/attackby(var/obj/item/weapon/B as obj, var/mob/user as mob)
if(default_unfasten_wrench(user, B))
@@ -422,6 +423,23 @@
else
var/obj/item/weapon/reagent_containers/food/condiment/P = new/obj/item/weapon/reagent_containers/food/condiment(src.loc)
reagents.trans_to(P,50)
else if(href_list["createpatch"])
if(reagents.total_volume == 0) return
var/amount = 1
var/vol_each = min(reagents.total_volume, 50)
if(text2num(href_list["many"]))
amount = min(max(round(input(usr, "Amount:", "How many patches?") as num), 1), 10)
vol_each = min(reagents.total_volume/amount, 50)
var/name = reject_bad_text(input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)"))
var/obj/item/weapon/reagent_containers/pill/P
for(var/i = 0; i < amount; i++)
P = new/obj/item/weapon/reagent_containers/pill/patch(src.loc)
if(!name) name = reagents.get_master_reagent_name()
P.name = "[name] patch"
P.pixel_x = rand(-7, 7) //random position
P.pixel_y = rand(-7, 7)
reagents.trans_to(P,vol_each)
src.updateUsrDialog()
return
@@ -479,6 +497,8 @@
if(!condi)
dat += "<HR><BR><A href='?src=\ref[src];createpill=1;many=0'>Create pill (50 units max)</A><BR>"
dat += "<A href='?src=\ref[src];createpill=1;many=1'>Create pills (10 pills max)</A><BR><BR>"
dat += "<HR><BR><A href='?src=\ref[src];createpatch=1;many=0'>Create patch (50 units max)</A><BR>"
dat += "<A href='?src=\ref[src];createpatch=1;many=1'>Create patches (10 patches max)</A><BR><BR>"
dat += "<A href='?src=\ref[src];createbottle=1'>Create bottle (30 units max)</A>"
else
dat += "<HR><BR><A href='?src=\ref[src];createpill=1'>Create pack (10 units max)</A><BR>"
@@ -1238,3 +1258,63 @@ obj/machinery/computer/pandemic/proc/replicator_cooldown(var/waittime)
O.reagents.trans_to(beaker, amount)
if(!O.reagents.total_volume)
remove_object(O)
/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/energy = 50
var/max_energy = 50
var/amount = 30
var/obj/item/weapon/reagent_containers/beaker = null
var/set_temp
var/temperature
var/on = FALSE
/obj/machinery/chem_heater/process()
..()
if(on)
if(beaker)
if(beaker.reagents.chem_temp > temperature)
beaker.reagents.chem_temp -= 2
if(beaker.reagents.chem_temp < temperature)
beaker.reagents.chem_temp += 2
if(beaker.reagents.chem_temp == temperature)
beaker.loc = get_turf(src)
beaker.reagents.handle_reactions()
beaker = null
icon_state = "mixer0b"
on = FALSE
/obj/machinery/chem_heater/attackby(var/obj/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob)
if(isrobot(user))
return
if(!istype(B, /obj/item/weapon/reagent_containers/glass))
return
if(src.beaker)
user << "A beaker is already loaded into the machine."
return
src.beaker = B
user.drop_item()
B.loc = src
user << "You add the beaker to the machine!"
icon_state = "mixer1b"
/obj/machinery/chem_heater/attack_hand(var/mob/user as mob)
if(!beaker)
user << "Please insert a beaker."
return
temperature = input("Please input desired temperature between 1 and 3000.", name, set_temp) as num
if(temperature > 3000 || temperature < 1)
user << "Invalid temperature."
return
user << "Adjusting chemical temperature..."
on = TRUE
@@ -23,6 +23,7 @@ datum/reagent
//var/list/viruses = list()
var/color = "#000000" // rgb: 0, 0, 0 (does not support alpha channels - yet!)
var/metabolization_rate = REAGENTS_METABOLISM
var/overrides_metab = 0
datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume) //By default we have a chance to transfer some
if(!istype(M, /mob/living))
@@ -121,19 +121,6 @@ datum/reagent/toxin/slimejelly/on_mob_life(var/mob/living/M as mob)
..()
return
datum/reagent/toxin/cyanide
name = "Cyanide"
id = "cyanide"
description = "A highly toxic chemical."
color = "#CF3600" // rgb: 207, 54, 0
toxpwr = 3
datum/reagent/toxin/cyanide/on_mob_life(var/mob/living/M as mob)
M.adjustOxyLoss(3*REM)
M.sleeping += 1
..()
return
datum/reagent/toxin/minttoxin
name = "Mint Toxin"
id = "minttoxin"
@@ -14,6 +14,9 @@
var/secondary = 0 // set to nonzero if secondary reaction
var/mob_react = 0 //Determines if a chemical reaction can occur inside a mob
var/required_temp = 0
var/mix_message = "The solution begins to bubble."
/datum/chemical_reaction/proc/on_reaction(var/datum/reagents/holder, var/created_volume)
return
@@ -12,6 +12,7 @@
can_be_placed_into = list(
/obj/machinery/chem_master/,
/obj/machinery/chem_dispenser/,
/obj/machinery/chem_heater/,
/obj/machinery/reagentgrinder,
/obj/machinery/biogenerator,
/obj/structure/table,
@@ -48,6 +48,13 @@
icon_state = "bottle20"
spawned_reagent = "stoxin"
/obj/item/weapon/reagent_containers/glass/bottle/morphine
name = "morphine bottle"
desc = "A small bottle of morphine."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle20"
spawned_reagent = "morphine"
/obj/item/weapon/reagent_containers/glass/bottle/chloralhydrate
name = "Chloral Hydrate Bottle"
desc = "A small bottle of Choral Hydrate. Mickey's Favorite!"
@@ -195,6 +202,59 @@
icon_state = "bottle3"
spawned_disease = /datum/disease/anxiety
/obj/item/weapon/reagent_containers/glass/bottle/traitor
name = "syndicate bottle"
desc = "A small bottle. Contains a random nasty chemical."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
/obj/item/weapon/reagent_containers/glass/bottle/traitor/New()
..()
var/new_reagent = pick("polonium", "histamine", "formaldehyde", "venom", "neurotoxin2", "cyanide")
reagents.add_reagent(new_reagent, 50)
/obj/item/weapon/reagent_containers/glass/bottle/polonium
name = "polonium bottle"
desc = "A small bottle. Contains Polonium."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "polonium"
/obj/item/weapon/reagent_containers/glass/bottle/venom
name = "venom bottle"
desc = "A small bottle. Contains Venom."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "venom"
/obj/item/weapon/reagent_containers/glass/bottle/neurotoxin2
name = "neurotoxin bottle"
desc = "A small bottle. Contains Neurotoxin."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "neurotoxin2"
/obj/item/weapon/reagent_containers/glass/bottle/formaldehyde
name = "formaldehyde bottle"
desc = "A small bottle. Contains Formaldehyde."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "formaldehyde"
/obj/item/weapon/reagent_containers/glass/bottle/cyanide
name = "cyanide bottle"
desc = "A small bottle. Contains Cyanide."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "cyanide"
/obj/item/weapon/reagent_containers/glass/bottle/histamine
name = "histamine bottle"
desc = "A small bottle. Contains Histamine."
icon = 'icons/obj/chemical.dmi'
icon_state = "bottle16"
spawned_reagent = "histamine"
/obj/item/weapon/reagent_containers/glass/bottle/beesease
name = "Beesease culture bottle"
desc = "A small bottle. Contains a sample of invasive Apidae."
@@ -69,10 +69,12 @@
volume = 10
ignore_flags = 1 //so you can medipen through hardsuits
flags = null
var/starting_reagent = "inaprovaline"
var/starting_amount = 10
/obj/item/weapon/reagent_containers/hypospray/medipen/New()
..()
reagents.add_reagent("inaprovaline", 10)
reagents.add_reagent(starting_reagent, starting_amount)
update_icon()
return
@@ -100,11 +102,11 @@
name = "leporazine medipen"
desc = "A rapid way to regulate your body's temperature in the event of a hardsuit malfunction at the cost of some shortness of breath."
icon_state = "lepopen"
starting_reagent = "leporazine"
starting_amount = 9
/obj/item/weapon/reagent_containers/hypospray/medipen/leporazine/New()
..()
reagents.remove_reagent("inaprovaline", 10)
reagents.add_reagent("leporazine", 9)
reagents.add_reagent("lexorin", 1)
update_icon()
return
@@ -113,11 +115,23 @@
name = "stimpack medipen"
desc = "A rapid way to stimulate your body's adrenaline, allowing for freer movement in restrictive armor at the cost of some shortness of breath."
icon_state = "stimpen"
starting_reagent = "hyperzine"
starting_amount = 9
/obj/item/weapon/reagent_containers/hypospray/medipen/stimpack/New()
..()
reagents.remove_reagent("inaprovaline", 10)
reagents.add_reagent("hyperzine", 9)
reagents.add_reagent("lexorin", 1)
update_icon()
return
return
/obj/item/weapon/reagent_containers/hypospray/medipen/morphine
name = "morphine medipen"
desc = "A rapid way to get you out of a tight situation and fast! You'll feel rather drowsy, though."
icon_state = "medipen"
starting_reagent = "morphine"
/obj/item/weapon/reagent_containers/hypospray/medipen/ephedrine
name = "ephedrine medipen"
desc = "A rapid way to get you up and out of a tight situation and fast!"
icon_state = "medipen"
starting_reagent = "ephedrine"
@@ -0,0 +1,17 @@
/obj/item/weapon/reagent_containers/pill/patch
name = "chemical patch"
desc = "A chemical patch for touch based applications."
icon = 'icons/obj/chemical.dmi'
icon_state = "bandaid"
item_state = "bandaid"
possible_transfer_amounts = null
volume = 50
apply_type = TOUCH
apply_method = "apply"
/obj/item/weapon/reagent_containers/pill/patch/New()
..()
icon_state = "bandaid" // thanks inheritance
/obj/item/weapon/reagent_containers/pill/patch/afterattack(obj/target, mob/user , proximity)
return // thanks inheritance again
@@ -9,6 +9,8 @@
item_state = "pill"
possible_transfer_amounts = null
volume = 50
var/apply_type = INGEST
var/apply_method = "swallow"
/obj/item/weapon/reagent_containers/pill/New()
..()
@@ -25,16 +27,16 @@
return 0
if(M == user)
M << "<span class='notice'>You swallow [src].</span>"
M << "<span class='notice'>You [apply_method] [src].</span>"
else
M.visible_message("<span class='danger'>[user] attempts to force [M] to swallow [src].</span>", \
"<span class='userdanger'>[user] attempts to force [M] to swallow [src].</span>")
M.visible_message("<span class='danger'>[user] attempts to force [M] to [apply_method] [src].</span>", \
"<span class='userdanger'>[user] attempts to force [M] to [apply_method] [src].</span>")
if(!do_mob(user, M)) return
M.visible_message("<span class='danger'>[user] forces [M] to swallow [src].</span>", \
"<span class='userdanger'>[user] forces [M] to swallow [src].</span>")
M.visible_message("<span class='danger'>[user] forces [M] to [apply_method] [src].</span>", \
"<span class='userdanger'>[user] forces [M] to [apply_method] [src].</span>")
user.unEquip(src) //icon update
@@ -42,7 +44,7 @@
loc = M //Put the pill inside the mob. This fixes the issue where the pill appears to drop to the ground after someone eats it.
if(reagents.total_volume)
reagents.reaction(M, INGEST)
reagents.reaction(M, apply_type)
spawn(5)
reagents.trans_to(M, reagents.total_volume)
qdel(src)