Merge remote-tracking branch 'origin/master' into fake_blood
This commit is contained in:
@@ -280,71 +280,114 @@
|
||||
R.handle_reactions()
|
||||
return amount
|
||||
|
||||
/datum/reagents/proc/metabolize(mob/living/carbon/C, can_overdose = FALSE, liverless = FALSE)
|
||||
/**
|
||||
* Triggers metabolizing for all the reagents in this holder
|
||||
*
|
||||
* Arguments:
|
||||
* * mob/living/carbon/carbon - The mob to metabolize in, if null it uses [/datum/reagents/var/my_atom]
|
||||
* * delta_time - the time in server seconds between proc calls (when performing normally it will be 2)
|
||||
* * times_fired - the number of times the owner's life() tick has been called aka The number of times SSmobs has fired
|
||||
* * can_overdose - Allows overdosing
|
||||
* * liverless - Stops reagents that aren't set as [/datum/reagent/var/self_consuming] from metabolizing
|
||||
*/
|
||||
/datum/reagents/proc/metabolize(mob/living/carbon/owner, delta_time, times_fired, can_overdose = FALSE, liverless = FALSE)
|
||||
var/list/cached_reagents = reagent_list
|
||||
var/list/cached_addictions = addiction_list
|
||||
if(C)
|
||||
expose_temperature(C.bodytemperature, 0.25)
|
||||
var/need_mob_update = 0
|
||||
for(var/reagent in cached_reagents)
|
||||
var/datum/reagent/R = reagent
|
||||
if(QDELETED(R.holder))
|
||||
continue
|
||||
if(liverless && !R.self_consuming) //need to be metabolized
|
||||
continue
|
||||
if(!C)
|
||||
C = R.holder.my_atom
|
||||
if(!R.metabolizing)
|
||||
R.metabolizing = TRUE
|
||||
R.on_mob_metabolize(C)
|
||||
if(C && R)
|
||||
if(C.reagent_check(R) != 1)
|
||||
if(can_overdose)
|
||||
if(R.overdose_threshold)
|
||||
if(R.volume > R.overdose_threshold && !R.overdosed)
|
||||
R.overdosed = 1
|
||||
var/turf/CT = get_turf(C)
|
||||
log_reagent("OVERDOSE START: [key_name(C)] at [AREACOORD(CT)] started overdosing on [R.volume] units of [R].")
|
||||
need_mob_update += R.overdose_start(C)
|
||||
if(R.addiction_threshold)
|
||||
if(R.volume > R.addiction_threshold && !is_type_in_list(R, cached_addictions))
|
||||
var/datum/reagent/new_reagent = new R.type()
|
||||
cached_addictions.Add(new_reagent)
|
||||
if(R.overdosed)
|
||||
need_mob_update += R.overdose_process(C)
|
||||
if(is_type_in_list(R,cached_addictions))
|
||||
for(var/addiction in cached_addictions)
|
||||
var/datum/reagent/A = addiction
|
||||
if(istype(R, A))
|
||||
A.addiction_stage = -15 // you're satisfied for a good while.
|
||||
need_mob_update += R.on_mob_life(C)
|
||||
|
||||
if(owner)
|
||||
expose_temperature(owner.bodytemperature, 0.25)
|
||||
var/need_mob_update = FALSE
|
||||
for(var/datum/reagent/reagent as anything in cached_reagents)
|
||||
need_mob_update += metabolize_reagent(owner, reagent, delta_time, times_fired, can_overdose, liverless)
|
||||
if(can_overdose)
|
||||
if(addiction_tick == 6)
|
||||
addiction_tick = 1
|
||||
for(var/addiction in cached_addictions)
|
||||
for(var/addiction in addiction_list)
|
||||
var/datum/reagent/R = addiction
|
||||
if(C && R)
|
||||
if(owner && R)
|
||||
R.addiction_stage++
|
||||
if(1 <= R.addiction_stage && R.addiction_stage <= R.addiction_stage1_end)
|
||||
need_mob_update += R.addiction_act_stage1(C)
|
||||
need_mob_update += R.addiction_act_stage1(owner)
|
||||
else if(R.addiction_stage1_end < R.addiction_stage && R.addiction_stage <= R.addiction_stage2_end)
|
||||
need_mob_update += R.addiction_act_stage2(C)
|
||||
need_mob_update += R.addiction_act_stage2(owner)
|
||||
else if(R.addiction_stage2_end < R.addiction_stage && R.addiction_stage <= R.addiction_stage3_end)
|
||||
need_mob_update += R.addiction_act_stage3(C)
|
||||
need_mob_update += R.addiction_act_stage3(owner)
|
||||
else if(R.addiction_stage3_end < R.addiction_stage && R.addiction_stage <= R.addiction_stage4_end)
|
||||
need_mob_update += R.addiction_act_stage4(C)
|
||||
need_mob_update += R.addiction_act_stage4(owner)
|
||||
else if(R.addiction_stage4_end < R.addiction_stage)
|
||||
remove_addiction(R)
|
||||
else
|
||||
SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose")
|
||||
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose")
|
||||
addiction_tick++
|
||||
if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates.
|
||||
C.updatehealth()
|
||||
C.update_mobility()
|
||||
C.update_stamina()
|
||||
if(owner && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates.
|
||||
owner.updatehealth()
|
||||
owner.update_mobility()
|
||||
owner.update_stamina()
|
||||
update_total()
|
||||
|
||||
/*
|
||||
* Metabolises a single reagent for a target owner carbon mob. See above.
|
||||
*
|
||||
* Arguments:
|
||||
* * mob/living/carbon/owner - The mob to metabolize in, if null it uses [/datum/reagents/var/my_atom]
|
||||
* * delta_time - the time in server seconds between proc calls (when performing normally it will be 2)
|
||||
* * times_fired - the number of times the owner's life() tick has been called aka The number of times SSmobs has fired
|
||||
* * can_overdose - Allows overdosing
|
||||
* * liverless - Stops reagents that aren't set as [/datum/reagent/var/self_consuming] from metabolizing
|
||||
*/
|
||||
/datum/reagents/proc/metabolize_reagent(mob/living/carbon/owner, datum/reagent/reagent, delta_time, times_fired, can_overdose = FALSE, liverless = FALSE)
|
||||
var/need_mob_update = FALSE
|
||||
if(QDELETED(reagent.holder))
|
||||
return FALSE
|
||||
|
||||
if(!owner)
|
||||
owner = reagent.holder.my_atom
|
||||
|
||||
if(owner && reagent)
|
||||
if(!owner.reagent_check(reagent, delta_time, times_fired) != TRUE)
|
||||
return
|
||||
if(liverless && !reagent.self_consuming) //need to be metabolized
|
||||
return
|
||||
if(!reagent.metabolizing)
|
||||
reagent.metabolizing = TRUE
|
||||
reagent.on_mob_metabolize(owner)
|
||||
if(can_overdose)
|
||||
if(reagent.overdose_threshold)
|
||||
if(reagent.volume >= reagent.overdose_threshold && !reagent.overdosed)
|
||||
reagent.overdosed = TRUE
|
||||
need_mob_update += reagent.overdose_start(owner)
|
||||
log_game("[key_name(owner)] has started overdosing on [reagent.name] at [reagent.volume] units.")
|
||||
|
||||
// for(var/addiction in reagent.addiction_types)
|
||||
// owner.mind?.add_addiction_points(addiction, reagent.addiction_types[addiction] * REAGENTS_METABOLISM)
|
||||
if(reagent.addiction_threshold)
|
||||
if(reagent.volume > reagent.addiction_threshold && !is_type_in_list(reagent, addiction_list))
|
||||
var/datum/reagent/new_reagent = new reagent.type()
|
||||
addiction_list.Add(new_reagent)
|
||||
if(is_type_in_list(reagent, addiction_list))
|
||||
for(var/addiction in addiction_list)
|
||||
var/datum/reagent/A = addiction
|
||||
if(istype(reagent, A))
|
||||
A.addiction_stage = -15 // you're satisfied for a good while.
|
||||
|
||||
if(reagent.overdosed)
|
||||
need_mob_update += reagent.overdose_process(owner, delta_time, times_fired)
|
||||
|
||||
need_mob_update += reagent.on_mob_life(owner, delta_time, times_fired)
|
||||
return need_mob_update
|
||||
|
||||
/// Signals that metabolization has stopped, triggering the end of trait-based effects
|
||||
/datum/reagents/proc/end_metabolization(mob/living/carbon/C, keep_liverless = TRUE)
|
||||
var/list/cached_reagents = reagent_list
|
||||
for(var/datum/reagent/reagent as anything in cached_reagents)
|
||||
if(QDELETED(reagent.holder))
|
||||
continue
|
||||
if(keep_liverless && reagent.self_consuming) //Will keep working without a liver
|
||||
continue
|
||||
if(!C)
|
||||
C = reagent.holder.my_atom
|
||||
if(reagent.metabolizing)
|
||||
reagent.metabolizing = FALSE
|
||||
reagent.on_mob_end_metabolize(C)
|
||||
|
||||
/datum/reagents/proc/remove_addiction(datum/reagent/R)
|
||||
to_chat(my_atom, "<span class='notice'>You feel like you've gotten over your need for [R.name].</span>")
|
||||
SEND_SIGNAL(my_atom, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose")
|
||||
@@ -354,21 +397,6 @@
|
||||
addiction_list.Remove(R)
|
||||
qdel(R)
|
||||
|
||||
//Signals that metabolization has stopped, triggering the end of trait-based effects
|
||||
/datum/reagents/proc/end_metabolization(mob/living/carbon/C, keep_liverless = TRUE)
|
||||
var/list/cached_reagents = reagent_list
|
||||
for(var/reagent in cached_reagents)
|
||||
var/datum/reagent/R = reagent
|
||||
if(QDELETED(R.holder))
|
||||
continue
|
||||
if(keep_liverless && R.self_consuming) //Will keep working without a liver
|
||||
continue
|
||||
if(!C)
|
||||
C = R.holder.my_atom
|
||||
if(R.metabolizing)
|
||||
R.metabolizing = FALSE
|
||||
R.on_mob_end_metabolize(C)
|
||||
|
||||
/datum/reagents/proc/conditional_update_move(atom/A, Running = 0)
|
||||
var/list/cached_reagents = reagent_list
|
||||
for(var/reagent in cached_reagents)
|
||||
|
||||
@@ -139,9 +139,12 @@
|
||||
|
||||
/obj/machinery/computer/pandemic/proc/eject_beaker()
|
||||
if(beaker)
|
||||
var/obj/item/reagent_containers/B = beaker
|
||||
beaker.forceMove(drop_location())
|
||||
beaker = null
|
||||
update_icon()
|
||||
return B
|
||||
return null
|
||||
|
||||
/obj/machinery/computer/pandemic/ui_interact(mob/user, datum/tgui/ui)
|
||||
ui = SStgui.try_update_ui(user, src, ui)
|
||||
@@ -207,7 +210,7 @@
|
||||
to_chat(usr, "<span class='warning'>ERROR: Cannot replicate virus strain.</span>")
|
||||
return
|
||||
A = A.Copy()
|
||||
var/list/data = list("viruses" = list(A))
|
||||
var/list/data = list("donor"=null,"viruses"=list(A),"blood_DNA"="REPLICATED", "bloodcolor" = BLOOD_COLOR_SYNTHETIC, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
|
||||
var/obj/item/reagent_containers/glass/bottle/B = new(drop_location())
|
||||
B.name = "[A.name] culture bottle"
|
||||
B.desc = "A small bottle. Contains [A.agent] culture in synthblood medium."
|
||||
@@ -237,14 +240,17 @@
|
||||
. = TRUE //no afterattack
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
return
|
||||
var/obj/item/reagent_containers/B
|
||||
if(beaker)
|
||||
to_chat(user, "<span class='warning'>A container is already loaded into [src]!</span>")
|
||||
return
|
||||
B = eject_beaker() //now with 100% more swapping
|
||||
if(!user.transferItemToLoc(I, src))
|
||||
return
|
||||
|
||||
if(B)
|
||||
if(user && Adjacent(user) && user.can_hold_items())
|
||||
user.put_in_hands(B)
|
||||
beaker = I
|
||||
to_chat(user, "<span class='notice'>You insert [I] into [src].</span>")
|
||||
if(B) to_chat(user, "<span class='notice'>You remove [B] and insert [I] into [src].</span>")
|
||||
else to_chat(user, "<span class='notice'>You insert [I] into [src].</span>")
|
||||
update_icon()
|
||||
else
|
||||
return ..()
|
||||
|
||||
@@ -360,6 +360,18 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking."
|
||||
pH = 3.5
|
||||
|
||||
/datum/reagent/consumable/ethanol/amaretto
|
||||
name = "Amaretto"
|
||||
description = "A gentle drink that carries a sweet aroma."
|
||||
color = "#E17600"
|
||||
boozepwr = 25
|
||||
taste_description = "fruity and nutty sweetness"
|
||||
glass_icon_state = "amarettoglass"
|
||||
shot_glass_icon_state = "shotglassgold"
|
||||
glass_name = "glass of amaretto"
|
||||
glass_desc = "A sweet and syrupy-looking drink."
|
||||
pH = 3.5
|
||||
|
||||
/datum/reagent/consumable/ethanol/cognac
|
||||
name = "Cognac"
|
||||
description = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing. Classy as fornication."
|
||||
@@ -1490,6 +1502,25 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
M.stuttering = min(M.stuttering + 3, 3)
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/pinotmort
|
||||
name = "Pinot Mort"
|
||||
description = "If you just can't get enough of lavaland."
|
||||
color = rgb(167, 36, 36)
|
||||
boozepwr = 20
|
||||
quality = DRINK_FANTASTIC
|
||||
taste_description = "death, ash and lizards"
|
||||
glass_icon_state = "pinotmort"
|
||||
glass_name = "Pinot Mort"
|
||||
glass_desc = "The taste of Lavaland served in a legion skull. You feel like you might regret drinking this."
|
||||
value = REAGENT_VALUE_UNCOMMON
|
||||
|
||||
/datum/reagent/consumable/ethanol/pinotmort/on_mob_life(mob/living/carbon/M)
|
||||
if((islizard(M) && M.mind.assigned_role == "Ash Walker") || ispodperson(M) && M.mind.assigned_role == "Lifebringer" || isgolem(M))
|
||||
M.heal_bodypart_damage(1, 1)
|
||||
M.adjustBruteLoss(-2,0)
|
||||
. = 1
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/triple_sec
|
||||
name = "Triple Sec"
|
||||
description = "A sweet and vibrant orange liqueur."
|
||||
@@ -1771,6 +1802,50 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
to_chat(L,"<span class='notice'>You notice [mighty_shield] looks worn again. Weird.</span>")
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/amaretto_alexander
|
||||
name = "Amaretto Alexander"
|
||||
description = "A weaker version of the Alexander, what it lacks in strength it makes up for in flavor."
|
||||
color = "#DBD5AE"
|
||||
boozepwr = 35
|
||||
quality = DRINK_VERYGOOD
|
||||
taste_description = "sweet, creamy cacao"
|
||||
glass_icon_state = "alexanderam"
|
||||
glass_name = "Amaretto Alexander"
|
||||
glass_desc = "A creamy, indulgent delight that is in fact as gentle as it seems."
|
||||
|
||||
/datum/reagent/consumable/ethanol/ginger_amaretto
|
||||
name = "Ginger Amaretto"
|
||||
description = "A delightfully simple cocktail that pleases the senses."
|
||||
boozepwr = 30
|
||||
color = "#EFB42A"
|
||||
quality = DRINK_GOOD
|
||||
taste_description = "sweetness followed by a soft sourness and warmth"
|
||||
glass_icon_state = "gingeramaretto"
|
||||
glass_name = "Ginger Amaretto"
|
||||
glass_desc = "The sprig of rosemary adds a nice aroma to the drink, and isn't just to be pretentious afterall!"
|
||||
|
||||
/datum/reagent/consumable/ethanol/godfather
|
||||
name = "Godfather"
|
||||
description = "A rough cocktail with illegal connections."
|
||||
boozepwr = 50
|
||||
color = "#E68F00"
|
||||
quality = DRINK_GOOD
|
||||
taste_description = "a delightful softened punch"
|
||||
glass_icon_state = "godfather"
|
||||
glass_name = "Godfather"
|
||||
glass_desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesnt end up in your mouth."
|
||||
|
||||
/datum/reagent/consumable/ethanol/godmother
|
||||
name = "Godmother"
|
||||
description = "A twist on a classic, liked more by mature women."
|
||||
boozepwr = 50
|
||||
color = "#E68F00"
|
||||
quality = DRINK_GOOD
|
||||
taste_description = "sweetness and a zesty twist"
|
||||
glass_icon_state = "godmother"
|
||||
glass_name = "Godmother"
|
||||
glass_desc = "A lovely fresh-smelling cocktail, a true Sicilian delight."
|
||||
|
||||
/datum/reagent/consumable/ethanol/sidecar
|
||||
name = "Sidecar"
|
||||
description = "The one ride you'll gladly give up the wheel for."
|
||||
@@ -2121,7 +2196,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
if(prob(10))
|
||||
stored_teleports += rand(2,6)
|
||||
if(prob(70))
|
||||
M.vomit()
|
||||
M.vomit(vomit_type = VOMIT_PURPLE)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/planet_cracker
|
||||
@@ -2518,7 +2593,7 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
alcohol_description = "sweet"
|
||||
else
|
||||
alcohol_description = "watery" //How the hell did you get negative boozepwr?
|
||||
|
||||
|
||||
var/list/fruits = list()
|
||||
if(names_in_order.len <= 3)
|
||||
fruits = names_in_order
|
||||
|
||||
@@ -505,11 +505,11 @@
|
||||
value = REAGENT_VALUE_COMMON
|
||||
|
||||
/datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/carbon/M)
|
||||
M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/meth)
|
||||
M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/carbon/M)
|
||||
M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/meth)
|
||||
M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/M)
|
||||
|
||||
@@ -164,62 +164,54 @@
|
||||
|
||||
/datum/reagent/drug/methamphetamine
|
||||
name = "Methamphetamine"
|
||||
description = "Reduces stun times by about 300%, 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."
|
||||
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 = "#FAFAFA"
|
||||
overdose_threshold = 20
|
||||
addiction_threshold = 10
|
||||
metabolization_rate = 0.75 * REAGENTS_METABOLISM
|
||||
var/brain_damage = TRUE
|
||||
var/jitter = TRUE
|
||||
var/confusion = TRUE
|
||||
pH = 5
|
||||
addiction_threshold = 10
|
||||
value = REAGENT_VALUE_UNCOMMON
|
||||
|
||||
/datum/reagent/drug/methamphetamine/on_mob_metabolize(mob/living/L)
|
||||
..()
|
||||
ADD_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type)
|
||||
L.update_movespeed()
|
||||
ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
|
||||
L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/meth)
|
||||
L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine)
|
||||
|
||||
/datum/reagent/drug/methamphetamine/on_mob_end_metabolize(mob/living/L)
|
||||
REMOVE_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type)
|
||||
L.update_movespeed()
|
||||
REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
|
||||
L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/meth)
|
||||
L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine)
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/M)
|
||||
/datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/M, delta_time, times_fired)
|
||||
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))
|
||||
to_chat(M, "<span class='notice'>[high_message]</span>")
|
||||
M.AdjustAllImmobility(-40, 0)
|
||||
M.AdjustUnconscious(-40, 0)
|
||||
M.adjustStaminaLoss(-7.5 * REM, 0)
|
||||
if(jitter)
|
||||
M.Jitter(2)
|
||||
if(brain_damage)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1,4))
|
||||
M.heal_overall_damage(2, 2)
|
||||
if(prob(5))
|
||||
if(DT_PROB(2.5, delta_time))
|
||||
to_chat(M, span_notice("[high_message]"))
|
||||
// SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "tweaking", /datum/mood_event/stimulant_medium, name)
|
||||
M.AdjustStun(-40 * REM * delta_time)
|
||||
M.AdjustKnockdown(-40 * REM * delta_time)
|
||||
M.AdjustUnconscious(-40 * REM * delta_time)
|
||||
M.AdjustParalyzed(-40 * REM * delta_time)
|
||||
M.AdjustImmobilized(-40 * REM * delta_time)
|
||||
M.adjustStaminaLoss(-2 * REM * delta_time, 0)
|
||||
M.Jitter(2 * REM * delta_time)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1, 4) * REM * delta_time)
|
||||
if(DT_PROB(2.5, delta_time))
|
||||
M.emote(pick("twitch", "shiver"))
|
||||
..()
|
||||
. = 1
|
||||
. = TRUE
|
||||
|
||||
/datum/reagent/drug/methamphetamine/overdose_process(mob/living/M)
|
||||
/datum/reagent/drug/methamphetamine/overdose_process(mob/living/M, delta_time, times_fired)
|
||||
if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc))
|
||||
for(var/i in 1 to 4)
|
||||
for(var/i in 1 to round(4 * REM * delta_time, 1))
|
||||
step(M, pick(GLOB.cardinals))
|
||||
if(prob(20))
|
||||
if(DT_PROB(10, delta_time))
|
||||
M.emote("laugh")
|
||||
if(prob(33))
|
||||
M.visible_message("<span class='danger'>[M]'s hands flip out and flail everywhere!</span>")
|
||||
if(DT_PROB(18, delta_time))
|
||||
M.visible_message(span_danger("[M]'s hands flip out and flail everywhere!"))
|
||||
M.drop_all_held_items()
|
||||
..()
|
||||
M.adjustToxLoss(1, 0)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, pick(0.5, 0.6, 0.7, 0.8, 0.9, 1))
|
||||
. = 1
|
||||
M.adjustToxLoss(1 * REM * delta_time, 0)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, (rand(5, 10) / 10) * REM * delta_time)
|
||||
. = TRUE
|
||||
|
||||
/datum/reagent/drug/methamphetamine/addiction_act_stage1(mob/living/M)
|
||||
M.Jitter(5)
|
||||
@@ -256,14 +248,6 @@
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/drug/methamphetamine/changeling
|
||||
name = "Changeling Adrenaline"
|
||||
addiction_threshold = 35
|
||||
overdose_threshold = 35
|
||||
jitter = FALSE
|
||||
brain_damage = FALSE
|
||||
value = REAGENT_VALUE_RARE
|
||||
|
||||
/datum/reagent/drug/bath_salts
|
||||
name = "Bath Salts"
|
||||
description = "Makes you impervious to stuns and grants a stamina regeneration buff, but you will be a nearly uncontrollable tramp-bearded raving lunatic."
|
||||
|
||||
@@ -345,6 +345,8 @@
|
||||
victim.confused = max(M.confused, 3)
|
||||
victim.damageoverlaytemp = 60
|
||||
victim.DefaultCombatKnockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 3, 15))
|
||||
victim.add_movespeed_modifier(/datum/movespeed_modifier/reagent/pepperspray)
|
||||
addtimer(CALLBACK(victim, /mob.proc/remove_movespeed_modifier, /datum/movespeed_modifier/reagent/pepperspray), 10 SECONDS)
|
||||
return
|
||||
else if ( eyes_covered ) // Eye cover is better than mouth cover
|
||||
victim.blur_eyes(3)
|
||||
@@ -358,6 +360,8 @@
|
||||
victim.confused = max(M.confused, 6)
|
||||
victim.damageoverlaytemp = 75
|
||||
victim.DefaultCombatKnockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 5, 25))
|
||||
victim.add_movespeed_modifier(/datum/movespeed_modifier/reagent/pepperspray)
|
||||
addtimer(CALLBACK(victim, /mob.proc/remove_movespeed_modifier, /datum/movespeed_modifier/reagent/pepperspray), 10 SECONDS)
|
||||
victim.update_damage_hud()
|
||||
|
||||
/datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/carbon/M)
|
||||
@@ -524,10 +528,9 @@
|
||||
T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = reac_volume*2 SECONDS)
|
||||
var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T)
|
||||
if(hotspot)
|
||||
var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles())
|
||||
lowertemp.set_temperature(max( min(lowertemp.return_temperature()-2000,lowertemp.return_temperature() / 2) ,0))
|
||||
var/datum/gas_mixture/lowertemp = T.return_air()
|
||||
lowertemp.set_temperature(max( min(lowertemp.return_temperature()-2000,lowertemp.return_temperature() / 2) ,TCMB))
|
||||
lowertemp.react(src)
|
||||
T.assume_air(lowertemp)
|
||||
qdel(hotspot)
|
||||
|
||||
/datum/reagent/consumable/enzyme
|
||||
|
||||
@@ -704,21 +704,42 @@
|
||||
addiction_threshold = 30
|
||||
pH = 12
|
||||
|
||||
/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M)
|
||||
M.AdjustAllImmobility(-20, FALSE)
|
||||
M.AdjustUnconscious(-20, FALSE)
|
||||
M.adjustStaminaLoss(-4.5*REM, FALSE)
|
||||
M.Jitter(10)
|
||||
if(prob(50))
|
||||
M.confused = max(M.confused, 1)
|
||||
/datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/L)
|
||||
..()
|
||||
L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine)
|
||||
ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
|
||||
|
||||
/datum/reagent/medicine/ephedrine/on_mob_end_metabolize(mob/living/L)
|
||||
L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine)
|
||||
REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M, delta_time, times_fired)
|
||||
// if(DT_PROB(10 * (1-creation_purity), delta_time) && iscarbon(M))
|
||||
// var/obj/item/I = M.get_active_held_item()
|
||||
// if(I && M.dropItemToGround(I))
|
||||
// to_chat(M, span_notice("Your hands spaz out and you drop what you were holding!"))
|
||||
// M.Jitter(10)
|
||||
|
||||
M.AdjustAllImmobility(-20 * REM * delta_time)
|
||||
M.adjustStaminaLoss(-1 * REM * delta_time, FALSE)
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
/datum/reagent/medicine/ephedrine/overdose_process(mob/living/M)
|
||||
if(prob(33))
|
||||
M.adjustToxLoss(0.5*REM, 0)
|
||||
/datum/reagent/medicine/ephedrine/overdose_process(mob/living/M, delta_time, times_fired)
|
||||
if(DT_PROB(1, delta_time) && iscarbon(M))
|
||||
var/datum/disease/D = new /datum/disease/heart_failure
|
||||
M.ForceContractDisease(D)
|
||||
to_chat(M, span_userdanger("You're pretty sure you just felt your heart stop for a second there.."))
|
||||
M.playsound_local(M, 'sound/effects/singlebeat.ogg', 100, 0)
|
||||
|
||||
if(DT_PROB(3.5, delta_time))
|
||||
to_chat(M, span_notice("[pick("Your head pounds.", "You feel a tight pain in your chest.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]"))
|
||||
|
||||
if(DT_PROB(18, delta_time))
|
||||
M.adjustToxLoss(1, 0)
|
||||
M.losebreath++
|
||||
. = 1
|
||||
. = TRUE
|
||||
return TRUE
|
||||
|
||||
/datum/reagent/medicine/ephedrine/addiction_act_stage1(mob/living/M)
|
||||
@@ -979,7 +1000,7 @@
|
||||
M.grab_ghost()
|
||||
M.emote("gasp")
|
||||
log_combat(M, M, "revived", src)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
|
||||
var/list/policies = CONFIG_GET(keyed_list/policy)
|
||||
var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds
|
||||
var/late = timelimit && (tplus > timelimit)
|
||||
var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT]
|
||||
@@ -1413,37 +1434,42 @@
|
||||
/datum/reagent/medicine/changelingadrenaline
|
||||
name = "Changeling Adrenaline"
|
||||
description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed."
|
||||
color = "#918e53"
|
||||
color = "#C1151D"
|
||||
overdose_threshold = 30
|
||||
value = REAGENT_VALUE_VERY_RARE
|
||||
|
||||
/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L)
|
||||
..()
|
||||
ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
|
||||
|
||||
/datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/L)
|
||||
REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/M as mob)
|
||||
M.AdjustUnconscious(-20, 0)
|
||||
M.AdjustAllImmobility(-20, 0)
|
||||
M.AdjustSleeping(-20, 0)
|
||||
M.adjustStaminaLoss(-30, 0)
|
||||
/datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/metabolizer, delta_time, times_fired)
|
||||
..()
|
||||
metabolizer.AdjustAllImmobility(-20 * REM * delta_time)
|
||||
metabolizer.adjustStaminaLoss(-10 * REM * delta_time, 0)
|
||||
metabolizer.Jitter(10 * REM * delta_time)
|
||||
metabolizer.Dizzy(10 * REM * delta_time)
|
||||
return TRUE
|
||||
|
||||
/datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/M as mob)
|
||||
M.adjustToxLoss(5, 0) //let's make this mildly more toxic because of the stamina buff
|
||||
/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L)
|
||||
..()
|
||||
ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, type)
|
||||
ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
|
||||
L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
|
||||
|
||||
/datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/L)
|
||||
..()
|
||||
REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, type)
|
||||
REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
|
||||
L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
|
||||
L.Dizzy(0)
|
||||
L.Jitter(0)
|
||||
|
||||
/datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/metabolizer, delta_time, times_fired)
|
||||
metabolizer.adjustToxLoss(1 * REM * delta_time, 0)
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
/datum/reagent/medicine/changelinghaste
|
||||
name = "Changeling Haste"
|
||||
description = "Drastically increases movement speed, but deals toxin damage."
|
||||
color = "#669153"
|
||||
metabolization_rate = 1
|
||||
value = REAGENT_VALUE_VERY_RARE
|
||||
color = "#AE151D"
|
||||
metabolization_rate = 2.5 * REAGENTS_METABOLISM
|
||||
|
||||
/datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/L)
|
||||
..()
|
||||
@@ -1453,11 +1479,12 @@
|
||||
L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste)
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustToxLoss(2, 0)
|
||||
/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/metabolizer, delta_time, times_fired)
|
||||
metabolizer.adjustToxLoss(2 * REM * delta_time, 0)
|
||||
..()
|
||||
return TRUE
|
||||
|
||||
|
||||
/datum/reagent/medicine/corazone
|
||||
// Heart attack code will not do damage if corazone is present
|
||||
// because it's SPACE MAGIC ASPIRIN
|
||||
|
||||
@@ -287,7 +287,9 @@
|
||||
|
||||
/datum/reagent/water/reaction_obj(obj/O, reac_volume)
|
||||
O.extinguish()
|
||||
O.acid_level = 0
|
||||
var/datum/component/acid/acid = O.GetComponent(/datum/component/acid)
|
||||
if(acid)
|
||||
acid.level = 0
|
||||
// cubes
|
||||
if(istype(O, /obj/item/reagent_containers/food/snacks/cube))
|
||||
var/obj/item/reagent_containers/food/snacks/cube/cube = O
|
||||
@@ -330,7 +332,7 @@
|
||||
name = "Hollow Water"
|
||||
description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen, but it looks kinda hollow."
|
||||
color = "#88878777"
|
||||
taste_description = "emptyiness"
|
||||
taste_description = "emptiness"
|
||||
|
||||
|
||||
/datum/reagent/water/holywater
|
||||
|
||||
@@ -735,7 +735,7 @@
|
||||
/datum/reagent/toxin/spewium/on_mob_life(mob/living/carbon/C)
|
||||
.=..()
|
||||
if(current_cycle >=11 && prob(min(50,current_cycle)))
|
||||
C.vomit(10, prob(10), prob(50), rand(0,4), TRUE, prob(30))
|
||||
C.vomit(10, prob(10), prob(50), rand(0,4), TRUE)
|
||||
for(var/datum/reagent/toxin/R in C.reagents.reagent_list)
|
||||
if(R != src)
|
||||
C.reagents.remove_reagent(R.type,1)
|
||||
|
||||
@@ -40,6 +40,7 @@
|
||||
|
||||
|
||||
/datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, multiplier, specialreact)
|
||||
set waitfor = FALSE
|
||||
return
|
||||
//I recommend you set the result amount to the total volume of all components.
|
||||
|
||||
|
||||
@@ -335,7 +335,7 @@
|
||||
required_reagents = list( /datum/reagent/medicine/mannitol = 2, /datum/reagent/water = 2, /datum/reagent/impedrezene = 1)
|
||||
|
||||
/datum/chemical_reaction/medsuture
|
||||
required_reagents = list(/datum/reagent/cellulose = 10, /datum/reagent/toxin/formaldehyde = 20, /datum/reagent/medicine/polypyr = 15) //This might be a bit much, reagent cost should be reviewed after implementation.
|
||||
required_reagents = list(/datum/reagent/cellulose = 5, /datum/reagent/toxin/formaldehyde = 5, /datum/reagent/medicine/polypyr = 5) //This might be a bit much, reagent cost should be reviewed after implementation.
|
||||
|
||||
/datum/chemical_reaction/medsuture/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
@@ -343,7 +343,7 @@
|
||||
new /obj/item/stack/medical/suture/medicated(location)
|
||||
|
||||
/datum/chemical_reaction/medmesh
|
||||
required_reagents = list(/datum/reagent/cellulose = 20, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10)
|
||||
required_reagents = list(/datum/reagent/cellulose = 5, /datum/reagent/consumable/aloejuice = 5, /datum/reagent/space_cleaner/sterilizine = 5)
|
||||
|
||||
/datum/chemical_reaction/medmesh/on_reaction(datum/reagents/holder, created_volume)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
|
||||
@@ -741,6 +741,13 @@
|
||||
required_reagents = list(/datum/reagent/liquid_dark_matter = 5, /datum/reagent/medicine/synaptizine = 10, /datum/reagent/medicine/oculine = 10, /datum/reagent/mutationtoxin = 1)
|
||||
required_temp = 600
|
||||
|
||||
/datum/chemical_reaction/slimejelly
|
||||
name = "slimejelly"
|
||||
results = list(/datum/reagent/toxin/slimejelly = 5)
|
||||
required_reagents = list(/datum/reagent/oil = 3, /datum/reagent/radium = 2, /datum/reagent/consumable/tinlux = 1)
|
||||
required_container = /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom
|
||||
mix_message = "The mushroom's insides bubble and pop and it becomes very limp."
|
||||
|
||||
/datum/chemical_reaction/slime_extractification
|
||||
required_reagents = list(/datum/reagent/toxin/slimejelly = 30, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 5)
|
||||
mix_message = "The mixture condenses into a ball."
|
||||
|
||||
@@ -72,7 +72,6 @@
|
||||
R.stun(20)
|
||||
R.reveal(100)
|
||||
R.adjustHealth(50)
|
||||
sleep(20)
|
||||
for(var/mob/living/carbon/C in get_hearers_in_view(round(multiplier/48,1),get_turf(holder.my_atom)))
|
||||
if(iscultist(C))
|
||||
to_chat(C, "<span class='userdanger'>The divine explosion sears you!</span>")
|
||||
@@ -433,20 +432,24 @@
|
||||
var/T1 = multiplier * 20 //100 units : Zap 3 times, with powers 2000/5000/12000. Tesla revolvers have a power of 10000 for comparison.
|
||||
var/T2 = multiplier * 50
|
||||
var/T3 = multiplier * 120
|
||||
sleep(5)
|
||||
var/added_delay = 0.5 SECONDS
|
||||
if(multiplier >= 75)
|
||||
tesla_zap(holder.my_atom, 7, T1, zap_flags)
|
||||
playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1)
|
||||
sleep(15)
|
||||
addtimer(CALLBACK(src, .proc/zappy_zappy, holder, T1), added_delay)
|
||||
added_delay += 1.5 SECONDS
|
||||
if(multiplier >= 40)
|
||||
tesla_zap(holder.my_atom, 7, T2, zap_flags)
|
||||
playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1)
|
||||
sleep(15)
|
||||
addtimer(CALLBACK(src, .proc/zappy_zappy, holder, T2), added_delay)
|
||||
added_delay += 1.5 SECONDS
|
||||
if(multiplier >= 10) //10 units minimum for lightning, 40 units for secondary blast, 75 units for tertiary blast.
|
||||
tesla_zap(holder.my_atom, 7, T3, zap_flags)
|
||||
playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1)
|
||||
addtimer(CALLBACK(src, .proc/zappy_zappy, holder, T3), added_delay)
|
||||
..()
|
||||
|
||||
|
||||
/datum/chemical_reaction/reagent_explosion/teslium_lightning/proc/zappy_zappy(datum/reagents/holder, power)
|
||||
if(QDELETED(holder.my_atom))
|
||||
return
|
||||
tesla_zap(holder.my_atom, 7, power, zap_flags)
|
||||
playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, TRUE)
|
||||
|
||||
/datum/chemical_reaction/reagent_explosion/teslium_lightning/heat
|
||||
id = "teslium_lightning2"
|
||||
required_temp = 474
|
||||
|
||||
@@ -3,6 +3,9 @@
|
||||
var/deletes_extract = TRUE
|
||||
|
||||
/datum/chemical_reaction/slime/on_reaction(datum/reagents/holder)
|
||||
use_slime_core(holder)
|
||||
|
||||
/datum/chemical_reaction/slime/proc/use_slime_core(datum/reagents/holder)
|
||||
SSblackbox.record_feedback("tally", "slime_cores_used", 1, "type")
|
||||
if(deletes_extract)
|
||||
delete_extract(holder)
|
||||
@@ -232,8 +235,7 @@
|
||||
if(holder && holder.my_atom)
|
||||
var/turf/open/T = get_turf(holder.my_atom)
|
||||
if(istype(T))
|
||||
var/datum/gas/gastype = /datum/gas/nitrogen
|
||||
T.atmos_spawn_air("[initial(gastype.id)]=50;TEMP=2.7")
|
||||
T.atmos_spawn_air("n2=50;TEMP=2.7")
|
||||
|
||||
/datum/chemical_reaction/slime/slimefireproof
|
||||
name = "Slime Fireproof"
|
||||
@@ -570,7 +572,9 @@
|
||||
required_other = TRUE
|
||||
|
||||
/datum/chemical_reaction/slime/slimestop/on_reaction(datum/reagents/holder)
|
||||
sleep(50)
|
||||
addtimer(CALLBACK(src, .proc/slime_stop, holder), 5 SECONDS)
|
||||
|
||||
/datum/chemical_reaction/slime/slimestop/proc/slime_stop(datum/reagents/holder)
|
||||
var/obj/item/slime_extract/sepia/extract = holder.my_atom
|
||||
var/turf/T = get_turf(holder.my_atom)
|
||||
new /obj/effect/timestop(T, null, null, null)
|
||||
@@ -579,8 +583,7 @@
|
||||
var/mob/lastheld = get_mob_by_key(holder.my_atom.fingerprintslast)
|
||||
if(lastheld && !lastheld.equip_to_slot_if_possible(extract, SLOT_HANDS, disable_warning = TRUE))
|
||||
extract.forceMove(get_turf(lastheld))
|
||||
|
||||
..()
|
||||
use_slime_core(holder)
|
||||
|
||||
/datum/chemical_reaction/slime/slimecamera
|
||||
name = "Slime Camera"
|
||||
|
||||
Reference in New Issue
Block a user