diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm
index 38c7df68aa3..6a981464bd5 100644
--- a/code/modules/mob/living/silicon/pai/life.dm
+++ b/code/modules/mob/living/silicon/pai/life.dm
@@ -16,6 +16,7 @@
for (var/mob/M in viewers(T))
M.show_message("\red The data cable rapidly retracts back into its spool.", 3, "\red You hear a click and the sound of wire spooling rapidly.", 2)
qdel(src.cable)
+ cable = null
/mob/living/silicon/pai/updatehealth()
if(status_flags & GODMODE)
diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm
index d00e209d2fb..2fd2ddcab61 100644
--- a/code/modules/mob/living/silicon/pai/pai.dm
+++ b/code/modules/mob/living/silicon/pai/pai.dm
@@ -6,7 +6,7 @@
robot_talk_understand = 0
emote_type = 2 // pAIs emotes are heard, not seen, so they can be seen through a container (eg. person)
small = 1
- pass_flags = 1
+ pass_flags = PASSTABLE
density = 0
holder_type = /obj/item/weapon/holder/pai
var/network = "SS13"
@@ -512,6 +512,10 @@
src << "You are far too small to pull anything!"
return
+/mob/living/silicon/pai/update_canmove()
+ . = ..()
+ density = 0 //this is reset every canmove update otherwise
+
/mob/living/silicon/pai/examine(mob/user)
..(user)
diff --git a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm
index eba943b5b66..83b74b11e9e 100644
--- a/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm
+++ b/code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm
@@ -70,6 +70,8 @@
ventcrawler = 2
ranged = 1
ranged_cooldown_cap = 2
+ universal_speak = 0
+ universal_understand = 0
projectilesound = 'sound/weapons/taser2.ogg'
AIStatus = AI_OFF
var/resources = 0 //Resource points, generated by consuming metal/glass
diff --git a/code/modules/mob/living/simple_animal/revenant/revenant.dm b/code/modules/mob/living/simple_animal/revenant/revenant.dm
index a62839665d7..6ba32e69f5c 100644
--- a/code/modules/mob/living/simple_animal/revenant/revenant.dm
+++ b/code/modules/mob/living/simple_animal/revenant/revenant.dm
@@ -35,6 +35,8 @@
var/essence_min = 1 //The minimum amount of essence a revenant can have; by default, it never drops below one
var/essence_accumulated = 0 //How much essence the revenant has stolen
var/revealed = 0 //If the revenant can take damage from normal sources.
+ var/unreveal_time = 0 //How long the revenant is revealed for, is about 2 seconds times this var.
+ var/unstun_time = 0 //How long the revenant is stunned for, is about 2 seconds times this var.
var/inhibited = 0 //If the revenant's abilities are blocked by a chaplain's power.
var/essence_drained = 0 //How much essence the revenant has drained.
var/draining = 0 //If the revenant is draining someone.
@@ -49,8 +51,18 @@
if(essence > essence_regen_cap)
essence = essence_regen_cap
maxHealth = essence * 3
+ if(unreveal_time && world.time >= unreveal_time)
+ unreveal_time = 0
+ revealed = 0
+ invisibility = INVISIBILITY_OBSERVER
+ src << "You are once more concealed."
+ if(unstun_time && world.time >= unstun_time)
+ unstun_time = 0
+ notransform = 0
+ src << "You can move again!"
if(!revealed)
health = maxHealth //Heals to full when not revealed
+ update_spooky_icon()
/mob/living/simple_animal/revenant/ex_act(severity)
return 1 //Immune to the effects of explosions.
@@ -263,11 +275,12 @@
return
revealed = 1
invisibility = 0
- src << "You have been revealed."
- spawn(time)
- revealed = 0
- invisibility = INVISIBILITY_OBSERVER
- src << "You are once more concealed."
+ if(!unreveal_time)
+ src << "You have been revealed!"
+ unreveal_time = world.time + time
+ else
+ src << "You have been revealed!"
+ unreveal_time = unreveal_time + time
/mob/living/simple_animal/revenant/proc/stun(time)
if(!src)
@@ -275,10 +288,25 @@
if(time <= 0)
return
notransform = 1
- src << "You cannot move!"
- spawn(time)
- notransform = 0
- src << "You can move again!"
+ if(!unstun_time)
+ src << "You cannot move!"
+ unstun_time = world.time + time
+ else
+ src << "You cannot move!"
+ unstun_time = unstun_time + time
+ update_spooky_icon()
+
+/mob/living/simple_animal/revenant/proc/update_spooky_icon()
+ if(unreveal_time)
+ if(draining)
+ icon_state = "revenant_draining"
+ return
+ if(unstun_time)
+ icon_state = "revenant_stun"
+ return
+ icon_state = "revenant_revealed"
+ return
+ icon_state = "revenant_idle"
/datum/objective/revenant
var/targetAmount = 100
diff --git a/code/stylesheet.dm b/code/stylesheet.dm
index a6ee7073d4e..dbfc30ca3b5 100644
--- a/code/stylesheet.dm
+++ b/code/stylesheet.dm
@@ -103,6 +103,9 @@ h1.alert, h2.alert {color: #000000;}
.greentext {color: #00FF00; font-size: 3;}
.redtext {color: #FF0000; font-size: 3;}
+.revennotice {color: #1d2953;}
+.revenboldnotice {color: #1d2953; font-weight: bold;}
+
.memo {color: #638500; text-align: center;}
.memoedit {text-align: center; font-size: 2;}
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 5112dc2543f..ba76739718d 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/mob.dmi b/icons/mob/mob.dmi
index 0aab96a6719..2e3d39e8f9f 100644
Binary files a/icons/mob/mob.dmi and b/icons/mob/mob.dmi differ