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