From 8898c7346bae502fe5dda5de6814c20f6e18e0b7 Mon Sep 17 00:00:00 2001 From: alex-gh Date: Thu, 27 Sep 2018 22:46:37 +0200 Subject: [PATCH 01/31] It is no longer possible to duplicate uvents. --- code/ATMOSPHERICS/components/unary_devices/vent_pump.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm index 1f2670371f8..32b91f135bb 100644 --- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm @@ -381,6 +381,8 @@ if(!welded) if(open) for(var/obj/item/W in src) + if(istype(W, /obj/item/pipe)) + continue W.forceMove(get_turf(src)) From 9f2705dd6bcfb6319a198722b2ac3af75efceb1c Mon Sep 17 00:00:00 2001 From: Dedhia Date: Mon, 1 Oct 2018 08:44:34 -0700 Subject: [PATCH 02/31] Adds password protected files to modular computers. --- .../file_system/computer_file.dm | 16 +++++++-- .../programs/generic/file_browser.dm | 35 ++++++++++++++++--- nano/templates/file_manager.tmpl | 7 ++++ 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index 25ca387a78e..8adb5f98770 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -4,10 +4,11 @@ var/global/file_uid = 0 var/filename = "NewFile" // Placeholder. No spacebars var/filetype = "XXX" // File full names are [filename].[filetype] so like NewFile.XXX in this case var/size = 1 // File size in GQ. Integers only! - var/obj/item/computer_hardware/hard_drive/holder // Holder that contains this file. + var/obj/item/computer_hardware/hard_drive/holder // Holder that contains this file. var/unsendable = 0 // Whether the file may be sent to someone via NTNet transfer or other means. var/undeletable = 0 // Whether the file may be deleted. Setting to 1 prevents deletion/renaming/etc. var/uid // UID of this file + var/password = "" // Placeholder for password. /datum/computer_file/New() ..() @@ -36,4 +37,15 @@ var/global/file_uid = 0 else temp.filename = filename temp.filetype = filetype - return temp \ No newline at end of file + temp.password = password + return temp + +/datum/computer_file/proc/can_access_file(var/mob/user, input_password = "") + if(!password) + return TRUE + else if(!input_password) + input_password = sanitize(input(user, "Please enter a password to access file '[filename]':")) + if (input_password == password) + return TRUE + else + return FALSE \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm index 89fea156510..0c99bd0a997 100644 --- a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm @@ -55,7 +55,8 @@ "name" = F.filename, "type" = F.filetype, "size" = F.size, - "undeletable" = F.undeletable + "undeletable" = F.undeletable, + "encrypted" = !!F.password ))) data["files"] = files if(RHDD) @@ -66,7 +67,8 @@ "name" = F.filename, "type" = F.filetype, "size" = F.size, - "undeletable" = F.undeletable + "undeletable" = F.undeletable, + "encrypted" = !!F.password ))) data["usbfiles"] = usbfiles @@ -83,7 +85,13 @@ switch(href_list["action"]) if("PRG_openfile") . = 1 - open_file = href_list["name"] + var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_openfile"]) + if (!F) + return + if (F.can_access_file(usr)) + open_file = href_list["PRG_openfile"] + else + return if("PRG_newtextfile") . = 1 var/newname = stripped_input(usr, "Enter file name or leave blank to cancel:", "File rename", max_length=50) @@ -197,4 +205,23 @@ if(!F || !istype(F)) return 1 var/datum/computer_file/C = F.clone(0) - HDD.store_file(C) \ No newline at end of file + HDD.store_file(C) + if("PRG_encrypt") + . = 1 + if(!HDD) + return 1 + var/datum/computer_file/F = HDD.find_file_by_name(href_list["name"]) + if(!F || F.undeletable) + return 1 + if(F.password) + return + F.password = sanitize(input(usr, "Enter an encryption key:", "Encrypt File")) + if("PRG_decrypt") + . = 1 + if(!HDD) + return 1 + var/datum/computer_file/F = HDD.find_file_by_name(href_list["name"]) + if(!F || F.undeletable) + return 1 + if(F.can_access_file(usr)) + F.password = "" \ No newline at end of file diff --git a/nano/templates/file_manager.tmpl b/nano/templates/file_manager.tmpl index 1bdb0cd95c4..3743c6db7d0 100644 --- a/nano/templates/file_manager.tmpl +++ b/nano/templates/file_manager.tmpl @@ -32,6 +32,13 @@ {{:helper.link('DELETE', 'trash', {'action' : 'PRG_deletefile', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} {{:helper.link('RENAME', 'pencil', {'action' : 'PRG_rename', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} {{:helper.link('CLONE', 'files-o', {'action' : 'PRG_clone', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} + {{if data.usbconnected}} + {{:helper.link('EXPORT', 'upload', {'action' : 'PRG_copytousb', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} + {{if !value.encrypted}} + {{:helper.link('ENCRYPT', null, { "PRG_encrypt" : value.name }, (value.undeletable) ? 'disabled' : null)}} + {{else}} + {{:helper.link('DECRYPT', null, { "PRG_decrypt" : value.name }, (value.undeletable) ? 'disabled' : null)}} + {{/if}} {{if data.usbconnected}} {{:helper.link('EXPORT', 'upload', {'action' : 'PRG_copytousb', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} {{/if}} From 0d1ee8c64f571f6a81fc0883ae908d69330c920f Mon Sep 17 00:00:00 2001 From: Dedhia Date: Tue, 2 Oct 2018 07:43:38 -0700 Subject: [PATCH 03/31] Changes all instances of if ( to if( --- code/modules/modular_computers/file_system/computer_file.dm | 2 +- .../file_system/programs/generic/file_browser.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index 8adb5f98770..5baf7a73a40 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -45,7 +45,7 @@ var/global/file_uid = 0 return TRUE else if(!input_password) input_password = sanitize(input(user, "Please enter a password to access file '[filename]':")) - if (input_password == password) + if(input_password == password) return TRUE else return FALSE \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm index 0c99bd0a997..deda1b48e43 100644 --- a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm @@ -86,9 +86,9 @@ if("PRG_openfile") . = 1 var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_openfile"]) - if (!F) + if(!F) return - if (F.can_access_file(usr)) + if(F.can_access_file(usr)) open_file = href_list["PRG_openfile"] else return From 7ccb5b3ded4ed227b34e62d28bcfe52b140e468f Mon Sep 17 00:00:00 2001 From: Dedhia Date: Sun, 7 Oct 2018 06:50:50 -0700 Subject: [PATCH 04/31] tigercat requested changes. --- .../modular_computers/file_system/computer_file.dm | 7 +++---- .../file_system/programs/generic/file_browser.dm | 13 +++++++------ nano/templates/file_manager.tmpl | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/code/modules/modular_computers/file_system/computer_file.dm b/code/modules/modular_computers/file_system/computer_file.dm index 5baf7a73a40..f3b5a9659b2 100644 --- a/code/modules/modular_computers/file_system/computer_file.dm +++ b/code/modules/modular_computers/file_system/computer_file.dm @@ -40,12 +40,11 @@ var/global/file_uid = 0 temp.password = password return temp -/datum/computer_file/proc/can_access_file(var/mob/user, input_password = "") +/datum/computer_file/proc/can_access_file(mob/user, input_password = "") if(!password) return TRUE - else if(!input_password) + if(!input_password) input_password = sanitize(input(user, "Please enter a password to access file '[filename]':")) if(input_password == password) return TRUE - else - return FALSE \ No newline at end of file + return FALSE \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm index deda1b48e43..373660438c8 100644 --- a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm @@ -86,12 +86,9 @@ if("PRG_openfile") . = 1 var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_openfile"]) - if(!F) - return - if(F.can_access_file(usr)) - open_file = href_list["PRG_openfile"] - else + if(!F.can_access_file(usr)) return + open_file = href_list["PRG_openfile"] if("PRG_newtextfile") . = 1 var/newname = stripped_input(usr, "Enter file name or leave blank to cancel:", "File rename", max_length=50) @@ -215,7 +212,11 @@ return 1 if(F.password) return - F.password = sanitize(input(usr, "Enter an encryption key:", "Encrypt File")) + var/new_password = sanitize(input(usr, "Enter an encryption key:", "Encrypt File")) + if(!new_password) + to_chat(usr, "File not encrypted.") + return + F.password=new_password if("PRG_decrypt") . = 1 if(!HDD) diff --git a/nano/templates/file_manager.tmpl b/nano/templates/file_manager.tmpl index 3743c6db7d0..5e51c221bb2 100644 --- a/nano/templates/file_manager.tmpl +++ b/nano/templates/file_manager.tmpl @@ -35,9 +35,9 @@ {{if data.usbconnected}} {{:helper.link('EXPORT', 'upload', {'action' : 'PRG_copytousb', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} {{if !value.encrypted}} - {{:helper.link('ENCRYPT', null, { "PRG_encrypt" : value.name }, (value.undeletable) ? 'disabled' : null)}} + {{:helper.link('ENCRYPT', null, { 'PRG_encrypt' : value.name }, (value.undeletable) ? 'disabled' : null)}} {{else}} - {{:helper.link('DECRYPT', null, { "PRG_decrypt" : value.name }, (value.undeletable) ? 'disabled' : null)}} + {{:helper.link('DECRYPT', null, { 'PRG_decrypt' : value.name }, (value.undeletable) ? 'disabled' : null)}} {{/if}} {{if data.usbconnected}} {{:helper.link('EXPORT', 'upload', {'action' : 'PRG_copytousb', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} From ef7ce638da724bb41fcf4b8da67f2ba0fbf5cf54 Mon Sep 17 00:00:00 2001 From: Dedhia Date: Mon, 8 Oct 2018 12:23:53 -0700 Subject: [PATCH 05/31] Fixes, testing when I get home --- nano/templates/file_manager.tmpl | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/nano/templates/file_manager.tmpl b/nano/templates/file_manager.tmpl index 5e51c221bb2..51d40b84475 100644 --- a/nano/templates/file_manager.tmpl +++ b/nano/templates/file_manager.tmpl @@ -32,12 +32,10 @@ {{:helper.link('DELETE', 'trash', {'action' : 'PRG_deletefile', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} {{:helper.link('RENAME', 'pencil', {'action' : 'PRG_rename', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} {{:helper.link('CLONE', 'files-o', {'action' : 'PRG_clone', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} - {{if data.usbconnected}} - {{:helper.link('EXPORT', 'upload', {'action' : 'PRG_copytousb', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} {{if !value.encrypted}} - {{:helper.link('ENCRYPT', null, { 'PRG_encrypt' : value.name }, (value.undeletable) ? 'disabled' : null)}} + {{:helper.link('ENCRYPT', null, {'action' : 'PRG_encrypt', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} {{else}} - {{:helper.link('DECRYPT', null, { 'PRG_decrypt' : value.name }, (value.undeletable) ? 'disabled' : null)}} + {{:helper.link('DECRYPT', null, {'action' : 'PRG_decrypt', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} {{/if}} {{if data.usbconnected}} {{:helper.link('EXPORT', 'upload', {'action' : 'PRG_copytousb', 'name' : value.name}, value.undeletable ? 'disabled' : null)}} From 7258391a6557357892545dd2a827cbd884e3e417 Mon Sep 17 00:00:00 2001 From: Purpose Date: Thu, 11 Oct 2018 00:23:58 +0100 Subject: [PATCH 06/31] refactors suit storage units --- code/game/machinery/machinery.dm | 3 + code/game/machinery/suit_storage_unit.dm | 1389 +++++++--------------- icons/obj/machines/suit_storage.dmi | Bin 0 -> 11193 bytes icons/obj/suitstorage.dmi | Bin 32274 -> 0 bytes 4 files changed, 434 insertions(+), 958 deletions(-) create mode 100644 icons/obj/machines/suit_storage.dmi delete mode 100644 icons/obj/suitstorage.dmi diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index c5fd19a1cfc..00e65f23f9c 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -391,6 +391,9 @@ Class Procs: return ..() +/obj/machinery/proc/is_operational() + return !(stat & (NOPOWER|BROKEN|MAINT)) + /obj/machinery/CheckParts(list/parts_list) ..() RefreshParts() diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 370cef73559..baa36d5b845 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -1,128 +1,348 @@ -////////////////////////////////////// // SUIT STORAGE UNIT ///////////////// -////////////////////////////////////// - - /obj/machinery/suit_storage_unit - name = "Suit Storage Unit" + name = "suit storage unit" desc = "An industrial U-Stor-It Storage unit designed to accomodate all kinds of space suits. Its on-board equipment also allows the user to decontaminate the contents through a UV-ray purging cycle. There's a warning label dangling from the control pad, reading \"STRICTLY NO BIOLOGICALS IN THE CONFINES OF THE UNIT\"." - icon = 'icons/obj/suitstorage.dmi' - icon_state = "suitstorage000000100" //order is: [has helmet][has suit][has human][is open][is locked][is UV cycling][is powered][is dirty/broken] [is superUVcycling] - anchored = 1 - density = 1 - var/mob/living/carbon/human/OCCUPANT = null - var/obj/item/clothing/suit/space/SUIT = null - var/SUIT_TYPE = null - var/obj/item/clothing/head/helmet/space/HELMET = null - var/HELMET_TYPE = null - var/obj/item/clothing/mask/MASK = null //All the stuff that's gonna be stored insiiiiiiiiiiiiiiiiiiide, nyoro~n - var/MASK_TYPE = null //Erro's idea on standarising SSUs whle keeping creation of other SSU types easy: Make a child SSU, name it something then set the TYPE vars to your desired suit output. New() should take it from there by itself. - var/isopen = 0 - var/islocked = 0 - var/isUV = 0 - var/ispowered = 1 //starts powered - var/isbroken = 0 - var/issuperUV = 0 - var/panelopen = 0 - var/safetieson = 1 - var/cycletime_left = 0 + icon = 'icons/obj/machines/suit_storage.dmi' + icon_state = "close" + anchored = TRUE + density = TRUE + max_integrity = 250 + var/obj/item/clothing/suit/space/suit = null + var/obj/item/clothing/head/helmet/space/helmet = null + var/obj/item/clothing/mask/mask = null + var/obj/item/storage = null + + var/helmet_type = null + var/suit_type = null + var/mask_type = null + var/storage_type = null + + var/locked = FALSE + var/safeties = TRUE + var/broken = FALSE + + var/uv = FALSE + var/uv_super = FALSE + var/uv_cycles = 6 + var/message_cooldown + var/breakout_time = 300 + + //abstract these onto machinery eventually + var/state_open = FALSE + var/list/occupant_typecache //if set, turned into typecache in Initialize, other wise, defaults to mob/living typecache + var/atom/movable/occupant = null -//The units themselves///////////////// /obj/machinery/suit_storage_unit/standard_unit - SUIT_TYPE = /obj/item/clothing/suit/space/eva - HELMET_TYPE = /obj/item/clothing/head/helmet/space/eva - MASK_TYPE = /obj/item/clothing/mask/breath + suit_type = /obj/item/clothing/suit/space/eva + helmet_type = /obj/item/clothing/head/helmet/space/eva + mask_type = /obj/item/clothing/mask/breath /obj/machinery/suit_storage_unit/captain - SUIT_TYPE = /obj/item/clothing/suit/space/captain - HELMET_TYPE = /obj/item/clothing/head/helmet/space/capspace - MASK_TYPE = /obj/item/clothing/mask/gas + suit_type = /obj/item/clothing/suit/space/captain + helmet_type = /obj/item/clothing/head/helmet/space/capspace + mask_type = /obj/item/clothing/mask/gas + storage_type = /obj/item/tank/jetpack/oxygen/captain /obj/machinery/suit_storage_unit/engine - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/engineering - HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/engineering - MASK_TYPE = /obj/item/clothing/mask/breath + suit_type = /obj/item/clothing/suit/space/hardsuit/engineering + helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/engineering + mask_type = /obj/item/clothing/mask/breath + storage_type = /obj/item/clothing/shoes/magboots /obj/machinery/suit_storage_unit/ce - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/elite - HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/elite - MASK_TYPE = /obj/item/clothing/mask/breath + suit_type = /obj/item/clothing/suit/space/hardsuit/elite + helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/elite + mask_type = /obj/item/clothing/mask/gas + storage_type = /obj/item/clothing/shoes/magboots/advance /obj/machinery/suit_storage_unit/security - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/security - HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/security - MASK_TYPE = /obj/item/clothing/mask/gas/sechailer + suit_type = /obj/item/clothing/suit/space/hardsuit/security + helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/security + mask_type = /obj/item/clothing/mask/gas/sechailer /obj/machinery/suit_storage_unit/atmos - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/atmos - HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/atmos - MASK_TYPE = /obj/item/clothing/mask/gas + suit_type = /obj/item/clothing/suit/space/hardsuit/atmos + helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/atmos + mask_type = /obj/item/clothing/mask/gas + storage_type = /obj/item/clothing/shoes/magboots /obj/machinery/suit_storage_unit/mining - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/mining - HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/mining - MASK_TYPE = /obj/item/clothing/mask/breath + suit_type = /obj/item/clothing/suit/space/hardsuit/mining + helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/mining + mask_type = /obj/item/clothing/mask/breath /obj/machinery/suit_storage_unit/cmo - SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/medical - HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/medical - MASK_TYPE = /obj/item/clothing/mask/breath + suit_type = /obj/item/clothing/suit/space/hardsuit/medical + helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/medical + mask_type = /obj/item/clothing/mask/breath -/obj/machinery/suit_storage_unit/New() - src.update_icon() - if(SUIT_TYPE) - SUIT = new SUIT_TYPE(src) - if(HELMET_TYPE) - HELMET = new HELMET_TYPE(src) - if(MASK_TYPE) - MASK = new MASK_TYPE(src) +/obj/machinery/suit_storage_unit/syndicate + suit_type = /obj/item/clothing/suit/space/hardsuit/syndi + helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/syndi + mask_type = /obj/item/clothing/mask/gas/syndicate + storage_type = /obj/item/tank/jetpack/oxygen/harness + +/obj/machinery/suit_storage_unit/ert/command + suit_type = /obj/item/clothing/suit/space/hardsuit/ert/commander + helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/ert/commander + mask_type = /obj/item/clothing/mask/breath + storage_type = /obj/item/tank/emergency_oxygen/double + +/obj/machinery/suit_storage_unit/ert/security + suit_type = /obj/item/clothing/suit/space/hardsuit/ert/security + helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/ert/security + mask_type = /obj/item/clothing/mask/breath + storage_type = /obj/item/tank/emergency_oxygen/double + +/obj/machinery/suit_storage_unit/ert/engineer + suit_type = /obj/item/clothing/suit/space/hardsuit/ert/engineer + helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/ert/engineer + mask_type = /obj/item/clothing/mask/breath + storage_type = /obj/item/tank/emergency_oxygen/double + +/obj/machinery/suit_storage_unit/ert/medical + suit_type = /obj/item/clothing/suit/space/hardsuit/ert/medical + helmet_type = /obj/item/clothing/head/helmet/space/hardsuit/ert/medical + mask_type = /obj/item/clothing/mask/breath + storage_type = /obj/item/tank/emergency_oxygen/double + + + +/obj/machinery/suit_storage_unit/Initialize() + . = ..() + if(suit_type) + suit = new suit_type(src) + if(helmet_type) + helmet = new helmet_type(src) + if(mask_type) + mask = new mask_type(src) + if(storage_type) + storage = new storage_type(src) + update_icon() + + //move this into machinery eventually... + if (occupant_typecache) + occupant_typecache = typecacheof(occupant_typecache) + +/obj/machinery/suit_storage_unit/Destroy() + QDEL_NULL(suit) + QDEL_NULL(helmet) + QDEL_NULL(mask) + QDEL_NULL(storage) + return ..() /obj/machinery/suit_storage_unit/update_icon() - var/hashelmet = 0 - var/hassuit = 0 - var/hashuman = 0 - if(HELMET) - hashelmet = 1 - if(SUIT) - hassuit = 1 - if(OCCUPANT) - hashuman = 1 - icon_state = text("suitstorage[][][][][][][][][]",hashelmet,hassuit,hashuman,src.isopen,src.islocked,src.isUV,src.ispowered,src.isbroken,src.issuperUV) + cut_overlays() + + if(uv) + if(uv_super) + add_overlay("super") + else if(occupant) + add_overlay("uvhuman") + else + add_overlay("uv") + else if(state_open) + if(stat & BROKEN) + add_overlay("broken") + else + add_overlay("open") + if(suit) + add_overlay("suit") + if(helmet) + add_overlay("helm") + if(storage) + add_overlay("storage") + else if(occupant) + add_overlay("human") /obj/machinery/suit_storage_unit/power_change() - if( powered() ) - src.ispowered = 1 - stat &= ~NOPOWER - src.update_icon() + ..() + if(!is_operational() && state_open) + open_machine() + dump_contents() + update_icon() + + + +/obj/machinery/suit_storage_unit/proc/dump_contents() + dropContents() + helmet = null + suit = null + mask = null + storage = null + occupant = null + +/obj/machinery/suit_storage_unit/deconstruct(disassembled = TRUE) + open_machine() + dump_contents() + new /obj/item/stack/sheet/metal (loc, 2) + qdel(src) + +/obj/machinery/suit_storage_unit/MouseDrop_T(atom/A, mob/user) + if(user.stat || user.lying || !Adjacent(user) || !Adjacent(A) || !isliving(A)) + return + var/mob/living/target = A + if(!state_open) + to_chat(user, "The unit's doors are shut!") + return + if(!is_operational()) + to_chat(user, "The unit is not operational!") + return + if(occupant || helmet || suit || storage) + to_chat(user, "It's too cluttered inside to fit in!") + return + + if(target == user) + user.visible_message("[user] starts squeezing into [src]!", "You start working your way into [src]...") else - spawn(rand(0, 15)) - src.ispowered = 0 - stat |= NOPOWER - src.islocked = 0 - src.isopen = 1 - src.dump_everything() - src.update_icon() + target.visible_message("[user] starts shoving [target] into [src]!", "[user] starts shoving you into [src]!") - -/obj/machinery/suit_storage_unit/ex_act(severity) - switch(severity) - if(1.0) - if(prob(50)) - src.dump_everything() //So suits dont survive all the time - qdel(src) - return - if(2.0) - if(prob(50)) - src.dump_everything() - qdel(src) + if(do_mob(user, target, 30)) + if(occupant || helmet || suit || storage) return + if(target == user) + user.visible_message("[user] slips into [src] and closes the door behind [user.p_them()]!", "You slip into [src]'s cramped space and shut its door.") else - return - return + target.visible_message("[user] pushes [target] into [src] and shuts its door!", "[user] shoves you into [src] and shuts the door!") + close_machine(target) + add_fingerprint(user) +/obj/machinery/suit_storage_unit/proc/cook() + if(uv_cycles) + uv_cycles-- + uv = TRUE + locked = TRUE + update_icon() + if(occupant) + var/mob/living/mob_occupant = occupant + if(uv_super) + mob_occupant.adjustFireLoss(rand(20, 36)) + else + mob_occupant.adjustFireLoss(rand(10, 16)) + mob_occupant.emote("scream") + addtimer(CALLBACK(src, .proc/cook), 50) + else + uv_cycles = initial(uv_cycles) + uv = FALSE + locked = FALSE + if(uv_super) + visible_message("[src]'s door creaks open with a loud whining noise. A cloud of foul black smoke escapes from its chamber.") + playsound(src, 'sound/machines/airlock_alien_prying.ogg', 50, 1) + helmet = null + qdel(helmet) + suit = null + qdel(suit) // Delete everything but the occupant. + mask = null + qdel(mask) + storage = null + qdel(storage) + else + if(!occupant) + visible_message("[src]'s door slides open. The glowing yellow lights dim to a gentle green.") + else + visible_message("[src]'s door slides open, barraging you with the nauseating smell of charred flesh.") + playsound(src, 'sound/machines/airlock_close.ogg', 25, 1) + open_machine(FALSE) + if(occupant) + dump_contents() + +/obj/machinery/suit_storage_unit/shock(mob/user, prb) + if(!prob(prb)) + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(5, 1, src) + s.start() + if(electrocute_mob(user, src, src, 1, TRUE)) + return 1 + +/obj/machinery/suit_storage_unit/relaymove(mob/user) + if(locked) + if(message_cooldown <= world.time) + message_cooldown = world.time + 50 + to_chat(user, "[src]'s door won't budge!") + return + open_machine() + dump_contents() + +/obj/machinery/suit_storage_unit/container_resist(mob/living/user) + if(!locked) + open_machine() + dump_contents() + return + user.changeNext_move(CLICK_CD_BREAKOUT) + user.last_special = world.time + CLICK_CD_BREAKOUT + user.visible_message("You see [user] kicking against the doors of [src]!", \ + "You start kicking against the doors... (this will take about [DisplayTimeText(breakout_time)].)", \ + "You hear a thump from [src].") + if(do_after(user,(breakout_time), target = src)) + if(!user || user.stat != CONSCIOUS || user.loc != src ) + return + user.visible_message("[user] successfully broke out of [src]!", \ + "You successfully break out of [src]!") + open_machine() + dump_contents() + + add_fingerprint(user) + if(locked) + visible_message("You see [user] kicking against the doors of [src]!", \ + "You start kicking against the doors...") + addtimer(CALLBACK(src, .proc/resist_open, user), 300) + else + open_machine() + dump_contents() + +/obj/machinery/suit_storage_unit/proc/resist_open(mob/user) + if(!state_open && occupant && (user in src) && user.stat == 0) // Check they're still here. + visible_message("You see [user] burst out of [src]!", \ + "You escape the cramped confines of [src]!") + open_machine() + +//eventually move these onto the parent.... + +/obj/machinery/suit_storage_unit/proc/open_machine(drop = TRUE) + state_open = TRUE + density = FALSE + if(drop) + dropContents() + update_icon() + updateUsrDialog() + +/obj/machinery/suit_storage_unit/dropContents() + var/turf/T = get_turf(src) + for(var/atom/movable/A in contents) + A.forceMove(T) + if(isliving(A)) + var/mob/living/L = A + L.update_canmove() + occupant = null + +/obj/machinery/suit_storage_unit/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))) + continue + var/atom/movable/AM = am + if(AM.has_buckled_mobs()) + continue + if(isliving(AM)) + var/mob/living/L = am + if(L.buckled || L.mob_size >= MOB_SIZE_LARGE) + continue + target = am + + var/mob/living/mobtarget = target + if(target && !target.has_buckled_mobs() && (!isliving(target) || !mobtarget.buckled)) + occupant = target + target.forceMove(src) + updateUsrDialog() + update_icon() + + +//////// /obj/machinery/suit_storage_unit/attack_hand(mob/user as mob) var/dat @@ -131,54 +351,49 @@ if(stat & NOPOWER) return if(!user.IsAdvancedToolUser()) - return 0 - if(src.panelopen) //The maintenance panel is open. Time for some shady stuff + return FALSE + if(panel_open) //The maintenance panel is open. Time for some shady stuff dat+= "Suit storage unit: Maintenance panel" dat+= "Maintenance panel controls
" dat+= "The panel is ridden with controls, button and meters, labeled in strange signs and symbols that
you cannot understand. Probably the manufactoring world's language.
Among other things, a few controls catch your eye.

" - dat+= text("A small dial with a \"�\" symbol embroidded on it. It's pointing towards a gauge that reads [].
Turn towards []
",(src.issuperUV ? "15nm" : "185nm"),(src.issuperUV ? "185nm" : "15nm") ) - dat+= text("A thick old-style button, with 2 grimy LED lights next to it. The [] LED is on.
Press button",(src.safetieson? "GREEN" : "RED")) + dat+= text("A small dial with a \"�\" symbol embroidded on it. It's pointing towards a gauge that reads [].
Turn towards []
",(uv_super ? "15nm" : "185nm"),(uv_super ? "185nm" : "15nm") ) + dat+= text("A thick old-style button, with 2 grimy LED lights next to it. The [] LED is on.
Press button",(safeties ? "GREEN" : "RED")) dat+= "

Close panel" - //user << browse(dat, "window=ssu_m_panel;size=400x500") - //onclose(user, "ssu_m_panel") - else if(src.isUV) //The thing is running its cauterisation cycle. You have to wait. + else if(uv) //The thing is running its cauterisation cycle. You have to wait. dat += "Suit storage unit" dat+= "Unit is cauterising contents with selected UV ray intensity. Please wait.
" - //dat+= "Cycle end in: [src.cycletimeleft()] seconds. " - //user << browse(dat, "window=ssu_cycling_panel;size=400x500") - //onclose(user, "ssu_cycling_panel") else - if(!src.isbroken) + if(!broken) dat+= "Welcome to the Unit control panel.
" - dat+= text("Helmet storage compartment: []
",(src.HELMET ? HELMET.name : "
No helmet detected.") ) - if(HELMET && src.isopen) + dat+= text("Helmet storage compartment: []
",(helmet ? helmet.name : "
No helmet detected.") ) + if(helmet && state_open) dat+="Dispense helmet
" - dat+= text("Suit storage compartment: []
",(src.SUIT ? SUIT.name : "
No exosuit detected.") ) - if(SUIT && src.isopen) + dat+= text("Suit storage compartment: []
",(suit ? suit.name : "
No exosuit detected.") ) + if(suit && state_open) dat+="Dispense suit
" - dat+= text("Breathmask storage compartment: []
",(src.MASK ? MASK.name : "
No breathmask detected.") ) - if(MASK && src.isopen) + dat+= text("Breathmask storage compartment: []
",(mask ? mask.name : "
No breathmask detected.") ) + if(mask && state_open) dat+="Dispense mask
" - if(src.OCCUPANT) + dat+= text("Breathmask storage compartment: []
",(storage ? storage.name : "
No storage item detected.") ) + if(storage && state_open) + dat+="Dispense storage item
" + if(src.occupant) dat+= "
WARNING: Biological entity detected inside the Unit's storage. Please remove.
" dat+= "Eject extra load" - dat+= text("
Unit is: [] - [] Unit ",(src.isopen ? "Open" : "Closed"),(src.isopen ? "Close" : "Open")) - if(src.isopen) + dat+= text("
Unit is: [] - [] Unit ",(state_open ? "Open" : "Closed"),(state_open ? "Close" : "Open")) + if(src.state_open) dat+="
" else - dat+= text(" - *[] Unit*
",(src.islocked ? "Unlock" : "Lock") ) - dat+= text("Unit status: []",(src.islocked? "**LOCKED**
" : "**UNLOCKED**
") ) - dat+= "Start Disinfection cycle
" + dat+= text(" - *[] Unit*
",(locked ? "Unlock" : "Lock") ) + dat+= text("Unit status: []",(locked? "**LOCKED**
" : "**UNLOCKED**
") ) + dat+= "Start Disinfection cycle
" dat += "

Close control panel" - //user << browse(dat, "window=Suit Storage Unit;size=400x500") - //onclose(user, "Suit Storage Unit") else //Ohhhh shit it's dirty or broken! Let's inform the guy. dat+= "Suit storage unit" dat+= "Unit chamber is too contaminated to continue usage. Please call for a qualified individual to perform maintenance.

" dat+= "
Close control panel" - //user << browse(dat, "window=suit_storage_unit;size=400x500") - //onclose(user, "suit_storage_unit") + var/datum/browser/popup = new(user, "suit_storage_unit", name, 400, 500) popup.set_content(dat) @@ -187,263 +402,134 @@ return -/obj/machinery/suit_storage_unit/Topic(href, href_list) //I fucking HATE this proc +/obj/machinery/suit_storage_unit/Topic(href, href_list) if(..()) return 1 if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) usr.set_machine(src) if(href_list["toggleUV"]) - src.toggleUV(usr) - src.updateUsrDialog() - src.update_icon() + toggleUV(usr) + updateUsrDialog() + update_icon() if(href_list["togglesafeties"]) - src.togglesafeties(usr) - src.updateUsrDialog() - src.update_icon() + togglesafeties(usr) + updateUsrDialog() + update_icon() if(href_list["dispense_helmet"]) - src.dispense_helmet(usr) - src.updateUsrDialog() - src.update_icon() + dispense_helmet(usr) + updateUsrDialog() + update_icon() if(href_list["dispense_suit"]) - src.dispense_suit(usr) - src.updateUsrDialog() - src.update_icon() + dispense_suit(usr) + updateUsrDialog() + update_icon() if(href_list["dispense_mask"]) - src.dispense_mask(usr) - src.updateUsrDialog() - src.update_icon() + dispense_mask(usr) + updateUsrDialog() + update_icon() + if(href_list["dispense_storage"]) + dispense_storage(usr) + updateUsrDialog() + update_icon() if(href_list["toggle_open"]) - src.toggle_open(usr) - src.updateUsrDialog() - src.update_icon() + toggle_open(usr) + updateUsrDialog() + update_icon() if(href_list["toggle_lock"]) - src.toggle_lock(usr) - src.updateUsrDialog() - src.update_icon() - if(href_list["start_UV"]) - src.start_UV(usr) - src.updateUsrDialog() - src.update_icon() + toggle_lock(usr) + updateUsrDialog() + update_icon() + if(href_list["cook"]) + cook(usr) + updateUsrDialog() + update_icon() if(href_list["eject_guy"]) - src.eject_occupant(usr) - src.updateUsrDialog() - src.update_icon() - /*if(href_list["refresh"]) - src.updateUsrDialog()*/ - src.add_fingerprint(usr) + eject_occupant(usr) + updateUsrDialog() + update_icon() + add_fingerprint(usr) return /obj/machinery/suit_storage_unit/proc/toggleUV(mob/user as mob) -// var/protected = 0 -// var/mob/living/carbon/human/H = user - if(!src.panelopen) + + if(!panel_open) return - - /*if(istype(H)) //Let's check if the guy's wearing electrically insulated gloves - if(H.gloves) - var/obj/item/clothing/gloves/G = H.gloves - if(istype(G,/obj/item/clothing/gloves/color/yellow)) - protected = 1 - - if(!protected) - playsound(src.loc, "sparks", 75, 1, -1) - to_chat(user, "You try to touch the controls but you get zapped. There must be a short circuit somewhere.") - return*/ - else //welp, the guy is protected, we can continue - if(src.issuperUV) - to_chat(user, "You slide the dial back towards \"185nm\".") - src.issuperUV = 0 + else + if(uv_super) + to_chat(user, "You slide the dial back towards \"185nm\".") + uv_super = FALSE else - to_chat(user, "You crank the dial all the way up to \"15nm\".") - src.issuperUV = 1 - return - + to_chat(user, "You crank the dial all the way up to \"15nm\".") + uv_super = TRUE /obj/machinery/suit_storage_unit/proc/togglesafeties(mob/user as mob) -// var/protected = 0 -// var/mob/living/carbon/human/H = user - if(!src.panelopen) //Needed check due to bugs + if(!panel_open) return - - /*if(istype(H)) //Let's check if the guy's wearing electrically insulated gloves - if(H.gloves) - var/obj/item/clothing/gloves/G = H.gloves - if(istype(G,/obj/item/clothing/gloves/color/yellow) ) - protected = 1 - - if(!protected) - playsound(src.loc, "sparks", 75, 1, -1) - to_chat(user, "You try to touch the controls but you get zapped. There must be a short circuit somewhere.") - return*/ else - to_chat(user, "You push the button. The coloured LED next to it changes.") - src.safetieson = !src.safetieson - + to_chat(user, "You push the button. The coloured LED next to it changes.") + safeties = !safeties /obj/machinery/suit_storage_unit/proc/dispense_helmet(mob/user as mob) - if(!src.HELMET) - return //Do I even need this sanity check? Nyoro~n - else - src.HELMET.loc = src.loc - src.HELMET = null + if(!helmet) return - + else + helmet.forceMove(loc) + helmet = null /obj/machinery/suit_storage_unit/proc/dispense_suit(mob/user as mob) - if(!src.SUIT) + if(!suit) return else - src.SUIT.loc = src.loc - src.SUIT = null - return - + suit.forceMove(loc) + suit = null /obj/machinery/suit_storage_unit/proc/dispense_mask(mob/user as mob) - if(!src.MASK) + if(!mask) return else - src.MASK.loc = src.loc - src.MASK = null + mask.forceMove(loc) + mask = null + +/obj/machinery/suit_storage_unit/proc/dispense_storage(mob/user as mob) + if(!storage) return - - -/obj/machinery/suit_storage_unit/proc/dump_everything() - src.islocked = 0 //locks go free - if(src.SUIT) - src.SUIT.loc = src.loc - src.SUIT = null - if(src.HELMET) - src.HELMET.loc = src.loc - src.HELMET = null - if(src.MASK) - src.MASK.loc = src.loc - src.MASK = null - if(src.OCCUPANT) - src.eject_occupant(OCCUPANT) - return - + else + storage.forceMove(loc) + storage = null /obj/machinery/suit_storage_unit/proc/toggle_open(mob/user as mob) - if(src.islocked || src.isUV) - to_chat(user, "Unable to open unit.") + if(locked || uv) + to_chat(user, "Unable to open unit.") return - if(src.OCCUPANT) - src.eject_occupant(user) - return // eject_occupant opens the door, so we need to return - src.isopen = !src.isopen - return - + if(occupant) + eject_occupant(user) + return + state_open = !state_open /obj/machinery/suit_storage_unit/proc/toggle_lock(mob/user as mob) - if(src.OCCUPANT && src.safetieson) - to_chat(user, "The Unit's safety protocols disallow locking when a biological form is detected inside its compartments.") + if(occupant && safeties) + to_chat(user, "The unit's safety protocols disallow locking when a biological form is detected inside its compartments.") return - if(src.isopen) + if(state_open) return - src.islocked = !src.islocked - return - - -/obj/machinery/suit_storage_unit/proc/start_UV(mob/user as mob) - if(src.isUV || src.isopen) //I'm bored of all these sanity checks - return - if(src.OCCUPANT && src.safetieson) - to_chat(user, "WARNING: Biological entity detected in the confines of the Unit's storage. Cannot initiate cycle.") - return - if(!src.HELMET && !src.MASK && !src.SUIT && !src.OCCUPANT ) //shit's empty yo - to_chat(user, "Unit storage bays empty. Nothing to disinfect -- Aborting.") - return - to_chat(user, "You start the Unit's cauterisation cycle.") - src.cycletime_left = 20 - src.isUV = 1 - if(src.OCCUPANT && !src.islocked) - src.islocked = 1 //Let's lock it for good measure - src.update_icon() - src.updateUsrDialog() - - var/i //our counter - for(i=0,i<4,i++) - sleep(50) - if(src.OCCUPANT) - if(src.issuperUV) - var/burndamage = rand(35,45) - OCCUPANT.take_organ_damage(0,burndamage) - OCCUPANT.emote("scream") - else - var/burndamage = rand(10,15) - OCCUPANT.take_organ_damage(0,burndamage) - OCCUPANT.emote("scream") - if(i==3) //End of the cycle - if(!src.issuperUV) - if(src.HELMET) - HELMET.clean_blood() - if(src.SUIT) - SUIT.clean_blood() - if(src.MASK) - MASK.clean_blood() - else //It was supercycling, destroy everything - if(src.HELMET) - src.HELMET = null - if(src.SUIT) - src.SUIT = null - if(src.MASK) - src.MASK = null - visible_message("With a loud whining noise, the Suit Storage Unit's door grinds open. Puffs of ashen smoke come out of its chamber.") - src.isbroken = 1 - src.isopen = 1 - src.islocked = 0 - src.eject_occupant(OCCUPANT) //Mixing up these two lines causes bug. DO NOT DO IT. - src.isUV = 0 //Cycle ends - src.update_icon() - src.updateUsrDialog() - return - -/* spawn(200) //Let's clean dat shit after 20 secs //Eh, this doesn't work - if(src.HELMET) - HELMET.clean_blood() - if(src.SUIT) - SUIT.clean_blood() - if(src.MASK) - MASK.clean_blood() - src.isUV = 0 //Cycle ends - src.update_icon() - src.updateUsrDialog() - - var/i - for(i=0,i<4,i++) //Gradually give the guy inside some damaged based on the intensity - spawn(50) - if(OCCUPANT) - if(issuperUV) - OCCUPANT.take_organ_damage(0,40) - to_chat(user, "Test. You gave [OCCUPANT.p_them()] 40 damage") - else - OCCUPANT.take_organ_damage(0,8) - to_chat(user, "Test. You gave [OCCUPANT.p_them()] 8 damage") - return*/ - - -/obj/machinery/suit_storage_unit/proc/cycletimeleft() - if(src.cycletime_left >= 1) - src.cycletime_left-- - return src.cycletime_left - + locked = !locked /obj/machinery/suit_storage_unit/proc/eject_occupant(mob/user as mob) - if(islocked) + if(locked) return - if(!OCCUPANT) + if(!occupant) return - if(user != OCCUPANT) - to_chat(OCCUPANT, "The machine kicks you out!") + if(user != occupant) + to_chat(occupant, "The machine kicks you out!") if(user.loc != loc) - to_chat(OCCUPANT, "You leave the not-so-cozy confines of the SSU.") - OCCUPANT.forceMove(loc) - OCCUPANT = null - if(!isopen) - isopen = 1 + to_chat(occupant, "You leave the not-so-cozy confines of the SSU.") + occupant.forceMove(loc) + occupant = null + if(!state_open) + state_open = 1 update_icon() return @@ -455,13 +541,12 @@ if(usr.stat != 0) return - src.eject_occupant(usr) + eject_occupant(usr) add_fingerprint(usr) - src.updateUsrDialog() - src.update_icon() + updateUsrDialog() + update_icon() return - /obj/machinery/suit_storage_unit/verb/move_inside() set name = "Hide in Suit Storage Unit" set category = "Object" @@ -469,640 +554,28 @@ if(usr.stat != 0) return - if(!src.isopen) - to_chat(usr, "The unit's doors are shut.") + if(!state_open) + to_chat(usr, "The unit's doors are shut.") return - if(!src.ispowered || src.isbroken) - to_chat(usr, "The unit is not operational.") + if(broken) + to_chat(usr, "The unit is not operational.") return - if( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) ) - to_chat(usr, "It's too cluttered inside for you to fit in!") + if((occupant) || (helmet) || (suit) || (storage)) + to_chat(usr, "It's too cluttered inside for you to fit in!") return visible_message("[usr] starts squeezing into the suit storage unit!") if(do_after(usr, 10, target = usr)) usr.stop_pulling() usr.forceMove(src) -// usr.metabslow = 1 - src.OCCUPANT = usr - src.isopen = 0 //Close the thing after the guy gets inside - src.update_icon() + occupant = usr + state_open = FALSE //Close the thing after the guy gets inside + update_icon() -// for(var/obj/O in src) -// qdel(O) - - src.add_fingerprint(usr) - src.updateUsrDialog() + add_fingerprint(usr) + updateUsrDialog() return else - src.OCCUPANT = null //Testing this as a backup sanity test - return - - -/obj/machinery/suit_storage_unit/attackby(obj/item/I as obj, mob/user as mob, params) - if(!src.ispowered) - return - if(istype(I, /obj/item/screwdriver)) - src.panelopen = !src.panelopen - playsound(src.loc, I.usesound, 100, 1) - to_chat(user, text("You [] the unit's maintenance panel.",(src.panelopen ? "open up" : "close") )) - src.updateUsrDialog() - return - if( istype(I, /obj/item/grab) ) - var/obj/item/grab/G = I - if( !(ismob(G.affecting)) ) - return - if(!src.isopen) - to_chat(usr, "The unit's doors are shut.") - return - if(!src.ispowered || src.isbroken) - to_chat(usr, "The unit is not operational.") - return - if( (src.OCCUPANT) || (src.HELMET) || (src.SUIT) ) //Unit needs to be absolutely empty - to_chat(user, "The unit's storage area is too cluttered.") - return - visible_message("[user] starts putting [G.affecting.name] into the Suit Storage Unit.") - if(do_after(user, 20, target = G:affecting)) - if(!G || !G.affecting) return //derpcheck - var/mob/M = G.affecting - M.forceMove(src) - src.OCCUPANT = M - src.isopen = 0 //close ittt - - //for(var/obj/O in src) - // O.loc = src.loc - src.add_fingerprint(user) - qdel(G) - src.updateUsrDialog() - src.update_icon() - return - return - if( istype(I,/obj/item/clothing/suit/space) ) - if(!src.isopen) - return - var/obj/item/clothing/suit/space/S = I - if(src.SUIT) - to_chat(user, "The unit already contains a suit.") - return - to_chat(user, "You load the [S.name] into the storage compartment.") - user.drop_item() - S.loc = src - src.SUIT = S - src.update_icon() - src.updateUsrDialog() - return - if( istype(I,/obj/item/clothing/head/helmet) ) - if(!src.isopen) - return - var/obj/item/clothing/head/helmet/H = I - if(src.HELMET) - to_chat(user, "The unit already contains a helmet.") - return - to_chat(user, "You load the [H.name] into the storage compartment.") - user.drop_item() - H.loc = src - src.HELMET = H - src.update_icon() - src.updateUsrDialog() - return - if( istype(I,/obj/item/clothing/mask) ) - if(!src.isopen) - return - var/obj/item/clothing/mask/M = I - if(src.MASK) - to_chat(user, "The unit already contains a mask.") - return - to_chat(user, "You load the [M.name] into the storage compartment.") - user.drop_item() - M.loc = src - src.MASK = M - src.update_icon() - src.updateUsrDialog() - return - src.update_icon() - src.updateUsrDialog() - return - + occupant = null /obj/machinery/suit_storage_unit/attack_ai(mob/user as mob) - return src.attack_hand(user) - - - -//////////////////////////////REMINDER: Make it lock once you place some fucker inside. - -//God this entire file is fucking awful -//Suit painter for Bay's special snowflake aliums. - -/obj/machinery/suit_cycler - - name = "suit cycler" - desc = "An industrial machine for repairing, painting and equipping hardsuits." - anchored = 1 - density = 1 - - icon = 'icons/obj/suitstorage.dmi' - icon_state = "suitstorage000000100" - - req_access = list(access_captain,access_heads) - - var/active = 0 // PLEASE HOLD. - var/safeties = 1 // The cycler won't start with a living thing inside it unless safeties are off. - var/irradiating = 0 // If this is > 0, the cycler is decontaminating whatever is inside it. - var/radiation_level = 2 // 1 is removing germs, 2 is removing blood, 3 is removing plasma. - var/model_text = "" // Some flavour text for the topic box. - var/locked = 1 // If locked, nothing can be taken from or added to the cycler. - - // Wiring bollocks. - var/wires = 15 - var/electrified = 0 - var/const/WIRE_EXTEND = 1 // Safeties - var/const/WIRE_SCANID = 2 // Locked status - var/const/WIRE_SHOCK = 3 // What it says on the tin. - - //Departments that the cycler can paint suits to look like. - var/list/departments = list("Engineering","Mining","Medical","Security","Atmos") - //Species that the suits can be configured to fit. - var/list/species = list("Human","Skrell","Unathi","Tajaran") - - var/target_department = "Engineering" - var/target_species = "Human" - - var/mob/living/carbon/human/occupant = null - var/obj/item/clothing/suit/space/hardsuit/suit = null - var/obj/item/clothing/head/helmet/space/helmet = null - -/obj/machinery/suit_cycler/engineering - name = "Engineering suit cycler" - model_text = "Engineering" - req_access = list(access_construction) - departments = list("Engineering","Atmos") - species = list("Human","Unathi","Tajaran") - -/obj/machinery/suit_cycler/mining - name = "Mining suit cycler" - model_text = "Mining" - req_access = list(access_mining) - departments = list("Mining") - species = list("Human","Unathi","Tajaran") - -/obj/machinery/suit_cycler/attack_ai(mob/user as mob) - return src.attack_hand(user) - -/obj/machinery/suit_cycler/attackby(obj/item/I as obj, mob/user as mob, params) - - if(electrified != 0) - if(src.shock(user, 100)) - return - - //Hacking init. - if(istype(I, /obj/item/multitool) || istype(I, /obj/item/wirecutters)) - if(panel_open) - attack_hand(user) - return - //Other interface stuff. - if(istype(I, /obj/item/grab)) - var/obj/item/grab/G = I - - if(!(ismob(G.affecting))) - return - - if(locked) - to_chat(user, "The suit cycler is locked.") - return - - if(src.contents.len > 0) - to_chat(user, "There is no room inside the cycler for [G.affecting.name].") - return - - visible_message("[user] starts putting [G.affecting.name] into the suit cycler.") - - if(do_after(user, 20, target = G:affecting)) - if(!G || !G.affecting) return - var/mob/M = G.affecting - M.forceMove(src) - src.occupant = M - - src.add_fingerprint(user) - qdel(G) - - src.updateUsrDialog() - - return - else if(istype(I,/obj/item/screwdriver)) - - panel_open = !panel_open - to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.") - src.updateUsrDialog() - return - - else if(istype(I,/obj/item/clothing/head/helmet/space)) - - if(locked) - to_chat(user, "The suit cycler is locked.") - return - - if(helmet) - to_chat(user, "The cycler already contains a helmet.") - return - - to_chat(user, "You fit \the [I] into the suit cycler.") - user.drop_item() - I.loc = src - helmet = I - - src.update_icon() - src.updateUsrDialog() - return - - else if(istype(I,/obj/item/clothing/suit/space/hardsuit)) - - if(locked) - to_chat(user, "The suit cycler is locked.") - return - - if(suit) - to_chat(user, "The cycler already contains a hardsuit.") - return - - var/obj/item/clothing/suit/space/hardsuit/S = I - - if(S.helmet) - to_chat(user, "\The [S] will not fit into the cycler with a helmet attached.") - return - - if(S.boots) - to_chat(user, "\The [S] will not fit into the cycler with boots attached.") - return - - to_chat(user, "You fit \the [I] into the suit cycler.") - user.drop_item() - I.loc = src - suit = I - - src.update_icon() - src.updateUsrDialog() - return - - ..() - -/obj/machinery/suit_cycler/emag_act(user as mob) - if(emagged) - to_chat(user, "The cycler has already been subverted.") - return - - //Clear the access reqs, disable the safeties, and open up all paintjobs. - to_chat(user, "You run the sequencer across the interface, corrupting the operating protocols.") - departments = list("Engineering","Mining","Medical","Security","Atmos","^%###^%$") - emagged = 1 - safeties = 0 - req_access = list() - return - -/obj/machinery/suit_cycler/attack_hand(mob/user as mob) - - add_fingerprint(user) - - if(..() || stat & (BROKEN|NOPOWER)) - return - - if(!user.IsAdvancedToolUser()) - return 0 - - if(electrified != 0) - if(src.shock(user, 100)) - return - - usr.set_machine(src) - - var/dat = "Suit Cycler Interface" - - if(src.active) - dat+= "
The [model_text ? "[model_text] " : ""]suit cycler is currently in use. Please wait..." - - else if(locked) - dat += "
The [model_text ? "[model_text] " : ""]suit cycler is currently locked. Please contact your system administrator." - if(src.allowed(usr)) - dat += "
\[unlock unit\]" - else - dat += "

Suit cycler

" - dat += "Welcome to the [model_text ? "[model_text] " : ""]suit cycler control panel. \[lock unit\]
" - - dat += "

Maintenance

" - dat += "Helmet: [helmet ? "\the [helmet]" : "no helmet stored" ]. \[eject\]
" - dat += "Suit: [suit ? "\the [suit]" : "no suit stored" ]. \[eject\]" - - if(suit && istype(suit)) - dat += "[(suit.damage ? " \[repair\]" : "")]" - - dat += "
UV decontamination systems: SYSTEM ERROR" : "green'>READY"]
" - dat += "Output level: [radiation_level]
" - dat += "\[select power level\] \[begin decontamination cycle\]

" - - dat += "

Customisation

" - dat += "Target product: [target_department], [target_species]." - dat += "
\[apply customisation routine\]


" - -/* if(panel_open) - var/list/vendwires = list( - "Violet" = 1, - "Orange" = 2, - "Goldenrod" = 3, - ) - dat += "

Access Panel

" - for(var/wiredesc in vendwires) - var/is_uncut = src.wires & APCWireColorToFlag[vendwires[wiredesc]] - dat += "[wiredesc] wire: " - if(!is_uncut) - dat += "Mend" - else - dat += "Cut " - dat += "Pulse " - dat += "
" - - dat += "
" - dat += "The orange light is [(electrified == 0) ? "off" : "on"].
" - dat += "The red light is [safeties ? "blinking" : "off"].
" - dat += "The yellow light is [locked ? "on" : "off"].
" */ - - var/datum/browser/popup = new(user, "suit_cycler", name, 400, 400) - popup.set_content(dat) - popup.open(0) - onclose(user, "suit_cycler") - return - -/obj/machinery/suit_cycler/Topic(href, href_list) - if(href_list["eject_suit"]) - if(!suit) return - suit.loc = get_turf(src) - suit = null - else if(href_list["eject_helmet"]) - if(!helmet) return - helmet.loc = get_turf(src) - helmet = null - else if(href_list["select_department"]) - var/choice = input("Please select the target department paintjob.","Suit cycler",null) as null|anything in departments - if(choice) target_department = choice - else if(href_list["select_species"]) - var/choice = input("Please select the target species configuration.","Suit cycler",null) as null|anything in species - if(choice) target_species = choice - else if(href_list["select_rad_level"]) - var/choices = list(1,2,3) - if(emagged) - choices = list(1,2,3,4,5) - radiation_level = input("Please select the desired radiation level.","Suit cycler",null) as null|anything in choices - else if(href_list["repair_suit"]) - - if(!suit) return - active = 1 - spawn(100) - repair_suit() - finished_job() - - else if(href_list["apply_paintjob"]) - - if(!suit && !helmet) return - active = 1 - spawn(100) - apply_paintjob() - finished_job() - - else if(href_list["toggle_safties"]) - safeties = !safeties - - else if(href_list["toggle_lock"]) - - if(src.allowed(usr)) - locked = !locked - to_chat(usr, "You [locked ? "" : "un"]lock \the [src].") - else - to_chat(usr, "Access denied.") - - else if(href_list["begin_decontamination"]) - - if(safeties && occupant) - to_chat(usr, "The cycler has detected an occupant. Please remove the occupant before commencing the decontamination cycle.") - return - - active = 1 - irradiating = 10 - src.updateUsrDialog() - - sleep(10) - - if(helmet) - if(radiation_level > 1) - helmet.clean_blood() - - if(suit) - if(radiation_level > 1) - suit.clean_blood() - -/* else if((href_list["cutwire"]) && (src.panel_open)) - var/twire = text2num(href_list["cutwire"]) - if(!( istype(usr.get_active_hand(), /obj/item/wirecutters) )) - to_chat(usr, "You need wirecutters!") - return - if(src.isWireColorCut(twire)) - src.mend(twire) - else - src.cut(twire) - - else if((href_list["pulsewire"]) && (src.panel_open)) - var/twire = text2num(href_list["pulsewire"]) - if(!istype(usr.get_active_hand(), /obj/item/multitool)) - to_chat(usr, "You need a multitool!") - return - if(src.isWireColorCut(twire)) - to_chat(usr, "You can't pulse a cut wire.") - return - else - src.pulse(twire)*/ - - src.updateUsrDialog() - return - -/obj/machinery/suit_cycler/process() - - if(electrified > 0) - electrified-- - - if(!active) - return - - if(active && stat & (BROKEN|NOPOWER)) - active = 0 - irradiating = 0 - electrified = 0 - return - - if(irradiating == 1) - finished_job() - irradiating = 0 - return - - irradiating-- - - if(occupant) - if(prob(radiation_level*2)) occupant.emote("scream") - if(radiation_level > 2) - occupant.take_organ_damage(0,radiation_level*2 + rand(1,3)) - if(radiation_level > 1) - occupant.take_organ_damage(0,radiation_level + rand(1,3)) - occupant.apply_effect(radiation_level*10, IRRADIATE) - -/obj/machinery/suit_cycler/proc/finished_job() - var/turf/T = get_turf(src) - T.visible_message("\The [src] pings loudly.") - icon_state = initial(icon_state) - active = 0 - src.updateUsrDialog() - -/obj/machinery/suit_cycler/proc/repair_suit() - if(!suit || !suit.damage || !suit.can_breach) - return - - suit.breaches = list() - suit.calc_breach_damage() - - return - -/obj/machinery/suit_cycler/verb/leave() - set name = "Eject Cycler" - set category = "Object" - set src in oview(1) - - if(usr.stat != 0) - return - - eject_occupant(usr) - -/obj/machinery/suit_cycler/proc/eject_occupant(mob/user as mob) - - if(locked || active) - to_chat(user, "The cycler is locked.") - return - - if(!occupant) - return - - occupant.forceMove(loc) - occupant = null - - add_fingerprint(usr) - updateUsrDialog() - update_icon() - - return -/* -//HACKING PROCS, MOSTLY COPIED FROM VENDING MACHINES -/obj/machinery/suit_cycler/proc/isWireColorCut(var/wireColor) - var/wireFlag = APCWireColorToFlag[wireColor] - return ((src.wires & wireFlag) == 0) - -/obj/machinery/suit_cycler/proc/isWireCut(var/wireIndex) - var/wireFlag = APCIndexToFlag[wireIndex] - return ((src.wires & wireFlag) == 0) - -/obj/machinery/suit_cycler/proc/cut(var/wireColor) - var/wireFlag = APCWireColorToFlag[wireColor] - var/wireIndex = APCWireColorToIndex[wireColor] - src.wires &= ~wireFlag - switch(wireIndex) - - if(WIRE_EXTEND) - safeties = 0 - if(WIRE_SHOCK) - electrified = -1 - if(WIRE_SCANID) - locked = 0 - -/obj/machinery/suit_cycler/proc/mend(var/wireColor) - var/wireFlag = APCWireColorToFlag[wireColor] - var/wireIndex = APCWireColorToIndex[wireColor] //not used in this function - src.wires |= wireFlag - switch(wireIndex) - if(WIRE_SHOCK) - src.electrified = 0 - -/obj/machinery/suit_cycler/proc/pulse(var/wireColor) - var/wireIndex = APCWireColorToIndex[wireColor] - switch(wireIndex) - if(WIRE_EXTEND) - safeties = !locked - if(WIRE_SHOCK) - electrified = 30 - if(WIRE_SCANID) - locked = !locked -*/ - -//There HAS to be a less bloated way to do this. TODO: some kind of table/icon name coding? ~Z -/obj/machinery/suit_cycler/proc/apply_paintjob() - - if(!target_species || !target_department) - return - - if(target_species) - if(helmet) helmet.refit_for_species(target_species) - if(suit) suit.refit_for_species(target_species) - - switch(target_department) - if("Engineering") - if(helmet) - helmet.name = "engineering hardsuit helmet" - helmet.icon_state = "hardsuit0-engineering" - helmet.item_state = "eng_helm" - helmet.item_color = "engineering" - if(suit) - suit.name = "engineering hardsuit" - suit.icon_state = "hardsuit-engineering" - suit.item_state = "eng_hardsuit" - if("Mining") - if(helmet) - helmet.name = "mining hardsuit helmet" - helmet.icon_state = "hardsuit0-mining" - helmet.item_state = "mining_helm" - helmet.item_color = "mining" - if(suit) - suit.name = "mining hardsuit" - suit.icon_state = "hardsuit-mining" - suit.item_state = "mining_hardsuit" - if("Medical") - if(helmet) - helmet.name = "medical hardsuit helmet" - helmet.icon_state = "hardsuit0-medical" - helmet.item_state = "medical_helm" - helmet.item_color = "medical" - if(suit) - suit.name = "medical hardsuit" - suit.icon_state = "hardsuit-medical" - suit.item_state = "medical_hardsuit" - if("Security") - if(helmet) - helmet.name = "security hardsuit helmet" - helmet.icon_state = "hardsuit0-sec" - helmet.item_state = "sec_helm" - helmet.item_color = "sec" - if(suit) - suit.name = "security hardsuit" - suit.icon_state = "hardsuit-sec" - suit.item_state = "sec_hardsuit" - if("Atmos") - if(helmet) - helmet.name = "atmospherics hardsuit helmet" - helmet.icon_state = "hardsuit0-atmos" - helmet.item_state = "atmos_helm" - helmet.item_color = "atmos" - if(suit) - suit.name = "atmospherics hardsuit" - suit.icon_state = "hardsuit-atmos" - suit.item_state = "atmos_hardsuit" - if("^%###^%$") - if(helmet) - helmet.name = "blood-red hardsuit helmet" - helmet.icon_state = "hardsuit0-syndie" - helmet.item_state = "syndie_helm" - helmet.item_color = "syndie" - if(suit) - suit.name = "blood-red hardsuit" - suit.item_state = "syndie_hardsuit" - suit.icon_state = "hardsuit-syndie" + return attack_hand(user) diff --git a/icons/obj/machines/suit_storage.dmi b/icons/obj/machines/suit_storage.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e61f9567c60f8c4a5b92dba11014595a37f5dc5e GIT binary patch literal 11193 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 Date: Thu, 11 Oct 2018 21:06:07 +0100 Subject: [PATCH 07/31] fixes --- code/game/machinery/suit_storage_unit.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index baa36d5b845..c585ede686e 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -123,7 +123,7 @@ update_icon() //move this into machinery eventually... - if (occupant_typecache) + if(occupant_typecache) occupant_typecache = typecacheof(occupant_typecache) /obj/machinery/suit_storage_unit/Destroy() @@ -323,7 +323,7 @@ density = TRUE if(!target) for(var/am in loc) - if (!(occupant_typecache ? is_type_in_typecache(am, occupant_typecache) : isliving(am))) + if(!(occupant_typecache ? is_type_in_typecache(am, occupant_typecache) : isliving(am))) continue var/atom/movable/AM = am if(AM.has_buckled_mobs()) @@ -378,11 +378,11 @@ dat+= text("Breathmask storage compartment: []
",(storage ? storage.name : "
No storage item detected.") ) if(storage && state_open) dat+="Dispense storage item
" - if(src.occupant) + if(occupant) dat+= "
WARNING: Biological entity detected inside the Unit's storage. Please remove.
" dat+= "Eject extra load" dat+= text("
Unit is: [] - [] Unit ",(state_open ? "Open" : "Closed"),(state_open ? "Close" : "Open")) - if(src.state_open) + if(state_open) dat+="
" else dat+= text(" - *[] Unit*
",(locked ? "Unlock" : "Lock") ) From d5112e2203cadf4d5f1de94dd5af508082a313bc Mon Sep 17 00:00:00 2001 From: Purpose Date: Thu, 11 Oct 2018 21:47:41 +0100 Subject: [PATCH 08/31] re-adds screwdrivering! --- code/game/machinery/suit_storage_unit.dm | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index c585ede686e..d17d9231a15 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -157,6 +157,14 @@ else if(occupant) add_overlay("human") +/obj/machinery/suit_storage_unit/attackby(obj/item/I as obj, mob/user as mob, params) + if(!is_operational()) + return + if(isscrewdriver(I)) + panel_open = !panel_open + playsound(loc, I.usesound, 100, 1) + to_chat(user, text("You [panel_open ? "open up" : "close"] the unit's maintenance panel.")) + updateUsrDialog() /obj/machinery/suit_storage_unit/power_change() ..() @@ -166,7 +174,6 @@ update_icon() - /obj/machinery/suit_storage_unit/proc/dump_contents() dropContents() helmet = null From 147367468fe679d36866c8a571c8c11d875e763f Mon Sep 17 00:00:00 2001 From: Purpose Date: Sat, 13 Oct 2018 16:00:39 +0100 Subject: [PATCH 09/31] better this way.... --- code/game/machinery/suit_storage_unit.dm | 2 -- 1 file changed, 2 deletions(-) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index d17d9231a15..343af5ad7b7 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -310,7 +310,6 @@ /obj/machinery/suit_storage_unit/proc/open_machine(drop = TRUE) state_open = TRUE - density = FALSE if(drop) dropContents() update_icon() @@ -327,7 +326,6 @@ /obj/machinery/suit_storage_unit/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))) From 6b8c5983fd4d2e20b2781f8c2ed48b47e25b3c97 Mon Sep 17 00:00:00 2001 From: Purpose Date: Sat, 13 Oct 2018 16:09:02 +0100 Subject: [PATCH 10/31] some of citiniteds comments --- code/game/machinery/suit_storage_unit.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 343af5ad7b7..bb331a531ac 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -211,7 +211,7 @@ if(occupant || helmet || suit || storage) return if(target == user) - user.visible_message("[user] slips into [src] and closes the door behind [user.p_them()]!", "You slip into [src]'s cramped space and shut its door.") + user.visible_message("[user] slips into [src] and closes the door behind [user.p_them()]!", "You slip into [src]'s cramped space and shut its door.") else target.visible_message("[user] pushes [target] into [src] and shuts its door!", "[user] shoves you into [src] and shuts the door!") close_machine(target) @@ -301,7 +301,7 @@ dump_contents() /obj/machinery/suit_storage_unit/proc/resist_open(mob/user) - if(!state_open && occupant && (user in src) && user.stat == 0) // Check they're still here. + if(!state_open && occupant && (user in src) && !user.stat) // Check they're still here. visible_message("You see [user] burst out of [src]!", \ "You escape the cramped confines of [src]!") open_machine() @@ -361,7 +361,7 @@ dat+= "Suit storage unit: Maintenance panel" dat+= "Maintenance panel controls
" dat+= "The panel is ridden with controls, button and meters, labeled in strange signs and symbols that
you cannot understand. Probably the manufactoring world's language.
Among other things, a few controls catch your eye.

" - dat+= text("A small dial with a \"�\" symbol embroidded on it. It's pointing towards a gauge that reads [].
Turn towards []
",(uv_super ? "15nm" : "185nm"),(uv_super ? "185nm" : "15nm") ) + dat+= text("A small dial with a arrow embroidered on it. It's pointing towards a gauge that reads [].
Turn towards []
",(uv_super ? "15nm" : "185nm"),(uv_super ? "185nm" : "15nm") ) dat+= text("A thick old-style button, with 2 grimy LED lights next to it. The [] LED is on.
Press button",(safeties ? "GREEN" : "RED")) dat+= "

Close panel" else if(uv) //The thing is running its cauterisation cycle. You have to wait. From 98d37fd9a095214ca0695a86d6c757f78a41d32a Mon Sep 17 00:00:00 2001 From: dapocalypse Date: Sat, 13 Oct 2018 16:10:26 -0700 Subject: [PATCH 11/31] putting name in the hrefs --- .../file_system/programs/generic/file_browser.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm index 373660438c8..23b2cdab7ab 100644 --- a/code/modules/modular_computers/file_system/programs/generic/file_browser.dm +++ b/code/modules/modular_computers/file_system/programs/generic/file_browser.dm @@ -85,10 +85,10 @@ switch(href_list["action"]) if("PRG_openfile") . = 1 - var/datum/computer_file/F = HDD.find_file_by_name(href_list["PRG_openfile"]) + var/datum/computer_file/F = HDD.find_file_by_name(href_list["name"]) if(!F.can_access_file(usr)) return - open_file = href_list["PRG_openfile"] + open_file = href_list["name"] if("PRG_newtextfile") . = 1 var/newname = stripped_input(usr, "Enter file name or leave blank to cancel:", "File rename", max_length=50) From 30fc7de2d3f1a4c7914f80441c36afca9d50429c Mon Sep 17 00:00:00 2001 From: Purpose Date: Mon, 15 Oct 2018 23:05:15 +0100 Subject: [PATCH 12/31] Update suit_storage_unit.dm --- code/game/machinery/suit_storage_unit.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index bb331a531ac..2d395da0dd0 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -193,10 +193,10 @@ return var/mob/living/target = A if(!state_open) - to_chat(user, "The unit's doors are shut!") + to_chat(user, "The [src]'s doors are shut!") return if(!is_operational()) - to_chat(user, "The unit is not operational!") + to_chat(user, "The [src] is not operational!") return if(occupant || helmet || suit || storage) to_chat(user, "It's too cluttered inside to fit in!") From 34aadd6b2517eff075e69067f65cb04d29a1ca85 Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Tue, 16 Oct 2018 08:57:10 +0800 Subject: [PATCH 13/31] Manually revert Purpose's smooth plating PR's smoothing component --- code/game/turfs/simulated/floor.dm | 1 - code/game/turfs/simulated/floor/plating.dm | 4 ---- code/game/turfs/turf.dm | 2 -- code/modules/mining/mine_turfs.dm | 2 +- 4 files changed, 1 insertion(+), 8 deletions(-) diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 42d241404b1..d26a24b39a2 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -180,7 +180,6 @@ var/list/icons_to_ignore_at_floor_init = list("damaged1","damaged2","damaged3"," var/turf/simulated/floor/plating/P = pry_tile(CB, user, TRUE) if(!istype(P)) return - update_icon() P.attackby(T, user, params) /turf/simulated/floor/proc/pry_tile(obj/item/C, mob/user, silent = FALSE) diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index 4c6eee6311e..c6de130c81a 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -15,9 +15,6 @@ /turf/simulated/floor/plating/New() ..() icon_plating = icon_state - if(icon == 'icons/turf/floors/plating.dmi') - smooth = SMOOTH_MORE - canSmoothWith = list(/turf/simulated/floor/plating, /turf/space) update_icon() /turf/simulated/floor/plating/update_icon() @@ -25,7 +22,6 @@ return if(!broken && !burnt) icon_state = icon_plating //Because asteroids are 'platings' too. - underlays += image(icon, icon_state) /turf/simulated/floor/plating/attackby(obj/item/C, mob/user, params) if(..()) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 2e60537ce6f..4d6974f702f 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -226,8 +226,6 @@ for(var/obj/structure/cable/C in contents) qdel(C) - smooth_icon(src) - /turf/simulated/AfterChange(ignore_air, keep_cabling = FALSE) ..() RemoveLattice() diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index 303b34aed34..79cfc3ae9f8 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -462,10 +462,10 @@ var/global/list/rockTurfEdgeCache = list( /turf/simulated/floor/plating/airless/asteroid/New() var/proper_name = name + ..() name = proper_name if(prob(20)) icon_state = "asteroid[rand(0,12)]" - ..() /turf/simulated/floor/plating/airless/asteroid/ex_act(severity, target) switch(severity) From b947d399fe0da28ed948d40546213cc04facbbcc Mon Sep 17 00:00:00 2001 From: variableundefined <40092670+variableundefined@users.noreply.github.com> Date: Tue, 16 Oct 2018 09:04:50 +0800 Subject: [PATCH 14/31] Revert plating icon change --- icons/turf/floors/plating.dmi | Bin 49268 -> 49217 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/turf/floors/plating.dmi b/icons/turf/floors/plating.dmi index c3c480bfc6a28726a09b0f5d5922b76d62289fc8..fee52346e3c226207d7ba87901488301b8bc8e8f 100644 GIT binary patch delta 19697 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 Gi|}9iWJJgS From bf878d9173f67c1818820ac39bc0f0c97e288211 Mon Sep 17 00:00:00 2001 From: craftxbox Date: Thu, 18 Oct 2018 17:21:47 -0230 Subject: [PATCH 15/31] add check to make sure person downloading pAI isnt dead. --- code/modules/mob/living/silicon/pai/recruit.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 07df995658e..fd775ec0168 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -36,8 +36,11 @@ var/datum/paiController/paiController // Global handler for pAI candidates if(href_list["download"]) var/datum/paiCandidate/candidate = locate(href_list["candidate"]) var/obj/item/paicard/card = locate(href_list["device"]) + var/mob/downloader = locate(href_list["downloader"]) if(card.pai) return + if(downloader.stat == DEAD || istype(downloader,/mob/dead/observer)) + return if(istype(card,/obj/item/paicard) && istype(candidate,/datum/paiCandidate)) var/mob/living/silicon/pai/pai = new(card) if(!candidate.name) @@ -334,7 +337,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates -
Download [c.name] + Download [c.name]

From 11c5d69660a078a5f8273e7ebf598cb91b9a4374 Mon Sep 17 00:00:00 2001 From: craftxbox Date: Fri, 19 Oct 2018 00:14:08 -0230 Subject: [PATCH 16/31] remove \ref --- code/modules/mob/living/silicon/pai/recruit.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index fd775ec0168..37fe7b99fcc 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -337,7 +337,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates -
Download [c.name] + Download [c.name]

From 54f6d54d4c378c0ad3c790f602e475f6b76baeee Mon Sep 17 00:00:00 2001 From: tigercat2000 Date: Thu, 18 Oct 2018 22:19:25 -0700 Subject: [PATCH 17/31] Hover indicator for body zones --- code/_onclick/hud/screen_objects.dm | 95 +++++++++++++++++++++-------- 1 file changed, 70 insertions(+), 25 deletions(-) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 7c38ee1072a..623d1bb5dd6 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -175,66 +175,111 @@ icon_state = "zone_sel" screen_loc = ui_zonesel var/selecting = "chest" + var/static/list/hover_overlays_cache = list() + var/hovering /obj/screen/zone_sel/Click(location, control,params) + if(isobserver(usr)) + return + var/list/PL = params2list(params) var/icon_x = text2num(PL["icon-x"]) var/icon_y = text2num(PL["icon-y"]) - var/old_selecting = selecting //We're only going to update_icon() if there's been a change + var/choice = get_zone_at(icon_x, icon_y) + if(!choice) + return 1 + return set_selected_zone(choice, usr) + +/obj/screen/zone_sel/MouseEntered(location, control, params) + MouseMove(location, control, params) + +/obj/screen/zone_sel/MouseMove(location, control, params) + if(isobserver(usr)) + return + + var/list/PL = params2list(params) + var/icon_x = text2num(PL["icon-x"]) + var/icon_y = text2num(PL["icon-y"]) + var/choice = get_zone_at(icon_x, icon_y) + + if(hovering == choice) + return + cut_overlay(hover_overlays_cache[hovering]) + hovering = choice + + var/obj/effect/overlay/zone_sel/overlay_object = hover_overlays_cache[choice] + if(!overlay_object) + overlay_object = new + overlay_object.icon_state = "[choice]" + hover_overlays_cache[choice] = overlay_object + add_overlay(overlay_object) + + +/obj/effect/overlay/zone_sel + icon = 'icons/mob/zone_sel.dmi' + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + alpha = 128 + anchored = TRUE + layer = ABOVE_HUD_LAYER + plane = ABOVE_HUD_PLANE + +/obj/screen/zone_sel/MouseExited(location, control, params) + if(!isobserver(usr) && hovering) + cut_overlay(hover_overlays_cache[hovering]) + hovering = null + +/obj/screen/zone_sel/proc/get_zone_at(icon_x, icon_y) switch(icon_y) if(1 to 3) //Feet switch(icon_x) if(10 to 15) - selecting = "r_foot" + return "r_foot" if(17 to 22) - selecting = "l_foot" - else - return 1 + return "l_foot" if(4 to 9) //Legs switch(icon_x) if(10 to 15) - selecting = "r_leg" + return "r_leg" if(17 to 22) - selecting = "l_leg" - else - return 1 + return "l_leg" if(10 to 13) //Hands and groin switch(icon_x) if(8 to 11) - selecting = "r_hand" + return "r_hand" if(12 to 20) - selecting = "groin" + return "groin" if(21 to 24) - selecting = "l_hand" - else - return 1 + return "l_hand" if(14 to 22) //Chest and arms to shoulders switch(icon_x) if(8 to 11) - selecting = "r_arm" + return "r_arm" if(12 to 20) - selecting = "chest" + return "chest" if(21 to 24) - selecting = "l_arm" - else - return 1 + return "l_arm" if(23 to 30) //Head, but we need to check for eye or mouth if(icon_x in 12 to 20) - selecting = "head" switch(icon_y) if(23 to 24) if(icon_x in 15 to 17) - selecting = "mouth" + return "mouth" if(26) //Eyeline, eyes are on 15 and 17 if(icon_x in 14 to 18) - selecting = "eyes" + return "eyes" if(25 to 27) if(icon_x in 15 to 17) - selecting = "eyes" + return "eyes" + return "head" - if(old_selecting != selecting) - update_icon() +/obj/screen/zone_sel/proc/set_selected_zone(choice, mob/user) + if(isobserver(user)) + return + + if(choice != selecting) + selecting = choice + update_icon(usr) return 1 /obj/screen/zone_sel/update_icon() From d392e6895a6e8fe34b27fd9150ec4650d8bf010c Mon Sep 17 00:00:00 2001 From: Purpose Date: Fri, 19 Oct 2018 10:25:25 +0100 Subject: [PATCH 18/31] welp --- code/modules/hydroponics/grown/kudzu.dm | 4 ++-- code/modules/hydroponics/sample.dm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index 855ca829bfa..ba67bf426fa 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -59,7 +59,7 @@ mutations.Remove(pick(temp_mut_list)) temp_mut_list.Cut() - if(S.has_reagent("welding_fuel", 5)) + if(S.has_reagent("fuel", 5)) for(var/datum/spacevine_mutation/SM in mutations) if(SM.quality == POSITIVE) temp_mut_list += SM @@ -94,4 +94,4 @@ desc = "Pueraria Virallis: An invasive species with vines that rapidly creep and wrap around whatever they contact." icon_state = "kudzupod" filling_color = "#6B8E23" - bitesize_mod = 2 \ No newline at end of file + bitesize_mod = 2 diff --git a/code/modules/hydroponics/sample.dm b/code/modules/hydroponics/sample.dm index 4478671b2fb..e2d5ea6eb97 100644 --- a/code/modules/hydroponics/sample.dm +++ b/code/modules/hydroponics/sample.dm @@ -12,7 +12,7 @@ var/list/chem_t2_reagents = list( var/list/chem_t3_reagents = list( "ethanol", "chlorine", "potassium", "aluminium", "radium", "fluorine", - "iron", "welding_fuel", "silver", + "iron", "fuel", "silver", "stable_plasma" ) @@ -41,4 +41,4 @@ var/list/chem_t4_reagents = list( /obj/item/seeds/sample/alienweed name = "alien weed sample" icon_state = "alienweed" - sample_color = null \ No newline at end of file + sample_color = null From ed4f83e5c5384dd1b70bf65db8a701237102afa8 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 19 Oct 2018 05:49:57 -0400 Subject: [PATCH 19/31] Automatic changelog generation for PR #9896 [ci skip] --- html/changelogs/AutoChangeLog-pr-9896.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9896.yml diff --git a/html/changelogs/AutoChangeLog-pr-9896.yml b/html/changelogs/AutoChangeLog-pr-9896.yml new file mode 100644 index 00000000000..f02d1c093a2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9896.yml @@ -0,0 +1,4 @@ +author: "SpaceManiac" +delete-after: True +changes: + - rscadd: "The body zone selector now indicates which body part you are about to select when hovered over." From 001268f82f799877c62aedc13793473c4666b7da Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 19 Oct 2018 05:50:14 -0400 Subject: [PATCH 20/31] Automatic changelog generation for PR #9899 [ci skip] --- html/changelogs/AutoChangeLog-pr-9899.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9899.yml diff --git a/html/changelogs/AutoChangeLog-pr-9899.yml b/html/changelogs/AutoChangeLog-pr-9899.yml new file mode 100644 index 00000000000..832fa97a12e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9899.yml @@ -0,0 +1,4 @@ +author: "Purpose" +delete-after: True +changes: + - bugfix: "Fixed an issue with Space Vine mutations" From eb78c13a4f71c4c3d2d7d43b6f8b3c408d58a3d8 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 19 Oct 2018 13:05:45 +0000 Subject: [PATCH 21/31] Automatic changelog compile, [ci skip] --- html/changelog.html | 8 ++++++++ html/changelogs/.all_changelog.yml | 5 +++++ html/changelogs/AutoChangeLog-pr-9896.yml | 4 ---- html/changelogs/AutoChangeLog-pr-9899.yml | 4 ---- 4 files changed, 13 insertions(+), 8 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-9896.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9899.yml diff --git a/html/changelog.html b/html/changelog.html index 735cb9d6cee..4c65667d554 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -61,6 +61,14 @@

+

Purpose updated:

+
    +
  • Fixed an issue with Space Vine mutations
  • +
+

SpaceManiac updated:

+
    +
  • The body zone selector now indicates which body part you are about to select when hovered over.
  • +

TDSSS updated:

  • New exosuit equipment: The rescue jaws for the Odysseus lets it open doors, firelocks and even force powered doors. It can also be added to firefighter ripleys.
  • diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 24edf7d9cf9..c06f5542107 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -7563,6 +7563,11 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2018-10-19: Fox McCloud: - bugfix: Fixes round-start sparks being stuck in maintenance + Purpose: + - bugfix: Fixed an issue with Space Vine mutations + SpaceManiac: + - rscadd: The body zone selector now indicates which body part you are about to + select when hovered over. TDSSS: - rscadd: 'New exosuit equipment: The rescue jaws for the Odysseus lets it open doors, firelocks and even force powered doors. It can also be added to firefighter diff --git a/html/changelogs/AutoChangeLog-pr-9896.yml b/html/changelogs/AutoChangeLog-pr-9896.yml deleted file mode 100644 index f02d1c093a2..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9896.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "SpaceManiac" -delete-after: True -changes: - - rscadd: "The body zone selector now indicates which body part you are about to select when hovered over." diff --git a/html/changelogs/AutoChangeLog-pr-9899.yml b/html/changelogs/AutoChangeLog-pr-9899.yml deleted file mode 100644 index 832fa97a12e..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9899.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Purpose" -delete-after: True -changes: - - bugfix: "Fixed an issue with Space Vine mutations" From 0f8c2f6de8c9afdd8cef03ce5dbe5f480ff9d5b7 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 19 Oct 2018 19:16:01 -0400 Subject: [PATCH 22/31] Automatic changelog generation for PR #9864 [ci skip] --- html/changelogs/AutoChangeLog-pr-9864.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9864.yml diff --git a/html/changelogs/AutoChangeLog-pr-9864.yml b/html/changelogs/AutoChangeLog-pr-9864.yml new file mode 100644 index 00000000000..b14294c99ce --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9864.yml @@ -0,0 +1,4 @@ +author: "variableundefined" +delete-after: True +changes: + - tweak: "Plating's icon is back to the old one once again." From 0eff55eaf92d60fb166e1374d8bd69b09b3e91a3 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 19 Oct 2018 20:25:35 -0400 Subject: [PATCH 23/31] Automatic changelog generation for PR #9810 [ci skip] --- html/changelogs/AutoChangeLog-pr-9810.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9810.yml diff --git a/html/changelogs/AutoChangeLog-pr-9810.yml b/html/changelogs/AutoChangeLog-pr-9810.yml new file mode 100644 index 00000000000..921d8f8b459 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9810.yml @@ -0,0 +1,5 @@ +author: "Purpose" +delete-after: True +changes: + - rscadd: "Suit storage units now contain magboots for relevant roles." + - bugfix: "Adds the captains jetpack to his suit storage unit, so it is now stealable again on Delta." From 68ff3bd0ba4408baf078b301f497c029f2e4b4ec Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 19 Oct 2018 20:37:54 -0400 Subject: [PATCH 24/31] Automatic changelog generation for PR #9624 [ci skip] --- html/changelogs/AutoChangeLog-pr-9624.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9624.yml diff --git a/html/changelogs/AutoChangeLog-pr-9624.yml b/html/changelogs/AutoChangeLog-pr-9624.yml new file mode 100644 index 00000000000..443ac6aede0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9624.yml @@ -0,0 +1,4 @@ +author: "uc_guy" +delete-after: True +changes: + - bugfix: "It is no longer possible to duplicate uvents." From 1d03cb35c6d0d41d50d5dbe9d1f595e026173be4 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Fri, 19 Oct 2018 23:01:36 -0400 Subject: [PATCH 25/31] Automatic changelog generation for PR #9662 [ci skip] --- html/changelogs/AutoChangeLog-pr-9662.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9662.yml diff --git a/html/changelogs/AutoChangeLog-pr-9662.yml b/html/changelogs/AutoChangeLog-pr-9662.yml new file mode 100644 index 00000000000..cfe3062bb60 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9662.yml @@ -0,0 +1,4 @@ +author: "Dapocalypse" +delete-after: True +changes: + - rscadd: "Adds password protected files to modular computer." From 432304726c719dd6480775d8965c221400b954ee Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 20 Oct 2018 03:36:53 +0000 Subject: [PATCH 26/31] Automatic changelog compile, [ci skip] --- html/changelog.html | 19 +++++++++++++++++++ html/changelogs/.all_changelog.yml | 11 +++++++++++ html/changelogs/AutoChangeLog-pr-9624.yml | 4 ---- html/changelogs/AutoChangeLog-pr-9662.yml | 4 ---- html/changelogs/AutoChangeLog-pr-9810.yml | 5 ----- html/changelogs/AutoChangeLog-pr-9864.yml | 4 ---- 6 files changed, 30 insertions(+), 17 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-9624.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9662.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9810.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-9864.yml diff --git a/html/changelog.html b/html/changelog.html index 4c65667d554..2b13f2dbd94 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -56,6 +56,25 @@ -->
    +

    20 October 2018

    +

    Dapocalypse updated:

    +
      +
    • Adds password protected files to modular computer.
    • +
    +

    Purpose updated:

    +
      +
    • Suit storage units now contain magboots for relevant roles.
    • +
    • Adds the captains jetpack to his suit storage unit, so it is now stealable again on Delta.
    • +
    +

    uc_guy updated:

    +
      +
    • It is no longer possible to duplicate uvents.
    • +
    +

    variableundefined updated:

    +
      +
    • Plating's icon is back to the old one once again.
    • +
    +

    19 October 2018

    Fox McCloud updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index c06f5542107..27ae375792b 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -7579,3 +7579,14 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - rscdel: Removed old UI from safe - tweak: Safe now is only Right - Left - Right. Safe is 0-99 rather than 0-71. - imageadd: Added safe dial for it's nanoui. +2018-10-20: + Dapocalypse: + - rscadd: Adds password protected files to modular computer. + Purpose: + - rscadd: Suit storage units now contain magboots for relevant roles. + - bugfix: Adds the captains jetpack to his suit storage unit, so it is now stealable + again on Delta. + uc_guy: + - bugfix: It is no longer possible to duplicate uvents. + variableundefined: + - tweak: Plating's icon is back to the old one once again. diff --git a/html/changelogs/AutoChangeLog-pr-9624.yml b/html/changelogs/AutoChangeLog-pr-9624.yml deleted file mode 100644 index 443ac6aede0..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9624.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "uc_guy" -delete-after: True -changes: - - bugfix: "It is no longer possible to duplicate uvents." diff --git a/html/changelogs/AutoChangeLog-pr-9662.yml b/html/changelogs/AutoChangeLog-pr-9662.yml deleted file mode 100644 index cfe3062bb60..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9662.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dapocalypse" -delete-after: True -changes: - - rscadd: "Adds password protected files to modular computer." diff --git a/html/changelogs/AutoChangeLog-pr-9810.yml b/html/changelogs/AutoChangeLog-pr-9810.yml deleted file mode 100644 index 921d8f8b459..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9810.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Purpose" -delete-after: True -changes: - - rscadd: "Suit storage units now contain magboots for relevant roles." - - bugfix: "Adds the captains jetpack to his suit storage unit, so it is now stealable again on Delta." diff --git a/html/changelogs/AutoChangeLog-pr-9864.yml b/html/changelogs/AutoChangeLog-pr-9864.yml deleted file mode 100644 index b14294c99ce..00000000000 --- a/html/changelogs/AutoChangeLog-pr-9864.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "variableundefined" -delete-after: True -changes: - - tweak: "Plating's icon is back to the old one once again." From 2a3e27e14d9f5f802d901b57895e25cb146e9aff Mon Sep 17 00:00:00 2001 From: craftxbox Date: Sat, 20 Oct 2018 01:56:01 -0230 Subject: [PATCH 27/31] use better dead checking methods. --- code/modules/mob/living/silicon/pai/recruit.dm | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 37fe7b99fcc..8dd33a1caff 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -36,10 +36,9 @@ var/datum/paiController/paiController // Global handler for pAI candidates if(href_list["download"]) var/datum/paiCandidate/candidate = locate(href_list["candidate"]) var/obj/item/paicard/card = locate(href_list["device"]) - var/mob/downloader = locate(href_list["downloader"]) if(card.pai) return - if(downloader.stat == DEAD || istype(downloader,/mob/dead/observer)) + if(usr.incapacitated() || isobserver(usr)) return if(istype(card,/obj/item/paicard) && istype(candidate,/datum/paiCandidate)) var/mob/living/silicon/pai/pai = new(card) @@ -337,7 +336,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates -
      Download [c.name] + Download [c.name]

      From 2e8c655f67e1511aa6fb406824804b9a892abe21 Mon Sep 17 00:00:00 2001 From: craftxbox Date: Sat, 20 Oct 2018 01:56:21 -0230 Subject: [PATCH 28/31] add adjacent check too. --- code/modules/mob/living/silicon/pai/recruit.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/pai/recruit.dm b/code/modules/mob/living/silicon/pai/recruit.dm index 8dd33a1caff..9dfaa8337fc 100644 --- a/code/modules/mob/living/silicon/pai/recruit.dm +++ b/code/modules/mob/living/silicon/pai/recruit.dm @@ -38,7 +38,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates var/obj/item/paicard/card = locate(href_list["device"]) if(card.pai) return - if(usr.incapacitated() || isobserver(usr)) + if(usr.incapacitated() || isobserver(usr) || !card.Adjacent(usr)) return if(istype(card,/obj/item/paicard) && istype(candidate,/datum/paiCandidate)) var/mob/living/silicon/pai/pai = new(card) From 7d3be0e838d89b6d9d92f619361005767e495c7e Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Sat, 20 Oct 2018 00:49:55 -0400 Subject: [PATCH 29/31] Updates the Garbage SS --- code/__DEFINES/components.dm | 3 +- code/__DEFINES/qdel.dm | 10 ++-- code/controllers/subsystem/garbage.dm | 67 +++++++-------------------- 3 files changed, 24 insertions(+), 56 deletions(-) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 6f14b75b2ec..967749a55a7 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -17,7 +17,8 @@ // /datum signals #define COMSIG_COMPONENT_ADDED "component_added" //when a component is added to a datum: (/datum/component) #define COMSIG_COMPONENT_REMOVING "component_removing" //before a component is removed from a datum because of RemoveComponent: (/datum/component) -#define COMSIG_PARENT_QDELETED "parent_qdeleted" //before a datum's Destroy() is called: () +#define COMSIG_PARENT_PREQDELETED "parent_preqdeleted" //before a datum's Destroy() is called: (force), returning a nonzero value will cancel the qdel operation +#define COMSIG_PARENT_QDELETED "parent_qdeleted" //after a datum's Destroy() is called: (force, qdel_hint), at this point none of the other components chose to interrupt qdel and Destroy has been called // /atom signals #define COMSIG_PARENT_ATTACKBY "atom_attackby" //from base of atom/attackby(): (/obj/item, /mob/living, params) diff --git a/code/__DEFINES/qdel.dm b/code/__DEFINES/qdel.dm index 8d504edaf41..6adb876da8d 100644 --- a/code/__DEFINES/qdel.dm +++ b/code/__DEFINES/qdel.dm @@ -11,14 +11,12 @@ #define QDEL_HINT_IFFAIL_FINDREFERENCE 6 //Above but only if gc fails. //defines for the gc_destroyed var -#define GC_QUEUE_PREQUEUE 1 -#define GC_QUEUE_CHECK 2 -#define GC_QUEUE_HARDDELETE 3 -#define GC_QUEUE_COUNT 3 //increase this when adding more steps. +#define GC_QUEUE_CHECK 1 +#define GC_QUEUE_HARDDELETE 2 +#define GC_QUEUE_COUNT 2 //increase this when adding more steps. #define GC_QUEUED_FOR_QUEUING -1 -#define GC_QUEUED_FOR_HARD_DEL -2 -#define GC_CURRENTLY_BEING_QDELETED -3 +#define GC_CURRENTLY_BEING_QDELETED -2 #define QDELING(X) (X.gc_destroyed) #define QDELETED(X) (!X || QDELING(X)) diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 97dd02838d0..c1cb90919f5 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -59,7 +59,6 @@ SUBSYSTEM_DEF(garbage) msg += " | Fail:[fail_counts.Join(",")]" ..(msg) - /datum/controller/subsystem/garbage/Shutdown() //Adds the del() log to the qdel log file var/list/dellog = list() @@ -86,41 +85,21 @@ SUBSYSTEM_DEF(garbage) /datum/controller/subsystem/garbage/fire() //the fact that this resets its processing each fire (rather then resume where it left off) is intentional. - var/queue = GC_QUEUE_PREQUEUE + var/queue = GC_QUEUE_CHECK while(state == SS_RUNNING) switch(queue) - if(GC_QUEUE_PREQUEUE) - HandlePreQueue() - queue = GC_QUEUE_PREQUEUE + 1 if(GC_QUEUE_CHECK) HandleQueue(GC_QUEUE_CHECK) queue = GC_QUEUE_CHECK + 1 if(GC_QUEUE_HARDDELETE) HandleQueue(GC_QUEUE_HARDDELETE) + if(state == SS_PAUSED) //make us wait again before the next run. + state = SS_RUNNING break - if(state == SS_PAUSED) //make us wait again before the next run. - state = SS_RUNNING -//If you see this proc high on the profile, what you are really seeing is the garbage collection/soft delete overhead in byond. -//Don't attempt to optimize, not worth the effort. -/datum/controller/subsystem/garbage/proc/HandlePreQueue() - var/list/tobequeued = queues[GC_QUEUE_PREQUEUE] - var/static/count = 0 - if(count) - var/c = count - count = 0 //so if we runtime on the Cut, we don't try again. - tobequeued.Cut(1, c + 1) - for(var/ref in tobequeued) - count++ - Queue(ref, GC_QUEUE_PREQUEUE + 1) - if(MC_TICK_CHECK) - break - if(count) - tobequeued.Cut(1, count + 1) - count = 0 /datum/controller/subsystem/garbage/proc/HandleQueue(level = GC_QUEUE_CHECK) if(level == GC_QUEUE_CHECK) @@ -142,7 +121,7 @@ SUBSYSTEM_DEF(garbage) if(!refID) count++ if(MC_TICK_CHECK) - break + return continue var/GCd_at_time = queue[refID] @@ -161,7 +140,7 @@ SUBSYSTEM_DEF(garbage) reference_find_on_fail -= refID //It's deleted we don't care anymore. #endif if(MC_TICK_CHECK) - break + return continue // Something's still referring to the qdel'd object. @@ -184,27 +163,20 @@ SUBSYSTEM_DEF(garbage) if(GC_QUEUE_HARDDELETE) HardDelete(D) if(MC_TICK_CHECK) - break + return continue Queue(D, level + 1) if(MC_TICK_CHECK) - break + return if(count) queue.Cut(1, count + 1) count = 0 -/datum/controller/subsystem/garbage/proc/PreQueue(datum/D) - if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) - queues[GC_QUEUE_PREQUEUE] += D - D.gc_destroyed = GC_QUEUED_FOR_QUEUING - /datum/controller/subsystem/garbage/proc/Queue(datum/D, level = GC_QUEUE_CHECK) if(isnull(D)) return - if(D.gc_destroyed == GC_QUEUED_FOR_HARD_DEL) - level = GC_QUEUE_HARDDELETE if(level > GC_QUEUE_COUNT) HardDelete(D) return @@ -250,11 +222,6 @@ SUBSYSTEM_DEF(garbage) message_admins("Error: [type]([refID]) took longer than 1 second to delete (took [time / 10] seconds to delete).") postpone(time) -/datum/controller/subsystem/garbage/proc/HardQueue(datum/D) - if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) - queues[GC_QUEUE_PREQUEUE] += D - D.gc_destroyed = GC_QUEUED_FOR_HARD_DEL - /datum/controller/subsystem/garbage/Recover() if(istype(SSgarbage.queues)) for(var/i in 1 to SSgarbage.queues.len) @@ -294,11 +261,13 @@ SUBSYSTEM_DEF(garbage) if(isnull(D.gc_destroyed)) - D.SendSignal(COMSIG_PARENT_QDELETED) + if(D.SendSignal(COMSIG_PARENT_PREQDELETED, force)) // Give the components a chance to prevent their parent from being deleted + return D.gc_destroyed = GC_CURRENTLY_BEING_QDELETED var/start_time = world.time var/start_tick = world.tick_usage var/hint = D.Destroy(arglist(args.Copy(2))) // Let our friend know they're about to get fucked up. + D.SendSignal(COMSIG_PARENT_QDELETED, force, hint) // Let the (remaining) components know about the result of Destroy if(world.time != start_time) I.slept_destroy++ else @@ -307,7 +276,7 @@ SUBSYSTEM_DEF(garbage) return switch(hint) if(QDEL_HINT_QUEUE) //qdel should queue the object for deletion. - SSgarbage.PreQueue(D) + SSgarbage.Queue(D) if(QDEL_HINT_IWILLGC) D.gc_destroyed = world.time return @@ -327,18 +296,18 @@ SUBSYSTEM_DEF(garbage) #endif I.no_respect_force++ - SSgarbage.PreQueue(D) - if(QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete using a hard reference to save time from the locate() - SSgarbage.HardQueue(D) + SSgarbage.Queue(D) + if(QDEL_HINT_HARDDEL) //qdel should assume this object won't gc, and queue a hard delete + SSgarbage.Queue(D, GC_QUEUE_HARDDELETE) if(QDEL_HINT_HARDDEL_NOW) //qdel should assume this object won't gc, and hard del it post haste. SSgarbage.HardDelete(D) if(QDEL_HINT_FINDREFERENCE)//qdel will, if TESTING is enabled, display all references to this object, then queue the object for deletion. - SSgarbage.PreQueue(D) + SSgarbage.Queue(D) #ifdef TESTING D.find_references() #endif if(QDEL_HINT_IFFAIL_FINDREFERENCE) - SSgarbage.PreQueue(D) + SSgarbage.Queue(D) #ifdef TESTING SSgarbage.reference_find_on_fail["\ref[D]"] = TRUE #endif @@ -348,7 +317,7 @@ SUBSYSTEM_DEF(garbage) testing("WARNING: [D.type] is not returning a qdel hint. It is being placed in the queue. Further instances of this type will also be queued.") #endif I.no_hint++ - SSgarbage.PreQueue(D) + SSgarbage.Queue(D) else if(D.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) CRASH("[D.type] destroy proc was called multiple times, likely due to a qdel loop in the Destroy logic") @@ -463,4 +432,4 @@ SUBSYSTEM_DEF(garbage) CHECK_TICK #endif -#endif +#endif \ No newline at end of file From 9ba96bf3d4aa79975bbe9a1dbdbccde47fdc887c Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 20 Oct 2018 00:56:47 -0400 Subject: [PATCH 30/31] Automatic changelog generation for PR #9894 [ci skip] --- html/changelogs/AutoChangeLog-pr-9894.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9894.yml diff --git a/html/changelogs/AutoChangeLog-pr-9894.yml b/html/changelogs/AutoChangeLog-pr-9894.yml new file mode 100644 index 00000000000..07a4419b100 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9894.yml @@ -0,0 +1,4 @@ +author: "craftxbox" +delete-after: True +changes: + - bugfix: "added check to make sure person downloading pAI isnt dead." From 51e2215537ba3cfe6fe189e1ba7efb2a735615e7 Mon Sep 17 00:00:00 2001 From: ParadiseSS13-Bot Date: Sat, 20 Oct 2018 03:07:24 -0400 Subject: [PATCH 31/31] Automatic changelog generation for PR #9908 [ci skip] --- html/changelogs/AutoChangeLog-pr-9908.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-9908.yml diff --git a/html/changelogs/AutoChangeLog-pr-9908.yml b/html/changelogs/AutoChangeLog-pr-9908.yml new file mode 100644 index 00000000000..f18a7bceab8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9908.yml @@ -0,0 +1,4 @@ +author: "Fox McCloud" +delete-after: True +changes: + - tweak: "Updates the Garbage SS so it's less likely to induce lag"