diff --git a/code/__defines/admin_vr.dm b/code/__defines/admin_vr.dm
index 83eb907f3c..40e408d3ed 100644
--- a/code/__defines/admin_vr.dm
+++ b/code/__defines/admin_vr.dm
@@ -16,5 +16,7 @@
#define MODIFIY_ROBOT_SWAP_MODULE "Swap a Robot Module"
#define MODIFIY_ROBOT_RESET_MODULE "Fully Reset Robot Module"
#define MODIFIY_ROBOT_TOGGLE_ERT "Toggle ERT Module Overwrite"
+#define MODIFIY_ROBOT_LIMIT_MODULES_ADD "Restrict Modules to"
+#define MODIFIY_ROBOT_LIMIT_MODULES_REMOVE "Remove from restricted Modules"
#define MODIFIY_ROBOT_TOGGLE_STATION_ACCESS "Toggle All Station Access Codes"
#define MODIFIY_ROBOT_TOGGLE_CENT_ACCESS "Toggle Central Access Codes"
diff --git a/code/modules/admin/verbs/modify_robot.dm b/code/modules/admin/verbs/modify_robot.dm
index 68a7263fa2..8ba307efac 100644
--- a/code/modules/admin/verbs/modify_robot.dm
+++ b/code/modules/admin/verbs/modify_robot.dm
@@ -10,11 +10,42 @@
return
if(!target.module)
- if(tgui_alert(usr, "This robot has not yet selected a module. Would you like to toggle combat module override?","Confirm",list("Yes","No"))!="Yes")
- return
- target.crisis_override = !target.crisis_override
- to_chat(usr, "You [target.crisis_override? "enabled":"disabled"] [target]'s combat module overwrite.")
- return
+ var/list/pre_modification_options = list(MODIFIY_ROBOT_TOGGLE_ERT, MODIFIY_ROBOT_LIMIT_MODULES_ADD, MODIFIY_ROBOT_LIMIT_MODULES_REMOVE)
+ while(TRUE)
+ var/pre_modification_choice = tgui_input_list(usr, "Which pre module selection edits would you like to perform form [target]","Choice", pre_modification_options)
+ if(!pre_modification_choice || pre_modification_choice == "Cancel")
+ return
+ switch(pre_modification_choice)
+ if(MODIFIY_ROBOT_TOGGLE_ERT)
+ if(tgui_alert(usr, "This robot has not yet selected a module. Would you like to toggle combat module override?","Confirm",list("Yes","No"))!="Yes")
+ continue
+ target.crisis_override = !target.crisis_override
+ to_chat(usr, "You [target.crisis_override? "enabled":"disabled"] [target]'s combat module overwrite.")
+ continue
+ if(MODIFIY_ROBOT_LIMIT_MODULES_ADD)
+ if(target.restrict_modules_to.len)
+ to_chat(usr, "[target]'s modules are already restricted. For details you can use the remove verb to show all active restrictions.")
+ var/list/possible_options = list()
+ for(var/entry in robot_modules)
+ if(!target.restrict_modules_to.Find(entry))
+ possible_options += entry
+ while(TRUE)
+ var/selected_type = tgui_input_list(usr, "Please select the module type to add to the robot's restrictions. This will limit the module choices to the added types only.", "Module types", possible_options)
+ if(!selected_type || selected_type == "Cancel")
+ break
+ possible_options -= selected_type
+ target.restrict_modules_to += selected_type
+ to_chat(usr, "You added [selected_type] to [target]'s possible modules list.")
+ continue
+ if(MODIFIY_ROBOT_LIMIT_MODULES_REMOVE)
+ while(TRUE)
+ var/selected_type = tgui_input_list(usr, "Please select the module type to remove. Removing all module types here will allow default station module selection.", "Module types", target.restrict_modules_to)
+ if(!selected_type || selected_type == "Cancel")
+ to_chat(usr, "[target] uses the default module list without special restrictions.")
+ break
+ target.restrict_modules_to -= selected_type
+ to_chat(usr, "You removed [selected_type] from [target]'s possible modules list.")
+ continue
if(!target.module.modules)
return
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index bd7f419f7f..0c0d39c4fd 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -64,6 +64,9 @@
var/sleeper_state = 0 // 0 for empty, 1 for normal, 2 for mediborg-healthy
var/scrubbing = FALSE //Floor cleaning enabled
+ // Subtype limited modules or admin restrictions
+ var/list/restrict_modules_to = list()
+
// Components are basically robot organs.
var/list/components = list()
@@ -322,15 +325,21 @@
var/list/modules = list()
//VOREStatation Edit Start: shell restrictions
if(shell)
- modules.Add(shell_module_types)
+ if(restrict_modules_to.len > 0)
+ modules.Add(restrict_modules_to)
+ else
+ modules.Add(shell_module_types)
else
- modules.Add(robot_module_types)
- if(crisis || security_level == SEC_LEVEL_RED || crisis_override)
- to_chat(src, span_red("Crisis mode active. Combat module available."))
- modules |= emergency_module_types
- for(var/module_name in whitelisted_module_types)
- if(is_borg_whitelisted(src, module_name))
- modules |= module_name
+ if(restrict_modules_to.len > 0)
+ modules.Add(restrict_modules_to)
+ else
+ modules.Add(robot_module_types)
+ if(crisis || security_level == SEC_LEVEL_RED || crisis_override)
+ to_chat(src, span_red("Crisis mode active. Combat module available."))
+ modules |= emergency_module_types
+ for(var/module_name in whitelisted_module_types)
+ if(is_borg_whitelisted(src, module_name))
+ modules |= module_name
//VOREStatation Edit End: shell restrictions
modtype = tgui_input_list(usr, "Please, select a module!", "Robot module", modules)
@@ -1249,6 +1258,8 @@
icon_selected = 1
icon_selection_tries = 0
sprite_type = robot_species
+ if(hands)
+ update_hud()
to_chat(src, "Your icon has been set. You now require a module reset to change it.")
/mob/living/silicon/robot/proc/set_default_module_icon()
diff --git a/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm b/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm
index 684dd9feee..92a0819878 100644
--- a/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm
+++ b/code/modules/mob/living/silicon/robot/subtypes/gravekeeper.dm
@@ -8,6 +8,7 @@
idcard_type = /obj/item/weapon/card/id
icon_selected = FALSE
can_be_antagged = FALSE
+ restrict_modules_to = list("Gravekeeper")
/mob/living/silicon/robot/gravekeeper/init()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
diff --git a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm
index d943a4f008..c32c8d92fc 100644
--- a/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm
+++ b/code/modules/mob/living/silicon/robot/subtypes/lost_drone.dm
@@ -7,6 +7,7 @@
braintype = "Drone"
idcard_type = /obj/item/weapon/card/id
icon_selected = FALSE
+ restrict_modules_to = list("Lost")
/mob/living/silicon/robot/lost/init()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
@@ -298,4 +299,4 @@
- return
\ No newline at end of file
+ return
diff --git a/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm b/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm
index 96dffd26e7..398c49775c 100644
--- a/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm
+++ b/code/modules/mob/living/silicon/robot/subtypes/syndicate.dm
@@ -1,11 +1,13 @@
/mob/living/silicon/robot/syndicate
lawupdate = 0
scrambledcodes = 1
+ emagged = 1
modtype = "Syndicate"
lawchannel = "State"
braintype = "Drone"
idcard_type = /obj/item/weapon/card/id/syndicate
icon_selected = FALSE
+ restrict_modules_to = list("Protector", "Mechanist", "Combat Medic")
/mob/living/silicon/robot/syndicate/init()
aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
@@ -17,7 +19,9 @@
updatename("Syndicate")
if(!cell)
- cell = new /obj/item/weapon/cell/high(src) // 15k cell, because Antag.
+ cell = new /obj/item/weapon/cell/robot_syndi(src) // 25k cell, because Antag.
+
+ // new /obj/item/weapon/robot_module/robot/syndicate(src)
laws = new /datum/ai_laws/syndicate_override()
@@ -29,17 +33,23 @@
/mob/living/silicon/robot/syndicate/protector/init()
..()
module = new /obj/item/weapon/robot_module/robot/syndicate/protector(src)
+ modtype = "Protector"
+ restrict_modules_to = list("Protector")
updatename("Protector")
/mob/living/silicon/robot/syndicate/mechanist/init()
..()
module = new /obj/item/weapon/robot_module/robot/syndicate/mechanist(src)
+ modtype = "Mechanist"
+ restrict_modules_to = list("Mechanist")
updatename("Mechanist")
/mob/living/silicon/robot/syndicate/combat_medic/init()
..()
module = new /obj/item/weapon/robot_module/robot/syndicate/combat_medic(src)
+ modtype = "Combat Medic"
+ restrict_modules_to = list("Combat Medic")
updatename("Combat Medic")
/mob/living/silicon/robot/syndicate/speech_bubble_appearance()
- return "synthetic_evil"
\ No newline at end of file
+ return "synthetic_evil"
diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm
deleted file mode 100644
index e776608975..0000000000
--- a/code/modules/mob/living/silicon/robot/syndicate.dm
+++ /dev/null
@@ -1,27 +0,0 @@
-/mob/living/silicon/robot/syndicate
- lawupdate = 0
- scrambledcodes = 1
- emagged = 1
- icon_state = "securityrobot"
- modtype = "Security"
- lawchannel = "State"
- idcard_type = /obj/item/weapon/card/id/syndicate
-
-/mob/living/silicon/robot/syndicate/New()
- if(!cell)
- cell = new /obj/item/weapon/cell/robot_syndi(src)
-
- ..()
-
-/mob/living/silicon/robot/syndicate/init()
- aiCamera = new/obj/item/device/camera/siliconcam/robot_camera(src)
-
- laws = new /datum/ai_laws/syndicate_override
- cut_overlays()
- init_id()
- new /obj/item/weapon/robot_module/robot/syndicate(src)
-
- radio.keyslot = new /obj/item/device/encryptionkey/syndicate(radio)
- radio.recalculateChannels()
-
- playsound(src, 'sound/mecha/nominalsyndi.ogg', 75, 0)
diff --git a/icons/mob/screen1_robot.dmi b/icons/mob/screen1_robot.dmi
index ace4689169..98f475349c 100644
Binary files a/icons/mob/screen1_robot.dmi and b/icons/mob/screen1_robot.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 15e750461c..d67e258c6b 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -3042,7 +3042,6 @@
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "code\modules\mob\living\silicon\robot\robot_remote_control.dm"
#include "code\modules\mob\living\silicon\robot\robot_vr.dm"
-#include "code\modules\mob\living\silicon\robot\syndicate.dm"
#include "code\modules\mob\living\silicon\robot\dogborg\dog_modules_vr.dm"
#include "code\modules\mob\living\silicon\robot\dogborg\dog_sleeper_vr.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone.dm"