Merge remote-tracking branch 'Citadel-Station-13/master' into Garlic
This commit is contained in:
@@ -303,6 +303,8 @@
|
||||
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))
|
||||
@@ -340,13 +342,16 @@
|
||||
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_canmove()
|
||||
C.update_mobility()
|
||||
C.update_stamina()
|
||||
update_total()
|
||||
|
||||
/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")
|
||||
if(ismob(my_atom))
|
||||
var/turf/T = get_turf(my_atom)
|
||||
log_reagent("OVERDOSE STOP: [key_name(my_atom)] at [AREACOORD(T)] got over their need for [R].")
|
||||
addiction_list.Remove(R)
|
||||
qdel(R)
|
||||
|
||||
|
||||
@@ -144,14 +144,14 @@
|
||||
..()
|
||||
icon_state = "[(nopower_state && !powered()) ? nopower_state : initial(icon_state)]"
|
||||
|
||||
/obj/machinery/chem_dispenser/update_icon()
|
||||
cut_overlays()
|
||||
/obj/machinery/chem_dispenser/update_overlays()
|
||||
. = ..()
|
||||
if(has_panel_overlay && panel_open)
|
||||
add_overlay(mutable_appearance(icon, "[initial(icon_state)]_panel-o"))
|
||||
. += mutable_appearance(icon, "[initial(icon_state)]_panel-o")
|
||||
|
||||
if(beaker)
|
||||
beaker_overlay = display_beaker()
|
||||
add_overlay(beaker_overlay)
|
||||
. += beaker_overlay
|
||||
|
||||
/obj/machinery/chem_dispenser/emag_act(mob/user)
|
||||
. = ..()
|
||||
@@ -356,7 +356,6 @@
|
||||
replace_beaker(user, B)
|
||||
to_chat(user, "<span class='notice'>You add [B] to [src].</span>")
|
||||
updateUsrDialog()
|
||||
update_icon()
|
||||
else if(user.a_intent != INTENT_HARM && !istype(I, /obj/item/card/emag))
|
||||
to_chat(user, "<span class='warning'>You can't load [I] into [src]!</span>")
|
||||
return ..()
|
||||
@@ -487,6 +486,7 @@
|
||||
/datum/reagent/consumable/pwr_game,
|
||||
/datum/reagent/consumable/shamblers,
|
||||
/datum/reagent/consumable/sugar,
|
||||
/datum/reagent/consumable/pineapplejuice,
|
||||
/datum/reagent/consumable/orangejuice,
|
||||
/datum/reagent/consumable/grenadine,
|
||||
/datum/reagent/consumable/limejuice,
|
||||
@@ -495,15 +495,22 @@
|
||||
/datum/reagent/consumable/menthol
|
||||
)
|
||||
upgrade_reagents = list(
|
||||
/datum/reagent/drug/mushroomhallucinogen,
|
||||
/datum/reagent/consumable/nothing,
|
||||
/datum/reagent/medicine/cryoxadone
|
||||
/datum/reagent/consumable/banana,
|
||||
/datum/reagent/consumable/berryjuice,
|
||||
/datum/reagent/consumable/strawberryjuice
|
||||
)
|
||||
upgrade_reagents2 = list(
|
||||
/datum/reagent/consumable/banana,
|
||||
/datum/reagent/consumable/berryjuice
|
||||
/datum/reagent/consumable/applejuice,
|
||||
/datum/reagent/consumable/carrotjuice,
|
||||
/datum/reagent/consumable/pumpkinjuice,
|
||||
/datum/reagent/consumable/watermelonjuice
|
||||
)
|
||||
upgrade_reagents3 = list(
|
||||
/datum/reagent/drug/mushroomhallucinogen,
|
||||
/datum/reagent/consumable/nothing,
|
||||
/datum/reagent/medicine/cryoxadone,
|
||||
/datum/reagent/consumable/peachjuice
|
||||
)
|
||||
upgrade_reagents3 = null
|
||||
emagged_reagents = list(
|
||||
/datum/reagent/consumable/ethanol/thirteenloko,
|
||||
/datum/reagent/consumable/ethanol/changelingsting,
|
||||
@@ -552,6 +559,7 @@
|
||||
/datum/reagent/consumable/ethanol/hcider,
|
||||
/datum/reagent/consumable/ethanol/creme_de_menthe,
|
||||
/datum/reagent/consumable/ethanol/creme_de_cacao,
|
||||
/datum/reagent/consumable/ethanol/creme_de_coconut,
|
||||
/datum/reagent/consumable/ethanol/triple_sec,
|
||||
/datum/reagent/consumable/ethanol/sake,
|
||||
/datum/reagent/consumable/ethanol/applejack
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
beaker = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/chem_heater/update_icon()
|
||||
/obj/machinery/chem_heater/update_icon_state()
|
||||
if(beaker)
|
||||
icon_state = "mixer1b"
|
||||
else
|
||||
|
||||
@@ -67,15 +67,17 @@
|
||||
bottle = null
|
||||
update_icon()
|
||||
|
||||
/obj/machinery/chem_master/update_icon()
|
||||
cut_overlays()
|
||||
if (stat & BROKEN)
|
||||
add_overlay("waitlight")
|
||||
/obj/machinery/chem_master/update_icon_state()
|
||||
if(beaker)
|
||||
icon_state = "mixer1"
|
||||
else
|
||||
icon_state = "mixer0"
|
||||
|
||||
/obj/machinery/chem_master/update_overlays()
|
||||
. = ..()
|
||||
if (stat & BROKEN)
|
||||
. += "waitlight"
|
||||
|
||||
/obj/machinery/chem_master/blob_act(obj/structure/blob/B)
|
||||
if (prob(50))
|
||||
qdel(src)
|
||||
|
||||
@@ -109,16 +109,16 @@
|
||||
update_icon()
|
||||
playsound(loc, 'sound/machines/ping.ogg', 30, 1)
|
||||
|
||||
/obj/machinery/computer/pandemic/update_icon()
|
||||
/obj/machinery/computer/pandemic/update_icon_state()
|
||||
if(stat & BROKEN)
|
||||
icon_state = (beaker ? "mixer1_b" : "mixer0_b")
|
||||
return
|
||||
|
||||
icon_state = "mixer[(beaker) ? "1" : "0"][powered() ? "" : "_nopower"]"
|
||||
if(wait)
|
||||
add_overlay("waitlight")
|
||||
else
|
||||
cut_overlays()
|
||||
icon_state = "mixer[(beaker) ? "1" : "0"][powered() ? "" : "_nopower"]"
|
||||
|
||||
/obj/machinery/computer/pandemic/update_overlays()
|
||||
. = ..()
|
||||
if(!(stat & BROKEN) && wait)
|
||||
. += "waitlight"
|
||||
|
||||
/obj/machinery/computer/pandemic/ui_interact(mob/user, ui_key = "main", datum/tgui/ui, force_open = FALSE, datum/tgui/master_ui, datum/ui_state/state = GLOB.default_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
|
||||
@@ -66,7 +66,7 @@
|
||||
AM.forceMove(drop_location())
|
||||
holdingitems = list()
|
||||
|
||||
/obj/machinery/reagentgrinder/update_icon()
|
||||
/obj/machinery/reagentgrinder/update_icon_state()
|
||||
if(beaker)
|
||||
icon_state = "juicer1"
|
||||
else
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
for(var/obj/item/stock_parts/matter_bin/B in component_parts)
|
||||
reagents.maximum_volume += REAGENTS_BASE_VOLUME * B.rating
|
||||
|
||||
/obj/machinery/smoke_machine/update_icon()
|
||||
/obj/machinery/smoke_machine/update_icon_state()
|
||||
if((!is_operational()) || (!on) || (reagents.total_volume == 0))
|
||||
if (panel_open)
|
||||
icon_state = "smoke0-o"
|
||||
@@ -42,7 +42,6 @@
|
||||
icon_state = "smoke0"
|
||||
else
|
||||
icon_state = "smoke1"
|
||||
return ..()
|
||||
|
||||
/obj/machinery/smoke_machine/RefreshParts()
|
||||
var/new_volume = REAGENTS_BASE_VOLUME
|
||||
|
||||
@@ -78,7 +78,6 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
|
||||
current_cycle++
|
||||
if(holder)
|
||||
holder.remove_reagent(type, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears.
|
||||
return
|
||||
|
||||
//called when a mob processes chems when dead.
|
||||
/datum/reagent/proc/on_mob_dead(mob/living/carbon/M)
|
||||
@@ -87,15 +86,15 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
|
||||
current_cycle++
|
||||
if(holder)
|
||||
holder.remove_reagent(type, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears.
|
||||
return
|
||||
|
||||
// Called when this reagent is first added to a mob
|
||||
/datum/reagent/proc/on_mob_add(mob/living/L, amount)
|
||||
if(!iscarbon(L))
|
||||
return
|
||||
var/mob/living/carbon/M = L
|
||||
var/turf/T = get_turf(M)
|
||||
log_reagent("MOB ADD: on_mob_add(): [key_name(M)] at [AREACOORD(T)] - [volume] of [type] with [purity] purity")
|
||||
if (purity == 1)
|
||||
log_game("CHEM: [L] ckey: [L.key] has ingested [volume]u of [type]")
|
||||
return
|
||||
if(cached_purity == 1)
|
||||
cached_purity = purity
|
||||
@@ -112,20 +111,18 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
|
||||
R.name = name//Negative effects are hidden
|
||||
if(R.chemical_flags & REAGENT_INVISIBLE)
|
||||
R.chemical_flags |= (REAGENT_INVISIBLE)
|
||||
log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [inverse_chem]")
|
||||
return
|
||||
log_reagent("MOB ADD: on_mob_add() (impure): merged [volume] of [inverse_chem]")
|
||||
else if (impure_chem)
|
||||
var/impureVol = amount * (1 - purity) //turns impure ratio into impure chem
|
||||
if(!(chemical_flags & REAGENT_SPLITRETAINVOL))
|
||||
M.reagents.remove_reagent(type, (impureVol), FALSE)
|
||||
M.reagents.add_reagent(impure_chem, impureVol, FALSE, other_purity = 1-cached_purity)
|
||||
log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume - impureVol]u of [type]")
|
||||
log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [impure_chem]")
|
||||
return
|
||||
log_reagent("MOB ADD: on_mob_add() (mixed purity): merged [volume - impureVol] of [type] and [volume] of [impure_chem]")
|
||||
|
||||
// Called when this reagent is removed while inside a mob
|
||||
/datum/reagent/proc/on_mob_delete(mob/living/L)
|
||||
return
|
||||
var/turf/T = get_turf(L)
|
||||
log_reagent("MOB DELETE: on_mob_delete: [key_name(L)] at [AREACOORD(T)] - [type]")
|
||||
|
||||
// Called when this reagent first starts being metabolized by a liver
|
||||
/datum/reagent/proc/on_mob_metabolize(mob/living/L)
|
||||
@@ -146,8 +143,9 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
|
||||
/datum/reagent/proc/on_merge(data, amount, mob/living/carbon/M, purity)
|
||||
if(!iscarbon(M))
|
||||
return
|
||||
var/turf/T = get_turf(M)
|
||||
log_reagent("MOB ADD: on_merge(): [key_name(M)] at [AREACOORD(T)] - [volume] of [type] with [purity] purity")
|
||||
if (purity == 1)
|
||||
log_game("FERMICHEM: [M] ckey: [M.key] has ingested [volume]u of [type]")
|
||||
return
|
||||
cached_purity = purity //purity SHOULD be precalculated from the add_reagent, update cache.
|
||||
if (purity < 0)
|
||||
@@ -163,16 +161,13 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
|
||||
R.name = name//Negative effects are hidden
|
||||
if(R.chemical_flags & REAGENT_INVISIBLE)
|
||||
R.chemical_flags |= (REAGENT_INVISIBLE)
|
||||
log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [inverse_chem]")
|
||||
return
|
||||
log_reagent("MOB ADD: on_merge() (impure): merged [volume] of [inverse_chem]")
|
||||
else if (impure_chem) //SPLIT
|
||||
var/impureVol = amount * (1 - purity)
|
||||
if(!(chemical_flags & REAGENT_SPLITRETAINVOL))
|
||||
M.reagents.remove_reagent(type, impureVol, FALSE)
|
||||
M.reagents.add_reagent(impure_chem, impureVol, FALSE, other_purity = 1-cached_purity)
|
||||
log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume - impureVol]u of [type]")
|
||||
log_game("FERMICHEM: [M] ckey: [M.key] has merged [volume]u of [impure_chem]")
|
||||
return
|
||||
log_reagent("MOB ADD: on_merge() (mixed purity): merged [volume - impureVol] of [type] and [volume] of [impure_chem]")
|
||||
|
||||
/datum/reagent/proc/on_update(atom/A)
|
||||
return
|
||||
@@ -188,31 +183,26 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
|
||||
/datum/reagent/proc/overdose_start(mob/living/M)
|
||||
to_chat(M, "<span class='userdanger'>You feel like you took too much of [name]!</span>")
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/overdose, name)
|
||||
return
|
||||
|
||||
/datum/reagent/proc/addiction_act_stage1(mob/living/M)
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_light, name)
|
||||
if(prob(30))
|
||||
to_chat(M, "<span class='notice'>You feel like having some [name] right about now.</span>")
|
||||
return
|
||||
|
||||
/datum/reagent/proc/addiction_act_stage2(mob/living/M)
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_medium, name)
|
||||
if(prob(30))
|
||||
to_chat(M, "<span class='notice'>You feel like you need [name]. You just can't get enough.</span>")
|
||||
return
|
||||
|
||||
/datum/reagent/proc/addiction_act_stage3(mob/living/M)
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_severe, name)
|
||||
if(prob(30))
|
||||
to_chat(M, "<span class='danger'>You have an intense craving for [name].</span>")
|
||||
return
|
||||
|
||||
/datum/reagent/proc/addiction_act_stage4(mob/living/M)
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "[type]_overdose", /datum/mood_event/withdrawal_critical, name)
|
||||
if(prob(30))
|
||||
to_chat(M, "<span class='boldannounce'>You're not feeling good at all! You really need some [name].</span>")
|
||||
return
|
||||
|
||||
/proc/pretty_string_from_reagent_list(list/reagent_list)
|
||||
//Convert reagent list to a printable string for logging etc
|
||||
@@ -221,3 +211,13 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
|
||||
rs += "[R.name], [R.volume]"
|
||||
|
||||
return rs.Join(" | ")
|
||||
|
||||
//For easy bloodsucker disgusting and blood removal
|
||||
/datum/reagent/proc/disgust_bloodsucker(mob/living/carbon/C, disgust, blood_change, blood_puke = TRUE, force)
|
||||
if(isvamp(C))
|
||||
var/datum/antagonist/bloodsucker/bloodsuckerdatum = C.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
|
||||
if(disgust)
|
||||
bloodsuckerdatum.handle_eat_human_food(disgust, blood_puke, force)
|
||||
if(blood_change)
|
||||
bloodsuckerdatum.AddBloodVolume(blood_change)
|
||||
|
||||
|
||||
@@ -579,8 +579,8 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
value = 1.3
|
||||
|
||||
/datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C)
|
||||
if((HAS_TRAIT(C, TRAIT_NOMARROW)))
|
||||
return
|
||||
if(isvamp(C))
|
||||
disgust_bloodsucker(FALSE, 1) //Bloodsuckers get SOME blood from it, for style reasons.
|
||||
if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio))
|
||||
C.blood_volume = min((BLOOD_VOLUME_NORMAL*C.blood_ratio), C.blood_volume + 3) //Bloody Mary quickly restores blood loss.
|
||||
..()
|
||||
@@ -958,14 +958,14 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
|
||||
/datum/reagent/consumable/ethanol/bahama_mama
|
||||
name = "Bahama Mama"
|
||||
description = "Tropical cocktail."
|
||||
description = "A tropical cocktail with a complex blend of flavors."
|
||||
color = "#FF7F3B" // rgb: 255, 127, 59
|
||||
boozepwr = 35
|
||||
quality = DRINK_GOOD
|
||||
taste_description = "lime and orange"
|
||||
taste_description = "pineapple, coconut, and a hint of coffee"
|
||||
glass_icon_state = "bahama_mama"
|
||||
glass_name = "Bahama Mama"
|
||||
glass_desc = "Tropical cocktail."
|
||||
glass_desc = "A tropical cocktail with a complex blend of flavors."
|
||||
value = 2
|
||||
|
||||
/datum/reagent/consumable/ethanol/singulo
|
||||
@@ -1156,6 +1156,17 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
playsound(get_turf(M), 'sound/effects/explosionfar.ogg', 100, 1)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/hiveminderaser
|
||||
name = "Hivemind Eraser"
|
||||
description = "A vessel of pure flavor."
|
||||
color = "#FF80FC" // rgb: 255, 128, 252
|
||||
boozepwr = 40
|
||||
quality = DRINK_GOOD
|
||||
taste_description = "psychic links"
|
||||
glass_icon_state = "hiveminderaser"
|
||||
glass_name = "Hivemind Eraser"
|
||||
glass_desc = "For when even mindshields can't save you."
|
||||
|
||||
/datum/reagent/consumable/ethanol/erikasurprise
|
||||
name = "Erika Surprise"
|
||||
description = "The surprise is, it's green!"
|
||||
@@ -1563,6 +1574,16 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_desc = "A million hazing lawsuits and alcohol poisonings have started with this humble ingredient."
|
||||
value = 1
|
||||
|
||||
/datum/reagent/consumable/ethanol/creme_de_coconut
|
||||
name = "Creme de Coconut"
|
||||
description = "A coconut liqueur for smooth, creamy, tropical drinks."
|
||||
color = "#F7F0D0"
|
||||
boozepwr = 20
|
||||
taste_description = "a sweet milky flavor with notes of toasted sugar"
|
||||
glass_icon_state = "glass_white"
|
||||
glass_name = "Creme de Coconut"
|
||||
glass_desc = "An unintimidating glass of coconut liqueur."
|
||||
|
||||
/datum/reagent/consumable/ethanol/quadruple_sec
|
||||
name = "Quadruple Sec"
|
||||
description = "Kicks just as hard as licking the powercell on a baton, but tastier."
|
||||
@@ -1604,6 +1625,28 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
. = 1
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/painkiller
|
||||
name = "Painkiller"
|
||||
description = "Dulls your pain. Your emotional pain, that is."
|
||||
boozepwr = 20
|
||||
color = "#EAD677"
|
||||
quality = DRINK_NICE
|
||||
taste_description = "sugary tartness"
|
||||
glass_icon_state = "painkiller"
|
||||
glass_name = "Painkiller"
|
||||
glass_desc = "A combination of tropical juices and rum. Surely this will make you feel better."
|
||||
|
||||
/datum/reagent/consumable/ethanol/pina_colada
|
||||
name = "Pina Colada"
|
||||
description = "A fresh pineapple drink with coconut rum. Yum."
|
||||
boozepwr = 40
|
||||
color = "#FFF1B2"
|
||||
quality = DRINK_FANTASTIC
|
||||
taste_description = "pineapple, coconut, and a hint of the ocean"
|
||||
glass_icon_state = "pina_colada"
|
||||
glass_name = "Pina Colada"
|
||||
glass_desc = "If you like pina coladas, and getting caught in the rain... well, you'll like this drink."
|
||||
|
||||
/datum/reagent/consumable/ethanol/grasshopper
|
||||
name = "Grasshopper"
|
||||
description = "A fresh and sweet dessert shooter. Difficult to look manly while drinking this."
|
||||
@@ -1852,6 +1895,17 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_desc = "A drink that looks as refreshing as it tastes."
|
||||
value = 1
|
||||
|
||||
/datum/reagent/consumable/ethanol/moscow_mule
|
||||
name = "Moscow Mule"
|
||||
description = "A chilly drink that reminds you of the Derelict."
|
||||
color = "#EEF1AA"
|
||||
boozepwr = 30
|
||||
quality = DRINK_GOOD
|
||||
taste_description = "refreshing spiciness"
|
||||
glass_icon_state = "moscow_mule"
|
||||
glass_name = "Moscow Mule"
|
||||
glass_desc = "A chilly drink that reminds you of the Derelict."
|
||||
|
||||
/datum/reagent/consumable/ethanol/fernet
|
||||
name = "Fernet"
|
||||
description = "An incredibly bitter herbal liqueur used as a digestif."
|
||||
@@ -2159,6 +2213,25 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
glass_desc = "Although historians believe the drink was originally created to commemorate the end of an important conflict in man's past, its origins have largely been forgotten and it is today seen more as a general symbol of human supremacy."
|
||||
value = 1
|
||||
|
||||
/datum/reagent/consumable/ethanol/mauna_loa
|
||||
name = "Mauna Loa"
|
||||
description = "Extremely hot; not for the faint of heart!"
|
||||
boozepwr = 40
|
||||
color = "#fe8308" // 254, 131, 8
|
||||
quality = DRINK_FANTASTIC
|
||||
taste_description = "fiery, with an aftertaste of burnt flesh"
|
||||
glass_icon_state = "mauna_loa"
|
||||
glass_name = "Mauna Loa"
|
||||
glass_desc = "Lavaland in a drink... mug... volcano... thing."
|
||||
|
||||
/datum/reagent/consumable/ethanol/mauna_loa/on_mob_life(mob/living/carbon/M)
|
||||
// Heats the user up while the reagent is in the body. Occasionally makes you burst into flames.
|
||||
M.adjust_bodytemperature(25 * TEMPERATURE_DAMAGE_COEFFICIENT)
|
||||
if (prob(5))
|
||||
M.adjust_fire_stacks(1)
|
||||
M.IgniteMob()
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/commander_and_chief
|
||||
name = "Commander and Chief"
|
||||
description = "A cocktail for the captain on the go."
|
||||
@@ -2182,6 +2255,107 @@ All effects don't start immediately, but rather get worse over time; the rate is
|
||||
. = 1
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/gunfire
|
||||
name = "Gunfire"
|
||||
description = "A drink that tastes like tiny explosions."
|
||||
color = "#e4830d"
|
||||
boozepwr = 40
|
||||
quality = DRINK_GOOD
|
||||
taste_description = "tiny explosions"
|
||||
glass_icon_state = "gunfire"
|
||||
glass_name = "Gunfire"
|
||||
glass_desc = "It pops constantly as you look at it, giving off tiny sparks."
|
||||
|
||||
/datum/reagent/consumable/ethanol/gunfire/on_mob_life(mob/living/carbon/M)
|
||||
if (prob(3))
|
||||
to_chat(M,"<span class='notice'>You feel the gunfire pop in your mouth.</span>")
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/hellfire
|
||||
name = "Hellfire"
|
||||
description = "A nice drink that isn't quite as hot as it looks."
|
||||
color = "#fb2203"
|
||||
boozepwr = 60
|
||||
quality = DRINK_VERYGOOD
|
||||
taste_description = "cold flames that lick at the top of your mouth"
|
||||
glass_icon_state = "hellfire"
|
||||
glass_name = "Hellfire"
|
||||
glass_desc = "An amber colored drink that isn't quite as hot as it looks."
|
||||
|
||||
/datum/reagent/consumable/ethanol/hellfire/on_mob_life(mob/living/carbon/M)
|
||||
M.adjust_bodytemperature(30 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, BODYTEMP_NORMAL + 30)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/sins_delight
|
||||
name = "Sin's Delight"
|
||||
description = "The drink smells like the seven sins."
|
||||
color = "#330000"
|
||||
boozepwr = 66
|
||||
quality = DRINK_FANTASTIC
|
||||
taste_description = "sin"
|
||||
glass_icon_state = "sins_delight"
|
||||
glass_name = "Sin's Delight"
|
||||
glass_desc = "You can smell the seven sins rolling off the top of the glass."
|
||||
|
||||
/datum/reagent/consumable/ethanol/strawberry_daiquiri
|
||||
name = "Strawberry Daiquiri"
|
||||
description = "Pink looking alcoholic drink."
|
||||
boozepwr = 20
|
||||
color = "#FF4A74"
|
||||
quality = DRINK_NICE
|
||||
taste_description = "sweet strawberry, lime and the ocean breeze"
|
||||
glass_icon_state = "strawberry_daiquiri"
|
||||
glass_name = "Strawberry Daiquiri"
|
||||
glass_desc = "Pink looking drink with flowers and a big straw to sip it. Looks sweet and refreshing, perfect for warm days."
|
||||
|
||||
/datum/reagent/consumable/ethanol/liz_fizz
|
||||
name = "Liz Fizz"
|
||||
description = "Triple citrus layered with some ice and cream."
|
||||
boozepwr = 0
|
||||
color = "#D8FF59"
|
||||
taste_description = "brain freezing sourness"
|
||||
glass_icon_state = "liz_fizz"
|
||||
glass_name = "Liz Fizz"
|
||||
glass_desc = "Looks like a citrus sherbet seperated in layers? Why would anyone want that is beyond you."
|
||||
|
||||
/datum/reagent/consumable/ethanol/miami_vice
|
||||
name = "Miami Vice"
|
||||
description = "A drink layering Pina Colada and Strawberry Daiquiri"
|
||||
boozepwr = 30
|
||||
color = "#D8FF59"
|
||||
quality = DRINK_FANTASTIC
|
||||
taste_description = "sweet and refreshing flavor, complemented with strawberries and coconut, and hints of citrus"
|
||||
glass_icon_state = "miami_vice"
|
||||
glass_name = "Miami Vice"
|
||||
glass_desc = "Strawberries and coconut, like yin and yang."
|
||||
|
||||
/datum/reagent/consumable/ethanol/malibu_sunset
|
||||
name = "Malibu Sunset"
|
||||
description = "A drink consisting of creme de coconut and tropical juices"
|
||||
boozepwr = 20
|
||||
color = "#FF9473"
|
||||
quality = DRINK_NICE
|
||||
taste_description = "coconut, with orange and grenadine accents"
|
||||
glass_icon_state = "malibu_sunset"
|
||||
glass_name = "Malibu Sunset"
|
||||
glass_desc = "Tropical looking drinks, with ice cubes hovering on the surface and grenadine coloring the bottom."
|
||||
|
||||
/datum/reagent/consumable/ethanol/hotlime_miami
|
||||
name = "Hotlime Miami"
|
||||
description = "The essence of the 90's, if they were a bloody mess that is."
|
||||
boozepwr = 40
|
||||
color = "#A7FAE8"
|
||||
quality = DRINK_FANTASTIC
|
||||
taste_description = "coconut and aesthetic violence"
|
||||
glass_icon_state = "hotlime_miami"
|
||||
glass_name = "Hotlime Miami"
|
||||
glass_desc = "This looks very aesthetically pleasing."
|
||||
|
||||
/datum/reagent/consumable/ethanol/hotlime_miami/on_mob_life(mob/living/carbon/M)
|
||||
M.set_drugginess(50)
|
||||
M.adjustStaminaLoss(-2)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/consumable/ethanol/fruit_wine
|
||||
name = "Fruit Wine"
|
||||
description = "A wine made from grown plants."
|
||||
|
||||
@@ -1,487 +0,0 @@
|
||||
// These can only be applied by blobs. They are what blobs are made out of.
|
||||
/datum/reagent/blob
|
||||
name = "Unknown"
|
||||
description = "shouldn't exist and you should adminhelp immediately."
|
||||
color = "#FFFFFF"
|
||||
taste_description = "bad code and slime"
|
||||
var/complementary_color = "#000000" //a color that's complementary to the normal blob color
|
||||
var/shortdesc = null //just damage and on_mob effects, doesn't include special, blob-tile only effects
|
||||
var/effectdesc = null //any long, blob-tile specific effects
|
||||
var/analyzerdescdamage = "Unknown. Report this bug to a coder, or just adminhelp."
|
||||
var/analyzerdesceffect = "N/A"
|
||||
var/blobbernaut_message = "slams" //blobbernaut attack verb
|
||||
var/message = "The blob strikes you" //message sent to any mob hit by the blob
|
||||
var/message_living = null //extension to first mob sent to only living mobs i.e. silicons have no skin to be burnt
|
||||
can_synth = FALSE
|
||||
|
||||
/datum/reagent/blob/proc/send_message(mob/living/M)
|
||||
var/totalmessage = message
|
||||
if(message_living && !issilicon(M))
|
||||
totalmessage += message_living
|
||||
totalmessage += "!"
|
||||
to_chat(M, "<span class='userdanger'>[totalmessage]</span>")
|
||||
|
||||
/datum/reagent/blob/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
|
||||
if(M.stat == DEAD || istype(M, /mob/living/simple_animal/hostile/blob))
|
||||
return 0 //the dead, and blob mobs, don't cause reactions
|
||||
return round(reac_volume * min(1.5 - touch_protection, 1), 0.1) //full touch protection means 50% volume, any prot below 0.5 means 100% volume.
|
||||
|
||||
/datum/reagent/blob/proc/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag) //when the blob takes damage, do this
|
||||
return damage
|
||||
|
||||
/datum/reagent/blob/proc/death_reaction(obj/structure/blob/B, damage_flag) //when a blob dies, do this
|
||||
return
|
||||
|
||||
/datum/reagent/blob/proc/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O) //when the blob expands, do this
|
||||
return
|
||||
|
||||
/datum/reagent/blob/proc/tesla_reaction(obj/structure/blob/B, power) //when the blob is hit by a tesla bolt, do this
|
||||
return 1 //return 0 to ignore damage
|
||||
|
||||
/datum/reagent/blob/proc/extinguish_reaction(obj/structure/blob/B) //when the blob is hit with water, do this
|
||||
return
|
||||
|
||||
/datum/reagent/blob/proc/emp_reaction(obj/structure/blob/B, severity) //when the blob is hit with an emp, do this
|
||||
return
|
||||
|
||||
//does brute damage but can replicate when damaged and has a chance of expanding again
|
||||
/datum/reagent/blob/replicating_foam
|
||||
name = "Replicating Foam"
|
||||
description = "will do medium brute damage and occasionally expand again when expanding."
|
||||
shortdesc = "will do medium brute damage."
|
||||
effectdesc = "will also expand when attacked with burn damage, but takes more brute damage."
|
||||
taste_description = "duplication"
|
||||
analyzerdescdamage = "Does medium brute damage."
|
||||
analyzerdesceffect = "Expands when attacked with burn damage, will occasionally expand again when expanding, and is fragile to brute damage."
|
||||
color = "#7B5A57"
|
||||
complementary_color = "#57787B"
|
||||
|
||||
/datum/reagent/blob/replicating_foam/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.7*reac_volume, BRUTE)
|
||||
|
||||
/datum/reagent/blob/replicating_foam/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if(damage_type == BRUTE)
|
||||
damage = damage * 2
|
||||
else if(damage_type == BURN && damage > 0 && B.obj_integrity - damage > 0 && prob(60))
|
||||
var/obj/structure/blob/newB = B.expand(null, null, 0)
|
||||
if(newB)
|
||||
newB.obj_integrity = B.obj_integrity - damage
|
||||
newB.update_icon()
|
||||
return ..()
|
||||
|
||||
/datum/reagent/blob/replicating_foam/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O)
|
||||
if(prob(30))
|
||||
newB.expand(null, null, 0) //do it again!
|
||||
|
||||
//does massive brute and burn damage, but can only expand manually
|
||||
/datum/reagent/blob/networked_fibers
|
||||
name = "Networked Fibers"
|
||||
description = "will do high brute and burn damage and will generate resources quicker, but can only expand manually."
|
||||
shortdesc = "will do high brute and burn damage."
|
||||
taste_description = "efficiency"
|
||||
effectdesc = "will move your core when manually expanding near it."
|
||||
analyzerdescdamage = "Does high brute and burn damage."
|
||||
analyzerdesceffect = "Is highly mobile and generates resources rapidly."
|
||||
color = "#CDC0B0"
|
||||
complementary_color = "#FFF68F"
|
||||
|
||||
/datum/reagent/blob/networked_fibers/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.6*reac_volume, BRUTE)
|
||||
if(M)
|
||||
M.apply_damage(0.6*reac_volume, BURN)
|
||||
|
||||
/datum/reagent/blob/networked_fibers/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O)
|
||||
if(!O && newB.overmind)
|
||||
if(!istype(B, /obj/structure/blob/node))
|
||||
newB.overmind.add_points(1)
|
||||
qdel(newB)
|
||||
else
|
||||
var/area/A = get_area(T)
|
||||
if(!isspaceturf(T) && !istype(A, /area/shuttle))
|
||||
for(var/obj/structure/blob/core/C in range(1, newB))
|
||||
if(C.overmind == O)
|
||||
newB.forceMove(get_turf(C))
|
||||
C.forceMove(T)
|
||||
C.setDir(get_dir(newB, C))
|
||||
O.add_points(1)
|
||||
|
||||
//does brute damage, shifts away when damaged
|
||||
/datum/reagent/blob/shifting_fragments
|
||||
name = "Shifting Fragments"
|
||||
description = "will do medium brute damage."
|
||||
effectdesc = "will also cause blob parts to shift away when attacked."
|
||||
taste_description = "something other-dimensional"
|
||||
analyzerdescdamage = "Does medium brute damage."
|
||||
analyzerdesceffect = "When attacked, may shift away from the attacker."
|
||||
color = "#C8963C"
|
||||
complementary_color = "#3C6EC8"
|
||||
|
||||
/datum/reagent/blob/shifting_fragments/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.7*reac_volume, BRUTE)
|
||||
|
||||
/datum/reagent/blob/shifting_fragments/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O)
|
||||
if(istype(B, /obj/structure/blob/normal) || (istype(B, /obj/structure/blob/shield) && prob(25)))
|
||||
newB.forceMove(get_turf(B))
|
||||
B.forceMove(T)
|
||||
|
||||
/datum/reagent/blob/shifting_fragments/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage > 0 && B.obj_integrity - damage > 0 && prob(60-damage))
|
||||
var/list/blobstopick = list()
|
||||
for(var/obj/structure/blob/OB in orange(1, B))
|
||||
if((istype(OB, /obj/structure/blob/normal) || (istype(OB, /obj/structure/blob/shield) && prob(25))) && OB.overmind && OB.overmind.blob_reagent_datum.type == B.overmind.blob_reagent_datum.type)
|
||||
blobstopick += OB //as long as the blob picked is valid; ie, a normal or shield blob that has the same chemical as we do, we can swap with it
|
||||
if(blobstopick.len)
|
||||
var/obj/structure/blob/targeted = pick(blobstopick) //randomize the blob chosen, because otherwise it'd tend to the lower left
|
||||
var/turf/T = get_turf(targeted)
|
||||
targeted.forceMove(get_turf(B))
|
||||
B.forceMove(T) //swap the blobs
|
||||
return ..()
|
||||
|
||||
//sets you on fire, does burn damage, explodes into flame when burnt, weak to water
|
||||
/datum/reagent/blob/blazing_oil
|
||||
name = "Blazing Oil"
|
||||
description = "will do medium burn damage and set targets on fire."
|
||||
effectdesc = "will also release bursts of flame when burnt, but takes damage from water."
|
||||
taste_description = "burning oil"
|
||||
analyzerdescdamage = "Does medium burn damage and sets targets on fire."
|
||||
analyzerdesceffect = "Releases fire when burnt, but takes damage from water and other extinguishing liquids."
|
||||
color = "#B68D00"
|
||||
complementary_color = "#BE5532"
|
||||
blobbernaut_message = "splashes"
|
||||
message = "The blob splashes you with burning oil"
|
||||
message_living = ", and you feel your skin char and melt"
|
||||
|
||||
/datum/reagent/blob/blazing_oil/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
|
||||
reac_volume = ..()
|
||||
M.adjust_fire_stacks(round(reac_volume/10))
|
||||
M.IgniteMob()
|
||||
if(M)
|
||||
M.apply_damage(0.8*reac_volume, BURN)
|
||||
if(iscarbon(M))
|
||||
M.emote("scream")
|
||||
|
||||
/datum/reagent/blob/blazing_oil/extinguish_reaction(obj/structure/blob/B)
|
||||
B.take_damage(1.5, BURN, "energy")
|
||||
|
||||
/datum/reagent/blob/blazing_oil/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if(damage_type == BURN && damage_flag != "energy")
|
||||
for(var/turf/open/T in range(1, B))
|
||||
var/obj/structure/blob/C = locate() in T
|
||||
if(!(C && C.overmind && C.overmind.blob_reagent_datum.type == B.overmind.blob_reagent_datum.type) && prob(80))
|
||||
new /obj/effect/hotspot(T)
|
||||
if(damage_flag == "fire")
|
||||
return 0
|
||||
return ..()
|
||||
|
||||
//does toxin damage, hallucination, targets think they're not hurt at all
|
||||
/datum/reagent/blob/regenerative_materia
|
||||
name = "Regenerative Materia"
|
||||
description = "will do toxin damage and cause targets to believe they are fully healed."
|
||||
analyzerdescdamage = "Does toxin damage and injects a toxin that causes the target to believe they are fully healed."
|
||||
taste_description = "heaven"
|
||||
color = "#5e7842"
|
||||
complementary_color = "#CD7794"
|
||||
message_living = ", and you feel <i>alive</i>"
|
||||
|
||||
/datum/reagent/blob/regenerative_materia/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
|
||||
reac_volume = ..()
|
||||
M.adjust_drugginess(reac_volume)
|
||||
if(M.reagents)
|
||||
M.reagents.add_reagent(/datum/reagent/blob/regenerative_materia, 0.2*reac_volume)
|
||||
M.reagents.add_reagent(/datum/reagent/toxin/spore, 0.2*reac_volume)
|
||||
M.apply_damage(0.7*reac_volume, TOX)
|
||||
|
||||
/datum/reagent/blob/regenerative_materia/on_mob_life(mob/living/carbon/C)
|
||||
C.adjustToxLoss(1*REM)
|
||||
C.hal_screwyhud = SCREWYHUD_HEALTHY //fully healed, honest
|
||||
..()
|
||||
|
||||
/datum/reagent/blob/regenerative_materia/on_mob_end_metabolize(mob/living/M)
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/N = M
|
||||
N.hal_screwyhud = 0
|
||||
..()
|
||||
|
||||
//kills sleeping targets and turns them into blob zombies, produces fragile spores when killed or on expanding
|
||||
/datum/reagent/blob/zombifying_pods
|
||||
name = "Zombifying Pods"
|
||||
description = "will do very low toxin damage and harvest sleeping targets for additional resources and a blob zombie."
|
||||
effectdesc = "will also produce fragile spores when killed and on expanding."
|
||||
taste_description = "fungi"
|
||||
shortdesc = "will do very low toxin damage and harvest sleeping targets for additional resources(for your overmind) and a blob zombie."
|
||||
analyzerdescdamage = "Does very low toxin damage and kills unconscious humans, turning them into blob zombies."
|
||||
analyzerdesceffect = "Produces spores when expanding and when killed."
|
||||
color = "#E88D5D"
|
||||
complementary_color = "#823ABB"
|
||||
message_living = ", and you feel tired"
|
||||
|
||||
/datum/reagent/blob/zombifying_pods/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.6*reac_volume, TOX)
|
||||
if(O && ishuman(M) && M.stat == UNCONSCIOUS)
|
||||
M.death() //sleeping in a fight? bad plan.
|
||||
var/points = rand(5, 10)
|
||||
var/mob/living/simple_animal/hostile/blob/blobspore/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(get_turf(M))
|
||||
BS.overmind = O
|
||||
BS.update_icons()
|
||||
O.blob_mobs.Add(BS)
|
||||
BS.Zombify(M)
|
||||
O.add_points(points)
|
||||
to_chat(O, "<span class='notice'>Gained [points] resources from the zombification of [M].</span>")
|
||||
|
||||
/datum/reagent/blob/zombifying_pods/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && damage <= 20 && B.obj_integrity - damage <= 0 && prob(30)) //if the cause isn't fire or a bomb, the damage is less than 21, we're going to die from that damage, 20% chance of a shitty spore.
|
||||
B.visible_message("<span class='warning'><b>A spore floats free of the blob!</b></span>")
|
||||
var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(B.loc)
|
||||
BS.overmind = B.overmind
|
||||
BS.update_icons()
|
||||
B.overmind.blob_mobs.Add(BS)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/blob/zombifying_pods/expand_reaction(obj/structure/blob/B, obj/structure/blob/newB, turf/T, mob/camera/blob/O)
|
||||
if(prob(10))
|
||||
var/mob/living/simple_animal/hostile/blob/blobspore/weak/BS = new/mob/living/simple_animal/hostile/blob/blobspore/weak(T)
|
||||
BS.overmind = B.overmind
|
||||
BS.update_icons()
|
||||
newB.overmind.blob_mobs.Add(BS)
|
||||
|
||||
//does tons of oxygen damage and a little stamina, immune to tesla bolts, weak to EMP
|
||||
/datum/reagent/blob/energized_jelly
|
||||
name = "Energized Jelly"
|
||||
description = "will cause low stamina and high oxygen damage, and cause targets to be unable to breathe."
|
||||
taste_description = "gelatin"
|
||||
effectdesc = "will also conduct electricity, but takes damage from EMPs."
|
||||
analyzerdescdamage = "Does low stamina damage, high oxygen damage, and prevents targets from breathing."
|
||||
analyzerdesceffect = "Is immune to electricity and will easily conduct it, but is weak to EMPs."
|
||||
color = "#EFD65A"
|
||||
complementary_color = "#00E5B1"
|
||||
message_living = ", and you feel a horrible tingling sensation"
|
||||
|
||||
/datum/reagent/blob/energized_jelly/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
|
||||
reac_volume = ..()
|
||||
M.losebreath += round(0.2*reac_volume)
|
||||
M.adjustStaminaLoss(0.4*reac_volume)
|
||||
if(M)
|
||||
M.apply_damage(0.6*reac_volume, OXY)
|
||||
|
||||
/datum/reagent/blob/energized_jelly/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") && B.obj_integrity - damage <= 0 && prob(10))
|
||||
do_sparks(rand(2, 4), FALSE, B)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/blob/energized_jelly/tesla_reaction(obj/structure/blob/B, power)
|
||||
return 0
|
||||
|
||||
/datum/reagent/blob/energized_jelly/emp_reaction(obj/structure/blob/B, severity)
|
||||
var/damage = rand(30, 50) - severity * rand(10, 15)
|
||||
B.take_damage(damage, BURN, "energy")
|
||||
|
||||
//does aoe brute damage when hitting targets, is immune to explosions
|
||||
/datum/reagent/blob/explosive_lattice
|
||||
name = "Explosive Lattice"
|
||||
description = "will do brute damage in an area around targets."
|
||||
taste_description = "the bomb"
|
||||
effectdesc = "will also resist explosions, but takes increased damage from fire and other energy sources."
|
||||
analyzerdescdamage = "Does medium brute damage and causes damage to everyone near its targets."
|
||||
analyzerdesceffect = "Is highly resistant to explosions, but takes increased damage from fire and other energy sources."
|
||||
color = "#8B2500"
|
||||
complementary_color = "#00668B"
|
||||
blobbernaut_message = "blasts"
|
||||
message = "The blob blasts you"
|
||||
|
||||
/datum/reagent/blob/explosive_lattice/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
|
||||
var/initial_volume = reac_volume
|
||||
reac_volume = ..()
|
||||
if(reac_volume >= 10) //if it's not a spore cloud, bad time incoming
|
||||
var/obj/effect/temp_visual/explosion/fast/E = new /obj/effect/temp_visual/explosion/fast(get_turf(M))
|
||||
E.alpha = 150
|
||||
for(var/mob/living/L in orange(get_turf(M), 1))
|
||||
if(ROLE_BLOB in L.faction) //no friendly fire
|
||||
continue
|
||||
var/aoe_volume = ..(L, TOUCH, initial_volume, 0, L.get_permeability_protection(), O)
|
||||
L.apply_damage(0.4*aoe_volume, BRUTE)
|
||||
if(M)
|
||||
M.apply_damage(0.6*reac_volume, BRUTE)
|
||||
else
|
||||
M.apply_damage(0.6*reac_volume, BRUTE)
|
||||
|
||||
/datum/reagent/blob/explosive_lattice/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if(damage_flag == "bomb")
|
||||
return 0
|
||||
else if(damage_flag != "melee" && damage_flag != "bullet" && damage_flag != "laser")
|
||||
return damage * 1.5
|
||||
return ..()
|
||||
|
||||
//does brute, burn, and toxin damage, and cools targets down
|
||||
/datum/reagent/blob/cryogenic_poison
|
||||
name = "Cryogenic Poison"
|
||||
description = "will inject targets with a freezing poison that does high damage over time."
|
||||
analyzerdescdamage = "Injects targets with a freezing poison that will gradually solidify the target's internal organs."
|
||||
color = "#8BA6E9"
|
||||
taste_description = "brain freeze"
|
||||
complementary_color = "#7D6EB4"
|
||||
blobbernaut_message = "injects"
|
||||
message = "The blob stabs you"
|
||||
message_living = ", and you feel like your insides are solidifying"
|
||||
|
||||
/datum/reagent/blob/cryogenic_poison/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
|
||||
reac_volume = ..()
|
||||
if(M.reagents)
|
||||
M.reagents.add_reagent(/datum/reagent/consumable/frostoil, 0.3*reac_volume)
|
||||
M.reagents.add_reagent(/datum/reagent/consumable/ice, 0.3*reac_volume)
|
||||
M.reagents.add_reagent(/datum/reagent/blob/cryogenic_poison, 0.3*reac_volume)
|
||||
M.apply_damage(0.2*reac_volume, BRUTE)
|
||||
|
||||
/datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(0.3*REM, 0)
|
||||
M.adjustFireLoss(0.3*REM, 0)
|
||||
M.adjustToxLoss(0.3*REM, 0)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
//does burn damage and EMPs, slightly fragile
|
||||
/datum/reagent/blob/electromagnetic_web
|
||||
name = "Electromagnetic Web"
|
||||
description = "will do high burn damage and EMP targets."
|
||||
taste_description = "pop rocks"
|
||||
effectdesc = "will also take massively increased damage and release an EMP when killed."
|
||||
analyzerdescdamage = "Does low burn damage and EMPs targets."
|
||||
analyzerdesceffect = "Is fragile to all types of damage, but takes massive damage from brute. In addition, releases a small EMP when killed."
|
||||
color = "#83ECEC"
|
||||
complementary_color = "#EC8383"
|
||||
blobbernaut_message = "lashes"
|
||||
message = "The blob lashes you"
|
||||
message_living = ", and you hear a faint buzzing"
|
||||
|
||||
/datum/reagent/blob/electromagnetic_web/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
|
||||
reac_volume = ..()
|
||||
if(prob(reac_volume*2))
|
||||
M.emp_act(EMP_LIGHT)
|
||||
if(M)
|
||||
M.apply_damage(reac_volume, BURN)
|
||||
|
||||
/datum/reagent/blob/electromagnetic_web/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if(damage_type == BRUTE) //take full brute
|
||||
switch(B.brute_resist)
|
||||
if(0.5)
|
||||
return damage * 2
|
||||
if(0.25)
|
||||
return damage * 4
|
||||
if(0.1)
|
||||
return damage * 10
|
||||
return damage * 1.25 //a laser will do 25 damage, which will kill any normal blob
|
||||
|
||||
/datum/reagent/blob/electromagnetic_web/death_reaction(obj/structure/blob/B, damage_flag)
|
||||
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser")
|
||||
empulse(B.loc, 1, 3) //less than screen range, so you can stand out of range to avoid it
|
||||
|
||||
//does brute damage, bonus damage for each nearby blob, and spreads damage out
|
||||
/datum/reagent/blob/synchronous_mesh
|
||||
name = "Synchronous Mesh"
|
||||
description = "will do massively increased brute damage for each blob near the target."
|
||||
effectdesc = "will also spread damage between each blob near the attacked blob."
|
||||
taste_description = "toxic mold"
|
||||
analyzerdescdamage = "Does brute damage, increasing for each blob near the target."
|
||||
analyzerdesceffect = "When attacked, spreads damage between all blobs near the attacked blob."
|
||||
color = "#65ADA2"
|
||||
complementary_color = "#AD6570"
|
||||
blobbernaut_message = "synchronously strikes"
|
||||
message = "The blobs strike you"
|
||||
|
||||
/datum/reagent/blob/synchronous_mesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
|
||||
reac_volume = ..()
|
||||
M.apply_damage(0.2*reac_volume, BRUTE)
|
||||
if(M && reac_volume)
|
||||
for(var/obj/structure/blob/B in range(1, M)) //if the target is completely surrounded, this is 2.4*reac_volume bonus damage, total of 2.6*reac_volume
|
||||
if(M)
|
||||
B.blob_attack_animation(M) //show them they're getting a bad time
|
||||
M.apply_damage(0.3*reac_volume, BRUTE)
|
||||
|
||||
/datum/reagent/blob/synchronous_mesh/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") //the cause isn't fire or bombs, so split the damage
|
||||
var/damagesplit = 1 //maximum split is 9, reducing the damage each blob takes to 11% but doing that damage to 9 blobs
|
||||
for(var/obj/structure/blob/C in orange(1, B))
|
||||
if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blob_reagent_datum.type == B.overmind.blob_reagent_datum.type) //if it doesn't have the same chemical or is a core or node, don't split damage to it
|
||||
damagesplit += 1
|
||||
for(var/obj/structure/blob/C in orange(1, B))
|
||||
if(!istype(C, /obj/structure/blob/core) && !istype(C, /obj/structure/blob/node) && C.overmind && C.overmind.blob_reagent_datum.type == B.overmind.blob_reagent_datum.type) //only hurt blobs that have the same overmind chemical and aren't cores or nodes
|
||||
C.take_damage(damage/damagesplit, CLONE, 0, 0)
|
||||
return damage / damagesplit
|
||||
else
|
||||
return damage * 1.25
|
||||
|
||||
//does brute damage through armor and bio resistance
|
||||
/datum/reagent/blob/reactive_spines
|
||||
name = "Reactive Spines"
|
||||
description = "will do medium brute damage through armor and bio resistance."
|
||||
taste_description = "rock"
|
||||
effectdesc = "will also react when attacked with brute damage, attacking all near the attacked blob."
|
||||
analyzerdescdamage = "Does medium brute damage, ignoring armor and bio resistance."
|
||||
analyzerdesceffect = "When attacked with brute damage, will lash out, attacking everything near it."
|
||||
color = "#9ACD32"
|
||||
complementary_color = "#FFA500"
|
||||
blobbernaut_message = "stabs"
|
||||
message = "The blob stabs you"
|
||||
|
||||
/datum/reagent/blob/reactive_spines/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
|
||||
if(M.stat == DEAD || istype(M, /mob/living/simple_animal/hostile/blob))
|
||||
return 0 //the dead, and blob mobs, don't cause reactions
|
||||
M.adjustBruteLoss(0.8*reac_volume)
|
||||
|
||||
/datum/reagent/blob/reactive_spines/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if(damage && damage_type == BRUTE && B.obj_integrity - damage > 0) //is there any damage, is it brute, and will we be alive
|
||||
if(damage_flag == "melee")
|
||||
B.visible_message("<span class='boldwarning'>The blob retaliates, lashing out!</span>")
|
||||
for(var/atom/A in range(1, B))
|
||||
A.blob_act(B)
|
||||
return ..()
|
||||
|
||||
//does low brute damage, oxygen damage, and stamina damage and wets tiles when damaged
|
||||
/datum/reagent/blob/pressurized_slime
|
||||
name = "Pressurized Slime"
|
||||
description = "will do low brute, oxygen, and stamina damage, and wet tiles under targets."
|
||||
effectdesc = "will also wet tiles near blobs that are attacked or killed."
|
||||
taste_description = "a sponge"
|
||||
analyzerdescdamage = "Does low brute damage, low oxygen damage, drains stamina, and wets tiles under targets, extinguishing them."
|
||||
analyzerdesceffect = "When attacked or killed, wets nearby tiles, extinguishing anything on them."
|
||||
color = "#AAAABB"
|
||||
complementary_color = "#BBBBAA"
|
||||
blobbernaut_message = "emits slime at"
|
||||
message = "The blob splashes into you"
|
||||
message_living = ", and you gasp for breath"
|
||||
|
||||
/datum/reagent/blob/pressurized_slime/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message, touch_protection, mob/camera/blob/O)
|
||||
reac_volume = ..()
|
||||
var/turf/open/T = get_turf(M)
|
||||
if(istype(T) && prob(reac_volume))
|
||||
T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
|
||||
M.adjust_fire_stacks(-(reac_volume / 10))
|
||||
M.ExtinguishMob()
|
||||
M.apply_damage(0.4*reac_volume, BRUTE)
|
||||
if(M)
|
||||
M.apply_damage(0.4*reac_volume, OXY)
|
||||
if(M)
|
||||
M.adjustStaminaLoss(0.2*reac_volume)
|
||||
|
||||
/datum/reagent/blob/pressurized_slime/damage_reaction(obj/structure/blob/B, damage, damage_type, damage_flag)
|
||||
if((damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser") || damage_type != BURN)
|
||||
extinguisharea(B, damage)
|
||||
return ..()
|
||||
|
||||
/datum/reagent/blob/pressurized_slime/death_reaction(obj/structure/blob/B, damage_flag)
|
||||
if(damage_flag == "melee" || damage_flag == "bullet" || damage_flag == "laser")
|
||||
B.visible_message("<span class='boldwarning'>The blob ruptures, spraying the area with liquid!</span>")
|
||||
extinguisharea(B, 50)
|
||||
|
||||
/datum/reagent/blob/pressurized_slime/proc/extinguisharea(obj/structure/blob/B, probchance)
|
||||
for(var/turf/open/T in range(1, B))
|
||||
if(prob(probchance))
|
||||
T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10 SECONDS, wet_time_to_add = 5 SECONDS)
|
||||
for(var/obj/O in T)
|
||||
O.extinguish()
|
||||
for(var/mob/living/L in T)
|
||||
L.adjust_fire_stacks(-2.5)
|
||||
L.ExtinguishMob()
|
||||
@@ -136,6 +136,14 @@
|
||||
. = 1
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/strawberryjuice
|
||||
name = "Strawberry Juice"
|
||||
description = "Refreshing seasonal summer drink."
|
||||
color = "#E50D31"
|
||||
taste_description = "strawberry"
|
||||
glass_name = "glass of strawberry juice"
|
||||
glass_desc = "Refreshing seasonal summer drink."
|
||||
|
||||
/datum/reagent/consumable/nothing
|
||||
name = "Nothing"
|
||||
description = "Absolutely nothing."
|
||||
@@ -812,6 +820,14 @@
|
||||
taste_description = "peaches"
|
||||
glass_name = "glass of peach juice"
|
||||
|
||||
/datum/reagent/consumable/pineapplejuice
|
||||
name = "Pineapple Juice"
|
||||
description = "Tart, tropical, and hotly debated."
|
||||
color = "#F7D435"
|
||||
taste_description = "pineapple"
|
||||
glass_name = "glass of pineapple juice"
|
||||
glass_desc = "Tart, tropical, and hotly debated."
|
||||
|
||||
/datum/reagent/consumable/cream_soda
|
||||
name = "Cream Soda"
|
||||
description = "A classic space-American vanilla flavored soft drink."
|
||||
@@ -826,6 +842,19 @@
|
||||
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, BODYTEMP_NORMAL)
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/sol_dry
|
||||
name = "Sol Dry"
|
||||
description = "A soothing, mellow drink made from ginger."
|
||||
color = "#f7d26a"
|
||||
quality = DRINK_NICE
|
||||
taste_description = "sweet ginger spice"
|
||||
glass_name = "Sol Dry"
|
||||
glass_desc = "A soothing, mellow drink made from ginger."
|
||||
|
||||
/datum/reagent/consumable/sol_dry/on_mob_life(mob/living/carbon/M)
|
||||
M.adjust_disgust(-5)
|
||||
..()
|
||||
|
||||
/datum/reagent/consumable/red_queen
|
||||
name = "Red Queen"
|
||||
description = "DRINK ME."
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
/datum/reagent/drug/space_drugs/on_mob_life(mob/living/carbon/M)
|
||||
M.set_drugginess(15)
|
||||
if(isturf(M.loc) && !isspaceturf(M.loc))
|
||||
if(M.canmove)
|
||||
if(CHECK_MOBILITY(M, MOBILITY_MOVE))
|
||||
if(prob(10))
|
||||
step(M, pick(GLOB.cardinals))
|
||||
if(prob(7))
|
||||
@@ -52,8 +52,7 @@
|
||||
var/smoke_message = pick("You feel relaxed.", "You feel calmed.","You feel alert.","You feel rugged.")
|
||||
to_chat(M, "<span class='notice'>[smoke_message]</span>")
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "smoked", /datum/mood_event/smoked, name)
|
||||
M.AdjustStun(-20, 0)
|
||||
M.AdjustKnockdown(-20, 0)
|
||||
M.AdjustAllImmobility(-20, 0)
|
||||
M.AdjustUnconscious(-20, 0)
|
||||
M.adjustStaminaLoss(-0.5*REM, 0)
|
||||
..()
|
||||
@@ -72,8 +71,7 @@
|
||||
if(prob(5))
|
||||
var/high_message = pick("You feel jittery.", "You feel like you gotta go fast.", "You feel like you need to step it up.")
|
||||
to_chat(M, "<span class='notice'>[high_message]</span>")
|
||||
M.AdjustStun(-20, 0)
|
||||
M.AdjustKnockdown(-20, 0)
|
||||
M.AdjustAllImmobility(-20, 0)
|
||||
M.AdjustUnconscious(-20, 0)
|
||||
..()
|
||||
. = 1
|
||||
@@ -173,17 +171,18 @@
|
||||
/datum/reagent/drug/methamphetamine/on_mob_metabolize(mob/living/L)
|
||||
..()
|
||||
L.ignore_slowdown(type)
|
||||
ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
|
||||
|
||||
/datum/reagent/drug/methamphetamine/on_mob_end_metabolize(mob/living/L)
|
||||
L.unignore_slowdown(type)
|
||||
REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/M)
|
||||
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.AdjustStun(-40, 0)
|
||||
M.AdjustKnockdown(-40, 0)
|
||||
M.AdjustAllImmobility(-40, 0)
|
||||
M.AdjustUnconscious(-40, 0)
|
||||
M.adjustStaminaLoss(-7.5 * REM, 0)
|
||||
if(jitter)
|
||||
@@ -197,7 +196,7 @@
|
||||
. = 1
|
||||
|
||||
/datum/reagent/drug/methamphetamine/overdose_process(mob/living/M)
|
||||
if(M.canmove && !ismovableatom(M.loc))
|
||||
if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
|
||||
for(var/i in 1 to 4)
|
||||
step(M, pick(GLOB.cardinals))
|
||||
if(prob(20))
|
||||
@@ -224,7 +223,7 @@
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/methamphetamine/addiction_act_stage3(mob/living/M)
|
||||
if(M.canmove && !ismovableatom(M.loc))
|
||||
if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
|
||||
for(var/i = 0, i < 4, i++)
|
||||
step(M, pick(GLOB.cardinals))
|
||||
M.Jitter(15)
|
||||
@@ -234,7 +233,7 @@
|
||||
..()
|
||||
|
||||
/datum/reagent/drug/methamphetamine/addiction_act_stage4(mob/living/carbon/human/M)
|
||||
if(M.canmove && !ismovableatom(M.loc))
|
||||
if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
|
||||
for(var/i = 0, i < 8, i++)
|
||||
step(M, pick(GLOB.cardinals))
|
||||
M.Jitter(20)
|
||||
@@ -286,7 +285,7 @@
|
||||
M.adjustStaminaLoss(-5, 0)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 4)
|
||||
M.hallucination += 5
|
||||
if(M.canmove && !ismovableatom(M.loc))
|
||||
if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
|
||||
step(M, pick(GLOB.cardinals))
|
||||
step(M, pick(GLOB.cardinals))
|
||||
..()
|
||||
@@ -294,7 +293,7 @@
|
||||
|
||||
/datum/reagent/drug/bath_salts/overdose_process(mob/living/M)
|
||||
M.hallucination += 5
|
||||
if(M.canmove && !ismovableatom(M.loc))
|
||||
if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
|
||||
for(var/i in 1 to 8)
|
||||
step(M, pick(GLOB.cardinals))
|
||||
if(prob(20))
|
||||
@@ -305,7 +304,7 @@
|
||||
|
||||
/datum/reagent/drug/bath_salts/addiction_act_stage1(mob/living/M)
|
||||
M.hallucination += 10
|
||||
if(M.canmove && !ismovableatom(M.loc))
|
||||
if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
|
||||
for(var/i = 0, i < 8, i++)
|
||||
step(M, pick(GLOB.cardinals))
|
||||
M.Jitter(5)
|
||||
@@ -316,7 +315,7 @@
|
||||
|
||||
/datum/reagent/drug/bath_salts/addiction_act_stage2(mob/living/M)
|
||||
M.hallucination += 20
|
||||
if(M.canmove && !ismovableatom(M.loc))
|
||||
if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
|
||||
for(var/i = 0, i < 8, i++)
|
||||
step(M, pick(GLOB.cardinals))
|
||||
M.Jitter(10)
|
||||
@@ -328,7 +327,7 @@
|
||||
|
||||
/datum/reagent/drug/bath_salts/addiction_act_stage3(mob/living/M)
|
||||
M.hallucination += 30
|
||||
if(M.canmove && !ismovableatom(M.loc))
|
||||
if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
|
||||
for(var/i = 0, i < 12, i++)
|
||||
step(M, pick(GLOB.cardinals))
|
||||
M.Jitter(15)
|
||||
@@ -340,7 +339,7 @@
|
||||
|
||||
/datum/reagent/drug/bath_salts/addiction_act_stage4(mob/living/carbon/human/M)
|
||||
M.hallucination += 30
|
||||
if(M.canmove && !ismovableatom(M.loc))
|
||||
if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovableatom(M.loc))
|
||||
for(var/i = 0, i < 16, i++)
|
||||
step(M, pick(GLOB.cardinals))
|
||||
M.Jitter(50)
|
||||
|
||||
@@ -323,7 +323,7 @@
|
||||
victim.blind_eyes(2)
|
||||
victim.confused = max(M.confused, 3)
|
||||
victim.damageoverlaytemp = 60
|
||||
victim.Knockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 3, 15))
|
||||
victim.DefaultCombatKnockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 3, 15))
|
||||
return
|
||||
else if ( eyes_covered ) // Eye cover is better than mouth cover
|
||||
victim.blur_eyes(3)
|
||||
@@ -336,7 +336,7 @@
|
||||
victim.blind_eyes(3)
|
||||
victim.confused = max(M.confused, 6)
|
||||
victim.damageoverlaytemp = 75
|
||||
victim.Knockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 5, 25))
|
||||
victim.DefaultCombatKnockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 5, 25))
|
||||
victim.update_damage_hud()
|
||||
|
||||
/datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/carbon/M)
|
||||
|
||||
@@ -46,8 +46,7 @@
|
||||
REMOVE_TRAITS_NOT_IN(M, list(SPECIES_TRAIT, ROUNDSTART_TRAIT, ORGAN_TRAIT))
|
||||
M.set_blurriness(0)
|
||||
M.set_blindness(0)
|
||||
M.SetKnockdown(0, 0)
|
||||
M.SetStun(0, 0)
|
||||
M.SetAllImmobility(0, 0)
|
||||
M.SetUnconscious(0, 0)
|
||||
M.silent = FALSE
|
||||
M.dizziness = 0
|
||||
@@ -87,8 +86,7 @@
|
||||
|
||||
/datum/reagent/medicine/synaptizine/on_mob_life(mob/living/carbon/M)
|
||||
M.drowsyness = max(M.drowsyness-5, 0)
|
||||
M.AdjustStun(-20, 0)
|
||||
M.AdjustKnockdown(-20, 0)
|
||||
M.AdjustAllImmobility(-20, 0)
|
||||
M.AdjustUnconscious(-20, 0)
|
||||
if(holder.has_reagent(/datum/reagent/toxin/mindbreaker))
|
||||
holder.remove_reagent(/datum/reagent/toxin/mindbreaker, 5)
|
||||
@@ -220,7 +218,8 @@
|
||||
. = ..()
|
||||
if(iscarbon(M))
|
||||
var/mob/living/carbon/patient = M
|
||||
if(reac_volume >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, "burn") && patient.getFireLoss() < THRESHOLD_UNHUSK) //One carp yields 12u rezadone.
|
||||
var/vol = reac_volume + M.reagents.get_reagent_amount(/datum/reagent/medicine/rezadone)
|
||||
if(vol >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, "burn") && patient.getFireLoss() < THRESHOLD_UNHUSK) //One carp yields 12u rezadone.
|
||||
patient.cure_husk("burn")
|
||||
patient.visible_message("<span class='nicegreen'>[patient]'s body rapidly absorbs moisture from the enviroment, taking on a more healthy appearance.")
|
||||
|
||||
@@ -427,7 +426,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
overdose_threshold = 40
|
||||
value = 6
|
||||
|
||||
/datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1)
|
||||
/datum/reagent/medicine/synthflesh/reaction_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
|
||||
if(iscarbon(M))
|
||||
if (M.stat == DEAD)
|
||||
show_message = 0
|
||||
@@ -444,8 +443,9 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
if(show_message)
|
||||
to_chat(M, "<span class='danger'>You feel your burns and bruises healing! It stings like hell!</span>")
|
||||
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
|
||||
var/vol = reac_volume + M.reagents.get_reagent_amount(/datum/reagent/medicine/synthflesh)
|
||||
//Has to be at less than THRESHOLD_UNHUSK burn damage and have 100 synthflesh before unhusking. Corpses dont metabolize.
|
||||
if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && M.getFireLoss() < THRESHOLD_UNHUSK && M.reagents.has_reagent(/datum/reagent/medicine/synthflesh, 100))
|
||||
if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && M.getFireLoss() < THRESHOLD_UNHUSK && (vol > 100))
|
||||
M.cure_husk("burn")
|
||||
M.visible_message("<span class='nicegreen'>Most of [M]'s burnt off or charred flesh has been restored.")
|
||||
..()
|
||||
@@ -595,7 +595,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
|
||||
/datum/reagent/medicine/salbutamol
|
||||
name = "Salbutamol"
|
||||
description = "Rapidly restores oxygen deprivation as well as preventing more of it to an extent."
|
||||
description = "Rapidly restores oxygen deprivation as well as preventing more of it to an extent. Causes jittering."
|
||||
reagent_state = LIQUID
|
||||
color = "#00FFFF"
|
||||
metabolization_rate = 0.25 * REAGENTS_METABOLISM
|
||||
@@ -605,6 +605,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
M.adjustOxyLoss(-3*REM, 0)
|
||||
if(M.losebreath >= 4)
|
||||
M.losebreath -= 2
|
||||
M.Jitter(5)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -636,10 +637,9 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
pH = 12
|
||||
|
||||
/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M)
|
||||
M.AdjustStun(-20, 0)
|
||||
M.AdjustKnockdown(-20, 0)
|
||||
M.AdjustUnconscious(-20, 0)
|
||||
M.adjustStaminaLoss(-4.5*REM, 0)
|
||||
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)
|
||||
@@ -847,8 +847,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
M.adjustStaminaLoss(-0.5*REM, 0)
|
||||
. = 1
|
||||
if(prob(20))
|
||||
M.AdjustStun(-20, 0)
|
||||
M.AdjustKnockdown(-20, 0)
|
||||
M.AdjustAllImmobility(-20, 0)
|
||||
M.AdjustUnconscious(-20, 0)
|
||||
..()
|
||||
|
||||
@@ -960,7 +959,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
/datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/M)
|
||||
M.jitteriness = 0
|
||||
if(M.has_dna())
|
||||
M.dna.remove_all_mutations()
|
||||
M.dna.remove_all_mutations(mutadone = TRUE)
|
||||
if(!QDELETED(M)) //We were a monkey, now a human
|
||||
..()
|
||||
|
||||
@@ -995,28 +994,29 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
/datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/L)
|
||||
..()
|
||||
L.add_movespeed_modifier(type, update=TRUE, priority=100, multiplicative_slowdown=-0.5, blacklisted_movetypes=(FLYING|FLOATING))
|
||||
ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
|
||||
|
||||
/datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/L)
|
||||
L.remove_movespeed_modifier(type)
|
||||
REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type)
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/stimulants/on_mob_life(mob/living/carbon/M)
|
||||
if(M.health < 50 && M.health > 0)
|
||||
M.adjustOxyLoss(-1*REM, 0)
|
||||
M.adjustToxLoss(-1*REM, 0)
|
||||
M.adjustBruteLoss(-1*REM, 0)
|
||||
M.adjustFireLoss(-1*REM, 0)
|
||||
M.AdjustStun(-60, 0)
|
||||
M.AdjustKnockdown(-60, 0)
|
||||
M.AdjustUnconscious(-60, 0)
|
||||
M.adjustStaminaLoss(-20*REM, 0)
|
||||
M.adjustOxyLoss(-1*REM, FALSE)
|
||||
M.adjustToxLoss(-1*REM, FALSE)
|
||||
M.adjustBruteLoss(-1*REM, FALSE)
|
||||
M.adjustFireLoss(-1*REM, FALSE)
|
||||
M.AdjustAllImmobility(-60, FALSE)
|
||||
M.AdjustUnconscious(-60, FALSE)
|
||||
M.adjustStaminaLoss(-20*REM, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/stimulants/overdose_process(mob/living/M)
|
||||
if(prob(33))
|
||||
M.adjustStaminaLoss(2.5*REM, 0)
|
||||
M.adjustToxLoss(1*REM, 0)
|
||||
M.adjustStaminaLoss(2.5*REM, FALSE)
|
||||
M.adjustToxLoss(1*REM, FALSE)
|
||||
M.losebreath++
|
||||
. = 1
|
||||
..()
|
||||
@@ -1045,12 +1045,12 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
pH = 5
|
||||
|
||||
/datum/reagent/medicine/bicaridine/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-2*REM, 0)
|
||||
M.adjustBruteLoss(-2*REM, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/bicaridine/overdose_process(mob/living/M)
|
||||
M.adjustBruteLoss(4*REM, 0)
|
||||
M.adjustBruteLoss(4*REM, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1063,12 +1063,12 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
pH = 9.7
|
||||
|
||||
/datum/reagent/medicine/dexalin/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustOxyLoss(-2*REM, 0)
|
||||
M.adjustOxyLoss(-2*REM, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/dexalin/overdose_process(mob/living/M)
|
||||
M.adjustOxyLoss(4*REM, 0)
|
||||
M.adjustOxyLoss(4*REM, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1081,12 +1081,12 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
pH = 9
|
||||
|
||||
/datum/reagent/medicine/kelotane/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustFireLoss(-2*REM, 0)
|
||||
M.adjustFireLoss(-2*REM, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/kelotane/overdose_process(mob/living/M)
|
||||
M.adjustFireLoss(4*REM, 0)
|
||||
M.adjustFireLoss(4*REM, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1100,14 +1100,14 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
pH = 10
|
||||
|
||||
/datum/reagent/medicine/antitoxin/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustToxLoss(-2*REM, 0)
|
||||
M.adjustToxLoss(-2*REM, FALSE)
|
||||
for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
|
||||
M.reagents.remove_reagent(R.type,1)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
/datum/reagent/medicine/antitoxin/overdose_process(mob/living/M)
|
||||
M.adjustToxLoss(4*REM, 0) // End result is 2 toxin loss taken, because it heals 2 and then removes 4.
|
||||
M.adjustToxLoss(4*REM, FALSE) // End result is 2 toxin loss taken, because it heals 2 and then removes 4.
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1133,18 +1133,18 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
|
||||
/datum/reagent/medicine/tricordrazine/on_mob_life(mob/living/carbon/M)
|
||||
if(prob(80))
|
||||
M.adjustBruteLoss(-1*REM, 0)
|
||||
M.adjustFireLoss(-1*REM, 0)
|
||||
M.adjustOxyLoss(-1*REM, 0)
|
||||
M.adjustToxLoss(-1*REM, 0)
|
||||
M.adjustBruteLoss(-1*REM, FALSE)
|
||||
M.adjustFireLoss(-1*REM, FALSE)
|
||||
M.adjustOxyLoss(-1*REM, FALSE)
|
||||
M.adjustToxLoss(-1*REM, FALSE)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/tricordrazine/overdose_process(mob/living/M)
|
||||
M.adjustToxLoss(2*REM, 0)
|
||||
M.adjustOxyLoss(2*REM, 0)
|
||||
M.adjustBruteLoss(2*REM, 0)
|
||||
M.adjustFireLoss(2*REM, 0)
|
||||
M.adjustToxLoss(2*REM, FALSE)
|
||||
M.adjustOxyLoss(2*REM, FALSE)
|
||||
M.adjustBruteLoss(2*REM, FALSE)
|
||||
M.adjustFireLoss(2*REM, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1156,9 +1156,9 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
taste_description = "jelly"
|
||||
|
||||
/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-1.5*REM, 0)
|
||||
M.adjustFireLoss(-1.5*REM, 0)
|
||||
M.adjustOxyLoss(-1.5*REM, 0)
|
||||
M.adjustBruteLoss(-1.5*REM, FALSE)
|
||||
M.adjustFireLoss(-1.5*REM, FALSE)
|
||||
M.adjustOxyLoss(-1.5*REM, FALSE)
|
||||
M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs
|
||||
. = 1
|
||||
..()
|
||||
@@ -1171,13 +1171,13 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
pH = 11
|
||||
|
||||
/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-5*REM, 0) //A ton of healing - this is a 50 telecrystal investment.
|
||||
M.adjustFireLoss(-5*REM, 0)
|
||||
M.adjustOxyLoss(-15, 0)
|
||||
M.adjustToxLoss(-5*REM, 0)
|
||||
M.adjustBruteLoss(-5*REM, FALSE) //A ton of healing - this is a 50 telecrystal investment.
|
||||
M.adjustFireLoss(-5*REM, FALSE)
|
||||
M.adjustOxyLoss(-15, FALSE)
|
||||
M.adjustToxLoss(-5*REM, FALSE)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM)
|
||||
M.adjustCloneLoss(-3*REM, 0)
|
||||
M.adjustStaminaLoss(-25*REM,0)
|
||||
M.adjustCloneLoss(-3*REM, FALSE)
|
||||
M.adjustStaminaLoss(-25*REM,FALSE)
|
||||
if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio))
|
||||
M.blood_volume += 40 // blood fall out man bad
|
||||
..()
|
||||
@@ -1191,13 +1191,13 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
pH = 11
|
||||
|
||||
/datum/reagent/medicine/lesser_syndicate_nanites/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-3*REM, 0) // hidden gold shh
|
||||
M.adjustFireLoss(-3*REM, 0)
|
||||
M.adjustOxyLoss(-15, 0)
|
||||
M.adjustToxLoss(-3*REM, 0)
|
||||
M.adjustBruteLoss(-3*REM, FALSE) // hidden gold shh
|
||||
M.adjustFireLoss(-3*REM, FALSE)
|
||||
M.adjustOxyLoss(-15, FALSE)
|
||||
M.adjustToxLoss(-3*REM, FALSE)
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM)
|
||||
M.adjustCloneLoss(-3*REM, 0)
|
||||
M.adjustStaminaLoss(-20*REM,0)
|
||||
M.adjustCloneLoss(-3*REM, FALSE)
|
||||
M.adjustStaminaLoss(-20*REM,FALSE)
|
||||
if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio))
|
||||
M.blood_volume += 20 // blood fall out man bad
|
||||
..()
|
||||
@@ -1214,17 +1214,17 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
pH = 11.8
|
||||
|
||||
/datum/reagent/medicine/neo_jelly/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-1.5*REM, 0)
|
||||
M.adjustFireLoss(-1.5*REM, 0)
|
||||
M.adjustOxyLoss(-1.5*REM, 0)
|
||||
M.adjustBruteLoss(-1.5*REM, FALSE)
|
||||
M.adjustFireLoss(-1.5*REM, FALSE)
|
||||
M.adjustOxyLoss(-1.5*REM, FALSE)
|
||||
M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs
|
||||
. = 1
|
||||
..()
|
||||
|
||||
/datum/reagent/medicine/neo_jelly/overdose_process(mob/living/M)
|
||||
M.adjustOxyLoss(2.6*REM, 0)
|
||||
M.adjustBruteLoss(3.5*REM, 0)
|
||||
M.adjustFireLoss(3.5*REM, 0)
|
||||
M.adjustOxyLoss(2.6*REM, FALSE)
|
||||
M.adjustBruteLoss(3.5*REM, FALSE)
|
||||
M.adjustFireLoss(3.5*REM, FALSE)
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1236,13 +1236,13 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
pH = 11
|
||||
|
||||
/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M)
|
||||
M.adjustBruteLoss(-3 * REM, 0)
|
||||
M.adjustFireLoss(-3 * REM, 0)
|
||||
M.adjustOxyLoss(-15 * REM, 0)
|
||||
M.adjustToxLoss(-3 * REM, 0, TRUE) //Heals TOXINLOVERS
|
||||
M.adjustBruteLoss(-3 * REM, FALSE)
|
||||
M.adjustFireLoss(-3 * REM, FALSE)
|
||||
M.adjustOxyLoss(-15 * REM, FALSE)
|
||||
M.adjustToxLoss(-3 * REM, FALSE, TRUE) //Heals TOXINLOVERS
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that!
|
||||
M.adjustCloneLoss(-1 * REM, 0)
|
||||
M.adjustStaminaLoss(-13 * REM, 0)
|
||||
M.adjustCloneLoss(-1 * REM, FALSE)
|
||||
M.adjustStaminaLoss(-13 * REM, FALSE)
|
||||
M.jitteriness = min(max(0, M.jitteriness + 3), 30)
|
||||
M.druggy = min(max(0, M.druggy + 10), 15) //See above
|
||||
..()
|
||||
@@ -1250,7 +1250,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
|
||||
/datum/reagent/medicine/earthsblood/overdose_process(mob/living/M)
|
||||
M.hallucination = min(max(0, M.hallucination + 5), 60)
|
||||
M.adjustToxLoss(8 * REM, 0, TRUE) //Hurts TOXINLOVERS
|
||||
M.adjustToxLoss(8 * REM, FALSE, TRUE) //Hurts TOXINLOVERS
|
||||
..()
|
||||
. = 1
|
||||
|
||||
@@ -1303,10 +1303,17 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
color = "#918e53"
|
||||
overdose_threshold = 30
|
||||
|
||||
/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.AdjustStun(-20, 0)
|
||||
M.AdjustKnockdown(-20, 0)
|
||||
M.AdjustAllImmobility(-20, 0)
|
||||
M.AdjustSleeping(-20, 0)
|
||||
M.adjustStaminaLoss(-30, 0)
|
||||
..()
|
||||
@@ -1389,8 +1396,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
/datum/reagent/medicine/modafinil/on_mob_life(mob/living/carbon/M)
|
||||
if(!overdosed) // We do not want any effects on OD
|
||||
overdose_threshold = overdose_threshold + rand(-10,10)/10 // for extra fun
|
||||
M.AdjustStun(-5, 0)
|
||||
M.AdjustKnockdown(-5, 0)
|
||||
M.AdjustAllImmobility(-5, 0)
|
||||
M.AdjustUnconscious(-5, 0)
|
||||
M.adjustStaminaLoss(-1*REM, 0)
|
||||
M.Jitter(1)
|
||||
@@ -1422,7 +1428,7 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
|
||||
if(prob(20))
|
||||
to_chat(M, "You have a sudden fit!")
|
||||
M.emote("moan")
|
||||
M.Knockdown(20, 1, 0) // you should be in a bad spot at this point unless epipen has been used
|
||||
M.DefaultCombatKnockdown(20, 1, 0) // you should be in a bad spot at this point unless epipen has been used
|
||||
if(81)
|
||||
to_chat(M, "You feel too exhausted to continue!") // at this point you will eventually die unless you get charcoal
|
||||
M.adjustOxyLoss(0.1*REM, 0)
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
shot_glass_icon_state = "shotglassred"
|
||||
pH = 7.4
|
||||
|
||||
/datum/reagent/blood/reaction_mob(mob/living/L, method=TOUCH, reac_volume)
|
||||
/datum/reagent/blood/reaction_mob(mob/living/L, method = TOUCH, reac_volume)
|
||||
if(data && data["viruses"])
|
||||
for(var/thing in data["viruses"])
|
||||
var/datum/disease/D = thing
|
||||
@@ -26,6 +26,18 @@
|
||||
else //ingest, patch or inject
|
||||
L.ForceContractDisease(D)
|
||||
|
||||
if(data["blood_type"] == "SY")
|
||||
//Synthblood is very disgusting to bloodsuckers. They will puke it out to expel it, unless they have masquarade on
|
||||
switch(reac_volume)
|
||||
if(0 to 3)
|
||||
disgust_bloodsucker(L, 3, FALSE, FALSE, FALSE)
|
||||
if(3 to 6)
|
||||
//If theres more than 8 units, they will start expelling it, even if they are masquarading.
|
||||
disgust_bloodsucker(L, 5, FALSE, FALSE, TRUE)
|
||||
else
|
||||
//If they have too much in them, they will also puke out their blood.
|
||||
disgust_bloodsucker(L, 7, -5, TRUE, TRUE)
|
||||
|
||||
if(iscarbon(L))
|
||||
var/mob/living/carbon/C = L
|
||||
var/blood_id = C.get_blood_id()
|
||||
@@ -37,10 +49,8 @@
|
||||
L.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
|
||||
|
||||
/datum/reagent/blood/on_mob_life(mob/living/carbon/C) //Because lethals are preferred over stamina. damnifino.
|
||||
if((HAS_TRAIT(C, TRAIT_NOMARROW)))
|
||||
return //We dont want vampires getting toxed from blood
|
||||
var/blood_id = C.get_blood_id()
|
||||
if((blood_id == /datum/reagent/blood || blood_id == /datum/reagent/blood/jellyblood))
|
||||
if((blood_id in GLOB.blood_reagent_types) && !HAS_TRAIT(C, TRAIT_NOMARROW))
|
||||
if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) //we only care about bloodtype here because this is where the poisoning should be
|
||||
C.adjustToxLoss(rand(2,8)*REM, TRUE, TRUE) //forced to ensure people don't use it to gain beneficial toxin as slime person
|
||||
..()
|
||||
@@ -117,7 +127,7 @@
|
||||
if(!istype(D, /datum/disease/advance))
|
||||
preserve += D
|
||||
data["viruses"] = preserve
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/datum/reagent/blood/proc/get_diseases()
|
||||
. = list()
|
||||
@@ -142,6 +152,13 @@
|
||||
taste_mult = 1.3
|
||||
pH = 4
|
||||
|
||||
/datum/reagent/blood/tomato
|
||||
data = list("donor"=null,"viruses"=null,"blood_DNA"=null, "bloodcolor" = BLOOD_COLOR_HUMAN, "blood_type"="SY","resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null,"cloneable"=null,"factions"=null)
|
||||
name = "Tomato Blood"
|
||||
description = "This highly resembles blood, but it doesnt actually function like it, resembling more ketchup, with a more blood-like consistency."
|
||||
taste_description = "sap" //Like tree sap?
|
||||
pH = 7.45
|
||||
|
||||
/datum/reagent/blood/jellyblood/on_mob_life(mob/living/carbon/M)
|
||||
if(prob(10))
|
||||
if(M.dna?.species?.exotic_bloodtype != "GEL")
|
||||
@@ -214,6 +231,7 @@
|
||||
description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen."
|
||||
color = "#AAAAAA77" // rgb: 170, 170, 170, 77 (alpha)
|
||||
taste_description = "water"
|
||||
overdose_threshold = 150 //Imagine drinking a gallon of water
|
||||
var/cooling_temperature = 2
|
||||
glass_icon_state = "glass_clear"
|
||||
glass_name = "glass of water"
|
||||
@@ -280,6 +298,10 @@
|
||||
M.ExtinguishMob()
|
||||
..()
|
||||
|
||||
/datum/reagent/water/overdose_start(mob/living/M)
|
||||
metabolization_rate = 45 * REAGENTS_METABOLISM
|
||||
. = 1
|
||||
|
||||
/datum/reagent/water/holywater
|
||||
name = "Holy Water"
|
||||
description = "Water blessed by some deity."
|
||||
@@ -361,6 +383,7 @@
|
||||
|
||||
/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke
|
||||
name = "Unholy Water"
|
||||
overdose_threshold = 150 //Same as normal water
|
||||
description = "Something that shouldn't exist on this plane of existence."
|
||||
taste_description = "suffering"
|
||||
pH = 6.5
|
||||
@@ -374,25 +397,28 @@
|
||||
/datum/reagent/fuel/unholywater/on_mob_life(mob/living/carbon/M)
|
||||
if(iscultist(M))
|
||||
M.drowsyness = max(M.drowsyness-5, 0)
|
||||
M.AdjustUnconscious(-20, 0)
|
||||
M.AdjustStun(-40, 0)
|
||||
M.AdjustKnockdown(-40, 0)
|
||||
M.adjustStaminaLoss(-10, 0)
|
||||
M.adjustToxLoss(-2, 0, TRUE)
|
||||
M.adjustOxyLoss(-2, 0)
|
||||
M.adjustBruteLoss(-2, 0)
|
||||
M.adjustFireLoss(-2, 0)
|
||||
M.AdjustUnconscious(-20, FALSE)
|
||||
M.AdjustAllImmobility(-40, FALSE)
|
||||
M.adjustStaminaLoss(-10, FALSE)
|
||||
M.adjustToxLoss(-2, FALSE, TRUE)
|
||||
M.adjustOxyLoss(-2, FALSE)
|
||||
M.adjustBruteLoss(-2, FALSE)
|
||||
M.adjustFireLoss(-2, FALSE)
|
||||
if(ishuman(M) && M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio))
|
||||
M.blood_volume += 3
|
||||
else // Will deal about 90 damage when 50 units are thrown
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150)
|
||||
M.adjustToxLoss(2, 0)
|
||||
M.adjustFireLoss(2, 0)
|
||||
M.adjustOxyLoss(2, 0)
|
||||
M.adjustBruteLoss(2, 0)
|
||||
M.adjustToxLoss(2, FALSE)
|
||||
M.adjustFireLoss(2, FALSE)
|
||||
M.adjustOxyLoss(2, FALSE)
|
||||
M.adjustBruteLoss(2, FALSE)
|
||||
holder.remove_reagent(type, 1)
|
||||
return TRUE
|
||||
|
||||
/datum/reagent/fuel/unholywater/overdose_start(mob/living/M)
|
||||
metabolization_rate = 60 * REAGENTS_METABOLISM
|
||||
. = 1
|
||||
|
||||
/datum/reagent/hellwater //if someone has this in their system they've really pissed off an eldrich god
|
||||
name = "Hell Water"
|
||||
description = "YOUR FLESH! IT BURNS!"
|
||||
@@ -401,8 +427,8 @@
|
||||
/datum/reagent/hellwater/on_mob_life(mob/living/carbon/M)
|
||||
M.fire_stacks = min(5,M.fire_stacks + 3)
|
||||
M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
|
||||
M.adjustToxLoss(1, 0)
|
||||
M.adjustFireLoss(1, 0) //Hence the other damages... ain't I a bastard?
|
||||
M.adjustToxLoss(1, FALSE)
|
||||
M.adjustFireLoss(1, FALSE) //Hence the other damages... ain't I a bastard?
|
||||
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5, 150)
|
||||
holder.remove_reagent(type, 1)
|
||||
pH = 0.1
|
||||
@@ -415,23 +441,23 @@
|
||||
/datum/reagent/fuel/holyoil/on_mob_life(mob/living/carbon/M)
|
||||
if(is_servant_of_ratvar(M))
|
||||
M.drowsyness = max(M.drowsyness-5, 0)
|
||||
M.AdjustUnconscious(-60, 0)
|
||||
M.AdjustStun(-30, 0)
|
||||
M.AdjustKnockdown(-70, 0)
|
||||
M.adjustStaminaLoss(-15, 0)
|
||||
M.adjustToxLoss(-5, 0, TRUE)
|
||||
M.adjustOxyLoss(-3, 0)
|
||||
M.adjustBruteLoss(-3, 0)
|
||||
M.adjustFireLoss(-5, 0)
|
||||
M.AdjustUnconscious(-60, FALSE)
|
||||
M.AdjustAllImmobility(-30, FALSE)
|
||||
M.AdjustKnockdown(-40, FALSE)
|
||||
M.adjustStaminaLoss(-15, FALSE)
|
||||
M.adjustToxLoss(-5, FALSE, TRUE)
|
||||
M.adjustOxyLoss(-3, FALSE)
|
||||
M.adjustBruteLoss(-3, FALSE)
|
||||
M.adjustFireLoss(-5, FALSE)
|
||||
if(iscultist(M))
|
||||
M.AdjustUnconscious(1, 0)
|
||||
M.AdjustStun(10, 0)
|
||||
M.AdjustKnockdown(20, 0)
|
||||
M.adjustStaminaLoss(15, 0)
|
||||
M.AdjustUnconscious(1, FALSE)
|
||||
M.AdjustAllImmobility(10, FALSE)
|
||||
M.AdjustKnockdown(10, FALSE)
|
||||
M.adjustStaminaLoss(15, FALSE)
|
||||
else
|
||||
M.adjustToxLoss(3, 0)
|
||||
M.adjustOxyLoss(2, 0)
|
||||
M.adjustStaminaLoss(10, 0)
|
||||
M.adjustToxLoss(3, FALSE)
|
||||
M.adjustOxyLoss(2, FALSE)
|
||||
M.adjustStaminaLoss(10, FALSE)
|
||||
holder.remove_reagent(type, 1)
|
||||
return TRUE
|
||||
|
||||
@@ -584,7 +610,7 @@
|
||||
return
|
||||
to_chat(H, "<span class='warning'><b>You crumple in agony as your flesh wildly morphs into new forms!</b></span>")
|
||||
H.visible_message("<b>[H]</b> falls to the ground and screams as [H.p_their()] skin bubbles and froths!") //'froths' sounds painful when used with SKIN.
|
||||
H.Knockdown(60)
|
||||
H.DefaultCombatKnockdown(60)
|
||||
addtimer(CALLBACK(src, .proc/mutate, H), 30)
|
||||
return
|
||||
|
||||
@@ -890,7 +916,7 @@
|
||||
taste_mult = 0 // apparently tasteless.
|
||||
|
||||
/datum/reagent/mercury/on_mob_life(mob/living/carbon/M)
|
||||
if(M.canmove && !isspaceturf(M.loc))
|
||||
if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !isspaceturf(M.loc))
|
||||
step(M, pick(GLOB.cardinals))
|
||||
if(prob(5))
|
||||
M.emote(pick("twitch","drool","moan"))
|
||||
@@ -970,7 +996,7 @@
|
||||
pH = 11.3
|
||||
|
||||
/datum/reagent/lithium/on_mob_life(mob/living/carbon/M)
|
||||
if(M.canmove && !isspaceturf(M.loc))
|
||||
if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !isspaceturf(M.loc))
|
||||
step(M, pick(GLOB.cardinals))
|
||||
if(prob(5))
|
||||
M.emote(pick("twitch","drool","moan"))
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
shock_timer++
|
||||
if(shock_timer >= rand(5,30)) //Random shocks are wildly unpredictable
|
||||
shock_timer = 0
|
||||
M.electrocute_act(rand(5,20), "Teslium in their body", 1, 1) //Override because it's caused from INSIDE of you
|
||||
M.electrocute_act(rand(5,20), "Teslium in their body", 1, SHOCK_NOGLOVES) //Override because it's caused from INSIDE of you
|
||||
playsound(M, "sparks", 50, 1)
|
||||
..()
|
||||
|
||||
@@ -227,8 +227,7 @@
|
||||
/datum/reagent/teslium/energized_jelly/on_mob_life(mob/living/carbon/M)
|
||||
if(isjellyperson(M))
|
||||
shock_timer = 0 //immune to shocks
|
||||
M.AdjustStun(-40, 0)
|
||||
M.AdjustKnockdown(-40, 0)
|
||||
M.AdjustAllImmobility(-40, 0)
|
||||
M.AdjustUnconscious(-40, 0)
|
||||
M.adjustStaminaLoss(-2, 0)
|
||||
if(isluminescent(M))
|
||||
|
||||
@@ -40,9 +40,9 @@
|
||||
if((method==VAPOR && prob(min(33, reac_volume))) || method==INGEST || method==PATCH || method==INJECT)
|
||||
M.randmuti()
|
||||
if(prob(98))
|
||||
M.randmutb()
|
||||
M.easy_randmut(NEGATIVE+MINOR_NEGATIVE)
|
||||
else
|
||||
M.randmutg()
|
||||
M.easy_randmut(POSITIVE)
|
||||
M.updateappearance()
|
||||
M.domutcheck()
|
||||
..()
|
||||
@@ -539,7 +539,7 @@
|
||||
var/picked_option = rand(1,3)
|
||||
switch(picked_option)
|
||||
if(1)
|
||||
C.Knockdown(60, 0)
|
||||
C.DefaultCombatKnockdown(60, 0)
|
||||
. = TRUE
|
||||
if(2)
|
||||
C.losebreath += 10
|
||||
@@ -678,7 +678,7 @@
|
||||
|
||||
/datum/reagent/toxin/curare/on_mob_life(mob/living/carbon/M)
|
||||
if(current_cycle >= 11)
|
||||
M.Knockdown(60, 0)
|
||||
M.DefaultCombatKnockdown(60, 0)
|
||||
M.adjustOxyLoss(1*REM, 0)
|
||||
. = 1
|
||||
..()
|
||||
@@ -843,7 +843,7 @@
|
||||
holder.remove_reagent(type, actual_metaboliztion_rate * M.metabolism_efficiency)
|
||||
M.adjustToxLoss(actual_toxpwr*REM, 0)
|
||||
if(prob(10))
|
||||
M.Knockdown(20, 0)
|
||||
M.DefaultCombatKnockdown(20, 0)
|
||||
. = 1
|
||||
..()
|
||||
|
||||
|
||||
@@ -75,6 +75,28 @@
|
||||
for(var/i = 1, i <= multiplier, i++)
|
||||
new /obj/item/stack/sheet/mineral/gold(location)
|
||||
|
||||
/datum/chemical_reaction/uraniumsolidification
|
||||
name = "Solid Uranium"
|
||||
id = "soliduranium"
|
||||
required_reagents = list(/datum/reagent/consumable/frostoil = 5, /datum/reagent/uranium = 20, /datum/reagent/bromine = 1)
|
||||
mob_react = FALSE
|
||||
|
||||
/datum/chemical_reaction/uraniumsolidification/on_reaction(datum/reagents/holder, multiplier)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
for(var/i = 1, i <= multiplier, i++)
|
||||
new /obj/item/stack/sheet/mineral/uranium(location)
|
||||
|
||||
/datum/chemical_reaction/bluespacecrystalifaction
|
||||
name = "Crystal Bluespace"
|
||||
id = "crystalbluespace"
|
||||
required_reagents = list(/datum/reagent/consumable/frostoil = 5, /datum/reagent/bluespace = 20, /datum/reagent/iron = 1)
|
||||
mob_react = FALSE
|
||||
|
||||
/datum/chemical_reaction/bluespacecrystalifaction/on_reaction(datum/reagents/holder, multiplier)
|
||||
var/location = get_turf(holder.my_atom)
|
||||
for(var/i = 1, i <= multiplier, i++)
|
||||
new /obj/item/stack/sheet/bluespace_crystal(location)
|
||||
|
||||
/datum/chemical_reaction/capsaicincondensation
|
||||
name = "Capsaicincondensation"
|
||||
id = /datum/reagent/consumable/condensedcapsaicin
|
||||
|
||||
@@ -76,7 +76,7 @@
|
||||
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>")
|
||||
C.Knockdown(40)
|
||||
C.DefaultCombatKnockdown(40)
|
||||
C.adjust_fire_stacks(5)
|
||||
C.IgniteMob()
|
||||
..(holder, multiplier, T)
|
||||
@@ -252,7 +252,7 @@
|
||||
for(var/mob/living/carbon/C in get_hearers_in_view(range, location))
|
||||
if(C.flash_act())
|
||||
if(get_dist(C, location) < 4)
|
||||
C.Knockdown(60)
|
||||
C.DefaultCombatKnockdown(60)
|
||||
else
|
||||
C.Stun(100)
|
||||
holder.remove_reagent(/datum/reagent/flash_powder, multiplier*3)
|
||||
@@ -273,7 +273,7 @@
|
||||
for(var/mob/living/carbon/C in get_hearers_in_view(range, location))
|
||||
if(C.flash_act())
|
||||
if(get_dist(C, location) < 4)
|
||||
C.Knockdown(60)
|
||||
C.DefaultCombatKnockdown(60)
|
||||
else
|
||||
C.Stun(100)
|
||||
|
||||
|
||||
@@ -43,14 +43,14 @@
|
||||
set_APTFT()
|
||||
return TRUE
|
||||
|
||||
/obj/item/reagent_containers/proc/set_APTFT(mob/user) //set amount_per_transfer_from_this
|
||||
/obj/item/reagent_containers/proc/set_APTFT() //set amount_per_transfer_from_this
|
||||
set name = "Set Transfer Amount"
|
||||
set category = "Object"
|
||||
set waitfor = FALSE
|
||||
var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts
|
||||
if(N)
|
||||
amount_per_transfer_from_this = N
|
||||
to_chat(user, "<span class='notice'>[src]'s transfer amount is now [amount_per_transfer_from_this] units.</span>")
|
||||
to_chat(usr, "<span class='notice'>[src]'s transfer amount is now [amount_per_transfer_from_this] units.</span>")
|
||||
|
||||
/obj/item/reagent_containers/proc/add_initial_reagents()
|
||||
if(list_reagents)
|
||||
@@ -123,34 +123,38 @@
|
||||
if(thrown)
|
||||
reagents.total_volume *= rand(5,10) * 0.1 //Not all of it makes contact with the target
|
||||
var/mob/M = target
|
||||
var/R
|
||||
var/R = reagents.log_list()
|
||||
target.visible_message("<span class='danger'>[M] has been splashed with something!</span>", \
|
||||
"<span class='userdanger'>[M] has been splashed with something!</span>")
|
||||
for(var/datum/reagent/A in reagents.reagent_list)
|
||||
R += "[A.type] ([A.volume]),"
|
||||
|
||||
if(thrownby)
|
||||
var/turf/TT = get_turf(target)
|
||||
var/throwerstring
|
||||
if(thrownby && thrown)
|
||||
log_combat(thrownby, M, "splashed", R)
|
||||
var/turf/AT = get_turf(thrownby)
|
||||
throwerstring = " THROWN BY [key_name(thrownby)] at [AT] (AREACOORD(AT)]"
|
||||
log_reagent("SPLASH: [src] mob SplashReagents() onto [key_name(target)] at [TT] ([AREACOORD(TT)])[throwerstring] - [R]")
|
||||
reagents.reaction(target, TOUCH)
|
||||
|
||||
reagents.clear_reagents()
|
||||
|
||||
else if(bartender_check(target) && thrown)
|
||||
visible_message("<span class='notice'>[src] lands onto the [target.name] without spilling a single drop.</span>")
|
||||
visible_message("<span class='notice'>[src] lands without spilling a single drop.</span>")
|
||||
transform = initial(transform)
|
||||
addtimer(CALLBACK(src, .proc/ForceResetRotation), 1)
|
||||
return
|
||||
|
||||
|
||||
else
|
||||
if(isturf(target) && reagents.reagent_list.len && thrownby)
|
||||
log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]", "in [AREACOORD(target)]")
|
||||
log_game("[key_name(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [AREACOORD(target)].")
|
||||
message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] in [ADMIN_VERBOSEJMP(target)].")
|
||||
var/turf/T = get_turf(target)
|
||||
var/throwerstring
|
||||
if(thrownby && thrown)
|
||||
var/turf/AT = get_turf(thrownby)
|
||||
throwerstring = " THROWN BY [key_name(thrownby)] at [AT] ([AREACOORD(AT)])"
|
||||
log_reagent("SPLASH - [src] object SplashReagents() onto [target] at [T] ([AREACOORD(T)])[throwerstring] - [reagents.log_list()]")
|
||||
visible_message("<span class='notice'>[src] spills its contents all over [target].</span>")
|
||||
reagents.reaction(target, TOUCH)
|
||||
if(QDELETED(src))
|
||||
return
|
||||
|
||||
reagents.clear_reagents()
|
||||
reagents.clear_reagents()
|
||||
|
||||
//melts plastic beakers
|
||||
/obj/item/reagent_containers/microwave_act(obj/machinery/microwave/M)
|
||||
|
||||
@@ -34,15 +34,11 @@
|
||||
else
|
||||
name = "blood pack"
|
||||
|
||||
/obj/item/reagent_containers/blood/update_icon()
|
||||
cut_overlays()
|
||||
|
||||
/obj/item/reagent_containers/blood/update_overlays()
|
||||
. = ..()
|
||||
var/v = min(round(reagents.total_volume / volume * 10), 10)
|
||||
if(v > 0)
|
||||
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "bloodpack1")
|
||||
filling.icon_state = "bloodpack[v]"
|
||||
filling.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
add_overlay(filling)
|
||||
. += mutable_appearance('icons/obj/reagentfillings.dmi', "bloodpack[v]", color = mix_color_from_reagents(reagents.reagent_list))
|
||||
|
||||
/obj/item/reagent_containers/blood/random
|
||||
icon_state = "random_bloodpack"
|
||||
@@ -89,7 +85,7 @@
|
||||
blood_type = "BUG"
|
||||
|
||||
/obj/item/reagent_containers/blood/attackby(obj/item/I, mob/user, params)
|
||||
if (istype(I, /obj/item/pen) || istype(I, /obj/item/toy/crayon))
|
||||
if(istype(I, /obj/item/pen) || istype(I, /obj/item/toy/crayon))
|
||||
if(!user.is_literate())
|
||||
to_chat(user, "<span class='notice'>You scribble illegibly on the label of [src]!</span>")
|
||||
return
|
||||
@@ -107,25 +103,31 @@
|
||||
else
|
||||
return ..()
|
||||
|
||||
/obj/item/reagent_containers/blood/attack(mob/M, mob/user, def_zone)
|
||||
if(user.a_intent == INTENT_HELP && reagents.total_volume > 0)
|
||||
if (user != M)
|
||||
to_chat(user, "<span class='notice'>You force [M] to drink from the [src]</span>")
|
||||
user.visible_message("<span class='userdanger'>[user] forces [M] to drink from the [src].</span>")
|
||||
if(!do_mob(user, M, 50))
|
||||
/obj/item/reagent_containers/blood/attack(mob/living/carbon/C, mob/user, def_zone)
|
||||
if(user.a_intent == INTENT_HELP && reagents.total_volume > 0 && iscarbon(C) && user.a_intent == INTENT_HELP)
|
||||
if(C.is_mouth_covered())
|
||||
to_chat(user, "<span class='notice'>You cant drink from the [src] while your mouth is covered.</span>")
|
||||
return
|
||||
if(user != C)
|
||||
user.visible_message("<span class='danger'>[user] forces [C] to drink from the [src].</span>", \
|
||||
"<span class='notice'>You force [C] to drink from the [src]</span>")
|
||||
if(!do_mob(user, C, 50))
|
||||
return
|
||||
else
|
||||
if(!do_mob(user, M, 10))
|
||||
if(!do_mob(user, C, 10))
|
||||
return
|
||||
|
||||
to_chat(user, "<span class='notice'>You take a sip from the [src].</span>")
|
||||
user.visible_message("<span class='notice'>[user] puts the [src] up to their mouth.</span>")
|
||||
if(reagents.total_volume <= 0) // Safety: In case you spam clicked the blood bag on yourself, and it is now empty (below will divide by zero)
|
||||
return
|
||||
var/gulp_size = 5
|
||||
var/gulp_size = 3
|
||||
var/fraction = min(gulp_size / reagents.total_volume, 1)
|
||||
reagents.reaction(M, INGEST, fraction) //checkLiked(fraction, M) // Blood isn't food, sorry.
|
||||
reagents.trans_to(M, gulp_size)
|
||||
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
|
||||
reagents.reaction(C, INGEST, fraction) //checkLiked(fraction, M) // Blood isn't food, sorry.
|
||||
reagents.trans_to(C, gulp_size)
|
||||
reagents.remove_reagent(src, 2) //Inneficency, so hey, IVs are usefull.
|
||||
playsound(C.loc,'sound/items/drink.ogg', rand(10, 50), TRUE)
|
||||
return
|
||||
..()
|
||||
|
||||
/obj/item/reagent_containers/blood/bluespace
|
||||
@@ -133,3 +135,14 @@
|
||||
desc = "Contains blood used for transfusion, this one has been made with bluespace technology to hold much more blood. Must be attached to an IV drip."
|
||||
icon_state = "bsbloodpack"
|
||||
volume = 600 //its a blood bath!
|
||||
|
||||
/obj/item/reagent_containers/blood/bluespace/attack(mob/living/carbon/C, mob/user, def_zone)
|
||||
if(user.a_intent == INTENT_HELP)
|
||||
if(user != C)
|
||||
to_chat(user, "<span class='notice'>You can't force people to drink from the [src]. Nothing comes out from it.</span>")
|
||||
return
|
||||
else
|
||||
to_chat(user, "<span class='notice'>You try to suck on the [src], but nothing comes out.</span>")
|
||||
return
|
||||
else
|
||||
..()
|
||||
|
||||
@@ -28,7 +28,7 @@ Borg Hypospray
|
||||
|
||||
var/list/datum/reagents/reagent_list = list()
|
||||
var/list/reagent_ids = list(/datum/reagent/medicine/dexalin, /datum/reagent/medicine/kelotane, /datum/reagent/medicine/bicaridine, /datum/reagent/medicine/antitoxin,
|
||||
/datum/reagent/medicine/epinephrine, /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution, /datum/reagent/medicine/insulin)
|
||||
/datum/reagent/medicine/epinephrine, /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution, /datum/reagent/medicine/insulin, /datum/reagent/medicine/potass_iodide)
|
||||
var/accepts_reagent_upgrades = TRUE //If upgrades can increase number of reagents dispensed.
|
||||
var/list/modes = list() //Basically the inverse of reagent_ids. Instead of having numbers as "keys" and strings as values it has strings as keys and numbers as values.
|
||||
//Used as list for input() in shakers.
|
||||
@@ -164,7 +164,7 @@ Borg Hypospray
|
||||
icon_state = "borghypo_s"
|
||||
charge_cost = 20
|
||||
recharge_time = 2
|
||||
reagent_ids = list(/datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/potass_iodide, /datum/reagent/medicine/morphine, /datum/reagent/medicine/insulin)
|
||||
reagent_ids = list(/datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/prussian_blue, /datum/reagent/medicine/morphine, /datum/reagent/medicine/insulin)
|
||||
bypass_protection = 1
|
||||
accepts_reagent_upgrades = FALSE
|
||||
|
||||
@@ -261,5 +261,5 @@ Borg Shaker
|
||||
/obj/item/reagent_containers/borghypo/epi
|
||||
name = "Stabilizer injector"
|
||||
desc = "An advanced chemical synthesizer and injection system, designed to stabilize patients."
|
||||
reagent_ids = list(/datum/reagent/medicine/epinephrine, /datum/reagent/medicine/insulin)
|
||||
reagent_ids = list(/datum/reagent/medicine/epinephrine, /datum/reagent/medicine/insulin, /datum/reagent/medicine/potass_iodide)
|
||||
accepts_reagent_upgrades = FALSE
|
||||
|
||||
@@ -18,26 +18,27 @@
|
||||
/obj/item/reagent_containers/glass/bottle/on_reagent_change(changetype)
|
||||
update_icon()
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/update_icon()
|
||||
cut_overlays()
|
||||
/obj/item/reagent_containers/glass/bottle/update_overlays()
|
||||
. = ..()
|
||||
if(!cached_icon)
|
||||
cached_icon = icon_state
|
||||
if(reagents.total_volume)
|
||||
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[icon_state]-10")
|
||||
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[cached_icon]-10", color = mix_color_from_reagents(reagents.reagent_list))
|
||||
|
||||
var/percent = round((reagents.total_volume / volume) * 100)
|
||||
switch(percent)
|
||||
if(0 to 9)
|
||||
filling.icon_state = "[icon_state]-10"
|
||||
filling.icon_state = "[cached_icon]-10"
|
||||
if(10 to 29)
|
||||
filling.icon_state = "[icon_state]25"
|
||||
filling.icon_state = "[cached_icon]25"
|
||||
if(30 to 49)
|
||||
filling.icon_state = "[icon_state]50"
|
||||
filling.icon_state = "[cached_icon]50"
|
||||
if(50 to 69)
|
||||
filling.icon_state = "[icon_state]75"
|
||||
filling.icon_state = "[cached_icon]75"
|
||||
if(70 to INFINITY)
|
||||
filling.icon_state = "[icon_state]100"
|
||||
filling.icon_state = "[cached_icon]100"
|
||||
|
||||
filling.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
add_overlay(filling)
|
||||
. += filling
|
||||
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/epinephrine
|
||||
|
||||
@@ -86,12 +86,10 @@
|
||||
|
||||
update_icon()
|
||||
|
||||
/obj/item/reagent_containers/dropper/update_icon()
|
||||
cut_overlays()
|
||||
/obj/item/reagent_containers/dropper/update_overlays()
|
||||
. = ..()
|
||||
if(reagents.total_volume)
|
||||
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "dropper")
|
||||
filling.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
add_overlay(filling)
|
||||
. += mutable_appearance('icons/obj/reagentfillings.dmi', "dropper", color = mix_color_from_reagents(reagents.reagent_list))
|
||||
|
||||
/obj/item/reagent_containers/dropper/get_belt_overlay()
|
||||
return mutable_appearance('icons/obj/clothing/belt_overlays.dmi', "pouch")
|
||||
|
||||
@@ -29,20 +29,30 @@
|
||||
message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].")
|
||||
reagents.reaction(M, TOUCH)
|
||||
log_combat(user, M, "splashed", R)
|
||||
var/turf/UT = get_turf(user)
|
||||
var/turf/MT = get_turf(M)
|
||||
var/turf/OT = get_turf(target)
|
||||
log_reagent("SPLASH: attack(target mob [key_name(M)] at [AREACOORD(MT)], from user [key_name(user)] at [AREACOORD(UT)], target object [target] at [AREACOORD(OT)]) - [R]")
|
||||
reagents.clear_reagents()
|
||||
else
|
||||
var/self_fed = M == user
|
||||
if(!self_fed)
|
||||
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>")
|
||||
log_combat(user, M, "is attempting to feed", reagents.log_list())
|
||||
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
|
||||
var/turf/UT = get_turf(user) // telekenesis memes
|
||||
var/turf/MT = get_turf(M)
|
||||
M.visible_message("<span class='danger'>[user] feeds something to [M].</span>", "<span class='userdanger'>[user] feeds something to you.</span>")
|
||||
log_combat(user, M, "fed", reagents.log_list())
|
||||
log_reagent("INGESTION: FED BY: [key_name(user)] (loc [user.loc] at [AREACOORD(UT)]) -> [key_name(M)] (loc [M.loc] at [AREACOORD(MT)]) - [reagents.log_list()]")
|
||||
else
|
||||
var/turf/T = get_turf(user)
|
||||
to_chat(user, "<span class='notice'>You swallow a gulp of [src].</span>")
|
||||
log_reagent("INGESTION: SELF: [key_name(user)] (loc [user.loc] at [AREACOORD(T)]) - [reagents.log_list()]")
|
||||
var/fraction = min(5/reagents.total_volume, 1)
|
||||
reagents.reaction(M, INGEST, fraction)
|
||||
addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5, null, null, null, self_fed? "self swallowed" : "fed by [user]"), 5)
|
||||
@@ -123,13 +133,13 @@
|
||||
/obj/item/reagent_containers/glass/beaker/on_reagent_change(changetype)
|
||||
update_icon()
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/update_icon()
|
||||
/obj/item/reagent_containers/glass/beaker/update_overlays()
|
||||
. = ..()
|
||||
if(!cached_icon)
|
||||
cached_icon = icon_state
|
||||
cut_overlays()
|
||||
|
||||
if(reagents.total_volume)
|
||||
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[cached_icon]10")
|
||||
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[cached_icon]10", color = mix_color_from_reagents(reagents.reagent_list))
|
||||
|
||||
var/percent = round((reagents.total_volume / volume) * 100)
|
||||
switch(percent)
|
||||
@@ -147,9 +157,7 @@
|
||||
filling.icon_state = "[cached_icon]80"
|
||||
if(91 to INFINITY)
|
||||
filling.icon_state = "[cached_icon]100"
|
||||
|
||||
filling.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
add_overlay(filling)
|
||||
. += filling
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/jar
|
||||
name = "honey jar"
|
||||
@@ -205,11 +213,7 @@
|
||||
amount_per_transfer_from_this = 10
|
||||
possible_transfer_amounts = list(5,10,15,20,25,30,40,50,60,120,180)
|
||||
container_flags = TEMP_WEAK|APTFT_ALTCLICK|APTFT_VERB
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/plastic/update_icon()
|
||||
icon_state = "beakerlarge" // hack to lets us reuse the large beaker reagent fill states
|
||||
..()
|
||||
icon_state = "beakerwhite"
|
||||
cached_icon = "beakerlarge"
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/meta
|
||||
name = "metamaterial beaker"
|
||||
@@ -325,6 +329,8 @@
|
||||
if (slot == SLOT_HEAD)
|
||||
if(reagents.total_volume)
|
||||
to_chat(user, "<span class='userdanger'>[src]'s contents spill all over you!</span>")
|
||||
var/R = reagents.log_list()
|
||||
log_reagent("SPLASH: [user] splashed [src] on their head via bucket/equipped(self, SLOT_HEAD) - [R]")
|
||||
reagents.reaction(user, TOUCH)
|
||||
reagents.clear_reagents()
|
||||
reagent_flags = NONE
|
||||
@@ -342,6 +348,14 @@
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/item/reagent_containers/glass/bucket/wood
|
||||
name = "wooden bucket"
|
||||
desc = "It's a bucket made of wood."
|
||||
icon_state = "bucket_wooden"
|
||||
custom_materials = null
|
||||
slot_flags = NONE
|
||||
item_flags = NO_MAT_REDEMPTION
|
||||
|
||||
/obj/item/reagent_containers/glass/beaker/waterbottle
|
||||
name = "bottle of water"
|
||||
desc = "A bottle of water filled at an old Earth bottling facility."
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
reagents.add_reagent_list(list_reagents)
|
||||
update_icon()
|
||||
|
||||
/obj/item/reagent_containers/hypospray/medipen/update_icon()
|
||||
/obj/item/reagent_containers/hypospray/medipen/update_icon_state()
|
||||
if(reagents.total_volume > 0)
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
@@ -282,13 +282,12 @@
|
||||
vial = new start_vial
|
||||
update_icon()
|
||||
|
||||
/obj/item/hypospray/mkii/update_icon()
|
||||
..()
|
||||
/obj/item/hypospray/mkii/ComponentInitialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/update_icon_updates_onmob)
|
||||
|
||||
/obj/item/hypospray/mkii/update_icon_state()
|
||||
icon_state = "[initial(icon_state)][vial ? "" : "-e"]"
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
M.update_inv_hands()
|
||||
return
|
||||
|
||||
/obj/item/hypospray/mkii/examine(mob/user)
|
||||
. = ..()
|
||||
|
||||
@@ -19,37 +19,15 @@
|
||||
"pink hypovial" = "hypovial-pink"
|
||||
)
|
||||
always_reskinnable = TRUE
|
||||
cached_icon = "hypovial"
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/vial/Initialize()
|
||||
. = ..()
|
||||
if(!icon_state)
|
||||
icon_state = "hypovial"
|
||||
update_icon()
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/vial/on_reagent_change()
|
||||
update_icon()
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/vial/update_icon()
|
||||
cut_overlays()
|
||||
if(reagents.total_volume)
|
||||
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "hypovial10")
|
||||
|
||||
var/percent = round((reagents.total_volume / volume) * 100)
|
||||
switch(percent)
|
||||
if(0 to 9)
|
||||
filling.icon_state = "hypovial10"
|
||||
if(10 to 29)
|
||||
filling.icon_state = "hypovial25"
|
||||
if(30 to 49)
|
||||
filling.icon_state = "hypovial50"
|
||||
if(50 to 85)
|
||||
filling.icon_state = "hypovial75"
|
||||
if(86 to INFINITY)
|
||||
filling.icon_state = "hypovial100"
|
||||
|
||||
filling.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
add_overlay(filling)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/vial/tiny
|
||||
name = "small hypovial"
|
||||
//Shouldn't be possible to get this without adminbuse
|
||||
@@ -80,27 +58,7 @@
|
||||
"large purple hypovial" = "hypoviallarge-p",
|
||||
"large black hypovial" = "hypoviallarge-t"
|
||||
)
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/vial/large/update_icon()
|
||||
cut_overlays()
|
||||
if(reagents.total_volume)
|
||||
var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "hypoviallarge10")
|
||||
|
||||
var/percent = round((reagents.total_volume / volume) * 100)
|
||||
switch(percent)
|
||||
if(0 to 9)
|
||||
filling.icon_state = "hypoviallarge10"
|
||||
if(10 to 29)
|
||||
filling.icon_state = "hypoviallarge25"
|
||||
if(30 to 49)
|
||||
filling.icon_state = "hypoviallarge50"
|
||||
if(50 to 85)
|
||||
filling.icon_state = "hypoviallarge75"
|
||||
if(86 to INFINITY)
|
||||
filling.icon_state = "hypoviallarge100"
|
||||
|
||||
filling.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
add_overlay(filling)
|
||||
cached_icon = "hypoviallarge"
|
||||
|
||||
/obj/item/reagent_containers/glass/bottle/vial/large/bluespace
|
||||
possible_transfer_amounts = list(1,2,5,10,20)
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
var/mode = SYRINGE_DRAW
|
||||
var/busy = FALSE // needed for delayed drawing of blood
|
||||
var/proj_piercing = 0 //does it pierce through thick clothes when shot with syringe gun
|
||||
var/show_filling = TRUE
|
||||
custom_materials = list(/datum/material/iron=10, /datum/material/glass=20)
|
||||
reagent_flags = TRANSPARENT
|
||||
|
||||
@@ -21,6 +22,10 @@
|
||||
mode = SYRINGE_INJECT
|
||||
update_icon()
|
||||
|
||||
/obj/item/reagent_containers/syringe/ComponentInitialize()
|
||||
. = ..()
|
||||
AddElement(/datum/element/update_icon_updates_onmob)
|
||||
|
||||
/obj/item/reagent_containers/syringe/on_reagent_change(changetype)
|
||||
update_icon()
|
||||
|
||||
@@ -152,29 +157,32 @@
|
||||
mode = SYRINGE_DRAW
|
||||
update_icon()
|
||||
|
||||
|
||||
/obj/item/reagent_containers/syringe/update_icon()
|
||||
cut_overlays()
|
||||
var/rounded_vol
|
||||
if(reagents && reagents.total_volume)
|
||||
rounded_vol = CLAMP(round((reagents.total_volume / volume * 15),5), 1, 15)
|
||||
var/image/filling_overlay = mutable_appearance('icons/obj/reagentfillings.dmi', "syringe[rounded_vol]")
|
||||
filling_overlay.color = mix_color_from_reagents(reagents.reagent_list)
|
||||
add_overlay(filling_overlay)
|
||||
else
|
||||
rounded_vol = 0
|
||||
/obj/item/reagent_containers/syringe/update_icon_state()
|
||||
var/rounded_vol = get_rounded_vol()
|
||||
icon_state = "[rounded_vol]"
|
||||
item_state = "syringe_[rounded_vol]"
|
||||
|
||||
/obj/item/reagent_containers/syringe/update_overlays()
|
||||
. = ..()
|
||||
if(show_filling)
|
||||
var/rounded_vol = get_rounded_vol()
|
||||
if(reagents && reagents.total_volume)
|
||||
. += mutable_appearance('icons/obj/reagentfillings.dmi', "syringe[rounded_vol]", color = mix_color_from_reagents(reagents.reagent_list))
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
var/injoverlay
|
||||
switch(mode)
|
||||
if (SYRINGE_DRAW)
|
||||
injoverlay = "draw"
|
||||
if (SYRINGE_INJECT)
|
||||
injoverlay = "inject"
|
||||
add_overlay(injoverlay)
|
||||
M.update_inv_hands()
|
||||
. += injoverlay
|
||||
|
||||
///Used by update_icon() and update_overlays()
|
||||
/obj/item/reagent_containers/syringe/proc/get_rounded_vol()
|
||||
if(reagents && reagents.total_volume)
|
||||
return CLAMP(round((reagents.total_volume / volume * 15),5), 1, 15)
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/reagent_containers/syringe/epinephrine
|
||||
name = "syringe (epinephrine)"
|
||||
@@ -267,6 +275,7 @@
|
||||
amount_per_transfer_from_this = 20
|
||||
icon_state = "empty"
|
||||
item_state = "syringe_empty"
|
||||
show_filling = FALSE
|
||||
var/emptrig = FALSE
|
||||
|
||||
/obj/item/reagent_containers/syringe/dart/afterattack(atom/target, mob/user , proximity)
|
||||
@@ -317,28 +326,13 @@
|
||||
/obj/item/reagent_containers/syringe/dart/attack_self(mob/user)
|
||||
return
|
||||
|
||||
/obj/item/reagent_containers/syringe/dart/update_icon()
|
||||
cut_overlays()
|
||||
var/rounded_vol
|
||||
|
||||
rounded_vol = "empty"
|
||||
if(reagents && reagents.total_volume)
|
||||
if(volume/round(reagents.total_volume, 1) == 1)
|
||||
rounded_vol="full"
|
||||
mode = SYRINGE_INJECT
|
||||
|
||||
icon_state = "[rounded_vol]"
|
||||
item_state = "syringe_[rounded_vol]"
|
||||
if(ismob(loc))
|
||||
var/mob/M = loc
|
||||
var/injoverlay
|
||||
switch(mode)
|
||||
if (SYRINGE_DRAW)
|
||||
injoverlay = "draw"
|
||||
if (SYRINGE_INJECT)
|
||||
injoverlay = "ready"
|
||||
add_overlay(injoverlay)
|
||||
M.update_inv_hands()
|
||||
/obj/item/reagent_containers/syringe/dart/update_icon_state()
|
||||
var/empty_full = "empty"
|
||||
if(round(reagents.total_volume, 1) == reagents.maximum_volume)
|
||||
empty_full = "full"
|
||||
mode = SYRINGE_INJECT
|
||||
icon_state = "[empty_full]"
|
||||
item_state = "syringe_[empty_full]"
|
||||
|
||||
/obj/item/reagent_containers/syringe/dart/emp_act(severity)
|
||||
emptrig = TRUE
|
||||
|
||||
Reference in New Issue
Block a user