diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index 94c0a7999f..4cc39d4e67 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -210,25 +210,8 @@
//=================
if(isturf(loc))
- if(prob(25))
- var/list/nearby = trange(5, src) - loc
- if(nearby.len)
- var/target_atom = pick(nearby)
- walk_to(src, target_atom, 5)
- if(prob(25))
- src.visible_message("\The [src] skitters[pick(" away"," around","")].")
- else if(prob(5))
- //vent crawl!
- for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
- if(!v.welded)
- entry_vent = v
- walk_to(src, entry_vent, 5)
- break
+ skitter()
- if(amount_grown >= 100)
- var/spawn_type = pick(grow_as)
- new spawn_type(src.loc, src)
- qdel(src)
else if(isorgan(loc))
if(!amount_grown) amount_grown = 1
var/obj/item/organ/external/O = loc
@@ -249,6 +232,27 @@
if(amount_grown)
amount_grown += rand(0,2)
+/obj/effect/spider/spiderling/proc/skitter()
+ if(isturf(loc))
+ if(prob(25))
+ var/list/nearby = trange(5, src) - loc
+ if(nearby.len)
+ var/target_atom = pick(nearby)
+ walk_to(src, target_atom, 5)
+ if(prob(25))
+ src.visible_message("\The [src] skitters[pick(" away"," around","")].")
+ else if(prob(5))
+ //vent crawl!
+ for(var/obj/machinery/atmospherics/unary/vent_pump/v in view(7,src))
+ if(!v.welded)
+ entry_vent = v
+ walk_to(src, entry_vent, 5)
+ break
+ if(amount_grown >= 100)
+ var/spawn_type = pick(grow_as)
+ new spawn_type(src.loc, src)
+ qdel(src)
+
/obj/effect/decal/cleanable/spiderling_remains
name = "spiderling remains"
desc = "Green squishy mess."
@@ -261,7 +265,7 @@
icon_state = "cocoon1"
health = 60
- New()
+/obj/effect/spider/cocoon/New()
icon_state = pick("cocoon1","cocoon2","cocoon3")
/obj/effect/spider/cocoon/Destroy()
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 0b4700ca6a..897ac43ff4 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -17,6 +17,7 @@
var/breakouttime = 1200 //Deciseconds = 120s = 2 minutes
var/cuff_sound = 'sound/weapons/handcuffs.ogg'
var/cuff_type = "handcuffs"
+ var/use_time = 30
sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/handcuffs.dmi')
/obj/item/weapon/handcuffs/attack(var/mob/living/carbon/C, var/mob/living/user)
@@ -69,7 +70,7 @@
user.visible_message("\The [user] is attempting to put [cuff_type] on \the [H]!")
- if(!do_after(user,30))
+ if(!do_after(user,use_time))
return 0
if(!can_place(target, user)) //victim may have resisted out of the grab in the meantime
@@ -199,6 +200,44 @@ var/last_chew = 0
elastic = 0
cuff_sound = 'sound/weapons/handcuffs.ogg' //This shold work for now.
+/obj/item/weapon/handcuffs/legcuffs/bola
+ name = "bola"
+ desc = "Keeps prey in line."
+ elastic = 1
+ use_time = 0
+ breakouttime = 30
+ cuff_sound = 'sound/weapons/towelwipe.ogg' //Is there anything this sound can't do?
+
+/obj/item/weapon/handcuffs/legcuffs/bola/can_place(var/mob/target, var/mob/user)
+ if(user) //A ranged legcuff, until proper implementation as items it remains a projectile-only thing.
+ return 1
+
+/obj/item/weapon/handcuffs/legcuffs/bola/dropped()
+ visible_message("\The [src] falls apart!")
+ qdel(src)
+
+/obj/item/weapon/handcuffs/legcuffs/bola/place_legcuffs(var/mob/living/carbon/target, var/mob/user)
+ playsound(src.loc, cuff_sound, 30, 1, -2)
+
+ var/mob/living/carbon/human/H = target
+ if(!istype(H))
+ src.dropped()
+ return 0
+
+ if(!H.has_organ_for_slot(slot_legcuffed))
+ H.visible_message("\The [src] slams into [H], but slides off!")
+ src.dropped()
+ return 0
+
+ H.visible_message("\The [H] has been snared by \the [src]!")
+
+ // Apply cuffs.
+ var/obj/item/weapon/handcuffs/legcuffs/lcuffs = src
+ lcuffs.loc = target
+ target.legcuffed = lcuffs
+ target.update_inv_legcuffed()
+ return 1
+
/obj/item/weapon/handcuffs/legcuffs/attack(var/mob/living/carbon/C, var/mob/living/user)
if(!user.IsAdvancedToolUser())
return
@@ -236,7 +275,7 @@ var/last_chew = 0
user.visible_message("\The [user] is attempting to put [cuff_type] on \the [H]!")
- if(!do_after(user,30))
+ if(!do_after(user,use_time))
return 0
if(!can_place(target, user)) //victim may have resisted out of the grab in the meantime
diff --git a/code/modules/mob/living/simple_animal/animals/giant_spider.dm b/code/modules/mob/living/simple_animal/animals/giant_spider.dm
index 1ff5605946..cc655908e9 100644
--- a/code/modules/mob/living/simple_animal/animals/giant_spider.dm
+++ b/code/modules/mob/living/simple_animal/animals/giant_spider.dm
@@ -55,6 +55,10 @@
/mob/living/simple_animal/hostile/giant_spider/proc/remove_eyes()
overlays -= eye_layer
+/*
+Nurse Family
+*/
+
//nursemaids - these create webs and eggs
/mob/living/simple_animal/hostile/giant_spider/nurse
desc = "Furry and beige, it makes you shudder to look at it. This one has brilliant green eyes."
@@ -95,7 +99,105 @@
old_x = -16
old_y = -16
+/mob/living/simple_animal/hostile/giant_spider/webslinger
+ desc = "Furry and green, it makes you shudder to look at it. This one has brilliant green eyes, and a cloak of web."
+ icon_state = "webslinger"
+ icon_living = "webslinger"
+ icon_dead = "webslinger_dead"
+
+ maxHealth = 90
+ health = 90
+
+ projectilesound = 'sound/weapons/thudswoosh.ogg'
+ projectiletype = /obj/item/projectile/bola
+ ranged = 1
+ firing_lines = 1
+ cooperative = 1
+ shoot_range = 5
+
+ melee_damage_lower = 5
+ melee_damage_upper = 10
+ poison_per_bite = 2
+ poison_type = "psilocybin"
+
+ spattack_prob = 15
+ spattack_min_range = 0
+ spattack_max_range = 5
+
+/mob/living/simple_animal/hostile/giant_spider/webslinger/AttackTarget() //One day.
+ var/mob/living/carbon/human/victim = null //Webslinger needs to know if its target is human later.
+ if(ishuman(target_mob))
+ victim = target_mob
+ if(!victim.legcuffed)
+ projectiletype = /obj/item/projectile/bola
+ shoot_range = 7
+ else
+ projectiletype = /obj/item/projectile/webball
+ shoot_range = 5
+ else
+ projectiletype = /obj/item/projectile/webball
+ shoot_range = 5
+ return ..()
+
+/mob/living/simple_animal/hostile/giant_spider/carrier
+ desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes."
+ icon_state = "carrier"
+ icon_living = "carrier"
+ icon_dead = "carrier_dead"
+
+ maxHealth = 100
+ health = 100
+
+ melee_damage_lower = 5
+ melee_damage_upper = 20
+
+ poison_per_bite = 3
+ poison_type = "chloralhydrate"
+
+ var/spiderling_count = 0
+ var/spiderling_type = /obj/effect/spider/spiderling
+ var/swarmling_type = /mob/living/simple_animal/hostile/giant_spider/hunter
+ var/swarmling_faction = "spiders"
+
+/mob/living/simple_animal/hostile/giant_spider/carrier/New()
+ spiderling_count = rand(5,10)
+ adjust_scale(1.2)
+ ..()
+
+/mob/living/simple_animal/hostile/giant_spider/carrier/death()
+ visible_message("\The [src]'s abdomen splits as it rolls over, spiderlings crawling from the wound.")
+ spawn(1)
+ for(var/I = 1 to spiderling_count)
+ if(prob(10) && src)
+ var/mob/living/simple_animal/hostile/giant_spider/swarmling = new swarmling_type(src.loc)
+ var/swarm_health = Floor(swarmling.maxHealth * 0.4)
+ var/swarm_dam_lower = Floor(melee_damage_lower * 0.4)
+ var/swarm_dam_upper = Floor(melee_damage_upper * 0.4)
+ swarmling.name = "spiderling"
+ swarmling.maxHealth = swarm_health
+ swarmling.health = swarm_health
+ swarmling.melee_damage_lower = swarm_dam_lower
+ swarmling.melee_damage_upper = swarm_dam_upper
+ swarmling.faction = swarmling_faction
+ swarmling.adjust_scale(0.75)
+ else if(src)
+ var/obj/effect/spider/spiderling/child = new spiderling_type(src.loc)
+ child.skitter()
+ else
+ break
+ return ..()
+
+/mob/living/simple_animal/hostile/giant_spider/carrier/recursive
+ desc = "Furry, beige, and red, it makes you shudder to look at it. This one has luminous green eyes. You have a distinctly bad feeling about this."
+
+ swarmling_type = /mob/living/simple_animal/hostile/giant_spider/carrier/recursive
+
+/*
+Hunter Family
+*/
+
//hunters have the most poison and move the fastest, so they can find prey
+
/mob/living/simple_animal/hostile/giant_spider/hunter
desc = "Furry and black, it makes you shudder to look at it. This one has sparkling purple eyes."
icon_state = "hunter"
@@ -111,6 +213,150 @@
poison_per_bite = 5
+/mob/living/simple_animal/hostile/giant_spider/lurker
+ desc = "Translucent and white, it makes you shudder to look at it. This one has incandescent red eyes."
+ icon_state = "lurker"
+ icon_living = "lurker"
+ icon_dead = "lurker_dead"
+ alpha = 45
+
+ maxHealth = 100
+ health = 100
+ move_to_delay = 4
+
+ melee_damage_lower = 5
+ melee_damage_upper = 20
+
+
+ poison_chance = 20
+ poison_type = "cryptobiolin"
+ poison_per_bite = 2
+
+/mob/living/simple_animal/hostile/giant_spider/lurker/death()
+ alpha = 255
+ return ..()
+
+/mob/living/simple_animal/hostile/giant_spider/tunneler
+ desc = "Sandy and brown, it makes you shudder to look at it. This one has glittering yellow eyes."
+ icon_state = "tunneler"
+ icon_living = "tunneler"
+ icon_dead = "tunneler_dead"
+
+ maxHealth = 120
+ health = 120
+ move_to_delay = 4
+
+ melee_damage_lower = 10
+ melee_damage_upper = 20
+
+ poison_chance = 15
+ poison_per_bite = 3
+ poison_type = "serotrotium_v"
+
+/mob/living/simple_animal/hostile/giant_spider/tunneler/death()
+ spawn(1)
+ for(var/I = 1 to rand(3,6))
+ if(src)
+ new/obj/item/weapon/ore/glass(src.loc)
+ else
+ break
+ return ..()
+
+/*
+Guard Family
+*/
+
+/mob/living/simple_animal/hostile/giant_spider/pepper
+ desc = "Red and brown, it makes you shudder to look at it. This one has glinting red eyes."
+ icon_state = "pepper"
+ icon_living = "pepper"
+ icon_dead = "pepper_dead"
+
+ maxHealth = 210
+ health = 210
+
+ melee_damage_lower = 5
+ melee_damage_upper = 10
+
+ poison_chance = 20
+ poison_per_bite = 5
+ poison_type = "condensedcapsaicin_v"
+
+/mob/living/simple_animal/hostile/giant_spider/pepper/New()
+ adjust_scale(1.1)
+ ..()
+
+/mob/living/simple_animal/hostile/giant_spider/thermic
+ desc = "Mirage-cloaked and orange, it makes you shudder to look at it. This one has simmering orange eyes."
+ icon_state = "pit"
+ icon_living = "pit"
+ icon_dead = "pit_dead"
+
+ maxHealth = 175
+ health = 175
+
+ melee_damage_lower = 5
+ melee_damage_upper = 15
+
+ poison_chance = 30
+ poison_per_bite = 1
+ poison_type = "thermite_v"
+
+/mob/living/simple_animal/hostile/giant_spider/electric
+ desc = "Spined and yellow, it makes you shudder to look at it. This one has flickering gold eyes."
+ icon_state = "spark"
+ icon_living = "spark"
+ icon_dead = "spark_dead"
+
+ maxHealth = 210
+ health = 210
+ taser_kill = 0 //It -is- the taser.
+
+ melee_damage_lower = 5
+ melee_damage_upper = 10
+
+ ranged = 1
+ projectilesound = 'sound/weapons/taser2.ogg'
+ projectiletype = /obj/item/projectile/beam/stun/weak
+ firing_lines = 1
+ cooperative = 1
+
+ poison_chance = 15
+ poison_per_bite = 3
+ poison_type = "stimm"
+
+/mob/living/simple_animal/hostile/giant_spider/phorogenic
+ desc = "Crystalline and purple, it makes you shudder to look at it. This one has haunting purple eyes."
+ icon_state = "phoron"
+ icon_living = "phoron"
+ icon_dead = "phoron_dead"
+
+ maxHealth = 225
+ health = 225
+ taser_kill = 0 //You will need more than a peashooter to kill the juggernaut.
+
+ melee_damage_lower = 10
+ melee_damage_upper = 20
+
+ poison_chance = 30
+ poison_per_bite = 0.5
+ poison_type = "phoron"
+
+ var/exploded = 0
+
+/mob/living/simple_animal/hostile/giant_spider/phorogenic/New()
+ adjust_scale(1.25)
+ return ..()
+
+/mob/living/simple_animal/hostile/giant_spider/phorogenic/death()
+ visible_message("\The [src]'s body begins to rupture!")
+ spawn(rand(1,5))
+ if(src && !exploded)
+ visible_message("\The [src]'s body detonates!")
+ exploded = 1
+ explosion(src.loc, 1, 2, 4, 6)
+ return ..()
+
/mob/living/simple_animal/hostile/giant_spider/frost
desc = "Icy and blue, it makes you shudder to look at it. This one has brilliant blue eyes."
icon_state = "frost"
@@ -126,6 +372,9 @@
poison_per_bite = 5
poison_type = "cryotoxin"
+/*
+Spider Procs
+*/
/mob/living/simple_animal/hostile/giant_spider/New(var/location, var/atom/parent)
get_light_and_color(parent)
@@ -167,6 +416,16 @@
O.implants += eggs
to_chat(H, "\The [src] injects something into your [O.name]!")
+/mob/living/simple_animal/hostile/giant_spider/webslinger/DoPunch(var/atom/A)
+ . = ..()
+ if(.) // If we succeeded in hitting.
+ if(isliving(A))
+ var/mob/living/L = A
+ var/obj/effect/spider/stickyweb/W = locate() in get_turf(L)
+ if(!W && prob(75))
+ visible_message("\The [src] throws a layer of web at \the [L]!")
+ new /obj/effect/spider/stickyweb(L.loc)
+
/mob/living/simple_animal/hostile/giant_spider/handle_stance()
. = ..()
if(ai_inactive) return
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 049bdcaf78..8c5d2cd11a 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -11,7 +11,7 @@
var/pulse_range = 1
- on_hit(var/atom/target, var/blocked = 0)
+/obj/item/projectile/ion/on_hit(var/atom/target, var/blocked = 0)
empulse(target, pulse_range, pulse_range, pulse_range, pulse_range)
return 1
@@ -26,7 +26,7 @@
sharp = 1
edge = 1
- on_hit(var/atom/target, var/blocked = 0)
+/obj/item/projectile/bullet/gyro/on_hit(var/atom/target, var/blocked = 0)
explosion(target, -1, 0, 2)
return 1
@@ -81,26 +81,26 @@
nodamage = 1
check_armour = "bullet"
- Bump(atom/A as mob|obj|turf|area)
- if(A == firer)
- loc = A.loc
- return
+/obj/item/projectile/meteor/Bump(atom/A as mob|obj|turf|area)
+ if(A == firer)
+ loc = A.loc
+ return
- sleep(-1) //Might not be important enough for a sleep(-1) but the sleep/spawn itself is necessary thanks to explosions and metoerhits
+ sleep(-1) //Might not be important enough for a sleep(-1) but the sleep/spawn itself is necessary thanks to explosions and metoerhits
- if(src)//Do not add to this if() statement, otherwise the meteor won't delete them
- if(A)
+ if(src)//Do not add to this if() statement, otherwise the meteor won't delete them
+ if(A)
- A.ex_act(2)
- playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
+ A.ex_act(2)
+ playsound(src.loc, 'sound/effects/meteorimpact.ogg', 40, 1)
- for(var/mob/M in range(10, src))
- if(!M.stat && !istype(M, /mob/living/silicon/ai))\
- shake_camera(M, 3, 1)
- qdel(src)
- return 1
- else
- return 0
+ for(var/mob/M in range(10, src))
+ if(!M.stat && !istype(M, /mob/living/silicon/ai))\
+ shake_camera(M, 3, 1)
+ qdel(src)
+ return 1
+ else
+ return 0
/obj/item/projectile/energy/floramut
name = "alpha somatoray"
@@ -113,36 +113,36 @@
light_power = 0.5
light_color = "#33CC00"
- on_hit(var/atom/target, var/blocked = 0)
- var/mob/living/M = target
- if(ishuman(target))
- var/mob/living/carbon/human/H = M
- if((H.species.flags & IS_PLANT) && (M.nutrition < 500))
- if(prob(15))
- M.apply_effect((rand(30,80)),IRRADIATE)
- M.Weaken(5)
- for (var/mob/V in viewers(src))
- V.show_message("[M] writhes in pain as \his vacuoles boil.", 3, "You hear the crunching of leaves.", 2)
- if(prob(35))
- // for (var/mob/V in viewers(src)) //Public messages commented out to prevent possible metaish genetics experimentation and stuff. - Cheridan
- // V.show_message("[M] is mutated by the radiation beam.", 3, " You hear the snapping of twigs.", 2)
- if(prob(80))
- randmutb(M)
- domutcheck(M,null)
- else
- randmutg(M)
- domutcheck(M,null)
+/obj/item/projectile/energy/floramut/on_hit(var/atom/target, var/blocked = 0)
+ var/mob/living/M = target
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = M
+ if((H.species.flags & IS_PLANT) && (M.nutrition < 500))
+ if(prob(15))
+ M.apply_effect((rand(30,80)),IRRADIATE)
+ M.Weaken(5)
+ for (var/mob/V in viewers(src))
+ V.show_message("[M] writhes in pain as \his vacuoles boil.", 3, "You hear the crunching of leaves.", 2)
+ if(prob(35))
+ // for (var/mob/V in viewers(src)) //Public messages commented out to prevent possible metaish genetics experimentation and stuff. - Cheridan
+ // V.show_message("[M] is mutated by the radiation beam.", 3, " You hear the snapping of twigs.", 2)
+ if(prob(80))
+ randmutb(M)
+ domutcheck(M,null)
else
- M.adjustFireLoss(rand(5,15))
- M.show_message("The radiation beam singes you!")
- // for (var/mob/V in viewers(src))
- // V.show_message("[M] is singed by the radiation beam.", 3, " You hear the crackle of burning leaves.", 2)
- else if(istype(target, /mob/living/carbon/))
- // for (var/mob/V in viewers(src))
- // V.show_message("The radiation beam dissipates harmlessly through [M]", 3)
- M.show_message("The radiation beam dissipates harmlessly through your body.")
- else
- return 1
+ randmutg(M)
+ domutcheck(M,null)
+ else
+ M.adjustFireLoss(rand(5,15))
+ M.show_message("The radiation beam singes you!")
+ // for (var/mob/V in viewers(src))
+ // V.show_message("[M] is singed by the radiation beam.", 3, " You hear the crackle of burning leaves.", 2)
+ else if(istype(target, /mob/living/carbon/))
+ // for (var/mob/V in viewers(src))
+ // V.show_message("The radiation beam dissipates harmlessly through [M]", 3)
+ M.show_message("The radiation beam dissipates harmlessly through your body.")
+ else
+ return 1
/obj/item/projectile/energy/floramut/gene
name = "gamma somatoray"
@@ -164,25 +164,25 @@
light_power = 0.5
light_color = "#FFFFFF"
- on_hit(var/atom/target, var/blocked = 0)
- var/mob/M = target
- if(ishuman(target)) //These rays make plantmen fat.
- var/mob/living/carbon/human/H = M
- if((H.species.flags & IS_PLANT) && (M.nutrition < 500))
- M.nutrition += 30
- else if (istype(target, /mob/living/carbon/))
- M.show_message("The radiation beam dissipates harmlessly through your body.")
- else
- return 1
+/obj/item/projectile/energy/florayield/on_hit(var/atom/target, var/blocked = 0)
+ var/mob/M = target
+ if(ishuman(target)) //These rays make plantmen fat.
+ var/mob/living/carbon/human/H = M
+ if((H.species.flags & IS_PLANT) && (M.nutrition < 500))
+ M.nutrition += 30
+ else if (istype(target, /mob/living/carbon/))
+ M.show_message("The radiation beam dissipates harmlessly through your body.")
+ else
+ return 1
/obj/item/projectile/beam/mindflayer
name = "flayer ray"
- on_hit(var/atom/target, var/blocked = 0)
- if(ishuman(target))
- var/mob/living/carbon/human/M = target
- M.Confuse(rand(5,8))
+/obj/item/projectile/beam/mindflayer/on_hit(var/atom/target, var/blocked = 0)
+ if(ishuman(target))
+ var/mob/living/carbon/human/M = target
+ M.Confuse(rand(5,8))
/obj/item/projectile/chameleon
name = "bullet"
@@ -192,3 +192,36 @@
nodamage = 1
damage_type = HALLOSS
muzzle_type = /obj/effect/projectile/bullet/muzzle
+
+/obj/item/projectile/bola
+ name = "bola"
+ icon_state = "bola"
+ damage = 5
+ embed_chance = 0 //Nada.
+ damage_type = HALLOSS
+ muzzle_type = null
+
+/obj/item/projectile/bola/on_hit(var/atom/target, var/blocked = 0)
+ if(ishuman(target))
+ var/mob/living/carbon/human/M = target
+ var/obj/item/weapon/handcuffs/legcuffs/bola/B = new(src.loc)
+ if(!B.place_legcuffs(M,firer))
+ if(B)
+ qdel(B)
+ ..()
+
+/obj/item/projectile/webball
+ name = "ball of web"
+ icon_state = "bola"
+ damage = 10
+ embed_chance = 0 //Nada.
+ damage_type = BRUTE
+ muzzle_type = null
+
+/obj/item/projectile/webball/on_hit(var/atom/target, var/blocked = 0)
+ if(isturf(target.loc))
+ var/obj/effect/spider/stickyweb/W = locate() in get_turf(target)
+ if(!W && prob(75))
+ visible_message("\The [src] splatters a layer of web on \the [target]!")
+ new /obj/effect/spider/stickyweb(target.loc)
+ ..()
diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
index c71a7de362..d61ace5b17 100644
--- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm
@@ -298,6 +298,49 @@
power = 10
meltdose = 4
+/datum/reagent/thermite/venom
+ name = "Pyrotoxin"
+ id = "thermite_v"
+ description = "A biologically produced compound capable of melting steel or other metals, similarly to thermite."
+ taste_description = "sweet chalk"
+ reagent_state = SOLID
+ color = "#673910"
+ touch_met = 50
+
+/datum/reagent/thermite/venom/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ M.adjustFireLoss(3 * removed)
+ if(M.fire_stacks <= 1.5)
+ M.adjust_fire_stacks(0.15)
+ if(alien == IS_DIONA)
+ return
+ if(prob(10))
+ to_chat(M,"Your veins feel like they're on fire!")
+ M.adjust_fire_stacks(0.1)
+ else if(prob(5))
+ M.IgniteMob()
+ to_chat(M,"Some of your veins rupture, the exposed blood igniting!")
+
+/datum/reagent/condensedcapsaicin/venom
+ name = "Irritant toxin"
+ id = "condensedcapsaicin_v"
+ description = "A biological agent that acts similarly to pepperspray. This compound seems to be particularly cruel, however, capable of permeating the barriers of blood vessels."
+ taste_description = "fire"
+ color = "#B31008"
+
+/datum/reagent/condensedcapsaicin/venom/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ if(alien == IS_DIONA)
+ return
+ if(prob(50))
+ M.adjustToxLoss(0.5 * removed)
+ if(prob(50))
+ M.apply_effect(4, AGONY, 0)
+ if(prob(20))
+ to_chat(M,"You feel like your insides are burning!")
+ else if(prob(20))
+ M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!","rubs at their eyes!")]")
+ else
+ M.eye_blurry = max(M.eye_blurry, 10)
+
/datum/reagent/lexorin
name = "Lexorin"
id = "lexorin"
@@ -542,6 +585,21 @@
M.emote(pick("twitch", "drool", "moan", "gasp"))
return
+/datum/reagent/serotrotium/venom
+ name = "Serotropic venom"
+ id = "serotrotium_v"
+ description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans. This appears to be a biologically produced form, resulting in a specifically toxic nature."
+ taste_description = "chalky bitterness"
+
+/datum/reagent/serotrotium/venom/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
+ if(alien == IS_DIONA)
+ return
+ if(prob(30))
+ if(prob(25))
+ M.emote(pick("shiver", "blink_r"))
+ M.adjustBrainLoss(0.2 * removed)
+ return ..()
+
/datum/reagent/cryptobiolin
name = "Cryptobiolin"
id = "cryptobiolin"
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 90d6dcd1ea..ac8f946bb6 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ