diff --git a/code/__DEFINES/criminal_status.dm b/code/__DEFINES/criminal_status.dm new file mode 100644 index 00000000000..75c33909fc2 --- /dev/null +++ b/code/__DEFINES/criminal_status.dm @@ -0,0 +1,10 @@ +//criminal status defines +#define SEC_RECORD_STATUS_NONE "None" +#define SEC_RECORD_STATUS_ARREST "*Arrest*" +#define SEC_RECORD_STATUS_EXECUTE "*Execute*" +#define SEC_RECORD_STATUS_INCARCERATED "Incarcerated" +#define SEC_RECORD_STATUS_RELEASED "Released" +#define SEC_RECORD_STATUS_PAROLLED "Parolled" +#define SEC_RECORD_STATUS_DEMOTE "Demote" +#define SEC_RECORD_STATUS_SEARCH "Search" +#define SEC_RECORD_STATUS_MONITOR "Monitor" diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 6444ca32b69..f437c409088 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -244,21 +244,27 @@ proc/age2agedescription(age) var/their_rank = target_records.fields["rank"] switch(criminal_status) if("arrest") - status = "*Arrest*" + status = SEC_RECORD_STATUS_ARREST if("none") - status = "None" + status = SEC_RECORD_STATUS_NONE if("execute") if((ACCESS_MAGISTRATE in authcard_access) || (ACCESS_ARMORY in authcard_access)) - status = "*Execute*" + status = SEC_RECORD_STATUS_EXECUTE message_admins("[ADMIN_FULLMONTY(usr)] authorized EXECUTION for [their_rank] [their_name], with comment: [comment]") else return 0 + if("search") + status = SEC_RECORD_STATUS_SEARCH + if("monitor") + status = SEC_RECORD_STATUS_MONITOR + if ("demote") + status = SEC_RECORD_STATUS_DEMOTE if("incarcerated") - status = "Incarcerated" + status = SEC_RECORD_STATUS_INCARCERATED if("parolled") - status = "Parolled" + status = SEC_RECORD_STATUS_PAROLLED if("released") - status = "Released" + status = SEC_RECORD_STATUS_RELEASED target_records.fields["criminal"] = status log_admin("[key_name_admin(user)] set secstatus of [their_rank] [their_name] to [status], comment: [comment]") target_records.fields["comments"] += "Set to [status] by [user.name] ([user_rank]) on [GLOB.current_date_string] [station_time_timestamp()], comment: [comment]" diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index aff345d2451..08a7b77daff 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -223,19 +223,28 @@ var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.security) if(R) switch(R.fields["criminal"]) - if("*Execute*") + if(SEC_RECORD_STATUS_EXECUTE) holder.icon_state = "hudexecute" return - if("*Arrest*") + if(SEC_RECORD_STATUS_ARREST) holder.icon_state = "hudwanted" return - if("Incarcerated") + if(SEC_RECORD_STATUS_SEARCH) + holder.icon_state = "hudsearch" + return + if(SEC_RECORD_STATUS_MONITOR) + holder.icon_state = "hudmonitor" + return + if(SEC_RECORD_STATUS_DEMOTE) + holder.icon_state = "huddemote" + return + if(SEC_RECORD_STATUS_INCARCERATED) holder.icon_state = "hudprisoner" return - if("Parolled") + if(SEC_RECORD_STATUS_PAROLLED) holder.icon_state = "hudparolled" return - if("Released") + if(SEC_RECORD_STATUS_RELEASED) holder.icon_state = "hudreleased" return holder.icon_state = null diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index e886ac0db89..8c815198d31 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -72,17 +72,23 @@ break var/background = "''" switch(crimstat) - if("*Execute*") + if(SEC_RECORD_STATUS_EXECUTE) background = "'background-color:#5E0A1A'" - if("*Arrest*") + if(SEC_RECORD_STATUS_ARREST) background = "'background-color:#890E26'" - if("Incarcerated") + if(SEC_RECORD_STATUS_SEARCH) + background = "'background-color:#999900'" + if(SEC_RECORD_STATUS_MONITOR) + background = "'background-color:#004C99'" + if(SEC_RECORD_STATUS_DEMOTE) + background = "'background-color:#C2A111'" + if(SEC_RECORD_STATUS_INCARCERATED) background = "'background-color:#743B03'" - if("Parolled") + if(SEC_RECORD_STATUS_PAROLLED) background = "'background-color:#743B03'" - if("Released") + if(SEC_RECORD_STATUS_RELEASED) background = "'background-color:#216489'" - if("None") + if(SEC_RECORD_STATUS_NONE) background = "'background-color:#007f47'" if("null") crimstat = "No record." @@ -464,12 +470,15 @@ if("criminal") if(istype(active2, /datum/data/record)) var/list/buttons = list() - buttons[++buttons.len] = list("name" = "None", "icon" = "unlock", "href" = "criminal=none", "status" = (active2.fields["criminal"] == "None" ? "selected" : null)) - buttons[++buttons.len] = list("name" = "*Arrest*", "icon" = "lock", "href" = "criminal=arrest", "status" = (active2.fields["criminal"] == "*Arrest*" ? "selected" : null)) - buttons[++buttons.len] = list("name" = "Incarcerated", "icon" = "lock", "href" = "criminal=incarcerated", "status" = (active2.fields["criminal"] == "Incarcerated" ? "selected" : null)) - buttons[++buttons.len] = list("name" = "*Execute*", "icon" = "lock", "href" = "criminal=execute", "status" = (active2.fields["criminal"] == "*Execute*" ? "selected" : null)) - buttons[++buttons.len] = list("name" = "Parolled", "icon" = "unlock-alt", "href" = "criminal=parolled", "status" = (active2.fields["criminal"] == "Parolled" ? "selected" : null)) - buttons[++buttons.len] = list("name" = "Released", "icon" = "unlock", "href" = "criminal=released", "status" = (active2.fields["criminal"] == "Released" ? "selected" : null)) + buttons[++buttons.len] = list("name" = "None", "icon" = "unlock", "href" = "criminal=none", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_NONE ? "selected" : null)) + buttons[++buttons.len] = list("name" = "*Arrest*", "icon" = "lock", "href" = "criminal=arrest", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_ARREST ? "selected" : null)) + buttons[++buttons.len] = list("name" = "Search", "icon" = "lock", "href" = "criminal=search", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_SEARCH ? "selected" : null)) + buttons[++buttons.len] = list("name" = "Monitor", "icon" = "unlock", "href" = "criminal=monitor", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_MONITOR ? "selected" : null)) + buttons[++buttons.len] = list("name" = "Demote", "icon" = "lock", "href" = "criminal=demote", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_DEMOTE ? "selected" : null)) + buttons[++buttons.len] = list("name" = "Incarcerated", "icon" = "lock", "href" = "criminal=incarcerated", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_INCARCERATED ? "selected" : null)) + buttons[++buttons.len] = list("name" = "*Execute*", "icon" = "lock", "href" = "criminal=execute", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_EXECUTE ? "selected" : null)) + buttons[++buttons.len] = list("name" = "Parolled", "icon" = "unlock-alt", "href" = "criminal=parolled", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_PAROLLED ? "selected" : null)) + buttons[++buttons.len] = list("name" = "Released", "icon" = "unlock", "href" = "criminal=released", "status" = (active2.fields["criminal"] == SEC_RECORD_STATUS_RELEASED ? "selected" : null)) setTemp("

Criminal Status

", buttons) if("rank") var/list/L = list("Head of Personnel", "Captain", "AI") @@ -548,7 +557,7 @@ if(3) R.fields["age"] = rand(5, 85) if(4) - R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released") + R.fields["criminal"] = pick(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) if(5) R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit") if(6) diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 9e07fb43b28..b7361db01a3 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -310,7 +310,7 @@ if(3) R.fields["age"] = rand(5, 85) if(4) - R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released") + R.fields["criminal"] = pick(SEC_RECORD_STATUS_NONE, SEC_RECORD_STATUS_ARREST, SEC_RECORD_STATUS_INCARCERATED, SEC_RECORD_STATUS_PAROLLED, SEC_RECORD_STATUS_RELEASED) if(5) R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit") if(6) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 0a55acfcb81..19dc80f9a40 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -552,8 +552,12 @@ Class Procs: if(check_records && !R) threatcount += 4 - if(check_arrest && R && (R.fields["criminal"] == "*Arrest*")) - threatcount += 4 + if(R && R.fields["criminal"]) + switch(R.fields["criminal"]) + if(SEC_RECORD_STATUS_EXECUTE) + threatcount += 7 + if(SEC_RECORD_STATUS_ARREST) + threatcount += 5 return threatcount diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 3db7c079ccc..b67e01924c8 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -346,6 +346,7 @@ if(hasHUD(user,"security")) var/perpname = get_visible_name(TRUE) var/criminal = "None" + var/commentLatest = "ERROR: Unable to locate a data core entry for this person." //If there is no datacore present, give this if(perpname) for(var/datum/data/record/E in GLOB.data_core.general) @@ -353,9 +354,16 @@ for(var/datum/data/record/R in GLOB.data_core.security) if(R.fields["id"] == E.fields["id"]) criminal = R.fields["criminal"] + if(LAZYLEN(R.fields["comments"])) //if the commentlist is present + var/list/comments = R.fields["comments"] + commentLatest = LAZYACCESS(comments, comments.len) //get the latest entry from the comment log + else + commentLatest = "No entries." //If present but without entries (=target is recognized crew) + var/criminal_status = hasHUD(user, "read_only_security") ? "\[[criminal]\]" : "\[[criminal]\]" msg += "Criminal status: [criminal_status]\n" - msg += "Security records: \[View\] \[Add comment\]\n" + msg += "Security records: \[View comment log\] \[Add comment\]\n" + msg += "Latest entry: [commentLatest]\n" if(hasHUD(user,"medical")) var/perpname = get_visible_name(TRUE) @@ -398,17 +406,25 @@ if("medical") return istype(H.glasses, /obj/item/clothing/glasses/hud/health) || istype(CIH,/obj/item/organ/internal/cyberimp/eyes/hud/medical) else - return 0 + return FALSE else if(isrobot(M) || isAI(M)) //Stand-in/Stopgap to prevent pAIs from freely altering records, pending a more advanced Records system switch(hudtype) if("security") - return 1 + return TRUE if("medical") - return 1 + return TRUE else - return 0 + return FALSE + else if(isobserver(M)) + var/mob/dead/observer/O = M + if(O.data_hud_seen == DATA_HUD_SECURITY_ADVANCED || O.data_hud_seen == DATA_HUD_DIAGNOSTIC + DATA_HUD_SECURITY_ADVANCED + DATA_HUD_MEDICAL_ADVANCED) + switch(hudtype) + if("security") + return TRUE + else + return FALSE else - return 0 + return FALSE // Ignores robotic limb branding prefixes like "Morpheus Cybernetics" /proc/ignore_limb_branding(limb_name) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 59285ba88e3..7d1073fbdb2 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -715,14 +715,14 @@ 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("None", "*Arrest*", "Incarcerated", "Parolled", "Released", "Cancel") + 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, "security") && setcriminal != "Cancel") found_record = 1 - if(R.fields["criminal"] == "*Execute*") + 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 @@ -768,7 +768,7 @@ if(href_list["secrecordComment"]) if(hasHUD(usr,"security")) - if(usr.incapacitated()) + if(usr.incapacitated() && !isobserver(usr)) //give the ghosts access to "View Comment Log" while they can't manipulate it return var/perpname = get_visible_name(TRUE) var/read = 0 @@ -783,7 +783,7 @@ for(var/c in R.fields["comments"]) to_chat(usr, c) else - to_chat(usr, "No comment found") + to_chat(usr, "No comments found") to_chat(usr, "\[Add comment\]") if(!read) @@ -1554,13 +1554,13 @@ Eyes need to have significantly high darksight to shine unless the mob has the X var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.security) if(R && R.fields["criminal"]) switch(R.fields["criminal"]) - if("*Execute*") + if(SEC_RECORD_STATUS_EXECUTE) threatcount += 7 - if("*Arrest*") + if(SEC_RECORD_STATUS_ARREST) threatcount += 5 - if("Incarcerated") + if(SEC_RECORD_STATUS_INCARCERATED) threatcount += 2 - if("Parolled") + if(SEC_RECORD_STATUS_PAROLLED) threatcount += 2 //Check for dresscode violations diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 93cf7f7f982..d80b175e757 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -694,11 +694,17 @@ H.makeCluwne() else if(myeffect == "Demote") GLOB.event_announcement.Announce("[target.real_name] is hereby demoted to the rank of Civilian. Process this demotion immediately. Failure to comply with these orders is grounds for termination.","CC Demotion Order") + for(var/datum/data/record/R in sortRecord(GLOB.data_core.security)) + if(R.fields["name"] == target.real_name) + R.fields["criminal"] = SEC_RECORD_STATUS_DEMOTE + R.fields["comments"] += "Central Command Demotion Order, given on [GLOB.current_date_string] [station_time_timestamp()]
Process this demotion immediately. Failure to comply with these orders is grounds for termination." + update_all_mob_security_hud() else if(myeffect == "Demote with Bot") GLOB.event_announcement.Announce("[target.real_name] is hereby demoted to the rank of Civilian. Process this demotion immediately. Failure to comply with these orders is grounds for termination.","CC Demotion Order") for(var/datum/data/record/R in sortRecord(GLOB.data_core.security)) if(R.fields["name"] == target.real_name) - R.fields["criminal"] = "*Arrest*" + R.fields["criminal"] = SEC_RECORD_STATUS_ARREST + R.fields["comments"] += "Central Command Demotion Order, given on [GLOB.current_date_string] [station_time_timestamp()]
Process this demotion immediately. Failure to comply with these orders is grounds for termination." update_all_mob_security_hud() if(fax) var/turf/T = get_turf(fax) diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 849db6579a5..bbe41ddbe22 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/paradise.dme b/paradise.dme index 99512b02a37..f1ed8117d73 100644 --- a/paradise.dme +++ b/paradise.dme @@ -32,6 +32,7 @@ #include "code\__DEFINES\construction.dm" #include "code\__DEFINES\contracts.dm" #include "code\__DEFINES\crafting.dm" +#include "code\__DEFINES\criminal_status.dm" #include "code\__DEFINES\dna.dm" #include "code\__DEFINES\error_handler.dm" #include "code\__DEFINES\flags.dm"