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 07:42:21 +00:00
committed by GitHub
co-authored by Burzah
parent d52535a041
commit eee8878024
149 changed files with 1358 additions and 1536 deletions
+2 -2
View File
@@ -571,10 +571,10 @@ GLOBAL_LIST_INIT(view_runtimes_verbs, list(
return
var/list/spell_list = list()
var/type_length = length("/obj/effect/proc_holder/spell") + 2
var/type_length = length("/datum/spell") + 2
for(var/A in GLOB.spells)
spell_list[copytext("[A]", type_length)] = A
var/obj/effect/proc_holder/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spell_list
var/datum/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spell_list
if(!S)
return
S = spell_list[S]
+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)
@@ -135,8 +135,8 @@
else
H.rename_character(null, name)
if(is_species(H, /datum/species/golem/tranquillite) && H.mind)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/conjure/build/mime_wall(null))
H.mind.AddSpell(new /obj/effect/proc_holder/spell/mime/speak(null))
H.mind.AddSpell(new /datum/spell/aoe/conjure/build/mime_wall(null))
H.mind.AddSpell(new /datum/spell/mime/speak(null))
H.mind.miming = TRUE
if(has_owner)
@@ -2,10 +2,10 @@
/obj/item/paper/fluff/ruins/wizardcrash
name = "Mission Briefing"
info = "To the Magnificent Z.A.P.<BR>A small mining base has been created within our territory by wandless scum. Send them a message from the wizard federation they will not forget. I know your kind is rather fragile, but a group of lightly armed miners should not pose any threat to you at all. Just be warned they have a security cyborg for self defence, you might want to tune your spells to that threat. I look forward to hearing of your success.<BR>Grand Magus Abra the Wonderous"
info = "To the Magnificent Z.A.P.<br>A small mining base has been created within our territory by wandless scum. Send them a message from the wizard federation they will not forget. I know your kind is rather fragile, but a group of lightly armed miners should not pose any threat to you at all. Just be warned they have a security cyborg for self defence, you might want to tune your spells to that threat. I look forward to hearing of your success.<br>Grand Magus Abra the Wonderous"
/obj/item/spellbook/oneuse/emp
spell = /obj/effect/proc_holder/spell/emplosion/disable_tech
spell = /datum/spell/emplosion/disable_tech
spellname = "Disable Technology"
icon_state = "bookcharge" //it's a lightning bolt, seems appropriate enough
desc = "For the tech-hating wizard on the go."
@@ -6,7 +6,7 @@
/datum/martial_combo/plasma_fist/tornado_sweep/perform_combo(mob/living/carbon/human/user, mob/living/target, datum/martial_art/MA)
user.say("TORNADO SWEEP!")
INVOKE_ASYNC(src, PROC_REF(do_tornado_effect), user)
var/obj/effect/proc_holder/spell/aoe/repulse/R = new(null)
var/datum/spell/aoe/repulse/R = new(null)
var/list/turfs = list()
for(var/turf/T in range(1,user))
turfs.Add(T)
@@ -217,7 +217,7 @@
if(2)
to_chat(user, "<span class='danger'>Power courses through you! You can now shift your form at will.")
if(user.mind)
var/obj/effect/proc_holder/spell/shapeshift/dragon/D = new
var/datum/spell/shapeshift/dragon/D = new
user.mind.AddSpell(D)
if(3)
to_chat(user, "<span class='danger'>You feel like you could walk straight through lava now.</span>")
@@ -350,7 +350,7 @@
ADD_TRAIT(L, TRAIT_MUTE, STASIS_MUTE)
L.status_flags |= GODMODE
L.mind.transfer_to(holder_animal)
var/obj/effect/proc_holder/spell/exit_possession/P = new /obj/effect/proc_holder/spell/exit_possession
var/datum/spell/exit_possession/P = new /datum/spell/exit_possession
holder_animal.mind.AddSpell(P)
remove_verb(holder_animal, /mob/living/verb/pulled)
@@ -362,7 +362,7 @@
L.notransform = FALSE
if(holder_animal && !QDELETED(holder_animal))
holder_animal.mind.transfer_to(L)
L.mind.RemoveSpell(/obj/effect/proc_holder/spell/exit_possession)
L.mind.RemoveSpell(/datum/spell/exit_possession)
if(kill || !isanimal(loc))
L.death(0)
..()
@@ -373,7 +373,7 @@
/obj/structure/closet/stasis/ex_act()
return
/obj/effect/proc_holder/spell/exit_possession
/datum/spell/exit_possession
name = "Exit Possession"
desc = "Exits the body you are possessing"
base_cooldown = 60
@@ -382,10 +382,10 @@
action_icon_state = "exit_possession"
sound = null
/obj/effect/proc_holder/spell/exit_possession/create_new_targeting()
/datum/spell/exit_possession/create_new_targeting()
return new /datum/spell_targeting/self
/obj/effect/proc_holder/spell/exit_possession/cast(list/targets, mob/user = usr)
/datum/spell/exit_possession/cast(list/targets, mob/user = usr)
if(!isfloorturf(user.loc))
return
var/datum/mind/target_mind = user.mind
@@ -397,4 +397,4 @@
qdel(S)
break
current.gib()
target_mind.RemoveSpell(/obj/effect/proc_holder/spell/exit_possession)
target_mind.RemoveSpell(/datum/spell/exit_possession)
@@ -53,7 +53,7 @@ GLOBAL_DATUM_INIT(ghost_crew_monitor, /datum/ui_module/crew_monitor/ghost, new)
/mob/dead/observer/proc/open_spawners_menu))
// Our new boo spell.
AddSpell(new /obj/effect/proc_holder/spell/boo(null))
AddSpell(new /datum/spell/boo(null))
can_reenter_corpse = flags & GHOST_CAN_REENTER
started_as_observer = flags & GHOST_IS_OBSERVER
+3 -3
View File
@@ -9,7 +9,7 @@ GLOBAL_LIST_INIT(boo_phrases, list(
"It feels like someone's standing behind you.",
))
/obj/effect/proc_holder/spell/boo
/datum/spell/boo
name = "Boo!"
desc = "Fuck with the living."
selection_deactivated_message = "<span class='notice'>Your presence will not be known. For now.</span>"
@@ -29,13 +29,13 @@ GLOBAL_LIST_INIT(boo_phrases, list(
create_attack_logs = FALSE
/obj/effect/proc_holder/spell/boo/create_new_targeting()
/datum/spell/boo/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/boo/cast(list/targets, mob/user = usr)
/datum/spell/boo/cast(list/targets, mob/user = usr)
var/atom/target = targets[1]
ASSERT(istype(target))
@@ -9,7 +9,7 @@
. = ..()
name = "alien drone ([rand(1, 1000)])"
real_name = name
AddSpell(new /obj/effect/proc_holder/spell/alien_spell/evolve_queen)
AddSpell(new /datum/spell/alien_spell/evolve_queen)
/mob/living/carbon/alien/humanoid/drone/get_caste_organs()
. = ..()
@@ -23,7 +23,7 @@
real_name = name
add_language("Xenomorph")
add_language("Hivemind")
AddSpell(new /obj/effect/proc_holder/spell/alien_spell/regurgitate)
AddSpell(new /datum/spell/alien_spell/regurgitate)
. = ..()
AddComponent(/datum/component/footstep, FOOTSTEP_MOB_CLAW, 0.5, -11)
@@ -16,7 +16,7 @@
/mob/living/carbon/alien/humanoid/queen/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_FORCE_DOORS, UNIQUE_TRAIT_SOURCE(src))
AddSpell(new /obj/effect/proc_holder/spell/alien_spell/tail_lash)
AddSpell(new /datum/spell/alien_spell/tail_lash)
/mob/living/carbon/alien/humanoid/queen/get_caste_organs()
. = ..()
@@ -25,7 +25,7 @@
regenerate_icons()
add_language("Xenomorph")
add_language("Hivemind")
AddSpell(new /obj/effect/proc_holder/spell/alien_spell/evolve_larva)
AddSpell(new /datum/spell/alien_spell/evolve_larva)
var/datum/action/innate/hide/alien_larva_hide/hide = new()
hide.Grant(src)
+1 -1
View File
@@ -107,5 +107,5 @@
/mob/living/carbon/human/monkey/magic/mind_checks()
if(!..())
return FALSE
mind.AddSpell(new /obj/effect/proc_holder/spell/turf_teleport/blink(null))
mind.AddSpell(new /datum/spell/turf_teleport/blink(null))
mind.special_role = SPECIAL_ROLE_WIZARD
@@ -654,8 +654,8 @@
H.equip_to_slot_or_del(new /obj/item/reagent_containers/drinks/bottle/bottleofnothing(H), SLOT_HUD_RIGHT_STORE)
H.equip_to_slot_or_del(new /obj/item/cane(H), SLOT_HUD_LEFT_HAND)
if(H.mind)
H.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe/conjure/build/mime_wall(null))
H.mind.AddSpell(new /obj/effect/proc_holder/spell/mime/speak(null))
H.mind.AddSpell(new /datum/spell/aoe/conjure/build/mime_wall(null))
H.mind.AddSpell(new /datum/spell/mime/speak(null))
H.mind.miming = TRUE
/datum/unarmed_attack/golem/tranquillite
+10 -10
View File
@@ -36,7 +36,7 @@
/datum/superheroes/proc/assign_spells(mob/living/carbon/human/H)
if(default_spells.len)
for(var/spell in default_spells)
var/obj/effect/proc_holder/spell/S = spell
var/datum/spell/S = spell
if(!S)
return
H.mind.AddSpell(new S(null))
@@ -82,7 +82,7 @@
/datum/superheroes/griffin
name = "The Griffin"
default_spells = list(/obj/effect/proc_holder/spell/recruit)
default_spells = list(/datum/spell/recruit)
class = "Supervillain"
desc = "You are The Griffin, the ultimate supervillain. You thrive on chaos and have no respect for the supposed authority \
of the command staff of this station. Along with your gang of dim-witted yet trusty henchmen, you will be able to execute \
@@ -106,7 +106,7 @@
desc = "You are LightnIan, the lord of lightning! A freak electrical accident while working in the station's kennel \
has given you mastery over lightning and a peculiar desire to sniff butts. Although you are a recent addition to the \
station's hero roster, you intend to leave your mark."
default_spells = list(/obj/effect/proc_holder/spell/charge_up/bounce/lightning/lightnian)
default_spells = list(/datum/spell/charge_up/bounce/lightning/lightnian)
/datum/superheroes/lightnian/equip(mob/living/carbon/human/H)
..()
@@ -125,7 +125,7 @@
desc = "You were a roboticist, once. Now you are Electro-Negmatic, a name this station will learn to fear. You designed \
your costume to resemble E-N, your faithful dog that some callous RD destroyed because it was sparking up the plasma. You \
intend to take your revenge and make them all pay thanks to your magnetic powers."
default_spells = list(/obj/effect/proc_holder/spell/charge_up/bounce/magnet)
default_spells = list(/datum/spell/charge_up/bounce/magnet)
/datum/superheroes/electro/equip(mob/living/carbon/human/H)
..()
@@ -143,7 +143,7 @@
//The Griffin's special recruit abilitiy
/obj/effect/proc_holder/spell/recruit
/datum/spell/recruit
name = "Recruit Greyshirt"
desc = "Allows you to recruit a conscious, non-braindead, non-catatonic human to be part of the Greyshirts, your personal henchmen. This works on Assistants only and you can recruit a maximum of 3!."
base_cooldown = 450
@@ -151,16 +151,16 @@
action_icon_state = "spell_greytide"
var/recruiting = 0
selection_activated_message = "<span class='notice'>You start preparing a mindblowing monologue. <B>Left-click to cast at a target!</B></span>"
selection_activated_message = "<span class='notice'>You start preparing a mindblowing monologue. <b>Left-click to cast at a target!</b></span>"
selection_deactivated_message = "<span class='notice'>You decide to save your brilliance for another day.</span>"
/obj/effect/proc_holder/spell/recruit/create_new_targeting()
/datum/spell/recruit/create_new_targeting()
var/datum/spell_targeting/click/T = new()
T.click_radius = -1
T.range = 1
return T
/obj/effect/proc_holder/spell/recruit/can_cast(mob/user = usr, charge_check = TRUE, show_message = FALSE)
/datum/spell/recruit/can_cast(mob/user = usr, charge_check = TRUE, show_message = FALSE)
if(SSticker.mode.greyshirts.len >= 3)
if(show_message)
to_chat(user, "<span class='warning'>You have already recruited the maximum number of henchmen.</span>")
@@ -171,10 +171,10 @@
return FALSE
return ..()
/obj/effect/proc_holder/spell/recruit/valid_target(mob/living/carbon/human/target, user)
/datum/spell/recruit/valid_target(mob/living/carbon/human/target, user)
return target.ckey && !target.stat
/obj/effect/proc_holder/spell/recruit/cast(list/targets,mob/living/user = usr)
/datum/spell/recruit/cast(list/targets,mob/living/user = usr)
var/mob/living/carbon/human/target = targets[1]
if(target.mind.assigned_role != "Assistant")
to_chat(user, "<span class='warning'>You can only recruit Assistants.</span>")
+2 -2
View File
@@ -69,7 +69,7 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
//MALFUNCTION
var/datum/module_picker/malf_picker
var/datum/action/innate/ai/choose_modules/modules_action
var/datum/spell/ai_spell/choose_modules/modules_action
var/list/datum/AI_Module/current_modules = list()
var/can_dominate_mechs = FALSE
var/shunted = FALSE // TRUE if the AI is currently shunted. Used to differentiate between shunted and ghosted/braindead
@@ -1422,7 +1422,7 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
view_core() //A BYOND bug requires you to be viewing your core before your verbs update
malf_picker = new /datum/module_picker
modules_action = new(malf_picker)
modules_action.Grant(src)
AddSpell(modules_action)
///Removes all malfunction-related /datum/action's from the target AI.
/mob/living/silicon/ai/proc/remove_malf_abilities()
+5 -5
View File
@@ -103,8 +103,8 @@
add_language("Gutter")
add_language("Trinary")
AddSpell(new /obj/effect/proc_holder/spell/access_software_pai)
AddSpell(new /obj/effect/proc_holder/spell/unfold_chassis_pai)
AddSpell(new /datum/spell/access_software_pai)
AddSpell(new /datum/spell/unfold_chassis_pai)
//PDA
pda = new(src)
@@ -241,7 +241,7 @@
// mobile pai mob. This also includes handling some of the general shit that can occur
// to it. Really this deserves its own file, but for the moment it can sit here. ~ Z
/obj/effect/proc_holder/spell/unfold_chassis_pai
/datum/spell/unfold_chassis_pai
name = "Unfold/Fold Chassis"
desc = "Allows you to fold in/out of your mobile form."
clothes_req = FALSE
@@ -249,10 +249,10 @@
action_icon_state = "repairbot"
action_background_icon_state = "bg_tech_blue"
/obj/effect/proc_holder/spell/unfold_chassis_pai/create_new_targeting()
/datum/spell/unfold_chassis_pai/create_new_targeting()
return new /datum/spell_targeting/self
/obj/effect/proc_holder/spell/unfold_chassis_pai/cast(list/targets, mob/living/user = usr)
/datum/spell/unfold_chassis_pai/cast(list/targets, mob/living/user = usr)
var/mob/living/silicon/pai/pai_user = user
if(pai_user.loc != pai_user.card)
@@ -12,7 +12,7 @@ GLOBAL_LIST_INIT(pai_emotions, list(
GLOBAL_LIST_EMPTY(pai_software_by_key)
/obj/effect/proc_holder/spell/access_software_pai
/datum/spell/access_software_pai
name = "Software interface"
desc = "Allows you to access your downloaded software."
clothes_req = FALSE
@@ -20,10 +20,10 @@ GLOBAL_LIST_EMPTY(pai_software_by_key)
action_icon_state = "choose_module"
action_background_icon_state = "bg_tech_blue"
/obj/effect/proc_holder/spell/access_software_pai/create_new_targeting()
/datum/spell/access_software_pai/create_new_targeting()
return new /datum/spell_targeting/self
/obj/effect/proc_holder/spell/access_software_pai/cast(list/targets, mob/living/user = usr)
/datum/spell/access_software_pai/cast(list/targets, mob/living/user = usr)
var/mob/living/silicon/pai/pai_user = user
pai_user.ui_interact(pai_user)
@@ -155,7 +155,7 @@
construct_type = "juggernaut"
mob_size = MOB_SIZE_LARGE
move_resist = MOVE_FORCE_STRONG
construct_spells = list(/obj/effect/proc_holder/spell/night_vision, /obj/effect/proc_holder/spell/aoe/conjure/build/lesserforcewall)
construct_spells = list(/datum/spell/night_vision, /datum/spell/aoe/conjure/build/lesserforcewall)
force_threshold = 11
playstyle_string = "<b>You are a Juggernaut. Though slow, your shell can withstand extreme punishment, \
create shield walls, rip apart enemies and walls.</b>"
@@ -191,7 +191,7 @@
attacktext = "slashes"
attack_sound = 'sound/weapons/bladeslice.ogg'
construct_type = "wraith"
construct_spells = list(/obj/effect/proc_holder/spell/night_vision, /obj/effect/proc_holder/spell/ethereal_jaunt/shift)
construct_spells = list(/datum/spell/night_vision, /datum/spell/ethereal_jaunt/shift)
retreat_distance = 2 //AI wraiths will move in and out of combat
playstyle_string = "<b>You are a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls.</b>"
@@ -227,13 +227,13 @@
minimum_distance = 10 //AI artificers will flee like fuck
attack_sound = 'sound/weapons/punch2.ogg'
construct_type = "builder"
construct_spells = list(/obj/effect/proc_holder/spell/night_vision,
/obj/effect/proc_holder/spell/projectile/magic_missile/lesser,
/obj/effect/proc_holder/spell/aoe/conjure/construct/lesser,
/obj/effect/proc_holder/spell/aoe/conjure/build/wall,
/obj/effect/proc_holder/spell/aoe/conjure/build/floor,
/obj/effect/proc_holder/spell/aoe/conjure/build/pylon,
/obj/effect/proc_holder/spell/aoe/conjure/build/soulstone)
construct_spells = list(/datum/spell/night_vision,
/datum/spell/projectile/magic_missile/lesser,
/datum/spell/aoe/conjure/construct/lesser,
/datum/spell/aoe/conjure/build/wall,
/datum/spell/aoe/conjure/build/floor,
/datum/spell/aoe/conjure/build/pylon,
/datum/spell/aoe/conjure/build/soulstone)
playstyle_string = "<b>You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, \
use magic missile, repair allied constructs (by clicking on them), \
@@ -334,10 +334,10 @@
environment_smash = ENVIRONMENT_SMASH_RWALLS
attack_sound = 'sound/weapons/tap.ogg'
construct_type = "harvester"
construct_spells = list(/obj/effect/proc_holder/spell/night_vision,
/obj/effect/proc_holder/spell/aoe/conjure/build/wall,
/obj/effect/proc_holder/spell/aoe/conjure/build/floor,
/obj/effect/proc_holder/spell/smoke/disable)
construct_spells = list(/datum/spell/night_vision,
/datum/spell/aoe/conjure/build/wall,
/datum/spell/aoe/conjure/build/floor,
/datum/spell/smoke/disable)
retreat_distance = 2 //AI harvesters will move in and out of combat, like wraiths, but shittier
playstyle_string = "<B>You are a Harvester. You are not strong, but your powers of domination will assist you in your role: \
Bring those who still cling to this world of illusion back to the master so they may know Truth.</B>"
@@ -56,9 +56,9 @@
/mob/living/simple_animal/hostile/statue/Initialize(mapload, mob/living/creator)
. = ..()
// Give spells
AddSpell(new /obj/effect/proc_holder/spell/aoe/flicker_lights(null))
AddSpell(new /obj/effect/proc_holder/spell/aoe/blindness(null))
AddSpell(new /obj/effect/proc_holder/spell/night_vision(null))
AddSpell(new /datum/spell/aoe/flicker_lights(null))
AddSpell(new /datum/spell/aoe/blindness(null))
AddSpell(new /datum/spell/night_vision(null))
// Set creator
if(creator)
@@ -160,7 +160,7 @@
// Statue powers
// Flicker lights
/obj/effect/proc_holder/spell/aoe/flicker_lights
/datum/spell/aoe/flicker_lights
name = "Flicker Lights"
desc = "You will trigger a large amount of lights around you to flicker."
@@ -168,18 +168,18 @@
clothes_req = FALSE
aoe_range = 14
/obj/effect/proc_holder/spell/aoe/flicker_lights/create_new_targeting()
/datum/spell/aoe/flicker_lights/create_new_targeting()
var/datum/spell_targeting/aoe/turf/targeting = new()
targeting.range = aoe_range
return targeting
/obj/effect/proc_holder/spell/aoe/flicker_lights/cast(list/targets, mob/user = usr)
/datum/spell/aoe/flicker_lights/cast(list/targets, mob/user = usr)
for(var/turf/T in targets)
for(var/obj/machinery/light/L in T)
L.forced_flicker()
//Blind AOE
/obj/effect/proc_holder/spell/aoe/blindness
/datum/spell/aoe/blindness
name = "Blindness"
desc = "Your prey will be momentarily blind for you to advance on them."
@@ -188,13 +188,13 @@
clothes_req = FALSE
aoe_range = 10
/obj/effect/proc_holder/spell/aoe/blindness/create_new_targeting()
/datum/spell/aoe/blindness/create_new_targeting()
var/datum/spell_targeting/aoe/targeting = new()
targeting.range = aoe_range
targeting.allowed_type = /mob/living
return targeting
/obj/effect/proc_holder/spell/aoe/blindness/cast(list/targets, mob/user = usr)
/datum/spell/aoe/blindness/cast(list/targets, mob/user = usr)
for(var/mob/living/L in targets)
if(istype(L, /mob/living/simple_animal/hostile/statue))
continue
@@ -118,21 +118,21 @@
/mob/living/simple_animal/hostile/hellhound/greater/Initialize(mapload)
. = ..()
// Movement
AddSpell(new /obj/effect/proc_holder/spell/ethereal_jaunt/shift)
var/obj/effect/proc_holder/spell/area_teleport/teleport/telespell = new
AddSpell(new /datum/spell/ethereal_jaunt/shift)
var/datum/spell/area_teleport/teleport/telespell = new
telespell.clothes_req = FALSE
telespell.invocation_type = "none"
AddSpell(telespell)
var/obj/effect/proc_holder/spell/aoe/knock/knockspell = new
var/datum/spell/aoe/knock/knockspell = new
knockspell.invocation_type = "none"
AddSpell(knockspell)
// Defense
var/obj/effect/proc_holder/spell/forcewall/wallspell = new
var/datum/spell/forcewall/wallspell = new
wallspell.clothes_req = FALSE
wallspell.invocation_type = "none"
AddSpell(wallspell)
// Offense
var/obj/effect/proc_holder/spell/aoe/conjure/creature/summonspell = new
var/datum/spell/aoe/conjure/creature/summonspell = new
summonspell.base_cooldown = 1
summonspell.invocation_type = "none"
summonspell.summon_type = list(/mob/living/simple_animal/hostile/hellhound)
@@ -619,7 +619,7 @@ Difficulty: Medium
attack_action_types = list()
/mob/living/simple_animal/hostile/megafauna/dragon/space_dragon/Initialize(mapload)
var/obj/effect/proc_holder/spell/aoe/repulse/spacedragon/repulse_action = new /obj/effect/proc_holder/spell/aoe/repulse/spacedragon(src)
var/datum/spell/aoe/repulse/spacedragon/repulse_action = new /datum/spell/aoe/repulse/spacedragon(src)
repulse_action.action.Grant(src)
mob_spell_list += repulse_action
. = ..()
@@ -638,7 +638,7 @@ Difficulty: Medium
ranged_cooldown = world.time + ranged_cooldown_time
fire_stream()
/obj/effect/proc_holder/spell/aoe/repulse/spacedragon
/datum/spell/aoe/repulse/spacedragon
name = "Tail Sweep"
desc = "Throw back attackers with a sweep of your tail."
sound = 'sound/magic/tail_swing.ogg'
@@ -651,7 +651,7 @@ Difficulty: Medium
action_background_icon_state = "bg_alien"
aoe_range = 1
/obj/effect/proc_holder/spell/aoe/repulse/spacedragon/cast(list/targets, mob/user = usr)
/datum/spell/aoe/repulse/spacedragon/cast(list/targets, mob/user = usr)
if(iscarbon(user))
var/mob/living/carbon/C = user
playsound(C.loc, 'sound/effects/hit_punch.ogg', 80, TRUE, TRUE)
@@ -28,7 +28,7 @@
/mob/living/simple_animal/hostile/retaliate/kangaroo/Initialize(mapload)
. = ..()
// Leap spell, player-only usage
AddSpell(new /obj/effect/proc_holder/spell/leap)
AddSpell(new /datum/spell/leap)
/mob/living/simple_animal/hostile/retaliate/kangaroo/AttackingTarget()
if(client && a_intent != INTENT_HARM)
@@ -46,18 +46,18 @@
/mob/living/simple_animal/hostile/poison/terror_spider/prince/Initialize(mapload)
. = ..()
if(mind)
var/obj/effect/proc_holder/spell/spell = new /obj/effect/proc_holder/spell/princely_charge()
var/datum/spell/spell = new /datum/spell/princely_charge()
mind.AddSpell(spell)
else
RegisterSignal(src, COMSIG_MOB_LOGIN, TYPE_PROC_REF(/mob/living/simple_animal/hostile/poison/terror_spider/prince, give_spell))
/mob/living/simple_animal/hostile/poison/terror_spider/prince/proc/give_spell()
SIGNAL_HANDLER
var/obj/effect/proc_holder/spell/spell = new /obj/effect/proc_holder/spell/princely_charge()
var/datum/spell/spell = new /datum/spell/princely_charge()
mind.AddSpell(spell)
UnregisterSignal(src, COMSIG_MOB_LOGIN)
/obj/effect/proc_holder/spell/princely_charge
/datum/spell/princely_charge
name = "Princely Charge"
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."
@@ -65,10 +65,10 @@
clothes_req = FALSE
action_icon_state = "terror_prince"
/obj/effect/proc_holder/spell/princely_charge/create_new_targeting()
/datum/spell/princely_charge/create_new_targeting()
return new /datum/spell_targeting/clicked_atom
/obj/effect/proc_holder/spell/princely_charge/cast(list/targets, mob/user)
/datum/spell/princely_charge/cast(list/targets, mob/user)
var/target = targets[1]
if(isliving(user))
var/mob/living/L = user
@@ -70,7 +70,7 @@
/mob/living/simple_animal/shade/sword/Initialize(mapload)
.=..()
AddSpell(new /obj/effect/proc_holder/spell/sentient_sword_lunge)
AddSpell(new /datum/spell/sentient_sword_lunge)
var/obj/item/nullrod/scythe/talking/host_sword = loc
if(istype(host_sword))
health = host_sword.obj_integrity
+1 -1
View File
@@ -77,7 +77,7 @@
if(mind)
for(var/S in mind.spell_list)
var/obj/effect/proc_holder/spell/spell = S
var/datum/spell/spell = S
spell.UpdateButtons()
return TRUE
+3 -3
View File
@@ -1158,14 +1158,14 @@ GLOBAL_LIST_INIT(slot_equipment_priority, list( \
visible_message("<span class='warning'>[src] pukes all over [p_themselves()]!</span>","<span class='warning'>You puke all over yourself!</span>")
add_vomit_floor(TRUE)
/mob/proc/AddSpell(obj/effect/proc_holder/spell/S)
/mob/proc/AddSpell(datum/spell/S)
mob_spell_list += S
S.action.Grant(src)
/mob/proc/RemoveSpell(obj/effect/proc_holder/spell/spell) //To remove a specific spell from a mind
/mob/proc/RemoveSpell(datum/spell/spell) //To remove a specific spell from a mind
if(!spell)
return
for(var/obj/effect/proc_holder/spell/S in mob_spell_list)
for(var/datum/spell/S in mob_spell_list)
if(istype(S, spell))
qdel(S)
mob_spell_list -= S
+1 -1
View File
@@ -197,7 +197,7 @@
var/registered_z
var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override
var/datum/spell/ranged_ability //Any ranged ability the mob has, as a click override
/// Overrides the health HUD element state if set.
var/health_hud_override = HEALTH_HUD_OVERRIDE_NONE
+2 -2
View File
@@ -46,8 +46,8 @@
occupier.eyeobj.name = "[occupier.name] (AI Eye)"
if(malf.parent)
qdel(malf)
var/datum/action/innate/ai/return_to_core/R = new
R.Grant(occupier)
var/datum/spell/ai_spell/return_to_core/R = new
occupier.AddSpell(R)
occupier.cancel_camera()
if((SSsecurity_level.get_current_level_as_number() == SEC_LEVEL_DELTA) && malf.nuking)
for(var/obj/item/pinpointer/point in GLOB.pinpointer_list)
@@ -130,7 +130,7 @@
trigger_guard = TRIGGER_GUARD_ALLOW_ALL
clumsy_check = FALSE //Stole your uplink! Honk!
needs_permit = FALSE //go away beepsky
var/obj/effect/proc_holder/spell/mime/fingergun/parent_spell
var/datum/spell/mime/fingergun/parent_spell
/obj/item/gun/projectile/revolver/fingergun/Destroy()
if(parent_spell)
@@ -28,9 +28,6 @@
|| istype(A, /obj/item/reagent_containers) || istype(A, /obj/structure/sink) || istype(A, /obj/structure/janitorialcart) || istype(A, /obj/machinery/hydroponics))
return
if(istype(A, /obj/effect/proc_holder/spell))
return
if(istype(A, /obj/structure/reagent_dispensers) && get_dist(src,A) <= 1) //this block copypasted from reagent_containers/glass, for lack of a better solution
if(!A.reagents.total_volume && A.reagents)
to_chat(user, "<span class='notice'>[A] is empty.</span>")
@@ -521,12 +521,11 @@
/obj/effect/timestop/New()
..()
for(var/mob/living/M in GLOB.player_list)
for(var/obj/effect/proc_holder/spell/aoe/conjure/timestop/T in M.mind.spell_list) //People who can stop time are immune to timestop
for(var/datum/spell/aoe/conjure/timestop/T in M.mind.spell_list) //People who can stop time are immune to timestop
immune |= M
/obj/effect/timestop/proc/timestop()
playsound(get_turf(src), 'sound/magic/timeparadox2.ogg', 100, 1, -1)
playsound(get_turf(src), 'sound/magic/timeparadox2.ogg', 100, TRUE, -1)
for(var/i in 1 to duration-1)
for(var/A in orange (freezerange, loc))
if(isliving(A))
@@ -472,7 +472,7 @@
/obj/item/organ/internal/cyberimp/brain/hackerman_deck/remove(mob/living/carbon/M, special = 0)
. = ..()
if(M.mind)
M.mind.RemoveSpell(/obj/effect/proc_holder/spell/hackerman_deck)
M.mind.RemoveSpell(/datum/spell/hackerman_deck)
UnregisterSignal(M, COMSIG_BODY_TRANSFER_TO)
/obj/item/organ/internal/cyberimp/brain/hackerman_deck/proc/on_body_transfer()
@@ -485,8 +485,8 @@
/obj/item/organ/internal/cyberimp/brain/hackerman_deck/proc/add_spell()
if(owner.mind)
owner.mind.RemoveSpell(/obj/effect/proc_holder/spell/hackerman_deck) //Just to be sure.
owner.mind.AddSpell(new /obj/effect/proc_holder/spell/hackerman_deck(null))
owner.mind.RemoveSpell(/datum/spell/hackerman_deck) //Just to be sure.
owner.mind.AddSpell(new /datum/spell/hackerman_deck(null))
/obj/item/organ/internal/cyberimp/brain/hackerman_deck/emp_act(severity)
owner.adjustStaminaLoss(40 / severity)
@@ -494,7 +494,7 @@
to_chat(owner, "<span class='warning'>Your [name] heats up drastically!</span>")
return TRUE
/obj/effect/proc_holder/spell/hackerman_deck
/datum/spell/hackerman_deck
name = "Activate Ranged Hacking"
desc = "Click on any machine to hack them. Has a short range of only three tiles."
base_cooldown = 10 SECONDS
@@ -508,13 +508,13 @@
/// How many times have we successfully hacked in the last minute? Increases burn damage by 3 for each value above 0.
var/recent_hacking = 0
/obj/effect/proc_holder/spell/hackerman_deck/create_new_targeting()
/datum/spell/hackerman_deck/create_new_targeting()
var/datum/spell_targeting/clicked_atom/C = new()
C.range = 3
C.try_auto_target = FALSE
return C
/obj/effect/proc_holder/spell/hackerman_deck/on_mind_transfer(mob/living/L)
/datum/spell/hackerman_deck/on_mind_transfer(mob/living/L)
if(!ishuman(L))
return FALSE
var/mob/living/carbon/human/H = L
@@ -523,7 +523,7 @@
return FALSE
return TRUE
/obj/effect/proc_holder/spell/hackerman_deck/cast(list/targets, mob/user)
/datum/spell/hackerman_deck/cast(list/targets, mob/user)
var/atom/target = targets[1]
if(get_dist(user, target) > 3) //fucking cameras holy shit
to_chat(user, "<span class='warning'>Your implant is not robust enough to hack at that distance!</span>")
@@ -557,7 +557,7 @@
recent_hacking++
addtimer(CALLBACK(src, PROC_REF(lower_recent_hacking)), 1 MINUTES)
/obj/effect/proc_holder/spell/hackerman_deck/proc/lower_recent_hacking()
/datum/spell/hackerman_deck/proc/lower_recent_hacking()
recent_hacking--
//[[[[MOUTH]]]]
+11 -11
View File
@@ -60,8 +60,8 @@
w_class = WEIGHT_CLASS_NORMAL
origin_tech = "biotech=5;plasmatech=4"
slot = "plasmavessel"
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/plant_weeds, /obj/effect/proc_holder/spell/alien_spell/transfer_plasma)
human_powers = list(/obj/effect/proc_holder/spell/alien_spell/syphon_plasma)
alien_powers = list(/datum/spell/alien_spell/plant_weeds, /datum/spell/alien_spell/transfer_plasma)
human_powers = list(/datum/spell/alien_spell/syphon_plasma)
var/stored_plasma = 100
var/max_plasma = 300
@@ -130,8 +130,8 @@
icon_state = "acid"
slot = "acid"
origin_tech = "biotech=5;materials=2;combat=2"
alien_powers = list(/obj/effect/proc_holder/spell/touch/alien_spell/corrosive_acid)
human_powers = list(/obj/effect/proc_holder/spell/touch/alien_spell/burning_touch)
alien_powers = list(/datum/spell/touch/alien_spell/corrosive_acid)
human_powers = list(/datum/spell/touch/alien_spell/burning_touch)
/obj/item/organ/internal/alien/hivenode
name = "xeno hive node"
@@ -139,7 +139,7 @@
slot = "hivenode"
origin_tech = "biotech=5;magnets=4;bluespace=3"
w_class = WEIGHT_CLASS_TINY
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/whisper)
alien_powers = list(/datum/spell/alien_spell/whisper)
/obj/item/organ/internal/alien/hivenode/insert(mob/living/carbon/M, special = 0)
..()
@@ -160,16 +160,16 @@
icon_state = "neurotox"
slot = "neurotox"
origin_tech = "biotech=5;combat=5"
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/neurotoxin)
human_powers = list(/obj/effect/proc_holder/spell/alien_spell/neurotoxin/death_to_xenos)
alien_powers = list(/datum/spell/alien_spell/neurotoxin)
human_powers = list(/datum/spell/alien_spell/neurotoxin/death_to_xenos)
/obj/item/organ/internal/alien/resinspinner
name = "xeno resin organ"
icon_state = "liver-x"
slot = "spinner"
origin_tech = "biotech=5;materials=4"
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/build_resin)
human_powers = list(/obj/effect/proc_holder/spell/touch/alien_spell/consume_resin)
alien_powers = list(/datum/spell/alien_spell/build_resin)
human_powers = list(/datum/spell/touch/alien_spell/consume_resin)
/obj/item/organ/internal/alien/eggsac
name = "xeno egg sac"
@@ -177,6 +177,6 @@
slot = "eggsac"
w_class = WEIGHT_CLASS_BULKY
origin_tech = "biotech=6"
alien_powers = list(/obj/effect/proc_holder/spell/alien_spell/plant_weeds/eggs)
human_powers = list(/obj/effect/proc_holder/spell/alien_spell/combust_facehuggers)
alien_powers = list(/datum/spell/alien_spell/plant_weeds/eggs)
human_powers = list(/datum/spell/alien_spell/combust_facehuggers)
cargo_profit = 1000
@@ -1,6 +1,6 @@
/datum/unit_test/spell_targeting/Run()
var/list/bad_spells = list()
for(var/obj/effect/proc_holder/spell/S as anything in typesof(/obj/effect/proc_holder/spell))
for(var/datum/spell/S as anything in typesof(/datum/spell))
if(initial(S.name) == "Spell")
continue // Skip abstract spells
S = new S