Gibs you leave are now based on your biotype/chest bodypart, improves gibber VFX (#91421)

## About The Pull Request

* When gibbing mobs, spawned gib type is now based on mob's biotypes if
they're not a carbon, or their chest (or first) bodypart if they are,
rather than requiring a proc override for every single mob. This means
that a few robotic mobs no longer drop meaty gibs, and that gibbing
androids now produces cyborg gibs instead of a meaty surprise, plus they
should no longer runtime when trying to gib a robot. Gibs also are now
spawned around the gibber and streak outwards instead of magically
teleporting a few tiles away, for some visual flair.
* Fixed meat not overriding blood DNA on blood_walk component which made
xeno and lizard meat leave behind orange trails instead of proper
lime/dark green blood colors (due to them keeping human meat DNA).
* Brightened up the gibber blood overlay I've missed, so it should be
consistent with old blood colors now.
* Also cleaned up the gibspawner code.

## Why It's Good For The Game

Biotype/chest changes should make devs lives easier and gameplay a bit
more consistent, and streaking just makes the process look slightly
better.

## Changelog
🆑
add: Androids and fully augmented humans now drop robotic gibs instead
of meat
add: Improved gibber VFX
fix: Fixed gibber overlays being darker than intended
fix: Fixed xenomorph and lizard meat leaving orange trails behind
code: Improved gibs and gibspawner code
/🆑
This commit is contained in:
SmArtKar
2025-06-07 13:04:28 -06:00
committed by GitHub
parent 8963ecae43
commit eb69c087f1
19 changed files with 108 additions and 124 deletions
@@ -1,33 +1,19 @@
/obj/effect/gibspawner
icon_state = "gibspawner"// For the map editor
var/sparks = 0 //whether sparks spread
var/virusProb = 20 //the chance for viruses to spread on the gibs
var/gib_mob_type //generate a fake mob to transfer DNA from if we weren't passed a mob.
var/sound_to_play = 'sound/effects/blob/blobattack.ogg'
var/sound_vol = 60
var/list/gibtypes = list() //typepaths of the gib decals to spawn
var/list/gibamounts = list() //amount to spawn for each gib decal type we'll spawn.
var/list/gibdirections = list() //of lists of possible directions to spread each gib decal type towards.
var/list/gibtypes = list() // Assoc list of typepaths of the gib decals to spawn to amount to spawn
var/list/gibdirections = list() // Lists of possible directions to spread each gib decal type towards.
var/blood_dna_info // Cached blood_dna_info in case we do not have a source mob
/obj/effect/gibspawner/Initialize(mapload, mob/living/source_mob, list/datum/disease/diseases, blood_dna_info)
. = ..()
if(gibtypes.len != gibamounts.len)
stack_trace("Gib list amount length mismatch!")
return
if(gibamounts.len != gibdirections.len)
stack_trace("Gib list dir length mismatch!")
return
if(sound_to_play && isnum(sound_vol))
playsound(src, sound_to_play, sound_vol, TRUE)
if(sparks)
var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread
s.set_up(2, 1, loc)
s.start()
var/list/dna_to_add //find the dna to pass to the spawned gibs. do note this can be null if the mob doesn't have blood. add_blood_DNA() has built in null handling.
if(blood_dna_info)
dna_to_add = blood_dna_info
@@ -42,39 +28,36 @@
for(var/i in 1 to gibtypes.len)
if(gibamounts[i])
for(var/j in 1 to gibamounts[i])
var/gibType = gibtypes[i]
var/gibType = gibtypes[i]
var/amount = gibtypes[gibType]
for(var/j in 1 to amount)
// These might streak off into space and cause annoying flaky failures with mapping nearstation tests
#ifndef UNIT_TESTS
var/obj/effect/decal/cleanable/blood/gibs/gib = new gibType(loc, diseases, dna_to_add)
var/list/directions = gibdirections[i]
if(isturf(loc))
if(directions.len)
gib.streak(directions, mapload)
var/obj/effect/decal/cleanable/blood/gibs/gib = new gibType(loc, diseases, dna_to_add)
var/list/directions = gibdirections[i]
if(isturf(loc))
if(directions.len)
gib.streak(directions, mapload)
#else
new gibType(loc, diseases, dna_to_add)
new gibType(loc, diseases, dna_to_add)
#endif
return INITIALIZE_HINT_QDEL
/obj/effect/gibspawner/generic
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core)
gibamounts = list(2, 2, 1)
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs = 2, /obj/effect/decal/cleanable/blood/gibs = 2, /obj/effect/decal/cleanable/blood/gibs/core = 1)
sound_vol = 40
/obj/effect/gibspawner/generic/Initialize(mapload, blood_dna_info)
/obj/effect/gibspawner/generic/Initialize(mapload, mob/living/source_mob, list/datum/disease/diseases, blood_dna_info)
if(!gibdirections.len)
gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH),list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
gibdirections = list(list(WEST, NORTHWEST, SOUTHWEST, NORTH), list(EAST, NORTHEAST, SOUTHEAST, SOUTH), list())
return ..()
/obj/effect/gibspawner/generic/animal
gib_mob_type = /mob/living/basic/pet
/obj/effect/gibspawner/human
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up, /obj/effect/decal/cleanable/blood/gibs/down, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/body, /obj/effect/decal/cleanable/blood/gibs/limb, /obj/effect/decal/cleanable/blood/gibs/core)
gibamounts = list(1, 1, 1, 1, 1, 1, 1)
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/up = 1, /obj/effect/decal/cleanable/blood/gibs/down = 1, /obj/effect/decal/cleanable/blood/gibs = 1, /obj/effect/decal/cleanable/blood/gibs = 1, /obj/effect/decal/cleanable/blood/gibs/body = 1, /obj/effect/decal/cleanable/blood/gibs/limb = 1, /obj/effect/decal/cleanable/blood/gibs/core = 1)
gib_mob_type = /mob/living/carbon/human
sound_vol = 50
@@ -89,69 +72,63 @@
GLOB.alldirs,
list(),
)
if(!iscarbon(source_mob) && isnull(blood_dna_info))
return ..(blood_dna_info = list("Human DNA" = random_human_blood_type()))
return ..()
/obj/effect/gibspawner/human/bodypartless //only the gibs that don't look like actual full bodyparts (except torso).
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/core, /obj/effect/decal/cleanable/blood/gibs, /obj/effect/decal/cleanable/blood/gibs/torso)
gibamounts = list(1, 1, 1, 1, 1, 1)
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs = 1, /obj/effect/decal/cleanable/blood/gibs/core = 1, /obj/effect/decal/cleanable/blood/gibs = 1, /obj/effect/decal/cleanable/blood/gibs/core = 1, /obj/effect/decal/cleanable/blood/gibs = 1, /obj/effect/decal/cleanable/blood/gibs/torso = 1)
/obj/effect/gibspawner/human/bodypartless/Initialize(mapload)
/obj/effect/gibspawner/human/bodypartless/Initialize(mapload, mob/living/source_mob, list/datum/disease/diseases, blood_dna_info)
if(!gibdirections.len)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST), list(SOUTH, SOUTHEAST, SOUTHWEST), list(WEST, NORTHWEST, SOUTHWEST), list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
return ..()
/obj/effect/gibspawner/xeno
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/up, /obj/effect/decal/cleanable/blood/gibs/xeno/down, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/body, /obj/effect/decal/cleanable/blood/gibs/xeno/limb, /obj/effect/decal/cleanable/blood/gibs/xeno/core)
gibamounts = list(1, 1, 1, 1, 1, 1, 1)
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/up = 1, /obj/effect/decal/cleanable/blood/gibs/xeno/down = 1, /obj/effect/decal/cleanable/blood/gibs/xeno = 1, /obj/effect/decal/cleanable/blood/gibs/xeno = 1, /obj/effect/decal/cleanable/blood/gibs/xeno/body = 1, /obj/effect/decal/cleanable/blood/gibs/xeno/limb = 1, /obj/effect/decal/cleanable/blood/gibs/xeno/core = 1)
gib_mob_type = /mob/living/carbon/alien
/obj/effect/gibspawner/xeno/Initialize(mapload)
/obj/effect/gibspawner/xeno/Initialize(mapload, mob/living/source_mob, list/datum/disease/diseases, blood_dna_info)
if(!gibdirections.len)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST), list(SOUTH, SOUTHEAST, SOUTHWEST), list(WEST, NORTHWEST, SOUTHWEST), list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs, list())
return ..()
/obj/effect/gibspawner/xeno/bodypartless //only the gibs that don't look like actual full bodyparts (except torso).
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/core, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/core, /obj/effect/decal/cleanable/blood/gibs/xeno, /obj/effect/decal/cleanable/blood/gibs/xeno/torso)
gibamounts = list(1, 1, 1, 1, 1, 1)
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno = 1, /obj/effect/decal/cleanable/blood/gibs/xeno/core = 1, /obj/effect/decal/cleanable/blood/gibs/xeno = 1, /obj/effect/decal/cleanable/blood/gibs/xeno/core = 1, /obj/effect/decal/cleanable/blood/gibs/xeno = 1, /obj/effect/decal/cleanable/blood/gibs/xeno/torso = 1)
/obj/effect/gibspawner/xeno/bodypartless/Initialize(mapload)
/obj/effect/gibspawner/xeno/bodypartless/Initialize(mapload, mob/living/source_mob, list/datum/disease/diseases, blood_dna_info)
if(!gibdirections.len)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST), list(SOUTH, SOUTHEAST, SOUTHWEST), list(WEST, NORTHWEST, SOUTHWEST), list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, list())
return ..()
/obj/effect/gibspawner/larva
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva/body, /obj/effect/decal/cleanable/blood/gibs/xeno/larva/body)
gibamounts = list(1, 1, 1, 1)
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/larva = 1, /obj/effect/decal/cleanable/blood/gibs/xeno/larva = 1, /obj/effect/decal/cleanable/blood/gibs/xeno/larva/body = 1, /obj/effect/decal/cleanable/blood/gibs/xeno/larva/body = 1)
gib_mob_type = /mob/living/carbon/alien/larva
/obj/effect/gibspawner/larva/Initialize(mapload)
/obj/effect/gibspawner/larva/Initialize(mapload, mob/living/source_mob, list/datum/disease/diseases, blood_dna_info)
if(!gibdirections.len)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST), list(SOUTH, SOUTHEAST, SOUTHWEST), list(), GLOB.alldirs)
return ..()
/obj/effect/gibspawner/larva/bodypartless
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva, /obj/effect/decal/cleanable/blood/gibs/xeno/larva)
gibamounts = list(1, 1, 1)
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/xeno/larva = 1, /obj/effect/decal/cleanable/blood/gibs/xeno/larva = 1, /obj/effect/decal/cleanable/blood/gibs/xeno/larva = 1)
/obj/effect/gibspawner/larva/bodypartless/Initialize(mapload)
/obj/effect/gibspawner/larva/bodypartless/Initialize(mapload, mob/living/source_mob, list/datum/disease/diseases, blood_dna_info)
if(!gibdirections.len)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST), list(SOUTH, SOUTHEAST, SOUTHWEST), list())
return ..()
/obj/effect/gibspawner/robot
sparks = 1
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot_debris/up, /obj/effect/decal/cleanable/blood/gibs/robot_debris/down, /obj/effect/decal/cleanable/blood/gibs/robot_debris, /obj/effect/decal/cleanable/blood/gibs/robot_debris, /obj/effect/decal/cleanable/blood/gibs/robot_debris, /obj/effect/decal/cleanable/blood/gibs/robot_debris/limb)
gibamounts = list(1, 1, 1, 1, 1, 1)
gibtypes = list(/obj/effect/decal/cleanable/blood/gibs/robot_debris/up = 1, /obj/effect/decal/cleanable/blood/gibs/robot_debris/down = 1, /obj/effect/decal/cleanable/blood/gibs/robot_debris = 1, /obj/effect/decal/cleanable/blood/gibs/robot_debris = 1, /obj/effect/decal/cleanable/blood/gibs/robot_debris = 1, /obj/effect/decal/cleanable/blood/gibs/robot_debris/limb = 1)
gib_mob_type = /mob/living/silicon
/obj/effect/gibspawner/robot/Initialize(mapload)
/obj/effect/gibspawner/robot/Initialize(mapload, mob/living/source_mob, list/datum/disease/diseases, blood_dna_info)
if(!gibdirections.len)
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST),list(SOUTH, SOUTHEAST, SOUTHWEST),list(WEST, NORTHWEST, SOUTHWEST),list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs)
gibamounts[6] = pick(0, 1, 2)
return ..()
gibdirections = list(list(NORTH, NORTHEAST, NORTHWEST), list(SOUTH, SOUTHEAST, SOUTHWEST), list(WEST, NORTHWEST, SOUTHWEST), list(EAST, NORTHEAST, SOUTHEAST), GLOB.alldirs, GLOB.alldirs)
gibtypes[/obj/effect/decal/cleanable/blood/gibs/robot_debris/limb] = pick(0, 1, 2)
. = ..()
var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
sparks.set_up(2, 1, drop_location())
sparks.start()
+1
View File
@@ -18,6 +18,7 @@
blood_spawn_chance = 45,\
transfer_blood_dna = TRUE,\
max_blood = custom_materials[custom_materials[1]] / SHEET_MATERIAL_AMOUNT,\
blood_dna_info = blood_dna_list,\
)
AddComponent(
@@ -893,7 +893,6 @@
if(!our_turf)
return
for(var/obj/effect/decal/cleanable/blood/blood_around_us in range(our_turf, 2))
// NON-MODULE CHANGE for blood
if(blood_around_us.decal_reagent == /datum/reagent/blood || blood_around_us.reagents?.has_reagent(/datum/reagent/blood))
blood_to_gain += max(blood_around_us.bloodiness * 0.6 * BLOOD_TO_UNITS_MULTIPLIER, 1)
new /obj/effect/temp_visual/cult/turf/floor(get_turf(blood_around_us))
@@ -189,7 +189,7 @@
var/mob/living/carbon/human/gibee = occupant
sourcejob = gibee.job
var/sourcenutriment = mob_occupant.nutrition / 15
var/gibtype = /obj/effect/decal/cleanable/blood/gibs
var/gibtypes = null
var/typeofmeat = /obj/item/food/meat/slab/human
var/typeofskin
@@ -197,6 +197,13 @@
var/obj/item/stack/sheet/animalhide/skin
var/list/datum/disease/diseases = mob_occupant.get_static_viruses()
// We cannot initial() lists on types, so we need to create in nullspace, take the list and then delete our mob's gibspawner
var/spawner_type = mob_occupant.get_gibs_type()
if (spawner_type)
// No need to handle cleanup as it returns INITIALIZE_HINT_QDEL by default
var/obj/effect/gibspawner/spawner = new spawner_type()
gibtypes = spawner.gibtypes
if(ishuman(occupant))
var/mob/living/carbon/human/gibee = occupant
if(prob(40) && (sourcejob in list(JOB_SECURITY_OFFICER,JOB_WARDEN,JOB_HEAD_OF_SECURITY)))
@@ -209,22 +216,22 @@
else if(iscarbon(occupant))
var/mob/living/carbon/carbon_occupant = occupant
typeofmeat = carbon_occupant.type_of_meat
gibtype = carbon_occupant.gib_type
if(isalien(carbon_occupant))
typeofskin = /obj/item/stack/sheet/animalhide/xeno
blood_dna_info = carbon_occupant.get_blood_dna_list()
for (var/i in 1 to meat_produced)
var/obj/item/food/meat/slab/newmeat = new typeofmeat(null, blood_dna_info)
newmeat.name = "[sourcename] [newmeat.name]"
newmeat.set_custom_materials(list(GET_MATERIAL_REF(/datum/material/meat/mob_meat, occupant) = 4 * SHEET_MATERIAL_AMOUNT))
if(!istype(newmeat))
continue
newmeat.subjectname = sourcename
if(sourcejob)
newmeat.subjectjob = sourcejob
if (typeofmeat)
for (var/i in 1 to meat_produced)
var/obj/item/food/meat/slab/newmeat = new typeofmeat(null, blood_dna_info)
newmeat.name = "[sourcename] [newmeat.name]"
newmeat.set_custom_materials(list(GET_MATERIAL_REF(/datum/material/meat/mob_meat, occupant) = 4 * SHEET_MATERIAL_AMOUNT))
if(!istype(newmeat))
continue
newmeat.subjectname = sourcename
if(sourcejob)
newmeat.subjectjob = sourcejob
results += newmeat
results += newmeat
SEND_SIGNAL(occupant, COMSIG_LIVING_GIBBER_ACT, user, src, results)
@@ -247,20 +254,20 @@
mob_occupant.ghostize()
set_occupant(null)
qdel(mob_occupant)
addtimer(CALLBACK(src, PROC_REF(make_meat), skin, results, meat_produced, gibtype, diseases, blood_dna_info), gibtime)
addtimer(CALLBACK(src, PROC_REF(make_meat), skin, results, meat_produced, gibtypes, diseases, blood_dna_info), gibtime)
/obj/machinery/gibber/proc/make_meat(obj/item/stack/sheet/animalhide/skin, list/results, meat_produced, gibtype, list/datum/disease/diseases, blood_dna_info)
/obj/machinery/gibber/proc/make_meat(obj/item/stack/sheet/animalhide/skin, list/results, meat_produced, list/gibtypes, list/datum/disease/diseases, blood_dna_info)
playsound(src.loc, 'sound/effects/splat.ogg', 50, TRUE)
operating = FALSE
if (!dirty && prob(50))
dirty = TRUE
if(blood_dna_info)
add_blood_DNA(blood_dna_info)
var/turf/T = get_turf(src)
var/list/turf/nearby_turfs = RANGE_TURFS(3,T) - T
var/turf/our_turf = get_turf(src)
var/list/turf/nearby_turfs = RANGE_TURFS(3, our_turf) - our_turf
if(skin)
skin.forceMove(loc)
skin.throw_at(pick(nearby_turfs),meat_produced,3)
skin.throw_at(pick(nearby_turfs), meat_produced, 3)
var/iteration = 1
for (var/obj/item/meatslab in results)
@@ -274,17 +281,19 @@
diseases_to_add += disease
if(LAZYLEN(diseases_to_add))
meatslab.AddComponent(/datum/component/infective, diseases_to_add)
if(blood_dna_info)
meatslab.add_blood_DNA(blood_dna_info)
meatslab.forceMove(loc)
meatslab.throw_at(pick(nearby_turfs), iteration, 3)
iteration++
for (var/i in 1 to meat_produced**2) //2 slabs: 4 giblets, 3 slabs: 9, etc.
var/turf/gibturf = pick(nearby_turfs)
if (!gibturf.density && (src in view(gibturf)))
new gibtype(gibturf, diseases, blood_dna_info)
if (length(gibtypes))
for (var/i in 1 to meat_produced**2) //2 slabs: 4 giblets, 3 slabs: 9, etc.
var/gibdir = pick(GLOB.alldirs)
var/turf/gibturf = get_step(src, gibdir)
if (!gibturf.is_blocked_turf(exclude_mobs = TRUE))
var/list/gibtype = pick(gibtypes)
var/obj/effect/decal/cleanable/blood/gibs/gib = new gibtype(gibturf, diseases, blood_dna_info)
gib.streak(gibdir)
pixel_x = base_pixel_x //return to its spot after shaking
operating = FALSE
@@ -85,11 +85,10 @@
visible_message(span_alertalien("[src] lays an egg!"))
new /obj/structure/alien/egg(loc)
/mob/living/basic/alien/spawn_gibs(drop_bitflags=NONE)
if(drop_bitflags & DROP_BODYPARTS)
new /obj/effect/gibspawner/xeno(drop_location(), src)
else
new /obj/effect/gibspawner/xeno/bodypartless(drop_location(), src)
/mob/living/basic/alien/get_bloodtype()
return get_blood_type(BLOOD_TYPE_XENO)
/mob/living/basic/alien/get_gibs_type(drop_bitflags = NONE)
if(drop_bitflags & DROP_BODYPARTS)
return /obj/effect/gibspawner/xeno
return /obj/effect/gibspawner/xeno/bodypartless
@@ -820,9 +820,6 @@ GLOBAL_LIST_INIT(command_strings, list(
/mob/living/basic/bot/proc/emag_effects(user)
return
/mob/living/basic/bot/spawn_gibs(drop_bitflags = NONE)
new /obj/effect/gibspawner/robot(drop_location(), src)
/mob/living/basic/bot/get_hit_area_message(input_area)
// we just get hit, there's no complexity for hitting an arm (if it exists) or anything.
// we also need to return an empty string as otherwise it would falsely say that we get hit in the chest or something strange like that (bots don't have "chests")
@@ -66,10 +66,6 @@
QDEL_NULL(hud_to_show_on_hover)
return ..()
///Robots need robot gibs...!
/mob/living/basic/robot_customer/spawn_gibs()
new /obj/effect/gibspawner/robot(drop_location(), src)
/mob/living/basic/robot_customer/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change)
. = ..()
if(grime_carried && prob(grime_carried * 20) && !throwing && !(movement_type & MOVETYPES_NOT_TOUCHING_GROUND) && has_gravity())
@@ -74,7 +74,7 @@
return FALSE
// Roach goop is the gibs to drop
/mob/living/basic/cockroach/spawn_gibs()
/mob/living/basic/cockroach/get_gibs_type(drop_bitflags = NONE)
return
/// Roach which tries to ineffectually attack you
@@ -19,7 +19,6 @@
var/leaping = FALSE
///The speed this alien should move at.
var/alien_speed = 0
gib_type = /obj/effect/decal/cleanable/blood/gibs/xeno
unique_name = TRUE
var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|princess|queen)( \\(\\d+\\))?")
@@ -1,9 +1,3 @@
/mob/living/carbon/alien/spawn_gibs(drop_bitflags=NONE)
if(drop_bitflags & DROP_BODYPARTS)
new /obj/effect/gibspawner/xeno(drop_location(), src)
else
new /obj/effect/gibspawner/xeno/bodypartless(drop_location(), src)
/mob/living/carbon/alien/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, "gibbed-a")
@@ -63,8 +63,6 @@
var/obj/item/food/meat/slab/type_of_meat = /obj/item/food/meat/slab
var/gib_type = /obj/effect/decal/cleanable/blood/gibs
rotate_on_lying = TRUE
/// Gets filled up in [/datum/species/proc/replace_body].
+22
View File
@@ -30,6 +30,28 @@
visible_message(span_danger("[M] bursts out of [src]!"))
return ..()
/mob/living/carbon/get_gibs_type(drop_bitflags = NONE)
var/obj/item/bodypart/chest = get_bodypart(BODY_ZONE_CHEST) || (length(bodyparts) ? bodyparts[1] : null)
if (!istype(chest)) // what
return ..()
if (chest.bodytype & BODYTYPE_ROBOTIC)
return /obj/effect/gibspawner/robot
if (chest.bodytype & BODYTYPE_LARVA_PLACEHOLDER)
if (drop_bitflags & DROP_BODYPARTS)
return /obj/effect/gibspawner/larva
return /obj/effect/gibspawner/larva/bodypartless
if (chest.bodytype & BODYTYPE_ALIEN)
if (drop_bitflags & DROP_BODYPARTS)
return /obj/effect/gibspawner/xeno
return /obj/effect/gibspawner/xeno/bodypartless
if (drop_bitflags & DROP_BODYPARTS)
return /obj/effect/gibspawner/human
return /obj/effect/gibspawner/human/bodypartless
/mob/living/carbon/spill_organs(drop_bitflags=NONE)
var/atom/Tsec = drop_location()
@@ -2,14 +2,6 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift)
/mob/living/carbon/human/gib_animation()
new /obj/effect/temp_visual/gib_animation(loc, dna.species.gib_anim)
/mob/living/carbon/human/spawn_gibs(drop_bitflags=NONE)
if(flags_1 & HOLOGRAM_1)
return
if(drop_bitflags & DROP_BODYPARTS)
new /obj/effect/gibspawner/human(drop_location(), src, get_static_viruses())
else
new /obj/effect/gibspawner/human/bodypartless(drop_location(), src, get_static_viruses())
/mob/living/carbon/human/spawn_dust(just_ash)
if(just_ash)
return ..()
+11 -2
View File
@@ -43,10 +43,19 @@
* drop_bitflags: (see code/__DEFINES/blood.dm)
* * DROP_BODYPARTS - Gibs will spawn with bodypart limbs present
**/
/mob/living/proc/spawn_gibs(drop_bitflags=NONE)
/mob/living/proc/spawn_gibs(drop_bitflags = NONE)
if(flags_1 & HOLOGRAM_1)
return
new /obj/effect/gibspawner/generic(drop_location(), src, get_static_viruses())
var/gib_type = get_gibs_type(drop_bitflags)
if (gib_type)
new gib_type(drop_location(), src, get_static_viruses())
/// Get type of gibs this mob should spawn based on our flags
/mob/living/proc/get_gibs_type(drop_bitflags = NONE)
if (mob_biotypes & MOB_ROBOTIC)
return /obj/effect/gibspawner/robot
return /obj/effect/gibspawner/generic
/**
* Drops a mob's organs on the floor
-3
View File
@@ -1,6 +1,3 @@
/mob/living/silicon/spawn_gibs()
new /obj/effect/gibspawner/robot(drop_location(), src)
/mob/living/silicon/spawn_dust(just_ash)
if(just_ash)
return ..()
@@ -1207,9 +1207,6 @@ Pass a positive integer as an argument to override a bot's default speed.
/mob/living/simple_animal/bot/rust_heretic_act()
adjustBruteLoss(400)
/mob/living/simple_animal/bot/spawn_gibs(drop_bitflags = NONE)
new /obj/effect/gibspawner/robot(drop_location(), src)
/mob/living/simple_animal/bot/get_hit_area_message(input_area)
// we just get hit, there's no complexity for hitting an arm (if it exists) or anything.
// we also need to return an empty string as otherwise it would falsely say that we get hit in the chest or something strange like that (bots don't have "chests")
@@ -121,7 +121,7 @@
our_pipeline = pipenets
to_chat(cast_on, span_userdanger("Casting [src] inside of [pipe_you_die_in] quickly turns you into a bloody mush!"))
var/obj/effect/gib_type = isalien(cast_on) ? /obj/effect/gibspawner/xeno : /obj/effect/gibspawner/generic
var/obj/effect/gib_type = cast_on.get_gibs_type()
for(var/obj/machinery/atmospherics/components/unary/possible_vent in range(10, get_turf(cast_on)))
if(length(possible_vent.parents) && possible_vent.parents[1] == our_pipeline)
+1 -3
View File
@@ -9,6 +9,7 @@
icon_state = "setup_medium_med"
maxHealth = 300
health = 300
mob_biotypes = MOB_ROBOTIC
living_flags = NONE
light_system = OVERLAY_LIGHT_DIRECTIONAL
light_on = FALSE
@@ -44,9 +45,6 @@
heal_overall_damage(50, 50)
return TRUE
/mob/living/circuit_drone/spawn_gibs()
new /obj/effect/gibspawner/robot(drop_location(), src, get_static_viruses())
/obj/item/circuit_component/bot_circuit
display_name = "Drone"
desc = "Used to send movement output signals to the drone shell."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

After

Width:  |  Height:  |  Size: 19 KiB