-
-
Notifications
You must be signed in to change notification settings - Fork 444
/
Copy pathmonstertrack.dm
81 lines (75 loc) · 3.45 KB
/
monstertrack.dm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/// From 'Cellular Emporium'... somehow?
/datum/action/cooldown/bloodsucker/trackvamp
name = "Track Monster"
desc = "Take a moment to look for clues of any nearby monsters.<br>These creatures are slippery, and often look like the crew."
background_icon = 'icons/mob/actions/actions_bloodsucker.dmi'
button_icon = 'icons/mob/actions/actions_bloodsucker.dmi'
background_icon_state = "vamp_power_off"
button_icon_state = "power_hunter"
power_flags = BP_AM_STATIC_COOLDOWN
check_flags = BP_CANT_USE_WHILE_INCAPACITATED|BP_CANT_USE_WHILE_UNCONSCIOUS
purchase_flags = NONE
cooldown_time = 30 SECONDS
bloodcost = 0
/// Removed, set to TRUE to re-add, either here to be a default function, or in-game through VV for neat Admin stuff -Willard
var/give_pinpointer = FALSE
/datum/action/cooldown/bloodsucker/trackvamp/ActivatePower()
. = ..()
/// Return text indicating direction
to_chat(owner, span_notice("You look around, scanning your environment and discerning signs of any filthy, wretched affronts to the natural order..."))
if(!do_after(owner, 6 SECONDS))
to_chat(owner,span_warning("You were interrupted and lost the tracks!"))
DeactivatePower()
return
if(give_pinpointer)
var/mob/living/user = owner
user.apply_status_effect(/datum/status_effect/agent_pinpointer/hunter_edition)
display_proximity()
DeactivatePower()
/datum/action/cooldown/bloodsucker/trackvamp/proc/display_proximity()
/// Pick target
var/turf/my_loc = get_turf(owner)
var/closest_dist = 9999
var/mob/living/closest_monster
/// Track ALL living Monsters.
var/list/datum/mind/monsters = list()
for(var/mob/living/carbon/all_carbons in GLOB.alive_mob_list)
if(all_carbons == owner) //don't track ourselves!
continue
if(!all_carbons.mind)
continue
var/datum/mind/carbon_minds = all_carbons.mind
if(IS_HERETIC(all_carbons) || IS_BLOODSUCKER(all_carbons) || iscultist(all_carbons) || is_servant_of_ratvar(all_carbons) || IS_WIZARD(all_carbons))
monsters += carbon_minds
if(carbon_minds.has_antag_datum(/datum/antagonist/changeling))
monsters += carbon_minds
if(carbon_minds.has_antag_datum(/datum/antagonist/sinfuldemon))
monsters += carbon_minds
if(carbon_minds.has_antag_datum(/datum/antagonist/ashwalker))
monsters += carbon_minds
if(carbon_minds.has_antag_datum(/datum/antagonist/vampire)) //yogs, still supporting vampires!
monsters += carbon_minds
if(carbon_minds.has_antag_datum(/datum/antagonist/darkspawn)) //yogs, darkspawns
monsters += carbon_minds
for(var/datum/mind/monster_minds in monsters)
if(!monster_minds.current || monster_minds.current == owner) // || !get_turf(M.current) || !get_turf(owner))
continue
for(var/antag_datums in monster_minds.antag_datums)
var/datum/antagonist/antag_datum = antag_datums
if(!istype(antag_datum))
continue
var/their_loc = get_turf(monster_minds.current)
var/distance = get_dist_euclidian(my_loc, their_loc)
/// Found One: Closer than previous/max distance
if(distance < closest_dist && distance <= HUNTER_SCAN_MAX_DISTANCE)
closest_dist = distance
closest_monster = monster_minds.current
/// Stop searching through my antag datums and go to the next guy
break
/// Found one!
if(closest_monster)
var/distString = closest_dist <= HUNTER_SCAN_MAX_DISTANCE / 2 ? "<b>somewhere nearby!</b>" : "somewhere in the distance."
to_chat(owner, span_warning("You detect signs of monsters [distString]"))
/// Will yield a "?"
else
to_chat(owner, span_notice("There are no monsters nearby."))