#define ASH_WALKER_SPAWN_THRESHOLD 2 //The ash walker den consumes corpses or unconscious mobs to create ash walker eggs. For more info on those, check ghost_role_spawners.dm /obj/structure/lavaland/ash_walker name = "necropolis tendril nest" desc = "A vile tendril of corruption. It's surrounded by a nest of rapidly growing eggs..." icon = 'icons/mob/nest.dmi' icon_state = "ash_walker_nest" move_resist=INFINITY // just killing it tears a massive hole in the ground, let's not move it anchored = TRUE density = TRUE resistance_flags = FIRE_PROOF | LAVA_PROOF max_integrity = 200 var/faction = list("ashwalker") var/meat_counter = 6 var/spawned_obj = /obj/effect/mob_spawn/human/ash_walker var/species = /datum/species/lizard/ashwalker var/datum/team/ashwalkers/ashies var/datum/linked_objective /obj/structure/lavaland/ash_walker/Initialize(mapload) .=..() ashies = new /datum/team/ashwalkers() var/datum/objective/protect_object/objective = new objective.set_target(src) // objective.team = ashies linked_objective = objective ashies.objectives += objective START_PROCESSING(SSprocessing, src) /obj/structure/lavaland/ash_walker/Destroy() ashies.objectives -= linked_objective ashies = null QDEL_NULL(linked_objective) STOP_PROCESSING(SSprocessing, src) return ..() /obj/structure/lavaland/ash_walker/deconstruct(disassembled) var/core_to_drop = pick(subtypesof(/obj/item/assembly/signaler/anomaly)) new core_to_drop (get_step(loc, pick(GLOB.alldirs))) new /obj/effect/collapse(loc) return ..() /obj/structure/lavaland/ash_walker/process() consume() spawn_mob() /obj/structure/lavaland/ash_walker/proc/consume() for(var/mob/living/offeredmob in view(src, 1)) //Only for corpse right next to/on same tile if(offeredmob.loc == src) continue //Ashwalker Revive in Progress... if(offeredmob.stat) offeredmob.unequip_everything() if(issilicon(offeredmob)) //no advantage to sacrificing borgs... offeredmob.investigate_log("has been gibbed by the necropolis tendril.", INVESTIGATE_DEATHS) visible_message(span_notice("Serrated tendrils eagerly pull [offeredmob] apart, but find nothing of interest.")) offeredmob.gib() return if(offeredmob.mind?.has_antag_datum(/datum/antagonist/ashwalker) && (offeredmob.ckey || offeredmob.get_ghost(FALSE, TRUE))) //special interactions for dead lava lizards with ghosts attached visible_message(span_warning("Serrated tendrils carefully pull [offeredmob] to [src], absorbing the body and creating it anew.")) var/datum/mind/deadmind if(offeredmob.ckey) deadmind = offeredmob else deadmind = offeredmob.get_ghost(FALSE, TRUE) to_chat(deadmind, "Your body has been returned to the nest. You are being remade anew, and will awaken shortly.
Your memories will remain intact in your new body, as your soul is being salvaged") SEND_SOUND(deadmind, sound('sound/magic/enter_blood.ogg',volume=100)) addtimer(CALLBACK(src, PROC_REF(remake_walker), offeredmob), 20 SECONDS) offeredmob.forceMove(src) return if(ismegafauna(offeredmob)) meat_counter += 20 else meat_counter++ visible_message(span_warning("Serrated tendrils eagerly pull [offeredmob] to [src], tearing the body apart as its blood seeps over the eggs.")) playsound(get_turf(src),'sound/magic/demon_consume.ogg', 100, TRUE) var/deliverykey = offeredmob.fingerprintslast //ckey of whoever brought the body var/mob/living/deliverymob = get_mob_by_key(deliverykey) //mob of said ckey //there is a 40% chance that the Lava Lizard unlocks their respawn with each sacrifice if(deliverymob && (deliverymob.mind?.has_antag_datum(/datum/antagonist/ashwalker)) && (deliverykey in ashies.players_spawned) && (prob(40))) to_chat(deliverymob, span_warning("The Necropolis is pleased with your sacrifice. You feel confident your existence after death is secure.")) ashies.players_spawned -= deliverykey offeredmob.investigate_log("has been gibbed by the necropolis tendril.", INVESTIGATE_DEATHS) offeredmob.gib() obj_integrity = min(obj_integrity + max_integrity*0.05,max_integrity)//restores 5% hp of tendril for(var/mob/living/L in view(src, 5)) if(L.mind?.has_antag_datum(/datum/antagonist/ashwalker)) SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "headspear", /datum/mood_event/sacrifice_good) else SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "headspear", /datum/mood_event/sacrifice_bad) /obj/structure/lavaland/ash_walker/proc/remake_walker(mob/living/carbon/oldmob) var/mob/living/carbon/human/newwalker = new /mob/living/carbon/human(get_step(loc, pick(GLOB.alldirs))) newwalker.set_species(/datum/species/lizard/ashwalker) newwalker.real_name = oldmob.real_name newwalker.gender = oldmob.gender newwalker.undershirt = "Nude" newwalker.underwear = "Nude" newwalker.socks = "Nude" newwalker.set_species(species) newwalker.update_body() newwalker.remove_language(/datum/language/common) oldmob.mind.transfer_to(newwalker) newwalker.mind.grab_ghost() to_chat(newwalker, "You have been pulled back from beyond the grave, with a new body and renewed purpose. Glory to the Necropolis!") playsound(get_turf(newwalker),'sound/magic/exit_blood.ogg', 100, TRUE) qdel(oldmob) /obj/structure/lavaland/ash_walker/proc/spawn_mob() if(meat_counter >= ASH_WALKER_SPAWN_THRESHOLD) new /obj/effect/mob_spawn/human/ash_walker(get_step(loc, pick(GLOB.alldirs)), ashies) visible_message(span_danger("One of the eggs swells to an unnatural size and tumbles free. It's ready to hatch!")) meat_counter -= ASH_WALKER_SPAWN_THRESHOLD // ashies.eggs_created++