From f59b60e83a09c1cf65c4bc9f160999233fafcfab Mon Sep 17 00:00:00 2001 From: Sishen Date: Thu, 8 Aug 2019 01:11:20 -0400 Subject: [PATCH 01/18] QOL OOGA BOOGA --- _maps/map_files/BoxStation/BoxStation.dmm | 6 +- .../map_files/Deltastation/DeltaStation2.dmm | 14 +- _maps/map_files/MetaStation/MetaStation.dmm | 8 +- _maps/map_files/PubbyStation/PubbyStation.dmm | 6 +- _maps/map_files/debug/runtimestation.dmm | 2 +- _maps/map_files/generic/CentCom.dmm | 6 +- code/game/machinery/_machinery.dm | 116 ++++++- code/game/machinery/computer/apc_control.dm | 1 - code/game/machinery/computer/card.dm | 3 - .../game/machinery/computer/communications.dm | 1 - code/game/machinery/computer/medical.dm | 286 +++++++++--------- code/game/machinery/computer/prisoner.dm | 142 --------- .../machinery/computer/prisoner/_prisoner.dm | 52 ++++ .../computer/prisoner/gulag_teleporter.dm | 142 +++++++++ .../machinery/computer/prisoner/management.dm | 139 +++++++++ code/game/machinery/computer/security.dm | 115 +++---- code/game/machinery/gulag_item_reclaimer.dm | 41 +-- .../circuitboards/computer_circuitboards.dm | 7 +- code/modules/mining/laborcamp/laborstacker.dm | 70 ++--- code/modules/mining/machine_redemption.dm | 61 ++-- code/modules/mining/machine_vending.dm | 119 ++------ tgstation.dme | 3 + tgui/src/interfaces/gulag_item_reclaimer.ract | 5 +- tgui/src/interfaces/labor_claim_console.ract | 25 +- .../interfaces/ore_redemption_machine.ract | 18 +- 25 files changed, 726 insertions(+), 662 deletions(-) create mode 100644 code/game/machinery/computer/prisoner/_prisoner.dm create mode 100644 code/game/machinery/computer/prisoner/gulag_teleporter.dm create mode 100644 code/game/machinery/computer/prisoner/management.dm diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 980e23188a..7350b4f0c6 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -2924,7 +2924,7 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "agp" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "agq" = ( @@ -4489,7 +4489,7 @@ /turf/open/space, /area/solar/port/fore) "ajr" = ( -/obj/machinery/computer/gulag_teleporter_computer, +/obj/machinery/computer/prisoner/gulag_teleporter_computer, /turf/open/floor/plasteel, /area/security/processing) "ajs" = ( @@ -19371,7 +19371,7 @@ /turf/closed/wall, /area/bridge) "aTR" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /obj/effect/turf_decal/tile/red{ dir = 1 }, diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index fd7c0a3c00..88f3704091 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -4503,7 +4503,7 @@ /turf/open/floor/plasteel, /area/security/checkpoint) "anx" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 8 }, /obj/machinery/status_display{ @@ -36400,7 +36400,7 @@ /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hos) "boc" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 8 }, /turf/open/floor/plasteel/grimy, @@ -38706,7 +38706,7 @@ /turf/open/floor/plasteel/grimy, /area/crew_quarters/heads/hos) "brE" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -39610,7 +39610,7 @@ /turf/open/floor/plasteel/dark, /area/security/execution/transfer) "bth" = ( -/obj/machinery/computer/gulag_teleporter_computer{ +/obj/machinery/computer/prisoner/gulag_teleporter_computer{ dir = 1 }, /obj/structure/disposalpipe/segment{ @@ -42723,7 +42723,7 @@ /turf/open/floor/plasteel/dark, /area/bridge) "byk" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -56938,7 +56938,7 @@ /turf/open/floor/plasteel, /area/security/warden) "bTh" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 8 }, /obj/structure/cable/white{ @@ -125921,7 +125921,7 @@ /turf/open/floor/plasteel, /area/security/checkpoint/escape) "egj" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 1 }, /obj/structure/cable/white{ diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 75d7466371..13f774d25d 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -2017,7 +2017,7 @@ /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "aeu" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/hos) "aev" = ( @@ -8416,7 +8416,7 @@ /turf/open/floor/plating, /area/security/warden) "apI" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 4 }, /obj/structure/cable/yellow{ @@ -10514,7 +10514,7 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "atK" = ( -/obj/machinery/computer/gulag_teleporter_computer{ +/obj/machinery/computer/prisoner/gulag_teleporter_computer{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -30781,7 +30781,7 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /obj/effect/turf_decal/tile/red{ dir = 1 }, diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index ee97af14fc..2e8887c75f 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -4897,7 +4897,7 @@ /turf/open/floor/plasteel/showroomfloor, /area/security/warden) "amT" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /obj/machinery/airalarm{ pixel_y = 22 }, @@ -6072,7 +6072,7 @@ /turf/open/floor/plating, /area/security/brig) "apF" = ( -/obj/machinery/computer/gulag_teleporter_computer{ +/obj/machinery/computer/prisoner/gulag_teleporter_computer{ dir = 1 }, /turf/open/floor/plasteel/dark, @@ -7048,7 +7048,7 @@ /turf/open/floor/plasteel/dark, /area/bridge) "arR" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /obj/effect/turf_decal/tile/red{ dir = 1 }, diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 3bdf64ac27..feb8fc8cc0 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -523,7 +523,7 @@ /turf/open/floor/plasteel, /area/science) "bC" = ( -/obj/machinery/computer/gulag_teleporter_computer{ +/obj/machinery/computer/prisoner/gulag_teleporter_computer{ dir = 4 }, /turf/open/floor/plasteel, diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 115ad3d363..8d743b7f71 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -3864,7 +3864,7 @@ /turf/open/floor/plasteel, /area/centcom/control) "jS" = ( -/obj/machinery/computer/prisoner, +/obj/machinery/computer/prisoner/management, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/centcom/control) @@ -5857,7 +5857,7 @@ /turf/open/floor/plasteel, /area/centcom/control) "nY" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 1 }, /obj/effect/turf_decal/stripes/line{ @@ -10495,7 +10495,7 @@ /turf/open/floor/plasteel/dark, /area/centcom/control) "yv" = ( -/obj/machinery/computer/prisoner{ +/obj/machinery/computer/prisoner/management{ dir = 1 }, /obj/machinery/light, diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index b0e4c699d7..e5fd73228a 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -113,6 +113,11 @@ Class Procs: var/atom/movable/occupant = null var/speed_process = FALSE // Process as fast as possible? var/obj/item/circuitboard/circuit // Circuit to be created and inserted when the machinery is created + var/obj/item/card/id/inserted_scan_id + var/obj/item/card/id/inserted_modify_id + var/list/region_access = null // For the identification console (card.dm) + var/list/head_subordinates = null // For the identification console (card.dm) + var/authenticated = 0 // For the identification console (card.dm) var/interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE @@ -131,7 +136,7 @@ Class Procs: else START_PROCESSING(SSfastprocess, src) power_change() - AddComponent(/datum/component/redirect, list(COMSIG_ENTER_AREA = CALLBACK(src, .proc/power_change))) + RegisterSignal(src, COMSIG_ENTER_AREA, .proc/power_change) if (occupant_typecache) occupant_typecache = typecacheof(occupant_typecache) @@ -143,6 +148,10 @@ Class Procs: else STOP_PROCESSING(SSfastprocess, src) dropContents() + if(length(component_parts)) + for(var/atom/A in component_parts) + qdel(A) + component_parts.Cut() return ..() /obj/machinery/proc/locate_machinery() @@ -179,12 +188,15 @@ Class Procs: L.update_canmove() occupant = null +/obj/machinery/proc/can_be_occupant(atom/movable/am) + return occupant_typecache ? is_type_in_typecache(am, occupant_typecache) : isliving(am) + /obj/machinery/proc/close_machine(atom/movable/target = null) state_open = FALSE density = TRUE if(!target) for(var/am in loc) - if (!(occupant_typecache ? is_type_in_typecache(am, occupant_typecache) : isliving(am))) + if (!(can_be_occupant(am))) continue var/atom/movable/AM = am if(AM.has_buckled_mobs()) @@ -311,6 +323,7 @@ Class Procs: spawn_frame(disassembled) for(var/obj/item/I in component_parts) I.forceMove(loc) + component_parts.Cut() qdel(src) /obj/machinery/proc/spawn_frame(disassembled) @@ -348,8 +361,8 @@ Class Procs: panel_open = FALSE icon_state = icon_state_closed to_chat(user, "You close the maintenance hatch of [src].") - return 1 - return 0 + return TRUE + return FALSE /obj/machinery/proc/default_change_direction_wrench(mob/user, obj/item/I) if(panel_open && I.tool_behaviour == TOOL_WRENCH) @@ -401,7 +414,7 @@ Class Procs: var/obj/item/circuitboard/machine/CB = locate(/obj/item/circuitboard/machine) in component_parts var/P if(W.works_from_distance) - display_parts(user) + to_chat(user, display_parts(user)) for(var/obj/item/A in component_parts) for(var/D in CB.req_components) if(ispath(A.type, D)) @@ -429,34 +442,38 @@ Class Procs: break RefreshParts() else - display_parts(user) + to_chat(user, display_parts(user)) if(shouldplaysound) W.play_rped_sound() return TRUE return FALSE /obj/machinery/proc/display_parts(mob/user) - to_chat(user, "It contains the following parts:") + . = list() + . += "It contains the following parts:" for(var/obj/item/C in component_parts) - to_chat(user, "[icon2html(C, user)] \A [C].") + . += "[icon2html(C, user)] \A [C]." + . = jointext(., "") /obj/machinery/examine(mob/user) - ..() + . = ..() if(stat & BROKEN) - to_chat(user, "It looks broken and non-functional.") + . += "It looks broken and non-functional." if(!(resistance_flags & INDESTRUCTIBLE)) if(resistance_flags & ON_FIRE) - to_chat(user, "It's on fire!") + . += "It's on fire!" var/healthpercent = (obj_integrity/max_integrity) * 100 switch(healthpercent) if(50 to 99) - to_chat(user, "It looks slightly damaged.") + . += "It looks slightly damaged." if(25 to 50) - to_chat(user, "It appears heavily damaged.") + . += "It appears heavily damaged." if(0 to 25) - to_chat(user, "It's falling apart!") + . += "It's falling apart!" if(user.research_scanner && component_parts) - display_parts(user) + . += display_parts(user, TRUE) + if(inserted_scan_id || inserted_modify_id) + . += "Alt-click to eject the ID card." //called on machinery construction (i.e from frame to machinery) but not on initialization /obj/machinery/proc/on_construction() @@ -490,3 +507,72 @@ Class Procs: . = . % 9 AM.pixel_x = -8 + ((.%3)*8) AM.pixel_y = -8 + (round( . / 3)*8) + +/obj/machinery/proc/id_insert_scan(mob/user, obj/item/card/id/I) + I = user.get_active_held_item() + if(istype(I)) + if(inserted_scan_id) + to_chat(user, "There's already an ID card in the console!") + return + if(!user.transferItemToLoc(I, src)) + return + inserted_scan_id = I + user.visible_message("[user] inserts an ID card into the console.", \ + "You insert the ID card into the console.") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + updateUsrDialog() + +/obj/machinery/proc/id_eject_scan(mob/user) + if(!inserted_scan_id) + to_chat(user, "There's no ID card in the console!") + return + if(inserted_scan_id) + inserted_scan_id.forceMove(drop_location()) + if(!issilicon(user) && Adjacent(user)) + user.put_in_hands(inserted_scan_id) + inserted_scan_id = null + user.visible_message("[user] gets an ID card from the console.", \ + "You get the ID card from the console.") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + updateUsrDialog() + +/obj/machinery/proc/id_eject_modify(mob/user) + if(inserted_modify_id) + GLOB.data_core.manifest_modify(inserted_modify_id.registered_name, inserted_modify_id.assignment) + inserted_modify_id.update_label() + inserted_modify_id.forceMove(drop_location()) + if(!issilicon(user) && Adjacent(user)) + user.put_in_hands(inserted_modify_id) + user.visible_message("[user] gets an ID card from the console.", \ + "You get the ID card from the console.") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + inserted_modify_id = null + region_access = null + head_subordinates = null + updateUsrDialog() + +/obj/machinery/proc/id_insert_modify(mob/user) + var/obj/item/card/id/I = user.get_active_held_item() + if(istype(I)) + if(inserted_modify_id) + to_chat(user, "There's already an ID card in the console!") + return + if(!user.transferItemToLoc(I, src)) + return + inserted_modify_id = I + user.visible_message("[user] inserts an ID card into the console.", \ + "You insert the ID card into the console.") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + updateUsrDialog() + +/obj/machinery/AltClick(mob/user) + if(!user.canUseTopic(src, !issilicon(user)) || !is_operational()) + return + if(inserted_modify_id) + id_eject_modify(user) + authenticated = FALSE + return + if(inserted_scan_id) + id_eject_scan(user) + authenticated = FALSE + return diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index e51d623c2f..d433c55724 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -11,7 +11,6 @@ var/list/result_filters //For sorting the results var/checking_logs = 0 var/list/logs - var/authenticated = 0 var/auth_id = "\[NULL\]" /obj/machinery/computer/apc_control/Initialize() diff --git a/code/game/machinery/computer/card.dm b/code/game/machinery/computer/card.dm index 09bf401e12..0cce853c49 100644 --- a/code/game/machinery/computer/card.dm +++ b/code/game/machinery/computer/card.dm @@ -13,11 +13,8 @@ GLOBAL_VAR_INIT(time_last_changed_position, 0) circuit = /obj/item/circuitboard/computer/card var/obj/item/card/id/scan = null var/obj/item/card/id/modify = null - var/authenticated = 0 var/mode = 0 var/printing = null - var/list/region_access = null - var/list/head_subordinates = null var/target_dept = 0 //Which department this computer has access to. 0=all departments //Cooldown for closing positions in seconds diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 752765baa1..c79fb385b3 100755 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -6,7 +6,6 @@ icon_keyboard = "tech_key" req_access = list(ACCESS_HEADS) circuit = /obj/item/circuitboard/computer/communications - var/authenticated = 0 var/auth_id = "Unknown" //Who is currently logged in? var/list/datum/comm_message/messages = list() var/datum/comm_message/currmsg diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm index 8af83ae08e..d4fe3e27a2 100644 --- a/code/game/machinery/computer/medical.dm +++ b/code/game/machinery/computer/medical.dm @@ -7,13 +7,10 @@ icon_keyboard = "med_key" req_one_access = list(ACCESS_MEDICAL, ACCESS_FORENSICS_LOCKERS) circuit = /obj/item/circuitboard/computer/med_data - var/obj/item/card/id/scan = null - var/authenticated = null var/rank = null var/screen = null var/datum/data/record/active1 var/datum/data/record/active2 - var/a_id = null var/temp = null var/printing = null //Sorting Variables @@ -25,24 +22,22 @@ /obj/machinery/computer/med_data/syndie icon_keyboard = "syndie_key" -/obj/machinery/computer/med_data/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/card/id) && !scan) - if(!user.transferItemToLoc(O, src)) - return - scan = O - to_chat(user, "You insert [O].") +/obj/machinery/computer/med_data/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/card/id)) + id_insert_scan(user) else return ..() /obj/machinery/computer/med_data/ui_interact(mob/user) . = ..() + if(isliving(user)) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) var/dat if(temp) dat = text("[temp]

Clear Screen") else - dat = text("Confirm Identity: []
", (src.scan ? text("[]", src.scan.name) : "----------")) - if(src.authenticated) - switch(src.screen) + if(authenticated) + switch(screen) if(1) dat += {" Search Records @@ -116,7 +111,7 @@ dat += "" dat += "" dat += "ID:[active1.fields["id"]]" - dat += "Sex: [active1.fields["sex"]] " + dat += "Gender: [active1.fields["gender"]] " dat += "Age: [active1.fields["age"]] " dat += "Species: [active1.fields["species"]] " dat += "Fingerprint: [active1.fields["fingerprint"]] " @@ -141,7 +136,7 @@ dat += "
Comments/Log" var/counter = 1 - while(src.active2.fields[text("com_[]", counter)]) + while(active2.fields[text("com_[]", counter)]) dat += "[active2.fields[text("com_[]", counter)]]Delete Entry" counter++ dat += "Add Entry" @@ -169,7 +164,7 @@ dat += "
Medical Robots:" var/bdat = null for(var/mob/living/simple_animal/bot/medbot/M in GLOB.alive_mob_list) - if(M.z != src.z) + if(M.z != z) continue //only find medibots on the same z-level as the computer var/turf/bl = get_turf(M) if(bl) //if it can't find a turf for the medibot, then it probably shouldn't be showing up @@ -189,7 +184,7 @@ dat += "{Log In}" var/datum/browser/popup = new(user, "med_rec", "Medical Records Console", 600, 400) popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) popup.open() /obj/machinery/computer/med_data/Topic(href, href_list) @@ -197,29 +192,20 @@ if(.) return . if(!(active1 in GLOB.data_core.general)) - src.active1 = null + active1 = null if(!(active2 in GLOB.data_core.medical)) - src.active2 = null + active2 = null if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr) || IsAdminGhost(usr)) usr.set_machine(src) if(href_list["temp"]) - src.temp = null - if(href_list["scan"]) - if(src.scan) - usr.put_in_hands(scan) - scan = null - else - var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id) - if(I) - if(!usr.transferItemToLoc(I, src)) - return - src.scan = I + temp = null else if(href_list["logout"]) - src.authenticated = null - src.screen = null - src.active1 = null - src.active2 = null + authenticated = null + screen = null + active1 = null + active2 = null + playsound(src, 'sound/machines/terminal_off.ogg', 50, FALSE) else if(href_list["choice"]) // SORTING! if(href_list["choice"] == "Sorting") @@ -234,34 +220,37 @@ sortBy = href_list["sort"] order = initial(order) else if(href_list["login"]) - if(issilicon(usr)) - src.active1 = null - src.active2 = null - src.authenticated = 1 - src.rank = "AI" - src.screen = 1 - else if(IsAdminGhost(usr)) - src.active1 = null - src.active2 = null - src.authenticated = 1 - src.rank = "Central Command" - src.screen = 1 - else if(istype(src.scan, /obj/item/card/id)) - src.active1 = null - src.active2 = null - if(src.check_access(src.scan)) - src.authenticated = src.scan.registered_name - src.rank = src.scan.assignment - src.screen = 1 - if(src.authenticated) - + var/mob/M = usr + var/obj/item/card/id/I = M.get_idcard(TRUE) + if(issilicon(M)) + active1 = null + active2 = null + authenticated = 1 + rank = "AI" + screen = 1 + else if(IsAdminGhost(M)) + active1 = null + active2 = null + authenticated = 1 + rank = "Central Command" + screen = 1 + else if(istype(I) && check_access(I)) + active1 = null + active2 = null + authenticated = I.registered_name + rank = I.assignment + screen = 1 + else + to_chat(usr, "Unauthorized access.") + playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE) + if(authenticated) if(href_list["screen"]) - src.screen = text2num(href_list["screen"]) - if(src.screen < 1) - src.screen = 1 + screen = text2num(href_list["screen"]) + if(screen < 1) + screen = 1 - src.active1 = null - src.active2 = null + active1 = null + active2 = null else if(href_list["vir"]) var/type = href_list["vir"] @@ -269,7 +258,7 @@ var/AfS = "" for(var/mob/M in Dis.viable_mobtypes) AfS += " [initial(M.name)];" - src.temp = {"Name: [Dis.name] + temp = {"Name: [Dis.name]
Number of stages: [Dis.max_stages]
Spread: [Dis.spread_text] Transmission
Possible Cure: [(Dis.cure_text||"none")] @@ -280,110 +269,112 @@
Severity: [Dis.severity]"} else if(href_list["del_all"]) - src.temp = "Are you sure you wish to delete all records?
\n\tYes
\n\tNo
" + temp = "Are you sure you wish to delete all records?
\n\tYes
\n\tNo
" else if(href_list["del_all2"]) investigate_log("[key_name(usr)] has deleted all medical records.", INVESTIGATE_RECORDS) GLOB.data_core.medical.Cut() - src.temp = "All records deleted." + temp = "All records deleted." else if(href_list["field"]) - var/a1 = src.active1 - var/a2 = src.active2 + var/a1 = active1 + var/a2 = active2 switch(href_list["field"]) if("fingerprint") if(active1) - var/t1 = stripped_input("Please input fingerprint hash:", "Med. records", src.active1.fields["fingerprint"], null) + var/t1 = stripped_input("Please input fingerprint hash:", "Med. records", active1.fields["fingerprint"], null) if(!canUseMedicalRecordsConsole(usr, t1, a1)) return - src.active1.fields["fingerprint"] = t1 - if("sex") + active1.fields["fingerprint"] = t1 + if("gender") if(active1) - if(src.active1.fields["sex"] == "Male") - src.active1.fields["sex"] = "Female" + if(active1.fields["gender"] == "Male") + active1.fields["gender"] = "Female" + else if(active1.fields["gender"] == "Female") + active1.fields["gender"] = "Other" else - src.active1.fields["sex"] = "Male" + active1.fields["gender"] = "Male" if("age") if(active1) - var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num + var/t1 = input("Please input age:", "Med. records", active1.fields["age"], null) as num if(!canUseMedicalRecordsConsole(usr, t1, a1)) return - src.active1.fields["age"] = t1 + active1.fields["age"] = t1 if("species") if(active1) - var/t1 = stripped_input("Please input species name", "Med. records", src.active1.fields["species"], null) + var/t1 = stripped_input("Please input species name", "Med. records", active1.fields["species"], null) if(!canUseMedicalRecordsConsole(usr, t1, a1)) return active1.fields["species"] = t1 if("mi_dis") if(active2) - var/t1 = stripped_input("Please input minor disabilities list:", "Med. records", src.active2.fields["mi_dis"], null) + var/t1 = stripped_input("Please input minor disabilities list:", "Med. records", active2.fields["mi_dis"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["mi_dis"] = t1 + active2.fields["mi_dis"] = t1 if("mi_dis_d") if(active2) - var/t1 = stripped_input("Please summarize minor dis.:", "Med. records", src.active2.fields["mi_dis_d"], null) + var/t1 = stripped_input("Please summarize minor dis.:", "Med. records", active2.fields["mi_dis_d"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["mi_dis_d"] = t1 + active2.fields["mi_dis_d"] = t1 if("ma_dis") if(active2) - var/t1 = stripped_input("Please input major disabilities list:", "Med. records", src.active2.fields["ma_dis"], null) + var/t1 = stripped_input("Please input major disabilities list:", "Med. records", active2.fields["ma_dis"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["ma_dis"] = t1 + active2.fields["ma_dis"] = t1 if("ma_dis_d") if(active2) - var/t1 = stripped_input("Please summarize major dis.:", "Med. records", src.active2.fields["ma_dis_d"], null) + var/t1 = stripped_input("Please summarize major dis.:", "Med. records", active2.fields["ma_dis_d"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["ma_dis_d"] = t1 + active2.fields["ma_dis_d"] = t1 if("alg") if(active2) - var/t1 = stripped_input("Please state allergies:", "Med. records", src.active2.fields["alg"], null) + var/t1 = stripped_input("Please state allergies:", "Med. records", active2.fields["alg"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["alg"] = t1 + active2.fields["alg"] = t1 if("alg_d") if(active2) - var/t1 = stripped_input("Please summarize allergies:", "Med. records", src.active2.fields["alg_d"], null) + var/t1 = stripped_input("Please summarize allergies:", "Med. records", active2.fields["alg_d"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["alg_d"] = t1 + active2.fields["alg_d"] = t1 if("cdi") if(active2) - var/t1 = stripped_input("Please state diseases:", "Med. records", src.active2.fields["cdi"], null) + var/t1 = stripped_input("Please state diseases:", "Med. records", active2.fields["cdi"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["cdi"] = t1 + active2.fields["cdi"] = t1 if("cdi_d") if(active2) - var/t1 = stripped_input("Please summarize diseases:", "Med. records", src.active2.fields["cdi_d"], null) + var/t1 = stripped_input("Please summarize diseases:", "Med. records", active2.fields["cdi_d"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["cdi_d"] = t1 + active2.fields["cdi_d"] = t1 if("notes") if(active2) - var/t1 = stripped_input("Please summarize notes:", "Med. records", src.active2.fields["notes"], null) + var/t1 = stripped_input("Please summarize notes:", "Med. records", active2.fields["notes"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["notes"] = t1 + active2.fields["notes"] = t1 if("p_stat") if(active1) - src.temp = "Physical Condition:
\n\t*Deceased*
\n\t*Unconscious*
\n\tActive
\n\tPhysically Unfit
" + temp = "Physical Condition:
\n\t*Deceased*
\n\t*Unconscious*
\n\tActive
\n\tPhysically Unfit
" if("m_stat") if(active1) - src.temp = "Mental Condition:
\n\t*Insane*
\n\t*Unstable*
\n\t*Watch*
\n\tStable
" + temp = "Mental Condition:
\n\t*Insane*
\n\t*Unstable*
\n\t*Watch*
\n\tStable
" if("blood_type") if(active2) - src.temp = "Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
" + temp = "Blood Type:
\n\tA- A+
\n\tB- B+
\n\tAB- AB+
\n\tO- O+
" if("b_dna") if(active2) - var/t1 = stripped_input("Please input DNA hash:", "Med. records", src.active2.fields["b_dna"], null) + var/t1 = stripped_input("Please input DNA hash:", "Med. records", active2.fields["b_dna"], null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return - src.active2.fields["b_dna"] = t1 + active2.fields["b_dna"] = t1 if("show_photo_front") if(active1) if(active1.fields["photo_front"]) @@ -402,51 +393,51 @@ if(active1) switch(href_list["p_stat"]) if("deceased") - src.active1.fields["p_stat"] = "*Deceased*" + active1.fields["p_stat"] = "*Deceased*" if("unconscious") - src.active1.fields["p_stat"] = "*Unconscious*" + active1.fields["p_stat"] = "*Unconscious*" if("active") - src.active1.fields["p_stat"] = "Active" + active1.fields["p_stat"] = "Active" if("unfit") - src.active1.fields["p_stat"] = "Physically Unfit" + active1.fields["p_stat"] = "Physically Unfit" else if(href_list["m_stat"]) if(active1) switch(href_list["m_stat"]) if("insane") - src.active1.fields["m_stat"] = "*Insane*" + active1.fields["m_stat"] = "*Insane*" if("unstable") - src.active1.fields["m_stat"] = "*Unstable*" + active1.fields["m_stat"] = "*Unstable*" if("watch") - src.active1.fields["m_stat"] = "*Watch*" + active1.fields["m_stat"] = "*Watch*" if("stable") - src.active1.fields["m_stat"] = "Stable" + active1.fields["m_stat"] = "Stable" else if(href_list["blood_type"]) if(active2) switch(href_list["blood_type"]) if("an") - src.active2.fields["blood_type"] = "A-" + active2.fields["blood_type"] = "A-" if("bn") - src.active2.fields["blood_type"] = "B-" + active2.fields["blood_type"] = "B-" if("abn") - src.active2.fields["blood_type"] = "AB-" + active2.fields["blood_type"] = "AB-" if("on") - src.active2.fields["blood_type"] = "O-" + active2.fields["blood_type"] = "O-" if("ap") - src.active2.fields["blood_type"] = "A+" + active2.fields["blood_type"] = "A+" if("bp") - src.active2.fields["blood_type"] = "B+" + active2.fields["blood_type"] = "B+" if("abp") - src.active2.fields["blood_type"] = "AB+" + active2.fields["blood_type"] = "AB+" if("op") - src.active2.fields["blood_type"] = "O+" + active2.fields["blood_type"] = "O+" else if(href_list["del_r"]) if(active2) - src.temp = "Are you sure you wish to delete the record (Medical Portion Only)?
\n\tYes
\n\tNo
" + temp = "Are you sure you wish to delete the record (Medical Portion Only)?
\n\tYes
\n\tNo
" else if(href_list["del_r2"]) investigate_log("[key_name(usr)] has deleted the medical records for [active1.fields["name"]].", INVESTIGATE_RECORDS) @@ -463,10 +454,10 @@ screen = 4 else if(href_list["new"]) - if((istype(src.active1, /datum/data/record) && !( istype(src.active2, /datum/data/record) ))) + if((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) ))) var/datum/data/record/R = new /datum/data/record( ) - R.fields["name"] = src.active1.fields["name"] - R.fields["id"] = src.active1.fields["id"] + R.fields["name"] = active1.fields["name"] + R.fields["id"] = active1.fields["id"] R.name = text("Medical Record #[]", R.fields["id"]) R.fields["blood_type"] = "Unknown" R.fields["b_dna"] = "Unknown" @@ -480,76 +471,77 @@ R.fields["cdi_d"] = "No diseases have been diagnosed at the moment." R.fields["notes"] = "No notes." GLOB.data_core.medical += R - src.active2 = R - src.screen = 4 + active2 = R + screen = 4 else if(href_list["add_c"]) if(!(active2 in GLOB.data_core.medical)) return - var/a2 = src.active2 + var/a2 = active2 var/t1 = stripped_multiline_input("Add Comment:", "Med. records", null, null) if(!canUseMedicalRecordsConsole(usr, t1, null, a2)) return var/counter = 1 - while(src.active2.fields[text("com_[]", counter)]) + while(active2.fields[text("com_[]", counter)]) counter++ - src.active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
[]", src.authenticated, src.rank, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) + active2.fields[text("com_[]", counter)] = text("Made by [] ([]) on [] [], []
[]", authenticated, rank, STATION_TIME_TIMESTAMP("hh:mm:ss"), time2text(world.realtime, "MMM DD"), GLOB.year_integer+540, t1) else if(href_list["del_c"]) - if((istype(src.active2, /datum/data/record) && src.active2.fields[text("com_[]", href_list["del_c"])])) - src.active2.fields[text("com_[]", href_list["del_c"])] = "Deleted" + if((istype(active2, /datum/data/record) && active2.fields[text("com_[]", href_list["del_c"])])) + active2.fields[text("com_[]", href_list["del_c"])] = "Deleted" else if(href_list["search"]) var/t1 = stripped_input(usr, "Search String: (Name, DNA, or ID)", "Med. records") if(!canUseMedicalRecordsConsole(usr, t1)) return - src.active1 = null - src.active2 = null + active1 = null + active2 = null t1 = lowertext(t1) for(var/datum/data/record/R in GLOB.data_core.medical) if((lowertext(R.fields["name"]) == t1 || t1 == lowertext(R.fields["id"]) || t1 == lowertext(R.fields["b_dna"]))) - src.active2 = R + active2 = R else //Foreach continue //goto(3229) - if(!( src.active2 )) - src.temp = text("Could not locate record [].", sanitize(t1)) + if(!( active2 )) + temp = text("Could not locate record [].", sanitize(t1)) else for(var/datum/data/record/E in GLOB.data_core.general) - if((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"])) - src.active1 = E + if((E.fields["name"] == active2.fields["name"] || E.fields["id"] == active2.fields["id"])) + active1 = E else //Foreach continue //goto(3334) - src.screen = 4 + screen = 4 else if(href_list["print_p"]) - if(!( src.printing )) - src.printing = 1 + if(!( printing )) + printing = 1 GLOB.data_core.medicalPrintCount++ playsound(loc, 'sound/items/poster_being_created.ogg', 100, 1) sleep(30) - var/obj/item/paper/P = new /obj/item/paper( src.loc ) + var/obj/item/paper/P = new /obj/item/paper( loc ) P.info = "
Medical Record - (MR-[GLOB.data_core.medicalPrintCount])

" if(active1 in GLOB.data_core.general) - P.info += text("Name: [] ID: []
\nSex: []
\nAge: []
", src.active1.fields["name"], src.active1.fields["id"], src.active1.fields["sex"], src.active1.fields["age"]) + P.info += text("Name: [] ID: []
\nGender: []
\nAge: []
", active1.fields["name"], active1.fields["id"], active1.fields["gender"], active1.fields["age"]) P.info += "\nSpecies: [active1.fields["species"]]
" - P.info += text("\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", src.active1.fields["fingerprint"], src.active1.fields["p_stat"], src.active1.fields["m_stat"]) + P.info += text("\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"]) else P.info += "General Record Lost!
" if(active2 in GLOB.data_core.medical) - P.info += text("
\n
Medical Data

\nBlood Type: []
\nDNA: []
\n
\nMinor Disabilities: []
\nDetails: []
\n
\nMajor Disabilities: []
\nDetails: []
\n
\nAllergies: []
\nDetails: []
\n
\nCurrent Diseases: [] (per disease info placed in log/comment section)
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", src.active2.fields["blood_type"], src.active2.fields["b_dna"], src.active2.fields["mi_dis"], src.active2.fields["mi_dis_d"], src.active2.fields["ma_dis"], src.active2.fields["ma_dis_d"], src.active2.fields["alg"], src.active2.fields["alg_d"], src.active2.fields["cdi"], src.active2.fields["cdi_d"], src.active2.fields["notes"]) + P.info += text("
\n
Medical Data

\nBlood Type: []
\nDNA: []
\n
\nMinor Disabilities: []
\nDetails: []
\n
\nMajor Disabilities: []
\nDetails: []
\n
\nAllergies: []
\nDetails: []
\n
\nCurrent Diseases: [] (per disease info placed in log/comment section)
\nDetails: []
\n
\nImportant Notes:
\n\t[]
\n
\n
Comments/Log

", active2.fields["blood_type"], active2.fields["b_dna"], active2.fields["mi_dis"], active2.fields["mi_dis_d"], active2.fields["ma_dis"], active2.fields["ma_dis_d"], active2.fields["alg"], active2.fields["alg_d"], active2.fields["cdi"], active2.fields["cdi_d"], active2.fields["notes"]) var/counter = 1 - while(src.active2.fields[text("com_[]", counter)]) - P.info += text("[]
", src.active2.fields[text("com_[]", counter)]) + while(active2.fields[text("com_[]", counter)]) + P.info += text("[]
", active2.fields[text("com_[]", counter)]) counter++ - P.name = text("MR-[] '[]'", GLOB.data_core.medicalPrintCount, src.active1.fields["name"]) + P.name = text("MR-[] '[]'", GLOB.data_core.medicalPrintCount, active1.fields["name"]) else P.info += "Medical Record Lost!
" P.name = text("MR-[] '[]'", GLOB.data_core.medicalPrintCount, "Record Lost") P.info += "" - src.printing = null + P.update_icon() + printing = null - src.add_fingerprint(usr) - src.updateUsrDialog() + add_fingerprint(usr) + updateUsrDialog() return /obj/machinery/computer/med_data/emp_act(severity) @@ -560,11 +552,11 @@ switch(rand(1,6)) if(1) if(prob(10)) - R.fields["name"] = random_unique_lizard_name(R.fields["sex"],1) + R.fields["name"] = random_unique_lizard_name(R.fields["gender"],1) else - R.fields["name"] = random_unique_name(R.fields["sex"],1) + R.fields["name"] = random_unique_name(R.fields["gender"],1) if(2) - R.fields["sex"] = pick("Male", "Female") + R.fields["gender"] = pick("Male", "Female", "Other") if(3) R.fields["age"] = rand(AGE_MIN, AGE_MAX) if(4) @@ -583,7 +575,7 @@ if(user) if(message) if(authenticated) - if(user.canUseTopic(src)) + if(user.canUseTopic(src, BE_CLOSE)) if(!record1 || record1 == active1) if(!record2 || record2 == active2) return 1 diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 798b0e4c65..a852612d9d 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -1,143 +1 @@ /obj/machinery/computer/prisoner - name = "prisoner management console" - desc = "Used to manage tracking implants placed inside criminals." - icon_screen = "explosive" - icon_keyboard = "security_key" - req_access = list(ACCESS_BRIG) - var/id = 0 - var/temp = null - var/status = 0 - var/timeleft = 60 - var/stop = 0 - var/screen = 0 // 0 - No Access Denied, 1 - Access allowed - var/obj/item/card/id/prisoner/inserted_id - circuit = /obj/item/circuitboard/computer/prisoner - - light_color = LIGHT_COLOR_RED - -/obj/machinery/computer/prisoner/ui_interact(mob/user) - . = ..() - var/dat = "" - if(screen == 0) - dat += "
Unlock Console" - else if(screen == 1) - dat += "

Prisoner ID Management

" - if(inserted_id) - dat += text("[inserted_id]
") - dat += text("Collected Points: [inserted_id.points]. Reset.
") - dat += text("Card goal: [inserted_id.goal]. Set
") - dat += text("Space Law recommends quotas of 100 points per minute they would normally serve in the brig.
") - else - dat += text("Insert Prisoner ID.
") - dat += "

Prisoner Implant Management

" - dat += "
Chemical Implants
" - var/turf/Tr = null - for(var/obj/item/implant/chem/C in GLOB.tracked_chem_implants) - Tr = get_turf(C) - if((Tr) && (Tr.z != src.z)) - continue//Out of range - if(!C.imp_in) - continue - dat += "ID: [C.imp_in.name] | Remaining Units: [C.reagents.total_volume]
" - dat += "| Inject: " - dat += "((1))" - dat += "((5))" - dat += "((10))
" - dat += "********************************
" - dat += "
Tracking Implants
" - for(var/obj/item/implant/tracking/T in GLOB.tracked_implants) - if(!isliving(T.imp_in)) - continue - Tr = get_turf(T) - if((Tr) && (Tr.z != src.z)) - continue//Out of range - - var/loc_display = "Unknown" - var/mob/living/M = T.imp_in - if(is_station_level(Tr.z) && !isspaceturf(M.loc)) - var/turf/mob_loc = get_turf(M) - loc_display = mob_loc.loc - - dat += "ID: [T.imp_in.name] | Location: [loc_display]
" - dat += "(Message Holder) |
" - dat += "********************************
" - dat += "
Lock Console" - var/datum/browser/popup = new(user, "computer", "Prisoner Management Console", 400, 500) - popup.set_content(dat) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - return - -/obj/machinery/computer/prisoner/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/card/id)) - return attack_hand(user) - else - return ..() - -/obj/machinery/computer/prisoner/process() - if(!..()) - src.updateDialog() - return - - -/obj/machinery/computer/prisoner/Topic(href, href_list) - if(..()) - return - if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) - usr.set_machine(src) - - if(href_list["id"]) - if(href_list["id"] =="insert" && !inserted_id) - var/obj/item/card/id/prisoner/I = usr.is_holding_item_of_type(/obj/item/card/id/prisoner) - if(I) - if(!usr.transferItemToLoc(I, src)) - return - inserted_id = I - else - to_chat(usr, "No valid ID.") - else if(inserted_id) - switch(href_list["id"]) - if("eject") - inserted_id.forceMove(drop_location()) - inserted_id.verb_pickup() - inserted_id = null - if("reset") - inserted_id.points = 0 - if("setgoal") - var/num = round(input(usr, "Choose prisoner's goal:", "Input an Integer", null) as num|null) - if(num >= 0) - num = min(num,1000) //Cap the quota to the equivilent of 10 minutes. - inserted_id.goal = num - else if(href_list["inject1"]) - var/obj/item/implant/I = locate(href_list["inject1"]) in GLOB.tracked_chem_implants - if(I && istype(I)) - I.activate(1) - else if(href_list["inject5"]) - var/obj/item/implant/I = locate(href_list["inject5"]) in GLOB.tracked_chem_implants - if(I && istype(I)) - I.activate(5) - - else if(href_list["inject10"]) - var/obj/item/implant/I = locate(href_list["inject10"]) in GLOB.tracked_chem_implants - if(I && istype(I)) - I.activate(10) - - else if(href_list["lock"]) - if(src.allowed(usr)) - screen = !screen - else - to_chat(usr, "Unauthorized Access.") - - else if(href_list["warn"]) - var/warning = copytext(sanitize(input(usr,"Message:","Enter your message here!","")),1,MAX_MESSAGE_LEN) - if(!warning) - return - var/obj/item/implant/I = locate(href_list["warn"]) in GLOB.tracked_implants - if(I && istype(I) && I.imp_in) - var/mob/living/R = I.imp_in - to_chat(R, "You hear a voice in your head saying: '[warning]'") - log_directed_talk(usr, R, warning, LOG_SAY, "implant message") - - src.add_fingerprint(usr) - src.updateUsrDialog() - return diff --git a/code/game/machinery/computer/prisoner/_prisoner.dm b/code/game/machinery/computer/prisoner/_prisoner.dm new file mode 100644 index 0000000000..d07c351a22 --- /dev/null +++ b/code/game/machinery/computer/prisoner/_prisoner.dm @@ -0,0 +1,52 @@ +/obj/machinery/computer/prisoner + var/obj/item/card/id/prisoner/contained_id + +/obj/machinery/computer/prisoner/Destroy() + if(contained_id) + contained_id.forceMove(get_turf(src)) + return ..() + + +/obj/machinery/computer/prisoner/examine(mob/user) + . = ..() + if(contained_id) + . += "Alt-click to eject the ID card." + + + +/obj/machinery/computer/prisoner/AltClick(mob/user) + id_eject(user) + return ..() + +/obj/machinery/computer/prisoner/proc/id_insert(mob/user, obj/item/card/id/prisoner/P) + if(istype(P)) + if(contained_id) + to_chat(user, "There's already an ID card in the console!") + return + if(!user.transferItemToLoc(P, src)) + return + contained_id = P + user.visible_message("[user] inserts an ID card into the console.", \ + "You insert the ID card into the console.") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + updateUsrDialog() + +/obj/machinery/computer/prisoner/proc/id_eject(mob/user) + if(!contained_id) + to_chat(user, "There's no ID card in the console!") + return + else + contained_id.forceMove(drop_location()) + if(!issilicon(user) && Adjacent(user)) + user.put_in_hands(contained_id) + contained_id = null + user.visible_message("[user] gets an ID card from the console.", \ + "You get the ID card from the console.") + playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, FALSE) + updateUsrDialog() + +/obj/machinery/computer/prisoner/attackby(obj/item/I, mob/user) + if(istype(I, /obj/item/card/id/prisoner)) + id_insert(user, I) + else + return ..() diff --git a/code/game/machinery/computer/prisoner/gulag_teleporter.dm b/code/game/machinery/computer/prisoner/gulag_teleporter.dm new file mode 100644 index 0000000000..f6e164efe9 --- /dev/null +++ b/code/game/machinery/computer/prisoner/gulag_teleporter.dm @@ -0,0 +1,142 @@ +//computer that handle the points and teleports the prisoner +/obj/machinery/computer/prisoner/gulag_teleporter_computer + name = "labor camp teleporter console" + desc = "Used to send criminals to the Labor Camp." + icon_screen = "explosive" + icon_keyboard = "security_key" + req_access = list(ACCESS_ARMORY) + circuit = /obj/item/circuitboard/computer/gulag_teleporter_console + var/default_goal = 200 + var/obj/machinery/gulag_teleporter/teleporter = null + var/obj/structure/gulag_beacon/beacon = null + var/mob/living/carbon/human/prisoner = null + var/datum/data/record/temporary_record = null + + light_color = LIGHT_COLOR_RED + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/Initialize() + . = ..() + scan_machinery() + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ + datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "gulag_console", name, 455, 440, master_ui, state) + ui.open() + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/ui_data(mob/user) + var/list/data = list() + + var/list/prisoner_list = list() + var/can_teleport = FALSE + + if(teleporter && (teleporter.occupant && ishuman(teleporter.occupant))) + prisoner = teleporter.occupant + prisoner_list["name"] = prisoner.real_name + if(contained_id) + can_teleport = TRUE + if(!isnull(GLOB.data_core.general)) + for(var/r in GLOB.data_core.security) + var/datum/data/record/R = r + if(R.fields["name"] == prisoner_list["name"]) + temporary_record = R + prisoner_list["crimstat"] = temporary_record.fields["criminal"] + + data["prisoner"] = prisoner_list + + if(teleporter) + data["teleporter"] = teleporter + data["teleporter_location"] = "([teleporter.x], [teleporter.y], [teleporter.z])" + data["teleporter_lock"] = teleporter.locked + data["teleporter_state_open"] = teleporter.state_open + if(beacon) + data["beacon"] = beacon + data["beacon_location"] = "([beacon.x], [beacon.y], [beacon.z])" + if(contained_id) + data["id"] = contained_id + data["id_name"] = contained_id.registered_name + data["goal"] = contained_id.goal + data["can_teleport"] = can_teleport + + return data + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/ui_act(action, list/params) + if(isliving(usr)) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) + if(..()) + return + if(!allowed(usr)) + to_chat(usr, "Access denied.") + return + switch(action) + if("scan_teleporter") + teleporter = findteleporter() + if("scan_beacon") + beacon = findbeacon() + if("handle_id") + if(contained_id) + id_eject(usr) + else + id_insert(usr) + if("set_goal") + var/new_goal = input("Set the amount of points:", "Points", contained_id.goal) as num|null + if(!isnum(new_goal)) + return + if(!new_goal) + new_goal = default_goal + if (new_goal > 1000) + to_chat(usr, "The entered amount of points is too large. Points have instead been set to the maximum allowed amount.") + contained_id.goal = CLAMP(new_goal, 0, 1000) //maximum 1000 points + if("toggle_open") + if(teleporter.locked) + to_chat(usr, "The teleporter is locked") + return + teleporter.toggle_open() + if("teleporter_lock") + if(teleporter.state_open) + to_chat(usr, "Close the teleporter before locking!") + return + teleporter.locked = !teleporter.locked + if("teleport") + if(!teleporter || !beacon) + return + addtimer(CALLBACK(src, .proc/teleport, usr), 5) + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/proc/scan_machinery() + teleporter = findteleporter() + beacon = findbeacon() + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/proc/findteleporter() + var/obj/machinery/gulag_teleporter/teleporterf = null + + for(var/direction in GLOB.cardinals) + teleporterf = locate(/obj/machinery/gulag_teleporter, get_step(src, direction)) + if(teleporterf && teleporterf.is_operational()) + return teleporterf + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/proc/findbeacon() + return locate(/obj/structure/gulag_beacon) + +/obj/machinery/computer/prisoner/gulag_teleporter_computer/proc/teleport(mob/user) + if(!contained_id) //incase the ID was removed after the transfer timer was set. + say("Warning: Unable to transfer prisoner without a valid Prisoner ID inserted!") + return + var/id_goal_not_set + if(!contained_id.goal) + id_goal_not_set = TRUE + contained_id.goal = default_goal + say("[contained_id]'s ID card goal defaulting to [contained_id.goal] points.") + log_game("[key_name(user)] teleported [key_name(prisoner)] to the Labor Camp [COORD(beacon)] for [id_goal_not_set ? "default goal of ":""][contained_id.goal] points.") + teleporter.handle_prisoner(contained_id, temporary_record) + playsound(src, 'sound/weapons/emitter.ogg', 50, 1) + prisoner.forceMove(get_turf(beacon)) + prisoner.Stun(40) // small travel dizziness + to_chat(prisoner, "The teleportation makes you a little dizzy.") + new /obj/effect/particle_effect/sparks(get_turf(prisoner)) + playsound(src, "sparks", 50, 1) + if(teleporter.locked) + teleporter.locked = FALSE + teleporter.toggle_open() + contained_id = null + temporary_record = null diff --git a/code/game/machinery/computer/prisoner/management.dm b/code/game/machinery/computer/prisoner/management.dm new file mode 100644 index 0000000000..e231a1748a --- /dev/null +++ b/code/game/machinery/computer/prisoner/management.dm @@ -0,0 +1,139 @@ + +/obj/machinery/computer/prisoner/management + name = "prisoner management console" + desc = "Used to manage tracking implants placed inside criminals." + icon_screen = "explosive" + icon_keyboard = "security_key" + req_access = list(ACCESS_BRIG) + var/id = 0 + var/temp = null + var/status = 0 + var/timeleft = 60 + var/stop = 0 + var/screen = 0 // 0 - No Access Denied, 1 - Access allowed + circuit = /obj/item/circuitboard/computer/prisoner + + light_color = LIGHT_COLOR_RED + +/obj/machinery/computer/prisoner/management/ui_interact(mob/user) + . = ..() + if(isliving(user)) + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) + var/dat = "" + if(screen == 0) + dat += "
{Log In}" + else if(screen == 1) + dat += "

Prisoner ID Management

" + if(contained_id) + dat += text("[contained_id]
") + dat += text("Collected Points: [contained_id.points]. Reset.
") + dat += text("Card goal: [contained_id.goal]. Set
") + dat += text("Space Law recommends quotas of 100 points per minute they would normally serve in the brig.
") + else + dat += text("Insert Prisoner ID.
") + dat += "

Prisoner Implant Management

" + dat += "
Chemical Implants
" + var/turf/Tr = null + for(var/obj/item/implant/chem/C in GLOB.tracked_chem_implants) + Tr = get_turf(C) + if((Tr) && (Tr.z != src.z)) + continue//Out of range + if(!C.imp_in) + continue + dat += "ID: [C.imp_in.name] | Remaining Units: [C.reagents.total_volume]
" + dat += "| Inject: " + dat += "((1))" + dat += "((5))" + dat += "((10))
" + dat += "********************************
" + dat += "
Tracking Implants
" + for(var/obj/item/implant/tracking/T in GLOB.tracked_implants) + if(!isliving(T.imp_in)) + continue + Tr = get_turf(T) + if((Tr) && (Tr.z != src.z)) + continue//Out of range + + var/loc_display = "Unknown" + var/mob/living/M = T.imp_in + if(is_station_level(Tr.z) && !isspaceturf(M.loc)) + var/turf/mob_loc = get_turf(M) + loc_display = mob_loc.loc + + dat += "ID: [T.imp_in.name] | Location: [loc_display]
" + dat += "(Message Holder) |
" + dat += "********************************
" + dat += "
{Log Out}" + var/datum/browser/popup = new(user, "computer", "Prisoner Management Console", 400, 500) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + return + +/obj/machinery/computer/prisoner/management/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/card/id)) + if(screen) + id_insert(user) + else + to_chat(user, "Unauthorized access.") + else + return ..() + +/obj/machinery/computer/prisoner/management/process() + if(!..()) + src.updateDialog() + return + +/obj/machinery/computer/prisoner/management/Topic(href, href_list) + if(..()) + return + if(usr.contents.Find(src) || (in_range(src, usr) && isturf(loc)) || issilicon(usr)) + usr.set_machine(src) + + if(href_list["id"]) + if(href_list["id"] =="insert" && !contained_id) + id_insert(usr) + else if(contained_id) + switch(href_list["id"]) + if("eject") + id_eject(usr) + if("reset") + contained_id.points = 0 + if("setgoal") + var/num = round(input(usr, "Choose prisoner's goal:", "Input an Integer", null) as num|null) + if(num >= 0) + num = min(num,1000) //Cap the quota to the equivilent of 10 minutes. + contained_id.goal = num + else if(href_list["inject1"]) + var/obj/item/implant/I = locate(href_list["inject1"]) in GLOB.tracked_chem_implants + if(I && istype(I)) + I.activate(1) + else if(href_list["inject5"]) + var/obj/item/implant/I = locate(href_list["inject5"]) in GLOB.tracked_chem_implants + if(I && istype(I)) + I.activate(5) + else if(href_list["inject10"]) + var/obj/item/implant/I = locate(href_list["inject10"]) in GLOB.tracked_chem_implants + if(I && istype(I)) + I.activate(10) + + else if(href_list["lock"]) + if(allowed(usr)) + screen = !screen + playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE) + else + to_chat(usr, "Unauthorized access.") + + else if(href_list["warn"]) + var/warning = copytext(sanitize(input(usr,"Message:","Enter your message here!","")),1,MAX_MESSAGE_LEN) + if(!warning) + return + var/obj/item/implant/I = locate(href_list["warn"]) in GLOB.tracked_implants + if(I && istype(I) && I.imp_in) + var/mob/living/R = I.imp_in + to_chat(R, "You hear a voice in your head saying: '[warning]'") + log_directed_talk(usr, R, warning, LOG_SAY, "implant message") + + src.add_fingerprint(usr) + src.updateUsrDialog() + return diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 607f8dbe78..1823e34100 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -5,13 +5,10 @@ icon_keyboard = "security_key" req_one_access = list(ACCESS_SECURITY, ACCESS_FORENSICS_LOCKERS) circuit = /obj/item/circuitboard/computer/secure_data - var/obj/item/card/id/scan = null - var/authenticated = null var/rank = null var/screen = null var/datum/data/record/active1 = null var/datum/data/record/active2 = null - var/a_id = null var/temp = null var/printing = null var/can_change_id = 0 @@ -23,11 +20,6 @@ light_color = LIGHT_COLOR_RED -/obj/machinery/computer/secure_data/examine(mob/user) - ..() - if(scan) - to_chat(user, "Alt-click to eject the ID card.") - /obj/machinery/computer/secure_data/syndie icon_keyboard = "syndie_key" @@ -40,32 +32,19 @@ clockwork = TRUE //it'd look weird pass_flags = PASSTABLE -/obj/machinery/computer/secure_data/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/card/id)) - if(!scan) - if(!user.transferItemToLoc(O, src)) - return - scan = O - to_chat(user, "You insert [O].") - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - updateUsrDialog() - else - to_chat(user, "There's already an ID card in the console.") - else - return ..() - //Someone needs to break down the dat += into chunks instead of long ass lines. /obj/machinery/computer/secure_data/ui_interact(mob/user) . = ..() + playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, FALSE) if(src.z > 6) to_chat(user, "Unable to establish a connection: \black You're too far away from the station!") return var/dat if(temp) - dat = text("[]

Clear Screen", temp) + dat = "[temp]

Clear Screen" else - dat = text("Confirm Identity: []
", (scan ? text("[]", scan.name) : "----------")) + dat = "" if(authenticated) switch(screen) if(1) @@ -190,7 +169,7 @@ dat += {"
- + "} dat += "" dat += {" @@ -309,36 +288,39 @@ What a mess.*/ active1 = null active2 = null - if("Confirm Identity") - eject_id(usr) - if("Log Out") authenticated = null screen = null active1 = null active2 = null + playsound(src, 'sound/machines/terminal_off.ogg', 50, FALSE) if("Log In") - if(issilicon(usr)) - var/mob/living/silicon/borg = usr + var/mob/M = usr + var/obj/item/card/id/I = M.get_idcard(TRUE) + if(issilicon(M)) + var/mob/living/silicon/borg = M active1 = null active2 = null authenticated = borg.name rank = "AI" screen = 1 - else if(IsAdminGhost(usr)) + else if(IsAdminGhost(M)) active1 = null active2 = null - authenticated = usr.client.holder.admin_signature + authenticated = M.client.holder.admin_signature rank = "Central Command" screen = 1 - else if(istype(scan, /obj/item/card/id)) + else if(I && check_access(I)) active1 = null active2 = null - if(check_access(scan)) - authenticated = scan.registered_name - rank = scan.assignment - screen = 1 + authenticated = I.registered_name + rank = I.assignment + screen = 1 + else + to_chat(usr, "Unauthorized Access.") + playsound(src, 'sound/machines/terminal_on.ogg', 50, FALSE) + //RECORD FUNCTIONS if("Record Maintenance") screen = 2 @@ -346,16 +328,14 @@ What a mess.*/ active2 = null if("Browse Record") - var/datum/data/record/R = locate(href_list["d_rec"]) - var/S = locate(href_list["d_rec"]) - if(!( GLOB.data_core.general.Find(R) )) + var/datum/data/record/R = locate(href_list["d_rec"]) in GLOB.data_core.general + if(!R) temp = "Record Not Found!" else + active1 = active2 = R for(var/datum/data/record/E in GLOB.data_core.security) if((E.fields["name"] == R.fields["name"] || E.fields["id"] == R.fields["id"])) - S = E - active1 = R - active2 = S + active2 = E screen = 3 @@ -368,7 +348,7 @@ What a mess.*/ var/obj/item/paper/P = new /obj/item/paper( loc ) P.info = "
Security Record - (SR-[GLOB.data_core.securityPrintCount])

" if((istype(active1, /datum/data/record) && GLOB.data_core.general.Find(active1))) - P.info += text("Name: [] ID: []
\nSex: []
\nAge: []
", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"]) + P.info += text("Name: [] ID: []
\nGender: []
\nAge: []
", active1.fields["name"], active1.fields["id"], active1.fields["gender"], active1.fields["age"]) P.info += "\nSpecies: [active1.fields["species"]]
" P.info += text("\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
", active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"]) else @@ -419,6 +399,7 @@ What a mess.*/ P.info += "Security Record Lost!
" P.name = text("SR-[] '[]'", GLOB.data_core.securityPrintCount, "Record Lost") P.info += "" + P.update_icon() printing = null if("Print Poster") if(!( printing )) @@ -512,7 +493,7 @@ What a mess.*/ G.fields["name"] = "New Record" G.fields["id"] = "[num2hex(rand(1, 1.6777215E7), 6)]" G.fields["rank"] = "Unassigned" - G.fields["sex"] = "Male" + G.fields["gender"] = "Male" G.fields["age"] = "Unknown" G.fields["species"] = "Human" G.fields["photo_front"] = new /icon() @@ -584,12 +565,14 @@ What a mess.*/ if(!canUseSecurityRecordsConsole(usr, t1, a1)) return active1.fields["fingerprint"] = t1 - if("sex") + if("gender") if(istype(active1, /datum/data/record)) - if(active1.fields["sex"] == "Male") - active1.fields["sex"] = "Female" + if(active1.fields["gender"] == "Male") + active1.fields["gender"] = "Female" + else if(active1.fields["gender"] == "Female") + active1.fields["gender"] = "Other" else - active1.fields["sex"] = "Male" + active1.fields["gender"] = "Male" if("age") if(istype(active1, /datum/data/record)) var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num @@ -767,19 +750,14 @@ What a mess.*/ P = user.get_active_held_item() return P -/obj/machinery/computer/secure_data/proc/print_photo(icon/temp, name) +/obj/machinery/computer/secure_data/proc/print_photo(icon/temp, person_name) if (printing) return printing = TRUE sleep(20) var/obj/item/photo/P = new/obj/item/photo(drop_location()) - var/icon/small_img = icon(temp) - var/icon/ic = icon('icons/obj/items_and_weapons.dmi',"photo") - small_img.Scale(8, 8) - ic.Blend(small_img,ICON_OVERLAY, 13, 13) - P.icon = ic - P.picture.picture_image = temp - P.desc = "The photo on file for [name]." + var/datum/picture/toEmbed = new(name = person_name, desc = "The photo on file for [person_name].", image = temp) + P.set_picture(toEmbed, TRUE, TRUE) P.pixel_x = rand(-10, 10) P.pixel_y = rand(-10, 10) printing = FALSE @@ -799,7 +777,7 @@ What a mess.*/ else R.fields["name"] = "[pick(pick(GLOB.first_names_male), pick(GLOB.first_names_female))] [pick(GLOB.last_names)]" if(2) - R.fields["sex"] = pick("Male", "Female") + R.fields["gender"] = pick("Male", "Female", "Other") if(3) R.fields["age"] = rand(5, 85) if(4) @@ -823,7 +801,7 @@ What a mess.*/ /obj/machinery/computer/secure_data/proc/canUseSecurityRecordsConsole(mob/user, message1 = 0, record1, record2) if(user) if(authenticated) - if(user.canUseTopic(src)) + if(user.canUseTopic(src, BE_CLOSE)) if(!trim(message1)) return 0 if(!record1 || record1 == active1) @@ -831,22 +809,3 @@ What a mess.*/ return 1 return 0 -/obj/machinery/computer/secure_data/AltClick(mob/user) - if(user.canUseTopic(src)) - eject_id(user) - -/obj/machinery/computer/secure_data/proc/eject_id(mob/user) - if(scan) - scan.forceMove(drop_location()) - if(!issilicon(user) && Adjacent(user)) - user.put_in_hands(scan) - scan = null - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) - else //switching the ID with the one you're holding - if(issilicon(user) || !Adjacent(user)) - return - var/obj/item/card/id/held_id = user.is_holding_item_of_type(/obj/item/card/id) - if(QDELETED(held_id) || !user.transferItemToLoc(held_id, src)) - return - scan = held_id - playsound(src, 'sound/machines/terminal_insert_disc.ogg', 50, 0) diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm index f6cb58bbbc..89ec0dec7a 100644 --- a/code/game/machinery/gulag_item_reclaimer.dm +++ b/code/game/machinery/gulag_item_reclaimer.dm @@ -9,7 +9,6 @@ idle_power_usage = 100 active_power_usage = 2500 var/list/stored_items = list() - var/obj/item/card/id/prisoner/inserted_id = null var/obj/machinery/gulag_teleporter/linked_teleporter = null /obj/machinery/gulag_item_reclaimer/Destroy() @@ -18,9 +17,6 @@ I.forceMove(get_turf(src)) if(linked_teleporter) linked_teleporter.linked_reclaimer = null - if(inserted_id) - inserted_id.forceMove(get_turf(src)) - inserted_id = null return ..() /obj/machinery/gulag_item_reclaimer/emag_act(mob/user) @@ -29,18 +25,6 @@ req_access = list() obj_flags |= EMAGGED -/obj/machinery/gulag_item_reclaimer/attackby(obj/item/I, mob/user) - if(istype(I, /obj/item/card/id)) - if(!inserted_id) - if(!user.transferItemToLoc(I, src)) - return - inserted_id = I - to_chat(user, "You insert [I].") - return - else - to_chat(user, "There's an ID inserted already.") - return ..() - /obj/machinery/gulag_item_reclaimer/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) @@ -55,15 +39,19 @@ if(allowed(user)) can_reclaim = TRUE - if(inserted_id) - data["id"] = inserted_id - data["id_name"] = inserted_id.registered_name - if(inserted_id.points >= inserted_id.goal) + var/obj/item/card/id/I = user.get_idcard(TRUE) + if(istype(I, /obj/item/card/id/prisoner)) + var/obj/item/card/id/prisoner/P = I + if(P.points >= P.goal) can_reclaim = TRUE var/list/mobs = list() for(var/i in stored_items) var/mob/thismob = i + if(QDELETED(thismob)) + say("Alert! Unable to locate vital signals of a previously processed prisoner. Ejecting equipment!") + drop_items(thismob) + continue var/list/mob_info = list() mob_info["name"] = thismob.real_name mob_info["mob"] = "[REF(thismob)]" @@ -78,16 +66,6 @@ /obj/machinery/gulag_item_reclaimer/ui_act(action, list/params) switch(action) - if("handle_id") - if(inserted_id) - usr.put_in_hands(inserted_id) - inserted_id = null - else - var/obj/item/I = usr.is_holding_item_of_type(/obj/item/card/id) - if(I) - if(!usr.transferItemToLoc(I, src)) - return - inserted_id = I if("release_items") var/mob/M = locate(params["mobref"]) if(M == usr || allowed(usr)) @@ -98,8 +76,9 @@ /obj/machinery/gulag_item_reclaimer/proc/drop_items(mob/user) if(!stored_items[user]) return + var/drop_location = drop_location() for(var/i in stored_items[user]) var/obj/item/W = i stored_items[user] -= W - W.forceMove(get_turf(src)) + W.forceMove(drop_location) stored_items -= user diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 7d2ffe0a02..9035c8d47c 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -162,10 +162,11 @@ /obj/item/circuitboard/computer/prisoner name = "Prisoner Management Console (Computer Board)" - build_path = /obj/machinery/computer/prisoner + build_path = /obj/machinery/computer/prisoner/management + /obj/item/circuitboard/computer/gulag_teleporter_console name = "Labor Camp teleporter console (Computer Board)" - build_path = /obj/machinery/computer/gulag_teleporter_computer + build_path = /obj/machinery/computer/prisoner/gulag_teleporter_computer /obj/item/circuitboard/computer/rdconsole/production name = "R&D Console Production Only (Computer Board)" @@ -366,4 +367,4 @@ /obj/item/circuitboard/computer/nanite_cloud_controller name = "Nanite Cloud Control (Computer Board)" - build_path = /obj/machinery/computer/nanite_cloud_controller \ No newline at end of file + build_path = /obj/machinery/computer/nanite_cloud_controller diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 4a628c5f34..b8a536279d 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -10,12 +10,10 @@ GLOBAL_LIST(labor_sheet_values) density = FALSE var/obj/machinery/mineral/stacking_machine/laborstacker/stacking_machine = null var/machinedir = SOUTH - var/obj/item/card/id/prisoner/inserted_id var/obj/machinery/door/airlock/release_door var/door_tag = "prisonshuttle" var/obj/item/radio/Radio //needed to send messages to sec radio - /obj/machinery/mineral/labor_claim_console/Initialize() . = ..() Radio = new/obj/item/radio(src) @@ -34,18 +32,6 @@ GLOBAL_LIST(labor_sheet_values) /proc/cmp_sheet_list(list/a, list/b) return a["value"] - b["value"] -/obj/machinery/mineral/labor_claim_console/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/card/id/prisoner)) - if(!inserted_id) - if(!user.transferItemToLoc(I, src)) - return - inserted_id = I - to_chat(user, "You insert [I].") - return - else - to_chat(user, "There's an ID inserted already.") - return ..() - /obj/machinery/mineral/labor_claim_console/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \ datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) @@ -58,14 +44,20 @@ GLOBAL_LIST(labor_sheet_values) var/can_go_home = FALSE data["emagged"] = (obj_flags & EMAGGED) ? 1 : 0 - if(inserted_id) - data["id"] = inserted_id - data["id_name"] = inserted_id.registered_name - data["points"] = inserted_id.points - data["goal"] = inserted_id.goal - if(check_auth()) + if(obj_flags & EMAGGED) can_go_home = TRUE + data["status_info"] = "No Prisoner ID detected." + var/obj/item/card/id/I = user.get_idcard(TRUE) + if(istype(I, /obj/item/card/id/prisoner)) + var/obj/item/card/id/prisoner/P = I + data["id_points"] = P.points + if(P.points >= P.goal) + can_go_home = TRUE + data["status_info"] = "Goal met!" + else + data["status_info"] = "You are [(P.goal - P.points)] points away." + if(stacking_machine) data["unclaimed_points"] = stacking_machine.points @@ -78,29 +70,19 @@ GLOBAL_LIST(labor_sheet_values) if(..()) return switch(action) - if("handle_id") - if(inserted_id) - if(!usr.get_active_held_item()) - usr.put_in_hands(inserted_id) - inserted_id = null - else - inserted_id.forceMove(get_turf(src)) - inserted_id = null - else - var/obj/item/I = usr.get_active_held_item() - if(istype(I, /obj/item/card/id/prisoner)) - if(!usr.transferItemToLoc(I, src)) - return - inserted_id = I if("claim_points") - inserted_id.points += stacking_machine.points - stacking_machine.points = 0 - to_chat(usr, "Points transferred.") + var/mob/M = usr + var/obj/item/card/id/I = M.get_idcard(TRUE) + if(istype(I, /obj/item/card/id/prisoner)) + var/obj/item/card/id/prisoner/P = I + P.points += stacking_machine.points + stacking_machine.points = 0 + to_chat(usr, "Points transferred.") + else + to_chat(usr, "No valid id for point transfer detected.") if("move_shuttle") if(!alone_in_area(get_area(src), usr)) to_chat(usr, "Prisoners are only allowed to be released while alone.") - else if(!check_auth()) - to_chat(usr, "Prisoners are only allowed to be released when they reach their point goal.") else switch(SSshuttle.moveShuttle("laborcamp", "laborcamp_home", TRUE)) if(1) @@ -112,14 +94,9 @@ GLOBAL_LIST(labor_sheet_values) else if(!(obj_flags & EMAGGED)) Radio.set_frequency(FREQ_SECURITY) - Radio.talk_into(src, "[inserted_id.registered_name] has returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY) + Radio.talk_into(src, "A prisoner has returned to the station. Minerals and Prisoner ID card ready for retrieval.", FREQ_SECURITY) to_chat(usr, "Shuttle received message and will be sent shortly.") -/obj/machinery/mineral/labor_claim_console/proc/check_auth() - if(obj_flags & EMAGGED) - return 1 //Shuttle is emagged, let any ol' person through - return (istype(inserted_id) && inserted_id.points >= inserted_id.goal) //Otherwise, only let them out if the prisoner's reached his quota. - /obj/machinery/mineral/labor_claim_console/proc/locate_stacking_machine() stacking_machine = locate(/obj/machinery/mineral/stacking_machine, get_step(src, machinedir)) if(stacking_machine) @@ -132,10 +109,8 @@ GLOBAL_LIST(labor_sheet_values) obj_flags |= EMAGGED to_chat(user, "PZZTTPFFFT") - /**********************Prisoner Collection Unit**************************/ - /obj/machinery/mineral/stacking_machine/laborstacker force_connect = TRUE var/points = 0 //The unclaimed value of ore stacked. @@ -151,6 +126,7 @@ GLOBAL_LIST(labor_sheet_values) return ..() /**********************Point Lookup Console**************************/ + /obj/machinery/mineral/labor_points_checker name = "points checking console" desc = "A console used by prisoners to check the progress on their quotas. Simply swipe a prisoner ID." diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 4605f7d693..6c1a00b020 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -13,7 +13,6 @@ speed_process = TRUE circuit = /obj/item/circuitboard/machine/ore_redemption layer = BELOW_OBJ_LAYER - var/obj/item/card/id/inserted_id var/points = 0 var/ore_pickup_rate = 15 var/sheet_per_ore = 1 @@ -48,18 +47,23 @@ point_upgrade = point_upgrade_temp sheet_per_ore = sheet_per_ore_temp +/obj/machinery/mineral/ore_redemption/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Smelting [sheet_per_ore] sheet(s) per piece of ore.
Ore pickup speed at [ore_pickup_rate].
" + /obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/stack/ore/O) var/datum/component/material_container/mat_container = materials.mat_container if (!mat_container) return - if(istype(O, /obj/item/stack/ore/bluespace_crystal/refined)) + if(O.refined_type == null) return ore_buffer -= O if(O && O.refined_type) - points += O.points * point_upgrade * O.amount + points += O.points * O.amount var/material_amount = mat_container.get_item_material_amount(O) @@ -72,11 +76,8 @@ else var/mats = O.materials & mat_container.materials var/amount = O.amount - var/id = inserted_id && inserted_id.registered_name - if (id) - id = " (ID: [id])" mat_container.insert_item(O, sheet_per_ore) //insert it - materials.silo_log(src, "smelted", amount, "ores[id]", mats) + materials.silo_log(src, "smelted", amount, "ores", mats) qdel(O) /obj/machinery/mineral/ore_redemption/proc/can_smelt_alloy(datum/design/D) @@ -168,15 +169,7 @@ return if(!powered()) - return - if(istype(W, /obj/item/card/id)) - var/obj/item/card/id/I = user.get_active_held_item() - if(istype(I) && !istype(inserted_id)) - if(!user.transferItemToLoc(I, src)) - return - inserted_id = I - interact(user) - return + return ..() if(istype(W, /obj/item/disk/design_disk)) if(user.transferItemToLoc(W, src)) @@ -205,9 +198,6 @@ /obj/machinery/mineral/ore_redemption/ui_data(mob/user) var/list/data = list() data["unclaimedPoints"] = points - if(inserted_id) - data["hasID"] = TRUE - data["claimedPoints"] = inserted_id.mining_points data["materials"] = list() var/datum/component/material_container/mat_container = materials.mat_container @@ -245,32 +235,24 @@ return var/datum/component/material_container/mat_container = materials.mat_container switch(action) - if("Eject") - if(!inserted_id) - return - usr.put_in_hands(inserted_id) - inserted_id = null - return TRUE - if("Insert") - var/obj/item/card/id/I = usr.get_active_held_item() - if(istype(I)) - if(!usr.transferItemToLoc(I,src)) - return - inserted_id = I - else - to_chat(usr, "Not a valid ID!") - return TRUE if("Claim") - if(inserted_id) - inserted_id.mining_points += points - points = 0 + var/mob/M = usr + var/obj/item/card/id/I = M.get_idcard(TRUE) + if(points) + if(I) + I.mining_points += points + points = 0 + else + to_chat(usr, "No ID detected.") + else + to_chat(usr, "No points to claim.") return TRUE if("Release") if(!mat_container) return if(materials.on_hold()) to_chat(usr, "Mineral access is on hold, please contact the quartermaster.") - else if(!check_access(inserted_id) && !allowed(usr)) //Check the ID inside, otherwise check the user + else if(!allowed(usr)) //Check the ID inside, otherwise check the user to_chat(usr, "Required access not found.") else var/mat_id = params["id"] @@ -293,6 +275,7 @@ var/list/mats = list() mats[mat_id] = MINERAL_MATERIAL_AMOUNT materials.silo_log(src, "released", -count, "sheets", mats) + //Logging deleted for quick coding return TRUE if("diskInsert") var/obj/item/disk/design_disk/disk = usr.get_active_held_item() @@ -321,7 +304,7 @@ return var/alloy_id = params["id"] var/datum/design/alloy = stored_research.isDesignResearchedID(alloy_id) - if((check_access(inserted_id) || allowed(usr)) && alloy) + if((check_access(inserted_scan_id) || allowed(usr)) && alloy) var/smelt_amount = can_smelt_alloy(alloy) var/desired = 0 if (params["sheets"]) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index aed90cebdf..e49f2e73ed 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -20,6 +20,7 @@ new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200), new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300), new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300), + new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400), new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400), new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400), new /datum/data/mining_equipment("Survival Knife", /obj/item/kitchen/knife/combat/survival, 450), @@ -28,8 +29,6 @@ new /datum/data/mining_equipment("Larger Ore Bag", /obj/item/storage/bag/ore/large, 500), new /datum/data/mining_equipment("500 Point Transfer Card", /obj/item/card/mining_point_card/mp500, 500), new /datum/data/mining_equipment("Tracking Implant Kit", /obj/item/storage/box/minertracker, 600), - new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 750), - new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 750), new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750), new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/required/kinetic_crusher, 750), new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750), @@ -54,7 +53,6 @@ new /datum/data/mining_equipment("Super Resonator", /obj/item/resonator/upgraded, 2500), new /datum/data/mining_equipment("Jump Boots", /obj/item/clothing/shoes/bhop, 2500), new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), - new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining_cloned, 3000), new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800), new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400), new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400), @@ -68,9 +66,7 @@ new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000), new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000), - new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000), - new /datum/data/mining_equipment("Premium Accelerator", /obj/item/gun/energy/kinetic_accelerator/premiumka, 8000) - + new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000) ) /datum/data/mining_equipment @@ -95,60 +91,42 @@ /obj/machinery/mineral/equipment_vendor/ui_interact(mob/user) . = ..() - var/dat - dat +="
" - if(istype(inserted_id)) - dat += "You have [inserted_id.mining_points] mining points collected. Eject ID.
" - else - dat += "No ID inserted. Insert ID.
" - dat += "
" + var/list/dat = list() dat += "
Equipment point cost list:
Name: [active1.fields["name"]] 
ID: [active1.fields["id"]] 
Sex: [active1.fields["sex"]] 
Gender: [active1.fields["gender"]] 
Age: [active1.fields["age"]] 
Species: [active1.fields["species"]] 
Rank: [active1.fields["rank"]] 
" for(var/datum/data/mining_equipment/prize in prize_list) dat += "" dat += "
[prize.equipment_name][prize.cost]Purchase
" var/datum/browser/popup = new(user, "miningvendor", "Mining Equipment Vendor", 400, 350) - popup.set_content(dat) + popup.set_content(dat.Join()) popup.open() return /obj/machinery/mineral/equipment_vendor/Topic(href, href_list) if(..()) return - if(href_list["choice"]) - if(istype(inserted_id)) - if(href_list["choice"] == "eject") - to_chat(usr, "You eject the ID from [src]'s card slot.") - inserted_id.forceMove(loc) - inserted_id.verb_pickup() - inserted_id = null - else if(href_list["choice"] == "insert") - var/obj/item/card/id/I = usr.get_active_held_item() - if(istype(I)) - if(!usr.transferItemToLoc(I, src)) - return - inserted_id = I - to_chat(usr, "You insert the ID into [src]'s card slot.") - else - to_chat(usr, "Error: No valid ID!") - flick(icon_deny, src) if(href_list["purchase"]) - if(istype(inserted_id)) - var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) + var/mob/M = usr + var/obj/item/card/id/I = M.get_idcard(TRUE) + if(istype(I)) + var/datum/data/mining_equipment/prize = locate(href_list["purchase"]) in prize_list if (!prize || !(prize in prize_list)) to_chat(usr, "Error: Invalid choice!") flick(icon_deny, src) return - if(prize.cost > inserted_id.mining_points) - to_chat(usr, "Error: Insufficient points for [prize.equipment_name]!") + if(prize.cost > I.mining_points) + to_chat(usr, "Error: Insufficient credits for [prize.equipment_name] on [I]!") flick(icon_deny, src) else - inserted_id.mining_points -= prize.cost - to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") - new prize.equipment_path(src.loc) - SSblackbox.record_feedback("nested tally", "mining_equipment_bought", 1, list("[type]", "[prize.equipment_path]")) + if (I.mining_points -= prize.cost) + to_chat(usr, "[src] clanks to life briefly before vending [prize.equipment_name]!") + new prize.equipment_path(src.loc) + SSblackbox.record_feedback("nested tally", "mining_equipment_bought", 1, list("[type]", "[prize.equipment_path]")) + else + to_chat(usr, "Error: Transaction failure, please try again later!") + flick(icon_deny, src) else - to_chat(usr, "Error: Please insert a valid ID!") + to_chat(usr, "Error: An ID with a registered account is required!") flick(icon_deny, src) updateUsrDialog() return @@ -157,18 +135,6 @@ if(istype(I, /obj/item/mining_voucher)) RedeemVoucher(I, user) return - if(istype(I, /obj/item/suit_voucher)) - RedeemSVoucher(I, user) - return - if(istype(I, /obj/item/card/id)) - var/obj/item/card/id/C = usr.get_active_held_item() - if(istype(C) && !istype(inserted_id)) - if(!usr.transferItemToLoc(C, src)) - return - inserted_id = C - to_chat(usr, "You insert the ID into [src]'s card slot.") - interact(user) - return if(default_deconstruction_screwdriver(user, "mining-open", "mining", I)) updateUsrDialog() return @@ -212,7 +178,6 @@ if(prob(50 / severity) && severity < 3) qdel(src) - /****************Golem Point Vendor**************************/ /obj/machinery/mineral/equipment_vendor/golem @@ -228,7 +193,6 @@ new /datum/data/mining_equipment("Monkey Cube", /obj/item/reagent_containers/food/snacks/monkeycube, 300), new /datum/data/mining_equipment("Toolbelt", /obj/item/storage/belt/utility, 350), new /datum/data/mining_equipment("Royal Cape of the Liberator", /obj/item/bedsheet/rd/royal_cape, 500), - new /datum/data/mining_equipment("Sulphuric Acid", /obj/item/reagent_containers/glass/beaker/sulphuric, 500), new /datum/data/mining_equipment("Grey Slime Extract", /obj/item/slime_extract/grey, 1000), new /datum/data/mining_equipment("Modification Kit", /obj/item/borg/upgrade/modkit/trigger_guard, 1700), new /datum/data/mining_equipment("The Liberator's Legacy", /obj/item/storage/box/rndboards, 2000) @@ -315,52 +279,13 @@ desc = "A kit containing everything a crewmember needs to support a shaft miner in the field." /obj/item/storage/backpack/duffelbag/mining_conscript/PopulateContents() - new /obj/item/pickaxe/mini(src) new /obj/item/clothing/glasses/meson(src) new /obj/item/t_scanner/adv_mining_scanner/lesser(src) new /obj/item/storage/bag/ore(src) - new /obj/item/clothing/suit/hooded/explorer/standard(src) - new /obj/item/encryptionkey/headset_cargo(src) + new /obj/item/clothing/suit/hooded/explorer(src) + new /obj/item/encryptionkey/headset_mining(src) new /obj/item/clothing/mask/gas/explorer(src) new /obj/item/card/mining_access_card(src) - -//CITADEL ADDITIONS BELOW - -/obj/item/storage/backpack/duffelbag/mining_cloned - name = "mining replacement kit" - desc = "A large bag that has advance tools and a spare jumpsuit, boots, and gloves for a newly cloned miner to get back in the field. Even as a new Id!" - -/obj/item/storage/backpack/duffelbag/mining_cloned/PopulateContents() - new /obj/item/pickaxe/mini(src) - new /obj/item/clothing/under/rank/miner/lavaland(src) - new /obj/item/clothing/shoes/workboots/mining(src) - new /obj/item/clothing/gloves/color/black(src) - new /obj/item/implanter/tracking/gps(src) + new /obj/item/gun/energy/kinetic_accelerator(src) new /obj/item/kitchen/knife/combat/survival(src) - new /obj/item/storage/firstaid/regular(src) - new /obj/item/reagent_containers/hypospray/medipen/survival(src) - new /obj/item/t_scanner/adv_mining_scanner(src) - new /obj/item/clothing/suit/hooded/explorer/standard(src) - new /obj/item/encryptionkey/headset_cargo(src) - new /obj/item/clothing/mask/gas/explorer(src) - new /obj/item/card/id/mining(src) - new /obj/item/storage/bag/ore(src) - new /obj/item/clothing/glasses/meson/prescription(src) - -/obj/machinery/mineral/equipment_vendor/proc/RedeemSVoucher(obj/item/suit_voucher/voucher, mob/redeemer) - var/items = list("Exo-suit", "SEVA suit") - - var/selection = input(redeemer, "Pick your suit.", "Suit Voucher Redemption") as null|anything in items - if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer) - return - var/drop_location = drop_location() - switch(selection) - if("Exo-suit") - new /obj/item/clothing/suit/hooded/explorer/exo(drop_location) - new /obj/item/clothing/mask/gas/exo(drop_location) - if("SEVA suit") - new /obj/item/clothing/suit/hooded/explorer/seva(drop_location) - new /obj/item/clothing/mask/gas/seva(drop_location) - - SSblackbox.record_feedback("tally", "suit_voucher_redeemed", 1, selection) - qdel(voucher) + new /obj/item/flashlight/seclite(src) diff --git a/tgstation.dme b/tgstation.dme index da990c169a..2238cb9145 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -646,6 +646,9 @@ #include "code\game\machinery\computer\arcade\minesweeper.dm" #include "code\game\machinery\computer\arcade\misc_arcade.dm" #include "code\game\machinery\computer\arcade\orion_trail.dm" +#include "code\game\machinery\computer\prisoner\_prisoner.dm" +#include "code\game\machinery\computer\prisoner\gulag_teleporter.dm" +#include "code\game\machinery\computer\prisoner\management.dm" #include "code\game\machinery\doors\airlock.dm" #include "code\game\machinery\doors\airlock_electronics.dm" #include "code\game\machinery\doors\airlock_types.dm" diff --git a/tgui/src/interfaces/gulag_item_reclaimer.ract b/tgui/src/interfaces/gulag_item_reclaimer.ract index 7c315d869c..ac6d5d5165 100644 --- a/tgui/src/interfaces/gulag_item_reclaimer.ract +++ b/tgui/src/interfaces/gulag_item_reclaimer.ract @@ -1,10 +1,7 @@ - -
{{data.id ? data.id_name : "-------------"}}
-
{{#each data.mobs}} Drop Items {{/each}} - \ No newline at end of file + diff --git a/tgui/src/interfaces/labor_claim_console.ract b/tgui/src/interfaces/labor_claim_console.ract index 16b3ae0491..21e69f9aa9 100644 --- a/tgui/src/interfaces/labor_claim_console.ract +++ b/tgui/src/interfaces/labor_claim_console.ract @@ -6,24 +6,15 @@ {{/each}} - - {{data.id ? data.id_name : "-------------"}} + + {{data.unclaimed_points}} + Claim points - {{#if data.id}} - - {{data.points}} - - - {{data.goal}} - - - {{data.unclaimed_points}} - Claim points - - {{/if}} -
+ Points: {{data.id_points}} + + {{data.status_info}} Move shuttle -
-
\ No newline at end of file + + diff --git a/tgui/src/interfaces/ore_redemption_machine.ract b/tgui/src/interfaces/ore_redemption_machine.ract index 596b624e98..650c5ddd5e 100644 --- a/tgui/src/interfaces/ore_redemption_machine.ract +++ b/tgui/src/interfaces/ore_redemption_machine.ract @@ -3,24 +3,10 @@ This machine only accepts ore. Gibtonite and Slag are not accepted. - Current unclaimed points: {{data.unclaimedPoints}} - {{#if data.unclaimedPoints}} + Current unclaimed credits: {{data.unclaimedPoints}} - Claim Points + Claim - {{/if}} - - - {{#if data.hasID}} - - Eject ID - - You have {{data.claimedPoints}} mining points collected. - {{else}} - - Insert ID - - {{/if}} From f1bc6e42c82fcfadb0cde77eae64e69202965a06 Mon Sep 17 00:00:00 2001 From: Sishen Date: Sun, 11 Aug 2019 13:10:14 -0400 Subject: [PATCH 02/18] Update machine_vending.dm --- code/modules/mining/machine_vending.dm | 47 ++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index e49f2e73ed..e6f57cb1f6 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -279,13 +279,56 @@ desc = "A kit containing everything a crewmember needs to support a shaft miner in the field." /obj/item/storage/backpack/duffelbag/mining_conscript/PopulateContents() + new /obj/item/pickaxe/mini(src) new /obj/item/clothing/glasses/meson(src) new /obj/item/t_scanner/adv_mining_scanner/lesser(src) new /obj/item/storage/bag/ore(src) - new /obj/item/clothing/suit/hooded/explorer(src) - new /obj/item/encryptionkey/headset_mining(src) + new /obj/item/clothing/suit/hooded/explorer/standard(src) + new /obj/item/encryptionkey/headset_cargo(src) new /obj/item/clothing/mask/gas/explorer(src) new /obj/item/card/mining_access_card(src) new /obj/item/gun/energy/kinetic_accelerator(src) new /obj/item/kitchen/knife/combat/survival(src) new /obj/item/flashlight/seclite(src) + + //CITADEL ADDITIONS BELOW + +/obj/item/storage/backpack/duffelbag/mining_cloned + name = "mining replacement kit" + desc = "A large bag that has advance tools and a spare jumpsuit, boots, and gloves for a newly cloned miner to get back in the field. Even as a new Id!" + +/obj/item/storage/backpack/duffelbag/mining_cloned/PopulateContents() + new /obj/item/pickaxe/mini(src) + new /obj/item/clothing/under/rank/miner/lavaland(src) + new /obj/item/clothing/shoes/workboots/mining(src) + new /obj/item/clothing/gloves/color/black(src) + new /obj/item/implanter/tracking/gps(src) + new /obj/item/gun/energy/kinetic_accelerator(src) + new /obj/item/kitchen/knife/combat/survival(src) + new /obj/item/storage/firstaid/regular(src) + new /obj/item/reagent_containers/hypospray/medipen/survival(src) + new /obj/item/t_scanner/adv_mining_scanner(src) + new /obj/item/clothing/suit/hooded/explorer/standard(src) + new /obj/item/encryptionkey/headset_cargo(src) + new /obj/item/clothing/mask/gas/explorer(src) + new /obj/item/card/id/mining(src) + new /obj/item/storage/bag/ore(src) + new /obj/item/clothing/glasses/meson/prescription(src) + +/obj/machinery/mineral/equipment_vendor/proc/RedeemSVoucher(obj/item/suit_voucher/voucher, mob/redeemer) + var/items = list("Exo-suit", "SEVA suit") + + var/selection = input(redeemer, "Pick your suit.", "Suit Voucher Redemption") as null|anything in items + if(!selection || !Adjacent(redeemer) || QDELETED(voucher) || voucher.loc != redeemer) + return + var/drop_location = drop_location() + switch(selection) + if("Exo-suit") + new /obj/item/clothing/suit/hooded/explorer/exo(drop_location) + new /obj/item/clothing/mask/gas/exo(drop_location) + if("SEVA suit") + new /obj/item/clothing/suit/hooded/explorer/seva(drop_location) + new /obj/item/clothing/mask/gas/seva(drop_location) + + SSblackbox.record_feedback("tally", "suit_voucher_redeemed", 1, selection) + qdel(voucher) From ffa574b1be73646583be67145cd7c8a0ed82da5e Mon Sep 17 00:00:00 2001 From: Sishen Date: Sun, 11 Aug 2019 13:17:55 -0400 Subject: [PATCH 03/18] Update machine_vending.dm --- code/modules/mining/machine_vending.dm | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index e6f57cb1f6..38d2e3e100 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -32,6 +32,7 @@ new /datum/data/mining_equipment("Jaunter", /obj/item/wormhole_jaunter, 750), new /datum/data/mining_equipment("Kinetic Crusher", /obj/item/twohanded/required/kinetic_crusher, 750), new /datum/data/mining_equipment("Kinetic Accelerator", /obj/item/gun/energy/kinetic_accelerator, 750), + new /datum/data/mining_equipment("Survival Medipen", /obj/item/reagent_containers/hypospray/medipen/survival, 750), new /datum/data/mining_equipment("Brute First-Aid Kit", /obj/item/storage/firstaid/brute, 800), new /datum/data/mining_equipment("Burn First-Aid Kit", /obj/item/storage/firstaid/fire, 800), new /datum/data/mining_equipment("First-Aid Kit", /obj/item/storage/firstaid/regular, 800), @@ -66,7 +67,9 @@ new /datum/data/mining_equipment("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000), new /datum/data/mining_equipment("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000), new /datum/data/mining_equipment("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000), - new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000) + new /datum/data/mining_equipment("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000), + new /datum/data/mining_equipment("Miner Full Replacement", /obj/item/storage/backpack/duffelbag/mining_cloned, 3000), + new /datum/data/mining_equipment("Premium Accelerator", /obj/item/gun/energy/kinetic_accelerator/premiumka, 8000) ) /datum/data/mining_equipment @@ -135,6 +138,9 @@ if(istype(I, /obj/item/mining_voucher)) RedeemVoucher(I, user) return + if(istype(I, /obj/item/suit_voucher)) + RedeemSVoucher(I, user) + return if(default_deconstruction_screwdriver(user, "mining-open", "mining", I)) updateUsrDialog() return From 4b6b2cf19524032efdf170d30f87a1ae644bfda8 Mon Sep 17 00:00:00 2001 From: Code-Cygnet <54194215+Code-Cygnet@users.noreply.github.com> Date: Sat, 17 Aug 2019 01:37:28 -0400 Subject: [PATCH 04/18] Adds new drink to drink recipes It's a drink for Captains --- code/modules/food_and_drinks/recipes/drinks_recipes.dm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 7c44857b1d..d35955d2d3 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -794,4 +794,11 @@ name = "Red Queen" id = "red_queen" results = list("red_queen" = 10) - required_reagents = list("tea" = 6, "mercury" = 2, "blackpepper" = 1, "growthserum" = 1) \ No newline at end of file + required_reagents = list("tea" = 6, "mercury" = 2, "blackpepper" = 1, "growthserum" = 1) + +/datum/chemical_reaction/commander_and_chief + name = "Commander and Chief" + id = "commander_and_chief" + results = list("commander_and_chief" = 50) + required_reagents = list("allies_cocktail" = 50, "champagne" = 20, "doctors_delight" = 10, "quintiple_sec" = 10, "screwdriver" = 10) + mix_message = "When your powers combine, I am Captain Pl-..." From 372c53b3da679aef0f5a2a34a6b71587109d3a35 Mon Sep 17 00:00:00 2001 From: Code-Cygnet <54194215+Code-Cygnet@users.noreply.github.com> Date: Sat, 17 Aug 2019 01:47:25 -0400 Subject: [PATCH 05/18] Uploads new drinks.dmi Adds Commander and Chif --- icons/obj/drinks.dmi | Bin 85302 -> 85723 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 7822cdb8c236ea58fc03d4812f74561781b6b0b2..c255e0a104b992bda3df8d0882a0c808d87ea506 100644 GIT binary patch delta 8618 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 Date: Sat, 17 Aug 2019 19:02:30 -0400 Subject: [PATCH 06/18] Update traits.dm Adds new mob trait at line 121 --- code/__DEFINES/traits.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index ed0007135d..a4bca2f2c8 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -118,6 +118,7 @@ #define TRAIT_LAW_ENFORCEMENT_METABOLISM "law-enforcement-metabolism" #define TRAIT_STRONG_GRABBER "strong_grabber" #define TRAIT_CALCIUM_HEALER "calcium_healer" +#define TRAIT_CAPTAIN_METABOLISM "captain-metabolism" //non-mob traits #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it @@ -203,4 +204,4 @@ #define FLIGHTSUIT_TRAIT "flightsuit" #define LOCKED_HELMET_TRAIT "locked-helmet" #define NINJA_SUIT_TRAIT "ninja-suit" -#define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant" \ No newline at end of file +#define ANTI_DROP_IMPLANT_TRAIT "anti-drop-implant" From d2760287e10335173865f1ca0348ca5407b4a49c Mon Sep 17 00:00:00 2001 From: Code-Cygnet <54194215+Code-Cygnet@users.noreply.github.com> Date: Sat, 17 Aug 2019 19:27:11 -0400 Subject: [PATCH 07/18] Update captain.dm Adds mind trait at line 24 --- code/modules/jobs/job_types/captain.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 80c78220e6..dd8cc5a887 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -21,6 +21,8 @@ Captain access = list() //See get_access() minimal_access = list() //See get_access() + mind_traits = list(TRAIT_CAPTAIN_METABOLISM) + /datum/job/captain/get_access() return get_all_accesses() From 975a33aad78f4d27b37be223970d53877283c924 Mon Sep 17 00:00:00 2001 From: Code-Cygnet <54194215+Code-Cygnet@users.noreply.github.com> Date: Sat, 17 Aug 2019 19:38:58 -0400 Subject: [PATCH 08/18] Update alcohol_reagents.dm Adds commander and chief, starting at line 2125 and ending at 2146.. hopefully. --- .../chemistry/reagents/alcohol_reagents.dm | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 79b6f96781..35efd651df 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -2122,6 +2122,29 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_name = "Planet Cracker" glass_desc = "Although historians believe the drink was originally created to commemorate the end of an important conflict in man's past, its origins have largely been forgotten and it is today seen more as a general symbol of human supremacy." +/datum/reagent/consumable/ethanol/commander_and_chief + name = "Commander and Chief" + id = "commander_and_chief" + description = "A cocktail for the captain on the go." + color = "#ffffc9" + boozepwr = 50 + quality = DRINK_FANTASTIC + taste_description = "Tastes like...duty and responsibility?" + glass_icon_state = "commander_and_chief" + glass_name = "Commander and Chief" + glass_desc = "The gems of this majestic chalice represent the departments and their Heads." + +/datum/reagent/consumable/ethanol/commander_and_chief/on_mob_life(mob/living/carbon/M) + if(M.mind && HAS_TRAIT(M.mind, TRAIT_CAPTAIN_METABOLISM))) + M.heal_bodypart_damage(2,2,2) + M.adjustBruteLoss(-3.5,0) + M.adjustOxyLoss(-3.5,0) + M.adjustFireLoss(-3.5,0) + M.adjustToxLoss(-3.5,0) + M.radiation = max(M.raddiation - 25, 0) + . = 1 + return ..() + /datum/reagent/consumable/ethanol/fruit_wine name = "Fruit Wine" id = "fruit_wine" From a351d8f99574653405447c65d356c2627b38d85f Mon Sep 17 00:00:00 2001 From: Code-Cygnet <54194215+Code-Cygnet@users.noreply.github.com> Date: Sun, 18 Aug 2019 21:34:31 -0400 Subject: [PATCH 09/18] Update captain.dm Attempted error fix. --- code/modules/jobs/job_types/captain.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index dd8cc5a887..1e64773607 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -21,8 +21,12 @@ Captain access = list() //See get_access() minimal_access = list() //See get_access() + mind_traits = list(TRAIT_CAPTAIN_METABOLISM) + blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/prosopagnosia, /datum/quirk/insanity) + + /datum/job/captain/get_access() return get_all_accesses() From 5840284e9ea12f6cdd52681e9c2588236f8a4b7d Mon Sep 17 00:00:00 2001 From: Code-Cygnet <54194215+Code-Cygnet@users.noreply.github.com> Date: Sun, 18 Aug 2019 22:14:41 -0400 Subject: [PATCH 10/18] Update alcohol_reagents.dm Edited a typo at line 2144. --- code/modules/reagents/chemistry/reagents/alcohol_reagents.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 35efd651df..8b787b5839 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -2141,7 +2141,7 @@ All effects don't start immediately, but rather get worse over time; the rate is M.adjustOxyLoss(-3.5,0) M.adjustFireLoss(-3.5,0) M.adjustToxLoss(-3.5,0) - M.radiation = max(M.raddiation - 25, 0) + M.radiation = max(M.radiation - 25, 0) . = 1 return ..() From c8810be706cecde36d49a54a8a5970fb628e346e Mon Sep 17 00:00:00 2001 From: Code-Cygnet <54194215+Code-Cygnet@users.noreply.github.com> Date: Sun, 18 Aug 2019 22:15:52 -0400 Subject: [PATCH 11/18] Update captain.dm --- code/modules/jobs/job_types/captain.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index 3d705ffef5..58943df4e4 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -21,7 +21,7 @@ Captain access = list() //See get_access() minimal_access = list() //See get_access() - mind_traits = list(TRAIT_CAPTAIN_METABOLISM) + mind_traits = list(TRAIT_CAPTAIN_METABOLISM) blacklisted_quirks = list(/datum/quirk/mute, /datum/quirk/brainproblems, /datum/quirk/insanity) From 167b18d045386e1444bef0400fad23dbb9f85655 Mon Sep 17 00:00:00 2001 From: Code-Cygnet <54194215+Code-Cygnet@users.noreply.github.com> Date: Mon, 19 Aug 2019 15:28:51 -0400 Subject: [PATCH 12/18] Update code/modules/reagents/chemistry/reagents/alcohol_reagents.dm Error spotted at 2138 and fixed by Sishen, aka Papa Pax! Co-Authored-By: Sishen1542 --- code/modules/reagents/chemistry/reagents/alcohol_reagents.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 8b787b5839..afd2be3f53 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -2135,7 +2135,7 @@ All effects don't start immediately, but rather get worse over time; the rate is glass_desc = "The gems of this majestic chalice represent the departments and their Heads." /datum/reagent/consumable/ethanol/commander_and_chief/on_mob_life(mob/living/carbon/M) - if(M.mind && HAS_TRAIT(M.mind, TRAIT_CAPTAIN_METABOLISM))) + if(M.mind && HAS_TRAIT(M.mind, TRAIT_CAPTAIN_METABOLISM)) M.heal_bodypart_damage(2,2,2) M.adjustBruteLoss(-3.5,0) M.adjustOxyLoss(-3.5,0) From e7d08d1fed42049545e41f6580519b11213b90fc Mon Sep 17 00:00:00 2001 From: Code-Cygnet <54194215+Code-Cygnet@users.noreply.github.com> Date: Mon, 19 Aug 2019 15:53:13 -0400 Subject: [PATCH 13/18] Update drinks_recipes.dm Fixed error at line 803, allies_cocktail to alliescocktail. Am bone-head :(. --- code/modules/food_and_drinks/recipes/drinks_recipes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index d35955d2d3..3ba16dfa48 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -800,5 +800,5 @@ name = "Commander and Chief" id = "commander_and_chief" results = list("commander_and_chief" = 50) - required_reagents = list("allies_cocktail" = 50, "champagne" = 20, "doctors_delight" = 10, "quintiple_sec" = 10, "screwdriver" = 10) + required_reagents = list("alliescocktail" = 50, "champagne" = 20, "doctors_delight" = 10, "quintiple_sec" = 10, "screwdriver" = 10) mix_message = "When your powers combine, I am Captain Pl-..." From d6c9daa4eb17ea293d0a22b891d867ccbd9aaec4 Mon Sep 17 00:00:00 2001 From: Code-Cygnet <54194215+Code-Cygnet@users.noreply.github.com> Date: Mon, 19 Aug 2019 16:04:16 -0400 Subject: [PATCH 14/18] Update drinks_recipes.dm Fixed more errors, spelling and id errors to be exact with the help of Papa Pax :D. --- code/modules/food_and_drinks/recipes/drinks_recipes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 3ba16dfa48..82e80d7584 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -800,5 +800,5 @@ name = "Commander and Chief" id = "commander_and_chief" results = list("commander_and_chief" = 50) - required_reagents = list("alliescocktail" = 50, "champagne" = 20, "doctors_delight" = 10, "quintiple_sec" = 10, "screwdriver" = 10) + required_reagents = list("alliescocktail" = 50, "champagne" = 20, "doctorsdelight" = 10, "quintuple_sec" = 10, "screwdrivercocktail" = 10) mix_message = "When your powers combine, I am Captain Pl-..." From 9f275ebf012e7c24b6248826dc695148da939935 Mon Sep 17 00:00:00 2001 From: Dap Date: Sun, 8 Sep 2019 10:51:05 -0600 Subject: [PATCH 15/18] Ports trim decals ## About The Pull Request So smooth, so helpful. These decals can be used to point newer players to departments, or as trim to border departments. ## Changelog :cl: add: Trim lines! /:cl: --- .../effects/decals/turfdecal/tilecoloring.dm | 201 +++++++++++++++++- icons/turf/decals.dmi | Bin 51765 -> 55050 bytes 2 files changed, 200 insertions(+), 1 deletion(-) diff --git a/code/game/objects/effects/decals/turfdecal/tilecoloring.dm b/code/game/objects/effects/decals/turfdecal/tilecoloring.dm index 1708753dc1..1e755bc7e9 100644 --- a/code/game/objects/effects/decals/turfdecal/tilecoloring.dm +++ b/code/game/objects/effects/decals/turfdecal/tilecoloring.dm @@ -36,4 +36,203 @@ /obj/effect/turf_decal/tile/neutral name = "neutral corner" color = "#D4D4D4" - alpha = 50 \ No newline at end of file + alpha = 50 + +/obj/effect/turf_decal/trimline + layer = TURF_PLATING_DECAL_LAYER + alpha = 110 + icon_state = "trimline_box" + +/obj/effect/turf_decal/trimline/white + color = "#FFFFFF" + +/obj/effect/turf_decal/trimline/white/line + name = "trim decal" + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/white/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/white/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/white/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/white/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/white/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/white/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/red + color = "#DE3A3A" + +/obj/effect/turf_decal/trimline/red/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/red/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/red/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/red/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/red/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/red/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/red/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/green + color = "#9FED58" + +/obj/effect/turf_decal/trimline/green/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/green/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/green/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/green/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/green/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/green/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/green/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/blue + color = "#52B4E9" + +/obj/effect/turf_decal/trimline/blue/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/blue/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/blue/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/blue/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/blue/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/blue/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/blue/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/yellow + color = "#EFB341" + +/obj/effect/turf_decal/trimline/yellow/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/yellow/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/yellow/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/yellow/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/yellow/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/yellow/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/yellow/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/purple + color = "#D381C9" + +/obj/effect/turf_decal/trimline/purple/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/purple/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/purple/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/purple/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/purple/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/purple/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/purple/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/brown + color = "#A46106" + +/obj/effect/turf_decal/trimline/brown/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/brown/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/brown/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/brown/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/brown/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/brown/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/brown/filled/end + icon_state = "trimline_end_fill" + +/obj/effect/turf_decal/trimline/neutral + color = "#D4D4D4" + alpha = 50 + +/obj/effect/turf_decal/trimline/neutral/line + icon_state = "trimline" + +/obj/effect/turf_decal/trimline/neutral/corner + icon_state = "trimline_corner" + +/obj/effect/turf_decal/trimline/neutral/end + icon_state = "trimline_end" + +/obj/effect/turf_decal/trimline/neutral/filled + icon_state = "trimline_box_fill" + +/obj/effect/turf_decal/trimline/neutral/filled/line + icon_state = "trimline_fill" + +/obj/effect/turf_decal/trimline/neutral/filled/corner + icon_state = "trimline_corner_fill" + +/obj/effect/turf_decal/trimline/brown/filled/end + icon_state = "trimline_end_fill" \ No newline at end of file diff --git a/icons/turf/decals.dmi b/icons/turf/decals.dmi index f7f259ab04e3a4eb748177ca05f7b07e3e36a4e3..616cb1f521047976a878964a3f9fd638ad733a5f 100644 GIT binary patch literal 55050 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 From e9a4e732c02fd84766da951bd606eedf87f8e930 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 11 Sep 2019 00:04:51 -0500 Subject: [PATCH 16/18] Automatic changelog generation for PR #9077 [ci skip] --- html/changelogs/AutoChangeLog-pr-9077.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9077.yml diff --git a/html/changelogs/AutoChangeLog-pr-9077.yml b/html/changelogs/AutoChangeLog-pr-9077.yml new file mode 100644 index 0000000000..2f42e36dd6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9077.yml @@ -0,0 +1,8 @@ +author: "original by actioninja, port by sishen1542" +delete-after: True +changes: + - tweak: "Medical and Security consoles now check access on worn or inhand ID instead of requiring an inserted ID" + - tweak: "mining vendor now reads from ID in hand or on person instead of requiring an inserted ID" + - bugfix: "ORM is functional again (for real this time)" + - tweak: "ORM claim points button transfers points to worn/inhand ID instead of to an inserted ID, no longer accepts insertions" + - tweak: "Same for gulag consoles" From df8b4c86aed5b94602406a80a48b697f32afe5f1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 11 Sep 2019 00:06:38 -0500 Subject: [PATCH 17/18] Automatic changelog generation for PR #9147 [ci skip] --- html/changelogs/AutoChangeLog-pr-9147.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9147.yml diff --git a/html/changelogs/AutoChangeLog-pr-9147.yml b/html/changelogs/AutoChangeLog-pr-9147.yml new file mode 100644 index 0000000000..7f1dcb7e7e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9147.yml @@ -0,0 +1,5 @@ +author: "Code-Cygnet" +delete-after: True +changes: + - rscadd: "Added new things - Mind trait, alcohol reagent, chemical reagent, drink sprite and recipe." + - imageadd: "added commander_and_chief sprite to drinks.dmi" From e6ac254ded6010d33f33117dab59f27178f8680f Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 11 Sep 2019 05:26:55 -0500 Subject: [PATCH 18/18] Automatic changelog generation for PR #9260 [ci skip] --- html/changelogs/AutoChangeLog-pr-9260.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9260.yml diff --git a/html/changelogs/AutoChangeLog-pr-9260.yml b/html/changelogs/AutoChangeLog-pr-9260.yml new file mode 100644 index 0000000000..f94d9772f9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9260.yml @@ -0,0 +1,4 @@ +author: "dapnee" +delete-after: True +changes: + - rscadd: "Trim lines!"