From 68d3406898e3dbeb0958718b4d3c54ac1b189b2d Mon Sep 17 00:00:00 2001 From: Neerti Date: Fri, 14 Dec 2018 22:06:06 -0500 Subject: [PATCH] Merge pull request #5773 from Neerti/identification_system Adds Identification System, New Autoinjectors --- code/__defines/_planes+layers.dm | 2 +- code/__defines/objects.dm | 23 +- .../gamemodes/technomancer/devices/hypos.dm | 60 ------ code/game/machinery/door_control.dm | 1 + code/game/machinery/doors/blast_door.dm | 2 +- code/game/objects/items/devices/scanners.dm | 17 +- .../objects/random/unidentified/medicine.dm | 149 +++++++++++++ code/game/objects/structures/loot_piles.dm | 26 ++- code/modules/identification/identification.dm | 127 +++++++++++ code/modules/identification/item_procs.dm | 30 +++ code/modules/reagents/Chemistry-Machinery.dm | 64 +++++- .../Chemistry-Reagents-Other.dm | 19 +- .../Chemistry-Reagents-Toxins.dm | 18 +- .../reagents/reagent_containers/hypospray.dm | 197 ++++++++++++++++-- .../unidentified_hypospray.dm | 80 +++++++ icons/obj/chemical.dmi | Bin 34511 -> 36111 bytes icons/obj/loot_piles.dmi | Bin 11376 -> 12091 bytes maps/southern_cross/southern_cross-1.dmm | 17 +- polaris.dme | 4 + tools/mapmerge/1prepare_map.sh | 6 + tools/mapmerge/2clean_map.sh | 4 + 21 files changed, 751 insertions(+), 95 deletions(-) create mode 100644 code/game/objects/random/unidentified/medicine.dm create mode 100644 code/modules/identification/identification.dm create mode 100644 code/modules/identification/item_procs.dm create mode 100644 code/modules/reagents/reagent_containers/unidentified_hypospray.dm create mode 100755 tools/mapmerge/1prepare_map.sh create mode 100755 tools/mapmerge/2clean_map.sh diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm index e37bef86d4..faaa475894 100644 --- a/code/__defines/_planes+layers.dm +++ b/code/__defines/_planes+layers.dm @@ -76,8 +76,8 @@ What is the naming convention for planes or layers? #define ABOVE_JUNK_LAYER 3.1 // Things that want to be slightly above common objects #define DOOR_CLOSED_LAYER 3.1 // Doors when closed #define WINDOW_LAYER 3.2 // Windows - #define ABOVE_WINDOW_LAYER 3.25 //Above full tile windows so wall items are clickable #define ON_WINDOW_LAYER 3.3 // Ontop of a window + #define ABOVE_WINDOW_LAYER 3.4 //Above full tile windows so wall items are clickable // Mob planes #define MOB_PLANE -25 diff --git a/code/__defines/objects.dm b/code/__defines/objects.dm index 879bed2cd1..26ff77b4d8 100644 --- a/code/__defines/objects.dm +++ b/code/__defines/objects.dm @@ -1,6 +1,5 @@ /* * Defines used for miscellaneous objects. - * Currently only the home of the Multiool. */ // Multitool Mode Defines. @@ -8,3 +7,25 @@ #define MULTITOOL_MODE_STANDARD "Standard" #define MULTITOOL_MODE_INTCIRCUITS "Modular Wiring" #define MULTITOOL_MODE_DOORHACK "Advanced Jacking" + +// Identity system defines. +#define IDENTITY_UNKNOWN 0 // Nothing is known so far. +#define IDENTITY_PROPERTIES 1 // Basic function of the item, and amount of charges available if it uses them. +#define IDENTITY_QUALITY 2 // Blessed/Uncursed/Cursed status. Some things don't use this. +#define IDENTITY_FULL IDENTITY_PROPERTIES|IDENTITY_QUALITY // Know everything. + +#define IDENTITY_TYPE_NONE "generic" +#define IDENTITY_TYPE_TECH "technological" +#define IDENTITY_TYPE_CHEMICAL "chemical" + +// Roguelike object quality defines. Not used at the moment. +#define ROGUELIKE_ITEM_ARTIFACT 2 // Cannot degrade, very rare. +#define ROGUELIKE_ITEM_BLESSED 1 // Better than average and resists cursing. +#define ROGUELIKE_ITEM_UNCURSED 0 // Normal. +#define ROGUELIKE_ITEM_CURSED -1 // Does bad things, clothing cannot be taken off. + +// Consistant messages for certain events. +// Consistancy is import in order to avoid giving too much information away when using an +// unidentified object due to a typo or some other unique difference in message output. +#define ROGUELIKE_MESSAGE_NOTHING "Nothing happens." +#define ROGUELIKE_MESSAGE_UNKNOWN "Something happened, but you're not sure what." diff --git a/code/game/gamemodes/technomancer/devices/hypos.dm b/code/game/gamemodes/technomancer/devices/hypos.dm index f5174c45e3..002b3cfff0 100644 --- a/code/game/gamemodes/technomancer/devices/hypos.dm +++ b/code/game/gamemodes/technomancer/devices/hypos.dm @@ -1,16 +1,3 @@ -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector - name = "empty hypo" - desc = "A refined version of the standard autoinjector, allowing greater capacity." - icon_state = "autoinjector" - amount_per_transfer_from_this = 15 - volume = 15 - origin_tech = list(TECH_BIO = 4) - filled_reagents = list("inaprovaline" = 15) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/New() - ..() - - /datum/technomancer/consumable/hypo_brute name = "Trauma Hypo" desc = "A extended capacity hypo which can treat blunt trauma." @@ -59,50 +46,3 @@ desc = "A extended capacity hypo containing a dangerous cocktail of various combat stims." cost = 75 obj_path = /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat - - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute - name = "trauma hypo" - desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to be used on victims of \ - moderate blunt trauma." - filled_reagents = list("bicaridine" = 15) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn - name = "burn hypo" - desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to be used on burn victims, \ - featuring an optimized chemical mixture to allow for rapid healing." - filled_reagents = list("kelotane" = 7.5, "dermaline" = 7.5) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin - name = "toxin hypo" - desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to counteract toxins." - filled_reagents = list("anti_toxin" = 15) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy - name = "oxy hypo" - desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to counteract oxygen \ - deprivation." - filled_reagents = list("dexalinp" = 10, "tricordrazine" = 5) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity - name = "purity hypo" - desc = "A refined version of the standard autoinjector, allowing greater capacity. This variant excels at \ - resolving viruses, infections, radiation, and genetic maladies." - filled_reagents = list("spaceacillin" = 9, "arithrazine" = 5, "ryetalyn" = 1) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain - name = "pain hypo" - desc = "A refined version of the standard autoinjector, allowing greater capacity. This one contains potent painkillers." - filled_reagents = list("tramadol" = 15) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ - name = "organ hypo" - desc = "A refined version of the standard autoinjector, allowing greater capacity. Organ damage is resolved by this variant." - filled_reagents = list("alkysine" = 1, "imidazoline" = 1, "peridaxon" = 13) - -/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat - name = "combat hypo" - desc = "A refined version of the standard autoinjector, allowing greater capacity. This is a more dangerous and potentially \ - addictive hypo compared to others, as it contains a potent cocktail of various chemicals to optimize the recipient's combat \ - ability." - filled_reagents = list("bicaridine" = 3, "kelotane" = 1.5, "dermaline" = 1.5, "oxycodone" = 3, "hyperzine" = 3, "tricordrazine" = 3) diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 0a54b148d1..86b0bfa622 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -4,6 +4,7 @@ icon = 'icons/obj/stationobjs.dmi' icon_state = "doorctrl0" power_channel = ENVIRON + layer = ABOVE_WINDOW_LAYER var/desiredstate = 0 var/exposedwires = 0 var/wires = 3 diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index ab8819f8da..13cc48c4c5 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -23,7 +23,7 @@ var/icon_state_closed = null var/icon_state_closing = null - closed_layer = 3.3 // Above airlocks when closed + closed_layer = ON_WINDOW_LAYER // Above airlocks when closed var/id = 1.0 dir = 1 explosion_resistance = 25 diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 97d352c3d7..8d4b4928ac 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -410,25 +410,28 @@ HALOGEN COUNTER - Radcount on mobs var/details = 0 var/recent_fail = 0 -/obj/item/device/reagent_scanner/afterattack(obj/O, mob/user as mob, proximity) +/obj/item/device/reagent_scanner/afterattack(obj/O, mob/living/user, proximity) if(!proximity || user.stat || !istype(O)) return - if (!(istype(user, /mob/living/carbon/human) || ticker) && ticker.mode.name != "monkey") - to_chat(user, "You don't have the dexterity to do this!") + if(!istype(user)) return if(!isnull(O.reagents)) + if(!(O.flags & OPENCONTAINER)) // The idea is that the scanner has to touch the reagents somehow. This is done to prevent cheesing unidentified autoinjectors. + to_chat(user, span("warning", "\The [O] is sealed, and cannot be scanned by \the [src] until unsealed.")) + return + var/dat = "" if(O.reagents.reagent_list.len > 0) var/one_percent = O.reagents.total_volume / 100 for (var/datum/reagent/R in O.reagents.reagent_list) - dat += "\n \t [R][details ? ": [R.volume / one_percent]%" : ""]" + dat += "\n \t " + span("notice", "[R][details ? ": [R.volume / one_percent]%" : ""]") if(dat) - to_chat(user, "Chemicals found: [dat]") + to_chat(user, span("notice", "Chemicals found: [dat]")) else - to_chat(user, "No active chemical agents found in [O].") + to_chat(user, span("notice", "No active chemical agents found in [O].")) else - to_chat(user, "No significant chemical agents found in [O].") + to_chat(user, span("notice", "No significant chemical agents found in [O].")) return diff --git a/code/game/objects/random/unidentified/medicine.dm b/code/game/objects/random/unidentified/medicine.dm new file mode 100644 index 0000000000..4cd2d5652c --- /dev/null +++ b/code/game/objects/random/unidentified/medicine.dm @@ -0,0 +1,149 @@ +/* +Semi-randomized loot for PoIs involving medicine. +Note that most of these include both 'good' and 'bad' results, with the bad results often being +much more likely to show up. This is done for several purposes; + + * A large influx of valuable medicine makes medical/SAR less needed for explorers, which is something we want to avoid. + * Blindly using autoinjectors should be risky, and to accomplish that, it needs to be more likely to get a bad effect. + * A large amount of bad loot helps make the good loot feel better to acquire. + +*/ + +// This one makes a purely random hypo. Not recommended for PoIs since it will produce nonsensical results for a PoI's theme. +// It's more of a thing to help pick specific hypos for the other lists. +/obj/random/unidentified_medicine + name = "unidentified medicine" + desc = "This will make a random hypo." + icon = 'icons/obj/syringe.dmi' + item_state = "hypo" + +/obj/random/unidentified_medicine/item_to_spawn() + return pick( + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/healing_nanites/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/stimm/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/space_drugs/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/expired/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/serotrotium/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/cryptobiolin/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/mindbreaker/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/psilocybin/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/soporific/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/cyanide/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/impedrezene/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/mutagen/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/defective_nanites/unidentified, + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/contaminated/unidentified) + +// Produces things you might find in an old medicine cabinet in a PoI. +// Old cabinets are typical of ruins and abandoned buildings in the plains, meaning they're usually easier to reach, and as such, inferior loot. +/obj/random/unidentified_medicine/old_medicine/item_to_spawn() + // 30 Good, 70 Bad. 30% to get something good. + // Poor odds, but these are fairly easy to reach as they're in abandoned areas. + return pick( + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain/unidentified, + prob(65);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/expired/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/contaminated/unidentified) + +// Medicine belonging to a place still being occupied (or was recently), meaning the goods might still be fresh, and better. +/obj/random/unidentified_medicine/fresh_medicine/item_to_spawn() + // More likely to get something good, and a chance to get rare medicines. + // 75 Good, 25 Bad. 75% chance of getting something good. + // Good odds, but the contents aren't super great unless someone gets lucky. + return pick( + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed/unidentified, + prob(25);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/expired/unidentified) + +// For military PoIs like BSD. High odds of good loot since those PoIs are really hard. +/obj/random/unidentified_medicine/combat_medicine/item_to_spawn() + // More likely to get something good, and a chance to get rare medicines. + // 75 Good, 30 Bad, roughly 71.4% chance to get something good. + // Very high but very hard to reach and still has a chance of ending poorly if injecting blind. + return pick( + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed/unidentified, + prob(30);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/soporific/unidentified, + prob(30);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/cyanide/unidentified) + +// Hyposprays found inside various illicit places. +/obj/random/unidentified_medicine/drug_den/item_to_spawn() + // Combat stims are common, but so are nasty drugs. + // 65 Good, 160 Bad, roughly 28.8% to get something good. + // Poor odds, but there are a lot of these scattered in the drug dens and illegal chem labs. + return pick( + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed/unidentified, + prob(40);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat/unidentified, + prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/stimm/unidentified, + prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/space_drugs/unidentified, + prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/serotrotium/unidentified, + prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/cryptobiolin/unidentified, + prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/mindbreaker/unidentified, + prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/psilocybin/unidentified, + prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/soporific/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/impedrezene/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/cyanide/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/contaminated/unidentified) + +// Medicine made FOR SCIENCE. +/obj/random/unidentified_medicine/scientific/item_to_spawn() + // Potential for amazing loot, also potential for very nasty consequences if injecting blind. + // 45 Good, 45 Bad, 50% chance to get something good. + // Do you feel lucky? + return pick( + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/healing_nanites/unidentified, + prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/contaminated/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/cyanide/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/mutagen/unidentified, + prob(5);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/defective_nanites/unidentified) + +// Nanomachines, son. Found in very advanced places such as the Crashed UFO. +/obj/random/unidentified_medicine/nanites/item_to_spawn() + // You better identify this if you value your life. + // 30 Good, 70 Bad. 30% of getting a good outcome. + return pick( + prob(30);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/healing_nanites/unidentified, + prob(70);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/defective_nanites/unidentified) + +// Found in virus-related areas like the Quarantined Shuttle. +/obj/random/unidentified_medicine/viral/item_to_spawn() + // Another one where's its important to identify the hypo. + // 30 Good, 70 Bad. 30% of getting a good outcome. + return pick( + prob(30);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity/unidentified, + prob(40);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/expired/unidentified, + prob(10);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/mutagen/unidentified, + prob(20);/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/contaminated/unidentified) \ No newline at end of file diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm index 17d1ca4984..ea92ed27f1 100644 --- a/code/game/objects/structures/loot_piles.dm +++ b/code/game/objects/structures/loot_piles.dm @@ -911,4 +911,28 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh /obj/item/borg/upgrade/tasercooler, /obj/item/borg/upgrade/syndicate, /obj/item/borg/upgrade/vtec - ) \ No newline at end of file + ) + +// Contains old mediciation, most of it unidentified and has a good chance of being useless. +/obj/structure/loot_pile/surface/medicine_cabinet + name = "abandoned medicine cabinet" + desc = "An old cabinet, it might still have something of use inside." + icon_state = "medicine_cabinet" + density = FALSE + chance_uncommon = 0 + chance_rare = 0 + + common_loot = list( + /obj/random/unidentified_medicine/old_medicine + ) + +// Like the above but has way better odds, in exchange for being in a place still inhabited (or was recently). +/obj/structure/loot_pile/surface/medicine_cabinet/fresh + name = "medicine cabinet" + desc = "A cabinet designed to hold medicine, it might still have something of use inside." + icon_state = "medicine_cabinet" + density = FALSE + + common_loot = list( + /obj/random/unidentified_medicine/fresh_medicine + ) \ No newline at end of file diff --git a/code/modules/identification/identification.dm b/code/modules/identification/identification.dm new file mode 100644 index 0000000000..568ad2103e --- /dev/null +++ b/code/modules/identification/identification.dm @@ -0,0 +1,127 @@ +// This is a datum attached to objects to make their 'identity' be unknown initially. +// The identitiy and properties of an unidentified object can be determined in-game through a specialized process or by potentially risky trial-and-error. +// This is very similar to a traditional roguelike's identification system, and as such will use certain terms from those to describe them. +// Despite this, unlike a roguelike, objects that do the same thing DO NOT have the same name/appearance/etc. + +/datum/identification + var/obj/holder = null // The thing the datum is 'attached' to. + // Holds the true information. + var/true_name = null // The real name of the object. It is copied automatically from holder, on the datum being instantiated. + var/true_desc = null // Ditto, for desc. + var/true_description_info = null // Ditto, for helpful examine panel entries. + var/true_description_fluff = null // Ditto, for lore. + var/true_description_antag = null // Ditto, for antag info (this probably won't get used). + var/identified = IDENTITY_UNKNOWN // Can be IDENTITY_UNKNOWN, IDENTITY_PROPERTIES, IDENTITY_QUALITY, or IDENTITY_FULL. + + // Holds what is displayed when not identified sufficently. + var/unidentified_name = null // The name given to the object when not identified. Generated by generate_unidentified_name() + var/unidentified_desc = "You're not too sure what this is." + var/unidentified_description_info = "This object is unidentified, and as such its properties are unknown. Using this object may be dangerous." + + // Lists of lists for generating names by combining one from each. + var/list/naming_lists = list() + + // What 'identification type' is needed to identify this. + var/identification_type = IDENTITY_TYPE_NONE + +/datum/identification/New(obj/new_holder) + ASSERT(new_holder) + holder = new_holder + record_true_identity() // Get all the identifying features from the holder. + update_name() // Then hide them for awhile if needed. + +/datum/identification/Destroy() + holder = null + return ..() + +// Records the object's inital identifiying features to the datum for future safekeeping. +/datum/identification/proc/record_true_identity() + true_name = holder.name + true_desc = holder.desc + true_description_info = holder.description_info + true_description_fluff = holder.description_fluff + true_description_antag = holder.description_antag + +// Formally identifies the holder. +/datum/identification/proc/identify(new_identity = IDENTITY_FULL, mob/user) + if(new_identity & identified) // Already done. + return + identified |= new_identity // Set the bitflag. + if(user) + switch(identified) + if(IDENTITY_QUALITY) + to_chat(user, "You've identified \the [holder]'s quality.") + if(IDENTITY_PROPERTIES) + to_chat(user, "You've identified \the [holder]'s functionality as a [true_name].") + if(IDENTITY_FULL) + to_chat(user, "You've identified \the [holder] as a [true_name], and its quality.") + update_name() + holder.update_icon() + +// Reverses identification for whatever reason. +/datum/identification/proc/unidentify(new_identity = IDENTITY_UNKNOWN, mob/user) + identified &= ~new_identity // Unset the bitflag. + update_name() + holder.update_icon() + if(user) + switch(identified) // Give a message based on what's left. + if(IDENTITY_QUALITY) + to_chat(user, span("warning", "You forgot what \the [holder] actually did...")) + if(IDENTITY_PROPERTIES) + to_chat(user, span("warning", "You forgot \the [holder]'s quality...")) + if(IDENTITY_UNKNOWN) + to_chat(user, span("warning", "You forgot everything about \the [holder].")) + +// Sets the holder's name to the real name if its properties are identified, or obscures it otherwise. +/datum/identification/proc/update_name() + if(identified & IDENTITY_PROPERTIES) + holder.name = true_name + holder.desc = true_desc + holder.description_info = true_description_info + holder.description_fluff = true_description_fluff + holder.description_antag = true_description_antag + return + + if(!unidentified_name) + unidentified_name = generate_unidentified_name() + + holder.name = unidentified_name + holder.desc = unidentified_desc + holder.description_info = unidentified_description_info + holder.description_fluff = null + holder.description_antag = null + +// Makes a name for an object that is not identified. It picks one string out of each list inside naming_list. +/datum/identification/proc/generate_unidentified_name() + if(!LAZYLEN(naming_lists)) + return "unidentified object" + + var/list/new_name = list() + for(var/i in naming_lists) + var/list/current_list = i + new_name += pick(current_list) + return new_name.Join(" ") + +// Used for tech-based objects. +// Unused for now pending Future Stuff(tm). +/datum/identification/mechanical + naming_lists = list( + list("unidentified", "unknown", "strange", "weird", "unfamiliar", "peculiar", "mysterious", "bizarre", "odd"), + list("device", "apparatus", "gadget", "mechanism", "appliance", "machine", "equipment", "invention", "contraption") + ) + identification_type = IDENTITY_TYPE_TECH + +// Used for unidentified hypos. +// Their contents can range from genuine medication, expired medicine, illicit drugs, toxins and poisons, and more. +// They are the analog for potions in a traditional roguelike. +/datum/identification/hypo + naming_lists = list( + list("unidentified", "unknown", "unmarked", "blank", "refilled", "custom", "modified", "questionable", "suspicious"), + list("hypospray", "autoinjector") + ) + unidentified_desc = "An autoinjector that does not give any indication towards what is inside. \ + The case is also sealed tight and the liquids contained cannot be removed except by injecting it into someone. \ + Do you feel lucky?" + unidentified_description_info = "A skilled chemist with a specialized machine can identify this autoinjector. \ + Blindly using the autoinjector is risky and can be dangerous." + identification_type = IDENTITY_TYPE_CHEMICAL diff --git a/code/modules/identification/item_procs.dm b/code/modules/identification/item_procs.dm new file mode 100644 index 0000000000..c2e5ddaed6 --- /dev/null +++ b/code/modules/identification/item_procs.dm @@ -0,0 +1,30 @@ +// This is on the base /item so badmins can play with it by calling hide_identity(). +/obj/item + var/datum/identification/identity = null + var/identity_type = /datum/identification + var/init_hide_identity = FALSE // Set to true to automatically obscure the object on initialization. + +/obj/item/Initialize() + if(init_hide_identity) + identity = new identity_type(src) + return ..() + +/obj/item/Destroy() + if(identity) + QDEL_NULL(identity) + return ..() + +/obj/item/proc/hide_identity() // Mostly for admins to make things secret. + if(!identity) + identity = new identity_type(src) + else + identity.unidentify() + +/obj/item/proc/identify(identity_type = IDENTITY_FULL, mob/user) + if(identity) + identity.identify(identity_type, user) + +/obj/item/proc/is_identified(identity_type = IDENTITY_FULL) + if(!identity) // No identification datum means nothing to hide. + return TRUE + return identity_type & identity.identified diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index e3fe4415b5..8bf4e4e910 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -32,7 +32,7 @@ /obj/machinery/chem_master/New() ..() - var/datum/reagents/R = new/datum/reagents(900) //Just a huge random number so the buffer should (probably) never dump your reagents. + var/datum/reagents/R = new/datum/reagents(900) //Just a huge random number so the buffer should (probably) never dump your reagents. reagents = R //There should be a nano ui thingy to warn of this. R.my_atom = src @@ -544,3 +544,65 @@ qdel(O) if (beaker.reagents.total_volume >= beaker.reagents.maximum_volume) break + + +/////////////// +/////////////// +// Detects reagents inside most containers, and acts as an infinite identification system for reagent-based unidentified objects. + +/obj/machinery/chemical_analyzer + name = "chem analyzer" + desc = "Used to precisely scan chemicals and other liquids inside various containers. \ + It may also identify the liquid contents of unknown objects." + description_info = "This machine will try to tell you what reagents are inside of something capable of holding reagents. \ + It is also used to 'identify' specific reagent-based objects with their properties obscured from inspection by normal means." + icon = 'icons/obj/chemical.dmi' + icon_state = "chem_analyzer" + density = TRUE + anchored = TRUE + use_power = TRUE + idle_power_usage = 20 + clicksound = "button" + var/analyzing = FALSE + +/obj/machinery/chemical_analyzer/update_icon() + icon_state = "chem_analyzer[analyzing ? "-working":""]" + +/obj/machinery/chemical_analyzer/attackby(obj/item/I, mob/living/user) + if(!istype(I)) + return ..() + + if(default_deconstruction_screwdriver(user, I)) + return + if(default_deconstruction_crowbar(user, I)) + return + + if(istype(I,/obj/item/weapon/reagent_containers)) + analyzing = TRUE + update_icon() + to_chat(user, span("notice", "Analyzing \the [I], please stand by...")) + + if(!do_after(user, 2 SECONDS, src)) + to_chat(user, span("warning", "Sample moved outside of scan range, please try again and remain still.")) + analyzing = FALSE + update_icon() + return + + // First, identify it if it isn't already. + if(!I.is_identified(IDENTITY_FULL)) + var/datum/identification/ID = I.identity + if(ID.identification_type == IDENTITY_TYPE_CHEMICAL) // This only solves chemical-based mysteries. + I.identify(IDENTITY_FULL, user) + + // Now tell us everything that is inside. + if(I.reagents && I.reagents.reagent_list.len) + to_chat(user, "
") // To add padding between regular chat and the output. + for(var/datum/reagent/R in I.reagents.reagent_list) + if(!R.name) + continue + to_chat(user, span("notice", "Contains [R.volume]u of [R.name].
[R.description]
")) + + to_chat(user, span("notice", "Scanning of \the [I] complete.")) + analyzing = FALSE + update_icon() + return \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm index ff753a5b37..954102b732 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Other.dm @@ -489,4 +489,21 @@ description = "A slurry of compounds that contains the basic requirements for life." taste_description = "salty meat" reagent_state = LIQUID - color = "#DF9FBF" \ No newline at end of file + color = "#DF9FBF" + +// The opposite to healing nanites, exists to make unidentified hypos implied to have nanites not be 100% safe. +/datum/reagent/defective_nanites + name = "Defective Nanites" + id = "defective_nanites" + description = "Miniature medical robots that are malfunctioning and cause bodily harm. Fortunately, they cannot self-replicate." + taste_description = "metal" + reagent_state = SOLID + color = "#333333" + metabolism = REM * 3 // Broken nanomachines go a bit slower. + scannable = 1 + +/datum/reagent/defective_nanites/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + M.take_organ_damage(2 * removed, 2 * removed) + M.adjustOxyLoss(4 * removed) + M.adjustToxLoss(2 * removed) + M.adjustCloneLoss(2 * removed) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm index 3f655d83de..1ec5e6e334 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Toxins.dm @@ -155,10 +155,26 @@ /datum/reagent/toxin/mold/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() - M.adjustToxLoss(strength * removed) if(prob(5)) M.vomit() +/datum/reagent/toxin/expired_medicine + name = "Expired Medicine" + id = "expired_medicine" + description = "Some form of liquid medicine that is well beyond its shelf date. Administering it now would cause illness." + taste_description = "bitterness" + reagent_state = LIQUID + strength = 5 + +/datum/reagent/toxin/expired_medicine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + ..() + if(prob(5)) + M.vomit() + +/datum/reagent/toxin/expired_medicine/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) + affect_blood(M, alien, removed * 0.66) + + /datum/reagent/toxin/stimm //Homemade Hyperzine name = "Stimm" id = "stimm" diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 3cfac06de1..efa9ff81c1 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -53,20 +53,29 @@ if(!do_after(user, 30, H)) return + do_injection(H, user) + return + +// This does the actual injection and transfer. +/obj/item/weapon/reagent_containers/hypospray/proc/do_injection(mob/living/carbon/human/H, mob/living/user) + if(!istype(H) || !istype(user)) + return FALSE + user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) - to_chat(user, "You inject [M] with \the [src].") - to_chat(M, "You feel a tiny prick!") + to_chat(user, span("notice", "You inject \the [H] with \the [src].")) + to_chat(H, span("warning", "You feel a tiny prick!")) if(hyposound) - playsound(src, hyposound,25) + playsound(src, hyposound, 25) - if(M.reagents) + if(H.reagents) var/contained = reagentlist() - var/trans = reagents.trans_to_mob(M, amount_per_transfer_from_this, CHEM_BLOOD) - add_attack_logs(user,M,"Injected with [src.name] containing [contained], trasferred [trans] units") - to_chat(user, "[trans] units injected. [reagents.total_volume] units remaining in \the [src].") + var/trans = reagents.trans_to_mob(H, amount_per_transfer_from_this, CHEM_BLOOD) + add_attack_logs(user,H,"Injected with [src.name] containing [contained], trasferred [trans] units") + to_chat(user, span("notice", "[trans] units injected. [reagents.total_volume] units remaining in \the [src].")) + return TRUE + return FALSE - return //A vial-loaded hypospray. Cartridge-based! /obj/item/weapon/reagent_containers/hypospray/vial name = "hypospray mkII" @@ -143,12 +152,11 @@ flags &= ~OPENCONTAINER icon_state = "[initial(icon_state)]0" -/obj/item/weapon/reagent_containers/hypospray/autoinjector/attack(mob/M as mob, mob/user as mob) - ..() - if(reagents.total_volume <= 0) //Prevents autoinjectors to be refilled. +/obj/item/weapon/reagent_containers/hypospray/autoinjector/do_injection(mob/living/carbon/human/H, mob/living/user) + . = ..() + if(.) // Will occur if successfully injected. flags &= ~OPENCONTAINER - update_icon() - return + update_icon() /obj/item/weapon/reagent_containers/hypospray/autoinjector/update_icon() if(reagents.total_volume > 0) @@ -168,6 +176,63 @@ icon_state = "green" filled_reagents = list("anti_toxin" = 5) +// These have a 15u capacity, somewhat higher tech level, and generally more useful chems, but are otherwise the same as the regular autoinjectors. +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector + name = "empty hypo" + desc = "A refined version of the standard autoinjector, allowing greater capacity." + icon_state = "autoinjector" + amount_per_transfer_from_this = 15 + volume = 15 + origin_tech = list(TECH_BIO = 4) + filled_reagents = list("inaprovaline" = 15) + flags = 0 // Removed OPENCONTAINER so you can't extract things to cheese the identification system in unidentified versions. + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute + name = "trauma hypo" + desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to be used on victims of \ + moderate blunt trauma." + filled_reagents = list("bicaridine" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn + name = "burn hypo" + desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to be used on burn victims, \ + featuring an optimized chemical mixture to allow for rapid healing." + filled_reagents = list("kelotane" = 7.5, "dermaline" = 7.5) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin + name = "toxin hypo" + desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to counteract toxins." + filled_reagents = list("anti_toxin" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy + name = "oxy hypo" + desc = "A refined version of the standard autoinjector, allowing greater capacity. This one is made to counteract oxygen \ + deprivation." + filled_reagents = list("dexalinp" = 10, "tricordrazine" = 5) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity + name = "purity hypo" + desc = "A refined version of the standard autoinjector, allowing greater capacity. This variant excels at \ + resolving viruses, infections, radiation, and genetic maladies." + filled_reagents = list("spaceacillin" = 9, "arithrazine" = 5, "ryetalyn" = 1) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain + name = "pain hypo" + desc = "A refined version of the standard autoinjector, allowing greater capacity. This one contains potent painkillers." + filled_reagents = list("tramadol" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ + name = "organ hypo" + desc = "A refined version of the standard autoinjector, allowing greater capacity. Organ damage is resolved by this variant." + filled_reagents = list("alkysine" = 3, "imidazoline" = 2, "peridaxon" = 10) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat + name = "combat hypo" + desc = "A refined version of the standard autoinjector, allowing greater capacity. This is a more dangerous and potentially \ + addictive hypo compared to others, as it contains a potent cocktail of various chemicals to optimize the recipient's combat \ + ability." + filled_reagents = list("bicaridine" = 3, "kelotane" = 1.5, "dermaline" = 1.5, "oxycodone" = 3, "hyperzine" = 3, "tricordrazine" = 3) + /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting name = "clotting agent" desc = "A refined version of the standard autoinjector, allowing greater capacity. This variant excels at treating bleeding wounds and internal bleeding." @@ -177,3 +242,109 @@ name = "bone repair injector" desc = "A refined version of the standard autoinjector, allowing greater capacity. This one excels at treating damage to bones." filled_reagents = list("inaprovaline" = 5, "osteodaxon" = 10) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/stimm + name = "stimm injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + This one is filled with a home-made stimulant, with some serious side-effects." + filled_reagents = list("stimm" = 10) // More than 10u will OD. + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/expired + name = "expired injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + This one has had its contents expire a long time ago, using it now will probably make someone sick, or worse." + filled_reagents = list("expired_medicine" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/soporific + name = "soporific injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + This one is sometimes used by orderlies, as it has soporifics, which make someone tired and fall asleep." + filled_reagents = list("stoxin" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/cyanide + name = "cyanide injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + This one contains cyanide, a lethal poison. It being inside a medical autoinjector has certain unsettling implications." + filled_reagents = list("cyanide" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/serotrotium + name = "serotrotium injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + This one is filled with serotrotium, which causes concentrated production of the serotonin neurotransmitter in humans." + filled_reagents = list("serotrotium" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/space_drugs + name = "illicit injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + This one contains various illicit drugs, held inside a hypospray to make smuggling easier." + filled_reagents = list("space_drugs" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/cryptobiolin + name = "cryptobiolin injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + This one contains cryptobiolin, which causes confusion." + filled_reagents = list("cryptobiolin" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/impedrezene + name = "impedrezene injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + This one has impedrezene inside, a narcotic that impairs higher brain functioning. \ + This autoinjector is almost certainly created illegitimately." + filled_reagents = list("impedrezene" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/mindbreaker + name = "mindbreaker injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + This one stores the dangerous hallucinogen called 'Mindbreaker', likely put in place \ + by illicit groups hoping to hide their product." + filled_reagents = list("mindbreaker" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/psilocybin + name = "psilocybin injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + This has psilocybin inside, which is a strong psychotropic derived from certain species of mushroom. \ + This autoinjector likely was made by criminal elements to avoid detection from casual inspection." + filled_reagents = list("psilocybin" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/mutagen + name = "unstable mutagen injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + This contains unstable mutagen, which makes using this a very bad idea. It will either \ + ruin your genetic health, turn you into a Five Points violation, or both!" + filled_reagents = list("mutagen" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/lexorin + name = "lexorin injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + This contains lexorin, a dangerous toxin that stops respiration, and has been \ + implicated in several high-profile assassinations in the past." + filled_reagents = list("lexorin" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/healing_nanites + name = "medical nanite injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + The injector stores a slurry of highly advanced and specialized nanomachines designed \ + to restore bodily health from within. The nanomachines are short-lived but degrade \ + harmlessly, and cannot self-replicate in order to remain Five Points compliant." + filled_reagents = list("healing_nanites" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/defective_nanites + name = "defective nanite injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + The injector stores a slurry of highly advanced and specialized nanomachines that \ + are unfortunately malfunctioning, making them unsafe to use inside of a living body. \ + Because of the Five Points, these nanites cannot self-replicate." + filled_reagents = list("defective_nanites" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/contaminated + name = "contaminated injector" + desc = "A refined version of the standard autoinjector, allowing greater capacity. \ + The hypospray contains a viral agent inside, as well as a liquid substance that encourages \ + the growth of the virus inside." + filled_reagents = list("virusfood" = 15) + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/contaminated/do_injection(mob/living/carbon/human/H, mob/living/user) + . = ..() + if(.) // Will occur if successfully injected. + infect_mob_random_lesser(H) + add_attack_logs(user, H, "Infected \the [H] with \the [src], by \the [user].") \ No newline at end of file diff --git a/code/modules/reagents/reagent_containers/unidentified_hypospray.dm b/code/modules/reagents/reagent_containers/unidentified_hypospray.dm new file mode 100644 index 0000000000..518ed05111 --- /dev/null +++ b/code/modules/reagents/reagent_containers/unidentified_hypospray.dm @@ -0,0 +1,80 @@ +// Here are the paths for all hypos that start unidentified. +// Usually you want to use a random spawner instead of using them directly, unless you're spawning these live for adminbus purposes. + +/obj/item/weapon/reagent_containers/hypospray/autoinjector + identity_type = /datum/identification/hypo + +// The good. +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/brute/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/toxin/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/oxy/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/purity/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/pain/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/organ/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/bonemed/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/combat/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/healing_nanites/unidentified + init_hide_identity = TRUE + +// The somewhat bad. +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/stimm/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/space_drugs/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/expired/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/serotrotium/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/cryptobiolin/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/mindbreaker/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/psilocybin/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/soporific/unidentified + init_hide_identity = TRUE + +// The very bad. +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/cyanide/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/impedrezene/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/mutagen/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/defective_nanites/unidentified + init_hide_identity = TRUE + +/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/contaminated/unidentified + init_hide_identity = TRUE \ No newline at end of file diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 3bf2b9d660e8ba785833d1dc720d3df9a49b1012..1d4c723fcafe1d20d7677f88f6f45dc899d8f079 100644 GIT binary patch delta 17961 zcmb@tcQ{?$*Dk#D61_x^AWDc5C6W-EAfgil(K}HiI@{7EqDF-1C3-K>?M;XhL~l_x zA$qUd*3R<$p7)&dp6fg3ukX5CR+)3I*~T1W+~Xd5APPGs89SB^Y$e1806>hh{w)At zxAHK zdNp^(s%H3;-^LrZyijO*8b`HuF!?2BudfAtxxaX1B#CV4eA4i;l9DOz$-TwZOkUKx zC@;ewnzBVs=es%J(Qy3aJBi{N#D^TEhL;X-GKD-cV`5?51D`b*^P*Z4fN#WlZ_ z?X)*~@YX(mD+>Db68RX|$o(tOY$M}Jz+C#Glyd}o$@qe+?w*hU>D!i%3uQBWh3yY~ zI0NTq`3mVmw+T7y6)eA>zIEVl*kw?lD6sk{;rgoavELvO6PY9-?uAij`kw-J{upzP zmpz-0N(Gs~-_uS_PvpC~D97^&?S!S?eEqU@PD7Brj>@S~$X8Jv-y7%+%)3hYMi7!n zx@8~v(`q{C>$0oD!f)30#tShIG1b2H8MxErK33_`;Y;Rbrq6(0eAf8umz?`Q)zlpT{NGtG8>1jah=GV4;98#^%aPLnVjNgiw?kVDVD%n4<(hX79cu+Ht8;3!^ z;n$7-@HVZa{GJi>;oga(cxvpi{21JviJ$6sI(D~?pWQe+ zZMC+sSrM<6@V#1Y+}=PaMD0rwJ_Z>)PP`sJDd*#;mh);NR_v|Fer(SxIznTBzhr8^ zHdGt`c<5fZw40UXGNH4snRyrBq1Vn}8Tdi`;A=GX!#Hl%CT;hoU61~ecd!38#?4g= zp`VZqr4EfvEz_Et_bTeA2)n_njI=f+%~EcW_6I*!-+UZbD3&_9=I(aSv`Q1ib$z$X zgC!yJ(1a4P8vf?f~kLD>po)jy;6qM)D%>!#wJC6X1D$(?Y+(S7W0 zW=Zio}~9kFV>$tFl|_vbeagXp3$M<8`1Va~;fr9W zcZ(F=qeNP)Z@iy>{6h6aox4(*zD9$)(pc9{tp;aDmN9daoaQNim986Rc}i6Bwxrmq z*R;O%y5P#BqCQjZRFCLtDCkTUc{vujoZCiP(!Uw(tRqVa8|6QQ(P)B-A3aceojgmno~m zv#^++gdj!5g(z}?kVuh?gu3P_bs7u4XTg; z)<-I1%)K~Sw#|6s_CfKU_mzTvZ*5bU*8zF{xMjLcC(5|Z{0lPjKu_PncdxSwI9;bg zoyi>IsZFQDWxAW5f8D2eXZ4n@u8=s261&vFf32sg;luPTFx?Zic0Mc8)2f{PjDBed z8VOgyb8!v2tx@}yIm%nR8Ejm!trDFQfty$VNZr$CL0`C4sa7Ss0_czT+!d0u$nLTK z@a2j;R$E)Uj5iHe2Y<)h)ngoe)n>bMhrd{nuyl2CBYKJc^|27v>+naMDFg40#t?Vs zU!(*G+l7H<^b>=)Q4@;i%Jgo!O=Y6CypA-|`l2`s?RnB?#K)scmGM=_6fRV_H*LI* zJWECkvL*RQETUB=xL%m#1?7gRxMT7_*-$`jQdL~%?2{%eHi{GF@!{@5*7Ybc3{k)&NHQsQeQ zmM{q2sfZp<)9|!IwK{N^ZbR4j&lOn0P=OuMzmFkl#8GDSR}9>JUv?Lh1B1+xmfG>V zh1e=mQoUnp-|zcdU=5go{0+YSLMmUOwkm|1T#2O&{rK<4rjqa90;F;u#Qb3aoEg%JjX8q^eqQysTVoL@(RcGBWmpH2GBR^c+Q~~ zXIY*+#+=Hx%3EY^jCJ??Z4_AlT=r^c`K84IXQe`c_VQOJlQZx#t)9WY;+fQ^%BlYQ za$ogo+{Pk;Nk9!~kTb;x$$^MC+v z#mxwG;b2o97lvStF1CxPeE4gzC@%gwP@;*Oa8KXhzRI4_p6BYF^Un;)L#d@%Q@dgm zy6z41c(y^Ee8wOrIj`eM&^A}rsGz<B@dXv#lA>&&t*<{i`Ft6R$R-0cqi&w0RvGCEH)?vGBD zcE4?HIa4uW_OMFKqWO=`YtocT<=N*X!b2)XkAm@+mcc(>_I$OM>$6|w%)-f7usbpohu$TlKWH0Y0vj-eTR#ONo*?VZnEarcs+tlIdP3_ zUY=1^Em5X~9tK|38o}Q2NNZI(t>%qef(Hk=$w{k0xF%Ves~-V#$O~a{N1d ziZHL2gpJ?_LiLT1-m%*Wu}dW$fcO+DB>`7mMF#ATjq2ZTwmsq1SEjr7diP_&{R{;^10in`V=A%hH`gWmzP}(DfJSdN zU*yog8VlkC$YiVPXskZ-6?%I_>b7o|Z??S7)NRKPa=E{MecP|r+O0cGgD{dk^zwN` z!2~Ytqi?}kv7~1C0>p$oAC?JjMLP7`-fVsCYr&OhRWw?%W*(vTiYwreknp|^Ug+Qt z_0U$HS?TwK@_~7SLP>egL-Ipq(!EajXp%G8d9oFCc8wF2sNcKr(+u6gy~GXqA3Yvd6CfK%<%AnD-ZGEgr5_Gg^}Oae~fz9Cb&>{t^n>Od&y^am%97!Q2l$PffKG z1-Lxd*~>+O{U-}QU{8CGI-t~=GeWs+n?bwveh-mR#Z3)S6+AzDClkS4c--rr8-%KZ z=++hCDlJi!F~!Y_6yy1`RLkyIwtCEZ@qNo~iu~NCu1nozsfiODwu)cYHz;39fxZ#QMYW(%)%GEGFMg6q-0`}oPcryPW4u?mFeimUYa zPdlB{^`*uO-Ary@OSfe~4NI6U6}IQk8V&XrS;w6Nw}`$w;JV{*3WMvx>&otoArA=8 z!*D+no!CJ2snxEZm)L6z-c5>o0 z`Bsh~TUw%X^;p{pLM_GIB*xjfntt|h_F%cFiB_HDp!Zcg99p^7X&qP8tww2$=+*nx z3(SJCqIx>PjRkOrw(Kyu#Pwc2j6g!|jd>>k zN#FuDO-S?4f50Yrno?v+9pLQ>`!iG{MQ$1eEy!yiAkQ>=hG4ynOx0E<@|>gvzf8FQ z`Af^~`-Brjcud``Zu0Z0@*0}?0?_$Qv0V5lBqvdL7~z;!fs&s;%_C%VzH-V%z%zi` zT3M{v0f`kl&~WBaPS z{g#xOXE9s7C|s;!F`31!GrIT2l6^kzWJd6#F|Uo%I*p@h8zaGxFGuUljfca^dkf*L zT=K9l*USC$=TG8OA1y8FIRS&6=W!oJ8y34_40_2}9*49A6L9eH-9VmRwt$*z@)9K3 z6d^XDtwy*$ujv2W%o@bOtuzE!W#(TPnKsG%c}S&4%wLRgD|hA6=GDS=B}BJS=-JX| zm(KE43G3`1;k-}R2^_NR`3aL3i6EgW|IR!N;J90ZrjP@W$AieCP$#CUvn5vD9L1xN z0V-Zny5*Kq37BOBCwAPD2XlQx*qk_J1c?Jfh2-LSZ9h=d#}ld-5-(FMyvm9waWHf1 zDE_j=ggqqp*r=G72X{eVwarM*i!rPokC^|?_mQ9ue&Ymz2hSxTdGl>e{H5K*N7+k5 zAa`$H09=`$uYFPxhoboZi>wytxumVY+Qw~yQFEzrxW{>-w>TB z0UR}&mC_R{WOeP*TX;tYvmevBetq*Qq4mzVW$X@im((34oEFe-v%h-vDs|E!<0+Wj-8Uw#;e3(C!os2_eilO{l5!=9A%-9HizBjbaVbPIx2XYGm3~-vG3AYg#~~nt;|ees~0213B_}Q_iCz&4q(9OOHjv0UEGBeu*I%xr%+|! zbrjdS&&u#Uaa*{&&nm0q*;#_$Ls=4`(h*gW*`&f@FJRFO_d{jC zK$*7^q(jYaV_-y5CpL!EPuKPx1!6B_ut|U|qciQ!>M7)TI?=f`NiJMs_FG8fYLfe*3?z5r75Llq$^Z8{>s!+mmt+O zfqz5UgU2@l*4JOFc$b89Mzeg#k_~^=s}M;asG0MO?Kgw{rQ>cCb}*$|s>Rw3SUx%I zTxiKRB{{jojCaWPIPA&3{p;7?1F&#Puz60IrAOs8DVgT4VePijH^|*7hz+n|+r3S~ zqtPvUXPIhYn1ssly%LE3?9B;;L-K-_8SnfCRb)e;LkDbcj>@O!4L>UvD0`8x{fEFv zgAD8C68%=akoSxb>E4_UA2D>+DR#9X3^h^sL6TjP3)g9a$T2y9_7T_X^TdvlbH4b_ zeA{OP&FspwqJ>&?-a>>$*>E6uc@47XTtoN?wVrKsL~_0}wZ-RRc|AsjLBwn|?qFl0 z5+G_*BuYe~{{``BQei7dK%5U-oINhCTxq(wv0jN9%@5RUy!L-Dly&JiU_op$-jPQ84>o*%s4!M(+< z`=+fxcg^Oa$$9k6=mrk-6=7M-IIgAL%5--?88%y;M8X75hlk8>3N!%m;MGOG7Ivzkz^j93Y+ zB2=~7X*>uRi4y$~XKn+eD6y~b_KmT#;L;)Xp{*Hz8;`Lm>|Yh((uAV7Qd)1ax!5#^ ziVwL$6FH-qzx6_{MX7U6t@@$NO=Q6CJ>2CxHH4ku3|F5yJpegtQ^wBE4Njyq85A^-KA57X@ZU{Tp2hBoF_V|hXPgE#LnCy$GSR$ z-pjb-lxYO}hUEABU-Y?NwNCUs{j}UVLAA#c!lzaV^C+xgvBvsTdL@|7p0w>REy6^h zG`$7-a;QPNXC}f2ThW7(ES^4_5udF$)m`=+HgbMT7cXt4XCYE#lnTeHsaSb}HQ?Pi*0XHg%CFkLjcT{Hqr*b60u^A~&U}lGUFZ0!O z;SGDEGeoEF%mTfHN6844N(8kdag8jUQhX`JACI>bH5`S}5CnXn#q0T$PG7^WY=Q#y z8j2QtM2{x!=O7`>qMcBtCT&noyu)cMKh1T9Gu@(;?u|ER{Y>Qk5gz__qKf;}aC({9 z4%5dGjj3=co`_midhO3(H#poT zZW3N_SnObJk>#el4`awpYwIVTgl1%ju&`Q@tS3+OfPgQ?v5AMTjHALQI$5ZinwVO6Em(H zHpjSD)Gd6FF4<9iMi0SBW${DrrW614T&Bh+`_8pUy444(ddqm<21szxD%h>mMVZwB z+mB@bp2n`eE!kj=K^%(hCQ=*YAi|{dltjl12ZM4YOQ*~l2k^Rn&TQFf zoPsSqr!re8&v}RYRc*BcIE-k?7n>p-z$G2*ed>k?O|9L)xq!n`Xv`CSMsEJUDB?GRu=o>~9gwD;&J`9r!cRW|H%u zz{4-twJ}(Sq;?h7mUrXfJ`imnG~#wlQ}-m4v7)r#SKu6%2w^k)BXxJp)`k7&9WC1H z`27Pd`goG8)Er7ugR0tWeQKUzD5_p^iFaNcMk#|C@mFaZ&fIs`CoPH7tN|fcEjsU= z*;C3bVutv}Ze7bI&Pt5t!Lf##uz3ezKIhZ#b!JMW*^Gp&yY1-iL6WW=9NV3ps*?@e z?L>G3d}^4U@#-=pvQwm6-1DxesNj)m`vXO~pI`R+@Hx)>bcDJ1ja*Q5u2oAUxytcT zrtC4C6sNP{!Vi2=xBHrErojQcN0$Q#euCqH1S!*|EN{h4N;&Skt$#eq_e=AJAINCq z+io=VwQV1Nkc-y~f7*RRwVF}S_a=V--qYswu^*pQLIrLI^EOj(S2Z~&ZzwH^zaHfg zw@jkpDhk|vw?L4<^Hj{V?X$$t8(yQ!?hFw>ljiT)25>P6eSHalYO zE*|9420Ud*fzMLPC1Myu`Qj7$!!LEyNvH*j|^?OR?|fTyby19bhd;g_A)j^piJE{0E#b+2;x!T0iqv*?9?R>cVx{>XJu z%~B6%;p{>lKi*$Xj3j8y7uVPw1z{qoGu)r=Cu`y67UCEW9}Xc#lCgorb^U+GYpeMz};u;j0kDW3s82#fLCfvbwF*t65oI4J^CJY z9i`W;uOln{U%50@Lpvc>K&TM=ert$ET&u zZuo3%ZP82lJtSk5N_~MjIwjA(yr6TLqOHaPSS9D+IcL2$JqFZ{+s*`mQ}XX4Xbq(` zgD8`FCf70axT9ZpJEjB`>~9lLwU>6^BJ60U|5?&ed=3cP>iP0SDZTwmjA4FDOUs1& zvzug-_&`i5Y-Z=fPO6!Q8-@~eRSa{P1yHfYEUWqAPkNpQd2M#CBP%h0@#x1+gped5DkUhi@+Y#VO|ICLf5R zojgoqo`ZU@qr?0skK$h$7_dxVwlywlVJ8~-xSrU<^-Z1`vr0+<)z20Np0*+SGC?jF^SWgsu zLLF85JmhG0s4nBMp`qdZZ-;V2A7KrTU+4_1R#p(p>y^P9ENQqtvS?i%&`A=r|Lmww z8vrx&rxmgv=fA(D{51otI-*v*mw_DH4U1@H9#_9}p^0kTC8Wg)gJPe}t3$ntc?j&p zrZMz!-p--_WA@+y=0rj>C%qoCzupB zOAUtnYFJA7x940WrZAzQp};w5z!9~&Fna(w66ey(Zoe!bXI$`AaBo?X<59~gW)>fP z)bofjkkbIx*0F!lOT!$|IFbdF92$s%&tkg|1dR?$2bw#NjpVXWI}xT%5MV*B1mlyw z(E&HcOVKN^E4wGKv(0LK6c#o|z|4%{!zpsyqzf{(GU>DIODo;JPJ)<~d7LCJts4A9 zeo3;{%@hOlV$uoc#{t+B<~`Tv9oQU=VKe6aSJ--2O3=0^e!XcM_QsA*@k_9w3|uz| z-}Q(p$Gxm!f^gL@Oj}&k0v@@^aw0L2t`P$%!A7(?1ChfG!|}u;nAcV4t%TU|`eyd| z;FG}Ko4+~qVz!3EVrFmZ#rhdC^|pH~Mmj_u;4tJ%; zJrn=@F|VnqF&)g5v9+^nYuZ747#@DHapb-+u0OD~!C8c5eXSctuX{qD9}IARBeWjM zmjCQ8{9G6Qh}?9(ha9cuqiAP$7uvdT1`+E+bey)XZkM4(8wR{q8u_Rl5{dvTe;`(Z zhn$~Z6_{a)v7M;97NXvGlz+DJ(tCk8-GD$C@gutVGNUF96BE|4Qa!zlBYl|I(OE7Q zc54I3asxnjac1P_ULGTB0f5Uyn5QrKmxkjyT~mRxx_gL07otq^w79rf)5L^4hP&3A z2vUUlAne=WSt*wAntV+itWpd5@JUR}wTjeIN1_-_tJupC*%>9>>VK@4PI}5=t8oGh zk3i8L?Qj*FZehCy1e~RzMB%R3Mzz#NeyP7UKDzF#?%f9`)j7k=l8iabM@TtqRjll< z3+x_gY{-p}xBa6f^I6?-lS)(E4NeOQM^>A)SYceMjWJ*syQ;&z=vj5XPF(hbbz5vfKf#DeOBq z52VA)=(+fzZXhy#nCk!i2>x5VRwvSCcxdbD-1igHgS;=$F0}UJgJbzfjopaPJyf%| zh*Qt0;^>w-G7=EkS|Yw}epVJ%K)I&c zGmbt?&zKE8*F|ieu7Saa-@kt+)lq8^i)wSMSQGd8D=bul15!-Vs~6@Mm!&4h9k$3V zYob<>!IP8SneD&f1{WyL9YKo>uex$}*oW^j2#dt7)QGO1LM@ardy3f)T0h)sNlk|+ z5C;^31=#J(K*`%HS05#haM7!P>!XE}jqb(qRV5j67Xuv+kt^-th zXX3XoDFq(VF4<(Q#01{AR(TP9S_wm|=rQBjRvauFxcfc9Y7N98V1EUo5O5$MzZ`QC zvPrkWtqY5N;(H7L`v(W5R#8z=_Z|7zi8M&-`KHu|5o&9bU#P$`44#R%#i}Co12ywG-D`H7m!JD zak|oiz+-a~3z!V_G5sy7k}OJ;kdWX-S*|5ImZ`}!kJ?7D`=6f+u43$MOvj3J9{$i; zeT~a=gZ~y9V;_m_vI4Q0(CaeW=_8~uj2UqGO&UJ(0z5mecKLa?|KWw3=TW?Txuz{u zPKBG*a^IKMFxl3_1;E<;@6QBqdm}i2G(6CRQxVo5ZIWyv^uS>aW0$g$H9 z57U_em!}|D-*Cx9kU`3+(uvm^ai5j$o}MYK`5lXUuNv1`AI2tX!@2suNX<+DDWhX! z4aLZX3Oi}VVfFY$Xp&6*$zpt8PkSN;fBsbZl$dA%EiWbA;ty?H3lQ{=$fpPpBwY_9 zGCo}W>vlY4vq(8DEI#7=f>qot9~jXD_m`GdMb@HBkXq6>n~ez3%r)r4Ig8|xo7i2K z&_``KT9Ytov!5%?M;tlcpThdCe}1I zjxH)HdRLbc8@LNXVnbE=B}vg^u@~duA6eafLjY#z5D>gh@b$LQ1k_D=Ny%Z#5$7o2 zrOVzb{qYelw)8Lu#W-~C-y|mR>0)1@IVz}xuHKrkCbYtUdcy$o>&_CPS+<9f0zRw& zt0QjrBA|~%ZHTOew#>{OeJ3CHG(s*-(rD`Ffbt7PlDVhyA~$0>q{nwoFe>W@hdNgR z+cRjS;xA#Uh#kb)uQ-{>k_Xyzs_NEsqASe8vKklcnGKuf3k6iDh*L9Kp`?A`T(MEctN#{xh)es(y97kdVhOz`i@ zN={`ZCFEr8`}RSnJ1=mWC$HsyeOLb5O#nclDDeBb zdU6OP*8h&f=HlHuUThLhGJt8<6B2cW>V|?f9k3n$lX_~J;e{nD?B4+@sL0{h+s%Uy zlEv&_K7XShr=_p|et&;IB>X$&#snhP@B%t2|E-OG_K|{$ryMMsrho*tg+qbUWje{{ z3MoNNR|lo<-%bDL2;?>tQn9~$oQy_SQ%jWL9@V5L=!JpSyNq{pIlW zTpc0`ii*A;u8p)u=<4Wjj$Y^^GuBvt$Id}@3yWiRxYe%)!q8EtW)BGg=j(S6vp|;^(L92?mTpZM`HI{+4vM9+bJ*3IHf+Tfhn(5-b)WFF(f}$1CxJ7bx|TP-Pjhbdyq&m0pyXg42NHg0m&qeg zJ@sLrhP5|(*UZw&suF^^7H#;G1PxnJ({}T%fzgglu%yh{^W*JVrXgQZe)QVC{und* zPBJD_*2P+Jr+gx6F4M^hvuFo!a%#uu}CCK z)}OGIU=yK=)B7aU5e1~XKmIv+;QxN~o{1$KIr}bpBtLe4Et#^KkS5_7X0%dva`QCT zIHS=ul+f_z-L|>2(F8u9i%0=4v@rHl1vv7|L_E8!tj$O2EMj}2+1NSegcI{L8#21M zKxlBlLPP7q`1Zv1#ot8uadwcIx!KBEM&}Ie+hIj+vzdG_Ut&L{K+iJ^<xL%PH-gLS((?AV*3U9vGk^-#oL(NI|Z69aK3sho}-kd_b=F$pXA}7Z1=BU zohAC!005%fS&wAk`5(M?&^59*3fQB+Fug_D;oe^Kn4J!ak=e^VFY9|}c zIi1Rt=H$s>uR4Il1RvSj?Aw`O(?>Nn;`br4t4~fIw=OrKj<4dP-pWC#j9-eKdFo(b zlLOqU>NxaG#*bXq51LF}v93D!tC?88a~D&F1!rP_cq^&GBEf#=9}%=b!11vMnEK6C z;qJF|P1@MH?G#uDVlU z@)7WY)qkVp%8~XJY!A)f-HkIat)UOua+q4SZQ-my2+_FxzKV>hV~{p-A-!VLF$WL@^W{6>HrRRWe1V|~;< z!Sc1i`TO^8K}ksscP?DADh^ zYh}7b+jZ|CUUU?>aMu3zNxH=1nXTSFKJjOxm^kIR*0*94iq##0li{)~7d93?rYnVCtOz{d)}%LjKQ0ufHunS3?`Y($>lc&pYF!zx91KEd3A8C5ZO zy?GS_PTY{3ID?sZJYoFYOd0>#OdDr6H)E& z%RFH0{g;-6QIrtaU5ZyXKU^J}thOPqs;-t5xZ%eduSYh{k|A8>(ppR4aSJhn=;Obr z>mApPo{87Tbf30w>;)U_w*G2Q54O@W{NV2ZcI{LOzE!^3sya&G*uekv3SUxm;%&vI zdGw|EouY`a{rA+7yLV`9Zc%k2n{3VQ>xzPwB z^C5xD7KQ;{D`}qQ!j*ccF1ap_74q`LsEU-xd(0L6WoOsp#?kud6x+8LW640xKq-H{ z=sA$97wT|sCI3}Laas2-wf0*K$rO>pPuk0va(@IX4#ZSD-yUjDjyb2NL-bD_xBk@Qkj;SRl0K5xVYq?|>c zpBM=`{;nZna%jK3?R7%0q@)C(Bb}jKz;SzBF_yZ^TT%}6O4+B<*y#OU!P4jDbyiuc ztE=y1)3Bb3w>rtm1TJ%XFP$$OaRh!+m&KRxKb2&OHW7ZkNdHsMl?ps`M0{|26CDBR zszGsGc@rYWH^enn!?2%Z%sAY9>^Kw3G;7&cvr(b8j*jv@`ZjE5o-5{7XZ+*#$lgnq z-_z53P_K(w;kUj+(zn}^Fk5bOwQcBN=S%>k;?3v09l+~biQ9!tR>!*q4!aA?5qd~$ z0xOAVo_@UCB<3&Jo5=ANSzcj%fl1Iq_%$3Mjy87M_y6|pwXXH1$8#_6(W_n)l%mrWIAMonM@1eYp}Y@d%NGr2huU?pZR9)w`Ecm^ftoi*A0$Q zwOl+#0@$0&3IwF~4c)rt!fo$J2h%UB#V-S8v3~aUYJ!kQ-Y-?*4?xLT1oKRtrrf)y z8|BEkjg7zoj)h2(Ulqi@_=f(EG_*si=rd4mBdS0El38-Kj@dWJ9)I1LsKzn@ zKraB^rf4C0HbbBXd7qHoMUw*L56FJ?5Z+5W!tvg1BVd`mR284arJ=R+%vd)?H zcx##fc=M#pxaD^voGQiS50OK_SD~YN)j$6b#l8XNzDfy9n^&PSAaZzA) z*Pq-Eh*a{!IE7nn{o<&|v0_~gadA2rW+>*`*8e#7R93zL+2`|jTwwcW++T}yJ8yf$ z?3IatOZ)A|$bnTzGq$gf6?4oX=VGk~mRHD}k_Wh<l<$T)c(`gm)Pfk`i)T z9Zb5aO+i7s_8pv~@$7g<**$aipp&Aa$%PA$yYPEDJB@w{q}d$%T?}T)%4kz}d7@5V zSw28^n2UX9Gk*IDC3P&oaOVsiUz(wUXjs2-|MeH=%YjVhW2+~HL(-z~fIsshCeNCw zuT?W}9n#KVm>ls}8|e5Lfl))@6YchkF#bAUY9aIlcjji>TeIPFDQveMyA>$lb_=PX z7Ev%T*}Nrpa;Ybt+F#kwtAO|gzA`$rYMnP#f%@>}eYb6Fi^Q^}B;^+{iqlFr{Ig?JrmzBjXE z;Cn^p1%&aW7b0r9B-o<9RZNWD33A$aAcB?zFhVW<-O(2JKXLj8Jk?a1}^768A zU0h-!L94i#I0Q{i!boE)>F=A%O}a~_qr=S~Jt2cYEEknIBYqnMS%ofGw*Px1Zb1qH z1xd#Ak3ct-cu@Nq2Zuy%S;1Eh8_2I);&QCS{w-NzdDG|teXqp(>udJvQ=dw#a$uJ7#;W%OQYvL*THuPu~zzS?nqDFaP9u zqj-;>xY|6*dA2j0%6G(P-18+Y@6C1HuUcWtt(Stk1Pgbd7-&fb0;48;&F;i-7%noc zJuX45K!B+A+A%CQmI&Kv5eFCqLDnwaa+bG8#4c~vy8evl3j9FFu(r>WdM-lu?nYOo ziTU%ZAS?)M@gtb?@s8NQfVzS|!qqf{0f1=sI+-A#cU#^<=I&)#BY1Ami0G_uLUaaf zkeMn^Oq6Y8JRA-YseUX}RZPhpE!t3amEzg?hulOeD!dLBf@&5S2i-5u7zaACm2dt* zXo}AxIz@~oSeqA|W+c2=w=c|D@tx}>IN4k6)PH>)A0N*wAEP;i`DP3&ORB8e7gNnB!HbucA0BLS z&DUVzj(EmP!^Lxu+1X%|x``_%hQ&yUh1FOx`i>pa!6LmTolZ{h={ zCAw|SJE?L=Z=Z0!N9Z3nZe`+4d|H^_b_M{t6{CRb7ZEx!_1WOa`Hw^7UdCjYE)dEaR-_DjhJqjGZ#U@ib4dx8bHN^UPz)9= z(3MB!U5RkquSSM1esQN>Yy6-lYji;gw64k+d0EfOC7Zn3h`40 z*IgBFZ{)vO!CY%sCx6FMlzwl^R_XO*x{kJ%Px{-o*FHbk%2JQ)PX<$=hui+u&?Mgo>S)2epdmj~_phgv^4D^h``*AO>k8Be5NgDodSG*&a3y?5~Y@Zm$H{e*xYW-b3d6wBX9m-^@Y z3f_IR=p86Rg`6E89)34bSt{TN?PGzDG}wC+i@-qp$r*}TG;_hL1j zDt~(Np9-5=`2W6~w?mzou$^524^aeO?WF(S>G`O4U&2~j4)YBnQ(?)LMXGrtmR~Np zk(bhPjbs}qsuu+$6w;GQ>iOYMLy8aGe0b#Q|IY{T|5h}hEdm3cV3IA}%mf>D9Mfzu zZF(r9ivq1or>LVFp#~NgPZ!4ZkQ()3j-*+y&vqipYhQALJbi+iTuLx^OQ(fY`p)#~e13tS344^~wxb9Z+!E|sMD z6aVp@l>eANvug@;d$y^RSeC&K_rYih3VC>~`^859JNNX55AoV()5rd(L@*gsFX^jC!yJ z3}n9x)iiKw#1TVtnHBZ*^mur9wocpL12xahpe&5*{%~4uwsm)kU$u2-zv~Q_9Cuu! z#)9Z5hk}&P|wWqFvM2RV8Ns z6MOuPE;28#q)YgkUvxE3Csuuces7Czw=X@$dnjLVD@`ak&vl)bdxxoTR{4n zfPDXsL}-?j2Q9@p5irvXT$7dZ?84GtoT~F#jhw+7CXGzQG(OEHx^!X^7aCZ0 zUN{!yXR&L;QnldDm8%j~(idB3s32)_SELo<*7yT%doHqdnlQAN@07wa53rwa=FeDy9P&x)(Zf@@Q#`S4WpPo?G266sFQHCkH`_N~m zh6`8h;rT_CeXXgXf$FqJGKlzy4nsM--TnPhcH#f-(^^ml*3Zs~xj`jMS-v>R=cYOL zR;9tT$D2;$57eAp4To!V!!(h=%Jp#5v-881=o~f zXl!fhP}kh|&IGy>``^Y!&_qp#zIUJIDCYgPe60F;t@mhaquc6<(kVy4QGD?LB++Vz zkE#F1&Hz%f*-HF7y~D^7omL?pE- zFE<~kcQcvf7P{{7#|neQLoBOX>|tr~rNaphgAH%)*>PBl6wL)~5tw0c@crM5hrlzs zz~EBaC!YZ9#+1Fkmm4Z^%0qd>!ZI#cg1fkyaod(H5x~a%UTI-99|nfkh6R-h-%cHk zNPs3~qdMk?s+}4Oo%++ogg|8{`ypeV$?I5p8H58JCH$Wpgj&Piwq9Is9v7> b&+hl-W~T0|54(W}!Z3Kc`njxgN@xNA&52)m delta 16349 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
`Zh{iaAXPl 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 B=b!)p literal 11376 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