Adds shadowflame gout spell to darkspawn warlock + merge thrall buttons (#22949)

* work work work

* Should be done

* linebreaks

* Update shadowflame.dm
This commit is contained in:
Molti
2025-01-11 19:55:15 -06:00
committed by GitHub
parent 78e1d4c844
commit 1b9263dcd0
9 changed files with 154 additions and 39 deletions

View File

@@ -59,10 +59,10 @@
if(usr.next_click > world.time)
return
usr.next_click = world.time + 1
// var/trigger_flags
// if(LAZYACCESS(modifiers, RIGHT_CLICK)) FUCK COMBAT MODE!!!!
// trigger_flags |= TRIGGER_SECONDARY_ACTION
linked_action.Trigger()
var/trigger_flags
if(LAZYACCESS(modifiers, RIGHT_CLICK))
trigger_flags |= TRIGGER_SECONDARY_ACTION
linked_action.Trigger(trigger_flags)
SEND_SOUND(usr, get_sfx(SFX_TERMINAL_TYPE))
transform = turn(matrix() * 0.9, pick(-8, 8))
alpha = 200

View File

@@ -126,7 +126,7 @@
id = "fire_stacks" //fire_stacks and wet_stacks should have different IDs or else has_status_effect won't work
remove_on_fullheal = TRUE
enemy_types = list(/datum/status_effect/fire_handler/wet_stacks)
enemy_types = list(/datum/status_effect/fire_handler/wet_stacks, /datum/status_effect/fire_handler/shadowflame)
stack_modifier = 1
/// If we're on fire
@@ -278,7 +278,7 @@
/datum/status_effect/fire_handler/wet_stacks
id = "wet_stacks"
enemy_types = list(/datum/status_effect/fire_handler/fire_stacks)
enemy_types = list(/datum/status_effect/fire_handler/fire_stacks, /datum/status_effect/fire_handler/shadowflame)
stack_modifier = -1
/datum/status_effect/fire_handler/wet_stacks/tick(delta_time, times_fired)

View File

@@ -4238,6 +4238,7 @@
#include "yogstation\code\modules\antagonists\darkspawn\darkspawn_objects\scout_traps.dm"
#include "yogstation\code\modules\antagonists\darkspawn\darkspawn_objects\shadow_caster.dm"
#include "yogstation\code\modules\antagonists\darkspawn\darkspawn_objects\shadow_step.dm"
#include "yogstation\code\modules\antagonists\darkspawn\darkspawn_objects\shadowflame.dm"
#include "yogstation\code\modules\antagonists\darkspawn\darkspawn_objects\thrall_tumor.dm"
#include "yogstation\code\modules\antagonists\darkspawn\darkspawn_objects\umbral_tendrils.dm"
#include "yogstation\code\modules\antagonists\darkspawn\darkspawn_objects\veil_camera.dm"

View File

@@ -124,7 +124,7 @@
name = "warlock innate abilities"
desc = "apartment \"complex\"... really? I find it quite simple"
shadow_flags = DARKSPAWN_WARLOCK
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)
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)
/datum/psi_web/warlock/on_gain()
darkspawn.psi_cap *= 2

View File

@@ -18,7 +18,7 @@
//////////////////////////////////////////////////////////////////////////
/datum/action/cooldown/spell/touch/devour_will
name = "Devour Will"
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."
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."
panel = "Darkspawn"
button_icon = 'yogstation/icons/mob/actions/actions_darkspawn.dmi'
sound = null

View File

@@ -3,7 +3,7 @@
//////////////////////////////////////////////////////////////////////////
/datum/action/cooldown/spell/touch/thrall_mind
name = "Thrall mind"
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."
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."
button_icon = 'yogstation/icons/mob/actions/actions_darkspawn.dmi'
background_icon_state = "bg_alien"
overlay_icon_state = "bg_alien_border"
@@ -19,6 +19,12 @@
///Willpower spent by the darkspawn datum to thrall a mind
var/willpower_cost = 1
/datum/action/cooldown/spell/touch/thrall_mind/Trigger(trigger_flags, atom/target)
if(trigger_flags & TRIGGER_SECONDARY_ACTION)
release_thrall()
return
return ..()
/datum/action/cooldown/spell/touch/thrall_mind/can_cast_spell(feedback)
var/datum/antagonist/darkspawn/master = isdarkspawn(owner)
if(master && master.willpower < willpower_cost)
@@ -116,34 +122,10 @@
to_chat(owner, span_velvet("Your power is incapable of controlling <b>[target].</b>"))
return TRUE
//////////////////////////////////////////////////////////////////////////
//----------------------------Get rid of a thrall-----------------------//
//////////////////////////////////////////////////////////////////////////
/datum/action/cooldown/spell/release_thrall
name = "Release thrall"
desc = "Release a thrall from your control, freeing your power to be redistributed and restoring a portion of the spent willpower."
button_icon = 'yogstation/icons/mob/actions/actions_darkspawn.dmi'
background_icon_state = "bg_alien"
overlay_icon_state = "bg_alien_border"
buttontooltipstyle = "alien"
button_icon_state = "veiling_touch"
antimagic_flags = NONE
panel = "Darkspawn"
check_flags = AB_CHECK_CONSCIOUS
spell_requirements = SPELL_CASTABLE_AS_BRAIN
/datum/action/cooldown/spell/release_thrall/can_cast_spell(feedback)
var/datum/antagonist/darkspawn/dude = isdarkspawn(owner)
if(dude && istype(dude))
var/datum/team/darkspawn/team = dude.get_team()
if(team &&!LAZYLEN(team.thralls))
if(feedback)
to_chat(owner, "You have no thralls to release.")
return
return ..()
/datum/action/cooldown/spell/release_thrall/cast(atom/cast_on)
. = ..()
/**
* Release a thrall if right click
*/
/datum/action/cooldown/spell/touch/thrall_mind/proc/release_thrall()
if(!isdarkspawn(owner))
return
@@ -153,6 +135,10 @@
var/datum/team/darkspawn/team = dude.get_team()
if(!LAZYLEN(team.thralls))
to_chat(owner, "You have no thralls to release.")
return
var/loser = tgui_input_list(owner, "Select a thrall to release from your control.", "Release a thrall", team.thralls)
if(!loser || !istype(loser, /datum/mind))
return

View File

@@ -552,6 +552,8 @@
name = "echoing void"
icon = 'yogstation/icons/effects/effects.dmi'
icon_state = "nothing"
anchored = TRUE
move_resist = INFINITY
/obj/effect/temp_visual/darkspawn/chasm //a slow field that eventually explodes
icon_state = "consuming"
@@ -693,3 +695,42 @@
/datum/action/cooldown/spell/pointed/null_burst/proc/spawn_ground(turf/target)
new /obj/effect/temp_visual/darkspawn/chasm(target)
//////////////////////////////////////////////////////////////////////////
//----------------------I stole genetics fire breath--------------------//
//////////////////////////////////////////////////////////////////////////
/datum/action/cooldown/spell/cone/staggered/shadowflame
name = "Shadowflame Gout"
desc = "Release a burst of shadowflame, rapidly sapping the heat of any individual."
button_icon = 'yogstation/icons/mob/actions/actions_darkspawn.dmi'
background_icon_state = "bg_alien"
overlay_icon_state = "bg_alien_border"
buttontooltipstyle = "alien"
button_icon_state = "veiling_touch"
panel = "Darkspawn"
sound = 'sound/magic/demon_dies.ogg'
school = SCHOOL_EVOCATION
invocation_type = INVOCATION_NONE
spell_requirements = NONE
antimagic_flags = MAGIC_RESISTANCE_MIND
check_flags = AB_CHECK_CONSCIOUS
cooldown_time = 60 SECONDS
resource_costs = list(ANTAG_RESOURCE_DARKSPAWN = 100) //dangerous, high CC, and area denial
delay_between_level = 0.3 SECONDS //longer delay
cone_levels = 5 //longer cone
respect_density = TRUE
/datum/action/cooldown/spell/cone/staggered/shadowflame/do_turf_cone_effect(turf/target_turf, atom/caster, level)
target_turf.extinguish_turf()
new /obj/effect/temp_visual/darkspawn/shadowflame(target_turf) // for style
/datum/action/cooldown/spell/cone/staggered/shadowflame/do_mob_cone_effect(mob/living/target_mob, atom/caster, level)
target_mob.set_wet_stacks(20, /datum/status_effect/fire_handler/shadowflame)
/datum/action/cooldown/spell/cone/staggered/shadowflame/calculate_cone_shape(current_level)
// This makes the cone shoot out into a 3 wide column of flames.
// You may be wondering, "that equation doesn't seem like it'd make a 3 wide column"
// well it does, and that's all that matters.
return (2 * current_level) - 1

View File

@@ -0,0 +1,77 @@
//////////////////////////////////////////////////////////////////////////
//--------------------------Cold Fire instead of hot--------------------//
//////////////////////////////////////////////////////////////////////////
/obj/effect/dummy/lighting_obj/moblight/shadowflame
name = "fire"
light_power = -1
light_range = LIGHT_RANGE_FIRE
light_color = COLOR_VELVET
/datum/status_effect/fire_handler/shadowflame
id = "shadowflame"
override_types = list(/datum/status_effect/fire_handler/fire_stacks, /datum/status_effect/fire_handler/wet_stacks)
stack_modifier = -1
/// Reference to the mob light emitter itself
var/obj/effect/dummy/lighting_obj/moblight
/// Type of mob light emitter we use when on fire
var/moblight_type = /obj/effect/dummy/lighting_obj/moblight/shadowflame
//how cold this fire is
var/temperature = 0
/datum/status_effect/fire_handler/shadowflame/on_apply()
. = ..()
owner.add_emitter(/obj/emitter/fire/shadow, "shadowflame")
/datum/status_effect/fire_handler/shadowflame/on_remove()
owner.remove_emitter("shadowflame")
return ..()
/datum/status_effect/fire_handler/shadowflame/tick(delta_time, times_fired)
adjust_stacks(-0.75 * delta_time SECONDS) //change this number to make it last a shorter duration
if(stacks <= 0)
qdel(src)
return
if(is_team_darkspawn(owner) || !ishuman(owner))
return
var/mob/living/carbon/human/victim = owner
var/thermal_multiplier = 1 - victim.get_cold_protection(temperature)
var/calculated_cooling = (BODYTEMP_COOLING_MAX - (stacks * 12)) * 0.5 * (delta_time SECONDS) * thermal_multiplier
victim.adjust_bodytemperature(calculated_cooling, temperature)
if(HAS_TRAIT(victim, TRAIT_RESISTCOLD) || !calculated_cooling)
SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "on_fire")
else
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire)
/// Cold purple turf fire
/obj/effect/temp_visual/darkspawn/shadowflame
icon = 'icons/effects/turf_fire.dmi'
icon_state = "white_big"
layer = GASFIRE_LAYER
light_system = MOVABLE_LIGHT //we make it a movable light because static lights colour is handled weirdly
light_power = -1
light_range = LIGHT_RANGE_FIRE
light_color = COLOR_VELVET
color = COLOR_DARKSPAWN_PSI
mouse_opacity = FALSE
duration = 10 SECONDS
/obj/effect/temp_visual/darkspawn/shadowflame/Initialize(mapload)
. = ..()
START_PROCESSING(SSfastprocess, src)
/obj/effect/temp_visual/darkspawn/shadowflame/Destroy()
STOP_PROCESSING(SSfastprocess, src)
return ..()
/obj/effect/temp_visual/darkspawn/shadowflame/process(delta_time)
var/turf/placement = get_turf(src)
for(var/mob/living/target_mob in placement.contents)
target_mob.set_wet_stacks(20, /datum/status_effect/fire_handler/shadowflame)
/obj/emitter/fire/shadow
pixel_y = -16 //so it aligns with the floor
fire_colour = COLOR_VELVET

View File

@@ -147,7 +147,7 @@
desc = "Empower your staff with the ability to consume the light of anything shot."
lore_description = "The Aaah'ryt sigil, representing consumption, is etched onto the staff."
icon_state = "lighteater_sign"
willpower_cost = 2
willpower_cost = 1
shadow_flags = DARKSPAWN_WARLOCK
menu_tab = STORE_OFFENSE
flag_to_add = STAFF_UPGRADE_LIGHTEATER
@@ -193,6 +193,16 @@
menu_tab = STORE_OFFENSE
learned_abilities = list(/datum/action/cooldown/spell/pointed/darkspawn_build/abyssal_call)
/datum/psi_web/shadowflame
name = "Shadowflame Gout"
desc = "Release a burst of shadowflame, rapidly sapping the heat of any individual."
lore_description = "An abhorrent inversion of the natural laws of thermodynamics."
icon_state = "veiling_touch" //needs an icon
willpower_cost = 2
shadow_flags = DARKSPAWN_WARLOCK
menu_tab = STORE_OFFENSE
learned_abilities = list(/datum/action/cooldown/spell/cone/staggered/shadowflame)
/datum/psi_web/shadow_beam
name = "Void Beam"
desc = "After a short delay, fire a huge beam of void terrain across the entire station."
@@ -207,7 +217,7 @@
name = "Null Burst"
desc = "After a short delay, create an explosion of void terrain at the targeted location."
lore_description = "Tears a portion of reality into the void for a short duration."
icon_state = "null_burst" //needs an icon
icon_state = "null_burst"
willpower_cost = 3
shadow_flags = DARKSPAWN_WARLOCK
menu_tab = STORE_OFFENSE