diff --git a/code/datums/diseases/dna_spread.dm b/code/datums/diseases/dna_spread.dm
index dfa125d547b..d627fe8edbe 100644
--- a/code/datums/diseases/dna_spread.dm
+++ b/code/datums/diseases/dna_spread.dm
@@ -18,6 +18,8 @@
..()
if(!affected_mob.dna)
cure()
+ if(affected_mob.dna.species.specflags & NOTRANSSTING) //Only species that can be spread by transformation sting can be spread by the retrovirus
+ cure()
if(!strain_data["dna"])
//Absorbs the target DNA.
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index 85545b66aee..9123a969bee 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -36,6 +36,11 @@
user << "You cannot glare at allies!"
revert_cast()
return
+ var/mob/living/L = user
+ if(L.incorporeal_move) //Other abilities can still be used, but glare needed balancing
+ user << "You cannot glare while shadow walking!"
+ revert_cast()
+ return
var/mob/living/carbon/human/M = target
user.visible_message("[user]'s eyes flash a blinding red!")
target.visible_message("[target] freezes in place, their eyes glazing over...")
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 00fd0278901..c8c79304546 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -374,11 +374,12 @@ var/list/airlock_overlays = list()
if("closing")
update_icon(AIRLOCK_CLOSING)
if("deny")
- update_icon(AIRLOCK_DENY)
- playsound(src,doorDeni,50,0,3)
- sleep(6)
- update_icon(AIRLOCK_CLOSED)
- icon_state = "closed"
+ if(!stat)
+ update_icon(AIRLOCK_DENY)
+ playsound(src,doorDeni,50,0,3)
+ sleep(6)
+ update_icon(AIRLOCK_CLOSED)
+ icon_state = "closed"
/obj/machinery/door/airlock/examine(mob/user)
..()
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 8a836bb737e..c6d7f9de008 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -179,6 +179,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \
*/
var/global/list/datum/stack_recipe/runed_metal_recipes = list ( \
+ new/datum/stack_recipe("runed girder", /obj/structure/girder/cult, 2, time = 50, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("pylon", /obj/structure/cult/pylon, 4, time = 40, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("forge", /obj/structure/cult/forge, 6, time = 40, one_per_turf = 1, on_floor = 1), \
new/datum/stack_recipe("archives", /obj/structure/cult/tome, 4, time = 40, one_per_turf = 1, on_floor = 1), \
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 16c5a7363a6..a031e2ad2de 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -463,7 +463,7 @@
boxes.layer = 19
closer = new /obj/screen/close()
closer.master = src
- closer.icon_state = "x"
+ closer.icon_state = "backpack_close"
closer.layer = 20
orient2hud()
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index cbfa33903e8..fe6a97e262f 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -126,7 +126,7 @@
if(!isliving(AM)) //let's not put ghosts or camera mobs inside closets...
return
var/mob/living/L = AM
- if(L.buckled || L.buckled_mobs.len)
+ if(L.buckled || L.incorporeal_move || L.buckled_mobs.len)
return
if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items.
if(horizontal && !L.lying)
@@ -259,7 +259,7 @@
"You stuff [O] into [src].", \
"You hear a loud metal bang.")
var/mob/living/L = O
- if(istype(L))
+ if(istype(L) && !issilicon(L))
L.Weaken(2)
step_towards(O, loc)
close()
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index f2c47db7d61..fed6ee8b6c5 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -12,6 +12,7 @@
layer = 2.9
var/state = GIRDER_NORMAL
var/girderpasschance = 20 // percentage chance that a projectile passes through the girder.
+ var/can_displace = TRUE //If the girder can be moved around by wrenching it
/obj/structure/girder/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
@@ -49,7 +50,7 @@
var/obj/structure/girder/G = new (loc)
transfer_fingerprints_to(G)
qdel(src)
- else if(state == GIRDER_NORMAL)
+ else if(state == GIRDER_NORMAL && can_displace)
playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
user << "You start unsecuring the girder..."
if(do_after(user, 40/W.toolspeed, target = src))
@@ -311,16 +312,22 @@
//////////////////////////////////////////// cult girder //////////////////////////////////////////////
-/obj/structure/cultgirder
- icon= 'icons/obj/cult.dmi'
+/obj/structure/girder/cult
+ name = "runed girder"
+ desc = "Framework made of a strange and shockingly cold metal. It doesn't seem to have any bolts."
+ icon = 'icons/obj/cult.dmi'
icon_state= "cultgirder"
- anchored = 1
- density = 1
- layer = 2
+ can_displace = FALSE
-/obj/structure/cultgirder/attackby(obj/item/W, mob/user, params)
+/obj/structure/girder/cult/attackby(obj/item/W, mob/user, params)
add_fingerprint(user)
- if(istype(W, /obj/item/weapon/weldingtool))
+ if(istype(W, /obj/item/weapon/tome) && iscultist(user)) //Cultists can demolish cult girders instantly with their tomes
+ user.visible_message("[user] strikes [src] with [W]!", "You demolish [src].")
+ var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
+ R.amount = 2
+ qdel(src)
+
+ else if(istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
@@ -329,7 +336,8 @@
if( !WT.isOn() )
return
user << "You slice apart the girder."
- var/obj/effect/decal/remains/human/R = new (get_turf(src))
+ var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
+ R.amount = 2
transfer_fingerprints_to(R)
qdel(src)
@@ -338,32 +346,54 @@
playsound(src, 'sound/items/Welder.ogg', 100, 1)
if(do_after(user, 30, target = src))
user << "You slice apart the girder."
- var/obj/effect/decal/remains/human/R = new (get_turf(src))
+ var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
+ R.amount = 2
transfer_fingerprints_to(R)
qdel(src)
else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer))
var/obj/item/weapon/pickaxe/drill/jackhammer/D = W
user << "Your jackhammer smashes through the girder!"
- var/obj/effect/decal/remains/human/R = new (get_turf(src))
+ var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
+ R.amount = 2
transfer_fingerprints_to(R)
D.playDigSound()
qdel(src)
-/obj/structure/cultgirder/blob_act()
+ else if(istype(W, /obj/item/stack/sheet/runed_metal))
+ var/obj/item/stack/sheet/runed_metal/R = W
+ if(R.amount < 2)
+ user << "You need at least two sheets of runed metal to construct a runed wall!"
+ return 0
+ user.visible_message("[user] begins laying runed metal on [src]...", "You begin constructing a runed wall...")
+ if(!do_after(user, 50, target = src))
+ return 0
+ user.visible_message("[user] plates [src] with runed metal.", "You construct a runed wall.")
+ R.amount -= 2
+ if(R.amount <= 0)
+ user.drop_item()
+ qdel(R)
+ new/turf/simulated/wall/cult(get_turf(src))
+ qdel(src)
+
+ else
+ ..()
+
+/obj/structure/girder/cult/blob_act()
if(prob(40))
qdel(src)
-
-/obj/structure/cultgirder/ex_act(severity, target)
+/obj/structure/girder/cult/ex_act(severity, target)
switch(severity)
if(1)
qdel(src)
if(2)
if(prob(30))
- new /obj/effect/decal/remains/human(loc)
+ var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
+ R.amount = 2
qdel(src)
if(3)
if(prob(5))
- new /obj/effect/decal/remains/human(loc)
+ var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
+ R.amount = 2
qdel(src)
diff --git a/code/game/turfs/simulated/walls_misc.dm b/code/game/turfs/simulated/walls_misc.dm
index ec9a7794770..79b1bc7e006 100644
--- a/code/game/turfs/simulated/walls_misc.dm
+++ b/code/game/turfs/simulated/walls_misc.dm
@@ -1,6 +1,6 @@
/turf/simulated/wall/cult
- name = "wall"
- desc = "The patterns engraved on the wall seem to shift as you try to focus on them. You feel sick."
+ name = "runed wall"
+ desc = "A cold metal wall engraved with indecipherable symbols. Studying them causes your head to pound."
icon = 'icons/turf/walls/cult_wall.dmi'
icon_state = "cult"
walltype = "cult"
@@ -12,8 +12,9 @@
..()
/turf/simulated/wall/cult/break_wall()
- new /obj/effect/decal/cleanable/blood(src)
- return (new /obj/structure/cultgirder(src))
+ var/obj/item/stack/sheet/runed_metal/R = new(get_turf(src))
+ R.amount = 2
+ return (new /obj/structure/girder/cult(src))
/turf/simulated/wall/cult/devastate_wall()
new /obj/effect/decal/cleanable/blood(src)
diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm
index 088698548f2..e9152f15168 100644
--- a/code/modules/events/portal_storm.dm
+++ b/code/modules/events/portal_storm.dm
@@ -69,7 +69,7 @@
set waitfor = 0
playsound_global('sound/magic/lightning_chargeup.ogg', repeat=0, channel=1, volume=100)
sleep(80)
- priority_announce("Attention personnel of [world.name]: incoming portal storm!")
+ priority_announce("Massive bluespace anomaly detected en route to [station_name()]. Brace for impact.")
sleep(20)
playsound_global('sound/magic/lightningbolt.ogg', repeat=0, channel=1, volume=100)
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 87c0aabd31a..f7611bd8147 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -178,7 +178,7 @@
/turf/simulated/mineral/gibtonite/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/device/mining_scanner) || istype(I, /obj/item/device/t_scanner/adv_mining_scanner) && stage == 1)
- user.visible_message("You use [I] to locate where to cut off the chain reaction and attempt to stop it...")
+ user.visible_message("[user] holds [I] to [src]...", "You use [I] to locate where to cut off the chain reaction and attempt to stop it...")
defuse()
..()
diff --git a/code/modules/mob/living/silicon/ai/death.dm b/code/modules/mob/living/silicon/ai/death.dm
index 4b94f89d3ac..9847750d49b 100644
--- a/code/modules/mob/living/silicon/ai/death.dm
+++ b/code/modules/mob/living/silicon/ai/death.dm
@@ -2,7 +2,7 @@
if(stat == DEAD)
return
if(!gibbed)
- emote("me", 1, "sparks and its screen flickers, its systems slowly coming to a halt.")
+ visible_message("[src] lets out a flurry of sparks, its screen flickering as its systems slowly halt.")
stat = DEAD
diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm
index b8848a47565..e586bbd8b0e 100644
--- a/code/modules/mob/living/silicon/robot/death.dm
+++ b/code/modules/mob/living/silicon/robot/death.dm
@@ -22,7 +22,7 @@
if(stat == DEAD)
return
if(!gibbed)
- emote("deathgasp")
+ visible_message("[src] shudders violently for a moment before falling still, its eyes slowly darkening.")
locked = 0 //unlock cover
stat = DEAD
update_canmove()
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 12400eda73e..caec75bfd22 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -66,9 +66,8 @@
max_ammo = 6
/obj/item/ammo_box/magazine/internal/cylinder/rev38/can_load(mob/user)
- user << "You start reloading \the [src]..."
- if(!do_after(user, 30))
- user << "You didn't manage to reload \the [src]!"
+ user << "You start reloading..."
+ if(!do_after(user, 30, target = user))
return 0
return 1
diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi
index 0e3bd3c2470..9c5ae1a2043 100644
Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ