diff --git a/code/datums/elements/death_drops.dm b/code/datums/elements/death_drops.dm index c02ba37cad7..02629daaf8d 100644 --- a/code/datums/elements/death_drops.dm +++ b/code/datums/elements/death_drops.dm @@ -25,9 +25,30 @@ ///signal called by the stat of the target changing /datum/element/death_drops/proc/on_death(mob/living/target, gibbed) SIGNAL_HANDLER + var/atom/loot_loc = target.drop_location() for(var/thing_to_spawn in loot) - if(loot[thing_to_spawn]) //If this is an assoc list, use the value of that to get the right amount - for(var/index in 1 to loot[thing_to_spawn]) - new thing_to_spawn(target.drop_location()) - else - new thing_to_spawn(target.drop_location()) + for(var/i in 1 to (loot[thing_to_spawn] || 1)) + create_loot(thing_to_spawn, loot_loc, target, gibbed) + +/// Handles creating the loots +/datum/element/death_drops/proc/create_loot(typepath, atom/loot_loc, mob/living/dead, gibbed) + if(ispath(typepath, /obj/effect/mob_spawn/corpse)) + handle_corpse(typepath, loot_loc, dead, gibbed) + return + + new typepath(loot_loc) + +/// Handles snowflake case of mob corpses +/datum/element/death_drops/proc/handle_corpse(typepath, atom/loot_loc, mob/living/dead, gibbed) + var/obj/effect/mob_spawn/corpse/spawner = new typepath(loot_loc, TRUE) + var/mob/living/body = spawner.create() + // done before the gib check so the bodyparts will be damaged + body.setBruteLoss(dead.getBruteLoss()) + body.setFireLoss(dead.getFireLoss()) + // if gibbed, dispose of the body + if(gibbed) + body.gib(DROP_ALL_REMAINS) + return + // otherwise continue with the rest of the damage types + body.setToxLoss(dead.getToxLoss()) + body.setOxyLoss(dead.getOxyLoss()) diff --git a/code/modules/mob/living/basic/trooper/abductor.dm b/code/modules/mob/living/basic/trooper/abductor.dm index 8163fb72c5a..1a3ea4b6288 100644 --- a/code/modules/mob/living/basic/trooper/abductor.dm +++ b/code/modules/mob/living/basic/trooper/abductor.dm @@ -3,13 +3,13 @@ name = "Abductor Agent" desc = "Mezaflorp?" faction = list(ROLE_SYNDICATE) - loot = list(/obj/effect/mob_spawn/corpse/human/abductor) mob_spawner = /obj/effect/mob_spawn/corpse/human/abductor + corpse = /obj/effect/mob_spawn/corpse/human/abductor /mob/living/basic/trooper/abductor/melee melee_damage_lower = 15 melee_damage_upper = 15 - loot = list(/obj/effect/gibspawner/human) + corpse = /obj/effect/gibspawner/human attack_verb_continuous = "beats" attack_verb_simple = "beat" attack_sound = 'sound/items/weapons/egloves.ogg' @@ -18,7 +18,7 @@ var/projectile_deflect_chance = 0 /mob/living/basic/trooper/abductor/ranged - loot = list(/obj/effect/gibspawner/human) + corpse = /obj/effect/gibspawner/human ai_controller = /datum/ai_controller/basic_controller/trooper/ranged r_hand = /obj/item/gun/energy/alien /// Type of bullet we use diff --git a/code/modules/mob/living/basic/trooper/nanotrasen.dm b/code/modules/mob/living/basic/trooper/nanotrasen.dm index 6d285b871d8..80f0f348624 100644 --- a/code/modules/mob/living/basic/trooper/nanotrasen.dm +++ b/code/modules/mob/living/basic/trooper/nanotrasen.dm @@ -5,7 +5,7 @@ melee_damage_lower = 10 melee_damage_upper = 15 faction = list(ROLE_DEATHSQUAD) - loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasensoldier) + corpse = /obj/effect/mob_spawn/corpse/human/nanotrasensoldier mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasensoldier /mob/living/basic/trooper/nanotrasen/assess_threat(judgement_criteria, lasercolor, datum/callback/weaponcheck) @@ -56,7 +56,7 @@ ranged_cooldown = 3 SECONDS projectilesound = 'sound/items/weapons/gun/smg/shot.ogg' r_hand = /obj/item/gun/ballistic/automatic/ar - loot = list(/obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier) + corpse = /obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasenassaultsoldier /mob/living/basic/trooper/nanotrasen/ranged/elite @@ -71,7 +71,7 @@ projectilesound = 'sound/items/weapons/laser.ogg' ranged_cooldown = 5 SECONDS faction = list(ROLE_DEATHSQUAD) - loot = list(/obj/effect/gibspawner/human) + corpse = /obj/effect/gibspawner/human mob_spawner = /obj/effect/mob_spawn/corpse/human/nanotrasenelitesoldier r_hand = /obj/item/gun/energy/pulse/carbine/lethal diff --git a/code/modules/mob/living/basic/trooper/pirate.dm b/code/modules/mob/living/basic/trooper/pirate.dm index 0af2f2aa697..af8ae0cdfd2 100644 --- a/code/modules/mob/living/basic/trooper/pirate.dm +++ b/code/modules/mob/living/basic/trooper/pirate.dm @@ -6,8 +6,8 @@ response_help_simple = "push" speak_emote = list("yarrs") faction = list(FACTION_PIRATE) - loot = list(/obj/effect/mob_spawn/corpse/human/pirate) mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate + corpse = /obj/effect/mob_spawn/corpse/human/pirate /// The amount of money to steal with a melee attack var/plunder_credits = 25 @@ -30,10 +30,10 @@ light_power = 2.5 light_color = COLOR_SOFT_RED loot = list( - /obj/effect/mob_spawn/corpse/human/pirate/melee, /obj/item/melee/energy/sword/pirate, ) mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/melee + corpse = /obj/effect/mob_spawn/corpse/human/pirate/melee r_hand = /obj/item/melee/energy/sword/pirate plunder_credits = 50 //they hit hard so they steal more @@ -41,8 +41,9 @@ name = "Space Pirate Swashbuckler" unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 - loot = list(/obj/effect/mob_spawn/corpse/human/pirate/melee/space) + loot = null mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/melee/space + corpse = /obj/effect/mob_spawn/corpse/human/pirate/melee/space /mob/living/basic/trooper/pirate/melee/space/Initialize(mapload) . = ..() @@ -50,8 +51,8 @@ /mob/living/basic/trooper/pirate/ranged name = "Pirate Gunner" - loot = list(/obj/effect/mob_spawn/corpse/human/pirate/ranged) mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/ranged + corpse = /obj/effect/mob_spawn/corpse/human/pirate/ranged r_hand = /obj/item/gun/energy/laser ai_controller = /datum/ai_controller/basic_controller/trooper/ranged /// Type of bullet we use @@ -77,7 +78,7 @@ name = "Space Pirate Gunner" unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 - loot = list(/obj/effect/mob_spawn/corpse/human/pirate/ranged/space) + corpse = /obj/effect/mob_spawn/corpse/human/pirate/ranged/space mob_spawner = /obj/effect/mob_spawn/corpse/human/pirate/ranged/space r_hand = /obj/item/gun/energy/e_gun/lethal diff --git a/code/modules/mob/living/basic/trooper/russian.dm b/code/modules/mob/living/basic/trooper/russian.dm index a3c3f6a5605..6085b086cd6 100644 --- a/code/modules/mob/living/basic/trooper/russian.dm +++ b/code/modules/mob/living/basic/trooper/russian.dm @@ -16,19 +16,15 @@ mob_spawner = /obj/effect/mob_spawn/corpse/human/russian r_hand = /obj/item/knife/kitchen - loot = list( - /obj/effect/mob_spawn/corpse/human/russian, - /obj/item/knife/kitchen, - ) + corpse = /obj/effect/mob_spawn/corpse/human/russian + loot = list(/obj/item/knife/kitchen) /mob/living/basic/trooper/russian/ranged ai_controller = /datum/ai_controller/basic_controller/trooper/ranged mob_spawner = /obj/effect/mob_spawn/corpse/human/russian/ranged r_hand = /obj/item/gun/ballistic/automatic/pistol - loot = list( - /obj/effect/mob_spawn/corpse/human/russian/ranged, - /obj/item/gun/ballistic/revolver/nagant, - ) + corpse = /obj/effect/mob_spawn/corpse/human/russian/ranged + loot = list(/obj/item/gun/ballistic/revolver/nagant) var/casingtype = /obj/item/ammo_casing/n762 var/projectilesound = 'sound/items/weapons/gun/revolver/shot.ogg' @@ -37,4 +33,4 @@ AddComponent(/datum/component/ranged_attacks, casing_type = casingtype, projectile_sound = projectilesound, cooldown_time = 1 SECONDS) /mob/living/basic/trooper/russian/ranged/lootless - loot = list() + loot = null diff --git a/code/modules/mob/living/basic/trooper/syndicate.dm b/code/modules/mob/living/basic/trooper/syndicate.dm index 6d4766db8cd..5aedfaec494 100644 --- a/code/modules/mob/living/basic/trooper/syndicate.dm +++ b/code/modules/mob/living/basic/trooper/syndicate.dm @@ -3,14 +3,14 @@ name = "Syndicate Operative" desc = "Death to Nanotrasen." faction = list(ROLE_SYNDICATE) - loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier) + corpse = /obj/effect/mob_spawn/corpse/human/syndicatesoldier mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatesoldier /mob/living/basic/trooper/syndicate/space name = "Syndicate Commando" maxHealth = 170 health = 170 - loot = list(/obj/effect/gibspawner/human) + corpse = /obj/effect/gibspawner/human unsuitable_atmos_damage = 0 minimum_survivable_temperature = 0 mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatecommando @@ -29,7 +29,7 @@ /mob/living/basic/trooper/syndicate/melee //dude with a knife and no shields melee_damage_lower = 15 melee_damage_upper = 15 - loot = list(/obj/effect/gibspawner/human) + corpse = /obj/effect/gibspawner/human attack_verb_continuous = "slashes" attack_verb_simple = "slash" attack_sound = 'sound/items/weapons/bladeslice.ogg' @@ -99,7 +99,7 @@ ///////////////Guns//////////// /mob/living/basic/trooper/syndicate/ranged - loot = list(/obj/effect/gibspawner/human) + corpse = /obj/effect/gibspawner/human ai_controller = /datum/ai_controller/basic_controller/trooper/ranged r_hand = /obj/item/gun/ballistic/automatic/pistol /// Type of bullet we use @@ -125,7 +125,7 @@ /mob/living/basic/trooper/syndicate/ranged/infiltrator //shuttle loan event projectilesound = 'sound/items/weapons/gun/smg/shot_suppressed.ogg' - loot = list(/obj/effect/mob_spawn/corpse/human/syndicatesoldier) + corpse = /obj/effect/mob_spawn/corpse/human/syndicatesoldier /mob/living/basic/trooper/syndicate/ranged/space name = "Syndicate Commando" @@ -159,12 +159,12 @@ name = "spaceport security" desc = "Premier corporate security forces for all spaceports found along the Orion Trail." faction = list(FACTION_ORION) - loot = list() + corpse = null /mob/living/basic/trooper/syndicate/ranged/smg/pilot //caravan ambush ruin name = "Syndicate Salvage Pilot" - loot = list(/obj/effect/mob_spawn/corpse/human/syndicatepilot) mob_spawner = /obj/effect/mob_spawn/corpse/human/syndicatepilot + corpse = /obj/effect/mob_spawn/corpse/human/syndicatepilot /mob/living/basic/trooper/syndicate/ranged/smg/space name = "Syndicate Commando" diff --git a/code/modules/mob/living/basic/trooper/trooper.dm b/code/modules/mob/living/basic/trooper/trooper.dm index 7c9fd698d08..1df73b15a1d 100644 --- a/code/modules/mob/living/basic/trooper/trooper.dm +++ b/code/modules/mob/living/basic/trooper/trooper.dm @@ -19,7 +19,9 @@ ai_controller = /datum/ai_controller/basic_controller/trooper /// Loot this mob drops on death. - var/loot = list(/obj/effect/mob_spawn/corpse/human) + var/list/loot + /// Corpse to spawn + var/corpse = /obj/effect/mob_spawn/corpse/human /// Path of the mob spawner we base the mob's visuals off of. var/mob_spawner = /obj/effect/mob_spawn/corpse/human /// Path of the right hand held item we give to the mob's visuals. @@ -30,7 +32,8 @@ /mob/living/basic/trooper/Initialize(mapload) . = ..() apply_dynamic_human_appearance(src, mob_spawn_path = mob_spawner, r_hand = r_hand, l_hand = l_hand) - if(LAZYLEN(loot)) + if(LAZYLEN(loot) || corpse) + LAZYOR(loot, corpse) loot = string_list(loot) AddElement(/datum/element/death_drops, loot) AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_SHOE)