diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm
index 17ee5ed672..5a8e31c324 100644
--- a/code/modules/client/preference_setup/preference_setup.dm
+++ b/code/modules/client/preference_setup/preference_setup.dm
@@ -304,3 +304,7 @@
if(PREF_FBP_SOFTWARE)
return 150
return S.max_age // welp
+
+#undef PREF_FBP_CYBORG
+#undef PREF_FBP_POSI
+#undef PREF_FBP_SOFTWARE
diff --git a/code/modules/client/preference_setup/vore/09_misc.dm b/code/modules/client/preference_setup/vore/09_misc.dm
index 19fd61011a..bde733d4c8 100644
--- a/code/modules/client/preference_setup/vore/09_misc.dm
+++ b/code/modules/client/preference_setup/vore/09_misc.dm
@@ -5,20 +5,22 @@
/datum/category_item/player_setup_item/vore/misc/load_character(var/savefile/S)
S["show_in_directory"] >> pref.show_in_directory
S["directory_tag"] >> pref.directory_tag
- S["directory_erptag"] >> pref.directory_erptag
+ S["directory_erptag"] >> pref.directory_erptag
S["directory_ad"] >> pref.directory_ad
S["sensorpref"] >> pref.sensorpref
S["capture_crystal"] >> pref.capture_crystal
S["auto_backup_implant"] >> pref.auto_backup_implant
+ S["borg_petting"] >> pref.borg_petting
/datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S)
S["show_in_directory"] << pref.show_in_directory
S["directory_tag"] << pref.directory_tag
- S["directory_erptag"] << pref.directory_erptag
+ S["directory_erptag"] << pref.directory_erptag
S["directory_ad"] << pref.directory_ad
S["sensorpref"] << pref.sensorpref
S["capture_crystal"] << pref.capture_crystal
S["auto_backup_implant"] << pref.auto_backup_implant
+ S["borg_petting"] << pref.borg_petting
/datum/category_item/player_setup_item/vore/misc/copy_to_mob(var/mob/living/carbon/human/character)
if(pref.sensorpref > 5 || pref.sensorpref < 1)
@@ -29,10 +31,11 @@
/datum/category_item/player_setup_item/vore/misc/sanitize_character()
pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory))
pref.directory_tag = sanitize_inlist(pref.directory_tag, GLOB.char_directory_tags, initial(pref.directory_tag))
- pref.directory_erptag = sanitize_inlist(pref.directory_erptag, GLOB.char_directory_erptags, initial(pref.directory_erptag))
+ pref.directory_erptag = sanitize_inlist(pref.directory_erptag, GLOB.char_directory_erptags, initial(pref.directory_erptag))
pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref))
pref.capture_crystal = sanitize_integer(pref.capture_crystal, 0, 1, initial(pref.capture_crystal))
- pref.auto_backup_implant = sanitize_integer(pref.auto_backup_implant, 0, 1, initial(pref.auto_backup_implant))
+ pref.auto_backup_implant = sanitize_integer(pref.auto_backup_implant, 0, 1, initial(pref.auto_backup_implant))
+ pref.borg_petting = sanitize_integer(pref.borg_petting, 0, 1, initial(pref.borg_petting))
/datum/category_item/player_setup_item/vore/misc/content(var/mob/user)
. += "
"
@@ -43,6 +46,7 @@
. += "Suit Sensors Preference: [sensorpreflist[pref.sensorpref]]
"
. += "Capture Crystal Preference: [pref.capture_crystal ? "Yes" : "No"]
"
. += "Spawn With Backup Implant: [pref.auto_backup_implant ? "Yes" : "No"]
"
+ . += "Allow petting as robot: [pref.borg_petting ? "Yes" : "No"]
"
/datum/category_item/player_setup_item/vore/misc/OnTopic(var/href, var/list/href_list, var/mob/user)
if(href_list["toggle_show_in_directory"])
@@ -77,4 +81,7 @@
else if(href_list["toggle_implant"])
pref.auto_backup_implant = pref.auto_backup_implant ? 0 : 1;
return TOPIC_REFRESH
+ else if(href_list["toggle_borg_petting"])
+ pref.borg_petting = pref.borg_petting ? 0 : 1;
+ return TOPIC_REFRESH
return ..();
diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm
index 99e8103509..79079354e4 100644
--- a/code/modules/client/preferences_vr.dm
+++ b/code/modules/client/preferences_vr.dm
@@ -6,6 +6,7 @@
var/sensorpref = 5 //Set character's suit sensor level
var/capture_crystal = 1 //Whether or not someone is able to be caught with capture crystals
var/auto_backup_implant = FALSE //Whether someone starts with a backup implant or not.
+ var/borg_petting = TRUE //Whether someone can be petted as a borg or not.
var/job_talon_high = 0
var/job_talon_med = 0
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 83b25ea037..a82a7f572a 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -96,7 +96,7 @@
var/lockcharge //Used when looking to see if a borg is locked down.
var/lockdown = 0 //Controls whether or not the borg is actually locked down.
var/speed = 0 //Cause sec borgs gotta go fast //No they dont!
- var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them.
+ var/scrambledcodes = 0 // Used to determine if a borg shows up on the robotics console. Setting to one hides them.
var/tracking_entities = 0 //The number of known entities currently accessing the internal camera
var/braintype = "Cyborg"
@@ -164,15 +164,15 @@
add_robot_verbs()
- hud_list[HEALTH_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_HEALTH)
- hud_list[STATUS_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudhealth100", plane = PLANE_CH_STATUS)
- hud_list[LIFE_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudhealth100", plane = PLANE_CH_LIFE)
- hud_list[ID_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_ID)
- hud_list[WANTED_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_WANTED)
- hud_list[IMPLOYAL_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_IMPLOYAL)
- hud_list[IMPCHEM_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_IMPCHEM)
- hud_list[IMPTRACK_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_IMPTRACK)
- hud_list[SPECIALROLE_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_SPECIAL)
+ hud_list[HEALTH_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_HEALTH)
+ hud_list[STATUS_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudhealth100", plane = PLANE_CH_STATUS)
+ hud_list[LIFE_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudhealth100", plane = PLANE_CH_LIFE)
+ hud_list[ID_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_ID)
+ hud_list[WANTED_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_WANTED)
+ hud_list[IMPLOYAL_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_IMPLOYAL)
+ hud_list[IMPCHEM_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_IMPCHEM)
+ hud_list[IMPTRACK_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_IMPTRACK)
+ hud_list[SPECIALROLE_HUD] = gen_hud_image('icons/mob/hud.dmi', src, "hudblank", plane = PLANE_CH_SPECIAL)
/mob/living/silicon/robot/LateInitialize()
. = ..()
@@ -518,14 +518,14 @@
// function to toggle VTEC once installed
/mob/living/silicon/robot/proc/toggle_vtec()
- set name = "Toggle VTEC"
- set category = "Abilities"
- if(speed == -1)
- to_chat(src, "VTEC module disabled.")
- speed = 0
- else
- to_chat(src, "VTEC module enabled.")
- speed = -1
+ set name = "Toggle VTEC"
+ set category = "Abilities"
+ if(speed == -1)
+ to_chat(src, "VTEC module disabled.")
+ speed = 0
+ else
+ to_chat(src, "VTEC module enabled.")
+ speed = -1
// update the status screen display
/mob/living/silicon/robot/Stat()
@@ -813,7 +813,7 @@
modtype = initial(modtype)
hands.icon_state = get_hud_module_icon()
if(notify)
- notify_ai(ROBOT_NOTIFICATION_MODULE_RESET, module.name)
+ notify_ai(ROBOT_NOTIFICATION_MODULE_RESET, module.name)
module.Reset(src)
module.Destroy()
module = null
@@ -842,11 +842,15 @@
if(istype(user,/mob/living/carbon/human) && !opened)
var/mob/living/carbon/human/H = user
- //Adding borg petting. Help intent pets, Disarm intent taps and Harm is punching(no damage)
+ //Adding borg petting. Help intent pets if preferences allow, Disarm intent taps and Harm is punching(no damage)
switch(H.a_intent)
if(I_HELP)
- visible_message("[H] pets [src].")
- return
+ if(client && !client.prefs.borg_petting)
+ visible_message("[H] reaches out for [src], but quickly refrains from petting.")
+ return
+ else
+ visible_message("[H] pets [src].")
+ return
if(I_HURT)
H.do_attack_animation(src)
if(H.species.can_shred(H))
@@ -1146,7 +1150,7 @@
/mob/living/silicon/robot/proc/ResetSecurityCodes()
set category = "Robot Commands"
set name = "Reset Identity Codes"
- set desc = "Scrambles your security and identification codes and resets your current buffers. Unlocks you and but permenantly severs you from your AI and the robotics console and will deactivate your camera system."
+ set desc = "Scrambles your security and identification codes and resets your current buffers. Unlocks you and permenantly severs you from your AI and the robotics console and will deactivate your camera system."
var/mob/living/silicon/robot/R = src
@@ -1331,12 +1335,23 @@
return
if(opened)//Cover is open
- if(emagged) return//Prevents the X has hit Y with Z message also you cant emag them twice
+ if(emagged)
+ if (!has_zeroth_law())
+ to_chat(user, "You assigned yourself as [src]'s operator.")
+ message_admins("[key_name_admin(user)] assigned as operator on cyborg [key_name_admin(src)]. Syndicate Operator change.")
+ log_game("[key_name(user)] assigned as operator on cyborg [key_name(src)]. Syndicate Operator change.")
+ var/datum/gender/TU = gender_datums[user.get_visible_gender()]
+ set_zeroth_law("Only [user.real_name] and people [TU.he] designate[TU.s] as being such are operatives.")
+ to_chat(src, "Obey these laws:")
+ laws.show_laws(src)
+ to_chat(src, "ALERT: [user.real_name] is your new master. Obey your new laws and [TU.his] commands.")
+ else
+ to_chat(user, "[src] already has an operator assigned.")
+ return//Prevents the X has hit Y with Z message also you cant emag them twice
if(wiresexposed)
to_chat(user, "You must close the panel first.")
return
-
// The block of code below is from TG. Feel free to replace with a better result if desired.
if(shell) // AI shells cannot be emagged, so we try to make it look like a standard reset. Smart players may see through this, however.
to_chat(user, "[src] is remotely controlled! Your emag attempt has triggered a system reset instead!")
@@ -1350,8 +1365,8 @@
lawupdate = 0
disconnect_from_ai()
to_chat(user, "You emag [src]'s interface.")
- message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.")
- log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.")
+ message_admins("[key_name_admin(user)] emagged cyborg [key_name_admin(src)]. Laws overridden.")
+ log_game("[key_name(user)] emagged cyborg [key_name(src)]. Laws overridden.")
clear_supplied_laws()
clear_inherent_laws()
laws = new /datum/ai_laws/syndicate_override
diff --git a/code/modules/mob/living/silicon/robot/syndicate.dm b/code/modules/mob/living/silicon/robot/syndicate.dm
index 286b2abf75..e776608975 100644
--- a/code/modules/mob/living/silicon/robot/syndicate.dm
+++ b/code/modules/mob/living/silicon/robot/syndicate.dm
@@ -1,6 +1,7 @@
/mob/living/silicon/robot/syndicate
lawupdate = 0
scrambledcodes = 1
+ emagged = 1
icon_state = "securityrobot"
modtype = "Security"
lawchannel = "State"