diff --git a/code/game/objects/items/devices/scanners/gas.dm b/code/game/objects/items/devices/scanners/gas.dm new file mode 100644 index 0000000000..ca35911448 --- /dev/null +++ b/code/game/objects/items/devices/scanners/gas.dm @@ -0,0 +1,36 @@ +/obj/item/device/analyzer + name = "gas analyzer" + desc = "A hand-held environmental scanner which reports current gas levels." + icon_state = "atmos" + item_state = "analyzer" + w_class = ITEMSIZE_SMALL + slot_flags = SLOT_BELT + throwforce = 5 + throw_speed = 4 + throw_range = 20 + + matter = list(MAT_STEEL = 30,MAT_GLASS = 20) + + origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) + +/obj/item/device/analyzer/atmosanalyze(var/mob/user) + var/air = user.return_air() + if (!air) + return + + return atmosanalyzer_scan(src, air, user) + +/obj/item/device/analyzer/attack_self(mob/user as mob) + if (user.stat) + return + if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey") + to_chat(usr, "You don't have the dexterity to do this!") + return + + analyze_gases(src, user) + return + +/obj/item/device/analyzer/afterattack(var/obj/O, var/mob/user, var/proximity) + if(proximity) + analyze_gases(O, user) + return \ No newline at end of file diff --git a/code/game/objects/items/devices/scanners/halogen.dm b/code/game/objects/items/devices/scanners/halogen.dm new file mode 100644 index 0000000000..f2f302c334 --- /dev/null +++ b/code/game/objects/items/devices/scanners/halogen.dm @@ -0,0 +1,20 @@ +/obj/item/device/halogen_counter + name = "halogen counter" + icon_state = "eftpos" + desc = "A hand-held halogen counter, used to detect the level of irradiation of living beings." + w_class = ITEMSIZE_SMALL + origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 2) + throwforce = 0 + throw_speed = 3 + throw_range = 7 + +/obj/item/device/halogen_counter/attack(mob/living/M as mob, mob/living/user as mob) + if(!iscarbon(M)) + to_chat(user, "This device can only scan organic beings!") + return + user.visible_message("\The [user] has analyzed [M]'s radiation levels!", "Analyzing Results for [M]:") + if(M.radiation) + to_chat(user, "Radiation Level: [M.radiation]") + else + to_chat(user, "No radiation detected.") + return \ No newline at end of file diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners/health.dm similarity index 70% rename from code/game/objects/items/devices/scanners.dm rename to code/game/objects/items/devices/scanners/health.dm index 08952cb094..ae2683ede0 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners/health.dm @@ -1,15 +1,4 @@ #define DEFIB_TIME_LIMIT (10 MINUTES) //VOREStation addition- past this many seconds, defib is useless. -/* -CONTAINS: -T-RAY -DETECTIVE SCANNER -HEALTH ANALYZER -GAS ANALYZER - Analyzes atmosphere, container -MASS SPECTROMETER -REAGENT SCANNER -HALOGEN COUNTER - Radcount on mobs -*/ - /obj/item/device/healthanalyzer name = "health analyzer" @@ -335,214 +324,4 @@ HALOGEN COUNTER - Radcount on mobs origin_tech = list(TECH_MAGNET = 7, TECH_BIO = 8) icon_state = "health3" -/obj/item/device/analyzer - name = "analyzer" - desc = "A hand-held environmental scanner which reports current gas levels." - icon_state = "atmos" - item_state = "analyzer" - w_class = ITEMSIZE_SMALL - slot_flags = SLOT_BELT - throwforce = 5 - throw_speed = 4 - throw_range = 20 - - matter = list(MAT_STEEL = 30,MAT_GLASS = 20) - - origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) - -/obj/item/device/analyzer/atmosanalyze(var/mob/user) - var/air = user.return_air() - if (!air) - return - - return atmosanalyzer_scan(src, air, user) - -/obj/item/device/analyzer/attack_self(mob/user as mob) - if (user.stat) - return - if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey") - to_chat(usr, "You don't have the dexterity to do this!") - return - - analyze_gases(src, user) - return - -/obj/item/device/analyzer/afterattack(var/obj/O, var/mob/user, var/proximity) - if(proximity) - analyze_gases(O, user) - return - - -/obj/item/device/mass_spectrometer - name = "mass spectrometer" - desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample." - icon_state = "spectrometer" - w_class = ITEMSIZE_SMALL - flags = OPENCONTAINER - slot_flags = SLOT_BELT - throwforce = 5 - throw_speed = 4 - throw_range = 20 - - matter = list(MAT_STEEL = 30,MAT_GLASS = 20) - - origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) - var/details = 0 - var/recent_fail = 0 - -/obj/item/device/mass_spectrometer/New() - ..() - var/datum/reagents/R = new/datum/reagents(5) - reagents = R - R.my_atom = src - -/obj/item/device/mass_spectrometer/on_reagent_change() - if(reagents.total_volume) - icon_state = initial(icon_state) + "_s" - else - icon_state = initial(icon_state) - -/obj/item/device/mass_spectrometer/attack_self(mob/user as mob) - if (user.stat) - return - if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey") - to_chat(user, "You don't have the dexterity to do this!") - return - if(reagents.total_volume) - var/list/blood_traces = list() - for(var/datum/reagent/R in reagents.reagent_list) - if(R.id != "blood") - reagents.clear_reagents() - to_chat(user, "The sample was contaminated! Please insert another sample") - return - else - blood_traces = params2list(R.data["trace_chem"]) - break - var/dat = "Trace Chemicals Found: " - for(var/R in blood_traces) - if(details) - dat += "[R] ([blood_traces[R]] units) " - else - dat += "[R] " - to_chat(user, "[dat]") - reagents.clear_reagents() - return - -/obj/item/device/mass_spectrometer/adv - name = "advanced mass spectrometer" - icon_state = "adv_spectrometer" - details = 1 - origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2) - -/obj/item/device/reagent_scanner - name = "reagent scanner" - desc = "A hand-held reagent scanner which identifies chemical agents." - icon_state = "spectrometer" - item_state = "analyzer" - w_class = ITEMSIZE_SMALL - slot_flags = SLOT_BELT - throwforce = 5 - throw_speed = 4 - throw_range = 20 - matter = list(MAT_STEEL = 30,MAT_GLASS = 20) - - origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) - var/details = 0 - var/recent_fail = 0 - -/obj/item/device/reagent_scanner/afterattack(obj/O, mob/living/user, proximity) - if(!proximity || user.stat || !istype(O)) - return - 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 " + span("notice", "[R][details ? ": [R.volume / one_percent]%" : ""]") - if(dat) - to_chat(user, span("notice", "Chemicals found: [dat]")) - else - to_chat(user, span("notice", "No active chemical agents found in [O].")) - else - to_chat(user, span("notice", "No significant chemical agents found in [O].")) - - return - -/obj/item/device/reagent_scanner/adv - name = "advanced reagent scanner" - icon_state = "adv_spectrometer" - details = 1 - origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2) - -/obj/item/device/slime_scanner - name = "slime scanner" - icon_state = "xenobio" - item_state = "xenobio" - origin_tech = list(TECH_BIO = 1) - w_class = ITEMSIZE_SMALL - throwforce = 0 - throw_speed = 3 - throw_range = 7 - matter = list(MAT_STEEL = 30,MAT_GLASS = 20) - -/obj/item/device/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob) - if(!istype(M, /mob/living/simple_mob/slime/xenobio)) - to_chat(user, "This device can only scan lab-grown slimes!") - return - var/mob/living/simple_mob/slime/xenobio/S = M - user.show_message("Slime scan results:
[S.slime_color] [S.is_adult ? "adult" : "baby"] slime
Health: [S.health]
Mutation Probability: [S.mutation_chance]") - - var/list/mutations = list() - for(var/potential_color in S.slime_mutation) - var/mob/living/simple_mob/slime/xenobio/slime = potential_color - mutations.Add(initial(slime.slime_color)) - user.show_message("Potental to mutate into [english_list(mutations)] colors.
Extract potential: [S.cores]
Nutrition: [S.nutrition]/[S.max_nutrition]") - - if (S.nutrition < S.get_starve_nutrition()) - user.show_message("Warning: Subject is starving!") - else if (S.nutrition < S.get_hunger_nutrition()) - user.show_message("Warning: Subject is hungry.") - user.show_message("Electric change strength: [S.power_charge]") - - if(S.has_AI()) - var/datum/ai_holder/simple_mob/xenobio_slime/AI = S.ai_holder - if(AI.resentment) - user.show_message("Warning: Subject is harboring resentment.") - if(AI.rabid) - user.show_message("Subject is enraged and extremely dangerous!") - if(S.harmless) - user.show_message("Subject has been pacified.") - if(S.unity) - user.show_message("Subject is friendly to other slime colors.") - - user.show_message("Growth progress: [S.amount_grown]/10") - -/obj/item/device/halogen_counter - name = "halogen counter" - icon_state = "eftpos" - desc = "A hand-held halogen counter, used to detect the level of irradiation of living beings." - w_class = ITEMSIZE_SMALL - origin_tech = list(TECH_MAGNET = 1, TECH_BIO = 2) - throwforce = 0 - throw_speed = 3 - throw_range = 7 - -/obj/item/device/halogen_counter/attack(mob/living/M as mob, mob/living/user as mob) - if(!iscarbon(M)) - to_chat(user, "This device can only scan organic beings!") - return - user.visible_message("\The [user] has analyzed [M]'s radiation levels!", "Analyzing Results for [M]:") - if(M.radiation) - to_chat(user, "Radiation Level: [M.radiation]") - else - to_chat(user, "No radiation detected.") - return - #undef DEFIB_TIME_LIMIT //VOREStation addition diff --git a/code/game/objects/items/devices/scanners/mass_spectrometer.dm b/code/game/objects/items/devices/scanners/mass_spectrometer.dm new file mode 100644 index 0000000000..fee41eb880 --- /dev/null +++ b/code/game/objects/items/devices/scanners/mass_spectrometer.dm @@ -0,0 +1,60 @@ +/obj/item/device/mass_spectrometer + name = "mass spectrometer" + desc = "A hand-held mass spectrometer which identifies trace chemicals in a blood sample." + icon_state = "spectrometer" + w_class = ITEMSIZE_SMALL + flags = OPENCONTAINER + slot_flags = SLOT_BELT + throwforce = 5 + throw_speed = 4 + throw_range = 20 + + matter = list(MAT_STEEL = 30,MAT_GLASS = 20) + + origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) + var/details = 0 + var/recent_fail = 0 + +/obj/item/device/mass_spectrometer/New() + ..() + var/datum/reagents/R = new/datum/reagents(5) + reagents = R + R.my_atom = src + +/obj/item/device/mass_spectrometer/on_reagent_change() + if(reagents.total_volume) + icon_state = initial(icon_state) + "_s" + else + icon_state = initial(icon_state) + +/obj/item/device/mass_spectrometer/attack_self(mob/user as mob) + if (user.stat) + return + if (!(ishuman(user) || ticker) && ticker.mode.name != "monkey") + to_chat(user, "You don't have the dexterity to do this!") + return + if(reagents.total_volume) + var/list/blood_traces = list() + for(var/datum/reagent/R in reagents.reagent_list) + if(R.id != "blood") + reagents.clear_reagents() + to_chat(user, "The sample was contaminated! Please insert another sample") + return + else + blood_traces = params2list(R.data["trace_chem"]) + break + var/dat = "Trace Chemicals Found: " + for(var/R in blood_traces) + if(details) + dat += "[R] ([blood_traces[R]] units) " + else + dat += "[R] " + to_chat(user, "[dat]") + reagents.clear_reagents() + return + +/obj/item/device/mass_spectrometer/adv + name = "advanced mass spectrometer" + icon_state = "adv_spectrometer" + details = 1 + origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2) \ No newline at end of file diff --git a/code/game/objects/items/devices/scanners/reagents.dm b/code/game/objects/items/devices/scanners/reagents.dm new file mode 100644 index 0000000000..8310d13fab --- /dev/null +++ b/code/game/objects/items/devices/scanners/reagents.dm @@ -0,0 +1,46 @@ +/obj/item/device/reagent_scanner + name = "reagent scanner" + desc = "A hand-held reagent scanner which identifies chemical agents." + icon_state = "spectrometer" + item_state = "analyzer" + w_class = ITEMSIZE_SMALL + slot_flags = SLOT_BELT + throwforce = 5 + throw_speed = 4 + throw_range = 20 + matter = list(MAT_STEEL = 30,MAT_GLASS = 20) + + origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2) + var/details = 0 + var/recent_fail = 0 + +/obj/item/device/reagent_scanner/afterattack(obj/O, mob/living/user, proximity) + if(!proximity || user.stat || !istype(O)) + return + 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 " + span("notice", "[R][details ? ": [R.volume / one_percent]%" : ""]") + if(dat) + to_chat(user, span("notice", "Chemicals found: [dat]")) + else + to_chat(user, span("notice", "No active chemical agents found in [O].")) + else + to_chat(user, span("notice", "No significant chemical agents found in [O].")) + + return + +/obj/item/device/reagent_scanner/adv + name = "advanced reagent scanner" + icon_state = "adv_spectrometer" + details = 1 + origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2) \ No newline at end of file diff --git a/code/game/objects/items/devices/scanners_vr.dm b/code/game/objects/items/devices/scanners/sleevemate.dm similarity index 99% rename from code/game/objects/items/devices/scanners_vr.dm rename to code/game/objects/items/devices/scanners/sleevemate.dm index 1722617106..5308e2c842 100644 --- a/code/game/objects/items/devices/scanners_vr.dm +++ b/code/game/objects/items/devices/scanners/sleevemate.dm @@ -300,4 +300,4 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob if(stored_mind) icon_state = "[initial(icon_state)]_on" else - icon_state = initial(icon_state) + icon_state = initial(icon_state) \ No newline at end of file diff --git a/code/game/objects/items/devices/scanners/slime.dm b/code/game/objects/items/devices/scanners/slime.dm new file mode 100644 index 0000000000..adcdce06a0 --- /dev/null +++ b/code/game/objects/items/devices/scanners/slime.dm @@ -0,0 +1,42 @@ +/obj/item/device/slime_scanner + name = "slime scanner" + icon_state = "xenobio" + item_state = "xenobio" + origin_tech = list(TECH_BIO = 1) + w_class = ITEMSIZE_SMALL + throwforce = 0 + throw_speed = 3 + throw_range = 7 + matter = list(MAT_STEEL = 30,MAT_GLASS = 20) + +/obj/item/device/slime_scanner/attack(mob/living/M as mob, mob/living/user as mob) + if(!istype(M, /mob/living/simple_mob/slime/xenobio)) + to_chat(user, "This device can only scan lab-grown slimes!") + return + var/mob/living/simple_mob/slime/xenobio/S = M + user.show_message("Slime scan results:
[S.slime_color] [S.is_adult ? "adult" : "baby"] slime
Health: [S.health]
Mutation Probability: [S.mutation_chance]") + + var/list/mutations = list() + for(var/potential_color in S.slime_mutation) + var/mob/living/simple_mob/slime/xenobio/slime = potential_color + mutations.Add(initial(slime.slime_color)) + user.show_message("Potental to mutate into [english_list(mutations)] colors.
Extract potential: [S.cores]
Nutrition: [S.nutrition]/[S.max_nutrition]") + + if (S.nutrition < S.get_starve_nutrition()) + user.show_message("Warning: Subject is starving!") + else if (S.nutrition < S.get_hunger_nutrition()) + user.show_message("Warning: Subject is hungry.") + user.show_message("Electric change strength: [S.power_charge]") + + if(S.has_AI()) + var/datum/ai_holder/simple_mob/xenobio_slime/AI = S.ai_holder + if(AI.resentment) + user.show_message("Warning: Subject is harboring resentment.") + if(AI.rabid) + user.show_message("Subject is enraged and extremely dangerous!") + if(S.harmless) + user.show_message("Subject has been pacified.") + if(S.unity) + user.show_message("Subject is friendly to other slime colors.") + + user.show_message("Growth progress: [S.amount_grown]/10") \ No newline at end of file diff --git a/vorestation.dme b/vorestation.dme index 22be04cbfc..eff045b2e7 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1257,8 +1257,6 @@ #include "code\game\objects\items\devices\paicard_ch.dm" #include "code\game\objects\items\devices\pipe_painter.dm" #include "code\game\objects\items\devices\powersink.dm" -#include "code\game\objects\items\devices\scanners.dm" -#include "code\game\objects\items\devices\scanners_vr.dm" #include "code\game\objects\items\devices\spy_bug.dm" #include "code\game\objects\items\devices\starcaster_ch.dm" #include "code\game\objects\items\devices\suit_cooling.dm" @@ -1295,6 +1293,13 @@ #include "code\game\objects\items\devices\radio\radio_vr.dm" #include "code\game\objects\items\devices\radio\radio_yw.dm" #include "code\game\objects\items\devices\radio\radiopack.dm" +#include "code\game\objects\items\devices\scanners\gas.dm" +#include "code\game\objects\items\devices\scanners\halogen.dm" +#include "code\game\objects\items\devices\scanners\health.dm" +#include "code\game\objects\items\devices\scanners\mass_spectrometer.dm" +#include "code\game\objects\items\devices\scanners\reagents.dm" +#include "code\game\objects\items\devices\scanners\sleevemate.dm" +#include "code\game\objects\items\devices\scanners\slime.dm" #include "code\game\objects\items\robot\robot_items.dm" #include "code\game\objects\items\robot\robot_parts.dm" #include "code\game\objects\items\robot\robot_upgrades.dm"