diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index d43ee0560e5..563114c6ebe 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -33,7 +33,6 @@ datum/mind
var/key
var/name //replaces mob/var/original_name
var/mob/living/current
- var/mob/living/original //TODO: remove.not used in any meaningful way ~Carn. First I'll need to tweak the way silicon-mobs handle minds.
var/active = 0
var/memory
@@ -1099,7 +1098,6 @@ datum/mind
else
mind = new /datum/mind(key)
- mind.original = src
if(ticker)
ticker.minds += mind
else
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 85a7d85bc6e..675836ffc33 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -396,7 +396,7 @@ proc/display_roundstart_logout_report()
continue //Happy connected client
for(var/mob/dead/observer/D in mob_list)
- if(D.mind && (D.mind.original == L || D.mind.current == L))
+ if(D.mind && D.mind.current == L)
if(L.stat == DEAD)
if(L.suiciding) //Suicider
msg += "[L.name] ([ckey(D.mind.key)]), the [L.job] (Suicide)\n"
diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm
index ba434a4d9ea..6202c30d35c 100644
--- a/code/game/gamemodes/gameticker.dm
+++ b/code/game/gamemodes/gameticker.dm
@@ -328,11 +328,15 @@ var/global/datum/controller/gameticker/ticker
aiPlayer.show_laws(1)
if (aiPlayer.connected_robots.len)
- var/robolist = "The AI's loyal minions were: "
+ var/robolist = "[aiPlayer.real_name]'s loyal minions were: "
+ var/vsrobolist = "\red [aiPlayer.real_name]'s disloyal minions were: \black"
for(var/mob/living/silicon/robot/robo in aiPlayer.connected_robots)
+ if (is_special_character(robo))
+ vsrobolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.key]), ":" (Played by: [robo.key]), "]"
+ continue
robolist += "[robo.name][robo.stat?" (Deactivated) (Played by: [robo.key]), ":" (Played by: [robo.key]), "]"
world << "[robolist]"
-
+ world << "[vsrobolist]"
for (var/mob/living/silicon/robot/robo in mob_list)
if (!robo.connected_ai)
if (robo.stat != 2)
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 411b0455e18..bbb25f700cf 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -251,7 +251,7 @@ datum/objective/survive
check_completion()
if(!owner.current || owner.current.stat == DEAD || isbrain(owner.current))
return 0 //Brains no longer win survive objectives. --NEO
- if(issilicon(owner.current) && owner.current != owner.original)
+ if(!is_special_character(owner.current)) //This fails borg'd traitors
return 0
return 1
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index e2c23db92d8..18c481b30fe 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -34,7 +34,6 @@
modePlayer += wizard
wizard.assigned_role = "MODE" //So they aren't chosen for other jobs.
wizard.special_role = "Wizard"
- wizard.original = wizard.current
if(wizardstart.len == 0)
wizard.current << "\red A starting location for you could not be found, please report this bug!"
return 0
diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm
index 6f0a3c01e23..caaffaec921 100644
--- a/code/game/machinery/computer/message.dm
+++ b/code/game/machinery/computer/message.dm
@@ -123,7 +123,7 @@
else
for(var/n = ++i; n <= optioncount; n++)
dat += "
[n]. ---------------
"
- if((istype(user, /mob/living/silicon/ai) || istype(user, /mob/living/silicon/robot)) && (user.mind.special_role && user.mind.original == user))
+ if(issilicon(usr) && is_special_character(usr))
//Malf/Traitor AIs can bruteforce into the system to gain the Key.
dat += "*&@#. Bruteforce Key
"
else
@@ -351,7 +351,7 @@
//Hack the Console to get the password
if (href_list["hack"])
- if((istype(usr, /mob/living/silicon/ai) || istype(usr, /mob/living/silicon/robot)) && (usr.mind.special_role && usr.mind.original == usr))
+ if(issilicon(usr) && is_special_character(usr))
src.hacking = 1
src.screen = 2
src.icon_state = hack_icon
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index fd0a1edcf0b..b3d1092122d 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -72,7 +72,7 @@
else
dat += " Independent from AI |"
if (istype(user, /mob/living/silicon))
- if((user.mind.special_role && user.mind.original == user) && !R.emagged)
+ if(issilicon(user) && is_special_character(user) && !R.emagged)
dat += "(Hack) "
dat += "([R.canmove ? "Lockdown" : "Release"]) "
dat += "(Destroy)"
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 8c9cc1b1dc0..78ba08dec9a 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -689,50 +689,6 @@ var/global/floorIsLava = 0
////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS
-/proc/is_special_character(mob/M as mob) // returns 1 for specail characters and 2 for heroes of gamemode
- if(!ticker || !ticker.mode)
- return 0
- if (!istype(M))
- return 0
- if((M.mind in ticker.mode.head_revolutionaries) || (M.mind in ticker.mode.revolutionaries))
- if (ticker.mode.config_tag == "revolution")
- return 2
- return 1
- if(M.mind in ticker.mode.cult)
- if (ticker.mode.config_tag == "cult")
- return 2
- return 1
- if(M.mind in ticker.mode.malf_ai)
- if (ticker.mode.config_tag == "malfunction")
- return 2
- return 1
- if(M.mind in ticker.mode.syndicates)
- if (ticker.mode.config_tag == "nuclear")
- return 2
- return 1
- if(M.mind in ticker.mode.wizards)
- if (ticker.mode.config_tag == "wizard")
- return 2
- return 1
- if(M.mind in ticker.mode.changelings)
- if (ticker.mode.config_tag == "changeling")
- return 2
- return 1
-
- for(var/datum/disease/D in M.viruses)
- if(istype(D, /datum/disease/jungle_fever))
- if (ticker.mode.config_tag == "monkey")
- return 2
- return 1
- if(isrobot(M))
- var/mob/living/silicon/robot/R = M
- if(R.emagged)
- return 1
- if(M.mind&&M.mind.special_role)//If they have a mind and special role, they are some type of traitor or antagonist.
- return 1
-
- return 0
-
/*
/datum/admins/proc/get_sab_desc(var/target)
switch(target)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 638a018bea8..bd8a31bea20 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1660,6 +1660,9 @@
//ticker.mode.forge_traitor_objectives(H.mind)
ticker.mode.finalize_traitor(H.mind)
for(var/mob/living/silicon/A in player_list)
+ if(A.stat == 2 || !A.client || !A.mind) continue
+ if(ispAI(A)) continue
+ else if(is_special_character(A)) continue
ticker.mode.traitors += A.mind
A.mind.special_role = "traitor"
var/datum/objective/new_objective = new
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index e0606e0c0e5..fc5edc2f2a3 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -92,8 +92,8 @@
src << "You've lost power!"
// world << "DEBUG CODE TIME! [loc] is the area the AI is sucking power from"
- if (!is_special_character(src))
- src.set_zeroth_law("")
+ //if (!is_special_character(src))
+ //src.set_zeroth_law("")
//src.clear_supplied_laws() // Don't reset our laws.
//var/time = time2text(world.realtime,"hh:mm:ss")
//lawchanges.Add("[time] : [src.name]'s noncore laws have been reset due to power failure")
diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm
index bdc523dd6be..6fa829cf5bd 100644
--- a/code/modules/mob/living/silicon/robot/laws.dm
+++ b/code/modules/mob/living/silicon/robot/laws.dm
@@ -19,15 +19,17 @@
else
lawsync()
src << "Laws synced with AI, be sure to note any changes."
- if(mind && mind.special_role == "traitor" && mind.original == src)
- src << "Remember, your AI does NOT share or know about your law 0."
+ if(is_special_character(src))
+ src << "Remember, your AI does NOT share or know about your law 0."
+ if(src.connected_ai.laws.zeroth)
+ src << "While you are free to disregard it, your AI has a law 0 of its own."
else
src << "No AI selected to sync laws with, disabling lawsync protocol."
lawupdate = 0
who << "Obey these laws:"
laws.show_laws(who)
- if (mind && (mind.special_role == "traitor" && mind.original == src) && connected_ai)
+ if (is_special_character(src) && connected_ai)
who << "Remember, [connected_ai.name] is technically your master, but your objective comes first."
else if (connected_ai)
who << "Remember, [connected_ai.name] is your master, other AIs can be ignored."
@@ -48,7 +50,7 @@
if (length(temp) > 0)
laws.ion[index] = temp
- if (!is_special_character(src) || mind.original != src)
+ if (!is_special_character(src)) //Don't override the borg's existing law 0, if any
if(master.zeroth_borg) //If the AI has a defined law zero specifically for its borgs, give it that one, otherwise give it the same one. --NEO
temp = master.zeroth_borg
else
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 2ada23f649e..3a9a4aaa3be 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -384,4 +384,58 @@ proc/is_blind(A)
var/mob/living/carbon/C = A
if(C.blinded != null)
return 1
+ return 0
+
+proc/is_special_character(mob/M as mob) // returns 1 for special characters and 2 for heroes of gamemode //moved out of admins.dm because things other than admin procs were calling this.
+ if(!ticker || !ticker.mode)
+ return 0
+ if(!istype(M))
+ return 0
+ if(issilicon(M))
+ if(ispAI(M))
+ return 0
+ if(isrobot(M)) //For cyborgs, returns 1 if the cyborg has a law 0 and special_role. Returns 0 if the borg is merely slaved to an AI traitor.
+ var/mob/living/silicon/robot/R = M
+ if(R.emagged || R.syndicate) //Count as antags as far as I'm concerned
+ return 1
+ if(R.mind && R.mind.special_role && R.laws.zeroth)
+ if(R.connected_ai) //Make sure the AI isn't the REAL antag here.
+ if(is_special_character(R.connected_ai) && R.connected_ai.laws.zeroth_borg == R.laws.zeroth)
+ return 0 //Sorry, just following orders...
+ else
+ return 1 //The MAN can't keep me down! Row row fight da powa!
+ else
+ return 1 //I'm a strong, beautiful cyborg who don't need no master
+ if(isAI(M))
+ var/mob/living/silicon/ai/A = M
+ if(A.laws && A.laws.zeroth && A.mind && A.mind.special_role)
+ if(ticker.mode.config_tag == "malfunction" && M.mind in ticker.mode.malf_ai)//Malf law is a law 0
+ return 2
+ return 1
+ return 0
+ else
+ world << "Some undefined silicon ran is_special_character! Report this to a coder."
+ if(M.mind && M.mind.special_role)//If they have a mind and special role, they are some type of traitor or antagonist.
+ if (ticker.mode.config_tag == "revolution")
+ if((M.mind in ticker.mode.head_revolutionaries) || (M.mind in ticker.mode.revolutionaries))
+ return 2
+ if (ticker.mode.config_tag == "cult")
+ if(M.mind in ticker.mode.cult)
+ return 2
+ if (ticker.mode.config_tag == "nuclear")
+ if(M.mind in ticker.mode.syndicates)
+ return 2
+ if (ticker.mode.config_tag == "changeling")
+ if(M.mind in ticker.mode.changelings)
+ return 2
+ if (ticker.mode.config_tag == "wizard")
+ if(M.mind in ticker.mode.wizards)
+ return 2
+ for(var/datum/disease/D in M.viruses)
+ if(istype(D, /datum/disease/jungle_fever))
+ if (ticker.mode.config_tag == "monkey")
+ return 2
+ return 1
+ return 1
+
return 0
\ No newline at end of file
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 0573ee196c8..4149e763329 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -322,7 +322,6 @@
if(mind.assigned_role == "Clown") //give them a clownname if they are a clown
new_character.real_name = pick(clown_names) //I hate this being here of all places but unfortunately dna is based on real_name!
new_character.rename_self("clown")
- mind.original = new_character
mind.transfer_to(new_character) //won't transfer key since the mind is not active
new_character.name = real_name
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index d65c430b8c4..3eeb5685334 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -78,7 +78,6 @@
if(mind)
mind.transfer_to(O)
- O.mind.original = O
else
O.key = key
@@ -157,9 +156,7 @@
if(mind) //TODO
mind.transfer_to(O)
- if(O.mind.assigned_role == "Cyborg")
- O.mind.original = O
- else if(mind.special_role)
+ if(mind.special_role)
O.mind.store_memory("In case you look at this after being borged, the objectives are only here until I find a way to make them not show up for you, as I can't simply delete them without screwing up round-end reporting. --NeoFite")
else
O.key = key