mirror of
https://github.com/Citadel-Station-13/Citadel-Station-13-RP.git
synced 2026-08-31 12:16:52 +01:00
tl;dr level collections that can easily be logically restructured/moved as necessary will eventually be used for radio and overmaps location resolution. this is the last part of https://github.com/Citadel-Station-13/Citadel-Station-13-RP/pull/4841 that has not yet been integrated. this will be a draft for a while. --------- Co-authored-by: LetterN <24603524+LetterN@users.noreply.github.com>
236 lines
7.6 KiB
Plaintext
236 lines
7.6 KiB
Plaintext
|
|
/obj/machinery/computer/card
|
|
name = "\improper ID card modification console"
|
|
desc = "Terminal for programming employee ID cards to access parts of the station."
|
|
icon_keyboard = "id_key"
|
|
icon_screen = "id"
|
|
light_color = "#0099ff"
|
|
circuit = /obj/item/circuitboard/card
|
|
/// modification module
|
|
var/datum/tgui_module/card_mod/standard/id_computer/tgui_cardmod
|
|
/// authing ID
|
|
var/obj/item/card/id/authing
|
|
/// editing ID
|
|
var/obj/item/card/id/editing
|
|
|
|
/obj/machinery/computer/card/Initialize(mapload)
|
|
. = ..()
|
|
tgui_cardmod = new(src)
|
|
|
|
/obj/machinery/computer/card/Destroy()
|
|
QDEL_NULL(tgui_cardmod)
|
|
return ..()
|
|
|
|
/obj/machinery/computer/card/drop_products(method, atom/where)
|
|
. = ..()
|
|
if(authing)
|
|
drop_product(authing, where)
|
|
authing = null
|
|
if(editing)
|
|
drop_product(editing, where)
|
|
editing = null
|
|
|
|
/obj/machinery/computer/card/ui_route(action, list/params, datum/tgui/ui, id)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
switch(id)
|
|
if("modify")
|
|
return tgui_cardmod.ui_act(action, params, ui, ui.state, new /datum/event_args/actor(usr))
|
|
|
|
/**
|
|
* for later use: authorized to change slots
|
|
*/
|
|
/obj/machinery/computer/card/proc/authed_for_slotmod(obj/item/card/id/checking = authing)
|
|
return ACCESS_COMMAND_CARDMOD in checking?.access
|
|
|
|
/**
|
|
* authed for at least one possible access change OR rank change
|
|
*/
|
|
/obj/machinery/computer/card/proc/authed_for_edit(obj/item/card/id/checking = authing)
|
|
return checking?.access && length(SSjob.cached_access_edit_relevant & checking.access)
|
|
|
|
/obj/machinery/computer/card/AltClick(mob/user)
|
|
. = ..()
|
|
if(. != "keep-going")
|
|
return
|
|
// todo: mobility flags
|
|
if(user.stat || user.lying)
|
|
return
|
|
if(attempt_grab_authing(user) || attempt_grab_editing(user))
|
|
return TRUE
|
|
|
|
/obj/machinery/computer/card/proc/attempt_grab_authing(mob/user)
|
|
if(!authing)
|
|
return FALSE
|
|
user.grab_item_from_interacted_with(authing, src)
|
|
user.action_feedback(SPAN_NOTICE("You remove [authing] from [src]."), src)
|
|
authing = null
|
|
return TRUE
|
|
|
|
/obj/machinery/computer/card/proc/attempt_grab_editing(mob/user)
|
|
if(!editing)
|
|
return FALSE
|
|
user.grab_item_from_interacted_with(editing, src)
|
|
user.action_feedback(SPAN_NOTICE("You remove [editing] from [src]."), src)
|
|
editing = null
|
|
return TRUE
|
|
|
|
/obj/machinery/computer/card/attackby(obj/item/I, mob/living/user, params, clickchain_flags, damage_multiplier)
|
|
if(!istype(I, /obj/item/card/id))
|
|
return ..()
|
|
var/obj/item/card/id/id_card = I
|
|
if(!authing && authed_for_edit(id_card))
|
|
if(!user.transfer_item_to_loc(id_card, src))
|
|
user.action_feedback(SPAN_WARNING("[id_card] is stuck to your hand!"))
|
|
return
|
|
authing = id_card
|
|
user.action_feedback(SPAN_NOTICE("You insert [id_card] into [src]."))
|
|
update_static_data()
|
|
else
|
|
if(!user.transfer_item_to_loc(id_card, src))
|
|
user.action_feedback(SPAN_WARNING("[id_card] is stuck to your hand!"))
|
|
return
|
|
if(isnull(editing))
|
|
// insert
|
|
editing = id_card
|
|
user.action_feedback(SPAN_NOTICE("You insert [id_card] into [src]."))
|
|
else
|
|
// swap
|
|
user.grab_item_from_interacted_with(editing, src)
|
|
user.action_feedback(SPAN_NOTICE("You swap out [editing] for [id_card]."))
|
|
editing = id_card
|
|
update_static_data()
|
|
return CLICKCHAIN_DO_NOT_PROPAGATE
|
|
|
|
/obj/machinery/computer/card/attack_ai(var/mob/user as mob)
|
|
return attack_hand(user)
|
|
|
|
/obj/machinery/computer/card/attack_hand(mob/user, datum/event_args/actor/clickchain/e_args)
|
|
if(..())
|
|
return
|
|
if(machine_stat & (NOPOWER|BROKEN))
|
|
return
|
|
ui_interact(user)
|
|
|
|
/obj/machinery/computer/card/ui_interact(mob/user, datum/tgui/ui)
|
|
ui = SStgui.try_update_ui(user, src, ui)
|
|
if(!ui)
|
|
ui = new(user, src, "IdentificationComputer", name)
|
|
ui.register_module(tgui_cardmod, "modify")
|
|
ui.open()
|
|
|
|
/obj/machinery/computer/card/ui_static_data(mob/user, datum/tgui/ui)
|
|
. = ..()
|
|
//? manifest
|
|
// todo: refactor PDA_Manifest and CrewManifest.js
|
|
data_core.get_manifest_list()
|
|
.["manifest"] = GLOB.PDA_Manifest
|
|
|
|
/obj/machinery/computer/card/ui_data(mob/user, datum/tgui/ui)
|
|
. = ..()
|
|
|
|
//? general
|
|
.["printing"] = TIMER_COOLDOWN_CHECK(src, CD_INDEX_IDCONSOLE_PRINT)
|
|
|
|
//? card modification
|
|
.["auth_card"] = authing? list(
|
|
"name" = authing.name || "-----",
|
|
"owner" = authing.registered_name || "-----",
|
|
"rank" = authing.rank || "Unassigned",
|
|
) : null
|
|
.["modify_card"] = editing? list(
|
|
"name" = editing.name || "-----",
|
|
"owner" = editing.registered_name || "-----",
|
|
"rank" = editing.rank || "Unassigned",
|
|
) : null
|
|
|
|
//? auth
|
|
.["authed_cardmod"] = authed_for_edit()
|
|
.["authed_slotmod"] = authed_for_slotmod()
|
|
|
|
/obj/machinery/computer/card/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state, datum/event_args/actor/actor)
|
|
if(..())
|
|
return TRUE
|
|
|
|
switch(action)
|
|
if("auth")
|
|
if(authing)
|
|
usr.grab_item_from_interacted_with(authing, src)
|
|
usr.action_feedback(SPAN_NOTICE("You remove [authing] from [src]."), src)
|
|
authing = null
|
|
else
|
|
var/obj/item/card/id/inserting = usr.get_active_held_item()
|
|
if(!istype(inserting))
|
|
return TRUE
|
|
if(!usr.transfer_item_to_loc(inserting, src))
|
|
usr.action_feedback(SPAN_WARNING("[inserting] is stuck to your hand!"))
|
|
return TRUE
|
|
authing = inserting
|
|
usr.action_feedback(SPAN_NOTICE("You insert [authing] into [src]."))
|
|
update_static_data()
|
|
return TRUE
|
|
if("modify")
|
|
if(editing)
|
|
usr.grab_item_from_interacted_with(editing, src)
|
|
usr.action_feedback(SPAN_NOTICE("You remove [editing] from [src]."), src)
|
|
editing = null
|
|
else
|
|
var/obj/item/card/id/inserting = usr.get_active_held_item()
|
|
if(!istype(inserting))
|
|
return TRUE
|
|
if(!usr.transfer_item_to_loc(inserting, src))
|
|
usr.action_feedback(SPAN_WARNING("[inserting] is stuck to your hand!"))
|
|
return TRUE
|
|
editing = inserting
|
|
usr.action_feedback(SPAN_NOTICE("You insert [editing] into [src]."))
|
|
update_static_data()
|
|
return TRUE
|
|
if("print_manifest")
|
|
if(TIMER_COOLDOWN_CHECK(src, CD_INDEX_IDCONSOLE_PRINT))
|
|
usr.action_feedback(SPAN_WARNING("[src] is still printing something!"), src)
|
|
return
|
|
TIMER_COOLDOWN_START(src, CD_INDEX_IDCONSOLE_PRINT, 5 SECONDS)
|
|
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/computer/card, print_manifest)), 5 SECONDS)
|
|
return TRUE
|
|
if("print_card_report")
|
|
if(TIMER_COOLDOWN_CHECK(src, CD_INDEX_IDCONSOLE_PRINT))
|
|
usr.action_feedback(SPAN_WARNING("[src] is still printing something!"), src)
|
|
return
|
|
TIMER_COOLDOWN_START(src, CD_INDEX_IDCONSOLE_PRINT, 5 SECONDS)
|
|
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/machinery/computer/card, print_card_report)), 5 SECONDS)
|
|
return TRUE
|
|
|
|
/obj/machinery/computer/card/proc/print_manifest()
|
|
var/obj/item/paper/P = new(loc)
|
|
P.name = "crew manifest ([stationtime2text()])"
|
|
P.info = {"<h4>Crew Manifest</h4>
|
|
<br>
|
|
[data_core ? data_core.get_manifest(0) : ""]
|
|
"}
|
|
|
|
/obj/machinery/computer/card/proc/print_card_report()
|
|
if(!editing || !authing)
|
|
visible_message(SPAN_NOTICE("Printing failed: Target or authenticating card removed."))
|
|
return
|
|
var/obj/item/card/id/scanning = editing
|
|
var/obj/item/paper/P = new(loc)
|
|
P.name = "access report - [scanning.name]"
|
|
P.info = {"<h4>Access Report</h4>
|
|
<u>Prepared By:</u> [authing.registered_name ? authing.registered_name : "Unknown"]<br>
|
|
<u>For:</u> [editing.registered_name ? editing.registered_name : "Unregistered"]<br>
|
|
<hr>
|
|
<u>Assignment:</u> [editing.assignment]<br>
|
|
<u>Account Number:</u> #[editing.associated_account_number]<br>
|
|
<u>Access:</u><br>
|
|
"}
|
|
var/list/by_cat = list()
|
|
var/list/joining = list()
|
|
for(var/datum/access/A in SSjob.access_lookup_multiple(editing.access))
|
|
LAZYADD(by_cat[A.access_category], A)
|
|
for(var/category in by_cat)
|
|
joining += "<b>[category]:</b><br>"
|
|
for(var/datum/access/A as anything in by_cat[category])
|
|
joining += "- [A.access_name]<br>"
|
|
P.info += jointext(joining, "")
|