diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 84a4fbbac4c6..0dd53a28315d 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -43,6 +43,7 @@ #define MEDAL_BLADE_ASCENSION "Blade" #define MEDAL_COSMOS_ASCENSION "Cosmos" #define MEDAL_KNOCK_ASCENSION "Knock" +#define MEDAL_MOON_ASCENSION "Moon" #define MEDAL_TOOLBOX_SOUL "Toolsoul" #define MEDAL_CHEM_TUT "Beginner Chemist" #define MEDAL_HOT_DAMN "Hot Damn!" diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 4255724f00fb..86e484c7dcac 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -81,6 +81,7 @@ #define PATH_BLADE "Blade Path" #define PATH_COSMIC "Cosmic Path" #define PATH_KNOCK "Knock Path" +#define PATH_MOON "Moon Path" /// Defines are used in /proc/has_living_heart() to report if the heretic has no heart period, no living heart, or has a living heart. #define HERETIC_NO_HEART_ORGAN -1 @@ -219,8 +220,10 @@ GLOBAL_LIST_INIT(ai_employers, list( #define IS_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic)) /// Check if the given mob is a heretic monster. #define IS_HERETIC_MONSTER(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic_monster)) -/// Checks if the given mob is either a heretic or a heretic monster. -#define IS_HERETIC_OR_MONSTER(mob) (IS_HERETIC(mob) || IS_HERETIC_MONSTER(mob)) +/// Check if the given mob is a lunatic +#define IS_LUNATIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/lunatic)) +/// Checks if the given mob is either a heretic, heretic monster or a lunatic. +#define IS_HERETIC_OR_MONSTER(mob) (IS_HERETIC(mob) || IS_HERETIC_MONSTER(mob) || IS_LUNATIC(mob)) /// Checks if the given mob is a wizard #define IS_WIZARD(mob) (mob?.mind?.has_antag_datum(/datum/antagonist/wizard)) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 576581efcd97..13f334151663 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -1316,6 +1316,13 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai ///trait determines if this mob can breed given by /datum/component/breeding #define TRAIT_MOB_BREEDER "mob_breeder" + +/// Trait determines if this mob has examined an eldritch painting +#define TRAIT_ELDRITCH_PAINTING_EXAMINE "eldritch_painting_examine" + +/// Trait used by the /datum/brain_trauma/severe/flesh_desire trauma to change their preferences of what they eat +#define TRAIT_FLESH_DESIRE "flesh_desire" + ///trait given to food that can be baked by /datum/component/bakeable #define TRAIT_BAKEABLE "bakeable" diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 9d941fefff59..58ae40cd39aa 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -19,6 +19,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_LITERATE" = TRAIT_LITERATE, "TRAIT_ILLITERATE" = TRAIT_ILLITERATE, "TRAIT_MUTE" = TRAIT_MUTE, + "TRAIT_ELDRITCH_PAINTING_EXAMINE" = TRAIT_ELDRITCH_PAINTING_EXAMINE, + "TRAIT_FLESH_DESIRE" = TRAIT_FLESH_DESIRE, "TRAIT_EMOTEMUTE " = TRAIT_EMOTEMUTE, "TRAIT_DEAF" = TRAIT_DEAF, "TRAIT_FAT" = TRAIT_FAT, diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index a1cc77060a1f..f07a7530b665 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -135,6 +135,12 @@ database_id = MEDAL_COSMOS_ASCENSION icon = "cosmicascend" +/datum/award/achievement/misc/moon_ascension + name = "The Last Act" + desc = "You managed to become the ringleader and slay the lie." + database_id = MEDAL_MOON_ASCENSION + icon = "moonascend" + /datum/award/achievement/misc/grand_ritual_finale name = "Archmage" desc = "Made a big impression on the station with your phenomenal cosmic power." diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 5180b5982610..e19cde3daa97 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -319,3 +319,104 @@ /datum/brain_trauma/severe/dyslexia/on_lose() REMOVE_TRAIT(owner, TRAIT_ILLITERATE, TRAUMA_TRAIT) ..() + +/* + * Brain traumas that eldritch paintings apply + * This one is for "The Sister and He Who Wept" or /obj/structure/sign/painting/eldritch + */ +/datum/brain_trauma/severe/weeping + name = "The Weeping" + desc = "Patient hallucinates everyone as a figure called He Who Wept" + scan_desc = "H_E##%%%WEEP6%11S!!,)()" + gain_text = span_warning("HE WEEPS AND I WILL SEE HIM ONCE MORE") + lose_text = span_notice("You feel the tendrils of something slip from your mind.") + random_gain = FALSE + /// Our cooldown declare for causing hallucinations + COOLDOWN_DECLARE(weeping_hallucinations) + +/datum/brain_trauma/severe/weeping/on_life(seconds_per_tick, times_fired) + if(owner.stat != CONSCIOUS || owner.IsSleeping() || owner.IsUnconscious()) + return + // If they have examined a painting recently + if(HAS_TRAIT(owner, TRAIT_ELDRITCH_PAINTING_EXAMINE)) + return + if(!COOLDOWN_FINISHED(src, weeping_hallucinations)) + return + owner.cause_hallucination(/datum/hallucination/delusion/preset/heretic, "Caused by The Weeping brain trauma") + owner.add_mood_event("eldritch_weeping", /datum/mood_event/eldritch_painting/weeping) + COOLDOWN_START(src, weeping_hallucinations, 10 SECONDS) + ..() + +//This one is for "The First Desire" or /obj/structure/sign/painting/eldritch/desire +/datum/brain_trauma/severe/flesh_desire + name = "The Desire for Flesh" + desc = "Patient appears hungrier and only wishes to eat meats." + scan_desc = "H_(82882)G3E:__))9R" + gain_text = span_warning("I feel a hunger, only organs and flesh will feed it...") + lose_text = span_notice("You no longer feel the hunger for flesh...") + random_gain = FALSE + /// How much faster we loose hunger + var/hunger_rate = 15 + +/datum/brain_trauma/severe/flesh_desire/on_gain() + // Allows them to eat faster, mainly for flavor + ADD_TRAIT(owner, TRAIT_VORACIOUS, REF(src)) + ADD_TRAIT(owner, TRAIT_FLESH_DESIRE, REF(src)) + ..() + +/datum/brain_trauma/severe/flesh_desire/on_life(seconds_per_tick, times_fired) + // Causes them to need to eat at 10x the normal rate + owner.adjust_nutrition(-hunger_rate * HUNGER_FACTOR) + if(SPT_PROB(10, seconds_per_tick)) + to_chat(owner, span_notice("You feel a ravenous hunger for flesh...")) + owner.overeatduration = max(owner.overeatduration - 200 SECONDS, 0) + +/datum/brain_trauma/severe/flesh_desire/on_lose() + REMOVE_TRAIT(owner, TRAIT_VORACIOUS, REF(src)) + REMOVE_TRAIT(owner, TRAIT_FLESH_DESIRE, REF(src)) + return ..() + +// This one is for "Lady out of gates" or /obj/item/wallframe/painting/eldritch/beauty +/datum/brain_trauma/severe/eldritch_beauty + name = "The Pursuit of Perfection" + desc = "Patient seems to furiously scratch at their body, the only way to make them cease is for them to remove their jumpsuit." + scan_desc = "I_)8(P_E##R&&F(E)C__T)" + gain_text = span_warning("I WILL RID MY FLESH FROM IMPERFECTION!! I WILL BE PERFECT WITHOUT MY SUITS!!") + lose_text = span_notice("You feel the influence of something slip your mind, and you feel content as you are.") + random_gain = FALSE + /// How much damage we deal with each scratch + var/scratch_damage = 0.5 + +/datum/brain_trauma/severe/eldritch_beauty/on_life(seconds_per_tick, times_fired) + // Jumpsuits ruin the "perfection" of the body + if(!owner.get_item_by_slot(ITEM_SLOT_ICLOTHING)) + return + + // Scratching code + var/obj/item/bodypart/bodypart = owner.get_bodypart(owner.get_random_valid_zone(even_weights = TRUE)) + if(!(bodypart && IS_ORGANIC_LIMB(bodypart)) && bodypart.bodypart_flags & BODYPART_PSEUDOPART) + return + if(owner.incapacitated()) + return + bodypart.receive_damage(scratch_damage) + if(SPT_PROB(33, seconds_per_tick)) + to_chat(owner, span_notice("You scratch furiously at [bodypart] to ruin the cloth that hides the beauty!")) + +// This one is for "Climb over the rusted mountain" or /obj/structure/sign/painting/eldritch/rust +/datum/brain_trauma/severe/rusting + name = "The Rusted Climb" + desc = "Patient seems to oxidise things around them at random, and seem to believe they are aiding a creature in climbing a mountin." + scan_desc = "C_)L(#_I_##M;B" + gain_text = span_warning("The rusted climb shall finish at the peak") + lose_text = span_notice("The rusted climb? Whats that? An odd dream to be sure.") + random_gain = FALSE + +/datum/brain_trauma/severe/rusting/on_life(seconds_per_tick, times_fired) + var/atom/tile = get_turf(owner) + // Examining a painting should stop this effect to give counterplay + if(HAS_TRAIT(owner, TRAIT_ELDRITCH_PAINTING_EXAMINE)) + return + + if(SPT_PROB(50, seconds_per_tick)) + to_chat(owner, span_notice("You feel eldritch energies pulse from your body!")) + tile.rust_heretic_act() diff --git a/code/datums/looping_sounds/projectiles.dm b/code/datums/looping_sounds/projectiles.dm new file mode 100644 index 000000000000..6bc9a466ea14 --- /dev/null +++ b/code/datums/looping_sounds/projectiles.dm @@ -0,0 +1,4 @@ +/datum/looping_sound/moon_parade + mid_sounds = list('sound/effects/moon_parade_soundloop.ogg' = 1) + mid_length = 0 + volume = 20 diff --git a/code/datums/mood_events/eldritch_painting_events.dm b/code/datums/mood_events/eldritch_painting_events.dm new file mode 100644 index 000000000000..7df89104263b --- /dev/null +++ b/code/datums/mood_events/eldritch_painting_events.dm @@ -0,0 +1,48 @@ +// These mood events are related to /obj/structure/sign/painting/eldritch +// Names are based on the subtype of painting they belong to + +// Mood applied for ripping the painting +/datum/mood_event/eldritch_painting + description = "YOU, I SHOULD NOT HAVE DONE THAT!!!" + mood_change = -6 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/weeping + description = "HE IS HERE, AND HE WEEPS!" + mood_change = -3 + timeout = 11 SECONDS + +/datum/mood_event/eldritch_painting/weeping_heretic + description = "Oh such arts! They truly inspire me!" + mood_change = 5 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/weeping_withdrawl + description = "My mind is clear from his influence." + mood_change = 1 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/desire_heretic + description = "A part gained, the manus takes and gives. What did it take from me?" + mood_change = -2 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/desire_examine + description = "A hunger kept at bay..." + mood_change = 3 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/heretic_vines + description = "Oh what a lovely flower!" + mood_change = 3 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/rust_examine + description = "The rusted climb can wait..." + mood_change = -2 + timeout = 3 MINUTES + +/datum/mood_event/eldritch_painting/rust_heretic_examine + description = "I must hurry the rusted climb!" + mood_change = 6 + timeout = 3 MINUTES diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index a2bd2ca87ff9..c22e940c990b 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -431,6 +431,16 @@ description = "I've been here too long! I want to go out and explore space!" mood_change = -3 +/datum/mood_event/moon_insanity + description = "THE MOON JUDGES AND FINDS ME WANTING!!!" + mood_change = -3 + timeout = 5 MINUTES + +/datum/mood_event/amulette_insanity + description = "I sEe THe LiGHt, It mUsT BE stOPPed" + mood_change = -6 + timeout = 5 MINUTES + ///Wizard cheesy grand finale - what everyone but the wizard gets /datum/mood_event/madness_despair description = "UNWORTHY, UNWORTHY, UNWORTHY!!!" diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index ef87af5d682c..75e8be9e4a80 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -360,6 +360,11 @@ special_screen_obj = "birthday" special_screen_replace = FALSE +/datum/mood_event/moon_smile + description = "THE MOON SHOWS ME THE TRUTH AND ITS SMILE IS FACED TOWARDS ME!!!" + mood_change = 10 + timeout = 2 MINUTES + ///Wizard cheesy grand finale - what the wizard gets /datum/mood_event/madness_elation description = "Madness truly is the greatest of blessings..." diff --git a/code/modules/antagonists/heretic/heretic_antag.dm b/code/modules/antagonists/heretic/heretic_antag.dm index 8d35b3892890..ffab9c9dcf42 100644 --- a/code/modules/antagonists/heretic/heretic_antag.dm +++ b/code/modules/antagonists/heretic/heretic_antag.dm @@ -66,6 +66,7 @@ PATH_BLADE = "label", // my favorite color is label PATH_COSMIC = "purple", PATH_KNOCK = "yellow", + PATH_MOON = "blue", ) var/static/list/path_to_rune_color = list( PATH_START = COLOR_LIME, @@ -76,6 +77,7 @@ PATH_BLADE = COLOR_SILVER, PATH_COSMIC = COLOR_PURPLE, PATH_KNOCK = COLOR_YELLOW, + PATH_MOON = COLOR_BLUE_LIGHT, ) /datum/antagonist/heretic/Destroy() diff --git a/code/modules/antagonists/heretic/heretic_knowledge.dm b/code/modules/antagonists/heretic/heretic_knowledge.dm index 8bbe32cb440e..3eca4f7eda6c 100644 --- a/code/modules/antagonists/heretic/heretic_knowledge.dm +++ b/code/modules/antagonists/heretic/heretic_knowledge.dm @@ -120,7 +120,7 @@ return TRUE /** - * Parses specific items into a more reaadble form. + * Parses specific items into a more readble form. * Can be overriden by knoweldge subtypes. */ /datum/heretic_knowledge/proc/parse_required_item(atom/item_path, number_of_things) @@ -185,7 +185,6 @@ continue how_much_to_use = min(required_atoms[requirement], sac_stack.amount) break - sac_stack.use(how_much_to_use) continue diff --git a/code/modules/antagonists/heretic/items/eldritch_painting.dm b/code/modules/antagonists/heretic/items/eldritch_painting.dm new file mode 100644 index 000000000000..1104f5187e05 --- /dev/null +++ b/code/modules/antagonists/heretic/items/eldritch_painting.dm @@ -0,0 +1,243 @@ +// The basic eldritch painting +/obj/item/wallframe/painting/eldritch + name = "The debug and a coder who slept" + icon = 'icons/obj/signs.dmi' + resistance_flags = FLAMMABLE + flags_1 = NONE + icon_state = "frame-empty" + result_path = /obj/structure/sign/painting/eldritch + pixel_shift = 30 + +/obj/structure/sign/painting/eldritch + name = "The debug and a coder who slept" + icon = 'icons/obj/signs.dmi' + icon_state = "frame-empty" + custom_materials = list(/datum/material/wood =SHEET_MATERIAL_AMOUNT) + resistance_flags = FLAMMABLE + buildable_sign = FALSE + // The list of canvas types accepted by this frame, set to zero here + accepted_canvas_types = list() + // Set to false since we don't want this to persist + persistence_id = FALSE + /// The trauma the painting applies + var/applied_trauma = /datum/brain_trauma/severe/pacifism + /// The text that shows up when you cross the paintings path + var/text_to_display = "I should not be seeing this..." + /// The range of the paintings effect + var/range = 7 + +/obj/structure/sign/painting/eldritch/Initialize(mapload, dir, building) + . = ..() + var/static/list/connections = list(COMSIG_ATOM_ENTERED = PROC_REF(apply_trauma)) + AddComponent(/datum/component/connect_range, tracked = src, connections = connections, range = range, works_in_containers = FALSE) + +/obj/structure/sign/painting/eldritch/proc/apply_trauma(datum/source, mob/living/carbon/viewer) + if (!isliving(viewer) || !can_see(viewer, src, range)) + return + if (!viewer.mind || !viewer.mob_mood || viewer.stat != CONSCIOUS || viewer.is_blind()) + return + // Certain paintings have no applied trauma, so we shouldnt do further effects if they don't + if(!applied_trauma) + return + if (viewer.has_trauma_type(applied_trauma)) + return + if(IS_HERETIC(viewer)) + return + if(viewer.can_block_magic(MAGIC_RESISTANCE)) + return + to_chat(viewer, span_notice(text_to_display)) + viewer.gain_trauma(applied_trauma, TRAUMA_RESILIENCE_SURGERY) + viewer.emote("scream") + to_chat(viewer, span_warning("As you gaze upon the painting your mind rends to its truth!")) + +/obj/structure/sign/painting/eldritch/wirecutter_act(mob/living/user, obj/item/I) + if(!user.can_block_magic(MAGIC_RESISTANCE)) + user.add_mood_event("ripped_eldritch_painting", /datum/mood_event/eldritch_painting) + to_chat(user, span_notice("Laughter echoes through your mind....")) + qdel(src) + +// On examine eldritch paintings give a trait so their effects can not be spammed +/obj/structure/sign/painting/eldritch/examine(mob/living/carbon/user) + . = ..() + if(HAS_TRAIT(user, TRAIT_ELDRITCH_PAINTING_EXAMINE)) + return + + ADD_TRAIT(user, TRAIT_ELDRITCH_PAINTING_EXAMINE, REF(src)) + addtimer(TRAIT_CALLBACK_REMOVE(user, TRAIT_ELDRITCH_PAINTING_EXAMINE, REF(src)), 3 MINUTES) + examine_effects(user) + +/obj/structure/sign/painting/eldritch/proc/examine_effects(mob/living/carbon/examiner) + if(IS_HERETIC(examiner)) + to_chat(examiner, span_notice("Oh, what arts!")) + else + to_chat(examiner, span_notice("Kinda strange painting.")) + +// The sister and He Who Wept eldritch painting +/obj/item/wallframe/painting/eldritch/weeping + name = "The sister and He Who Wept" + desc = "A beautiful artwork depicting a fair lady and HIM, HE WEEPS, I WILL SEE HIM AGAIN." + icon_state = "eldritch_painting_weeping" + result_path = /obj/structure/sign/painting/eldritch/weeping + +/obj/structure/sign/painting/eldritch/weeping + name = "The sister and He Who Wept" + desc = "A beautiful artwork depicting a fair lady and HIM, HE WEEPS, I WILL SEE HIM AGAIN. Destroyable with wirecutters." + icon_state = "eldritch_painting_weeping" + applied_trauma = /datum/brain_trauma/severe/weeping + text_to_display = "Oh what arts! She is so fair, and he...HE WEEPS!!!" + +/obj/structure/sign/painting/eldritch/weeping/examine_effects(mob/living/carbon/examiner) + if(!IS_HERETIC(examiner)) + to_chat(examiner, span_notice("Respite, for now....")) + examiner.mob_mood.mood_events.Remove("eldritch_weeping") + examiner.add_mood_event("weeping_withdrawl", /datum/mood_event/eldritch_painting/weeping_withdrawl) + return + + to_chat(examiner, span_notice("Oh, what arts! Just gazing upon it clears your mind.")) + examiner.remove_status_effect(/datum/status_effect/hallucination) + examiner.add_mood_event("heretic_eldritch_painting", /datum/mood_event/eldritch_painting/weeping_heretic) + +// The First Desire painting, using a lot of the painting/eldritch framework +/obj/item/wallframe/painting/eldritch/desire + name = "The First Desire" + desc = "A painting depicting a platter of flesh, just looking at it makes your stomach knot and mouth froth." + icon_state = "eldritch_painting_desire" + result_path = /obj/structure/sign/painting/eldritch/desire + +/obj/structure/sign/painting/eldritch/desire + name = "The First Desire" + desc = "A painting depicting a platter of flesh, just looking at it makes your stomach knot and mouth froth. Destroyable with wirecutters." + icon_state = "eldritch_painting_desire" + applied_trauma = /datum/brain_trauma/severe/flesh_desire + text_to_display = "What an artwork, just looking at it makes me hunger...." + +// The special examine interaction for this painting +/obj/structure/sign/painting/eldritch/desire/examine_effects(mob/living/carbon/examiner) + if(!IS_HERETIC(examiner)) + // Gives them some nutrition + examiner.adjust_nutrition(50) + to_chat(examiner, warning("You feel a searing pain in your stomach!")) + examiner.adjustOrganLoss(ORGAN_SLOT_STOMACH, 5) + to_chat(examiner, span_notice("You feel less hungry, but more empty somehow?")) + examiner.add_mood_event("respite_eldritch_hunger", /datum/mood_event/eldritch_painting/desire_examine) + return + + // A list made of the organs and bodyparts the heretic can get + var/static/list/random_bodypart_or_organ = list( + /obj/item/organ/internal/brain, + /obj/item/organ/internal/lungs, + /obj/item/organ/internal/eyes, + /obj/item/organ/internal/ears, + /obj/item/organ/internal/heart, + /obj/item/organ/internal/liver, + /obj/item/organ/internal/stomach, + /obj/item/organ/internal/appendix, + /obj/item/bodypart/arm/left, + /obj/item/bodypart/arm/right, + /obj/item/bodypart/leg/left, + /obj/item/bodypart/leg/right + ) + var/organ_or_bodypart_to_spawn = pick(random_bodypart_or_organ) + new organ_or_bodypart_to_spawn(drop_location()) + to_chat(examiner, span_notice("A piece of flesh crawls out of the painting and flops onto the floor.")) + // Adds a negative mood event to our heretic + examiner.add_mood_event("heretic_eldritch_hunger", /datum/mood_event/eldritch_painting/desire_heretic) + +// Great chaparral over rolling hills, this one doesn't have the sensor type +/obj/item/wallframe/painting/eldritch/vines + name = "Great chaparral over rolling hills" + desc = "A painting depicting a massive thicket, it seems to be attempting to crawl through the frame." + icon_state = "eldritch_painting_vines" + result_path = /obj/structure/sign/painting/eldritch/vines + +/obj/structure/sign/painting/eldritch/vines + name = "Great chaparral over rolling hills" + desc = "A painting depicting a massive thicket, it seems to be attempting to crawl through the frame. Destroyable with wirecutters." + icon_state = "eldritch_painting_vines" + applied_trauma = null + // A static list of 5 pretty strong mutations, simple to expand for any admins + var/list/mutations = list( + /datum/spacevine_mutation/hardened, + /datum/spacevine_mutation/toxicity, + /datum/spacevine_mutation/thorns, + /datum/spacevine_mutation/fire_proof, + /datum/spacevine_mutation/aggressive_spread, + ) + // Poppy and harebell are used in heretic rituals + var/list/items_to_spawn = list( + /obj/item/food/grown/poppy, + /obj/item/food/grown/harebell, + ) + +/obj/structure/sign/painting/eldritch/vines/Initialize(mapload, dir, building) + . = ..() + new /datum/spacevine_controller(get_turf(src), mutations, 0, 10) + +/obj/structure/sign/painting/eldritch/vines/examine_effects(mob/living/carbon/examiner) + . = ..() + if(!IS_HERETIC(examiner)) + new /datum/spacevine_controller(get_turf(examiner), mutations, 0, 10) + to_chat(examiner, span_notice("The thicket crawls through the frame, and you suddenly find vines beneath you...")) + return + + var/item_to_spawn = pick(items_to_spawn) + to_chat(examiner, span_notice("You picture yourself in the thicket picking flowers..")) + new item_to_spawn(examiner.drop_location()) + examiner.add_mood_event("heretic_vines", /datum/mood_event/eldritch_painting/heretic_vines) + + +// Lady out of gates, gives a brain trauma causing the person to scratch themselves +/obj/item/wallframe/painting/eldritch/beauty + name = "Lady out of gates" + desc = "A painting depicting a perfect lady, and I must be perfect like her..." + icon_state = "eldritch_painting_beauty" + result_path = /obj/structure/sign/painting/eldritch/beauty + +/obj/structure/sign/painting/eldritch/beauty + name = "Lady out of gates" + desc = "A painting depicting a perfect lady, and I must be perfect like her. Destroyable with wirecutters." + icon_state = "eldritch_painting_beauty" + applied_trauma = /datum/brain_trauma/severe/eldritch_beauty + text_to_display = "Her flesh glows in the pale light, and mine can too...If it wasnt for these imperfections...." + // Set to mutadone by default to remove mutations + var/list/reagents_to_add = list(/datum/reagent/medicine/mutadone) + +// The special examine interaction for this painting +/obj/structure/sign/painting/eldritch/beauty/examine_effects(mob/living/carbon/examiner) + . = ..() + if(!examiner.has_dna()) + return + + if(!IS_HERETIC(examiner)) + to_chat(examiner, "You feel changed, more perfect....") + examiner.easy_random_mutate(NEGATIVE + MINOR_NEGATIVE) + return + + to_chat(examiner, "Your imperfections shed and you are restored.") + examiner.reagents.add_reagent(reagents_to_add, 5) + +// Climb over the rusted mountain, gives a brain trauma causing the person to randomly rust tiles beneath them +/obj/item/wallframe/painting/eldritch/rust + name = "Climb over the rusted mountain" + desc = "A painting depicting something climbing a mountain of rust, it gives you an eerie feeling." + icon_state = "eldritch_painting_rust" + result_path = /obj/structure/sign/painting/eldritch/rust + +/obj/structure/sign/painting/eldritch/rust + name = "Climb over the rusted mountain" + desc = "A painting depicting something climbing a mountain of rust, it gives you an eerie feeling. Destroyable with wirecutters." + icon_state = "eldritch_painting_rust" + applied_trauma = /datum/brain_trauma/severe/rusting + text_to_display = "It climbs, and I will aid it...The rust calls and I shall answer..." + +// The special examine interaction for this painting +/obj/structure/sign/painting/eldritch/rust/examine_effects(mob/living/carbon/examiner) + . = ..() + + if(!IS_HERETIC(examiner)) + to_chat(examiner, "It can wait...") + examiner.add_mood_event("rusted_examine", /datum/mood_event/eldritch_painting/rust_examine) + return + + to_chat(examiner, "You see the climber, and are inspired by it!") + examiner.add_mood_event("rusted_examine", /datum/mood_event/eldritch_painting/rust_heretic_examine) diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index d3eb4bf58399..c83fde235797 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -128,3 +128,12 @@ after_use_message = "The Mother of Ants hears your call..." tool_behaviour = TOOL_CROWBAR toolspeed = 1.3 + +// Path of Moon's blade +/obj/item/melee/sickly_blade/moon + name = "\improper moon blade" + desc = "A blade of iron, reflecting the truth of the earth: All join the troupe one day. \ + A troupe bringing joy, carving smiles on their faces if they want one or not." + icon_state = "moon_blade" + inhand_icon_state = "moon_blade" + after_use_message = "The Moon hears your call..." diff --git a/code/modules/antagonists/heretic/items/heretic_necks.dm b/code/modules/antagonists/heretic/items/heretic_necks.dm index c46a4bf214c5..b84b4a8747a9 100644 --- a/code/modules/antagonists/heretic/items/heretic_necks.dm +++ b/code/modules/antagonists/heretic/items/heretic_necks.dm @@ -50,3 +50,36 @@ icon = 'icons/obj/eldritch.dmi' icon_state = "eye_medalion" w_class = WEIGHT_CLASS_SMALL + + +// The amulette conversion tool used by moon heretics +/obj/item/clothing/neck/heretic_focus/moon_amulette + name = "Moonlight Amulette" + desc = "A piece of the mind, the soul and the moon. Gazing into it makes your head spin and hear whispers of laughter and joy." + icon = 'icons/obj/eldritch.dmi' + icon_state = "moon_amulette" + w_class = WEIGHT_CLASS_SMALL + // How much damage does this item do to the targets sanity? + var/sanity_damage = 20 + +/obj/item/clothing/neck/heretic_focus/moon_amulette/attack(mob/living/target, mob/living/user, params) + var/mob/living/carbon/human/hit = target + if(!IS_HERETIC_OR_MONSTER(user)) + user.balloon_alert(user, "you feel a presence watching you") + user.add_mood_event("Moon Amulette Insanity", /datum/mood_event/amulette_insanity) + user.mob_mood.set_sanity(user.mob_mood.sanity - 50) + return + if(hit.can_block_magic()) + return + if(!hit.mob_mood) + return + if(hit.mob_mood.sanity_level < SANITY_LEVEL_UNSTABLE) + user.balloon_alert(user, "their mind is too strong!") + hit.add_mood_event("Moon Amulette Insanity", /datum/mood_event/amulette_insanity) + hit.mob_mood.set_sanity(hit.mob_mood.sanity - sanity_damage) + else + user.balloon_alert(user, "their mind bends to see the truth!") + hit.apply_status_effect(/datum/status_effect/moon_converted) + user.log_message("made [target] insane.", LOG_GAME) + hit.log_message("was driven insane by [user]") + . = ..() diff --git a/code/modules/antagonists/heretic/items/unfathomable_curio.dm b/code/modules/antagonists/heretic/items/unfathomable_curio.dm new file mode 100644 index 000000000000..2bf7de4c6c6e --- /dev/null +++ b/code/modules/antagonists/heretic/items/unfathomable_curio.dm @@ -0,0 +1,75 @@ +//Item for knock/moon heretic sidepath, it can block 5 hits of damage, acts as storage and if the heretic is examined the examiner suffers brain damage and blindness + +/obj/item/storage/belt/unfathomable_curio + name = "Unfathomable Curio" + desc = "It. It looks backs. It looks past. It looks in. It sees. It hides. It opens." + icon_state = "unfathomable_curio" + worn_icon_state = "unfathomable_curio" + content_overlays = FALSE + drop_sound = 'sound/items/handling/toolbelt_drop.ogg' + pickup_sound = 'sound/items/handling/toolbelt_pickup.ogg' + //Vars used for the shield component + var/heretic_shield_icon = "unfathomable_shield" + var/max_charges = 1 + var/recharge_start_delay = 60 SECONDS + var/charge_increment_delay = 60 SECONDS + var/charge_recovery = 1 + +/obj/item/storage/belt/unfathomable_curio/Initialize(mapload) + . = ..() + atom_storage.max_specific_storage = WEIGHT_CLASS_NORMAL + atom_storage.max_total_storage = 21 + atom_storage.set_holdable(list( + /obj/item/bodypart, // Bodyparts are often used in rituals. + /obj/item/clothing/neck/eldritch_amulet, + /obj/item/clothing/neck/heretic_focus, + /obj/item/codex_cicatrix, + /obj/item/eldritch_potion, + /obj/item/food/grown/poppy, // Used to regain a Living Heart. + /obj/item/food/grown/harebell, // Used to reroll targets + /obj/item/melee/rune_carver, + /obj/item/melee/sickly_blade, + /obj/item/organ, // Organs are also often used in rituals. + /obj/item/reagent_containers/cup/beaker/eldritch, + /obj/item/stack/sheet/glass, // Glass is often used by moon heretics + )) + + AddComponent(/datum/component/shielded, max_charges = max_charges, recharge_start_delay = recharge_start_delay, charge_increment_delay = charge_increment_delay, \ + charge_recovery = charge_recovery, shield_icon = heretic_shield_icon, run_hit_callback = CALLBACK(src, PROC_REF(shield_damaged))) + + +/obj/item/storage/belt/unfathomable_curio/equipped(mob/user, slot, initial) + . = ..() + if(!(slot & slot_flags)) + return + + if(!IS_HERETIC(user)) + to_chat(user, span_warning("The curio wraps around you, and you feel the beating of something dark inside it...")) + + +// Our on hit effect +/obj/item/storage/belt/unfathomable_curio/proc/shield_damaged(mob/living/carbon/wearer, attack_text, new_current_charges) + var/list/brain_traumas = list( + /datum/brain_trauma/severe/mute, + /datum/brain_trauma/severe/flesh_desire, + /datum/brain_trauma/severe/eldritch_beauty, + /datum/brain_trauma/severe/paralysis, + /datum/brain_trauma/severe/monophobia + ) + wearer.visible_message(span_danger("[wearer]'s veil makes [attack_text] miss, but the force behind the blow causes it to disperse!")) + if(IS_HERETIC(wearer)) + return + + to_chat(wearer, span_warning("Laughter echoes in your mind....")) + wearer.adjustOrganLoss(ORGAN_SLOT_BRAIN, 40) + wearer.dropItemToGround(src, TRUE) + wearer.gain_trauma(pick(brain_traumas) ,TRAUMA_RESILIENCE_ABSOLUTE) + +/obj/item/storage/belt/unfathomable_curio/examine(mob/living/carbon/user) + . = ..() + if(IS_HERETIC(user)) + return + + user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 160) + user.adjust_temp_blindness(5 SECONDS) + . += span_notice("It. It looked. IT WRAPS ITSELF AROUND ME.") diff --git a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm index 829dcf64b987..781d52bfab01 100644 --- a/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/cosmic_lore.dm @@ -72,9 +72,9 @@ I spoke, and heard my own words echoed back." adds_sidepath_points = 1 next_knowledge = list( + /datum/heretic_knowledge/summon/fire_shark, /datum/heretic_knowledge/mark/cosmic_mark, /datum/heretic_knowledge/essence, - /datum/heretic_knowledge/summon/fire_shark, ) spell_to_add = /datum/action/cooldown/spell/cosmic_rune cost = 1 diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index 4969199cad4a..1a1ca91a6465 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -13,7 +13,6 @@ * Imperfect Ritual * > Sidepaths: * Void Cloak - * Ashen Eyes * * Mark of Flesh * Ritual of Knowledge @@ -21,13 +20,13 @@ * Raw Ritual * > Sidepaths: * Blood Siphon - * Curse of Paralysis + * Opening Blast * * Bleeding Steel * Lonely Ritual * > Sidepaths: - * Ashen Ritual * Cleave + * Aptera Vulnera * * Priest's Final Hymn */ @@ -130,7 +129,6 @@ next_knowledge = list( /datum/heretic_knowledge/mark/flesh_mark, /datum/heretic_knowledge/void_cloak, - /datum/heretic_knowledge/medallion, ) required_atoms = list( /mob/living/carbon/human = 1, @@ -251,7 +249,7 @@ /datum/heretic_knowledge/blade_upgrade/flesh, /datum/heretic_knowledge/reroll_targets, /datum/heretic_knowledge/spell/blood_siphon, - /datum/heretic_knowledge/curse/paralysis, + /datum/heretic_knowledge/spell/opening_blast, ) required_atoms = list( /obj/item/organ/internal/eyes = 1, @@ -290,7 +288,7 @@ adds_sidepath_points = 1 next_knowledge = list( /datum/heretic_knowledge/ultimate/flesh_final, - /datum/heretic_knowledge/summon/ashy, + /datum/heretic_knowledge/spell/apetra_vulnera, /datum/heretic_knowledge/spell/cleave, ) required_atoms = list( diff --git a/code/modules/antagonists/heretic/knowledge/knock_lore.dm b/code/modules/antagonists/heretic/knowledge/knock_lore.dm index 189ef5b80107..d5d2dd21e645 100644 --- a/code/modules/antagonists/heretic/knowledge/knock_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/knock_lore.dm @@ -5,21 +5,22 @@ * * A Locksmith’s Secret * Grasp of Knock - * > Sidepaths: - * Ashen Eyes - * Codex Cicatrix * Key Keeper’s Burden - * + * > Sidepaths: + * Mindgate * Rite Of Passage * Mark Of Knock * Ritual of Knowledge * Burglar's Finesse * > Sidepaths: - * Apetra Vulnera * Opening Blast + * Unfathomable Curio + * Unsealed arts * * Opening Blade * Caretaker’s Last Refuge + * > Sidepaths: + * Apetra Vulnera * * Many secrets behind the Spider Door */ @@ -45,11 +46,7 @@ DNA locks on mechs will be removed, and any pilot will be ejected. Works on consoles. \ Makes a distinctive knocking sound on use." gain_text = "Nothing may remain closed from my touch." - next_knowledge = list( - /datum/heretic_knowledge/key_ring, - /datum/heretic_knowledge/medallion, - /datum/heretic_knowledge/codex_cicatrix, - ) + next_knowledge = list(/datum/heretic_knowledge/key_ring) cost = 1 route = PATH_KNOCK @@ -106,7 +103,10 @@ /obj/item/card/id = 1, ) result_atoms = list(/obj/item/card/id/advanced/heretic) - next_knowledge = list(/datum/heretic_knowledge/limited_amount/rite_of_passage) + next_knowledge = list( + /datum/heretic_knowledge/limited_amount/rite_of_passage, + /datum/heretic_knowledge/spell/mind_gate, + ) cost = 1 route = PATH_KNOCK @@ -146,12 +146,13 @@ gain_text = "Their trinkets will be mine, as will their lives in due time." adds_sidepath_points = 1 next_knowledge = list( - /datum/heretic_knowledge/spell/apetra_vulnera, /datum/heretic_knowledge/spell/opening_blast, /datum/heretic_knowledge/blade_upgrade/flesh/knock, + /datum/heretic_knowledge/unfathomable_curio, + /datum/heretic_knowledge/painting, ) spell_to_add = /datum/action/cooldown/spell/pointed/burglar_finesse - cost = 2 + cost = 1 route = PATH_KNOCK /datum/heretic_knowledge/blade_upgrade/flesh/knock //basically a chance-based weeping avulsion version of the former @@ -174,7 +175,10 @@ You are invincible but unable to harm anything. Cancelled by being hit with an anti-magic item." gain_text = "Then I saw my my own reflection cascaded mind-numbingly enough times that I was but a haze." adds_sidepath_points = 1 - next_knowledge = list(/datum/heretic_knowledge/ultimate/knock_final) + next_knowledge = list( + /datum/heretic_knowledge/ultimate/knock_final, + /datum/heretic_knowledge/spell/apetra_vulnera, + ) route = PATH_KNOCK spell_to_add = /datum/action/cooldown/spell/caretaker cost = 1 diff --git a/code/modules/antagonists/heretic/knowledge/moon_lore.dm b/code/modules/antagonists/heretic/knowledge/moon_lore.dm new file mode 100644 index 000000000000..81c1a4ee740c --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/moon_lore.dm @@ -0,0 +1,287 @@ +/** + * # The path of Moon. + * + * Goes as follows: + * + * Moonlight Troupe + * Grasp of Lunacy + * Smile of the moon + * > Sidepaths: + * Mind Gate + * Ashen Eyes + * + * Mark of Moon + * Ritual of Knowledge + * Lunar Parade + * Moonlight Amulette + * > Sidepaths: + * Curse of Paralasys + * Unfathomable Curio + * Unsealed Arts + * + * Moonlight blade + * Ringleaders Rise + * > Sidepaths: + * Ashen Ritual + * + * Last Act + */ +/datum/heretic_knowledge/limited_amount/starting/base_moon + name = "Moonlight Troupe" + desc = "Opens up the Path of Moon to you. \ + Allows you to transmute 2 sheets of iron and a knife into an Lunar Blade. \ + You can only create two at a time." + gain_text = "Under the light of the moon the laughter echoes." + next_knowledge = list(/datum/heretic_knowledge/moon_grasp) + required_atoms = list( + /obj/item/knife = 1, + /obj/item/stack/sheet/iron = 2, + ) + result_atoms = list(/obj/item/melee/sickly_blade/moon) + route = PATH_MOON + +/datum/heretic_knowledge/base_moon/on_gain(mob/user, datum/antagonist/heretic/our_heretic) + add_traits(user ,TRAIT_EMPATH, REF(src)) + +/datum/heretic_knowledge/moon_grasp + name = "Grasp of Lunacy" + desc = "Your Mansus Grasp will cause them to hallucinate everyone as lunar mass, \ + and hides your identity for a short dur ation." + gain_text = "The troupe on the side of the moon showed me truth, and I took it." + next_knowledge = list(/datum/heretic_knowledge/spell/moon_smile) + cost = 1 + route = PATH_MOON + +/datum/heretic_knowledge/moon_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic) + RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp)) + +/datum/heretic_knowledge/moon_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic) + UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK) + +/datum/heretic_knowledge/moon_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target) + SIGNAL_HANDLER + source.apply_status_effect(/datum/status_effect/moon_grasp_hide) + + if(!iscarbon(target)) + return + var/mob/living/carbon/carbon_target = target + to_chat(carbon_target, span_danger("You hear echoing laughter from above")) + carbon_target.cause_hallucination(/datum/hallucination/delusion/preset/moon, "delusion/preset/moon hallucination caused by mansus grasp") + carbon_target.mob_mood.set_sanity(carbon_target.mob_mood.sanity-30) + +/datum/heretic_knowledge/spell/moon_smile + name = "Smile of the moon" + desc = "Grants you Smile of the moon, a ranged spell muting, blinding, deafening and knocking down the target for a\ + duration based on their sanity." + gain_text = "The moon smiles upon us all and those who see its true side can bring its joy." + adds_sidepath_points = 1 + next_knowledge = list( + /datum/heretic_knowledge/mark/moon_mark, + /datum/heretic_knowledge/medallion, + /datum/heretic_knowledge/spell/mind_gate, + ) + spell_to_add = /datum/action/cooldown/spell/pointed/moon_smile + cost = 1 + route = PATH_MOON + +/datum/heretic_knowledge/mark/moon_mark + name = "Mark of Moon" + desc = "Your Mansus Grasp now applies the Mark of Moon. The mark is triggered from an attack with your Moon Blade. \ + When triggered, the victim is confused, and when the mark is applied they are pacified \ + until attacked." + gain_text = "The troupe on the moon would dance all day long \ + and in that dance the moon would smile upon us \ + but when the night came its smile would dull forced to gaze on the earth." + next_knowledge = list(/datum/heretic_knowledge/knowledge_ritual/moon) + route = PATH_MOON + mark_type = /datum/status_effect/eldritch/moon + +/datum/heretic_knowledge/mark/moon_mark/trigger_mark(mob/living/source, mob/living/target) + . = ..() + if(!.) + return + + // Also refunds 75% of charge! + var/datum/action/cooldown/spell/touch/mansus_grasp/grasp = locate() in source.actions + if(grasp) + grasp.next_use_time = min(round(grasp.next_use_time - grasp.cooldown_time * 0.75, 0), 0) + grasp.build_all_button_icons() + +/datum/heretic_knowledge/knowledge_ritual/moon + next_knowledge = list(/datum/heretic_knowledge/spell/moon_parade) + route = PATH_MOON + +/datum/heretic_knowledge/spell/moon_parade + name = "Lunar Parade" + desc = "Grants you Lunar Parade, a spell that - after a short charge - sends a carnival forward \ + when hitting someone they are forced to join the parade and suffer hallucinations." + gain_text = "The music like a reflection of the soul compelled them, like moths to a flame they followed" + next_knowledge = list(/datum/heretic_knowledge/moon_amulette) + spell_to_add = /datum/action/cooldown/spell/pointed/projectile/moon_parade + cost = 1 + route = PATH_MOON + + +/datum/heretic_knowledge/moon_amulette + name = "Moonlight Amulette" + desc = "Allows you to transmute 2 sheets of glass, a heart and a tie \ + if the item is used on someone with low sanity they go berserk attacking everyone \ + , if their sanity isnt low enough it decreases their mood." + gain_text = "At the head of the parade he stood, the moon condensed into one mass, a reflection of the soul." + adds_sidepath_points = 1 + next_knowledge = list( + /datum/heretic_knowledge/blade_upgrade/moon, + /datum/heretic_knowledge/reroll_targets, + /datum/heretic_knowledge/unfathomable_curio, + /datum/heretic_knowledge/curse/paralysis, + /datum/heretic_knowledge/painting, + ) + required_atoms = list( + /obj/item/organ/internal/heart = 1, + /obj/item/stack/sheet/glass = 2, + /obj/item/clothing/neck/tie = 1, + ) + result_atoms = list(/obj/item/clothing/neck/heretic_focus/moon_amulette) + cost = 1 + route = PATH_MOON + +/datum/heretic_knowledge/blade_upgrade/moon + name = "Moonlight Blade" + desc = "Your blade now deals brain damage, causes random hallucinations and does sanity damage." + gain_text = "His wit was sharp as a blade, cutting through the lie to bring us joy." + next_knowledge = list(/datum/heretic_knowledge/spell/moon_ringleader) + route = PATH_MOON + +/datum/heretic_knowledge/blade_upgrade/moon/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade) + if(source == target) + return + + target.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10, 100) + target.cause_hallucination( \ + get_random_valid_hallucination_subtype(/datum/hallucination/body), \ + "upgraded path of moon blades", \ + ) + target.emote(pick("giggle", "laugh")) + target.mob_mood.set_sanity(target.mob_mood.sanity - 10) + +/datum/heretic_knowledge/spell/moon_ringleader + name = "Ringleaders Rise" + desc = "Grants you Ringleaders Rise, an aoe spell that deals more brain damage the lower the sanity of everyone in the AoE,\ + causes hallucinations with those who have less sanity getting more. \ + If their sanity is low enough turns them insane, the spell then halves their sanity." + gain_text = "I grabbed his hand and we rose, those who saw the truth rose with us. \ + The ringleader pointed up and the dim light of truth illuminated us further." + next_knowledge = list( + /datum/heretic_knowledge/ultimate/moon_final, + /datum/heretic_knowledge/summon/ashy, + ) + spell_to_add = /datum/action/cooldown/spell/aoe/moon_ringleader + cost = 1 + route = PATH_MOON + +/datum/heretic_knowledge/ultimate/moon_final + name = "The Last Act" + desc = "The ascension ritual of the Path of Moon. \ + Bring 3 corpses with more than 50 brain damage to a transmutation rune to complete the ritual. \ + When completed, you become a harbinger of madness gaining and aura of passive sanity decrease \ + , confusion increase and if their sanity is low enough brain damage and blindness. \ + 1/5th of the crew will turn into acolytes and follow your command, they will all recieve moonlight amulettes." + gain_text = "We dived down towards the crowd, his soul splitting off in search of greater venture \ + for where the Ringleader had started the parade, I shall continue it unto the suns demise \ + WITNESS MY ASCENSION, THE MOON SMILES ONCE MORE AND FOREVER MORE IT SHALL!" + route = PATH_MOON + +/datum/heretic_knowledge/ultimate/moon_final/is_valid_sacrifice(mob/living/sacrifice) + + var/brain_damage = sacrifice.get_organ_loss(ORGAN_SLOT_BRAIN) + // Checks if our target has enough brain damage + if(brain_damage < 50) + return FALSE + + return ..() + +/datum/heretic_knowledge/ultimate/moon_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc) + . = ..() + priority_announce( + text = "[generate_heretic_text()] Laugh, for the ringleader [user.real_name] has ascended! \ + The truth shall finally devour the lie! [generate_heretic_text()]", + title = "[generate_heretic_text()]", + sound = 'monkestation/sound/ambience/antag/heretic/ascend_moon.ogg', + color_override = "pink", + ) + + user.client?.give_award(/datum/award/achievement/misc/moon_ascension, user) + ADD_TRAIT(user, TRAIT_MADNESS_IMMUNE, REF(src)) + + RegisterSignal(user, COMSIG_LIVING_LIFE, PROC_REF(on_life)) + + // Roughly 1/5th of the station will rise up as lunatics to the heretic + for (var/mob/living/carbon/human/crewmate as anything in GLOB.human_list) + // How many lunatics we have + var/amount_of_lunatics = 0 + // Where the crewmate is, used to check their z-level + var/turf/crewmate_turf = get_turf(crewmate) + var/crewmate_z = crewmate_turf?.z + if(isnull(crewmate.mind)) + continue + if(crewmate.stat != CONSCIOUS) + continue + if(!is_station_level(crewmate_z)) + continue + // Heretics, lunatics and monsters shouldn't become lunatics because they either have a master or have a mansus grasp + if(IS_HERETIC_OR_MONSTER(crewmate)) + to_chat(crewmate, span_boldwarning("[user]'s rise is influencing those who are weak willed. Their minds shall rend." )) + continue + // Mindshielded and anti-magic folks are immune against this effect because this is a magical mind effect + if(HAS_TRAIT(crewmate, TRAIT_MINDSHIELD) || crewmate.can_block_magic(MAGIC_RESISTANCE)) + to_chat(crewmate, span_boldwarning("You feel shielded from something." )) + continue + if(amount_of_lunatics > length(GLOB.human_list) * 0.2) + to_chat(crewmate, span_boldwarning("You feel uneasy, as if for a brief moment something was gazing at you." )) + continue + var/datum/antagonist/lunatic/lunatic = crewmate.mind.add_antag_datum(/datum/antagonist/lunatic) + lunatic.set_master(user.mind, user) + var/obj/item/clothing/neck/heretic_focus/moon_amulette/amulet = new(crewmate_turf) + var/static/list/slots = list( + "neck" = ITEM_SLOT_NECK, + "hands" = ITEM_SLOT_HANDS, + "backpack" = ITEM_SLOT_BACKPACK, + "right pocket" = ITEM_SLOT_RPOCKET, + "left pocket" = ITEM_SLOT_RPOCKET, + ) + crewmate.equip_in_one_of_slots(amulet, slots, qdel_on_fail = FALSE) + crewmate.emote("laugh") + amount_of_lunatics += 1 + +/datum/heretic_knowledge/ultimate/moon_final/proc/on_life(mob/living/source, seconds_per_tick, times_fired) + var/obj/effect/moon_effect = /obj/effect/temp_visual/moon_ringleader + SIGNAL_HANDLER + + visible_hallucination_pulse( + center = get_turf(source), + radius = 7, + hallucination_duration = 60 SECONDS + ) + + for(var/mob/living/carbon/carbon_view in view(5, source)) + var/carbon_sanity = carbon_view.mob_mood.sanity + if(carbon_view.stat != CONSCIOUS) + continue + if(IS_HERETIC_OR_MONSTER(carbon_view)) + continue + new moon_effect(get_turf(carbon_view)) + carbon_view.adjust_confusion(2 SECONDS) + carbon_view.mob_mood.set_sanity(carbon_sanity - 5) + if(carbon_sanity < 30) + if(SPT_PROB(20, seconds_per_tick)) + to_chat(carbon_view, span_warning("you feel your mind beginning to rend!")) + carbon_view.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5) + if(carbon_sanity < 10) + if(SPT_PROB(20, seconds_per_tick)) + to_chat(carbon_view, span_warning("it echoes through you!")) + visible_hallucination_pulse( + center = get_turf(carbon_view), + radius = 7, + hallucination_duration = 50 SECONDS + ) + carbon_view.adjust_temp_blindness(5 SECONDS) diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm similarity index 95% rename from code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm rename to code/modules/antagonists/heretic/knowledge/side_ash_moon.dm index a593e61e8edc..142d280c1c7f 100644 --- a/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm +++ b/code/modules/antagonists/heretic/knowledge/side_ash_moon.dm @@ -6,7 +6,7 @@ gain_text = "Piercing eyes guided them through the mundane. Neither darkness nor terror could stop them." next_knowledge = list( /datum/heretic_knowledge/spell/ash_passage, - /datum/heretic_knowledge/limited_amount/flesh_ghoul, + /datum/heretic_knowledge/spell/moon_smile, ) required_atoms = list( /obj/item/organ/internal/eyes = 1, @@ -25,7 +25,7 @@ gain_text = "The flesh of humanity is weak. Make them bleed. Show them their fragility." next_knowledge = list( /datum/heretic_knowledge/mad_mask, - /datum/heretic_knowledge/summon/raw_prophet, + /datum/heretic_knowledge/moon_amulette, ) required_atoms = list( /obj/item/bodypart/leg/left = 1, @@ -63,8 +63,8 @@ They also have the ability to create a ring of fire around themselves for a length of time." gain_text = "I combined my principle of hunger with my desire for destruction. The Marshal knew my name, and the Nightwatcher gazed on." next_knowledge = list( - /datum/heretic_knowledge/summon/stalker, /datum/heretic_knowledge/spell/flame_birth, + /datum/heretic_knowledge/spell/moon_ringleader, ) required_atoms = list( /obj/effect/decal/cleanable/ash = 1, diff --git a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm index 6439840fed5d..4a315575d61b 100644 --- a/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm +++ b/code/modules/antagonists/heretic/knowledge/side_flesh_void.dm @@ -26,7 +26,6 @@ Also has a chance to transfer wounds from you to the victim." gain_text = "\"No matter the man, we bleed all the same.\" That's what the Marshal told me." next_knowledge = list( - /datum/heretic_knowledge/spell/apetra_vulnera, /datum/heretic_knowledge/spell/void_phase, /datum/heretic_knowledge/summon/raw_prophet, ) diff --git a/code/modules/antagonists/heretic/knowledge/side_knock_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_knock_flesh.dm index 97218ce5e941..e2825c6db286 100644 --- a/code/modules/antagonists/heretic/knowledge/side_knock_flesh.dm +++ b/code/modules/antagonists/heretic/knowledge/side_knock_flesh.dm @@ -1,4 +1,16 @@ // Sidepaths for knowledge between Knock and Flesh. +/datum/heretic_knowledge/spell/opening_blast + name = "Wave Of Desperation" + desc = "Grants you Wave Of Desparation, a spell which can only be cast while restrained. \ + It removes your restraints, repels and knocks down adjacent people, and applies the Mansus Grasp to everything nearby." + gain_text = "My shackles undone in dark fury, their feeble bindings crumble before my power." + next_knowledge = list( + /datum/heretic_knowledge/summon/raw_prophet, + /datum/heretic_knowledge/spell/burglar_finesse, + ) + spell_to_add = /datum/action/cooldown/spell/aoe/wave_of_desperation + cost = 1 + route = PATH_SIDE /datum/heretic_knowledge/spell/apetra_vulnera name = "Apetra Vulnera" @@ -7,22 +19,9 @@ Wounds a random limb if no limb is sufficiently damaged." gain_text = "Flesh opens, and blood spills. My master seeks sacrifice, and I shall appease." next_knowledge = list( - /datum/heretic_knowledge/spell/blood_siphon, - /datum/heretic_knowledge/void_cloak, + /datum/heretic_knowledge/summon/stalker, + /datum/heretic_knowledge/spell/caretaker_refuge, ) spell_to_add = /datum/action/cooldown/spell/pointed/apetra_vulnera cost = 1 route = PATH_SIDE - -/datum/heretic_knowledge/spell/opening_blast - name = "Wave Of Desperation" - desc = "Grants you Wave Of Desparation, a spell which can only be cast while restrained. \ - It removes your restraints, repels and knocks down adjacent people, and applies the Mansus Grasp to everything nearby." - gain_text = "My shackles undone in dark fury, their feeble bindings crumble before my power." - next_knowledge = list( - /datum/heretic_knowledge/summon/ashy, - /datum/heretic_knowledge/void_cloak, - ) - spell_to_add = /datum/action/cooldown/spell/aoe/wave_of_desperation - cost = 1 - route = PATH_SIDE diff --git a/code/modules/antagonists/heretic/knowledge/side_knock_moon.dm b/code/modules/antagonists/heretic/knowledge/side_knock_moon.dm new file mode 100644 index 000000000000..7ecbad932ba6 --- /dev/null +++ b/code/modules/antagonists/heretic/knowledge/side_knock_moon.dm @@ -0,0 +1,100 @@ +// Sidepaths for knowledge between Knock and Moon. + +/datum/heretic_knowledge/spell/mind_gate + name = "Mind Gate" + desc = "Grants you Mind Gate, a spell \ + which deals you 20 brain damage but the target suffers a hallucination,\ + is left confused for 10 seconds, suffers oxygen loss and brain damage." + gain_text = "My mind swings open like a gate, and its insight will let me percieve the truth." + next_knowledge = list( + /datum/heretic_knowledge/key_ring, + /datum/heretic_knowledge/spell/moon_smile, + ) + spell_to_add = /datum/action/cooldown/spell/pointed/mind_gate + cost = 1 + route = PATH_SIDE + +/datum/heretic_knowledge/unfathomable_curio + name = "Unfathomable Curio" + desc = "Allows you to transmute 3 rods, a lung and a belt into an Unfathomable Curio\ + , a belt that can hold blades and items for rituals. Whilst worn will also \ + veil you, allowing you to take 5 hits without suffering damage, this veil will recharge very slowly \ + outside of combat. When examined the examiner will suffer brain damage and blindness." + gain_text = "The mansus holds many a curio, some are not meant for the mortal eye." + next_knowledge = list( + /datum/heretic_knowledge/spell/burglar_finesse, + /datum/heretic_knowledge/moon_amulette, + ) + required_atoms = list( + /obj/item/organ/internal/lungs = 1, + /obj/item/stack/rods = 3, + /obj/item/storage/belt = 1, + ) + result_atoms = list(/obj/item/storage/belt/unfathomable_curio) + cost = 1 + route = PATH_SIDE + +/datum/heretic_knowledge/painting + name = "Unsealed Arts" + desc = "Allows you to transmute a canvas and an additional item to create a piece of art, these paintings \ + have different effects depending on the additional item added. Possible paintings: \ + The sister and He Who Wept: Eyes. When a non-heretic looks at the painting they will begin to hallucinate everyone as heretics. \ + The First Desire: Any bodypart. Increases the hunger of non-heretics, when examined drops an organ or body part at your feet. \ + Great chaparral over rolling hills: Any grown food. Spreads kudzu when placed, when examined grants a flower. \ + Lady out of gates: Gloves. Causes non-heretics to scratch themselves, when examined removes all your mutations. \ + Climb over the rusted mountain: Trash. Causes non-heretics to rust the floor they walk on. \ + These effects are mitigated for a few minutes when a non-heretic suffering an effect examines the painting that caused the effect." + gain_text = "A wind of inspiration blows through me, past the walls and past the gate inspirations lie, yet to be depicted. \ + They yearn for mortal eyes again, and I shall grant that wish." + next_knowledge = list( + /datum/heretic_knowledge/spell/burglar_finesse, + /datum/heretic_knowledge/moon_amulette, + ) + required_atoms = list(/obj/item/canvas = 1) + result_atoms = list(/obj/item/canvas) + cost = 1 + route = PATH_SIDE + +/datum/heretic_knowledge/painting/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc) + if(locate(/obj/item/organ/internal/eyes) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/weeping) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/organ/internal/eyes = 1, + ) + return TRUE + + if(locate(/obj/item/bodypart) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/desire) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/bodypart = 1, + ) + return TRUE + + if(locate(/obj/item/food/grown) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/vines) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/food/grown = 1, + ) + return TRUE + + if(locate(/obj/item/clothing/gloves) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/beauty) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/clothing/gloves = 1, + ) + return TRUE + + if(locate(/obj/item/trash) in atoms) + src.result_atoms = list(/obj/item/wallframe/painting/eldritch/rust) + src.required_atoms = list( + /obj/item/canvas = 1, + /obj/item/trash = 1, + ) + return TRUE + + user.balloon_alert(user, "no additional atom present!") + return FALSE diff --git a/code/modules/antagonists/heretic/magic/lunatic_track.dm b/code/modules/antagonists/heretic/magic/lunatic_track.dm new file mode 100644 index 000000000000..ae41e77aabeb --- /dev/null +++ b/code/modules/antagonists/heretic/magic/lunatic_track.dm @@ -0,0 +1,92 @@ +/datum/action/cooldown/lunatic_track + name = "Moonlight Echo" + desc = "Track your ringleader." + check_flags = AB_CHECK_CONSCIOUS + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "moon_smile" + cooldown_time = 4 SECONDS + +/datum/action/cooldown/lunatic_track/Grant(mob/granted) + if(!IS_LUNATIC(granted)) + return + return ..() + +/datum/action/cooldown/lunatic_track/Activate(atom/target) + var/datum/antagonist/lunatic/lunatic_datum = IS_LUNATIC(owner) + var/mob/living/carbon/human/ascended_heretic = lunatic_datum.ascended_body + if(!(ascended_heretic)) + owner.balloon_alert(owner, "what cruel fate, your master is gone...") + StartCooldown(1 SECONDS) + return FALSE + playsound(owner, 'sound/effects/singlebeat.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) + owner.balloon_alert(owner, get_balloon_message(ascended_heretic)) + + if(ascended_heretic.stat == DEAD) + to_chat(owner, span_hierophant("[ascended_heretic] is dead. Weep for the lie has struck out.")) + + StartCooldown() + return TRUE + + +/// Gets the balloon message for the heretic we are tracking. +/datum/action/cooldown/lunatic_track/proc/get_balloon_message(mob/living/carbon/human/tracked_mob) + var/balloon_message = generate_balloon_message(tracked_mob) + if(tracked_mob.stat == DEAD) + balloon_message = "they're dead, " + balloon_message + + return balloon_message + +/// Create the text for the balloon message +/datum/action/cooldown/lunatic_track/proc/generate_balloon_message(mob/living/carbon/human/tracked_mob) + var/balloon_message = "error text!" + var/turf/their_turf = get_turf(tracked_mob) + var/turf/our_turf = get_turf(owner) + var/their_z = their_turf?.z + var/our_z = our_turf?.z + + var/dist = get_dist(our_turf, their_turf) + var/dir = get_dir(our_turf, their_turf) + + switch(dist) + if(0 to 15) + balloon_message = "very near, [dir2text(dir)]!" + if(16 to 31) + balloon_message = "near, [dir2text(dir)]!" + if(32 to 127) + balloon_message = "far, [dir2text(dir)]!" + else + balloon_message = "very far!" + + // Early returns here if we don't need to tell them the z-levels + if(our_z == their_z) + return balloon_message + + if(is_mining_level(their_z)) + balloon_message = "on lavaland!" + return balloon_message + + if(is_away_level(their_z) || is_secret_level(their_z)) + balloon_message = "beyond the gateway!" + return balloon_message + + // We already checked if they are on lavaland or gateway, so if they arent there or on the station we can early return + if(!is_station_level(their_z)) + balloon_message = "on another plane!" + return balloon_message + + // They must be on station because we have checked every other z-level, and since we arent on station we should go there + if(!is_station_level(our_z)) + balloon_message = "on station!" + return balloon_message + + if(our_z > their_z) + balloon_message = "below you!" + return balloon_message + + if(our_z < their_z) + balloon_message = "above you!" + return balloon_message + + return balloon_message diff --git a/code/modules/antagonists/heretic/magic/madness_touch.dm b/code/modules/antagonists/heretic/magic/madness_touch.dm index 06db9f2464ea..c5e90b7fe1a3 100644 --- a/code/modules/antagonists/heretic/magic/madness_touch.dm +++ b/code/modules/antagonists/heretic/magic/madness_touch.dm @@ -1,7 +1,7 @@ -// Currently unused. +// Currently unused /datum/action/cooldown/spell/touch/mad_touch name = "Touch of Madness" - desc = "A touch spell that drains your enemy's sanity." + desc = "A touch spell that drains your enemy's sanity and knocks them down" background_icon_state = "bg_heretic" overlay_icon_state = "bg_heretic_border" button_icon = 'icons/mob/actions/actions_ecult.dmi' diff --git a/code/modules/antagonists/heretic/magic/mansus_grasp.dm b/code/modules/antagonists/heretic/magic/mansus_grasp.dm index e9cc46f68bc7..9965c98dd79b 100644 --- a/code/modules/antagonists/heretic/magic/mansus_grasp.dm +++ b/code/modules/antagonists/heretic/magic/mansus_grasp.dm @@ -21,7 +21,7 @@ return TRUE // This baby can hit anything /datum/action/cooldown/spell/touch/mansus_grasp/can_cast_spell(feedback = TRUE) - return ..() && !!IS_HERETIC(owner) + return ..() && (!!IS_HERETIC(owner) || !!IS_LUNATIC(owner)) /datum/action/cooldown/spell/touch/mansus_grasp/on_antimagic_triggered(obj/item/melee/touch_attack/hand, atom/victim, mob/living/carbon/caster) victim.visible_message( diff --git a/code/modules/antagonists/heretic/magic/mind_gate.dm b/code/modules/antagonists/heretic/magic/mind_gate.dm new file mode 100644 index 000000000000..eaf9e08b969c --- /dev/null +++ b/code/modules/antagonists/heretic/magic/mind_gate.dm @@ -0,0 +1,39 @@ +/datum/action/cooldown/spell/pointed/mind_gate + name = "Mind Gate" + desc = "Deals you 20 brain damage and the target suffers a hallucination, \ + is left confused for 10 seconds, and suffers oxygen loss and brain damage." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "mind_gate" + + sound = 'sound/magic/curse.ogg' + school = SCHOOL_FORBIDDEN + cooldown_time = 20 SECONDS + + invocation = "Op' 'oY 'Mi'd" + invocation_type = INVOCATION_WHISPER + spell_requirements = NONE + cast_range = 6 + + active_msg = "You prepare to open your mind..." + +/datum/action/cooldown/spell/pointed/mind_gate/can_cast_spell(feedback = TRUE) + return ..() && isliving(owner) + +/datum/action/cooldown/spell/pointed/mind_gate/is_valid_target(atom/cast_on) + return ..() && ishuman(cast_on) + +/datum/action/cooldown/spell/pointed/mind_gate/cast(mob/living/carbon/human/cast_on, mob/living/carbon/human/owner) + . = ..() + if(cast_on.can_block_magic(antimagic_flags)) + to_chat(cast_on, span_notice("Your mind feels closed.")) + to_chat(owner, span_warning("Their mind doesn't swing open, but neither does yours.")) + return FALSE + + cast_on.adjust_confusion(10 SECONDS) + cast_on.adjustOxyLoss(30) + cast_on.cause_hallucination(get_random_valid_hallucination_subtype(/datum/hallucination/body), "Mind gate, cast by [owner]") + cast_on.cause_hallucination(/datum/hallucination/delusion/preset/heretic/gate, "Caused by mindgate") + cast_on.adjustOrganLoss(ORGAN_SLOT_BRAIN, 30) + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 20, 140) diff --git a/code/modules/antagonists/heretic/magic/moon_parade.dm b/code/modules/antagonists/heretic/magic/moon_parade.dm new file mode 100644 index 000000000000..409e55bf9261 --- /dev/null +++ b/code/modules/antagonists/heretic/magic/moon_parade.dm @@ -0,0 +1,107 @@ +/datum/action/cooldown/spell/pointed/projectile/moon_parade + name = "Lunar parade" + desc = "This unleashes the parade towards a target." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "moon_parade" + ranged_mousepointer = 'icons/effects/mouse_pointers/moon_target.dmi' + + sound = 'sound/magic/cosmic_energy.ogg' + school = SCHOOL_FORBIDDEN + cooldown_time = 30 SECONDS + + invocation = "L'N'R P'RAD" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + + active_msg = "You prepare to make them join the parade!" + deactive_msg = "You stop the music and halt the parade... for now." + cast_range = 12 + projectile_type = /obj/projectile/moon_parade + + +/obj/projectile/moon_parade + name = "Lunar parade" + icon_state = "lunar_parade" + damage = 0 + damage_type = BURN + speed = 1 + range = 75 + ricochets_max = 40 + ricochet_chance = 500 + ricochet_incidence_leeway = 0 + pixel_speed_multiplier = 0.2 + projectile_piercing = PASSMOB|PASSVEHICLE + ///looping sound datum for our projectile. + var/datum/looping_sound/moon_parade/soundloop + // A list of the people we hit + var/list/mobs_hit = list() + +/obj/projectile/moon_parade/Initialize(mapload) + . = ..() + soundloop = new(src, TRUE) + +/obj/projectile/moon_parade/prehit_pierce(atom/A) + if(!isliving(firer) || !isliving(A)) + return ..() + + var/mob/living/caster = firer + var/mob/living/victim = A + + if(caster == victim) + return PROJECTILE_PIERCE_PHASE + + if(!caster.mind) + return PROJECTILE_PIERCE_HIT + + var/datum/antagonist/heretic_monster/monster = victim.mind?.has_antag_datum(/datum/antagonist/heretic_monster) + if(monster?.master == caster.mind) + return PROJECTILE_PIERCE_PHASE + + var/datum/antagonist/lunatic/lunatic = victim.mind?.has_antag_datum(/datum/antagonist/lunatic) + if(lunatic?.ascended_heretic == caster.mind) + return PROJECTILE_PIERCE_PHASE + + // Anti-magic destroys the projectile for consistency and counterplay + if(victim.can_block_magic(MAGIC_RESISTANCE)) + visible_message(span_warning("The parade hits [victim] and a sudden wave of clarity comes over you!")) + return PROJECTILE_DELETE_WITHOUT_HITTING + + return ..() + +/obj/projectile/moon_parade/on_hit(atom/target, blocked = 0, pierce_hit) + . = ..() + if(. == BULLET_ACT_BLOCK || !isliving(target)) + return + + var/mob/living/victim = target + + if(!(victim in mobs_hit)) + RegisterSignal(victim, COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, PROC_REF(moon_block_move)) + RegisterSignal(victim, COMSIG_QDELETING, PROC_REF(clear_mob)) + victim.AddComponent(/datum/component/leash, src, distance = 1) + victim.balloon_alert(victim, "you feel unable to move away from the parade!") + mobs_hit += victim + + victim.add_mood_event("Moon Insanity", /datum/mood_event/moon_insanity) + victim.cause_hallucination(/datum/hallucination/delusion/preset/moon, name) + victim.mob_mood.set_sanity(victim.mob_mood.sanity - 20) + +/obj/projectile/moon_parade/Destroy() + for(var/mob/living/leftover_mob as anything in mobs_hit) + clear_mob(leftover_mob) + mobs_hit.Cut() // You never know + soundloop.stop() + return ..() + +// Blocks movement in order to make it appear like the character is transfixed to the projectile and wandering after it +// Coded this way because its a simple way to hold the illusion compared to other methods +/obj/projectile/moon_parade/proc/moon_block_move(datum/source) + SIGNAL_HANDLER + return COMSIG_MOB_CLIENT_BLOCK_PRE_LIVING_MOVE + +/obj/projectile/moon_parade/proc/clear_mob(datum/source) + SIGNAL_HANDLER + UnregisterSignal(source, list(COMSIG_MOB_CLIENT_PRE_LIVING_MOVE, COMSIG_QDELETING)) + mobs_hit -= source diff --git a/code/modules/antagonists/heretic/magic/moon_ringleader.dm b/code/modules/antagonists/heretic/magic/moon_ringleader.dm new file mode 100644 index 000000000000..7805a19150e1 --- /dev/null +++ b/code/modules/antagonists/heretic/magic/moon_ringleader.dm @@ -0,0 +1,62 @@ +/datum/action/cooldown/spell/aoe/moon_ringleader + name = "Ringleaders Rise" + desc = "Big AoE spell that deals more brain damage the lower the sanity of everyone in the AoE and it also causes hallucinations with those who have less sanity getting more. \ + If their sanity is low enough they snap and go insane, the spell then halves their sanity." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "moon_ringleader" + sound = 'sound/effects/moon_parade.ogg' + + school = SCHOOL_FORBIDDEN + cooldown_time = 1 MINUTES + + invocation = "R''S 'E" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + + aoe_radius = 5 + /// Effect for when the spell triggers + var/obj/effect/moon_effect = /obj/effect/temp_visual/moon_ringleader + +/datum/action/cooldown/spell/aoe/moon_ringleader/cast(mob/living/caster) + new moon_effect(get_turf(caster)) + return ..() + +/datum/action/cooldown/spell/aoe/moon_ringleader/get_things_to_cast_on(atom/center, radius_override) + var/list/stuff = list() + var/list/o_range = orange(center, radius_override || aoe_radius) - list(owner, center) + for(var/mob/living/carbon/nearby_mob in o_range) + if(nearby_mob.stat == DEAD) + continue + if(!nearby_mob.mob_mood) + continue + if(IS_HERETIC_OR_MONSTER(nearby_mob)) + continue + if(nearby_mob.can_block_magic(antimagic_flags)) + continue + + stuff += nearby_mob + + return stuff + +/datum/action/cooldown/spell/aoe/moon_ringleader/cast_on_thing_in_aoe(mob/living/carbon/victim, mob/living/caster) + var/victim_sanity = victim.mob_mood.sanity + + victim.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100 - victim_sanity, 160) + repeat_string((120 - victim_sanity) / 10,victim.cause_hallucination(get_random_valid_hallucination_subtype(/datum/hallucination/body),"ringleaders rise")) + if(victim_sanity < 15) + victim.apply_status_effect(/datum/status_effect/moon_converted) + caster.log_message("made [victim] insane.", LOG_GAME) + victim.log_message("was driven insane by [caster]") + victim.mob_mood.set_sanity(victim_sanity * 0.5) + +/obj/effect/temp_visual/moon_ringleader + icon = 'icons/effects/eldritch.dmi' + icon_state = "ring_leader_effect" + alpha = 180 + duration = 6 + +/obj/effect/temp_visual/moon_ringleader/ringleader/Initialize(mapload) + . = ..() + transform = transform.Scale(10) diff --git a/code/modules/antagonists/heretic/magic/moon_smile.dm b/code/modules/antagonists/heretic/magic/moon_smile.dm new file mode 100644 index 000000000000..893059721c42 --- /dev/null +++ b/code/modules/antagonists/heretic/magic/moon_smile.dm @@ -0,0 +1,50 @@ +/datum/action/cooldown/spell/pointed/moon_smile + name = "Smile of the moon" + desc = "Lets you turn the gaze of the moon on someone \ + temporarily blinding, muting, deafening and knocking down a single target." + background_icon_state = "bg_heretic" + overlay_icon_state = "bg_heretic_border" + button_icon = 'icons/mob/actions/actions_ecult.dmi' + button_icon_state = "moon_smile" + ranged_mousepointer = 'icons/effects/mouse_pointers/moon_target.dmi' + + sound = 'sound/magic/blind.ogg' + school = SCHOOL_FORBIDDEN + cooldown_time = 20 SECONDS + + invocation = "Mo'N S'M'LE" + invocation_type = INVOCATION_SHOUT + spell_requirements = NONE + cast_range = 6 + + active_msg = "You prepare to let them see the true face..." + +/datum/action/cooldown/spell/pointed/moon_smile/can_cast_spell(feedback = TRUE) + return ..() && isliving(owner) + +/datum/action/cooldown/spell/pointed/moon_smile/is_valid_target(atom/cast_on) + return ..() && ishuman(cast_on) + +/datum/action/cooldown/spell/pointed/moon_smile/cast(mob/living/carbon/human/cast_on) + . = ..() + /// The duration of these effects are based on sanity, mainly for flavor but also to make it a weaker alpha strike + var/moon_smile_duration = (150 - cast_on.mob_mood.sanity) / 10 + if(cast_on.can_block_magic(antimagic_flags)) + to_chat(cast_on, span_notice("The moon turns, its smile no longer set on you.")) + to_chat(owner, span_warning("The moon does not smile upon them.")) + return FALSE + + playsound(cast_on, 'sound/hallucinations/i_see_you1.ogg', 50, 1) + to_chat(cast_on, span_warning("Your eyes cry out in pain, your ears bleed and your lips seal! THE MOON SMILES UPON YOU!")) + cast_on.adjust_temp_blindness(moon_smile_duration + 5 SECONDS) + cast_on.set_eye_blur_if_lower(moon_smile_duration + 7 SECONDS) + + var/obj/item/organ/internal/ears/ears = cast_on.get_organ_slot(ORGAN_SLOT_EARS) + ears?.adjustEarDamage(0, moon_smile_duration + 2 SECONDS) + + cast_on.adjust_silence(moon_smile_duration + 5 SECONDS) + cast_on.AdjustKnockdown(2 SECONDS) + cast_on.add_mood_event("moon_smile", /datum/mood_event/moon_smile) + //Lowers sanity + cast_on.mob_mood.set_sanity(cast_on.mob_mood.sanity - 20) + return TRUE diff --git a/code/modules/antagonists/heretic/moon_lunatic.dm b/code/modules/antagonists/heretic/moon_lunatic.dm new file mode 100644 index 000000000000..086b213b8816 --- /dev/null +++ b/code/modules/antagonists/heretic/moon_lunatic.dm @@ -0,0 +1,62 @@ +// A type of antagonist created by the moon ascension +/datum/antagonist/lunatic + name = "\improper Lunatic" + hijack_speed = 0 + antagpanel_category = ANTAG_GROUP_HORRORS + show_in_antagpanel = FALSE + suicide_cry = "PRAISE THE RINGLEADER!!" + antag_moodlet = /datum/mood_event/heretics/lunatic + hud_icon = 'icons/mob/huds/antag_hud.dmi' + antag_hud_name = "lunatic" + can_assign_self_objectives = FALSE + // The mind of the ascended heretic who created us + var/datum/mind/ascended_heretic + // The body of the ascended heretic who created us + var/mob/living/carbon/human/ascended_body + +/// Runs when the moon heretic creates us, used to give the lunatic a master +/datum/antagonist/lunatic/proc/set_master(datum/mind/heretic_master, mob/living/carbon/human/heretic_body) + src.ascended_heretic = heretic_master + src.ascended_body = heretic_body + + var/datum/objective/lunatic/lunatic_obj = new() + lunatic_obj.master = heretic_master + lunatic_obj.update_explanation_text() + objectives += lunatic_obj + + to_chat(owner, span_boldnotice("Ruin the lie, save the truth through obeying [heretic_master] the ringleader!")) + +/datum/antagonist/lunatic/greet() + owner.current.playsound_local(get_turf(owner.current), 'sound/effects/moon_parade.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) + return ..() + +/datum/antagonist/lunatic/apply_innate_effects(mob/living/mob_override) + var/mob/living/our_mob = mob_override || owner.current + handle_clown_mutation(our_mob, "Ancient knowledge from the moon has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.") + our_mob.faction |= FACTION_HERETIC + add_team_hud(our_mob) + add_team_hud(our_mob, /datum/antagonist/heretic) + ADD_TRAIT(our_mob, TRAIT_MADNESS_IMMUNE, REF(src)) + + var/datum/action/cooldown/lunatic_track/moon_track = new /datum/action/cooldown/lunatic_track() + var/datum/action/cooldown/spell/touch/mansus_grasp/mad_touch = new /datum/action/cooldown/spell/touch/mansus_grasp() + mad_touch.Grant(our_mob) + moon_track.Grant(our_mob) + +/datum/antagonist/lunatic/remove_innate_effects(mob/living/mob_override) + var/mob/living/our_mob = mob_override || owner.current + handle_clown_mutation(our_mob, removing = FALSE) + our_mob.faction -= FACTION_HERETIC + +// Mood event given to moon acolytes +/datum/mood_event/heretics/lunatic + description = "THE TRUTH REVEALED, THE LIE SLAIN." + mood_change = 10 + +/datum/objective/lunatic + explanation_text = "Assist your ringleader. If you are seeing this, scroll up in chat for who that is and report this" + var/datum/mind/master + +/datum/objective/lunatic/update_explanation_text() + . = ..() + explanation_text = "Assist your ringleader [master]" diff --git a/code/modules/antagonists/heretic/status_effects/buffs.dm b/code/modules/antagonists/heretic/status_effects/buffs.dm index caa083dfb8be..1cc72090e1ed 100644 --- a/code/modules/antagonists/heretic/status_effects/buffs.dm +++ b/code/modules/antagonists/heretic/status_effects/buffs.dm @@ -291,3 +291,22 @@ /datum/status_effect/caretaker_refuge/proc/prevent_cuff(datum/source, mob/attemptee) SIGNAL_HANDLER return COMSIG_CARBON_CUFF_PREVENT + +// Path Of Moon status effect which hides the identity of the heretic +/datum/status_effect/moon_grasp_hide + id = "Moon Grasp Hide Identity" + status_type = STATUS_EFFECT_REFRESH + duration = 15 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/moon_grasp_hide + +/datum/status_effect/moon_grasp_hide/on_apply() + owner.add_traits(list(TRAIT_UNKNOWN, TRAIT_SILENT_FOOTSTEPS), id) + return TRUE + +/datum/status_effect/moon_grasp_hide/on_remove() + owner.remove_traits(list(TRAIT_UNKNOWN, TRAIT_SILENT_FOOTSTEPS), id) + +/atom/movable/screen/alert/status_effect/moon_grasp_hide + name = "Blessing of The Moon" + desc = "The Moon clouds their vision, as the sun always has yours." + icon_state = "moon_hide" diff --git a/code/modules/antagonists/heretic/status_effects/debuffs.dm b/code/modules/antagonists/heretic/status_effects/debuffs.dm index f2f2d8a6da8c..761af62876f6 100644 --- a/code/modules/antagonists/heretic/status_effects/debuffs.dm +++ b/code/modules/antagonists/heretic/status_effects/debuffs.dm @@ -214,3 +214,81 @@ /datum/status_effect/heretic_lastresort/on_remove() REMOVE_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id)) owner.AdjustUnconscious(20 SECONDS, ignore_canstun = TRUE) + +/// Used by moon heretics to make people mad +/datum/status_effect/moon_converted + id = "moon converted" + alert_type = /atom/movable/screen/alert/status_effect/moon_converted + duration = -1 + status_type = STATUS_EFFECT_REPLACE + ///used to track damage + var/damage_sustained = 0 + ///overlay used to indicate that someone is marked + var/mutable_appearance/moon_insanity_overlay + /// icon file for the overlay + var/effect_icon = 'icons/effects/eldritch.dmi' + /// icon state for the overlay + var/effect_icon_state = "moon_insanity_overlay" + +/atom/movable/screen/alert/status_effect/moon_converted + name = "Moon Converted" + desc = "THEY LIE, THEY ALL LIE!!! SLAY THEM!!! BURN THEM!!! MAKE THEM SEE THE TRUTH!!!" + icon_state = "lastresort" + +/datum/status_effect/moon_converted/on_creation() + . = ..() + moon_insanity_overlay = mutable_appearance(effect_icon, effect_icon_state, ABOVE_MOB_LAYER) + +/datum/status_effect/moon_converted/Destroy() + QDEL_NULL(moon_insanity_overlay) + return ..() + +/datum/status_effect/moon_converted/on_apply() + RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) + // Heals them so people who are in crit can have this affect applied on them and still be of some use for the heretic + owner.adjustBruteLoss( -150 + owner.mob_mood.sanity) + owner.adjustFireLoss(-150 + owner.mob_mood.sanity) + + to_chat(owner, span_hypnophrase(("THE MOON SHOWS YOU THE TRUTH AND THE LIARS WISH TO COVER IT, SLAY THEM ALL!!!"))) + owner.balloon_alert(owner, "they lie..THEY ALL LIE!!!") + owner.AdjustUnconscious(7 SECONDS, ignore_canstun = FALSE) + ADD_TRAIT(owner, TRAIT_MUTE, REF(src)) + RegisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(update_owner_overlay)) + owner.update_appearance(UPDATE_OVERLAYS) + owner.cause_hallucination(/datum/hallucination/delusion/preset/moon, "[id] status effect", duration = duration, affects_us = FALSE, affects_others = TRUE) + return TRUE + +/datum/status_effect/moon_converted/proc/on_damaged(datum/source, damage, damagetype) + SIGNAL_HANDLER + + // Stamina damage is funky so we will ignore it + if(damagetype == STAMINA) + return + + damage_sustained += damage + + if (damage_sustained < 75) + return + + qdel(src) + +/datum/status_effect/moon_converted/proc/update_owner_overlay(atom/source, list/overlays) + SIGNAL_HANDLER + overlays += moon_insanity_overlay + +/datum/status_effect/moon_converted/on_remove() + // Span warning and unconscious so they realize they aren't evil anymore + to_chat(owner, span_warning("Your mind is cleared from the effect of the manus, your alligiences are as they were before")) + REMOVE_TRAIT(owner, TRAIT_MUTE, REF(src)) + owner.AdjustUnconscious(5 SECONDS, ignore_canstun = FALSE) + owner.log_message("[owner] is no longer insane.", LOG_GAME) + UnregisterSignal(owner, COMSIG_ATOM_UPDATE_OVERLAYS) + UnregisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) + owner.update_appearance(UPDATE_OVERLAYS) + return ..() + + +/atom/movable/screen/alert/status_effect/moon_converted + name = "Moon Converted" + desc = "They LIE, SLAY ALL OF THE THEM!!! THE LIARS OF THE SUN MUST FALL!!!" + icon_state = "moon_insanity" diff --git a/code/modules/antagonists/heretic/status_effects/mark_effects.dm b/code/modules/antagonists/heretic/status_effects/mark_effects.dm index 0ffa0128f1fc..1771d7079e8d 100644 --- a/code/modules/antagonists/heretic/status_effects/mark_effects.dm +++ b/code/modules/antagonists/heretic/status_effects/mark_effects.dm @@ -260,3 +260,49 @@ /datum/status_effect/eldritch/knock/on_remove() REMOVE_TRAIT(owner, TRAIT_ALWAYS_NO_ACCESS, STATUS_EFFECT_TRAIT) return ..() + +// MARK OF MOON + +/datum/status_effect/eldritch/moon + effect_icon_state = "emark8" + ///Used for checking if the pacifism effect should end early + var/damage_sustained = 0 + +/datum/status_effect/eldritch/moon/on_apply() + . = ..() + ADD_TRAIT(owner, TRAIT_PACIFISM, id) + owner.emote(pick("giggle", "laugh")) + owner.balloon_alert(owner, "you feel unable to hurt a soul!") + RegisterSignal (owner, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_damaged)) + return TRUE + +/// Checks for damage so the heretic can't just attack them with another weapon whilst they are unable to fight back +/datum/status_effect/eldritch/moon/proc/on_damaged(datum/source, damage, damagetype) + SIGNAL_HANDLER + + // The grasp itself deals stamina damage so we will ignore it + if(damagetype == STAMINA) + return + + damage_sustained += damage + + if(damage_sustained < 15) + return + + // Removes the trait in here since we don't wanna destroy the mark before its detonated or allow detonation triggers with other weapons + REMOVE_TRAIT(owner, TRAIT_PACIFISM, id) + owner.balloon_alert(owner, "you feel able to once again strike!") + +/datum/status_effect/eldritch/moon/on_effect() + owner.adjust_confusion(30 SECONDS) + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 25, 160) + owner.emote(pick("giggle", "laugh")) + owner.add_mood_event("Moon Insanity", /datum/mood_event/moon_insanity) + return ..() + +/datum/status_effect/eldritch/moon/on_remove() + . = ..() + UnregisterSignal (owner, COMSIG_MOB_APPLY_DAMAGE) + + // Incase the trait was not removed earlier + REMOVE_TRAIT(owner, TRAIT_PACIFISM, id) diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 01ee43f4d298..0893d6c7feb0 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -115,6 +115,16 @@ r_hand = /obj/item/gun/energy/recharge/ebow shoes = /obj/item/clothing/shoes/magboots/advance +/datum/outfit/heretic_hallucination + name = "Heretic Hallucination" + + uniform = /obj/item/clothing/under/color/grey + suit = /obj/item/clothing/suit/hooded/cultrobes/eldritch + neck = /obj/item/clothing/neck/heretic_focus + r_hand = /obj/item/melee/touch_attack/mansus_fist + head = /obj/item/clothing/head/hooded/cult_hoodie/eldritch + shoes = /obj/item/clothing/shoes/sneakers/black + /datum/outfit/rev_cutout name = "Revolutionary Cutout" diff --git a/code/modules/hallucination/delusions.dm b/code/modules/hallucination/delusions.dm index 1cd4cb16de09..3d657dadf0a1 100644 --- a/code/modules/hallucination/delusions.dm +++ b/code/modules/hallucination/delusions.dm @@ -56,7 +56,7 @@ return ..() /datum/hallucination/delusion/start() - if(!hallucinator.client || !delusion_icon_file) + if(!hallucinator.client) return FALSE feedback_details += "Delusion: [delusion_name]" @@ -180,6 +180,36 @@ delusion_name = "cyborg" play_wabbajack = TRUE +/// Hallucination used by the path of moon heretic to turn everyone into a lunar mass +/datum/hallucination/delusion/preset/moon + delusion_icon_file = 'icons/mob/nonhuman-player/eldritch_mobs.dmi' + delusion_icon_state = "moon_mass" + delusion_name = "moon" + duration = 15 SECONDS + affects_others = TRUE + random_hallucination_weight = 0 + +// Hallucination used by heretic paintings +/datum/hallucination/delusion/preset/heretic + random_hallucination_weight = 0 + dynamic_icon = TRUE + delusion_name = "Heretic" + affects_others = TRUE + affects_us = FALSE + duration = 11 SECONDS + +/datum/hallucination/delusion/preset/heretic/make_delusion_image(mob/over_who) + var/static/icon/heretic_icon + if(isnull(heretic_icon)) + heretic_icon = getFlatIcon(get_dynamic_human_appearance(/datum/outfit/heretic, r_hand = NO_REPLACE)) + delusion_icon_file = heretic_icon + return ..() + +/datum/hallucination/delusion/preset/heretic/gate + delusion_name = "Mind Gate" + duration = 60 SECONDS + affects_us = TRUE + /datum/hallucination/delusion/preset/cyborg/make_delusion_image(mob/over_who) . = ..() hallucinator.playsound_local(get_turf(over_who), 'sound/voice/liveagain.ogg', 75, TRUE) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index df8ea16dd62e..fa67853e091f 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -1985,6 +1985,12 @@ GLOBAL_LIST_EMPTY(features_by_species) var/list/food_flags = FOOD_FLAGS + if(HAS_TRAIT(src, TRAIT_FLESH_DESIRE)) + return list( + "liked_food" = bitfield_to_list(GORE | MEAT, food_flags), + "disliked_food" = null, + "toxic_food" = bitfield_to_list(VEGETABLES | DAIRY | FRUIT | FRIED, food_flags), + ) return list( "liked_food" = bitfield_to_list(liked_food, food_flags), "disliked_food" = bitfield_to_list(disliked_food, food_flags), diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index a0e6921be3ee..49ae8b937a48 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -93,6 +93,8 @@ if (modifies_speech) RegisterSignal(tongue_owner, COMSIG_MOB_SAY, PROC_REF(handle_speech)) + if(!(organ_flags & ORGAN_FAILING)) + ADD_TRAIT(tongue_owner, TRAIT_SPEAKS_CLEARLY, SPEAKING_FROM_TONGUE) /* This could be slightly simpler, by making the removal of the * NO_TONGUE_TRAIT conditional on the tongue's `sense_of_taste`, but * then you can distinguish between ageusia from no tongue, and diff --git a/icons/effects/eldritch.dmi b/icons/effects/eldritch.dmi index 8b7738f3b46a..382ed6af629e 100644 Binary files a/icons/effects/eldritch.dmi and b/icons/effects/eldritch.dmi differ diff --git a/icons/effects/mouse_pointers/moon_target.dmi b/icons/effects/mouse_pointers/moon_target.dmi new file mode 100644 index 000000000000..d89cab42aa12 Binary files /dev/null and b/icons/effects/mouse_pointers/moon_target.dmi differ diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi index aa4eb88431df..f65f56e58c96 100755 Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ diff --git a/icons/mob/actions/actions_ecult.dmi b/icons/mob/actions/actions_ecult.dmi index 747b57949be8..756f5711866d 100644 Binary files a/icons/mob/actions/actions_ecult.dmi and b/icons/mob/actions/actions_ecult.dmi differ diff --git a/icons/mob/clothing/belt.dmi b/icons/mob/clothing/belt.dmi index cb55064ca75f..899941a72321 100644 Binary files a/icons/mob/clothing/belt.dmi and b/icons/mob/clothing/belt.dmi differ diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 12574757c28b..2b0e3e168c98 100644 Binary files a/icons/mob/clothing/neck.dmi and b/icons/mob/clothing/neck.dmi differ diff --git a/icons/mob/huds/antag_hud.dmi b/icons/mob/huds/antag_hud.dmi index 82cdc220291e..0d5d95f3bb9d 100644 Binary files a/icons/mob/huds/antag_hud.dmi and b/icons/mob/huds/antag_hud.dmi differ diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi index c068036ecd4c..fd52b6f3801b 100644 Binary files a/icons/mob/inhands/64x64_lefthand.dmi and b/icons/mob/inhands/64x64_lefthand.dmi differ diff --git a/icons/mob/inhands/64x64_righthand.dmi b/icons/mob/inhands/64x64_righthand.dmi index 6d54ce63525d..c0128a2fde2c 100644 Binary files a/icons/mob/inhands/64x64_righthand.dmi and b/icons/mob/inhands/64x64_righthand.dmi differ diff --git a/icons/mob/nonhuman-player/eldritch_mobs.dmi b/icons/mob/nonhuman-player/eldritch_mobs.dmi index 4e640694b2a3..a71c93430e60 100644 Binary files a/icons/mob/nonhuman-player/eldritch_mobs.dmi and b/icons/mob/nonhuman-player/eldritch_mobs.dmi differ diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi index e72ae3098744..c39fc7dfbde1 100644 Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ diff --git a/icons/obj/eldritch.dmi b/icons/obj/eldritch.dmi index 9825139846b8..47f04a45dcd8 100644 Binary files a/icons/obj/eldritch.dmi and b/icons/obj/eldritch.dmi differ diff --git a/icons/obj/signs.dmi b/icons/obj/signs.dmi index 2421fbb208d3..9e7dac378eff 100644 Binary files a/icons/obj/signs.dmi and b/icons/obj/signs.dmi differ diff --git a/icons/obj/weapons/guns/projectiles.dmi b/icons/obj/weapons/guns/projectiles.dmi index e464b61ff89c..597f28eac69d 100644 Binary files a/icons/obj/weapons/guns/projectiles.dmi and b/icons/obj/weapons/guns/projectiles.dmi differ diff --git a/icons/ui_icons/achievements/achievements.dmi b/icons/ui_icons/achievements/achievements.dmi index a206cff1acf9..80d37860846e 100644 Binary files a/icons/ui_icons/achievements/achievements.dmi and b/icons/ui_icons/achievements/achievements.dmi differ diff --git a/monkestation/code/modules/smithing/oozelings/species.dm b/monkestation/code/modules/smithing/oozelings/species.dm index 12fa23e9ab91..4a5e25dac9c3 100644 --- a/monkestation/code/modules/smithing/oozelings/species.dm +++ b/monkestation/code/modules/smithing/oozelings/species.dm @@ -40,8 +40,6 @@ species_language_holder = /datum/language_holder/oozeling ass_image = 'icons/ass/assslime.png' //swimming_component = /datum/component/swimming/dissolve - toxic_food = NONE - disliked_food = NONE wing_types = list(/obj/item/organ/external/wings/functional/slime) bodypart_overrides = list( diff --git a/monkestation/sound/ambience/antag/heretic/ascend_moon.ogg b/monkestation/sound/ambience/antag/heretic/ascend_moon.ogg new file mode 100644 index 000000000000..b0d515686b20 Binary files /dev/null and b/monkestation/sound/ambience/antag/heretic/ascend_moon.ogg differ diff --git a/sound/effects/moon_parade.ogg b/sound/effects/moon_parade.ogg new file mode 100644 index 000000000000..2b18ce329527 Binary files /dev/null and b/sound/effects/moon_parade.ogg differ diff --git a/sound/effects/moon_parade_soundloop.ogg b/sound/effects/moon_parade_soundloop.ogg new file mode 100644 index 000000000000..c7879b6488cb Binary files /dev/null and b/sound/effects/moon_parade_soundloop.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 8725e29e54b1..7eb4bc8ac424 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1496,6 +1496,7 @@ #include "code\datums\looping_sounds\cyborg.dm" #include "code\datums\looping_sounds\item_sounds.dm" #include "code\datums\looping_sounds\machinery_sounds.dm" +#include "code\datums\looping_sounds\projectiles.dm" #include "code\datums\looping_sounds\weather.dm" #include "code\datums\mapgen\_MapGenerator.dm" #include "code\datums\mapgen\CaveGenerator.dm" @@ -1535,6 +1536,7 @@ #include "code\datums\mood_events\dna_infuser_events.dm" #include "code\datums\mood_events\drink_events.dm" #include "code\datums\mood_events\drug_events.dm" +#include "code\datums\mood_events\eldritch_painting_events.dm" #include "code\datums\mood_events\generic_negative_events.dm" #include "code\datums\mood_events\generic_positive_events.dm" #include "code\datums\mood_events\morbid_events.dm" @@ -2773,9 +2775,11 @@ #include "code\modules\antagonists\heretic\heretic_monsters.dm" #include "code\modules\antagonists\heretic\influences.dm" #include "code\modules\antagonists\heretic\knife_effect.dm" +#include "code\modules\antagonists\heretic\moon_lunatic.dm" #include "code\modules\antagonists\heretic\rust_effect.dm" #include "code\modules\antagonists\heretic\transmutation_rune.dm" #include "code\modules\antagonists\heretic\items\eldritch_flask.dm" +#include "code\modules\antagonists\heretic\items\eldritch_painting.dm" #include "code\modules\antagonists\heretic\items\forbidden_book.dm" #include "code\modules\antagonists\heretic\items\heretic_armor.dm" #include "code\modules\antagonists\heretic\items\heretic_blades.dm" @@ -2784,18 +2788,21 @@ #include "code\modules\antagonists\heretic\items\keyring.dm" #include "code\modules\antagonists\heretic\items\lintel.dm" #include "code\modules\antagonists\heretic\items\madness_mask.dm" +#include "code\modules\antagonists\heretic\items\unfathomable_curio.dm" #include "code\modules\antagonists\heretic\knowledge\ash_lore.dm" #include "code\modules\antagonists\heretic\knowledge\blade_lore.dm" #include "code\modules\antagonists\heretic\knowledge\cosmic_lore.dm" #include "code\modules\antagonists\heretic\knowledge\flesh_lore.dm" #include "code\modules\antagonists\heretic\knowledge\general_side.dm" #include "code\modules\antagonists\heretic\knowledge\knock_lore.dm" +#include "code\modules\antagonists\heretic\knowledge\moon_lore.dm" #include "code\modules\antagonists\heretic\knowledge\rust_lore.dm" -#include "code\modules\antagonists\heretic\knowledge\side_ash_flesh.dm" +#include "code\modules\antagonists\heretic\knowledge\side_ash_moon.dm" #include "code\modules\antagonists\heretic\knowledge\side_blade_rust.dm" #include "code\modules\antagonists\heretic\knowledge\side_cosmos_ash.dm" #include "code\modules\antagonists\heretic\knowledge\side_flesh_void.dm" #include "code\modules\antagonists\heretic\knowledge\side_knock_flesh.dm" +#include "code\modules\antagonists\heretic\knowledge\side_knock_moon.dm" #include "code\modules\antagonists\heretic\knowledge\side_rust_cosmos.dm" #include "code\modules\antagonists\heretic\knowledge\side_void_blade.dm" #include "code\modules\antagonists\heretic\knowledge\starting_lore.dm" @@ -2824,10 +2831,15 @@ #include "code\modules\antagonists\heretic\magic\flesh_ascension.dm" #include "code\modules\antagonists\heretic\magic\flesh_surgery.dm" #include "code\modules\antagonists\heretic\magic\furious_steel.dm" +#include "code\modules\antagonists\heretic\magic\lunatic_track.dm" #include "code\modules\antagonists\heretic\magic\madness_touch.dm" #include "code\modules\antagonists\heretic\magic\manse_link.dm" #include "code\modules\antagonists\heretic\magic\mansus_grasp.dm" +#include "code\modules\antagonists\heretic\magic\mind_gate.dm" #include "code\modules\antagonists\heretic\magic\mirror_walk.dm" +#include "code\modules\antagonists\heretic\magic\moon_parade.dm" +#include "code\modules\antagonists\heretic\magic\moon_ringleader.dm" +#include "code\modules\antagonists\heretic\magic\moon_smile.dm" #include "code\modules\antagonists\heretic\magic\nightwatcher_rebirth.dm" #include "code\modules\antagonists\heretic\magic\realignment.dm" #include "code\modules\antagonists\heretic\magic\rust_charge.dm"