Skip to content

Commit

Permalink
Basic Watchers & Basilisks (tgstation#77630)
Browse files Browse the repository at this point in the history
This one is a double feature because Watchers and Basilisks share the
same typepath. You might see a couple more of those.
As is tradition I decided to fuck with them rather than just port them.
Here's what's up.

**Basilisks**

![image](https://github.com/tgstation/tgstation/assets/7483112/9e4b0115-65dd-4df7-b62a-21c7be8549bf)

![image](https://github.com/tgstation/tgstation/assets/7483112/59162e68-7d73-4659-9531-5078ff751228)

- Have a new soulless sprite which looks less like a living blue hedge.
- Walk at you and shoot you while you are not in range (just like
before).
- Become supercharged if they become "heated" by lava, lasers, or
temperature weapons. This was a feature they also previously had but
they would never encounter lava, so now it also works if you use the
wrong gun on them.
- Lose their supercharge if you cool them down.
- Otherwise pretty normal mobs.

**Watchers**

https://www.youtube.com/watch?v=kOq_Bf78k5A
Here's a traditional video of me intentionally getting hit by mechanics
(trust me its definitely on purpose)

- They glow emmissively a little bit so you can see them from further
away.
- Their eyes light up about 0.5 seconds before they are able to shoot at
you.
- No longer melee attack, instead try to stay out of melee.
- Will occasionally put you into "Overwatch", meaning they will shoot
you rapidly if you move or act while they're staring at you for a brief
time period (after which you become immune for 12 seconds, and during
which other watchers will play fair and stop shooting at you).
- If they start taking damage they will also start using their "Gaze"
attack, look away or suffer some kind of negative effect!
- - Normal watcher gaze flashes and confuses you.
- - Magmawing watcher gaze obviously burns (and briefly stuns) you.
- - Icewing watcher gaze freezes you and throws you backwards.
- Magnetically attract and eat diamonds. They also used to do this, but
just if they happened to coincidentally walk past some.

**Other accompanying changes**

All basic mobs will now adopt the "stop gliding" trait if they get
slowed down too much.
I moved behaviour for "fire a projectile from this atom" into a helper
proc because I was using it in three places and I will probably use it
in more places. There are probably other places in the existing code
which could be using this.
I think I made the basic mob melee attack forecast default a little more
forgiving, they were fucking me up too much and I am the playtester.

Another one off the list.
New tricks for old dogs.
Framework for making mobs with ranged attacks "fairer" (you can see when
they are ready to shoot you).
More (hopefully) versatile AI behaviours which we will reuse later (I
hope I'm not duplicating one someone already made).
If our players "enjoy" them enough we can give more mobs "don't look at
me" mechanics.
Removes some soul sprites.

:cl:
refactor: Basilisks and Watchers now use the basic mob framework. Please
bug report any unusual behaviour.
sprite: Basilisks have new sprites.
add: Basilisks will go into a frenzy if heated by energy weapons or
temperature beams as well as by lava.
add: Watcher eyes will be illuminated briefly when they are ready to
fire at you.
add: Watchers can now briefly put you into "Overwatch" and penalise you
for moving while they can see you.
add: Wounded watchers will occasionally punish players who look at them.
balance: Unusual watcher variants are more likely to appear.
/:cl:
  • Loading branch information
Jacquerel authored and dwasint committed Aug 22, 2023
1 parent c9460d1 commit f3bf27b
Show file tree
Hide file tree
Showing 56 changed files with 1,086 additions and 312 deletions.
2 changes: 1 addition & 1 deletion _maps/RandomRuins/SpaceRuins/abandonedzoo.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -501,7 +501,7 @@
/turf/open/floor/iron/dark,
/area/ruin/space/has_grav/abandonedzoo)
"WV" = (
/mob/living/simple_animal/hostile/asteroid/basilisk,
/mob/living/basic/mining/basilisk,
/turf/open/misc/asteroid,
/area/ruin/space/has_grav/abandonedzoo)
"Xx" = (
Expand Down
4 changes: 2 additions & 2 deletions _maps/RandomZLevels/snowdin.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -10538,7 +10538,7 @@
/turf/open/floor/iron,
/area/awaymission/snowdin/post/engineering)
"Mo" = (
/mob/living/simple_animal/hostile/asteroid/basilisk,
/mob/living/basic/mining/basilisk,
/turf/open/misc/asteroid/snow{
floor_variance = 0;
icon_state = "snow_dug";
Expand Down Expand Up @@ -11315,7 +11315,7 @@
/turf/open/floor/iron/dark,
/area/awaymission/snowdin/cave)
"QP" = (
/mob/living/simple_animal/hostile/asteroid/basilisk,
/mob/living/basic/mining/basilisk,
/turf/open/misc/asteroid/snow/ice,
/area/awaymission/snowdin/cave/cavern)
"QQ" = (
Expand Down
6 changes: 5 additions & 1 deletion _maps/map_files/KiloStation/KiloStation.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -18679,6 +18679,10 @@
/obj/effect/spawner/random/decoration/carpet,
/turf/open/floor/iron,
/area/station/security/prison)
"glv" = (
/obj/effect/decal/cleanable/dirt,
/turf/closed/mineral/random/labormineral,
/area/space/nearstation)
"glG" = (
/obj/structure/sign/warning/secure_area,
/turf/closed/wall/r_wall,
Expand Down Expand Up @@ -110250,7 +110254,7 @@ aeu
aeu
aeu
aeu
aeu
glv
vJc
jhN
qmW
Expand Down
4 changes: 1 addition & 3 deletions code/__DEFINES/ai/ai.dm
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,8 @@
#define AI_BEHAVIOR_MOVE_AND_PERFORM (1<<2)
///Does finishing this task not null the current movement target?
#define AI_BEHAVIOR_KEEP_MOVE_TARGET_ON_FINISH (1<<3)
///Does finishing this task make the AI stop moving towards the target?
#define AI_BEHAVIOR_KEEP_MOVING_TOWARDS_TARGET_ON_FINISH (1<<4)
///Does this behavior NOT block planning?
#define AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION (1<<5)
#define AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION (1<<4)

///AI flags
/// Don't move if being pulled
Expand Down
10 changes: 8 additions & 2 deletions code/__DEFINES/ai/monsters.dm
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,20 @@
/// We increment this counter every time we try to move while dragging an arm and if we go too long we'll give up trying to get out of line of sight and just eat the fingers
#define BB_LOBSTROSITY_FINGER_LUST "BB_lobstrosity_finger_lust"

///eyeball keys
/// Key containing overwatch ability information
#define BB_WATCHER_OVERWATCH "BB_watcher_overwatch"
/// Key containing gazae ability information
#define BB_WATCHER_GAZE "BB_watcher_gaze"

// eyeball keys
///the death glare ability
#define BB_GLARE_ABILITY "BB_glare_ability"
///the blind target we must protect
#define BB_BLIND_TARGET "BB_blind_target"
///value to store the minimum eye damage to prevent us from attacking a human
#define BB_EYE_DAMAGE_THRESHOLD "BB_eye_damage_threshold"
///hivebot keys

// hivebot keys
///the machine we must go to repair
#define BB_MACHINE_TARGET "BB_machine_target"
///the hivebot partner we will go communicate with
Expand Down
3 changes: 3 additions & 0 deletions code/__DEFINES/basic_mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,6 @@
/// Temporary trait applied when an attack forecast animation has completed
#define TRAIT_BASIC_ATTACK_FORECAST "trait_basic_attack_forecast"
#define INTERACTION_BASIC_ATTACK_FORCEAST "interaction_basic_attack_forecast"

/// Above this speed we stop gliding because it looks silly
#define END_GLIDE_SPEED 10
3 changes: 3 additions & 0 deletions code/__DEFINES/dcs/signals/signals_mob/signals_mob_basic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,6 @@
#define COMSIG_BASICMOB_LOOK_DEAD "basicmob_look_dead"
/// Sent from /mob/living/basic/proc/look_alive() : ()
#define COMSIG_BASICMOB_LOOK_ALIVE "basicmob_look_alive"

///from the ranged_attacks component for basic mobs: (mob/living/basic/firer, atom/target, modifiers)
#define COMSIG_BASICMOB_POST_ATTACK_RANGED "basicmob_post_attack_ranged"
6 changes: 6 additions & 0 deletions code/__DEFINES/dcs/signals/signals_mob/signals_mob_main.dm
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,12 @@
#define WAIVE_AUTOMUTE_CHECK (1<<0)
///From base of /turf/closed/mineral/proc/gets_drilled(): (turf/closed/mineral/rock, give_exp)
#define COMSIG_MOB_MINED "mob_mined"
///Sent by pilot of mech in base of /obj/vehicle/sealed/mecha/relaymove(): (/obj/vehicle/sealed/mecha/mech)
#define COMSIG_MOB_DROVE_MECH "mob_drove_mech"
///Sent by pilot of mech in /obj/vehicle/sealed/mecha/on_mouseclick when using mech equipment : (/obj/vehicle/sealed/mecha/mech)
#define COMSIG_MOB_USED_MECH_EQUIPMENT "mob_used_mech_equipment"
///Sent by pilot of mech in /obj/vehicle/sealed/mecha/on_mouseclick when triggering mech punch : (/obj/vehicle/sealed/mecha/mech)
#define COMSIG_MOB_USED_MECH_MELEE "mob_used_mech_melee"

///from living/flash_act(), when a mob is successfully flashed.
#define COMSIG_MOB_FLASHED "mob_flashed"
Expand Down
2 changes: 2 additions & 0 deletions code/__DEFINES/mobfactions.dm
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@
#define FACTION_MIMIC "mimic"
/// Beasts found on the various mining environments
#define FACTION_MINING "mining"
/// Watchers don't like any creatures other than each other
#define FACTION_WATCHER "watcher"
/// Monkeys and gorillas
#define FACTION_MONKEY "monkey"
/// Mushrooms and mushroompeople
Expand Down
11 changes: 11 additions & 0 deletions code/__DEFINES/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -566,6 +566,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai

/// Cannot be grabbed by goliath tentacles
#define TRAIT_TENTACLE_IMMUNE "tentacle_immune"
/// Currently under the effect of overwatch
#define TRAIT_OVERWATCHED "watcher_overwatched"
/// Cannot be targetted by watcher overwatch
#define TRAIT_OVERWATCH_IMMUNE "overwatch_immune"

//non-mob traits
/// Used for limb-based paralysis, where replacing the limb will fix it.
Expand Down Expand Up @@ -974,6 +978,13 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define CHOKING_TRAIT "choking_trait"
/// Trait given by hallucinations
#define HALLUCINATION_TRAIT "hallucination_trait"
/// Trait given by simple/basic mob death
#define BASIC_MOB_DEATH_TRAIT "basic_mob_death"
/// Trait given by your current speed
#define SPEED_TRAIT "speed_trait"
/// Trait given to mobs that have been autopsied
#define AUTOPSY_TRAIT "autopsy_trait"


/**
* Trait granted by [/mob/living/carbon/Initialize] and
Expand Down
7 changes: 7 additions & 0 deletions code/_globalvars/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,13 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_MIMING" = TRAIT_MIMING,
"TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION" = TRAIT_PREVENT_IMPLANT_AUTO_EXPLOSION,
"TRAIT_UNOBSERVANT" = TRAIT_UNOBSERVANT,
"TRAIT_MORBID" = TRAIT_MORBID,
"TRAIT_UNDENSE" = TRAIT_UNDENSE,
"TRAIT_EXPANDED_FOV" = TRAIT_EXPANDED_FOV,
"TRAIT_GOOD_HEARING" = TRAIT_GOOD_HEARING,
"TRAIT_XRAY_HEARING" = TRAIT_XRAY_HEARING,
"TRAIT_TENTACLE_IMMUNE" = TRAIT_TENTACLE_IMMUNE,
"TRAIT_OVERWATCH_IMMUNE" = TRAIT_OVERWATCH_IMMUNE,
),
/obj/item/bodypart = list(
"TRAIT_PARALYSIS" = TRAIT_PARALYSIS,
Expand Down
2 changes: 1 addition & 1 deletion code/datums/actions/mobs/small_sprite.dm
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
small_icon_state = "ash_whelp"

/datum/action/small_sprite/megafauna/colossus
small_icon_state = "Basilisk"
small_icon_state = "basilisk"

/datum/action/small_sprite/megafauna/bubblegum
small_icon_state = "goliath2"
Expand Down
11 changes: 6 additions & 5 deletions code/datums/ai/_ai_behavior.dm
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,12 @@
/datum/ai_behavior/proc/finish_action(datum/ai_controller/controller, succeeded, ...)
LAZYREMOVE(controller.current_behaviors, src)
controller.behavior_args -= type
if(behavior_flags & AI_BEHAVIOR_REQUIRE_MOVEMENT) //If this was a movement task, reset our movement target if necessary
if(!(behavior_flags & AI_BEHAVIOR_KEEP_MOVE_TARGET_ON_FINISH))
clear_movement_target(controller)
if(!(behavior_flags & AI_BEHAVIOR_KEEP_MOVING_TOWARDS_TARGET_ON_FINISH))
controller.ai_movement.stop_moving_towards(controller)
if(!(behavior_flags & AI_BEHAVIOR_REQUIRE_MOVEMENT)) //If this was a movement task, reset our movement target if necessary
return
if(behavior_flags & AI_BEHAVIOR_KEEP_MOVE_TARGET_ON_FINISH)
return
clear_movement_target(controller)
controller.ai_movement.stop_moving_towards(controller)

/// Helper proc to ensure consistency in setting the source of the movement target
/datum/ai_behavior/proc/set_movement_target(datum/ai_controller/controller, atom/target, datum/ai_movement/new_movement)
Expand Down
82 changes: 82 additions & 0 deletions code/datums/ai/basic_mobs/basic_subtrees/maintain_distance.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
/// Step away if too close, or towards if too far
/datum/ai_planning_subtree/maintain_distance
/// Blackboard key holding atom we want to stay away from
var/target_key = BB_BASIC_MOB_CURRENT_TARGET
/// How close will we allow our target to get?
var/minimum_distance = 3
/// How far away will we allow our target to get?
var/maximum_distance = 6
/// How far do we look for our target?
var/view_distance = 10

/datum/ai_planning_subtree/maintain_distance/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
. = ..()
var/atom/target = controller.blackboard[target_key]
if (!isliving(target) || !can_see(controller.pawn, target, view_distance))
return // Don't run away from cucumbers, they're not snakes
var/range = get_dist(controller.pawn, target)
if (range < minimum_distance)
controller.queue_behavior(/datum/ai_behavior/step_away, target_key)
return
if (range > maximum_distance)
controller.queue_behavior(/datum/ai_behavior/pursue_to_range, target_key, maximum_distance)
return

/// Take one step away
/datum/ai_behavior/step_away
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION
required_distance = 0
action_cooldown = 0.2 SECONDS

/datum/ai_behavior/step_away/setup(datum/ai_controller/controller, target_key)
. = ..()
var/atom/current_target = controller.blackboard[target_key]
if (QDELETED(current_target))
return FALSE

var/mob/living/our_pawn = controller.pawn
our_pawn.face_atom(current_target)

var/turf/next_step = get_step_away(controller.pawn, current_target)
if (!isnull(next_step) && !next_step.is_blocked_turf(exclude_mobs = TRUE))
set_movement_target(controller, target = next_step, new_movement = /datum/ai_movement/basic_avoidance/backstep)
return TRUE

var/list/all_dirs = GLOB.alldirs.Copy()
all_dirs -= get_dir(controller.pawn, next_step)
all_dirs -= get_dir(controller.pawn, current_target)
shuffle_inplace(all_dirs)

for (var/dir in all_dirs)
next_step = get_step(controller.pawn, dir)
if (!isnull(next_step) && !next_step.is_blocked_turf(exclude_mobs = TRUE))
set_movement_target(controller, target = next_step, new_movement = /datum/ai_movement/basic_avoidance/backstep)
return TRUE
return FALSE

/datum/ai_behavior/step_away/perform(seconds_per_tick, datum/ai_controller/controller)
. = ..()
finish_action(controller, succeeded = TRUE)

/datum/ai_behavior/step_away/finish_action(datum/ai_controller/controller, succeeded)
. = ..()
controller.change_ai_movement_type(initial(controller.ai_movement))

/// Pursue a target until we are within a provided range
/datum/ai_behavior/pursue_to_range
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_MOVE_AND_PERFORM

/datum/ai_behavior/pursue_to_range/setup(datum/ai_controller/controller, target_key, range)
. = ..()
var/atom/current_target = controller.blackboard[target_key]
if (QDELETED(current_target))
return FALSE
if (get_dist(controller.pawn, current_target) <= range)
return FALSE
set_movement_target(controller, current_target)

/datum/ai_behavior/pursue_to_range/perform(seconds_per_tick, datum/ai_controller/controller, target_key, range)
var/atom/current_target = controller.blackboard[target_key]
if (!QDELETED(current_target) && get_dist(controller.pawn, current_target) > range)
return
finish_action(controller, succeeded = TRUE)
53 changes: 53 additions & 0 deletions code/datums/ai/basic_mobs/basic_subtrees/ranged_skirmish.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
/// Fire a ranged attack without interrupting movement.
/datum/ai_planning_subtree/ranged_skirmish
operational_datums = list(/datum/component/ranged_attacks)
/// Blackboard key holding target atom
var/target_key = BB_BASIC_MOB_CURRENT_TARGET
/// What AI behaviour do we actually run?
var/datum/ai_behavior/ranged_skirmish/attack_behavior = /datum/ai_behavior/ranged_skirmish

/datum/ai_planning_subtree/ranged_skirmish/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick)
. = ..()
var/atom/target = controller.blackboard[target_key]
if(QDELETED(target))
return
controller.queue_behavior(attack_behavior, target_key, BB_TARGETTING_DATUM, BB_BASIC_MOB_CURRENT_TARGET_HIDING_LOCATION)

/// How often will we try to perform our ranged attack?
/datum/ai_behavior/ranged_skirmish
action_cooldown = 1 SECONDS
/// If target is further away than this we don't fire
var/max_range = 9
/// If target is closer than this we don't fire
var/min_range = 2

/datum/ai_behavior/ranged_skirmish/setup(datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key)
. = ..()
var/atom/target = controller.blackboard[hiding_location_key] || controller.blackboard[target_key]
return !QDELETED(target)

/datum/ai_behavior/ranged_skirmish/perform(seconds_per_tick, datum/ai_controller/controller, target_key, targetting_datum_key, hiding_location_key)
. = ..()
var/atom/target = controller.blackboard[target_key]
if (QDELETED(target))
finish_action(controller, succeeded = FALSE)
return

var/datum/targetting_datum/targetting_datum = controller.blackboard[targetting_datum_key]
if(!targetting_datum.can_attack(controller.pawn, target))
finish_action(controller, succeeded = FALSE)
return

var/hiding_target = targetting_datum.find_hidden_mobs(controller.pawn, target)
controller.set_blackboard_key(hiding_location_key, hiding_target)

target = hiding_target || target

var/distance = get_dist(controller.pawn, target)
if (distance > max_range || distance < min_range)
finish_action(controller, succeeded = FALSE)
return

var/mob/living/basic/gunman = controller.pawn
gunman.RangedAttack(target)
finish_action(controller, succeeded = TRUE)
8 changes: 7 additions & 1 deletion code/datums/ai/movement/ai_movement_basic_avoidance.dm
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
///Uses Byond's basic obstacle avoidance movement
/datum/ai_movement/basic_avoidance
max_pathing_attempts = 10
/// Movement flags to pass to the loop
var/move_flags = NONE

/datum/ai_movement/basic_avoidance/start_moving_towards(datum/ai_controller/controller, atom/current_movement_target, min_distance)
. = ..()
var/atom/movable/moving = controller.pawn
var/min_dist = controller.blackboard[BB_CURRENT_MIN_MOVE_DISTANCE]
var/delay = controller.movement_delay
var/datum/move_loop/loop = SSmove_manager.move_to(moving, current_movement_target, min_dist, delay, subsystem = SSai_movement, extra_info = controller)
var/datum/move_loop/loop = SSmove_manager.move_to(moving, current_movement_target, min_dist, delay, flags = move_flags, subsystem = SSai_movement, extra_info = controller)
RegisterSignal(loop, COMSIG_MOVELOOP_PREPROCESS_CHECK, PROC_REF(pre_move))
RegisterSignal(loop, COMSIG_MOVELOOP_POSTPROCESS, PROC_REF(post_move))

Expand All @@ -18,3 +20,7 @@
if(is_type_in_typecache(target_turf, GLOB.dangerous_turfs))
. = FALSE
return .

/// Move immediately and don't update our facing
/datum/ai_movement/basic_avoidance/backstep
move_flags = MOVEMENT_LOOP_START_FAST | MOVEMENT_LOOP_NO_DIR_UPDATE
1 change: 1 addition & 0 deletions code/datums/components/ai_retaliate_advanced.dm
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/**
* 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.
* Differs from the element as it passes new entries through a callback.
*/
/datum/component/ai_retaliate_advanced
/// Callback to a mob for custom behaviour
Expand Down
8 changes: 4 additions & 4 deletions code/datums/components/basic_mob_attack_telegraph.dm
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
/datum/component/basic_mob_attack_telegraph/Initialize(
telegraph_icon = 'icons/mob/telegraphing/telegraph.dmi',
telegraph_state = ATTACK_EFFECT_BITE,
telegraph_duration = 0.3 SECONDS,
telegraph_duration = 0.4 SECONDS,
datum/callback/on_began_forecast,
)
. = ..()
Expand All @@ -40,7 +40,7 @@
/// When we attempt to attack, check if it is allowed
/datum/component/basic_mob_attack_telegraph/proc/on_attack(mob/living/basic/source, atom/target)
SIGNAL_HANDLER
if (!isliving(target))
if (!(isliving(target) || ismecha(target))) // Curse you CLARKE
return
if (HAS_TRAIT_FROM(source, TRAIT_BASIC_ATTACK_FORECAST, REF(src)))
REMOVE_TRAIT(source, TRAIT_BASIC_ATTACK_FORECAST, REF(src))
Expand All @@ -51,7 +51,7 @@
return COMPONENT_HOSTILE_NO_ATTACK

/// Perform an attack after a delay
/datum/component/basic_mob_attack_telegraph/proc/delayed_attack(mob/living/basic/source, mob/living/target)
/datum/component/basic_mob_attack_telegraph/proc/delayed_attack(mob/living/basic/source, atom/target)
current_target = target
target.add_overlay(target_overlay)
RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(forget_target))
Expand All @@ -68,7 +68,7 @@
source.melee_attack(target)

/// The guy we're trying to attack moved, is he still in range?
/datum/component/basic_mob_attack_telegraph/proc/target_moved(mob/living/target)
/datum/component/basic_mob_attack_telegraph/proc/target_moved(atom/target)
SIGNAL_HANDLER
if (in_range(parent, target))
return
Expand Down
Loading

0 comments on commit f3bf27b

Please sign in to comment.