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