mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-25 16:45:42 +00:00
## About The Pull Request Adds bloodroaches.  These are cockroaches that have gorged themselves on blood in maintenance. They're very gross!  Splatting one causes an explosion of blood all around the death perimeter, splashing both turfs and mobs with blood. They have a 1% chance of spawning in place of normal roaches. They also spawn in: - Abandoned crates, replacing the 30 roaches with 30 bloodroaches. - As backup anomalous crystal possession targets. - Grimy fridges Added a trait given to things killed by pest spray, used to check on death explosion for bloodroaches. Changed roach spawns in maps to use mob spawners, so I can replace them with bloodroaches 1% of the time. ## Why It's Good For The Game Splatting a random roach in maintenance that explodes into blood sounds hilarious. It also adds janitorial depth by requiring pest spray to carefully eliminate these pests ## Changelog 🆑 add: Added bloodroaches, a rare variant of cockroaches that explode into a shower of blood when squashed. /🆑
91 lines
3.1 KiB
Plaintext
91 lines
3.1 KiB
Plaintext
/// Simple element to be applied to reagents
|
|
/// When those reagents are exposed to mobs with the bug biotype, causes toxins damage
|
|
/// If this delivers the killing blow on a non-humanoid mob, it applies a special status effect that does a funny animation
|
|
/datum/element/bugkiller_reagent
|
|
|
|
/datum/element/bugkiller_reagent/Attach(datum/target)
|
|
. = ..()
|
|
if(!istype(target, /datum/reagent))
|
|
return
|
|
|
|
RegisterSignal(target, COMSIG_REAGENT_EXPOSE_MOB, PROC_REF(on_expose))
|
|
|
|
/datum/element/bugkiller_reagent/Detach(datum/source, ...)
|
|
. = ..()
|
|
UnregisterSignal(source, COMSIG_REAGENT_EXPOSE_MOB)
|
|
|
|
/datum/element/bugkiller_reagent/proc/on_expose(
|
|
datum/reagent/source,
|
|
mob/living/exposed_mob,
|
|
methods = TOUCH,
|
|
reac_volume,
|
|
show_message = TRUE,
|
|
touch_protection = 0,
|
|
)
|
|
SIGNAL_HANDLER
|
|
|
|
if(exposed_mob.stat == DEAD)
|
|
return
|
|
if(!(exposed_mob.mob_biotypes & MOB_BUG))
|
|
return
|
|
|
|
// capping damage so splashing a beaker on a moth is not an instant crit
|
|
var/damage = min(round(0.4 * reac_volume * (1 - touch_protection), 0.1), 12)
|
|
if(damage < 1)
|
|
return
|
|
|
|
if(!(exposed_mob.mob_biotypes & MOB_HUMANOID) && exposed_mob.health <= damage)
|
|
// no-ops if they are already in the process of dying
|
|
exposed_mob.apply_status_effect(/datum/status_effect/bugkiller_death)
|
|
return
|
|
|
|
if(exposed_mob.apply_damage(damage, TOX) && damage >= 6)
|
|
// yes i know it's not burn damage. the burning is on the inside.
|
|
to_chat(exposed_mob, span_danger("You feel a burning sensation."))
|
|
|
|
/// If bugkiller delivers a lethal dosage, applies this effect which does a funny animation THEN kills 'em
|
|
/// Also makes it so simplemobs / basicmobs no longer delete when they die (if they do)
|
|
/datum/status_effect/bugkiller_death
|
|
id = "bugkiller_death"
|
|
alert_type = /atom/movable/screen/alert/status_effect/bugkiller_death
|
|
/// How many times the spasm loops
|
|
var/spasm_loops = 0
|
|
|
|
/datum/status_effect/bugkiller_death/on_creation(mob/living/new_other, duration = 4 SECONDS)
|
|
src.duration = duration
|
|
src.spasm_loops = ROUND_UP(duration / 0.8) // one spasm ~= 0.8 deciseconds (yes deciseconds)
|
|
return ..()
|
|
|
|
/datum/status_effect/bugkiller_death/on_apply()
|
|
if(owner.stat == DEAD)
|
|
return FALSE
|
|
playsound(owner, 'sound/mobs/humanoids/human/scream/malescream_1.ogg', 25, TRUE, extrarange = SILENCED_SOUND_EXTRARANGE, frequency = 5)
|
|
to_chat(owner, span_userdanger("The world begins to go dark..."))
|
|
owner.spasm_animation(spasm_loops)
|
|
owner.adjust_eye_blur(duration)
|
|
return TRUE
|
|
|
|
/datum/status_effect/bugkiller_death/on_remove()
|
|
if(owner.stat == DEAD || QDELETED(owner))
|
|
return
|
|
|
|
ADD_TRAIT(owner, TRAIT_BUGKILLER_DEATH, REF(src))
|
|
|
|
if(isbasicmob(owner))
|
|
var/mob/living/basic/basic_owner = owner
|
|
basic_owner.basic_mob_flags &= ~DEL_ON_DEATH
|
|
basic_owner.basic_mob_flags |= FLIP_ON_DEATH
|
|
|
|
if(isanimal(owner))
|
|
var/mob/living/simple_animal/simple_owner = owner
|
|
simple_owner.del_on_death = FALSE
|
|
simple_owner.flip_on_death = TRUE
|
|
|
|
owner.investigate_log("died to being sprayed with bugkiller.", INVESTIGATE_DEATHS)
|
|
owner.death()
|
|
|
|
/atom/movable/screen/alert/status_effect/bugkiller_death
|
|
name = "Overwhelming Toxicity"
|
|
desc = "Don't go into the light!"
|
|
icon_state = "paralysis"
|