From 004584cefd0e39497ca2a3804633716cfc0a6273 Mon Sep 17 00:00:00 2001 From: XDTM Date: Tue, 2 Oct 2018 10:29:15 +0200 Subject: [PATCH] [Ready for Review/Testmerge]Adds scanner gates (#39986) * Adds scanner gates * fix * fix * fix2 * fix3 * update! * tgui build --- code/datums/diseases/_disease.dm | 18 ++ code/game/data_huds.dm | 8 +- code/game/machinery/scan_gate.dm | 226 ++++++++++++++++++ .../circuitboards/machine_circuitboards.dm | 6 + code/game/objects/structures/holosign.dm | 17 +- code/modules/jobs/access.dm | 2 +- .../carbon/human/species_types/jellypeople.dm | 2 +- .../research/designs/machine_designs.dm | 8 + code/modules/research/techweb/all_nodes.dm | 2 +- icons/obj/machines/scangate.dmi | Bin 0 -> 2093 bytes sound/machines/scanbuzz.ogg | Bin 0 -> 14626 bytes tgstation.dme | 1 + tgui/assets/tgui.css | 2 +- tgui/src/interfaces/scanner_gate.ract | 13 + 14 files changed, 289 insertions(+), 16 deletions(-) create mode 100644 code/game/machinery/scan_gate.dm create mode 100644 icons/obj/machines/scangate.dmi create mode 100644 sound/machines/scanbuzz.ogg create mode 100644 tgui/src/interfaces/scanner_gate.ract diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 0af4eea8ac53..1d457c186b92 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -160,3 +160,21 @@ affected_mob.diseases -= src //remove the datum from the list affected_mob.med_hud_set_status() affected_mob = null + +//Use this to compare severities +/proc/get_disease_severity_value(severity) + switch(severity) + if(DISEASE_SEVERITY_POSITIVE) + return 1 + if(DISEASE_SEVERITY_NONTHREAT) + return 2 + if(DISEASE_SEVERITY_MINOR) + return 3 + if(DISEASE_SEVERITY_MEDIUM) + return 4 + if(DISEASE_SEVERITY_HARMFUL) + return 5 + if(DISEASE_SEVERITY_DANGEROUS) + return 6 + if(DISEASE_SEVERITY_BIOHAZARD) + return 7 diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 7a341ad69a4a..4b4d4d5015e8 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -91,12 +91,14 @@ //called when a carbon changes virus /mob/living/carbon/proc/check_virus() var/threat + var/severity for(var/thing in diseases) var/datum/disease/D = thing if(!(D.visibility_flags & HIDDEN_SCANNER)) - if(!threat || D.severity > threat) //a buffing virus gets an icon - threat = D.severity - return threat + if(!threat || get_disease_severity_value(D.severity) > threat) //a buffing virus gets an icon + threat = get_disease_severity_value(D.severity) + severity = D.severity + return severity //helper for getting the appropriate health status /proc/RoundHealth(mob/living/M) diff --git a/code/game/machinery/scan_gate.dm b/code/game/machinery/scan_gate.dm new file mode 100644 index 000000000000..da763769fc44 --- /dev/null +++ b/code/game/machinery/scan_gate.dm @@ -0,0 +1,226 @@ +#define SCANGATE_NONE "Off" +#define SCANGATE_MINDSHIELD "Mindshield" +#define SCANGATE_NANITES "Nanites" +#define SCANGATE_DISEASE "Disease" +#define SCANGATE_GUNS "Guns" +#define SCANGATE_WANTED "Wanted" +#define SCANGATE_SPECIES "Species" + + +/obj/machinery/scanner_gate + name = "scanner gate" + desc = "A gate able to perform mid-depth scans on any organisms who pass under it." + icon = 'icons/obj/machines/scangate.dmi' + icon_state = "scangate" + use_power = IDLE_POWER_USE + idle_power_usage = 50 + circuit = /obj/item/circuitboard/machine/scanner_gate + var/scanline_timer + var/next_beep = 0 //avoids spam + + var/locked = FALSE + var/scangate_mode = SCANGATE_NONE + var/disease_threshold = DISEASE_SEVERITY_MINOR + var/nanite_cloud = 0 + var/datum/species/detect_species = /datum/species/human + var/reverse = FALSE //If true, signals if the scan returns false + +/obj/machinery/scanner_gate/Initialize() + . = ..() + set_scanline("passive") + +/obj/machinery/scanner_gate/examine(mob/user) + ..() + if(locked) + to_chat(user, "The control panel is ID-locked. Swipe a valid ID to unlock it.") + else + to_chat(user, "The control panel is unlocked. Swipe an ID to lock it.") + +/obj/machinery/scanner_gate/Crossed(atom/movable/AM) + ..() + if(!(stat & (BROKEN|NOPOWER)) && isliving(AM)) + perform_scan(AM) + +/obj/machinery/scanner_gate/proc/set_scanline(type, duration) + cut_overlays() + deltimer(scanline_timer) + add_overlay(type) + if(duration) + scanline_timer = addtimer(CALLBACK(src, .proc/set_scanline, "passive"), duration, TIMER_STOPPABLE) + +/obj/machinery/scanner_gate/attackby(obj/item/W, mob/user, params) + var/obj/item/card/id/card = W.GetID() + if(card) + if(locked) + if(allowed(user)) + locked = FALSE + req_access = list() + to_chat(user, "You unlock [src].") + else if(!(obj_flags & EMAGGED)) + to_chat(user, "You lock [src] with [W].") + var/list/access = W.GetAccess() + req_access = access + locked = TRUE + else + to_chat(user, "You try to lock [src] with [W], but nothing happens.") + else + return ..() + +/obj/machinery/scanner_gate/emag_act(mob/user) + if(obj_flags & EMAGGED) + return + locked = FALSE + req_access = list() + obj_flags |= EMAGGED + to_chat(user, "You fry the ID checking system.") + +/obj/machinery/scanner_gate/proc/perform_scan(mob/living/M) + var/beep = FALSE + switch(scangate_mode) + if(SCANGATE_NONE) + return + if(SCANGATE_WANTED) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + var/perpname = H.get_face_name(H.get_id_name()) + var/datum/data/record/R = find_record("name", perpname, GLOB.data_core.security) + if(!R || (R.fields["criminal"] == "*Arrest*")) + beep = TRUE + if(SCANGATE_MINDSHIELD) + if(M.has_trait(TRAIT_MINDSHIELD)) + beep = TRUE + if(SCANGATE_NANITES) + if(SEND_SIGNAL(M, COMSIG_HAS_NANITES)) + if(nanite_cloud) + GET_COMPONENT_FROM(nanites, /datum/component/nanites, M) + if(nanites && nanites.cloud_id == nanite_cloud) + beep = TRUE + else + beep = TRUE + if(SCANGATE_DISEASE) + if(iscarbon(M)) + var/mob/living/carbon/C = M + if(get_disease_severity_value(C.check_virus()) >= get_disease_severity_value(disease_threshold)) + beep = TRUE + if(SCANGATE_SPECIES) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(is_species(H, detect_species)) + beep = TRUE + if(detect_species == /datum/species/zombie) //Can detect dormant zombies + if(H.getorganslot(ORGAN_SLOT_ZOMBIE)) + beep = TRUE + if(SCANGATE_GUNS) + for(var/I in M.get_contents()) + if(istype(I, /obj/item/gun)) + beep = TRUE + break + if(reverse) + beep = !beep + if(beep) + alarm_beep() + else + set_scanline("scanning", 10) + +/obj/machinery/scanner_gate/proc/alarm_beep() + if(next_beep <= world.time) + next_beep = world.time + 20 + playsound(src, 'sound/machines/scanbuzz.ogg', 100, 0) + var/image/I = image(icon, src, "alarm_light", layer+1) + flick_overlay_view(I, src, 20) + set_scanline("alarm", 20) + +/obj/machinery/scanner_gate/can_interact(mob/user) + if(locked) + return FALSE + return ..() + +/obj/machinery/scanner_gate/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state) + SStgui.try_update_ui(user, src, ui_key, ui, force_open) + if(!ui) + ui = new(user, src, ui_key, "scanner_gate", name, 600, 400, master_ui, state) + ui.open() + +/obj/machinery/scanner_gate/ui_data() + var/list/data = list() + data["scan_mode"] = scangate_mode + data["reverse"] = reverse + data["nanite_cloud"] = nanite_cloud + data["disease_threshold"] = disease_threshold + data["target_species"] = initial(detect_species.name) + return data + +/obj/machinery/scanner_gate/ui_act(action, params) + if(..()) + return + switch(action) + if("set_mode") + var/new_mode = input("Choose the scan mode","Scan Mode") as null|anything in list(SCANGATE_NONE, + SCANGATE_MINDSHIELD, + SCANGATE_NANITES, + SCANGATE_DISEASE, + SCANGATE_GUNS, + SCANGATE_WANTED, + SCANGATE_SPECIES) + if(new_mode) + scangate_mode = new_mode + . = TRUE + if("toggle_reverse") + reverse = !reverse + . = TRUE + if("set_disease_threshold") + var/new_threshold = input("Set disease threshold","Scan Mode") as null|anything in list(DISEASE_SEVERITY_POSITIVE, + DISEASE_SEVERITY_NONTHREAT, + DISEASE_SEVERITY_MINOR, + DISEASE_SEVERITY_MEDIUM, + DISEASE_SEVERITY_HARMFUL, + DISEASE_SEVERITY_DANGEROUS, + DISEASE_SEVERITY_BIOHAZARD) + if(new_threshold) + disease_threshold = new_threshold + . = TRUE + if("set_nanite_cloud") + var/new_cloud = input("Set target nanite cloud","Scan Mode", nanite_cloud) as null|num + if(!isnull(new_cloud)) + nanite_cloud = CLAMP(round(new_cloud, 1), 1, 100) + . = TRUE + //Some species are not scannable, like abductors (too unknown), androids (too artificial) or skeletons (too magic) + if("set_target_species") + var/new_species = input("Set target species","Scan Mode") as null|anything in list("Human", + "Lizardperson", + "Flyperson", + "Plasmaman", + "Mothmen", + "Jellyperson", + "Podperson", + "Golem", + "Zombie") + if(new_species) + switch(new_species) + if("Human") + detect_species = /datum/species/human + if("Lizardperson") + detect_species = /datum/species/lizard + if("Flyperson") + detect_species = /datum/species/fly + if("Plasmaman") + detect_species = /datum/species/plasmaman + if("Mothmen") + detect_species = /datum/species/moth + if("Jellyperson") + detect_species = /datum/species/jelly + if("Podperson") + detect_species = /datum/species/pod + if("Golem") + detect_species = /datum/species/golem + if("Zombie") + detect_species = /datum/species/zombie + . = TRUE + +#undef SCANGATE_NONE +#undef SCANGATE_MINDSHIELD +#undef SCANGATE_NANITES +#undef SCANGATE_DISEASE +#undef SCANGATE_GUNS +#undef SCANGATE_WANTED +#undef SCANGATE_SPECIES \ No newline at end of file diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 804e56aeafa0..c914a35aee40 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -496,6 +496,12 @@ /obj/item/stack/cable_coil = 2, /obj/item/stock_parts/subspace/filter = 1) +/obj/item/circuitboard/machine/scanner_gate + name = "Scanner Gate (Machine Board)" + build_path = /obj/machinery/scanner_gate + req_components = list( + /obj/item/stock_parts/scanning_module = 3) + /obj/item/circuitboard/machine/pacman name = "PACMAN-type Generator (Machine Board)" build_path = /obj/machinery/power/port_gen/pacman diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index 280f5abf58ad..e6dd73be30c8 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -127,15 +127,14 @@ if(ishuman(mover)) var/mob/living/carbon/human/sickboi = mover var/threat = sickboi.check_virus() - switch(threat) - if(DISEASE_SEVERITY_MINOR, DISEASE_SEVERITY_MEDIUM, DISEASE_SEVERITY_HARMFUL, DISEASE_SEVERITY_DANGEROUS, DISEASE_SEVERITY_BIOHAZARD) - if(buzzcd < world.time) - playsound(get_turf(src),'sound/machines/buzz-sigh.ogg',65,1,4) - buzzcd = (world.time + 60) - icon_state = "holo_medical-deny" - return FALSE - else - return TRUE //nice or benign diseases! + if(get_disease_severity_value(threat) > get_disease_severity_value(DISEASE_SEVERITY_MINOR)) + if(buzzcd < world.time) + playsound(get_turf(src),'sound/machines/buzz-sigh.ogg',65,1,4) + buzzcd = (world.time + 60) + icon_state = "holo_medical-deny" + return FALSE + else + return TRUE //nice or benign diseases! return TRUE /obj/structure/holosign/barrier/medical/attack_hand(mob/living/user) diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm index b03f3ace455c..9d79d6451020 100644 --- a/code/modules/jobs/access.dm +++ b/code/modules/jobs/access.dm @@ -127,7 +127,7 @@ ACCESS_EXTERNAL_AIRLOCKS, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_TELEPORTER, ACCESS_EVA, ACCESS_HEADS, ACCESS_CAPTAIN, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_TECH_STORAGE, ACCESS_CHAPEL_OFFICE, ACCESS_ATMOSPHERICS, ACCESS_KITCHEN, - ACCESS_BAR, ACCESS_JANITOR, ACCESS_CREMATORIUM, ACCESS_ROBOTICS, ACCESS_CARGO, ACCESS_CONSTRUCTION, + ACCESS_BAR, ACCESS_JANITOR, ACCESS_CREMATORIUM, ACCESS_ROBOTICS, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_CONSTRUCTION, ACCESS_HYDROPONICS, ACCESS_LIBRARY, ACCESS_LAWYER, ACCESS_VIROLOGY, ACCESS_CMO, ACCESS_QM, ACCESS_SURGERY, ACCESS_THEATRE, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_MAILSORTING, ACCESS_WEAPONS, ACCESS_MECH_MINING, ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY, ACCESS_MECH_MEDICAL, diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index f6c7007f676a..6b33c7714569 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -1,6 +1,6 @@ /datum/species/jelly // Entirely alien beings that seem to be made entirely out of gel. They have three eyes and a skeleton visible within them. - name = "Xenobiological Jelly Entity" + name = "Jellyperson" id = "jelly" default_color = "00FF90" say_mod = "chirps" diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index d3c43ca9c0a3..4d838c3404d5 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -410,6 +410,14 @@ category = list ("Misc. Machinery") departmental_flags = DEPARTMENTAL_FLAG_ALL +/datum/design/board/scanner_gate + name = "Machine Design (Scanner Gate)" + desc = "The circuit board for a scanner gate." + id = "scanner_gate" + build_path = /obj/item/circuitboard/machine/scanner_gate + category = list ("Misc. Machinery") + departmental_flags = DEPARTMENTAL_FLAG_ALL + /datum/design/board/holopad name = "Machine Design (AI Holopad Board)" desc = "The circuit board for a holopad." diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index b8d7ab7d65b8..771504dcc49e 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -123,7 +123,7 @@ display_name = "Industrial Engineering" description = "A refresher course on modern engineering technology." prereq_ids = list("base") - design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin", + design_ids = list("solarcontrol", "recharger", "powermonitor", "rped", "pacman", "adv_capacitor", "adv_scanning", "emitter", "high_cell", "adv_matter_bin", "scanner_gate", "atmosalerts", "atmos_control", "recycler", "autolathe", "high_micro_laser", "nano_mani", "mesons", "thermomachine", "rad_collector", "tesla_coil", "grounding_rod", "apc_control", "cell_charger", "power control", "airlock_board", "firelock_board", "airalarm_electronics", "firealarm_electronics", "cell_charger", "stack_console", "stack_machine") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 7500) diff --git a/icons/obj/machines/scangate.dmi b/icons/obj/machines/scangate.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e3a8658a17d462082042c1e8a68e26701317c386 GIT binary patch literal 2093 zcmZ`)XH=8f7X4C&UPB8tRP{X&0cp~bNDzVwL5hGw2}+k@Knw^bAiWEY5=02Xh=YY1 zg9ZpH*aiobK{G&#C}tsDAizM#i)-GGH*dZ7~;3pcdvbma9-~6GFmbK0LWuK zFek*FEUs`V3Gq3ek%1MrjtsxRR7_;bX+msrYHU&>01)eb8tssIYN7hW=%KCRql{t} z%ci8;qd=hX`R(8ux~wW!UBp47^Zxnz)S~X9W@vdxUy_4gg3(@W!v<&T*Xu`$DaW;_ z9sVceuCXf@P4;-IYX!}}a`d#Vewti3y06(@!r>2hg|w(7s*jVqM)8#vMQxM34x^C9 z#(+4@Lg(}m&VJdM8_OBLYL%&aiEv>x&t4{aFf)zZ+5UGXj&Oi@rI^5oX5ME2khH^M z(0;_ag_~h#ef@P_FzF#phRu=B%x=75L2|G~mS)B-!|dm*d2}fhQnbl;v+XR)#V|Bl z$WMoQ;dGsf|cs3 zes+=DsKa|$S=-ur2Ee5oX7S-zpnbkR*TxKnve$`nHQ`RPCYjW(uIjwQ24fI)g#t|= z_568smGR)GbD4xS_#~G_ovQ~O!r|ZB0(X3Do~LA?6wZF?7CBxQo}-M2I`7;T1%YD{ z5+cXP$5GNa5n3}XnIf5y)L*c$t7ZJNWsh%zE>d7Q;o>xydL*Y}vmaD@sEx~S&zcm5 z5u^dKuA2M6!EF%Ac?B0Il$qzg!VbH5@>X6r6|zYH_FaEMoB%P?fvAM2MKz(~1RKc{ z+$dX_<|t%?=o29?KsC^q{P81RPPhK>R;=EbC?$SFHGfy{`P7t-=h34pvD?vs^e@;q zbMGM0X_`EF(QNiXhTL+#Xl;NJBC(cB0xAi2vm0@RY@$%Uhu&ZEMx(cfkfrpss36}E z%@fkjGMEzdG;f1*3uc^0s~S^@cIILIrRC)c&wNbuB_EgVT(oKZmd}~)M4D@Ng{hAx zkgy;*-NhFrE!^o)FupsKH@?Fn zNpE5LSeR|t@^lMJnYt?V;UD2HFk*Jd>PBR#CWFHp{;f@F_ZFpKTehk*r&R}ExRI08eR08g)2UcG8|(cYqT zkbKjTFN`^Bowk4JNVx{5OoyIzQ~Qu!=aGpaa?vlbN9C<)b+olhxwJFmUW)|BK zjzG}QKx&RU9Q06CEGb53R9Q#Cb%mNh5tY^6r$wB3eZ6Okf9Tlp6xURzsnnNhD-9X5f@ObkhsgJ3eqVYizGHCr+Q5RrOK|<)f;e zxn=TW&!$nLZgGtlgx_hgf9LguH_Hz;8Xw0snS+4LS8&r4o#m5!4~bbXsEwW7K_<6? zHrE?oisuhqh8LBgoS$giR&&E&q&wv~GXw*lzVYfl=L~+atIfM3_013B`ys_2n%PEqmkKrTS*Htul?56r{3@#gnt{UX65IZkf zI6B4`WzWvW`khR`SlKL-S84$~f^wQCHmI@0W~NJNX{r7dk8lFv-CEfan;{9@X>C0W zTZQ}vzsy}~X$n{N0Rwxz>#Kr;gIVwIk38Y8K3PaJy5bQSp|4l*OnjyM$#AeB$DeGw z#bDg<6HBWLITc(B=hZeeV)G9?_9n=`%Z5k>T2Y4YZOtNMmrDxV6myj#&}9bSGeQSO z=KZhusNT5JK2S6K0l_o~UK6gQFF4MVj%PVv7hTTEdd^X7hu-Z+hF;+r2 z?)*rM29FrM1xUup6QrhtNDb#Js5#a4uiKw&0@ruPRM0uD6x83-Q0LU$Y#_|DTj{TD zm}={QX&mUw_Sk-pq6s#lEtZQHrB|UdVCY~9su<`MoXmjg2iSE>tNuTY{x07`QGs&q z>Pt!2paaq6Y3HLtf5(mw_?Kr|45}*-gXLyNzR6I{;h$Rz6fuTwTttIni;ymp9;Wha z!3I9$KZP@TcUXCJ8}v<_t=Ei};v?SH`)VqiX@iL44bSJz_W6-^2=)uipPaO%tbl#o zZs{g^QuHkpN2+pnI*O#+Tizo1+v4u#j98DmLH3)n$PYB>d$JPp&NcQ*MfYlUiOyp5 zxY-mu?mG=@nt}qx(DW8ER8~ww`@S!5lH{;-Y#)Y{=~5?PD*c*a{bj9gU6>=KX!}qP~Lk+Q>_MzF@DyvDN^|Nj8i%?tD3aCpwY03!I;C;$Ke literal 0 HcmV?d00001 diff --git a/sound/machines/scanbuzz.ogg b/sound/machines/scanbuzz.ogg new file mode 100644 index 0000000000000000000000000000000000000000..10dce346cd82591f8fb53bc7ce75c992e0326b0b GIT binary patch literal 14626 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 ve^*gIbA4c(Cyfbl&I + {{data.scan_mode}} + {{#if data.scan_mode == "Disease"}} + {{data.disease_threshold}} + {{/if}} + {{#if data.scan_mode == "Nanites"}} + {{data.nanite_cloud}} + {{/if}} + {{#if data.scan_mode == "Species"}} + {{data.target_species}} + {{/if}} + {{data.reverse ? "Inverted Scan" : "Regular Scan" }} +