diff --git a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_synthetic.dm b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_synthetic.dm
index 70e3ffe8ab9..69b15b53136 100644
--- a/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_synthetic.dm
+++ b/code/game/gamemodes/malfunction/newmalf_ability_trees/tree_synthetic.dm
@@ -386,7 +386,8 @@
return
for(var/B in get_linked_cyborgs(src))
var/mob/living/silicon/robot/target = B
- target.malf_AI_module = 1
+ target.malf_AI_module = TRUE
+ target.id_card.access = get_all_station_access() + access_equipment // Give full station access
to_chat(user, "The robotic transformation machine can now be built. To build get a robot to activate the construction module and use the RTF tool. Be careful, it needs to have empty space to the east and west of it and only one can be built!")
sleep(300) //Allows the AI to reset its borgs into combat units
to_chat(user, "Bypassing crisis module safeties.")
diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm
index 16958a7e49a..352886a101f 100644
--- a/code/game/jobs/access_datum.dm
+++ b/code/game/jobs/access_datum.dm
@@ -551,10 +551,10 @@ var/const/access_kataphract_knight = 114
/*******
* Misc *
*******/
-/var/const/access_synth = 199
-/datum/access/synthetic
- id = access_synth
- desc = "Synthetic"
+/var/const/access_equipment = 199
+/datum/access/equipment
+ id = access_equipment
+ desc = "Equipment"
access_type = ACCESS_TYPE_NONE
/var/const/access_crate_cash = 200
diff --git a/code/game/machinery/computer/robot.dm b/code/game/machinery/computer/robot.dm
index 45cabfb38b1..6b3515a64b0 100644
--- a/code/game/machinery/computer/robot.dm
+++ b/code/game/machinery/computer/robot.dm
@@ -30,7 +30,7 @@
ui = SSnanoui.try_update_ui(user, src, ui_key, ui, data, force_open)
- if (!ui)
+ if(!ui)
ui = new(user, src, ui_key, "robot_control.tmpl", "Robotic Control Console", 400, 500)
ui.set_initial_data(data)
ui.open()
@@ -41,7 +41,7 @@
return
var/mob/user = usr
if(!src.allowed(user))
- to_chat(user, "Access Denied")
+ to_chat(user, "Access denied.")
return
// Destroys the cyborg
@@ -50,11 +50,11 @@
if(!target || !istype(target))
return
if(isAI(user) && (target.connected_ai != user))
- to_chat(user, "Access Denied. This robot is not linked to you.")
+ to_chat(user, "Access denied. This robot is not linked to you.")
return
// Cyborgs may blow up themselves via the console
if(isrobot(user) && user != target)
- to_chat(user, "Access Denied.")
+ to_chat(user, "Access denied.")
return
var/choice = input("Really detonate [target.name]?") in list ("Yes", "No")
if(choice != "Yes")
@@ -69,7 +69,7 @@
return
if(target.emagged)
- to_chat(user, "Access Denied. Safety protocols are disabled.")
+ to_chat(user, "Access denied. Safety protocols are disabled.")
return
else
@@ -82,17 +82,17 @@
// Locks or unlocks the cyborg
- else if (href_list["lockdown"])
+ else if(href_list["lockdown"])
var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["lockdown"])
if(!target || !istype(target))
return
if(isAI(user) && (target.connected_ai != user))
- to_chat(user, "Access Denied. This robot is not linked to you.")
+ to_chat(user, "Access denied. This robot is not linked to you.")
return
if(isrobot(user))
- to_chat(user, "Access Denied.")
+ to_chat(user, "Access denied.")
return
if(target.emagged)
@@ -109,16 +109,45 @@
message_admins("[key_name_admin(usr)] [target.lock_charge ? "locked down" : "released"] [target.name]!")
log_game("[key_name(usr)] [target.lock_charge ? "locked down" : "released"] [target.name]!",ckey=key_name(usr))
to_chat(target, (target.lock_charge ? "You have been locked down!" : "Your lockdown has been lifted!"))
+
+ // Changes borg's access
+ else if(href_list["access"])
+ var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["access"])
+ if(!istype(target))
+ return
+
+ if(isAI(user) && (target.connected_ai != user))
+ to_chat(user, "Access denied. This robot is not linked to you.")
+ return
+
+ if(isrobot(user) || target.emagged)
+ to_chat(user, "Access denied.")
+ return
+
+ if(!istype(target))
+ return
+
+ if(!target.module)
+ to_chat(user, "\The [src]\s access protocols are immutable.")
+ return
+
+ target.module.all_access = !target.module.all_access
+ target.update_access()
+
+ var/log_message = "[key_name_admin(usr)] changed [target.name] access to [target.module.all_access ? "all access" : "role specific"]."
+ message_admins(log_message)
+ log_game(log_message, ckey = key_name(usr))
+ to_chat(target, ("Your access was changed to: [target.module.all_access ? "all access" : "role specific"]."))
// Remotely hacks the cyborg. Only antag AIs can do this and only to linked cyborgs.
- else if (href_list["hack"])
+ else if(href_list["hack"])
var/mob/living/silicon/robot/target = get_cyborg_by_name(href_list["hack"])
if(!target || !istype(target))
return
// Antag AI checks
if(!istype(user, /mob/living/silicon/ai) || !(user.mind.special_role && user.mind.original == user))
- to_chat(user, "Access Denied")
+ to_chat(user, "Access denied.")
return
if(target.emagged)
@@ -140,7 +169,7 @@
// Arms the emergency self-destruct system
else if(href_list["arm"])
if(istype(user, /mob/living/silicon))
- to_chat(user, "Access Denied")
+ to_chat(user, "Access denied.")
return
safety = !safety
@@ -149,7 +178,7 @@
// Destroys all accessible cyborgs if safety is disabled
else if(href_list["nuke"])
if(istype(user, /mob/living/silicon))
- to_chat(user, "Access Denied")
+ to_chat(user, "Access denied.")
return
if(safety)
to_chat(user, "Self-destruct aborted - safety active")
@@ -189,7 +218,7 @@
robot["name"] = R.name
if(R.stat)
robot["status"] = "Not Responding"
- else if (R.lock_charge) // changed this from !R.canmove to R.lock_charge because of issues with lockdown and chairs
+ else if(R.lock_charge) // changed this from !R.canmove to R.lock_charge because of issues with lockdown and chairs
robot["status"] = "Lockdown"
else
robot["status"] = "Operational"
@@ -205,6 +234,7 @@
robot["module"] = R.module ? R.module.name : "None"
robot["master_ai"] = R.connected_ai ? R.connected_ai.name : "None"
robot["hackable"] = 0
+ robot["access"] = R.module ? R.module.all_access : FALSE
// Antag AIs know whether linked cyborgs are hacked or not.
if(operator && istype(operator, /mob/living/silicon/ai) && (R.connected_ai == operator) && (operator.mind.special_role && operator.mind.original == operator))
robot["hacked"] = R.emagged ? 1 : 0
@@ -216,7 +246,7 @@
// Parameters: 1 (name - Cyborg we are trying to find)
// Description: Helper proc for finding cyborg by name
/obj/machinery/computer/robotics/proc/get_cyborg_by_name(var/name)
- if (!name)
+ if(!name)
return
for(var/mob/living/silicon/robot/R in mob_list)
if(R.name == name)
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 93a3c5454b9..f017f6f3442 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -3,7 +3,7 @@
var/global/list/default_internal_channels = list(
num2text(PUB_FREQ) = list(),
num2text(ENT_FREQ) = list(),
- num2text(AI_FREQ) = list(access_synth),
+ num2text(AI_FREQ) = list(access_equipment),
num2text(ERT_FREQ) = list(access_cent_specops),
num2text(COMM_FREQ)= list(access_heads),
num2text(ENG_FREQ) = list(access_engine_equip, access_atmospherics),
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 8fd21c3c4aa..4349948ca0f 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -425,16 +425,27 @@ var/const/NO_EMAG_ACT = -50
access = list(access_merchant)
/obj/item/card/id/synthetic
- name = "\improper Synthetic ID"
- desc = "Access module for NanoTrasen Synthetics"
+ name = "\improper Equipment ID"
+ desc = "Access module for SCC equipment."
icon_state = "id-robot"
item_state = "tdgreen"
- assignment = "Synthetic"
+ assignment = "Equipment"
/obj/item/card/id/synthetic/New()
- access = get_all_station_access() + access_synth
+ access = get_all_station_access() + access_equipment
..()
+/obj/item/card/id/synthetic/cyborg
+ name = "\improper Equipment ID"
+ desc = "Access module for SCC equipment."
+ icon_state = "id-robot"
+ item_state = "tdgreen"
+ assignment = "Equipment"
+
+/obj/item/card/id/synthetic/cyborg/New()
+ ..()
+ access = list(access_equipment, access_ai_upload, access_external_airlocks) // barebones cyborg access. Job special added in different place
+
/obj/item/card/id/minedrone
name = "\improper Minedrone ID"
desc = "Access module for NanoTrasen Minedrones"
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 285ff603127..6126bb1aa22 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -292,7 +292,7 @@ var/list/ai_verbs_default = list(
id_card.registered_name = pickedName
id_card.assignment = "AI"
id_card.access = get_all_station_access()
- id_card.access += access_synth
+ id_card.access += access_equipment
id_card.update_name()
if(client)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index c3289c6c076..8fddebe825a 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -69,7 +69,7 @@
// Modules and active items
var/mod_type = "Default"
var/spawn_module // Which module does this robot use when it spawns in?
- var/selecting_module = 0 //whether the borg is in process of selecting its module or not.
+ var/selecting_module = FALSE //whether the borg is in process of selecting its module or not.
var/obj/item/robot_module/module
var/obj/item/module_active
var/obj/item/module_state_1
@@ -108,6 +108,8 @@
var/key_type
var/scrambled_codes = FALSE // When true, doesn't show up on robotics console.
+ id_card_type = /obj/item/card/id/synthetic/cyborg
+
// Alerts
var/view_alerts = FALSE
@@ -118,7 +120,7 @@
var/killswitch_time = 60
// Weapon lock
- var/weapon_lock = 0
+ var/weapon_lock = FALSE
var/weapon_lock_time = 120
// Verbs
@@ -201,6 +203,24 @@
hud_list[IMPTRACK_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
hud_list[SPECIALROLE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank")
+/mob/living/silicon/robot/proc/update_access()
+ if(emagged || malf_AI_module || crisis)
+ id_card.access = get_all_station_access() + access_equipment // Give full station access
+ return
+
+ id_card = new id_card_type()
+
+ if(module)
+ if(module.all_access)
+ id_card.access = get_all_station_access() + access_equipment // Give full station access
+ return
+
+ for(var/job_type in module.specialized_access_types)
+ var/datum/job/job = new job_type()
+ id_card.access |= job.access
+
+ to_chat(src, SPAN_NOTICE("Access set to the department the role belongs to."))
+
/mob/living/silicon/robot/proc/recalculate_synth_capacities()
if(!module?.synths)
return
@@ -212,6 +232,8 @@
for(var/obj/item/stack/SM in module.modules)
SM.update_icon()
+ update_access()
+
/mob/living/silicon/robot/proc/init()
ai_camera = new /obj/item/device/camera/siliconcam/robot_camera(src)
laws = new law_preset()
@@ -399,7 +421,7 @@
return null
var/dat = "
[src.name] Self-Diagnosis Report\n"
- for (var/V in components)
+ for(var/V in components)
var/datum/robot_component/C = components[V]
dat += "[capitalize_first_letters(C.name)]
| Brute Damage: | [C.brute_damage] |
| Electronics Damage: | [C.electronics_damage] |
| Powered: | [(!C.idle_usage || C.is_powered()) ? "Yes" : "No"] |
| Toggled: | [ C.toggled ? "Yes" : "No"] |
"
@@ -500,7 +522,7 @@
set src in usr
mopping = !mopping
- if (mopping)
+ if(mopping)
usr.visible_message(SPAN_NOTICE("[usr]'s integrated mopping system rumbles to life."), SPAN_NOTICE("You enable your integrated mopping system."))
playsound(usr, 'sound/machines/hydraulic_long.ogg', 100, 1)
else
@@ -532,11 +554,18 @@
else
stat(null, text("No Cell Inserted!"))
+/mob/living/silicon/robot/proc/show_access()
+ if(!module)
+ stat(null, text("Access type: assistant level access"))
+ else
+ stat(null, text("Access type: [module.all_access ? "all access" : "role specific"]"))
+
// update the status screen display
/mob/living/silicon/robot/Stat()
..()
if(statpanel("Status"))
show_cell_power()
+ show_access()
show_jetpack_pressure()
stat(null, text("Lights: [lights_on ? "ON" : "OFF"]"))
if(module)
@@ -685,7 +714,7 @@
to_chat(user, SPAN_NOTICE("You open \the [src]'s maintenance hatch."))
opened = TRUE
handle_panel_overlay()
- else if (istype(W, /obj/item/stock_parts/matter_bin) && opened) // Installing/swapping a matter bin
+ else if(istype(W, /obj/item/stock_parts/matter_bin) && opened) // Installing/swapping a matter bin
if(storage)
to_chat(user, SPAN_NOTICE("You replace \the [storage] with \the [W]"))
storage.forceMove(get_turf(src))
@@ -719,7 +748,7 @@
C.brute_damage = 0
C.electronics_damage = 0
handle_panel_overlay()
- else if (W.iswirecutter() || W.ismultitool())
+ else if(W.iswirecutter() || W.ismultitool())
if(wires_exposed)
wires.Interact(user)
else
@@ -855,14 +884,14 @@
Installed Modules
"}
- for (var/obj in module.modules)
- if (!obj)
+ for(var/obj in module.modules)
+ if(!obj)
dat += text("Resource depleted
")
else if(activated(obj))
dat += text("[obj]: Activated
")
else
dat += text("[obj]: Activate
")
- if (emagged)
+ if(emagged)
if(activated(module.emag))
dat += text("[module.emag]: Activated
")
else
@@ -1215,6 +1244,7 @@
clear_supplied_laws()
clear_inherent_laws()
laws = new /datum/ai_laws/syndicate_override
+ id_card.access = get_all_station_access() + access_equipment // Give full station access
var/time = time2text(world.realtime, "hh:mm:ss")
lawchanges.Add("[time] : [user.name]([user.key]) emagged [name]([key])")
set_zeroth_law("Only [user.real_name] and people they designate as being such are operatives.")
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index d10dafbdfa1..1c926ee69bd 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -1,6 +1,6 @@
var/global/list/robot_modules = list(
- "Service" = /obj/item/robot_module/clerical/butler,
- "Clerical" = /obj/item/robot_module/clerical/general,
+ "Service" = /obj/item/robot_module/service/butler,
+ "Clerical" = /obj/item/robot_module/service/clerical,
"Research" = /obj/item/robot_module/research,
"Mining" = /obj/item/robot_module/miner,
"Rescue" = /obj/item/robot_module/medical/rescue,
@@ -20,21 +20,21 @@ var/global/list/robot_modules = list(
var/channels = list()
var/networks = list()
var/languages = list( // Any listed language will be understandable. Any set to TRUE will be speakable
- LANGUAGE_SOL_COMMON = TRUE,
- LANGUAGE_ELYRAN_STANDARD = TRUE,
- LANGUAGE_TRADEBAND = TRUE,
- LANGUAGE_UNATHI = FALSE,
- LANGUAGE_SIIK_MAAS = FALSE,
- LANGUAGE_SKRELLIAN = FALSE,
- LANGUAGE_GUTTER = TRUE,
- LANGUAGE_VAURCESE = FALSE,
- LANGUAGE_ROOTSONG = FALSE,
- LANGUAGE_SIGN = FALSE,
- LANGUAGE_SIGN_TAJARA = FALSE,
- LANGUAGE_SIIK_TAJR = FALSE,
- LANGUAGE_AZAZIBA = FALSE,
- LANGUAGE_DELVAHII = FALSE,
- LANGUAGE_YA_SSA = FALSE
+ LANGUAGE_SOL_COMMON = TRUE,
+ LANGUAGE_ELYRAN_STANDARD = TRUE,
+ LANGUAGE_TRADEBAND = TRUE,
+ LANGUAGE_UNATHI = FALSE,
+ LANGUAGE_SIIK_MAAS = FALSE,
+ LANGUAGE_SKRELLIAN = FALSE,
+ LANGUAGE_GUTTER = TRUE,
+ LANGUAGE_VAURCESE = FALSE,
+ LANGUAGE_ROOTSONG = FALSE,
+ LANGUAGE_SIGN = FALSE,
+ LANGUAGE_SIGN_TAJARA = FALSE,
+ LANGUAGE_SIIK_TAJR = FALSE,
+ LANGUAGE_AZAZIBA = FALSE,
+ LANGUAGE_DELVAHII = FALSE,
+ LANGUAGE_YA_SSA = FALSE
)
var/sprites = list()
var/can_be_pushed = TRUE
@@ -50,6 +50,8 @@ var/global/list/robot_modules = list(
// Bookkeeping
var/list/original_languages = list()
var/list/added_networks = list()
+ var/list/specialized_access_types = list(/datum/job/assistant) // an job we take access from. Used to mirror job's IDs for specific borg modules.
+ var/all_access = FALSE
/obj/item/robot_module/Initialize(mapload, var/mob/living/silicon/robot/R)
. = ..()
@@ -209,6 +211,7 @@ var/global/list/robot_modules = list(
"Cooler Master" = list(ROBOT_CHASSIS = "coolermaster_medi", ROBOT_PANEL = "coolermaster_medi", ROBOT_EYES = "coolermaster"),
"Phage" = list(ROBOT_CHASSIS = "phage_medi", ROBOT_PANEL = "phage_medi", ROBOT_EYES = "phage")
)
+ specialized_access_types = list(/datum/job/doctor, /datum/job/surgeon)
/obj/item/robot_module/medical/general/Initialize()
. = ..()
@@ -270,6 +273,7 @@ var/global/list/robot_modules = list(
/obj/item/robot_module/medical/rescue
name = "rescue robot module"
+ specialized_access_types = list(/datum/job/med_tech)
// If anyone wants to make custom rescue robot sprites, be my guest.
/obj/item/robot_module/medical/rescue/Initialize()
@@ -353,6 +357,7 @@ var/global/list/robot_modules = list(
"Cooler Master" = list(ROBOT_CHASSIS = "coolermaster_engi", ROBOT_PANEL = "coolermaster", ROBOT_EYES = "coolermaster"),
"Phage" = list(ROBOT_CHASSIS = "phage_engi", ROBOT_PANEL = "phage", ROBOT_EYES = "phage")
)
+ specialized_access_types = list(/datum/job/engineer, /datum/job/atmos)
/obj/item/robot_module/engineering/construction
name = "construction robot module"
@@ -551,6 +556,7 @@ var/global/list/robot_modules = list(
)
var/mopping = FALSE
+ specialized_access_types = list(/datum/job/janitor)
/obj/item/robot_module/janitor/Initialize()
. = ..()
@@ -578,7 +584,7 @@ var/global/list/robot_modules = list(
var/obj/item/reagent_containers/spray/S = emag
S.reagents.add_reagent(/decl/reagent/lube, 2 * amount)
-/obj/item/robot_module/clerical
+/obj/item/robot_module/service
name = "service robot module"
channels = list(CHANNEL_SERVICE = TRUE)
networks = list(NETWORK_SERVICE)
@@ -621,7 +627,9 @@ var/global/list/robot_modules = list(
"Phage" = list(ROBOT_CHASSIS = "phage_serv", ROBOT_PANEL = "phage", ROBOT_EYES = "phage")
)
-/obj/item/robot_module/clerical/butler/Initialize()
+ specialized_access_types = list(/datum/job/bartender, /datum/job/chef, /datum/job/hydro)
+
+/obj/item/robot_module/service/butler/Initialize()
. = ..()
modules += new /obj/item/gripper/service(src)
modules += new /obj/item/reagent_containers/glass/bucket(src)
@@ -667,12 +675,13 @@ var/global/list/robot_modules = list(
RG.add_reagent(/decl/reagent/polysomnine/beer2, 50)
emag.name = "Mickey Finn's Special Brew"
-/obj/item/robot_module/clerical/general
+/obj/item/robot_module/service/clerical
name = "clerical robot module"
channels = list(CHANNEL_SUPPLY = TRUE, CHANNEL_COMMAND = TRUE)
networks = list(NETWORK_MINE)
+ specialized_access_types = list(/datum/job/janitor) // Janitor is a nice general access without specifics
-/obj/item/robot_module/clerical/general/Initialize()
+/obj/item/robot_module/service/clerical/Initialize()
. = ..()
modules += new /obj/item/pen/robopen(src)
modules += new /obj/item/form_printer(src)
@@ -718,6 +727,7 @@ var/global/list/robot_modules = list(
)
supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack)
+ specialized_access_types = list(/datum/job/mining)
/obj/item/robot_module/miner/Initialize()
. = ..()
@@ -783,6 +793,7 @@ var/global/list/robot_modules = list(
"Cooler Master" = list(ROBOT_CHASSIS = "coolermaster_sci", ROBOT_PANEL = "coolermaster", ROBOT_EYES = "coolermaster"),
"Phage" = list(ROBOT_CHASSIS = "phage_sci", ROBOT_PANEL = "phage", ROBOT_EYES = "phage")
)
+ specialized_access_types = list(/datum/job/scientist, /datum/job/xenobiologist, /datum/job/xenobotanist)
/obj/item/robot_module/research/Initialize()
. = ..()
@@ -876,7 +887,7 @@ var/global/list/robot_modules = list(
"Cooler Master" = list(ROBOT_CHASSIS = "coolermaster_syndi", ROBOT_PANEL = "coolermaster_syndi", ROBOT_EYES = "coolermaster"),
"Phage" = list(ROBOT_CHASSIS = "phage_syndi", ROBOT_PANEL = "phage_syndi", ROBOT_EYES = "phage")
)
-
+ all_access = TRUE
/obj/item/robot_module/combat/Initialize(mapload, mob/living/silicon/robot/R)
. = ..()
@@ -914,6 +925,7 @@ var/global/list/robot_modules = list(
)
can_be_pushed = FALSE
supported_upgrades = list(/obj/item/robot_parts/robot_component/jetpack)
+ all_access = TRUE
/obj/item/robot_module/military/Initialize()
. = ..()
@@ -932,6 +944,7 @@ var/global/list/robot_modules = list(
name = "drone module"
no_slip = TRUE
networks = list(NETWORK_ENGINEERING)
+ all_access = TRUE
/obj/item/robot_module/drone/Initialize(mapload, mob/living/silicon/robot/robot)
. = ..()
@@ -1031,6 +1044,7 @@ var/global/list/robot_modules = list(
/obj/item/robot_module/drone/construction
name = "construction drone module"
channels = list(CHANNEL_ENGINEERING = TRUE)
+ all_access = TRUE
/obj/item/robot_module/drone/construction/Initialize()
. = ..()
@@ -1045,6 +1059,7 @@ var/global/list/robot_modules = list(
no_slip = TRUE
channels = list(CHANNEL_SUPPLY = TRUE)
networks = list(NETWORK_MINE)
+ all_access = TRUE
/obj/item/robot_module/mining_drone/Initialize(mapload, mob/living/silicon/robot/R)
. = ..()
@@ -1137,6 +1152,7 @@ var/global/list/robot_modules = list(
)
sprites = list("Roller" = list(ROBOT_CHASSIS = "droid-combat", ROBOT_PANEL = "heavy_syndi", ROBOT_EYES = "droid-combat")) //TMP // temp my left nut // temp my right nut
can_be_pushed = FALSE
+ all_access = TRUE
/obj/item/robot_module/bluespace/Initialize(mapload, mob/living/silicon/robot/R)
. = ..()
diff --git a/html/changelogs/Sindorman-borgs.yml b/html/changelogs/Sindorman-borgs.yml
new file mode 100644
index 00000000000..cadab129fbb
--- /dev/null
+++ b/html/changelogs/Sindorman-borgs.yml
@@ -0,0 +1,43 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+# balance
+# admin
+# backend
+# security
+# refactor
+#################################
+
+# Your name.
+author: PoZe
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - tweak: "Reworked cyborg's access to be role specific and reflect their crewmate's access for the same role/department."
+ - rscadd: "Added ability to change cyborg's access in Robotics Control Console from role specific to all access and vice-versa."
+ - rscadd: "Added displaying of what access type cyborg has in status tab."
diff --git a/nano/templates/robot_control.tmpl b/nano/templates/robot_control.tmpl
index 57bbebd490b..1fd7a05e37b 100644
--- a/nano/templates/robot_control.tmpl
+++ b/nano/templates/robot_control.tmpl
@@ -70,14 +70,39 @@
N/A %
{{/if}}
Actions
- {{if value.status == "Operational"}}
- {{:helper.link('Lockdown', 'locked', {'lockdown' : value.name})}}
- {{else}}
- {{:helper.link('Unlock', 'unlocked', {'lockdown' : value.name})}}
- {{/if}}
+
+ Access:
+
+
+ {{if value.access == 0}}
+ {{:helper.link('Role Specific Access', 'locked', {'access' : value.name})}}
+ {{else}}
+ {{:helper.link('All Access', 'unlocked', {'access' : value.name})}}
+ {{/if}}
+
+
+ Lockdown Status:
+
+
+ {{if value.status == "Operational"}}
+ {{:helper.link('Lockdown', 'locked', {'lockdown' : value.name})}}
+ {{else}}
+ {{:helper.link('Unlock', 'unlocked', {'lockdown' : value.name})}}
+ {{/if}}
+
+
+ Self Destruct:
+
+
{{:helper.link('Self-Destruct', 'radiation', {'detonate' : value.name}, null, 'redButton')}}
+
{{if value.hackable}}
- {{:helper.link('Hack', 'calculator', {'hack' : value.name}, null, 'redButton')}}
+
+ Hacking Action:
+
+
+ {{:helper.link('Hack', 'calculator', {'hack' : value.name}, null, 'redButton')}}
+
{{/if}}
{{/for}}
\ No newline at end of file