diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
index 1d47549685..68515426c3 100644
--- a/code/__DEFINES/antagonists.dm
+++ b/code/__DEFINES/antagonists.dm
@@ -70,6 +70,7 @@
///Heretics --
#define IS_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic))
+#define IS_HERETIC_MONSTER(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic_monster))
#define PATH_SIDE "Side"
diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm
index 1abe077980..90982a00ec 100644
--- a/code/datums/mood_events/generic_negative_events.dm
+++ b/code/datums/mood_events/generic_negative_events.dm
@@ -163,7 +163,7 @@
timeout = 3 MINUTES
/datum/mood_event/gates_of_mansus
- description = "LIVING IN A PERFORMANCE IS WORSE THAN DEATH\n"
+ description = "I HAD A GLIMPSE OF THE HORROR BEYOND THIS WORLD. REALITY UNCOILED BEFORE MY EYES!\n"
mood_change = -25
timeout = 4 MINUTES
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index cabdd7cfb8..19b12410bc 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -586,7 +586,7 @@
var/list/mob/living/targets = list()
for(var/mob/living/potential_target in oview(owner, 1))
- if(IS_HERETIC(potential_target) || potential_target.mind?.has_antag_datum(/datum/antagonist/heretic_monster))
+ if(IS_HERETIC(potential_target) || IS_HERETIC_MONSTER(potential_target))
continue
targets += potential_target
if(LAZYLEN(targets))
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_book.dm b/code/modules/antagonists/eldritch_cult/eldritch_book.dm
index 839150d37d..7f23922432 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_book.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_book.dm
@@ -40,7 +40,7 @@
///Gives you a charge and destroys a corresponding influence
/obj/item/forbidden_book/proc/get_power_from_influence(atom/target, mob/user)
var/obj/effect/reality_smash/RS = target
- to_chat(target, "You start drawing power from influence...")
+ to_chat(user, "You start drawing power from influence...")
if(do_after(user,10 SECONDS,TRUE,RS))
qdel(RS)
charge += 1
@@ -50,7 +50,7 @@
for(var/turf/T in range(1,target))
if(is_type_in_typecache(T, blacklisted_turfs))
- to_chat(target, "The terrain doesn't support runes!")
+ to_chat(user, "The terrain doesn't support runes!")
return
var/A = get_turf(target)
to_chat(user, "You start drawing a rune...")
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm
index 99794024f1..99f0ae7596 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm
@@ -8,6 +8,12 @@
///Used mainly for summoning ritual to prevent spamming the rune to create millions of monsters.
var/is_in_use = FALSE
+/obj/effect/eldritch/Initialize()
+ . = ..()
+ var/image/I = image(icon = 'icons/effects/eldritch.dmi', icon_state = null, loc = src)
+ I.override = TRUE
+ add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "heretic_rune", I)
+
/obj/effect/eldritch/attack_hand(mob/living/user)
. = ..()
if(.)
@@ -69,6 +75,7 @@
if(is_type_in_list(local_atom_in_range,local_required_atom_list))
selected_atoms |= local_atom_in_range
local_required_atoms -= list(local_required_atom_list)
+ break
if(length(local_required_atoms) > 0)
continue
@@ -190,6 +197,19 @@
icon_state = "pierced_illusion"
anchored = TRUE
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ alpha = 0
+ invisibility = INVISIBILITY_OBSERVER
+
+/obj/effect/broken_illusion/Initialize()
+ . = ..()
+ addtimer(CALLBACK(src, .proc/show_presence), 15 SECONDS)
+ var/image/I = image(icon = 'icons/effects/eldritch.dmi', icon_state = null, loc = src)
+ I.override = TRUE
+ add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "pierced_reality", I)
+
+/obj/effect/broken_illusion/proc/show_presence()
+ invisibility = 0
+ animate(src, alpha = 255, time = 15 SECONDS)
/obj/effect/broken_illusion/attack_hand(mob/living/user)
if(!ishuman(user))
@@ -228,17 +248,19 @@
explosion.start()
/obj/effect/broken_illusion/examine(mob/user)
+ . = ..()
if(!IS_HERETIC(user) && ishuman(user))
var/mob/living/carbon/human/human_user = user
to_chat(human_user,"Your brain hurts when you look at this!")
- human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN,30)
- . = ..()
+ human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN,20,190)
+ SEND_SIGNAL(human_user, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus)
/obj/effect/reality_smash
name = "/improper reality smash"
icon = 'icons/effects/eldritch.dmi'
anchored = TRUE
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
+ invisibility = INVISIBILITY_OBSERVER
///We cannot use icon_state since this is invisible, functions the same way but with custom behaviour.
var/image_state = "reality_smash"
///Who can see us?
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm
index 739304e822..da2c61ad16 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm
@@ -16,9 +16,9 @@
return
var/dist = get_dist(user.loc,target.loc)
var/dir = get_dir(user.loc,target.loc)
-
+
if(user.z != target.z)
- to_chat(user,"[target.real_name] is beyond our reach.")
+ to_chat(user,"[target.real_name] is on another plane of existance!")
else
switch(dist)
if(0 to 15)
@@ -33,6 +33,34 @@
if(target.stat == DEAD)
to_chat(user,"[target.real_name] is dead. Bring them onto a transmutation rune!")
+/datum/action/innate/heretic_shatter
+ name = "Shattering Offer"
+ desc = "By breaking your blade, you will be granted salvation from a dire situation. (Teleports you to a random safe turf on your current z level, but destroys your blade.)"
+ background_icon_state = "bg_ecult"
+ button_icon_state = "shatter"
+ icon_icon = 'icons/mob/actions/actions_ecult.dmi'
+ check_flags = MOBILITY_HOLD|MOBILITY_MOVE|MOBILITY_USE
+ var/mob/living/carbon/human/holder
+ var/obj/item/melee/sickly_blade/sword
+
+/datum/action/innate/heretic_shatter/Grant(mob/user, obj/object)
+ sword = object
+ holder = user
+ //i know what im doing
+ return ..()
+
+/datum/action/innate/heretic_shatter/IsAvailable()
+ if(IS_HERETIC(holder) || IS_HERETIC_MONSTER(holder))
+ return TRUE
+ else
+ return FALSE
+
+/datum/action/innate/heretic_shatter/Activate()
+ var/turf/safe_turf = find_safe_turf(zlevels = sword.z, extended_safety_checks = TRUE)
+ do_teleport(holder,safe_turf,forceMove = TRUE)
+ to_chat(holder,"You feel a gust of energy flow through your body... the Rusted Hills heard your call...")
+ qdel(sword)
+
/obj/item/melee/sickly_blade
name = "eldritch blade"
desc = "A sickly green crescent blade, decorated with an ornamental eye. You feel like you're being watched..."
@@ -50,15 +78,28 @@
throwforce = 10
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "rended")
+ var/datum/action/innate/heretic_shatter/linked_action
+
+/obj/item/melee/sickly_blade/Initialize()
+ . = ..()
+ linked_action = new(src)
/obj/item/melee/sickly_blade/attack(mob/living/M, mob/living/user)
- if(!IS_HERETIC(user))
+ if(!(IS_HERETIC(user) || !IS_HERETIC_MONSTER(user)))
to_chat(user,"You feel a pulse of some alien intellect lash out at your mind!")
var/mob/living/carbon/human/human_user = user
human_user.AdjustParalyzed(5 SECONDS)
return FALSE
return ..()
+/obj/item/melee/sickly_blade/pickup(mob/user)
+ . = ..()
+ linked_action.Grant(user, src)
+
+/obj/item/melee/sickly_blade/dropped(mob/user, silent)
+ . = ..()
+ linked_action.Remove(user, src)
+
/obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
var/datum/antagonist/heretic/cultie = user.mind.has_antag_datum(/datum/antagonist/heretic)
@@ -103,7 +144,7 @@
/obj/item/clothing/neck/eldritch_amulet/equipped(mob/user, slot)
. = ..()
- if(ishuman(user) && user.mind && slot == SLOT_NECK && IS_HERETIC(user))
+ if(ishuman(user) && user.mind && slot == SLOT_NECK && (IS_HERETIC(user) || IS_HERETIC_MONSTER(user)))
ADD_TRAIT(user, trait, CLOTHING_TRAIT)
user.update_sight()
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
index a7330cd93a..e0189944e5 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
@@ -264,12 +264,19 @@
if(!LH.target)
var/datum/objective/A = new
A.owner = user.mind
- var/datum/mind/targeted = A.find_target()//easy way, i dont feel like copy pasting that entire block of code
- LH.target = targeted.current
+ var/list/targets = list()
+ for(var/i in 0 to 3)
+ var/datum/mind/targeted = A.find_target()//easy way, i dont feel like copy pasting that entire block of code
+ if(!targeted)
+ break
+ targets[targeted.current.real_name] = targeted.current
+ LH.target = targets[input(user,"Choose your next target","Target") in targets]
+
+ if(!LH.target && targets.len)
+ LH.target = pick(targets) //Tsk tsk, you can and will get another target if you want it or not.
qdel(A)
if(LH.target)
to_chat(user,"Your new target has been selected, go and sacrifice [LH.target.real_name]!")
-
else
to_chat(user,"target could not be found for living heart.")
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm
index fbaa6cd26e..ba79cca07a 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm
@@ -34,7 +34,7 @@
desc = "Touch spell that allows you to channel the power of the Old Gods through you."
hand_path = /obj/item/melee/touch_attack/mansus_fist
school = "evocation"
- charge_max = 150
+ charge_max = 100
clothes_req = FALSE
action_icon = 'icons/mob/actions/actions_ecult.dmi'
action_icon_state = "mansus_grasp"
@@ -104,57 +104,61 @@
desc = "Spreads rust onto nearby turfs."
range = 2
-/obj/effect/proc_holder/spell/targeted/touch/blood_siphon
+/obj/effect/proc_holder/spell/pointed/blood_siphon
name = "Blood Siphon"
- desc = "Touch spell that heals you while damaging the enemy, has a chance to transfer wounds between you and your enemy."
- hand_path = /obj/item/melee/touch_attack/blood_siphon
+ desc = "A touch spell that heals your wounds while damaging the enemy. It has a chance to transfer wounds between you and your enemy."
school = "evocation"
charge_max = 150
clothes_req = FALSE
- invocation_type = "none"
+ invocation = "FL'MS O'ET'RN'ITY"
+ invocation_type = "whisper"
action_icon = 'icons/mob/actions/actions_ecult.dmi'
action_icon_state = "blood_siphon"
action_background_icon_state = "bg_ecult"
+ range = 9
-/obj/item/melee/touch_attack/blood_siphon
- name = "Blood Siphon"
- desc = "A sinister looking aura that distorts the flow of reality around it."
- color = RUNE_COLOR_RED
- icon_state = "disintegrate"
- item_state = "disintegrate"
- catchphrase = "SUN'AI'KINI'MAS"
-
-/obj/item/melee/touch_attack/blood_siphon/afterattack(atom/target, mob/user, proximity_flag, proximity)
- if(!proximity_flag)
- return
- playsound(user, 'sound/effects/curseattack.ogg', 75, TRUE)
+/obj/effect/proc_holder/spell/pointed/blood_siphon/cast(list/targets, mob/user)
+ . = ..()
+ var/target = targets[1]
+ playsound(user, 'sound/magic/demon_attack1.ogg', 75, TRUE)
if(ishuman(target))
var/mob/living/carbon/human/tar = target
if(tar.anti_magic_check())
- tar.visible_message("Spell bounces off of [target]!","The spell bounces off of you!")
+ tar.visible_message("The spell bounces off of [target]!","The spell bounces off of you!")
return ..()
- var/mob/living/carbon/C2 = user
+ var/mob/living/carbon/carbon_user = user
if(isliving(target))
- var/mob/living/L = target
- L.adjustBruteLoss(20)
- C2.adjustBruteLoss(-20)
+ var/mob/living/living_target = target
+ living_target.adjustBruteLoss(20)
+ carbon_user.adjustBruteLoss(-20)
if(iscarbon(target))
- var/mob/living/carbon/C1 = target
- for(var/obj/item/bodypart/bodypart in C2.bodyparts)
+ var/mob/living/carbon/carbon_target = target
+ for(var/bp in carbon_user.bodyparts)
+ var/obj/item/bodypart/bodypart = bp
for(var/i in bodypart.wounds)
var/datum/wound/iter_wound = i
if(prob(50))
continue
- var/obj/item/bodypart/target_bodypart = locate(bodypart.type) in C1.bodyparts
+ var/obj/item/bodypart/target_bodypart = locate(bodypart.type) in carbon_target.bodyparts
if(!target_bodypart)
continue
iter_wound.remove_wound()
iter_wound.apply_wound(target_bodypart)
- C1.blood_volume -= 20
- if(C2.blood_volume < BLOOD_VOLUME_MAXIMUM) //we dont want to explode after all
- C2.blood_volume += 20
- return ..()
+ carbon_target.blood_volume -= 20
+ if(carbon_user.blood_volume < BLOOD_VOLUME_MAXIMUM) //we dont want to explode after all
+ carbon_user.blood_volume += 20
+ return
+
+/obj/effect/proc_holder/spell/pointed/blood_siphon/can_target(atom/target, mob/user, silent)
+ . = ..()
+ if(!.)
+ return FALSE
+ if(!istype(target,/mob/living))
+ if(!silent)
+ to_chat(user, "You are unable to siphon [target]!")
+ return FALSE
+ return TRUE
/obj/effect/proc_holder/spell/aimed/rust_wave
name = "Patron's Reach"
@@ -451,7 +455,7 @@
new /obj/effect/hotspot(T)
T.hotspot_expose(700,50,1)
for(var/mob/living/livies in T.contents - centre)
- livies.adjustFireLoss(10)
+ livies.adjustFireLoss(5)
_range++
sleep(3)
@@ -500,7 +504,7 @@
new /obj/effect/hotspot(T)
T.hotspot_expose(700,50,1)
for(var/mob/living/livies in T.contents - current_user)
- livies.adjustFireLoss(5)
+ livies.adjustFireLoss(2.5)
/obj/effect/proc_holder/spell/targeted/worm_contract
@@ -519,6 +523,7 @@
. = ..()
if(!istype(user,/mob/living/simple_animal/hostile/eldritch/armsy))
to_chat(user, "You try to contract your muscles but nothing happens...")
+ return
var/mob/living/simple_animal/hostile/eldritch/armsy/armsy = user
armsy.contract_next_chain_into_single_tile()
@@ -727,7 +732,7 @@
/obj/effect/proc_holder/spell/cone/staggered/entropic_plume/do_mob_cone_effect(mob/living/victim, level)
. = ..()
- if(victim.anti_magic_check() || IS_HERETIC(victim) || victim.mind?.has_antag_datum(/datum/antagonist/heretic_monster))
+ if(victim.anti_magic_check() || IS_HERETIC(victim) || IS_HERETIC_MONSTER(victim))
return
victim.apply_status_effect(STATUS_EFFECT_AMOK)
victim.apply_status_effect(STATUS_EFFECT_CLOUDSTRUCK, (level*10))
diff --git a/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm
index 425052de2a..1edb0ff19a 100644
--- a/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm
+++ b/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm
@@ -190,7 +190,7 @@
required_atoms = list(/mob/living/carbon/human)
cost = 5
route = PATH_ASH
- var/list/trait_list = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_BOMBIMMUNE)
+ var/list/trait_list = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE)
/datum/eldritch_knowledge/final/ash_final/on_finished_recipe(mob/living/user, list/atoms, loc)
priority_announce("$^@*$^@(#&$(@^$^@# Fear the blaze, for Ashbringer [user.real_name] has come! $^@*$^@(#&$(@^$^@#","#$^@*$^@(#&$(@^$^@#", 'sound/announcer/classic/spanomalies.ogg')
diff --git a/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm
index 5e32cf1b4e..2b9f5b309f 100644
--- a/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm
+++ b/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm
@@ -173,9 +173,9 @@
/datum/eldritch_knowledge/summon/stalker
name = "Lonely Ritual"
gain_text = "I was able to combine my greed and desires to summon an eldritch beast I have not seen before."
- desc = "You can now summon a Stalker using a knife, a flower, a pen and a piece of paper using a transmutation circle. Stalkers possess the ability to shapeshift into various forms while assuming the vigor and powers of that form."
+ desc = "You can now summon a Stalker using a knife, a candle, a pen and a piece of paper using a transmutation circle. Stalkers possess the ability to shapeshift into various forms while assuming the vigor and powers of that form."
cost = 1
- required_atoms = list(/obj/item/kitchen/knife,/obj/item/reagent_containers/food/snacks/grown/poppy,/obj/item/pen,/obj/item/paper)
+ required_atoms = list(/obj/item/kitchen/knife,/obj/item/candle,/obj/item/pen,/obj/item/paper)
mob_to_summon = /mob/living/simple_animal/hostile/eldritch/stalker
next_knowledge = list(/datum/eldritch_knowledge/summon/ashy,/datum/eldritch_knowledge/summon/rusty,/datum/eldritch_knowledge/flesh_blade_upgrade_2)
route = PATH_FLESH
@@ -203,7 +203,7 @@
gain_text = "Our blood is all the same after all, the owl told me."
desc = "You are granted a spell that drains some of the targets health, and returns it to you. It also has a chance to transfer any wounds you possess onto the target."
cost = 1
- spell_to_add = /obj/effect/proc_holder/spell/targeted/touch/blood_siphon
+ spell_to_add = /obj/effect/proc_holder/spell/pointed/blood_siphon
next_knowledge = list(/datum/eldritch_knowledge/summon/raw_prophet,/datum/eldritch_knowledge/spell/area_conversion)
/datum/eldritch_knowledge/final/flesh_final
diff --git a/icons/mob/actions/actions_ecult.dmi b/icons/mob/actions/actions_ecult.dmi
index d083206454..5e51eedffd 100644
Binary files a/icons/mob/actions/actions_ecult.dmi and b/icons/mob/actions/actions_ecult.dmi differ