From dd50f4c459249f10accd7a1ad9fb8d516cbc54c0 Mon Sep 17 00:00:00 2001 From: Ren Erthilo Date: Tue, 24 Apr 2012 21:00:40 +0100 Subject: [PATCH] TG: Headsets are now modular, and come with encryption keys that correspond to secure channels. Currently, encryption keys are based around previous groupings (HoS encrpytion key, Captain encrpytion key). Consideration was made to giving an encrpytion key for each channel (Security encryption key, Command encryption key), and might be switched to that. Turns the binary translator into an encryption key and makes it actually work properly. Revision: r3189 Author: VivianFoxfoot --- code/game/objects/radio/encryptionkey.dm | 194 +++++++++++++---------- code/game/objects/radio/headset.dm | 100 +++++++----- icons/obj/radio.dmi | Bin 4429 -> 7102 bytes 3 files changed, 165 insertions(+), 129 deletions(-) diff --git a/code/game/objects/radio/encryptionkey.dm b/code/game/objects/radio/encryptionkey.dm index 2758ddf9099..b7f6ff62e47 100644 --- a/code/game/objects/radio/encryptionkey.dm +++ b/code/game/objects/radio/encryptionkey.dm @@ -1,21 +1,125 @@ + /obj/item/device/encryptionkey/ name = "Standard Encrpytion Key" desc = "An encyption key for a radio headset. Has no special codes in it. WHY DOES IT EXIST? ASK NANOTRASEN." icon = 'radio.dmi' icon_state = "cypherkey" item_state = "" - var/channels = list() - var/translate_hive = 0 var/translate_binary = 0 + var/translate_hive = 0 + var/list/channels = list() + /obj/item/device/encryptionkey/New() /obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob) /obj/item/device/encryptionkey/traitor + icon_state = "cypherkey" channels = list("Syndicate" = 1) origin_tech = "syndicate=3" +/obj/item/device/encryptionkey/binary + icon_state = "cypherkey" + translate_binary = 1 + origin_tech = "syndicate=3" + +/obj/item/device/encryptionkey/headset_sec + name = "Security Radio Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "sec_cypherkey" + channels = list("Security" = 1) + +/obj/item/device/encryptionkey/headset_eng + name = "Engineering Radio Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "eng_cypherkey" + channels = list("Engineering" = 1) + +/obj/item/device/encryptionkey/headset_rob + name = "Robotics Radio Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "rob_cypherkey" + channels = list("Engineering" = 1, "Science" = 1) + +/obj/item/device/encryptionkey/headset_med + name = "Medical Radio Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "med_cypherkey" + channels = list("Medical" = 1) + +/obj/item/device/encryptionkey/headset_sci + name = "Science Radio Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "sci_cypherkey" + channels = list("Science" = 1) + +/obj/item/device/encryptionkey/headset_medsci + name = "Medical Research Radio Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "medsci_cypherkey" + channels = list("Medical" = 1, "Science" = 1) + +/obj/item/device/encryptionkey/headset_com + name = "Command Radio Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "com_cypherkey" + channels = list("Command" = 1) + +/obj/item/device/encryptionkey/heads/captain + name = "Captain's Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "cap_cypherkey" + channels = list("Command" = 1, "Science" = 0, "Medical" = 0, "Security" = 1, "Engineering" = 0, "Mining" = 0, "Cargo" = 0) + +/obj/item/device/encryptionkey/heads/rd + name = "Research Director's Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "rd_cypherkey" + channels = list("Science" = 1, "Command" = 1) + +/obj/item/device/encryptionkey/heads/hos + name = "Head of Security's Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "hos_cypherkey" + channels = list("Security" = 1, "Command" = 1) + +/obj/item/device/encryptionkey/heads/ce + name = "Chief Engineer's Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "ce_cypherkey" + channels = list("Engineering" = 1, "Command" = 1) + +/obj/item/device/encryptionkey/heads/cmo + name = "Chief Medical Officer's Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "cmo_cypherkey" + channels = list("Medical" = 1, "Command" = 1) + +/obj/item/device/encryptionkey/heads/hop + name = "Head of Personnel's Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "hop_cypherkey" + channels = list("Command" = 1, "Security" = 0, "Cargo" = 1, "Mining" = 0) + +/obj/item/device/encryptionkey/headset_mine + name = "Mining Radio Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "mine_cypherkey" + channels = list("Mining" = 1) + +/obj/item/device/encryptionkey/heads/qm + name = "Quartermaster's Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "qm_cypherkey" + channels = list("Cargo" = 1, "Mining" = 1) + +/obj/item/device/encryptionkey/headset_cargo + name = "Cargo Radio Encryption Key" + desc = "An encyption key for a radio headset. Contains cypherkeys." + icon_state = "cargo_cypherkey" + channels = list("Cargo" = 1) + /obj/item/device/encryptionkey/nuclear channels = list("Nuclear" = 1) origin_tech = "syndicate=3" @@ -23,88 +127,4 @@ /obj/item/device/encryptionkey/ert name = "NanoTrasen ERT Radio Encryption Key" desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Mining" = 1, "Cargo" = 1,) - -/obj/item/device/encryptionkey/binary - translate_binary = 1 - origin_tech = "syndicate=3" - -/obj/item/device/encryptionkey/headset_sec - name = "Security Radio Encryption Key" - - channels = list("Security" = 1) - -/obj/item/device/encryptionkey/headset_eng - name = "Engineering Radio Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Engineering" = 1) - -/obj/item/device/encryptionkey/headset_rob - name = "Robotics Radio Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Engineering" = 1, "Science" = 1) - -/obj/item/device/encryptionkey/headset_med - name = "Medical Radio Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Medical" = 1) - -/obj/item/device/encryptionkey/headset_sci - name = "Science Radio Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Science" = 1) - -/obj/item/device/encryptionkey/headset_medsci - name = "Medical Research Radio Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Medical" = 1, "Science" = 1) - -/obj/item/device/encryptionkey/headset_com - name = "Command Radio Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Command" = 1) - -/obj/item/device/encryptionkey/heads/captain - name = "Captain's Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Command" = 1, "Science" = 0, "Medical" = 0, "Security" = 1, "Engineering" = 0, "Mining" = 0, "Cargo" = 0) - -/obj/item/device/encryptionkey/heads/rd - name = "Research Director's Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Science" = 1, "Command" = 1) - -/obj/item/device/encryptionkey/heads/hos - name = "Head of Security's Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Security" = 1, "Command" = 1) - -/obj/item/device/encryptionkey/heads/ce - name = "Chief Engineer's Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Engineering" = 1, "Command" = 1) - -/obj/item/device/encryptionkey/heads/cmo - name = "Chief Medical Officer's Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Medical" = 1, "Command" = 1) - -/obj/item/device/encryptionkey/heads/hop - name = "Head of Personnel's Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Command" = 1, "Security" = 0, "Cargo" = 1, "Mining" = 0) - -/obj/item/device/encryptionkey/headset_mine - name = "Mining Radio Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Mining" = 1) - -/obj/item/device/encryptionkey/heads/qm - name = "Quartermaster's Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Cargo" = 1, "Mining" = 1) - -/obj/item/device/encryptionkey/headset_cargo - name = "Cargo Radio Encryption Key" - desc = "An encyption key for a radio headset. Contains cypherkeys." - channels = list("Cargo" = 1) \ No newline at end of file + channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Mining" = 1, "Cargo" = 1,) \ No newline at end of file diff --git a/code/game/objects/radio/headset.dm b/code/game/objects/radio/headset.dm index e2aa76282e0..3d21ce3dc57 100644 --- a/code/game/objects/radio/headset.dm +++ b/code/game/objects/radio/headset.dm @@ -1,13 +1,13 @@ /obj/item/device/radio/headset - name = "Radio Headset" - desc = "An intercom that fits over the head." + name = "radio headset" + desc = "An updated, modular intercom that fits over the head. Takes encryption keys" icon_state = "headset" item_state = "headset" g_amt = 0 m_amt = 75 subspace_transmission = 1 protective_temperature = 0 - canhear_range = 1 + canhear_range = 1 // can't hear headsets from very far away var translate_binary = 0 translate_hive = 0 @@ -16,132 +16,139 @@ /obj/item/device/radio/headset/New() ..() - keyslot1 = new /obj/item/device/encryptionkey + keyslot1 = new /obj/item/device/encryptionkey/ recalculateChannels() /obj/item/device/radio/headset/traitor origin_tech = "syndicate=3" canhear_range = 0 - - New() - ..() - del(keyslot1) - keyslot1 = new /obj/item/device/encryptionkey/traitor +/obj/item/device/radio/headset/traitor/New() + ..() + del(keyslot1) + keyslot1 = new /obj/item/device/encryptionkey/traitor + recalculateChannels() /obj/item/device/radio/headset/binary origin_tech = "syndicate=3" canhear_range = 0 - - New() - ..() - del(keyslot1) - keyslot1 = new /obj/item/device/encryptionkey/binary +/obj/item/device/radio/headset/binary/New() + ..() + del(keyslot1) + keyslot1 = new /obj/item/device/encryptionkey/binary + recalculateChannels() /obj/item/device/radio/headset/headset_sec - name = "Security Radio Headset" + name = "security radio headset" desc = "This is used by your elite security force. To access the security channel, use :s." icon_state = "sec_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/headset_sec /obj/item/device/radio/headset/headset_eng - name = "Engineering Radio Headset" + name = "engineering radio headset" desc = "When the engineers wish to chat like girls. To access the engineering channel, use :e. " icon_state = "eng_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/headset_eng /obj/item/device/radio/headset/headset_rob - name = "Robotics Radio Headset" + name = "robotics radio headset" desc = "Made specifically for the roboticists who cannot decide between departments. To access the engineering channel, use :e. For research, use :n." icon_state = "rob_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/headset_rob /obj/item/device/radio/headset/headset_med - name = "Medical Radio Headset" + name = "medical radio headset" desc = "A headset for the trained staff of the medbay. To access the medical channel, use :m." icon_state = "med_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/headset_med /obj/item/device/radio/headset/headset_sci - name = "Science Radio Headset" + name = "science radio headset" desc = "A sciency headset. Like usual. To access the science channel, use :n." icon_state = "com_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/headset_sci /obj/item/device/radio/headset/headset_medsci - name = "Medical Research Radio Headset" + name = "medical research radio headset" desc = "A headset that is a result of the mating between medical and science. To access the medical channel, use :m. For science, use :n." icon_state = "med_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/headset_medsci /obj/item/device/radio/headset/headset_com - name = "Command Radio Headset" + name = "command radio headset" desc = "A headset with a commanding channel. To access the command channel, use :c." icon_state = "com_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/headset_com /obj/item/device/radio/headset/heads/captain - name = "Captain's Headset" + name = "captain's headset" desc = "The headset of the boss. Channels are as follows: :c - command, :s - security, :e - engineering, :d - mining, :q - cargo, :m - medical, :n - science." icon_state = "com_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/heads/captain /obj/item/device/radio/headset/heads/rd - name = "Research Director's Headset" + name = "Research Director's headset" desc = "Headset of the researching God. To access the science channel, use :n. For command, use :c." icon_state = "com_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/heads/rd /obj/item/device/radio/headset/heads/hos - name = "Head of Security's Headset" + name = "head of security's headset" desc = "The headset of the man who protects your worthless lifes. To access the security channel, use :s. For command, use :c." icon_state = "com_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/heads/hos /obj/item/device/radio/headset/heads/ce - name = "Chief Engineer's Headset" + name = "chief engineer's headset" desc = "The headset of the guy who is in charge of morons. To access the engineering channel, use :e. For command, use :c." icon_state = "com_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/heads/ce /obj/item/device/radio/headset/heads/cmo - name = "Chief Medical Officer's Headset" + name = "chief medical officer's headset" desc = "The headset of the highly trained medical chief. To access the medical channel, use :m. For command, use :c." icon_state = "com_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/heads/cmo /obj/item/device/radio/headset/heads/hop - name = "Head of Personnel's Headset" + name = "head of personnel's headset" desc = "The headset of the guy who will one day be captain. Channels are as follows: :c - command, :s - security, :q - cargo, :d - mining." icon_state = "com_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/heads/hop /obj/item/device/radio/headset/headset_mine - name = "Mining Radio Headset" + name = "mining radio headset" desc = "Headset used by miners. How useless. To access the mining channel, use :d." icon_state = "mine_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/headset_mine /obj/item/device/radio/headset/heads/qm - name = "Quartermaster's Headset" + name = "quartermaster's headset" desc = "The headset of the man who control your toiletpaper supply. To access the cargo channel, use :q. For mining, use :d." icon_state = "cargo_headset" item_state = "headset" keyslot2 = new /obj/item/device/encryptionkey/heads/qm +/obj/item/device/radio/headset/headset_cargo + name = "cargo radio headset" + desc = "Headset used by the QM's slaves. To access the cargo channel, use :q." + icon_state = "cargo_headset" + item_state = "headset" + keyslot2 = new /obj/item/device/encryptionkey/headset_cargo + /obj/item/device/radio/headset/nuclear freerange = 1 listening = 0 @@ -155,22 +162,21 @@ freerange = 1 keyslot2 = new /obj/item/device/encryptionkey/ert -/obj/item/device/radio/headset/headset_cargo - name = "Cargo Radio Headset" - desc = "Headset used by the QM's slaves. To access the cargo channel, use :q." - icon_state = "cargo_headset" - item_state = "headset" - keyslot2 = new /obj/item/device/encryptionkey/headset_cargo - /obj/item/device/radio/headset/attackby(obj/item/weapon/W as obj, mob/user as mob) // ..() user.machine = src - if (!istype(W, /obj/item/weapon/screwdriver) && !istype(W, /obj/item/device/encryptionkey/)) + if (!( istype(W, /obj/item/weapon/screwdriver) || (istype(W, /obj/item/device/encryptionkey/ )))) return if(istype(W, /obj/item/weapon/screwdriver)) if(keyslot1 || keyslot2) + + for(var/ch_name in channels) + radio_controller.remove_object(src, radiochannels[ch_name]) + secure_radio_connections[ch_name] = null + + if(keyslot1) user.put_in_hands(keyslot1) keyslot1 = null @@ -200,7 +206,9 @@ W.loc = src keyslot2 = W + recalculateChannels() + return @@ -208,10 +216,13 @@ src.channels = list() src.translate_binary = 0 src.translate_hive = 0 - var/temp_channels = list() if(keyslot1) - temp_channels += keyslot1.channels + for(var/ch_name in keyslot1.channels) + if(ch_name in src.channels) + continue + src.channels += ch_name + src.channels[ch_name] = keyslot1.channels[ch_name] if(keyslot1.translate_binary) src.translate_binary = 1 @@ -220,7 +231,11 @@ src.translate_hive = 1 if(keyslot2) - temp_channels += keyslot2.channels + for(var/ch_name in keyslot2.channels) + if(ch_name in src.channels) + continue + src.channels += ch_name + src.channels[ch_name] = keyslot2.channels[ch_name] if(keyslot2.translate_binary) src.translate_binary = 1 @@ -228,13 +243,14 @@ if(keyslot2.translate_hive) src.translate_hive = 1 - config(temp_channels) for (var/ch_name in channels) if(!radio_controller) sleep(30) // Waiting for the radio_controller to be created. if(!radio_controller) - src.name = "Broken Radio Headset" + src.name = "broken radio headset" return + secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT) + return \ No newline at end of file diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi index 69180436a7c4ea7e1b0476a0ed07aa7b623d80ff..e2d376d604c013cbf6c7dfba65181dcb0ee5dbb2 100644 GIT binary patch literal 7102 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