Files
Paradise/code/datums/elements/ai_retaliate.dm
PollardTheDragon f68676267c Adds no-harm check to ai retaliate, adjusts clown AI (#30166)
* Adds no-harm check to ai retaliate, adjusts clown AI

* Update code/modules/mob/living/basic/retaliate/clown.dm

Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com>
Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>

---------

Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com>
2025-08-19 13:12:36 +00:00

32 lines
1.0 KiB
Plaintext

/**
* Attached to a mob with an AI controller, passes things which have damaged it to a blackboard.
* The AI controller is responsible for doing anything with that information.
*/
/datum/element/ai_retaliate
/datum/element/ai_retaliate/Attach(datum/target)
. = ..()
if(!ismob(target))
return ELEMENT_INCOMPATIBLE
target.AddElement(/datum/element/relay_attackers)
RegisterSignal(target, COMSIG_ATOM_WAS_ATTACKED, PROC_REF(on_attacked))
ADD_TRAIT(target, TRAIT_SUBTREE_REQUIRED_OPERATIONAL_DATUM, type)
/datum/element/ai_retaliate/Detach(datum/source, ...)
. = ..()
UnregisterSignal(source, COMSIG_ATOM_WAS_ATTACKED)
/// Add an attacking atom to a blackboard list of things which attacked us
/datum/element/ai_retaliate/proc/on_attacked(mob/victim, atom/attacker)
SIGNAL_HANDLER
if(victim == attacker)
return
if(isanimal_or_basicmob(attacker)) // Don't retaliate on nuzzles
var/mob/living/M = attacker
if(M.a_intent == INTENT_HELP)
return
victim.ai_controller?.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, attacker)