Merge remote-tracking branch 'upstream/master' into zombies

This commit is contained in:
Couls
2019-08-04 21:05:10 -04:00
728 changed files with 111115 additions and 10827 deletions
@@ -24,6 +24,9 @@
var/hack_message = "You disable the safety safeguards, enabling the \"Mad Scientist\" mode."
var/unhack_message = "You re-enable the safety safeguards, enabling the \"NT Standard\" mode."
/obj/machinery/chem_dispenser/get_cell()
return cell
/obj/machinery/chem_dispenser/New()
..()
component_parts = list()
@@ -37,6 +40,51 @@
RefreshParts()
dispensable_reagents = sortList(dispensable_reagents)
/obj/machinery/chem_dispenser/upgraded/New()
..()
component_parts = list()
component_parts += new /obj/item/circuitboard/chem_dispenser(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/capacitor/super(null)
component_parts += new /obj/item/stock_parts/manipulator/pico(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null)
RefreshParts()
/obj/machinery/chem_dispenser/mutagensaltpeter
name = "botanical chemical dispenser"
desc = "Creates and dispenses chemicals useful for botany."
can_deconstruct = FALSE
dispensable_reagents = list(
"mutagen",
"saltpetre",
"eznutriment",
"left4zednutriment",
"robustharvestnutriment",
"water",
"plantbgone",
"weedkiller",
"pestkiller",
"cryoxadone",
"ammonia",
"ash",
"diethylamine")
upgrade_reagents = null
/obj/machinery/chem_dispenser/mutagensaltpeter/New()
..()
component_parts = list()
component_parts += new /obj/item/circuitboard/chem_dispenser(null)
component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null)
component_parts += new /obj/item/stock_parts/matter_bin/bluespace(null)
component_parts += new /obj/item/stock_parts/capacitor/quadratic(null)
component_parts += new /obj/item/stock_parts/manipulator/femto(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
component_parts += new /obj/item/stack/cable_coil(null)
RefreshParts()
/obj/machinery/chem_dispenser/RefreshParts()
recharge_amount = initial(recharge_amount)
var/newpowereff = 0.0666666
@@ -297,6 +345,18 @@
component_parts += new cell_type(null)
RefreshParts()
/obj/machinery/chem_dispenser/soda/upgraded/New()
..()
QDEL_LIST(component_parts)
component_parts += new /obj/item/circuitboard/chem_dispenser/soda(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/manipulator/pico(null)
component_parts += new /obj/item/stock_parts/capacitor/super(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
component_parts += new cell_type(null)
RefreshParts()
/obj/machinery/chem_dispenser/beer
icon_state = "booze_dispenser"
name = "booze dispenser"
@@ -318,4 +378,16 @@
component_parts += new /obj/item/stock_parts/manipulator(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
component_parts += new cell_type(null)
RefreshParts()
/obj/machinery/chem_dispenser/beer/upgraded/New()
..()
QDEL_LIST(component_parts)
component_parts += new /obj/item/circuitboard/chem_dispenser/beer(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/matter_bin/super(null)
component_parts += new /obj/item/stock_parts/capacitor/super(null)
component_parts += new /obj/item/stock_parts/manipulator/pico(null)
component_parts += new /obj/item/stock_parts/console_screen(null)
component_parts += new cell_type(null)
RefreshParts()
@@ -815,7 +815,7 @@
var/update_flags = STATUS_UPDATE_NONE
if(prob(5))
if(prob(10))
update_flags |= M.adjustToxLoss(rand(2.4), FALSE)
update_flags |= M.adjustToxLoss(rand(2,4), FALSE)
if(prob(7))
to_chat(M, "<span class='warning'>A horrible migraine overpowers you.</span>")
update_flags |= M.Stun(rand(2,5), FALSE)
@@ -1138,3 +1138,30 @@
E.rejuvenate() //Repair it completely.
break
return ..() | update_flags
/datum/reagent/medicine/lavaland_extract
name = "Lavaland Extract"
id = "lavaland_extract"
description = "An extract of lavaland atmospheric and mineral elements. Heals the user in small doses, but is extremely toxic otherwise."
color = "#C8A5DC" // rgb: 200, 165, 220
metabolization_rate = 0.7 //VERY strong chemical
overdose_threshold = 3 //To prevent people stacking massive amounts of a very strong healing reagent
can_synth = FALSE
/datum/reagent/medicine/lavaland_extract/on_mob_life(mob/living/carbon/M)
var/update_flags = STATUS_UPDATE_NONE
update_flags |= M.adjustToxLoss(-3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
update_flags |= M.adjustOxyLoss(-3*REAGENTS_EFFECT_MULTIPLIER, FALSE)
update_flags |= M.adjustBruteLoss(-6*REAGENTS_EFFECT_MULTIPLIER, FALSE)
update_flags |= M.adjustFireLoss(-6*REAGENTS_EFFECT_MULTIPLIER, FALSE)
return ..() | update_flags
/datum/reagent/medicine/lavaland_extract/overdose_process(mob/living/M) // This WILL be brutal
var/update_flags = STATUS_UPDATE_NONE
M.AdjustConfused(5)
update_flags |= M.adjustBruteLoss(10*REAGENTS_EFFECT_MULTIPLIER, FALSE)
update_flags |= M.adjustFireLoss(10*REAGENTS_EFFECT_MULTIPLIER, FALSE)
update_flags |= M.adjustToxLoss(10*REAGENTS_EFFECT_MULTIPLIER, FALSE)
update_flags |= M.Stun(7, FALSE)
update_flags |= M.Weaken(7, FALSE)
return ..() | update_flags
@@ -632,3 +632,50 @@
description = "Ewwwwwwwww."
reagent_state = LIQUID
color = "#857400"
/datum/reagent/spraytan
name = "Spray Tan"
id = "spraytan"
description = "A substance applied to the skin to darken the skin."
color = "#FFC080" // rgb: 255, 196, 128 Bright orange
metabolization_rate = 10 * REAGENTS_METABOLISM // very fast, so it can be applied rapidly. But this changes on an overdose
overdose_threshold = 11 //Slightly more than one un-nozzled spraybottle.
taste_message = "sour oranges"
/datum/reagent/spraytan/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
if(ishuman(M))
if(method == TOUCH)
var/mob/living/carbon/human/N = M
set_skin_color(N)
if(method == INGEST)
if(show_message)
to_chat(M, "<span class='notice'>That tasted horrible.</span>")
..()
/datum/reagent/spraytan/overdose_process(mob/living/M)
metabolization_rate = 1 * REAGENTS_METABOLISM
if(ishuman(M) && is_species(M, /datum/species/human))
var/mob/living/carbon/human/N = M
N.change_hair("Spiky")
N.change_facial_hair("Shaved")
N.change_hair_color("#000000")
N.change_facial_hair_color("#000000")
set_skin_color(N)
if(prob(7))
if(N.w_uniform)
M.visible_message(pick("<b>[M]</b>'s collar pops up without warning.</span>", "<b>[M]</b> flexes [M.p_their()] arms."))
else
M.visible_message("<b>[M]</b> flexes [M.p_their()] arms.")
if(prob(10))
M.say(pick("Shit was SO cash.", "You are everything bad in the world.", "What sports do you play, other than 'jack off to naked drawn Japanese people?'", "Dont be a stranger. Just hit me with your best shot.", "My name is John and I hate every single one of you."))
return list(0, STATUS_UPDATE_NONE)
/datum/reagent/spraytan/proc/set_skin_color(mob/living/carbon/human/H)
if(H.dna.species.bodyflags & HAS_SKIN_TONE)
H.change_skin_tone(-30)
if(H.dna.species.bodyflags & HAS_SKIN_COLOR) //take current alien color and darken it slightly
H.change_skin_color("#9B7653")
@@ -19,68 +19,16 @@
drink_name = "Glass of Water"
drink_desc = "The father of all refreshments."
taste_message = null
var/water_temperature = 283.15 // As reagents don't have a temperature value, we'll just use 10 celsius.
/datum/reagent/water/reaction_mob(mob/living/M, method=TOUCH, volume)
if(method == TOUCH)
// Put out fire
M.adjust_fire_stacks(-(volume * 0.2))
if(isgrey(M)) // You gosh darn snowflakes
var/mob/living/carbon/human/G = M
if(method == TOUCH)
if(volume > 25)
if(G.wear_mask)
to_chat(G, "<span class='danger'>Your [G.wear_mask] protects you from the acid!</span>")
return
if(G.head)
to_chat(G, "<span class='danger'>Your [G.wear_mask] protects you from the acid!</span>")
return
if(prob(75))
G.take_organ_damage(5, 10)
G.emote("scream")
var/obj/item/organ/external/affecting = G.get_organ("head")
if(affecting)
affecting.disfigure()
else
G.take_organ_damage(5, 10)
else
G.take_organ_damage(5, 10)
else
to_chat(G, "<span class='warning'>The water stings[volume < 10 ? " you, but isn't concentrated enough to harm you" : null]!</span>")
if(volume >= 10)
G.adjustFireLoss(min(max(4, (volume - 10) * 2), 20))
G.emote("scream")
/datum/reagent/water/reaction_mob(mob/living/M, method = TOUCH, volume)
M.water_act(volume, water_temperature, src, method)
/datum/reagent/water/reaction_turf(turf/simulated/T, volume)
if(!istype(T))
return
if(volume >= 3)
T.MakeSlippery()
for(var/mob/living/carbon/slime/M in T)
M.apply_water()
var/hotspot = (locate(/obj/effect/hotspot) in T)
if(hotspot)
var/datum/gas_mixture/lowertemp = T.remove_air( T.air.total_moles())
lowertemp.temperature = max(min(lowertemp.temperature-2000,lowertemp.temperature / 2), 0)
lowertemp.react()
T.assume_air(lowertemp)
qdel(hotspot)
T.water_act(volume, water_temperature, src)
/datum/reagent/water/reaction_obj(obj/O, volume)
O.extinguish()
if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube))
var/obj/item/reagent_containers/food/snacks/monkeycube/cube = O
cube.Expand()
// Dehydrated carp
if(istype(O, /obj/item/toy/carpplushie/dehy_carp))
var/obj/item/toy/carpplushie/dehy_carp/dehy = O
dehy.Swell() // Makes a carp
O.water_act(volume, water_temperature, src)
/datum/reagent/lube
name = "Space Lube"
@@ -109,7 +57,7 @@
if(!(istype(B) && B.off_floor))
qdel(O)
else
if(!istype(O, /atom/movable/lighting_object))
if(O.simulated)
O.color = initial(O.color)
O.clean_blood()
@@ -181,4 +181,5 @@
id = "Rotatium"
result = "rotatium"
required_reagents = list("lsd" = 1, "teslium" = 1, "methamphetamine" = 1)
result_amount = 3
mix_message = "<span class='danger'>After sparks, fire, and the smell of LSD, the mix is constantly spinning with no stop in sight.</span>"
@@ -55,13 +55,6 @@
update_icon()
return
// this prevented pills, food, and other things from being picked up by bags.
// possibly intentional, but removing it allows us to not duplicate functionality.
// -Sayu (storage conslidation)
/*
/obj/item/reagent_containers/attackby(obj/item/I as obj, mob/user as mob, params)
return
*/
/obj/item/reagent_containers/afterattack(obj/target, mob/user , flag)
return
@@ -209,6 +209,11 @@
desc = "A reagent bottle. Contains formaldehyde."
list_reagents = list("formaldehyde" = 50)
/obj/item/reagent_containers/glass/bottle/reagent/synaptizine
name = "Synaptizine Bottle"
desc = "A reagent bottle. Contains synaptizine."
list_reagents = list("synaptizine" = 50)
/obj/item/reagent_containers/glass/bottle/reagent/morphine
name = "Morphine Bottle"
desc = "A reagent bottle. Contains morphine."
@@ -56,9 +56,55 @@
if(!is_open_container())
to_chat(user, "<span class='notice'>Airtight lid seals it completely.</span>")
/obj/item/reagent_containers/glass/attack(mob/M, mob/user, def_zone)
if(!is_open_container())
return ..()
if(!reagents || !reagents.total_volume)
to_chat(user, "<span class='warning'>[src] is empty!</span>")
return
if(istype(M))
var/list/transferred = list()
for(var/datum/reagent/R in reagents.reagent_list)
transferred += R.name
var/contained = english_list(transferred)
if(user.a_intent == INTENT_HARM)
M.visible_message("<span class='danger'>[user] splashes the contents of [src] onto [M]!</span>", \
"<span class='userdanger'>[user] splashes the contents of [src] onto [M]!</span>")
add_attack_logs(user, M, "Splashed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL)
if(!iscarbon(user))
M.LAssailant = null
else
M.LAssailant = user
reagents.reaction(M, TOUCH)
reagents.clear_reagents()
else
if(M != user)
M.visible_message("<span class='danger'>[user] attempts to feed something to [M].</span>", \
"<span class='userdanger'>[user] attempts to feed something to you.</span>")
if(!do_mob(user, M))
return
if(!reagents || !reagents.total_volume)
return // The drink might be empty after the delay, such as by spam-feeding
M.visible_message("<span class='danger'>[user] feeds something to [M].</span>", "<span class='userdanger'>[user] feeds something to you.</span>")
add_attack_logs(user, M, "Fed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL)
else
to_chat(user, "<span class='notice'>You swallow a gulp of [src].</span>")
var/fraction = min(5 / reagents.total_volume, 1)
reagents.reaction(M, INGEST, fraction)
addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5), 5)
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
else
return ..()
/obj/item/reagent_containers/glass/afterattack(obj/target, mob/user, proximity)
if(!proximity)
return
if(!is_open_container())
return
@@ -66,26 +112,7 @@
if(istype(target, type))
return
if(ismob(target) && target.reagents && reagents.total_volume)
to_chat(user, "<span class='notice'>You splash the solution onto [target].</span>")
var/mob/living/M = target
var/list/injected = list()
for(var/datum/reagent/R in reagents.reagent_list)
injected += R.name
var/contained = english_list(injected)
add_attack_logs(M, user, "Splashed with [name] containing [contained]", !!M.ckey ? null : ATKLOG_ALL)
if(!iscarbon(user))
M.LAssailant = null
else
M.LAssailant = user
for(var/mob/O in viewers(world.view, user))
O.show_message(text("<span class='warning'>[] has been splashed with something by []!</span>", target, user), 1)
reagents.reaction(target, TOUCH)
spawn(5) reagents.clear_reagents()
return
else if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
if(istype(target, /obj/structure/reagent_dispensers)) //A dispenser. Transfer FROM it TO us.
if(target.reagents && !target.reagents.total_volume)
to_chat(user, "<span class='warning'>[target] is empty and can't be refilled!</span>")
return
@@ -116,12 +143,11 @@
else if(istype(target, /obj/effect/decal)) //stops splashing while scooping up fluids
return
else if(reagents.total_volume)
to_chat(user, "<span class='notice'>You splash the solution onto [target].</span>")
else if(reagents.total_volume && user.a_intent == INTENT_HARM)
user.visible_message("<span class='danger'>[user] splashes the contents of [src] onto [target]!</span>", \
"<span class='notice'>You splash the contents of [src] onto [target].</span>")
reagents.reaction(target, TOUCH)
spawn(5) reagents.clear_reagents()
return
reagents.clear_reagents()
/obj/item/reagent_containers/glass/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/pen) || istype(I, /obj/item/flashlight/pen))
@@ -338,3 +364,28 @@
qdel(src)
else
..()
/obj/item/reagent_containers/glass/beaker/waterbottle
name = "bottle of water"
desc = "A bottle of water filled at an old Earth bottling facility."
icon = 'icons/obj/drinks.dmi'
icon_state = "smallbottle"
item_state = "bottle"
list_reagents = list("water" = 49.5, "fluorine" = 0.5) //see desc, don't think about it too hard
materials = list(MAT_GLASS = 0)
volume = 50
amount_per_transfer_from_this = 10
/obj/item/reagent_containers/glass/beaker/waterbottle/empty
list_reagents = list()
/obj/item/reagent_containers/glass/beaker/waterbottle/large
desc = "A fresh commercial-sized bottle of water."
icon_state = "largebottle"
materials = list(MAT_GLASS = 0)
list_reagents = list("water" = 100)
volume = 100
amount_per_transfer_from_this = 20
/obj/item/reagent_containers/glass/beaker/waterbottle/large/empty
list_reagents = list()
@@ -151,6 +151,14 @@
volume = 50
list_reagents = list("stimulants" = 50)
/obj/item/reagent_containers/hypospray/autoinjector/survival
name = "survival medipen"
desc = "A medipen for surviving in the harshest of environments, heals and protects from environmental hazards. <br><span class='boldwarning'>WARNING: Do not inject more than one pen in quick succession.</span>"
icon_state = "stimpen"
volume = 22
amount_per_transfer_from_this = 22
list_reagents = list("salbutamol" = 10, "epinephrine" = 5, "lavaland_extract" = 2, "salglu_solution" = 5) //Short burst of healing, followed by minor healing from the saline
/obj/item/reagent_containers/hypospray/autoinjector/nanocalcium
name = "nanocalcium autoinjector"
desc = "After a short period of time the nanites will slow the body's systems and assist with bone repair. Nanomachines son."
@@ -76,6 +76,12 @@
icon_state = "pill16"
list_reagents = list("adminordrazine" = 50)
/obj/item/reagent_containers/food/pill/morphine
name = "Morphine pill"
desc = "Commonly used to treat insomnia."
icon_state = "pill8"
list_reagents = list("morphine" = 30)
/obj/item/reagent_containers/food/pill/methamphetamine
name = "Methamphetamine pill"
desc = "Helps improve the ability to concentrate."
@@ -106,6 +112,12 @@
icon_state = "pill17"
list_reagents = list("charcoal" = 50)
/obj/item/reagent_containers/food/pill/epinephrine
name = "Epinephrine pill"
desc = "Used to provide shots of adrenaline."
icon_state = "pill6"
list_reagents = list("epinephrine" = 50)
/obj/item/reagent_containers/food/pill/salicylic
name = "Salicylic Acid pill"
desc = "Commonly used to treat moderate pain and fevers."
@@ -112,6 +112,13 @@
volume = 50
list_reagents = list("cleaner" = 50)
//spray tan
/obj/item/reagent_containers/spray/spraytan
name = "spray tan"
volume = 50
desc = "Gyaro brand spray tan. Do not spray near eyes or other orifices."
list_reagents = list("spraytan" = 50)
//pepperspray
/obj/item/reagent_containers/spray/pepper
name = "pepperspray"