Datumizes spells (#24242)

* datumized spells

* finished

* last changes

* conflict

* Update code/datums/spells/alien_spells/transfer_plasma.dm

* conflicts

* shitty runtime fix until i get to this tomorrow

* Update code/datums/spell.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/datums/spell_handler/alien_spell_handler.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/datums/spells/alien_spells/regurgitate.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/datums/spells/alien_spells/regurgitate.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/datums/spells/bloodcrawl.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/datums/spells/bloodcrawl.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/modules/antagonists/vampire/vampire_powers/hemomancer_powers.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/modules/awaymissions/mission_code/ruins/wizardcrash.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/modules/research/xenobiology/xenobiology.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/modules/mob/living/carbon/superheroes.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/datums/spells/conjure.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/datums/spells/ethereal_jaunt.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/datums/spells/emplosion.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/datums/spells/turf_teleport.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/datums/spells/wizard_spells.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/datums/spells/wizard_spells.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/game/dna/mutations/mutation_powers.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/datums/spells/wizard_spells.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/datums/spells/wizard_spells.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/game/dna/mutations/mutation_powers.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* Update code/game/gamemodes/miniantags/revenant/revenant_abilities.dm

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>

* guess who just rework the entire malf ai actionsf ai

* gc better

---------

Co-authored-by: Burzah <116982774+Burzah@users.noreply.github.com>
This commit is contained in:
GDN
2024-04-01 02:42:21 -05:00
committed by GitHub
parent d52535a041
commit eee8878024
149 changed files with 1358 additions and 1536 deletions
+11 -11
View File
@@ -17,10 +17,10 @@
/// Nullrods and holywater make their abilities cost more
var/nullified = 0
/// a list of powers that all vampires unlock and at what blood level they unlock them, the rest of their powers are found in the vampire_subclass datum
var/list/upgrade_tiers = list(/obj/effect/proc_holder/spell/vampire/self/rejuvenate = 0,
/obj/effect/proc_holder/spell/vampire/glare = 0,
var/list/upgrade_tiers = list(/datum/spell/vampire/self/rejuvenate = 0,
/datum/spell/vampire/glare = 0,
/datum/vampire_passive/vision = 100,
/obj/effect/proc_holder/spell/vampire/self/specialize = 150,
/datum/spell/vampire/self/specialize = 150,
/datum/vampire_passive/regen = 200,
/datum/vampire_passive/vision/advanced = 500)
@@ -47,12 +47,12 @@
/datum/antagonist/mindslave/thrall/apply_innate_effects(mob/living/mob_override)
mob_override = ..()
var/datum/mind/M = mob_override.mind
M.AddSpell(new /obj/effect/proc_holder/spell/vampire/thrall_commune)
M.AddSpell(new /datum/spell/vampire/thrall_commune)
/datum/antagonist/mindslave/thrall/remove_innate_effects(mob/living/mob_override)
mob_override = ..()
var/datum/mind/M = mob_override.mind
M.RemoveSpell(/obj/effect/proc_holder/spell/vampire/thrall_commune)
M.RemoveSpell(/datum/spell/vampire/thrall_commune)
/datum/antagonist/vampire/Destroy(force, ...)
owner.current.create_log(CONVERSION_LOG, "De-vampired")
@@ -73,7 +73,7 @@
/datum/antagonist/vampire/proc/force_add_ability(path)
var/spell = new path(owner)
powers += spell
if(istype(spell, /obj/effect/proc_holder/spell))
if(istype(spell, /datum/spell))
owner.AddSpell(spell)
if(istype(spell, /datum/vampire_passive))
var/datum/vampire_passive/passive = spell
@@ -177,12 +177,12 @@
* Remove and delete the vampire's current subclass and all associated abilities.
*
* Arguments:
* * give_specialize_power - if the [specialize][/obj/effect/proc_holder/spell/vampire/self/specialize] power should be given back or not
* * give_specialize_power - if the [specialize][/datum/spell/vampire/self/specialize] power should be given back or not
*/
/datum/antagonist/vampire/proc/clear_subclass(give_specialize_power = TRUE)
if(give_specialize_power)
// Choosing a subclass in the first place removes this from `upgrade_tiers`, so add it back if needed.
upgrade_tiers[/obj/effect/proc_holder/spell/vampire/self/specialize] = 150
upgrade_tiers[/datum/spell/vampire/self/specialize] = 150
remove_all_powers()
QDEL_NULL(subclass)
check_vampire_upgrade()
@@ -220,8 +220,8 @@
/datum/antagonist/vampire/proc/announce_new_power(list/old_powers)
for(var/p in powers)
if(!(p in old_powers))
if(istype(p, /obj/effect/proc_holder/spell))
var/obj/effect/proc_holder/spell/power = p
if(istype(p, /datum/spell))
var/datum/spell/power = p
to_chat(owner.current, "<span class='boldnotice'>[power.gain_desc]</span>")
else if(istype(p, /datum/vampire_passive))
var/datum/vampire_passive/power = p
@@ -308,7 +308,7 @@
bloodtotal += blood_amount
bloodusable += blood_amount
check_vampire_upgrade(TRUE)
for(var/obj/effect/proc_holder/spell/S in powers)
for(var/datum/spell/S in powers)
if(S.action)
S.action.UpdateButtons()
@@ -9,7 +9,7 @@
/datum/vampire_passive/increment_thrall_cap/three
/obj/effect/proc_holder/spell/vampire/enthrall
/datum/spell/vampire/enthrall
name = "Enthrall (150)"
desc = "You use a large portion of your power to sway those loyal to none to be loyal to you only."
gain_desc = "You have gained the ability to thrall people to your will."
@@ -17,13 +17,13 @@
required_blood = 150
deduct_blood_on_cast = FALSE
/obj/effect/proc_holder/spell/vampire/enthrall/create_new_targeting()
/datum/spell/vampire/enthrall/create_new_targeting()
var/datum/spell_targeting/click/T = new
T.range = 1
T.click_radius = 0
return T
/obj/effect/proc_holder/spell/vampire/enthrall/cast(list/targets, mob/user = usr)
/datum/spell/vampire/enthrall/cast(list/targets, mob/user = usr)
var/datum/antagonist/vampire/vampire = user.mind.has_antag_datum(/datum/antagonist/vampire)
var/mob/living/target = targets[1]
user.visible_message("<span class='warning'>[user] bites [target]'s neck!</span>", "<span class='warning'>You bite [target]'s neck and begin the flow of power.</span>")
@@ -38,7 +38,7 @@
revert_cast(user)
to_chat(user, "<span class='warning'>You or your target moved.</span>")
/obj/effect/proc_holder/spell/vampire/enthrall/proc/can_enthrall(mob/living/user, mob/living/carbon/C)
/datum/spell/vampire/enthrall/proc/can_enthrall(mob/living/user, mob/living/carbon/C)
. = FALSE
if(!C)
CRASH("target was null while trying to vampire enthrall, attacker is [user] [user.key] \ref[user]")
@@ -63,7 +63,7 @@
return
return TRUE
/obj/effect/proc_holder/spell/vampire/enthrall/proc/handle_enthrall(mob/living/user, mob/living/carbon/human/H)
/datum/spell/vampire/enthrall/proc/handle_enthrall(mob/living/user, mob/living/carbon/human/H)
if(!istype(H))
return FALSE
@@ -75,17 +75,17 @@
user.create_log(CONVERSION_LOG, "vampire enthralled", H)
H.create_log(CONVERSION_LOG, "was vampire enthralled", user)
/obj/effect/proc_holder/spell/vampire/thrall_commune
/datum/spell/vampire/thrall_commune
name = "Commune"
desc = "Talk to your thralls telepathically."
gain_desc = "You have gained the ability to commune with your thralls."
action_icon_state = "vamp_communication"
base_cooldown = 2 SECONDS
/obj/effect/proc_holder/spell/vampire/thrall_commune/create_new_handler() //so thralls can use it
/datum/spell/vampire/thrall_commune/create_new_handler() //so thralls can use it
return
/datum/spell_targeting/select_vampire_network/choose_targets(mob/user, obj/effect/proc_holder/spell/spell, params, atom/clicked_atom) // Returns the vampire and their thralls. If user is a thrall then it will look up their master's network
/datum/spell_targeting/select_vampire_network/choose_targets(mob/user, datum/spell/spell, params, atom/clicked_atom) // Returns the vampire and their thralls. If user is a thrall then it will look up their master's network
var/list/mob/living/targets = list()
var/datum/antagonist/vampire/V = user.mind.has_antag_datum(/datum/antagonist/vampire) // if the user is a vampire
@@ -106,11 +106,11 @@
targets += V.owner.current
return targets
/obj/effect/proc_holder/spell/vampire/thrall_commune/create_new_targeting()
/datum/spell/vampire/thrall_commune/create_new_targeting()
var/datum/spell_targeting/select_vampire_network/T = new
return T
/obj/effect/proc_holder/spell/vampire/thrall_commune/cast(list/targets, mob/user)
/datum/spell/vampire/thrall_commune/cast(list/targets, mob/user)
var/input = tgui_input_text(user, "Enter a message to relay to the other thralls", "Thrall Commune")
if(!input)
revert_cast(user)
@@ -124,7 +124,7 @@
log_say("(DANTALION) [input]", user)
user.create_log(SAY_LOG, "(DANTALION) [input]")
/obj/effect/proc_holder/spell/vampire/pacify
/datum/spell/vampire/pacify
name = "Pacify (10)"
desc = "Pacify a target temporarily, making them unable to cause harm."
gain_desc = "You have gained the ability to pacify someone's harmful tendencies, preventing them from doing any physical harm to anyone."
@@ -132,18 +132,18 @@
base_cooldown = 30 SECONDS
required_blood = 10
/obj/effect/proc_holder/spell/vampire/pacify/create_new_targeting()
/datum/spell/vampire/pacify/create_new_targeting()
var/datum/spell_targeting/click/T = new
T.range = 7
T.click_radius = 1
T.allowed_type = /mob/living/carbon/human
return T
/obj/effect/proc_holder/spell/vampire/pacify/cast(list/targets, mob/user)
/datum/spell/vampire/pacify/cast(list/targets, mob/user)
for(var/mob/living/carbon/human/H as anything in targets)
H.apply_status_effect(STATUS_EFFECT_PACIFIED)
/obj/effect/proc_holder/spell/vampire/switch_places
/datum/spell/vampire/switch_places
name = "Subspace Swap (30)"
desc = "Switch positions with a target."
gain_desc = "You have gained the ability to switch positions with a targeted mob."
@@ -152,7 +152,7 @@
base_cooldown = 30 SECONDS
required_blood = 30
/obj/effect/proc_holder/spell/vampire/switch_places/create_new_targeting()
/datum/spell/vampire/switch_places/create_new_targeting()
var/datum/spell_targeting/click/T = new
T.range = 7
T.click_radius = 1
@@ -160,14 +160,14 @@
T.allowed_type = /mob/living
return T
/obj/effect/proc_holder/spell/vampire/switch_places/cast(list/targets, mob/user)
/datum/spell/vampire/switch_places/cast(list/targets, mob/user)
var/mob/living/target = targets[1]
var/turf/user_turf = get_turf(user)
var/turf/target_turf = get_turf(target)
target.forceMove(user_turf)
user.forceMove(target_turf)
/obj/effect/proc_holder/spell/vampire/self/decoy
/datum/spell/vampire/self/decoy
name = "Deploy Decoy (30)"
desc = "Briefly turn invisible and deploy a decoy illusion to fool your prey."
gain_desc = "You have gained the ability to turn invisible and create decoy illusions."
@@ -175,7 +175,7 @@
required_blood = 30
base_cooldown = 40 SECONDS
/obj/effect/proc_holder/spell/vampire/self/decoy/cast(list/targets, mob/user)
/datum/spell/vampire/self/decoy/cast(list/targets, mob/user)
var/mob/living/simple_animal/hostile/illusion/escape/E = new(get_turf(user))
E.Copy_Parent(user, 20, 20)
E.GiveTarget(user) //so it starts running right away
@@ -183,7 +183,7 @@
user.make_invisible()
addtimer(CALLBACK(user, TYPE_PROC_REF(/mob/living, reset_visibility)), 6 SECONDS)
/obj/effect/proc_holder/spell/vampire/rally_thralls
/datum/spell/vampire/rally_thralls
name = "Rally Thralls (100)"
desc = "Removes all incapacitating effects from your nearby thralls."
gain_desc = "You have gained the ability to remove all incapacitating effects from nearby thralls."
@@ -191,18 +191,18 @@
required_blood = 100
base_cooldown = 100 SECONDS
/obj/effect/proc_holder/spell/vampire/rally_thralls/create_new_targeting()
/datum/spell/vampire/rally_thralls/create_new_targeting()
var/datum/spell_targeting/aoe/thralls/A = new
A.allowed_type = /mob/living/carbon/human
A.range = 7
return A
/datum/spell_targeting/aoe/thralls/valid_target(target, user, obj/effect/proc_holder/spell/spell, check_if_in_range)
/datum/spell_targeting/aoe/thralls/valid_target(target, user, datum/spell/spell, check_if_in_range)
if(!isvampirethrall(target))
return FALSE
return ..()
/obj/effect/proc_holder/spell/vampire/rally_thralls/cast(list/targets, mob/user)
/datum/spell/vampire/rally_thralls/cast(list/targets, mob/user)
for(var/mob/living/carbon/human/H as anything in targets)
var/image/I = image('icons/effects/vampire_effects.dmi', "rallyoverlay", layer = EFFECTS_LAYER)
playsound(H, 'sound/magic/staff_healing.ogg', 30)
@@ -210,21 +210,21 @@
H.add_overlay(I)
addtimer(CALLBACK(H, TYPE_PROC_REF(/atom, cut_overlay), I), 6 SECONDS) // this makes it obvious who your thralls are for a while.
/obj/effect/proc_holder/spell/vampire/self/share_damage
/datum/spell/vampire/self/share_damage
name = "Blood Bond"
desc = "Creates a net between you and your nearby thralls that evenly shares all damage received."
gain_desc = "You have gained the ability to share damage between you and your thralls."
action_icon_state = "blood_bond"
required_blood = 5
/obj/effect/proc_holder/spell/vampire/self/share_damage/cast(list/targets, mob/living/user)
/datum/spell/vampire/self/share_damage/cast(list/targets, mob/living/user)
var/datum/status_effect/thrall_net/T = user.has_status_effect(STATUS_EFFECT_THRALL_NET)
if(!T)
user.apply_status_effect(STATUS_EFFECT_THRALL_NET, user.mind.has_antag_datum(/datum/antagonist/vampire))
return
qdel(T)
/obj/effect/proc_holder/spell/vampire/hysteria
/datum/spell/vampire/hysteria
name = "Mass Hysteria (70)"
desc = "Casts a powerful illusion to make everyone nearby perceive others to looks like random animals after briefly blinding them."
gain_desc = "You have gained the ability to make everyone nearby perceive others to looks like random animals after briefly blinding them."
@@ -232,13 +232,13 @@
required_blood = 70
base_cooldown = 180 SECONDS
/obj/effect/proc_holder/spell/vampire/hysteria/create_new_targeting()
/datum/spell/vampire/hysteria/create_new_targeting()
var/datum/spell_targeting/aoe/A = new
A.range = 8
A.allowed_type = /mob/living/carbon/human
return A
/obj/effect/proc_holder/spell/vampire/hysteria/cast(list/targets, mob/user)
/datum/spell/vampire/hysteria/cast(list/targets, mob/user)
for(var/mob/living/carbon/human/H as anything in targets)
if(!H.affects_vampire(user))
continue
@@ -1,4 +1,4 @@
/obj/effect/proc_holder/spell/vampire/self/blood_swell
/datum/spell/vampire/self/blood_swell
name = "Blood Swell (30)"
desc = "You infuse your body with blood, making you highly resistant to stuns and physical damage. However, this makes you unable to fire ranged weapons while it is active."
gain_desc = "You have gained the ability to temporarly resist large amounts of stuns and physical damage."
@@ -6,13 +6,13 @@
required_blood = 30
action_icon_state = "blood_swell"
/obj/effect/proc_holder/spell/vampire/self/blood_swell/cast(list/targets, mob/user)
/datum/spell/vampire/self/blood_swell/cast(list/targets, mob/user)
var/mob/living/target = targets[1]
if(ishuman(target))
var/mob/living/carbon/human/H = target
H.apply_status_effect(STATUS_EFFECT_BLOOD_SWELL)
/obj/effect/proc_holder/spell/vampire/self/stomp
/datum/spell/vampire/self/stomp
name = "Seismic Stomp (30)"
desc = "You slam your foot into the ground sending a powerful shockwave through the station's hull, sending people flying away. Cannot be cast if you legs are impared by a bola or similar."
gain_desc = "You have gained the ability to knock people back using a powerful stomp."
@@ -21,18 +21,18 @@
required_blood = 30
var/max_range = 4
/obj/effect/proc_holder/spell/vampire/self/stomp/can_cast(mob/living/carbon/user, charge_check, show_message)
/datum/spell/vampire/self/stomp/can_cast(mob/living/carbon/user, charge_check, show_message)
if(user.legcuffed)
return FALSE
return ..()
/obj/effect/proc_holder/spell/vampire/self/stomp/cast(list/targets, mob/user)
/datum/spell/vampire/self/stomp/cast(list/targets, mob/user)
var/turf/T = get_turf(user)
playsound(T, 'sound/effects/meteorimpact.ogg', 100, TRUE)
addtimer(CALLBACK(src, PROC_REF(hit_check), 1, T, user), 0.2 SECONDS)
new /obj/effect/temp_visual/stomp(T)
/obj/effect/proc_holder/spell/vampire/self/stomp/proc/hit_check(range, turf/start_turf, mob/user, safe_targets = list())
/datum/spell/vampire/self/stomp/proc/hit_check(range, turf/start_turf, mob/user, safe_targets = list())
// gets the two outermost turfs in a ring, we get two so people cannot "walk over" the shockwave
var/list/targets = view(range, start_turf) - view(range - 2, start_turf)
for(var/turf/simulated/floor/flooring in targets)
@@ -72,14 +72,14 @@
/datum/vampire_passive/blood_swell_upgrade
gain_desc = "While blood swell is active all of your melee attacks deal increased damage."
/obj/effect/proc_holder/spell/vampire/self/overwhelming_force
/datum/spell/vampire/self/overwhelming_force
name = "Overwhelming Force"
desc = "When toggled you will automatically pry open doors that you bump into if you do not have access."
gain_desc = "You have gained the ability to force open doors at a small blood cost."
base_cooldown = 2 SECONDS
action_icon_state = "OH_YEAAAAH"
/obj/effect/proc_holder/spell/vampire/self/overwhelming_force/cast(list/targets, mob/user)
/datum/spell/vampire/self/overwhelming_force/cast(list/targets, mob/user)
if(!HAS_TRAIT_FROM(user, TRAIT_FORCE_DOORS, VAMPIRE_TRAIT))
to_chat(user, "<span class='warning'>You feel MIGHTY!</span>")
ADD_TRAIT(user, TRAIT_FORCE_DOORS, VAMPIRE_TRAIT)
@@ -90,7 +90,7 @@
user.move_resist = MOVE_FORCE_DEFAULT
user.status_flags |= CANPUSH
/obj/effect/proc_holder/spell/vampire/self/blood_rush
/datum/spell/vampire/self/blood_rush
name = "Blood Rush (30)"
desc = "Infuse yourself with blood magic to boost your movement speed."
gain_desc = "You have gained the ability to temporarily move at high speeds."
@@ -98,14 +98,14 @@
required_blood = 30
action_icon_state = "blood_rush"
/obj/effect/proc_holder/spell/vampire/self/blood_rush/cast(list/targets, mob/user)
/datum/spell/vampire/self/blood_rush/cast(list/targets, mob/user)
var/mob/living/target = targets[1]
if(ishuman(target))
var/mob/living/carbon/human/H = target
to_chat(H, "<span class='notice'>You feel a rush of energy!</span>")
H.apply_status_effect(STATUS_EFFECT_BLOOD_RUSH)
/obj/effect/proc_holder/spell/fireball/demonic_grasp
/datum/spell/fireball/demonic_grasp
name = "Demonic Grasp (20)"
desc = "Fire a hand of demonic energy, snaring and throwing its target around, based on your intent. Disarm pushes, grab pulls."
gain_desc = "You have gained the ability to snare and disrupt people with demonic apendages."
@@ -124,10 +124,10 @@
invocation_type = "none"
invocation = null
/obj/effect/proc_holder/spell/fireball/demonic_grasp/update_icon_state()
/datum/spell/fireball/demonic_grasp/update_spell_icon()
return
/obj/effect/proc_holder/spell/fireball/demonic_grasp/create_new_handler()
/datum/spell/fireball/demonic_grasp/create_new_handler()
var/datum/spell_handler/vampire/V = new()
V.required_blood = 20
return V
@@ -178,7 +178,7 @@
icon_state = "immobilized"
duration = 1 SECONDS
/obj/effect/proc_holder/spell/vampire/charge
/datum/spell/vampire/charge
name = "Charge (30)"
desc = "You charge at wherever you click on screen, dealing large amounts of damage, stunning and destroying walls and other objects."
gain_desc = "You can now charge at a target on screen, dealing massive damage and destroying structures."
@@ -186,16 +186,16 @@
base_cooldown = 30 SECONDS
action_icon_state = "vampire_charge"
/obj/effect/proc_holder/spell/vampire/charge/create_new_targeting()
/datum/spell/vampire/charge/create_new_targeting()
return new /datum/spell_targeting/clicked_atom
/obj/effect/proc_holder/spell/vampire/charge/can_cast(mob/user, charge_check, show_message)
/datum/spell/vampire/charge/can_cast(mob/user, charge_check, show_message)
var/mob/living/L = user
if(IS_HORIZONTAL(L))
return FALSE
return ..()
/obj/effect/proc_holder/spell/vampire/charge/cast(list/targets, mob/user)
/datum/spell/vampire/charge/cast(list/targets, mob/user)
var/target = targets[1]
if(isliving(user))
var/mob/living/L = user
@@ -204,7 +204,7 @@
#define ARENA_SIZE 3
/obj/effect/proc_holder/spell/vampire/arena
/datum/spell/vampire/arena
name = "Desecrated Duel (150)"
desc = "You leap towards someone. Upon landing, you conjure an arena, and within it you will heal brute and burn damage, recover from fatigue faster, and be strengthened against lasting damages. Can be recasted to end the spell early."
gain_desc = "You can now leap to a target and trap them in a conjured arena."
@@ -218,13 +218,13 @@
/// Holds a reference to all arena walls so we can qdel them easily with dispel()
var/list/all_temp_walls = list()
/obj/effect/proc_holder/spell/vampire/arena/create_new_targeting()
/datum/spell/vampire/arena/create_new_targeting()
var/datum/spell_targeting/click/T = new
T.click_radius = 0
T.allowed_type = /mob/living/carbon/human
return T
/obj/effect/proc_holder/spell/vampire/arena/cast(list/targets, mob/living/user)
/datum/spell/vampire/arena/cast(list/targets, mob/living/user)
var/target = targets[1] // We only want to dash towards the first mob in our targeting list, if somehow multiple ended up in there
if(!targets)
return
@@ -262,24 +262,24 @@
RegisterSignal(user, COMSIG_PARENT_QDELETING, PROC_REF(dispel))
arena_checks(get_turf(target), user)
/obj/effect/proc_holder/spell/vampire/arena/proc/arena_checks(turf/target_turf, mob/living/user)
/datum/spell/vampire/arena/proc/arena_checks(turf/target_turf, mob/living/user)
if(!spell_active || QDELETED(src))
return
INVOKE_ASYNC(src, PROC_REF(fighters_check), user) //Checks to see if our fighters died.
INVOKE_ASYNC(src, PROC_REF(arena_trap), target_turf) //Gets another arena trap queued up for when this one runs out.
addtimer(CALLBACK(src, PROC_REF(arena_checks), target_turf, user), 5 SECONDS)
/obj/effect/proc_holder/spell/vampire/arena/proc/arena_trap(turf/target_turf)
/datum/spell/vampire/arena/proc/arena_trap(turf/target_turf)
for(var/tumor_range_turfs in circle_edge_turfs(target_turf, ARENA_SIZE))
tumor_range_turfs = new /obj/effect/temp_visual/elite_tumor_wall/gargantua(tumor_range_turfs, src)
all_temp_walls += tumor_range_turfs
/obj/effect/proc_holder/spell/vampire/arena/proc/fighters_check(mob/living/user)
/datum/spell/vampire/arena/proc/fighters_check(mob/living/user)
if(QDELETED(user) || user.stat == DEAD)
dispel(user)
return
/obj/effect/proc_holder/spell/vampire/arena/proc/dispel(mob/living/user)
/datum/spell/vampire/arena/proc/dispel(mob/living/user)
spell_active = FALSE
if(timer)
deltimer(timer)
@@ -1,4 +1,4 @@
/obj/effect/proc_holder/spell/vampire/self/vamp_claws
/datum/spell/vampire/self/vamp_claws
name = "Vampiric Claws (30)"
desc = "You channel blood magics to forge deadly vampiric claws that leech blood and strike rapidly. Cannot be used if you are holding something that cannot be dropped."
gain_desc = "You have gained the ability to forge your hands into vampiric claws."
@@ -6,7 +6,7 @@
required_blood = 30
action_icon_state = "vampire_claws"
/obj/effect/proc_holder/spell/vampire/self/vamp_claws/cast(mob/user)
/datum/spell/vampire/self/vamp_claws/cast(mob/user)
if(user.l_hand || user.r_hand)
to_chat(user, "<span class='notice'>You drop what was in your hands as large blades spring from your fingers!</span>")
user.drop_l_hand()
@@ -17,7 +17,7 @@
RegisterSignal(user, COMSIG_MOB_WILLINGLY_DROP, PROC_REF(dispel))
user.put_in_hands(claws)
/obj/effect/proc_holder/spell/vampire/self/vamp_claws/proc/dispel()
/datum/spell/vampire/self/vamp_claws/proc/dispel()
SIGNAL_HANDLER
var/mob/living/carbon/human/user = action.owner
if(user.mind.has_antag_datum(/datum/antagonist/vampire))
@@ -31,7 +31,7 @@
qdel(current)
to_chat(user, "<span class='notice'>You dispel your claws!</span>")
/obj/effect/proc_holder/spell/vampire/self/vamp_claws/can_cast(mob/user, charge_check, show_message)
/datum/spell/vampire/self/vamp_claws/can_cast(mob/user, charge_check, show_message)
var/mob/living/L = user
if(L.canUnEquip(L.l_hand) && L.canUnEquip(L.r_hand))
return ..()
@@ -55,7 +55,7 @@
var/durability = 15
var/blood_drain_amount = 15
var/blood_absorbed_amount = 5
var/obj/effect/proc_holder/spell/vampire/self/vamp_claws/parent_spell
var/datum/spell/vampire/self/vamp_claws/parent_spell
/obj/item/vamp_claws/Initialize(mapload, new_parent_spell)
. = ..()
@@ -104,7 +104,7 @@
qdel(src)
to_chat(user, "<span class='notice'>You dispel your claws!</span>")
/obj/effect/proc_holder/spell/vampire/blood_tendrils
/datum/spell/vampire/blood_tendrils
name = "Blood Tendrils (10)"
desc = "You summon blood tendrils from bluespace after a delay to ensnare people in an area, slowing them down."
gain_desc = "You have gained the ability to summon blood tendrils to slow people down in an area that you target."
@@ -115,16 +115,16 @@
sound = 'sound/misc/enter_blood.ogg'
var/area_of_affect = 1
selection_activated_message = "<span class='notice'>You channel blood magics to weaken the bluespace veil. <B>Left-click to cast at a target area!</B></span>"
selection_activated_message = "<span class='notice'>You channel blood magics to weaken the bluespace veil. <b>Left-click to cast at a target area!</b></span>"
selection_deactivated_message = "<span class='notice'>Your magics subside.</span>"
/obj/effect/proc_holder/spell/vampire/blood_tendrils/create_new_targeting()
/datum/spell/vampire/blood_tendrils/create_new_targeting()
var/datum/spell_targeting/click/T = new
T.allowed_type = /atom
T.try_auto_target = FALSE
return T
/obj/effect/proc_holder/spell/vampire/blood_tendrils/cast(list/targets, mob/user)
/datum/spell/vampire/blood_tendrils/cast(list/targets, mob/user)
var/turf/T = get_turf(targets[1]) // there should only ever be one entry in targets for this spell
for(var/turf/simulated/blood_turf in view(area_of_affect, T))
@@ -134,7 +134,7 @@
addtimer(CALLBACK(src, PROC_REF(apply_slowdown), T, area_of_affect, 6 SECONDS, user), 0.5 SECONDS)
/obj/effect/proc_holder/spell/vampire/blood_tendrils/proc/apply_slowdown(turf/T, distance, slowed_amount, mob/user)
/datum/spell/vampire/blood_tendrils/proc/apply_slowdown(turf/T, distance, slowed_amount, mob/user)
for(var/mob/living/L in range(distance, T))
if(L.affects_vampire(user))
L.Slowed(slowed_amount)
@@ -149,7 +149,7 @@
/obj/effect/temp_visual/blood_tendril/long
duration = 2 SECONDS
/obj/effect/proc_holder/spell/vampire/blood_barrier
/datum/spell/vampire/blood_barrier
name = "Blood Barrier (40)"
desc = "Select two points within 3 tiles of each other and make a barrier between them."
gain_desc = "You have gained the ability to summon a crystaline wall of blood between two points, the barrier is easily destructable, however you can walk freely through it."
@@ -162,24 +162,24 @@
var/max_walls = 3
var/turf/start_turf = null
/obj/effect/proc_holder/spell/vampire/blood_barrier/create_new_targeting()
/datum/spell/vampire/blood_barrier/create_new_targeting()
var/datum/spell_targeting/click/T = new
T.allowed_type = /atom
T.try_auto_target = FALSE
return T
/obj/effect/proc_holder/spell/vampire/blood_barrier/remove_ranged_ability(mob/user, msg)
/datum/spell/vampire/blood_barrier/remove_ranged_ability(mob/user, msg)
. = ..()
if(msg) // this is only true if the user intentionally turned off the spell
start_turf = null
should_recharge_after_cast = FALSE
/obj/effect/proc_holder/spell/vampire/blood_barrier/should_remove_click_intercept()
/datum/spell/vampire/blood_barrier/should_remove_click_intercept()
if(start_turf)
return TRUE
return FALSE
/obj/effect/proc_holder/spell/vampire/blood_barrier/cast(list/targets, mob/user)
/datum/spell/vampire/blood_barrier/cast(list/targets, mob/user)
var/turf/target_turf = get_turf(targets[1])
if(target_turf == start_turf)
to_chat(user, "<span class='notice'>You deselect the targeted turf.</span>")
@@ -244,7 +244,7 @@
/obj/effect/proc_holder/spell/ethereal_jaunt/blood_pool
/datum/spell/ethereal_jaunt/blood_pool
name = "Sanguine Pool (50)"
desc = "You shift your form into a pool of blood, making you invulnerable and able to move through anything that's not a wall or space. You leave a trail of blood behind you when you do this."
gain_desc = "You have gained the ability to shift into a pool of blood, allowing you to evade pursuers with great mobility."
@@ -261,12 +261,12 @@
jaunt_in_time = 0
sound1 = 'sound/misc/enter_blood.ogg'
/obj/effect/proc_holder/spell/ethereal_jaunt/blood_pool/create_new_handler()
/datum/spell/ethereal_jaunt/blood_pool/create_new_handler()
var/datum/spell_handler/vampire/H = new
H.required_blood = 50
return H
/obj/effect/proc_holder/spell/vampire/predator_senses
/datum/spell/vampire/predator_senses
name = "Predator Senses"
desc = "Hunt down your prey, there's nowhere to hide..."
gain_desc = "Your senses are heightened, nobody can hide from you now."
@@ -274,16 +274,16 @@
base_cooldown = 20 SECONDS
create_attack_logs = FALSE
/obj/effect/proc_holder/spell/vampire/predator_senses/create_new_targeting()
/datum/spell/vampire/predator_senses/create_new_targeting()
var/datum/spell_targeting/alive_mob_list/A = new()
A.allowed_type = /mob/living/carbon/human
A.max_targets = 300 // hopefully we never hit this number
return A
/obj/effect/proc_holder/spell/vampire/predator_senses/valid_target(mob/target, mob/user)
/datum/spell/vampire/predator_senses/valid_target(mob/target, mob/user)
return target.z == user.z && target.mind
/obj/effect/proc_holder/spell/vampire/predator_senses/cast(list/targets, mob/user)
/datum/spell/vampire/predator_senses/cast(list/targets, mob/user)
var/targets_by_name = list()
for(var/mob/living/carbon/human/H as anything in targets)
targets_by_name[H.real_name] = H
@@ -297,7 +297,7 @@
message += "<i> They are wounded...</i>"
to_chat(user, "<span class='cultlarge'>[message]</span>")
/obj/effect/proc_holder/spell/vampire/blood_eruption
/datum/spell/vampire/blood_eruption
name = "Blood Eruption (100)"
desc = "Every pool of blood in 4 tiles erupts with a spike of living blood, damaging anyone stood on it."
gain_desc = "You have gained the ability to weaponise pools of blood to damage those stood on them."
@@ -305,13 +305,13 @@
base_cooldown = 200 SECONDS
action_icon_state = "blood_spikes"
/obj/effect/proc_holder/spell/vampire/blood_eruption/create_new_targeting()
/datum/spell/vampire/blood_eruption/create_new_targeting()
var/datum/spell_targeting/aoe/T = new
T.range = 4
T.allowed_type = /mob/living
return T
/obj/effect/proc_holder/spell/vampire/blood_eruption/valid_target(mob/living/target, user)
/datum/spell/vampire/blood_eruption/valid_target(mob/living/target, user)
var/turf/T = get_turf(target)
if(locate(/obj/effect/decal/cleanable/blood) in T)
if(target.affects_vampire(user) && !isLivingSSD(target))
@@ -319,7 +319,7 @@
return FALSE
/obj/effect/proc_holder/spell/vampire/blood_eruption/cast(list/targets, mob/user)
/datum/spell/vampire/blood_eruption/cast(list/targets, mob/user)
for(var/mob/living/L in targets)
var/turf/T = get_turf(L)
var/obj/effect/decal/cleanable/blood/B = locate(/obj/effect/decal/cleanable/blood) in T
@@ -334,7 +334,7 @@
icon_state = "bloodspike_white"
duration = 0.3 SECONDS
/obj/effect/proc_holder/spell/vampire/self/blood_spill
/datum/spell/vampire/self/blood_spill
name = "The Blood Bringers Rite"
desc = "When toggled, everyone around you begins to bleed profusely. You will drain their blood and rejuvenate yourself with it."
gain_desc = "You have gained the ability to rip the very life force out of people and absorb it, healing you."
@@ -342,7 +342,7 @@
action_icon_state = "blood_bringers_rite"
required_blood = 10
/obj/effect/proc_holder/spell/vampire/self/blood_spill/cast(list/targets, mob/user)
/datum/spell/vampire/self/blood_spill/cast(list/targets, mob/user)
var/datum/antagonist/vampire/V = user.mind.has_antag_datum(/datum/antagonist/vampire)
if(!V.get_ability(/datum/vampire_passive/blood_spill))
V.force_add_ability(/datum/vampire_passive/blood_spill)
@@ -1,17 +1,11 @@
/obj/effect/proc_holder/spell/vampire/self/cloak
/datum/spell/vampire/self/cloak
name = "Cloak of Darkness"
desc = "Toggles whether you are currently cloaking yourself in darkness. When in darkness and toggled on, you move at increased speeds."
gain_desc = "You have gained the Cloak of Darkness ability, which when toggled makes you nearly invisible and highly agile in the shroud of darkness."
action_icon_state = "vampire_cloak"
base_cooldown = 2 SECONDS
/obj/effect/proc_holder/spell/vampire/self/cloak/New()
..()
update_name()
/obj/effect/proc_holder/spell/vampire/self/cloak/update_name()
. = ..()
var/mob/living/user = loc
/datum/spell/vampire/self/cloak/proc/update_spell_name(mob/living/user)
if(!ishuman(user) || !user.mind)
return
var/datum/antagonist/vampire/V = user.mind.has_antag_datum(/datum/antagonist/vampire)
@@ -19,9 +13,10 @@
return
action.name = "[initial(name)] ([V.iscloaking ? "Deactivate" : "Activate"])"
SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_NAME)
UpdateButtons()
/obj/effect/proc_holder/spell/vampire/self/cloak/cast(list/targets, mob/user = usr)
/datum/spell/vampire/self/cloak/cast(list/targets, mob/user = usr)
var/datum/antagonist/vampire/V = user.mind.has_antag_datum(/datum/antagonist/vampire)
V.iscloaking = !V.iscloaking
if(ishuman(user))
@@ -32,7 +27,7 @@
else
user.UnregisterSignal(user, COMSIG_LIVING_IGNITED)
H.physiology.burn_mod /= 1.1
update_name()
update_spell_name(user)
to_chat(user, "<span class='notice'>You will now be [V.iscloaking ? "hidden" : "seen"] in darkness.</span>")
/mob/living/proc/update_vampire_cloak()
@@ -40,7 +35,7 @@
var/datum/antagonist/vampire/V = mind.has_antag_datum(/datum/antagonist/vampire)
V.handle_vampire_cloak()
/obj/effect/proc_holder/spell/vampire/shadow_snare
/datum/spell/vampire/shadow_snare
name = "Shadow Snare (20)"
desc = "You summon a trap on the ground. When crossed it will blind the target, extinguish any lights they may have, and ensnare them."
gain_desc = "You have gained the ability to summon a trap that will blind, ensnare, and turn off the lights of anyone who crosses it."
@@ -48,13 +43,13 @@
required_blood = 20
action_icon_state = "shadow_snare"
/obj/effect/proc_holder/spell/vampire/shadow_snare/create_new_targeting()
/datum/spell/vampire/shadow_snare/create_new_targeting()
var/datum/spell_targeting/click/T = new
T.allowed_type = /turf/simulated
T.click_radius = -1
return T
/obj/effect/proc_holder/spell/vampire/shadow_snare/cast(list/targets, mob/user)
/datum/spell/vampire/shadow_snare/cast(list/targets, mob/user)
var/turf/target = targets[1]
new /obj/item/restraints/legcuffs/beartrap/shadow_snare(target)
@@ -116,7 +111,7 @@
STOP_PROCESSING(SSobj, src)
return ..()
/obj/effect/proc_holder/spell/vampire/soul_anchor
/datum/spell/vampire/soul_anchor
name = "Soul Anchor (30)"
desc = "You summon a dimenional anchor after a delay, casting again will teleport you back to the anchor. You will fake a recall after 2 minutes."
gain_desc = "You have gained the ability to save a point in space and teleport back to it at will. Unless you willingly teleport back to that point within 2 minutes, you will fake a recall."
@@ -132,10 +127,10 @@
/// Holds a reference to the timer until the caster fake recalls
var/timer
/obj/effect/proc_holder/spell/vampire/soul_anchor/create_new_targeting()
/datum/spell/vampire/soul_anchor/create_new_targeting()
return new /datum/spell_targeting/self
/obj/effect/proc_holder/spell/vampire/soul_anchor/cast(list/targets, mob/user)
/datum/spell/vampire/soul_anchor/cast(list/targets, mob/user)
if(making_anchor) // second cast, but we are impatient
to_chat(user, "<span class='notice'>Your anchor isn't ready yet!</span>")
return
@@ -152,11 +147,11 @@
recall(user)
/obj/effect/proc_holder/spell/vampire/soul_anchor/proc/make_anchor(mob/user, turf/anchor_turf)
/datum/spell/vampire/soul_anchor/proc/make_anchor(mob/user, turf/anchor_turf)
anchor = new(anchor_turf)
timer = addtimer(CALLBACK(src, PROC_REF(recall), user, TRUE), 2 MINUTES, TIMER_STOPPABLE)
/obj/effect/proc_holder/spell/vampire/soul_anchor/proc/recall(mob/user, fake = FALSE)
/datum/spell/vampire/soul_anchor/proc/recall(mob/user, fake = FALSE)
cooldown_handler.start_recharge()
if(timer)
deltimer(timer)
@@ -214,7 +209,7 @@
anchored = TRUE
resistance_flags = INDESTRUCTIBLE
/obj/effect/proc_holder/spell/vampire/dark_passage
/datum/spell/vampire/dark_passage
name = "Dark Passage (30)"
desc = "You teleport to a targeted turf."
gain_desc = "You have gained the ability to blink a short distance towards a targeted turf."
@@ -223,13 +218,13 @@
centcom_cancast = FALSE
action_icon_state = "dark_passage"
/obj/effect/proc_holder/spell/vampire/dark_passage/create_new_targeting()
/datum/spell/vampire/dark_passage/create_new_targeting()
var/datum/spell_targeting/click/T = new
T.click_radius = 0
T.allowed_type = /turf/simulated
return T
/obj/effect/proc_holder/spell/vampire/dark_passage/cast(list/targets, mob/user)
/datum/spell/vampire/dark_passage/cast(list/targets, mob/user)
var/turf/target = get_turf(targets[1])
new /obj/effect/temp_visual/vamp_mist_out(get_turf(user))
@@ -241,7 +236,7 @@
icon = 'icons/mob/mob.dmi'
icon_state = "mist"
/obj/effect/proc_holder/spell/vampire/vamp_extinguish
/datum/spell/vampire/vamp_extinguish
name = "Extinguish"
desc = "You extinguish any light source in an area around you."
gain_desc = "You have gained the ability to extinguish nearby light sources."
@@ -250,17 +245,17 @@
create_attack_logs = FALSE
create_custom_logs = TRUE
/obj/effect/proc_holder/spell/vampire/vamp_extinguish/create_new_targeting()
/datum/spell/vampire/vamp_extinguish/create_new_targeting()
var/datum/spell_targeting/aoe/turf/T = new
return T
/obj/effect/proc_holder/spell/vampire/vamp_extinguish/cast(list/targets, mob/user = usr)
/datum/spell/vampire/vamp_extinguish/cast(list/targets, mob/user = usr)
for(var/turf/T in targets)
T.extinguish_light()
for(var/atom/A in T.contents)
A.extinguish_light()
/obj/effect/proc_holder/spell/vampire/shadow_boxing
/datum/spell/vampire/shadow_boxing
name = "Shadow Boxing (50)"
desc = "Target someone to have your shadow beat them up. You must stay within 2 tiles for this to work."
gain_desc = "You have gained the ability to make your shadow fight for you."
@@ -269,18 +264,18 @@
required_blood = 50
var/target_UID
/obj/effect/proc_holder/spell/vampire/shadow_boxing/create_new_targeting()
/datum/spell/vampire/shadow_boxing/create_new_targeting()
var/datum/spell_targeting/click/C = new
C.allowed_type = /mob/living
C.range = 2
C.try_auto_target = FALSE
return C
/obj/effect/proc_holder/spell/vampire/shadow_boxing/cast(list/targets, mob/user)
/datum/spell/vampire/shadow_boxing/cast(list/targets, mob/user)
var/mob/living/target = targets[1]
target.apply_status_effect(STATUS_EFFECT_SHADOW_BOXING, user)
/obj/effect/proc_holder/spell/vampire/self/eternal_darkness
/datum/spell/vampire/self/eternal_darkness
name = "Eternal Darkness"
desc = "When toggled, you shroud the area around you in darkness and slowly lower the body temperature of people nearby. Energy projectiles will dim in its radius."
gain_desc = "You have gained the ability to shroud the area around you in darkness, only the strongest of lights can pierce your unholy powers."
@@ -289,7 +284,7 @@
required_blood = 5
var/shroud_power = -6
/obj/effect/proc_holder/spell/vampire/self/eternal_darkness/cast(list/targets, mob/user)
/datum/spell/vampire/self/eternal_darkness/cast(list/targets, mob/user)
var/datum/antagonist/vampire/V = user.mind.has_antag_datum(/datum/antagonist/vampire)
var/mob/target = targets[1]
if(!V.get_ability(/datum/vampire_passive/eternal_darkness))
@@ -12,7 +12,7 @@
return FALSE
return TRUE
/obj/effect/proc_holder/spell/vampire
/datum/spell/vampire
panel = "Vampire"
school = "vampire"
action_background_icon_state = "bg_vampire"
@@ -22,13 +22,13 @@
var/required_blood
var/deduct_blood_on_cast = TRUE
/obj/effect/proc_holder/spell/vampire/create_new_handler()
/datum/spell/vampire/create_new_handler()
var/datum/spell_handler/vampire/H = new
H.required_blood = required_blood
H.deduct_blood_on_cast = deduct_blood_on_cast
return H
/obj/effect/proc_holder/spell/vampire/self/create_new_targeting()
/datum/spell/vampire/self/create_new_targeting()
return new /datum/spell_targeting/self
/datum/vampire_passive
@@ -48,14 +48,14 @@
owner.update_sight() // Life updates conditionally, so we need to update sight here in case the vamp gets new vision based on his powers. Maybe one day refactor to be more OOP and on the vampire's ability datum.
return
/obj/effect/proc_holder/spell/vampire/self/rejuvenate
/datum/spell/vampire/self/rejuvenate
name = "Rejuvenate"
desc = "Use reserve blood to enliven your body, removing any incapacitating effects."
action_icon_state = "vampire_rejuvinate"
base_cooldown = 20 SECONDS
stat_allowed = UNCONSCIOUS
/obj/effect/proc_holder/spell/vampire/self/rejuvenate/cast(list/targets, mob/user = usr)
/datum/spell/vampire/self/rejuvenate/cast(list/targets, mob/user = usr)
var/mob/living/U = user
U.SetWeakened(0)
@@ -73,7 +73,7 @@
if(rejuv_bonus)
INVOKE_ASYNC(src, PROC_REF(heal), U, rejuv_bonus)
/obj/effect/proc_holder/spell/vampire/self/rejuvenate/proc/heal(mob/living/user, rejuv_bonus)
/datum/spell/vampire/self/rejuvenate/proc/heal(mob/living/user, rejuv_bonus)
for(var/i in 1 to 5)
user.adjustBruteLoss(-2 * rejuv_bonus)
user.adjustOxyLoss(-5 * rejuv_bonus)
@@ -93,35 +93,35 @@
rejuv_multiplier = clamp((100 - owner.current.health) / 20, 1, 5) // brute and burn healing between 5 and 50
return rejuv_multiplier
return 1
return TRUE
/obj/effect/proc_holder/spell/vampire/self/specialize
/datum/spell/vampire/self/specialize
name = "Choose Specialization"
desc = "Choose what sub-class of vampire you want to evolve into."
gain_desc = "You can now choose what specialization of vampire you want to evolve into."
base_cooldown = 2 SECONDS
action_icon_state = "select_class"
/obj/effect/proc_holder/spell/vampire/self/specialize/cast(mob/user)
/datum/spell/vampire/self/specialize/cast(mob/user)
ui_interact(user)
/obj/effect/proc_holder/spell/vampire/self/specialize/ui_state(mob/user)
/datum/spell/vampire/self/specialize/ui_state(mob/user)
return GLOB.always_state
/obj/effect/proc_holder/spell/vampire/self/specialize/ui_interact(mob/user, datum/tgui/ui = null)
/datum/spell/vampire/self/specialize/ui_interact(mob/user, datum/tgui/ui = null)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "SpecMenu", "Specialisation Menu")
ui.set_autoupdate(FALSE)
ui.open()
/obj/effect/proc_holder/spell/vampire/self/specialize/ui_data(mob/user)
/datum/spell/vampire/self/specialize/ui_data(mob/user)
var/datum/antagonist/vampire/vamp = user.mind.has_antag_datum(/datum/antagonist/vampire)
var/list/data = list("subclasses" = vamp.subclass)
return data
/obj/effect/proc_holder/spell/vampire/self/specialize/ui_act(action, list/params)
/datum/spell/vampire/self/specialize/ui_act(action, list/params)
if(..())
return
var/datum/antagonist/vampire/vamp = usr.mind.has_antag_datum(/datum/antagonist/vampire)
@@ -157,20 +157,20 @@
if(log_choice)
SSblackbox.record_feedback("nested tally", "vampire_subclasses", 1, list("[new_subclass.name]"))
/obj/effect/proc_holder/spell/vampire/glare
/datum/spell/vampire/glare
name = "Glare"
desc = "Your eyes flash, stunning and silencing anyone in front of you. It has lesser effects for those around you."
action_icon_state = "vampire_glare"
base_cooldown = 30 SECONDS
stat_allowed = UNCONSCIOUS
/obj/effect/proc_holder/spell/vampire/glare/create_new_targeting()
/datum/spell/vampire/glare/create_new_targeting()
var/datum/spell_targeting/aoe/T = new
T.allowed_type = /mob/living
T.range = 1
return T
/obj/effect/proc_holder/spell/vampire/glare/create_new_cooldown()
/datum/spell/vampire/glare/create_new_cooldown()
var/datum/spell_cooldown/charges/C = new
C.max_charges = 2
C.recharge_duration = base_cooldown
@@ -184,7 +184,7 @@
/// Full deviation. Flashed from directly behind or behind-left/behind-rack. Not flashed at all.
#define DEVIATION_FULL 1
/obj/effect/proc_holder/spell/vampire/glare/cast(list/targets, mob/living/user = usr)
/datum/spell/vampire/glare/cast(list/targets, mob/living/user = usr)
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(istype(H.glasses, /obj/item/clothing/glasses/sunglasses/blindfold))
@@ -221,7 +221,7 @@
to_chat(target, "<span class='warning'>You are blinded by [user]'s glare.</span>")
add_attack_logs(user, target, "(Vampire) Glared at")
/obj/effect/proc_holder/spell/vampire/glare/proc/calculate_deviation(mob/victim, mob/attacker)
/datum/spell/vampire/glare/proc/calculate_deviation(mob/victim, mob/attacker)
// Are they on the same tile? We'll return partial deviation. This may be someone flashing while lying down
if(victim.loc == attacker.loc)
return DEVIATION_PARTIAL
@@ -279,7 +279,7 @@
/datum/vampire_passive/full
gain_desc = "You have reached your full potential. You are no longer weak to the effects of anything holy."
/obj/effect/proc_holder/spell/vampire/raise_vampires
/datum/spell/vampire/raise_vampires
name = "Raise Vampires"
desc = "Summons deadly vampires from bluespace."
school = "transmutation"
@@ -293,12 +293,12 @@
sound = 'sound/magic/wandodeath.ogg'
gain_desc = "You have gained the ability to Raise Vampires. This extremely powerful AOE ability affects all humans near you. Vampires/thralls are healed. Corpses are raised as vampires. Others are stunned, then brain damaged, then killed."
/obj/effect/proc_holder/spell/vampire/raise_vampires/create_new_targeting()
/datum/spell/vampire/raise_vampires/create_new_targeting()
var/datum/spell_targeting/aoe/T = new
T.range = 3
return T
/obj/effect/proc_holder/spell/vampire/raise_vampires/cast(list/targets, mob/user = usr)
/datum/spell/vampire/raise_vampires/cast(list/targets, mob/user = usr)
new /obj/effect/temp_visual/cult/sparks(user.loc)
var/turf/T = get_turf(user)
to_chat(user, "<span class='warning'>You call out within bluespace, summoning more vampiric spirits to aid you!</span>")
@@ -308,17 +308,17 @@
raise_vampire(user, H)
/obj/effect/proc_holder/spell/vampire/raise_vampires/proc/raise_vampire(mob/M, mob/living/carbon/human/H)
/datum/spell/vampire/raise_vampires/proc/raise_vampire(mob/M, mob/living/carbon/human/H)
if(!istype(M) || !istype(H))
return
if(!H.mind)
visible_message("[H] looks to be too stupid to understand what is going on.")
H.visible_message("[H] looks to be too stupid to understand what is going on.")
return
if(H.dna && (NO_BLOOD in H.dna.species.species_traits) || H.dna.species.exotic_blood || !H.blood_volume)
visible_message("[H] looks unfazed!")
H.visible_message("[H] looks unfazed!")
return
if(H.mind.has_antag_datum(/datum/antagonist/vampire) || H.mind.special_role == SPECIAL_ROLE_VAMPIRE || H.mind.special_role == SPECIAL_ROLE_VAMPIRE_THRALL)
visible_message("<span class='notice'>[H] looks refreshed!</span>")
H.visible_message("<span class='notice'>[H] looks refreshed!</span>")
H.adjustBruteLoss(-60)
H.adjustFireLoss(-60)
for(var/obj/item/organ/external/E in H.bodyparts)
@@ -330,10 +330,10 @@
return
if(H.stat != DEAD)
if(H.IsWeakened())
visible_message("<span class='warning'>[H] looks to be in pain!</span>")
H.visible_message("<span class='warning'>[H] looks to be in pain!</span>")
H.adjustBrainLoss(60)
else
visible_message("<span class='warning'>[H] looks to be stunned by the energy!</span>")
H.visible_message("<span class='warning'>[H] looks to be stunned by the energy!</span>")
H.Weaken(40 SECONDS)
return
for(var/obj/item/bio_chip/mindshield/L in H)
@@ -342,7 +342,7 @@
for(var/obj/item/bio_chip/traitor/T in H)
if(T && T.implanted)
qdel(T)
visible_message("<span class='warning'>[H] gets an eerie red glow in their eyes!</span>")
H.visible_message("<span class='warning'>[H] gets an eerie red glow in their eyes!</span>")
var/datum/objective/protect/protect_objective = new
protect_objective.target = M.mind
@@ -23,95 +23,95 @@
/datum/vampire_subclass/umbrae
name = "umbrae"
standard_powers = list(/obj/effect/proc_holder/spell/vampire/self/cloak = 150,
/obj/effect/proc_holder/spell/vampire/shadow_snare = 250,
/obj/effect/proc_holder/spell/vampire/soul_anchor = 250,
/obj/effect/proc_holder/spell/vampire/dark_passage = 400,
/obj/effect/proc_holder/spell/vampire/vamp_extinguish = 600,
/obj/effect/proc_holder/spell/vampire/shadow_boxing = 800)
standard_powers = list(/datum/spell/vampire/self/cloak = 150,
/datum/spell/vampire/shadow_snare = 250,
/datum/spell/vampire/soul_anchor = 250,
/datum/spell/vampire/dark_passage = 400,
/datum/spell/vampire/vamp_extinguish = 600,
/datum/spell/vampire/shadow_boxing = 800)
fully_powered_abilities = list(/datum/vampire_passive/full,
/datum/vampire_passive/vision/full,
/obj/effect/proc_holder/spell/vampire/self/eternal_darkness,
/datum/spell/vampire/self/eternal_darkness,
/datum/vampire_passive/vision/xray)
/datum/vampire_subclass/hemomancer
name = "hemomancer"
standard_powers = list(/obj/effect/proc_holder/spell/vampire/self/vamp_claws = 150,
/obj/effect/proc_holder/spell/vampire/blood_tendrils = 250,
/obj/effect/proc_holder/spell/vampire/blood_barrier = 250,
/obj/effect/proc_holder/spell/ethereal_jaunt/blood_pool = 400,
/obj/effect/proc_holder/spell/vampire/predator_senses = 600,
/obj/effect/proc_holder/spell/vampire/blood_eruption = 800)
standard_powers = list(/datum/spell/vampire/self/vamp_claws = 150,
/datum/spell/vampire/blood_tendrils = 250,
/datum/spell/vampire/blood_barrier = 250,
/datum/spell/ethereal_jaunt/blood_pool = 400,
/datum/spell/vampire/predator_senses = 600,
/datum/spell/vampire/blood_eruption = 800)
fully_powered_abilities = list(/datum/vampire_passive/full,
/datum/vampire_passive/vision/full,
/obj/effect/proc_holder/spell/vampire/self/blood_spill)
/datum/spell/vampire/self/blood_spill)
/datum/vampire_subclass/gargantua
name = "gargantua"
standard_powers = list(/obj/effect/proc_holder/spell/vampire/self/blood_swell = 150,
/obj/effect/proc_holder/spell/vampire/self/blood_rush = 250,
/obj/effect/proc_holder/spell/vampire/self/stomp = 250,
standard_powers = list(/datum/spell/vampire/self/blood_swell = 150,
/datum/spell/vampire/self/blood_rush = 250,
/datum/spell/vampire/self/stomp = 250,
/datum/vampire_passive/blood_swell_upgrade = 400,
/obj/effect/proc_holder/spell/vampire/self/overwhelming_force = 600,
/obj/effect/proc_holder/spell/vampire/charge = 800,
/obj/effect/proc_holder/spell/fireball/demonic_grasp = 800)
/datum/spell/vampire/self/overwhelming_force = 600,
/datum/spell/vampire/charge = 800,
/datum/spell/fireball/demonic_grasp = 800)
fully_powered_abilities = list(/datum/vampire_passive/full,
/datum/vampire_passive/vision/full,
/obj/effect/proc_holder/spell/vampire/arena)
/datum/spell/vampire/arena)
improved_rejuv_healing = TRUE
/datum/vampire_subclass/dantalion
name = "dantalion"
standard_powers = list(/obj/effect/proc_holder/spell/vampire/enthrall = 150,
/obj/effect/proc_holder/spell/vampire/thrall_commune = 150,
/obj/effect/proc_holder/spell/vampire/pacify = 250,
/obj/effect/proc_holder/spell/vampire/switch_places = 250,
/obj/effect/proc_holder/spell/vampire/self/decoy = 400,
standard_powers = list(/datum/spell/vampire/enthrall = 150,
/datum/spell/vampire/thrall_commune = 150,
/datum/spell/vampire/pacify = 250,
/datum/spell/vampire/switch_places = 250,
/datum/spell/vampire/self/decoy = 400,
/datum/vampire_passive/increment_thrall_cap = 400,
/obj/effect/proc_holder/spell/vampire/rally_thralls = 600,
/datum/spell/vampire/rally_thralls = 600,
/datum/vampire_passive/increment_thrall_cap/two = 600,
/obj/effect/proc_holder/spell/vampire/self/share_damage = 800)
/datum/spell/vampire/self/share_damage = 800)
fully_powered_abilities = list(/datum/vampire_passive/full,
/obj/effect/proc_holder/spell/vampire/hysteria,
/datum/spell/vampire/hysteria,
/datum/vampire_passive/vision/full,
/datum/vampire_passive/increment_thrall_cap/three)
/datum/vampire_subclass/ancient
name = "ancient"
standard_powers = list(/obj/effect/proc_holder/spell/vampire/self/vamp_claws,
/obj/effect/proc_holder/spell/vampire/self/blood_swell,
/obj/effect/proc_holder/spell/vampire/self/cloak,
/obj/effect/proc_holder/spell/vampire/enthrall,
/obj/effect/proc_holder/spell/vampire/thrall_commune,
/obj/effect/proc_holder/spell/vampire/blood_tendrils,
/obj/effect/proc_holder/spell/vampire/blood_barrier,
/obj/effect/proc_holder/spell/vampire/self/blood_rush,
/obj/effect/proc_holder/spell/vampire/self/stomp,
/obj/effect/proc_holder/spell/vampire/charge,
/obj/effect/proc_holder/spell/vampire/shadow_snare,
/obj/effect/proc_holder/spell/vampire/soul_anchor,
/obj/effect/proc_holder/spell/vampire/pacify,
/obj/effect/proc_holder/spell/vampire/switch_places,
/obj/effect/proc_holder/spell/ethereal_jaunt/blood_pool,
standard_powers = list(/datum/spell/vampire/self/vamp_claws,
/datum/spell/vampire/self/blood_swell,
/datum/spell/vampire/self/cloak,
/datum/spell/vampire/enthrall,
/datum/spell/vampire/thrall_commune,
/datum/spell/vampire/blood_tendrils,
/datum/spell/vampire/blood_barrier,
/datum/spell/vampire/self/blood_rush,
/datum/spell/vampire/self/stomp,
/datum/spell/vampire/charge,
/datum/spell/vampire/shadow_snare,
/datum/spell/vampire/soul_anchor,
/datum/spell/vampire/pacify,
/datum/spell/vampire/switch_places,
/datum/spell/ethereal_jaunt/blood_pool,
/datum/vampire_passive/blood_swell_upgrade,
/obj/effect/proc_holder/spell/vampire/dark_passage,
/obj/effect/proc_holder/spell/vampire/self/decoy,
/obj/effect/proc_holder/spell/vampire/blood_eruption,
/obj/effect/proc_holder/spell/vampire/predator_senses,
/obj/effect/proc_holder/spell/vampire/self/overwhelming_force,
/obj/effect/proc_holder/spell/vampire/vamp_extinguish,
/obj/effect/proc_holder/spell/vampire/rally_thralls,
/obj/effect/proc_holder/spell/vampire/self/share_damage,
/obj/effect/proc_holder/spell/fireball/demonic_grasp,
/obj/effect/proc_holder/spell/vampire/shadow_boxing,
/datum/spell/vampire/dark_passage,
/datum/spell/vampire/self/decoy,
/datum/spell/vampire/blood_eruption,
/datum/spell/vampire/predator_senses,
/datum/spell/vampire/self/overwhelming_force,
/datum/spell/vampire/vamp_extinguish,
/datum/spell/vampire/rally_thralls,
/datum/spell/vampire/self/share_damage,
/datum/spell/fireball/demonic_grasp,
/datum/spell/vampire/shadow_boxing,
/datum/vampire_passive/full,
/datum/vampire_passive/vision/full,
/obj/effect/proc_holder/spell/vampire/self/blood_spill,
/obj/effect/proc_holder/spell/vampire/arena,
/obj/effect/proc_holder/spell/vampire/self/eternal_darkness,
/obj/effect/proc_holder/spell/vampire/hysteria,
/obj/effect/proc_holder/spell/vampire/raise_vampires,
/datum/spell/vampire/self/blood_spill,
/datum/spell/vampire/arena,
/datum/spell/vampire/self/eternal_darkness,
/datum/spell/vampire/hysteria,
/datum/spell/vampire/raise_vampires,
/datum/vampire_passive/vision/xray)
improved_rejuv_healing = TRUE
thrall_cap = 150 // can thrall high pop
@@ -45,28 +45,28 @@
var/list/messages = list()
switch(class_type)
if("fire")
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball/apprentice(null))
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/sacred_flame(null))
new_wiz.mind.AddSpell(new /datum/spell/fireball/apprentice(null))
new_wiz.mind.AddSpell(new /datum/spell/sacred_flame(null))
ADD_TRAIT(new_wiz, TRAIT_RESISTHEAT, MAGIC_TRAIT)
ADD_TRAIT(new_wiz, TRAIT_RESISTHIGHPRESSURE, MAGIC_TRAIT)
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/ethereal_jaunt(null))
new_wiz.mind.AddSpell(new /datum/spell/ethereal_jaunt(null))
new_wiz.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(new_wiz), SLOT_HUD_SHOES)
new_wiz.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/red(new_wiz), SLOT_HUD_OUTER_SUIT)
new_wiz.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/red(new_wiz), SLOT_HUD_HEAD)
messages += "<b>Your service has not gone unrewarded. Under the tutelage of [my_teacher.real_name], you've acquired proficiency in the fundamentals of Firebending, enabling you to cast spells like Fireball, Sacred Flame, and Ethereal Jaunt.</b>"
messages += "<b>You are immune to fire, but you are NOT immune to the explosions caused by your fireballs. Neither is your teacher, for that matter. Be careful!</b>"
if("translocation")
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/area_teleport/teleport(null))
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/turf_teleport/blink(null))
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/ethereal_jaunt(null))
new_wiz.mind.AddSpell(new /datum/spell/area_teleport/teleport(null))
new_wiz.mind.AddSpell(new /datum/spell/turf_teleport/blink(null))
new_wiz.mind.AddSpell(new /datum/spell/ethereal_jaunt(null))
new_wiz.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(new_wiz), SLOT_HUD_SHOES)
new_wiz.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(new_wiz), SLOT_HUD_OUTER_SUIT)
new_wiz.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(new_wiz), SLOT_HUD_HEAD)
messages += "<b>Your service has not gone unrewarded. While studying under [my_teacher.real_name], you mastered reality-bending mobility spells, allowing you to cast Teleport, Blink, and Ethereal Jaunt.</b>"
if("restoration")
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/charge(null))
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/knock(null))
var/obj/effect/proc_holder/spell/return_to_teacher/S = new /obj/effect/proc_holder/spell/return_to_teacher(null)
new_wiz.mind.AddSpell(new /datum/spell/charge(null))
new_wiz.mind.AddSpell(new /datum/spell/aoe/knock(null))
var/datum/spell/return_to_teacher/S = new /datum/spell/return_to_teacher(null)
S.teacher = my_teacher.mind
new_wiz.mind.AddSpell(S)
new_wiz.equip_to_slot_or_del(new /obj/item/gun/magic/staff/healing(new_wiz), SLOT_HUD_RIGHT_HAND)
@@ -76,19 +76,19 @@
messages += "<b>Your service has not gone unrewarded. Under the guidance of [my_teacher.real_name], you've acquired life-saving survival spells. You can now cast Charge and Knock, and possess the ability to teleport back to your mentor.</b>"
messages += "<b>Your Charge spell can be used to recharge your Staff of Healing or reduce the cooldowns of your teacher, if you are grabbing them with empty hands.</b>"
if("stealth")
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/mind_transfer(null))
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/knock(null))
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/fireball/toolbox(null))
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/disguise_self(null))
new_wiz.mind.AddSpell(new /datum/spell/mind_transfer(null))
new_wiz.mind.AddSpell(new /datum/spell/aoe/knock(null))
new_wiz.mind.AddSpell(new /datum/spell/fireball/toolbox(null))
new_wiz.mind.AddSpell(new /datum/spell/disguise_self(null))
new_wiz.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(new_wiz), SLOT_HUD_SHOES)
new_wiz.equip_to_slot_or_del(new /obj/item/clothing/mask/gas(new_wiz), SLOT_HUD_WEAR_MASK)
new_wiz.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/yellow(new_wiz), SLOT_HUD_GLOVES)
new_wiz.equip_to_slot_or_del(new /obj/item/storage/belt/utility/full(new_wiz), SLOT_HUD_BELT)
messages += "<b>Your service has not gone unrewarded. Under the mentorship of [my_teacher.real_name], you've mastered stealthy, robeless spells. You can now cast Mindswap, Knock, Homing Toolbox, and Disguise Self without the need for wizard robes.</b>"
if("honk")
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/touch/banana/apprentice(null))
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/ethereal_jaunt(null))
new_wiz.mind.AddSpell(new /obj/effect/proc_holder/spell/summonitem(null))
new_wiz.mind.AddSpell(new /datum/spell/touch/banana/apprentice(null))
new_wiz.mind.AddSpell(new /datum/spell/ethereal_jaunt(null))
new_wiz.mind.AddSpell(new /datum/spell/summonitem(null))
new_wiz.equip_to_slot_or_del(new /obj/item/gun/magic/staff/slipping(new_wiz), SLOT_HUD_RIGHT_HAND)
new_wiz.equip_to_slot_or_del(new /obj/item/clothing/shoes/clown_shoes/magical/nodrop(new_wiz), SLOT_HUD_SHOES)
new_wiz.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/clown(new_wiz), SLOT_HUD_OUTER_SUIT)