Skip to content
This repository was archived by the owner on May 22, 2025. It is now read-only.

Commit 1b9263d

Browse files
authored
Adds shadowflame gout spell to darkspawn warlock + merge thrall buttons (#22949)
* work work work * Should be done * linebreaks * Update shadowflame.dm
1 parent 78e1d4c commit 1b9263d

File tree

9 files changed

+154
-39
lines changed

9 files changed

+154
-39
lines changed

code/_onclick/hud/action_button.dm

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@
5959
if(usr.next_click > world.time)
6060
return
6161
usr.next_click = world.time + 1
62-
// var/trigger_flags
63-
// if(LAZYACCESS(modifiers, RIGHT_CLICK)) FUCK COMBAT MODE!!!!
64-
// trigger_flags |= TRIGGER_SECONDARY_ACTION
65-
linked_action.Trigger()
62+
var/trigger_flags
63+
if(LAZYACCESS(modifiers, RIGHT_CLICK))
64+
trigger_flags |= TRIGGER_SECONDARY_ACTION
65+
linked_action.Trigger(trigger_flags)
6666
SEND_SOUND(usr, get_sfx(SFX_TERMINAL_TYPE))
6767
transform = turn(matrix() * 0.9, pick(-8, 8))
6868
alpha = 200

code/datums/status_effects/debuffs/fire_stacks.dm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@
126126
id = "fire_stacks" //fire_stacks and wet_stacks should have different IDs or else has_status_effect won't work
127127
remove_on_fullheal = TRUE
128128

129-
enemy_types = list(/datum/status_effect/fire_handler/wet_stacks)
129+
enemy_types = list(/datum/status_effect/fire_handler/wet_stacks, /datum/status_effect/fire_handler/shadowflame)
130130
stack_modifier = 1
131131

132132
/// If we're on fire
@@ -278,7 +278,7 @@
278278
/datum/status_effect/fire_handler/wet_stacks
279279
id = "wet_stacks"
280280

281-
enemy_types = list(/datum/status_effect/fire_handler/fire_stacks)
281+
enemy_types = list(/datum/status_effect/fire_handler/fire_stacks, /datum/status_effect/fire_handler/shadowflame)
282282
stack_modifier = -1
283283

284284
/datum/status_effect/fire_handler/wet_stacks/tick(delta_time, times_fired)

yogstation.dme

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4238,6 +4238,7 @@
42384238
#include "yogstation\code\modules\antagonists\darkspawn\darkspawn_objects\scout_traps.dm"
42394239
#include "yogstation\code\modules\antagonists\darkspawn\darkspawn_objects\shadow_caster.dm"
42404240
#include "yogstation\code\modules\antagonists\darkspawn\darkspawn_objects\shadow_step.dm"
4241+
#include "yogstation\code\modules\antagonists\darkspawn\darkspawn_objects\shadowflame.dm"
42414242
#include "yogstation\code\modules\antagonists\darkspawn\darkspawn_objects\thrall_tumor.dm"
42424243
#include "yogstation\code\modules\antagonists\darkspawn\darkspawn_objects\umbral_tendrils.dm"
42434244
#include "yogstation\code\modules\antagonists\darkspawn\darkspawn_objects\veil_camera.dm"

yogstation/code/modules/antagonists/darkspawn/_psi_web.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@
124124
name = "warlock innate abilities"
125125
desc = "apartment \"complex\"... really? I find it quite simple"
126126
shadow_flags = DARKSPAWN_WARLOCK
127-
learned_abilities = list(/datum/action/cooldown/spell/touch/thrall_mind, /datum/action/cooldown/spell/release_thrall, /datum/action/cooldown/spell/pointed/darkspawn_build/thrall_cam, /datum/action/cooldown/spell/pointed/darkspawn_build/thrall_eye, /datum/action/cooldown/spell/toggle/dark_staff)
127+
learned_abilities = list(/datum/action/cooldown/spell/touch/thrall_mind, /datum/action/cooldown/spell/pointed/darkspawn_build/thrall_cam, /datum/action/cooldown/spell/pointed/darkspawn_build/thrall_eye, /datum/action/cooldown/spell/toggle/dark_staff)
128128

129129
/datum/psi_web/warlock/on_gain()
130130
darkspawn.psi_cap *= 2

yogstation/code/modules/antagonists/darkspawn/darkspawn_abilities/core_abilities.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
//////////////////////////////////////////////////////////////////////////
1919
/datum/action/cooldown/spell/touch/devour_will
2020
name = "Devour Will"
21-
desc = "Creates a dark bead that can be used on a human to begin draining the lucidity and willpower from a living target, knocking them unconscious for a time. Being interrupted will knock you down for a time."
21+
desc = "Creates a dark bead that can be used on a human to begin draining the lucidity and willpower from a living target, knocking them unconscious for a time.<br>Being interrupted will knock you down for a time."
2222
panel = "Darkspawn"
2323
button_icon = 'yogstation/icons/mob/actions/actions_darkspawn.dmi'
2424
sound = null

yogstation/code/modules/antagonists/darkspawn/darkspawn_abilities/thrall_spells.dm

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
//////////////////////////////////////////////////////////////////////////
44
/datum/action/cooldown/spell/touch/thrall_mind
55
name = "Thrall mind"
6-
desc = "Consume 1 willpower to thrall a target's mind. To be eligible, they must be alive and recently drained by Devour Will. Can also be used to revive deceased thralls."
6+
desc = "Consume 1 willpower to thrall a target's mind.<br>To be eligible, they must be alive and recently drained by Devour Will.<br>Can also be used to revive deceased thralls.<br>Right-click to release thralls from your control."
77
button_icon = 'yogstation/icons/mob/actions/actions_darkspawn.dmi'
88
background_icon_state = "bg_alien"
99
overlay_icon_state = "bg_alien_border"
@@ -19,6 +19,12 @@
1919
///Willpower spent by the darkspawn datum to thrall a mind
2020
var/willpower_cost = 1
2121

22+
/datum/action/cooldown/spell/touch/thrall_mind/Trigger(trigger_flags, atom/target)
23+
if(trigger_flags & TRIGGER_SECONDARY_ACTION)
24+
release_thrall()
25+
return
26+
return ..()
27+
2228
/datum/action/cooldown/spell/touch/thrall_mind/can_cast_spell(feedback)
2329
var/datum/antagonist/darkspawn/master = isdarkspawn(owner)
2430
if(master && master.willpower < willpower_cost)
@@ -116,34 +122,10 @@
116122
to_chat(owner, span_velvet("Your power is incapable of controlling <b>[target].</b>"))
117123
return TRUE
118124

119-
//////////////////////////////////////////////////////////////////////////
120-
//----------------------------Get rid of a thrall-----------------------//
121-
//////////////////////////////////////////////////////////////////////////
122-
/datum/action/cooldown/spell/release_thrall
123-
name = "Release thrall"
124-
desc = "Release a thrall from your control, freeing your power to be redistributed and restoring a portion of the spent willpower."
125-
button_icon = 'yogstation/icons/mob/actions/actions_darkspawn.dmi'
126-
background_icon_state = "bg_alien"
127-
overlay_icon_state = "bg_alien_border"
128-
buttontooltipstyle = "alien"
129-
button_icon_state = "veiling_touch"
130-
antimagic_flags = NONE
131-
panel = "Darkspawn"
132-
check_flags = AB_CHECK_CONSCIOUS
133-
spell_requirements = SPELL_CASTABLE_AS_BRAIN
134-
135-
/datum/action/cooldown/spell/release_thrall/can_cast_spell(feedback)
136-
var/datum/antagonist/darkspawn/dude = isdarkspawn(owner)
137-
if(dude && istype(dude))
138-
var/datum/team/darkspawn/team = dude.get_team()
139-
if(team &&!LAZYLEN(team.thralls))
140-
if(feedback)
141-
to_chat(owner, "You have no thralls to release.")
142-
return
143-
return ..()
144-
145-
/datum/action/cooldown/spell/release_thrall/cast(atom/cast_on)
146-
. = ..()
125+
/**
126+
* Release a thrall if right click
127+
*/
128+
/datum/action/cooldown/spell/touch/thrall_mind/proc/release_thrall()
147129
if(!isdarkspawn(owner))
148130
return
149131

@@ -153,6 +135,10 @@
153135

154136
var/datum/team/darkspawn/team = dude.get_team()
155137

138+
if(!LAZYLEN(team.thralls))
139+
to_chat(owner, "You have no thralls to release.")
140+
return
141+
156142
var/loser = tgui_input_list(owner, "Select a thrall to release from your control.", "Release a thrall", team.thralls)
157143
if(!loser || !istype(loser, /datum/mind))
158144
return

yogstation/code/modules/antagonists/darkspawn/darkspawn_abilities/warlock_abilities.dm

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -552,6 +552,8 @@
552552
name = "echoing void"
553553
icon = 'yogstation/icons/effects/effects.dmi'
554554
icon_state = "nothing"
555+
anchored = TRUE
556+
move_resist = INFINITY
555557

556558
/obj/effect/temp_visual/darkspawn/chasm //a slow field that eventually explodes
557559
icon_state = "consuming"
@@ -693,3 +695,42 @@
693695

694696
/datum/action/cooldown/spell/pointed/null_burst/proc/spawn_ground(turf/target)
695697
new /obj/effect/temp_visual/darkspawn/chasm(target)
698+
699+
//////////////////////////////////////////////////////////////////////////
700+
//----------------------I stole genetics fire breath--------------------//
701+
//////////////////////////////////////////////////////////////////////////
702+
/datum/action/cooldown/spell/cone/staggered/shadowflame
703+
name = "Shadowflame Gout"
704+
desc = "Release a burst of shadowflame, rapidly sapping the heat of any individual."
705+
button_icon = 'yogstation/icons/mob/actions/actions_darkspawn.dmi'
706+
background_icon_state = "bg_alien"
707+
overlay_icon_state = "bg_alien_border"
708+
buttontooltipstyle = "alien"
709+
button_icon_state = "veiling_touch"
710+
panel = "Darkspawn"
711+
sound = 'sound/magic/demon_dies.ogg'
712+
713+
school = SCHOOL_EVOCATION
714+
invocation_type = INVOCATION_NONE
715+
spell_requirements = NONE
716+
antimagic_flags = MAGIC_RESISTANCE_MIND
717+
check_flags = AB_CHECK_CONSCIOUS
718+
cooldown_time = 60 SECONDS
719+
resource_costs = list(ANTAG_RESOURCE_DARKSPAWN = 100) //dangerous, high CC, and area denial
720+
721+
delay_between_level = 0.3 SECONDS //longer delay
722+
cone_levels = 5 //longer cone
723+
respect_density = TRUE
724+
725+
/datum/action/cooldown/spell/cone/staggered/shadowflame/do_turf_cone_effect(turf/target_turf, atom/caster, level)
726+
target_turf.extinguish_turf()
727+
new /obj/effect/temp_visual/darkspawn/shadowflame(target_turf) // for style
728+
729+
/datum/action/cooldown/spell/cone/staggered/shadowflame/do_mob_cone_effect(mob/living/target_mob, atom/caster, level)
730+
target_mob.set_wet_stacks(20, /datum/status_effect/fire_handler/shadowflame)
731+
732+
/datum/action/cooldown/spell/cone/staggered/shadowflame/calculate_cone_shape(current_level)
733+
// This makes the cone shoot out into a 3 wide column of flames.
734+
// You may be wondering, "that equation doesn't seem like it'd make a 3 wide column"
735+
// well it does, and that's all that matters.
736+
return (2 * current_level) - 1
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
//////////////////////////////////////////////////////////////////////////
2+
//--------------------------Cold Fire instead of hot--------------------//
3+
//////////////////////////////////////////////////////////////////////////
4+
/obj/effect/dummy/lighting_obj/moblight/shadowflame
5+
name = "fire"
6+
light_power = -1
7+
light_range = LIGHT_RANGE_FIRE
8+
light_color = COLOR_VELVET
9+
10+
/datum/status_effect/fire_handler/shadowflame
11+
id = "shadowflame"
12+
override_types = list(/datum/status_effect/fire_handler/fire_stacks, /datum/status_effect/fire_handler/wet_stacks)
13+
stack_modifier = -1
14+
/// Reference to the mob light emitter itself
15+
var/obj/effect/dummy/lighting_obj/moblight
16+
/// Type of mob light emitter we use when on fire
17+
var/moblight_type = /obj/effect/dummy/lighting_obj/moblight/shadowflame
18+
//how cold this fire is
19+
var/temperature = 0
20+
21+
/datum/status_effect/fire_handler/shadowflame/on_apply()
22+
. = ..()
23+
owner.add_emitter(/obj/emitter/fire/shadow, "shadowflame")
24+
25+
/datum/status_effect/fire_handler/shadowflame/on_remove()
26+
owner.remove_emitter("shadowflame")
27+
return ..()
28+
29+
/datum/status_effect/fire_handler/shadowflame/tick(delta_time, times_fired)
30+
adjust_stacks(-0.75 * delta_time SECONDS) //change this number to make it last a shorter duration
31+
if(stacks <= 0)
32+
qdel(src)
33+
return
34+
35+
if(is_team_darkspawn(owner) || !ishuman(owner))
36+
return
37+
38+
var/mob/living/carbon/human/victim = owner
39+
var/thermal_multiplier = 1 - victim.get_cold_protection(temperature)
40+
41+
var/calculated_cooling = (BODYTEMP_COOLING_MAX - (stacks * 12)) * 0.5 * (delta_time SECONDS) * thermal_multiplier
42+
victim.adjust_bodytemperature(calculated_cooling, temperature)
43+
44+
if(HAS_TRAIT(victim, TRAIT_RESISTCOLD) || !calculated_cooling)
45+
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "on_fire")
46+
else
47+
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire)
48+
49+
/// Cold purple turf fire
50+
/obj/effect/temp_visual/darkspawn/shadowflame
51+
icon = 'icons/effects/turf_fire.dmi'
52+
icon_state = "white_big"
53+
layer = GASFIRE_LAYER
54+
light_system = MOVABLE_LIGHT //we make it a movable light because static lights colour is handled weirdly
55+
light_power = -1
56+
light_range = LIGHT_RANGE_FIRE
57+
light_color = COLOR_VELVET
58+
color = COLOR_DARKSPAWN_PSI
59+
mouse_opacity = FALSE
60+
duration = 10 SECONDS
61+
62+
/obj/effect/temp_visual/darkspawn/shadowflame/Initialize(mapload)
63+
. = ..()
64+
START_PROCESSING(SSfastprocess, src)
65+
66+
/obj/effect/temp_visual/darkspawn/shadowflame/Destroy()
67+
STOP_PROCESSING(SSfastprocess, src)
68+
return ..()
69+
70+
/obj/effect/temp_visual/darkspawn/shadowflame/process(delta_time)
71+
var/turf/placement = get_turf(src)
72+
for(var/mob/living/target_mob in placement.contents)
73+
target_mob.set_wet_stacks(20, /datum/status_effect/fire_handler/shadowflame)
74+
75+
/obj/emitter/fire/shadow
76+
pixel_y = -16 //so it aligns with the floor
77+
fire_colour = COLOR_VELVET

yogstation/code/modules/antagonists/darkspawn/darkspawn_upgrades/offensive_upgrades.dm

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@
147147
desc = "Empower your staff with the ability to consume the light of anything shot."
148148
lore_description = "The Aaah'ryt sigil, representing consumption, is etched onto the staff."
149149
icon_state = "lighteater_sign"
150-
willpower_cost = 2
150+
willpower_cost = 1
151151
shadow_flags = DARKSPAWN_WARLOCK
152152
menu_tab = STORE_OFFENSE
153153
flag_to_add = STAFF_UPGRADE_LIGHTEATER
@@ -193,6 +193,16 @@
193193
menu_tab = STORE_OFFENSE
194194
learned_abilities = list(/datum/action/cooldown/spell/pointed/darkspawn_build/abyssal_call)
195195

196+
/datum/psi_web/shadowflame
197+
name = "Shadowflame Gout"
198+
desc = "Release a burst of shadowflame, rapidly sapping the heat of any individual."
199+
lore_description = "An abhorrent inversion of the natural laws of thermodynamics."
200+
icon_state = "veiling_touch" //needs an icon
201+
willpower_cost = 2
202+
shadow_flags = DARKSPAWN_WARLOCK
203+
menu_tab = STORE_OFFENSE
204+
learned_abilities = list(/datum/action/cooldown/spell/cone/staggered/shadowflame)
205+
196206
/datum/psi_web/shadow_beam
197207
name = "Void Beam"
198208
desc = "After a short delay, fire a huge beam of void terrain across the entire station."
@@ -207,7 +217,7 @@
207217
name = "Null Burst"
208218
desc = "After a short delay, create an explosion of void terrain at the targeted location."
209219
lore_description = "Tears a portion of reality into the void for a short duration."
210-
icon_state = "null_burst" //needs an icon
220+
icon_state = "null_burst"
211221
willpower_cost = 3
212222
shadow_flags = DARKSPAWN_WARLOCK
213223
menu_tab = STORE_OFFENSE

0 commit comments

Comments
 (0)