|
|
|
@@ -313,6 +313,13 @@
|
|
|
|
|
metabolization_rate = 45 * REAGENTS_METABOLISM
|
|
|
|
|
. = 1
|
|
|
|
|
|
|
|
|
|
/datum/reagent/water/hollowwater
|
|
|
|
|
name = "Hollow Water"
|
|
|
|
|
description = "An ubiquitous chemical substance that is composed of hydrogen and oxygen, but it looks kinda hollow."
|
|
|
|
|
color = "#88878777"
|
|
|
|
|
taste_description = "emptyiness"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/datum/reagent/water/holywater
|
|
|
|
|
name = "Holy Water"
|
|
|
|
|
description = "Water blessed by some deity."
|
|
|
|
@@ -883,7 +890,7 @@
|
|
|
|
|
if(istype(O, /obj/item/stack/sheet/metal))
|
|
|
|
|
var/obj/item/stack/sheet/metal/M = O
|
|
|
|
|
reac_volume = min(reac_volume, M.amount)
|
|
|
|
|
new/obj/item/stack/tile/bronze(get_turf(M), reac_volume)
|
|
|
|
|
new/obj/item/stack/sheet/bronze(get_turf(M), reac_volume)
|
|
|
|
|
M.use(reac_volume)
|
|
|
|
|
|
|
|
|
|
/datum/reagent/nitrogen
|
|
|
|
@@ -950,6 +957,7 @@
|
|
|
|
|
color = "#1C1300" // rgb: 30, 20, 0
|
|
|
|
|
taste_description = "sour chalk"
|
|
|
|
|
pH = 5
|
|
|
|
|
material = /datum/material/diamond
|
|
|
|
|
|
|
|
|
|
/datum/reagent/carbon/reaction_turf(turf/T, reac_volume)
|
|
|
|
|
if(!isspaceturf(T))
|
|
|
|
@@ -1072,6 +1080,7 @@
|
|
|
|
|
pH = 6
|
|
|
|
|
overdose_threshold = 30
|
|
|
|
|
color = "#c2391d"
|
|
|
|
|
material = /datum/material/iron
|
|
|
|
|
|
|
|
|
|
/datum/reagent/iron/on_mob_life(mob/living/carbon/C)
|
|
|
|
|
if((HAS_TRAIT(C, TRAIT_NOMARROW)))
|
|
|
|
@@ -1103,6 +1112,7 @@
|
|
|
|
|
reagent_state = SOLID
|
|
|
|
|
color = "#F7C430" // rgb: 247, 196, 48
|
|
|
|
|
taste_description = "expensive metal"
|
|
|
|
|
material = /datum/material/gold
|
|
|
|
|
|
|
|
|
|
/datum/reagent/silver
|
|
|
|
|
name = "Silver"
|
|
|
|
@@ -1110,6 +1120,7 @@
|
|
|
|
|
reagent_state = SOLID
|
|
|
|
|
color = "#D0D0D0" // rgb: 208, 208, 208
|
|
|
|
|
taste_description = "expensive yet reasonable metal"
|
|
|
|
|
material = /datum/material/silver
|
|
|
|
|
|
|
|
|
|
/datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
|
|
|
|
if(M.has_bane(BANE_SILVER))
|
|
|
|
@@ -1123,6 +1134,7 @@
|
|
|
|
|
color = "#B8B8C0" // rgb: 184, 184, 192
|
|
|
|
|
taste_description = "the inside of a reactor"
|
|
|
|
|
pH = 4
|
|
|
|
|
material = /datum/material/uranium
|
|
|
|
|
|
|
|
|
|
/datum/reagent/uranium/on_mob_life(mob/living/carbon/M)
|
|
|
|
|
M.apply_effect(1/M.metabolism_efficiency,EFFECT_IRRADIATE,0)
|
|
|
|
@@ -1144,6 +1156,7 @@
|
|
|
|
|
taste_description = "fizzling blue"
|
|
|
|
|
pH = 12
|
|
|
|
|
value = REAGENT_VALUE_RARE
|
|
|
|
|
material = /datum/material/bluespace
|
|
|
|
|
|
|
|
|
|
/datum/reagent/bluespace/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
|
|
|
|
|
if(method == TOUCH || method == VAPOR)
|
|
|
|
@@ -1182,6 +1195,7 @@
|
|
|
|
|
color = "#A8A8A8" // rgb: 168, 168, 168
|
|
|
|
|
taste_mult = 0
|
|
|
|
|
pH = 10
|
|
|
|
|
material = /datum/material/glass
|
|
|
|
|
|
|
|
|
|
/datum/reagent/fuel
|
|
|
|
|
name = "Welding fuel"
|
|
|
|
@@ -2206,6 +2220,245 @@
|
|
|
|
|
color = "#f7685e"
|
|
|
|
|
metabolization_rate = REAGENTS_METABOLISM * 0.25
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/datum/reagent/wittel
|
|
|
|
|
name = "Wittel"
|
|
|
|
|
description = "An extremely rare metallic-white substance only found on demon-class planets."
|
|
|
|
|
color = "#FFFFFF" // rgb: 255, 255, 255
|
|
|
|
|
taste_mult = 0 // oderless and tasteless
|
|
|
|
|
|
|
|
|
|
/datum/reagent/metalgen
|
|
|
|
|
name = "Metalgen"
|
|
|
|
|
data = list("material"=null)
|
|
|
|
|
description = "A purple metal morphic liquid, said to impose it's metallic properties on whatever it touches."
|
|
|
|
|
color = "#b000aa"
|
|
|
|
|
taste_mult = 0 // oderless and tasteless
|
|
|
|
|
var/applied_material_flags = MATERIAL_ADD_PREFIX | MATERIAL_COLOR
|
|
|
|
|
var/minumum_material_amount = 100
|
|
|
|
|
|
|
|
|
|
/datum/reagent/metalgen/reaction_obj(obj/O, volume)
|
|
|
|
|
metal_morph(O)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
/datum/reagent/metalgen/reaction_turf(turf/T, volume)
|
|
|
|
|
metal_morph(T)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
///turn an object into a special material
|
|
|
|
|
/datum/reagent/metalgen/proc/metal_morph(atom/A)
|
|
|
|
|
var/metal_ref = data["material"]
|
|
|
|
|
if(!metal_ref)
|
|
|
|
|
return
|
|
|
|
|
var/metal_amount = 0
|
|
|
|
|
|
|
|
|
|
for(var/B in A.custom_materials) //list with what they're made of
|
|
|
|
|
metal_amount += A.custom_materials[B]
|
|
|
|
|
|
|
|
|
|
if(!metal_amount)
|
|
|
|
|
metal_amount = minumum_material_amount //some stuff doesn't have materials at all. To still give them properties, we give them a material. Basically doesnt exist
|
|
|
|
|
|
|
|
|
|
var/list/metal_dat = list()
|
|
|
|
|
metal_dat[metal_ref] = metal_amount //if we pass the list directly, byond turns metal_ref into "metal_ref" kjewrg8fwcyvf
|
|
|
|
|
|
|
|
|
|
A.material_flags = applied_material_flags
|
|
|
|
|
A.set_custom_materials(metal_dat)
|
|
|
|
|
|
|
|
|
|
/datum/reagent/gravitum
|
|
|
|
|
name = "Gravitum"
|
|
|
|
|
description = "A rare kind of null fluid, capable of temporalily removing all weight of whatever it touches." //i dont even
|
|
|
|
|
color = "#050096" // rgb: 5, 0, 150
|
|
|
|
|
taste_mult = 0 // oderless and tasteless
|
|
|
|
|
metabolization_rate = 0.1 * REAGENTS_METABOLISM //20 times as long, so it's actually viable to use
|
|
|
|
|
var/time_multiplier = 1 MINUTES //1 minute per unit of gravitum on objects. Seems overpowered, but the whole thing is very niche
|
|
|
|
|
|
|
|
|
|
/datum/reagent/gravitum/reaction_obj(obj/O, volume)
|
|
|
|
|
O.AddElement(/datum/element/forced_gravity, 0)
|
|
|
|
|
|
|
|
|
|
addtimer(CALLBACK(O, .proc/_RemoveElement, /datum/element/forced_gravity, 0), volume * time_multiplier)
|
|
|
|
|
|
|
|
|
|
/datum/reagent/gravitum/on_mob_add(mob/living/L)
|
|
|
|
|
L.AddElement(/datum/element/forced_gravity, 0) //0 is the gravity, and in this case weightless
|
|
|
|
|
|
|
|
|
|
/datum/reagent/gravitum/on_mob_end_metabolize(mob/living/L)
|
|
|
|
|
L.RemoveElement(/datum/element/forced_gravity, 0)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//body bluids
|
|
|
|
|
/datum/reagent/consumable/semen
|
|
|
|
|
name = "Semen"
|
|
|
|
|
description = "Sperm from some animal. Useless for anything but insemination, really."
|
|
|
|
|
taste_description = "something salty"
|
|
|
|
|
taste_mult = 2 //Not very overpowering flavor
|
|
|
|
|
data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null)
|
|
|
|
|
reagent_state = LIQUID
|
|
|
|
|
color = "#FFFFFF" // rgb: 255, 255, 255
|
|
|
|
|
can_synth = FALSE
|
|
|
|
|
nutriment_factor = 0.5 * REAGENTS_METABOLISM
|
|
|
|
|
var/decal_path = /obj/effect/decal/cleanable/semen
|
|
|
|
|
|
|
|
|
|
/datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume)
|
|
|
|
|
if(!istype(T))
|
|
|
|
|
return
|
|
|
|
|
if(reac_volume < 10)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
var/obj/effect/decal/cleanable/semen/S = locate() in T
|
|
|
|
|
if(!S)
|
|
|
|
|
S = new decal_path(T)
|
|
|
|
|
if(data["blood_DNA"])
|
|
|
|
|
S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
|
|
|
|
|
|
|
|
|
|
/obj/effect/decal/cleanable/semen
|
|
|
|
|
name = "semen"
|
|
|
|
|
desc = null
|
|
|
|
|
gender = PLURAL
|
|
|
|
|
density = 0
|
|
|
|
|
layer = ABOVE_NORMAL_TURF_LAYER
|
|
|
|
|
icon = 'icons/obj/genitals/effects.dmi'
|
|
|
|
|
icon_state = "semen1"
|
|
|
|
|
random_icon_states = list("semen1", "semen2", "semen3", "semen4")
|
|
|
|
|
|
|
|
|
|
/obj/effect/decal/cleanable/semen/Initialize(mapload)
|
|
|
|
|
. = ..()
|
|
|
|
|
dir = GLOB.cardinals
|
|
|
|
|
add_blood_DNA(list("Non-human DNA" = "A+"))
|
|
|
|
|
|
|
|
|
|
/obj/effect/decal/cleanable/semen/replace_decal(obj/effect/decal/cleanable/semen/S)
|
|
|
|
|
if(S.blood_DNA)
|
|
|
|
|
blood_DNA |= S.blood_DNA
|
|
|
|
|
return ..()
|
|
|
|
|
|
|
|
|
|
/datum/reagent/consumable/semen/femcum
|
|
|
|
|
name = "Female Ejaculate"
|
|
|
|
|
description = "Vaginal lubricant found in most mammals and other animals of similar nature. Where you found this is your own business."
|
|
|
|
|
taste_description = "something with a tang" // wew coders who haven't eaten out a girl.
|
|
|
|
|
color = "#AAAAAA77"
|
|
|
|
|
decal_path = /obj/effect/decal/cleanable/semen/femcum
|
|
|
|
|
|
|
|
|
|
/obj/effect/decal/cleanable/semen/femcum
|
|
|
|
|
name = "female ejaculate"
|
|
|
|
|
icon_state = "fem1"
|
|
|
|
|
random_icon_states = list("fem1", "fem2", "fem3", "fem4")
|
|
|
|
|
blood_state = null
|
|
|
|
|
bloodiness = null
|
|
|
|
|
|
|
|
|
|
/datum/reagent/determination
|
|
|
|
|
name = "Determination"
|
|
|
|
|
description = "For when you need to push on a little more. Do NOT allow near plants."
|
|
|
|
|
reagent_state = LIQUID
|
|
|
|
|
color = "#D2FFFA"
|
|
|
|
|
metabolization_rate = 0.75 * REAGENTS_METABOLISM // 5u (WOUND_DETERMINATION_CRITICAL) will last for ~17 ticks
|
|
|
|
|
/// Whether we've had at least WOUND_DETERMINATION_SEVERE (2.5u) of determination at any given time. No damage slowdown immunity or indication we're having a second wind if it's just a single moderate wound
|
|
|
|
|
var/significant = FALSE
|
|
|
|
|
self_consuming = TRUE
|
|
|
|
|
|
|
|
|
|
/datum/reagent/determination/on_mob_end_metabolize(mob/living/carbon/M)
|
|
|
|
|
if(significant)
|
|
|
|
|
var/stam_crash = 0
|
|
|
|
|
for(var/thing in M.all_wounds)
|
|
|
|
|
var/datum/wound/W = thing
|
|
|
|
|
stam_crash += (W.severity + 1) * 3 // spike of 3 stam damage per wound severity (moderate = 6, severe = 9, critical = 12) when the determination wears off if it was a combat rush
|
|
|
|
|
M.adjustStaminaLoss(stam_crash)
|
|
|
|
|
M.remove_status_effect(STATUS_EFFECT_DETERMINED)
|
|
|
|
|
..()
|
|
|
|
|
|
|
|
|
|
/datum/reagent/determination/on_mob_life(mob/living/carbon/M)
|
|
|
|
|
if(!significant && volume >= WOUND_DETERMINATION_SEVERE)
|
|
|
|
|
significant = TRUE
|
|
|
|
|
M.apply_status_effect(STATUS_EFFECT_DETERMINED) // in addition to the slight healing, limping cooldowns are divided by 4 during the combat high
|
|
|
|
|
|
|
|
|
|
volume = min(volume, WOUND_DETERMINATION_MAX)
|
|
|
|
|
|
|
|
|
|
for(var/thing in M.all_wounds)
|
|
|
|
|
var/datum/wound/W = thing
|
|
|
|
|
var/obj/item/bodypart/wounded_part = W.limb
|
|
|
|
|
if(wounded_part)
|
|
|
|
|
wounded_part.heal_damage(0.25, 0.25)
|
|
|
|
|
M.adjustStaminaLoss(-0.25*REM) // the more wounds, the more stamina regen
|
|
|
|
|
..()
|
|
|
|
|
|
|
|
|
|
datum/reagent/eldritch
|
|
|
|
|
name = "Eldritch Essence"
|
|
|
|
|
description = "Strange liquid that defies the laws of physics"
|
|
|
|
|
taste_description = "Ag'hsj'saje'sh"
|
|
|
|
|
color = "#1f8016"
|
|
|
|
|
|
|
|
|
|
/datum/reagent/eldritch/on_mob_life(mob/living/carbon/M)
|
|
|
|
|
if(IS_HERETIC(M))
|
|
|
|
|
M.drowsyness = max(M.drowsyness-5, 0)
|
|
|
|
|
M.AdjustAllImmobility(-40, FALSE)
|
|
|
|
|
M.adjustStaminaLoss(-15, FALSE)
|
|
|
|
|
M.adjustToxLoss(-3, FALSE)
|
|
|
|
|
M.adjustOxyLoss(-3, FALSE)
|
|
|
|
|
M.adjustBruteLoss(-3, FALSE)
|
|
|
|
|
M.adjustFireLoss(-3, FALSE)
|
|
|
|
|
if(ishuman(M) && M.blood_volume < BLOOD_VOLUME_NORMAL)
|
|
|
|
|
M.blood_volume += 3
|
|
|
|
|
else
|
|
|
|
|
M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150)
|
|
|
|
|
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/cellulose
|
|
|
|
|
name = "Cellulose Fibers"
|
|
|
|
|
description = "A crystaline polydextrose polymer, plants swear by this stuff."
|
|
|
|
|
reagent_state = SOLID
|
|
|
|
|
color = "#E6E6DA"
|
|
|
|
|
taste_mult = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/datum/reagent/hairball
|
|
|
|
|
name = "Hairball"
|
|
|
|
|
description = "A bundle of keratinous bits and fibers, not easily digestible."
|
|
|
|
|
reagent_state = SOLID
|
|
|
|
|
can_synth = FALSE
|
|
|
|
|
metabolization_rate = 0.05 * REAGENTS_METABOLISM
|
|
|
|
|
taste_description = "wet hair"
|
|
|
|
|
var/amount = 0
|
|
|
|
|
var/knotted = FALSE
|
|
|
|
|
|
|
|
|
|
/datum/reagent/hairball/on_mob_life(mob/living/carbon/M)
|
|
|
|
|
amount = M.reagents.get_reagent_amount(/datum/reagent/hairball)
|
|
|
|
|
|
|
|
|
|
if(amount < 10)
|
|
|
|
|
if(prob(10))
|
|
|
|
|
M.losebreath += 1
|
|
|
|
|
M.emote("cough")
|
|
|
|
|
to_chat(M, "<span class='notice'>You clear your throat.</span>")
|
|
|
|
|
else
|
|
|
|
|
if(!knotted)
|
|
|
|
|
to_chat(M, "<span class='notice'>You feel a knot in your stomach.</span>")
|
|
|
|
|
knotted = TRUE
|
|
|
|
|
|
|
|
|
|
if(prob(5 + amount * 0.5)) // don't want this to cause too much damage
|
|
|
|
|
M.losebreath += 2
|
|
|
|
|
to_chat(M, "<span class='notice'>You feel a knot in your throat.</span>")
|
|
|
|
|
M.emote("cough")
|
|
|
|
|
|
|
|
|
|
else if(prob(amount - 4))
|
|
|
|
|
to_chat(M, "<span class='warning'>Your stomach feels awfully bloated.</span>")
|
|
|
|
|
playsound(M,'sound/voice/catpeople/distressed.ogg', 50, FALSE)
|
|
|
|
|
M.visible_message("<span class='warning'>[M] seems distressed!.</span>", ignored_mobs=M)
|
|
|
|
|
|
|
|
|
|
else if(prob(amount - 8))
|
|
|
|
|
knotted = FALSE
|
|
|
|
|
playsound(M,'sound/voice/catpeople/puking.ogg', 110, FALSE)
|
|
|
|
|
M.Immobilize(30)
|
|
|
|
|
sleep(30) //snowflake but it works, don't wanna proc this
|
|
|
|
|
if(QDELETED(M) || QDELETED(src)) //this handles race conditions about m or src not existing.
|
|
|
|
|
return
|
|
|
|
|
M.visible_message("<span class='warning'>[M] throws up a hairball! Disgusting!</span>", ignored_mobs=M)
|
|
|
|
|
new /obj/item/toy/plush/hairball(get_turf(M))
|
|
|
|
|
to_chat(M, "<span class='notice'>Aaaah that's better!</span>")
|
|
|
|
|
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "cleared_stomach", /datum/mood_event/cleared_stomach, name)
|
|
|
|
|
M.reagents.del_reagent(/datum/reagent/hairball)
|
|
|
|
|
return
|
|
|
|
|
..()
|
|
|
|
|
|
|
|
|
|
/datum/reagent/red_ichor
|
|
|
|
|
name = "Red Ichor"
|
|
|
|
|
can_synth = FALSE
|
|
|
|
@@ -2259,182 +2512,3 @@
|
|
|
|
|
M.SetSleeping(0, 0)
|
|
|
|
|
..()
|
|
|
|
|
|
|
|
|
|
//body bluids
|
|
|
|
|
/datum/reagent/consumable/semen
|
|
|
|
|
name = "Semen"
|
|
|
|
|
description = "Sperm from some animal. Useless for anything but insemination, really."
|
|
|
|
|
taste_description = "something salty"
|
|
|
|
|
taste_mult = 2 //Not very overpowering flavor
|
|
|
|
|
data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null)
|
|
|
|
|
reagent_state = LIQUID
|
|
|
|
|
color = "#FFFFFF" // rgb: 255, 255, 255
|
|
|
|
|
can_synth = FALSE
|
|
|
|
|
nutriment_factor = 0.5 * REAGENTS_METABOLISM
|
|
|
|
|
|
|
|
|
|
/datum/reagent/consumable/semen/reaction_turf(turf/T, reac_volume)
|
|
|
|
|
if(!istype(T))
|
|
|
|
|
return
|
|
|
|
|
if(reac_volume < 10)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
var/obj/effect/decal/cleanable/semen/S = locate() in T
|
|
|
|
|
if(!S)
|
|
|
|
|
S = new(T)
|
|
|
|
|
if(data["blood_DNA"])
|
|
|
|
|
S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
|
|
|
|
|
|
|
|
|
|
/obj/effect/decal/cleanable/semen
|
|
|
|
|
name = "semen"
|
|
|
|
|
desc = null
|
|
|
|
|
gender = PLURAL
|
|
|
|
|
density = 0
|
|
|
|
|
layer = ABOVE_NORMAL_TURF_LAYER
|
|
|
|
|
icon = 'icons/obj/genitals/effects.dmi'
|
|
|
|
|
icon_state = "semen1"
|
|
|
|
|
random_icon_states = list("semen1", "semen2", "semen3", "semen4")
|
|
|
|
|
|
|
|
|
|
/obj/effect/decal/cleanable/semen/Initialize(mapload)
|
|
|
|
|
. = ..()
|
|
|
|
|
dir = GLOB.cardinals
|
|
|
|
|
add_blood_DNA(list("Non-human DNA" = "A+"))
|
|
|
|
|
|
|
|
|
|
/obj/effect/decal/cleanable/semen/replace_decal(obj/effect/decal/cleanable/semen/S)
|
|
|
|
|
if(S.blood_DNA)
|
|
|
|
|
blood_DNA |= S.blood_DNA
|
|
|
|
|
return ..()
|
|
|
|
|
|
|
|
|
|
/datum/reagent/consumable/femcum
|
|
|
|
|
name = "Female Ejaculate"
|
|
|
|
|
description = "Vaginal lubricant found in most mammals and other animals of similar nature. Where you found this is your own business."
|
|
|
|
|
taste_description = "something with a tang" // wew coders who haven't eaten out a girl.
|
|
|
|
|
taste_mult = 2
|
|
|
|
|
data = list("donor"=null,"viruses"=null,"donor_DNA"=null,"blood_type"=null,"resistances"=null,"trace_chem"=null,"mind"=null,"ckey"=null,"gender"=null,"real_name"=null)
|
|
|
|
|
reagent_state = LIQUID
|
|
|
|
|
color = "#AAAAAA77"
|
|
|
|
|
can_synth = FALSE
|
|
|
|
|
nutriment_factor = 0.5 * REAGENTS_METABOLISM
|
|
|
|
|
|
|
|
|
|
/obj/effect/decal/cleanable/femcum
|
|
|
|
|
name = "female ejaculate"
|
|
|
|
|
desc = null
|
|
|
|
|
gender = PLURAL
|
|
|
|
|
density = 0
|
|
|
|
|
layer = ABOVE_NORMAL_TURF_LAYER
|
|
|
|
|
icon = 'icons/obj/genitals/effects.dmi'
|
|
|
|
|
icon_state = "fem1"
|
|
|
|
|
random_icon_states = list("fem1", "fem2", "fem3", "fem4")
|
|
|
|
|
blood_state = null
|
|
|
|
|
bloodiness = null
|
|
|
|
|
|
|
|
|
|
/obj/effect/decal/cleanable/femcum/Initialize(mapload)
|
|
|
|
|
. = ..()
|
|
|
|
|
dir = GLOB.cardinals
|
|
|
|
|
add_blood_DNA(list("Non-human DNA" = "A+"))
|
|
|
|
|
|
|
|
|
|
/obj/effect/decal/cleanable/femcum/replace_decal(obj/effect/decal/cleanable/femcum/F)
|
|
|
|
|
if(F.blood_DNA)
|
|
|
|
|
blood_DNA |= F.blood_DNA
|
|
|
|
|
return ..()
|
|
|
|
|
|
|
|
|
|
/datum/reagent/consumable/femcum/reaction_turf(turf/T, reac_volume)
|
|
|
|
|
if(!istype(T))
|
|
|
|
|
return
|
|
|
|
|
if(reac_volume < 10)
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
var/obj/effect/decal/cleanable/femcum/S = locate() in T
|
|
|
|
|
if(!S)
|
|
|
|
|
S = new(T)
|
|
|
|
|
if(data["blood_DNA"])
|
|
|
|
|
S.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
|
|
|
|
|
|
|
|
|
|
/datum/reagent/determination
|
|
|
|
|
name = "Determination"
|
|
|
|
|
description = "For when you need to push on a little more. Do NOT allow near plants."
|
|
|
|
|
reagent_state = LIQUID
|
|
|
|
|
color = "#D2FFFA"
|
|
|
|
|
metabolization_rate = 0.75 * REAGENTS_METABOLISM // 5u (WOUND_DETERMINATION_CRITICAL) will last for ~17 ticks
|
|
|
|
|
/// Whether we've had at least WOUND_DETERMINATION_SEVERE (2.5u) of determination at any given time. No damage slowdown immunity or indication we're having a second wind if it's just a single moderate wound
|
|
|
|
|
var/significant = FALSE
|
|
|
|
|
self_consuming = TRUE
|
|
|
|
|
|
|
|
|
|
/datum/reagent/determination/on_mob_end_metabolize(mob/living/carbon/M)
|
|
|
|
|
if(significant)
|
|
|
|
|
var/stam_crash = 0
|
|
|
|
|
for(var/thing in M.all_wounds)
|
|
|
|
|
var/datum/wound/W = thing
|
|
|
|
|
stam_crash += (W.severity + 1) * 3 // spike of 3 stam damage per wound severity (moderate = 6, severe = 9, critical = 12) when the determination wears off if it was a combat rush
|
|
|
|
|
M.adjustStaminaLoss(stam_crash)
|
|
|
|
|
M.remove_status_effect(STATUS_EFFECT_DETERMINED)
|
|
|
|
|
..()
|
|
|
|
|
|
|
|
|
|
/datum/reagent/determination/on_mob_life(mob/living/carbon/M)
|
|
|
|
|
if(!significant && volume >= WOUND_DETERMINATION_SEVERE)
|
|
|
|
|
significant = TRUE
|
|
|
|
|
M.apply_status_effect(STATUS_EFFECT_DETERMINED) // in addition to the slight healing, limping cooldowns are divided by 4 during the combat high
|
|
|
|
|
|
|
|
|
|
volume = min(volume, WOUND_DETERMINATION_MAX)
|
|
|
|
|
|
|
|
|
|
for(var/thing in M.all_wounds)
|
|
|
|
|
var/datum/wound/W = thing
|
|
|
|
|
var/obj/item/bodypart/wounded_part = W.limb
|
|
|
|
|
if(wounded_part)
|
|
|
|
|
wounded_part.heal_damage(0.25, 0.25)
|
|
|
|
|
M.adjustStaminaLoss(-0.25*REM) // the more wounds, the more stamina regen
|
|
|
|
|
..()
|
|
|
|
|
|
|
|
|
|
/datum/reagent/cellulose
|
|
|
|
|
name = "Cellulose Fibers"
|
|
|
|
|
description = "A crystaline polydextrose polymer, plants swear by this stuff."
|
|
|
|
|
reagent_state = SOLID
|
|
|
|
|
color = "#E6E6DA"
|
|
|
|
|
taste_mult = 0
|
|
|
|
|
|
|
|
|
|
/datum/reagent/hairball
|
|
|
|
|
name = "Hairball"
|
|
|
|
|
description = "A bundle of keratinous bits and fibers, not easily digestible."
|
|
|
|
|
reagent_state = SOLID
|
|
|
|
|
can_synth = FALSE
|
|
|
|
|
metabolization_rate = 0.05 * REAGENTS_METABOLISM
|
|
|
|
|
taste_description = "wet hair"
|
|
|
|
|
var/amount = 0
|
|
|
|
|
var/knotted = FALSE
|
|
|
|
|
|
|
|
|
|
/datum/reagent/hairball/on_mob_life(mob/living/carbon/M)
|
|
|
|
|
amount = M.reagents.get_reagent_amount(/datum/reagent/hairball)
|
|
|
|
|
|
|
|
|
|
if(amount < 10)
|
|
|
|
|
if(prob(10))
|
|
|
|
|
M.losebreath += 1
|
|
|
|
|
M.emote("cough")
|
|
|
|
|
to_chat(M, "<span class='notice'>You clear your throat.</span>")
|
|
|
|
|
else
|
|
|
|
|
if(!knotted)
|
|
|
|
|
to_chat(M, "<span class='notice'>You feel a knot in your stomach.</span>")
|
|
|
|
|
knotted = TRUE
|
|
|
|
|
|
|
|
|
|
if(prob(5 + amount * 0.5)) // don't want this to cause too much damage
|
|
|
|
|
M.losebreath += 2
|
|
|
|
|
to_chat(M, "<span class='notice'>You feel a knot in your throat.</span>")
|
|
|
|
|
M.emote("cough")
|
|
|
|
|
|
|
|
|
|
else if(prob(amount - 4))
|
|
|
|
|
to_chat(M, "<span class='warning'>Your stomach feels awfully bloated.</span>")
|
|
|
|
|
playsound(M,'sound/voice/catpeople/distressed.ogg', 50, FALSE)
|
|
|
|
|
M.visible_message("<span class='warning'>[M] seems distressed!.</span>", ignored_mobs=M)
|
|
|
|
|
|
|
|
|
|
else if(prob(amount - 8))
|
|
|
|
|
knotted = FALSE
|
|
|
|
|
playsound(M,'sound/voice/catpeople/puking.ogg', 110, FALSE)
|
|
|
|
|
M.Immobilize(30)
|
|
|
|
|
sleep(30) //snowflake but it works, don't wanna proc this
|
|
|
|
|
if(QDELETED(M) || QDELETED(src)) //this handles race conditions about m or src not existing.
|
|
|
|
|
return
|
|
|
|
|
M.visible_message("<span class='warning'>[M] throws up a hairball! Disgusting!</span>", ignored_mobs=M)
|
|
|
|
|
new /obj/item/toy/plush/hairball(get_turf(M))
|
|
|
|
|
to_chat(M, "<span class='notice'>Aaaah that's better!</span>")
|
|
|
|
|
SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "cleared_stomach", /datum/mood_event/cleared_stomach, name)
|
|
|
|
|
M.reagents.del_reagent(/datum/reagent/hairball)
|
|
|
|
|
return
|
|
|
|
|
..()
|
|
|
|
|
|
|
|
|
|