mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2026-08-25 06:06:34 +01:00
Merge pull request #5773 from Neerti/identification_system
Adds Identification System, New Autoinjectors
This commit is contained in:
@@ -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, "<span class='notice'>You've identified \the [holder]'s quality.</span>")
|
||||
if(IDENTITY_PROPERTIES)
|
||||
to_chat(user, "<span class='notice'>You've identified \the [holder]'s functionality as a [true_name].</span>")
|
||||
if(IDENTITY_FULL)
|
||||
to_chat(user, "<span class='notice'>You've identified \the [holder] as a [true_name], and its quality.</span>")
|
||||
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
|
||||
@@ -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
|
||||
@@ -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, "<br>") // 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 <b>[R.name]</b>.<br>[R.description]<br>"))
|
||||
|
||||
to_chat(user, span("notice", "Scanning of \the [I] complete."))
|
||||
analyzing = FALSE
|
||||
update_icon()
|
||||
return
|
||||
@@ -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"
|
||||
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)
|
||||
@@ -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"
|
||||
|
||||
@@ -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, "<span class='notice'>You inject [M] with \the [src].</span>")
|
||||
to_chat(M, "<span class='notice'>You feel a tiny prick!</span>")
|
||||
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, "<span class='notice'>[trans] units injected. [reagents.total_volume] units remaining in \the [src].</span>")
|
||||
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].")
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user