From 02744c59a590af1e9e68e6bfe1d8d5c4b025e8da Mon Sep 17 00:00:00 2001 From: JStheguy Date: Tue, 19 Jun 2018 09:22:59 -0500 Subject: [PATCH] [READY] Helps data disks stop being unemployed (#38319) * data cards actually have a function now * Adds data cards to the IC printer for real rea * more cards, less shitty code * how the fuck did I miss that adds a missing ..() * wait wrong use of ..() fuck --- .../subsystem/processing/circuit.dm | 5 +- code/game/objects/items/cards_ids.dm | 49 ++++++++++++------ .../integrated_electronics/subtypes/access.dm | 6 ++- .../integrated_electronics/subtypes/input.dm | 40 ++++++++++++++ icons/obj/card.dmi | Bin 4301 -> 5371 bytes 5 files changed, 83 insertions(+), 17 deletions(-) diff --git a/code/controllers/subsystem/processing/circuit.dm b/code/controllers/subsystem/processing/circuit.dm index db1bf1ff5f..dad71a005a 100644 --- a/code/controllers/subsystem/processing/circuit.dm +++ b/code/controllers/subsystem/processing/circuit.dm @@ -78,5 +78,8 @@ PROCESSING_SUBSYSTEM_DEF(circuit) /obj/item/integrated_electronics/wirer, /obj/item/integrated_electronics/debugger, /obj/item/integrated_electronics/analyzer, - /obj/item/integrated_electronics/detailer + /obj/item/integrated_electronics/detailer, + /obj/item/card/data, + /obj/item/card/data/full_color, + /obj/item/card/data/disk ) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 4c96bf3b84..2d30a015e2 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -9,7 +9,7 @@ /* - * DATA CARDS - Used for the teleporter + * DATA CARDS - Used for the IC data card reader */ /obj/item/card name = "card" @@ -24,30 +24,49 @@ return BRUTELOSS /obj/item/card/data - name = "data disk" - desc = "A disk of data." - icon_state = "data" + name = "data card" + desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one has a stripe running down the middle." + icon_state = "data_1" + obj_flags = UNIQUE_RENAME var/function = "storage" var/data = "null" var/special = null item_state = "card-id" lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' + var/detail_color = COLOR_ASSEMBLY_ORANGE -/obj/item/card/data/verb/label(t as text) - set name = "Label Disk" - set category = "Object" - set src in usr +/obj/item/card/data/Initialize() + .=..() + update_icon() - if(usr.stat || !usr.canmove || usr.restrained()) +/obj/item/card/data/update_icon() + cut_overlays() + if(detail_color == COLOR_FLOORTILE_GRAY) return + var/mutable_appearance/detail_overlay = mutable_appearance('icons/obj/card.dmi', "[icon_state]-color") + detail_overlay.color = detail_color + add_overlay(detail_overlay) - if (t) - src.name = "data disk- '[t]'" - else - src.name = "data disk" - src.add_fingerprint(usr) - return +/obj/item/card/data/attackby(obj/item/I, mob/living/user) + if(istype(I, /obj/item/integrated_electronics/detailer)) + var/obj/item/integrated_electronics/detailer/D = I + detail_color = D.detail_color + update_icon() + return ..() + +/obj/item/proc/GetCard() + +/obj/item/card/data/GetCard() + return src + +/obj/item/card/data/full_color + desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one has the entire card colored." + icon_state = "data_2" + +/obj/item/card/data/disk + desc = "A plastic magstripe card for simple and speedy data storage and transfer. This one inexplicibly looks like a floppy disk." + icon_state = "data_3" /* * ID CARDS diff --git a/code/modules/integrated_electronics/subtypes/access.dm b/code/modules/integrated_electronics/subtypes/access.dm index bf710be0e2..9012cd1089 100644 --- a/code/modules/integrated_electronics/subtypes/access.dm +++ b/code/modules/integrated_electronics/subtypes/access.dm @@ -1,5 +1,5 @@ /obj/item/integrated_circuit/input/card_reader - name = "card reader" + name = "ID card reader" //To differentiate it from the data card reader desc = "A circuit that can read the registred name, assignment, and PassKey string from an ID card." icon_state = "card_reader" @@ -14,6 +14,10 @@ "on read" = IC_PINTYPE_PULSE_OUT ) +/obj/item/integrated_circuit/input/card_reader/old + name = "card reader" + spawn_flags = 0 + /obj/item/integrated_circuit/input/card_reader/attackby_react(obj/item/I, mob/living/user, intent) var/obj/item/card/id/card = I.GetID() var/list/access = I.GetAccess() diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index b780762cd4..02500e5ed6 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -1104,3 +1104,43 @@ else activate_pin(3) +/obj/item/integrated_circuit/input/data_card_reader + name = "data card reader" + desc = "A circuit that can read from and write to data cards." + extended_desc = "Setting the \"write mode\" boolean to true will cause any data cards that are used on the assembly to replace\ + their existing function and data strings with the given strings, if it is set to false then using a data card on the assembly will cause\ + the function and data strings stored on the card to be written to the output pins." + icon_state = "card_reader" + complexity = 4 + spawn_flags = IC_SPAWN_DEFAULT|IC_SPAWN_RESEARCH + inputs = list( + "function" = IC_PINTYPE_STRING, + "data to store" = IC_PINTYPE_STRING, + "write mode" = IC_PINTYPE_BOOLEAN + ) + outputs = list( + "function" = IC_PINTYPE_STRING, + "stored data" = IC_PINTYPE_STRING + ) + activators = list( + "on write" = IC_PINTYPE_PULSE_OUT, + "on read" = IC_PINTYPE_PULSE_OUT + ) + +/obj/item/integrated_circuit/input/data_card_reader/attackby_react(obj/item/I, mob/living/user, intent) + var/obj/item/card/data/card = I.GetCard() + var/write_mode = get_pin_data(IC_INPUT, 3) + if(card) + if(write_mode == TRUE) + card.function = get_pin_data(IC_INPUT, 1) + card.data = get_pin_data(IC_INPUT, 2) + push_data() + activate_pin(1) + else + set_pin_data(IC_OUTPUT, 1, card.function) + set_pin_data(IC_OUTPUT, 2, card.data) + push_data() + activate_pin(2) + else + return FALSE + return TRUE diff --git a/icons/obj/card.dmi b/icons/obj/card.dmi index e6778c51af5ee819852370af8d27098c02862a26..507801844cc5e861e73e4a44a8eed74cae88c019 100644 GIT binary patch literal 5371 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 kb(!+J|Gl>8IAS|JY5rh*tN;K2 literal 4301 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