diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index f8d443f810e..bd0c398f485 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -123,6 +123,7 @@ datum/mind
out += "Factions and special roles:
"
var/list/sections = list(
+ "implant",
"revolution",
"cult",
"wizard",
@@ -133,19 +134,23 @@ datum/mind
"malfunction",
)
var/text = ""
-
+ var/mob/living/carbon/human/H = current
if (istype(current, /mob/living/carbon/human) || istype(current, /mob/living/carbon/monkey))
+ /** Impanted**/
+ if(H.is_loyalty_implanted(H))
+ text = "Loyalty Implant:Remove|Implanted"
+ else
+ text = "Loyalty Implant:No Implant|Implant him!"
+ sections["implant"] = text
/** REVOLUTION ***/
text = "revolution"
if (ticker.mode.config_tag=="revolution")
- text = uppertext(text)
+ text += uppertext(text)
text = "[text]: "
- if (assigned_role in command_positions)
- text += "HEAD|officer|employee|headrev|rev"
- else if (assigned_role in list("Security Officer", "Detective", "Warden"))
- text += "head|OFFICER|employee|headre|rev"
+ if (H.is_loyalty_implanted(H))
+ text += "LOYAL EMPLOYEE|headrev|rev"
else if (src in ticker.mode.head_revolutionaries)
- text = "head|officer|employee|HEADREV|rev"
+ text = "employee|HEADREV|rev"
text += "
Flash: give"
var/list/L = current.get_contents()
@@ -162,9 +167,9 @@ datum/mind
if (objectives.len==0)
text += "
Objectives are empty! Set to kill all heads."
else if (src in ticker.mode.revolutionaries)
- text += "head|officer|employee|headrev|REV"
+ text += "employee|headrev|REV"
else
- text += "head|officer|EMPLOYEE|headrev|rev"
+ text += "EMPLOYEE|headrev|rev"
sections["revolution"] = text
/** CULT ***/
@@ -172,19 +177,17 @@ datum/mind
if (ticker.mode.config_tag=="cult")
text = uppertext(text)
text = "[text]: "
- if (assigned_role in command_positions)
- text += "HEAD|officer|employee|cultist"
- else if (assigned_role in list("Security Officer", "Detective", "Warden"))
- text += "head|OFFICER|employee|cultist"
+ if (H.is_loyalty_implanted(H))
+ text += "LOYAL EMPLOYEE|cultist"
else if (src in ticker.mode.cult)
- text += "head|officer|employee|CULTIST"
+ text += "employee|CULTIST"
text += "
Give tome|amulet."
/*
if (objectives.len==0)
text += "
Objectives are empty! Set to sacrifice and escape or summon."
*/
else
- text += "head|officer|EMPLOYEE|cultist"
+ text += "EMPLOYEE|cultist"
sections["cult"] = text
/** WIZARD ***/
@@ -238,40 +241,43 @@ datum/mind
text += "operative|NANOTRASEN"
sections["nuclear"] = text
- /** TRAITOR ***/
- text = "traitor"
- if (ticker.mode.config_tag=="traitor" || ticker.mode.config_tag=="traitorchan")
- text = uppertext(text)
- text = "[text]: "
- if (src in ticker.mode.traitors)
- text += "TRAITOR|loyal"
- if (objectives.len==0)
- text += "
Objectives are empty! Randomize!"
- else
- text += "traitor|LOYAL"
- sections["traitor"] = text
-
- /** MONKEY ***/
- if (istype(current, /mob/living/carbon))
- text = "monkey"
- if (ticker.mode.config_tag=="monkey")
+ /** TRAITOR ***/
+ text = "traitor"
+ if (ticker.mode.config_tag=="traitor" || ticker.mode.config_tag=="traitorchan")
text = uppertext(text)
text = "[text]: "
- if (istype(current, /mob/living/carbon/human))
- text += "healthy|infected|HUMAN|other"
- else if (istype(current, /mob/living/carbon/monkey))
- var/found = 0
- for(var/datum/disease/D in current.viruses)
- if(istype(D, /datum/disease/jungle_fever)) found = 1
-
- if(found)
- text += "healthy|INFECTED|human|other"
- else
- text += "HEALTHY|infected|human|other"
-
+ if (H.is_loyalty_implanted(H))
+ text +="traitor|LOYAL EMPLOYEE"
else
- text += "healthy|infected|human|OTHER"
- sections["monkey"] = text
+ if (src in ticker.mode.traitors)
+ text += "TRAITOR|EMPLOYEE"
+ if (objectives.len==0)
+ text += "
Objectives are empty! Randomize!"
+ else
+ text += "traitor|EMPLOYEE"
+ sections["traitor"] = text
+
+ /** MONKEY ***/
+ if (istype(current, /mob/living/carbon))
+ text = "monkey"
+ if (ticker.mode.config_tag=="monkey")
+ text = uppertext(text)
+ text = "[text]: "
+ if (istype(current, /mob/living/carbon/human))
+ text += "healthy|infected|HUMAN|other"
+ else if (istype(current, /mob/living/carbon/monkey))
+ var/found = 0
+ for(var/datum/disease/D in current.viruses)
+ if(istype(D, /datum/disease/jungle_fever)) found = 1
+
+ if(found)
+ text += "healthy|INFECTED|human|other"
+ else
+ text += "HEALTHY|infected|human|other"
+
+ else
+ text += "healthy|infected|human|OTHER"
+ sections["monkey"] = text
/** SILICON ***/
@@ -496,6 +502,47 @@ datum/mind
if(!istype(objective)) return
objective.completed = !objective.completed
+ else if(href_list["implant"])
+ var/mob/living/carbon/human/H = current
+ switch(href_list["implant"])
+ if("remove")
+ for(var/obj/item/weapon/implant/loyalty/I in H.contents)
+ for(var/datum/organ/external/organs in H.organs)
+ if(I in organs.implants)
+ I.Del()
+ H << "\blue Your loyalty implant has been deactivated."
+ if("add")
+ var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(H)
+ L.imp_in = H
+ L.implanted = 1
+ var/datum/organ/external/affected = H.organs_by_name["head"]
+ affected.implants += L
+ L.part = affected
+
+ H << "\red You somehow have become the recepient of a loyalty transplant, and it just activated!"
+ if(src in ticker.mode.revolutionaries)
+ special_role = null
+ ticker.mode.revolutionaries -= src
+ src << "\red The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!"
+ if(src in ticker.mode.head_revolutionaries)
+ special_role = null
+ ticker.mode.head_revolutionaries -=src
+ src << "\red The nanobots in the loyalty implant remove all thoughts about being a revolutionary. Get back to work!"
+ if(src in ticker.mode.cult)
+ ticker.mode.cult -= src
+ ticker.mode.update_cult_icons_removed(src)
+ special_role = null
+ var/datum/game_mode/cult/cult = ticker.mode
+ if (istype(cult))
+ cult.memoize_cult_objectives(src)
+ current << "\red The nanobots in the loyalty implant remove all thoughts about being in a cult. Have a productive day!"
+ memory = ""
+ if(src in ticker.mode.traitors)
+ ticker.mode.traitors -= src
+ special_role = null
+ current << "\red The nanobots in the loyalty implant remove all thoughts about being a traitor to Nanotrasen. Have a nice day!"
+ log_admin("[key_name_admin(usr)] has de-traitor'ed [current].")
+
else if (href_list["revolution"])
switch(href_list["revolution"])
if("clear")
@@ -762,8 +809,8 @@ datum/mind
special_role = "traitor"
current << "\red You are a traitor!"
log_admin("[key_name_admin(usr)] has traitor'ed [current].")
- if(isAI(current))
- var/mob/living/silicon/ai/A = current
+ if(istype(current, /mob/living/silicon))
+ var/mob/living/silicon/A = current
call(/datum/game_mode/proc/add_law_zero)(A)
A.show_laws()
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index b896813cd56..7a3bb5bbf08 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -317,6 +317,14 @@
if(armor >= 2) return
+/mob/living/carbon/human/proc/is_loyalty_implanted(mob/living/carbon/human/M)
+ for(var/L in M.contents)
+ if(istype(L, /obj/item/weapon/implant/loyalty))
+ for(var/datum/organ/external/O in M.organs)
+ if(L in O.implants)
+ return 1
+ return 0
+
/mob/living/carbon/human/attack_slime(mob/living/carbon/slime/M as mob)
if(M.Victim) return // can't attack while eating!