diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm
index 6b6e077206c..f6e74ef2aad 100644
--- a/code/_onclick/hud/alert.dm
+++ b/code/_onclick/hud/alert.dm
@@ -79,10 +79,11 @@
mouse_opacity = 1
var/timeout = 0 //If set to a number, this alert will clear itself after that many deciseconds
var/severity = 0
+ var/alerttooltipstyle = ""
/obj/screen/alert/MouseEntered(location,control,params)
- openToolTip(usr,src,params,title = name,content = desc)
+ openToolTip(usr,src,params,title = name,content = desc,theme = alerttooltipstyle)
/obj/screen/alert/MouseExited()
@@ -234,6 +235,19 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
name = "Charge Ready"
desc = "You are ready to charge at a location!"
icon_state = "guardian_charge"
+ alerttooltipstyle = "parasite"
+
+/obj/screen/alert/canstealth
+ name = "Stealth Ready"
+ desc = "You are ready to enter stealth!"
+ icon_state = "guardian_canstealth"
+ alerttooltipstyle = "parasite"
+
+/obj/screen/alert/instealth
+ name = "In Stealth"
+ desc = "You are in stealth and your next attack will do bonus damage!"
+ icon_state = "guardian_instealth"
+ alerttooltipstyle = "parasite"
//SILICONS
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index 9a6e194c02d..efc7a1ea732 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -73,13 +73,15 @@
/obj/effect/overlay/temp/guardian/phase/out
icon_state = "phaseout"
-/obj/effect/overlay/temp/guardian/charge
+/obj/effect/overlay/temp/decoy
+ desc = "It's a decoy!"
duration = 15
/obj/effect/overlay/temp/decoy/New(loc, atom/mimiced_atom)
..()
alpha = initial(alpha)
if(mimiced_atom)
+ name = mimiced_atom.name
icon = mimiced_atom.icon
icon_state = mimiced_atom.icon_state
dir = mimiced_atom.dir
diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm
index 3ad2dca4f34..fd218fad8d0 100644
--- a/code/modules/mob/living/simple_animal/guardian/guardian.dm
+++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm
@@ -247,7 +247,7 @@ var/global/list/parasites = list() //all currently existing/living guardians
var/used_message = "All the cards seem to be blank now."
var/failure_message = "..And draw a card! It's...blank? Maybe you should try again later."
var/ling_failure = "The deck refuses to respond to a souless creature such as you."
- var/list/possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive", "Lightning", "Protector", "Charger")
+ var/list/possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive", "Lightning", "Protector", "Charger", "Assassin")
var/random = TRUE
/obj/item/weapon/guardiancreator/attack_self(mob/living/user)
@@ -307,6 +307,9 @@ var/global/list/parasites = list() //all currently existing/living guardians
if("Charger")
pickedtype = /mob/living/simple_animal/hostile/guardian/charger
+ if("Assassin")
+ pickedtype = /mob/living/simple_animal/hostile/guardian/assassin
+
var/mob/living/simple_animal/hostile/guardian/G = new pickedtype(user)
G.summoner = user
G.key = key
@@ -356,7 +359,7 @@ var/global/list/parasites = list() //all currently existing/living guardians
ling_failure = "The holoparasites recoil in horror. They want nothing to do with a creature like you."
/obj/item/weapon/guardiancreator/tech/choose/traitor
- possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive", "Lightning")
+ possible_guardians = list("Chaos", "Standard", "Ranged", "Support", "Explosive", "Lightning", "Assassin")
/obj/item/weapon/guardiancreator/tech/choose
random = FALSE
diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
new file mode 100644
index 00000000000..f3a0aefbde8
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm
@@ -0,0 +1,90 @@
+//Assassin
+/mob/living/simple_animal/hostile/guardian/assassin
+ melee_damage_lower = 15
+ melee_damage_upper = 15
+ attacktext = "stabs"
+ damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1)
+ playstyle_string = "As an assassin type you do medium damage, have no damage resistance, but can enter stealth, increasing the damage of your next attack and causing it to ignore armor. Stealth is broken if you attack or take damage."
+ magic_fluff_string = "..And draw the Space Ninja, a lethal, invisible assassin."
+ tech_fluff_string = "Boot sequence complete. Assassin modules loaded. Holoparasite swarm online."
+ var/toggle = FALSE
+ var/stealthcooldown = 150
+ var/obj/screen/alert/canstealthalert
+ var/obj/screen/alert/instealthalert
+
+/mob/living/simple_animal/hostile/guardian/assassin/New()
+ ..()
+ stealthcooldown = 0
+
+/mob/living/simple_animal/hostile/guardian/assassin/Life()
+ ..()
+ updatestealthalert()
+
+/mob/living/simple_animal/hostile/guardian/assassin/Stat()
+ ..()
+ if(statpanel("Status"))
+ if(stealthcooldown >= world.time)
+ stat(null, "Stealth Cooldown Remaining: [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds")
+
+/mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget()
+ if(..())
+ if(toggle && (isliving(target) || istype(target, /obj/structure/window) || istype(target, /obj/structure/grille)))
+ ToggleMode(1)
+
+/mob/living/simple_animal/hostile/guardian/assassin/adjustHealth(amount)
+ . = ..()
+ if(. && toggle)
+ ToggleMode(1)
+
+/mob/living/simple_animal/hostile/guardian/assassin/Recall()
+ if(..() && toggle)
+ ToggleMode(0)
+
+/mob/living/simple_animal/hostile/guardian/assassin/ToggleMode(forced = 0)
+ if(src.loc != summoner)
+ if(toggle)
+ melee_damage_lower = initial(melee_damage_lower)
+ melee_damage_upper = initial(melee_damage_upper)
+ armour_penetration = initial(armour_penetration)
+ environment_smash = initial(environment_smash)
+ alpha = initial(alpha)
+ if(!forced)
+ src << "You exit stealth."
+ updatestealthalert()
+ else
+ visible_message("\The [src] suddenly appears!")
+ stealthcooldown = world.time + initial(stealthcooldown) //we were forced out of stealth and go on cooldown
+ toggle = FALSE
+ else if(stealthcooldown <= world.time)
+ melee_damage_lower = 40
+ melee_damage_upper = 40
+ armour_penetration = 100
+ environment_smash = 0
+ PoolOrNew(/obj/effect/overlay/temp/guardian/phase/out, get_turf(src))
+ alpha = 10
+ if(!forced)
+ src << "You enter stealth, empowering your next attack."
+ updatestealthalert()
+ toggle = TRUE
+ else if(!forced)
+ src << "You cannot yet enter stealth, wait another [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds!"
+ else if(!forced)
+ src << "You have to be deployed to enter stealth!"
+
+/mob/living/simple_animal/hostile/guardian/assassin/proc/updatestealthalert()
+ if(stealthcooldown <= world.time)
+ if(toggle)
+ if(!instealthalert)
+ instealthalert = throw_alert("instealth", /obj/screen/alert/instealth)
+ clear_alert("canstealth")
+ canstealthalert = null
+ else
+ if(!canstealthalert)
+ canstealthalert = throw_alert("canstealth", /obj/screen/alert/canstealth)
+ clear_alert("instealth")
+ instealthalert = null
+ else
+ clear_alert("instealth")
+ instealthalert = null
+ clear_alert("canstealth")
+ canstealthalert = null
diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
index c928c89cde8..81b9ac99b8b 100644
--- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
+++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm
@@ -31,6 +31,7 @@
ranged = 1
melee_damage_lower = 10
melee_damage_upper = 10
+ environment_smash = initial(environment_smash)
alpha = 255
range = 13
incorporeal_move = 0
@@ -40,6 +41,7 @@
ranged = 0
melee_damage_lower = 0
melee_damage_upper = 0
+ environment_smash = 0
alpha = 60
range = 255
incorporeal_move = 1
diff --git a/code/modules/tooltip/tooltip.html b/code/modules/tooltip/tooltip.html
index ede448c54fa..3f0e5784922 100644
--- a/code/modules/tooltip/tooltip.html
+++ b/code/modules/tooltip/tooltip.html
@@ -42,6 +42,9 @@
.blob .wrap {border-color: #2E2E2E;}
.blob .content {color: #82ED00; border-color: #4E4C4A; background-color: #191918;}
+ .parasite .wrap {border-color: #88868D;}
+ .parasite .content {color: #EFEEEF; border-color: #35333A; background-color: #636169;}
+
.wraith .wrap {border-color: #492136;}
.wraith .content {border-color: #331726; background-color: #471962;}
diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi
index b7d64121636..a2fbd692c53 100644
Binary files a/icons/mob/screen_alert.dmi and b/icons/mob/screen_alert.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index a336c8378d8..32d20cd1251 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1343,6 +1343,7 @@
#include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm"
#include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm"
#include "code\modules\mob\living\simple_animal\guardian\guardian.dm"
+#include "code\modules\mob\living\simple_animal\guardian\types\assassin.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\charger.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\explosive.dm"
#include "code\modules\mob\living\simple_animal\guardian\types\fire.dm"