Files
Bubberstation/code/datums/elements/kill_achievement.dm

63 lines
2.7 KiB
Plaintext

/// Element that grants an achievement to all mobs who killed the owner when it dies
/datum/element/kill_achievement
element_flags = ELEMENT_BESPOKE
argument_hash_start_idx = 2
/// Achievements to grant when killed
var/list/achievement_types = null
/// Achievement to grant when killed with a crusher
var/crusher_achievement_type = null
/// A memory to grant to killers, if any
var/kill_memory_type = null
/// Range in which to grant the achievement
var/achievement_range = 7
/// Threshold for damage dealt with a crusher to count it as a crusher kill
/// If null, then no kill counts as a crusher kill
var/crusher_kill_threshold = 0.6
/// Blackbox tally string to record kills into
var/tally_string = "megafauna_kills"
/datum/element/kill_achievement/Attach(datum/target, list/achievement_types, crusher_achievement_type, kill_memory_type, achievement_range = 7, crusher_kill_threshold = 0.6, tally_string = "megafauna_kills")
. = ..()
if (!isliving(target) || !length(achievement_types))
return ELEMENT_INCOMPATIBLE
src.achievement_types = achievement_types
src.crusher_achievement_type = crusher_achievement_type
src.kill_memory_type = kill_memory_type
src.achievement_range = achievement_range
src.crusher_kill_threshold = crusher_kill_threshold
src.tally_string = tally_string
RegisterSignal(target, COMSIG_LIVING_DEATH, PROC_REF(on_death))
/datum/element/kill_achievement/Detach(datum/target)
. = ..()
UnregisterSignal(target, COMSIG_LIVING_DEATH)
/datum/element/kill_achievement/proc/on_death(mob/living/source, gibbed)
SIGNAL_HANDLER
if ((source.flags_1 & ADMIN_SPAWNED_1) || !SSachievements.achievements_enabled)
return
// Check whether we killed the megafauna with primarily crusher damage or not
var/datum/status_effect/crusher_damage/crusher_dmg = source.has_status_effect(/datum/status_effect/crusher_damage)
var/crusher_kill = (!isnull(crusher_kill_threshold) && crusher_dmg && (crusher_dmg.total_damage >= floor(source.maxHealth * 0.6)))
var/turf/our_loc = get_turf(source)
if (!our_loc)
return
for (var/mob/living/player in SSmobs.clients_by_zlevel[our_loc.z])
var/turf/player_turf = get_turf(player)
if (player.stat || get_dist(player_turf, source) > achievement_range)
continue
for (var/achievement_type in achievement_types)
player.client.give_award(achievement_type, player)
if (kill_memory_type)
player.add_mob_memory(kill_memory_type, antagonist = source)
if(crusher_kill && crusher_achievement_type && istype(player.get_active_held_item(), /obj/item/kinetic_crusher))
player.client.give_award(crusher_achievement_type, player)
SSblackbox.record_feedback("tally", "[tally_string][crusher_kill ? "_crusher" : ""]", 1, "[initial(source.name)]")