-
-
Notifications
You must be signed in to change notification settings - Fork 444
/
Copy pathvoid_magnet.dm
81 lines (62 loc) · 2.69 KB
/
void_magnet.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
/datum/mutation/human/void
name = "Void Magnet"
desc = "A rare genome that attracts odd forces not usually observed."
quality = MINOR_NEGATIVE //upsides and downsides
text_gain_indication = "<span class='notice'>You feel a heavy, dull force just beyond the walls watching you.</span>"
instability = 30
power_path = /datum/action/cooldown/spell/void/cursed
energy_coeff = 1
synchronizer_coeff = 1
/datum/mutation/human/void/modify()
. = ..()
var/datum/action/cooldown/spell/void/cursed/to_modify = .
if(!istype(to_modify)) // null or invalid
return
to_modify.curse_probability_modifier = GET_MUTATION_SYNCHRONIZER(src)
return .
/// The base "void invocation" action. No side effects.
/datum/action/cooldown/spell/void
name = "Invoke Void"
desc = "Pulls you into a pocket of the void temporarily, making you invincible."
button_icon_state = "void_magnet"
school = SCHOOL_EVOCATION
cooldown_time = 1 MINUTES
invocation = "DOOOOOOOOOOOOOOOOOOOOM!!!"
invocation_type = INVOCATION_SHOUT
spell_requirements = NONE
antimagic_flags = NONE
/datum/action/cooldown/spell/void/is_valid_target(atom/cast_on)
return isturf(cast_on.loc) && isliving(cast_on)
/datum/action/cooldown/spell/void/cast(mob/living/cast_on)
. = ..()
cast_on.apply_status_effect(STATUS_EFFECT_VOIDED)
/// The cursed "void invocation" action, that has a chance of casting itself on its owner randomly on life ticks.
/datum/action/cooldown/spell/void/cursed
name = "Convoke Void" //magic the gathering joke here
desc = "A rare genome that attracts odd forces not usually observed. May sometimes pull you in randomly."
/// A multiplier applied to the probability of the curse appearing every life tick
var/curse_probability_modifier = 1
/datum/action/cooldown/spell/void/cursed/Grant(mob/grant_to)
. = ..()
if(!owner)
return
RegisterSignal(grant_to, COMSIG_LIVING_LIFE, PROC_REF(on_life))
/datum/action/cooldown/spell/void/cursed/Remove(mob/remove_from)
UnregisterSignal(remove_from, COMSIG_LIVING_LIFE)
return ..()
/// Signal proc for [COMSIG_LIVING_LIFE]. Has a chance of casting itself randomly.
/datum/action/cooldown/spell/void/cursed/proc/on_life(mob/living/source, seconds_per_tick, times_fired)
SIGNAL_HANDLER
if(!isliving(source) || IS_IN_STASIS(source) || source.stat == DEAD || source.notransform)
return
if(!is_valid_target(source))
return
var/prob_of_curse = 0.25
var/mob/living/carbon/carbon_source = source
if(istype(carbon_source) && carbon_source.dna)
// If we have DNA, the probability of curse changes based on how stable we are
prob_of_curse += ((100 - carbon_source.dna.stability) / 40)
prob_of_curse *= curse_probability_modifier
if(!DT_PROB(prob_of_curse, seconds_per_tick))
return
cast(source)