diff --git a/code/game/objects/effects/spawners/gibspawner.dm b/code/game/objects/effects/spawners/gibspawner.dm index 1c291bf6f17..8a76d885b47 100644 --- a/code/game/objects/effects/spawners/gibspawner.dm +++ b/code/game/objects/effects/spawners/gibspawner.dm @@ -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() diff --git a/code/game/objects/items/food/meatslab.dm b/code/game/objects/items/food/meatslab.dm index 561ad192ed5..49637d98984 100644 --- a/code/game/objects/items/food/meatslab.dm +++ b/code/game/objects/items/food/meatslab.dm @@ -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( diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index d4dcd88e603..7e9cfc52181 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -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)) diff --git a/code/modules/food_and_drinks/machinery/gibber.dm b/code/modules/food_and_drinks/machinery/gibber.dm index a5a3e36aae5..d2a1e299cad 100644 --- a/code/modules/food_and_drinks/machinery/gibber.dm +++ b/code/modules/food_and_drinks/machinery/gibber.dm @@ -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 diff --git a/code/modules/mob/living/basic/alien/_alien.dm b/code/modules/mob/living/basic/alien/_alien.dm index 30713a6ffa6..eec5ae92ee2 100644 --- a/code/modules/mob/living/basic/alien/_alien.dm +++ b/code/modules/mob/living/basic/alien/_alien.dm @@ -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 diff --git a/code/modules/mob/living/basic/bots/_bots.dm b/code/modules/mob/living/basic/bots/_bots.dm index 748ff65aeb4..bc3bd7bf08e 100644 --- a/code/modules/mob/living/basic/bots/_bots.dm +++ b/code/modules/mob/living/basic/bots/_bots.dm @@ -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") diff --git a/code/modules/mob/living/basic/space_fauna/robot_customer.dm b/code/modules/mob/living/basic/space_fauna/robot_customer.dm index 98f16e18832..c880be1fdb9 100644 --- a/code/modules/mob/living/basic/space_fauna/robot_customer.dm +++ b/code/modules/mob/living/basic/space_fauna/robot_customer.dm @@ -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()) diff --git a/code/modules/mob/living/basic/vermin/cockroach/cockroach.dm b/code/modules/mob/living/basic/vermin/cockroach/cockroach.dm index 4a8ece69b14..a6bd1cf6d8f 100644 --- a/code/modules/mob/living/basic/vermin/cockroach/cockroach.dm +++ b/code/modules/mob/living/basic/vermin/cockroach/cockroach.dm @@ -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 diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index de171e0be67..df5e9a6e0ee 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -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+\\))?") diff --git a/code/modules/mob/living/carbon/alien/death.dm b/code/modules/mob/living/carbon/alien/death.dm index 8671a66c98a..551961390d9 100644 --- a/code/modules/mob/living/carbon/alien/death.dm +++ b/code/modules/mob/living/carbon/alien/death.dm @@ -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") diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index 56c687df7bb..ea5bf59bba3 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -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]. diff --git a/code/modules/mob/living/carbon/death.dm b/code/modules/mob/living/carbon/death.dm index bb341008773..5cda9b845dd 100644 --- a/code/modules/mob/living/carbon/death.dm +++ b/code/modules/mob/living/carbon/death.dm @@ -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() diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 4c4d14d8907..cd2655f6338 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -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 ..() diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index a339557fa72..c6fe53d84d9 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -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 diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index 2ee4f396b58..ea62dcc2a9c 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -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 ..() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index c89029d2cca..88b6cd48d94 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -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") diff --git a/code/modules/spells/spell_types/shapeshift/_shapeshift.dm b/code/modules/spells/spell_types/shapeshift/_shapeshift.dm index a01faa1002d..205b6f49f80 100644 --- a/code/modules/spells/spell_types/shapeshift/_shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift/_shapeshift.dm @@ -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) diff --git a/code/modules/wiremod/shell/drone.dm b/code/modules/wiremod/shell/drone.dm index d2922274b7d..578af2f4acd 100644 --- a/code/modules/wiremod/shell/drone.dm +++ b/code/modules/wiremod/shell/drone.dm @@ -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." diff --git a/icons/obj/machines/kitchen.dmi b/icons/obj/machines/kitchen.dmi index 8b6b753827b..2cc92972f9e 100644 Binary files a/icons/obj/machines/kitchen.dmi and b/icons/obj/machines/kitchen.dmi differ