From d2f63580ff101ac89b2af8b29df7cfba84b9ab7d Mon Sep 17 00:00:00 2001 From: Geeves Date: Wed, 22 Apr 2020 00:04:11 +0200 Subject: [PATCH] Wristbound Computer Introduction (#8648) --- aurorastation.dme | 1 + code/game/jobs/access.dm | 8 +- code/game/jobs/job/civilian.dm | 3 +- .../loadout/loadout_computer.dm | 74 ++++++++++++++++++ .../loadout/loadout_utility.dm | 5 -- .../computers/modular_computer/interaction.dm | 4 + .../computers/subtypes/dev_tablet.dm | 1 + .../computers/subtypes/dev_wristbound.dm | 8 +- .../computers/subtypes/preset_wristbound.dm | 61 +++++++++++++-- .../file_system/programs/app_presets.dm | 2 +- .../geeves-wristbound_computers.yml | 12 +++ icons/obj/modular_wristbound.dmi | Bin 3089 -> 3060 bytes 12 files changed, 164 insertions(+), 15 deletions(-) create mode 100644 code/modules/client/preference_setup/loadout/loadout_computer.dm create mode 100644 html/changelogs/geeves-wristbound_computers.yml diff --git a/aurorastation.dme b/aurorastation.dme index 69e98f68a37..e264c1c9b45 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -1336,6 +1336,7 @@ #include "code\modules\client\preference_setup\loadout\gear_tweaks.dm" #include "code\modules\client\preference_setup\loadout\loadout.dm" #include "code\modules\client\preference_setup\loadout\loadout_accessories.dm" +#include "code\modules\client\preference_setup\loadout\loadout_computer.dm" #include "code\modules\client\preference_setup\loadout\loadout_cosmetics.dm" #include "code\modules\client\preference_setup\loadout\loadout_ears.dm" #include "code\modules\client\preference_setup\loadout\loadout_eyes.dm" diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index e7624fd5c84..ebb293c8a53 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -243,7 +243,13 @@ var/obj/item/card/id/all_access/ghost_all_access if(id) return id if(wear_id) - return wear_id.GetID() + var/id = wear_id.GetID() + if(id) + return id + if(gloves) + var/id = gloves.GetID() + if(id) + return id /mob/living/silicon/GetIdCard() return id_card diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 68bf0a71535..bedc021e0b9 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -324,4 +324,5 @@ uniform = /obj/item/clothing/under/suit_jacket/charcoal l_pocket = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced r_pocket = /obj/item/card/tech_support - l_hand = /obj/item/modular_computer/laptop/preset \ No newline at end of file + l_hand = /obj/item/modular_computer/laptop/preset + gloves = /obj/item/modular_computer/wristbound/preset/advanced/generic \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_computer.dm b/code/modules/client/preference_setup/loadout/loadout_computer.dm new file mode 100644 index 00000000000..2de5081a815 --- /dev/null +++ b/code/modules/client/preference_setup/loadout/loadout_computer.dm @@ -0,0 +1,74 @@ +/datum/gear/computer + display_name = "tablet" + path = /obj/item/modular_computer/tablet/preset/custom_loadout/advanced // for card slots + sort_category = "Modular Computers" + cost = 2 + +/datum/gear/computer/laptop + display_name = "laptop computer" + path = /obj/item/modular_computer/laptop/preset + cost = 3 + +/datum/gear/computer/wristbound + display_name = "wristbound computer" + path = /obj/item/modular_computer/wristbound/preset/advanced/generic + +/datum/gear/computer/wristbound/cargo + display_name = "wristbound computer (Cargo)" + path = /obj/item/modular_computer/wristbound/preset/advanced/cargo + allowed_roles = list("Cargo Technician", "Shaft Miner", "Quartermaster") + +/datum/gear/computer/wristbound/engineering + display_name = "wristbound computer (Engineering)" + path = /obj/item/modular_computer/wristbound/preset/advanced/engineering + allowed_roles = list("Station Engineer", "Engineering Apprentince", "Atmospheric Technician", "Engineering Apprentice") + +/datum/gear/computer/wristbound/medical + display_name = "wristbound computer (Medical)" + path = /obj/item/modular_computer/wristbound/preset/advanced/medical + allowed_roles = list("Physician", "Surgeon", "Medical Resident", "Pharmacist", "Psychiatrist", "Paramedic") + +/datum/gear/computer/wristbound/security + display_name = "wristbound computer (Security)" + path = /obj/item/modular_computer/wristbound/preset/advanced/security + allowed_roles = list("Security Officer", "Warden", "Security Cadet") + +/datum/gear/computer/wristbound/security/investigations + display_name = "wristbound computer (Security Investigations)" + path = /obj/item/modular_computer/wristbound/preset/advanced/security/investigations + allowed_roles = list("Detective", "Forensic Technician") + +/datum/gear/computer/wristbound/security/research + display_name = "wristbound computer (Research)" + path = /obj/item/modular_computer/wristbound/preset/advanced/research + allowed_roles = list("Scientist", "Lab Assistant", "Roboticist", "Xenobiologist") + +/datum/gear/computer/wristbound/ce + display_name = "wristbound computer (Chief Engineer)" + path = /obj/item/modular_computer/wristbound/preset/advanced/command/ce + allowed_roles = list("Chief Engineer") + +/datum/gear/computer/wristbound/rd + display_name = "wristbound computer (Research Director)" + path = /obj/item/modular_computer/wristbound/preset/advanced/command/rd + allowed_roles = list("Research Director") + +/datum/gear/computer/wristbound/cmo + display_name = "wristbound computer (Chief Medical Officer)" + path = /obj/item/modular_computer/wristbound/preset/advanced/command/cmo + allowed_roles = list("Chief Medical Officer") + +/datum/gear/computer/wristbound/hop + display_name = "wristbound computer (Head of Personnel)" + path = /obj/item/modular_computer/wristbound/preset/advanced/command/hop + allowed_roles = list("Head of Personnel") + +/datum/gear/computer/wristbound/hos + display_name = "wristbound computer (Head of Security)" + path = /obj/item/modular_computer/wristbound/preset/advanced/command/hos + allowed_roles = list("Head of Security") + +/datum/gear/computer/wristbound/captain + display_name = "wristbound computer (Captain)" + path = /obj/item/modular_computer/wristbound/preset/advanced/command/captain + allowed_roles = list("Captain") \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index a712f0a5db0..ea1d212757e 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -67,11 +67,6 @@ display_name = "personal AI device" path = /obj/item/device/paicard -/datum/gear/utility/laptop - display_name = "laptop" - path = /obj/item/modular_computer/laptop/preset - cost = 3 - /datum/gear/utility/wallet display_name = "wallet, orange" path = /obj/item/storage/wallet diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index 8e190a8cb25..0e867bc7926 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -224,3 +224,7 @@ return ..() + +/obj/item/modular_computer/GetID() + if(card_slot.stored_card) + return card_slot.stored_card \ No newline at end of file diff --git a/code/modules/modular_computers/computers/subtypes/dev_tablet.dm b/code/modules/modular_computers/computers/subtypes/dev_tablet.dm index 3b40f66186d..6fba20a85a8 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_tablet.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_tablet.dm @@ -5,6 +5,7 @@ icon_state = "tablet" icon_state_unpowered = "tablet" icon_state_menu = "menu" + slot_flags = SLOT_ID can_reset = TRUE hardware_flag = PROGRAM_TABLET max_hardware_size = 1 diff --git a/code/modules/modular_computers/computers/subtypes/dev_wristbound.dm b/code/modules/modular_computers/computers/subtypes/dev_wristbound.dm index beb26ab4be2..e9c192ddcd2 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_wristbound.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_wristbound.dm @@ -4,16 +4,20 @@ description_info = "A NanoTrasen design, this wristbound computer allows the user to quickly and safely access critical info, without taking their hands out of the equation." icon = 'icons/obj/modular_wristbound.dmi' icon_state = "wristbound" - icon_state_unpowered = "wristbound_unpowered" icon_state_menu = "menu" icon_state_screensaver = "standby" hardware_flag = PROGRAM_WRISTBOUND - slot_flags = SLOT_GLOVES + slot_flags = SLOT_GLOVES|SLOT_ID max_hardware_size = 1 w_class = ITEMSIZE_NORMAL light_strength = 1 menu_light_color = COLOR_GREEN +/obj/item/modular_computer/wristbound/Initialize() + icon_state_unpowered = icon_state + icon_state_broken = icon_state + . = ..() + /obj/item/modular_computer/wristbound/attack_hand(mob/user) if(ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/modules/modular_computers/computers/subtypes/preset_wristbound.dm b/code/modules/modular_computers/computers/subtypes/preset_wristbound.dm index 24b2ea40111..db8dc68a9f8 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_wristbound.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_wristbound.dm @@ -1,4 +1,4 @@ -/obj/item/modular_computer/wristbound/preset/custom_loadout/cheap/install_default_hardware() +/obj/item/modular_computer/wristbound/preset/cheap/install_default_hardware() ..() processor_unit = new /obj/item/computer_hardware/processor_unit/small(src) hard_drive = new /obj/item/computer_hardware/hard_drive/micro(src) @@ -6,7 +6,7 @@ battery_module = new /obj/item/computer_hardware/battery_module/nano(src) battery_module.charge_to_full() -/obj/item/modular_computer/wristbound/preset/custom_loadout/advanced/install_default_hardware() +/obj/item/modular_computer/wristbound/preset/advanced/install_default_hardware() ..() processor_unit = new /obj/item/computer_hardware/processor_unit/small(src) hard_drive = new /obj/item/computer_hardware/hard_drive/small(src) @@ -16,9 +16,60 @@ battery_module = new /obj/item/computer_hardware/battery_module(src) battery_module.charge_to_full() - -// Cargo Delivery -/obj/item/modular_computer/wristbound/preset/custom_loadout/advanced/cargo_delivery +/obj/item/modular_computer/wristbound/preset/advanced/cargo icon_state = "wristbound_supply" _app_preset_type = /datum/modular_computer_app_presets/cargo_delivery + enrolled = TRUE + +/obj/item/modular_computer/wristbound/preset/advanced/engineering + icon_state = "wristbound_engineering" + _app_preset_type = /datum/modular_computer_app_presets/engineering + enrolled = TRUE + +/obj/item/modular_computer/wristbound/preset/advanced/medical + icon_state = "wristbound_medical" + _app_preset_type = /datum/modular_computer_app_presets/medical + enrolled = TRUE + +/obj/item/modular_computer/wristbound/preset/advanced/security + icon_state = "wristbound_security" + _app_preset_type = /datum/modular_computer_app_presets/security + enrolled = TRUE + +/obj/item/modular_computer/wristbound/preset/advanced/security/investigations + _app_preset_type = /datum/modular_computer_app_presets/security/investigations + +/obj/item/modular_computer/wristbound/preset/advanced/research + icon_state = "wristbound_science" + _app_preset_type = /datum/modular_computer_app_presets/research + enrolled = TRUE + +/obj/item/modular_computer/wristbound/preset/advanced/command + icon_state = "wristbound_command" + _app_preset_type = /datum/modular_computer_app_presets/command + enrolled = TRUE + +/obj/item/modular_computer/wristbound/preset/advanced/command/ce + _app_preset_type = /datum/modular_computer_app_presets/engineering/ce + +/obj/item/modular_computer/wristbound/preset/advanced/command/rd + _app_preset_type = /datum/modular_computer_app_presets/research/rd + +/obj/item/modular_computer/wristbound/preset/advanced/command/cmo + _app_preset_type = /datum/modular_computer_app_presets/medical/cmo + +/obj/item/modular_computer/wristbound/preset/advanced/command/hop + _app_preset_type = /datum/modular_computer_app_presets/command/hop + +/obj/item/modular_computer/wristbound/preset/advanced/command/hos + _app_preset_type = /datum/modular_computer_app_presets/security/hos + +/obj/item/modular_computer/wristbound/preset/advanced/command/captain + _app_preset_type = /datum/modular_computer_app_presets/captain + +/obj/item/modular_computer/wristbound/preset/advanced/generic + _app_preset_type = /datum/modular_computer_app_presets/civilian + +/obj/item/modular_computer/wristbound/preset/advanced/representative + _app_preset_type = /datum/modular_computer_app_presets/representative enrolled = TRUE \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/app_presets.dm b/code/modules/modular_computers/file_system/programs/app_presets.dm index eaf63f8e939..74b7986f98f 100644 --- a/code/modules/modular_computers/file_system/programs/app_presets.dm +++ b/code/modules/modular_computers/file_system/programs/app_presets.dm @@ -216,7 +216,7 @@ description = "Contains the most common security and forensics programs." available = FALSE -/datum/modular_computer_app_presets/security/return_install_programs() +/datum/modular_computer_app_presets/security/investigations/return_install_programs() var/list/_prg_list = list( new /datum/computer_file/program/filemanager(), new /datum/computer_file/program/chatclient(), diff --git a/html/changelogs/geeves-wristbound_computers.yml b/html/changelogs/geeves-wristbound_computers.yml new file mode 100644 index 00000000000..a914a65a815 --- /dev/null +++ b/html/changelogs/geeves-wristbound_computers.yml @@ -0,0 +1,12 @@ +author: Code by Geeves, Sprites by Aticius & Europa Devs + +delete-after: True + +changes: + - tweak: "Tweaked access checking to check for IDs within your gloves slot." + - rscadd: "Tech Support now spawns with a wristbound computer." + - rscadd: "Created a new loadout section just for modular computers." + - rscadd: "If you have your modular computer, be it a laptop, tablet, or wristbound, in your active hand, ID, or glove slot, it will now allow you use it to access things like airlocks and computer programs." + - tweak: "Modular tablets now fit in the ID slot." + - tweak: "Wristbound computers fit in the ID and Gloves slot." + - bugfix: "Fixed security having access to the investigation department's programs." diff --git a/icons/obj/modular_wristbound.dmi b/icons/obj/modular_wristbound.dmi index 7dc9c181785effbe7a864aed430896bb00975af9..e92d46e25ca8f38ea383077c54acdebf4a9fe18b 100644 GIT binary patch literal 3060 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 literal 3089 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