mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2025-12-31 12:41:46 +00:00
* Converts pirates, soviets, and drakehounds to basic mob AI * Linters and fixes * Pirate fire rate adjustment * Merge fixes * Better ranged attack code * Even better ranged code --------- Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com> Signed-off-by: Burzah <116982774+Burzah@users.noreply.github.com> Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
68 lines
2.1 KiB
Plaintext
68 lines
2.1 KiB
Plaintext
/// A component for ai-controlled atoms which plays a sound if they switch to a living target which they can attack
|
|
/datum/component/aggro_emote
|
|
/// Blackboard key in which target data is stored
|
|
var/target_key
|
|
/// If we want to limit emotes to only play at mobs
|
|
var/living_only
|
|
/// List of emotes to play
|
|
var/list/emote_list
|
|
/// Chance to play an emote
|
|
var/emote_chance
|
|
/// Chance to subtract every time we play an emote (permanently)
|
|
var/subtract_chance
|
|
/// Minimum chance to play an emote
|
|
var/minimum_chance
|
|
/// Aggro sound
|
|
var/aggro_sound
|
|
/// Volume for the sound
|
|
var/aggro_volume
|
|
|
|
/datum/component/aggro_emote/Initialize(
|
|
target_key = BB_BASIC_MOB_CURRENT_TARGET,
|
|
living_only = FALSE,
|
|
list/emote_list,
|
|
aggro_sound = null,
|
|
aggro_volume = 70,
|
|
emote_chance = 30,
|
|
minimum_chance = 2,
|
|
subtract_chance = 7,
|
|
)
|
|
. = ..()
|
|
if(!isatom(parent))
|
|
return COMPONENT_INCOMPATIBLE
|
|
var/atom/atom_parent = parent
|
|
if(!atom_parent.ai_controller)
|
|
return COMPONENT_INCOMPATIBLE
|
|
src.aggro_sound = aggro_sound
|
|
src.aggro_volume = aggro_volume
|
|
src.target_key = target_key
|
|
src.emote_list = emote_list
|
|
src.emote_chance = emote_chance
|
|
src.minimum_chance = minimum_chance
|
|
src.subtract_chance = subtract_chance
|
|
|
|
/datum/component/aggro_emote/RegisterWithParent()
|
|
. = ..()
|
|
RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(on_target_changed))
|
|
|
|
/datum/component/aggro_emote/UnregisterFromParent()
|
|
UnregisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_SET(target_key))
|
|
return ..()
|
|
|
|
/// When we get a new target, see if we want to bark at it
|
|
/datum/component/aggro_emote/proc/on_target_changed(atom/source)
|
|
SIGNAL_HANDLER
|
|
var/atom/new_target = source.ai_controller.blackboard[target_key]
|
|
if(isnull(new_target) || !prob(emote_chance))
|
|
return
|
|
if(living_only && !isliving(new_target))
|
|
return // If we don't want to bark at food items or chairs or windows
|
|
emote_chance = max(emote_chance - subtract_chance, minimum_chance)
|
|
var/mob/living/mob_parent = source
|
|
if(!istype(mob_parent))
|
|
return
|
|
if(emote_list)
|
|
mob_parent.emote("me", EMOTE_VISIBLE, "[pick(emote_list)] at [new_target].")
|
|
if(aggro_sound)
|
|
playsound(mob_parent.loc, aggro_sound, aggro_volume, TRUE)
|