mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-30 08:37:43 +01:00
[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:
co-authored by
vincentiusvin
parent
3d1d101ee7
commit
63ac8f0f62
@@ -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
|
||||
|
||||
@@ -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 ..()
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user