Files
2020-02-19 19:48:29 -08:00

3624 lines
110 KiB
Plaintext

//Contains exotic or special reagents.
datum
reagent
nitroglycerin // Yes, this is a bad idea.
name = "nitroglycerin"
id = "nitroglycerin"
description = "A miracle worker in treating cardiac failure. Very, very volatile and sensitive compound. Do not run while handling this. Do not throw this. Do not splash this."
reagent_state = LIQUID
fluid_r = 220
fluid_g = 220
fluid_b = 255
transparency = 128
volatility = 3
// These figures are for original nitro explosions, new calculation is strictly linear <-- false by zewaka
// power = SQRT(10V)
// 0.1 -> 1
// 0.2 -> 2
// 0.9 -> 3
// 1.6 -> 4
// 10 -> 10
// 250 -> 50
// 1000 -> 100
// brisance = LOG10(10V)
// 1 -> 1
// 10 -> 2
// 100 -> 3
// 1000 -> 4
// ...
// explosive properties
// relatively inert as a solid (T <= 14°C)
// rather explosive as a liquid (14 °C < T <= 50 °C)
// explodes instantly as a gas (50 °C < T)
proc/explode(var/list/covered_turf, expl_reason, del_holder=1)
for (var/turf/T in covered_turf)
message_admins("Nitroglycerin explosion (volume = [volume]) due to [expl_reason] at [showCoords(T.x, T.y, T.z)].")
var/context = "???"
if(holder && holder.my_atom) // Erik: Fix for Cannot read null.fingerprintshidden
var/list/fh = holder.my_atom.fingerprintshidden
if (fh && fh.len) //Wire: Fix for: bad text or out of bounds
context = "Fingerprints: [jointext(fh, "")]"
logTheThing("combat", usr, null, "is associated with a nitroglycerin explosion (volume = [volume]) due to [expl_reason] at [showCoords(T.x, T.y, T.z)]. Context: [context].")
explosion_new(usr, T, sqrt(10 * (volume/covered_turf.len)), log(10 * (volume/covered_turf.len), 10)) // Because people were being shit // okay its back but harder to handle
//explosion_new(usr, T, min(volume * 6 / 21, 250)) // 6 is power needed to cause ex_act(1) in explosion_new, 21 is the minimum # of units we want required to cause a gib-capable explosion. 250 is just a guess in case someone goes insane with an artbeaker/chemicompiler
holder.del_reagent("nitroglycerin")
if (del_holder)
if(ismob(holder.my_atom))
var/mob/M = holder.my_atom
M.gib()
else
qdel(holder.my_atom)
reaction_temperature(exposed_temperature, exposed_volume)
if (exposed_temperature <= T0C + 14)
reagent_state = SOLID
else if (exposed_temperature <= T0C + 50)
if (reagent_state == SOLID)
var/delta = exposed_temperature - holder.last_temp
if (delta > 5 && prob(delta * 5))
explode(holder.covered_turf(), "rapid thawing")
return
reagent_state = LIQUID
else
explode(holder.covered_turf(), "temperature change to gaseous form")
reaction_turf(var/turf/T, var/volume)
explode(list(T), "splash on turf")
reaction_mob(var/mob/M, var/volume)
explode(list(get_turf(M)), "splash on [key_name(M)]")
reaction_obj(var/obj/O, var/volume)
explode(list(get_turf(O)), "splash on [key_name(O)]")
physical_shock(var/force)
if (reagent_state == SOLID && force >= 4 && prob(force - (14 - holder.total_temperature) * 0.1))
explode(list(get_turf(holder.my_atom)), "physical trauma (force [force], usr: [key_name(usr)]) in solid state")
else if (reagent_state == LIQUID && prob(force * 6))
explode(list(get_turf(holder.my_atom)), "physical trauma (force [force], usr: [key_name(usr)]) in liquid state")
on_transfer(var/datum/reagents/source, var/datum/reagents/target, var/trans_volume)
var/datum/reagent/nitroglycerin/target_ng = target.get_reagent("nitroglycerin")
logTheThing("combat", usr, null, "caused physical shock to nitroglycerin by transferring [trans_volume]u from [source.my_atom] to [target.my_atom].")
// mechanical dropper transfer (1u): solid at 14°C: 0%, liquid: 0%
// classic dropper transfer (5u): solid at 14°C: 0% (due to min force cap), liquid: 20%
// beaker transfer (10u): solid at -36°C: 0%, solid: 5%, liquid: 30%
// the only safe way to transfer nitroglycerin is by freezing it
// thenagain, it may explode when being thawed unless heated *very* slowly
target_ng.physical_shock(round(0.45 * trans_volume))
copper_nitrate
name = "copper nitrate"
id = "copper_nitrate"
description = "An intermediary which sublimates at 180 °C."
reagent_state = SOLID
fluid_r = 0
fluid_g = 0
fluid_b = 255
transparency = 255
silver_nitrate
name = "silver nitrate"
id = "silver_nitrate"
description = "A versatile precursor with some minor caustic applications."
reagent_state = SOLID
fluid_r = 220
fluid_g = 220
fluid_b = 220
transparency = 255
// silver salts are toxic
overdose = 10
reaction_mob(var/mob/M, var/method=TOUCH, var/volume_passed)
src = null
if (!volume_passed)
return
if (!ishuman(M))
return
if (method == TOUCH)
var/mob/living/carbon/human/H = M
var/cauterised
if (volume_passed >= 10)
// reduce bleeding
if (H.bleeding)
H.bleeding--
cauterised = 1
// minor burning
if (volume_passed >= 50)
H.TakeDamage("chest", 0, 5, 0, DAMAGE_BURN)
else
H.TakeDamage("chest", 0, 2, 0, DAMAGE_BURN)
H.emote("scream")
H.updatehealth()
if (cauterised)
boutput(H, "<span style=\"color:blue\">The silver nitrate burns like hell as it cauterises some of your wounds.</span>")
else
boutput(H, "<span style=\"color:blue\">The silver nitrate burns like hell.</span>")
silver_fulminate
name = "silver fulminate"
id = "silver_fulminate"
description = "A very volatile mixture that can react given the slightest stimulus."
reagent_state = SOLID
fluid_r = 128
fluid_g = 128
fluid_b = 128
proc/pop(var/turf/T, var/amount=5)
playsound(T, 'sound/weapons/Gunshot.ogg', rand(1, min(amount*10, 50)), 1)
proc/explode()
var/list/covered = holder.covered_turf()
for(var/turf/t in covered)
pop(t, (volume/covered.len))
// can act as primary explosive
var/datum/reagents/silver_fulminate_holder = holder
var/silver_fulminate_volume = volume
silver_fulminate_holder.del_reagent("silver_fulminate")
silver_fulminate_holder.temperature_reagents(silver_fulminate_holder.total_temperature + silver_fulminate_volume*200)
reaction_temperature(var/exposed_temperature, var/exposed_volume)
if (exposed_temperature >= T0C + 30)
explode()
else
var/delta = exposed_temperature - holder.last_temp
if (delta > 5 && prob(delta*5))
explode()
reaction_turf(var/turf/T, var/amount)
// adding a slight delay solely to make silver fulminate foam way more fun
sleep(rand(0, 5))
pop(T, amount)
reaction_mob(var/mob/M, var/method=TOUCH, var/amount_passed)
if (method == TOUCH)
pop(get_turf(M), max(amount_passed,0.01))
reaction_obj(var/obj/O, var/amount)
pop(get_turf(O), amount)
physical_shock(var/force)
if (prob(force*5))
explode()
on_transfer(var/datum/reagents/source, var/datum/reagents/target, var/transferred_volume)
var/datum/reagent/silver_fulminate/target_silver_fulminate = target.get_reagent("silver_fulminate")
if (target_silver_fulminate)
// 10 or more units in one place explode
if (target_silver_fulminate.volume >= 10)
target_silver_fulminate.explode()
else
// transferring single units is safe, anything more has a decent chance of reacting
target_silver_fulminate.physical_shock(round(0.45 * transferred_volume))
on_mob_life(var/mob/M, var/mult = 1)
if (!M)
M = holder.my_atom
if (prob(volume))
explode()
..()
return
glycerol
name = "glycerol"
id = "glycerol"
description = "A sweet, non-toxic, viscous liquid. It is widely used as an additive."
taste = "sweet"
reagent_state = LIQUID
fluid_r = 220
fluid_g = 220
fluid_b = 255
transparency = 128
viscosity = 0.8
aranesp
name = "aranesp"
id = "aranesp"
description = "An illegal performance enhancing drug. Side effects might include chest pain, seizures, swelling, headache, fever... ... ..."
fluid_r = 120
fluid_g = 255
fluid_b = 240
transparency = 215
value = 41 // 17 18 6
viscosity = 0.4
on_add()
if (istype(holder) && istype(holder.my_atom) && hascall(holder.my_atom,"add_stam_mod_regen"))
holder.my_atom:add_stam_mod_regen("aranesp", 15)
if (istype(holder) && istype(holder.my_atom) && hascall(holder.my_atom,"add_stam_mod_max"))
holder.my_atom:add_stam_mod_max("aranesp", 25)
return
on_remove()
if (istype(holder) && istype(holder.my_atom) && hascall(holder.my_atom,"remove_stam_mod_regen"))
holder.my_atom:remove_stam_mod_regen("aranesp")
if (istype(holder) && istype(holder.my_atom) && hascall(holder.my_atom,"remove_stam_mod_max"))
holder.my_atom:remove_stam_mod_max("aranesp")
return
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (prob(90))
M.take_toxin_damage(1 * mult)
if (prob(5)) M.emote(pick("twitch", "shake", "tremble","quiver", "twitch_v"))
if (prob(8)) boutput(M, "<span style=\"color:blue\">You feel [pick("really buff", "on top of the world","like you're made of steel", "food_energized", "invigorated", "full of energy")]!</span>")
if (prob(5))
boutput(M, "<span style=\"color:red\">You cannot breathe!</span>")
M.setStatus("stunned", max(M.getStatusDuration("stunned"), 20 * mult))
M.take_oxygen_deprivation(15 * mult)
M.losebreath += (1 * mult)
..()
return
anti_fart
name = "simethicone"
id = "anti_fart"
description = "This strange liquid seems to have no bubbles on the surface."
reagent_state = LIQUID
honk_fart
name = "honkfartium"
id = "honk_fart"
description = "This always-bubbling liquid looks pretty funny."
reagent_state = LIQUID
fluid_r = 255
fluid_g = 182
fluid_b = 193
transparency = 200
stimulants
name = "stimulants"
id = "stimulants"
description = "A dangerous chemical cocktail that allows for seemingly superhuman feats for a short time ..."
reagent_state = LIQUID
fluid_r = 120
fluid_g = 0
fluid_b = 140
transparency = 200
value = 66 // vOv
//addiction_prob = 25
on_add()
if (istype(holder) && istype(holder.my_atom) && hascall(holder.my_atom,"add_stam_mod_regen"))
holder.my_atom:add_stam_mod_regen("stims", 500)
if (istype(holder) && istype(holder.my_atom) && hascall(holder.my_atom,"add_stam_mod_max"))
holder.my_atom:add_stam_mod_max("stims", 500)
if (ismob(holder.my_atom))
var/mob/M = holder.my_atom
M.add_stun_resist_mod("reagent_stimulants", 1000)
return
on_remove()
if (istype(holder) && istype(holder.my_atom) && hascall(holder.my_atom,"remove_stam_mod_regen"))
holder.my_atom:remove_stam_mod_regen("stims")
if (istype(holder) && istype(holder.my_atom) && hascall(holder.my_atom,"remove_stam_mod_max"))
holder.my_atom:remove_stam_mod_max("stims")
if (ismob(holder.my_atom))
var/mob/M = holder.my_atom
M.remove_stun_resist_mod("reagent_stimulants")
return
on_mob_life(var/mob/living/M, var/mult = 1)
if (!M) M = holder.my_atom
if (src.volume > 5)
if (M.get_oxygen_deprivation())
M.take_oxygen_deprivation(-5 * mult)
if (M.get_toxin_damage())
M.take_toxin_damage(-5 * mult)
M.delStatus("slowed")
M.delStatus("disorient")
if (M.misstep_chance)
M.change_misstep_chance(-INFINITY)
M.HealDamage("All", 10 * mult, 10 * mult)
M.dizziness = max(0,M.dizziness-10)
M.drowsyness = max(0,M.drowsyness-10)
M.sleeping = 0
else
M.take_toxin_damage(2 * mult)
random_brute_damage(M, 1 * mult)
if (prob(10))
M.setStatus("stunned", max(M.getStatusDuration("stunned"), 40))
M.updatehealth()
..()
return
hairgrownium //It..grows hair. Not to be confused with the previous hair growth reagent, "wacky monkey cheeseonium"
name = "hairgrownium"
id = "hairgrownium"
description = "A mysterious chemical purported to help grow hair. Often found on late-night TV infomercials."
fluid_r = 100
fluid_b = 100
fluid_g = 255
transparency = 205
penetrates_skin = 1 // why wouldn't it, really
value = 20 // 2 9 9
viscosity = 0.2
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (prob(10) && ishuman(M))
var/mob/living/carbon/human/H = M
H.bioHolder.mobAppearance.customization_first = pick(feminine_hstyles + masculine_hstyles)
H.bioHolder.mobAppearance.UpdateMob()
boutput(H, "<span style=\"color:blue\">Your scalp feels itchy!</span>")
..()
return
super_hairgrownium //moustache madness
name = "super hairgrownium"
id = "super_hairgrownium"
description = "A mysterious and powerful chemical purported to cause rapid hair growth."
fluid_r = 100
fluid_b = 100
fluid_g = 255
transparency = 205
penetrates_skin = 1 // why wouldn't it, really
value = 34 // 20 13 1
viscosity = 0.3
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (ishuman(M))
var/somethingchanged = 0
var/mob/living/carbon/human/H = M
if (H.cust_one_state != "80s")
H.cust_one_state = "80s"
somethingchanged = 1
if (H.gender == MALE && H.cust_two_state != "longbeard")
H.cust_two_state = "longbeard"
somethingchanged = 1
H.set_face_icon_dirty()
if (!(H.wear_mask && istype(H.wear_mask, /obj/item/clothing/mask/moustache)))
somethingchanged = 1
for (var/obj/item/clothing/O in H)
if (istype(O,/obj/item/clothing/mask))
H.u_equip(O)
if (O)
O.set_loc(H.loc)
O.dropped(H)
O.layer = initial(O.layer)
var/obj/item/clothing/mask/moustache/moustache = new /obj/item/clothing/mask/moustache(H)
H.equip_if_possible(moustache, H.slot_wear_mask)
H.set_clothing_icon_dirty()
if (somethingchanged) boutput(H, "<span style=\"color:red\">Hair bursts forth from every follicle on your head!</span>")
..()
return
anima //This stuff is not done. Don't use it. Don't spoil it.
name = "anima"
id = "anima"
description = "Anima ... The animating force of the universe."
reagent_state = LIQUID
fluid_r = 120
fluid_g = 10
fluid_b = 190
transparency = 255
depletion_rate = 0
value = 539 // 2 3 28 6 500
viscosity = 0.4
// last number: for 50u you take 100 points of health (assuming this is the first time it's been made by those people) so 2 points per 1u
// that number is the value of those 2 points
on_add()
// Marq fix for cannot read null.my_atom
if (!holder)
return
var/atom/A = holder.my_atom
if (A)
animate_flash_color_fill(A,"#5C0E80",-1, 10)
if (hascall(holder.my_atom,"addOverlayComposition"))
holder.my_atom:addOverlayComposition(/datum/overlayComposition/anima)
if (ismob(A))
if (!particleMaster.CheckSystemExists(/datum/particleSystem/swoosh, A))
particleMaster.SpawnSystem(new /datum/particleSystem/swoosh/endless(A))
return
on_remove()
var/atom/A = holder.my_atom
if (A)
animate_flash_color_fill(A,"#5C0E80", 1, 10)
if (hascall(holder.my_atom,"removeOverlayComposition"))
holder.my_atom:removeOverlayComposition(/datum/overlayComposition/anima)
if (ismob(A))
particleMaster.RemoveSystem(/datum/particleSystem/swoosh, A)
return
reaction_mob(var/mob/target, var/method=TOUCH, var/volume_passed)
return
reaction_obj(var/obj/O, var/volume)
src = null
if (volume < 5 || istype(O, /obj/critter) || istype(O, /obj/machinery/bot) || istype(O, /obj/decal) || O.anchored || O.invisibility) return
O.visible_message("<span style=\"color:red\">The [O] comes to life!</span>")
var/obj/critter/livingobj/L = new/obj/critter/livingobj(O.loc)
O.loc = L
L.name = "Living [O.name]"
L.desc = "[O.desc]. It appears to be alive!"
L.overlays += O
L.health = rand(10, 150)
L.atk_brute_amt = rand(1, 35)
L.defensive = 1
L.aggressive = pick(1,0)
L.atkcarbon = pick(1,0)
L.atksilicon = pick(1,0)
L.opensdoors = pick(1,0)
L.original_object = O
animate_float(L, -1, 30)
return
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (prob(8))
boutput(M, "<span style=\"color:red\">The voices ...</span>")
M.playsound_local(M, pick(ghostly_sounds), 100, 1)
return
strange_reagent
name = "strange reagent"
id = "strange_reagent"
description = "A glowing green fluid highly reminiscent of nuclear waste."
reagent_state = LIQUID
fluid_r = 160
fluid_g = 232
fluid_b = 94
transparency = 255
depletion_rate = 0.2
value = 28 // 3 3 22
viscosity = 0.5
reaction_mob(var/mob/target, var/method=TOUCH, var/volume_passed)
src = null
if (!volume_passed)
return
var/mob/living/M = target
if (!iscarbon(M) && !iscritter(M))
return
if ((method == INGEST || (method == TOUCH && prob(25))) && (isdead(M) || istype(get_area(M),/area/afterlife/bar)))
var/came_back_wrong = 0
if (M.get_brute_damage() + M.get_burn_damage() >= 150)
came_back_wrong = 1
if (iscritter(M))
M.full_heal() // same as with objcritters basically
else
M.take_oxygen_deprivation(-INFINITY)
M.take_toxin_damage(rand(0,15))
M.TakeDamage("chest", rand(0,15), rand(0,15), 0, DAMAGE_CRUSH)
M.updatehealth()
setalive(M)
if (M.ghost && M.ghost.mind && !(M.mind && M.mind.dnr)) // if they have dnr set don't bother shoving them back in their body
M.ghost.show_text("<span style=\"color:red\"><B>You feel yourself being dragged out of the afterlife!</B></span>")
M.ghost.mind.transfer_to(M)
qdel(M.ghost)
if (ishuman(M))
var/mob/living/carbon/human/H = M
if (came_back_wrong || H.decomp_stage != 0 || (H.mind && H.mind.dnr)) //Wire: added the dnr condition here
H.visible_message("<span style=\"color:red\"><B>[H]</B> starts convulsing violently!</span>")
if (H.mind && H.mind.dnr)
H.visible_message("<span style=\"color:red\"><b>[H]</b> seems to prefer the afterlife!</span>")
H.make_jittery(1000)
SPAWN_DBG(rand(20, 100))
H.gib()
else
H.visible_message("<span style=\"color:red\">[H] seems to rise from the dead!</span>","<span style=\"color:red\">You feel hungry...</span>")
else
M.visible_message("<span style=\"color:red\">[M] seems to rise from the dead!</span>","<span style=\"color:red\">You feel hungry...</span>")
return
reaction_obj(var/obj/O, var/volume)
src = null
if (istype(O, /obj/critter))
var/obj/critter/critter = O
if (!critter.alive && critter.can_revive) //I should probably check for organic critters, but most robotic ones just blow up on death
critter.health = initial(critter.health)
critter.alive = 1
critter.icon_state = initial(critter.icon_state)
critter.set_density(initial(critter.density))
critter.on_revive()
critter.visible_message("<span style=\"color:red\">[critter] seems to rise from the dead!</span>")
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (prob(10))
M.take_toxin_damage(2 * mult)
random_brute_damage(M, 2 * mult)
M.updatehealth()
..()
return
carpet
name = "carpet"
id = "carpet"
description = "A covering of thick fabric used on floors. This type looks particularly gross."
reagent_state = LIQUID
fluid_r = 112
fluid_b = 69
fluid_g = 19
transparency = 255
value = 4 // 2 2
viscosity = 0.3
reaction_turf(var/turf/T, var/volume)
if (T.icon == 'icons/turf/floors.dmi' && volume >= 5)
SPAWN_DBG(1.5 SECONDS)
T.icon_state = "grimy"
src = null
return
fffoam
name = "firefighting foam"
id = "ff-foam"
description = "Carbon Tetrachloride is a foam used for fire suppression."
reagent_state = LIQUID
fluid_r = 195
fluid_g = 195
fluid_b = 175
transparency = 200
value = 3 // 1 1 1
viscosity = 0.14
reaction_temperature(exposed_temperature, exposed_volume)
return
reaction_turf(var/turf/target, var/volume)
src = null
var/obj/hotspot = (locate(/obj/hotspot) in target)
if (hotspot)
if (istype(target, /turf/simulated))
var/turf/simulated/T = target
if (T.air)
var/datum/gas_mixture/lowertemp = T.remove_air( T.air.total_moles() )
if (lowertemp)// ZeWaka: Fix for null.temperature
lowertemp.temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 200 //T0C - 100
lowertemp.toxins = max(lowertemp.toxins-50,0)
lowertemp.react()
T.assume_air(lowertemp)
hotspot.disposing() // have to call this now to force the lighting cleanup
pool(hotspot)
var/obj/fire_foam/F = (locate(/obj/fire_foam) in target)
if (!F)
F = unpool(/obj/fire_foam)
F.set_loc(target)
SPAWN_DBG(20 SECONDS)
if (F && !F.disposed)
pool(F)
return
reaction_obj(var/obj/item/O, var/volume)
src = null
if (istype(O) && prob(40))
if (O.burning)
O.burning = 0
return
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
src = null
if (method == TOUCH)
var/mob/living/L = M
if (istype(L) && L.getStatusDuration("burning"))
L.changeStatus("burning", -300)
return
silicate
name = "silicate"
id = "silicate"
description = "A compound that can be used to reinforce glass."
reagent_state = LIQUID
fluid_r = 38
fluid_g = 128
fluid_b = 191
value = 3 // 1 1 1
viscosity = 0.4
reaction_obj(var/obj/O, var/volume)
src = null
if (istype(O,/obj/window))
var/obj/window/W = O
// Silicate was broken. I fixed it (Convair880).
var/max_reinforce = 500
if (W.health >= max_reinforce)
return
var/do_reinforce = W.health * 2
if ((W.health + do_reinforce) > max_reinforce)
do_reinforce = max(0, (max_reinforce - W.health))
W.health += do_reinforce
W.health_max = W.health
var/icon/I = icon(W.icon)
I.ColorTone( rgb(165,242,243) )
W.icon = I
return
//foam precursor
fluorosurfactant
name = "fluorosurfactant"
id = "fluorosurfactant"
description = "A perfluoronated sulfonic acid that forms a foam when mixed with water."
reagent_state = LIQUID
fluid_r = 100
fluid_g = 255
fluid_b = 255
transparency = 30
value = 5 // 3 1 1
lube
name = "space lube"
id = "lube"
description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them."
reagent_state = LIQUID
fluid_r = 0
fluid_b = 245
fluid_g = 255
value = 3 // 1 1 1
hygiene_value = 0.25
block_slippy = -1
reaction_turf(var/turf/target, var/volume)
var/list/covered = holder.covered_turf()
src = null
var/turf/simulated/T = target
var/volume_mult = 1
if (covered && covered.len)
if (volume/covered.len < 2) //reduce time based on dilution
volume_mult = min(volume / 9, 1)
if (istype(T))
if (T.wet >= 2) return
T.wet = 2
SPAWN_DBG(800 * volume_mult)
if (istype(T))
T.wet = 0
T.UpdateOverlays(null, "wet_overlay")
return
superlube
name = "organic superlubricant"
id = "superlube"
description = "Organic superlube is great stuff, but it'll try and slide away from you the first chance it gets."
reagent_state = LIQUID
fluid_r = 0
fluid_b = 245
fluid_g = 255
value = 4 // 1 1 1
hygiene_value = 0.25
block_slippy = -1
reaction_turf(var/turf/target, var/volume)
src = null
var/turf/simulated/T = target
if (istype(T))
if (T.wet >= 3) return
T.wet = 3
SPAWN_DBG(80 SECONDS)
if (istype(T))
T.wet = 0
T.UpdateOverlays(null, "wet_overlay")
return
// metal foaming agent
// this is lithium hydride. Add other recipies (e.g. MiH + H2O -> MiOH + H2) eventually
// two different foaming agents is overly complicated imo - IM
/*foaming_agent
name = "foaming agent"
id = "foaming_agent"
description = "A agent that yields metallic foam when mixed with light metal and a strong acid."
reagent_state = SOLID
fluid_r = 100
fluid_g = 90
fluid_b = 90
transparency = 255*/
ammonia
name = "ammonia"
id = "ammonia"
description = "A caustic substance commonly used in fertilizer or household cleaners."
reagent_state = GAS
fluid_r = 255
fluid_g = 255
fluid_b = 180
transparency = 75
value = 2 // 1c + 1c
hygiene_value = 0.25
on_plant_life(var/obj/machinery/plantpot/P)
P.growth += 4
if (prob(66))
P.health++
P.reagents.remove_any(4)
diethylamine
name = "diethylamine"
id = "diethylamine"
description = "A secondary amine, useful as a plant nutrient and as building block for other compounds."
reagent_state = LIQUID
fluid_r = 60
fluid_g = 50
fluid_b = 0
transparency = 255
value = 4 // 2c + 1c + heat
on_plant_life(var/obj/machinery/plantpot/P)
if (prob(66))
P.growth+=2
acetone
name = "acetone"
id = "acetone"
description = "Pure 100% nail polish remover, also works as an industrial solvent."
reagent_state = LIQUID
fluid_r = 200
fluid_g = 200
fluid_b = 200
transparency = 20
value = 5 // 3c + 1c + 1c
hygiene_value = 0.75
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
M.take_toxin_damage(1.5 * mult)
..()
return
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if (method == TOUCH)
remove_stickers(M, volume)
reaction_obj(var/obj/O, var/volume)
remove_stickers(O, volume)
reaction_turf(var/turf/T, var/volume)
remove_stickers(T, volume)
proc/remove_stickers(var/atom/target, var/volume)
var/can_remove_amt = volume / 10
var/removed_count = 0
if ((istype(target, /turf/simulated/wall) || istype(target, /turf/unsimulated/wall)))
target = locate_sticker_wall(target)
if (!target)
return
for(var/atom in target)
var/atom/A = atom
if (A.event_handler_flags & HANDLE_STICKER)
if (A:active)
target.visible_message("<span style=\"color:red\"><b>[A]</b> dissolves completely!</span>")
qdel(A)
removed_count++
if (removed_count > can_remove_amt)
break
//when a sticker is placed on a wall, its loc is actually set to the floor in front of the wall to prevent cameras seeing through walls. use this proc to find it!
proc/locate_sticker_wall(var/turf/T)
for (var/turf/turf in range(1,T))
for (var/obj/item/sticker/S in turf)
if (S.attached == T || S.attached.loc == T)
return T
return 0
stabiliser
name = "stabilising agent"
id = "stabiliser"
description = "A chemical that stabilises normally volatile compounds, preventing them from reacting immediately."
reagent_state = LIQUID
fluid_r = 255
fluid_g = 255
fluid_b = 0
transparency = 255
value = 3 // 1c + 1c + 1c
ectoplasm
name = "ectoplasm"
id = "ectoplasm"
description = "A bizarre gelatinous substance supposedly derived from ghosts."
reagent_state = LIQUID
fluid_r = 179
fluid_g = 225
fluid_b = 151
transparency = 175
value = 3
viscosity = 0.4
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if ((holder.get_reagent_amount(src.id) >= 10) && prob(8))
var/Message = rand(1,6)
switch(Message)
if (1)
boutput(M, "<span style=\"color:red\">You shudder as if cold...</span>")
M.emote("shiver")
if (2)
boutput(M, "<span style=\"color:red\">You feel something gliding across your back...</span>")
if (3)
boutput(M, "<span style=\"color:red\">Your eyes twitch, you feel like something you can't see is here...</span>")
if (4)
boutput(M, "<span style=\"color:red\">You notice something moving out of the corner of your eye, but nothing is there...</span>")
if (5)
boutput(M, "<span style=\"color:red\">You feel uneasy.</span>")
if (6)
boutput(M, "<span style=\"color:red\">You've got the heebie-jeebies.</span>")
if (prob(1))
for (var/obj/W in orange(5,M))
if (prob(25) && !W.anchored)
step_rand(W)
..()
reaction_turf(var/turf/T, var/volume)
src = null
if (volume >= 10)
if (locate(/obj/item/reagent_containers/food/snacks/ectoplasm) in T) return
new /obj/item/reagent_containers/food/snacks/ectoplasm(T)
space_fungus
name = "space fungus"
id = "space_fungus"
description = "Scrapings of some unknown fungus found growing on the station walls."
reagent_state = SOLID
fluid_r = 200
fluid_g = 125
fluid_b = 40
transparency = 255
value = 2
hygiene_value = -1
viscosity = 0.55
reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if (method == INGEST)
var/ranchance = rand(1,10)
if (ranchance == 1)
boutput(M, "<span style=\"color:red\">You feel very sick.</span>")
M.reagents.add_reagent("toxin", rand(1,5))
else if (ranchance <= 5 && ranchance != 1)
boutput(M, "<span style=\"color:red\">That tasted absolutely FOUL.</span>")
M.contract_disease(/datum/ailment/disease/food_poisoning, null, null, 1) // path, name, strain, bypass resist
else boutput(M, "<span style=\"color:red\">Yuck!</span>")
return
on_plant_life(var/obj/machinery/plantpot/P)
var/datum/plantgenes/DNA = P.plantgenes
if (prob(50))
DNA.endurance++
cryostylane
name = "cryostylane"
id = "cryostylane"
description = "An incredibly cold substance. Used in many high-demand cooling systems."
reagent_state = LIQUID
fluid_r = 0
fluid_g = 0
fluid_b = 220
transparency = 200
value = 3 // 1 1 1
viscosity = 0.35
heat_capacity = 600
reaction_mob(var/mob/M, var/method=TOUCH, var/volume_passed,var/list/paramslist = 0)
if (isobserver(M))
return
var/silent = 0
if (paramslist && paramslist.len)
if ("silent" in paramslist)
silent = 1
var/list/covered = holder.covered_turf()
if (covered.len > 3)
silent = 1
src = null
if (method == TOUCH)
var/mob/living/L = M
if (istype(L) && L.getStatusDuration("burning"))
L.delStatus("burning")
if ((world.time > M.last_cubed + 5 SECONDS) && M.bioHolder)
if ((!M.is_cold_resistant() || ischangeling(M)) && isturf(M.loc) )
if (silent && volume_passed < 1)
if (prob(volume_passed*100))
new /obj/icecube(get_turf(M), M)
else
new /obj/icecube(get_turf(M), M)
M.bodytemperature = 0
return
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (M.bodytemperature > 0)
M.bodytemperature = max(M.bodytemperature-(50 * mult),0)
var/mob/living/L = M //for cryostylane not putting out fires during mob tick -Cirrial
var/fireDiff = L.bodytemperature - FIRE_MINIMUM_TEMPERATURE_TO_EXIST
if(istype(L) && L.getStatusDuration("burning") && fireDiff < 0)
L.changeStatus("burning", fireDiff*10 * mult) // by definition fireDiff will be negative
..()
return
reaction_turf(var/turf/target, var/volume)
src = null
if (volume >= 3)
if (locate(/obj/decal/icefloor) in target) return
var/obj/decal/icefloor/B = new /obj/decal/icefloor(target)
SPAWN_DBG(80 SECONDS)
if (B)
B.dispose()
var/obj/hotspot = (locate(/obj/hotspot) in target)
if (hotspot)
if (istype(target, /turf/simulated))
var/turf/simulated/T = target
if (!T.air) return //ZeWaka: Fix for null.total_moles()
var/datum/gas_mixture/lowertemp = T.remove_air( T.air.total_moles() )
if (lowertemp) //ZeWaka: Fix for null.temperature
lowertemp.temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 200 //T0C - 100
lowertemp.toxins = max(lowertemp.toxins-50,0)
lowertemp.react()
T.assume_air(lowertemp)
hotspot.disposing() // have to call this now to force the lighting cleanup
pool(hotspot)
return
booster_enzyme
name = "booster enzyme"
id = "booster_enzyme"
description = "This booster enzyme helps the body to replicate beneficial chemicals."
reagent_state = LIQUID
fluid_r = 127
fluid_g = 160
fluid_b = 192
transparency = 255
viscosity = 0.15
on_mob_life(var/mob/M, var/mult = 1)
for (var/i = 1, i <= booster_enzyme_reagents_to_check.len, i++)
var/check_amount = holder.get_reagent_amount(booster_enzyme_reagents_to_check[i])
if (check_amount && check_amount < 18)
holder.add_reagent("[booster_enzyme_reagents_to_check[i]]", 2 * mult)
..()
return
space_cleaner // COGWERKS CHEM REVISION PROJECT. ethanol, ammonia + water - treat like a shitty version of windex
name = "space cleaner"
id = "cleaner"
description = "A compound used to clean things. It has a sharp, unpleasant odor." // cogwerks- THIS IS NOT BLEACH ARGHHHH
reagent_state = LIQUID
fluid_r = 110
fluid_g = 220
fluid_b = 220
transparency = 150
overdose = 5
value = 4 // 2 1 1
hygiene_value = 5
reaction_obj(var/obj/O, var/volume)
if (!isnull(O))
O.clean_forensic()
reaction_turf(var/turf/T, var/volume)
T.clean_forensic()
reaction_mob(var/mob/living/carbon/human/M, var/method=TOUCH, var/volume)
M.clean_forensic()
if (ishuman(M) && M.sims)
if (method == TOUCH)
M.sims.affectMotive("hygiene", volume)
luminol // OOC. Weaseldood. oh that stuff from CSI, the glowy blue shit that they spray on blood
name = "luminol"
id = "luminol"
description = "A chemical that can detect trace amounts of blood."
reagent_state = LIQUID
fluid_r = 255
fluid_g = 255
fluid_b = 204
transparency = 150
reaction_turf(var/turf/T, var/volume)
if (volume >= 5)
for (var/obj/decal/bloodtrace/B in T)
B.invisibility = 0
SPAWN_DBG(30 SECONDS)
if (B)
B.invisibility = 101
for (var/obj/item/W in T)
if (W.get_forensic_trace("bDNA"))
var/icon/icon_old = W.icon
var/icon/I = new /icon(W.icon, W.icon_state)
I.Blend(new /icon('icons/effects/blood.dmi', "thisisfuckingstupid"),ICON_ADD)
I.Blend(new /icon('icons/effects/blood.dmi', "lum-item"),ICON_MULTIPLY)
I.Blend(new /icon(W.icon, W.icon_state),ICON_UNDERLAY)
W.icon = I
SPAWN_DBG(30 SECONDS)
if (W && icon_old)
W.icon = icon_old
oil
name = "oil"
id = "oil"
description = "A decent lubricant for machines. High in benzene, naptha and other hydrocarbons."
reagent_state = LIQUID
fluid_r = 0
fluid_g = 0
fluid_b = 0
transparency = 255
value = 3 // 1c + 1c + 1c
viscosity = 0.13
var/min_req_fluid = 0.25 //at least 1/4 of the fluid needs to be oil for it to ignite
reaction_temperature(exposed_temperature, exposed_volume)
if (exposed_temperature > T0C + 200 && !src.reacting && (holder && !holder.has_reagent("chlorine"))) // need this to be higher to make propylene possible
src.reacting = 1
var/list/covered = holder.covered_turf()
if (covered.len < 4 || (volume / holder.total_volume) > min_req_fluid)
for(var/turf/location in covered)
fireflash(location, min(max(0,volume/40),8))
if (covered.len < 4 || prob(10))
location.visible_message("<b>The oil burns!</b>")
var/datum/effects/system/bad_smoke_spread/smoke = new /datum/effects/system/bad_smoke_spread()
smoke.set_up(1, 0, location)
smoke.start()
if (holder)
holder.add_reagent("ash", round(src.volume/2), null)
holder.del_reagent(id)
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if (volume)
if (method == TOUCH)
if (isrobot(M))
var/mob/living/silicon/robot/R = M
R.add_oil(volume * 2)
boutput(R, "<span style=\"color:blue\">Your joints and servos begin to run more smoothly.</span>")
else boutput(M, "<span style=\"color:red\">You feel greasy and gross.</span>")
return
reaction_turf(var/turf/target, var/volume)
var/turf/simulated/T = target
if (istype(T) && T.wet) //Wire: fix for Undefined variable /turf/space/var/wet (&& T.wet)
src = null
if (T.wet >= 1) return
T.wet = 1
if (!locate(/obj/decal/cleanable/oil) in T)
playsound(T, "sound/impact_sounds/Slimy_Splat_1.ogg", 50, 1)
switch(volume)
if (0 to 0.5)
if (prob(volume * 10))
make_cleanable(/obj/decal/cleanable/oil/streak,T)
if (5 to 19)
make_cleanable(/obj/decal/cleanable/oil/streak,T)
if (20 to INFINITY)
make_cleanable(/obj/decal/cleanable/oil,T)
SPAWN_DBG(20 SECONDS)
T.wet = 0
T.UpdateOverlays(null, "wet_overlay")
return
on_mob_life(var/mob/M, var/mult = 1)
//if (prob(4)) // it's motor oil, you goof
//M.reagents.add_reagent("cholesterol", rand(1,3))
return
capulettium
name = "capulettium"
id = "capulettium"
description = "A rare drug that causes the user to appear dead for some time." //dead appearance handled in human.dm
reagent_state = LIQUID
fluid_r = 100
fluid_g = 145
fluid_b = 110
value = 6 // 4c + 1c + 1c
viscosity = 0.13
var/counter = 1
pooled()
..()
counter = 1
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (!counter) counter = 1
switch(counter++)
if (1 to 5)
M.change_eye_blurry(10, 10)
if (6 to 10)
M.drowsyness = max(M.drowsyness, 10)
if (11)
M.setStatus("paralysis", max(M.getStatusDuration("paralysis"), 30 * mult))
M.visible_message("<B>[M]</B> seizes up and falls limp, \his eyes dead and lifeless...")
M.resting = 1
playsound(get_turf(src), "sound/voice/death_[pick(1,2)].ogg", 40, 0, 0, M.get_age_pitch())
if (12 to 60) // Capped at ~2 minutes, that is 60 cycles + 10 paralysis (normally wears off at one per cycle).
M.changeStatus("paralysis", 30 * mult)
if (61 to INFINITY)
M.change_eye_blurry(10, 10)
M.updatehealth()
..()
capulettium_plus
name = "capulettium plus"
id = "capulettium_plus"
description = "A rare and expensive drug that causes the user to appear dead for some time while they retain consciousness and vision." //dead appearance handled in human.dm
reagent_state = LIQUID
fluid_r = 100
fluid_g = 145
fluid_b = 110
value = 28 // 6c + 9c + 13c
viscosity = 0.17
var/counter = 1
pooled()
..()
counter = 1
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (!counter) counter = 1
if (counter == 10)
M.resting = 1
M.visible_message("<B>[M]</B> seizes up and falls limp, \his eyes dead and lifeless...")
playsound(get_turf(src), "sound/voice/death_[pick(1,2)].ogg", 40, 0, 0, M.get_age_pitch())
M.updatehealth()
..()
/*
montaguone
name = "montaguone"
id = "montaguone"
description = "A rare drug that causes the dead to appear alive but unconscious for some time." //handled in human.dm
reagent_state = LIQUID
fluid_r = 100
fluid_g = 145
fluid_b = 110
montaguone_extra
name = "montaguone extra"
id = "montaguone_extra"
description = "A rare and exhorbitantly expensive drug that causes the dead to appear alive and well for some time." //live appearance handled in human.dm
reagent_state = LIQUID
fluid_r = 100
fluid_g = 145
fluid_b = 110
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (isdead(M))
if (!data) data = 1
switch(data)
if (1 to 10)
if (prob(20)) M.emote("gasp")
if (11)
M.lying = 0
if (12 to INFINITY)
SPAWN_DBG(5 SECONDS)
if (!M.reagents.has_reagent("montaguone_extra"))
M.lying = 1
M.emote("deathgasp")
data++
M.updatehealth()
..()
*/
life
name = "life"
id = "life"
description = "Just a placeholder thing, you shouldn't be seeing this!"
ageinium
name = "ageinium"
id = "ageinium"
description = "A crusty fluid that smells like old people."
reagent_state = LIQUID
fluid_r = 160
fluid_g = 192
fluid_b = 192
transparency = 128
viscosity = 0.6
on_mob_life(var/mob/M, var/mult = 1)
if (!M)
M = holder.my_atom
if(prob(30) && istype(M, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if (H.bioHolder.age < 140)
H.bioHolder.age += 1 * mult
if (prob(10))
boutput(H, "<span style=\"color:red\">You feel [pick("old", "strange", "frail", "peculiar", "odd")].</span>")
if (prob(4))
H.emote("scream")
..()
return
denatured_enzyme
name = "denatured enzyme"
id = "denatured_enzyme"
description = "Heated beyond usefulness, this enzyme is now worthless."
reagent_state = LIQUID
fluid_r = 42
fluid_g = 36
fluid_b = 19
transparency = 255
// used to make fake initropidril
eyeofnewt
name = "eye of newt"
id = "eyeofnewt"
description = "A potent alchemic ingredient."
reagent_state = LIQUID
fluid_r = 10
fluid_g = 10
fluid_b = 50
transparency = 50
toeoffrog
name = "toe of frog"
id = "toeoffrog"
description = "A potent alchemic ingredient."
reagent_state = LIQUID
fluid_r = 10
fluid_g = 50
fluid_b = 10
transparency = 50
woolofbat
name = "wool of bat"
id = "woolofbat"
description = "A potent alchemic ingredient."
reagent_state = LIQUID
fluid_r = 10
fluid_g = 10
fluid_b = 10
transparency = 50
tongueofdog
name = "tongue of dog"
id = "tongueofdog"
description = "A potent alchemic ingredient."
reagent_state = LIQUID
fluid_r = 50
fluid_g = 10
fluid_b = 10
transparency = 50
werewolf_serum_fake3
name = "Werewolf Serum Precursor Gamma"
id = "werewolf_part3"
description = "A direct precursor to a special, targeted mutagen."
reagent_state = LIQUID
fluid_r = 143
fluid_g = 35
fluid_b = 103
transparency = 10
werewolf_serum_fake4
name = "Imperfect Werewolf Serum"
id = "werewolf_part4"
description = "A flawed isomer of a special, targeted mutagen. If only it were perfected..."
reagent_state = LIQUID
fluid_r = 240
fluid_g = 255
fluid_b = 240
transparency = 200
depletion_rate = 0.2
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
var/our_amt = holder.get_reagent_amount(src.id)
if (prob(25))
M.reagents.add_reagent("histamine", rand(5,10) * mult)
if (our_amt < 5)
M.take_toxin_damage(1 * mult)
random_brute_damage(M, 1 * mult)
M.updatehealth()
else if (our_amt < 10)
if (prob(8))
M.visible_message("<span style=\"color:red\">[M] pukes all over \himself.</span>", "<span style=\"color:red\">You puke all over yourself!</span>")
M.vomit()
M.take_toxin_damage(2 * mult)
random_brute_damage(M, 2 * mult)
M.updatehealth()
else if (prob(4))
M.visible_message("<span style=\"color:red\"><B>[M]</B> starts convulsing violently!</span>", "You feel as if your body is tearing itself apart!")
M.setStatus("weakened", max(M.getStatusDuration("weakened"), 150 * mult))
M.make_jittery(1000)
SPAWN_DBG(rand(20, 100))
var/turf/Mturf = get_turf(M)
M.gib()
new /obj/critter/dog/george (Mturf)
return
..()
return
hootagen_unstable
name = "hootagen"
id = "hootagen_unstable"
description = "HOoT HoOT HOOT HOoT"
reagent_state = LIQUID
fluid_r = 139
fluid_g = 69
fluid_b = 19
transparency = 205
depletion_rate = 0.2
on_mob_life(var/mob/M, var/mult = 1)
if (!M)
M = holder.my_atom
var/our_amt = holder.get_reagent_amount(src.id)
if (prob(25))
M.reagents.add_reagent("histamine", rand(5,10) * mult)
if (our_amt < 5)
M.take_toxin_damage(1 * mult)
random_brute_damage(M, 1 * mult)
M.updatehealth()
else if (our_amt < 20)
if (prob(8))
M.visible_message("<span style=\"color:red\">[M] hoots all over \himself.</span>", "<span style=\"color:red\">You hoot all over yourself!</span>")
M.vomit()
M.take_toxin_damage(2 * mult)
random_brute_damage(M, 2 * mult)
M.updatehealth()
else if (prob(4))
M.visible_message("<span style=\"color:red\"><B>[M]</B> starts hooting violently!</span>", "You feel as if your body is hooting itself apart!")
M.setStatus("weakened", max(M.getStatusDuration("weakened"), 150 * mult))
M.make_jittery(1000)
SPAWN_DBG(rand(20, 100))
M.owlgib(control_chance = 100)
return
..()
return
hootagen_stable
name = "hootagen"
id = "hootagen_stable"
description = "HOOT HOOT HOOT HOOT"
fluid_r = 139
fluid_g = 69
fluid_b = 19
transparency = 205
depletion_rate = 0.2
on_mob_life(var/mob/M, var/mult = 1)
if (!M)
M = holder.my_atom
if (ishuman(M))
var/our_amt = holder.get_reagent_amount(src.id)
if (our_amt >= 10)
var/something_changed = 0
var/mob/living/carbon/human/H = M
// owl mask
var/obj/item/clothing/mask/curr_mask = H.wear_mask
if (curr_mask && !istype(curr_mask, /obj/item/clothing/mask/owl_mask))
// drop old mask
H.u_equip(curr_mask)
curr_mask.set_loc(H.loc)
curr_mask.dropped(H)
curr_mask.layer = initial(curr_mask.layer)
if (!H.wear_mask)
// add new mask
var/obj/item/clothing/mask/owl_mask/owl_mask = new /obj/item/clothing/mask/owl_mask(H)
owl_mask.cant_self_remove = 1
H.equip_if_possible(owl_mask, H.slot_wear_mask)
something_changed = 1
// owl suit
var/obj/item/clothing/under/curr_uniform = H.w_uniform
if (curr_uniform && !istype(curr_uniform, /obj/item/clothing/under/gimmick/owl))
// drop old uniform
H.u_equip(curr_uniform)
curr_uniform.set_loc(H.loc)
curr_uniform.dropped(H)
curr_uniform.layer = initial(curr_uniform.layer)
if (!H.w_uniform)
// add new uniform
var/obj/item/clothing/under/gimmick/owl/owl_suit = new /obj/item/clothing/under/gimmick/owl(H)
owl_suit.cant_self_remove = 1
H.equip_if_possible(owl_suit, H.slot_w_uniform)
something_changed = 1
if (something_changed)
boutput(H, "<span style=\"color:red\">HOOT HOOT HOOT HOOT!</span>")
playsound(H.loc, "sound/voice/animal/hoot.ogg", 80, 1)
..()
return
sewage
name = "sewage"
id = "sewage"
description = "Oh, wonderful."
reagent_state = LIQUID
fluid_r = 102
fluid_g = 102
fluid_b = 0
transparency = 255
viscosity = 0.4
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
src = null
if (method == INGEST)
boutput(M, "<span style=\"color:red\">Aaaagh! It tastes fucking horrendous!</span>")
SPAWN_DBG(1 SECOND)
M.visible_message("<span style=\"color:red\">[M] pukes violently!</span>")
M.vomit()
else
boutput(M, "<span style=\"color:red\">Oh god! It smells horrific! What the fuck IS this?!</span>")
if (prob(50))
SPAWN_DBG(1 SECOND)
M.visible_message("<span style=\"color:red\">[M] pukes violently!</span>")
M.vomit()
return
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (prob(7))
M.emote(pick("twitch","drool","moan"))
M.take_toxin_damage(1 * mult)
..()
return
ants
name = "ants"
id = "ants"
description = "A sample of a lost breed of Space Ants (formicidae bastardium tyrannus), they are well-known for ravaging the living shit out of pretty much anything."
reagent_state = SOLID
fluid_r = 153
fluid_g = 51
fluid_b = 51
transparency = 255
value = 2
viscosity = 0.8
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
src = null
if (ishuman(M))
boutput(M, "<span style=\"color:red\"><b>OH SHIT ANTS!!!!</b></span>")
M.emote("scream")
random_brute_damage(M, 4)
return
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
random_brute_damage(M, 2 * mult)
..()
return
spiders
name = "spiders"
id = "spiders"
description = "A bunch of tiny little spiders, all crawling around in a big spidery blob."
reagent_state = SOLID
fluid_r = 22
fluid_g = 5
fluid_b = 5
transparency = 255
var/static/reaction_count = 0
value = 13 // 11 2
viscosity = 0.8
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
src = null
if (method == TOUCH)
boutput(M, "<span style=\"color:red\"><b>OH [pick("SHIT", "FUCK", "GOD")] SPIDERS[pick("", " ON MY FACE", " EVERYWHERE")]![pick("", "!", "!!", "!!!", "!!!!")]</b></span>")
if (method == INGEST)
boutput(M, "<span style=\"color:red\"><b>OH [pick("SHIT", "FUCK", "GOD")] SPIDERS[pick("", " IN MY BLOOD", " IN MY VEINS")]![pick("", "!", "!!", "!!!", "!!!!")]</b></span>")
M.emote("scream")
random_brute_damage(M, 2)
if (ishuman(M))
if (!M:spiders)
M:spiders = 1
M:update_body()
return
reaction_turf(var/turf/T, var/volume)
fucking_critter_bullshit_fuckcrap_limiter(reaction_count)
var/turf/simulated/target = T
if (istype(target) && volume >= 5)
if (!locate(/obj/reagent_dispensers/spiders) in target)
new /obj/reagent_dispensers/spiders(target)
var/obj/critter/S
if (prob(10))
S = new /obj/critter/spider/baby(target)
else if (prob(2))
S = new /obj/critter/nicespider(target)
S.name = "spider"
S.set_density(0)
else if (locate(/obj/reagent_dispensers/spiders) in target && !locate(/obj/critter) in target)
var/obj/critter/S
if (prob(25))
S = new /obj/critter/spider/baby(target)
if (prob(2))
S.aggressive = 1
else if (prob(5))
S = new /obj/critter/nicespider(target)
S.name = "spider"
S.set_density(0)
else if (prob(10))
S = new /obj/critter/spider(target)
if (prob(1))
S.aggressive = 1
return
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
var/turf/T = get_turf(M)
if (prob(50))
random_brute_damage(M, 1 * mult)
else if (prob(10))
random_brute_damage(M, 2 * mult)
M.emote(pick("twitch", "twitch_s", "grumble"))
M.visible_message("<span style=\"color:red\"><b>[M]</b> [pick("scratches", "digs", "picks")] at [pick("something under their skin", "their skin")]!</span>",\
"<span style=\"color:red\"><b>[pick("T", "It feels like t", "You feel like t", "Oh shit t", "Oh fuck t", "Oh god t")]here's something [pick("crawling", "wriggling", "scuttling", "skittering")] in your [pick("blood", "veins", "stomach")]!</b></span>")
else if (prob(10))
random_brute_damage(M, 5 * mult)
M.emote("scream")
M.emote("twitch")
M.setStatus("weakened", max(M.getStatusDuration("weakened"), 20 * mult))
M.visible_message("<span style=\"color:red\"><b>[M.name]</b> tears at their own skin!</span>",\
"<span style=\"color:red\"><b>OH [pick("SHIT", "FUCK", "GOD")] GET THEM OUT![pick("", "!", "!!", "!!!", "!!!!")]</span>")
else if (prob(10))
if (!locate(/obj/decal/cleanable/vomit) in T)
M.vomit(0, /obj/decal/cleanable/vomit/spiders)
random_brute_damage(M, rand(4))
M.visible_message("<span style=\"color:red\"><b>[M]</b> [pick("barfs", "hurls", "pukes", "vomits")] up some [pick("spiders", "weird black stuff", "strange black goop", "wriggling black goo")]![pick("", " Gross!", " Ew!", " Nasty!")]</span>",\
"<span style=\"color:red\"><b>OH [pick("SHIT", "FUCK", "GOD")] YOU JUST [pick("BARFED", "HURLED", "PUKED", "VOMITED")] SPIDERS[pick("!", " FUCK THAT'S GROSS!", " SHIT THAT'S NASTY!", " OH GOD EW!")][pick("", "!", "!!", "!!!", "!!!!")]</b></span>")
if (prob(33))
var/obj/critter/spider/baby/S = new /obj/critter/spider/baby(M)
if (prob(5))
S.aggressive = 1
..()
return
hugs
name = "pure hugs"
id = "hugs"
description = "Hugs, in liquid form. Yes, the concept of a hug. As a liquid. This makes sense in the future."
reagent_state = LIQUID
fluid_r = 255
fluid_g = 151
fluid_b = 185
transparency = 250
value = 11
viscosity = 0.2
love
name = "pure love"
id = "love"
description = "What is this emotion you humans call \"love?\" Oh, it's this? This is it? Huh, well okay then, thanks."
reagent_state = LIQUID
fluid_r = 255
fluid_g = 131
fluid_b = 165
transparency = 250
value = 13 // 11 2
viscosity = 0.3
reaction_mob(var/mob/M)
boutput(M, "<span style=\"color:blue\">You feel loved!</span>")
return
on_mob_life(var/mob/M, var/mult = 1)
if (!M)
M = holder.my_atom
if (M.a_intent == INTENT_HARM)
M.a_intent = INTENT_HELP
if (prob(8))
. = ""
switch (rand(1, 5))
if (1)
. = "appreciated"
if (2)
. = "loved"
if (3)
. = "pretty good"
if (4)
. = "really nice"
if (5)
. = "pretty happy with yourself, even though things haven't always gone as well as they could"
boutput(M, "<span style=\"color:blue\">You feel [.].</span>")
else if (prob(100) && !M.restrained())//(prob(16))
for (var/mob/living/hugTarget in orange(1,M))
if (hugTarget == M)
continue
if (!hugTarget.stat)
M.visible_message("<span style=\"color:red\">[M] [prob(5) ? "awkwardly side-" : ""]hugs [hugTarget]!</span>")
break
..()
return
colors
name = "colorful reagent"
id = "colors"
description = "It's pure liquid colors. That's a thing now."
reagent_state = LIQUID
fluid_r = 255
fluid_g = 255
fluid_b = 255
transparency = 255
hygiene_value = -0.5
viscosity = 0.1
reaction_mob(var/mob/M, var/method = TOUCH, var/volume)
if (method == INGEST)
if (ishuman(M))
M:blood_color = "#[num2hex(rand(0, 255))][num2hex(rand(0, 255))][num2hex(rand(0, 255))]"
return
reaction_obj(var/obj/O, var/volume)
src = null
O.color = rgb(rand(0,255),rand(0,255),rand(0,255))
return
reaction_turf(var/turf/T, var/volume)
src = null
T.color = rgb(rand(0,255),rand(0,255),rand(0,255))
return
gypsum //gypsum, made with waste sulfur gas and calcium carbonate or calcium oxide (sulfur + oxygen(4) + water + calcium_carbonate)
name = "calcium sulfate"
id = "gypsum"
description = "An inorganic chemical that has many uses in the industrial sector."
reagent_state = SOLID
fluid_r = 255
fluid_g = 255
fluid_b = 255
transparency = 255
calcium_carbonate //made from extracted sea shells OR just chemical synthesis
name = "calcium carbonate"
id = "calcium_carbonate"
description = "A naturally occuring chemical found in seashells and certain rocks."
reagent_state = SOLID
fluid_r = 255
fluid_g = 255
fluid_b = 255
transparency = 255
chalk
name = "chalk"
id = "chalk"
description = "A mixture of minerals and additives that is commonly used as a writing implement."
reagent_state = SOLID
fluid_r = 255
fluid_g = 255
fluid_b = 255
transparency = 255
var/chalk_color = null
reaction_turf(var/turf/T, var/volume)
if (volume >= 5 && !locate(/obj/item/pen/crayon/chalk) in T)
if (holder.has_reagent("colors"))
new /obj/item/pen/crayon/chalk/random(T)
return
var/obj/item/pen/crayon/chalk/W = new(T)
chalk_color = holder.get_average_rgb()
W.assign_color(chalk_color)
shark_dna
name = "space shark DNA"
id = "shark_dna"
description = "How this was obtained is anyone's guess."
reagent_state = LIQUID
fluid_r = 160
fluid_g = 160
fluid_b = 255
transparency = 100
value = 4
packing_peanuts
name = "packing peanuts"
id = "packing_peanuts"
description = "Those little white things you get when you order stuff in boxes. Not to be confused with ghost poop."
reagent_state = SOLID
fluid_r = 255
fluid_g = 255
fluid_b = 255
transparency = 255
value = 3
wax
name = "wax"
id = "wax"
description = "A lipid compound used in candles and for making haunted sculptures to terrorize Scooby Doo."
reagent_state = SOLID
fluid_r = 250
fluid_g = 250
fluid_b = 250
transparency = 200
value = 3
viscosity = 0.5
pollen
name = "pollenium"
id = "pollen"
description = "A pollen-derivative with a number of proteins and other nutrients vital to space bee health. Not palatable for humans, but at least Russian dissidents have never been killed with it."
reagent_state = SOLID
fluid_r = 191
fluid_g = 191
fluid_b = 61
transparency = 255
value = 3
reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume_passed)
src = null
if(!volume_passed)
return
if(!ishuman(M))
return
if(method == INGEST)
var/mob/living/carbon/human/H = M
if (H.bioHolder && H.bioHolder.HasEffect("bee"))
boutput(M, "<span style=\"color:blue\">That tasted amazing!</span>")
else
boutput(M, "<span style=\"color:red\">Ugh! Eating that was a terrible idea!</span>")
M.setStatus("weakened", max(M.getStatusDuration("weakened"), 30))
martian_flesh
name = "martian flesh"
id = "martian_flesh"
description = "Uhhhh... it's still moving?"
reagent_state = SOLID
fluid_r = 180
fluid_g = 225
fluid_b = 175
transparency = 230
value = 5
on_mob_life(var/mob/M, var/mult = 1)
if(!M) M = holder.my_atom
if(ismartian(M))
M.HealDamage("All", 2 * mult, 0)
M.take_oxygen_deprivation(-1 * mult)
M.take_toxin_damage(-1 * mult)
M.take_brain_damage(-1 * mult)
if(prob(10))
boutput(M, "<span class='text-blue'>A burst of vitality flows through you as the martian flesh assimilates into your body.</span>")
M.HealDamage("All", 4, 0)
M.take_oxygen_deprivation(-4 * mult)
M.take_brain_damage(-4 * mult)
M.changeStatus("stunned", -40 * mult)
M.changeStatus("weakened", -40 * mult)
else
M.take_toxin_damage(1 * mult)
if(prob(10))
boutput(M, "<span class='text-red'>[pick("You can feel your insides squirming, oh god!", "You feel horribly queasy.", "You can feel something climbing up and down your throat.", "Urgh, you feel really gross!", "It feels like something is crawling inside your skin!")]</span>")
M.take_toxin_damage(4 * mult)
M.UpdateDamageIcon()
M.updatehealth()
..()
return
reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume_passed)
src = null
if(!volume_passed)
return
if(ismartian(M))
// no matter what the method is, it's just gonna start doing weird freaky alien melding so whatever
boutput(M, "<span class='text-blue'>The martian flesh begins to merge into your body, repairing tissue damage as it does so.</span>")
M.HealDamage("All", 5, 0)
M.UpdateDamageIcon()
M.updatehealth()
else
if(method == INGEST)
boutput(M, "<span class='text-red bold'>OH FUCK [pick("IT'S MOVING IN YOUR INSIDES", "IT TASTES LIKE ANGRY MUTANT BROCCOLI", "IT HURTS IT HURTS", "THIS WAS A BAD IDEA", "IT'S LIKE ALIEN GENOCIDE IN YOUR MOUTH AND EVERYONE'S DEAD", "IT'S BITING BACK", "IT'S CRAWLING INTO YOUR THROAT", "IT'S PULLING AT YOUR TEETH")]!!</span>")
M.setStatus("weakened", max(M.getStatusDuration("weakened"), 30))
M.emote("scream")
if(method == TOUCH)
boutput(M, "<span class='text-red'>Well, that was gross.</span>")
flockdrone_fluid
name = "coagulated gnesis"
id = "flockdrone_fluid"
description = "A thick teal fluid of alien origin. It moves in ways that suggest it might be alive in some way."
reagent_state = LIQUID
fluid_r = 77
fluid_g = 115
fluid_b = 109
transparency = 192
viscosity = 0.3
depletion_rate = 0.05
var/conversion_rate = 2
var/list/sounds = list("sound/machines/ArtifactFea1.ogg", "sound/machines/ArtifactFea2.ogg", "sound/machines/ArtifactFea3.ogg",
"sound/misc/flockmind/flockmind_cast.ogg", "sound/misc/flockmind/flockmind_caw.ogg",
"sound/misc/flockmind/flockdrone_beep1.ogg", "sound/misc/flockmind/flockdrone_beep2.ogg", "sound/misc/flockmind/flockdrone_beep3.ogg", "sound/misc/flockmind/flockdrone_beep4.ogg",
"sound/misc/flockmind/flockdrone_grump1.ogg", "sound/misc/flockmind/flockdrone_grump2.ogg", "sound/misc/flockmind/flockdrone_grump3.ogg",
"sound/effects/radio_sweep1.ogg", "sound/effects/radio_sweep2.ogg", "sound/effects/radio_sweep3.ogg", "sound/effects/radio_sweep4.ogg", "sound/effects/radio_sweep5.ogg")
on_add()
active_reagent_holders |= src
on_remove()
active_reagent_holders -= src
proc/process_reactions()
// consume fellow reagents
if (istype(holder))
var/otherReagents = FALSE
for(var/reagent_id in holder.reagent_list)
if(reagent_id != id)
holder.remove_reagent(reagent_id, conversion_rate)
holder.add_reagent(id, conversion_rate)
otherReagents = TRUE
if(!otherReagents)
// we ate them all, time to die
holder.remove_reagent(id, conversion_rate)
// let's put more teeth into this.
// this is the fluid of the assimilating bird robots. clearly it needs to also assimilate other things
on_mob_life(var/mob/M, var/mult = 1)
if (!M)
M = holder.my_atom
if (ishuman(M))
// i'm sorry sir but your blood counts as raw materials
var/mob/living/carbon/human/H = M
var/amt = conversion_rate * mult
if(H.blood_volume >= amt)
H.blood_volume -= amt
H.reagents.add_reagent(id, amt)
if(holder.get_reagent_amount(src.id) > 300)
// oh no
if(prob(1)) // i hate you all, players
H.visible_message("<span class='text-red bold'>[H] is torn apart from the inside as some weird floaty thing rips its way out of their body! Holy fuck!!</span>")
var/mob/living/critter/flock/bit/B = new()
B.loc = get_turf(H)
H.gib()
else
// DO SPOOKY THINGS
if(holder.get_reagent_amount(src.id) < 100)
if(prob(2))
M.playsound_local(get_turf(M), pick(sounds), 20, 1)
if(prob(6))
boutput(M, "<span class='flocksay italics'>[pick_string("flockmind.txt", "flockjuice_low")]</span>")
else
if(prob(20))
M.playsound_local(get_turf(M), pick(sounds), 40, 1)
if(prob(30))
boutput(M, "<span class='flocksay italics'>[pick_string("flockmind.txt", "flockjuice_high")]</span>")
..()
return
reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume_passed)
var/col = rgb(fluid_r, fluid_g, fluid_b)
src = null
if(!volume_passed)
return
if(method == INGEST)
boutput(M, "<span class='text-red'>Tastes oily and unpleasant, with a weird sweet aftertaste. It's like eating children's modelling clay.</span>")
if(method == TOUCH)
boutput(M, "<span class='text-blue'>It feels like you got smudged with oil paints.</span>")
M.color = col
SPAWN_DBG(3 SECONDS)
boutput(M, "<span class='text-red'>Oh god it's not coming off! You're tinted like this forever!</span>")
reaction_turf(var/turf/T, var/volume)
src = null
if (!istype(T, /turf/space))
if (volume >= 50 && (istype(T, /turf/simulated/floor) || istype(T, /turf/simulated/wall)))
T.visible_message("<span class='text-blue'>The substance flows out and sinks into [T], forming new shapes.</span>")
flock_convert_turf(T)
if (volume >= 10)
T.visible_message("<span class='text-blue'>The substance flows out and takes a solid form.</span>")
if(prob(50))
var/atom/movable/B = unpool(/obj/item/raw_material/scrap_metal)
B.set_loc(T)
var/datum/material/mat = getMaterial("gnesis")
B.setMaterial(mat)
else
var/atom/movable/B = unpool(/obj/item/raw_material/shard)
B.set_loc(T)
var/datum/material/mat = getMaterial("gnesisglass")
B.setMaterial(mat)
return
// otherwise we didn't have enough
T.visible_message("<span class='text-blue'>The substance flows out, spread too thinly.</span>")
black_goop
name = "gross black goop"
id = "black_goop"
description = "You're not even sure what this is. It's pretty grody."
reagent_state = LIQUID
fluid_r = 0
fluid_g = 0
fluid_b = 0
transparency = 255
viscosity = 0.6
paper
name = "paper"
id = "paper"
description = "Little flecks of paper, all torn up."
reagent_state = SOLID
fluid_r = 255
fluid_g = 255
fluid_b = 255
transparency = 255
reaction_turf(var/turf/T, var/volume)
var/list/covered = holder.covered_turf()
src = null
if (covered.len > 9)
volume = (volume/covered.len)
if (!istype(T, /turf/space))
if (volume >= 5)
if (!locate(/obj/decal/cleanable/paper) in T)
make_cleanable(/obj/decal/cleanable/paper,T)
rubber
name = "rubber"
id = "rubber"
description = "A somewhat durable material that someone managed to squeeze out of a tree."
fluid_r = 50
fluid_g = 50
fluid_b = 50
transparency = 255
reaction_turf(var/turf/T, var/volume)
src = null
if (!istype(T, /turf/space))
if (volume >= 10)
if (!locate(/obj/item/material_piece/rubber/latex) in T)
new /obj/item/material_piece/rubber/latex(T)
flubber
name = "Liquified space rubber"
id = "flubber"
description = "It seems to be vibrating and bouncing around its container rapidly"
fluid_r = 0
fluid_g = 255
fluid_b = 0
transparency = 127
fliptonium
name = "fliptonium"
id = "fliptonium"
description = "Do some flips!"
reagent_state = LIQUID
fluid_r = 209
fluid_g = 31
fluid_b = 117
transparency = 175
addiction_prob = 1//10
addiction_prob2 = 20
addiction_min = 10
overdose = 15
depletion_rate = 0.2
viscosity = 0.1
var/remove_buff = 0
var/direction = null
var/dir_lock = 0
var/anim_lock = 0
var/speed = 3
pooled()
..()
remove_buff = 0
direction = null
dir_lock = 0
anim_lock = 0
speed = 3
on_mob_life(var/mob/M, var/mult = 1)
if (!M)
M = holder.my_atom
..() //Rearranging to make it deplete as intended
if (!isliving(M))
return
if (!data) data = 1
else data++
switch (data)
if (1)
anim_lock = 0
speed = 3
if (10)
anim_lock = 0
speed = 2.5
if (20)
anim_lock = 0
speed = 2
if (30)
anim_lock = 0
speed = 1.5
if (40)
anim_lock = 0
speed = 1
if (!dir_lock)
direction = pick("L", "R")
dir_lock = 1
if (!anim_lock)
animate_spin(M, direction, speed)
anim_lock = 1
M.make_jittery(2)
M.drowsyness = max(M.drowsyness-6, 0)
if (M.sleeping) M.sleeping = 0
return
reaction_mob(var/mob/M)
var/dir_temp = pick("L", "R")
var/speed_temp = text2num("[rand(1,6)].[rand(0,9)]")
animate_spin(M, dir_temp, speed_temp)
DEBUG_MESSAGE("<span style=\"color:blue\"><b>Spun [M]: [dir_temp], [speed_temp]</b></span>") // <- What's this?
/* reaction_obj(var/obj/O, var/volume)
if (volume >= 10)
var/dir_temp = pick("L", "R")
var/speed_temp = text2num("[rand(1,6)].[rand(0,9)]")
animate_spin(O, dir_temp, speed_temp)
DEBUG_MESSAGE("<span style=\"color:blue\"><b>Spun [O]: [dir_temp], [speed_temp]</b></span>")
*/
on_add()
if (istype(holder) && istype(holder.my_atom) && hascall(holder.my_atom,"add_stam_mod_regen"))
remove_buff = holder.my_atom:add_stam_mod_regen("consumable_good", 2)
if (ismob(holder.my_atom))
var/mob/M = holder.my_atom
M.add_stun_resist_mod("reagent_fliptonium", 9)
return
on_remove()
if (remove_buff)
if (istype(holder) && istype(holder.my_atom) && hascall(holder.my_atom,"remove_stam_mod_regen"))
holder.my_atom:remove_stam_mod_regen("consumable_good")
if (ismob(holder.my_atom))
var/mob/M = holder.my_atom
M.remove_stun_resist_mod("reagent_fliptonium")
if (istype(holder) && istype(holder.my_atom))
animate(holder.my_atom)
do_overdose(var/severity, var/mob/M, var/mult = 1)
var/effect = ..(severity, M)
if (severity == 1)
if (effect <= 2)
M.visible_message("<span style=\"color:red\"><b>[M.name]</b> can't seem to control their legs!</span>")
M.change_misstep_chance(33 * mult)
M.setStatus("weakened", max(M.getStatusDuration("weakened"), 30 * mult))
else if (effect <= 4)
M.visible_message("<span style=\"color:red\"><b>[M.name]'s</b> hands flip out and flail everywhere!</span>")
M.drop_item()
M.hand = !M.hand
M.drop_item()
M.hand = !M.hand
else if (effect <= 7)
M.emote("laugh")
else if (severity == 2)
if (effect <= 2)
M.visible_message("<span style=\"color:red\"><b>[M.name]'s</b> hands flip out and flail everywhere!</span>")
M.drop_item()
M.hand = !M.hand
M.drop_item()
M.hand = !M.hand
else if (effect <= 4)
M.visible_message("<span style=\"color:red\"><b>[M.name]</b> falls to the floor and flails uncontrollably!</span>")
M.make_jittery(5)
M.setStatus("weakened", max(M.getStatusDuration("weakened"), 60 * mult))
else if (effect <= 7)
M.emote("laugh")
fliptonium/glowing_fliptonium
name = "glowing fliptonium"
id = "glowing_fliptonium"
description = "There's something kinda weird about this stuff. Something off. Something... spooky."
reagent_state = LIQUID
fluid_r = 158
fluid_g = 16
fluid_b = 94
transparency = 200
addiction_prob = 1//20
addiction_min = 5
overdose = 11
depletion_rate = 0.1
viscosity = 0.15
on_mob_life(var/mob/M, var/mult = 1)
if (!M)
M = holder.my_atom
..()
if (!isliving(M))
return
if (!data) data = 1
else data++
switch (data)
if (1)
anim_lock = 0
speed = 3
if (5)
anim_lock = 0
speed = 2.5
if (10)
anim_lock = 0
speed = 2
if (15)
anim_lock = 0
speed = 1.5
if (20)
anim_lock = 0
speed = 1
if (25)
anim_lock = 0
speed = 0.9
if (30)
anim_lock = 0
speed = 0.8
if (35)
anim_lock = 0
speed = 0.7
if (40)
anim_lock = 0
speed = 0.6
if (45)
anim_lock = 0
speed = 0.5
if (!dir_lock)
direction = pick("L", "R")
dir_lock = 1
if (!anim_lock)
animate_spin(M, direction, speed)
anim_lock = 1
M.make_jittery(4)
M.drowsyness = max(M.drowsyness-12, 0)
if (M.sleeping) M.sleeping = 0
return
reaction_mob(var/mob/M, var/method = TOUCH)
if (method != TOUCH)
return
var/dir_temp = pick("L", "R")
var/speed_temp = text2num("[rand(0,10)].[rand(0,9)]")
animate_spin(M, dir_temp, speed_temp)
reaction_obj(var/obj/O)
var/dir_temp = pick("L", "R")
var/speed_temp = text2num("[rand(0,10)].[rand(0,9)]")
animate_spin(O, dir_temp, speed_temp)
reaction_turf(var/turf/T) // oh god what am I doing this is such a bad idea
var/dir_temp = pick("L", "R")
var/speed_temp = text2num("[rand(0,10)].[rand(0,9)]")
animate_spin(T, dir_temp, speed_temp)
on_add()
if (istype(holder) && istype(holder.my_atom) && hascall(holder.my_atom,"add_stam_mod_regen"))
remove_buff = holder.my_atom:add_stam_mod_regen("consumable_good", 4)
if (ismob(holder.my_atom))
var/mob/M = holder.my_atom
M.add_stun_resist_mod("reagent_fliptonium", 60)
return
on_remove()
if (remove_buff)
if (istype(holder) && istype(holder.my_atom) && hascall(holder.my_atom,"remove_stam_mod_regen"))
holder.my_atom:remove_stam_mod_regen("consumable_good")
if (ismob(holder.my_atom))
var/mob/M = holder.my_atom
M.remove_stun_resist_mod("reagent_fliptonium")
if (istype(holder) && istype(holder.my_atom))
animate(holder.my_atom)
diluted_fliptonium
name = "diluted fliptonium"
id = "diluted_fliptonium"
description = "You're a rude dude with a rude 'tude."
reagent_state = LIQUID
fluid_r = 245
fluid_g = 12
fluid_b = 74
transparency = 150
addiction_prob = 1//5
addiction_prob2 = 1
addiction_min = 15
overdose = 30
depletion_rate = 0.1
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (prob(10))
var/list/mob/nerds = list()
for (var/mob/living/some_idiot in oviewers(M, 7))
nerds.Add(some_idiot)
if (nerds && nerds.len)
var/mob/some_idiot = pick(nerds)
if (prob(50))
M.visible_message("<span style='color:#605b59'><B>[M]</B> flips off [some_idiot.name]!</span>")
else
M.visible_message("<span style='color:#605b59'><B>[M]</B> gives [some_idiot.name] the double deuce!</span>")
..()
return
transparium
name = "transparium"
id = "transparium"
description = "Fading into obscurity..."
reagent_state = LIQUID
fluid_r = 255
fluid_g = 255
fluid_b = 255
transparency = 30
addiction_prob = 15
addiction_prob2 = 25
addiction_min = 15
overdose = 30
var/effect_length = 0
pooled()
..()
effect_length = 0
on_mob_life(var/mob/living/carbon/human/M, var/mult = 1) // humans only! invisible critters would be awful...
if(!M)
holder.remove_reagent("transparium")
return
if (effect_length < 100) // because 30/0.4 = 75; give them a little more time spent invisible, but don't allow them to try and beat the system too much
effect_length+= 1 * mult
..()
on_mob_life_complete(var/mob/living/carbon/human/M)
if(M)
boutput(M, "<span style=\"color:red\">You feel yourself fading away.</span>")
M.alpha = 0
if(effect_length > 75)
M.take_brain_damage(10) // there!
SPAWN_DBG(effect_length * 10)
if(ishuman(M) && M.alpha != 255)
boutput(M, "<span style=\"color:blue\">You feel yourself returning back to normal. Phew!</span>")
M.alpha = 255
do_overdose(var/severity, var/mob/living/carbon/human/M, var/mult = 1)
var/effect = ..(severity, M)
if (severity == 1)
if(effect <= 4)
M.setStatus("weakened", max(M.getStatusDuration("weakened"), 50 * mult))
else if (effect <= 8)
M.change_misstep_chance(12 * mult)
M.make_dizzy(5 * mult)
else if (effect <= 20)
M.emote("faint")
else if (severity == 2)
if(effect <= 6)
M.setStatus("weakened", max(M.getStatusDuration("weakened"), 50 * mult))
else if (effect <= 12)
M.change_misstep_chance(12 * mult)
M.make_dizzy(5 * mult)
else if (effect <= 24)
M.emote("faint")
diluted_transparium
name = "diluted transparium"
id = "diluted_transparium"
description = "This looks a lot like plain water. Are you sure you didn't mess up?"
fluid_r = 10
fluid_g = 254
fluid_b = 254
transparency = 30
var/effect_length = 0
pooled()
..()
effect_length = 0
on_mob_life(var/mob/M, var/mult = 1) // now this is ok
if(!M) M = holder.my_atom
effect_length += 1 * mult
..()
on_mob_life_complete(var/mob/living/carbon/human/M)
if(M)
boutput(M, "<span style=\"color:red\">You feel yourself fading.</span>")
M.alpha = rand(80,200)
SPAWN_DBG(effect_length * 10)
if(ismob(M) && M.alpha != 255)
boutput(M, "<span style=\"color:blue\">You feel yourself returning back to normal. Phew!</span>")
M.alpha = 255
fartonium // :effort:
name = "fartonium"
id = "fartonium"
description = "Oh god it never ends, IT NEVER STOPS!"
reagent_state = GAS
fluid_r = 247
fluid_g = 122
fluid_b = 32
transparency = 200
addiction_prob = 1
addiction_prob2 = 20
addiction_min = 15
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (prob(66))
M.emote("fart")
if (M.reagents.has_reagent("anti_fart"))
if (prob(25))
boutput(M, "<span style=\"color:red\">[pick("Oh god, something doesn't feel right!", "<B>IT HURTS!</B>", "<B>FUCK!</B>", "Something is seriously wrong!", "<B>THE PAIN!</B>", "You feel like you're gunna die!")]</span>")
random_brute_damage(M, 1 * mult)
if (prob(10))
M.emote("poo")
random_brute_damage(M, 2 * mult)
if (prob(5))
M.emote("scream")
random_brute_damage(M, 4 * mult)
..()
// let us never forget the 3,267 parrot incident, the recipe for this just reacts instantly now
flaptonium
name = "flaptonium"
id = "flaptonium"
fluid_r = 100
fluid_g = 200
fluid_b = 255
transparency = 255
var/static/reaction_count = 0
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
var/turf/T = get_turf(M)
createSomeBirds(T, volume)
reaction_obj(var/obj/O, var/volume)
var/turf/T = get_turf(O)
createSomeBirds(T, volume)
reaction_turf(var/turf/T, var/volume)
createSomeBirds(T, volume)
proc/createSomeBirds(var/turf/T as turf, var/volume)
fucking_critter_bullshit_fuckcrap_limiter(reaction_count)
if (!T)
return
if (volume < 5)
return
if (!locate(/obj/critter) in T && prob(20))
if (prob(1) && !already_a_dominic)
new /obj/critter/parrot/eclectus/dominic(T)
else
new /obj/critter/parrot/random(T)
diluted_flaptonium
name = "diluted flaptonium"
id = "diluted_flaptonium"
description = "You're not a bird, cut that out."
reagent_state = LIQUID
fluid_r = 175
fluid_g = 175
fluid_b = 255
transparency = 150
addiction_prob = 1//5
addiction_prob2 = 1
addiction_min = 15
depletion_rate = 0.1
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (prob(10))
if (prob(50))
M.visible_message("<span style='color:#605b59'><B>[M]</B> flaps [his_or_her(M)] arms!</span>")
else
M.visible_message("<span style='color:#605b59'><B>[M]</B> flaps [his_or_her(M)] arms ANGRILY!</span>")
if (ishuman(M))
var/mob/living/carbon/human/H = M
if (H.sound_list_flap && H.sound_list_flap.len)
playsound(get_turf(H), pick(H.sound_list_flap), 80, 0, 0, H.get_age_pitch())
..()
return
glitter
name = "glitter"
id = "glitter"
description = "Fabulous!"
reagent_state = SOLID
fluid_r = 230
fluid_g = 230
fluid_b = 240
transparency = 245
depletion_rate = 0.1
penetrates_skin = 1
on_add()
var/atom/A = holder.my_atom
if (ismob(A))
if (!particleMaster.CheckSystemExists(/datum/particleSystem/glitter, A))
particleMaster.SpawnSystem(new /datum/particleSystem/glitter(A))
if (isobj(A))
if (!particleMaster.CheckSystemExists(/datum/particleSystem/glitter, A))
particleMaster.SpawnSystem(new /datum/particleSystem/glitter(A))
reaction_turf(var/turf/T, var/volume)
var/list/covered = holder.covered_turf()
src = null
if (covered.len > 9)
volume = (volume/covered.len)
if (!istype(T, /turf/space))
if (volume >= 5)
if (!locate(/obj/decal/cleanable/glitter) in T)
make_cleanable(/obj/decal/cleanable/glitter,T)
on_remove()
if (!holder) return
var/atom/A = holder.my_atom
if (ismob(A))
if (particleMaster.CheckSystemExists(/datum/particleSystem/glitter, A))
particleMaster.RemoveSystem(/datum/particleSystem/glitter, A)
if (isobj(A))
if (particleMaster.CheckSystemExists(/datum/particleSystem/glitter, A))
particleMaster.RemoveSystem(/datum/particleSystem/glitter, A)
/* STOP FUCKING MURDERING THE SERVER YOU SHITASS
reaction_turf(var/turf/T)
if (isturf(T) && !istype(T, /turf/space))
if (!particleMaster.CheckSystemExists(/datum/particleSystem/glitter, T))
particleMaster.SpawnSystem(new /datum/particleSystem/glitter(T))
reaction_obj(var/obj/O)
if (isobj(O))
if (!particleMaster.CheckSystemExists(/datum/particleSystem/glitter, O))
particleMaster.SpawnSystem(new /datum/particleSystem/glitter(O))
*/
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (prob(10))
M.visible_message("<span style=\"color:red\"><b>[M.name]</b> scratches at an itch.</span>")
random_brute_damage(M, 1 * mult)
M.emote("grumble")
if (prob(5))
boutput(M, "<span style=\"color:red\"><b>So itchy!</b></span>")
random_brute_damage(M, 2 * mult)
if (prob(1))
M.reagents.add_reagent("histamine", 1 * mult)
..()
return
glitter_harmless // doesn't do any damage
name = "glitter"
id = "glitter_harmless"
description = "Fabulous!"
reagent_state = SOLID
fluid_r = 230
fluid_g = 230
fluid_b = 240
transparency = 245
depletion_rate = 0.1
penetrates_skin = 1
on_add()
var/atom/A = holder.my_atom
if (ismob(A))
if (!particleMaster.CheckSystemExists(/datum/particleSystem/glitter, A))
particleMaster.SpawnSystem(new /datum/particleSystem/glitter(A))
if (isobj(A))
if (!particleMaster.CheckSystemExists(/datum/particleSystem/glitter, A))
particleMaster.SpawnSystem(new /datum/particleSystem/glitter(A))
reaction_turf(var/turf/T, var/volume)
var/list/covered = holder.covered_turf()
src = null
if (covered.len > 9)
volume = (volume/covered.len)
if (!istype(T, /turf/space))
if (volume >= 5)
if (!locate(/obj/decal/cleanable/glitter/harmless) in T)
make_cleanable(/obj/decal/cleanable/glitter/harmless,T)
on_remove()
var/atom/A = holder.my_atom
if (ismob(A))
if (particleMaster.CheckSystemExists(/datum/particleSystem/glitter, A))
particleMaster.RemoveSystem(/datum/particleSystem/glitter, A)
if (isobj(A))
if (particleMaster.CheckSystemExists(/datum/particleSystem/glitter, A))
particleMaster.RemoveSystem(/datum/particleSystem/glitter, A)
/* NO
reaction_turf(var/turf/T)
if (isturf(T) && !istype(T, /turf/space))
if (!particleMaster.CheckSystemExists(/datum/particleSystem/glitter, T))
particleMaster.SpawnSystem(new /datum/particleSystem/glitter(T))
reaction_obj(var/obj/O)
if (isobj(O))
if (!particleMaster.CheckSystemExists(/datum/particleSystem/glitter, O))
particleMaster.SpawnSystem(new /datum/particleSystem/glitter(O))
*/
green_goop // lets you see ghosts while it's in you. exists only for ectocooler to decay into atm
name = "strange green goop"
id = "green_goop"
fluid_r = 11
fluid_g = 255
fluid_b = 1
description = "A foul substance that seems to quiver oddly near certain spots."
reagent_state = LIQUID
depletion_rate = 0.8
value = 3
viscosity = 0.4
voltagen
name = "voltagen"
id = "voltagen"
description = "Electricity in pure liquid form. However that works."
reagent_state = LIQUID
fluid_r = 0
fluid_g = 128
fluid_b = 255
transparency = 230
overdose = 20
viscosity = 0.3
var/multiplier = 1
var/grenade_handled = 0
pooled()
..()
multiplier = 1
grenade_handled = 0
grenade_effects(var/obj/grenade, var/atom/A)
if (isliving(A))
if (!grenade_handled)
multiplier = 15
grenade_handled = 1
else
multiplier /= 2
arcFlash(grenade, A, 0)
reaction_mob(var/mob/M, var/method = TOUCH)
var/vol = max(1,volume)
if (method == TOUCH)
M.shock(src.holder.my_atom, min(7500 * multiplier, vol * 100 * multiplier), "chest", 1, 1)
reaction_temperature(exposed_temperature, exposed_volume)
. = ..()
if (reacting) return
if (exposed_temperature > T0C + 100)
reacting = 1
var/count = 0
for (var/mob/living/L in oview(5, holder.my_atom))
count++
for (var/mob/living/L in oview(5, holder.my_atom))
arcFlash(holder.my_atom, L, min(75000 * multiplier / count, volume * 1000 * multiplier / count))
holder.del_reagent(id)
on_mob_life(mob/M, var/mult = 1)
if (prob(10))
var/datum/effects/system/spark_spread/s = unpool(/datum/effects/system/spark_spread)
s.set_up(5, 1, get_turf(M))
s.start()
..()
do_overdose(var/severity, var/mob/M, var/mult = 1)
if (prob(10))
if (severity >= 2)
M.shock(M, 100000, "chest", 1, 1)
holder.remove_reagent(id, 20)
else
M.shock(M, 10000, "chest", 1, 1)
holder.remove_reagent(id, 10)
lumen
name = "Lumen"
id = "lumen"
description = "A viscous liquid that seems to glow rather cheerfully. Perhaps applying this to things might brighten up someone's day."
reagent_state = LIQUID
fluid_r = 255
fluid_g = 255
fluid_b = 255
transparency = 230
proc/calculate_glow_color()
if (holder)
return holder.get_average_color()
return new /datum/color(fluid_r, fluid_b, fluid_b, transparency)
reaction_turf(var/turf/T, var/volume)
if (volume < 5)
return
if (locate(/obj/effects/lumen_light) in T)
return
var/datum/color/mycolor = calculate_glow_color()
var/obj/effects/lumen_light/L = new /obj/effects/lumen_light(T)
L.light.enable()
L.light.set_color(mycolor.r / 255, mycolor.g / 255, mycolor.b / 255)
var/lumen_brightness = min(1, volume / 25)
L.light.set_brightness(lumen_brightness)
reaction_obj(var/obj/O, var/volume)
if (volume < 5)
return
if (locate(/obj/effects/lumen_light) in O)
return
var/datum/color/mycolor = calculate_glow_color()
var/obj/effects/lumen_light/L = new /obj/effects/lumen_light(O.loc)
L.light.attach(O)
L.set_loc(O)
L.light.enable()
L.light.set_color(mycolor.r / 255, mycolor.g / 255, mycolor.b / 255)
var/lumen_brightness = min(1, volume / 25)
L.light.set_brightness(lumen_brightness)
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if (method != TOUCH)
return
if (volume < 5)
return
if (locate(/obj/effects/lumen_light) in M)
return
var/datum/color/mycolor = calculate_glow_color()
var/obj/effects/lumen_light/L = new /obj/effects/lumen_light(M.loc)
L.light.attach(M)
L.set_loc(M)
L.light.enable()
L.light.set_color(mycolor.r / 255, mycolor.g / 255, mycolor.b / 255)
var/lumen_brightness = min(1, volume / 25)
L.light.set_brightness(lumen_brightness)
///////////////////////////
/// BOTANY REAGENTS ///////
///////////////////////////
// stuff what's for plants and hydroponics
weedkiller
name = "atrazine"
id = "weedkiller"
description = "A herbicidal compound used for destroying unwanted plants."
reagent_state = LIQUID
fluid_r = 51
fluid_g = 0
fluid_b = 102
transparency = 170
hygiene_value = 0.3
on_mob_life(var/mob/M, var/mult = 1) // cogwerks note. making atrazine toxic
if (!M) M = holder.my_atom
M.take_toxin_damage(2 * mult)
M.updatehealth()
..()
return
on_plant_life(var/obj/machinery/plantpot/P)
var/datum/plant/growing = P.current
if (growing.growthmode == "weed")
P.HYPdamageplant("poison",2)
P.growth -= 3
safrole
name = "safrole"
id = "safrole"
description = "A common food additive with a distinctive 'candy shop' aroma."
fluid_r = 100
fluid_g = 100
fluid_b = 0
transparency = 200
ash
name = "ash"
id = "ash"
description = "Ashes to ashes, dust to dust."
reagent_state = SOLID
fluid_r = 0
fluid_g = 0
fluid_b = 0
on_plant_life(var/obj/machinery/plantpot/P)
if (prob(80))
P.growth++
if (prob(80))
P.health++
potash
name = "potash"
id = "potash"
description = "A white crystalline compound, useful for boosting crop yields."
reagent_state = SOLID
fluid_r = 240
fluid_g = 240
fluid_b = 240
on_plant_life(var/obj/machinery/plantpot/P)
/*if (prob(80))
P.growth+=2
if (prob(80))
P.health+=2
*/
var/datum/plant/growing = P.current
var/datum/plantgenes/DNA = P.plantgenes
if (prob(24))
DNA.cropsize++
if (DNA.harvests > 1 && prob(24))
DNA.harvests--
if (growing.isgrass && prob(66) && P.growth > 2)
P.growth -= 2
if (prob(50))
P.growth++
P.health++
plant_nutrients
name = "saltpetre"
id = "saltpetre"
description = "Potassium nitrate, commonly used for fertilizer, cured meats and fireworks production."
reagent_state = SOLID
fluid_r = 240
fluid_g = 240
fluid_b = 240
on_plant_life(var/obj/machinery/plantpot/P)
if (prob(80))
P.growth+=3
if (prob(80))
P.health+=3
var/datum/plantgenes/DNA = P.plantgenes
if (prob(50)) DNA.potency++
if (DNA.cropsize > 1 && prob(24)) DNA.cropsize--
///////////////////////////
/// BODILY FLUIDS /////////
///////////////////////////
blood
name = "blood"
id = "blood"
description = "A substance found in many living creatures."
reagent_state = LIQUID
fluid_r = 200
fluid_b = 0
fluid_g = 0
transparency = 255
value = 2
var/list/pathogens = list()
var/pathogens_processed = 0
hygiene_value = -2
viscosity = 0.4
pooled()
..()
pathogens.Cut()
pathogens_processed = 0
/* var
blood_DNA = null
blood_type = "O-"*/
reaction_turf(var/turf/T, var/volume)
var/list/covered = holder.covered_turf()
src = null
if (covered.len > 9)
volume = (volume/covered.len)
if (volume > 10)
return 1
if (volume >= 5)
if (!locate(/obj/decal/cleanable/blood) in T)
playsound(T, "sound/impact_sounds/Slimy_Splat_1.ogg", 50, 1)
make_cleanable(/obj/decal/cleanable/blood,T)
reaction_mob(var/mob/M, var/method=TOUCH, var/volume_passed)
src = null
if (!volume_passed) return
if (!ishuman(M)) return
if (method == INGEST)
if (M.mind)
var/mob/living/carbon/human/H = M
if (istype(H.mutantrace, /datum/mutantrace/vamp_zombie))
var/datum/mutantrace/vamp_zombie/V = H.mutantrace
var/bloodget = volume_passed / 4
V.blood_points += bloodget
if (isvampire(M))
var/datum/abilityHolder/vampire/V = M.get_ability_holder(/datum/abilityHolder/vampire)
if (V && istype(V))
// Blood as a reagent doesn't track DNA and blood type yet (or anymore).
/*if (M.bioHolder && (src.blood_DNA == M.bioHolder.Uid))
M.show_text("Injecting your own blood? Who are you kidding?", "red")
return*/
if (prob(33))
boutput(M, "<span style=\"color:red\">Fresh blood would be better...</span>")
var/bloodget = volume_passed / 3
M.change_vampire_blood(bloodget, 1) // vamp_blood
M.change_vampire_blood(bloodget, 0) // vamp_blood_remaining
V.blood_tracking_output()
V.check_for_unlocks()
return 0
return 1
// fluid todo : Hey we should have a reaction_obj that applies blood overlay
on_mob_life(var/mob/M, var/mult = 1)
// Let's assume that blood immediately mixes with the bloodstream of the mob.
if (!pathogens_processed) //Only process pathogens once
pathogens_processed = 1
for (var/uid in src.pathogens)
var/datum/pathogen/P = src.pathogens[uid]
logTheThing("pathology", M, null, "metabolizing [src] containing pathogen [P].")
M.infected(P)
/* this begs the question how bloodbags worked at all if this was a thing
if (holder.has_reagent("dna_mutagen")) //If there's stable mutagen in the mix and it doesn't have data we gotta give it a chance to get some
var/datum/reagent/SM = holder.get_reagent("dna_mutagen")
if (SM.data) holder.del_reagent(src.id)
else
holder.del_reagent(src.id)
return
*/
on_plant_life(var/obj/machinery/plantpot/P)
var/datum/plant/growing = P.current
if (growing.growthmode == "carnivore") P.growth += 3
on_transfer(var/datum/reagents/source, var/datum/reagents/target, var/trans_amt)
var/list/source_pathogens = source.aggregate_pathogens()
var/list/target_pathogens = target.aggregate_pathogens()
var/target_changed = 0
for (var/uid in source_pathogens)
if (!(uid in target_pathogens))
target_pathogens += uid
target_pathogens[uid] = source_pathogens[uid]
target_changed = 1
if (target_changed)
for (var/reagent_id in pathogen_controller.pathogen_affected_reagents)
if (target.has_reagent(reagent_id))
var/datum/reagent/blood/B = target.get_reagent(reagent_id)
if (!istype(B))
continue
B.pathogens = target_pathogens
return
blood/bloodc
id = "bloodc"
value = 3
hygiene_value = -4
reaction_temperature(exposed_temperature, exposed_volume)
if (exposed_temperature > T0C + 50)
if (holder.my_atom)
for (var/mob/O in AIviewers(get_turf(holder.my_atom), null))
boutput(O, "<span style=\"color:red\">The blood tries to climb out of [holder.my_atom] before sizzling away!</span>")
else
var/list/covered = holder.covered_turf()
for(var/turf/t in covered)
for (var/mob/O in AIviewers(t, null))
boutput(O, "<span style=\"color:red\">The blood reacts, attempting to escape the heat before sizzling away!</span>")
holder.del_reagent(id)
return
vomit
name = "vomit"
id = "vomit"
description = "Looks like someone lost their lunch. And then collected it. Yuck."
reagent_state = LIQUID
fluid_r = 255
fluid_b = 80
fluid_g = 255
transparency = 255
hygiene_value = -3
viscosity = 0.4
reaction_turf(var/turf/T, var/volume)
var/list/covered = holder.covered_turf()
src = null
if (covered.len > 9)
volume = (volume/covered.len)
if (volume >= 5)
if (!locate(/obj/decal/cleanable/vomit) in T)
// no mob to vomit, so this gets to stay - cirr
playsound(T, "sound/impact_sounds/Slimy_Splat_1.ogg", 50, 1)
make_cleanable( /obj/decal/cleanable/vomit,T)
gvomit
name = "green vomit"
id = "gvomit"
description = "Whoa, that can't be natural. That's horrible."
reagent_state = LIQUID
fluid_r = 120
fluid_b = 120
fluid_g = 255
transparency = 255
value = 2
hygiene_value = -5
viscosity = 0.4
reaction_turf(var/turf/T, var/volume)
var/list/covered = holder.covered_turf()
src = null
if (covered.len > 9)
volume = (volume/covered.len)
if (volume >= 5)
if (!locate(/obj/decal/cleanable/greenpuke) in T)
playsound(T, "sound/impact_sounds/Slimy_Splat_1.ogg", 50, 1)
make_cleanable( /obj/decal/cleanable/greenpuke,T)
urine
name = "urine"
id = "urine"
description = "Ewww."
reagent_state = LIQUID
fluid_r = 233
fluid_g = 216
fluid_b = 0
transparency = 245
hygiene_value = -3
thirst_value = 0.5
/*on_mob_life(var/mob/M, var/mult = 1) why
for (var/datum/ailment_data/disease/virus in M.ailments)
if (prob(10))
M.resistances += virus.type
M.ailments -= virus
boutput(M, "<span style=\"color:blue\">You feel better</span>")
..()
return*/
reaction_turf(var/turf/T, var/volume)
var/list/covered = holder.covered_turf()
src = null
if (covered.len > 9)
volume = (volume/covered.len)
if (volume > 10)
return 1
if (volume >= 5)
if (!locate(/obj/decal/cleanable/urine) in T)
playsound(T, "sound/impact_sounds/Slimy_Splat_1.ogg", 50, 1)
make_cleanable( /obj/decal/cleanable/urine,T)
triplepiss
name = "triplepiss"
id = "triplepiss"
description = "Ewwwwwwwww."
reagent_state = LIQUID
fluid_r = 133
fluid_g = 116
fluid_b = 0
transparency = 255
hygiene_value = -10
reaction_turf(var/turf/T, var/volume)
var/list/covered = holder.covered_turf()
src = null
if (covered.len > 9)
volume = (volume/covered.len)
if (volume > 10)
return 1
if (volume >= 5)
if (!locate(/obj/decal/cleanable/urine) in T)
playsound(T, "sound/impact_sounds/Slimy_Splat_1.ogg", 50, 1)
make_cleanable( /obj/decal/cleanable/urine,T)
poo
name = "compost"
id = "poo"
description = "Raw fertilizer used for gardening."
reagent_state = SOLID
fluid_r = 100
fluid_g = 55
fluid_b = 0
transparency = 255
hygiene_value = -5
viscosity = 0.5
on_plant_life(var/obj/machinery/plantpot/P)
if (prob(66))
P.health++
big_bang_precursor
name = "stable bose-einstein macro-condensate"
id = "big_bang_precursor"
description = "This is a strange viscous fluid that seems to have the properties of both a liquid and a gas."
reagent_state = LIQUID
fluid_r = 200
fluid_g = 190
fluid_b = 230
transparency = 160
big_bang
name = "quark-gluon plasma"
id = "big_bang"
description = "Its... beautiful!"
reagent_state = LIQUID
fluid_r = 255
fluid_g = 240
fluid_b = 250
transparency = 255
viscosity = 0.7
pierces_outerwear = 1//shoo, biofool
reaction_turf(var/turf/T, var_volume)
src = null
T.ex_act(1)
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
src = null
M.ex_act(1)
reaction_obj(var/obj/O, var/volume)
//if (!istype(O, /obj/effects/foam)
// && !istype(O, /obj/item/reagent_containers)
// && !istype(O, /obj/item/chem_grenade))
O.ex_act(1)
on_mob_life(var/mob/M, var/mult = 1)
..()
M.ex_act(1 * mult)
M.gib()
cyclopentanol
name = "cyclopentanol"
id = "cyclopentanol"
description = "A substance not particularly worth noting."
reagent_state = LIQUID
fluid_r = 10
fluid_g = 254
fluid_b = 254
transparency = 50
glue
name = "glue"
id = "glue"
description = "Hopefully you weren't the kind of kid to eat this stuff."
reagent_state = LIQUID
fluid_r = 250
fluid_g = 250
fluid_b = 250
transparency = 255
viscosity = 0.7
magnesium_chloride
name = "magnesium chloride"
id = "magnesium_chloride"
description = "A white powder that's capable of binding a high amount of ammonia while on room temperature."
reagent_state = SOLID
fluid_r = 255
fluid_g = 255
fluid_b = 255
transparency = 255
mg_nh3_cl
name = "magnesium-ammonium chloride"
id = "mg_nh3_cl"
description = "A white powder binding a high amount of ammonia. The ammonia is released when the mixture is heated above 150 degrees celsius."
reagent_state = SOLID
fluid_r = 255
fluid_g = 255
fluid_b = 255
transparency = 255
reversium
name = "reversium"
id = "reversium"
description = "A chemical element."
reagent_state = LIQUID
fluid_r = 255
fluid_g = 250
fluid_b = 160
transparency = 155
data = null
reaction_obj(var/obj/O)
if (istype(O,/obj/item/clothing/gloves/yellow))
var/obj/item/clothing/gloves/yellow/Y = O
Y.unsulate()
return
reaction_mob(var/mob/M, var/method=TOUCH, var/volume_passed)
src = null
if(!ishuman(M))
return
M.bioHolder.AddEffect("reversed_speech", timeleft = 180)
on_mob_life(var/mob/M, var/mult = 1)
if(!M) M = holder.my_atom
M.bioHolder.AddEffect("reversed_speech", timeleft = 180)
..()
return
butter
name = "butter"
id = "butter"
description = "Closer inspection reveals that it is indeed butter." //its not
reagent_state = LIQUID
fluid_r = 255
fluid_b = 0
fluid_g = 255
viscosity = 0.3
reaction_turf(var/turf/target, var/volume)
src = null
var/turf/simulated/T = target
if (istype(T))
if (T.wet >= 2) return
T.wet = 2
SPAWN_DBG(80 SECONDS)
if (istype(T))
T.wet = 0
T.UpdateOverlays(null, "wet_overlay")
return
on_mob_life(var/mob/M, var/mult = 1)
if(!M) M = holder.my_atom
M.reagents.add_reagent("cholesterol", 1 * mult)
..()
return
yee // 4 wonk
name = "yee"
id = "yee"
description = "yee"
fluid_r = 83
fluid_g = 97
fluid_b = 10
transparency = 225
var/music_given_to = null
disposing()
if (src.music_given_to)
src.music_given_to << sound(null, channel = 391) // make sure we don't leave someone with music playing!!
src.music_given_to = null
..()
pooled()
..()
if (src.music_given_to)
src.music_given_to << sound(null, channel = 391) // seriously, make sure we don't leave someone with music playing!! gotta cover our bases
src.music_given_to = null
reaction_mob(var/mob/M, var/method=TOUCH, var/volume_passed)
if (!isliving(M))
return
src.music_given_to = M
src = null
M << sound('sound/misc/yee_music.ogg', repeat = 1, wait = 0, channel = 391, volume = 50) // play them tunes
if (M.bioHolder)
M.bioHolder.AddEffect("lizard", timeleft = 180)
M.bioHolder.AddEffect("accent_yee", timeleft = 180)
on_remove()
var/atom/A = holder.my_atom
if (src.music_given_to)
src.music_given_to << sound(null, channel = 391) // stop playing them tunes
src.music_given_to = null
if (ismob(A))
var/mob/M = A
M << sound(null, channel = 391) // really stop playing them tunes!!
if (M.bioHolder)
M.bioHolder.RemoveEffect("lizard")
M.bioHolder.RemoveEffect("accent_yee")
on_mob_life(var/mob/M, var/mult = 1)
if (!M)
M = holder.my_atom
if (!src.music_given_to) // only do this one time!!
src.music_given_to = M
M << sound('sound/misc/yee_music.ogg', repeat = 1, wait = 0, channel = 391, volume = 50) // play them tunes
if (M.bioHolder)
M.bioHolder.AddEffect("lizard", timeleft = 180)
M.bioHolder.AddEffect("accent_yee", timeleft = 180)
if (prob(20))
M.visible_message("<span style='color:#605b59'><b>[M]</b> yees.</span>")
playsound(get_turf(M), "sound/misc/yee.ogg", 50, 1)
if (prob(8))
fake_attackEx(M, 'icons/effects/hallucinations.dmi', "bop-bop", "bop-bop")
if (prob(8))
fake_attackEx(M, 'icons/effects/hallucinations.dmi', "yee", "yee")
..()
return
#define CONTENT_MULTIPLIER 5
glucose_polymer
name = "glucose polymer"
id = "glucose_polymer"
description = "A liquid polymer consisting of glucose, commonly used in extended release applications for pharmaceuticals."
fluid_r = 200
fluid_g = 200
fluid_b = 200
transparency = 225
reagent_state = LIQUID
depletion_rate = 1
var/datum/reagents/contents = null
var/hardened = 0
disposing()
..()
contents = null
hardened = 0
reagent_state = LIQUID
update_identifiers()
pooled()
..()
contents = null
hardened = 0
reagent_state = LIQUID
update_identifiers()
on_add()
..()
if(hardened)
update_content_max_volume()
on_remove()
..()
if(hardened)
update_content_max_volume()
on_copy(var/datum/reagent/new_reagent)
..()
var/datum/reagent/glucose_polymer/GP = new_reagent
if(!istype(GP)) return
GP.hardened = src.hardened
if(hardened)
GP.create_contents()
GP.update_content_max_volume()
src.contents.copy_to(GP.contents)
on_mob_life(var/mob/M, var/mult = 1)
//TODO: transfer reagents out of the contents and into the mob
if(hardened && contents && volume > 0)
var/amount_to_transfer = contents.total_volume / (src.volume / (src.depletion_rate * mult))
contents.trans_to(holder.my_atom, amount_to_transfer)
if(contents.total_volume <= 0)
contents = null
..()
reaction_temperature(exposed_temperature, exposed_volume)
..()
//TODO: if cold temperature, take up all the reagents in the holder into contents, calculate distribution amount based on volume
if( exposed_temperature < (T0C - 50) && !hardened)
// -50C, solidify polymer
take_up_reagents()
else if ( exposed_temperature > (T0C + 50) && hardened)
// +50C, dissolve hardened polymer
release_all_reagents()
on_transfer(var/datum/reagents/source, var/datum/reagents/target, var/trans_amt)
..()
var/datum/reagent/glucose_polymer/receiver = target.get_reagent(src.id)
//Already hardened polymer will harden the receiver - not the other way around (since it will only add extra volume of the reagent)
receiver.hardened = src.hardened || receiver.hardened
if(hardened)
//No contents - we have created a new reagent, so it should have a new holder
if(!receiver.contents)
receiver.create_contents()
DEBUG_MESSAGE("Transferring hardened polymer into [receiver.holder.my_atom]. volume: [src.volume], trans_amt: [trans_amt]")
receiver.update_content_max_volume()
distribute_reagents(receiver, src.volume - trans_amt, trans_amt)
update_content_max_volume(src.volume - trans_amt)
receiver.update_identifiers()
proc/distribute_reagents(var/datum/reagent/glucose_polymer/other, var/my_volume, var/other_volume)
//Ensures both glucose polymer instances have appropriate volumes
if(!istype(other) || other_volume == 0 || !src.hardened || !other.hardened) return
var/total = my_volume + other_volume
var/other_multiplier = other_volume / total
DEBUG_MESSAGE("Doing distribute_reagents, other: [other], my_volume: [my_volume], other_volume: [other_volume], other_multiplier: [other_multiplier]")
src.contents.copy_to(other.contents, other_multiplier)
src.contents.remove_any(src.contents.total_volume * other_multiplier)
DEBUG_MESSAGE("After distribution: Deliver volume: [src.contents.total_volume] receiver volume: [other.contents.total_volume]")
proc/create_contents()
if(!contents)
contents = new /datum/reagents(src.volume * CONTENT_MULTIPLIER)
contents.my_atom = src.holder.my_atom
proc/update_content_max_volume(var/volume_override = -1)
if(src.contents)
var/volume_to_use = volume_override > 0 ? volume_override : src.volume
var/new_volume = volume_to_use * CONTENT_MULTIPLIER
if(new_volume < contents.total_volume)
contents.remove_any(contents.total_volume - new_volume)
contents.update_total()
contents.maximum_volume = new_volume
proc/take_up_reagents()
//Take in all reagents in the container
if (hardened || (holder.total_volume - src.volume) == 0)
//Cannot take up any further reagents when hardened or there are no other reagents in the holder
return
create_contents()
//Transfer all other reagents in the holder into our contents
var/transfer_ratio = contents.maximum_volume / (holder.total_volume - src.volume)
for(var/reagent_id in holder.reagent_list)
if (reagent_id != src.id)
var/datum/reagent/current_reagent = holder.reagent_list[reagent_id]
if (isnull(current_reagent) || current_reagent.volume == 0)
continue
var/transfer_amt = current_reagent.volume*transfer_ratio
contents.add_reagent(reagent_id, transfer_amt, current_reagent.data, holder.total_temperature)
holder.remove_reagent(reagent_id, transfer_amt)
//Do all the holder updates
contents.update_total()
contents.reagents_changed()
holder.update_total()
holder.handle_reactions()
holder.reagents_changed()
//Set our state and descriptions accordingly
hardened = 1
update_identifiers()
proc/release_all_reagents()
if(contents && hardened)
contents.trans_to_direct(src.holder, contents.total_volume)
contents = null
hardened = 0
update_identifiers()
proc/update_identifiers()
if(hardened)
reagent_state = SOLID
transparency = 30
name = "glucose polymer matrix"
description = "A matrix composed of a glucose polymer. Commonly used in medical applications for extended release of medicine."
else
reagent_state = initial(reagent_state)
transparency = initial(transparency)
name = initial(name)
description = initial(description)
#undef CONTENT_MULTIPLIER
king_readsterium
name = "King Readsterium"
id = "badmanjuice"
description = "Essence of a King, and a very bad man, known to attract the attention of a certain Senator."
reagent_state = LIQUID
penetrates_skin = 1
depletion_rate = 2.5
fluid_r = 0
fluid_g = 0
fluid_b = 255
transparency = 255
var/counter = 1
value = 4
pooled()
..()
counter = 1
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
if (!counter) counter = 1
if (M.deathhunted)
return
switch(counter += (1 * mult))
if (1 to 4)
return ..()
if (5 to INFINITY)
counter = 1
M.deathhunted = 1
var/startx = 1
var/starty = 1
var/mob/badmantarget = M
boutput(badmantarget, "<span style=\"color:blue\"> <B> You feel a sense of dread and patriotism wash over you. </B>")
badmantarget << sound('sound/misc/american_patriot.ogg', volume = 50)
sleep(100)
startx = badmantarget.x - rand(-11, 11)
starty = badmantarget.y - rand(-11, 11)
var/turf/pickedstart = locate(startx, starty, badmantarget.z)
new /obj/badman(pickedstart, badmantarget)
..()
bubsium
name = "Bubsium"
id = "bubs"
description = "The liquified and concentrated essence of the mysterious character Bubs."
reagent_state = LIQUID
penetrates_skin = 1
depletion_rate = 2.5
fluid_r = 255
fluid_g = 215
fluid_b = 0
transparency = 255
value = 4
on_add()
if(!holder)
return
holder.my_atom.Scale(3,1.5)
on_mob_life(var/mob/M, var/mult = 1)
if (!M)
M = holder.my_atom
var/our_amt = holder.get_reagent_amount(src.id)
if(ishuman(M) && prob(3))
M.say("Hm!")
if(M && our_amt > 20)
if(M.bioHolder && !M.bioHolder.HasEffect("fat"))
M.bioHolder.AddEffect("fat")
for (var/obj/V in orange(CLAMP(our_amt / 5, 2,10),M))
if (V.anchored)
continue
step_towards(V,M)
for (var/mob/living/N in orange(CLAMP(our_amt / 5, 2,10),M))
step_towards(N,M)
if(ishuman(N) && prob(1))
N.say("[M.name] is an ocean of muscle.")
..()
on_mob_life_complete(var/mob/M)
M.Scale(1/3,1/1.5)
..()
toxic_fart
name = "toxic fart"
id = "toxic_fart"
description = "A rancid, terrible fart."
reagent_state = GAS
fluid_r = 212
fluid_g = 205
fluid_b = 4
transparency = 255
data = null
blocks_sight_gas = 1
reaction_mob(var/mob/M, var/method=TOUCH, var/volume_passed)
src = null
if(!volume_passed)
return
if (M.bioHolder && M.bioHolder.HasEffect("toxic_farts"))
return
if (M && M.reagents)
if (prob(25))
boutput(M, "<span style=\"color:red\">Oh god! The <i>smell</i>!!!</span>")
M.reagents.add_reagent("jenkem",0.1 * volume_passed)
//on_mob_life(var/mob/M, var/mult = 1)
// if(!M) M = holder.my_atom
// ..()
miasma
name = "miasma"
id = "miasma"
description = "Gross miasma produced by corpse decay."
reagent_state = GAS
fluid_r = 160
fluid_b = 160
fluid_g = 25
transparency = 95
on_mob_life(var/mob/M, var/mult = 1)
if (!M) M = holder.my_atom
M.take_toxin_damage(0.23 * mult)
M.updatehealth()
..()
return
on_plant_life(var/obj/machinery/plantpot/P)
P.HYPdamageplant("poison",1)
/obj/badman/ //I really don't know a good spot to put this guy so im putting him here, fuck you.
name = "Senator Death Badman"
desc = "Finally, a politician I can trust."
icon = 'icons/misc/hydrogimmick.dmi'
icon_state = "badman"
layer = EFFECTS_LAYER_2
density = 1
anchored = 0
var/mob/deathtarget = null
var/deathspeed = 3
New(pickedstart, var/mob/badmantarget)
deathtarget = badmantarget
SPAWN_DBG(0) process()
..()
Bump(M as turf|obj|mob)
M:density = 0
SPAWN_DBG(4 DECI SECONDS)
M:density = 1 //Apparently this is a horrible stinky line of code by don't blame me, this is all the gibshark codes fault.
sleep(1)
var/turf/T = get_turf(M)
src.x = T.x
src.y = T.y
proc/process()
while (!disposed)
if (get_dist(src, src.deathtarget) <= 1)
for(var/mob/O in AIviewers(src, null))
O.show_message("<span style=\"color:red\"><B>[src]</B> flips up, over and behind [deathtarget] and punches them in the groin before rolling under the floortiles!</span>", 1)
playsound(src.loc, 'sound/impact_sounds/Flesh_Break_1.ogg', 50,1,-1)
animate_spin(src, prob(50) ? "L" : "R", 1, 0)
sleep(10)
playsound(src.loc, 'sound/impact_sounds/Generic_Punch_4.ogg', 50, 1, -1)
deathtarget.emote("scream")
deathtarget.setStatus("stunned", max(deathtarget.getStatusDuration("stunned"), 50))
deathtarget.setStatus("weakened", max(deathtarget.getStatusDuration("weakened"), 50))
var/deathturf = get_turf(src)
animate_slide(deathturf, 0, -24, 25)
sleep(20)
animate_slide(deathturf, 0, 0, 15)
qdel(src)
deathtarget.deathhunted = 0
return
else
walk_towards(src, src.deathtarget, deathspeed)
sleep(1)