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

Commit 8e472fb

Browse files
committed
Should be done
1 parent 2d42791 commit 8e472fb

File tree

8 files changed

+138
-104
lines changed

8 files changed

+138
-104
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: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,15 +126,13 @@
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
133133
var/on_fire = FALSE
134134
/// Stores current fire overlay icon state, for optimisation purposes
135135
var/last_icon_state
136-
/// The typepath of the particle used
137-
var/particle_type = /particles/embers
138136
/// Reference to the mob light emitter itself
139137
var/obj/effect/dummy/lighting_obj/moblight
140138
/// Type of mob light emitter we use when on fire
@@ -166,7 +164,7 @@
166164
/datum/status_effect/fire_handler/fire_stacks/update_particles()
167165
if(on_fire)
168166
if(!particle_effect)
169-
particle_effect = new(owner, particle_type)
167+
particle_effect = new(owner, /particles/embers)
170168
if(stacks > MOB_BIG_FIRE_STACK_THRESHOLD)
171169
particle_effect.particles.spawning = 5
172170
else
@@ -280,7 +278,7 @@
280278
/datum/status_effect/fire_handler/wet_stacks
281279
id = "wet_stacks"
282280

283-
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)
284282
stack_modifier = -1
285283

286284
/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/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. To be eligible, they must be alive and recently drained by Devour Will. 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: 25 additions & 63 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"
@@ -698,77 +700,37 @@
698700
//----------------------I stole genetics fire breath--------------------//
699701
//////////////////////////////////////////////////////////////////////////
700702
/datum/action/cooldown/spell/cone/staggered/shadowflame
701-
name = "Fire Breath"
702-
desc = "You breathe a cone of fire directly in front of you."
703-
button_icon_state = "fireball"
704-
sound = 'sound/magic/demon_dies.ogg' //horrifying lizard noises
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'
705712

706713
school = SCHOOL_EVOCATION
707-
cooldown_time = 40 SECONDS
708714
invocation_type = INVOCATION_NONE
709715
spell_requirements = NONE
710-
antimagic_flags = 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
711720

712-
cone_levels = 3
721+
delay_between_level = 0.3 SECONDS //longer delay
722+
cone_levels = 5 //longer cone
713723
respect_density = TRUE
714-
/// The range our user is thrown backwards after casting the spell
715-
var/self_throw_range = 1
716-
/// The max point-blank damage dealt by the cone
717-
var/max_damage = 25
718724

719725
/datum/action/cooldown/spell/cone/staggered/shadowflame/do_turf_cone_effect(turf/target_turf, atom/caster, level)
720-
new /obj/effect/abstract/turf_fire/shadow(target_turf, power, fire_color)
721-
// Further turfs experience less exposed_temperature and exposed_volume
722-
new /obj/effect/hotspot(target_turf) // for style
723-
target_turf.hotspot_expose(max(500, 900 - (100 * level)), max(50, 200 - (50 * level)), 1)
726+
target_turf.extinguish_turf()
727+
new /obj/effect/temp_visual/darkspawn/shadowflame(target_turf) // for style
724728

725729
/datum/action/cooldown/spell/cone/staggered/shadowflame/do_mob_cone_effect(mob/living/target_mob, atom/caster, level)
726-
target_mob.adjust_fire_stacks(20, /datum/status_effect/fire_handler/fire_stacks/shadowflame)
727-
target_mob.ignite_mob()
728-
729-
730-
/// Cold purple turf fire
731-
/obj/effect/abstract/turf_fire/shadow
732-
light_power = -1.5
733-
light_color = COLOR_VELVET
734-
interact_with_atmos = FALSE //we don't interact with atmos, but we do lose power over time, despite technically being magical
735-
hex_color = COLOR_VELVET
730+
target_mob.set_wet_stacks(20, /datum/status_effect/fire_handler/shadowflame)
736731

737-
738-
//might be WAY too dark
739-
/particles/embers/shadow
740-
gradient = list(COLOR_VELVET, COLOR_DARKSPAWN_PSI, COLOR_BLACK)
741-
742-
743-
//////////////////////////////////////////////////////////////////////////
744-
//--------------------------Cold Fire instead of hot--------------------//
745-
//////////////////////////////////////////////////////////////////////////
746-
/obj/effect/dummy/lighting_obj/moblight/shadowflame
747-
name = "fire"
748-
light_color = COLOR_VELVET
749-
light_range = LIGHT_RANGE_FIRE
750-
light_power = -1
751-
752-
/datum/status_effect/fire_handler/fire_stacks/shadowflame
753-
particle_type = /particles/embers/shadow
754-
moblight_type = /obj/effect/dummy/lighting_obj/moblight/shadowflame
755-
//how cold this fire is
756-
var/temperature = 0
757-
758-
//no hotspot
759-
/datum/status_effect/fire_handler/fire_stacks/shadowflame/deal_damage(seconds_per_tick)
760-
if(is_team_darkspawn(owner))
761-
return
762-
owner.on_fire_stack(seconds_per_tick, src)
763-
764-
/datum/status_effect/fire_handler/fire_stacks/shadowflame/harm_human(seconds_per_tick, no_protection = FALSE)
765-
var/mob/living/carbon/human/victim = owner
766-
var/thermal_multiplier = 1 - victim.get_cold_protection(temperature)
767-
768-
var/calculated_cooling = (BODYTEMP_COOLING_MAX - (stacks * 12)) * 0.5 * seconds_per_tick * thermal_multiplier
769-
victim.adjust_bodytemperature(calculated_cooling, temperature)
770-
771-
if(HAS_TRAIT(victim, TRAIT_RESISTCOLD) || !calculated_cooling)
772-
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "on_fire")
773-
else
774-
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire)
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(-1 * 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)