PDA Programs in Loadout (#2287)

* PDA

* Comments

* Update cartridges.yml

* CartridgeLoader: auto-install & disposable fixes

* AstroNav GPS Cartridge (#32194)

* initial commit

* adds astronav cartridge to QM locker

* changes requested in review

* fix merge conflicts

* fixes the statuscontrol disappearing if you eject the cartridge but still have it installed

* fix notificationsenabled on salv pda proto

* fixes lingering statuscontrol on eject while held

---------

Co-authored-by: archrbx <punk.gear5260@fastmail.com>

* MedTek Cartridge (#32450)

* initial commit

* adds cartridge to cmo's locker

* tidies up yml, adds default scanner sound, makes it so the silent property silences the scanner sound too

* fixes ert medic pda not having it preinstalled

* adds attribution

* removes redundant dependencies

* fix agent pda

---------

Co-authored-by: archrbx <punk.gear5260@fastmail.com>

* Fix

* NFJanitor

* Update silence.ogg

* PDA

* Update pda.yml

* Update cartridges.yml

* Update cartridges.yml

* Added admin PDA

* Update pda.yml

* PDA review pass

* NFMobAGhostGear fix

* fix Admin PDA cartridge references

---------

Co-authored-by: Whatstone <whatston3@gmail.com>
Co-authored-by: ArchRBX <5040911+ArchRBX@users.noreply.github.com>
Co-authored-by: archrbx <punk.gear5260@fastmail.com>
This commit is contained in:
Dvir
2024-10-20 22:33:09 +03:00
committed by GitHub
parent 33511aeef7
commit 4fa2db937e
51 changed files with 539 additions and 235 deletions
@@ -1,9 +0,0 @@
using Content.Shared.GPS;
namespace Content.Client.GPS.Components
{
[RegisterComponent]
public sealed partial class HandheldGPSComponent : SharedHandheldGPSComponent
{
}
}
@@ -1,4 +1,4 @@
using Content.Client.GPS.Components;
using Content.Shared.GPS.Components;
using Content.Client.GPS.UI;
using Content.Client.Items;
@@ -1,4 +1,4 @@
using Content.Client.GPS.Components;
using Content.Shared.GPS.Components;
using Content.Client.Message;
using Content.Client.Stylesheets;
using Robust.Client.GameObjects;
@@ -30,6 +30,13 @@ public sealed class HandheldGpsStatusControl : Control
{
base.FrameUpdate(args);
// don't display the label if the gps component is being removed
if (_parent.Comp.LifeStage > ComponentLifeStage.Running)
{
_label.Visible = false;
return;
}
_updateDif += args.DeltaSeconds;
if (_updateDif < _parent.Comp.UpdateRate)
return;
@@ -44,9 +51,9 @@ public sealed class HandheldGpsStatusControl : Control
var posText = "Error";
if (_entMan.TryGetComponent(_parent, out TransformComponent? transComp))
{
var pos = _transform.GetMapCoordinates(_parent.Owner, xform: transComp);
var x = (int) pos.X;
var y = (int) pos.Y;
var pos = _transform.GetMapCoordinates(_parent.Owner, xform: transComp);
var x = (int)pos.X;
var y = (int)pos.Y;
posText = $"({x}, {y})";
}
_label.SetMarkup(Loc.GetString("handheld-gps-coordinates-title", ("coordinates", posText)));
@@ -217,6 +217,13 @@ public sealed class CartridgeLoaderSystem : SharedCartridgeLoaderSystem
RaiseLocalEvent(installedProgram, new CartridgeAddedEvent(loaderUid));
UpdateUserInterfaceState(loaderUid, loader);
if (cartridge.Readonly) // Frontier: Block uninstall
cartridge.InstallationStatus = InstallationStatus.Readonly; // Frontier
if (cartridge.Disposable) // Frontier: Delete the cartridge after install if its disposable.
QueueDel(loader.CartridgeSlot.ContainerSlot!.ContainedEntity); // Frontier
return true;
}
@@ -343,6 +350,11 @@ public sealed class CartridgeLoaderSystem : SharedCartridgeLoaderSystem
if (TryComp(args.Entity, out CartridgeComponent? cartridge))
cartridge.LoaderUid = uid;
// Frontier: Try to auto install the program when inserted, QOL
if (cartridge != null && cartridge.AutoInstall)
InstallCartridge(uid, args.Entity, loader);
// End Frontier
RaiseLocalEvent(args.Entity, new CartridgeAddedEvent(uid));
base.OnItemInserted(uid, loader, args);
}
@@ -0,0 +1,9 @@
using Content.Shared.CartridgeLoader.Cartridges;
using Content.Shared.GPS;
namespace Content.Server.CartridgeLoader.Cartridges;
[RegisterComponent]
public sealed partial class AstroNavCartridgeComponent : Component
{
}
@@ -0,0 +1,32 @@
using Content.Shared.CartridgeLoader;
using Content.Shared.CartridgeLoader.Cartridges;
using Content.Shared.GPS.Components;
namespace Content.Server.CartridgeLoader.Cartridges;
public sealed class AstroNavCartridgeSystem : EntitySystem
{
[Dependency] private readonly CartridgeLoaderSystem _cartridgeLoaderSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<AstroNavCartridgeComponent, CartridgeAddedEvent>(OnCartridgeAdded);
SubscribeLocalEvent<AstroNavCartridgeComponent, CartridgeRemovedEvent>(OnCartridgeRemoved);
}
private void OnCartridgeAdded(Entity<AstroNavCartridgeComponent> ent, ref CartridgeAddedEvent args)
{
EnsureComp<HandheldGPSComponent>(args.Loader);
}
private void OnCartridgeRemoved(Entity<AstroNavCartridgeComponent> ent, ref CartridgeRemovedEvent args)
{
// only remove when the program itself is removed
if (!_cartridgeLoaderSystem.HasProgram<AstroNavCartridgeComponent>(args.Loader))
{
RemComp<HandheldGPSComponent>(args.Loader);
}
}
}
@@ -0,0 +1,6 @@
namespace Content.Server.CartridgeLoader.Cartridges;
[RegisterComponent]
public sealed partial class MedTekCartridgeComponent : Component
{
}
@@ -0,0 +1,31 @@
using Content.Server.Medical.Components;
using Content.Shared.CartridgeLoader;
namespace Content.Server.CartridgeLoader.Cartridges;
public sealed class MedTekCartridgeSystem : EntitySystem
{
[Dependency] private readonly CartridgeLoaderSystem _cartridgeLoaderSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<MedTekCartridgeComponent, CartridgeAddedEvent>(OnCartridgeAdded);
SubscribeLocalEvent<MedTekCartridgeComponent, CartridgeRemovedEvent>(OnCartridgeRemoved);
}
private void OnCartridgeAdded(Entity<MedTekCartridgeComponent> ent, ref CartridgeAddedEvent args)
{
var healthAnalyzer = EnsureComp<HealthAnalyzerComponent>(args.Loader);
}
private void OnCartridgeRemoved(Entity<MedTekCartridgeComponent> ent, ref CartridgeRemovedEvent args)
{
// only remove when the program itself is removed
if (!_cartridgeLoaderSystem.HasProgram<MedTekCartridgeComponent>(args.Loader))
{
RemComp<HealthAnalyzerComponent>(args.Loader);
}
}
}
@@ -12,7 +12,6 @@ namespace Content.Server.Entry
"GuideHelp",
"Clickable",
"Icon",
"HandheldGPS",
"CableVisualizer",
"SolutionItemStatus",
"UIFragment",
@@ -54,7 +54,7 @@ public sealed partial class HealthAnalyzerComponent : Component
/// Sound played on scanning end
/// </summary>
[DataField]
public SoundSpecifier? ScanningEndSound;
public SoundSpecifier ScanningEndSound = new SoundPathSpecifier("/Audio/Items/Medical/healthscanner.ogg");
/// <summary>
/// Whether to show up the popup
@@ -13,11 +13,9 @@ using Content.Shared.Item.ItemToggle.Components;
using Content.Shared.MedicalScanner;
using Content.Shared.Mobs.Components;
using Content.Shared.Popups;
using Content.Shared.PowerCell;
using Robust.Server.GameObjects;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Containers;
using Robust.Shared.Player;
using Robust.Shared.Timing;
namespace Content.Server.Medical;
@@ -104,7 +102,8 @@ public sealed class HealthAnalyzerSystem : EntitySystem
if (args.Handled || args.Cancelled || args.Target == null || !_cell.HasDrawCharge(uid, user: args.User))
return;
_audio.PlayPvs(uid.Comp.ScanningEndSound, uid);
if (!uid.Comp.Silent)
_audio.PlayPvs(uid.Comp.ScanningEndSound, uid);
OpenUserInterface(args.User, uid);
BeginAnalyzingEntity(uid, args.Target.Value);
@@ -1,4 +1,4 @@
using Robust.Shared.GameStates;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
using Robust.Shared.Utility;
@@ -21,6 +21,24 @@ public sealed partial class CartridgeComponent : Component
[AutoNetworkedField]
public InstallationStatus InstallationStatus = InstallationStatus.Cartridge;
/// <summary>
/// Frontier: This is used for onetime use programs
/// </summary>
[DataField]
public bool Disposable = false;
/// <summary>
/// Frontier: This is used to auto install on insert
/// </summary>
[DataField]
public bool AutoInstall = false;
/// <summary>
/// Frontier: Block uninstall
/// </summary>
[DataField]
public bool Readonly = false;
}
[Serializable, NetSerializable]
@@ -1,4 +1,4 @@
using Content.Shared.Containers.ItemSlots;
using Content.Shared.Containers.ItemSlots;
using Robust.Shared.GameStates;
namespace Content.Shared.CartridgeLoader;
@@ -33,7 +33,7 @@ public sealed partial class CartridgeLoaderComponent : Component
/// The maximum amount of programs that can be installed on the cartridge loader entity
/// </summary>
[DataField]
public int DiskSpace = 5;
public int DiskSpace = 10; // Frontier 5<10
/// <summary>
/// Controls whether the cartridge loader will play notifications if it supports it at all
@@ -0,0 +1,10 @@
using Robust.Shared.GameStates;
namespace Content.Shared.GPS.Components;
[RegisterComponent, NetworkedComponent]
public sealed partial class HandheldGPSComponent : Component
{
[DataField]
public float UpdateRate = 1.5f;
}
@@ -1,9 +0,0 @@
namespace Content.Shared.GPS
{
public abstract partial class SharedHandheldGPSComponent : Component
{
[DataField("updateRate")]
public float UpdateRate = 1.5f;
}
}
Binary file not shown.
@@ -1,4 +1,4 @@
# Appraisal cartridge
appraisal-program-name = Appraisal App Plus
appraisal-program-name = AppraiseAll Plus
appraisal-label-name = Item
appraisal-label-price = Appraised Price
@@ -15,7 +15,8 @@ loadout-group-contractor-face = mask
loadout-group-contractor-utility = tools
loadout-group-contractor-fun = fun
loadout-group-contractor-trinkets = trinkets
loadout-group-contractor-survival-box = survival box
loadout-group-contractor-encryption-key = encryption keys
loadout-group-contractor-survival-box = survival box
loadout-group-contractor-cartridge = PDA cartridges
loadout-group-contractor-implanter = implanters
loadout-group-contractor-bureaucracy = bureaucracy
@@ -20,6 +20,10 @@ log-probe-label-time = Time
log-probe-label-accessor = Accessed by
log-probe-label-number = #
astro-nav-program-name = AstroNav
med-tek-program-name = MedTek
# Wanted list cartridge
wanted-list-program-name = Wanted list
wanted-list-label-no-records = It's all right, cowboy
+1 -1
View File
@@ -32151,7 +32151,7 @@ entities:
- type: Transform
pos: -5.5,1.5
parent: 2173
- proto: SpawnPointJanitor
- proto: NFSpawnPointJanitor
entities:
- uid: 2099
components:
+1 -1
View File
@@ -6843,7 +6843,7 @@ entities:
- type: Transform
pos: -3.5,2.5
parent: 179
- proto: SpawnPointJanitor
- proto: NFSpawnPointJanitor
entities:
- uid: 1488
components:
@@ -228,6 +228,7 @@
# - id: MedicalTechFabCircuitboard # Frontier - bloat
# - id: MedkitFilled # Frontier - bloat
- id: RubberStampCMO
- id: MedTekCartridge
# Hardsuit table, used for suit storage as well
- type: entityTable
@@ -1,5 +1,5 @@
# - type: entity # Frontier - Not Merged yet
# parent: BaseItem
# parent: NFBasePDACartridge
# id: CrimeAssistCartridge
# name: crime assist cartridge
# description: A cartridge that helps identify crimes and see appropriate punishment.
@@ -18,29 +18,8 @@
# sprite: DeltaV/Icons/cri.rsi
# state: cri
# - type: entity # Frontier - Not Merged yet
# parent: BaseItem
# id: SecWatchCartridge
# name: sec watch cartridge
# description: A cartridge that tracks the status of currently wanted individuals.
# components:
# - type: Sprite
# sprite: DeltaV/Objects/Devices/cartridge.rsi
# state: cart-cri
# - type: Icon
# sprite: DeltaV/Objects/Devices/cartridge.rsi
# state: cart-cri
# - type: UIFragment
# ui: !type:SecWatchUi
# - type: Cartridge
# programName: sec-watch-program-name
# icon:
# sprite: Objects/Weapons/Melee/stunbaton.rsi
# state: stunbaton_on
# - type: SecWatchCartridge
- type: entity
parent: BaseItem
parent: NFBasePDACartridge
id: MailMetricsCartridge
name: mail metrics cartridge
description: A cartridge that tracks statistics related to mail deliveries.
@@ -59,3 +38,4 @@
icon:
sprite: Nyanotrasen/Objects/Specific/Mail/mail.rsi
state: icon
readonly: true # Frontier
@@ -29,10 +29,9 @@
- type: Icon
sprite: _NF/Objects/Devices/pda.rsi # Frontier - DeltaV/Objects/Devices/pda.rsi<_NF/Objects/Devices/pda.rsi
state: pda-mailcarrier
- type: CartridgeLoader # DeltaV - Courier Performance
preinstalled:
- CrewManifestCartridge
- NotekeeperCartridge
- NewsReaderCartridge
- BountyContractsCartridge
- MailMetricsCartridge
# - type: CartridgeLoader # DeltaV - Courier Performance # Frontier - pushed to cartridge loadouts
# preinstalled:
# - CrewManifestCartridge
# - NotekeeperCartridge
# - NewsReaderCartridge
# - MailMetricsCartridge
@@ -266,6 +266,7 @@
id: SpawnPointJanitor
parent: SpawnPointJobBase
name: janitor
categories: [ HideSpawnMenu ] # Frontier
components:
- type: SpawnPoint
job_id: Janitor
@@ -93,7 +93,7 @@
- type: Inventory
templateId: aghost
- type: Loadout
prototypes: [ MobAghostGear ]
prototypes: [ NFMobAghostGear ] # Frontier MobAghostGear<NFMobAghostGear
- type: BypassInteractionChecks
- type: BankAccount # Frontier
@@ -1,5 +1,5 @@
- type: entity
parent: BaseItem
parent: NFBasePDACartridge # Frontier: BaseItem<NFBasePDACartridge
id: NotekeeperCartridge
name: notekeeper cartridge
description: A program for keeping notes.
@@ -17,7 +17,7 @@
- type: NotekeeperCartridge
- type: entity
parent: BaseItem
parent: NFBasePDACartridge # Frontier: BaseItem<NFBasePDACartridge
id: NewsReaderCartridge
name: news cartridge
description: A program for reading news.
@@ -35,7 +35,7 @@
- type: NewsReaderCartridge
- type: entity
parent: BaseItem
parent: NFBasePDACartridge # Frontier: BaseItem<NFBasePDACartridge
id: CrewManifestCartridge
name: crew manifest cartridge
description: A program for listing your fellow crewmembers.
@@ -53,7 +53,7 @@
- type: CrewManifestCartridge
- type: entity
parent: BaseItem
parent: NFBasePDACartridge # Frontier: BaseItem<NFBasePDACartridge
id: NetProbeCartridge
name: NetProbe cartridge
description: A program for getting the address and frequency of network devices.
@@ -71,7 +71,7 @@
- type: NetProbeCartridge
- type: entity
parent: BaseItem
parent: NFBasePDACartridge # Frontier: BaseItem<NFBasePDACartridge
id: LogProbeCartridge
name: LogProbe cartridge
description: A program for getting access logs from devices.
@@ -87,7 +87,7 @@
- type: Cartridge
programName: log-probe-program-name
icon:
sprite: Structures/Doors/Airlocks/Standard/security.rsi
sprite: _NF/Structures/Doors/Airlocks/Standard/nfsd.rsi # Frontier: Swap security to NFSD
state: closed
- type: LogProbeCartridge
- type: GuideHelp
@@ -95,7 +95,7 @@
- Forensics
- type: entity
parent: BaseItem
parent: NFBasePDACartridge # Frontier: BaseItem<NFBasePDACartridge
id: WantedListCartridge
name: Wanted list cartridge
description: A program to get a list of wanted persons.
@@ -113,6 +113,45 @@
icon:
sprite: Objects/Misc/books.rsi
state: icon_magnifier
readonly: true # Frontier
- type: WantedListCartridge
- type: StealTarget
stealGroup: WantedListCartridge
- type: entity
parent: NFBasePDACartridge # Frontier: BaseItem<NFBasePDACartridge
id: MedTekCartridge
name: MedTek cartridge
description: A program that provides medical diagnostic tools.
components:
- type: Sprite
sprite: Objects/Devices/cartridge.rsi
state: cart-med
- type: Icon
sprite: Objects/Devices/cartridge.rsi
state: cart-med
- type: Cartridge
programName: med-tek-program-name
icon:
sprite: Objects/Specific/Medical/healthanalyzer.rsi
state: icon
- type: MedTekCartridge
- type: entity
parent: NFBasePDACartridge # Frontier: BaseItem<NFBasePDACartridge
id: AstroNavCartridge
name: AstroNav cartridge
description: A program for navigation that provides GPS coordinates.
components:
- type: Sprite
sprite: Objects/Devices/cartridge.rsi
state: cart-nav
- type: Icon
sprite: Objects/Devices/cartridge.rsi
state: cart-nav
- type: Cartridge
programName: astro-nav-program-name
icon:
sprite: Objects/Devices/gps.rsi
state: icon
- type: AstroNavCartridge
@@ -79,13 +79,13 @@
# - type: WirelessNetworkConnection # Frontier
# range: 500 # Frontier
- type: CartridgeLoader
diskSpace: 10 # Frontier - Too many programs 5<10
uiKey: enum.PdaUiKey.Key
preinstalled:
- CrewManifestCartridge
- NotekeeperCartridge
- NewsReaderCartridge
- BountyContractsCartridge # Frontier
- AstroNavCartridge # Frontier
cartridgeSlot:
priority: -1
name: device-pda-slot-component-slot-name-cartridge
@@ -128,6 +128,7 @@
- type: CargoSellBlacklist # Frontier: Liltenhead moment
- type: entity
parent: BasePDA
id: BaseSecurityPDA
abstract: true
components:
@@ -137,27 +138,31 @@
- CrewManifestCartridge
- NotekeeperCartridge
- NewsReaderCartridge
- WantedListCartridge
- BountyContractsCartridge # Frontier
- AstroNavCartridge # Frontier
- WantedListCartridge
- type: entity
parent: BasePDA
id: BaseMedicalPDA
abstract: true
components:
- type: ItemToggle
onUse: false
- type: HealthAnalyzer
scanDelay: 1
scanningEndSound:
path: "/Audio/Items/Medical/healthscanner.ogg"
# Frontier: cartridges moved to loadouts
# components:
# - type: CartridgeLoader
# uiKey: enum.PdaUiKey.Key
# preinstalled:
# - CrewManifestCartridge
# - NotekeeperCartridge
# - NewsReaderCartridge
# - MedTekCartridge
# End Frontier
- type: entity
parent: BasePDA
id: PassengerPDA
categories: [ HideSpawnMenu ] # Frontier
name: passenger PDA
description: Why isn't it gray?
categories: [ HideSpawnMenu ] # Frontier
components:
- type: Pda
id: PassengerIDCard
@@ -184,7 +189,7 @@
parent: BaseMedicalPDA
id: MedicalInternPDA
name: medical intern PDA
description: Why isn't it white? Has a built-in health analyzer.
description: Why isn't it white?
components:
- type: Pda
id: MedicalInternIDCard
@@ -199,7 +204,7 @@
- Medical Doctor
- type: entity
parent: BasePDA
parent: BaseSecurityPDA
id: SecurityCadetPDA
name: security cadet PDA
description: Why isn't it red?
@@ -415,6 +420,13 @@
accentVColor: "#8900c9"
- type: Icon
state: pda-miner
- type: CartridgeLoader
uiKey: enum.PdaUiKey.Key
preinstalled:
- CrewManifestCartridge
- NotekeeperCartridge
- NewsReaderCartridge
- AstroNavCartridge
- type: entity
parent: BasePDA
@@ -460,7 +472,7 @@
state: pda-library
- type: entity
parent: [BaseSecurityPDA, BasePDA]
parent: BaseSecurityPDA
id: LawyerPDA
name: lawyer PDA
description: For lawyers to poach dubious clients.
@@ -503,7 +515,7 @@
state: pda-janitor
- type: entity
parent: [BaseSecurityPDA, BasePDA]
parent: BaseSecurityPDA
id: CaptainPDA
name: captain PDA
description: Surprisingly no different from your PDA.
@@ -577,7 +589,7 @@
parent: BaseMedicalPDA
id: CMOPDA
name: chief medical officer PDA
description: Extraordinarily shiny and sterile. Has a built-in health analyzer.
description: Extraordinarily shiny and sterile.
components:
- type: Pda
id: CMOIDCard
@@ -593,7 +605,7 @@
parent: BaseMedicalPDA
id: MedicalPDA
name: medical PDA
description: Shiny and sterile. Has a built-in health analyzer.
description: Shiny and sterile.
components:
- type: Pda
id: MedicalIDCard
@@ -620,7 +632,7 @@
parent: BaseMedicalPDA
id: ParamedicPDA
name: paramedic PDA
description: Shiny and sterile. Has a built-in rapid health analyzer.
description: Shiny and sterile.
components:
- type: Pda
id: ParamedicIDCard
@@ -678,7 +690,7 @@
state: pda-science
- type: entity
parent: [BaseSecurityPDA, BasePDA]
parent: BaseSecurityPDA
id: HoSPDA
name: head of security PDA
description: Whosoever bears this PDA is the law.
@@ -693,7 +705,7 @@
state: pda-hos
- type: entity
parent: [BaseSecurityPDA, BasePDA]
parent: BaseSecurityPDA
id: WardenPDA
name: warden PDA
description: The OS appears to have been jailbroken.
@@ -708,7 +720,7 @@
state: pda-warden
- type: entity
parent: [BaseSecurityPDA, BasePDA]
parent: BaseSecurityPDA
id: SecurityPDA
name: security PDA
description: Red to hide the stains of passenger blood.
@@ -722,7 +734,7 @@
state: pda-security
- type: entity
parent: [BaseSecurityPDA, BasePDA]
parent: BaseSecurityPDA
id: CentcomPDA
name: CentComm PDA
description: Light green sign of walking bureaucracy.
@@ -741,7 +753,7 @@
state: pda-centcom
- type: entity
parent: [MusicBasePDA, CentcomPDA, BaseMedicalPDA] # Frontier - Added MusicBasePDA parent
parent: CentcomPDA
id: AdminPDA
name: Admin PDA
suffix: Admin
@@ -761,8 +773,6 @@
- NewsReaderCartridge
- LogProbeCartridge
- WantedListCartridge
- BountyContractsCartridge # Frontier
- MailMetricsCartridge # Frontier
- type: entity
parent: CentcomPDA
@@ -818,9 +828,9 @@
- type: entity
parent: BasePDA
id: ClearPDA
categories: [ HideSpawnMenu ] # Frontier
name: clear PDA
description: 99 and 44/100ths percent pure plastic.
categories: [ HideSpawnMenu ] # Frontier
components:
- type: Pda
id: PassengerIDCard
@@ -865,7 +875,7 @@
- Cartridge
- type: entity
parent: [BaseSecurityPDA, BasePDA]
parent: BaseSecurityPDA
id: ERTLeaderPDA
name: ERT Leader PDA
suffix: Leader
@@ -916,14 +926,18 @@
id: ERTMedicPDA
name: ERT Medic PDA
suffix: Medic
description: Red for firepower, it's shiny and sterile. Has a built-in rapid health analyzer.
description: Red for firepower, it's shiny and sterile.
components:
- type: Pda
id: ERTMedicIDCard
- type: HealthAnalyzer
scanDelay: 1
scanningEndSound:
path: "/Audio/Items/Medical/healthscanner.ogg"
- type: CartridgeLoader
uiKey: enum.PdaUiKey.Key
preinstalled:
- CrewManifestCartridge
- NotekeeperCartridge
- NewsReaderCartridge
- MedTekCartridge
- WantedListCartridge
- type: entity
parent: ERTLeaderPDA
@@ -1013,11 +1027,11 @@
state: pda-boxer
- type: entity
parent: [BaseSecurityPDA, BasePDA]
parent: BaseSecurityPDA
id: DetectivePDA
name: detective PDA
categories: [ HideSpawnMenu ] # Frontier
description: Smells like rain... pouring down the rooftops...
categories: [ HideSpawnMenu ] # Frontier
components:
- type: Pda
id: DetectiveIDCard
@@ -1031,7 +1045,7 @@
parent: BaseMedicalPDA
id: BrigmedicPDA
name: brigmedic PDA
description: I wonder whose pulse is on the screen? I hope he doesnt stop... PDA has a built-in health analyzer.
description: I wonder whose pulse is on the screen? I hope it doesn't stop...
components:
- type: Pda
id: BrigmedicIDCard
@@ -1101,7 +1115,7 @@
parent: BaseMedicalPDA
id: SeniorPhysicianPDA
name: senior physician PDA
description: Smells faintly like iron and chemicals. Has a built-in health analyzer.
description: Smells faintly like iron and chemicals.
components:
- type: Pda
id: SeniorPhysicianIDCard
@@ -1114,7 +1128,7 @@
state: pda-seniorphysician
- type: entity
parent: [BaseSecurityPDA, BasePDA]
parent: BaseSecurityPDA
id: SeniorOfficerPDA
name: senior officer PDA
description: Beaten, battered and broken, but just barely useable.
@@ -1132,8 +1146,8 @@
parent: SyndiPDA
id: PiratePDA
name: pirate PDA
categories: [ HideSpawnMenu ] # Frontier
description: Yargh!
categories: [ HideSpawnMenu ] # Frontier
components:
- type: Pda
id: PirateIDCard
@@ -1158,6 +1172,7 @@
uiKey: enum.PdaUiKey.Key
preinstalled:
- NotekeeperCartridge
- MedTekCartridge
cartridgeSlot:
priority: -1
name: Cartridge
+17 -26
View File
@@ -100,17 +100,13 @@
id: JobLawyer
groups:
- GroupTankHarness
- LawyerNFNeck # Frontier
- LawyerNFJumpsuit # Frontier
- ContractorBackpack # Frontier
- ContractorGlasses # Frontier
- ContractorFace # Frontier
- ContractorBoxSurvival # Frontier
- ContractorEncryptionKey # Frontier
- ContractorImplanter # Frontier
- ContractorFun # Frontier
- ContractorTrinkets # Frontier
# - GroupSpeciesBreathTool # Frontier
- LawyerNeck
- LawyerJumpsuit
- CommonBackpack
- Glasses
- Survival
- Trinkets
- GroupSpeciesBreathTool
- type: roleLoadout
id: JobChaplain
@@ -131,21 +127,16 @@
id: JobJanitor
groups:
- GroupTankHarness
- JanitorNFHead # Frontier
- JanitorNFJumpsuit # Frontier
- JanitorNFGloves # Frontier
- ContractorBackpack # Frontier
- JanitorNFOuterClothing # Frontier
- ContractorFace # Frontier
- ContractorGlasses # Frontier
- ContractorEars # Frontier
- ContractorEncryptionKey # Frontier
- ContractorBoxSurvival # Frontier
- ContractorImplanter # Frontier
- ContractorFun # Frontier
- ContractorTrinkets # Frontier
#- JanitorPlunger # Frontier
#- GroupSpeciesBreathTool # Frontier
- JanitorHead
- JanitorJumpsuit
- JanitorGloves
- CommonBackpack
- JanitorOuterClothing
- Glasses
- Survival
- Trinkets
- JanitorPlunger
- GroupSpeciesBreathTool
- type: roleLoadout
id: JobBotanist
@@ -39,7 +39,7 @@
state: pda-valet
- type: entity
parent: BasePDA
parent: BaseSecurityPDA
id: PrisonGuardPDA
name: prison guard PDA
description: Red to hide the stains of prisoner blood.
@@ -38,4 +38,5 @@
back:
- EncryptionKeyService # Frontier
- HandheldCrewMonitor # Frontier
- ShipVoucherFrontierMailCarrier # Frontier
- ShipVoucherFrontierMailCarrier # Frontier
- MailMetricsCartridge # Frontier
@@ -2,44 +2,30 @@
id: Janitor
name: job-name-janitor
description: job-description-janitor
playTimeTracker: JobJanitor
requirements:
- !type:OverallPlaytimeRequirement
time: 10800
playTimeTracker: JobJanitorOld
setPreference: false # Frontier
startingGear: JanitorGear
alwaysUseSpawner: true
icon: "JobIconJanitor"
supervisors: job-supervisors-sr
weight: 100 # Frontier
displayWeight: 40 # Frontier
canBeAntag: false
supervisors: job-supervisors-hop
access:
- Service
- Janitor
- Maintenance
- External # Frontier
- Frontier # Frontier
special:
- !type:GiveItemOnHolidaySpecial
holiday: GarbageDay
prototype: WeaponRevolverInspector
- !type:AddImplantSpecial
implants: [ MindShieldImplant ]
- !type:GiveItemOnHolidaySpecial # Frontier
holiday: FrontierBirthday # Frontier
prototype: FrontierBirthdayGift # Frontier
- type: startingGear
id: JanitorGear
equipment:
shoes: ClothingShoesGaloshes
id: JanitorPDA
# ears: ClothingHeadsetService # Frontier
ears: ClothingHeadsetService
belt: ClothingBeltJanitorFilled
storage:
back:
- EncryptionKeyService # Frontier
- ShipVoucherFrontierJanitor # Frontier
#storage:
#back:
#- Stuff
- type: startingGear
id: JanitorMaidGear
@@ -49,4 +35,4 @@
gloves: ClothingHandsGlovesJanitor
head: ClothingHeadHatCatEars
ears: ClothingHeadsetService
belt: ClothingBeltJanitorFilled
belt: ClothingBeltJanitorFilled
@@ -166,4 +166,11 @@
name: public affairs liaison
components:
- type: SpawnPoint
job_id: PublicAffairsLiaison
job_id: PublicAffairsLiaison
- type: entity
id: NFSpawnPointJanitor
parent: SpawnPointJanitor
components:
- type: SpawnPoint
job_id: NFJanitor
@@ -1,8 +1,17 @@
- type: entity
parent: BaseItem
id: NFBasePDACartridge
abstract: true
components:
- type: Cartridge
disposable: true
autoInstall: true
- type: entity
parent: NFBasePDACartridge
id: BountyContractsCartridge
name: bounty contracts cartridge
description: A program for tracking and placing bounty contracts
description: A program for tracking and placing bounty contracts.
components:
- type: Sprite
sprite: Objects/Devices/cartridge.rsi
@@ -20,22 +29,22 @@
access: [["HeadOfSecurity"], ["HeadOfPersonnel"]]
- type: entity
parent: BaseItem
parent: NFBasePDACartridge
id: AppraisalCartridge
name: appraisal cartridge
description: A program for appraising the monetary value of items
name: AppraiseAll cartridge
description: A program for appraising the monetary value of items.
components:
- type: Sprite
sprite: Objects/Devices/cartridge.rsi
state: cart-y
sprite: _NF/Objects/Devices/cartridge.rsi
state: cart-appraisal
- type: Icon
sprite: Objects/Devices/cartridge.rsi
state: cart-y
sprite: _NF/Objects/Devices/cartridge.rsi
state: cart-appraisal
- type: UIFragment
ui: !type:AppraisalUi
- type: Cartridge
programName: appraisal-program-name
icon: Interface/Actions/shop.png
icon: Objects/Tools/appraisal-tool.rsi/icon.png
- type: AppraisalCartridge
# Not a PDA cartridge (then why is this here)
@@ -8,6 +8,22 @@
respectMidiLimits: false
handheld: true
- type: entity
parent: [MusicBasePDA, CentcomPDA]
id: NFAdminPDA
components:
- type: CartridgeLoader
preinstalled:
- CrewManifestCartridge
- NotekeeperCartridge
- NewsReaderCartridge
- BountyContractsCartridge
- WantedListCartridge
- LogProbeCartridge
- MailMetricsCartridge
- AppraisalCartridge
- NetProbeCartridge
- type: entity
parent: BasePDA
id: MercenaryPDA
@@ -65,7 +81,7 @@
state: pda-pilot
- type: entity
parent: BasePDA
parent: BaseSecurityPDA
id: StcPDA
name: station traffic controller PDA
description: Declare emergencies in style!
@@ -93,7 +109,7 @@
state: pda-stc
- type: entity
parent: SecurityPDA
parent: BaseSecurityPDA
id: SecurityGuardPDA
name: security guard PDA
description: Red to hide the stains of passenger blood.
@@ -121,7 +137,7 @@
- Write
- type: entity
parent: BasePDA
parent: BaseSecurityPDA
id: SheriffPDA
name: sheriff PDA
description: Whosoever bears this PDA is the law.
@@ -156,7 +172,7 @@
state: pda-sheriff
- type: entity
parent: BasePDA
parent: BaseSecurityPDA
id: CadetPDA
name: cadet PDA
description: Whosoever bears this PDA could be the law.
@@ -191,7 +207,7 @@
state: pda-cadet
- type: entity
parent: BasePDA
parent: BaseSecurityPDA
id: DeputyPDA
name: deputy PDA
description: Whosoever bears this PDA is close to being the law.
@@ -226,7 +242,7 @@
state: pda-deputy
- type: entity
parent: BaseMedicalPDA
parent: BaseSecurityPDA
id: BrigmedicNFPDA
name: brigmedic PDA
description: Whosoever bears this PDA heals the law.
@@ -261,7 +277,7 @@
state: pda-brigmed
- type: entity
parent: BasePDA
parent: BaseSecurityPDA
id: SergeantPDA
name: sergeant PDA
description: Whosoever bears this PDA puts the law on their back.
@@ -296,7 +312,7 @@
state: pda-sergeant
- type: entity
parent: BasePDA
parent: BaseSecurityPDA
id: BailiffPDA
name: bailiff PDA
description: Whosoever bears this PDA puts the law on their back.
@@ -331,7 +347,7 @@
state: pda-bailiff
- type: entity
parent: BasePDA
parent: BaseSecurityPDA
id: NFDetectivePDA
name: detective PDA
description: Smells like rain... pouring down the rooftops...
@@ -365,7 +381,7 @@
state: pda-nfdetective
- type: entity
parent: BasePDA
parent: BaseSecurityPDA
id: PublicAffairsLiaisonPDA
name: public affairs liaison PDA
description: Paperwork, paperwork, paperwork!
@@ -406,7 +422,7 @@
state: pda-pal
- type: entity
parent: HoPPDA
parent: BaseSecurityPDA
id: SrPDA
name: station representative PDA
description: Looks like it's been clawed on.
@@ -438,13 +454,6 @@
- type: Icon
sprite: _NF/Objects/Devices/pda.rsi
state: pda-sr
- type: CartridgeLoader
preinstalled:
- CrewManifestCartridge
- NotekeeperCartridge
- NewsReaderCartridge
- BountyContractsCartridge
- MailMetricsCartridge # DeltaV - Courier Performance
- type: entity
parent: PiratePDA
@@ -0,0 +1,40 @@
#T1
- type: loadout
id: ContractorAppraisalCartridge
effects:
- !type:GroupLoadoutEffect
proto: ContractorT1
price: 1000
storage:
back:
- AppraisalCartridge
- type: loadout
id: ContractorMedTekCartridge
effects:
- !type:GroupLoadoutEffect
proto: ContractorT1
price: 1000
storage:
back:
- MedTekCartridge
- type: loadout
id: ContractorNetProbeCartridge
effects:
- !type:GroupLoadoutEffect
proto: ContractorT1
price: 1000
storage:
back:
- NetProbeCartridge
- type: loadout
id: ContractorLogProbeCartridge
effects:
- !type:GroupLoadoutEffect
proto: ContractorT1
price: 1000
storage:
back:
- LogProbeCartridge
@@ -39,7 +39,7 @@
price: 250
equipment:
id: ServiceWorkerPDA
#T1
- type: loadout
id: ContractorBartenderPDA
@@ -121,7 +121,7 @@
price: 500
equipment:
id: ChemistryPDA
- type: loadout
id: ContractorSciencePDA
effects:
@@ -176,7 +176,7 @@
price: 750
equipment:
id: CaptainPDA
- type: loadout
id: ContractorQuartermasterPDA
effects:
@@ -185,7 +185,7 @@
price: 750
equipment:
id: QuartermasterPDA
- type: loadout
id: ContractorSeniorResearcherPDA
effects:
@@ -194,7 +194,7 @@
price: 750
equipment:
id: SeniorResearcherPDA
- type: loadout
id: ContractorRnDPDA
effects:
@@ -203,7 +203,7 @@
price: 750
equipment:
id: RnDPDA
- type: loadout
id: ContractorSeniorPhysicianPDA
effects:
@@ -212,7 +212,7 @@
price: 750
equipment:
id: SeniorPhysicianPDA
- type: loadout
id: ContractorCMOPDA
effects:
@@ -221,7 +221,7 @@
price: 750
equipment:
id: CMOPDA
- type: loadout
id: ContractorSeniorEngineerPDA
effects:
@@ -230,7 +230,7 @@
price: 750
equipment:
id: SeniorEngineerPDA
- type: loadout
id: ContractorCEPDA
effects:
@@ -239,7 +239,7 @@
price: 750
equipment:
id: CEPDA
- type: loadout
id: ContractorBoxerPDA
effects:
@@ -248,31 +248,31 @@
price: 750
equipment:
id: BoxerPDA
- type: loadout
id: ContractorMusicianPDA
effects:
- !type:GroupLoadoutEffect
proto: ContractorT2
price: 750
equipment:
id: MusicianPDA
#T3 for lols
- type: loadout
id: ContractorClownPDA
effects:
- !type:GroupLoadoutEffect
proto: ContractorT3
price: 5000
equipment:
id: ClownPDA
- type: loadout
id: ContractorMimePDA
effects:
- !type:GroupLoadoutEffect
proto: ContractorT3
price: 5000
proto: ContractorT2
price: 750
equipment:
id: MimePDA
id: MimePDA
#T3
- type: loadout
id: ContractorClownPDA
effects:
- !type:GroupLoadoutEffect
proto: ContractorT3
price: 1500
equipment:
id: ClownPDA
- type: loadout
id: ContractorMusicianPDA
effects:
- !type:GroupLoadoutEffect
proto: ContractorT3
price: 1500
equipment:
id: MusicianPDA
@@ -827,6 +827,17 @@
fallbacks:
- ContractorEncryptionKeyTraffic
- type: loadoutGroup
id: ContractorCartridge
name: loadout-group-contractor-cartridge
minLimit: 0
maxLimit: 5
loadouts:
- ContractorAppraisalCartridge
- ContractorMedTekCartridge
- ContractorNetProbeCartridge
- ContractorLogProbeCartridge
- type: loadoutGroup
id: ContractorImplanter
name: loadout-group-contractor-implanter
@@ -16,6 +16,7 @@
- ContractorEars
- ContractorEncryptionKey
- ContractorBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorUtility
- ContractorFun
@@ -40,6 +41,7 @@
- PilotEars
- ContractorEncryptionKey
- ContractorBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorUtility
- ContractorFun
@@ -64,6 +66,7 @@
- MercenaryEars
- ContractorEncryptionKey
- ContractorBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorUtility
- ContractorFun
@@ -85,11 +88,31 @@
- ContractorEars
- ContractorEncryptionKey
- ContractorBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorFun
- ContractorTrinkets
- ContractorBureaucracy
- type: roleLoadout
id: JobNFJanitor
groups:
- GroupTankHarness
- JanitorNFHead
- JanitorNFJumpsuit
- JanitorNFGloves
- ContractorBackpack
- JanitorNFOuterClothing
- ContractorFace
- ContractorGlasses
- ContractorEars
- ContractorEncryptionKey
- ContractorBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorFun
- ContractorTrinkets
- type: roleLoadout
id: JobMailCarrier
groups:
@@ -103,6 +126,7 @@
- ContractorEars
- ContractorEncryptionKey
- ContractorBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorFun
- ContractorTrinkets
@@ -123,6 +147,7 @@
- ContractorBelt
- StcEars
- ContractorBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorFun
- ContractorTrinkets
@@ -143,6 +168,7 @@
- ContractorBelt
- StationRepEars
- ContractorBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorFun
- ContractorTrinkets
@@ -162,6 +188,7 @@
- SecurityGuardBelt
- SecurityGuardEars
- NfsdBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorEncryptionKey
- ContractorFun
@@ -184,6 +211,7 @@
- NfsdBelt
- NfsdEarsBrown
- NfsdBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorEncryptionKey
- ContractorFun
@@ -204,11 +232,12 @@
- NfsdBelt
- NfsdEarsBrown
- NfsdBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorEncryptionKey
- ContractorFun
- ContractorTrinkets
- type: roleLoadout
id: JobBrigmedic
groups:
@@ -225,6 +254,7 @@
- BrigmedicBelt
- NfsdEarsCream
- NfsdBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorEncryptionKey
- ContractorFun
@@ -245,6 +275,7 @@
- NfsdBelt
- NfsdEarsCream
- NfsdBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorEncryptionKey
- ContractorFun
@@ -265,6 +296,7 @@
- ContractorBelt
- NfsdEarsBrown
- NfsdBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorEncryptionKey
- ContractorFun
@@ -305,6 +337,7 @@
- NfsdBelt
- NfsdEarsAltGreen
- NfsdBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorEncryptionKey
- ContractorFun
@@ -325,6 +358,7 @@
- NfsdBelt
- NfsdEarsAltBrown
- NfsdBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorEncryptionKey
- ContractorFun
@@ -346,6 +380,7 @@
- NfsdBelt
- SheriffEars
- NfsdBoxSurvival
- ContractorCartridge
- ContractorImplanter
- ContractorFun
- ContractorTrinkets
@@ -29,7 +29,7 @@
StationTrafficController: [ 1, 1 ]
SecurityGuard: [ 1, 1 ]
Valet: [ 1, 1 ]
Janitor: [ 1, 1 ]
NFJanitor: [ 1, 1 ]
MailCarrier: [ 1, 1 ]
# Others:
# Borg: [ 0, 0 ]
+1 -1
View File
@@ -18,7 +18,7 @@
StationTrafficController: [ -1, -1 ]
SecurityGuard: [ -1, -1 ]
Valet: [ -1, -1 ]
Janitor: [ -1, -1 ]
NFJanitor: [ -1, -1 ]
MailCarrier: [ -1, -1 ]
Sheriff: [ -1, -1]
Bailiff: [ -1, -1]
@@ -0,0 +1,41 @@
- type: job
id: NFJanitor
name: job-name-janitor
description: job-description-janitor
playTimeTracker: JobJanitor
requirements:
- !type:OverallPlaytimeRequirement
time: 10800
startingGear: NFJanitorGear
alwaysUseSpawner: true
icon: "JobIconJanitor"
supervisors: job-supervisors-sr
weight: 100
displayWeight: 40
canBeAntag: false
access:
- Service
- Janitor
- Maintenance
- External
- Frontier
special:
- !type:GiveItemOnHolidaySpecial
holiday: GarbageDay
prototype: WeaponRevolverInspector
- !type:AddImplantSpecial
implants: [ MindShieldImplant ]
- !type:GiveItemOnHolidaySpecial
holiday: FrontierBirthday
prototype: FrontierBirthdayGift
- type: startingGear
id: NFJanitorGear
equipment:
shoes: ClothingShoesGaloshes
id: JanitorPDA
belt: ClothingBeltJanitorFilled
storage:
back:
- EncryptionKeyService
- ShipVoucherFrontierJanitor
@@ -42,4 +42,5 @@
- DoorRemoteCommand
- AccessConfigurator
- EncryptionKeyStationMaster
- EncryptionKeyCentCom
- EncryptionKeyCentCom
- MailMetricsCartridge
@@ -1,3 +1,19 @@
# Aghost
- type: startingGear
id: NFMobAghostGear
equipment:
back: ClothingBackpackSatchelHolding
id: NFAdminPDA
storage:
back:
- GasAnalyzer
- trayScanner
- AccessConfiguratorUniversal
- Multitool
- PowerDrill
- JawsOfLife
- WelderIndustrialAdvanced
- type: startingGear
id: MobClippyGear
equipment:
@@ -24,4 +40,4 @@
head: ClothingHeadHatStrawHat
ears: ClothingHeadsetService
jumpsuit: ClothingUniformJumpsuitHawaiRed
id: YipYipIDCard
id: YipYipIDCard
@@ -5,10 +5,10 @@
color: "#334E6D"
weight: 1 # accounted for in jobs
roles:
- StationRepresentative # Frontier
- StationTrafficController # Frontier
- StationRepresentative
- StationTrafficController
- Valet # nyano
- Janitor
- NFJanitor
- MailCarrier # nyano
- SecurityGuard
@@ -22,4 +22,4 @@
- PirateCaptain
- PirateFirstMate
- Pirate
- Prisoner ##nyano
- Prisoner #nyano
@@ -17,4 +17,7 @@
id: JobHeadOfPersonnelOld
- type: playTimeTracker
id: JobPassengerOld
id: JobPassengerOld
- type: playTimeTracker
id: JobJanitorOld
Binary file not shown.

After

Width:  |  Height:  |  Size: 289 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 300 B

@@ -1,7 +1,7 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d and tgstation at tgstation at https://github.com/tgstation/tgstation/commit/0c15d9dbcf0f2beb230eba5d9d889ef2d1945bb8, cart-log made by Skarletto (github), cart-sec made by dieselmohawk (discord)",
"copyright": "Taken from vgstation at https://github.com/vgstation-coders/vgstation13/commit/1cdfb0230cc96d0ba751fa002d04f8aa2f25ad7d and tgstation at tgstation at https://github.com/tgstation/tgstation/commit/0c15d9dbcf0f2beb230eba5d9d889ef2d1945bb8, cart-log made by Skarletto (github), cart-sec made by dieselmohawk (discord), cart-nav, cart-med made by ArchRBX (github)",
"size": {
"x": 32,
"y": 32
@@ -55,9 +55,15 @@
{
"name": "cart-m"
},
{
"name": "cart-med"
},
{
"name": "cart-mi"
},
{
"name": "cart-nav"
},
{
"name": "cart-ord"
},
@@ -70,6 +76,9 @@
{
"name": "cart-s"
},
{
"name": "cart-sec"
},
{
"name": "cart-tear"
},
@@ -79,9 +88,6 @@
{
"name": "cart-y"
},
{
"name": "cart-sec"
},
{
"name": "insert_overlay"
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 223 B

@@ -1,12 +1,15 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "contraband_forensics made by Whatstone (Discord)",
"copyright": "cart-appraisal, contraband_forensics made by Whatstone (Discord)",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "cart-appraisal"
},
{
"name": "contraband_forensics"
}