diff --git a/code/__DEFINES/language.dm b/code/__DEFINES/language.dm index c475a430829..8abd951e0f0 100644 --- a/code/__DEFINES/language.dm +++ b/code/__DEFINES/language.dm @@ -21,3 +21,4 @@ #define LANGUAGE_SOFTWARE "software" #define LANGUAGE_STONER "stoner" #define LANGUAGE_VOICECHANGE "voicechange" +#define LANGUAGE_RADIOKEY "radiokey" diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index 9c4581fdba8..418a64f2a01 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -14,18 +14,27 @@ SUBSYSTEM_DEF(research) var/datum/design/error_design/error_design //ERROR LOGGING - var/list/invalid_design_ids = list() //associative id = number of times - var/list/invalid_node_ids = list() //associative id = number of times - var/list/invalid_node_boost = list() //associative id = error message + ///associative id = number of times + var/list/invalid_design_ids = list() + ///associative id = number of times + var/list/invalid_node_ids = list() + ///associative id = error message + var/list/invalid_node_boost = list() var/list/obj/machinery/rnd/server/servers = list() - var/list/techweb_nodes_starting = list() //associative id = TRUE - var/list/techweb_categories = list() //category name = list(node.id = TRUE) - var/list/techweb_boost_items = list() //associative double-layer path = list(id = list(point_type = point_discount)) - var/list/techweb_nodes_hidden = list() //Node ids that should be hidden by default. - var/list/techweb_nodes_experimental = list() //Node ids that are exclusive to the BEPIS. - var/list/techweb_point_items = list( //path = list(point type = value) + ///associative id = TRUE + var/list/techweb_nodes_starting = list() + ///category name = list(node.id = TRUE) + var/list/techweb_categories = list() + ///associative double-layer path = list(id = list(point_type = point_discount)) + var/list/techweb_boost_items = list() + ///Node ids that should be hidden by default. + var/list/techweb_nodes_hidden = list() + ///Node ids that are exclusive to the BEPIS. + var/list/techweb_nodes_experimental = list() + ///path = list(point type = value) + var/list/techweb_point_items = list( /obj/item/assembly/signaler/anomaly = list(TECHWEB_POINT_TYPE_GENERIC = 10000) ) var/list/errored_datums = list() diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index ff8a4f954a7..7797a451d91 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -4,14 +4,19 @@ icon = 'icons/obj/radio.dmi' icon_state = "cypherkey" w_class = WEIGHT_CLASS_TINY + /// Can this radio key access the binary radio channel? var/translate_binary = FALSE + /// Decrypts Syndicate radio transmissions. var/syndie = FALSE + /// If true, the radio can say/hear on the special CentCom channel. var/independent = FALSE + /// What channels does this encryption key grant to the parent headset. var/list/channels = list() + var/datum/language/translated_language /obj/item/encryptionkey/Initialize(mapload) . = ..() - if(!channels.len && !translate_binary) + if(!channels.len && !translate_binary && !translated_language) desc += " Has no special codes in it. You should probably tell a coder!" /obj/item/encryptionkey/examine(mob/user) @@ -30,12 +35,13 @@ name = "syndicate encryption key" icon_state = "syn_cypherkey" channels = list(RADIO_CHANNEL_SYNDICATE = 1) - syndie = TRUE//Signifies that it de-crypts Syndicate transmissions + syndie = TRUE /obj/item/encryptionkey/binary name = "binary translator key" icon_state = "bin_cypherkey" translate_binary = TRUE + translated_language = /datum/language/machine /obj/item/encryptionkey/headset_sec name = "security radio encryption key" @@ -143,3 +149,33 @@ /obj/item/encryptionkey/secbot channels = list(RADIO_CHANNEL_AI_PRIVATE = 1, RADIO_CHANNEL_SECURITY = 1) + +/obj/item/encryptionkey/moth + name = "\improper Moffic translation key" + desc = "An encryption key that automatically encodes moffic heard through the radio into common. The signal's a little fuzzy." + icon_state = "translation_cypherkey" + translated_language = /datum/language/moffic + +/obj/item/encryptionkey/tiziran + name = "\improper Tiziran translation key" + desc = "An encryption key that automatically encodes draconic heard through the radio into common. The signal's not quite to scale." + icon_state = "translation_cypherkey" + translated_language = /datum/language/draconic + +/obj/item/encryptionkey/plasmaman + name = "\improper Calcic translation key" + desc = "An encryption key that automatically encodes calcic heard through the radio into common. The signal lacks a bit of teeth." + icon_state = "translation_cypherkey" + translated_language = /datum/language/calcic + +/obj/item/encryptionkey/ethereal + name = "\improper Ethereal translation key" + desc = "An encryption key that automatically encodes ethereal heard through the radio into common. The signal's overpowering." + icon_state = "translation_cypherkey" + translated_language = /datum/language/voltaic + +/obj/item/encryptionkey/felinid + name = "\improper Felinid translation key" + desc = "An encryption key that automatically encodes nekomimetic heard through the radio into common. The signal's rather scratchy." + icon_state = "translation_cypherkey" + translated_language = /datum/language/nekomimetic diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 270aeccfed0..f5344b1670a 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -63,6 +63,8 @@ GLOBAL_LIST_INIT(channel_tokens, list( set_listening(TRUE) recalculateChannels() possibly_deactivate_in_loc() + RegisterSignal(src, COMSIG_ITEM_EQUIPPED, .proc/learn_language) + RegisterSignal(src, COMSIG_ITEM_POST_UNEQUIP, .proc/unlearn_language) /obj/item/radio/headset/proc/possibly_deactivate_in_loc() if(ismob(loc)) @@ -88,6 +90,34 @@ GLOBAL_LIST_INIT(channel_tokens, list( return attack_self(headset_user) return ..() +/obj/item/radio/headset/proc/learn_language() + SIGNAL_HANDLER + if(!istype(loc, /mob/living/carbon)) + return + var/list/language_list = list() + if(keyslot?.translated_language) + language_list += keyslot.translated_language + if(keyslot2?.translated_language) + language_list += keyslot2.translated_language + + var/mob/living/carbon/person = loc + for(var/language in language_list) + person.grant_language(language, understood = TRUE, spoken = FALSE, source = LANGUAGE_RADIOKEY) + +/obj/item/radio/headset/proc/unlearn_language() + SIGNAL_HANDLER + if(!istype(loc, /mob/living/carbon)) + return + var/list/language_list = list() + if(keyslot?.translated_language) + language_list += keyslot.translated_language + if(keyslot2?.translated_language) + language_list += keyslot2.translated_language + + var/mob/living/carbon/person = loc + for(var/language in language_list) + person.remove_language(language, understood = TRUE, spoken = FALSE, source = LANGUAGE_RADIOKEY) + /obj/item/radio/headset/syndicate //disguised to look like a normal headset for stealth ops /obj/item/radio/headset/syndicate/alt //undisguised bowman with flash protection diff --git a/code/modules/cargo/department_order.dm b/code/modules/cargo/department_order.dm index 3c9755c82ab..e3b5fca804f 100644 --- a/code/modules/cargo/department_order.dm +++ b/code/modules/cargo/department_order.dm @@ -70,7 +70,7 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( ) supply_data += list(target_group) //skip packs we should not show, even if we should show the group - if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.special && !pack.special_enabled) || pack.DropPodOnly || pack.goody) + if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.special && !pack.special_enabled) || pack.drop_pod_only || pack.goody) continue //finally the pack data itself target_group["packs"] += list(list( @@ -119,7 +119,7 @@ GLOBAL_LIST_INIT(department_order_cooldowns, list( if(!pack) say("Something went wrong!") CRASH("requested supply pack id \"[id]\" not found!") - if(pack.hidden || pack.DropPodOnly || pack.special) + if(pack.hidden || pack.drop_pod_only || pack.special) return var/name = "*None Provided*" var/rank = "*None Provided*" diff --git a/code/modules/cargo/goodies.dm b/code/modules/cargo/goodies.dm index c7404a154e0..07b08461f18 100644 --- a/code/modules/cargo/goodies.dm +++ b/code/modules/cargo/goodies.dm @@ -169,6 +169,48 @@ cost = PAYCHECK_CREW * 2 contains = list(/obj/item/food/ready_donk) +/datum/supply_pack/goody/pill_mutadone + name = "Emergency Mutadone Pill" + desc = "A single pill for curing genetic defects. Useful for when you can't procure one from medbay." + cost = PAYCHECK_CREW * 2.5 + contains = list(/obj/item/reagent_containers/pill/mutadone) + +/datum/supply_pack/goody/rapid_lighting_device + name = "Rapid Lighting Device (RLD)" + desc = "A device used to rapidly provide lighting sources to an area. Reload with iron, plasteel, glass or compressed matter cartridges." + cost = PAYCHECK_CREW * 10 + contains = list(/obj/item/construction/rld) + +/datum/supply_pack/goody/moth_encryption_key + name = "Moffic radio encryption key" + desc = "A hi-tech radio encryption key that allows the wearer to understand moffic when the radio is worn." + cost = PAYCHECK_CREW * 12 + contains = list(/obj/item/encryptionkey/moth) + +/datum/supply_pack/goody/lizard_encryption_key + name = "Draconic radio encryption key" + desc = "A hi-tech radio encryption key that allows the wearer to understand draconic when the radio is worn." + cost = PAYCHECK_CREW * 12 + contains = list(/obj/item/encryptionkey/tiziran) + +/datum/supply_pack/goody/plasmaman_encryption_key + name = "Calcic radio encryption key" + desc = "A hi-tech radio encryption key that allows the wearer to understand calcic when the radio is worn." + cost = PAYCHECK_CREW * 12 + contains = list(/obj/item/encryptionkey/plasmaman) + +/datum/supply_pack/goody/ethereal_encryption_key + name = "Voltaic radio encryption key" + desc = "A hi-tech radio encryption key that allows the wearer to understand voltaic when the radio is worn." + cost = PAYCHECK_CREW * 12 + contains = list(/obj/item/encryptionkey/ethereal) + +/datum/supply_pack/goody/felinid_encryption_key + name = "Felinid radio encryption key" + desc = "A hi-tech radio encryption key that allows the wearer to understand nekomimetic when the radio is worn." + cost = PAYCHECK_CREW * 12 + contains = list(/obj/item/encryptionkey/felinid) + /datum/supply_pack/goody/fishing_toolbox name = "Fishing toolbox" desc = "Complete toolbox set for your fishing adventure. Advanced hooks and lines sold separetely." diff --git a/code/modules/cargo/orderconsole.dm b/code/modules/cargo/orderconsole.dm index ff1167642a6..a83f927fce2 100644 --- a/code/modules/cargo/orderconsole.dm +++ b/code/modules/cargo/orderconsole.dm @@ -150,7 +150,7 @@ "name" = P.group, "packs" = list() ) - if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly) + if((P.hidden && !(obj_flags & EMAGGED)) || (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.drop_pod_only) continue data["supplies"][P.group]["packs"] += list(list( "name" = P.name, @@ -210,7 +210,7 @@ var/datum/supply_pack/pack = SSshuttle.supply_packs[id] if(!istype(pack)) CRASH("Unknown supply pack id given by order console ui. ID: [params["id"]]") - if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.DropPodOnly || (pack.special && !pack.special_enabled)) + if((pack.hidden && !(obj_flags & EMAGGED)) || (pack.contraband && !contraband) || pack.drop_pod_only || (pack.special && !pack.special_enabled)) return var/name = "*None Provided*" diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index c9b98eab64d..fabdc01ca14 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1,25 +1,44 @@ /datum/supply_pack + /// The name of the supply pack, as listed on th cargo purchasing UI. var/name = "Crate" + /// The group that the supply pack is sorted into within the cargo purchasing UI. var/group = "" + /// Is this cargo supply pack visible to the cargo purchasing UI. var/hidden = FALSE + /// Is this supply pack purchasable outside of the standard purchasing band? Contraband is available by multitooling the cargo purchasing board. var/contraband = FALSE /// Cost of the crate. DO NOT GO ANY LOWER THAN X1.4 the "CARGO_CRATE_VALUE" value if using regular crates, or infinite profit will be possible! var/cost = CARGO_CRATE_VALUE * 1.4 + /// What access is required to open the crate when spawned? var/access = FALSE + /// Who can view this supply_pack and with what access. var/access_view = FALSE + /// If someone with any of the following accesses in a list can open this cargo pack crate. var/access_any = FALSE + /// A list of items that are spawned in the crate of the supply pack. var/list/contains = null + /// What is the name of the crate that is spawned with the crate's contents?? var/crate_name = "crate" + /// When spawning a gas canistor, what kind of gas type are we spawning? var/id - var/desc = ""//no desc by default + /// The description shown on the cargo purchasing UI. No desc by default. + var/desc = "" + /// What typepath of crate do you spawn? var/crate_type = /obj/structure/closet/crate - var/dangerous = FALSE // Should we message admins? - var/special = FALSE //Event/Station Goals/Admin enabled packs + /// Should we message admins? + var/dangerous = FALSE + /// Event/Station Goals/Admin enabled packs + var/special = FALSE + /// When a cargo pack can be unlocked by special events (as seen in special), this toggles if it's been enabled in the round yet (For example, after the station alert, we can now enable buying the station goal pack). var/special_enabled = FALSE - var/DropPodOnly = FALSE //only usable by the Bluespace Drop Pod via the express cargo console - var/special_pod //If this pack comes shipped in a specific pod when launched from the express console + /// Only usable by the Bluespace Drop Pod via the express cargo console + var/drop_pod_only = FALSE + /// If this pack comes shipped in a specific pod when launched from the express console + var/special_pod + /// Was this spawned through an admin proc? var/admin_spawned = FALSE - var/goody = FALSE //Goodies can only be purchased by private accounts and can have coupons apply to them. They also come in a lockbox instead of a full crate, so the 700 min doesn't apply + /// Goodies can only be purchased by private accounts and can have coupons apply to them. They also come in a lockbox instead of a full crate, so the 700 min doesn't apply + var/goody = FALSE /datum/supply_pack/New() id = type @@ -2170,7 +2189,7 @@ access_view = ACCESS_HOS contains = list(/mob/living/simple_animal/crab) crate_name = "look sir free crabs" - DropPodOnly = TRUE + drop_pod_only = TRUE /datum/supply_pack/critter/crab/generate() . = ..() @@ -2723,7 +2742,7 @@ desc = "Presenting the New Nanotrasen-Brand Bluespace Supplypod! Transport cargo with grace and ease! Call today and we'll shoot over a demo unit for just 300 credits!" cost = CARGO_CRATE_VALUE * 0.6 //Empty pod, so no crate refund contains = list() - DropPodOnly = TRUE + drop_pod_only = TRUE crate_type = null special_pod = /obj/structure/closet/supplypod/bluespacepod diff --git a/code/modules/modular_computers/file_system/programs/budgetordering.dm b/code/modules/modular_computers/file_system/programs/budgetordering.dm index f60267a6186..bfc8903dfc3 100644 --- a/code/modules/modular_computers/file_system/programs/budgetordering.dm +++ b/code/modules/modular_computers/file_system/programs/budgetordering.dm @@ -100,7 +100,7 @@ "name" = P.group, "packs" = list() ) - if((P.hidden && (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.DropPodOnly)) + if((P.hidden && (P.contraband && !contraband) || (P.special && !P.special_enabled) || P.drop_pod_only)) continue data["supplies"][P.group]["packs"] += list(list( "name" = P.name, @@ -194,7 +194,7 @@ var/datum/supply_pack/pack = SSshuttle.supply_packs[id] if(!istype(pack)) return - if(pack.hidden || pack.contraband || pack.DropPodOnly || (pack.special && !pack.special_enabled)) + if(pack.hidden || pack.contraband || pack.drop_pod_only || (pack.special && !pack.special_enabled)) return var/name = "*None Provided*" diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index b218b108400..174159ac55b 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -314,3 +314,13 @@ volume = 15 amount_per_transfer_from_this = 15 list_reagents = list(/datum/reagent/medicine/epinephrine = 5, /datum/reagent/medicine/coagulant = 2.5, /datum/reagent/iron = 3.5, /datum/reagent/medicine/salglu_solution = 4) + +/obj/item/reagent_containers/hypospray/medipen/mutadone + name = "mutadone autoinjector" + desc = "An mutadone medipen to assist in curing genetic errors in one single injector." + icon_state = "penacid" + inhand_icon_state = "penacid" + base_icon_state = "penacid" + volume = 15 + amount_per_transfer_from_this = 15 + list_reagents = list(/datum/reagent/medicine/mutadone = 15) diff --git a/icons/obj/radio.dmi b/icons/obj/radio.dmi index 4588d215aed..37b810f332f 100644 Binary files a/icons/obj/radio.dmi and b/icons/obj/radio.dmi differ