diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index cf8927dec2b..9e35fb42c4e 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -705,45 +705,7 @@
U.detach_accessory(A, usr)
if(href_list["criminal"])
- if(hasHUD(usr, EXAMINE_HUD_SECURITY_WRITE))
- if(usr.incapacitated())
- return
- var/found_record = 0
- var/perpname = get_visible_name(TRUE)
-
- if(perpname != "Unknown")
- for(var/datum/data/record/E in GLOB.data_core.general)
- if(E.fields["name"] == perpname)
- for(var/datum/data/record/R in GLOB.data_core.security)
- if(R.fields["id"] == E.fields["id"])
-
- var/setcriminal = input(usr, "Specify a new criminal status for this person.", "Security HUD", R.fields["criminal"]) in list(SEC_RECORD_STATUS_NONE, SEC_RECORD_STATUS_ARREST, SEC_RECORD_STATUS_SEARCH, SEC_RECORD_STATUS_MONITOR, SEC_RECORD_STATUS_DEMOTE, SEC_RECORD_STATUS_INCARCERATED, SEC_RECORD_STATUS_PAROLLED, SEC_RECORD_STATUS_RELEASED, "Cancel")
- var/t1 = copytext(trim(sanitize(input("Enter Reason:", "Security HUD", null, null) as text)), 1, MAX_MESSAGE_LEN)
- if(!t1)
- t1 = "(none)"
-
- if(hasHUD(usr, EXAMINE_HUD_SECURITY_WRITE) && setcriminal != "Cancel")
- found_record = 1
- if(R.fields["criminal"] == SEC_RECORD_STATUS_EXECUTE)
- to_chat(usr, "Unable to modify the sec status of a person with an active Execution order. Use a security computer instead.")
- else
- var/rank
- if(ishuman(usr))
- var/mob/living/carbon/human/U = usr
- rank = U.get_assignment()
- else if(isrobot(usr))
- var/mob/living/silicon/robot/U = usr
- rank = "[U.modtype] [U.braintype]"
- else if(isAI(usr))
- rank = "AI"
- set_criminal_status(usr, R, setcriminal, t1, rank)
- break // Git out of the securiy records loop!
- if(found_record)
- break // Git out of the general records
-
- if(!found_record)
- to_chat(usr, "Unable to locate a data core entry for this person.")
-
+ try_set_criminal_status(usr)
if(href_list["secrecord"])
if(hasHUD(usr, EXAMINE_HUD_SECURITY_READ))
if(usr.incapacitated())
@@ -908,6 +870,69 @@
src.examinate(M)
. = ..()
+/mob/living/carbon/human/proc/try_set_criminal_status(mob/user)
+ if(!hasHUD(user, EXAMINE_HUD_SECURITY_WRITE))
+ return
+ if(user.incapacitated())
+ return
+
+ var/perpname = get_visible_name(TRUE)
+ if(perpname == "Unknown")
+ to_chat(user, "Unable to locate a record for this person.")
+ return
+
+ var/datum/data/record/found_record
+ outer:
+ for(var/datum/data/record/E in GLOB.data_core.general)
+ if(E.fields["name"] == perpname)
+ for(var/datum/data/record/R in GLOB.data_core.security)
+ if(R.fields["id"] == E.fields["id"])
+ found_record = R
+ break outer
+
+ if(!found_record)
+ to_chat(user, "Unable to locate a record for this person.")
+ return
+
+ if(found_record.fields["criminal"] == SEC_RECORD_STATUS_EXECUTE)
+ to_chat(user, "Unable to modify the criminal status of a person with an active Execution order. Use a security computer instead.")
+ return
+
+ var/static/list/possible_status = list(
+ SEC_RECORD_STATUS_NONE,
+ SEC_RECORD_STATUS_ARREST,
+ SEC_RECORD_STATUS_SEARCH,
+ SEC_RECORD_STATUS_MONITOR,
+ SEC_RECORD_STATUS_DEMOTE,
+ SEC_RECORD_STATUS_INCARCERATED,
+ SEC_RECORD_STATUS_PAROLLED,
+ SEC_RECORD_STATUS_RELEASED,
+ )
+
+ var/new_status = input(user, "Set the new criminal status for [perpname].", "Security HUD", found_record.fields["criminal"]) as null|anything in possible_status
+ if(!new_status)
+ return
+
+ var/reason = copytext(trim(sanitize(input(user, "Enter reason:", "Security HUD") as text)), 1, MAX_MESSAGE_LEN)
+ if(!reason)
+ reason = "(none)"
+
+ if(!hasHUD(user, EXAMINE_HUD_SECURITY_WRITE))
+ return
+ if(found_record.fields["criminal"] == SEC_RECORD_STATUS_EXECUTE)
+ to_chat(user, "Unable to modify the criminal status of a person with an active Execution order. Use a security computer instead.")
+ return
+ var/rank
+ if(ishuman(user))
+ var/mob/living/carbon/human/U = user
+ rank = U.get_assignment()
+ else if(isrobot(user))
+ var/mob/living/silicon/robot/U = user
+ rank = "[U.modtype] [U.braintype]"
+ else if(isAI(user))
+ rank = "AI"
+ set_criminal_status(user, found_record, new_status, reason, rank)
+
///check_eye_prot()
///Returns a number between -1 to 2