From eb69c087f1e77da1357d7305a93acebdfdac723e Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Sat, 7 Jun 2025 21:04:28 +0200 Subject: [PATCH] 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 :cl: 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 /:cl: --- .../objects/effects/spawners/gibspawner.dm | 91 +++++++----------- code/game/objects/items/food/meatslab.dm | 1 + code/modules/antagonists/cult/blood_magic.dm | 1 - .../food_and_drinks/machinery/gibber.dm | 55 ++++++----- code/modules/mob/living/basic/alien/_alien.dm | 11 +-- code/modules/mob/living/basic/bots/_bots.dm | 3 - .../basic/space_fauna/robot_customer.dm | 4 - .../basic/vermin/cockroach/cockroach.dm | 2 +- code/modules/mob/living/carbon/alien/alien.dm | 1 - code/modules/mob/living/carbon/alien/death.dm | 6 -- .../mob/living/carbon/carbon_defines.dm | 2 - code/modules/mob/living/carbon/death.dm | 22 +++++ code/modules/mob/living/carbon/human/death.dm | 8 -- code/modules/mob/living/death.dm | 13 ++- code/modules/mob/living/silicon/death.dm | 3 - .../mob/living/simple_animal/bot/bot.dm | 3 - .../spell_types/shapeshift/_shapeshift.dm | 2 +- code/modules/wiremod/shell/drone.dm | 4 +- icons/obj/machines/kitchen.dmi | Bin 21263 -> 19094 bytes 19 files changed, 108 insertions(+), 124 deletions(-) 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 8b6b753827b564421e6a051cea0bd96998987588..2cc92972f9e542749e3594aace68e0d2eb8fb880 100644 GIT binary patch literal 19094 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

bs$fw5j_)ZwAhe68KkI>Ui`n?q05; zd^$?_LZY6Mrbf#6@^LXcDl(?M7S{s`Ls7-AP#^IbHPulK4;}>RVaTt$_Daf~WD86d6boC3jRHGD#Gq@Ef443xdzc~WC?=F|Ntl)@SKe;L zJsrD8w~Tttio21aSpA#HHOUA=(4V2oNwHDisVuZr&}72Enr~1s0&4MupBd{#zFCY) zJAu7mQ#vUrKm)7y=)WGzi8g|&#JuF=Mht|)I`X<9SS4@`aZn+R6D;laHK>r#re8U8 zcYh^gcWgt+8WrWz>!$j~m4fr|xtHX5aVIzsfAeg_9;^7kUfy zEi;>f_MXnyG2#=>b9C-_j7;;tBimDi3U~# zOA>+!Gefb$;iVr!fzp@y0Xs2+{=lZf+R;~tMpw{MCkvF77J_8GK73mPQ2M$eq_xAa zA@qH%I%NgGH-3hP`b?~bqik3KnpYm13%LT=iev*hVPPtDw0fKZRjM0sV>YnseB9_^ zYd~zMH;{@U=sAb5#Z49Xqh$Yi3_FsZVP6MfjCT(!&>s2EV@j8Bh?n!+Y-)Ax7}Ger z$A>(49d#NsFs;BB2kC{7Ubza8#!79o@D>11?hJHT3#;O#1*~iuKG})!W3&N-#>26H z@6kRbC;TRfwCEhHRWD!mgOvW-cH)NY^l?H~=S$?cV5h%#_kI*J8}UDLI>5%GWZz&! zCEUO79vzTVPZodNBW>1RwvjCwW9nlAk9?9c!Txhk2fmY8c?!@y*fYHMUs=ppSbLpz zGxFQ{hGLy#>Ak@p>43%9{;=i6ssKgbbuu)lQV-a3`LTMgA!St0tvEijqYWrNtV2xr z90g1!inV&uCXTAH@cR)h6LP}P1P}Na_W{fUhz@W7!f%ZJ`}^XF;4@}Cz{a7u5|TtY z=;(eyg%7R7b%FDhL@kwLiQ9n2eUvCbOD(MO;+z6zlLAVx@jfca0iH#=3K{NVd2<%s z&yyz-S#6E?X<-gMN#S`7|EPA{tkfE0|Fj(Udrn&L=I{5mtG_S;Fg8X2EnI@J;wbF0 zRZ0Gz{%lana1o#x@pF5Di@Jbd1s(1jZm59*MOl|&!uorfKSAk-hLG1@i;MS2yDenU zW}3>q02r4K>;H2*x<|SJWl??XhRZ-O7wGapcua_%F)gN~7)YvObs)w{0m|9NGHvI3 zDr?`jPRvLi5=AjP^}&|3>+h|6T+a6B4i2G<%G){R&5qXJxj77QxnsgEqD~s-4D&Ej zXd{EOXQI`yKIZlD@qV@GXb_^&N8Z}GdB>r=Q?t1)%l6%lG!!ys-C9S{Ab=k3-Fyl- z&+a(GHx$`Tx&l&kd+1uRT@pfoQVdjGW4)ZCJrc2M_Er^QcT~^G3_dLbto|WoRY3dp zdQ}wu`}Zjt5O-kmNgYSZARrcdZy^BJ|6wr))12BcQwn{pp1q&9vJvE#^;$iF10wo~ zq^E^-qkU@x+>bRiQ0JhOQ-3ceo-Gu&3*F9Jk@gK)eUE6VqZl2HjfWT$jd!ZoUOe;` zP8tv;XUd!w5R6(6EeQ|_E%tM3=idJwr*Sl}XSfgA6K(^dXE581eRVJLl#R6Jo&T7A z48Akt_oGKP6m+J@>r!&QNZ+2Q5piG*+yvpB&tXJiVSUtBxEEQ^gyKb%q#9mRZ;>Dv z9T{t7t{7%*FW^9P)J7Hk6|b{q$oae&5#5<#j+#7)AJ4r7F)4d7o3*o7^}VL!pN0o% zmQ&{(NNv0Y^tO?^qg+XDFXmEdhju1YLY{u3%W?fBiTOCmz22^Wc45BvlHP(O_;0Y# z@`_oWfq>`8YXRk95OrJDU2=>^5GB`2&QTGXj)Y`bLIMxZ-9oJ})iIeSa-!M3!c72a z%zcgwmYt|Rt*C5|jHfVa5wt%V zDz}D@S(&<$5lJh}VqLHDluE{=DR83^N3topC%?1P6nrF`-0Vw;?MmPM&TgoyfhHx) z*-k?k`>6LeaFM~A8iIkOejPZLej4J!NxY}k=(FN4HWTo4GL;3<&WX(kITUvuF8#DY zb{+i|ZS6M|(Fq72KOm%70KLJe;<@L(jpdRM3k^6@u*v?9Wl?7s{$+t{xb3lC>I})m2ls1nKSuOQninV107TJtTY9YXP+>>w z#?`A=YYm8P4c8#u2)_!d%V=)cCfR=GVbx)R3bZr~zy|HE3=K5XHQ95^y}RUM&ki#K z7Huu7-K;%p3G-}03&zT>lTG7`dHHuCVb^eA3U6B05h#d?th8l4i#7tLAHMP&9%XWt z-G=xX!H~Xo{H5$c8Y<{#`A8j5I*AOw=CQqWoE`s`-sc2W$tunQH9@Ia=@ zHo)~k&@bwx>bbNmn=<|noHc9>HE{xSmzol3*Td=9V|QQhyUE-Y{La&JtwZA2%DvGs zhl-ZD8;~_qpFk|aErt+Z;IX7ZlD7^%3-i11XTbm~jZ|gF01YJVh5H?c>ruc9UEj4A z^5Uz>$=}%e-9r2fme*}6d5;fLI@WqAKHkCkp4fv>k0%F}F;9wwSLBjmEbgp;h028} zb$&&+!nM<`!=)PeOv$5Q7SPNU3&%Uf0Dpg6U+g-q9DM?AYF62IzC<$(`-(?vUo;4KOi}php>k04f#u;bUu~7jVP`Ni!HBh7~J4 zE#d%Nu7GLUrQSNViY#Fu)rU2n!bAV0CWRfV?tGX z(VQpQa(YxR+ve|7pvEEZ^~H`W4vRo3q3<@V-1IXlZWFS&8o|kARUE;l{@2y{I&y~8GxE_V zCX3Hqyg#3$UkqBS%Nmi_urLLlzPMKim|elq7(qbNh4)e5$3)}PqDrx~_(w|mz6{Xx`(Y2;s4Qqco87n@@J^M=kro-$ z!g!1<6)4b0nnN--Tal`z%m>-`PF`uqRug682faaOx4iIe&wXsc?s^si|l zSO)5Y+J%n}pcR)--eI|Rht*O&{0zNNc%fDGYbIXV?_U7g0hZ_#DXaN=7eGc&>#p=u zK>JLT2B`)Mvynf8E*kZHS{J}e*d|WZcUyS~vthwQ483Uf`eoKz7wSXE0l0DvaLGQO z%v3M#y8^O|{~aT`?c*s~yq2ZBhWhzFvTvt}8c3}vB_~1Bl9H0j`B{}4OR(97+lEz$ zXp{F3=#T;2X{793(fGGn_P`HOv{*s4%6GdlLN#Lb+|jwWq=Yp?k@I?00A+W;(6aRf zQ!u~F|3*k)zCrITXchlo^s`OU%Q@Gj?^P?=b)b9}0Z6NBDjvdi>{g*!E@3Cqdl?L`Jjq9yk*tM~0 zr}27UrwXUu{q#%szUlG;vl+KglB(OoN`{THf`l%CduWhO<6haIpTN%UDrkXeuE3l} zFZ6uKE84ajt@U(z41%X;74 zN0Jnz+fX;}W_g%M0+<$cl)x@?IuB>FAl}C>P-r)tdZd3D6`!!NBq-7;SJTILds0@D zP$;Z{)aa4#<8TV)W!DJ5X|G*1IY_r-@)Y)>a0e8`qbnO`5cS4-Yo~YahiNDp8%PIY zgp!w{8Zk~8_41i7`5o`xKM|Mf+)eQUNYhe{BcEm_C5cu|bhxjkl50sG#O=A?qG8~I zY?wf@iovl1G=RD8#=AIlT#g(hRYZL|?)PL76urm=E~rarO~Aqhh56PwUjG+1LoXYx z>OTdrYaUMNmeE)Le?53<;Tto~kEDc|ja+DFl;HJvl-{Ny5bHTMb1P$$Vgu zDZeP?oWjPrj4D*#B#PZOn4!$E%(Ve}Dgn?Ln&qLrTZ4 zc|O2u?NY3aa2Rh*rzuUTDs(!w!bHa>ANdZdpUq@)>h7}eH5^+R{-CT-#=jyb_xr14 zFa02*-r)5T(^3Pk4s?&Z7u9pf{b51yw_^JO?J`P_C_3^!ud6(*KCZ%QLiz#fuSYVG zSScx4c6_=~^v-eMgx?v5ag=ALV-Tutq-U8;riplt`5V*wYu*wCM%gr7y}gPOye5}M zHiD1#rK%7v&KxHjYF8BKXLcC0$_VRq>hqFh%$%XLL`S7#HHN-JfpeegCp)|W`9bBY-qVHPBD~N*9i;`>iJAc^_ z;>(!T!ZwxtsKge2h2&|H$W_3Lys6DUd?KIJf)6d+7(rK;|F5fKS=ZqNxB7ilJ$+`D zFrW!`Mujf2d7;j;bLT~ha46uxiULm#K22*-Pm4a{h)C*stoq+q3h42U%ITml$lhBx zixdT^TC{ryU=WvfhFdaou)8)yLYOEzmZ5oyn)MddZG{pA0*#avkaw(++wle6=Pw8| ztoihT%}jmqGt96_qc2~GdgUqND;O5ef<`aPB)jh}9dfZXI#eyo0@5}oHvUh*2%5uq zNi-2>qIIG@EYxwdd zq{e$?D8DmFlAm+oe>skOcUVW%!_U$Seg7ZFfu>~5`$D!levy{X( z>97q_fSS-n?j5Jqg=zNensz=ghv6K!C#RNSUGc)bq{L@|e<`-wNnb??x>DYb<^ieFh0EBSJTBQ`cI|Gw^REkPZvRloA0kcckpe`|m2HvtVRqCWgN zphu7n9FJr~<6H@U2@~J8h#%vUCL<+IXhiY4&H6N0;Fd1!f`Y=z>Tm;-IEgvq=~WD) z+RU|KTKGX846h@|@ANL8vQd2Hx70BqZ_bB>G{=0fCBq3YZbLPm29^NKphk#LODY0} zsWQz`_n97X$%|Wb(6`i_o??*IDE(W4Q{O6q4H9BmB8Ia#OlX0 zmZWF93n?o@BMX0S59V9-D$$ZAp-cC+r~9J#04bVXtN=9;B-aGoluc2 z&}pYcW*~CTU6f6oCnADc81{-E4cyfr0mEcqtKatxLLEDXhBZGGF%jlu^PGY(YYR7c zC&^HrF{SL6;L)D%DJ?7qBw<&V3rl#@QzYJEpn_K23oU(rYE;h#_$!yEMK5UoywrXN z`2M9OCbOJJkQs;_1vMlB96^kA2Z8${0sd~IibmG1Ywmy%FLx`6Qo5_q3HEX_fbc_DRrsiOJs$dg zS$f`ocS#y39m@FB^_;l_c7IL zDAxK~m6OBAz~)DW15#xhPwtcS&fTp6nX_~`-7~G%qyd^Qo$#Hn(BZFi>OuX@CHP!; zeF`k=go!!zl2%4RV6%tjVZ!qpLbjB8xu`~MtYQ<<{zu*M$Be61>xs!^6&n-`wQ~QW+g<+5~2zGD^!YF>7Jy0qWS?l5%HeS%tB-BF93voc)W!>LkWJmvF zZ9Kp;tml$Yi&#HLM_OlxT5doQqomX6xA#*1BhbxYtKb369H5eQxz2i?L7f-n*N-*m zGn$M$k+qF%tI=1@CfRL9Bqxzt20rQc?4>#+G)cnrVMGLN&mZOxVNRfq$d1-~+CNQw zaj^I-L*uRShE!g_zfmBjK_&0ToR#Ieh) zXg!Tb-7^>EcbhiP3@^Q7@B4r<-vtDXVfasiz^dFw_gR4XZU_(?>{B%R?bRiq=n0BGtHbuJ-ycQ_zZYgqq5%Tq4L~jl&25qR&=h`j<@IXa zPFJkP*BmMy?Z#6d)Coo{Bm!uOk&c5f$oA-}aM9aSke%v-I#>^^9Prt0pQjOQdh@d9 zl+B5pOP?*%p8lc_MQij4FlN#~vHrZagS~2LRc%|oMc=8++9%aT;&&yVQQ8Esq_M}W zro~nj`n)zF`)vPctN{#v(Vi_@^QATn36%k_y3w>J7XuDJD~LjeJ$Lt+7Vw%t0>zj! z`w}?4MFa~0bUQd9O4BJn_ zp2({73BtgN@*O1aosE6?2&G%YP@9Seu?{95acHhQ4 z9*iZ2Z1e5+JZ2k?Jm;=RGz<*COI|t0@K2cn?ZQSb zT?_qnKYie8cjf0UQx#aO3jal(ibX5dT|eINlxX`z*&>( zAkS`#s?z2md&;=MQn$?A;{I}x51Z>w%fP~N z_7Gt}SjDSl0w^$>eFwlGut@<*xb)`ICTfvzPoZgqN&DRDp2eubYCK=Ch7Nm^Fi^S} z2PlvRSOxb-pj8hBF3JNlMGUAh`-yU;-OIC>o7}LNfAwSPunQoBPAKwae6r^JlRF}= zT`dV?)qGBk_#^ioU=7Wx;MA%R(FDhW47DwhO>C9o0ZsfcC5Sz0 zn2~*dazlaq#sI|&j1?(2EPQ_x3m_zypdN`709o%n_L`eV9E;O$I)X%60^rt3SeL$1 z^u`VK&NBYP{5M?cmF^dn2s`wo(cdc25>}*|wAWuang6y4C z4*dV}Uxr{9^i~q;@qGa-nh`l~4#P+FBGRF!#MR!bIX_u0AHsO|988rTJ2VFF<{nzL zaMm+?xd-H9-|8pO(>LimI%TBGBkvsl`M#ClV%(iKma%MH^KzWd1k81FTb$DKB?=uc zce%`x;~u>7+kKvBeQj}Qj3?1)9Gi2JJ#Ydh?sl_}pd!PtV#wm&Y;>0&H~ zW^Y%`O%vM1MaCE!zoOVhkvb;xNjI*JHyjH)dpvX;Hi(=HVN4k4m`{2aYe1S&25WPIijAtpyC$1nt19~Q@&7J~bA3rP*$JEPwR-dP zl;5$8CU~y4z%s`H3^xWlpOo;8aR5_=5%ClOq+ zbkZjk3?h);s(k*+kir6VY`1eA_u;?aG4w`#WvlprS*DO|Q0BVOAUls}&hYLQ6*oZYGAoe^ zhP>Vw&rbu31SdO$IxX2FhbHlG?IY*$r@12;dDbgYl{-(x0M zN?`c$`h$AD!9xGf?mz*TdJ;*N8`(kVUnK{(k0cFtj(&EfWx7H(-3H-J7l1F06nxmL zvYYA3cMhFJf!rCfJxwB~q2}O()%W{n6uVD-m4uo}q05Pm(pVxQs7DP!WE?ZO2$Y}5 z!<*`kFK}v)MO`ljOC|w+PeMyWWeoZYsZIhGgci1+TG$AOdCT=Yk`EF#1ct+@DRk63 zm*ri9niK#XYrr-bujaFEnKV448d0@W6sO{LSTM^nhB>J#dAt$A^$zt11@10a&+-A5 zCi-rZL0cDN7*DhBtu_U%pqhQX3DH7Fx0_=eLPH%CKxvKPZW*OxUiuX!1<28+lBlqR1Du$%q_;etBwAkBU z*}kk&^y|PhX^P`pYwBZWyv-)Vq%*kj>+*$M{!};5@SsiEA1|6*V@Vr~Ym1B76+qn_ z3q9IkbB|s<_9F?%Ja-iM3hhlSxR1(nFx`r~21Fmy3O{D6;Q+ZAR!vtQUbGrUI$s8S zm2egy^y>z*L*xVa;1MyH&@ay8WtJe3=BHu+R{5(lWG6HSmw%kDD;mRT8HP}-f z<-8Qsms+Nq{@P*a>kFXc-t1!vyio|oJSYD91cdl(-H041X(zoPFZ4ORW_@i8i9I}X zaten63Der|sNs+Y3euC0k{4)-_}+DWy5+mlFYm)vI(caRTf_r{1Jn4`CYV12#J(FXPYp)g!56O4+B&H-`tU^E>$9Zgo3Vdg(Ji}N8nynEja(!*`@#Ws8 z$H~WPjmm^e$6xmht1)Ag>G_fX(1^xvY5~4W!xKTo=`9T6;mHiO0T%yhp1}2qXRiUl zpqm?iil}Hy@9iyfTlwl0{CWr>Eg(KtcW1vv;i{xo2kF>HhH;;rItaG?RVn_E3r+jJ z=BR2Ch>s*F7M~-J_Y`J4Qv_8{lk0tJJ9dSXeZt*QgNHge+nz~wv{jso^X>tNckp@Z zeCCW;l8+nER5Pe`Qf1xcP_yofl3~cS791ft;|d)llS?l8Kvqe#f47}>!kNi4uZk&d zCnm;}L|l8&r3PhRMl++54i)`2b$2!}u1Ld4irbOo5)P!o!6&(-LLBBTE0<>&PqN=N zMfB(m{>vX#)tQHEC+-PM%s|48RDv{e znXq5Eg_prW3GAbf!0kJkTB6=xm~Wgf@z-xHO4(2UwzCMC&HImQYZT4th*qg>ex2CKuhifEdl zlJ44Zq?s_0iJ^7tP>#x2ldI50*<2+~6c_xnDd@9+EhzP}xF zYPr`B=Ym(q(5o_Zi^uUM@M3P@&2k18ukyOs?4eez+GXcAy{;z@YBOctCEe_|WhRa~ zK8W|p(MuF3Ucr)Jr)Iwrk*KGqclO9@Kz?7-RUp4itqqA?mVK(V9LqXH7 zM&iQ;yQ1S!D&U&U)CP~%i80Ll|5BLSvrD&rznNO1@8N#g@EMV$<|d0CIkN8fnSNM$ zan1IUaAy)f4wzf@h-Y=MoD5~zf!-+L%#9fI9Wg6!)u_)kjbtf>K)koj0#S>{HDBA# z*UGh7&&r6U7}UE?2X7&9ZQkYW{YY5UH(Ac63h)sgX>B@j&jU)a5i}QOmehAaGwUJt z3xD%hV+R#OkijZb0}zGW++oqVuvdf z`4rCpvEKsgu?!%BiTCDP_x3B6{faJSxN>loimqbHZkcS6(SEQ;22S^coGad+^CS9eXb(YJ?h`d!o-z z*VD1>WadCN(s@XTm;R1J?zx@^;j>RjTrcs_#oUemX>axT2-IFqby-k6Eiqo)x!3N( zR5+iw!b`y)i{xa6wP-X2t?6cIIKqA)Gdopxxun(vH;;JAnompguNk2mcoyQtuz?eB z;V-05ibYg$DG(#Ck~TB3sU%g$Tq1}TD>rRhyc%Q_m@+@-=PT7%4IC${JHAErNMH>P zr+gb5UDY8YME3pto5sB8d0}at(#t1zG;DvYH)))MDviH+OQo*Bex4U_eg4bTKr{`?c-s*v!N$>nM0ej)L{FSNLR`zD5RMKc4!n@lDMM>igvv)8kqOa5D#N@o> zK*A1rbn4vFEjo%Ry59B2U_lK%;=y~y0+(t8*M98Vl>P2(-Gg?Ot<$xQfn#26jR*R5 zzCmufg_m}*RKD((EeD_ygL#9$6f#GRv2;irfBNWYOyFywyO`*S40bITY%LtalE%4=C5 z^tjS<{?*rbEf#8bM!O=?^dzmT%w~&6sBoM|U?n}=9J~@^^z5Gv3`Qv&JvD{7hYAt$ zVeC`F{UB+a-7hirzS8CtTK05$kY=ASKTJbwgQZoG5I78JX5J4&=*+3uwZnx;g_&o@ zYs`=wY>_EKA3QxRn*Q^|`7SSz^F2|)t$RV5;DmSzs4f)ZiUc5tj_eNmT#l)$F5Or@ z@zMbCG)t81^X|~8=%S@J5JJ?ozRQ;JjMd4mz%Yx1gMFin9EYE*#*4JBleq;%qjsfU zA=QTudM7VA_`Vkk^Os}D>(5{&2MQt>aAb(Hu`%;A9s`QG9v3)m3x`^jkCc$O48#Z) z7}B&-UyDoK7Q^-!J6*`xoY2M`bQnS--t>ia@MSke{;4DjJfV4;01QkvgZ?wXe+DrXc4flCtTzjWF|$7pQ?;wF|EqHLt034kvGS{x#m2Wb zyRPO?`n6MBy@aN4v_Vop|P;Lqx|Pmir&Qu1#v#aZ~8fM%=?BvL=b9&?R)Mf?j2E0%6$lz8Y5*RLvX6BV~n} k==*w&uXQm-gHIx_Z>Mj4VeFR;=S=}u7mD*=+k%h(3l(|?5dZ)H literal 21263 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