diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index ad731f6a509..b626942d063 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -49,6 +49,7 @@ var/global/list/all_cults = list()
var/list/objectives = list()
var/eldergod = 1 //for the summon god objective
+ var/demons_summoned = 0
var/acolytes_needed = 4 //for the survive objective - base number of acolytes, increased by 1 for every 10 players
var/const/min_cultists_to_start = 3
@@ -231,6 +232,9 @@ var/global/list/all_cults = list()
cult_fail += check_survive() //the proc returns 1 if there are not enough cultists on the shuttle, 0 otherwise
if(objectives.Find("eldergod"))
cult_fail += eldergod //1 by default, 0 if the elder god has been summoned at least once
+ if(objectives.Find("slaughter"))
+ if(!demons_summoned)
+ cult_fail++
if(objectives.Find("sacrifice"))
if(sacrifice_target && !(sacrifice_target in sacrificed)) //if the target has been sacrificed, ignore this step. otherwise, add 1 to cult_fail
cult_fail++
@@ -308,6 +312,13 @@ var/global/list/all_cults = list()
else
explanation = "Summon [ticker.mode.cultdat.entity_name]. Fail."
feedback_add_details("cult_objective","cult_narsie|FAIL")
+ if("slaughter")
+ if(demons_summoned)
+ explanation = "Bring the Slaughter. Success!"
+ feedback_add_details("cult_objective","cult_demons|SUCCESS")
+ else
+ explanation = "Bring the Slaughter. Fail."
+ feedback_add_details("cult_objective","cult_demons|FAIL")
if("convert")//convert half the crew
if(obj_count < objectives.len)
diff --git a/code/game/gamemodes/cult/cult_comms.dm b/code/game/gamemodes/cult/cult_comms.dm
index 57f4934c9b7..8e6d903729e 100644
--- a/code/game/gamemodes/cult/cult_comms.dm
+++ b/code/game/gamemodes/cult/cult_comms.dm
@@ -32,7 +32,11 @@
user.say(message)
else
user.whisper(message)
- var/my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [user]: [message]"
+ var/my_message
+ if(istype(user, /mob/living/simple_animal/slaughter/cult)) //Harbringers of the Slaughter
+ my_message = "Harbringer of the Slaughter: [message]"
+ else
+ my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [user]: [message]"
for(var/mob/M in mob_list)
if(iscultist(M))
to_chat(M, my_message)
diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm
index 1c5def6e13e..f1badacb5b9 100644
--- a/code/game/gamemodes/cult/cult_objectives.dm
+++ b/code/game/gamemodes/cult/cult_objectives.dm
@@ -94,10 +94,15 @@
/datum/game_mode/cult/proc/second_phase()
narsie_condition_cleared = 1
+ var/explanation
- objectives += "eldergod"
+ if(prob(50))//split the chance of this
+ objectives += "eldergod"
+ explanation = "Summon [ticker.mode.cultdat.entity_name] on the Station via the use of the Tear Reality rune."
+ else
+ objectives += "slaughter"
+ explanation = "Bring the Slaughter via the rune 'Tear Reality'."
- var/explanation = "Summon [ticker.mode.cultdat.entity_name] on the Station via the use of the Tear Reality rune."
for(var/datum/mind/cult_mind in cult)
to_chat(cult_mind.current, "You and your acolytes have succeeded in preparing the station for the ultimate ritual!")
to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
@@ -156,8 +161,8 @@
sacrifice_target = pick(possible_targets)
possible_objectives |= "sacrifice"
else
- message_admins("Didn't find a suitable sacrifice target...what the hell? Shout at Deity.")
- log_admin("Didn't find a suitable sacrifice target...what the hell? Shout at Deity.")
+ message_admins("Didn't find a suitable sacrifice target...what the hell? Shout at a coder.")
+ log_admin("Didn't find a suitable sacrifice target...what the hell? Shout at a coder.")
if(!mass_convert)
var/living_crew = 0
@@ -186,7 +191,12 @@
if(!possible_objectives.len)//No more possible objectives, time to summon Nar-Sie
message_admins("No suitable objectives left! Nar-Sie objective unlocked.")
log_admin("No suitable objectives left! Nar-Sie objective unlocked.")
- return "eldergod"
+ var/lastbit
+ if(prob(50))
+ lastbit = "eldergod"
+ else
+ lastbit = "slaughter"
+ return lastbit
else
return pick(possible_objectives)
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 7292568930d..7a47d332634 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -5,7 +5,25 @@
icon = 'icons/obj/cult.dmi'
var/cooldowntime = 0
var/health = 100
- var/maxhealth = 100
+ var/death_message = "The structure falls apart." //The message shown when the structure is destroyed
+ var/death_sound = 'sound/items/bikehorn.ogg'
+
+
+/obj/structure/cult/proc/destroy_structure()
+ visible_message(death_message)
+ playsound(src, death_sound, 50, 1)
+ qdel(src)
+
+/obj/structure/cult/attackby(obj/item/I, mob/user, params)
+ if(I.force)
+ ..()
+ playsound(src, I.hitsound, 50, 1)
+ health = Clamp(health - I.force, 0, initial(health))
+ user.changeNext_move(CLICK_CD_MELEE)
+ if(health <= 0)
+ destroy_structure()
+ return
+ ..()
//Noncult As we may have this on maps
/obj/structure/cult/talisman
@@ -50,6 +68,9 @@
name = "altar"
desc = "A bloodstained altar dedicated to Nar-Sie."
icon_state = "talismanaltar"
+ health = 150 //Sturdy
+ death_message = "The altar breaks into splinters, releasing a cascade of spirits into the air!"
+ death_sound = 'sound/effects/altar_break.ogg'
/obj/structure/cult/culttalisman/attack_hand(mob/living/user)
if(!iscultist(user))
@@ -77,7 +98,9 @@
name = "daemon forge"
desc = "A forge used in crafting the unholy weapons used by the armies of a cult."
icon_state = "forge"
- luminosity = 3
+ health = 300 //Made of metal
+ death_message = "The forge falls apart, its lava cooling and winking away!"
+ death_sound = 'sound/effects/forge_destroy.ogg'
/obj/structure/cult/cultforge/attack_hand(mob/living/user)
if(!iscultist(user))
@@ -96,17 +119,21 @@
if(pickedtype && Adjacent(user) && src && !qdeleted(src) && !user.incapacitated() && cooldowntime <= world.time)
cooldowntime = world.time + 2400
var/obj/item/N = new pickedtype(get_turf(src))
- user << "You work the forge as dark knowledge guides your hands, creating [N]!"
+ to_chat(user, "You work the forge as dark knowledge guides your hands, creating [N]!")
/obj/structure/cult/cultpylon
name = "pylon"
desc = "A floating crystal that slowly heals those faithful to a cult."
icon_state = "pylon"
- luminosity = 5
+ light_range = 5
+ light_color = "#3e0000"
var/heal_delay = 50
var/last_shot = 0
var/list/corruption = list()
+ health = 50 //Very fragile
+ death_message = "The pylon's crystal vibrates and glows fiercely before violently shattering!"
+ death_sound = 'sound/effects/pylon_shatter.ogg'
/obj/structure/cult/cultpylon/New()
processing_objects |= src
@@ -147,6 +174,9 @@
name = "archives"
desc = "A desk covered in arcane manuscripts and tomes in unknown languages. Looking at the text makes your skin crawl."
icon_state = "tomealtar"
+ health = 125 //Slightly sturdy
+ death_message = "The desk breaks apart, its books falling to the floor."
+ death_sound = 'sound/effects/wood_break.ogg'
/obj/structure/cult/culttome/attack_hand(mob/living/user)
if(!iscultist(user))
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 5721ac0bfd3..400ca922f22 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -21,6 +21,16 @@
w_class = 2
var/scribereduct = 0
+/obj/item/weapon/tome/accursed
+ name = "accursed tome"
+ desc = "An arcane tome still empowered with a shadow of its former consecration."
+ scribereduct = 30 //faster because it's made by corrupting a bible
+
+/obj/item/weapon/tome/imbued //Admin-only tome, allows instant drawing of runes
+ name = "imbued arcane tome"
+ desc = "An arcane tome granted by the Geometer itself."
+ scribereduct = 50
+
/obj/item/weapon/tome/examine(mob/user)
..()
if(iscultist(user) || user.stat == DEAD)
@@ -226,7 +236,7 @@
user.visible_message("[user] cuts open their arm and begins writing in their own blood!", \
"You slice open your arm and begin drawing a sigil of [ticker.mode.cultdat.entity_title3].")
user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick("l_arm", "r_arm"))
- if(!do_after(user, initial(rune_to_scribe.scribe_delay), target = get_turf(user)))
+ if(!do_after(user, initial(rune_to_scribe.scribe_delay)-scribereduct, target = get_turf(user)))
for(var/V in shields)
var/obj/machinery/shield/S = V
if(S && !qdeleted(S))
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 4b7e7ab333e..ed6b8186558 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -61,6 +61,11 @@ To draw a rune, use an arcane tome.
qdel(src)
return
else if(istype(I, /obj/item/weapon/nullrod))
+ if(iscultist(user))//cultist..what are doing..cultist..staph...
+ user.drop_item()
+ user.visible_message("[I] suddenly glows with white light, forcing [user] to drop it in pain!", \
+ "[I] suddenly glows with a white light that sears your hand, forcing you to drop it!")
+ return
user.say("BEGONE FOUL MAGIKS!!")
to_chat(user,"You disrupt the magic of [src] with [I].")
qdel(src)
@@ -496,6 +501,7 @@ var/list/teleport_runes = list()
..()
world << 'sound/effects/dimensional_rend.ogg'
to_chat(world, "The veil... is... TORN!!!--")
+ icon_state = "rune_large_distorted"
var/turf/T = get_turf(src)
sleep(40)
new /obj/singularity/narsie/large(T) //Causes Nar-Sie to spawn even if the rune has been removed
@@ -516,6 +522,78 @@ var/list/teleport_runes = list()
..()
return
+
+
+/obj/effect/rune/slaughter
+ cultist_name = "Call Forth The Slaughter"
+ cultist_desc = "Calls forth the doom of a eldrtich being. Three slaughter demons will appear to wreak havoc on the station."
+ invocation = null
+ req_cultists = 9
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "rune_large"
+ pixel_x = -32
+ pixel_y = -32
+
+ var/used = 0
+
+/obj/effect/rune/slaughter/talismanhide() //can't hide this, and you wouldn't want to
+ return
+
+/obj/effect/rune/slaughter/invoke(var/list/invokers)
+ if(used)
+ return
+ var/mob/living/user = invokers[1]
+ if(ticker.mode.name == "cult")
+ var/datum/game_mode/cult/cult_mode = ticker.mode
+ if(!("slaughter" in cult_mode.objectives))
+ message_admins("[usr.real_name]([user.ckey]) tried to summon demons when the objective was wrong")
+ for(var/M in invokers)
+ var/mob/living/L = M
+ to_chat(L, "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"")
+ if(L.reagents)
+ L.reagents.add_reagent("hell_water", 10)
+ L.Weaken(7)
+ L.Stun(7)
+ fail_invoke()
+ log_game("Summon Demons rune failed - improper objective")
+ return
+ else if(user.z != ZLEVEL_STATION)
+ message_admins("[user.real_name]([user.ckey]) tried to summon demons off station")
+ for(var/M in invokers)
+ var/mob/living/L = M
+ to_chat(L, "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"")
+ if(L.reagents)
+ L.reagents.add_reagent("hell_water", 10)
+ L.Weaken(7)
+ L.Stun(7)
+ fail_invoke()
+ log_game("Summon demons rune failed - off station Z level")
+ return
+ if(cult_mode.demons_summoned)
+ for(var/M in invokers)
+ to_chat(M, "Demons are already on this plane!")
+ log_game("Summon Demons rune failed - already summoned")
+ return
+ //BEGIN THE SLAUGHTER
+ used = 1
+ for(var/mob/living/M in range(1,src))
+ if(iscultist(M))
+ M.say("TOK-LYR RQA-NAP SHA-NEX!!")
+ world << 'sound/effects/dimensional_rend.ogg'
+ to_chat(world, "A hellish cacaphony bombards from all around as something awful tears through the world...")
+ icon_state = "rune_large_distorted"
+ sleep(55)
+ to_chat(world, "\"LIBREATE TE EX INFERIS!\"")//Fethas note:I COULDN'T HELP IT OKAY?!
+ visible_message("[src] melts away into blood, and three horrific figures emerge from within!")
+ var/turf/T = get_turf(src)
+ new /mob/living/simple_animal/slaughter/cult(T)
+ new /mob/living/simple_animal/slaughter/cult(T, pick(NORTH, EAST, SOUTH, WEST))
+ new /mob/living/simple_animal/slaughter/cult(T, pick(NORTHEAST, SOUTHEAST, NORTHWEST, SOUTHWEST))
+ cult_mode.demons_summoned = 1
+ shuttle_master.emergency.request(null, 0.5,null)
+ qdel(src)
+
+
//Rite of Resurrection: Requires two corpses. Revives one and gibs the other.
/obj/effect/rune/raise_dead
cultist_name = "Rite of Resurrection"
diff --git a/code/game/gamemodes/miniantags/slaughter/slaughter.dm b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
index 6f97740f8d5..6a579793f67 100644
--- a/code/game/gamemodes/miniantags/slaughter/slaughter.dm
+++ b/code/game/gamemodes/miniantags/slaughter/slaughter.dm
@@ -58,7 +58,7 @@
to_chat(src, src.playstyle_string)
to_chat(src, "You are not currently in the same plane of existence as the station. Ctrl+Click a blood pool to manifest.")
src << 'sound/misc/demon_dies.ogg'
- mind.current.verbs += /mob/living/simple_animal/slaughter/proc/slaughterWhisper
+ mind.current.verbs += /mob/living/simple_animal/slaughter/verb/slaughterWhisper
if(!(vialspawned))
var/datum/objective/slaughter/objective = new
var/datum/objective/demonFluff/fluffObjective = new
@@ -104,12 +104,77 @@
speed = 0
boost = world.time + 60
+
+
+
+/mob/living/simple_animal/slaughter/cult //Summoned as part of the cult objective "Bring the Slaughter"
+ name = "harbringer of the slaughter"
+ real_name = "harbringer of the slaughter"
+ desc = "An awful creature from beyond the realms of madness."
+ maxHealth = 500
+ health = 500
+ melee_damage_upper = 60
+ melee_damage_lower = 60
+ environment_smash = 3 //Smashes through EVERYTHING - r-walls included
+ faction = list("cult")
+ playstyle_string = "You are a Harbringer of the Slaughter. Brought forth by the servants of Nar-Sie, you have a single purpose: slaughter the heretics \
+ who do not worship your master. You may use the ability 'Blood Crawl' near a pool of blood to enter it and become incorporeal. Using the ability again near a blood pool will allow you \
+ to emerge from it. You are fast, powerful, and almost invincible. By dragging a dead or unconscious body into a blood pool with you, you will consume it after a time and fully regain \
+ your health. You may use the Sense Victims in your Cultist tab to locate a random, living heretic."
+
+/mob/living/simple_animal/slaughter/cult/verb/sense_victims()
+ set name = "Sense Victims"
+ set desc = "Locates the nearest heretic for annihilation."
+ set category = "Cultist"
+
+ var/list/victims = list()
+ for(var/mob/living/L in living_mob_list)
+ if(!L.stat && !iscultist(L) && L.key && L != usr)
+ victims.Add(L)
+ if(!victims.len)
+ to_chat(usr, "You could not locate any sapient heretics for the Slaughter.")
+ return 0
+ var/mob/living/victim = pick(victims)
+ to_chat(victim, "You feel an awful sense of being watched...")
+ victim.Stun(3) //HUE
+ var/area/A = victim.loc.loc
+ if(!A)
+ to_chat(usr, "You could not locate any sapient heretics for the Slaughter.")
+ return 0
+ to_chat(usr, "You sense a terrified soul at [A]. Show them the error of their ways.")
+
+/mob/living/simple_animal/slaughter/cult/New()
+ ..()
+ spawn(5)
+ var/list/demon_candidates = get_candidates(ROLE_CULTIST)
+ if(!demon_candidates.len)
+ visible_message("[src] disappears in a flash of red light!")
+ qdel(src)
+ return 0
+ var/client/C = pick(demon_candidates)
+ var/mob/living/simple_animal/slaughter/cult/S = src
+ if(!C)
+ visible_message("[src] disappears in a flash of red light!")
+ qdel(src)
+ return 0
+
+ S.key = C.key
+ S.mind.assigned_role = "Harbringer of the Slaughter"
+ S.mind.special_role = "Harbringer of the Slaugther"
+ to_chat(S, playstyle_string)
+ ticker.mode.add_cultist(S.mind)
+ var/datum/objective/new_objective = new /datum/objective
+ new_objective.owner = S.mind
+ new_objective.explanation_text = "Bring forth the Slaughter to the nonbelievers."
+ S.mind.objectives += new_objective
+ S << "Objective #[1]: [new_objective.explanation_text]"
+
////////////////////The Powers
//Paradise Port:I added this cuase..SPOOPY DEMON IN YOUR BRAIN
-/mob/living/simple_animal/slaughter/proc/slaughterWhisper()
+/mob/living/simple_animal/slaughter/verb/slaughterWhisper()
set name = "Whisper"
set desc = "Whisper to a mortal"
set category = "Daemon"
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index 08e6117e9bd..3ea7614066b 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -174,7 +174,7 @@
var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith","Artificer")
switch(construct_class)
if("Juggernaut")
- var/mob/living/simple_animal/construct/armoured/Z = new /mob/living/simple_animal/construct/armoured (get_turf(T.loc))
+ var/mob/living/simple_animal/hostile/construct/armoured/Z = new /mob/living/simple_animal/hostile/construct/armoured (get_turf(T.loc))
Z.key = A.key
Z.faction |= "\ref[U]"
if(iscultist(U))
@@ -190,7 +190,7 @@
qdel(C)
if("Wraith")
- var/mob/living/simple_animal/construct/wraith/Z = new /mob/living/simple_animal/construct/wraith (get_turf(T.loc))
+ var/mob/living/simple_animal/hostile/construct/wraith/Z = new /mob/living/simple_animal/hostile/construct/wraith (get_turf(T.loc))
Z.key = A.key
Z.faction |= "\ref[U]"
if(iscultist(U))
@@ -206,7 +206,7 @@
qdel(C)
if("Artificer")
- var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/builder (get_turf(T.loc))
+ var/mob/living/simple_animal/hostile/construct/builder/Z = new /mob/living/simple_animal/hostile/construct/builder (get_turf(T.loc))
Z.key = A.key
Z.faction |= "\ref[U]"
if(iscultist(U))
@@ -224,10 +224,10 @@
to_chat(U, "\red Creation failed!: \black The soul stone is empty! Go kill someone!")
return
-/proc/makeNewConstruct(var/mob/living/simple_animal/construct/ctype, var/mob/target, var/mob/stoner = null, cultoverride = 0)
+/proc/makeNewConstruct(var/mob/living/simple_animal/hostile/construct/ctype, var/mob/target, var/mob/stoner = null, cultoverride = 0)
if(jobban_isbanned(target, "cultist") || jobban_isbanned(target, "Syndicate"))
return
- var/mob/living/simple_animal/construct/newstruct = new ctype(get_turf(target))
+ var/mob/living/simple_animal/hostile/construct/newstruct = new ctype(get_turf(target))
newstruct.faction |= "\ref[stoner]"
newstruct.key = target.key
if(stoner && iscultist(stoner) || cultoverride)
diff --git a/code/game/objects/items/weapons/legcuffs.dm b/code/game/objects/items/weapons/legcuffs.dm
index fa485cbf93b..e834f45f703 100644
--- a/code/game/objects/items/weapons/legcuffs.dm
+++ b/code/game/objects/items/weapons/legcuffs.dm
@@ -70,7 +70,7 @@
/obj/item/weapon/restraints/legcuffs/beartrap/Crossed(AM as mob|obj)
if(armed && isturf(src.loc))
- if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator))
+ if( (iscarbon(AM) || isanimal(AM)) && !istype(AM, /mob/living/simple_animal/parrot) && !istype(AM, /mob/living/simple_animal/hostile/construct) && !istype(AM, /mob/living/simple_animal/shade) && !istype(AM, /mob/living/simple_animal/hostile/viscerator))
var/mob/living/L = AM
armed = 0
icon_state = "beartrap0"
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 2fad8ab1b9f..9ba05c8e483 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -340,9 +340,9 @@
if("coffee") M.change_mob_type( /mob/living/simple_animal/crab/Coffee , null, null, delmob, 1 )
if("parrot") M.change_mob_type( /mob/living/simple_animal/parrot , null, null, delmob, 1 )
if("polyparrot") M.change_mob_type( /mob/living/simple_animal/parrot/Poly , null, null, delmob, 1 )
- if("constructarmoured") M.change_mob_type( /mob/living/simple_animal/construct/armoured , null, null, delmob, 1 )
- if("constructbuilder") M.change_mob_type( /mob/living/simple_animal/construct/builder , null, null, delmob, 1 )
- if("constructwraith") M.change_mob_type( /mob/living/simple_animal/construct/wraith , null, null, delmob, 1 )
+ if("constructarmoured") M.change_mob_type( /mob/living/simple_animal/hostile/construct/armoured , null, null, delmob, 1 )
+ if("constructbuilder") M.change_mob_type( /mob/living/simple_animal/hostile/construct/builder , null, null, delmob, 1 )
+ if("constructwraith") M.change_mob_type( /mob/living/simple_animal/hostile/construct/wraith , null, null, delmob, 1 )
if("shade") M.change_mob_type( /mob/living/simple_animal/shade , null, null, delmob, 1 )
diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm
index af73c27667d..cf006d848c6 100644
--- a/code/modules/awaymissions/mission_code/stationCollision.dm
+++ b/code/modules/awaymissions/mission_code/stationCollision.dm
@@ -166,7 +166,7 @@ var/sc_safecode5 = "[rand(0,9)]"
desc = "Your body becomes weak and your feel your mind slipping away as you try to comprehend what you know can't be possible."
move_self = 0 //Contianed narsie does not move!
grav_pull = 0 //Contained narsie does not pull stuff in!
- var/uneatable = list(/turf/space, /obj/effect/overlay, /atom/movable/lighting_overlay, /mob/living/simple_animal/construct)
+ var/uneatable = list(/turf/space, /obj/effect/overlay, /atom/movable/lighting_overlay, /mob/living/simple_animal/hostile/construct)
//Override this to prevent no adminlog runtimes and admin warnings about a singularity without containment
/obj/singularity/narsie/sc_Narsie/admin_investigate_setup()
diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi
index 8459267a66f..4061ac44a96 100644
Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ
diff --git a/sound/effects/altar_break.ogg b/sound/effects/altar_break.ogg
new file mode 100644
index 00000000000..72625df1000
Binary files /dev/null and b/sound/effects/altar_break.ogg differ
diff --git a/sound/effects/forge_destroy.ogg b/sound/effects/forge_destroy.ogg
new file mode 100644
index 00000000000..2b198e83af4
Binary files /dev/null and b/sound/effects/forge_destroy.ogg differ
diff --git a/sound/effects/pylon_shatter.ogg b/sound/effects/pylon_shatter.ogg
new file mode 100644
index 00000000000..7c5ccb37a15
Binary files /dev/null and b/sound/effects/pylon_shatter.ogg differ
diff --git a/sound/effects/wood_break.ogg b/sound/effects/wood_break.ogg
new file mode 100644
index 00000000000..e720e3327bc
Binary files /dev/null and b/sound/effects/wood_break.ogg differ