[MIRROR] Reimplements breathedeep's scan into atmozphere. [MDB IGNORE] (#14072)

* Reimplements breathedeep's scan into atmozphere. (#67438)

* AtmoZphere tablet app now has the previous functionality of the BreatheDeep cartridge's scanning ability, meaning you can swap to analyzer mode to analyze with right-click.

* Reimplements breathedeep's scan into atmozphere.

Co-authored-by: vincentiusvin <54709710+vincentiusvin@users.noreply.github.com>
This commit is contained in:
SkyratBot
2022-06-03 14:39:41 +01:00
committed by GitHub
co-authored by vincentiusvin
parent 3d1d101ee7
commit 63ac8f0f62
9 changed files with 106 additions and 12 deletions
+1 -1
View File
@@ -54,7 +54,7 @@
if(SEND_SIGNAL(src, COMSIG_ATOM_ATTACK_GHOST, user) & COMPONENT_CANCEL_ATTACK_CHAIN)
return TRUE
if(user.client)
if(user.gas_scan && atmos_scan(user=user, target=src, tool=null, silent=TRUE))
if(user.gas_scan && atmos_scan(user=user, target=src, silent=TRUE))
return TRUE
else if(isAdminGhostAI(user))
attack_ai(user)
@@ -116,7 +116,7 @@
/obj/item/analyzer/attack_self(mob/user, modifiers)
if(user.stat != CONSCIOUS || !user.can_read(src) || user.is_blind())
return
atmos_scan(user=user, target=get_turf(src), tool=src, silent=FALSE)
atmos_scan(user=user, target=get_turf(src), silent=FALSE)
on_analyze(source=src, target=get_turf(src))
/obj/item/analyzer/attack_self_secondary(mob/user, modifiers)
@@ -127,6 +127,7 @@
/// Called when our analyzer is used on something
/obj/item/analyzer/proc/on_analyze(datum/source, atom/target)
SIGNAL_HANDLER
var/mixture = target.return_analyzable_air()
if(!mixture)
return FALSE
@@ -145,7 +146,7 @@
* Gets called by analyzer_act, which in turn is called by tool_act.
* Also used in other chat-based gas scans.
*/
/proc/atmos_scan(mob/user, atom/target, obj/tool, silent=FALSE)
/proc/atmos_scan(mob/user, atom/target, silent=FALSE)
var/mixture = target.return_analyzable_air()
if(!mixture)
return FALSE
+1 -1
View File
@@ -341,7 +341,7 @@
return TRUE
/obj/analyzer_act(mob/living/user, obj/item/analyzer/tool)
if(atmos_scan(user=user, target=src, tool=tool, silent=FALSE))
if(atmos_scan(user=user, target=src, silent=FALSE))
return TRUE
return ..()
+1 -1
View File
@@ -23,7 +23,7 @@
var/turf/T = get_turf(mob)
if(!isturf(T))
return
atmos_scan(user=usr, target=T, tool=null, silent=TRUE)
atmos_scan(user=usr, target=T, silent=TRUE)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Air Status In Location") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_robotize(mob/M in GLOB.mob_list)
+1 -1
View File
@@ -4,7 +4,7 @@
if(!isturf(target))
return
atmos_scan(user=usr, target=target, tool=null, silent=TRUE)
atmos_scan(user=usr, target=target, silent=TRUE)
SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Air Status") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/fix_next_move()
@@ -77,7 +77,7 @@
return 0
/**
*Runs when the device is used to attack an atom in non-combat mode.
*Runs when the device is used to attack an atom in non-combat mode using right click (secondary).
*
*Simulates using the device to read or scan something. Tap is called by the computer during pre_attack
*and sends us all of the related info. If we return TRUE, the computer will stop the attack process
@@ -1,3 +1,8 @@
/// 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"
@@ -8,18 +13,75 @@
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)
var/datum/gas_mixture/air = turf?.return_air()
data["gasmixes"] = list(gas_mixture_parser(air, "Sensor Reading")) //Null air wont cause errors, don't worry.
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
@@ -8,8 +8,12 @@ import {
import { Window } from '../layouts';
import { Section } from '../components';
export type GasAnalyzerData = {
gasmixes: Gasmix[]
}
export const GasAnalyzerContent = (props, context) => {
const { act, data } = useBackend<{ gasmixes: Gasmix[] }>(context);
const { act, data } = useBackend<GasAnalyzerData>(context);
const { gasmixes } = data;
const [setActiveGasId, setActiveReactionId] = atmosHandbookHooks(context);
return (
@@ -1,10 +1,37 @@
import { BooleanLike } from 'common/react';
import { useBackend } from '../backend';
import { Button } from '../components';
import { NtosWindow } from '../layouts';
import { GasAnalyzerContent } from './GasAnalyzer';
import { GasAnalyzerContent, GasAnalyzerData } from './GasAnalyzer';
type NtosGasAnalyzerData = GasAnalyzerData & {
atmozphereMode: 'click' | 'env';
clickAtmozphereCompatible: BooleanLike;
};
export const NtosGasAnalyzer = (props, context) => {
const { act, data } = useBackend<NtosGasAnalyzerData>(context);
const { atmozphereMode, clickAtmozphereCompatible } = data;
return (
<NtosWindow width={500} height={450}>
<NtosWindow.Content scrollable>
{!!clickAtmozphereCompatible && (
<Button
icon={'sync'}
onClick={() => act('scantoggle')}
fluid
textAlign="center"
tooltip={
atmozphereMode === 'click'
? 'Right-click on objects while holding the tablet to scan them. Right-click on the tablet to scan the current location.'
: "The app will update it's gas mixture reading automatically."
}
tooltipPosition="bottom">
{atmozphereMode === 'click'
? 'Scanning tapped objects. Click to switch.'
: 'Scanning current location. Click to switch.'}
</Button>
)}
<GasAnalyzerContent />
</NtosWindow.Content>
</NtosWindow>