Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MIRROR] Cultist pets #2590

Merged
merged 1 commit into from
Mar 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions code/__DEFINES/ai/pets.dm
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,20 @@
/// key that holds items we arent interested in hoarding
#define BB_IGNORE_ITEMS "ignore_items"

// Cultist pet keys
///our ability to summon runes
#define BB_RUNE_ABILITY "rune_ability"
///the cult team we serve
#define BB_CULT_TEAM "cult_team"
///our dead cultist we revive
#define BB_DEAD_CULTIST "dead_cultist"
///nearby runes
#define BB_NEARBY_RUNE "nearby_rune"
///occupied runes
#define BB_OCCUPIED_RUNE "occupied_rune"
///friendly cultists we befriend
#define BB_FRIENDLY_CULTIST "friendly_cultist"

//virtual pet keys
///the last PDA message we must relay
#define BB_LAST_RECIEVED_MESSAGE "last_recieved_message"
Expand Down
2 changes: 2 additions & 0 deletions code/__DEFINES/antagonists.dm
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,8 @@ GLOBAL_LIST_INIT(ai_employers, list(
/// Checks if the given mob is a blood cultist
#define IS_CULTIST(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/cult))

/// Checks if the mob is a sentient or non-sentient cultist
#define IS_CULTIST_OR_CULTIST_MOB(mob) ((IS_CULTIST(mob)) || (mob.faction.Find(FACTION_CULT)))
/// Checks if the given mob is a changeling
#define IS_CHANGELING(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/changeling))

Expand Down
6 changes: 6 additions & 0 deletions code/__DEFINES/cult.dm
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,12 @@
/// The global Nar'sie that the cult's summoned
GLOBAL_DATUM(cult_narsie, /obj/narsie)

///how many sacrifices we have used, cultists get 1 free revive at the start
GLOBAL_VAR_INIT(sacrifices_used, -SOULS_TO_REVIVE)

/// list of weakrefs to mobs OR minds that have been sacrificed
GLOBAL_LIST(sacrificed)

// Used in determining which cinematic to play when cult ends
#define CULT_VICTORY_MASS_CONVERSION 2
#define CULT_FAILURE_NARSIE_KILLED 1
Expand Down
8 changes: 4 additions & 4 deletions code/__DEFINES/span.dm
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@
#define span_command_headset(str) ("<span class='command_headset'>" + str + "</span>")
#define span_comradio(str) ("<span class='comradio'>" + str + "</span>")
#define span_cult(str) ("<span class='cult'>" + str + "</span>")
#define span_cultbold(str) ("<span class='cultbold'>" + str + "</span>")
#define span_cultboldtalic(str) ("<span class='cultboldtalic'>" + str + "</span>")
#define span_cultitalic(str) ("<span class='cultitalic'>" + str + "</span>")
#define span_cultlarge(str) ("<span class='cultlarge'>" + str + "</span>")
#define span_cult_bold(str) ("<span class='cult_bold'>" + str + "</span>")
#define span_cult_bold_italic(str) ("<span class='cult_bold_italic'>" + str + "</span>")
#define span_cult_italic(str) ("<span class='cult_italic'>" + str + "</span>")
#define span_cult_large(str) ("<span class='cult_large'>" + str + "</span>")
#define span_danger(str) ("<span class='danger'>" + str + "</span>")
#define span_deadsay(str) ("<span class='deadsay'>" + str + "</span>")
#define span_deconversion_message(str) ("<span class='deconversion_message'>" + str + "</span>")
Expand Down
2 changes: 2 additions & 0 deletions code/__DEFINES/traits/declarations.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1096,6 +1096,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Trait which self-identifies as an enemy of the law
#define TRAIT_ALWAYS_WANTED "always_wanted"

/// Trait given to mobs that have the basic eating element
#define TRAIT_MOB_EATER "mob_eater"
/// Trait which means whatever has this is dancing by a dance machine
#define TRAIT_DISCO_DANCER "disco_dancer"

Expand Down
1 change: 1 addition & 0 deletions code/_globalvars/traits/_traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_MINDSHIELD" = TRAIT_MINDSHIELD,
"TRAIT_MIND_TEMPORARILY_GONE" = TRAIT_MIND_TEMPORARILY_GONE,
"TRAIT_MOB_BREEDER" = TRAIT_MOB_BREEDER,
"TRAIT_MOB_EATER" = TRAIT_MOB_EATER,
"TRAIT_MOB_TIPPED" = TRAIT_MOB_TIPPED,
"TRAIT_MORBID" = TRAIT_MORBID,
"TRAIT_MULTIZ_SUIT_SENSORS" = TRAIT_MULTIZ_SUIT_SENSORS,
Expand Down
25 changes: 25 additions & 0 deletions code/datums/ai/basic_mobs/basic_ai_behaviors/pull_target.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/datum/ai_behavior/pull_target
behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION | AI_BEHAVIOR_REQUIRE_REACH

/datum/ai_behavior/pull_target/setup(datum/ai_controller/controller, target_key)
. = ..()
var/atom/target = controller.blackboard[target_key]
if(QDELETED(target))
return FALSE
set_movement_target(controller, target)

/datum/ai_behavior/pull_target/perform(seconds_per_tick, datum/ai_controller/controller, target_key)
. = ..()

var/atom/movable/target = controller.blackboard[target_key]
if(QDELETED(target) || target.anchored || target.pulledby)
finish_action(controller, FALSE, target_key)
return
var/mob/living/our_mob = controller.pawn
our_mob.start_pulling(target)
finish_action(controller, TRUE, target_key)

/datum/ai_behavior/pull_target/finish_action(datum/ai_controller/controller, succeeded, target_key)
. = ..()
if(!succeeded)
controller.clear_blackboard_key(target_key)
6 changes: 3 additions & 3 deletions code/datums/components/cult_ritual_item.dm
Original file line number Diff line number Diff line change
Expand Up @@ -283,13 +283,13 @@
return FALSE

if(ispath(rune_to_scribe, /obj/effect/rune/summon) && (!is_station_level(our_turf.z) || istype(get_area(cultist), /area/space)))
to_chat(cultist, span_cultitalic("The veil is not weak enough here to summon a cultist, you must be on station!"))
to_chat(cultist, span_cult_italic("The veil is not weak enough here to summon a cultist, you must be on station!"))
return

if(ispath(rune_to_scribe, /obj/effect/rune/apocalypse))
if((world.time - SSticker.round_start_time) <= 6000)
var/wait = 6000 - (world.time - SSticker.round_start_time)
to_chat(cultist, span_cultitalic("The veil is not yet weak enough for this rune - it will be available in [DisplayTimeText(wait)]."))
to_chat(cultist, span_cult_italic("The veil is not yet weak enough for this rune - it will be available in [DisplayTimeText(wait)]."))
return
if(!check_if_in_ritual_site(cultist, user_team, TRUE))
return
Expand Down Expand Up @@ -359,7 +359,7 @@
to_chat(cultist, span_warning("The sacrifice is not complete. The portal would lack the power to open if you tried!"))
return FALSE
if(summon_objective.check_completion())
to_chat(cultist, span_cultlarge("\"I am already here. There is no need to try to summon me now.\""))
to_chat(cultist, span_cult_large("\"I am already here. There is no need to try to summon me now.\""))
return FALSE
var/confirm_final = tgui_alert(cultist, "This is the FINAL step to summon Nar'Sie; it is a long, painful ritual and the crew will be alerted to your presence.", "Are you prepared for the final battle?", list("My life for Nar'Sie!", "No"))
if(confirm_final == "No")
Expand Down
2 changes: 2 additions & 0 deletions code/datums/elements/basic_eating.dm
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
if(!isliving(target))
return ELEMENT_INCOMPATIBLE

ADD_TRAIT(target, TRAIT_MOB_EATER, REF(src))
src.heal_amt = heal_amt
src.damage_amount = damage_amount
src.damage_type = damage_type
Expand All @@ -35,6 +36,7 @@
RegisterSignal(target, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(on_pre_attackingtarget))

/datum/element/basic_eating/Detach(datum/target)
REMOVE_TRAIT(target, TRAIT_MOB_EATER, REF(src))
UnregisterSignal(target, list(COMSIG_LIVING_UNARMED_ATTACK, COMSIG_HOSTILE_PRE_ATTACKINGTARGET))
return ..()

Expand Down
12 changes: 6 additions & 6 deletions code/game/objects/items/stacks/sheets/runed_metal.dm
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \
time = 4 SECONDS, \
one_per_turf = TRUE, \
on_solid_ground = TRUE, \
desc = span_cultbold("Pylon: Heals and regenerates the blood of nearby blood cultists and constructs, and also \
desc = span_cult_bold("Pylon: Heals and regenerates the blood of nearby blood cultists and constructs, and also \
converts nearby floor tiles into engraved flooring, which allows blood cultists to scribe runes faster."), \
required_noun = "runed metal sheet", \
category = CAT_CULT, \
Expand All @@ -20,7 +20,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \
time = 4 SECONDS, \
one_per_turf = TRUE, \
on_solid_ground = TRUE, \
desc = span_cultbold("Altar: Can make Eldritch Whetstones, Construct Shells, and Flasks of Unholy Water."), \
desc = span_cult_bold("Altar: Can make Eldritch Whetstones, Construct Shells, and Flasks of Unholy Water."), \
required_noun = "runed metal sheet", \
category = CAT_CULT, \
), \
Expand All @@ -31,7 +31,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \
time = 4 SECONDS, \
one_per_turf = TRUE, \
on_solid_ground = TRUE, \
desc = span_cultbold("Archives: Can make Zealot's Blindfolds, Shuttle Curse Orbs, \
desc = span_cult_bold("Archives: Can make Zealot's Blindfolds, Shuttle Curse Orbs, \
and Veil Walker equipment. Emits Light."), \
required_noun = "runed metal sheet", \
category = CAT_CULT, \
Expand All @@ -43,7 +43,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \
time = 4 SECONDS, \
one_per_turf = TRUE, \
on_solid_ground = TRUE, \
desc = span_cultbold("Daemon Forge: Can make Nar'Sien Hardened Armor, Flagellant's Robes, \
desc = span_cult_bold("Daemon Forge: Can make Nar'Sien Hardened Armor, Flagellant's Robes, \
and Eldritch Longswords. Emits Light."), \
required_noun = "runed metal sheet", \
category = CAT_CULT, \
Expand All @@ -54,7 +54,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \
time = 5 SECONDS, \
one_per_turf = TRUE, \
on_solid_ground = TRUE, \
desc = span_cultbold("Runed Door: A weak door which stuns non-blood cultists who touch it."), \
desc = span_cult_bold("Runed Door: A weak door which stuns non-blood cultists who touch it."), \
required_noun = "runed metal sheet", \
category = CAT_CULT, \
), \
Expand All @@ -64,7 +64,7 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list( \
time = 5 SECONDS, \
one_per_turf = TRUE, \
on_solid_ground = TRUE, \
desc = span_cultbold("Runed Girder: A weak girder that can be instantly destroyed by ritual daggers. Not a recommended usage of runed metal."), \
desc = span_cult_bold("Runed Girder: A weak girder that can be instantly destroyed by ritual daggers. Not a recommended usage of runed metal."), \
required_noun = "runed metal sheet", \
category = CAT_CULT, \
), \
Expand Down
52 changes: 26 additions & 26 deletions code/modules/antagonists/cult/blood_magic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@
limit = MAX_BLOODCHARGE
if(length(spells) >= limit)
if(rune)
to_chat(owner, span_cultitalic("You cannot store more than [MAX_BLOODCHARGE] spells. <b>Pick a spell to remove.</b>"))
to_chat(owner, span_cult_italic("You cannot store more than [MAX_BLOODCHARGE] spells. <b>Pick a spell to remove.</b>"))
else
to_chat(owner, span_cultitalic("<b><u>You cannot store more than [RUNELESS_MAX_BLOODCHARGE] spells without an empowering rune! Pick a spell to remove.</b></u>"))
to_chat(owner, span_cult_bold_italic("<u>You cannot store more than [RUNELESS_MAX_BLOODCHARGE] spells without an empowering rune! Pick a spell to remove.</u>"))
var/nullify_spell = tgui_input_list(owner, "Spell to remove", "Current Spells", spells)
if(isnull(nullify_spell))
return
Expand Down Expand Up @@ -77,7 +77,7 @@
if(!channeling)
channeling = TRUE
else
to_chat(owner, span_cultitalic("You are already invoking blood magic!"))
to_chat(owner, span_cult_italic("You are already invoking blood magic!"))
return
if(do_after(owner, 100 - rune*60, target = owner))
if(ishuman(owner))
Expand Down Expand Up @@ -167,7 +167,7 @@
/datum/action/innate/cult/blood_spell/emp/Activate()
owner.whisper(invocation, language = /datum/language/common)
owner.visible_message(span_warning("[owner]'s hand flashes a bright blue!"), \
span_cultitalic("You speak the cursed words, emitting an EMP blast from your hand."))
span_cult_italic("You speak the cursed words, emitting an EMP blast from your hand."))
empulse(owner, 2, 5)
charges--
if(charges <= 0)
Expand Down Expand Up @@ -205,13 +205,13 @@
var/turf/owner_turf = get_turf(owner)
owner.whisper(invocation, language = /datum/language/common)
owner.visible_message(span_warning("[owner]'s hand glows red for a moment."), \
span_cultitalic("Your plea for aid is answered, and light begins to shimmer and take form within your hand!"))
span_cult_italic("Your plea for aid is answered, and light begins to shimmer and take form within your hand!"))
var/obj/item/summoned_blade = new summoned_type(owner_turf)
if(owner.put_in_hands(summoned_blade))
to_chat(owner, span_warning("A [summoned_blade] appears in your hand!"))
else
owner.visible_message(span_warning("A [summoned_blade] appears at [owner]'s feet!"), \
span_cultitalic("A [summoned_blade] materializes at your feet."))
span_cult_italic("A [summoned_blade] materializes at your feet."))
SEND_SOUND(owner, sound('sound/effects/magic.ogg', FALSE, 0, 25))
charges--
if(charges <= 0)
Expand Down Expand Up @@ -249,7 +249,7 @@
clicked_on.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", sparkle_image, NONE)

addtimer(CALLBACK(clicked_on, TYPE_PROC_REF(/atom/, remove_alt_appearance), "cult_apoc", TRUE), 4 MINUTES, TIMER_OVERRIDE|TIMER_UNIQUE)
to_chat(caller, span_cultbold("[clicked_on] has been cursed with living nightmares!"))
to_chat(caller, span_cult_bold("[clicked_on] has been cursed with living nightmares!"))

charges--
desc = base_desc
Expand All @@ -272,7 +272,7 @@
/datum/action/innate/cult/blood_spell/veiling/Activate()
if(!revealing)
owner.visible_message(span_warning("Thin grey dust falls from [owner]'s hand!"), \
span_cultitalic("You invoke the veiling spell, hiding nearby runes."))
span_cult_italic("You invoke the veiling spell, hiding nearby runes."))
charges--
SEND_SOUND(owner, sound('sound/magic/smoke.ogg',0,1,25))
owner.whisper(invocation, language = /datum/language/common)
Expand All @@ -291,7 +291,7 @@
button_icon_state = "back"
else
owner.visible_message(span_warning("A flash of light shines from [owner]'s hand!"), \
span_cultitalic("You invoke the counterspell, revealing nearby runes."))
span_cult_italic("You invoke the counterspell, revealing nearby runes."))
charges--
owner.whisper(invocation, language = /datum/language/common)
SEND_SOUND(owner, sound('sound/magic/enter_blood.ogg',0,1,25))
Expand Down Expand Up @@ -404,7 +404,7 @@
return
if(IS_CULTIST(user))
user.visible_message(span_warning("[user] holds up [user.p_their()] hand, which explodes in a flash of red light!"), \
span_cultitalic("You attempt to stun [target] with the spell!"))
span_cult_italic("You attempt to stun [target] with the spell!"))
user.mob_light(range = 1.1, power = 2, color = LIGHT_COLOR_BLOOD_MAGIC, duration = 0.2 SECONDS)
if(IS_HERETIC(target))
to_chat(user, span_warning("Some force greater than you intervenes! [target] is protected by the Forgotten Gods!"))
Expand All @@ -425,7 +425,7 @@
else if(target.can_block_magic())
to_chat(user, span_warning("The spell had no effect!"))
else
to_chat(user, span_cultitalic("In a brilliant flash of red, [target] falls to the ground!"))
to_chat(user, span_cult_italic("In a brilliant flash of red, [target] falls to the ground!"))
target.Paralyze(16 SECONDS)
target.flash_act(1, TRUE)
if(issilicon(target))
Expand Down Expand Up @@ -464,7 +464,7 @@

var/turf/T = get_turf(src)
if(is_away_level(T.z))
to_chat(user, span_cultitalic("You are not in the right dimension!"))
to_chat(user, span_cult_italic("You are not in the right dimension!"))
return

var/input_rune_key = tgui_input_list(user, "Rune to teleport to", "Teleportation Target", potential_runes) //we know what key they picked
Expand All @@ -485,7 +485,7 @@
var/mob/living/L = target
if(do_teleport(L, dest, channel = TELEPORT_CHANNEL_CULT))
origin.visible_message(span_warning("Dust flows from [user]'s hand, and [user.p_they()] disappear[user.p_s()] with a sharp crack!"), \
span_cultitalic("You speak the words of the talisman and find yourself somewhere else!"), "<i>You hear a sharp crack.</i>")
span_cult_italic("You speak the words of the talisman and find yourself somewhere else!"), "<i>You hear a sharp crack.</i>")
dest.visible_message(span_warning("There is a boom of outrushing air as something appears above the rune!"), null, "<i>You hear a boom.</i>")
..()

Expand All @@ -502,7 +502,7 @@
if(C.canBeHandcuffed())
CuffAttack(C, user)
else
user.visible_message(span_cultitalic("This victim doesn't have enough arms to complete the restraint!"))
user.visible_message(span_cult_italic("This victim doesn't have enough arms to complete the restraint!"))
return
..()

Expand Down Expand Up @@ -560,7 +560,7 @@
/obj/item/melee/blood_magic/construction/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
if(proximity_flag && IS_CULTIST(user))
if(channeling)
to_chat(user, span_cultitalic("You are already invoking twisted construction!"))
to_chat(user, span_cult_italic("You are already invoking twisted construction!"))
return
. |= AFTERATTACK_PROCESSED_ITEM
var/turf/T = get_turf(target)
Expand Down Expand Up @@ -743,7 +743,7 @@
user.Beam(human_bloodbag, icon_state="drainbeam", time = 1 SECONDS)
playsound(get_turf(human_bloodbag), 'sound/magic/enter_blood.ogg', 50)
human_bloodbag.visible_message(span_danger("[user] drains some of [human_bloodbag]'s blood!"))
to_chat(user,span_cultitalic("Your blood rite gains 50 charges from draining [human_bloodbag]'s blood."))
to_chat(user,span_cult_italic("Your blood rite gains 50 charges from draining [human_bloodbag]'s blood."))
new /obj/effect/temp_visual/cult/sparks(get_turf(human_bloodbag))
else
to_chat(user,span_warning("[human_bloodbag.p_Theyre()] missing too much blood - you cannot drain [human_bloodbag.p_them()] further!"))
Expand Down Expand Up @@ -787,7 +787,7 @@
user.Beam(our_turf,icon_state="drainbeam", time = 15)
new /obj/effect/temp_visual/cult/sparks(get_turf(user))
playsound(our_turf, 'sound/magic/enter_blood.ogg', 50)
to_chat(user, span_cultitalic("Your blood rite has gained [round(blood_to_gain)] charge\s from blood sources around you!"))
to_chat(user, span_cult_italic("Your blood rite has gained [round(blood_to_gain)] charge\s from blood sources around you!"))
uses += max(1, round(blood_to_gain))

/obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user)
Expand All @@ -799,12 +799,12 @@
)
var/choice = show_radial_menu(user, src, spells, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE)
if(!check_menu(user))
to_chat(user, span_cultitalic("You decide against conducting a greater blood rite."))
to_chat(user, span_cult_italic("You decide against conducting a greater blood rite."))
return
switch(choice)
if("Bloody Halberd (150)")
if(uses < BLOOD_HALBERD_COST)
to_chat(user, span_cultitalic("You need [BLOOD_HALBERD_COST] charges to perform this rite."))
to_chat(user, span_cult_italic("You need [BLOOD_HALBERD_COST] charges to perform this rite."))
else
uses -= BLOOD_HALBERD_COST
var/turf/current_position = get_turf(user)
Expand All @@ -814,33 +814,33 @@
halberd_act_granted.Grant(user, rite)
rite.halberd_act = halberd_act_granted
if(user.put_in_hands(rite))
to_chat(user, span_cultitalic("A [rite.name] appears in your hand!"))
to_chat(user, span_cult_italic("A [rite.name] appears in your hand!"))
else
user.visible_message(span_warning("A [rite.name] appears at [user]'s feet!"), \
span_cultitalic("A [rite.name] materializes at your feet."))
span_cult_italic("A [rite.name] materializes at your feet."))
if("Blood Bolt Barrage (300)")
if(uses < BLOOD_BARRAGE_COST)
to_chat(user, span_cultitalic("You need [BLOOD_BARRAGE_COST] charges to perform this rite."))
to_chat(user, span_cult_italic("You need [BLOOD_BARRAGE_COST] charges to perform this rite."))
else
var/obj/rite = new /obj/item/gun/magic/wand/arcane_barrage/blood()
uses -= BLOOD_BARRAGE_COST
qdel(src)
if(user.put_in_hands(rite))
to_chat(user, span_cult("<b>Your hands glow with power!</b>"))
else
to_chat(user, span_cultitalic("You need a free hand for this rite!"))
to_chat(user, span_cult_italic("You need a free hand for this rite!"))
qdel(rite)
if("Blood Beam (500)")
if(uses < BLOOD_BEAM_COST)
to_chat(user, span_cultitalic("You need [BLOOD_BEAM_COST] charges to perform this rite."))
to_chat(user, span_cult_italic("You need [BLOOD_BEAM_COST] charges to perform this rite."))
else
var/obj/rite = new /obj/item/blood_beam()
uses -= BLOOD_BEAM_COST
qdel(src)
if(user.put_in_hands(rite))
to_chat(user, span_cultlarge("<b>Your hands glow with POWER OVERWHELMING!!!</b>"))
to_chat(user, span_cult_large("<b>Your hands glow with POWER OVERWHELMING!!!</b>"))
else
to_chat(user, span_cultitalic("You need a free hand for this rite!"))
to_chat(user, span_cult_italic("You need a free hand for this rite!"))
qdel(rite)

/obj/item/melee/blood_magic/manipulator/proc/check_menu(mob/living/user)
Expand Down
Loading
Loading