diff --git a/aurorastation.dme b/aurorastation.dme
index 1966d8575bb..0595e4f81de 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -427,6 +427,7 @@
#include "code\game\antagonist\outsider\ninja.dm"
#include "code\game\antagonist\outsider\raider.dm"
#include "code\game\antagonist\outsider\raider_mage.dm"
+#include "code\game\antagonist\outsider\revenant.dm"
#include "code\game\antagonist\outsider\wizard.dm"
#include "code\game\antagonist\station\changeling.dm"
#include "code\game\antagonist\station\cultist.dm"
@@ -563,6 +564,7 @@
#include "code\game\gamemodes\ninja\ninja.dm"
#include "code\game\gamemodes\nuclear\nuclear.dm"
#include "code\game\gamemodes\nuclear\pinpointer.dm"
+#include "code\game\gamemodes\revenants\revenants.dm"
#include "code\game\gamemodes\revolution\revolution.dm"
#include "code\game\gamemodes\traitor\traitor.dm"
#include "code\game\gamemodes\vampire\modular_vampire.dm"
@@ -1618,6 +1620,7 @@
#include "code\modules\games\spaceball_cards.dm"
#include "code\modules\games\tarot.dm"
#include "code\modules\ghostroles\spawner\base.dm"
+#include "code\modules\ghostroles\spawner\antagonist\revenant.dm"
#include "code\modules\ghostroles\spawner\atom\borer.dm"
#include "code\modules\ghostroles\spawner\atom\golem.dm"
#include "code\modules\ghostroles\spawner\atom\mining_drone.dm"
@@ -1995,7 +1998,7 @@
#include "code\modules\mob\living\carbon\human\species\species_attack.dm"
#include "code\modules\mob\living\carbon\human\species\species_damage.dm"
#include "code\modules\mob\living\carbon\human\species\species_hud.dm"
-#include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm"
+#include "code\modules\mob\living\carbon\human\species\outsider\revenant.dm"
#include "code\modules\mob\living\carbon\human\species\outsider\undead.dm"
#include "code\modules\mob\living\carbon\human\species\station\golem.dm"
#include "code\modules\mob\living\carbon\human\species\station\monkey.dm"
diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm
index 8c9c892aac1..386c3e58c4e 100644
--- a/code/__defines/gamemode.dm
+++ b/code/__defines/gamemode.dm
@@ -58,6 +58,7 @@
#define MODE_TRAITOR "traitor"
#define MODE_VAMPIRE "vampire"
#define MODE_THRALL "thrall"
+#define MODE_REVENANT "revenant"
#define MODE_GOLEM "golem"
#define DEFAULT_TELECRYSTAL_AMOUNT 25
diff --git a/code/__defines/species.dm b/code/__defines/species.dm
index 9223af12dc0..271397ed3e5 100644
--- a/code/__defines/species.dm
+++ b/code/__defines/species.dm
@@ -35,7 +35,7 @@
#define SPECIES_ZOMBIE_TAJARA "Tajara Zombie"
#define SPECIES_ZOMBIE_UNATHI "Unathi Zombie"
#define SPECIES_ZOMBIE_SKRELL "Skrell Zombie"
-#define SPECIES_SHADOW "Shadow"
+#define SPECIES_REVENANT "Revenant"
#define SPECIES_MONKEY "Monkey"
#define SPECIES_MONKEY_SKRELL "Neaera"
diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm
index 649e4a44559..df03ed65000 100644
--- a/code/__defines/species_languages.dm
+++ b/code/__defines/species_languages.dm
@@ -58,6 +58,7 @@
#define LANGUAGE_BORER_HIVEMIND "Cortical Hivemind"
#define LANGUAGE_CULT "Cult" // NOT CULTISTS!
#define LANGUAGE_OCCULT "Occult"
+#define LANGUAGE_REVENANT "Revenant"
#define LANGUAGE_TERMINATOR "Hephaestus Darkcomms" // HKs.
// Lesser-form Languages
diff --git a/code/controllers/subsystems/traumas.dm b/code/controllers/subsystems/traumas.dm
index 8b5aedde91d..388fd21e429 100644
--- a/code/controllers/subsystems/traumas.dm
+++ b/code/controllers/subsystems/traumas.dm
@@ -118,7 +118,7 @@ var/datum/controller/subsystem/traumas/SStraumas
"skrell" = typecacheof(list(/datum/species/skrell)),
"robots" = typecacheof(list(/datum/species/machine)),
"pests" = typecacheof(list(/datum/species/diona, /datum/species/bug)),
- "paranormals" = typecacheof(list(/datum/species/shadow, /datum/species/skeleton, /datum/species/golem)),
+ "paranormals" = typecacheof(list(/datum/species/revenant, /datum/species/skeleton, /datum/species/golem)),
"humans" = typecacheof(list(/datum/species/human))
)
diff --git a/code/datums/underwear/underwear.dm b/code/datums/underwear/underwear.dm
index 0297690f822..7442f894457 100644
--- a/code/datums/underwear/underwear.dm
+++ b/code/datums/underwear/underwear.dm
@@ -70,4 +70,5 @@
var/image/I = image(icon = 'icons/mob/underwear.dmi', icon_state = icon_state)
for(var/datum/gear_tweak/gt in tweaks)
gt.tweak_item(I, metadata && metadata["[gt]"] ? metadata["[gt]"] : gt.get_default())
+ I.appearance_flags = RESET_ALPHA
return I
diff --git a/code/game/antagonist/outsider/revenant.dm b/code/game/antagonist/outsider/revenant.dm
new file mode 100644
index 00000000000..8ddfcfa26a6
--- /dev/null
+++ b/code/game/antagonist/outsider/revenant.dm
@@ -0,0 +1,17 @@
+var/datum/antagonist/revenant/revenants = null
+
+/datum/antagonist/revenant
+ id = MODE_REVENANT
+ role_text = "Revenant"
+ role_text_plural = "Revenants"
+ welcome_text = "A creature borne of bluespace, you are here to wreak havoc and put an end to bluespace experimentation, one station at a time."
+ antaghud_indicator = "hudrevenant"
+ initial_spawn_req = 0
+ initial_spawn_target = 0
+ hard_cap = 12
+ hard_cap_round = 12
+
+/datum/antagonist/revenant/New()
+ ..()
+
+ revenants = src
\ No newline at end of file
diff --git a/code/game/antagonist/station/wizard_golem.dm b/code/game/antagonist/station/wizard_golem.dm
index 544a75d3398..a8ce5591fd2 100644
--- a/code/game/antagonist/station/wizard_golem.dm
+++ b/code/game/antagonist/station/wizard_golem.dm
@@ -1,13 +1,13 @@
-var/datum/antagonist/bluespace_golem/bluespace_golems = null
+var/datum/antagonist/wizard_golem/wizard_golems = null
-/datum/antagonist/bluespace_golem
+/datum/antagonist/wizard_golem
id = MODE_GOLEM
role_text = "Golem"
role_text_plural = "Golems"
welcome_text = "You are a golem summoned by a powerful mage. Serve your master, and assist them in completing their goals at any cost."
antaghud_indicator = "hudmagineer"
-/datum/antagonist/bluespace_golem/New()
+/datum/antagonist/wizard_golem/New()
..()
- bluespace_golems = src
\ No newline at end of file
+ wizard_golems = src
\ No newline at end of file
diff --git a/code/game/gamemodes/revenants/revenants.dm b/code/game/gamemodes/revenants/revenants.dm
new file mode 100644
index 00000000000..7e809567bd0
--- /dev/null
+++ b/code/game/gamemodes/revenants/revenants.dm
@@ -0,0 +1,23 @@
+/datum/game_mode/revenants
+ name = "Revenants"
+ config_tag = "revenants"
+ required_players = 10
+ required_enemies = 0
+ round_autoantag = TRUE
+ min_autotraitor_delay = 3 MINUTES
+ max_autotraitor_delay = 6 MINUTES
+ antag_scaling_coeff = 4 // four people can handle one revenant pretty easily
+ round_description = "A bluespace tear has opened up in the space around us, who knows what could invade?"
+ extended_round_description = "This a wave defense gamemode. The crew all have to work together to repel an endless horde of bluespace horrors."
+ antag_tags = list(MODE_REVENANT)
+
+/datum/game_mode/revenants/process_autoantag()
+ var/datum/ghostspawner/revenant/R = SSghostroles.get_spawner(MODE_REVENANT)
+ var/datum/antagonist/A = all_antag_types[MODE_REVENANT]
+ A.update_current_antag_max()
+ var/previous_count = R.max_count
+ R.max_count = min(R.max_count + 1, A.cur_max)
+ if(R.max_count > previous_count)
+ say_dead_direct("A slot for a Revenant as opened up!
Spawn in as it by using the ghost spawner menu in the ghost tab, and try to be good!")
+ if(!R.enabled)
+ R.enable()
\ No newline at end of file
diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm
index 8d838f1ddd6..749a9f52465 100644
--- a/code/game/machinery/wishgranter.dm
+++ b/code/game/machinery/wishgranter.dm
@@ -58,13 +58,13 @@
user.sight |= (SEE_MOBS|SEE_OBJS|SEE_TURFS)
user.see_invisible = SEE_INVISIBLE_LEVEL_TWO
to_chat(user, "The walls suddenly disappear.")
- user.set_species(SPECIES_SHADOW)
+ user.set_species(SPECIES_REVENANT)
user.mind.special_role = "Avatar of the Wish Granter"
if("I want to be rich")
to_chat(user, "Your wish is granted, but at a terrible cost...")
to_chat(user, "The Wish Granter punishes you for your greediness, claiming your soul and warping your body to match the darkness in your heart.")
new /obj/structure/closet/syndicate/resources/everything(loc)
- user.set_species(SPECIES_SHADOW)
+ user.set_species(SPECIES_REVENANT)
user.mind.special_role = "Avatar of the Wish Granter"
if("I want immortality")
to_chat(user, "Your wish is granted, but at a terrible cost...")
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index f842b8d04f7..7e8e7cf2e20 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -49,6 +49,7 @@
mob_overlay = image("icon" = INV_ACCESSORIES_DEF_ICON, "icon_state" = "[tmp_icon_state]")
if(color)
mob_overlay.color = color
+ mob_overlay.appearance_flags = RESET_ALPHA
return mob_overlay
//when user attached an accessory to S
diff --git a/code/modules/ghostroles/spawner/antagonist/revenant.dm b/code/modules/ghostroles/spawner/antagonist/revenant.dm
new file mode 100644
index 00000000000..2d59205d165
--- /dev/null
+++ b/code/modules/ghostroles/spawner/antagonist/revenant.dm
@@ -0,0 +1,45 @@
+/datum/ghostspawner/revenant
+ short_name = MODE_REVENANT
+ name = "Revenant"
+ desc = "A creature borne of bluespace, you are here to wreak havoc and put an end to bluespace experimentation, one station at a time."
+ tags = list("Antagonist")
+
+ observers_only = TRUE
+ show_on_job_select = FALSE
+
+ enabled = FALSE
+ landmark_name = "Revenant"
+ max_count = 0
+
+ spawn_mob = /mob/living/carbon/human/revenant
+ respawn_flag = ANIMAL
+
+ var/has_fired = FALSE
+
+/datum/ghostspawner/revenant/spawn_mob(mob/user)
+ var/turf/T = select_spawnlocation()
+ var/mob/living/carbon/human/revenant/R
+ if(T)
+ R = new /mob/living/carbon/human/revenant(T)
+ else
+ to_chat(user, SPAN_WARNING("Unable to find any spawn point."))
+ return
+
+ if(R)
+ announce_ghost_joinleave(user, FALSE, "They are now a [name].")
+ R.ckey = user.ckey
+
+ revenants.add_antagonist(R.mind, TRUE, TRUE, FALSE, TRUE, TRUE)
+ if(!has_fired)
+ INVOKE_ASYNC(src, .proc/play_ambience, R)
+
+ return R
+
+/datum/ghostspawner/revenant/proc/play_ambience(var/mob/living/carbon/human/H)
+ for(var/m in player_list - H)
+ var/mob/M = m
+ if(M.ear_deaf)
+ continue
+ M.playsound_simple(get_turf(M), 'sound/ambience/tension/tension.ogg', 75, FALSE)
+ to_chat(M, FONT_LARGE(SPAN_CULT("A faint hum coming from the station walls fills your ears...")))
+ has_fired = TRUE
\ No newline at end of file
diff --git a/code/modules/ghostroles/spawner/atom/borer.dm b/code/modules/ghostroles/spawner/atom/borer.dm
index a31226367a9..783a8c159ce 100644
--- a/code/modules/ghostroles/spawner/atom/borer.dm
+++ b/code/modules/ghostroles/spawner/atom/borer.dm
@@ -4,6 +4,8 @@
desc = "Infest crew, reproduce, repeat."
tags = list("Antagonist")
+ observers_only = TRUE
+
loc_type = GS_LOC_ATOM
atom_add_message = "A borer has been birthed!"
diff --git a/code/modules/ghostroles/spawner/base.dm b/code/modules/ghostroles/spawner/base.dm
index cd40b8ec4b8..0844e1b589e 100644
--- a/code/modules/ghostroles/spawner/base.dm
+++ b/code/modules/ghostroles/spawner/base.dm
@@ -2,7 +2,10 @@
var/short_name = null
var/name = null
var/desc = null
+
+ var/observers_only = FALSE
var/show_on_job_select = TRUE // Determines if the ghost spawner role is considered unique or not.
+
var/welcome_message = null
var/list/tags = list() //Tags associated with that spawner
@@ -71,6 +74,9 @@
if(!is_alien_whitelisted(user, req_species_whitelist))
return "Missing Species Whitelist"
+ if(observers_only && !isobserver(user))
+ return "Observers Only"
+
return FALSE
//Return a error message if the user CANT spawn. Otherwise FALSE
diff --git a/code/modules/goonchat/browserassets/css/browserOutput.css b/code/modules/goonchat/browserassets/css/browserOutput.css
index 34bc2f672a4..4b5f760fe25 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput.css
@@ -363,6 +363,7 @@ h1.alert, h2.alert {color: #a4bad6;}
.yassa {color: #6323b6;}
.delvahhi {color: #914123; font-weight: bold;}
.siiktau {color: #be3434;}
+.revenant {color: #1ca5aa; font-style: italic;}
.interface {color: #750e75;}
diff --git a/code/modules/goonchat/browserassets/css/browserOutput_white.css b/code/modules/goonchat/browserassets/css/browserOutput_white.css
index 11b73d8acef..e6212e178e9 100644
--- a/code/modules/goonchat/browserassets/css/browserOutput_white.css
+++ b/code/modules/goonchat/browserassets/css/browserOutput_white.css
@@ -360,6 +360,7 @@ h1.alert, h2.alert {color: #000080;}
.yassa {color: #400987;}
.delvahhi {color: #5E2612; font-weight: bold;}
.siiktau {color: #A52A2A;}
+.revenant {color: #215a5c; font-style: italic;}
.interface {color: #750e75;}
diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm
index 6645192969c..e48a0c511a9 100644
--- a/code/modules/mob/language/outsider.dm
+++ b/code/modules/mob/language/outsider.dm
@@ -92,4 +92,15 @@
space_chance = 10
/datum/language/terminator/get_random_name()
- return "HK [pick(list("Hera","Zeus","Artemis","Athena","Ares","Hades","Poseidon","Demeter","Apollo","Aphrodite","Hermes","Hestia","Dionysus","Persephone","Kronos","Odysseus","Ajax","Agamemnon","Chiron","Charon"))]-[rand(100, 999)]"
\ No newline at end of file
+ return "HK [pick(list("Hera","Zeus","Artemis","Athena","Ares","Hades","Poseidon","Demeter","Apollo","Aphrodite","Hermes","Hestia","Dionysus","Persephone","Kronos","Odysseus","Ajax","Agamemnon","Chiron","Charon"))]-[rand(100, 999)]"
+
+/datum/language/revenant
+ name = LANGUAGE_REVENANT
+ desc = "The language of the forsaken bluespace inhabitants."
+ speech_verb = list("gargles")
+ ask_verb = list("gags")
+ exclaim_verb = list("retches")
+ colour = "revenant"
+ key = "c"
+ syllables = list("grhhg", "ghrohg", "grgugh", "grrhh", "hghh", "rghghh", "gghhh", "ggrh", "aghrh")
+ flags = RESTRICTED
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm
index 585059e9b55..860fc33574f 100644
--- a/code/modules/mob/living/carbon/human/human_powers.dm
+++ b/code/modules/mob/living/carbon/human/human_powers.dm
@@ -583,6 +583,15 @@ mob/living/carbon/human/proc/change_monitor()
A.throw_at(target, 10, 30, usr)
msg_admin_attack("[key_name_admin(src)] launched a quill at [key_name_admin(target)] (JMP)",ckey=key_name(src),ckey_target=key_name(target))
+/mob/living/carbon/human/proc/dissolve()
+ set name = "Dissolve Self"
+ set desc = "Dissolve yourself in order to escape permanent imprisonment."
+ set category = "Abilities"
+
+ if(alert(usr, "This ability kills you, are you sure you want to do this?", "Dissolve Self", "Yes", "No") == "No")
+ return
+ visible_message(SPAN_DANGER("[src] dissolves!"), SPAN_WARNING("You dissolve yourself, rejoining your brethren in bluespace."))
+ death()
/mob/living/carbon/human/proc/shatter_light()
set category = "Abilities"
@@ -596,7 +605,7 @@ mob/living/carbon/human/proc/change_monitor()
last_special = world.time + 50
visible_message("\The [src] shrieks!")
- playsound(src.loc, 'sound/species/shadow/grue_screech.ogg', 100, 1)
+ playsound(src.loc, 'sound/species/revenant/grue_screech.ogg', 100, 1)
for(var/obj/machinery/light/L in range(7))
L.broken()
@@ -612,7 +621,7 @@ mob/living/carbon/human/proc/change_monitor()
last_special = world.time + 100
- playsound(src.loc, 'sound/species/shadow/grue_growl.ogg', 100, 1)
+ playsound(src.loc, 'sound/species/revenant/grue_growl.ogg', 100, 1)
src.set_light(4,-20)
@@ -689,7 +698,7 @@ mob/living/carbon/human/proc/change_monitor()
src.visible_message("\The [src] takes a step backwards and rears up.",
"You take a step backwards and then...")
if(do_after(src,5))
- playsound(loc, 'sound/species/shadow/grue_screech.ogg', 100, 1)
+ playsound(loc, 'sound/species/revenant/grue_screech.ogg', 100, 1)
src.visible_message("\The [src] charges!")
trampling()
@@ -822,7 +831,7 @@ mob/living/carbon/human/proc/change_monitor()
return
last_special = world.time + 100
- playsound(loc, 'sound/species/shadow/grue_screech.ogg', 100, 1)
+ playsound(loc, 'sound/species/revenant/grue_screech.ogg', 100, 1)
visible_message("\The [src] unleashes a torrent of raging flame!",
"You unleash a gust of fire!",
"You hear the roar of an inferno!")
diff --git a/code/modules/mob/living/carbon/human/species/outsider/revenant.dm b/code/modules/mob/living/carbon/human/species/outsider/revenant.dm
new file mode 100644
index 00000000000..0ee45d4e8fa
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/outsider/revenant.dm
@@ -0,0 +1,133 @@
+/mob/living/carbon/human/revenant/Initialize(mapload)
+ . = ..(mapload, SPECIES_REVENANT)
+ alpha = 0
+ animate(src, 2 SECONDS, alpha = 180)
+
+/datum/species/revenant
+ name = SPECIES_REVENANT
+ name_plural = "revenants"
+
+ blurb = "Have you ever been alone at night \
+ thought you heard footsteps behind, \
+ and turned around and no one's there? \
+ And as you quicken up your pace \
+ you find it hard to look again, \
+ because you're sure there's someone there."
+
+ icobase = 'icons/mob/human_races/r_revenant.dmi'
+ deform = 'icons/mob/human_races/r_revenant.dmi'
+ eyes = "eyes_revenant"
+ has_floating_eyes = TRUE
+
+ default_genders = list(NEUTER)
+
+ language = LANGUAGE_REVENANT
+ default_language = LANGUAGE_REVENANT
+
+ unarmed_types = list(/datum/unarmed_attack/claws/shredding)
+ darksight = 8
+ has_organ = list()
+ siemens_coefficient = 0
+ rarity_value = 10
+
+ break_cuffs = TRUE
+
+ ethanol_resistance = -1
+ taste_sensitivity = TASTE_NUMB
+
+ speech_sounds = list('sound/species/revenant/grue_growl.ogg')
+ speech_chance = 50
+
+ warning_low_pressure = 50 //immune to pressure, so they can into space/survive breaches without worries
+ hazard_low_pressure = -1
+
+ cold_level_1 = 80
+ cold_level_2 = 50
+ cold_level_3 = 0
+
+ brute_mod = 1.2
+ burn_mod = 0.6
+ fall_mod = 0
+
+ breath_type = null
+ poison_type = null
+
+ blood_color = "#0084b8"
+ flesh_color = "#0071db"
+
+ remains_type = /obj/effect/decal/cleanable/ash
+ death_message = "dissolves into ash..."
+ death_message_range = 7
+
+ flags = NO_BLOOD | NO_SCAN | NO_POISON | NO_BREATHE
+ spawn_flags = IS_RESTRICTED
+
+ vision_flags = DEFAULT_SIGHT | SEE_MOBS
+
+ has_limbs = list(
+ BP_CHEST = list("path" = /obj/item/organ/external/chest),
+ BP_GROIN = list("path" = /obj/item/organ/external/groin),
+ BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable/revenant),
+ BP_L_ARM = list("path" = /obj/item/organ/external/arm),
+ BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
+ BP_L_LEG = list("path" = /obj/item/organ/external/leg),
+ BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
+ BP_L_HAND = list("path" = /obj/item/organ/external/hand),
+ BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
+ BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
+ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
+ )
+
+ stamina = 100
+ stamina_recovery = 5
+ sprint_speed_factor = 0.8
+ sprint_cost_factor = 0.5
+
+ inherent_verbs = list(
+ /mob/living/carbon/human/proc/shatter_light,
+ /mob/living/carbon/human/proc/darkness_eyes,
+ /mob/living/carbon/human/proc/dissolve
+ )
+
+ move_trail = /obj/effect/decal/cleanable/blood/tracks/claw
+
+ max_nutrition_factor = -1
+ max_hydration_factor = -1
+
+ hud_type = /datum/hud_data/construct
+
+/datum/species/revenant/handle_death(var/mob/living/carbon/human/H)
+ if(player_is_antag(H.mind))
+ var/datum/ghostspawner/revenant/R = SSghostroles.get_spawner(MODE_REVENANT)
+ R.count = max(R.count - 1, 0)
+ INVOKE_ASYNC(src, .proc/spawn_gore, get_turf(H))
+ H.set_death_time(ANIMAL, world.time)
+ for(var/obj/item/I in H)
+ H.unEquip(I)
+ qdel(H)
+
+/datum/species/revenant/proc/spawn_gore(var/turf/T)
+ var/obj/effect/decal/cleanable/blood/gibs/G = new /obj/effect/decal/cleanable/blood/gibs(T)
+ G.basecolor = blood_color
+ G.fleshcolor = flesh_color
+ G.update_icon()
+
+/datum/species/revenant/handle_post_spawn(var/mob/living/carbon/human/H)
+ H.real_name = "Revenant"
+ H.name = H.real_name
+ ..()
+ H.gender = NEUTER
+
+/datum/species/revenant/get_random_name()
+ return "Revenant"
+
+/datum/species/revenant/handle_death_check(var/mob/living/carbon/human/H)
+ if(H.get_total_health() <= config.health_threshold_dead)
+ return TRUE
+ return FALSE
+
+/datum/species/revenant/bullet_act(var/obj/item/projectile/P, var/def_zone, var/mob/living/carbon/human/H)
+ if((istype(P, /obj/item/projectile/energy) || istype(P, /obj/item/projectile/beam)) && prob(30))
+ H.visible_message(SPAN_CULT("The [P.name] gets absorbed by [H]!"), SPAN_CULT("You absorb the [P.name]!"))
+ return -1
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm b/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
deleted file mode 100644
index 7efdfbcaf14..00000000000
--- a/code/modules/mob/living/carbon/human/species/outsider/shadow.dm
+++ /dev/null
@@ -1,118 +0,0 @@
-/mob/living/carbon/human/shadow/Initialize(mapload)
- . = ..(mapload, SPECIES_SHADOW)
-
-/datum/species/shadow
- name = SPECIES_SHADOW
- name_plural = "shadows"
-
- blurb = "Have you ever been alone at night \
- thought you heard footsteps behind, \
- and turned around and no one's there? \
- And as you quicken up your pace \
- you find it hard to look again, \
- because you're sure there's someone there."
-
- icobase = 'icons/mob/human_races/r_shadow.dmi'
- deform = 'icons/mob/human_races/r_shadow.dmi'
- eyes = "eyes_shadow"
- has_floating_eyes = 1
-
- language = "Cult"
-
- unarmed_types = list(/datum/unarmed_attack/bite/sharp, /datum/unarmed_attack/claws/strong)
- light_dam = 2
- darksight = 8
- has_organ = list()
- siemens_coefficient = 0
- rarity_value = 10
-
- break_cuffs = TRUE
-
- fall_mod = 0
-
- ethanol_resistance = -1
- taste_sensitivity = TASTE_NUMB
-
- speech_sounds = list('sound/species/shadow/grue_growl.ogg')
- speech_chance = 50
-
- warning_low_pressure = 50 //immune to pressure, so they can into space/survive breaches without worries
- hazard_low_pressure = 0
-
- cold_level_1 = 80
- cold_level_2 = 50
- cold_level_3 = 0
-
- brute_mod = 0.5
- burn_mod = 1.2
-
- breath_type = null
- poison_type = null
-
- blood_color = "#CCCCCC"
- flesh_color = "#AAAAAA"
-
- remains_type = /obj/effect/decal/cleanable/ash
- death_message = "dissolves into ash..."
- death_message_range = 7
-
- flags = NO_BLOOD | NO_SCAN | NO_SLIP | NO_POISON | NO_PAIN | NO_BREATHE | NO_EMBED
- spawn_flags = IS_RESTRICTED
-
- vision_flags = DEFAULT_SIGHT | SEE_MOBS
-
- has_limbs = list(
- BP_CHEST = list("path" = /obj/item/organ/external/chest/unbreakable),
- BP_GROIN = list("path" = /obj/item/organ/external/groin/unbreakable),
- BP_HEAD = list("path" = /obj/item/organ/external/head/unbreakable),
- BP_L_ARM = list("path" = /obj/item/organ/external/arm/unbreakable),
- BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unbreakable),
- BP_L_LEG = list("path" = /obj/item/organ/external/leg/unbreakable),
- BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/unbreakable),
- BP_L_HAND = list("path" = /obj/item/organ/external/hand/unbreakable),
- BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/unbreakable),
- BP_L_FOOT = list("path" = /obj/item/organ/external/foot/unbreakable),
- BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unbreakable)
- )
-
- stamina = 500 //Tireless automatons
- stamina_recovery = 1
- sprint_speed_factor = 0.3
- exhaust_threshold = 0 //No oxyloss, so zero threshold
-
- inherent_verbs = list(
- /mob/living/carbon/human/proc/shatter_light,
- /mob/living/carbon/human/proc/create_darkness,
- /mob/living/carbon/human/proc/darkness_eyes,
- /mob/living/carbon/human/proc/shadow_step
- )
-
- move_trail = /obj/effect/decal/cleanable/blood/tracks/claw
-
- max_nutrition_factor = -1
-
- max_hydration_factor = -1
-
- hud_type = /datum/hud_data/construct
-
-/datum/species/shadow/handle_death(var/mob/living/carbon/human/H)
- spawn(1)
- new /obj/effect/decal/cleanable/ash(H.loc)
- qdel(H)
-
-/datum/species/shadow/handle_post_spawn(var/mob/living/carbon/human/H)
- if(H.mind)
- H.mind.assigned_role = "Shadow"
- H.mind.special_role = "Shadow"
- H.real_name = "grue"
- H.name = H.real_name
- H.gender = NEUTER
- ..()
-
-/datum/species/shadow/get_random_name()
- return "grue"
-
-/datum/species/shadow/handle_death_check(var/mob/living/carbon/human/H)
- if(H.get_total_health() <= config.health_threshold_dead)
- return TRUE
- return FALSE
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/species_attack.dm b/code/modules/mob/living/carbon/human/species/species_attack.dm
index 0206a63214e..a73ef2077cd 100644
--- a/code/modules/mob/living/carbon/human/species/species_attack.dm
+++ b/code/modules/mob/living/carbon/human/species/species_attack.dm
@@ -57,6 +57,10 @@
if(3 to 4) user.visible_message("[user] [pick(attack_verb)] [pick("", "", "the side of")] [target]'s [affecting.name]!")
if(5) user.visible_message("[user] tears [user.get_pronoun("his")] [pick(attack_noun)] [pick("deep into", "into", "across")] [target]'s [affecting.name]!")
+/datum/unarmed_attack/claws/shredding
+ shredding = TRUE
+ attack_name = "durable claws"
+
/datum/unarmed_attack/claws/strong
attack_verb = list("slashed")
damage = 10
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 49f471ba389..5f7b22446c8 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -251,7 +251,7 @@ There are several things that need to be remembered:
. = list()
if(build_from_parts)
var/mutable_appearance/M = mutable_appearance(icon_file, "[item_state]_[worn_overlay]")
- M.appearance_flags = RESET_COLOR
+ M.appearance_flags = RESET_COLOR|RESET_ALPHA
. += M
//BASE MOB SPRITE
@@ -584,6 +584,7 @@ There are several things that need to be remembered:
for(var/obj/item/clothing/accessory/A in under.accessories)
ovr += A.get_mob_overlay()
+ standing.appearance_flags = RESET_ALPHA
overlays_raw[UNIFORM_LAYER] = ovr || standing
if(update_icons)
@@ -632,6 +633,7 @@ There are several things that need to be remembered:
result_layer = list(result_layer, lanyard_card, plastic_film)
else
result_layer = list(result_layer, plastic_film)
+ result_layer.appearance_flags = RESET_ALPHA
overlays_raw[id_layer] = result_layer
BITSET(hud_updateflag, ID_HUD)
@@ -671,10 +673,12 @@ There are several things that need to be remembered:
result_layer = list(result_layer, bloodsies)
gloves.screen_loc = ui_gloves
+ result_layer.appearance_flags = RESET_ALPHA
overlays_raw[GLOVES_LAYER] = result_layer
else if(blood_DNA)
- var/image/bloodsies = image(species.blood_mask, "bloodyhands")
+ var/image/bloodsies = image(species.blood_mask, "bloodyhands")
bloodsies.color = hand_blood_color
+ bloodsies.appearance_flags = RESET_ALPHA
overlays_raw[GLOVES_LAYER] = bloodsies
else
overlays_raw[GLOVES_LAYER] = null
@@ -704,6 +708,8 @@ There are several things that need to be remembered:
if(glasses.color)
glasses_overlay.color = glasses.color
+ if(glasses_overlay)
+ glasses_overlay.appearance_flags = RESET_ALPHA
overlays_raw[GLASSES_LAYER] = glasses_overlay
if(update_icons)
@@ -745,6 +751,8 @@ There are several things that need to be remembered:
if(worn_overlays)
result_layer.overlays.Add(worn_overlays)
+ if(result_layer)
+ result_layer.appearance_flags = RESET_ALPHA
overlays_raw[L_EAR_LAYER] = result_layer
else
overlays_raw[L_EAR_LAYER] = null
@@ -788,6 +796,8 @@ There are several things that need to be remembered:
if(worn_overlays)
result_layer.overlays.Add(worn_overlays)
+ if(result_layer)
+ result_layer.appearance_flags = RESET_ALPHA
overlays_raw[R_EAR_LAYER] = result_layer
else
overlays_raw[R_EAR_LAYER] = null
@@ -830,12 +840,15 @@ There are several things that need to be remembered:
if(worn_overlays)
result_layer.overlays.Add(worn_overlays)
+ if(result_layer)
+ result_layer.appearance_flags = RESET_ALPHA
var/list/ovr
if(shoes.blood_DNA)
var/obj/item/clothing/shoes/S = shoes
var/image/bloodsies = image(species.blood_mask, "[S.blood_overlay_type]blood")
bloodsies.color = shoes.blood_color
+ bloodsies.appearance_flags = RESET_ALPHA
ovr = list(result_layer, bloodsies)
//Shoe layer stuff from Polaris v1.0333a
@@ -850,6 +863,7 @@ There are several things that need to be remembered:
if(footprint_color) // Handles bloody feet.
var/image/bloodsies = image(species.blood_mask, "shoeblood")
bloodsies.color = footprint_color
+ bloodsies.appearance_flags = RESET_ALPHA
overlays_raw[SHOES_LAYER] = bloodsies
else
overlays_raw[SHOES_LAYER] = null
@@ -866,11 +880,15 @@ There are several things that need to be remembered:
if(s_store.contained_sprite)
s_store.auto_adapt_species(src)
var/state="[UNDERSCORE_OR_NULL(s_store.icon_species_tag)][s_store.item_state][WORN_SSTORE]"
- overlays_raw[SUIT_STORE_LAYER] = image(s_store.icon_override || s_store.icon, state)
+ var/image/s_store_image = image(s_store.icon_override || s_store.icon, state)
+ s_store_image.appearance_flags = RESET_ALPHA
+ overlays_raw[SUIT_STORE_LAYER] = s_store_image
s_store.screen_loc = ui_sstore1
else
//s_store.auto_adapt_species(src)
- overlays_raw[SUIT_STORE_LAYER] = image('icons/mob/belt_mirror.dmi', s_store.item_state || s_store.icon_state)
+ var/image/s_store_image = image('icons/mob/belt_mirror.dmi', s_store.item_state || s_store.icon_state)
+ s_store_image.appearance_flags = RESET_ALPHA
+ overlays_raw[SUIT_STORE_LAYER] = s_store_image
s_store.screen_loc = ui_sstore1 //TODO
else
overlays_raw[SUIT_STORE_LAYER] = null
@@ -907,12 +925,13 @@ There are several things that need to be remembered:
standing = image(t_icon, head.icon_state)
standing.color = head.color
-
+ standing.appearance_flags = RESET_ALPHA
var/list/ovr
if(head.blood_DNA)
var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "helmetblood")
bloodsies.color = head.blood_color
+ bloodsies.appearance_flags = RESET_ALPHA
ovr = list(standing, bloodsies)
if(istype(head,/obj/item/clothing/head))
@@ -960,6 +979,7 @@ There are several things that need to be remembered:
t_icon = 'icons/mob/belt.dmi'
standing = image(t_icon, t_state)
+ standing.appearance_flags = RESET_ALPHA
var/list/ovr
if(belt.contents.len && istype(belt, /obj/item/storage/belt))
@@ -973,6 +993,8 @@ There are several things that need to be remembered:
else
c_icon = 'icons/mob/belt.dmi'
c_state = i.item_state || i.icon_state
+ var/image/belt_item_image = image(c_icon, c_state)
+ belt_item_image.appearance_flags = RESET_ALPHA
ovr += image(c_icon, c_state)
var/beltlayer = BELT_LAYER
@@ -1017,6 +1039,7 @@ There are several things that need to be remembered:
if(wear_suit.color)
result_layer.color = wear_suit.color
+ result_layer.appearance_flags = RESET_ALPHA
var/image/worn_overlays = wear_suit.worn_overlays(t_icon)
if(worn_overlays)
result_layer.overlays.Add(worn_overlays)
@@ -1027,6 +1050,7 @@ There are several things that need to be remembered:
var/obj/item/clothing/suit/S = wear_suit
var/image/bloodsies = image(species.blood_mask, "[S.blood_overlay_type]blood")
bloodsies.color = wear_suit.blood_color
+ bloodsies.appearance_flags = RESET_ALPHA
ovr = list(result_layer, bloodsies)
// Accessories - copied from uniform, BOILERPLATE because fuck this system.
@@ -1089,12 +1113,14 @@ There are several things that need to be remembered:
if (wear_mask.color)
standing.color = wear_mask.color
+ standing.appearance_flags = RESET_ALPHA
var/list/ovr
if( !istype(wear_mask, /obj/item/clothing/mask/smokable/cigarette) && wear_mask.blood_DNA )
var/image/bloodsies = image(species.blood_mask, "maskblood")
bloodsies.color = wear_mask.blood_color
+ bloodsies.appearance_flags = RESET_ALPHA
ovr = list(standing, bloodsies)
overlays_raw[FACEMASK_LAYER] = ovr || standing
@@ -1152,6 +1178,7 @@ There are several things that need to be remembered:
var/image/standing = image(overlay_icon, overlay_state)
if (back.color)
standing.color = back.color
+ standing.appearance_flags = RESET_ALPHA
overlays_raw[BACK_LAYER] = standing
@@ -1189,6 +1216,7 @@ There are several things that need to be remembered:
standing = image(handcuffed.sprite_sheets[GET_BODY_TYPE], "handcuff1")
else
standing = image('icons/mob/mob.dmi', "handcuff1")
+ standing.appearance_flags = RESET_ALPHA
overlays_raw[HANDCUFF_LAYER] = standing
else
overlays_raw[HANDCUFF_LAYER] = null
@@ -1209,6 +1237,7 @@ There are several things that need to be remembered:
standing = image(legcuffed.sprite_sheets[GET_BODY_TYPE], "legcuff1")
else
standing = image('icons/mob/mob.dmi', "legcuff1")
+ standing.appearance_flags = RESET_ALPHA
overlays_raw[LEGCUFF_LAYER] = standing
if(m_intent != M_WALK)
@@ -1243,6 +1272,7 @@ There are several things that need to be remembered:
if(r_hand.color)
result_layer.color = r_hand.color
+ result_layer.appearance_flags = RESET_ALPHA
overlays_raw[R_HAND_LAYER] = result_layer
else
if(r_hand.item_state_slots && r_hand.item_state_slots[slot_r_hand_str])
@@ -1267,6 +1297,7 @@ There are several things that need to be remembered:
if(worn_overlays)
result_layer.overlays.Add(worn_overlays)
+ result_layer.appearance_flags = RESET_ALPHA
overlays_raw[R_HAND_LAYER] = result_layer
if(update_icons)
@@ -1293,6 +1324,7 @@ There are several things that need to be remembered:
if(l_hand.color)
result_layer.color = l_hand.color
+ result_layer.appearance_flags = RESET_ALPHA
overlays_raw[L_HAND_LAYER] = result_layer
else
if(l_hand.item_state_slots && l_hand.item_state_slots[slot_l_hand_str])
@@ -1317,6 +1349,7 @@ There are several things that need to be remembered:
if(worn_overlays)
result_layer.overlays.Add(worn_overlays)
+ result_layer.appearance_flags = RESET_ALPHA
overlays_raw[L_HAND_LAYER] = result_layer
if(update_icons)
@@ -1432,7 +1465,10 @@ There are several things that need to be remembered:
if (QDELING(src))
return
- overlays_raw[FIRE_LAYER] = on_fire ? image(species.onfire_overlay, "Standing", layer = FIRE_LAYER) : null
+ var/image/fire_image = on_fire ? image(species.onfire_overlay, "Standing", layer = FIRE_LAYER) : null
+ if(fire_image)
+ fire_image.appearance_flags = RESET_ALPHA
+ overlays_raw[FIRE_LAYER] = fire_image
if(update_icons)
update_icon()
@@ -1459,11 +1495,13 @@ There are several things that need to be remembered:
if(overlay_state in surgery_states)
var/image/flesh = image(icon = surgery_icon, icon_state = overlay_state, layer = -SURGERY_LAYER)
flesh.color = E.owner.species.flesh_color
+ flesh.appearance_flags = RESET_ALPHA
LAZYADD(overlays_to_add, flesh)
overlay_state = "[base_state]-blood"
if(overlay_state in surgery_states)
var/image/blood = image(icon = surgery_icon, icon_state = overlay_state, layer = -SURGERY_LAYER)
blood.color = E.owner.species.blood_color
+ blood.appearance_flags = RESET_ALPHA
LAZYADD(overlays_to_add, blood)
overlay_state = "[base_state]-bones"
if(overlay_state in surgery_states)
diff --git a/code/modules/mob/living/carbon/slime/items.dm b/code/modules/mob/living/carbon/slime/items.dm
index 243d3a3d7b9..0e08d607e98 100644
--- a/code/modules/mob/living/carbon/slime/items.dm
+++ b/code/modules/mob/living/carbon/slime/items.dm
@@ -270,7 +270,7 @@
G.name = G.species.get_random_name()
G.real_name = G.name
if(wizardy)
- bluespace_golems.add_antagonist(G.mind, TRUE, TRUE, FALSE, TRUE, TRUE)
+ wizard_golems.add_antagonist(G.mind, TRUE, TRUE, FALSE, TRUE, TRUE)
else
to_chat(G, SPAN_NOTICE("You are a golem. Serve your master, and assist them in completing their goals at any cost."))
diff --git a/code/modules/organs/subtypes/unbreakable.dm b/code/modules/organs/subtypes/unbreakable.dm
index 8c29b0b4e54..9fc70fb376d 100644
--- a/code/modules/organs/subtypes/unbreakable.dm
+++ b/code/modules/organs/subtypes/unbreakable.dm
@@ -41,4 +41,9 @@
/obj/item/organ/external/head/unbreakable
dislocated = -1
- limb_flags = ORGAN_CAN_AMPUTATE
\ No newline at end of file
+ limb_flags = ORGAN_CAN_AMPUTATE
+
+/obj/item/organ/external/head/unbreakable/revenant/get_additional_images(var/mob/living/carbon/human/H)
+ var/image/return_image = image(H.species.eyes_icons, H, "[H.species.eyes]_glow", EFFECTS_ABOVE_LIGHTING_LAYER)
+ return_image.appearance_flags = KEEP_APART
+ return list(return_image)
\ No newline at end of file
diff --git a/config/example/config.txt b/config/example/config.txt
index 983fbb02585..6421f5824bf 100644
--- a/config/example/config.txt
+++ b/config/example/config.txt
@@ -137,6 +137,7 @@ PROBABILITY S MAGISTAKE 1
PROBABILITY S NINJA 1
PROBABILITY S HEIST 1
PROBABILITY S VAMPIRE 1
+PROBABILITY S REVENANTS 1
PROBABILITY S EXTEND-A-TRAITORMONGOUS 6
PROBABILITY S CONFLUX 1
PROBABILITY S CROSSFIRE 1
diff --git a/html/changelogs/geeves-revenant_gamemode.yml b/html/changelogs/geeves-revenant_gamemode.yml
new file mode 100644
index 00000000000..2f37c540df7
--- /dev/null
+++ b/html/changelogs/geeves-revenant_gamemode.yml
@@ -0,0 +1,6 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - rscadd: "Added a new wave defense gamemode, Revenants, wherein the station crew have to defend themselves from an endless wave of humanoid bluespace creatures."
\ No newline at end of file
diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi
index de06497115b..4f15ad52a82 100644
Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ
diff --git a/icons/mob/human_face/eyes.dmi b/icons/mob/human_face/eyes.dmi
index 17884a91ee7..d97096eb4bb 100644
Binary files a/icons/mob/human_face/eyes.dmi and b/icons/mob/human_face/eyes.dmi differ
diff --git a/icons/mob/human_races/r_revenant.dmi b/icons/mob/human_races/r_revenant.dmi
new file mode 100644
index 00000000000..02f5a6611ed
Binary files /dev/null and b/icons/mob/human_races/r_revenant.dmi differ
diff --git a/icons/mob/human_races/r_shadow.dmi b/icons/mob/human_races/r_shadow.dmi
index df055c9bb6a..4af2004a30a 100644
Binary files a/icons/mob/human_races/r_shadow.dmi and b/icons/mob/human_races/r_shadow.dmi differ
diff --git a/maps/aurora/aurora-2_under-station.dmm b/maps/aurora/aurora-2_under-station.dmm
index 20422e123fb..57b99d633f0 100644
--- a/maps/aurora/aurora-2_under-station.dmm
+++ b/maps/aurora/aurora-2_under-station.dmm
@@ -460,6 +460,13 @@
},
/turf/simulated/floor/carpet/rubber,
/area/engineering/cooling)
+"Uy" = (
+/obj/structure/lattice,
+/obj/effect/landmark{
+ name = "Revenant"
+ },
+/turf/template_noop,
+/area/template_noop)
"UG" = (
/turf/simulated/wall/r_wall,
/area/engineering/cooling)
@@ -12767,7 +12774,7 @@ CN
CN
mc
CN
-Ar
+Uy
CN
UG
sQ
diff --git a/maps/aurora/aurora-3_sublevel.dmm b/maps/aurora/aurora-3_sublevel.dmm
index 92351caf3d4..61116f86ca5 100644
--- a/maps/aurora/aurora-3_sublevel.dmm
+++ b/maps/aurora/aurora-3_sublevel.dmm
@@ -36076,6 +36076,17 @@
},
/turf/simulated/floor/tiled,
/area/outpost/engineering/hallway)
+"wvX" = (
+/obj/effect/floor_decal/industrial/warning/dust{
+ dir = 1
+ },
+/obj/effect/landmark{
+ name = "Revenant"
+ },
+/turf/simulated/floor/airless{
+ icon_state = "asteroidplating"
+ },
+/area/mine/unexplored)
"wwk" = (
/obj/structure/cable/green{
d1 = 4;
@@ -36436,6 +36447,12 @@
},
/turf/simulated/floor/wood,
/area/medical/patient_wing_library)
+"xpY" = (
+/obj/effect/landmark{
+ name = "Revenant"
+ },
+/turf/unsimulated/floor/asteroid/ash/rocky,
+/area/mine/unexplored)
"xqo" = (
/obj/structure/window/phoronreinforced{
dir = 8
@@ -52067,7 +52084,7 @@ nDL
nDL
tkm
iOl
-aba
+xpY
aba
aba
ale
@@ -71097,7 +71114,7 @@ aIZ
aNT
vnf
awP
-aqA
+wvX
ebn
ayi
akG
@@ -80862,7 +80879,7 @@ eEq
baw
cFw
nzR
-aba
+xpY
aba
aba
aaa
diff --git a/maps/aurora/aurora-4_mainlevel.dmm b/maps/aurora/aurora-4_mainlevel.dmm
index 02bd5a2f3aa..664a5319598 100644
--- a/maps/aurora/aurora-4_mainlevel.dmm
+++ b/maps/aurora/aurora-4_mainlevel.dmm
@@ -68883,6 +68883,12 @@
},
/turf/simulated/floor/plating,
/area/engineering/engine_room)
+"vHb" = (
+/obj/effect/landmark{
+ name = "Revenant"
+ },
+/turf/unsimulated/floor/asteroid/ash/rocky,
+/area/mine/unexplored)
"vIq" = (
/obj/machinery/portable_atmospherics/hydroponics,
/turf/simulated/floor/grass/alt,
@@ -85907,7 +85913,7 @@ aab
aab
aab
aab
-aab
+vHb
aab
aab
aab
@@ -88420,7 +88426,7 @@ aaa
aaa
aab
aab
-aab
+vHb
aox
qba
aij
@@ -99196,7 +99202,7 @@ aab
aab
aab
aab
-aab
+vHb
aad
aaB
aaJ
@@ -113680,7 +113686,7 @@ vAC
vAC
mmQ
blN
-aab
+vHb
aab
aab
aab
diff --git a/maps/aurora/aurora-5_interstitial.dmm b/maps/aurora/aurora-5_interstitial.dmm
index 031ffa8775b..49cebb1260a 100644
--- a/maps/aurora/aurora-5_interstitial.dmm
+++ b/maps/aurora/aurora-5_interstitial.dmm
@@ -6750,6 +6750,12 @@
},
/turf/simulated/floor/plating,
/area/maintenance/medbay_virology)
+"ru" = (
+/obj/effect/landmark{
+ name = "Revenant"
+ },
+/turf/unsimulated/floor/asteroid/ash/rocky,
+/area/mine/unexplored)
"rA" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/floodlight{
@@ -42785,7 +42791,7 @@ mo
mo
mo
mo
-ab
+ru
ab
ab
ab
@@ -50706,7 +50712,7 @@ if
im
wo
Zt
-ab
+ru
ab
ab
aa
diff --git a/maps/aurora/aurora-6_surface.dmm b/maps/aurora/aurora-6_surface.dmm
index 39832a41e19..5f9d34623cf 100644
--- a/maps/aurora/aurora-6_surface.dmm
+++ b/maps/aurora/aurora-6_surface.dmm
@@ -1296,6 +1296,12 @@
},
/turf/simulated/open/airless,
/area/turret_protected/tcomsat)
+"aVt" = (
+/obj/effect/landmark{
+ name = "Revenant"
+ },
+/turf/unsimulated/floor/asteroid/ash,
+/area/mine/explored)
"aVE" = (
/obj/machinery/atmospherics/pipe/simple/hidden/supply{
dir = 4
@@ -45179,7 +45185,7 @@ rYN
rYN
fdu
kKF
-kKF
+aVt
fdu
rYN
rYN
@@ -53942,7 +53948,7 @@ fdu
fdu
fdu
kKF
-kKF
+aVt
kKF
kKF
kKF
diff --git a/maps/runtime/runtime-1.dmm b/maps/runtime/runtime-1.dmm
index 6c5c0f22c4d..e2a5659be4f 100644
--- a/maps/runtime/runtime-1.dmm
+++ b/maps/runtime/runtime-1.dmm
@@ -1452,6 +1452,12 @@
},
/turf/simulated/floor/plating,
/area/hallway/primary/central_one)
+"iL" = (
+/obj/effect/landmark{
+ name = "Revenant"
+ },
+/turf/simulated/floor/plating,
+/area/maintenance/maintcentral)
"jf" = (
/obj/structure/cable{
d1 = 4;
@@ -3880,7 +3886,7 @@ ae
bv
cw
bv
-ae
+iL
ae
ae
ae
diff --git a/sound/species/shadow/grue_ambience.ogg b/sound/species/revenant/grue_ambience.ogg
similarity index 100%
rename from sound/species/shadow/grue_ambience.ogg
rename to sound/species/revenant/grue_ambience.ogg
diff --git a/sound/species/shadow/grue_growl.ogg b/sound/species/revenant/grue_growl.ogg
similarity index 100%
rename from sound/species/shadow/grue_growl.ogg
rename to sound/species/revenant/grue_growl.ogg
diff --git a/sound/species/shadow/grue_screech.ogg b/sound/species/revenant/grue_screech.ogg
similarity index 100%
rename from sound/species/shadow/grue_screech.ogg
rename to sound/species/revenant/grue_screech.ogg