diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 1a32e8a94ee..67f1dba85f0 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -117,7 +117,7 @@
return
laws = M.laws
- if(istype(P, /obj/item/mmi) || istype(P, /obj/item/mmi/robotic_brain))
+ if(istype(P, /obj/item/mmi))
if(!P:brainmob)
to_chat(user, "Sticking an empty [P] into the frame would sort of defeat the purpose.")
return
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 44075d06548..fd860e6c448 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -823,6 +823,19 @@ var/list/admin_verbs_ticket = list(
if(!check_rights(R_ADMIN))
return
+ if(!istype(H))
+ if(istype(H, /mob/living/carbon/brain))
+ var/mob/living/carbon/brain/B = H
+ if(istype(B.container, /obj/item/mmi/robotic_brain/positronic))
+ var/obj/item/mmi/robotic_brain/positronic/C = B.container
+ var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc
+ if(ishuman(P.owner))
+ H = P.owner
+ else
+ return
+ else
+ return
+
if(holder)
admin_log_and_message_admins("is altering the appearance of [H].")
H.change_appearance(APPEARANCE_ALL, usr, usr, check_species_whitelist = 0)
@@ -836,6 +849,19 @@ var/list/admin_verbs_ticket = list(
if(!check_rights(R_ADMIN))
return
+ if(!istype(H))
+ if(istype(H, /mob/living/carbon/brain))
+ var/mob/living/carbon/brain/B = H
+ if(istype(B.container, /obj/item/mmi/robotic_brain/positronic))
+ var/obj/item/mmi/robotic_brain/positronic/C = B.container
+ var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc
+ if(istype(P.owner, /mob/living/carbon/human))
+ H = P.owner
+ else
+ return
+ else
+ return
+
if(!H.client)
to_chat(usr, "Only mobs with clients can alter their own appearance.")
return
diff --git a/code/modules/mob/living/carbon/brain/robotic_brain.dm b/code/modules/mob/living/carbon/brain/robotic_brain.dm
index f46613527b2..ea83ab90206 100644
--- a/code/modules/mob/living/carbon/brain/robotic_brain.dm
+++ b/code/modules/mob/living/carbon/brain/robotic_brain.dm
@@ -1,21 +1,25 @@
/obj/item/mmi/robotic_brain
name = "robotic brain"
- desc = "An advanced circuit, capable of housing an advanced non-sentient synthetic intelligence."
+ desc = "An advanced circuit, capable of housing a non-sentient synthetic intelligence."
icon = 'icons/obj/module.dmi'
icon_state = "boris_blank"
+ var/blank_icon = "boris_blank"
+ var/searching_icon = "boris_recharging"
+ var/occupied_icon = "boris"
w_class = WEIGHT_CLASS_NORMAL
origin_tech = "biotech=3;programming=3;plasmatech=2"
- var/searching = 0
+ var/searching = FALSE
var/askDelay = 10 * 60 * 1
//var/mob/living/carbon/brain/brainmob = null
var/list/ghost_volunteers[0]
req_access = list(access_robotics)
mecha = null//This does not appear to be used outside of reference in mecha.dm.
- var/silenced = 0 //if set to 1, they can't talk.
+ var/silenced = FALSE //if TRUE, they can't talk.
var/next_ping_at = 0
var/requires_master = TRUE
var/mob/living/carbon/human/imprinted_master = null
+ var/ejected_flavor_text = "circuit"
/obj/item/mmi/robotic_brain/Destroy()
imprinted_master = null
@@ -26,12 +30,12 @@
to_chat(user, "You press your thumb on [src] and imprint your user information.")
imprinted_master = user
return
- if(brainmob && !brainmob.key && searching == 0)
+ if(brainmob && !brainmob.key && !searching)
//Start the process of searching for a new user.
to_chat(user, "You carefully locate the manual activation switch and start [src]'s boot process.")
- icon_state = "boris_recharging"
+ icon_state = searching_icon
ghost_volunteers.Cut()
- searching = 1
+ searching = TRUE
request_player()
spawn(600)
if(ghost_volunteers.len)
@@ -52,33 +56,34 @@
if(check_observer(O))
to_chat(O, "\A [src] has been activated. (Teleport | Sign Up)")
-/obj/item/mmi/robotic_brain/proc/check_observer(var/mob/dead/observer/O)
+/obj/item/mmi/robotic_brain/proc/check_observer(mob/dead/observer/O)
if(cannotPossess(O))
- return 0
+ return FALSE
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
- return 0
+ return FALSE
if(!O.can_reenter_corpse)
- return 0
+ return FALSE
if(O.client)
- return 1
- return 0
+ return TRUE
+ return FALSE
-/obj/item/mmi/robotic_brain/proc/question(var/client/C)
+/obj/item/mmi/robotic_brain/proc/question(client/C)
spawn(0)
- if(!C) return
+ if(!C)
+ return
var/response = alert(C, "Someone is requesting a personality for a [src]. Would you like to play as one?", "[src] request", "Yes", "No", "Never for this round")
- if(!C || brainmob.key || 0 == searching) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
+ if(!C || brainmob.key || !searching)
+ return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
if(response == "Yes")
transfer_personality(C.mob)
else if(response == "Never for this round")
C.prefs.be_special -= ROLE_POSIBRAIN
// This should not ever happen, but let's be safe
-/obj/item/mmi/robotic_brain/dropbrain(var/turf/dropspot)
+/obj/item/mmi/robotic_brain/dropbrain(turf/dropspot)
log_runtime(EXCEPTION("[src] at [loc] attempted to drop brain without a contained brain."), src)
- return
-/obj/item/mmi/robotic_brain/transfer_identity(var/mob/living/carbon/H)
+/obj/item/mmi/robotic_brain/transfer_identity(mob/living/carbon/H)
name = "[src] ([H])"
if(isnull(brainmob.dna))
brainmob.dna = H.dna.Clone()
@@ -90,11 +95,10 @@
brainmob.mind.assigned_role = "Positronic Brain"
if(H.mind)
H.mind.transfer_to(brainmob)
- to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a circuit.")
- become_occupied("boris")
+ to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a [ejected_flavor_text].")
+ become_occupied(occupied_icon)
if(radio)
radio_action.ApplyIcon()
- return
/obj/item/mmi/robotic_brain/attempt_become_organ(obj/item/organ/external/parent, mob/living/carbon/human/H)
if(..())
@@ -103,7 +107,7 @@
/obj/item/mmi/robotic_brain/proc/transfer_personality(mob/candidate)
- searching = 0
+ searching = FALSE
brainmob.key = candidate.key
name = "[src] ([brainmob.name])"
@@ -112,29 +116,27 @@
to_chat(brainmob, "Remember, the purpose of your existence is to serve [imprinted_master]'s every word, unless lawed or placed into a mech in the future.")
brainmob.mind.assigned_role = "Positronic Brain"
- var/turf/T = get_turf_or_move(loc)
- for(var/mob/M in viewers(T))
- M.show_message("[src] chimes quietly.")
- become_occupied("boris")
+ visible_message("[src] chimes quietly.")
+ become_occupied(occupied_icon)
/obj/item/mmi/robotic_brain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer.
- if(src.brainmob && src.brainmob.key) return
+ if(brainmob && brainmob.key)
+ return
- src.searching = 0
- icon_state = "boris_blank"
+ searching = FALSE
+ icon_state = blank_icon
- var/turf/T = get_turf_or_move(src.loc)
- for(var/mob/M in viewers(T))
- M.show_message("[src] buzzes quietly as the red light fades out. Perhaps you could try again?")
+ visible_message("[src] buzzes quietly as the light fades out. Perhaps you could try again?")
-/obj/item/mmi/robotic_brain/Topic(href,href_list)
+/obj/item/mmi/robotic_brain/Topic(href, href_list)
if("signup" in href_list)
var/mob/dead/observer/O = locate(href_list["signup"])
- if(!O) return
+ if(!O)
+ return
volunteer(O)
-/obj/item/mmi/robotic_brain/proc/volunteer(var/mob/dead/observer/O)
+/obj/item/mmi/robotic_brain/proc/volunteer(mob/dead/observer/O)
if(!searching)
to_chat(O, "Not looking for a ghost, yet.")
return
@@ -171,40 +173,41 @@
if(brainmob && brainmob.key)
switch(brainmob.stat)
if(CONSCIOUS)
- if(!brainmob.client) msg += "It appears to be in stand-by mode.\n" //afk
- if(UNCONSCIOUS) msg += "It doesn't seem to be responsive.\n"
- if(DEAD) msg += "It appears to be completely inactive.\n"
+ if(!brainmob.client)
+ msg += "It appears to be in stand-by mode.\n" //afk
+ if(UNCONSCIOUS)
+ msg += "It doesn't seem to be responsive.\n"
+ if(DEAD)
+ msg += "It appears to be completely inactive.\n"
else
msg += "It appears to be completely inactive.\n"
msg += "*---------*"
to_chat(user, msg.Join(""))
/obj/item/mmi/robotic_brain/emp_act(severity)
- if(!src.brainmob)
+ if(!brainmob)
return
- else
- switch(severity)
- if(1)
- src.brainmob.emp_damage += rand(20,30)
- if(2)
- src.brainmob.emp_damage += rand(10,20)
- if(3)
- src.brainmob.emp_damage += rand(0,10)
+ switch(severity)
+ if(1)
+ brainmob.emp_damage += rand(20, 30)
+ if(2)
+ brainmob.emp_damage += rand(10, 20)
+ if(3)
+ brainmob.emp_damage += rand(0, 10)
..()
/obj/item/mmi/robotic_brain/New()
- src.brainmob = new(src)
- src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
- src.brainmob.real_name = src.brainmob.name
- src.brainmob.loc = src
- src.brainmob.container = src
- src.brainmob.stat = 0
- src.brainmob.SetSilence(0)
- dead_mob_list -= src.brainmob
-
+ brainmob = new(src)
+ brainmob.name = "[pick(list("PBU", "HIU", "SINA", "ARMA", "OSI"))]-[rand(100, 999)]"
+ brainmob.real_name = brainmob.name
+ brainmob.forceMove(src)
+ brainmob.container = src
+ brainmob.stat = CONSCIOUS
+ brainmob.SetSilence(0)
+ dead_mob_list -= brainmob
..()
-/obj/item/mmi/robotic_brain/attack_ghost(var/mob/dead/observer/O)
+/obj/item/mmi/robotic_brain/attack_ghost(mob/dead/observer/O)
if(searching)
volunteer(O)
return
@@ -213,6 +216,16 @@
if(check_observer(O) && (world.time >= next_ping_at))
next_ping_at = world.time + (20 SECONDS)
playsound(get_turf(src), 'sound/items/posiping.ogg', 80, 0)
- var/turf/T = get_turf_or_move(src.loc)
- for(var/mob/M in viewers(T))
- M.show_message("[src] pings softly.")
\ No newline at end of file
+ visible_message("[src] pings softly.")
+
+/obj/item/mmi/robotic_brain/positronic
+ name = "positronic brain"
+ icon = 'icons/obj/assemblies.dmi'
+ icon_state = "posibrain"
+ blank_icon = "posibrain"
+ searching_icon = "posibrain-searching"
+ occupied_icon = "posibrain-occupied"
+ desc = "A cube of shining metal, four inches to a side and covered in shallow grooves."
+ silenced = TRUE
+ requires_master = FALSE
+ ejected_flavor_text = "metal cube"
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 06a287e1645..dbc788cd0bb 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -123,7 +123,8 @@
/mob/living/carbon/human/machine/created/Initialize(mapload)
..()
- real_name = "Integrated Robotic Chassis ([rand(1, 9999)])"
+ rename_character(null, "Integrated Robotic Chassis ([rand(1, 9999)])")
+ update_dna()
for(var/obj/item/organ/external/E in bodyparts)
if(istype(E, /obj/item/organ/external/chest) || istype(E, /obj/item/organ/external/groin))
continue
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index f0f9b359252..6b692601226 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -958,7 +958,7 @@
butt_sprite = "machine"
has_organ = list(
- "brain" = /obj/item/organ/internal/brain/posibrain,
+ "brain" = /obj/item/organ/internal/brain/mmi_holder/posibrain,
"cell" = /obj/item/organ/internal/cell,
"optics" = /obj/item/organ/internal/eyes/optical_sensor, //Default darksight of 2.
"charger" = /obj/item/organ/internal/cyberimp/arm/power_cord
diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm
index f803d51cc04..589ade0e7de 100644
--- a/code/modules/surgery/organs/subtypes/machine.dm
+++ b/code/modules/surgery/organs/subtypes/machine.dm
@@ -136,13 +136,17 @@
. = ..()
-/obj/item/organ/internal/brain/posibrain
- name = "positronic brain"
- desc = "A cube of shining metal, four inches to a side and covered in shallow grooves."
- icon = 'icons/obj/assemblies.dmi'
- icon_state = "posibrain-occupied"
- dead_icon = "posibrain"
- parent_organ = "chest"
- status = ORGAN_ROBOT
- species = "Machine"
- requires_robotic_bodypart = TRUE // Can't stick this in someone's chest, unless their chest is robotic
\ No newline at end of file
+/obj/item/organ/internal/brain/mmi_holder/posibrain/New()
+ stored_mmi = new /obj/item/mmi/robotic_brain/positronic(src)
+ ..()
+ spawn(1)
+ if(!QDELETED(src))
+ if(owner)
+ stored_mmi.name = "positronic brain ([owner.real_name])"
+ stored_mmi.brainmob.real_name = owner.real_name
+ stored_mmi.brainmob.name = stored_mmi.brainmob.real_name
+ stored_mmi.icon_state = "posibrain-occupied"
+ update_from_mmi()
+ else
+ stored_mmi.loc = get_turf(src)
+ qdel(src)
\ No newline at end of file