diff --git a/aurora.dme b/aurora.dme
index 3b5bcedb..c7d1c3fa 100644
--- a/aurora.dme
+++ b/aurora.dme
@@ -125,6 +125,7 @@
#include "code\_onclick\other_mobs.dm"
#include "code\_onclick\telekinesis.dm"
#include "code\_onclick\hud\_defines.dm"
+#include "code\_onclick\hud\ai.dm"
#include "code\_onclick\hud\alien.dm"
#include "code\_onclick\hud\alien_larva.dm"
#include "code\_onclick\hud\hud.dm"
@@ -1155,6 +1156,7 @@
#include "code\modules\mob\living\silicon\ai\life.dm"
#include "code\modules\mob\living\silicon\ai\login.dm"
#include "code\modules\mob\living\silicon\ai\logout.dm"
+#include "code\modules\mob\living\silicon\ai\nano.dm"
#include "code\modules\mob\living\silicon\ai\say.dm"
#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm"
#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm"
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index fc822a38..57d2cac3 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -39,6 +39,7 @@
#define ui_alien_head "4:12,1:5" //aliens
#define ui_alien_oclothing "5:14,1:5" //aliens
+#define ui_borg_sensor "5:16,1:5" //borgs
#define ui_inv1 "6:16,1:5" //borgs
#define ui_inv2 "7:16,1:5" //borgs
#define ui_inv3 "8:16,1:5" //borgs
@@ -57,6 +58,8 @@
#define ui_acti_alt "14:28,1:5" //alternative intent switcher for when the interface is hidden (F12)
#define ui_borg_pull "12:24,2:7"
+#define ui_borg_radio "EAST-1:28,SOUTH+1:7"
+#define ui_borg_intents "EAST-2:26,SOUTH:5"
#define ui_borg_module "13:26,2:7"
#define ui_borg_panel "14:28,2:7"
@@ -117,3 +120,22 @@
#define ui_iarrowleft "SOUTH-1,11"
#define ui_iarrowright "SOUTH-1,13"
+
+// AI
+
+#define ui_ai_camera_list "SOUTH:6+1,WEST+1:16"
+#define ui_ai_track_with_camera "SOUTH:6+1,WEST+2:16"
+#define ui_ai_camera_light "SOUTH:6+1,WEST+3:16"
+#define ui_ai_sensor "SOUTH:6+1,WEST+4:16"
+
+#define ui_ai_core "SOUTH:6,WEST+1:16"
+#define ui_ai_crew_monitor "SOUTH:6,WEST+2:16"
+#define ui_ai_crew_manifest "SOUTH:6,WEST+3:16"
+#define ui_ai_alerts "SOUTH:6,WEST+4:16"
+#define ui_ai_announcement "SOUTH:6,WEST+5:16"
+#define ui_ai_shuttle "SOUTH:6,WEST+6:16"
+#define ui_ai_state_laws "SOUTH:6,WEST+7:16"
+#define ui_ai_pda_send "SOUTH:6,WEST+8:16"
+#define ui_ai_pda_log "SOUTH:6,WEST+9:16"
+#define ui_ai_take_picture "SOUTH:6,WEST+10:16"
+#define ui_ai_view_images "SOUTH:6,WEST+11:16"
\ No newline at end of file
diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm
new file mode 100644
index 00000000..b528832c
--- /dev/null
+++ b/code/_onclick/hud/ai.dm
@@ -0,0 +1,143 @@
+/datum/hud/proc/ai_hud()
+ adding = list()
+ other = list()
+
+ var/obj/screen/using
+
+//AI core
+ using = new /obj/screen()
+ using.name = "AI Core"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "ai_core"
+ using.screen_loc = ui_ai_core
+ using.layer = 20
+ adding += using
+
+//Camera list
+ using = new /obj/screen()
+ using.name = "Show Camera List"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "camera"
+ using.screen_loc = ui_ai_camera_list
+ using.layer = 20
+ adding += using
+
+//Track
+ using = new /obj/screen()
+ using.name = "Track With Camera"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "track"
+ using.screen_loc = ui_ai_track_with_camera
+ using.layer = 20
+ adding += using
+
+//Camera light
+ using = new /obj/screen()
+ using.name = "Toggle Camera Light"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "camera_light"
+ using.screen_loc = ui_ai_camera_light
+ using.layer = 20
+ adding += using
+
+//Crew Monitorting
+ using = new /obj/screen()
+ using.name = "Crew Monitoring"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "crew_monitor"
+ using.screen_loc = ui_ai_crew_monitor
+ using.layer = 20
+ adding += using
+
+//Crew Manifest
+ using = new /obj/screen()
+ using.name = "Show Crew Manifest"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "manifest"
+ using.screen_loc = ui_ai_crew_manifest
+ using.layer = 20
+ adding += using
+
+//Alerts
+ using = new /obj/screen()
+ using.name = "Show Alerts"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "alerts"
+ using.screen_loc = ui_ai_alerts
+ using.layer = 20
+ adding += using
+
+//Announcement
+ using = new /obj/screen()
+ using.name = "Announcement"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "announcement"
+ using.screen_loc = ui_ai_announcement
+ using.layer = 20
+ adding += using
+
+//Shuttle
+ using = new /obj/screen()
+ using.name = "Call Emergency Shuttle"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "call_shuttle"
+ using.screen_loc = ui_ai_shuttle
+ using.layer = 20
+ adding += using
+
+//Laws
+ using = new /obj/screen()
+ using.name = "State Laws"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "state_laws"
+ using.screen_loc = ui_ai_state_laws
+ using.layer = 20
+ adding += using
+
+//PDA message
+ using = new /obj/screen()
+ using.name = "PDA - Send Message"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "pda_send"
+ using.screen_loc = ui_ai_pda_send
+ using.layer = 20
+ adding += using
+
+//PDA log
+ using = new /obj/screen()
+ using.name = "PDA - Show Message Log"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "pda_receive"
+ using.screen_loc = ui_ai_pda_log
+ using.layer = 20
+ adding += using
+
+//Take image
+ using = new /obj/screen()
+ using.name = "Take Image"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "take_picture"
+ using.screen_loc = ui_ai_take_picture
+ using.layer = 20
+ adding += using
+
+//View images
+ using = new /obj/screen()
+ using.name = "View Images"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "view_images"
+ using.screen_loc = ui_ai_view_images
+ using.layer = 20
+ adding += using
+
+//Medical/Security sensors
+ using = new /obj/screen()
+ using.name = "Set Sensor Augmentation"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "ai_sensor"
+ using.screen_loc = ui_ai_sensor
+ using.layer = 20
+ adding += using
+
+ mymob.client.screen += adding + other
+ return
\ No newline at end of file
diff --git a/code/_onclick/hud/other_mobs.dm b/code/_onclick/hud/other_mobs.dm
index cd19e78d..10cf0d03 100644
--- a/code/_onclick/hud/other_mobs.dm
+++ b/code/_onclick/hud/other_mobs.dm
@@ -13,9 +13,6 @@
mymob.blind.screen_loc = "1,1"
mymob.blind.layer = 0
-/datum/hud/proc/ai_hud()
- return
-
/datum/hud/proc/blob_hud(ui_style = 'icons/mob/screen1_Midnight.dmi')
blobpwrdisplay = new /obj/screen()
diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm
index 62cf2247..e91cfb50 100644
--- a/code/_onclick/hud/robot.dm
+++ b/code/_onclick/hud/robot.dm
@@ -12,7 +12,7 @@
using.dir = SOUTHWEST
using.icon = 'icons/mob/screen1_robot.dmi'
using.icon_state = "radio"
- using.screen_loc = ui_movi
+ using.screen_loc = ui_borg_radio
using.layer = 20
src.adding += using
@@ -50,13 +50,22 @@
//End of module select
+//Sec/Med HUDs
+ using = new /obj/screen()
+ using.name = "Toggle Sensor Augmentation"
+ using.icon = 'icons/mob/screen_ai.dmi'
+ using.icon_state = "ai_sensor"
+ using.screen_loc = ui_borg_sensor
+ using.layer = 20
+ adding += using
+
//Intent
using = new /obj/screen()
using.name = "act_intent"
using.dir = SOUTHWEST
using.icon = 'icons/mob/screen1_robot.dmi'
- using.icon_state = (mymob.a_intent == "hurt" ? "harm" : mymob.a_intent)
- using.screen_loc = ui_acti
+ using.icon_state = (mymob.a_intent == "harm" ? "harm" : mymob.a_intent)
+ using.screen_loc = ui_borg_intents
using.layer = 20
src.adding += using
action_intent = using
@@ -82,14 +91,6 @@
mymob.hands.name = "module"
mymob.hands.screen_loc = ui_borg_module
-//Module Panel
- using = new /obj/screen()
- using.name = "panel"
- using.icon = 'icons/mob/screen1_robot.dmi'
- using.icon_state = "panel"
- using.screen_loc = ui_borg_panel
- using.layer = 19
- src.adding += using
//Store
mymob.throw_icon = new /obj/screen()
@@ -153,18 +154,90 @@
if (mymob.client.target_can_click)
mymob.item_use_icon.dir = 1
src.adding += mymob.item_use_icon
- mymob.gun_move_icon = new /obj/screen/gun/move(null)
+ /*mymob.gun_move_icon = new /obj/screen/gun/move(null)
if (mymob.client.target_can_move)
mymob.gun_move_icon.dir = 1
mymob.gun_run_icon = new /obj/screen/gun/run(null)
if (mymob.client.target_can_run)
mymob.gun_run_icon.dir = 1
src.adding += mymob.gun_run_icon
- src.adding += mymob.gun_move_icon
+ src.adding += mymob.gun_move_icon*/
mymob.client.screen = null
- mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, mymob.gun_setting_icon) //, mymob.rest, mymob.sleep, mymob.mach )
+ mymob.client.screen += list(mymob.zone_sel, mymob.oxygen, mymob.fire, mymob.hands, mymob.healths, mymob:cells, mymob.pullin, mymob.blind, mymob.flash, mymob.gun_setting_icon) //, mymob.rest, mymob.sleep, mymob.mach )
mymob.client.screen += src.adding + src.other
return
+
+
+/datum/hud/proc/toggle_show_robot_modules()
+ if(!isrobot(mymob)) return
+
+ var/mob/living/silicon/robot/r = mymob
+
+ r.shown_robot_modules = !r.shown_robot_modules
+ update_robot_modules_display()
+
+/datum/hud/proc/update_robot_modules_display()
+ if(!isrobot(mymob)) return
+
+ var/mob/living/silicon/robot/r = mymob
+
+ if(r.shown_robot_modules)
+ //Modules display is shown
+ r.client.screen += r.throw_icon //"store" icon
+
+ if(!r.module)
+ usr << "\red No module selected"
+ return
+
+ if(!r.module.modules)
+ usr << "\red Selected module has no modules to select"
+ return
+
+ if(!r.robot_modules_background)
+ return
+
+ var/display_rows = round((r.module.modules.len) / 8) +1 //+1 because round() returns floor of number
+ r.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7"
+ r.client.screen += r.robot_modules_background
+
+ var/x = -4 //Start at CENTER-4,SOUTH+1
+ var/y = 1
+
+ //Unfortunately adding the emag module to the list of modules has to be here. This is because a borg can
+ //be emagged before they actually select a module. - or some situation can cause them to get a new module
+ // - or some situation might cause them to get de-emagged or something.
+ if(r.emagged)
+ if(!(r.module.emag in r.module.modules))
+ r.module.modules.Add(r.module.emag)
+ else
+ if(r.module.emag in r.module.modules)
+ r.module.modules.Remove(r.module.emag)
+
+ for(var/atom/movable/A in r.module.modules)
+ if( (A != r.module_state_1) && (A != r.module_state_2) && (A != r.module_state_3) )
+ //Module is not currently active
+ r.client.screen += A
+ if(x < 0)
+ A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7"
+ else
+ A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7"
+ A.layer = 20
+
+ x++
+ if(x == 4)
+ x = -4
+ y++
+
+ else
+ //Modules display is hidden
+ r.client.screen -= r.throw_icon //"store" icon
+
+ for(var/atom/A in r.module.modules)
+ if( (A != r.module_state_1) && (A != r.module_state_2) && (A != r.module_state_3) )
+ //Module is not currently active
+ r.client.screen -= A
+ r.shown_robot_modules = 0
+ r.client.screen -= r.robot_modules_background
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 02929525..69dcde47 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -370,10 +370,12 @@
usr.drop_item_v()
if("module")
- if(issilicon(usr))
- if(usr:module)
+ if(isrobot(usr))
+ var/mob/living/silicon/robot/R = usr
+ if(R.module)
+ R.hud_used.toggle_show_robot_modules()
return 1
- usr:pick_module()
+ R.pick_module()
if("radio")
if(issilicon(usr))
@@ -386,6 +388,11 @@
if(issilicon(usr))
usr:uneq_active()
+ if("Toggle Sensor Augmentation")
+ if(isrobot(usr))
+ var/mob/living/silicon/robot/R = usr
+ R.sensor_mode()
+
if("module1")
if(istype(usr, /mob/living/silicon/robot))
usr:toggle_module(1)
@@ -455,7 +462,85 @@
if("Toggle Gun Mode")
usr.client.ToggleGunMode()
+
+ if("AI Core")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ AI.view_core()
+
+ if("Show Camera List")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ var/camera = input(AI) in AI.get_camera_list()
+ AI.ai_camera_list(camera)
+
+ if("Track With Camera")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ var/target_name = input(AI) in AI.trackable_mobs()
+ AI.ai_camera_track(target_name)
+
+ if("Toggle Camera Light")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ AI.toggle_camera_light()
+
+ if("Crew Monitoring")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ AI.nano_crew_monitor()
+
+ if("Show Crew Manifest")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ AI.ai_roster()
+
+ if("Show Alerts")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ AI.ai_alerts()
+
+ if("Announcement")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ AI.ai_announcement()
+
+ if("Call Emergency Shuttle")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ AI.ai_call_shuttle()
+
+ if("State Laws")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ AI.checklaws()
+
+ if("PDA - Send Message")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ AI.aiPDA.cmd_send_pdamesg(usr)
+
+ if("PDA - Show Message Log")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ AI.aiPDA.cmd_show_message_log(usr)
+
+ if("Take Image")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ AI.aiCamera.toggle_camera_mode()
+
+ if("View Images")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ AI.aiCamera.viewpictures()
+
+ if("Set Sensor Augmentation")
+ if(isAI(usr))
+ var/mob/living/silicon/ai/AI = usr
+ AI.sensor_mode()
+
else
return 0
return 1
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 1b87ddc6..8570fb0b 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -180,6 +180,14 @@
user.put_in_active_hand(src)
return
+/obj/item/attack_ai(mob/user as mob)
+ if (istype(src.loc, /obj/item/weapon/robot_module))
+ //If the item is part of a cyborg module, equip it
+ if(!isrobot(user)) return
+ var/mob/living/silicon/robot/R = user
+ R.activate_module(src)
+ R.hud_used.update_robot_modules_display()
+
// Due to storage type consolidation this should get used more now.
// I have cleaned it up a little, but it could probably use more. -Sayu
/obj/item/attackby(obj/item/weapon/W as obj, mob/user as mob)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index c31aebbb..c0c6208e 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -502,13 +502,15 @@
return istype(H.glasses, /obj/item/clothing/glasses/hud/health)
else
return 0
- else if(istype(M, /mob/living/silicon/robot))
- var/mob/living/silicon/robot/R = M
+ else if(istype(M, /mob/living/silicon))
+ var/mob/living/silicon/R = M
switch(hudtype)
if("security")
- return istype(R.module_state_1, /obj/item/borg/sight/hud/sec) || istype(R.module_state_2, /obj/item/borg/sight/hud/sec) || istype(R.module_state_3, /obj/item/borg/sight/hud/sec)
+ if(R.sensor_mode == 1)
+ return 1
if("medical")
- return istype(R.module_state_1, /obj/item/borg/sight/hud/med) || istype(R.module_state_2, /obj/item/borg/sight/hud/med) || istype(R.module_state_3, /obj/item/borg/sight/hud/med)
+ if(R.sensor_mode == 2)
+ return 1
else
return 0
else
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index b4495d47..7ea6ca75 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -724,7 +724,11 @@ var/list/ai_verbs_default = list(
else
lightNearbyCamera()
-
+/mob/living/silicon/ai/proc/sensor_mode()
+ set name = "Set Sensor Augmentation"
+ set desc = "Augment visual feed with internal sensor overlays."
+ set category = "AI Commands"
+ toggle_sensor_mode()
// Handled camera lighting, when toggled.
// It will get the nearest camera from the eyeobj, lighting it.
diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm
index 5fe31ac3..11457dee 100644
--- a/code/modules/mob/living/silicon/ai/life.dm
+++ b/code/modules/mob/living/silicon/ai/life.dm
@@ -172,6 +172,12 @@
src.show_laws()
sleep(50)
theAPC = null
+ regular_hud_updates()
+ switch(src.sensor_mode)
+ if (SEC_HUD)
+ process_sec_hud(src,1,src.eyeobj)
+ if (MED_HUD)
+ process_med_hud(src,1,src.eyeobj)
/mob/living/silicon/ai/updatehealth()
if(status_flags & GODMODE)
diff --git a/code/modules/mob/living/silicon/ai/nano.dm b/code/modules/mob/living/silicon/ai/nano.dm
new file mode 100644
index 00000000..9fab4365
--- /dev/null
+++ b/code/modules/mob/living/silicon/ai/nano.dm
@@ -0,0 +1,11 @@
+var/obj/nano_module/crew_monitor/crew_monitor
+
+/mob/living/silicon/ai/proc/init_subsystems()
+ crew_monitor = new(src)
+
+/mob/living/silicon/ai/proc/nano_crew_monitor()
+ set category = "AI Commands"
+ set name = "Crew Monitor"
+ if (!crew_monitor)
+ init_subsystems()
+ crew_monitor.ui_interact(usr)
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/inventory.dm b/code/modules/mob/living/silicon/robot/inventory.dm
index 35ce156b..1c310d63 100644
--- a/code/modules/mob/living/silicon/robot/inventory.dm
+++ b/code/modules/mob/living/silicon/robot/inventory.dm
@@ -5,67 +5,77 @@
/mob/living/silicon/robot/get_active_hand()
return module_active
+
+
/*-------TODOOOOOOOOOO--------*/
-/mob/living/silicon/robot/proc/uneq_active()
- if(isnull(module_active))
- return
- if(module_state_1 == module_active)
- if(istype(module_state_1,/obj/item/borg/sight))
- sight_mode &= ~module_state_1:sight_mode
- if (client)
- client.screen -= module_state_1
- contents -= module_state_1
+/mob/living/silicon/robot/proc/uneq_module(obj/item/O)
+ if(!O)
+ return 0
+
+ if(istype(O,/obj/item/borg/sight))
+ var/obj/item/borg/sight/S = O
+ sight_mode &= ~S.sight_mode
+ else if(istype(O, /obj/item/device/flashlight))
+ var/obj/item/device/flashlight/F = O
+ if(F.on)
+ F.on = 0
+ F.update_brightness(src)
+ if(client)
+ client.screen -= O
+ contents -= O
+ if(module)
+ O.loc = module //Return item to module so it appears in its contents, so it can be taken out again.
+
+ if(module_active == O)
module_active = null
- module_state_1 = null
+ if(module_state_1 == O)
inv1.icon_state = "inv1"
- else if(module_state_2 == module_active)
- if(istype(module_state_2,/obj/item/borg/sight))
- sight_mode &= ~module_state_2:sight_mode
- if (client)
- client.screen -= module_state_2
- contents -= module_state_2
- module_active = null
- module_state_2 = null
+ module_state_1 = null
+ else if(module_state_2 == O)
inv2.icon_state = "inv2"
- else if(module_state_3 == module_active)
- if(istype(module_state_3,/obj/item/borg/sight))
- sight_mode &= ~module_state_3:sight_mode
- if (client)
- client.screen -= module_state_3
- contents -= module_state_3
- module_active = null
+ module_state_2 = null
+ else if(module_state_3 == O)
module_state_3 = null
inv3.icon_state = "inv3"
- updateicon()
+ return 1
+
+/mob/living/silicon/robot/proc/activate_module(var/obj/item/O)
+ if(!(locate(O) in src.module.modules) && O != src.module.emag)
+ return
+ if(activated(O))
+ src << "Already activated"
+ return
+ if(!module_state_1)
+ module_state_1 = O
+ O.layer = 20
+ O.screen_loc = inv1.screen_loc
+ contents += O
+ if(istype(module_state_1,/obj/item/borg/sight))
+ sight_mode |= module_state_1:sight_mode
+ else if(!module_state_2)
+ module_state_2 = O
+ O.layer = 20
+ O.screen_loc = inv2.screen_loc
+ contents += O
+ if(istype(module_state_2,/obj/item/borg/sight))
+ sight_mode |= module_state_2:sight_mode
+ else if(!module_state_3)
+ module_state_3 = O
+ O.layer = 20
+ O.screen_loc = inv3.screen_loc
+ contents += O
+ if(istype(module_state_3,/obj/item/borg/sight))
+ sight_mode |= module_state_3:sight_mode
+ else
+ src << "You need to disable a module first!"
+
+/mob/living/silicon/robot/proc/uneq_active()
+ uneq_module(module_active)
/mob/living/silicon/robot/proc/uneq_all()
- module_active = null
-
- if(module_state_1)
- if(istype(module_state_1,/obj/item/borg/sight))
- sight_mode &= ~module_state_1:sight_mode
- if (client)
- client.screen -= module_state_1
- contents -= module_state_1
- module_state_1 = null
- inv1.icon_state = "inv1"
- if(module_state_2)
- if(istype(module_state_2,/obj/item/borg/sight))
- sight_mode &= ~module_state_2:sight_mode
- if (client)
- client.screen -= module_state_2
- contents -= module_state_2
- module_state_2 = null
- inv2.icon_state = "inv2"
- if(module_state_3)
- if(istype(module_state_3,/obj/item/borg/sight))
- sight_mode &= ~module_state_3:sight_mode
- if (client)
- client.screen -= module_state_3
- contents -= module_state_3
- module_state_3 = null
- inv3.icon_state = "inv3"
- updateicon()
+ uneq_module(module_state_1)
+ uneq_module(module_state_2)
+ uneq_module(module_state_3)
/mob/living/silicon/robot/proc/activated(obj/item/O)
if(module_state_1 == O)
diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm
index 3913577e..18d6294f 100644
--- a/code/modules/mob/living/silicon/robot/life.dm
+++ b/code/modules/mob/living/silicon/robot/life.dm
@@ -168,7 +168,14 @@
client.images.Remove(hud)
var/obj/item/borg/sight/hud/hud = (locate(/obj/item/borg/sight/hud) in src)
- if(hud && hud.hud) hud.hud.process_hud(src)
+ if(hud && hud.hud)
+ hud.hud.process_hud(src)
+ else
+ switch(src.sensor_mode)
+ if (SEC_HUD)
+ process_sec_hud(src,1)
+ if (MED_HUD)
+ process_med_hud(src,1)
if (src.healths)
if (src.stat != 2)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index bf1532c0..ffa9d2df 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -18,6 +18,9 @@
var/obj/screen/inv1 = null
var/obj/screen/inv2 = null
var/obj/screen/inv3 = null
+
+ var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not
+ var/obj/screen/robot_modules_background
//3 Modules can be activated at any one time.
var/obj/item/weapon/robot_module/module = null
@@ -73,6 +76,10 @@
add_language("Robot Talk", 1)
+ robot_modules_background = new()
+ robot_modules_background.icon_state = "block"
+ robot_modules_background.layer = 19 //Objects that appear on screen are on layer 20, UI should be just below it.
+
ident = rand(1, 999)
updatename("Default")
updateicon()
@@ -425,6 +432,12 @@
updatehealth()
return 1
return 0
+
+/mob/living/silicon/robot/proc/sensor_mode()
+ set name = "Set Sensor Augmentation"
+ set desc = "Augment visual feed with internal sensor overlays."
+ set category = "Robot Commands"
+ toggle_sensor_mode()
// this function shows information about the malf_ai gameplay type in the status screen
/mob/living/silicon/robot/show_malf_ai()
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index ca4fadba..dd7bb964 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -1,3 +1,6 @@
+#define SEC_HUD 1 //Security HUD mode
+#define MED_HUD 2 //Medical HUD mode
+
/mob/living/silicon
gender = NEUTER
voice_name = "synthesized voice"
@@ -11,6 +14,7 @@
var/speak_statement = "states"
var/speak_exclamation = "declares"
var/speak_query = "queries"
+ var/sensor_mode = 0 //Determines the current HUD.
var/pose //Yes, now AIs can pose too.
var/obj/item/device/camera/siliconcam/aiCamera = null //photography
var/local_transmit //If set, can only speak to others of the same type within a short range.
@@ -204,4 +208,17 @@
flavor_text = copytext(sanitize(input(usr, "Please enter your new flavour text.", "Flavour text", null) as text), 1)
/mob/living/silicon/binarycheck()
- return 1
\ No newline at end of file
+ return 1
+
+/mob/living/silicon/proc/toggle_sensor_mode()
+ var/sensor_type = input("Please select sensor type.", "Sensor Integration", null) in list("Security", "Medical","Disable")
+ switch(sensor_type)
+ if ("Security")
+ sensor_mode = SEC_HUD
+ src << "Security records overlay enabled."
+ if ("Medical")
+ sensor_mode = MED_HUD
+ src << "Life signs monitor overlay enabled."
+ if ("Disable")
+ sensor_mode = 0
+ src << "Sensor augmentations disabled."
diff --git a/icons/mob/screen_ai.dmi b/icons/mob/screen_ai.dmi
new file mode 100644
index 00000000..ad813aad
Binary files /dev/null and b/icons/mob/screen_ai.dmi differ