mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-08-30 00:21:11 +01:00
Repaths obj/machinery to obj/structure/machinery. **Note for reviewers:** the only meaningful changed code exists within **code/game/objects/structures.dm** and **code/game/objects/structures/_machinery.dm**, largely concerning damage procs. With the exception of moving airlock defines to their own file, ALL OTHER CHANGES ARE STRICTLY PATH CHANGES. Objects, _categorically_, are largely divided between those you can hold in your hand/inventory and those you can't. Machinery objects are already subtypes of Structures behaviorally, this PR just makes their pathing reflect that, and allows for future work (tool actions, more health/destruction functionality) to be developed without unnecessary code duplication. I have tested this PR by loading up the Horizon and dismantling various machines and structures with tools, shooting guns of various types throughout the ship, and detonating a bunch of explosions throughout the ship.
205 lines
6.9 KiB
Plaintext
205 lines
6.9 KiB
Plaintext
/////////////////////////////////////////////
|
|
//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/structure/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/structure/machinery/computer/guestpass/Initialize()
|
|
. = ..()
|
|
uid = "[rand(100,999)]-G[rand(10,99)]"
|
|
|
|
/obj/structure/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/structure/machinery/computer/guestpass/attack_ai(var/mob/user as mob)
|
|
if(!ai_can_interact(user))
|
|
return
|
|
return attack_hand(user)
|
|
|
|
/obj/structure/machinery/computer/guestpass/attack_hand(var/mob/user as mob)
|
|
if(..())
|
|
return
|
|
|
|
user.set_machine(src)
|
|
var/dat
|
|
|
|
if(mode == 1) // Logs.
|
|
dat += "<h3>Activity log</h3><br>"
|
|
for (var/entry in internal_log)
|
|
dat += "[entry]<br><hr>"
|
|
dat += "<a href='byond://?src=[REF(src)];action=print'>Print</a><br>"
|
|
dat += "<a href='byond://?src=[REF(src)];mode=0'>Back</a><br>"
|
|
else
|
|
dat += "<h3>Guest Pass Terminal #[uid]</h3>"
|
|
dat += "Issuing ID: <a href='byond://?src=[REF(src)];action=id'>[giver]</a><br>"
|
|
dat += "Issued To: <a href='byond://?src=[REF(src)];choice=giv_name'>[giv_name]</a><br>"
|
|
dat += "Reason: <a href='byond://?src=[REF(src)];choice=reason'>[reason]</a><br>"
|
|
dat += "Duration (minutes): <a href='byond://?src=[REF(src)];choice=duration'>[duration] m</a><br>"
|
|
dat += "Access to Areas:<br>"
|
|
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 = "<span style='color:#00dd12'>[area]</span>"
|
|
dat += "<a href='byond://?src=[REF(src)];choice=access;access=[A]'>[area]</a><br>"
|
|
dat += "<br><a href='byond://?src=[REF(src)];action=issue'>Issue Pass</a><br>"
|
|
dat += "<a href='byond://?src=[REF(src)];mode=1'>View Activity Log</a><br><br>"
|
|
|
|
var/datum/browser/guestpass_win = new(user, "guestpass", capitalize_first_letters(name), 400, 520)
|
|
guestpass_win.set_content(dat)
|
|
guestpass_win.open()
|
|
|
|
/obj/structure/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, "<b>\The [src]</b> 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 = "<h3>Activity Log of Guest Pass Terminal #[uid]</h3><br>"
|
|
for (var/entry in internal_log)
|
|
dat += "[entry]<br><hr>"
|
|
//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].<br>Reason: [reason].<br>Grants access to the following areas:<br>"
|
|
for (var/i=1 to accesses.len)
|
|
var/A = accesses[i]
|
|
if(A)
|
|
var/area = get_access_desc(A)
|
|
entry += "[i > 1 ? ", [area]" : "[area]"]<br>"
|
|
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
|