mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-06 15:02:29 +00:00
* Makes flags properly check themselves Byond ref: https://www.byond.com/docs/ref/#/operator/& Basically, flags should use & instead of == We can have more than 1 slot on any item, so it's preferred that we do this instead. Even if it doesn't immediately fix any problems, it's something that should be the standard anyways to prevent it from ever being a problem. Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
88 lines
3.3 KiB
Plaintext
88 lines
3.3 KiB
Plaintext
/// Scan the turf where the computer is on.
|
|
#define ATMOZPHERE_SCAN_ENV "env"
|
|
/// Scan the objects that the tablet clicks.
|
|
#define ATMOZPHERE_SCAN_CLICK "click"
|
|
|
|
/datum/computer_file/program/atmosscan
|
|
filename = "atmosscan"
|
|
filedesc = "AtmoZphere"
|
|
category = PROGRAM_CATEGORY_ENGI
|
|
program_icon_state = "air"
|
|
extended_desc = "A small built-in sensor reads out the atmospheric conditions around the device."
|
|
size = 4
|
|
tgui_id = "NtosGasAnalyzer"
|
|
program_icon = "thermometer-half"
|
|
|
|
/// Whether we scan the current turf automatically (env) or scan tapped objects manually (click).
|
|
var/atmozphere_mode = ATMOZPHERE_SCAN_ENV
|
|
/// Saved [GasmixParser][/proc/gas_mixture_parser] data of the last thing we scanned.
|
|
var/list/last_gasmix_data
|
|
|
|
/// Secondary attack self.
|
|
/datum/computer_file/program/atmosscan/proc/turf_analyze(datum/source, mob/user)
|
|
SIGNAL_HANDLER
|
|
if(atmozphere_mode != ATMOZPHERE_SCAN_CLICK)
|
|
return
|
|
atmos_scan(user=user, target=get_turf(computer), silent=FALSE)
|
|
on_analyze(source=source, target=get_turf(computer))
|
|
return COMPONENT_CANCEL_ATTACK_CHAIN
|
|
|
|
/// Keep this in sync with it's tool based counterpart [/obj/proc/analyzer_act] and [/atom/proc/tool_act]
|
|
/datum/computer_file/program/atmosscan/tap(atom/A, mob/living/user, params)
|
|
if(atmozphere_mode != ATMOZPHERE_SCAN_CLICK)
|
|
return FALSE
|
|
if(!atmos_scan(user=user, target=A, silent=FALSE))
|
|
return FALSE
|
|
on_analyze(source=computer, target=A)
|
|
return TRUE
|
|
|
|
/// Updates our gasmix data if on click mode.
|
|
/datum/computer_file/program/atmosscan/proc/on_analyze(datum/source, atom/target)
|
|
var/mixture = target.return_analyzable_air()
|
|
if(!mixture)
|
|
return FALSE
|
|
var/list/airs = islist(mixture) ? mixture : list(mixture)
|
|
var/list/new_gasmix_data = list()
|
|
for(var/datum/gas_mixture/air as anything in airs)
|
|
var/mix_name = capitalize(lowertext(target.name))
|
|
if(airs.len != 1) //not a unary gas mixture
|
|
mix_name += " - Node [airs.Find(air)]"
|
|
new_gasmix_data += list(gas_mixture_parser(air, mix_name))
|
|
last_gasmix_data = new_gasmix_data
|
|
|
|
/datum/computer_file/program/atmosscan/ui_static_data(mob/user)
|
|
return return_atmos_handbooks()
|
|
|
|
/datum/computer_file/program/atmosscan/ui_data(mob/user)
|
|
var/list/data = get_header_data()
|
|
var/turf/turf = get_turf(computer)
|
|
data["atmozphereMode"] = atmozphere_mode
|
|
data["clickAtmozphereCompatible"] = (computer.hardware_flag & PROGRAM_TABLET)
|
|
switch (atmozphere_mode) //Null air wont cause errors, don't worry.
|
|
if(ATMOZPHERE_SCAN_ENV)
|
|
var/datum/gas_mixture/air = turf?.return_air()
|
|
data["gasmixes"] = list(gas_mixture_parser(air, "Location Reading"))
|
|
if(ATMOZPHERE_SCAN_CLICK)
|
|
LAZYINITLIST(last_gasmix_data)
|
|
data["gasmixes"] = last_gasmix_data
|
|
return data
|
|
|
|
/datum/computer_file/program/atmosscan/ui_act(action, list/params)
|
|
. = ..()
|
|
if(.)
|
|
return
|
|
switch(action)
|
|
if("scantoggle")
|
|
if(atmozphere_mode == ATMOZPHERE_SCAN_CLICK)
|
|
atmozphere_mode = ATMOZPHERE_SCAN_ENV
|
|
UnregisterSignal(computer, COMSIG_ITEM_ATTACK_SELF_SECONDARY)
|
|
return TRUE
|
|
if(!(computer.hardware_flag & PROGRAM_TABLET))
|
|
computer.say("Device incompatible for scanning objects!")
|
|
return FALSE
|
|
atmozphere_mode = ATMOZPHERE_SCAN_CLICK
|
|
RegisterSignal(computer, COMSIG_ITEM_ATTACK_SELF_SECONDARY, .proc/turf_analyze)
|
|
var/turf/turf = get_turf(computer)
|
|
last_gasmix_data = list(gas_mixture_parser(turf?.return_air(), "Location Reading"))
|
|
return TRUE
|