diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index 2db9e21d5397..f823ff0d8b81 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -31,7 +31,6 @@ return ..() //Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers. - /obj/effect/mob_spawn/human/ash_walker name = "ash walker egg" desc = "A man-sized yellow egg, spawned from some unfathomable creature. A humanoid silhouette lurks within." @@ -54,7 +53,6 @@ /obj/effect/mob_spawn/human/ash_walker/special(mob/living/new_spawn) new_spawn.fully_replace_character_name(null,random_unique_lizard_name(gender)) to_chat(new_spawn, "Drag the corpses of men and beasts to your nest. It will absorb them to create more of your kind. Glory to the Necropolis!") //yogs - removed a sentence - new_spawn.mind.add_antag_datum(/datum/antagonist/ashwalker, team) /obj/effect/mob_spawn/human/ash_walker/Initialize(mapload, datum/team/ashwalkers/ashteam) @@ -62,7 +60,19 @@ var/area/A = get_area(src) team = ashteam if(A) - notify_ghosts("An ash walker egg is ready to hatch in \the [A.name].", source = src, action=NOTIFY_ATTACKORBIT, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER) + notify_ghosts("[mob_name] egg is ready to hatch in \the [A.name].", source = src, action=NOTIFY_ATTACKORBIT, flashwindow = FALSE, ignore_key = POLL_IGNORE_ASHWALKER) + +//Ash walker shaman eggs: Spawns in ash walker dens in lavaland. Only one can exist at a time, they are squishier than regular ashwalkers, and have the sole purpose of keeping other ashwalkers alive. +/obj/effect/mob_spawn/human/ash_walker/shaman + name = "ash walker shaman egg" + desc = "A man-sized, amber egg spawned from some unfathomable creature. A humanoid silhouette lurks within." + mob_name = "an ash walker shaman" + mob_species = /datum/species/lizard/ashwalker/shaman + outfit = /datum/outfit/ashwalker/shaman //might be OP, but the flavour is there + short_desc = "You are an ash walker shaman. Your tribe worships the Necropolis." + flavour_text = "The wastes are sacred ground, its monsters a blessed bounty. You and your people have become one with the tendril and its land. \ + You have seen lights in the distance and from the skies: outsiders that come with greed in their hearts. Fresh sacrifices for your nest." + assignedrole = "Ash Walker Shaman" /datum/outfit/ashwalker name = "Ashwalker" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index c839b0108b45..0489b91b3d4c 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1263,6 +1263,9 @@ /mob/living/carbon/human/species/lizard/ashwalker race = /datum/species/lizard/ashwalker +/mob/living/carbon/human/species/lizard/ashwalker/shaman + race = /datum/species/lizard/ashwalker/shaman + /mob/living/carbon/human/species/lizard/draconid race = /datum/species/lizard/draconid diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 27fce5fa5656..134a4cfb28bf 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -161,6 +161,64 @@ . = ..() C.weather_immunities -= "ash" +//Ash walker shaman, worse defensive stats, but better at surgery and have a healing touch ability +/datum/species/lizard/ashwalker/shaman + name = "Ash Walker Shaman" + id = "ashlizardshaman" + armor = -1 //more of a support than a standard ashwalker, don't get hit + brutemod = 1.15 + burnmod = 1.15 + speedmod = -0.1 //similar to ethereals, should help with saving others + punchdamagehigh = 7 + punchstunthreshold = 7 + action_speed_coefficient = 0.9 //they're smart and efficient unlike other lizards + var/obj/effect/proc_holder/spell/targeted/touch/healtouch/goodtouch + +//gives the heal spell +/datum/species/lizard/ashwalker/shaman/on_species_gain(mob/living/carbon/C, datum/species/old_species) + . = ..() + goodtouch = new /obj/effect/proc_holder/spell/targeted/touch/healtouch + C.AddSpell(goodtouch) + +//removes the heal spell +/datum/species/lizard/ashwalker/shaman/on_species_loss(mob/living/carbon/C) + . = ..() + if(goodtouch) + C.RemoveSpell(goodtouch) + +//basic touch ability that heals brute and burn, only accessed by the ashwalker shaman +/obj/effect/proc_holder/spell/targeted/touch/healtouch + name = "healing touch" + desc = "This spell charges your hand with the vile energy of the Necropolis, permitting you to undo some external injuries from a target." + hand_path = /obj/item/melee/touch_attack/healtouch + + school = "evocation" + panel = "Ashwalker" + charge_max = 20 SECONDS + clothes_req = FALSE + antimagic_allowed = TRUE + + action_icon_state = "spell_default" + +/obj/item/melee/touch_attack/healtouch + name = "\improper healing touch" + desc = "A blaze of life-granting energy from the hand. Heals minor to moderate injuries." + catchphrase = "BE REPLENISHED!!" + on_use_sound = 'sound/magic/staff_healing.ogg' + icon_state = "touchofdeath" //ironic huh + item_state = "touchofdeath" + var/healamount = 20 //total of 40 assuming they're hurt by both brute and burn + +/obj/item/melee/touch_attack/healtouch/afterattack(atom/target, mob/living/carbon/user, proximity) + if(!proximity || target == user || !ismob(target) || !iscarbon(user) || !(user.mobility_flags & MOBILITY_USE)) //no healing yourself + return + if(!user.can_speak_vocal()) + to_chat(user, span_notice("You can't get the words out!")) + return + var/mob/living/M = target + new /obj/effect/temp_visual/heal(get_turf(M), "#899d39") + M.heal_overall_damage(healamount, healamount, 0, BODYPART_ANY, TRUE) //notice it doesn't heal toxins, still need to learn chems for that + return ..() /* Lizard subspecies: DRACONIDS These guys only come from the dragon's blood bottle from lavaland. They're basically just lizards with all-around marginally better stats and fire resistance. diff --git a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm index 8db9701b46df..95bcfa812c3f 100644 --- a/code/modules/ruins/objects_and_mobs/ash_walker_den.dm +++ b/code/modules/ruins/objects_and_mobs/ash_walker_den.dm @@ -57,6 +57,22 @@ /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) + //spawn a shaman if there isn't a living one, or an egg for one + var/shaman = TRUE + for(var/mob/living/carbon/human/lizardfinder in GLOB.mob_living_list) + if(is_species(lizardfinder, /datum/species/lizard/ashwalker/shaman)) + shaman = FALSE //lizard found + if(shaman) + for(var/spawners in GLOB.mob_spawners)//if an admin spawns in a shaman egg somewhere randomly, that will prevent any eggs from spawning normally + for(var/egg in GLOB.mob_spawners[spawners]) + if(istype(egg, /obj/effect/mob_spawn/human/ash_walker/shaman)) + shaman = FALSE + break + + if(shaman)//is a shaman being spawned? + new /obj/effect/mob_spawn/human/ash_walker/shaman(get_step(loc, pick(GLOB.alldirs)), ashies) + else + 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 diff --git a/code/modules/surgery/surgery_step.dm b/code/modules/surgery/surgery_step.dm index 68a3f1ede310..30e8d06942a9 100644 --- a/code/modules/surgery/surgery_step.dm +++ b/code/modules/surgery/surgery_step.dm @@ -103,6 +103,9 @@ if(tool) speed_mod = tool.toolspeed + if(is_species(user, /datum/species/lizard/ashwalker/shaman))//shaman is slightly better at surgeries + speed_mod *= 0.9 + if(IS_MEDICAL(user)) speed_mod *= 0.8