diff --git a/code/__DEFINES/achievements.dm b/code/__DEFINES/achievements.dm
index 7ac7e93f00b..cf3e52fe3bb 100644
--- a/code/__DEFINES/achievements.dm
+++ b/code/__DEFINES/achievements.dm
@@ -29,6 +29,7 @@
#define MEDAL_ASH_ASCENSION "Ash"
#define MEDAL_FLESH_ASCENSION "Flesh"
#define MEDAL_RUST_ASCENSION "Rust"
+#define MEDAL_VOID_ASCENSION "Void"
//Skill medal hub IDs
#define MEDAL_LEGENDARY_MINER "Legendary Miner"
diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
index bf4c44d400f..7a92f6af2de 100644
--- a/code/__DEFINES/antagonists.dm
+++ b/code/__DEFINES/antagonists.dm
@@ -80,3 +80,4 @@
#define PATH_ASH "Ash"
#define PATH_RUST "Rust"
#define PATH_FLESH "Flesh"
+#define PATH_VOID "Void"
diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm
index 91ecd95b5dd..f19e93bdf7b 100644
--- a/code/__DEFINES/dcs/signals.dm
+++ b/code/__DEFINES/dcs/signals.dm
@@ -710,6 +710,9 @@
///called when you clear a mood event from anywhere in the code.
#define COMSIG_CLEAR_MOOD_EVENT "clear_mood"
+///sent to everyone in range of being affected by mask of madness
+#define COMSIG_VOID_MASK_ACT "void_mask_act"
+
//NTnet
///called on an object by its NTNET connection component on receive. (sending_id(number), sending_netname(text), data(datum/netdata))
diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm
index bb42ed1e85d..b3e92531ba3 100644
--- a/code/__DEFINES/maps.dm
+++ b/code/__DEFINES/maps.dm
@@ -43,6 +43,7 @@ require only minor tweaks.
#define ZTRAIT_SNOWSTORM "Weather_Snowstorm"
#define ZTRAIT_ASHSTORM "Weather_Ashstorm"
#define ZTRAIT_ACIDRAIN "Weather_Acidrain"
+#define ZTRAIT_VOIDSTORM "Weather_Voidstorm"
// number - bombcap is multiplied by this before being applied to bombs
#define ZTRAIT_BOMBCAP_MULTIPLIER "Bombcap Multiplier"
diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm
index c15f1622bc9..44f61365db9 100644
--- a/code/__DEFINES/obj_flags.dm
+++ b/code/__DEFINES/obj_flags.dm
@@ -33,6 +33,7 @@
#define SURGICAL_TOOL (1<<12) //Tool commonly used for surgery: won't attack targets in an active surgical operation on help intent (in case of mistakes)
#define EYE_STAB (1<<13) /// Item can be used to eyestab
#define HAND_ITEM (1<<14) /// If an item is just your hand (circled hand, slapper) and shouldn't block things like riding
+#define EXAMINE_SKIP (1<<15) /// Makes the Examine proc not read out this item.
// Flags for the clothing_flags var on /obj/item/clothing
diff --git a/code/datums/achievements/misc_achievements.dm b/code/datums/achievements/misc_achievements.dm
index b9ab38b0688..85be7e3c2cb 100644
--- a/code/datums/achievements/misc_achievements.dm
+++ b/code/datums/achievements/misc_achievements.dm
@@ -141,3 +141,9 @@
desc = "You've summoned a piece of the Hill of rust, and so the Hills welcome you."
database_id = MEDAL_RUST_ASCENSION
icon = "rustascend"
+
+/datum/award/achievement/misc/void_ascension
+ name = "All that perish"
+ desc = "Place of a diffrent being, diffrent time. Everything ends there... but maybe it is just the beginning?"
+ database_id = MEDAL_VOID_ASCENSION
+ icon = "voidascend"
diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm
index b6cb7dca52e..a527ba150b6 100644
--- a/code/datums/components/mood.dm
+++ b/code/datums/components/mood.dm
@@ -26,6 +26,8 @@
RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud)
RegisterSignal(parent, COMSIG_JOB_RECEIVED, .proc/register_job_signals)
+ RegisterSignal(parent, COMSIG_VOID_MASK_ACT, .proc/direct_sanity_drain)
+
var/mob/living/owner = parent
if(owner.hud_used)
modify_hud()
@@ -400,11 +402,19 @@
remove_temp_moods()
setSanity(initial(sanity), override = TRUE)
+
+///Causes direct drain of someone's sanity, call it with a numerical value corresponding how badly you want to hurt their sanity
+/datum/component/mood/proc/direct_sanity_drain(datum/source, amount)
+ SIGNAL_HANDLER
+ setSanity(sanity + amount, override = TRUE)
+
///Called when parent slips.
/datum/component/mood/proc/on_slip(datum/source)
SIGNAL_HANDLER
add_event(null, "slipped", /datum/mood_event/slipped)
+
#undef MINOR_INSANITY_PEN
#undef MAJOR_INSANITY_PEN
+
diff --git a/code/datums/components/storage/concrete/pockets.dm b/code/datums/components/storage/concrete/pockets.dm
index 3a838b678ca..1888b740368 100644
--- a/code/datums/components/storage/concrete/pockets.dm
+++ b/code/datums/components/storage/concrete/pockets.dm
@@ -111,3 +111,13 @@
/obj/item/reagent_containers/food/drinks/bottle/molotov,
/obj/item/reagent_containers/food/drinks/drinkingglass,
/obj/item/ammo_box/a762))
+
+
+/datum/component/storage/concrete/pockets/void_cloak
+ quickdraw = TRUE
+ max_items = 3
+
+/datum/component/storage/concrete/pockets/void_cloak/Initialize()
+ . = ..()
+ var/static/list/exception_cache = typecacheof(list(/obj/item/living_heart,/obj/item/forbidden_book))
+ exception_hold = exception_cache
diff --git a/code/datums/looping_sounds/weather.dm b/code/datums/looping_sounds/weather.dm
index d8ed8d123bb..93debec49ce 100644
--- a/code/datums/looping_sounds/weather.dm
+++ b/code/datums/looping_sounds/weather.dm
@@ -45,3 +45,12 @@
start_length = 130
end_sound = 'sound/weather/ashstorm/inside/weak_end.ogg'
volume = 30
+
+/datum/looping_sound/void_loop
+ mid_sounds = list('sound/ambience/VoidsEmbrace.ogg'=1)
+ mid_length = 1669 // exact length of the music in ticks
+ volume = 100
+ extra_range = 30
+
+/datum/looping_sound/void_loop/start(atom/add_thing)
+ . = ..()
diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm
index 7f7bc35d0c2..422f54262fa 100644
--- a/code/datums/status_effects/buffs.dm
+++ b/code/datums/status_effects/buffs.dm
@@ -364,3 +364,98 @@
/datum/status_effect/antimagic/on_remove()
REMOVE_TRAIT(owner, TRAIT_ANTIMAGIC, MAGIC_TRAIT)
owner.visible_message("[owner]'s dull aura fades away...")
+
+/datum/status_effect/crucible_soul
+ id = "Blessing of Crucible Soul"
+ status_type = STATUS_EFFECT_REFRESH
+ duration = 15 SECONDS
+ examine_text = "They don't seem to be all here."
+ alert_type = /obj/screen/alert/status_effect/crucible_soul
+ var/turf/location
+
+/datum/status_effect/crucible_soul/on_apply()
+ . = ..()
+ to_chat(owner,"You phase through reality, nothing is out of bounds!")
+ owner.alpha = 180
+ owner.pass_flags |= PASSCLOSEDTURF | PASSGLASS | PASSGRILLE | PASSMACHINE | PASSSTRUCTURE | PASSTABLE | PASSMOB
+ location = get_turf(owner)
+
+/datum/status_effect/crucible_soul/on_remove()
+ to_chat(owner,"You regain your physicality, returning you to your original location...")
+ owner.alpha = initial(owner.alpha)
+ owner.pass_flags &= ~(PASSCLOSEDTURF | PASSGLASS | PASSGRILLE | PASSMACHINE | PASSSTRUCTURE | PASSTABLE | PASSMOB)
+ owner.forceMove(location)
+ location = null
+ return ..()
+
+/datum/status_effect/duskndawn
+ id = "Blessing of Dusk and Dawn"
+ status_type = STATUS_EFFECT_REFRESH
+ duration = 60 SECONDS
+ alert_type =/obj/screen/alert/status_effect/duskndawn
+
+/datum/status_effect/duskndawn/on_apply()
+ . = ..()
+ ADD_TRAIT(owner,TRAIT_XRAY_VISION,type)
+ owner.update_sight()
+
+/datum/status_effect/duskndawn/on_remove()
+ REMOVE_TRAIT(owner,TRAIT_XRAY_VISION,type)
+ owner.update_sight()
+ return ..()
+
+/datum/status_effect/marshal
+ id = "Blessing of Wounded Soldier"
+ status_type = STATUS_EFFECT_REFRESH
+ duration = 60 SECONDS
+ tick_interval = 1 SECONDS
+ alert_type = /obj/screen/alert/status_effect/marshal
+
+/datum/status_effect/marshal/on_apply()
+ . = ..()
+ ADD_TRAIT(owner,TRAIT_IGNOREDAMAGESLOWDOWN,type)
+
+/datum/status_effect/marshal/on_remove()
+ . = ..()
+ REMOVE_TRAIT(owner,TRAIT_IGNOREDAMAGESLOWDOWN,type)
+
+/datum/status_effect/marshal/tick()
+ . = ..()
+ if(!iscarbon(owner))
+ return
+ var/mob/living/carbon/carbie = owner
+
+ for(var/BP in carbie.bodyparts)
+ var/obj/item/bodypart/part = BP
+ for(var/W in part.wounds)
+ var/datum/wound/wound = W
+ var/heal_amt = 0
+
+ switch(wound.severity)
+ if(WOUND_SEVERITY_MODERATE)
+ heal_amt = 1
+ if(WOUND_SEVERITY_SEVERE)
+ heal_amt = 3
+ if(WOUND_SEVERITY_CRITICAL)
+ heal_amt = 6
+ if(wound.wound_type == WOUND_BURN)
+ carbie.adjustFireLoss(-heal_amt)
+ else
+ carbie.adjustBruteLoss(-heal_amt)
+ carbie.blood_volume += carbie.blood_volume >= BLOOD_VOLUME_NORMAL ? 0 : heal_amt*3
+
+
+/obj/screen/alert/status_effect/crucible_soul
+ name = "Blessing of Crucible Soul"
+ desc = "You phased through the reality, you are halfway to your final destination..."
+ icon_state = "crucible"
+
+/obj/screen/alert/status_effect/duskndawn
+ name = "Blessing of Dusk and Dawn"
+ desc = "Many things hide beyond the horizon, with Owl's help i managed to slip past sun's guard and moon's watch."
+ icon_state = "duskndawn"
+
+/obj/screen/alert/status_effect/marshal
+ name = "Blessing of Wounded Soldier"
+ desc = "Some people seek power through redemption, one thing many people don't know is that battle is the ultimate redemption and wounds let you bask in eternal glory."
+ icon_state = "wounded_soldier"
diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm
index d5b6d49e62f..67a4734b86f 100644
--- a/code/datums/status_effects/debuffs.dm
+++ b/code/datums/status_effects/debuffs.dm
@@ -458,6 +458,16 @@
I.take_damage(100)
return ..()
+/datum/status_effect/eldritch/void
+ id = "void_mark"
+ effect_sprite = "emark4"
+
+/datum/status_effect/eldritch/void/on_effect()
+ var/turf/open/turfie = get_turf(owner)
+ turfie.TakeTemperature(-40)
+ owner.adjust_bodytemperature(-20)
+ return ..()
+
/// A status effect used for specifying confusion on a living mob.
/// Created automatically with /mob/living/set_confusion.
/datum/status_effect/confusion
diff --git a/code/datums/weather/weather.dm b/code/datums/weather/weather.dm
index 6d7b3b95313..add4d935b87 100644
--- a/code/datums/weather/weather.dm
+++ b/code/datums/weather/weather.dm
@@ -77,6 +77,8 @@
var/barometer_predictable = FALSE
/// For barometers to know when the next storm will hit
var/next_hit_time = 0
+ /// This causes the weather to only end if forced to
+ var/perpetual = FALSE
/datum/weather/New(z_levels)
..()
@@ -135,7 +137,8 @@
to_chat(M, weather_message)
if(weather_sound)
SEND_SOUND(M, sound(weather_sound))
- addtimer(CALLBACK(src, .proc/wind_down), weather_duration)
+ if(!perpetual)
+ addtimer(CALLBACK(src, .proc/wind_down), weather_duration)
/**
* Weather enters the winding down phase, stops effects
diff --git a/code/datums/weather/weather_types/void_storm.dm b/code/datums/weather/weather_types/void_storm.dm
new file mode 100644
index 00000000000..58c9e7be632
--- /dev/null
+++ b/code/datums/weather/weather_types/void_storm.dm
@@ -0,0 +1,32 @@
+/datum/weather/void_storm
+ name = "void storm"
+ desc = "A rare and highly anomalous event often accompanied by unknown entities shredding spacetime continouum. We'd advise you to start running."
+
+ telegraph_duration = 2 SECONDS
+ telegraph_overlay = "void"
+
+ weather_message = "You feel air around you getting colder... and void's sweet embrace..."
+ weather_overlay = "void_storm"
+ weather_duration_lower = 60 SECONDS
+ weather_duration_upper = 120 SECONDS
+
+
+ end_duration = 10 SECONDS
+
+ area_type = /area
+ protect_indoors = FALSE
+ target_trait = ZTRAIT_VOIDSTORM
+
+ immunity_type = "void"
+
+ barometer_predictable = FALSE
+ perpetual = TRUE
+
+/datum/weather/void_storm/weather_act(mob/living/L)
+ if(IS_HERETIC(L) || IS_HERETIC_MONSTER(L))
+ return
+ L.adjustOxyLoss(rand(1,3))
+ L.adjustFireLoss(rand(1,3))
+ L.adjust_blurriness(rand(0,1))
+ L.adjust_bodytemperature(-rand(5,15))
+
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm
index ce6b388ed1b..0430e5b0269 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_antag.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_antag.dm
@@ -38,6 +38,7 @@
current.log_message("has been converted to the cult of the forgotten ones!", LOG_ATTACK, color="#960000")
GLOB.reality_smash_track.AddMind(owner)
START_PROCESSING(SSprocessing,src)
+ RegisterSignal(owner.current,COMSIG_LIVING_DEATH,.proc/on_death)
if(give_equipment)
equip_cultist()
return ..()
@@ -54,6 +55,8 @@
GLOB.reality_smash_track.RemoveMind(owner)
STOP_PROCESSING(SSprocessing,src)
+ on_death()
+
return ..()
@@ -85,10 +88,20 @@
/datum/antagonist/heretic/process()
+ if(owner.current.stat == DEAD)
+ return
+
for(var/X in researched_knowledge)
var/datum/eldritch_knowledge/EK = researched_knowledge[X]
EK.on_life(owner.current)
+///What happens to the heretic once he dies, used to remove any custom perks
+/datum/antagonist/heretic/proc/on_death()
+
+ for(var/X in researched_knowledge)
+ var/datum/eldritch_knowledge/EK = researched_knowledge[X]
+ EK.on_death(owner.current)
+
/datum/antagonist/heretic/proc/forge_primary_objectives()
var/list/assasination = list()
var/list/protection = list()
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm
index 87ee6344b0b..4511541721f 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_effects.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_effects.dm
@@ -311,3 +311,4 @@
var/static/list/postfix = list("Flaw","Presence","Crack","Heat","Cold","Memory","Reminder","Breeze","Grasp","Sight","Whisper","Flow","Touch","Veil","Thought","Imperfection","Blemish","Blush")
name = "\improper" + pick(prefix) + " " + pick(postfix)
+
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm
index c4ac866526e..361598386d1 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm
@@ -104,12 +104,15 @@
/obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
var/datum/antagonist/heretic/cultie = user.mind.has_antag_datum(/datum/antagonist/heretic)
- if(!cultie || !proximity_flag)
+ if(!cultie)
return
var/list/knowledge = cultie.get_all_knowledge()
for(var/X in knowledge)
var/datum/eldritch_knowledge/eldritch_knowledge_datum = knowledge[X]
- eldritch_knowledge_datum.on_eldritch_blade(target,user,proximity_flag,click_parameters)
+ if(proximity_flag)
+ eldritch_knowledge_datum.on_eldritch_blade(target,user,proximity_flag,click_parameters)
+ else
+ eldritch_knowledge_datum.on_ranged_attack_eldritch_blade(target,user,click_parameters)
/obj/item/melee/sickly_blade/rust
name = "\improper Rusted Blade"
@@ -129,6 +132,12 @@
icon_state = "flesh_blade"
inhand_icon_state = "flesh_blade"
+/obj/item/melee/sickly_blade/void
+ name = "Void Blade"
+ desc = "Devoid of any substance, this blade reflects nothingness. It is a real depiction of purity, and chaos that ensues after its implementation."
+ icon_state = "void_blade"
+ inhand_icon_state = "void_blade"
+
/obj/item/clothing/neck/eldritch_amulet
name = "Warm Eldritch Medallion"
desc = "A strange medallion. Peering through the crystalline surface, the world around you melts away. You see your own beating heart, and the pulsing of a thousand others."
@@ -169,7 +178,7 @@
inhand_icon_state = "eldritch_armor"
flags_inv = HIDESHOES|HIDEJUMPSUIT
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS
- allowed = list(/obj/item/melee/sickly_blade, /obj/item/forbidden_book)
+ allowed = list(/obj/item/melee/sickly_blade, /obj/item/forbidden_book, /obj/item/living_heart)
hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch
// slightly better than normal cult robes
armor = list(MELEE = 50, BULLET = 50, LASER = 50,ENERGY = 50, BOMB = 35, BIO = 20, RAD = 0, FIRE = 20, ACID = 20)
@@ -180,3 +189,242 @@
icon = 'icons/obj/eldritch.dmi'
icon_state = "eldrich_flask"
list_reagents = list(/datum/reagent/eldritch = 50)
+
+/obj/item/clothing/head/hooded/cult_hoodie/void
+ name = "void hood"
+ icon_state = "void_cloak"
+ flags_inv = NONE
+ flags_cover = NONE
+ desc = "Black like tar, doesn't reflect any light. Runic symbols line the outside, with each flash you loose comprehension of what you are seeing."
+ item_flags = EXAMINE_SKIP
+ armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
+
+/obj/item/clothing/suit/hooded/cultrobes/void
+ name = "void cloak"
+ desc = "Black like tar, doesn't reflect any light. Runic symbols line the outside, with each flash you loose comprehension of what you are seeing."
+ icon_state = "void_cloak"
+ inhand_icon_state = "void_cloak"
+ allowed = list(/obj/item/melee/sickly_blade, /obj/item/forbidden_book, /obj/item/living_heart)
+ hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/void
+ flags_inv = NONE
+ // slightly worse than normal cult robes
+ armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 0)
+ pocket_storage_component_path = /datum/component/storage/concrete/pockets/void_cloak
+ alternative_mode = TRUE
+
+/obj/item/clothing/suit/hooded/cultrobes/void/ToggleHood()
+ if(!iscarbon(loc))
+ return
+ var/mob/living/carbon/carbon_user = loc
+ if(IS_HERETIC(carbon_user) || IS_HERETIC_MONSTER(carbon_user))
+ . = ..()
+ //We need to account for the hood shenanigans, and that way we can make sure items always fit, even if one of the slots is used by the fucking hood.
+ if(suittoggled)
+ to_chat(carbon_user,"The light shifts around you making the cloak invisible!")
+ else
+ to_chat(carbon_user,"The kaleidoscope of colours collapses around you, as the cloak shifts to visibility!")
+ item_flags = suittoggled ? EXAMINE_SKIP : ~EXAMINE_SKIP
+ else
+ to_chat(carbon_user,"You can't force the hood onto your head!")
+
+
+/obj/item/clothing/mask/void_mask
+ name = "Abyssal Mask"
+ desc = "Mask created from the suffering of existance, you can look down it's eyes, and notice something gazing back at you."
+ icon_state = "mad_mask"
+ inhand_icon_state = "mad_mask"
+ w_class = WEIGHT_CLASS_SMALL
+ flags_cover = MASKCOVERSEYES
+ resistance_flags = FLAMMABLE
+ flags_inv = HIDEFACE|HIDEFACIALHAIR
+ ///Who is wearing this
+ var/mob/living/carbon/human/local_user
+
+/obj/item/clothing/mask/void_mask/equipped(mob/user, slot)
+ . = ..()
+ if(slot != ITEM_SLOT_MASK)
+ return
+ if(ishuman(user) && user.mind && slot == ITEM_SLOT_MASK)
+ local_user = user
+ START_PROCESSING(SSobj,src)
+
+ if(IS_HERETIC(user) || IS_HERETIC_MONSTER(user))
+ return
+ ADD_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT)
+
+/obj/item/clothing/mask/void_mask/dropped(mob/M)
+ local_user = null
+ STOP_PROCESSING(SSobj,src)
+ REMOVE_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT)
+ return ..()
+
+/obj/item/clothing/mask/void_mask/process(delta_time)
+ if(!local_user)
+ return PROCESS_KILL
+
+ if((IS_HERETIC(local_user) || IS_HERETIC_MONSTER(local_user)) && HAS_TRAIT(src,TRAIT_NODROP))
+ REMOVE_TRAIT(src, TRAIT_NODROP, CLOTHING_TRAIT)
+
+ for(var/mob/living/carbon/human/human_in_range in spiral_range(9,local_user))
+ if(IS_HERETIC(human_in_range) || IS_HERETIC_MONSTER(human_in_range))
+ continue
+
+ SEND_SIGNAL(human_in_range,COMSIG_VOID_MASK_ACT,rand(-2,-20)*delta_time)
+
+ if(DT_PROB(60,delta_time))
+ human_in_range.hallucination += 5
+
+ if(DT_PROB(40,delta_time))
+ human_in_range.Jitter(5)
+
+ if(DT_PROB(30,delta_time))
+ human_in_range.emote(pick("giggle","laugh"))
+ human_in_range.adjustStaminaLoss(10)
+
+ if(DT_PROB(25,delta_time))
+ human_in_range.Dizzy(5)
+
+/obj/item/melee/rune_knife
+ name = "Carving Knife"
+ desc = "Cold Steel, pure, perfect, this knife can carve the floor in many ways, but only few can evoke the dangers that lurk beneath reality."
+ icon = 'icons/obj/eldritch.dmi'
+ icon_state = "rune_carver"
+ flags_1 = CONDUCT_1
+ sharpness = SHARP_EDGED
+ w_class = WEIGHT_CLASS_SMALL
+ wound_bonus = 20
+ force = 10
+ throwforce = 5
+ hitsound = 'sound/weapons/bladeslice.ogg'
+ attack_verb_continuous = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "rends")
+ attack_verb_simple = list("attack", "slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "rend")
+ ///turfs that you cannot draw carvings on
+ var/static/list/blacklisted_turfs = typecacheof(list(/turf/closed,/turf/open/space,/turf/open/lava))
+ ///A check to see if you are in process of drawing a rune
+ var/drawing = FALSE
+ ///A list of current runes
+ var/list/current_runes = list()
+ ///Max amount of runes
+ var/max_rune_amt = 3
+ ///Linked action
+ var/datum/action/innate/rune_shatter/linked_action
+
+/obj/item/melee/rune_knife/examine(mob/user)
+ . = ..()
+ . += "This item can carve 'Alert carving' - nearly invisible rune that when stepped on gives you a prompt about where someone stood on it and who it was, doesn't get destroyed by being stepped on."
+ . += "This item can carve 'Grasping carving' - when stepped on it causes heavy damage to the legs and stuns for 5 seconds."
+ . += "This item can carve 'Mad carving' - when stepped on it causes dizzyness, jiterryness, temporary blindness, confusion , stuttering and slurring."
+
+/obj/item/melee/rune_knife/Initialize()
+ . = ..()
+ linked_action = new(src)
+
+/obj/item/melee/rune_knife/pickup(mob/user)
+ . = ..()
+ linked_action.Grant(user, src)
+
+/obj/item/melee/rune_knife/dropped(mob/user, silent)
+ . = ..()
+ linked_action.Remove(user, src)
+
+/obj/item/melee/rune_knife/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ . = ..()
+ if(!is_type_in_typecache(target,blacklisted_turfs) && !drawing && proximity_flag)
+ carve_rune(target,user,proximity_flag,click_parameters)
+
+///Action of carving runes, gives you the ability to click on floor and choose a rune of your need.
+/obj/item/melee/rune_knife/proc/carve_rune(atom/target, mob/user, proximity_flag, click_parameters)
+ var/obj/structure/trap/eldritch/elder = locate() in range(1,target)
+ if(elder)
+ to_chat(user,"You can't draw runes that close to each other!")
+ return
+
+ for(var/X in current_runes)
+ var/obj/structure/trap/eldritch/eldritch = X
+ if(QDELETED(eldritch) || !eldritch)
+ current_runes -= eldritch
+
+ if(current_runes.len >= max_rune_amt)
+ to_chat(user,"The blade cannot support more runes!")
+ return
+
+ var/list/pick_list = list()
+ for(var/E in subtypesof(/obj/structure/trap/eldritch))
+ var/obj/structure/trap/eldritch/eldritch = E
+ pick_list[initial(eldritch.name)] = eldritch
+
+ drawing = TRUE
+
+ var/type = pick_list[input(user,"Choose the rune","Rune") as null|anything in pick_list ]
+ if(!type)
+ drawing = FALSE
+ return
+
+
+ to_chat(user,"You start drawing the rune...")
+ if(!do_after(user,5 SECONDS,target = target))
+ drawing = FALSE
+ return
+
+ drawing = FALSE
+ var/obj/structure/trap/eldritch/eldritch = new type(target)
+ eldritch.set_owner(user)
+ current_runes += eldritch
+
+/datum/action/innate/rune_shatter
+ name = "Rune break"
+ desc = "Destroys all runes that were drawn by this blade."
+ background_icon_state = "bg_ecult"
+ button_icon_state = "rune_break"
+ icon_icon = 'icons/mob/actions/actions_ecult.dmi'
+ check_flags = AB_CHECK_CONSCIOUS
+ ///Reference to the rune knife it is inside of
+ var/obj/item/melee/rune_knife/sword
+
+/datum/action/innate/rune_shatter/Grant(mob/user, obj/object)
+ sword = object
+ return ..()
+
+/datum/action/innate/rune_shatter/Activate()
+ for(var/X in sword.current_runes)
+ var/obj/structure/trap/eldritch/eldritch = X
+ if(!QDELETED(eldritch) && eldritch)
+ qdel(eldritch)
+
+/obj/item/eldritch_potion
+ name = "Brew of Day and Night"
+ desc = "You should never see this"
+ icon = 'icons/obj/eldritch.dmi'
+ ///Typepath to the status effect this is supposed to hold
+ var/status_effect
+
+/obj/item/eldritch_potion/attack_self(mob/user)
+ . = ..()
+ to_chat(user,"You drink the potion and with the viscous liquid, the glass dematerializes.")
+ effect(user)
+ qdel(src)
+
+///The effect of the potion if it has any special one, in general try not to override this and utilize the status_effect var to make custom effects.
+/obj/item/eldritch_potion/proc/effect(mob/user)
+ if(!iscarbon(user))
+ return
+ var/mob/living/carbon/carbie = user
+ carbie.apply_status_effect(status_effect)
+
+/obj/item/eldritch_potion/crucible_soul
+ name = "Brew of Crucible Soul"
+ desc = "Allows you to phase through walls for 15 seconds, after the time runs out, you get teleported to your original location."
+ icon_state = "crucible_soul"
+ status_effect = /datum/status_effect/crucible_soul
+
+/obj/item/eldritch_potion/duskndawn
+ name = "Brew of Dusk and Dawn"
+ desc = "Allows you to see clearly through walls and objects for 60 seconds."
+ icon_state = "clarity"
+ status_effect = /datum/status_effect/duskndawn
+
+/obj/item/eldritch_potion/wounded
+ name = "Brew of Wounded Soldier"
+ desc = "For the next 60 seconds each wound will heal you, minor wounds heal 1 of it's damage type per second, moderate heal 3 and critical heal 6. You also become immune to damage slowdon."
+ icon_state = "marshal"
+ status_effect = /datum/status_effect/marshal
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
index 21d63e06a35..1aa22a720a3 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_knowledge.dm
@@ -65,6 +65,14 @@
/datum/eldritch_knowledge/proc/recipe_snowflake_check(list/atoms,loc)
return TRUE
+/**
+ * A proc that handles the code when the mob dies
+ *
+ * This proc is primarily used to end any soundloops when the heretic dies
+ */
+/datum/eldritch_knowledge/proc/on_death(mob/user)
+ return
+
/**
* What happens once the recipe is succesfully finished
*
@@ -109,6 +117,14 @@
/datum/eldritch_knowledge/proc/on_eldritch_blade(atom/target,mob/user,proximity_flag,click_parameters)
return
+/**
+ * Sickly blade distant act
+ *
+ * Same as [/datum/eldritch_knowledge/proc/on_eldritch_blade] but works on targets that are not in proximity to you.
+ */
+/datum/eldritch_knowledge/proc/on_ranged_attack_eldritch_blade(atom/target,mob/user,click_parameters)
+ return
+
//////////////
///Subtypes///
//////////////
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm
index 1ee726ecc54..614a9becee5 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm
@@ -43,8 +43,8 @@
/obj/item/melee/touch_attack/mansus_fist
name = "Mansus Grasp"
desc = "A sinister looking aura that distorts the flow of reality around it. Causes knockdown and major stamina damage in addition to some brute. It gains additional beneficial effects as you expand your knowledge of the Mansus."
- icon_state = "disintegrate"
- inhand_icon_state = "disintegrate"
+ icon_state = "mansus"
+ inhand_icon_state = "mansus"
catchphrase = "R'CH T'H TR'TH"
/obj/item/melee/touch_attack/mansus_fist/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
@@ -714,3 +714,92 @@
segment_length = armsy.get_length()
qdel(armsy)
return
+
+/obj/effect/proc_holder/spell/pointed/void_blink
+ name = "Void Phase"
+ desc = "Let's you blink to your pointed destination, causes 3x3 aoe damage bubble around your pointed destination and your current location. It has a minimum range of 3 tiles and a maximum range of 9 tiles."
+ invocation_type = INVOCATION_WHISPER
+ invocation = "RE'L'TY PH'S'E"
+ clothes_req = FALSE
+ range = 9
+ action_background_icon_state = "bg_ecult"
+ charge_max = 300
+ action_icon = 'icons/mob/actions/actions_ecult.dmi'
+ action_icon_state = "voidblink"
+ selection_type = "range"
+
+/obj/effect/proc_holder/spell/pointed/void_blink/can_target(atom/target, mob/user, silent)
+ . = ..()
+ if(get_dist(get_turf(user),get_turf(target)) < 3 )
+ return FALSE
+
+/obj/effect/proc_holder/spell/pointed/void_blink/cast(list/targets, mob/user)
+ . = ..()
+ var/target = targets[1]
+ var/turf/targeted_turf = get_turf(target)
+
+ playsound(user,'sound/magic/voidblink.ogg',100)
+ playsound(targeted_turf,'sound/magic/voidblink.ogg',100)
+
+ new /obj/effect/temp_visual/voidin(user.drop_location())
+ new /obj/effect/temp_visual/voidout(targeted_turf)
+
+ for(var/mob/living/living_mob in range(1,user)-user)
+ if(IS_HERETIC(living_mob) || IS_HERETIC_MONSTER(living_mob))
+ continue
+ living_mob.adjustBruteLoss(40)
+
+ for(var/mob/living/living_mob in range(1,targeted_turf)-user)
+ if(IS_HERETIC(living_mob) || IS_HERETIC_MONSTER(living_mob))
+ continue
+ living_mob.adjustBruteLoss(40)
+
+ do_teleport(user,targeted_turf,TRUE,no_effects = TRUE)
+
+/obj/effect/temp_visual/voidin
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "void_blink_in"
+ alpha = 150
+ duration = 6
+ pixel_x = -32
+ pixel_y = -32
+
+/obj/effect/temp_visual/voidout
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "void_blink_out"
+ alpha = 150
+ duration = 6
+ pixel_x = -32
+ pixel_y = -32
+
+/obj/effect/proc_holder/spell/targeted/void_pull
+ name = "Void Pull"
+ desc = "Call the void, this pulls all nearby people closer to you, damages people already around you. If they are 4 tiles or closer they are also knocked down and a micro-stun is applied."
+ invocation_type = INVOCATION_WHISPER
+ invocation = "BR'NG F'RTH TH'M T' M'"
+ clothes_req = FALSE
+ action_background_icon_state = "bg_ecult"
+ range = -1
+ include_user = TRUE
+ charge_max = 400
+ action_icon = 'icons/mob/actions/actions_ecult.dmi'
+ action_icon_state = "voidpull"
+
+/obj/effect/proc_holder/spell/targeted/void_pull/cast(list/targets, mob/user)
+ . = ..()
+ for(var/mob/living/living_mob in range(1,user)-user)
+ if(IS_HERETIC(living_mob) || IS_HERETIC_MONSTER(living_mob))
+ continue
+ living_mob.adjustBruteLoss(30)
+
+ playsound(user,'sound/magic/voidblink.ogg',100)
+ new /obj/effect/temp_visual/voidin(user.drop_location())
+ for(var/mob/living/livies in view(7,user)-user)
+
+ if(get_dist(user,livies) < 4)
+ livies.AdjustKnockdown(3 SECONDS)
+ livies.AdjustParalyzed(0.5 SECONDS)
+
+ for(var/i in 1 to 3)
+ livies.forceMove(get_step_towards(livies,user))
+
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm b/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm
index 0629c70f832..0d5bb0a2553 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_monster_antag.dm
@@ -7,6 +7,7 @@
job_rank = ROLE_HERETIC
antag_hud_type = ANTAG_HUD_HERETIC
antag_hud_name = "heretic_beast"
+ show_in_antagpanel = FALSE
var/datum/antagonist/master
/datum/antagonist/heretic_monster/admin_add(datum/mind/new_owner,mob/admin)
@@ -29,6 +30,7 @@
var/datum/objective/master_obj = new
master_obj.owner = src
master_obj.explanation_text = "Assist your master in any way you can!"
+ master_obj.completed = TRUE
objectives += master_obj
owner.announce_objectives()
to_chat(owner, "Your master is [master.owner.current.real_name]")
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_structures.dm b/code/modules/antagonists/eldritch_cult/eldritch_structures.dm
new file mode 100644
index 00000000000..c1d2ae4f1d0
--- /dev/null
+++ b/code/modules/antagonists/eldritch_cult/eldritch_structures.dm
@@ -0,0 +1,177 @@
+/obj/structure/eldritch_crucible
+ name = "Mawed Crucible"
+ desc = "Immortalized cast iron, the steel-like teeth holding it in place, it's vile extract has the power of rebirthing things, remaking them from the very beginning."
+ icon = 'icons/obj/eldritch.dmi'
+ icon_state = "crucible"
+ anchored = FALSE
+ density = TRUE
+ ///How much mass this currently holds
+ var/current_mass = 5
+ ///Maximum amount of mass
+ var/max_mass = 5
+ ///Check to see if it is currently being used.
+ var/in_use = FALSE
+
+/obj/structure/eldritch_crucible/examine(mob/user)
+ . = ..()
+ if(!IS_HERETIC(user) && !IS_HERETIC_MONSTER(user))
+ return
+ if(current_mass < max_mass)
+ . += "The Crucible requires [max_mass - current_mass] more organs or bodyparts!"
+ else
+ . += "The Crucible is ready to be used!"
+
+ . += "You can anchor and reanchor it using Codex Cicatrix!"
+ . += "It is currently [anchored == FALSE ? "unanchored" : "anchored"]"
+ . += "This structure can brew 'Brew of Crucible soul' - when used it gives you the ability to phase through matter for 15 seconds, after the time elapses it teleports you back to your original location"
+ . += "This structure can brew 'Brew of Dusk and Dawn' - when used it gives you xray for 1 minute"
+ . += "This structure can brew 'Brew of Wounded Soldier' - when used it makes you immune to damage slowdown, additionally you start healing for every wound you have, quickly outpacing the damage caused by them."
+
+/obj/structure/eldritch_crucible/attacked_by(obj/item/I, mob/living/user)
+ if(istype(I,/obj/item/nullrod))
+ qdel(src)
+ return
+
+ if(!IS_HERETIC(user) && !IS_HERETIC_MONSTER(user))
+ if(iscarbon(user))
+ devour(user)
+ return
+
+ if(istype(I,/obj/item/forbidden_book))
+ playsound(src, 'sound/misc/desecration-02.ogg', 75, TRUE)
+ anchored = !anchored
+ to_chat(user,"You [anchored == FALSE ? "unanchor" : "anchor"] the crucible")
+ return
+
+ if(istype(I,/obj/item/bodypart) || istype(I,/obj/item/organ))
+ //Both organs and bodyparts hold information if they are organic or robotic in the exact same way.
+ var/obj/item/bodypart/forced = I
+ if(forced.status != BODYPART_ORGANIC)
+ return
+
+ if(current_mass >= max_mass)
+ to_chat(user," Crucible is already full!")
+ return
+ playsound(src, 'sound/items/eatfood.ogg', 100, TRUE)
+ to_chat(user,"Crucible devours [I.name] and fills itself with a little bit of liquid!")
+ current_mass++
+ qdel(I)
+ update_icon_state()
+ return
+
+ return ..()
+
+/obj/structure/eldritch_crucible/attack_hand(mob/user)
+ if(!IS_HERETIC(user) && !IS_HERETIC_MONSTER(user))
+ if(iscarbon(user))
+ devour(user)
+ return
+
+ if(in_use)
+ to_chat(user,"Crucible is already in use!")
+ return
+
+ if(current_mass < max_mass)
+ to_chat(user,"Crucible isn't full! Bring it more organs or bodyparts!")
+ return
+
+ in_use = TRUE
+ var/list/lst = list()
+ for(var/X in subtypesof(/obj/item/eldritch_potion))
+ var/obj/item/eldritch_potion/potion = X
+ lst[initial(potion.name)] = potion
+ var/type = lst[input(user,"Choose your brew","Brew") in lst]
+ playsound(src, 'sound/misc/desecration-02.ogg', 75, TRUE)
+ new type(drop_location())
+ current_mass = 0
+ in_use = FALSE
+ update_icon_state()
+
+///Proc that eats the active limb of the victim
+/obj/structure/eldritch_crucible/proc/devour(mob/living/carbon/user)
+ if(HAS_TRAIT(user,TRAIT_NODISMEMBER))
+ return
+ playsound(src, 'sound/items/eatfood.ogg', 100, TRUE)
+ to_chat(user,"Crucible grabs your arm and devours it whole!")
+ var/obj/item/bodypart/arm = user.get_active_hand()
+ arm.dismember()
+ qdel(arm)
+ current_mass += current_mass < max_mass ? 1 : 0
+ update_icon_state()
+
+/obj/structure/eldritch_crucible/update_icon_state()
+ . = ..()
+ if(current_mass == max_mass)
+ icon_state = "crucible"
+ else
+ icon_state = "crucible_empty"
+
+/obj/structure/trap/eldritch
+ name = "elder carving"
+ desc = "Collection of unknown symbols, they remind you of days long gone..."
+ icon = 'icons/obj/eldritch.dmi'
+ charges = 1
+ ///Owner of the trap
+ var/mob/owner
+
+/obj/structure/trap/eldritch/Crossed(atom/movable/AM)
+ if(!isliving(AM))
+ return ..()
+ var/mob/living/living_mob = AM
+ if((owner && living_mob == owner) || IS_HERETIC(living_mob) || IS_HERETIC_MONSTER(living_mob))
+ return
+ return ..()
+
+/obj/structure/trap/eldritch/attacked_by(obj/item/I, mob/living/user)
+ . = ..()
+ if(istype(I,/obj/item/melee/rune_knife) || istype(I,/obj/item/nullrod))
+ qdel(src)
+
+///Proc that sets the owner
+/obj/structure/trap/eldritch/proc/set_owner(mob/_owner)
+ owner = _owner
+
+/obj/structure/trap/eldritch/alert
+ name = "alert carving"
+ icon_state = "alert_rune"
+ alpha = 10
+
+/obj/structure/trap/eldritch/alert/trap_effect(mob/living/L)
+ if(owner)
+ to_chat(owner,"[L.real_name] has stepped foot on the alert rune in [get_area(src)]!")
+ return ..()
+
+//this trap can only get destroyed by rune carving knife or nullrod
+/obj/structure/trap/eldritch/alert/flare()
+ return
+
+/obj/structure/trap/eldritch/tentacle
+ name = "grasping carving"
+ icon_state = "tentacle_rune"
+
+/obj/structure/trap/eldritch/tentacle/trap_effect(mob/living/L)
+ if(!iscarbon(L))
+ return
+ var/mob/living/carbon/carbon_victim = L
+ carbon_victim.Paralyze(5 SECONDS)
+ carbon_victim.apply_damage(20,BRUTE,BODY_ZONE_R_LEG)
+ carbon_victim.apply_damage(20,BRUTE,BODY_ZONE_L_LEG)
+ playsound(src, 'sound/magic/demon_attack1.ogg', 75, TRUE)
+ return ..()
+
+/obj/structure/trap/eldritch/mad
+ name = "mad carving"
+ icon_state = "madness_rune"
+
+/obj/structure/trap/eldritch/mad/trap_effect(mob/living/L)
+ if(!iscarbon(L))
+ return
+ var/mob/living/carbon/carbon_victim = L
+ carbon_victim.adjustStaminaLoss(80)
+ carbon_victim.silent += 10
+ carbon_victim.add_confusion(5)
+ carbon_victim.Jitter(10)
+ carbon_victim.Dizzy(20)
+ carbon_victim.blind_eyes(2)
+ SEND_SIGNAL(carbon_victim, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus)
+ return ..()
diff --git a/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm
index 53f6a607145..1c3a9ad5b90 100644
--- a/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm
+++ b/code/modules/antagonists/eldritch_cult/knowledge/ash_lore.dm
@@ -2,7 +2,7 @@
name = "Nightwatcher's Secret"
desc = "Opens up the Path of Ash to you. Allows you to transmute a match with a kitchen knife, or its derivatives, into an Ashen Blade."
gain_text = "The City Guard know their watch. If you ask them at night, they may tell you about the ashy lantern."
- banned_knowledge = list(/datum/eldritch_knowledge/base_rust,/datum/eldritch_knowledge/base_flesh,/datum/eldritch_knowledge/final/rust_final,/datum/eldritch_knowledge/final/flesh_final)
+ banned_knowledge = list(/datum/eldritch_knowledge/base_rust,/datum/eldritch_knowledge/base_flesh,/datum/eldritch_knowledge/final/rust_final,/datum/eldritch_knowledge/final/flesh_final,/datum/eldritch_knowledge/final/void_final,/datum/eldritch_knowledge/base_void)
next_knowledge = list(/datum/eldritch_knowledge/ashen_grasp)
required_atoms = list(/obj/item/kitchen/knife,/obj/item/match)
result_atoms = list(/obj/item/melee/sickly_blade/ash)
@@ -42,7 +42,7 @@
if(!iscarbon(target))
return
var/mob/living/carbon/C = target
- var/datum/status_effect/eldritch/E = C.has_status_effect(/datum/status_effect/eldritch/rust) || C.has_status_effect(/datum/status_effect/eldritch/ash) || C.has_status_effect(/datum/status_effect/eldritch/flesh)
+ var/datum/status_effect/eldritch/E = C.has_status_effect(/datum/status_effect/eldritch/rust) || C.has_status_effect(/datum/status_effect/eldritch/ash) || C.has_status_effect(/datum/status_effect/eldritch/flesh) || C.has_status_effect(/datum/status_effect/eldritch/void)
if(E)
E.on_effect()
for(var/X in user.mind.spell_list)
@@ -65,7 +65,7 @@
gain_text = "The Nightwatcher was a very particular man, always watching in the dead of night. But in spite of his duty, he regularly tranced through the manse with his blazing lantern held high."
desc = "Your Mansus Grasp now applies the Mark of Ash on hit. Attack the afflicted with your Sickly Blade to detonate the mark. Upon detonation, the Mark of Ash causes stamina damage and burn damage, and spreads to an additional nearby opponent. The damage decreases with each spread."
cost = 2
- next_knowledge = list(/datum/eldritch_knowledge/curse/blindness)
+ next_knowledge = list(/datum/eldritch_knowledge/mad_mask)
banned_knowledge = list(/datum/eldritch_knowledge/rust_mark,/datum/eldritch_knowledge/flesh_mark)
route = PATH_ASH
@@ -76,24 +76,16 @@
var/mob/living/living_target = target
living_target.apply_status_effect(/datum/status_effect/eldritch/ash,5)
-/datum/eldritch_knowledge/curse/blindness
- name = "Curse of Blindness"
+/datum/eldritch_knowledge/mad_mask
+ name = "Mask of Madness"
gain_text = "He walks the world, unnoticed by the masses."
- desc = "Curse someone with 2 minutes of complete blindness by sacrificing a pair of eyes and a screwdriver with an object that the victim has touched with their bare hands."
+ desc = "Allows you to transmute any mask, with a candle and a pair of eyes, to create a mask of madness, It causes passive stamina damage to everyone around the wearer and hallucinations, can be forced on a non believer to make him unable to take it off..."
cost = 1
- required_atoms = list(/obj/item/organ/eyes,/obj/item/screwdriver)
+ result_atoms = list(/obj/item/clothing/mask/void_mask)
+ required_atoms = list(/obj/item/organ/eyes,/obj/item/clothing/mask,/obj/item/candle)
next_knowledge = list(/datum/eldritch_knowledge/curse/corrosion,/datum/eldritch_knowledge/ash_blade_upgrade,/datum/eldritch_knowledge/curse/paralysis)
- timer = 2 MINUTES
route = PATH_ASH
-/datum/eldritch_knowledge/curse/blindness/curse(mob/living/chosen_mob)
- . = ..()
- chosen_mob.become_blind(MAGIC_TRAIT)
-
-/datum/eldritch_knowledge/curse/blindness/uncurse(mob/living/chosen_mob)
- . = ..()
- chosen_mob.cure_blind(MAGIC_TRAIT)
-
/datum/eldritch_knowledge/spell/flame_birth
name = "Flame Birth"
gain_text = "The Nightwatcher was a man of principles, and yet his power arose from the chaos he vowed to combat."
@@ -125,7 +117,7 @@
desc = "Curse someone for 2 minutes of vomiting and major organ damage. Using a wirecutter, a pool of blood, a heart, left arm and a right arm, and an item that the victim touched with their bare hands."
cost = 1
required_atoms = list(/obj/item/wirecutters,/obj/effect/decal/cleanable/vomit,/obj/item/organ/heart)
- next_knowledge = list(/datum/eldritch_knowledge/curse/blindness,/datum/eldritch_knowledge/spell/area_conversion)
+ next_knowledge = list(/datum/eldritch_knowledge/mad_mask,/datum/eldritch_knowledge/spell/area_conversion)
timer = 2 MINUTES
/datum/eldritch_knowledge/curse/corrosion/curse(mob/living/chosen_mob)
@@ -142,7 +134,7 @@
desc = "Curse someone for 5 minutes of inability to walk. Sacrifice a knife, a pool of blood, a pair of legs, a hatchet and an item that the victim touched with their bare hands. "
cost = 1
required_atoms = list(/obj/item/bodypart/l_leg,/obj/item/bodypart/r_leg,/obj/item/hatchet)
- next_knowledge = list(/datum/eldritch_knowledge/curse/blindness,/datum/eldritch_knowledge/summon/raw_prophet)
+ next_knowledge = list(/datum/eldritch_knowledge/mad_mask,/datum/eldritch_knowledge/summon/raw_prophet)
timer = 5 MINUTES
/datum/eldritch_knowledge/curse/paralysis/curse(mob/living/chosen_mob)
diff --git a/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm
index 4ff756bed16..22cdf90eaca 100644
--- a/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm
+++ b/code/modules/antagonists/eldritch_cult/knowledge/flesh_lore.dm
@@ -2,7 +2,7 @@
name = "Principle of Hunger"
desc = "Opens up the Path of Flesh to you. Allows you to transmute a pool of blood with a kitchen knife, or its derivatives, into a Flesh Blade."
gain_text = "Hundreds of us starved, but not me... I found strength in my greed."
- banned_knowledge = list(/datum/eldritch_knowledge/base_ash,/datum/eldritch_knowledge/base_rust,/datum/eldritch_knowledge/final/ash_final,/datum/eldritch_knowledge/final/rust_final)
+ banned_knowledge = list(/datum/eldritch_knowledge/base_ash,/datum/eldritch_knowledge/base_rust,/datum/eldritch_knowledge/final/ash_final,/datum/eldritch_knowledge/final/rust_final,/datum/eldritch_knowledge/final/void_final,/datum/eldritch_knowledge/base_void)
next_knowledge = list(/datum/eldritch_knowledge/flesh_grasp)
required_atoms = list(/obj/item/kitchen/knife,/obj/effect/decal/cleanable/blood)
result_atoms = list(/obj/item/melee/sickly_blade/flesh)
@@ -15,7 +15,7 @@
gain_text = "I found notes of a dark ritual, unfinished... yet still, I pushed forward."
cost = 1
required_atoms = list(/mob/living/carbon/human,/obj/item/reagent_containers/food/snacks/grown/poppy)
- next_knowledge = list(/datum/eldritch_knowledge/flesh_mark,/datum/eldritch_knowledge/armor,/datum/eldritch_knowledge/ashen_eyes)
+ next_knowledge = list(/datum/eldritch_knowledge/flesh_mark,/datum/eldritch_knowledge/void_cloak,/datum/eldritch_knowledge/ashen_eyes)
route = PATH_FLESH
var/max_amt = 2
var/current_amt = 0
@@ -118,7 +118,7 @@
if(!ishuman(target))
return
var/mob/living/carbon/human/human_target = target
- var/datum/status_effect/eldritch/eldritch_effect = human_target.has_status_effect(/datum/status_effect/eldritch/rust) || human_target.has_status_effect(/datum/status_effect/eldritch/ash) || human_target.has_status_effect(/datum/status_effect/eldritch/flesh)
+ var/datum/status_effect/eldritch/eldritch_effect = human_target.has_status_effect(/datum/status_effect/eldritch/rust) || human_target.has_status_effect(/datum/status_effect/eldritch/ash) || human_target.has_status_effect(/datum/status_effect/eldritch/flesh) || human_target.has_status_effect(/datum/status_effect/eldritch/void)
if(eldritch_effect)
eldritch_effect.on_effect()
if(iscarbon(target))
@@ -173,7 +173,7 @@
cost = 1
required_atoms = list(/obj/item/organ/eyes,/obj/effect/decal/cleanable/blood,/obj/item/bodypart/l_arm)
mob_to_summon = /mob/living/simple_animal/hostile/eldritch/raw_prophet
- next_knowledge = list(/datum/eldritch_knowledge/flesh_blade_upgrade,/datum/eldritch_knowledge/spell/blood_siphon,/datum/eldritch_knowledge/curse/paralysis)
+ next_knowledge = list(/datum/eldritch_knowledge/flesh_blade_upgrade,/datum/eldritch_knowledge/rune_carver,/datum/eldritch_knowledge/curse/paralysis)
route = PATH_FLESH
/datum/eldritch_knowledge/summon/stalker
@@ -202,7 +202,7 @@
cost = 1
required_atoms = list(/obj/effect/decal/cleanable/vomit,/obj/item/book,/obj/item/bodypart/head)
mob_to_summon = /mob/living/simple_animal/hostile/eldritch/rust_spirit
- next_knowledge = list(/datum/eldritch_knowledge/summon/stalker,/datum/eldritch_knowledge/spell/entropic_plume)
+ next_knowledge = list(/datum/eldritch_knowledge/spell/voidpull,/datum/eldritch_knowledge/spell/entropic_plume)
/datum/eldritch_knowledge/spell/blood_siphon
name = "Blood Siphon"
@@ -210,7 +210,7 @@
desc = "You gain a spell that drains health from your enemies to restores your own."
cost = 1
spell_to_add = /obj/effect/proc_holder/spell/pointed/blood_siphon
- next_knowledge = list(/datum/eldritch_knowledge/summon/raw_prophet,/datum/eldritch_knowledge/spell/area_conversion)
+ next_knowledge = list(/datum/eldritch_knowledge/summon/stalker,/datum/eldritch_knowledge/spell/voidpull)
/datum/eldritch_knowledge/final/flesh_final
name = "Priest's Final Hymn"
diff --git a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm
index 7435496f5db..31caa2d44d8 100644
--- a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm
+++ b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm
@@ -2,7 +2,7 @@
name = "Blacksmith's Tale"
desc = "Opens up the Path of Rust to you. Allows you to transmute a kitchen knife, or its derivatives, with any trash item into a Rusty Blade."
gain_text = "'Let me tell you a story', said the Blacksmith, as he gazed deep into his rusty blade."
- banned_knowledge = list(/datum/eldritch_knowledge/base_ash,/datum/eldritch_knowledge/base_flesh,/datum/eldritch_knowledge/final/ash_final,/datum/eldritch_knowledge/final/flesh_final)
+ banned_knowledge = list(/datum/eldritch_knowledge/base_ash,/datum/eldritch_knowledge/base_flesh,/datum/eldritch_knowledge/final/ash_final,/datum/eldritch_knowledge/final/flesh_final,/datum/eldritch_knowledge/final/void_final,/datum/eldritch_knowledge/base_void)
next_knowledge = list(/datum/eldritch_knowledge/rust_fist)
required_atoms = list(/obj/item/kitchen/knife,/obj/item/trash)
result_atoms = list(/obj/item/melee/sickly_blade/rust)
@@ -28,7 +28,7 @@
. = ..()
if(ishuman(target))
var/mob/living/carbon/human/H = target
- var/datum/status_effect/eldritch/E = H.has_status_effect(/datum/status_effect/eldritch/rust) || H.has_status_effect(/datum/status_effect/eldritch/ash) || H.has_status_effect(/datum/status_effect/eldritch/flesh)
+ var/datum/status_effect/eldritch/E = H.has_status_effect(/datum/status_effect/eldritch/rust) || H.has_status_effect(/datum/status_effect/eldritch/ash) || H.has_status_effect(/datum/status_effect/eldritch/flesh) || H.has_status_effect(/datum/status_effect/eldritch/void)
if(E)
E.on_effect()
H.adjustOrganLoss(pick(ORGAN_SLOT_BRAIN,ORGAN_SLOT_EARS,ORGAN_SLOT_EYES,ORGAN_SLOT_LIVER,ORGAN_SLOT_LUNGS,ORGAN_SLOT_STOMACH,ORGAN_SLOT_HEART),25)
@@ -39,7 +39,7 @@
gain_text = "All wise men know well not to touch the Bound King."
cost = 1
spell_to_add = /obj/effect/proc_holder/spell/aoe_turf/rust_conversion
- next_knowledge = list(/datum/eldritch_knowledge/rust_blade_upgrade,/datum/eldritch_knowledge/curse/corrosion,/datum/eldritch_knowledge/spell/blood_siphon)
+ next_knowledge = list(/datum/eldritch_knowledge/rust_blade_upgrade,/datum/eldritch_knowledge/curse/corrosion,/datum/eldritch_knowledge/crucible)
route = PATH_RUST
/datum/eldritch_knowledge/rust_regen
@@ -108,17 +108,17 @@
desc = "You can now create Eldritch Armor using a table and a gas mask."
gain_text = "The Rusted Hills welcomed the Blacksmith in their generosity."
cost = 1
- next_knowledge = list(/datum/eldritch_knowledge/rust_regen,/datum/eldritch_knowledge/flesh_ghoul)
+ next_knowledge = list(/datum/eldritch_knowledge/rust_regen,/datum/eldritch_knowledge/cold_snap)
required_atoms = list(/obj/structure/table,/obj/item/clothing/mask/gas)
result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/eldritch)
/datum/eldritch_knowledge/essence
name = "Priest's Ritual"
- desc = "You can now transmute a tank of water into a bottle of eldritch water."
+ desc = "You can now transmute a tank of water and a glass shard into a bottle of eldritch water."
gain_text = "This is an old recipe. The Owl whispered it to me."
cost = 1
next_knowledge = list(/datum/eldritch_knowledge/rust_regen,/datum/eldritch_knowledge/spell/ashen_shift)
- required_atoms = list(/obj/structure/reagent_dispensers/watertank)
+ required_atoms = list(/obj/structure/reagent_dispensers/watertank,/obj/item/shard)
result_atoms = list(/obj/item/reagent_containers/glass/beaker/eldritch)
/datum/eldritch_knowledge/final/rust_final
diff --git a/code/modules/antagonists/eldritch_cult/knowledge/void_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/void_lore.dm
new file mode 100644
index 00000000000..ff045af2e04
--- /dev/null
+++ b/code/modules/antagonists/eldritch_cult/knowledge/void_lore.dm
@@ -0,0 +1,203 @@
+/datum/eldritch_knowledge/base_void
+ name = "Glimmer of Winter"
+ desc = "Opens up the path of void to you. Allows you to transmute a knife in a sub-zero temperature into a void blade."
+ gain_text = "I feel a shimmer in the air, atmosphere around me gets colder. I feel my body realizing the emptiness of existance. Something's watching me"
+ banned_knowledge = list(/datum/eldritch_knowledge/base_ash,/datum/eldritch_knowledge/base_flesh,/datum/eldritch_knowledge/final/ash_final,/datum/eldritch_knowledge/final/flesh_final,/datum/eldritch_knowledge/base_rust,/datum/eldritch_knowledge/final/rust_final)
+ next_knowledge = list(/datum/eldritch_knowledge/void_grasp)
+ required_atoms = list(/obj/item/kitchen/knife)
+ result_atoms = list(/obj/item/melee/sickly_blade/void)
+ cost = 1
+ route = PATH_VOID
+
+/datum/eldritch_knowledge/base_void/recipe_snowflake_check(list/atoms, loc)
+ . = ..()
+ var/turf/open/turfie = loc
+ if(turfie.GetTemperature() > T0C)
+ return FALSE
+
+/datum/eldritch_knowledge/void_grasp
+ name = "Grasp of Void"
+ desc = "Temporarily mutes your victim, also lowers their body temperature."
+ gain_text = "I found the cold watcher who observes me. The resonance of cold grows within me. This isn't the end of the mystery."
+ cost = 1
+ route = PATH_VOID
+ next_knowledge = list(/datum/eldritch_knowledge/cold_snap)
+
+/datum/eldritch_knowledge/void_grasp/on_mansus_grasp(atom/target, mob/user, proximity_flag, click_parameters)
+ . = ..()
+ if(!iscarbon(target))
+ return
+ var/mob/living/carbon/carbon_target = target
+ var/turf/open/turfie = get_turf(carbon_target)
+ turfie.TakeTemperature(-20)
+ carbon_target.adjust_bodytemperature(-40)
+ carbon_target.silent += 4
+ return TRUE
+
+/datum/eldritch_knowledge/void_grasp/on_eldritch_blade(atom/target, mob/user, proximity_flag, click_parameters)
+ . = ..()
+ if(!ishuman(target))
+ return
+ var/mob/living/carbon/human/H = target
+ var/datum/status_effect/eldritch/E = H.has_status_effect(/datum/status_effect/eldritch/rust) || H.has_status_effect(/datum/status_effect/eldritch/ash) || H.has_status_effect(/datum/status_effect/eldritch/flesh) || H.has_status_effect(/datum/status_effect/eldritch/void)
+ if(!E)
+ return
+ E.on_effect()
+ H.silent += 3
+
+/datum/eldritch_knowledge/cold_snap
+ name = "Aristocrat's Way"
+ desc = "Makes you immune to cold temperatures, you can still take damage from lack of pressure."
+ gain_text = "I found a thread of cold breath. It lead me to a strange shrine, all made of crystals. Translucent and white, a depiction of a nobleman stood before me."
+ cost = 1
+ route = PATH_VOID
+ next_knowledge = list(/datum/eldritch_knowledge/void_cloak,/datum/eldritch_knowledge/void_mark,/datum/eldritch_knowledge/armor)
+
+/datum/eldritch_knowledge/cold_snap/on_gain(mob/user)
+ . = ..()
+ ADD_TRAIT(user,TRAIT_RESISTCOLD,MAGIC_TRAIT)
+
+/datum/eldritch_knowledge/cold_snap/on_lose(mob/user)
+ . = ..()
+ REMOVE_TRAIT(user,TRAIT_RESISTCOLD,MAGIC_TRAIT)
+
+/datum/eldritch_knowledge/void_cloak
+ name = "Void Cloak"
+ desc = "A cloak that can become invisbile at will, hiding items you store in it. To create it transmute a glass shard, any item of clothing that you can fit over your uniform and any type of bedsheet."
+ gain_text = "Owl is the keeper of things that quite not are in practice, but in theory are."
+ cost = 1
+ next_knowledge = list(/datum/eldritch_knowledge/flesh_ghoul,/datum/eldritch_knowledge/cold_snap)
+ result_atoms = list(/obj/item/clothing/suit/hooded/cultrobes/void)
+ required_atoms = list(/obj/item/shard,/obj/item/clothing/suit,/obj/item/bedsheet)
+
+/datum/eldritch_knowledge/void_mark
+ name = "Mark of Void"
+ gain_text = "A gust of wind? Maybe a shimmer in the air. Presence is overwhelming, my senses betrayed me, my mind is my enemy."
+ desc = "Your mansus grasp now applies mark of void status effect. To proc the mark, use your sickly blade on the marked. Mark of void when procced lowers the victims body temperature significantly."
+ cost = 2
+ next_knowledge = list(/datum/eldritch_knowledge/spell/void_phase)
+ banned_knowledge = list(/datum/eldritch_knowledge/rust_mark,/datum/eldritch_knowledge/ash_mark,/datum/eldritch_knowledge/flesh_mark)
+ route = PATH_VOID
+
+/datum/eldritch_knowledge/void_mark/on_mansus_grasp(atom/target, mob/user, proximity_flag, click_parameters)
+ . = ..()
+ if(!isliving(target))
+ return
+ . = TRUE
+ var/mob/living/living_target = target
+ living_target.apply_status_effect(/datum/status_effect/eldritch/void)
+
+/datum/eldritch_knowledge/spell/void_phase
+ name = "Void Phase"
+ gain_text = "Reality bends under the power of memory, for all is fleeting, and what else stays?"
+ desc = "You gain a long range pointed blink that allows you to instantly teleport to your location, it causes aoe damage around you and your chosen location."
+ cost = 1
+ spell_to_add = /obj/effect/proc_holder/spell/pointed/void_blink
+ next_knowledge = list(/datum/eldritch_knowledge/rune_carver,/datum/eldritch_knowledge/crucible,/datum/eldritch_knowledge/void_blade_upgrade)
+ route = PATH_VOID
+
+/datum/eldritch_knowledge/rune_carver
+ name = "Carving Knife"
+ gain_text = "Etched, carved... eternal. I can carve the monolith and evoke their powers!"
+ desc = "You can create a carving knife, which allows you to create up to 3 carvings on the floor that have various effects on nonbelievers who walk over them, to create the carving knife transmute a knife with a glass shard and a piece of paper."
+ cost = 1
+ next_knowledge = list(/datum/eldritch_knowledge/spell/void_phase,/datum/eldritch_knowledge/summon/raw_prophet)
+ required_atoms = list(/obj/item/kitchen/knife,/obj/item/shard,/obj/item/paper)
+ result_atoms = list(/obj/item/melee/rune_knife)
+
+/datum/eldritch_knowledge/crucible
+ name = "Mawed Crucible"
+ gain_text = "This is pure agony, i wasn't able to summon the dereliction of the emperor, but i stumbled upon a diffrent recipe..."
+ desc = "Allows you to create a mawed crucible, eldritch structure that allows you to create potions of various effects, to do so transmute a table with a watertank"
+ cost = 1
+ next_knowledge = list(/datum/eldritch_knowledge/spell/void_phase,/datum/eldritch_knowledge/spell/area_conversion)
+ required_atoms = list(/obj/structure/reagent_dispensers/watertank,/obj/structure/table)
+ result_atoms = list(/obj/structure/eldritch_crucible)
+
+/datum/eldritch_knowledge/void_blade_upgrade
+ name = "Seeking blade"
+ gain_text = "Fleeting memories, fleeting feet. I can mark my way with the frozen blood upon the snow. Covered and forgotten."
+ desc = "You can now use your blade on a distant marked target to move to them and attack them."
+ cost = 2
+ next_knowledge = list(/datum/eldritch_knowledge/spell/voidpull)
+ banned_knowledge = list(/datum/eldritch_knowledge/ash_blade_upgrade,/datum/eldritch_knowledge/flesh_blade_upgrade,/datum/eldritch_knowledge/rust_blade_upgrade)
+ route = PATH_VOID
+
+/datum/eldritch_knowledge/void_blade_upgrade/on_ranged_attack_eldritch_blade(atom/target, mob/user, click_parameters)
+ . = ..()
+ if(!ishuman(target) || !iscarbon(user))
+ return
+ var/mob/living/carbon/carbon_human = user
+ var/mob/living/carbon/human/human_target = target
+ var/datum/status_effect/eldritch/effect = human_target.has_status_effect(/datum/status_effect/eldritch/rust) || human_target.has_status_effect(/datum/status_effect/eldritch/ash) || human_target.has_status_effect(/datum/status_effect/eldritch/flesh) || human_target.has_status_effect(/datum/status_effect/eldritch/void)
+ if(!effect)
+ return
+ var/dir = angle2dir(dir2angle(get_dir(user,human_target))+180)
+ carbon_human.forceMove(get_step(human_target,dir))
+ var/obj/item/melee/sickly_blade/blade = carbon_human.get_active_held_item()
+ blade.melee_attack_chain(carbon_human,human_target)
+
+/datum/eldritch_knowledge/spell/voidpull
+ name = "Void Pull"
+ gain_text = "This entity calls itself the aristocrat, I'm close to ending what was started."
+ desc = "You gain an ability that let's you pull people around you closer to you."
+ cost = 1
+ spell_to_add = /obj/effect/proc_holder/spell/targeted/void_pull
+ next_knowledge = list(/datum/eldritch_knowledge/final/void_final,/datum/eldritch_knowledge/spell/blood_siphon,/datum/eldritch_knowledge/summon/rusty)
+ route = PATH_VOID
+
+/datum/eldritch_knowledge/final/void_final
+ name = "Waltz at the End of Time"
+ desc = "Bring 3 corpses onto the transmutation rune. After you finish the ritual you will automatically silence people around you and will summon a snow storm around you."
+ gain_text = "The world falls into darkness. I stand in an empty plane, small flakes of ice fall from the sky. Aristocrat stand before me, he motions to me. We will play a waltz to the whispers of dying reality, as the world is destroyed before our eyes."
+ cost = 3
+ required_atoms = list(/mob/living/carbon/human)
+ route = PATH_VOID
+ ///soundloop for the void theme
+ var/datum/looping_sound/void_loop/sound_loop
+ ///Reference to the ongoing voidstrom that surrounds the heretic
+ var/datum/weather/void_storm/storm
+
+/datum/eldritch_knowledge/final/void_final/on_finished_recipe(mob/living/user, list/atoms, loc)
+ var/mob/living/carbon/human/H = user
+ H.physiology.brute_mod *= 0.5
+ H.physiology.burn_mod *= 0.5
+ H.client?.give_award(/datum/award/achievement/misc/void_ascension, H)
+ priority_announce("$^@*$^@(#&$(@^$^@# The nobleman of void [H.real_name] has arrived, step along the Waltz that ends worlds! $^@*$^@(#&$(@^$^@#","#$^@*$^@(#&$(@^$^@#", 'sound/ai/spanomalies.ogg')
+
+ sound_loop = new(list(user),TRUE,TRUE)
+ return ..()
+
+/datum/eldritch_knowledge/final/void_final/on_death()
+ if(sound_loop)
+ sound_loop.stop()
+ if(storm)
+ storm.wind_down()
+
+/datum/eldritch_knowledge/final/void_final/on_life(mob/user)
+ . = ..()
+ if(!finished)
+ return
+
+ for(var/mob/living/carbon/livies in spiral_range(7,user)-user)
+ if(IS_HERETIC_MONSTER(livies) || IS_HERETIC(livies))
+ return
+ livies.silent += 1
+ livies.adjust_bodytemperature(-20)
+
+ var/turf/turfie = get_turf(user)
+ if(!isopenturf(turfie))
+ return
+ var/turf/open/open_turfie = turfie
+ open_turfie.TakeTemperature(-20)
+
+ var/area/user_area = get_area(user)
+ var/turf/user_turf = get_turf(user)
+
+ if(!storm)
+ storm = new /datum/weather/void_storm(list(user_turf.z))
+ storm.telegraph()
+
+ storm.area_type = user_area.type
+ storm.impacted_areas = list(user_area)
+ storm.update_areas()
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index 547b23f763a..06ee5a2977d 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -249,6 +249,7 @@
"ashascend" = 'icons/UI_Icons/Achievements/Misc/ashascend.png',
"fleshascend" = 'icons/UI_Icons/Achievements/Misc/fleshascend.png',
"rustascend" = 'icons/UI_Icons/Achievements/Misc/rustascend.png',
+ "voidascend" = 'icons/UI_Icons/Achievements/Misc/voidascend.png',
"mining" = 'icons/UI_Icons/Achievements/Skills/mining.png',
"assistant" = 'icons/UI_Icons/Achievements/Mafia/assistant.png',
"changeling" = 'icons/UI_Icons/Achievements/Mafia/changeling.png',
diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm
index 1e7325503d0..ffd799b3d0a 100644
--- a/code/modules/clothing/suits/toggles.dm
+++ b/code/modules/clothing/suits/toggles.dm
@@ -4,10 +4,13 @@
actions_types = list(/datum/action/item_action/toggle_hood)
var/obj/item/clothing/head/hooded/hood
var/hoodtype = /obj/item/clothing/head/hooded/winterhood //so the chaplain hoodie or other hoodies can override this
+ ///Alternative mode for hiding the hood, instead of storing the hood in the suit it qdels it, useful for when you deal with hooded suit with storage.
+ var/alternative_mode = FALSE
/obj/item/clothing/suit/hooded/Initialize()
. = ..()
- MakeHood()
+ if(!alternative_mode)
+ MakeHood()
/obj/item/clothing/suit/hooded/Destroy()
. = ..()
@@ -35,12 +38,18 @@
/obj/item/clothing/suit/hooded/proc/RemoveHood()
src.icon_state = "[initial(icon_state)]"
suittoggled = FALSE
- if(ishuman(hood.loc))
- var/mob/living/carbon/H = hood.loc
- H.transferItemToLoc(hood, src, TRUE)
- H.update_inv_wear_suit()
- else
- hood.forceMove(src)
+
+ if(hood)
+ if(ishuman(hood.loc))
+ var/mob/living/carbon/human/H = hood.loc
+ H.transferItemToLoc(hood, src, TRUE)
+ H.update_inv_wear_suit()
+ else
+ hood.forceMove(src)
+
+ if(alternative_mode)
+ QDEL_NULL(hood)
+
for(var/X in actions)
var/datum/action/A = X
A.UpdateButtonIcon()
@@ -51,21 +60,28 @@
/obj/item/clothing/suit/hooded/proc/ToggleHood()
if(!suittoggled)
- if(ishuman(src.loc))
- var/mob/living/carbon/human/H = src.loc
- if(H.wear_suit != src)
- to_chat(H, "You must be wearing [src] to put up the hood!")
+ if(!ishuman(loc))
+ return
+ var/mob/living/carbon/human/H = loc
+ if(H.wear_suit != src)
+ to_chat(H, "You must be wearing [src] to put up the hood!")
+ return
+ if(H.head)
+ to_chat(H, "You're already wearing something on your head!")
+ return
+ else
+ if(alternative_mode)
+ MakeHood()
+ if(!H.equip_to_slot_if_possible(hood,ITEM_SLOT_HEAD,0,0,1))
+ if(alternative_mode)
+ RemoveHood()
return
- if(H.head)
- to_chat(H, "You're already wearing something on your head!")
- return
- else if(H.equip_to_slot_if_possible(hood,ITEM_SLOT_HEAD,0,0,1))
- suittoggled = TRUE
- src.icon_state = "[initial(icon_state)]_t"
- H.update_inv_wear_suit()
- for(var/X in actions)
- var/datum/action/A = X
- A.UpdateButtonIcon()
+ suittoggled = TRUE
+ icon_state = "[initial(icon_state)]_t"
+ H.update_inv_wear_suit()
+ for(var/X in actions)
+ var/datum/action/A = X
+ A.UpdateButtonIcon()
else
RemoveHood()
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 8c14cc1fe20..b938eb15a2a 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -38,7 +38,7 @@
. += "You can't make out what species they are."
//SKYRAT EDIT CHANGE END
//uniform
- if(w_uniform && !(obscured & ITEM_SLOT_ICLOTHING))
+ if(w_uniform && !(obscured & ITEM_SLOT_ICLOTHING) && !(w_uniform.item_flags & EXAMINE_SKIP))
//accessory
var/accessory_msg
if(istype(w_uniform, /obj/item/clothing/under))
@@ -48,26 +48,26 @@
. += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg]."
//head
- if(head && !(obscured & ITEM_SLOT_HEAD))
+ if(head && !(obscured & ITEM_SLOT_HEAD) && !(head.item_flags & EXAMINE_SKIP))
. += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head."
//suit/armor
- if(wear_suit)
+ if(wear_suit && !(wear_suit.item_flags & EXAMINE_SKIP))
. += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)]."
//suit/armor storage
- if(s_store && !(obscured & ITEM_SLOT_SUITSTORE))
+ if(s_store && !(obscured & ITEM_SLOT_SUITSTORE) && !(s_store.item_flags & EXAMINE_SKIP))
. += "[t_He] [t_is] carrying [s_store.get_examine_string(user)] on [t_his] [wear_suit.name]."
//back
- if(back)
+ if(back && !(back.item_flags & EXAMINE_SKIP))
. += "[t_He] [t_has] [back.get_examine_string(user)] on [t_his] back."
//Hands
for(var/obj/item/I in held_items)
- if(!(I.item_flags & ABSTRACT))
+ if(!(I.item_flags & ABSTRACT) && !(I.item_flags & EXAMINE_SKIP))
. += "[t_He] [t_is] holding [I.get_examine_string(user)] in [t_his] [get_held_index_name(get_held_index_of_item(I))]."
var/datum/component/forensics/FR = GetComponent(/datum/component/forensics)
//gloves
- if(gloves && !(obscured & ITEM_SLOT_GLOVES))
+ if(gloves && !(obscured & ITEM_SLOT_GLOVES) && !(gloves.item_flags & EXAMINE_SKIP))
. += "[t_He] [t_has] [gloves.get_examine_string(user)] on [t_his] hands."
else if(FR && length(FR.blood_DNA))
if(num_hands)
@@ -83,33 +83,33 @@
. += "[t_He] [t_is] [icon2html(handcuffed, user)] handcuffed!"
//belt
- if(belt)
+ if(belt && !(belt.item_flags & EXAMINE_SKIP))
. += "[t_He] [t_has] [belt.get_examine_string(user)] about [t_his] waist."
//shoes
- if(shoes && !(obscured & ITEM_SLOT_FEET))
+ if(shoes && !(obscured & ITEM_SLOT_FEET) && !(shoes.item_flags & EXAMINE_SKIP))
. += "[t_He] [t_is] wearing [shoes.get_examine_string(user)] on [t_his] feet."
//mask
- if(wear_mask && !(obscured & ITEM_SLOT_MASK))
+ if(wear_mask && !(obscured & ITEM_SLOT_MASK) && !(wear_mask.item_flags & EXAMINE_SKIP))
. += "[t_He] [t_has] [wear_mask.get_examine_string(user)] on [t_his] face."
- if(wear_neck && !(obscured & ITEM_SLOT_NECK))
+ if(wear_neck && !(obscured & ITEM_SLOT_NECK) && !(wear_neck.item_flags & EXAMINE_SKIP))
. += "[t_He] [t_is] wearing [wear_neck.get_examine_string(user)] around [t_his] neck."
//eyes
- if(!(obscured & ITEM_SLOT_EYES))
- if(glasses)
+ if(!(obscured & ITEM_SLOT_EYES) )
+ if(glasses && !(glasses.item_flags & EXAMINE_SKIP))
. += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes."
else if(eye_color == BLOODCULT_EYE && iscultist(src) && HAS_TRAIT(src, CULT_EYES))
. += "[t_His] eyes are glowing an unnatural red!"
//ears
- if(ears && !(obscured & ITEM_SLOT_EARS))
+ if(ears && !(obscured & ITEM_SLOT_EARS) && !(ears.item_flags & EXAMINE_SKIP))
. += "[t_He] [t_has] [ears.get_examine_string(user)] on [t_his] ears."
//ID
- if(wear_id)
+ if(wear_id && !(wear_id.item_flags & EXAMINE_SKIP))
. += "[t_He] [t_is] wearing [wear_id.get_examine_string(user)]."
//Status effects
diff --git a/icons/UI_Icons/Achievements/Misc/voidascend.png b/icons/UI_Icons/Achievements/Misc/voidascend.png
new file mode 100644
index 00000000000..23f43c3d8c1
Binary files /dev/null and b/icons/UI_Icons/Achievements/Misc/voidascend.png differ
diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi
index d69458decfb..9afeac68be8 100644
Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index eb3d33501f5..017556c5725 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/effects/weather_effects.dmi b/icons/effects/weather_effects.dmi
index da1523706e2..4ae2387692a 100644
Binary files a/icons/effects/weather_effects.dmi and b/icons/effects/weather_effects.dmi differ
diff --git a/icons/hud/screen_alert.dmi b/icons/hud/screen_alert.dmi
old mode 100644
new mode 100755
index 0e93f4e652a..4c7fcb1af6c
Binary files a/icons/hud/screen_alert.dmi and b/icons/hud/screen_alert.dmi differ
diff --git a/icons/mob/actions/actions_ecult.dmi b/icons/mob/actions/actions_ecult.dmi
index 19480f5b0cb..3aa5a1572b6 100644
Binary files a/icons/mob/actions/actions_ecult.dmi and b/icons/mob/actions/actions_ecult.dmi differ
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index 132bae640ac..ac42c9d72b6 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ
diff --git a/icons/mob/clothing/mask.dmi b/icons/mob/clothing/mask.dmi
index c8e171f9df9..2e0d692b74f 100644
Binary files a/icons/mob/clothing/mask.dmi and b/icons/mob/clothing/mask.dmi differ
diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi
index d5ba711fd59..651277aa5fd 100644
Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ
diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi
index 75bf7df4c1d..51fc21053f8 100644
Binary files a/icons/mob/inhands/64x64_lefthand.dmi and b/icons/mob/inhands/64x64_lefthand.dmi differ
diff --git a/icons/mob/inhands/64x64_righthand.dmi b/icons/mob/inhands/64x64_righthand.dmi
index 53d5cb1e0c1..708daed9b4d 100644
Binary files a/icons/mob/inhands/64x64_righthand.dmi and b/icons/mob/inhands/64x64_righthand.dmi differ
diff --git a/icons/mob/inhands/misc/touchspell_lefthand.dmi b/icons/mob/inhands/misc/touchspell_lefthand.dmi
index b3fd0d8488d..cc0a87e6d30 100644
Binary files a/icons/mob/inhands/misc/touchspell_lefthand.dmi and b/icons/mob/inhands/misc/touchspell_lefthand.dmi differ
diff --git a/icons/mob/inhands/misc/touchspell_righthand.dmi b/icons/mob/inhands/misc/touchspell_righthand.dmi
index 6031f2194fa..bffb5e41398 100644
Binary files a/icons/mob/inhands/misc/touchspell_righthand.dmi and b/icons/mob/inhands/misc/touchspell_righthand.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index df2caeccfd5..f5b843e0fdb 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi
index fb68a984646..b28f808041a 100644
Binary files a/icons/obj/clothing/masks.dmi and b/icons/obj/clothing/masks.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 63e4ccc9c97..3e3af2392b5 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/eldritch.dmi b/icons/obj/eldritch.dmi
index 50c29137085..9d5beb61aec 100644
Binary files a/icons/obj/eldritch.dmi and b/icons/obj/eldritch.dmi differ
diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi
index 88772a52b34..b23f4a8a644 100644
Binary files a/icons/obj/items_and_weapons.dmi and b/icons/obj/items_and_weapons.dmi differ
diff --git a/sound/ambience/VoidsEmbrace.ogg b/sound/ambience/VoidsEmbrace.ogg
new file mode 100644
index 00000000000..0766dc15783
Binary files /dev/null and b/sound/ambience/VoidsEmbrace.ogg differ
diff --git a/sound/ambience/license.txt b/sound/ambience/license.txt
index 90521e2e79c..61fc8ce1958 100644
--- a/sound/ambience/license.txt
+++ b/sound/ambience/license.txt
@@ -9,4 +9,6 @@ title1.ogg is Flip-Flap created by Jakub "AceMan" SzelÄ…g and taken from http://
title2.ogg is Robocop Theme (gameboy) remixed by Eric Schumacker
title3.ogg is Tintin On The Moon remixed by Cuboos https://tgstation13.org/phpBB/viewtopic.php?f=10&t=2157 (assumed CC under allowing it to be submitted to the github, see thread)
+VoidsEmbrace.ogg is Chopin - Waltz in C Sharp Minor (Op. 64 No. 2). It is in public domain.
+
CC-BY 3.0: http://creativecommons.org/licenses/by/3.0/
diff --git a/sound/magic/voidblink.ogg b/sound/magic/voidblink.ogg
new file mode 100644
index 00000000000..7415601b902
Binary files /dev/null and b/sound/magic/voidblink.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index f07a89705b0..4d372b72906 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -693,6 +693,7 @@
#include "code\datums\weather\weather_types\floor_is_lava.dm"
#include "code\datums\weather\weather_types\radiation_storm.dm"
#include "code\datums\weather\weather_types\snow_storm.dm"
+#include "code\datums\weather\weather_types\void_storm.dm"
#include "code\datums\wires\_wires.dm"
#include "code\datums\wires\airalarm.dm"
#include "code\datums\wires\airlock.dm"
@@ -1540,9 +1541,11 @@
#include "code\modules\antagonists\eldritch_cult\eldritch_knowledge.dm"
#include "code\modules\antagonists\eldritch_cult\eldritch_magic.dm"
#include "code\modules\antagonists\eldritch_cult\eldritch_monster_antag.dm"
+#include "code\modules\antagonists\eldritch_cult\eldritch_structures.dm"
#include "code\modules\antagonists\eldritch_cult\knowledge\ash_lore.dm"
#include "code\modules\antagonists\eldritch_cult\knowledge\flesh_lore.dm"
#include "code\modules\antagonists\eldritch_cult\knowledge\rust_lore.dm"
+#include "code\modules\antagonists\eldritch_cult\knowledge\void_lore.dm"
#include "code\modules\antagonists\ert\ert.dm"
#include "code\modules\antagonists\fugitive\fugitive.dm"
#include "code\modules\antagonists\fugitive\fugitive_outfits.dm"