diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index 9e3a127136..ceebe1f943 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -5,41 +5,47 @@
icon_state = "posibrain"
w_class = 3
origin_tech = list(TECH_ENGINERING = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2, TECH_DATA = 4)
- var/searching = 0
+
construction_cost = list(DEFAULT_WALL_MATERIAL=500,"glass"=500,"silver"=200,"gold"=200,"phoron"=100,"diamond"=10)
construction_time = 75
+ var/searching = 0
+ var/askDelay = 10 * 60 * 1
req_access = list(access_robotics)
locked = 0
mecha = null//This does not appear to be used outside of reference in mecha.dm.
-/obj/item/device/mmi/digital/posibrain/New()
- ..()
- brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
- brainmob.real_name = src.brainmob.name
-/obj/item/device/mmi/digital/posibrain/attack_self(var/mob/user)
- if(brainmob && !brainmob.key && !searching)
+/obj/item/device/mmi/digital/posibrain/attack_self(mob/user as mob)
+ if(brainmob && !brainmob.key && searching == 0)
//Start the process of searching for a new user.
- user << "You carefully locate the manual activation switch and start the positronic brain's boot process."
+ user << "\blue You carefully locate the manual activation switch and start the positronic brain's boot process."
icon_state = "posibrain-searching"
- searching = 1
- var/datum/ghosttrap/G = get_ghost_trap("positronic brain")
- G.request_player(brainmob, "A [src.name] has been booted by \the [user] in [get_area(user)]. ")
+ src.searching = 1
+ src.request_player()
spawn(600) reset_search()
-/obj/item/device/mmi/digital/posibrain/attack_ghost(var/mob/dead/observer/user)
- var/datum/ghosttrap/G = get_ghost_trap("positronic brain")
- if(!G.assess_candidate(user))
- return
- var/response = alert(user, "Are you sure you want to play as a positronic brain?", "Positronic brain request", "Yes", "No")
- if(response == "Yes")
- if(G.transfer_personality(user, brainmob))
- var/turf/T = get_turf(src)
- T.visible_message("\The [src] chimes quietly.")
- searching = 0
- name = "positronic brain ([brainmob.name])"
- icon_state = "posibrain-occupied"
- return
+/obj/item/device/mmi/digital/posibrain/proc/request_player()
+ for(var/mob/dead/observer/O in player_list)
+ if(!O.MayRespawn())
+ continue
+ if(jobban_isbanned(O, "AI") && jobban_isbanned(O, "Cyborg"))
+ continue
+ if(O.client)
+ if(O.client.prefs.be_special & BE_AI)
+ question(O.client)
+
+/obj/item/device/mmi/digital/posibrain/proc/question(var/client/C)
+ spawn(0)
+ if(!C) return
+ var/response = alert(C, "Someone is requesting a personality for a positronic brain. Would you like to play as one?", "Positronic brain request", "Yes", "No", "Never for this round")
+ if(response == "Yes")
+ response = alert(C, "Are you sure you want to play as a positronic brain?", "Positronic brain request", "Yes", "No")
+ 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(response == "Yes")
+ transfer_personality(C.mob)
+ else if (response == "Never for this round")
+ C.prefs.be_special ^= BE_AI
+
/obj/item/device/mmi/digital/posibrain/transfer_identity(var/mob/living/carbon/H)
..()
@@ -49,10 +55,6 @@
icon_state = "posibrain-occupied"
return
-/obj/item/device/mmi/digital/posibrain/proc/reset_search()
- if(!searching || (src.brainmob && src.brainmob.key))
- return
- searching = 0
/obj/item/device/mmi/digital/posibrain/proc/transfer_personality(var/mob/candidate)
announce_ghost_joinleave(candidate, 0, "They are occupying a positronic brain now.")
src.searching = 0
@@ -77,14 +79,16 @@
src.searching = 0
icon_state = "posibrain"
- var/turf/T = get_turf(src)
- T.visible_message("\The [src] brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?")
+
+ var/turf/T = get_turf_or_move(src.loc)
+ for (var/mob/M in viewers(T))
+ M.show_message("\blue The positronic brain buzzes quietly, and the golden lights fade away. Perhaps you could try again?")
/obj/item/device/mmi/digital/posibrain/examine(mob/user)
if(!..(user))
return
- var/msg = "*---------*\nThis is \icon[src] \a [src]!\n[desc]\n"
+ var/msg = "*---------*\nThis is \icon[src] \a [src]!\n[desc]\n"
msg += ""
if(src.brainmob && src.brainmob.key)
@@ -95,7 +99,7 @@
if(DEAD) msg += "It appears to be completely inactive.\n"
else
msg += "It appears to be completely inactive.\n"
- msg += "*---------*"
+ msg += "*---------*"
user << msg
return
@@ -112,3 +116,7 @@
src.brainmob.emp_damage += rand(0,10)
..()
+/obj/item/device/mmi/digital/posibrain/New()
+ ..()
+ src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
+ src.brainmob.real_name = src.brainmob.name
diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm
index 5930dd53e7..e133f82e6e 100644
--- a/code/modules/power/breaker_box.dm
+++ b/code/modules/power/breaker_box.dm
@@ -21,7 +21,7 @@
/obj/machinery/power/breakerbox/Destroy()
..()
- for(var/obj/nano_module/rcon/R in world)
+ for(var/datum/nano_module/rcon/R in world)
R.FindDevices()
/obj/machinery/power/breakerbox/activated
diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm
index 36924d9ae7..16f3bc9159 100644
--- a/code/modules/power/smes_construction.dm
+++ b/code/modules/power/smes_construction.dm
@@ -78,7 +78,7 @@
/obj/machinery/power/smes/buildable/Destroy()
..()
qdel(wires)
- for(var/obj/nano_module/rcon/R in world)
+ for(var/datum/nano_module/rcon/R in world)
R.FindDevices()