diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm index 0499beb69a8..7ac7e93f00b 100644 --- a/code/__DEFINES/achievements.dm +++ b/code/__DEFINES/achievements.dm @@ -26,6 +26,9 @@ #define MEDAL_GOTTEM "GOTTEM" #define MEDAL_ASCENSION "Ascension" #define MEDAL_FRENCHING "FrenchingTheBubble" +#define MEDAL_ASH_ASCENSION "Ash" +#define MEDAL_FLESH_ASCENSION "Flesh" +#define MEDAL_RUST_ASCENSION "Rust" //Skill medal hub IDs #define MEDAL_LEGENDARY_MINER "Legendary Miner" diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 31002789930..b81f97c635d 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -119,6 +119,8 @@ #define STASIS_MACHINE_EFFECT "stasis_machine" +#define STASIS_ASCENSION_EFFECT "heretic_ascension" + // Stasis helpers #define IS_IN_STASIS(mob) (mob.has_status_effect(STATUS_EFFECT_STASIS)) diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm index 3957c52dc78..b9ab38b0688 100644 --- a/code/datums/achievements/misc_achievements.dm +++ b/code/datums/achievements/misc_achievements.dm @@ -123,3 +123,21 @@ desc = "Just a taste, for science!" database_id = MEDAL_FRENCHING icon = "frenching" + +/datum/award/achievement/misc/ash_ascension + name = "Nightwatcher's Eyes" + desc = "You've risen above the flames, became one with the ashes. You've been reborn as one with the Nightwatcher." + database_id = MEDAL_ASH_ASCENSION + icon = "ashascend" + +/datum/award/achievement/misc/flesh_ascension + name = "Vortex of Arms" + desc = "You've became something more, something greater. A piece of the emperor resides within you, and you within him." + database_id = MEDAL_FLESH_ASCENSION + icon = "fleshascend" + +/datum/award/achievement/misc/rust_ascension + name = "Hills of Rust" + desc = "You've summoned a piece of the Hill of rust, and so the Hills welcome you." + database_id = MEDAL_RUST_ASCENSION + icon = "rustascend" diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index 0334ec757e3..4c7e5edf86c 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -235,7 +235,7 @@ timeout = 1 MINUTES /datum/mood_event/gates_of_mansus - description = "LIVING IN A PERFORMANCE IS WORSE THAN DEATH\n" + description = "I HAD A GLIMPSE OF THE HORROR BEYOND THIS WORLD. REALITY UNCOILED BEFORE MY EYES!\n" mood_change = -25 timeout = 4 MINUTES diff --git a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm index abb84a14961..b8a5abd9032 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm @@ -6,6 +6,7 @@ job_rank = ROLE_HERETIC antag_hud_type = ANTAG_HUD_HERETIC antag_hud_name = "heretic" + can_hijack = HIJACK_HIJACKER var/give_equipment = TRUE var/list/researched_knowledge = list() var/total_sacrifices = 0 @@ -91,8 +92,9 @@ /datum/antagonist/heretic/proc/forge_primary_objectives() var/list/assasination = list() var/list/protection = list() + var/choose_list = list("assasinate","hjiack","protect","glory") for(var/i in 1 to 2) - var/pck = pick("assasinate","stalk","protect") + var/pck = pick(choose_list) switch(pck) if("assasinate") var/datum/objective/assassinate/A = new @@ -101,11 +103,18 @@ A.find_target(owners,protection) assasination += A.target objectives += A - if("stalk") - var/datum/objective/stalk/S = new - S.owner = owner - S.find_target() - objectives += S + if("hjiack") + var/datum/objective/hijack/hijack = new + hijack.owner = owner + objectives += hijack + choose_list -= "hijack" + choose_list -= "glory" + if("glory") + var/datum/objective/martyr/martyrdom = new + martyrdom.owner = owner + objectives += martyrdom + choose_list -= "hijack" + choose_list -= "glory" if("protect") var/datum/objective/protect/P = new P.owner = owner @@ -210,33 +219,6 @@ // Objectives // //////////////// -/datum/objective/stalk - name = "spendtime" - var/timer = 5 MINUTES - -/datum/objective/stalk/process(delta_time) - if(owner?.current.stat != DEAD && target?.current.stat != DEAD && (target in view(5,owner.current))) - timer -= delta_time * 10 // timer is in deciseconds - ///we don't want to process after the counter reaches 0, otherwise it is wasted processing - if(timer <= 0) - STOP_PROCESSING(SSprocessing,src) - -/datum/objective/stalk/Destroy(force, ...) - STOP_PROCESSING(SSprocessing,src) - return ..() - -/datum/objective/stalk/update_explanation_text() - //we want to start processing after we set the timer - timer += rand(-3 MINUTES, 3 MINUTES) - START_PROCESSING(SSprocessing,src) - if(target?.current) - explanation_text = "Stalk [target.name] for at least [DisplayTimeText(timer)] while they're alive." - else - explanation_text = "Free Objective" - -/datum/objective/stalk/check_completion() - return timer <= 0 || explanation_text == "Free Objective" - /datum/objective/sacrifice_ecult name = "sacrifice" diff --git a/code/modules/antagonists/eldritch_cult/eldritch_book.dm b/code/modules/antagonists/eldritch_cult/eldritch_book.dm index f3135fe6599..890520876e7 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_book.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_book.dm @@ -40,7 +40,7 @@ ///Gives you a charge and destroys a corresponding influence /obj/item/forbidden_book/proc/get_power_from_influence(atom/target, mob/user) var/obj/effect/reality_smash/RS = target - to_chat(target, "You start drawing power from influence...") + to_chat(user, "You start drawing power from influence...") if(do_after(user,10 SECONDS,TRUE,RS)) qdel(RS) charge += 1 @@ -50,7 +50,7 @@ for(var/turf/T in range(1,target)) if(is_type_in_typecache(T, blacklisted_turfs)) - to_chat(target, "The terrain doesn't support runes!") + to_chat(user, "The terrain doesn't support runes!") return var/A = get_turf(target) to_chat(user, "You start drawing a rune...") diff --git a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm index 0715764434c..70999092c4b 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm @@ -142,7 +142,7 @@ /datum/reality_smash_tracker/proc/_Generate() var/targ_len = length(targets) var/smash_len = length(smashes) - var/number = targ_len * 6 - smash_len + var/number = max(targ_len * (4-(targ_len-1)) - smash_len,1) for(var/i in 0 to number) @@ -188,6 +188,15 @@ icon_state = "pierced_illusion" anchored = TRUE resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF + alpha = 0 + +/obj/effect/broken_illusion/Initialize() + . = ..() + addtimer(CALLBACK(src,.proc/show_presence),15 SECONDS) + +///Makes this obj appear out of nothing +/obj/effect/broken_illusion/proc/show_presence() + animate(src,alpha = 255,time = 15 SECONDS) /obj/effect/broken_illusion/attack_hand(mob/living/user) if(!ishuman(user)) @@ -230,7 +239,8 @@ if(!IS_HERETIC(user) && ishuman(user)) var/mob/living/carbon/human/human_user = user to_chat(human_user,"Your brain hurts when you look at this!") - human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN,10) + human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN,10,190) + SEND_SIGNAL(human_user, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus) /obj/effect/reality_smash name = "/improper reality smash" diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm index 85294d4c853..5021282ac98 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm @@ -16,20 +16,51 @@ return var/dist = get_dist(user.loc,target.loc) var/dir = get_dir(user.loc,target.loc) - - switch(dist) - if(0 to 15) - to_chat(user,"[target.real_name] is near you. They are to the [dir2text(dir)] of you!") - if(16 to 31) - to_chat(user,"[target.real_name] is somewhere in your vicinty. They are to the [dir2text(dir)] of you!") - if(32 to 127) - to_chat(user,"[target.real_name] is far away from you. They are to the [dir2text(dir)] of you!") - else - to_chat(user,"[target.real_name] is beyond our reach.") + if(user.z != target.z) + to_chat(user,"[target.real_name] is on another plane of existance!") + else + switch(dist) + if(0 to 15) + to_chat(user,"[target.real_name] is near you. They are to the [dir2text(dir)] of you!") + if(16 to 31) + to_chat(user,"[target.real_name] is somewhere in your vicinty. They are to the [dir2text(dir)] of you!") + if(32 to 127) + to_chat(user,"[target.real_name] is far away from you. They are to the [dir2text(dir)] of you!") + else + to_chat(user,"[target.real_name] is beyond our reach.") if(target.stat == DEAD) to_chat(user,"[target.real_name] is dead. Bring them onto a transmutation rune!") +/datum/action/innate/heretic_shatter + name = "Shattering Offer" + desc = "By breaking your blade you are noticed by the hill or rust and are granted an escape from a dire sitatuion. (Teleports you to a random safe z turf on your current z level but destroys your blade.)" + background_icon_state = "bg_ecult" + button_icon_state = "shatter" + icon_icon = 'icons/mob/actions/actions_ecult.dmi' + check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN + var/mob/living/carbon/human/holder + var/obj/item/melee/sickly_blade/sword + +/datum/action/innate/heretic_shatter/Grant(mob/user, obj/object) + sword = object + holder = user + //i know what im doing + return ..() + +/datum/action/innate/heretic_shatter/IsAvailable() + if(IS_HERETIC(holder) || IS_HERETIC_MONSTER(holder)) + return TRUE + else + return FALSE + +/datum/action/innate/heretic_shatter/Activate() + var/turf/safe_turf = find_safe_turf(zlevels = sword.z, extended_safety_checks = TRUE) + do_teleport(holder,safe_turf,forceMove = TRUE) + to_chat(holder," You feel a gust of energy flow through your body, Rusted Hills heard your call...") + qdel(sword) + + /obj/item/melee/sickly_blade name = "Sickly blade" desc = "A sickly green crescent blade, decorated with an ornamental eye. You feel like you're being watched..." @@ -48,6 +79,11 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "rends") attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "rend") + var/datum/action/innate/heretic_shatter/linked_action + +/obj/item/melee/sickly_blade/Initialize() + . = ..() + linked_action = new(src) /obj/item/melee/sickly_blade/attack(mob/living/M, mob/living/user) if(!(IS_HERETIC(user) || IS_HERETIC_MONSTER(user))) @@ -57,6 +93,14 @@ return FALSE return ..() +/obj/item/melee/sickly_blade/pickup(mob/user) + . = ..() + linked_action.Grant(user, src) + +/obj/item/melee/sickly_blade/dropped(mob/user, silent) + . = ..() + linked_action.Remove(user, src) + /obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() var/datum/antagonist/heretic/cultie = user.mind.has_antag_datum(/datum/antagonist/heretic) diff --git a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm index c7103e5c5f7..dde0835cb93 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm @@ -106,7 +106,7 @@ * * Gives addtional effects to sickly blade weapon */ -/datum/eldritch_knowledge/proc/on_eldritch_blade(target,user,proximity_flag,click_parameters) +/datum/eldritch_knowledge/proc/on_eldritch_blade(atom/target,mob/user,proximity_flag,click_parameters) return ////////////// @@ -128,6 +128,7 @@ /datum/eldritch_knowledge/curse var/timer = 5 MINUTES var/list/fingerprints = list() + var/list/dna = list() /datum/eldritch_knowledge/curse/recipe_snowflake_check(list/atoms, loc) fingerprints = list() @@ -150,7 +151,7 @@ compiled_list[human_to_check.real_name] = human_to_check if(compiled_list.len == 0) - to_chat(user, "The items don't posses required fingerprints.") + to_chat(user, "The items don't posses required fingerprints or dna.") return FALSE var/chosen_mob = input("Select the person you wish to curse","Your target") as null|anything in sortList(compiled_list, /proc/cmp_mob_realname_dsc) @@ -192,6 +193,7 @@ //Ascension knowledge /datum/eldritch_knowledge/final + var/finished = FALSE /datum/eldritch_knowledge/final/recipe_snowflake_check(list/atoms, loc,selected_atoms) @@ -207,6 +209,8 @@ /datum/eldritch_knowledge/final/on_finished_recipe(mob/living/user, list/atoms, loc) finished = TRUE + var/datum/antagonist/heretic/ascension = user.mind.has_antag_datum(/datum/antagonist/heretic) + ascension.ascended = TRUE return TRUE /datum/eldritch_knowledge/final/cleanup_atoms(list/atoms) @@ -256,18 +260,22 @@ if(!istype(X,/obj/item/forbidden_book)) continue var/obj/item/forbidden_book/FB = X - FB.charge++ + FB.charge += 2 break if(!LH.target) var/datum/objective/A = new A.owner = user.mind - var/datum/mind/targeted = A.find_target()//easy way, i dont feel like copy pasting that entire block of code - LH.target = targeted.current + var/list/targets = list() + for(var/i in 0 to 3) + var/datum/mind/targeted = A.find_target()//easy way, i dont feel like copy pasting that entire block of code + if(!targeted) + break + targets[targeted.current.real_name] = targeted.current + LH.target = targets[input(user,"Choose your next target","Target") in targets] qdel(A) if(LH.target) to_chat(user,"Your new target has been selected, go and sacrifice [LH.target.real_name]!") - else to_chat(user,"target could not be found for living heart.") diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm index f745cd7107f..9202a792c99 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm @@ -34,7 +34,7 @@ desc = "Touch spell that let's you channel the power of the old gods through you." hand_path = /obj/item/melee/touch_attack/mansus_fist school = "evocation" - charge_max = 150 + charge_max = 100 clothes_req = FALSE action_icon = 'icons/mob/actions/actions_ecult.dmi' action_icon_state = "mansus_grasp" @@ -103,10 +103,9 @@ desc = "Spreads rust onto nearby turfs." range = 2 -/obj/effect/proc_holder/spell/targeted/touch/blood_siphon +/obj/effect/proc_holder/spell/pointed/blood_siphon name = "Blood Siphon" desc = "Touch spell that heals you while damaging the enemy, has a chance to transfer wounds between you and your enemy." - hand_path = /obj/item/melee/touch_attack/blood_siphon school = "evocation" charge_max = 150 clothes_req = FALSE @@ -115,17 +114,11 @@ action_icon = 'icons/mob/actions/actions_ecult.dmi' action_icon_state = "blood_siphon" action_background_icon_state = "bg_ecult" + range = 9 -/obj/item/melee/touch_attack/blood_siphon - name = "Blood Siphon" - desc = "A sinister looking aura that distorts the flow of reality around it." - icon_state = "disintegrate" - inhand_icon_state = "disintegrate" - catchphrase = "R'BRTH" - -/obj/item/melee/touch_attack/blood_siphon/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - if(!proximity_flag) - return +/obj/effect/proc_holder/spell/pointed/blood_siphon/cast(list/targets, mob/user) + . = ..() + var/target = targets[1] playsound(user, 'sound/magic/demon_attack1.ogg', 75, TRUE) if(ishuman(target)) var/mob/living/carbon/human/tar = target @@ -154,7 +147,17 @@ carbon_target.blood_volume -= 20 if(carbon_user.blood_volume < BLOOD_VOLUME_MAXIMUM) //we dont want to explode after all carbon_user.blood_volume += 20 - return ..() + return + +/obj/effect/proc_holder/spell/pointed/blood_siphon/can_target(atom/target, mob/user, silent) + . = ..() + if(!.) + return FALSE + if(!istype(target,/mob/living)) + if(!silent) + to_chat(user, "You are unable to siphon [target]!") + return FALSE + return TRUE /obj/effect/proc_holder/spell/targeted/projectile/dumbfire/rust_wave name = "Patron's Reach" @@ -409,7 +412,7 @@ new /obj/effect/hotspot(T) T.hotspot_expose(700,50,1) for(var/mob/living/livies in T.contents - centre) - livies.adjustFireLoss(10) + livies.adjustFireLoss(5) _range++ sleep(3) @@ -458,7 +461,7 @@ new /obj/effect/hotspot(T) T.hotspot_expose(700, 250 * delta_time, 1) for(var/mob/living/livies in T.contents - current_user) - livies.adjustFireLoss(25 * delta_time) + livies.adjustFireLoss(2.5 * delta_time) /obj/effect/proc_holder/spell/targeted/worm_contract @@ -477,6 +480,7 @@ . = ..() if(!istype(user,/mob/living/simple_animal/hostile/eldritch/armsy)) to_chat(user, "You try to contract your muscles but nothing happens...") + return var/mob/living/simple_animal/hostile/eldritch/armsy/armsy = user armsy.contract_next_chain_into_single_tile() @@ -667,3 +671,46 @@ return 3 else return 2 + +/obj/effect/proc_holder/spell/targeted/shed_human_form + name = "Shed form" + desc = "Shed your fragile form, become one with the arms, become one with the emperor." + invocation_type = INVOCATION_SHOUT + invocation = "REALITY UNCOIL!" + clothes_req = FALSE + action_background_icon_state = "bg_ecult" + range = -1 + include_user = TRUE + charge_max = 100 + action_icon = 'icons/mob/actions/actions_ecult.dmi' + action_icon_state = "worm_ascend" + var/segment_length = 10 + +/obj/effect/proc_holder/spell/targeted/shed_human_form/cast(list/targets, mob/user) + . = ..() + var/mob/living/target = user + var/mob/living/mob_inside = locate() in target.contents - target + + if(!mob_inside) + var/mob/living/simple_animal/hostile/eldritch/armsy/prime/outside = new(user.loc,TRUE,segment_length) + target.mind.transfer_to(outside, TRUE) + target.forceMove(outside) + target.apply_status_effect(STATUS_EFFECT_STASIS,STASIS_ASCENSION_EFFECT) + for(var/mob/living/carbon/human/humie in view(9,outside)-target) + if(IS_HERETIC(humie) || IS_HERETIC_MONSTER(humie)) + continue + SEND_SIGNAL(humie, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus) + ///They see the very reality uncoil before their eyes. + if(prob(25)) + var/trauma = pick(subtypesof(BRAIN_TRAUMA_MILD) + subtypesof(BRAIN_TRAUMA_SEVERE)) + humie.gain_trauma(new trauma(), TRAUMA_RESILIENCE_LOBOTOMY) + return + + if(iscarbon(mob_inside)) + var/mob/living/simple_animal/hostile/eldritch/armsy/prime/armsy = target + if(mob_inside.remove_status_effect(STATUS_EFFECT_STASIS,STASIS_ASCENSION_EFFECT)) + mob_inside.forceMove(armsy.loc) + armsy.mind.transfer_to(mob_inside, TRUE) + segment_length = armsy.get_length() + qdel(armsy) + return diff --git a/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm index 0629c70f832..e61a96ddd44 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm @@ -2,6 +2,7 @@ /datum/antagonist/heretic_monster name = "Eldritch Horror" roundend_category = "Heretics" + can_hijack = HIJACK_NEUTRAL antagpanel_category = "Heretic Beast" antag_moodlet = /datum/mood_event/heretics job_rank = ROLE_HERETIC diff --git a/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm index 9dcde854237..fdcf3a3dc1c 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm @@ -30,22 +30,26 @@ . = ..() if(!iscarbon(target)) return + var/mob/living/carbon/C = target + var/atom/throw_target = get_edge_target_turf(C, user.dir) + if(!C.anchored) + . = TRUE + C.throw_at(throw_target, rand(4,8), 14, user) + return +/datum/eldritch_knowledge/ashen_grasp/on_eldritch_blade(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!iscarbon(target)) + return var/mob/living/carbon/C = target var/datum/status_effect/eldritch/E = C.has_status_effect(/datum/status_effect/eldritch/rust) || C.has_status_effect(/datum/status_effect/eldritch/ash) || C.has_status_effect(/datum/status_effect/eldritch/flesh) if(E) - . = TRUE E.on_effect() for(var/X in user.mind.spell_list) if(!istype(X,/obj/effect/proc_holder/spell/targeted/touch/mansus_grasp)) continue var/obj/effect/proc_holder/spell/targeted/touch/mansus_grasp/MG = X MG.charge_counter = min(round(MG.charge_counter + MG.charge_max * 0.75),MG.charge_max) // refunds 75% of charge. - var/atom/throw_target = get_edge_target_turf(C, user.dir) - if(!C.anchored) - . = TRUE - C.throw_at(throw_target, rand(4,8), 14, user) - return /datum/eldritch_knowledge/ashen_eyes name = "Ashen Eyes" @@ -59,24 +63,25 @@ /datum/eldritch_knowledge/ash_mark name = "Mark of ash" gain_text = "Nightwatcher was a very particular man, always watching, in the night. In spite of his duty, he has tranced through the manse, with his blazing lantern." - desc = "Your sickly blade now applies ash mark on hit. Use your mansus grasp to proc the mark. Mark of Ash causes stamina damage, and fire loss, and spreads to a nearby carbon. Damage decreases with how many times the mark has spread." + desc = "Your mansus grasp now applies ash mark on hit. Use your sickly blade to proc the mark. Mark of Ash causes stamina damage, and fire loss, and spreads to a nearby carbon. Damage decreases with how many times the mark has spread." cost = 2 next_knowledge = list(/datum/eldritch_knowledge/curse/blindness) banned_knowledge = list(/datum/eldritch_knowledge/rust_mark,/datum/eldritch_knowledge/flesh_mark) route = PATH_ASH -/datum/eldritch_knowledge/ash_mark/on_eldritch_blade(target,user,proximity_flag,click_parameters) +/datum/eldritch_knowledge/ash_mark/on_mansus_grasp(target,user,proximity_flag,click_parameters) . = ..() if(isliving(target)) + . = TRUE var/mob/living/living_target = target living_target.apply_status_effect(/datum/status_effect/eldritch/ash,5) /datum/eldritch_knowledge/curse/blindness name = "Curse of blindness" gain_text = "He walks through the world, unnoticed by the masses." - desc = "Curse someone with 2 minutes of complete blindness by sacrificing a pair of eyes, a screwdriver and a pool of blood, with an object that the victim has touched with their bare hands." + desc = "Curse someone with 2 minutes of complete blindness by sacrificing a pair of eyes, a screwdriver, with an object that the victim has touched with their bare hands." cost = 1 - required_atoms = list(/obj/item/organ/eyes,/obj/item/screwdriver,/obj/effect/decal/cleanable/blood) + required_atoms = list(/obj/item/organ/eyes,/obj/item/screwdriver) next_knowledge = list(/datum/eldritch_knowledge/curse/corrosion,/datum/eldritch_knowledge/ash_blade_upgrade,/datum/eldritch_knowledge/curse/paralysis) timer = 2 MINUTES route = PATH_ASH @@ -107,7 +112,7 @@ banned_knowledge = list(/datum/eldritch_knowledge/rust_blade_upgrade,/datum/eldritch_knowledge/flesh_blade_upgrade) route = PATH_ASH -/datum/eldritch_knowledge/ash_blade_upgrade/on_eldritch_blade(target,user,proximity_flag,click_parameters) +/datum/eldritch_knowledge/ash_blade_upgrade/on_eldritch_blade(atom/target, mob/user, proximity_flag, click_parameters) . = ..() if(iscarbon(target)) var/mob/living/carbon/C = target @@ -119,7 +124,7 @@ gain_text = "Cursed land, cursed man, cursed mind." desc = "Curse someone for 2 minutes of vomiting and major organ damage. Using a wirecutter, a spill of blood, a heart, left arm and a right arm, and an item that the victim touched with their bare hands." cost = 1 - required_atoms = list(/obj/item/wirecutters,/obj/effect/decal/cleanable/blood,/obj/item/organ/heart,/obj/item/bodypart/l_arm,/obj/item/bodypart/r_arm) + required_atoms = list(/obj/item/wirecutters,/obj/effect/decal/cleanable/vomit,/obj/item/organ/heart) next_knowledge = list(/datum/eldritch_knowledge/curse/blindness,/datum/eldritch_knowledge/spell/area_conversion) timer = 2 MINUTES @@ -136,7 +141,7 @@ gain_text = "Corrupt their flesh, make them bleed." desc = "Curse someone for 5 minutes of inability to walk. Using a knife, pool of blood, left leg, right leg, a hatchet and an item that the victim touched with their bare hands. " cost = 1 - required_atoms = list(/obj/item/kitchen/knife,/obj/effect/decal/cleanable/blood,/obj/item/bodypart/l_leg,/obj/item/bodypart/r_leg,/obj/item/hatchet) + required_atoms = list(/obj/item/bodypart/l_leg,/obj/item/bodypart/r_leg,/obj/item/hatchet) next_knowledge = list(/datum/eldritch_knowledge/curse/blindness,/datum/eldritch_knowledge/summon/raw_prophet) timer = 5 MINUTES @@ -167,7 +172,7 @@ required_atoms = list(/mob/living/carbon/human) cost = 3 route = PATH_ASH - var/list/trait_list = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_BOMBIMMUNE) + var/list/trait_list = list(TRAIT_RESISTHEAT,TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_NOFIRE) /datum/eldritch_knowledge/final/ash_final/on_finished_recipe(mob/living/user, list/atoms, loc) priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear the blaze, for Ashlord [user.real_name] has come! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", 'sound/ai/spanomalies.ogg') @@ -176,20 +181,7 @@ var/mob/living/carbon/human/H = user H.physiology.brute_mod *= 0.5 H.physiology.burn_mod *= 0.5 - var/datum/antagonist/heretic/ascension = H.mind.has_antag_datum(/datum/antagonist/heretic) - ascension.ascended = TRUE + H.client?.give_award(/datum/award/achievement/misc/ash_ascension, H) for(var/X in trait_list) ADD_TRAIT(user,X,MAGIC_TRAIT) return ..() - -/datum/eldritch_knowledge/final/ash_final/on_life(mob/user) - . = ..() - if(!finished) - return - var/turf/L = get_turf(user) - var/datum/gas_mixture/env = L.return_air() - for(var/turf/T in range(1,user)) - env = T.return_air() - env.temperature += 25 - T.air_update_turf() - L.air_update_turf() diff --git a/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm index f5a196c9bb5..38f6c5324b9 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm @@ -79,15 +79,7 @@ if(!ishuman(target) || target == user) return var/mob/living/carbon/human/human_target = target - var/datum/status_effect/eldritch/eldritch_effect = human_target.has_status_effect(/datum/status_effect/eldritch/rust) || human_target.has_status_effect(/datum/status_effect/eldritch/ash) || human_target.has_status_effect(/datum/status_effect/eldritch/flesh) - if(eldritch_effect) - . = TRUE - eldritch_effect.on_effect() - if(iscarbon(target)) - var/mob/living/carbon/carbon_target = target - var/obj/item/bodypart/bodypart = pick(carbon_target.bodyparts) - var/datum/wound/slash/severe/crit_wound = new - crit_wound.apply_wound(bodypart) + if(QDELETED(human_target) || human_target.stat != DEAD) return @@ -121,6 +113,19 @@ heretic_monster.set_owner(master) return +/datum/eldritch_knowledge/flesh_grasp/on_eldritch_blade(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!ishuman(target)) + return + var/mob/living/carbon/human/human_target = target + var/datum/status_effect/eldritch/eldritch_effect = human_target.has_status_effect(/datum/status_effect/eldritch/rust) || human_target.has_status_effect(/datum/status_effect/eldritch/ash) || human_target.has_status_effect(/datum/status_effect/eldritch/flesh) + if(eldritch_effect) + eldritch_effect.on_effect() + if(iscarbon(target)) + var/mob/living/carbon/carbon_target = target + var/obj/item/bodypart/bodypart = pick(carbon_target.bodyparts) + var/datum/wound/slash/severe/crit_wound = new + crit_wound.apply_wound(bodypart) /datum/eldritch_knowledge/flesh_grasp/proc/remove_ghoul(datum/source) var/mob/living/carbon/human/humie = source @@ -131,15 +136,16 @@ /datum/eldritch_knowledge/flesh_mark name = "Mark of flesh" gain_text = "I saw them, the marked ones. The screams.. the silence." - desc = "Your sickly blade now applies mark of flesh status effect. To proc the mark, use your mansus grasp on the marked. Mark of flesh when procced causeds additional bleeding." + desc = "Your mansus grasp now applies mark of flesh status effect. To proc the mark, use your sickly blade on the marked. Mark of flesh when procced causeds additional bleeding." cost = 2 next_knowledge = list(/datum/eldritch_knowledge/summon/raw_prophet) banned_knowledge = list(/datum/eldritch_knowledge/rust_mark,/datum/eldritch_knowledge/ash_mark) route = PATH_FLESH -/datum/eldritch_knowledge/flesh_mark/on_eldritch_blade(target,user,proximity_flag,click_parameters) +/datum/eldritch_knowledge/flesh_mark/on_mansus_grasp(atom/target, mob/user, proximity_flag, click_parameters) . = ..() if(isliving(target)) + . = TRUE var/mob/living/living_target = target living_target.apply_status_effect(/datum/status_effect/eldritch/flesh) @@ -152,7 +158,7 @@ banned_knowledge = list(/datum/eldritch_knowledge/ash_blade_upgrade,/datum/eldritch_knowledge/rust_blade_upgrade) route = PATH_FLESH -/datum/eldritch_knowledge/flesh_blade_upgrade/on_eldritch_blade(target,user,proximity_flag,click_parameters) +/datum/eldritch_knowledge/flesh_blade_upgrade/on_eldritch_blade(atom/target, mob/user, proximity_flag, click_parameters) . = ..() if(iscarbon(target)) var/mob/living/carbon/carbon_target = target @@ -165,7 +171,7 @@ gain_text = "Uncanny man, walks alone in the valley between the worlds , I was able to call his aid." desc = "You can now summon a Raw Prophet using eyes, a left arm, right arm and a pool of blood. Raw prophets have increased seeing range, as well as Xray. But are very fragile and weak." cost = 1 - required_atoms = list(/obj/item/organ/eyes,/obj/item/bodypart/l_arm,/obj/item/bodypart/r_arm,/obj/effect/decal/cleanable/blood) + required_atoms = list(/obj/item/organ/eyes,/obj/effect/decal/cleanable/blood,/obj/item/bodypart/l_arm) mob_to_summon = /mob/living/simple_animal/hostile/eldritch/raw_prophet next_knowledge = list(/datum/eldritch_knowledge/flesh_blade_upgrade,/datum/eldritch_knowledge/spell/blood_siphon,/datum/eldritch_knowledge/curse/paralysis) route = PATH_FLESH @@ -173,9 +179,9 @@ /datum/eldritch_knowledge/summon/stalker name = "Lonely Ritual" gain_text = "I was able to combine my greed and desires to summon an eldritch beast i have not seen before. Ever shapeshifting mass of flesh, it well knew my goals." - desc = "You can now summon a Stalker using a knife, a flower, a pen and a piece of paper. Stalkers can shapeshift into harmeless animals and get close to the victim." + desc = "You can now summon a Stalker using a knife, a candle, a pen and a piece of paper. Stalkers can shapeshift into harmeless animals and get close to the victim." cost = 1 - required_atoms = list(/obj/item/kitchen/knife,/obj/item/reagent_containers/food/snacks/grown/poppy,/obj/item/pen,/obj/item/paper) + required_atoms = list(/obj/item/kitchen/knife,/obj/item/pen,/obj/item/paper,/obj/item/candle) mob_to_summon = /mob/living/simple_animal/hostile/eldritch/stalker next_knowledge = list(/datum/eldritch_knowledge/summon/ashy,/datum/eldritch_knowledge/summon/rusty,/datum/eldritch_knowledge/final/flesh_final) route = PATH_FLESH @@ -192,9 +198,9 @@ /datum/eldritch_knowledge/summon/rusty name = "Rusted Ritual" gain_text = "I combined principle of hunger with desire of corruption. The Rusted Hills call my name." - desc = "You can now summon a Rust Walker transmutating vomit pool, a head and a book." + desc = "You can now summon a Rust Walker transmutating vomit pool and a book." cost = 1 - required_atoms = list(/obj/effect/decal/cleanable/vomit,/obj/item/bodypart/head,/obj/item/book) + required_atoms = list(/obj/effect/decal/cleanable/vomit,/obj/item/book) mob_to_summon = /mob/living/simple_animal/hostile/eldritch/rust_spirit next_knowledge = list(/datum/eldritch_knowledge/summon/stalker,/datum/eldritch_knowledge/spell/entropic_plume) @@ -203,50 +209,29 @@ gain_text = "Our blood is all the same after all, the Marshal told me." desc = "You gain a spell that drains enemies health and restores yours." cost = 1 - spell_to_add = /obj/effect/proc_holder/spell/targeted/touch/blood_siphon + spell_to_add = /obj/effect/proc_holder/spell/pointed/blood_siphon next_knowledge = list(/datum/eldritch_knowledge/summon/raw_prophet,/datum/eldritch_knowledge/spell/area_conversion) /datum/eldritch_knowledge/final/flesh_final name = "Priest's Final Hymn" gain_text = "Man of this world. Hear me! For the time of the lord of arms has come! Emperor of Flesh guides my army!" - desc = "Bring 3 bodies onto a transmutation rune to either ascend as a terror of the night prime or you can summon a regular terror of the night." + desc = "Bring 3 bodies onto a transmutation rune to gain the ability of shedding your human form, and gaining untold power." required_atoms = list(/mob/living/carbon/human) cost = 3 route = PATH_FLESH /datum/eldritch_knowledge/final/flesh_final/on_finished_recipe(mob/living/user, list/atoms, loc) - var/alert_ = alert(user,"Do you want to ascend as the lord of the night or just summon a terror of the night?","...","Yes","No") - user.SetImmobilized(10 HOURS) // no way someone will stand 10 hours in a spot, just so he can move while the alert is still showing. - switch(alert_) - if("No") - var/mob/living/summoned = new /mob/living/simple_animal/hostile/eldritch/armsy(loc) - message_admins("[summoned.name] is being summoned by [user.real_name] in [loc]") - var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a [summoned.real_name]", ROLE_HERETIC, null, ROLE_HERETIC, 100,summoned) - user.SetImmobilized(0) - if(LAZYLEN(candidates) == 0) - to_chat(user,"No ghost could be found...") - qdel(summoned) - return FALSE - var/mob/dead/observer/ghost_candidate = pick(candidates) - priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear the dark, for vassal of arms has ascended! Terror of the night has come! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", 'sound/ai/spanomalies.ogg') - log_game("[key_name_admin(ghost_candidate)] has taken control of ([key_name_admin(summoned)]).") - summoned.ghostize(FALSE) - summoned.key = ghost_candidate.key - summoned.mind.add_antag_datum(/datum/antagonist/heretic_monster) - var/datum/antagonist/heretic_monster/monster = summoned.mind.has_antag_datum(/datum/antagonist/heretic_monster) - var/datum/antagonist/heretic/master = user.mind.has_antag_datum(/datum/antagonist/heretic) - monster.set_owner(master) - master.ascended = TRUE - if("Yes") - var/mob/living/summoned = new /mob/living/simple_animal/hostile/eldritch/armsy/prime(loc,TRUE,10) - summoned.ghostize(0) - user.SetImmobilized(0) - priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear the dark, for lord of arms has ascended! Lord of the night has come! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", 'sound/ai/spanomalies.ogg') - log_game("[user.real_name] ascended as [summoned.real_name]") - var/mob/living/carbon/carbon_user = user - var/datum/antagonist/heretic/ascension = carbon_user.mind.has_antag_datum(/datum/antagonist/heretic) - ascension.ascended = TRUE - carbon_user.mind.transfer_to(summoned, TRUE) - carbon_user.gib() - - return ..() + . = ..() + priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Ever coiling vortex, Reality unfoiled. KING OF ARMS [user.real_name] has come! Fear the ever twisting hand! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", 'sound/ai/spanomalies.ogg') + user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shed_human_form) + if(!ishuman(user)) + return + var/mob/living/carbon/human/H = user + H.physiology.brute_mod *= 0.5 + H.physiology.burn_mod *= 0.5 + H.client?.give_award(/datum/award/achievement/misc/flesh_ascension, H) + var/datum/antagonist/heretic/heretic = user.mind.has_antag_datum(/datum/antagonist/heretic) + var/datum/eldritch_knowledge/flesh_grasp/ghoul1 = heretic.get_knowledge(/datum/eldritch_knowledge/flesh_grasp) + ghoul1.ghoul_amt *= 3 + var/datum/eldritch_knowledge/flesh_ghoul/ghoul2 = heretic.get_knowledge(/datum/eldritch_knowledge/flesh_ghoul) + ghoul2.max_amt *= 3 diff --git a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm index bc2b7f0cb92..9b4caaec8bf 100644 --- a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm +++ b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm @@ -20,6 +20,11 @@ route = PATH_RUST /datum/eldritch_knowledge/rust_fist/on_mansus_grasp(atom/target, mob/user, proximity_flag, click_parameters) + . = ..() + target.rust_heretic_act() + return TRUE + +/datum/eldritch_knowledge/rust_fist/on_eldritch_blade(atom/target, mob/user, proximity_flag, click_parameters) . = ..() if(ishuman(target)) var/mob/living/carbon/human/H = target @@ -27,8 +32,6 @@ if(E) E.on_effect() H.adjustOrganLoss(pick(ORGAN_SLOT_BRAIN,ORGAN_SLOT_EARS,ORGAN_SLOT_EYES,ORGAN_SLOT_LIVER,ORGAN_SLOT_LUNGS,ORGAN_SLOT_STOMACH,ORGAN_SLOT_HEART),25) - target.rust_heretic_act() - return TRUE /datum/eldritch_knowledge/spell/area_conversion name = "Agressive Spread" @@ -62,16 +65,17 @@ /datum/eldritch_knowledge/rust_mark name = "Mark of Rust" - desc = "Your eldritch blade now applies a rust mark. Rust mark has a chance to deal between 0 to 200 damage to 75% of enemies items. To Detonate the mark use your mansus grasp on it." + desc = "Your mansus grasp now applies a rust mark. Rust mark has a chance to deal between 0 to 200 damage to 75% of enemies items. To Detonate the mark use your eldritch blade on it." gain_text = "Rusted Hills help those in dire need at a cost." cost = 2 next_knowledge = list(/datum/eldritch_knowledge/spell/area_conversion) banned_knowledge = list(/datum/eldritch_knowledge/ash_mark,/datum/eldritch_knowledge/flesh_mark) route = PATH_RUST -/datum/eldritch_knowledge/rust_mark/on_eldritch_blade(target,user,proximity_flag,click_parameters) +/datum/eldritch_knowledge/rust_mark/on_mansus_grasp(atom/target, mob/user, proximity_flag, click_parameters) . = ..() if(isliving(target)) + . = TRUE var/mob/living/living_target = target living_target.apply_status_effect(/datum/status_effect/eldritch/rust) @@ -84,7 +88,7 @@ banned_knowledge = list(/datum/eldritch_knowledge/ash_blade_upgrade,/datum/eldritch_knowledge/flesh_blade_upgrade) route = PATH_RUST -/datum/eldritch_knowledge/rust_blade_upgrade/on_eldritch_blade(target,user,proximity_flag,click_parameters) +/datum/eldritch_knowledge/rust_blade_upgrade/on_eldritch_blade(atom/target, mob/user, proximity_flag, click_parameters) . = ..() if(iscarbon(target)) var/mob/living/carbon/carbon_target = target @@ -129,10 +133,9 @@ var/mob/living/carbon/human/H = user H.physiology.brute_mod *= 0.5 H.physiology.burn_mod *= 0.5 + H.client?.give_award(/datum/award/achievement/misc/rust_ascension, H) priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear the decay, for Rustbringer [user.real_name] has come! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", 'sound/ai/spanomalies.ogg') new /datum/rust_spread(loc) - var/datum/antagonist/heretic/ascension = H.mind.has_antag_datum(/datum/antagonist/heretic) - ascension.ascended = TRUE return ..() diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm index 991fa0f2fb0..fb2d05c1f7c 100644 --- a/code/modules/asset_cache/asset_list_items.dm +++ b/code/modules/asset_cache/asset_list_items.dm @@ -245,6 +245,9 @@ "rule8" = 'icons/UI_Icons/Achievements/Misc/rule8.png', "snail" = 'icons/UI_Icons/Achievements/Misc/snail.png', "ascension" = 'icons/UI_Icons/Achievements/Misc/ascension.png', + "ashascend" = 'icons/UI_Icons/Achievements/Misc/ashascend.png', + "fleshascend" = 'icons/UI_Icons/Achievements/Misc/fleshascend.png', + "rustascend" = 'icons/UI_Icons/Achievements/Misc/rustascend.png', "mining" = 'icons/UI_Icons/Achievements/Skills/mining.png', "assistant" = 'icons/UI_Icons/Achievements/Mafia/assistant.png', "changeling" = 'icons/UI_Icons/Achievements/Mafia/changeling.png', diff --git a/code/modules/mob/living/simple_animal/eldritch_demons.dm b/code/modules/mob/living/simple_animal/eldritch_demons.dm index 45329c78b71..418c5afa4d1 100644 --- a/code/modules/mob/living/simple_animal/eldritch_demons.dm +++ b/code/modules/mob/living/simple_animal/eldritch_demons.dm @@ -136,6 +136,8 @@ var/stacks_to_grow = 5 ///Currently eaten arms var/current_stacks = 0 + ///Does this follow other pieces? + var/follow = TRUE //I tried Initalize but it didnt work, like at all. This proc just wouldnt fire if it was Initalize instead of New /mob/living/simple_animal/hostile/eldritch/armsy/Initialize(mapload,spawn_more = TRUE,len = 6) @@ -148,6 +150,9 @@ if(!spawn_more) return allow_pulling = TRUE + ///sets the hp of the head to be exactly the length times hp, so the head is de facto the hardest to destroy. + maxHealth = len * maxHealth + health = maxHealth ///next link var/mob/living/simple_animal/hostile/eldritch/armsy/next ///previous link @@ -178,6 +183,18 @@ prev.AIStatus = AI_OFF next = prev +/mob/living/simple_animal/hostile/eldritch/armsy/adjustBruteLoss(amount, updating_health, forced) + if(back) + back.adjustBruteLoss(amount, updating_health, forced) + else + return ..() + +/mob/living/simple_animal/hostile/eldritch/armsy/adjustFireLoss(amount, updating_health, forced) + if(back) + back.adjustFireLoss(amount, updating_health, forced) + else + return ..() + //we are literally a vessel of otherworldly destruction, we bring our own gravity unto this plane /mob/living/simple_animal/hostile/eldritch/armsy/has_gravity(turf/T) return TRUE @@ -193,8 +210,15 @@ back.contract_next_chain_into_single_tile() return +/mob/living/simple_animal/hostile/eldritch/armsy/proc/get_length() + . += 1 + if(back) + . += back.get_length() + ///Updates the next mob in the chain to move to our last location, fixed the worm if somehow broken. /mob/living/simple_animal/hostile/eldritch/armsy/proc/update_chain_links() + if(!follow) + return gib_trail() if(back && back.loc != oldloc) back.Move(oldloc) @@ -219,34 +243,31 @@ QDEL_NULL(back) // chain destruction baby return ..() - /mob/living/simple_animal/hostile/eldritch/armsy/proc/heal() - if(health == maxHealth) - if(back) - back.heal() - return - else - current_stacks++ - if(current_stacks >= stacks_to_grow) - var/mob/living/simple_animal/hostile/eldritch/armsy/prev = new type(drop_location(),spawn_more = FALSE) - icon_state = "armsy_mid" - icon_living = "armsy_mid" - back = prev - prev.icon_state = "armsy_end" - prev.icon_living = "armsy_end" - prev.front = src - prev.AIStatus = AI_OFF - current_stacks = 0 + if(back) + back.heal() adjustBruteLoss(-maxHealth * 0.5, FALSE) adjustFireLoss(-maxHealth * 0.5 ,FALSE) + if(health == maxHealth) + current_stacks++ + if(current_stacks >= stacks_to_grow) + var/mob/living/simple_animal/hostile/eldritch/armsy/prev = new type(drop_location(),spawn_more = FALSE) + icon_state = "armsy_mid" + icon_living = "armsy_mid" + back = prev + prev.icon_state = "armsy_end" + prev.icon_living = "armsy_end" + prev.front = src + prev.AIStatus = AI_OFF + current_stacks = 0 + return /mob/living/simple_animal/hostile/eldritch/armsy/Shoot(atom/targeted_atom) target = targeted_atom AttackingTarget() - /mob/living/simple_animal/hostile/eldritch/armsy/AttackingTarget() if(istype(target,/obj/item/bodypart/r_arm) || istype(target,/obj/item/bodypart/l_arm)) qdel(target) @@ -286,8 +307,8 @@ real_name = "Master of Decay" maxHealth = 400 health = 400 - melee_damage_lower = 20 - melee_damage_upper = 25 + melee_damage_lower = 30 + melee_damage_upper = 50 /mob/living/simple_animal/hostile/eldritch/armsy/prime/Initialize(mapload,spawn_more = TRUE,len = 9) . = ..() @@ -342,7 +363,7 @@ melee_damage_lower = 15 melee_damage_upper = 20 sight = SEE_TURFS - spells_to_add = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/ash,/obj/effect/proc_holder/spell/pointed/cleave/long,/obj/effect/proc_holder/spell/aoe_turf/fire_cascade) + spells_to_add = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/ash,/obj/effect/proc_holder/spell/pointed/cleave,/obj/effect/proc_holder/spell/targeted/fire_sworn) /mob/living/simple_animal/hostile/eldritch/stalker name = "Flesh Stalker" diff --git a/icons/UI_Icons/Achievements/Misc/ashascend.png b/icons/UI_Icons/Achievements/Misc/ashascend.png new file mode 100644 index 00000000000..5e60d456785 Binary files /dev/null and b/icons/UI_Icons/Achievements/Misc/ashascend.png differ diff --git a/icons/UI_Icons/Achievements/Misc/fleshascend.png b/icons/UI_Icons/Achievements/Misc/fleshascend.png new file mode 100644 index 00000000000..109085f8eac Binary files /dev/null and b/icons/UI_Icons/Achievements/Misc/fleshascend.png differ diff --git a/icons/UI_Icons/Achievements/Misc/rustascend.png b/icons/UI_Icons/Achievements/Misc/rustascend.png new file mode 100644 index 00000000000..910cde22f99 Binary files /dev/null and b/icons/UI_Icons/Achievements/Misc/rustascend.png differ diff --git a/icons/mob/actions/actions_ecult.dmi b/icons/mob/actions/actions_ecult.dmi index 3d198fdbc07..19480f5b0cb 100644 Binary files a/icons/mob/actions/actions_ecult.dmi and b/icons/mob/actions/actions_ecult.dmi differ