/////////////////////////////////////////////
//Guest pass ////////////////////////////////
/////////////////////////////////////////////
/obj/item/card/id/guest
name = "guest pass"
desc = "Allows temporary access to workplace areas."
icon_state = "guest"
overlay_state = "guest"
vertical_card = TRUE
var/temp_access = list() //to prevent agent cards stealing access as permanent
var/expiration_time = 0
var/reason = "NOT SPECIFIED"
/obj/item/card/id/guest/GetAccess()
if (world.time > expiration_time)
return access
else
return temp_access
/obj/item/card/id/guest/get_examine_text(mob/user, distance, is_adjacent, infix, suffix)
. = ..()
if(world.time > expiration_time)
. += SPAN_WARNING("This pass expired at: [worldtime2text(expiration_time)].")
else
. += "This pass expires at: [worldtime2text(expiration_time)]."
. += "It grants access to the following areas:"
for(var/A in temp_access)
. += "[get_access_desc(A)]"
. += "Issuing reason: [reason]."
/obj/item/card/id/guest/Initialize(mapload, duration)
. = ..(mapload)
expiration_time = duration + world.time
addtimer(CALLBACK(src, PROC_REF(expire)), duration)
/obj/item/card/id/guest/proc/expire()
icon_state += "_invalid"
overlay_state += "_invalid"
#define GUEST_PASS_TERMINAL_UNSET "\[UNSET\]"
// Guest Pass Terminal
/obj/machinery/computer/guestpass
name = "guest pass terminal"
desc = "A guest pass terminal. It allows issuing temporary access passes to one or more areas."
icon = 'icons/obj/computer.dmi'
icon_state = "altcomputerw"
light_color = LIGHT_COLOR_BLUE
icon_screen = "guest"
icon_scanline = "altcomputerw-scanline"
density = FALSE
appearance_flags = TILE_BOUND // prevents people from viewing the overlay through a wall
var/obj/item/card/id/giver = GUEST_PASS_TERMINAL_UNSET
var/list/accesses = list()
var/giv_name = GUEST_PASS_TERMINAL_UNSET
var/reason = GUEST_PASS_TERMINAL_UNSET
var/duration = 10
var/list/internal_log = list()
var/mode = 0 // 0: Making pass. 1: Viewing logs.
/obj/machinery/computer/guestpass/Initialize()
. = ..()
uid = "[rand(100,999)]-G[rand(10,99)]"
/obj/machinery/computer/guestpass/attackby(obj/item/attacking_item, mob/user)
if(istype(attacking_item, /obj/item/card/id))
if((!giver || giver == GUEST_PASS_TERMINAL_UNSET) && user.unEquip(attacking_item))
attacking_item.forceMove(src)
giver = attacking_item
updateUsrDialog()
else if(giver && giver != GUEST_PASS_TERMINAL_UNSET)
to_chat(user, SPAN_WARNING("There is already ID card inside \the [src]."))
return TRUE
return ..()
/obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob)
if(!ai_can_interact(user))
return
return attack_hand(user)
/obj/machinery/computer/guestpass/attack_hand(var/mob/user as mob)
if(..())
return
user.set_machine(src)
var/dat
if(mode == 1) // Logs.
dat += "
Activity log
"
for (var/entry in internal_log)
dat += "[entry]
"
dat += "Print
"
dat += "Back
"
else
dat += "Guest Pass Terminal #[uid]
"
dat += "Issuing ID: [giver]
"
dat += "Issued To: [giv_name]
"
dat += "Reason: [reason]
"
dat += "Duration (minutes): [duration] m
"
dat += "Access to Areas:
"
if((giver && giver != GUEST_PASS_TERMINAL_UNSET) && giver.access)
for(var/A in giver.access)
var/area = get_access_desc(A)
if (A in accesses)
area = "[area]"
dat += "[area]
"
dat += "
Issue Pass
"
dat += "View Activity Log
"
var/datum/browser/guestpass_win = new(user, "guestpass", capitalize_first_letters(name), 400, 520)
guestpass_win.set_content(dat)
guestpass_win.open()
/obj/machinery/computer/guestpass/Topic(href, href_list)
if(..())
return 1
usr.set_machine(src)
if(href_list["mode"])
mode = text2num(href_list["mode"])
if(href_list["choice"])
switch(href_list["choice"])
if("giv_name")
var/nam = sanitizeName(input("Issued To:", "Name", giv_name) as text|null)
if(nam)
giv_name = nam
if("reason")
var/reas = sanitize(input("Reason:", "Reason", reason) as text|null)
if(reas)
reason = reas
if("duration")
var/dur = tgui_input_number(usr, "Insert the duration (in minutes) during which this pass is valid (up to 60 minutes).", "Duration", 30, 60, 0)
if(dur)
if(dur > 0 && dur <= 60)
duration = dur
else
to_chat(usr, "\The [src] displays, \"Invalid duration.\"")
if("access")
var/A = text2num(href_list["access"])
if (A in accesses)
accesses.Remove(A)
else
accesses.Add(A)
if(href_list["action"])
switch(href_list["action"])
if("id")
if(giver && giver != GUEST_PASS_TERMINAL_UNSET)
if(ishuman(usr))
giver.forceMove(usr.loc)
if(!usr.get_active_hand())
usr.put_in_hands(giver)
giver = GUEST_PASS_TERMINAL_UNSET
else
giver.forceMove(src.loc)
giver = GUEST_PASS_TERMINAL_UNSET
accesses.Cut()
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/card/id) && usr.unEquip(I))
I.forceMove(src)
giver = I
updateUsrDialog()
if("print")
var/dat = "Activity Log of Guest Pass Terminal #[uid]
"
for (var/entry in internal_log)
dat += "[entry]
"
//to_chat(usr, "Printing the log, standby...")
//sleep(50)
var/obj/item/paper/P = new/obj/item/paper( loc )
P.set_content_unsafe("activity log", dat)
if("issue")
if(giver && giver != GUEST_PASS_TERMINAL_UNSET)
var/number = add_zero("[rand(0,9999)]", 4)
var/entry = "\[[worldtime2text()]\] Pass #[number] issued by [giver.registered_name], [giver.assignment] to [giv_name].
Reason: [reason].
Grants access to the following areas:
"
for (var/i=1 to accesses.len)
var/A = accesses[i]
if(A)
var/area = get_access_desc(A)
entry += "[i > 1 ? ", [area]" : "[area]"]
"
entry += "Expires at: [worldtime2text(world.time + duration*10*60)]."
internal_log.Add(entry)
var/obj/item/card/id/guest/pass = new(loc, duration MINUTES)
pass.temp_access = accesses.Copy()
pass.registered_name = giv_name
pass.reason = reason
pass.name = "guest pass - [giv_name]"
// Reset the Terminal
giv_name = GUEST_PASS_TERMINAL_UNSET
reason = GUEST_PASS_TERMINAL_UNSET
duration = 10
else
to_chat(usr, SPAN_WARNING("Cannot issue a guest pass without a issuing ID."))
updateUsrDialog()
return
#undef GUEST_PASS_TERMINAL_UNSET