Files
Bubberstation/code/datums/elements/ai_retaliate.dm
Jacquerel 380ce322a6 Apply AI Controller Admin Verb (#89375)
## About The Pull Request

Melbert asked me to make this and I thought it'd be relatively easy and
plausibly useful so I did.

This PR adds a feature to the VV menu for mobs which allows you to apply
and configure an AI controller from a list of templates.
It's not as versatile as coding one would be, but it should be able to
accomodate a lot of generic scenarios.

Some examples of basic stuff you can set it up to do:
- Give Ian a machine gun he will fire at nearby people while staying
within a specified min/max range.
- Have Poly fire brimstone beams on cooldown at whoever is nearby
(although she won't bother trying to line up cardinally).
- Assign a gorilla to be someone's personal bodyguard which will follow
them around and attack anyone who hurts them.

I have also made an executive decision to remove the restriction that
basic ai controllers can only be placed on basic mobs.
We've removed _most_ non-basic simple mobs from the game, and also have
more recently updated most AI behaviours to work agnostically of whether
they are assigned to a basic mob or not... which means that they'll
largely work on carbons.

Coincidentally, this feature makes sure to ask if you want an AI
controller to remain active on a mob which already has a client.
Assigning an active AI controller to a live player which forces their
character to automatically attempt to run away from whoever the last
person to attack them was is ~~not recommended behaviour because it's
largely untested~~ highly recommended behaviour because I think it's
very funny (makes it very hard to play though).

I'm gonna do another PR some time which cleans up `random_speech` so
it's configurable and then let you slap that on whoever as well.

## Why It's Good For The Game

Enables a greater level of admin abuse.

## Changelog

🆑
admin: Added easier tooling for admins to add or change the AI
controllers on mobs
/🆑
2025-03-12 15:45:46 -04:00

28 lines
923 B
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
victim.ai_controller?.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, attacker)