Add Chameleon PDA (#30514)

* V1 commit

* Remove PDA name and unnecessary pda state

* Adds PDA to Chameleon backpack & thief toolbox

* Change to use AppearanceDataInit

* Add basic PDA state to ensure there's always a sprite before AppearanceData can be applied

* Revert PDA name (this will be changed to another way later)

* Update PDA name updating to new system

* Fix yaml, and fix Agent ID chameleon

* Updated based on review
This commit is contained in:
SlamBamActionman
2025-01-02 19:23:28 +01:00
committed by GitHub
parent 34960c53cb
commit 21351df03a
17 changed files with 458 additions and 117 deletions

View File

@@ -1,4 +1,5 @@
using System.Linq; using System.Linq;
using Content.Client.PDA;
using Content.Shared.Clothing.Components; using Content.Shared.Clothing.Components;
using Content.Shared.Clothing.EntitySystems; using Content.Shared.Clothing.EntitySystems;
using Content.Shared.Inventory; using Content.Shared.Inventory;
@@ -51,6 +52,15 @@ public sealed class ChameleonClothingSystem : SharedChameleonClothingSystem
{ {
sprite.CopyFrom(otherSprite); sprite.CopyFrom(otherSprite);
} }
// Edgecase for PDAs to include visuals when UI is open
if (TryComp(uid, out PdaBorderColorComponent? borderColor)
&& proto.TryGetComponent(out PdaBorderColorComponent? otherBorderColor, _factory))
{
borderColor.BorderColor = otherBorderColor.BorderColor;
borderColor.AccentHColor = otherBorderColor.AccentHColor;
borderColor.AccentVColor = otherBorderColor.AccentVColor;
}
} }
/// <summary> /// <summary>

View File

@@ -1,15 +1,21 @@
using Content.Client.Clothing.Systems; using Content.Client.Clothing.Systems;
using Content.Shared.Clothing.Components; using Content.Shared.Clothing.Components;
using Content.Shared.Tag;
using Content.Shared.Prototypes;
using JetBrains.Annotations; using JetBrains.Annotations;
using Robust.Client.GameObjects; using Robust.Client.GameObjects;
using Robust.Client.UserInterface; using Robust.Client.UserInterface;
using Robust.Shared.Prototypes;
namespace Content.Client.Clothing.UI; namespace Content.Client.Clothing.UI;
[UsedImplicitly] [UsedImplicitly]
public sealed class ChameleonBoundUserInterface : BoundUserInterface public sealed class ChameleonBoundUserInterface : BoundUserInterface
{ {
[Dependency] private readonly IComponentFactory _factory = default!;
[Dependency] private readonly IPrototypeManager _proto = default!;
private readonly ChameleonClothingSystem _chameleon; private readonly ChameleonClothingSystem _chameleon;
private readonly TagSystem _tag;
[ViewVariables] [ViewVariables]
private ChameleonMenu? _menu; private ChameleonMenu? _menu;
@@ -17,6 +23,7 @@ public sealed class ChameleonBoundUserInterface : BoundUserInterface
public ChameleonBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) public ChameleonBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
{ {
_chameleon = EntMan.System<ChameleonClothingSystem>(); _chameleon = EntMan.System<ChameleonClothingSystem>();
_tag = EntMan.System<TagSystem>();
} }
protected override void Open() protected override void Open()
@@ -34,7 +41,24 @@ public sealed class ChameleonBoundUserInterface : BoundUserInterface
return; return;
var targets = _chameleon.GetValidTargets(st.Slot); var targets = _chameleon.GetValidTargets(st.Slot);
_menu?.UpdateState(targets, st.SelectedId); if (st.RequiredTag != null)
{
var newTargets = new List<string>();
foreach (var target in targets)
{
if (string.IsNullOrEmpty(target) || !_proto.TryIndex(target, out EntityPrototype? proto))
continue;
if (!proto.TryGetComponent(out TagComponent? tag, _factory) || !_tag.HasTag(tag, st.RequiredTag))
continue;
newTargets.Add(target);
}
_menu?.UpdateState(newTargets, st.SelectedId);
} else
{
_menu?.UpdateState(targets, st.SelectedId);
}
} }
private void OnIdSelected(string selectedId) private void OnIdSelected(string selectedId)

View File

@@ -141,6 +141,11 @@ namespace Content.Client.PDA
_pdaOwner = state.PdaOwnerInfo.ActualOwnerName; _pdaOwner = state.PdaOwnerInfo.ActualOwnerName;
PdaOwnerLabel.SetMarkup(Loc.GetString("comp-pda-ui-owner", PdaOwnerLabel.SetMarkup(Loc.GetString("comp-pda-ui-owner",
("actualOwnerName", _pdaOwner))); ("actualOwnerName", _pdaOwner)));
PdaOwnerLabel.Visible = true;
}
else
{
PdaOwnerLabel.Visible = false;
} }

View File

@@ -1,48 +1,8 @@
using Content.Shared.PDA; using Content.Shared.PDA;
using Content.Shared.Light;
using Robust.Client.GameObjects;
namespace Content.Client.PDA; namespace Content.Client.PDA;
public sealed class PdaSystem : SharedPdaSystem public sealed class PdaSystem : SharedPdaSystem
{ {
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PdaComponent, AppearanceChangeEvent>(OnAppearanceChange);
}
private void OnAppearanceChange(EntityUid uid, PdaComponent component, ref AppearanceChangeEvent args)
{
if (args.Sprite == null)
return;
if (Appearance.TryGetData<bool>(uid, UnpoweredFlashlightVisuals.LightOn, out var isFlashlightOn, args.Component))
args.Sprite.LayerSetVisible(PdaVisualLayers.Flashlight, isFlashlightOn);
if (Appearance.TryGetData<bool>(uid, PdaVisuals.IdCardInserted, out var isCardInserted, args.Component))
args.Sprite.LayerSetVisible(PdaVisualLayers.IdLight, isCardInserted);
}
protected override void OnComponentInit(EntityUid uid, PdaComponent component, ComponentInit args)
{
base.OnComponentInit(uid, component, args);
if (!TryComp<SpriteComponent>(uid, out var sprite))
return;
if (component.State != null)
sprite.LayerSetState(PdaVisualLayers.Base, component.State);
sprite.LayerSetVisible(PdaVisualLayers.Flashlight, component.FlashlightOn);
sprite.LayerSetVisible(PdaVisualLayers.IdLight, component.IdSlot.StartingItem != null);
}
public enum PdaVisualLayers : byte
{
Base,
Flashlight,
IdLight
}
} }

View File

@@ -0,0 +1,30 @@
using Content.Shared.Light;
using Content.Shared.PDA;
using Robust.Client.GameObjects;
namespace Content.Client.PDA;
public sealed class PdaVisualizerSystem : VisualizerSystem<PdaVisualsComponent>
{
protected override void OnAppearanceChange(EntityUid uid, PdaVisualsComponent comp, ref AppearanceChangeEvent args)
{
if (args.Sprite == null)
return;
if (AppearanceSystem.TryGetData<string>(uid, PdaVisuals.PdaType, out var pdaType, args.Component))
args.Sprite.LayerSetState(PdaVisualLayers.Base, pdaType);
if (AppearanceSystem.TryGetData<bool>(uid, UnpoweredFlashlightVisuals.LightOn, out var isFlashlightOn, args.Component))
args.Sprite.LayerSetVisible(PdaVisualLayers.Flashlight, isFlashlightOn);
if (AppearanceSystem.TryGetData<bool>(uid, PdaVisuals.IdCardInserted, out var isCardInserted, args.Component))
args.Sprite.LayerSetVisible(PdaVisualLayers.IdLight, isCardInserted);
}
public enum PdaVisualLayers : byte
{
Base,
Flashlight,
IdLight
}
}

View File

@@ -0,0 +1,14 @@
namespace Content.Client.PDA;
/// <summary>
/// Used for visualizing PDA visuals.
/// </summary>
[RegisterComponent]
public sealed partial class PdaVisualsComponent : Component
{
public string? BorderColor;
public string? AccentHColor;
public string? AccentVColor;
}

View File

@@ -1,4 +1,4 @@
using Content.Server.IdentityManagement; using Content.Server.IdentityManagement;
using Content.Shared.Clothing.Components; using Content.Shared.Clothing.Components;
using Content.Shared.Clothing.EntitySystems; using Content.Shared.Clothing.EntitySystems;
using Content.Shared.IdentityManagement.Components; using Content.Shared.IdentityManagement.Components;
@@ -63,7 +63,7 @@ public sealed class ChameleonClothingSystem : SharedChameleonClothingSystem
if (!Resolve(uid, ref component)) if (!Resolve(uid, ref component))
return; return;
var state = new ChameleonBoundUserInterfaceState(component.Slot, component.Default); var state = new ChameleonBoundUserInterfaceState(component.Slot, component.Default, component.RequireTag);
_uiSystem.SetUiState(uid, ChameleonUiKey.Key, state); _uiSystem.SetUiState(uid, ChameleonUiKey.Key, state);
} }
@@ -84,7 +84,7 @@ public sealed class ChameleonClothingSystem : SharedChameleonClothingSystem
// make sure that it is valid change // make sure that it is valid change
if (string.IsNullOrEmpty(protoId) || !_proto.TryIndex(protoId, out EntityPrototype? proto)) if (string.IsNullOrEmpty(protoId) || !_proto.TryIndex(protoId, out EntityPrototype? proto))
return; return;
if (!IsValidTarget(proto, component.Slot)) if (!IsValidTarget(proto, component.Slot, component.RequireTag))
return; return;
component.Default = protoId; component.Default = protoId;

View File

@@ -1,3 +1,4 @@
using Content.Server.Access.Systems;
using Content.Server.AlertLevel; using Content.Server.AlertLevel;
using Content.Server.CartridgeLoader; using Content.Server.CartridgeLoader;
using Content.Server.Chat.Managers; using Content.Server.Chat.Managers;
@@ -36,6 +37,7 @@ namespace Content.Server.PDA
[Dependency] private readonly UserInterfaceSystem _ui = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!;
[Dependency] private readonly UnpoweredFlashlightSystem _unpoweredFlashlight = default!; [Dependency] private readonly UnpoweredFlashlightSystem _unpoweredFlashlight = default!;
[Dependency] private readonly ContainerSystem _containerSystem = default!; [Dependency] private readonly ContainerSystem _containerSystem = default!;
[Dependency] private readonly IdCardSystem _idCard = default!;
public override void Initialize() public override void Initialize()
{ {
@@ -55,19 +57,25 @@ namespace Content.Server.PDA
SubscribeLocalEvent<PdaComponent, CartridgeLoaderNotificationSentEvent>(OnNotification); SubscribeLocalEvent<PdaComponent, CartridgeLoaderNotificationSentEvent>(OnNotification);
SubscribeLocalEvent<StationRenamedEvent>(OnStationRenamed); SubscribeLocalEvent<StationRenamedEvent>(OnStationRenamed);
SubscribeLocalEvent<EntityRenamedEvent>(OnEntityRenamed); SubscribeLocalEvent<EntityRenamedEvent>(OnEntityRenamed, after: new[] { typeof(IdCardSystem) });
SubscribeLocalEvent<AlertLevelChangedEvent>(OnAlertLevelChanged); SubscribeLocalEvent<AlertLevelChangedEvent>(OnAlertLevelChanged);
} }
private void OnEntityRenamed(ref EntityRenamedEvent ev) private void OnEntityRenamed(ref EntityRenamedEvent ev)
{ {
var query = EntityQueryEnumerator<PdaComponent>(); if (HasComp<IdCardComponent>(ev.Uid))
return;
while (query.MoveNext(out var uid, out var comp)) if (_idCard.TryFindIdCard(ev.Uid, out var idCard))
{ {
if (comp.PdaOwner == ev.Uid) var query = EntityQueryEnumerator<PdaComponent>();
while (query.MoveNext(out var uid, out var comp))
{ {
SetOwner(uid, comp, ev.Uid, ev.NewName); if (comp.ContainedId == idCard)
{
SetOwner(uid, comp, ev.Uid, ev.NewName);
}
} }
} }
} }
@@ -86,6 +94,9 @@ namespace Content.Server.PDA
protected override void OnItemInserted(EntityUid uid, PdaComponent pda, EntInsertedIntoContainerMessage args) protected override void OnItemInserted(EntityUid uid, PdaComponent pda, EntInsertedIntoContainerMessage args)
{ {
base.OnItemInserted(uid, pda, args); base.OnItemInserted(uid, pda, args);
var id = CompOrNull<IdCardComponent>(pda.ContainedId);
if (id != null)
pda.OwnerName = id.FullName;
UpdatePdaUi(uid, pda); UpdatePdaUi(uid, pda);
} }

View File

@@ -32,6 +32,12 @@ public sealed partial class ChameleonClothingComponent : Component
/// </summary> /// </summary>
[ViewVariables] [ViewVariables]
public EntityUid? User; public EntityUid? User;
/// <summary>
/// Filter possible chameleon options by a tag in addition to WhitelistChameleon.
/// </summary>
[DataField]
public string? RequireTag;
} }
[Serializable, NetSerializable] [Serializable, NetSerializable]
@@ -39,11 +45,13 @@ public sealed class ChameleonBoundUserInterfaceState : BoundUserInterfaceState
{ {
public readonly SlotFlags Slot; public readonly SlotFlags Slot;
public readonly string? SelectedId; public readonly string? SelectedId;
public readonly string? RequiredTag;
public ChameleonBoundUserInterfaceState(SlotFlags slot, string? selectedId) public ChameleonBoundUserInterfaceState(SlotFlags slot, string? selectedId, string? requiredTag)
{ {
Slot = slot; Slot = slot;
SelectedId = selectedId; SelectedId = selectedId;
RequiredTag = requiredTag;
} }
} }

View File

@@ -6,6 +6,7 @@ using Content.Shared.Inventory.Events;
using Content.Shared.Item; using Content.Shared.Item;
using Content.Shared.Tag; using Content.Shared.Tag;
using Robust.Shared.Prototypes; using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.Manager;
namespace Content.Shared.Clothing.EntitySystems; namespace Content.Shared.Clothing.EntitySystems;
@@ -13,10 +14,12 @@ public abstract class SharedChameleonClothingSystem : EntitySystem
{ {
[Dependency] private readonly IComponentFactory _factory = default!; [Dependency] private readonly IComponentFactory _factory = default!;
[Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly ISerializationManager _serialization = default!;
[Dependency] private readonly ClothingSystem _clothingSystem = default!; [Dependency] private readonly ClothingSystem _clothingSystem = default!;
[Dependency] private readonly ContrabandSystem _contraband = default!; [Dependency] private readonly ContrabandSystem _contraband = default!;
[Dependency] private readonly MetaDataSystem _metaData = default!; [Dependency] private readonly MetaDataSystem _metaData = default!;
[Dependency] private readonly SharedItemSystem _itemSystem = default!; [Dependency] private readonly SharedItemSystem _itemSystem = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly TagSystem _tag = default!; [Dependency] private readonly TagSystem _tag = default!;
public override void Initialize() public override void Initialize()
@@ -71,6 +74,14 @@ public abstract class SharedChameleonClothingSystem : EntitySystem
_clothingSystem.CopyVisuals(uid, otherClothing, clothing); _clothingSystem.CopyVisuals(uid, otherClothing, clothing);
} }
// appearance data logic
if (TryComp(uid, out AppearanceComponent? appearance) &&
proto.TryGetComponent("Appearance", out AppearanceComponent? appearanceOther))
{
_appearance.AppendData(appearanceOther, uid);
Dirty(uid, appearance);
}
// properly mark contraband // properly mark contraband
if (proto.TryGetComponent("Contraband", out ContrabandComponent? contra)) if (proto.TryGetComponent("Contraband", out ContrabandComponent? contra))
{ {
@@ -88,7 +99,7 @@ public abstract class SharedChameleonClothingSystem : EntitySystem
/// <summary> /// <summary>
/// Check if this entity prototype is valid target for chameleon item. /// Check if this entity prototype is valid target for chameleon item.
/// </summary> /// </summary>
public bool IsValidTarget(EntityPrototype proto, SlotFlags chameleonSlot = SlotFlags.NONE) public bool IsValidTarget(EntityPrototype proto, SlotFlags chameleonSlot = SlotFlags.NONE, string? requiredTag = null)
{ {
// check if entity is valid // check if entity is valid
if (proto.Abstract || proto.HideSpawnMenu) if (proto.Abstract || proto.HideSpawnMenu)
@@ -98,6 +109,9 @@ public abstract class SharedChameleonClothingSystem : EntitySystem
if (!proto.TryGetComponent(out TagComponent? tag, _factory) || !_tag.HasTag(tag, "WhitelistChameleon")) if (!proto.TryGetComponent(out TagComponent? tag, _factory) || !_tag.HasTag(tag, "WhitelistChameleon"))
return false; return false;
if (requiredTag != null && !_tag.HasTag(tag, requiredTag))
return false;
// check if it's valid clothing // check if it's valid clothing
if (!proto.TryGetComponent("Clothing", out ClothingComponent? clothing)) if (!proto.TryGetComponent("Clothing", out ClothingComponent? clothing))
return false; return false;

View File

@@ -13,12 +13,6 @@ namespace Content.Shared.PDA
public const string PdaPenSlotId = "PDA-pen"; public const string PdaPenSlotId = "PDA-pen";
public const string PdaPaiSlotId = "PDA-pai"; public const string PdaPaiSlotId = "PDA-pai";
/// <summary>
/// The base PDA sprite state, eg. "pda", "pda-clown"
/// </summary>
[DataField("state")]
public string? State;
[DataField("idSlot")] [DataField("idSlot")]
public ItemSlot IdSlot = new(); public ItemSlot IdSlot = new();

View File

@@ -5,7 +5,8 @@ namespace Content.Shared.PDA
[Serializable, NetSerializable] [Serializable, NetSerializable]
public enum PdaVisuals public enum PdaVisuals
{ {
IdCardInserted IdCardInserted,
PdaType
} }
[Serializable, NetSerializable] [Serializable, NetSerializable]

View File

@@ -199,6 +199,7 @@
components: components:
- type: StorageFill - type: StorageFill
contents: contents:
- id: ChameleonPDA
- id: ClothingUniformJumpsuitChameleon - id: ClothingUniformJumpsuitChameleon
- id: ClothingOuterChameleon - id: ClothingOuterChameleon
- id: ClothingNeckChameleon - id: ClothingNeckChameleon

View File

@@ -6,6 +6,7 @@
sprite: /Textures/Clothing/OuterClothing/Misc/black_hoodie.rsi sprite: /Textures/Clothing/OuterClothing/Misc/black_hoodie.rsi
state: icon state: icon
content: content:
- ChameleonPDA
- ClothingUniformJumpsuitChameleon - ClothingUniformJumpsuitChameleon
- ClothingOuterChameleon - ClothingOuterChameleon
- ClothingNeckChameleon - ClothingNeckChameleon

View File

@@ -6,10 +6,15 @@
description: Personal Data Assistant. description: Personal Data Assistant.
components: components:
- type: Appearance - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda
- type: Sprite - type: Sprite
sprite: Objects/Devices/pda.rsi sprite: Objects/Devices/pda.rsi
layers: layers:
- map: [ "enum.PdaVisualLayers.Base" ] - map: [ "enum.PdaVisualLayers.Base" ]
state: "pda"
- state: "light_overlay" - state: "light_overlay"
map: [ "enum.PdaVisualLayers.Flashlight" ] map: [ "enum.PdaVisualLayers.Flashlight" ]
shader: "unshaded" shader: "unshaded"
@@ -22,7 +27,6 @@
sprite: Objects/Devices/pda.rsi sprite: Objects/Devices/pda.rsi
state: pda state: pda
- type: Pda - type: Pda
state: pda
paiSlot: paiSlot:
priority: -2 priority: -2
whitelist: whitelist:
@@ -41,6 +45,7 @@
whitelist: whitelist:
components: components:
- IdCard - IdCard
- type: PdaVisuals
- type: Item - type: Item
size: Small size: Small
- type: ContainerContainer - type: ContainerContainer
@@ -102,6 +107,8 @@
- type: Tag - type: Tag
tags: tags:
- DoorBumpOpener - DoorBumpOpener
- WhitelistChameleon
- WhitelistChameleonPDA
- type: Input - type: Input
context: "human" context: "human"
- type: SentienceTarget # sentient PDA = pAI lite - type: SentienceTarget # sentient PDA = pAI lite
@@ -147,7 +154,6 @@
components: components:
- type: Pda - type: Pda
id: PassengerIDCard id: PassengerIDCard
state: pda
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#717059" borderColor: "#717059"
@@ -159,7 +165,11 @@
components: components:
- type: Pda - type: Pda
id: TechnicalAssistantIDCard id: TechnicalAssistantIDCard
state: pda-interntech - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-interntech
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#717059" borderColor: "#717059"
accentVColor: "#949137" accentVColor: "#949137"
@@ -174,7 +184,11 @@
components: components:
- type: Pda - type: Pda
id: MedicalInternIDCard id: MedicalInternIDCard
state: pda-internmed - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-internmed
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#717059" borderColor: "#717059"
accentVColor: "#447987" accentVColor: "#447987"
@@ -192,7 +206,11 @@
components: components:
- type: Pda - type: Pda
id: SecurityCadetIDCard id: SecurityCadetIDCard
state: pda-interncadet - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-interncadet
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#717059" borderColor: "#717059"
accentVColor: "#A32D26" accentVColor: "#A32D26"
@@ -207,7 +225,11 @@
components: components:
- type: Pda - type: Pda
id: ResearchAssistantIDCard id: ResearchAssistantIDCard
state: pda-internsci - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-internsci
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#717059" borderColor: "#717059"
accentVColor: "#8900c9" accentVColor: "#8900c9"
@@ -222,7 +244,11 @@
components: components:
- type: Pda - type: Pda
id: ServiceWorkerIDCard id: ServiceWorkerIDCard
state: pda-internservice - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-internservice
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#717059" borderColor: "#717059"
accentVColor: "#00cc35" accentVColor: "#00cc35"
@@ -237,7 +263,11 @@
components: components:
- type: Pda - type: Pda
id: ChefIDCard id: ChefIDCard
state: pda-cook - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-cook
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#d7d7d0" borderColor: "#d7d7d0"
- type: Icon - type: Icon
@@ -253,7 +283,11 @@
components: components:
- type: Pda - type: Pda
id: BotanistIDCard id: BotanistIDCard
state: pda-hydro - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-hydro
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#44843c" borderColor: "#44843c"
accentVColor: "#00cc35" accentVColor: "#00cc35"
@@ -268,7 +302,6 @@
components: components:
- type: Pda - type: Pda
id: ClownIDCard id: ClownIDCard
state: pda-clown
penSlot: penSlot:
startingItem: CrayonOrange # no pink crayon?!? startingItem: CrayonOrange # no pink crayon?!?
# ^ Still unacceptable. # ^ Still unacceptable.
@@ -278,6 +311,11 @@
whitelist: whitelist:
tags: tags:
- Write - Write
- type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-clown
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#C18199" borderColor: "#C18199"
- type: Icon - type: Icon
@@ -312,7 +350,9 @@
components: components:
- type: Pda - type: Pda
id: VisitorIDCard id: VisitorIDCard
state: pda-clown - type: Tag # Ignore Chameleon tags
tags:
- DoorBumpOpener
- type: entity - type: entity
parent: BasePDA parent: BasePDA
@@ -322,12 +362,16 @@
components: components:
- type: Pda - type: Pda
id: MimeIDCard id: MimeIDCard
state: pda-mime
idSlot: # rewrite without sound because mime idSlot: # rewrite without sound because mime
name: ID Card name: ID Card
whitelist: whitelist:
components: components:
- IdCard - IdCard
- type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-mime
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#d7d7d0" borderColor: "#d7d7d0"
accentHColor: "#333333" accentHColor: "#333333"
@@ -343,7 +387,11 @@
components: components:
- type: Pda - type: Pda
id: ChaplainIDCard id: ChaplainIDCard
state: pda-chaplain - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-chaplain
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#333333" borderColor: "#333333"
- type: Icon - type: Icon
@@ -356,7 +404,9 @@
components: components:
- type: Pda - type: Pda
id: VisitorIDCard id: VisitorIDCard
state: pda-chaplain - type: Tag # Ignore Chameleon tags
tags:
- DoorBumpOpener
- type: entity - type: entity
name: quartermaster PDA name: quartermaster PDA
@@ -366,7 +416,11 @@
components: components:
- type: Pda - type: Pda
id: QuartermasterIDCard id: QuartermasterIDCard
state: pda-qm - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-qm
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#e39751" borderColor: "#e39751"
accentVColor: "#a23e3e" accentVColor: "#a23e3e"
@@ -381,7 +435,11 @@
components: components:
- type: Pda - type: Pda
id: CargoIDCard id: CargoIDCard
state: pda-cargo - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-cargo
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#e39751" borderColor: "#e39751"
- type: Icon - type: Icon
@@ -395,7 +453,11 @@
components: components:
- type: Pda - type: Pda
id: SalvageIDCard id: SalvageIDCard
state: pda-miner - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-miner
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#af9366" borderColor: "#af9366"
accentVColor: "#8900c9" accentVColor: "#8900c9"
@@ -417,7 +479,11 @@
components: components:
- type: Pda - type: Pda
id: BartenderIDCard id: BartenderIDCard
state: pda-bartender - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-bartender
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#333333" borderColor: "#333333"
- type: Icon - type: Icon
@@ -431,13 +497,17 @@
components: components:
- type: Pda - type: Pda
id: LibrarianIDCard id: LibrarianIDCard
state: pda-library
penSlot: penSlot:
startingItem: LuxuryPen startingItem: LuxuryPen
priority: -1 priority: -1
whitelist: whitelist:
tags: tags:
- Write - Write
- type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-library
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#858585" borderColor: "#858585"
- type: Icon - type: Icon
@@ -450,7 +520,9 @@
components: components:
- type: Pda - type: Pda
id: VisitorIDCard id: VisitorIDCard
state: pda-library - type: Tag # Ignore Chameleon tags
tags:
- DoorBumpOpener
- type: entity - type: entity
parent: BaseSecurityPDA parent: BaseSecurityPDA
@@ -460,13 +532,17 @@
components: components:
- type: Pda - type: Pda
id: LawyerIDCard id: LawyerIDCard
state: pda-lawyer
penSlot: penSlot:
startingItem: LuxuryPen startingItem: LuxuryPen
priority: -1 priority: -1
whitelist: whitelist:
tags: tags:
- Write - Write
- type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-lawyer
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#6f6192" borderColor: "#6f6192"
- type: Icon - type: Icon
@@ -479,7 +555,9 @@
components: components:
- type: Pda - type: Pda
id: VisitorIDCard id: VisitorIDCard
state: pda-lawyer - type: Tag # Ignore Chameleon tags
tags:
- DoorBumpOpener
- type: entity - type: entity
parent: BasePDA parent: BasePDA
@@ -489,7 +567,11 @@
components: components:
- type: Pda - type: Pda
id: JanitorIDCard id: JanitorIDCard
state: pda-janitor - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-janitor
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#5D2D56" borderColor: "#5D2D56"
- type: Icon - type: Icon
@@ -503,13 +585,17 @@
components: components:
- type: Pda - type: Pda
id: CaptainIDCard id: CaptainIDCard
state: pda-captain
penSlot: penSlot:
startingItem: PenCap startingItem: PenCap
priority: -1 priority: -1
whitelist: whitelist:
tags: tags:
- Write - Write
- type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-captain
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#7C5D00" borderColor: "#7C5D00"
- type: Icon - type: Icon
@@ -523,13 +609,17 @@
components: components:
- type: Pda - type: Pda
id: HoPIDCard id: HoPIDCard
state: pda-hop
penSlot: penSlot:
startingItem: PenHop startingItem: PenHop
priority: -1 priority: -1
whitelist: whitelist:
tags: tags:
- Write - Write
- type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-hop
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#789876" borderColor: "#789876"
accentHColor: "#447987" accentHColor: "#447987"
@@ -544,7 +634,11 @@
components: components:
- type: Pda - type: Pda
id: CEIDCard id: CEIDCard
state: pda-ce - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-ce
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#949137" borderColor: "#949137"
accentHColor: "#447987" accentHColor: "#447987"
@@ -559,7 +653,11 @@
components: components:
- type: Pda - type: Pda
id: EngineeringIDCard id: EngineeringIDCard
state: pda-engineer - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-engineer
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#949137" borderColor: "#949137"
accentVColor: "#A32D26" accentVColor: "#A32D26"
@@ -574,7 +672,11 @@
components: components:
- type: Pda - type: Pda
id: CMOIDCard id: CMOIDCard
state: pda-cmo - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-cmo
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#d7d7d0" borderColor: "#d7d7d0"
accentHColor: "#447987" accentHColor: "#447987"
@@ -590,7 +692,11 @@
components: components:
- type: Pda - type: Pda
id: MedicalIDCard id: MedicalIDCard
state: pda-medical - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-medical
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#d7d7d0" borderColor: "#d7d7d0"
accentVColor: "#447987" accentVColor: "#447987"
@@ -607,7 +713,9 @@
components: components:
- type: Pda - type: Pda
id: VisitorIDCard id: VisitorIDCard
state: pda-medical - type: Tag # Ignore Chameleon tags
tags:
- DoorBumpOpener
- type: entity - type: entity
parent: BaseMedicalPDA parent: BaseMedicalPDA
@@ -617,7 +725,11 @@
components: components:
- type: Pda - type: Pda
id: ParamedicIDCard id: ParamedicIDCard
state: pda-paramedic - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-paramedic
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#d7d7d0" borderColor: "#d7d7d0"
accentVColor: "#2a4b5b" accentVColor: "#2a4b5b"
@@ -632,7 +744,11 @@
components: components:
- type: Pda - type: Pda
id: ChemistIDCard id: ChemistIDCard
state: pda-chemistry - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-chemistry
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#d7d7d0" borderColor: "#d7d7d0"
accentVColor: "#B34200" accentVColor: "#B34200"
@@ -647,7 +763,11 @@
components: components:
- type: Pda - type: Pda
id: RDIDCard id: RDIDCard
state: pda-rd - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-rd
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#d7d7d0" borderColor: "#d7d7d0"
accentHColor: "#447987" accentHColor: "#447987"
@@ -663,7 +783,11 @@
components: components:
- type: Pda - type: Pda
id: ResearchIDCard id: ResearchIDCard
state: pda-science - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-science
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#d7d7d0" borderColor: "#d7d7d0"
accentVColor: "#8900c9" accentVColor: "#8900c9"
@@ -678,7 +802,11 @@
components: components:
- type: Pda - type: Pda
id: HoSIDCard id: HoSIDCard
state: pda-hos - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-hos
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#A32D26" borderColor: "#A32D26"
accentHColor: "#447987" accentHColor: "#447987"
@@ -700,7 +828,11 @@
components: components:
- type: Pda - type: Pda
id: WardenIDCard id: WardenIDCard
state: pda-warden - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-warden
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#A32D26" borderColor: "#A32D26"
accentVColor: "#949137" accentVColor: "#949137"
@@ -715,7 +847,11 @@
components: components:
- type: Pda - type: Pda
id: SecurityIDCard id: SecurityIDCard
state: pda-security - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-security
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#A32D26" borderColor: "#A32D26"
- type: Icon - type: Icon
@@ -729,12 +865,16 @@
components: components:
- type: Pda - type: Pda
id: CentcomIDCard id: CentcomIDCard
state: pda-centcom
penSlot: penSlot:
startingItem: PenCentcom startingItem: PenCentcom
whitelist: whitelist:
tags: tags:
- Write - Write
- type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-centcom
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#00842e" borderColor: "#00842e"
- type: Icon - type: Icon
@@ -773,6 +913,9 @@
- WantedListCartridge - WantedListCartridge
- MedTekCartridge - MedTekCartridge
- AstroNavCartridge - AstroNavCartridge
- type: Tag # Ignore Chameleon tags
tags:
- DoorBumpOpener
- type: entity - type: entity
parent: CentcomPDA parent: CentcomPDA
@@ -781,6 +924,9 @@
components: components:
- type: Pda - type: Pda
id: CentcomIDCardDeathsquad id: CentcomIDCardDeathsquad
- type: Tag # Ignore Chameleon tags
tags:
- DoorBumpOpener
- type: entity - type: entity
parent: BasePDA parent: BasePDA
@@ -790,7 +936,11 @@
components: components:
- type: Pda - type: Pda
id: MusicianIDCard id: MusicianIDCard
state: pda-musician - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-musician
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#333333" borderColor: "#333333"
- type: Icon - type: Icon
@@ -808,7 +958,9 @@
components: components:
- type: Pda - type: Pda
id: VisitorIDCard id: VisitorIDCard
state: pda-musician - type: Tag # Ignore Chameleon tags
tags:
- DoorBumpOpener
- type: entity - type: entity
parent: BasePDA parent: BasePDA
@@ -818,7 +970,11 @@
components: components:
- type: Pda - type: Pda
id: AtmosIDCard id: AtmosIDCard
state: pda-atmos - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-atmos
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#949137" borderColor: "#949137"
accentVColor: "#447987" accentVColor: "#447987"
@@ -833,7 +989,11 @@
components: components:
- type: Pda - type: Pda
id: PassengerIDCard id: PassengerIDCard
state: pda-clear - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-clear
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#288e4d" borderColor: "#288e4d"
- type: Icon - type: Icon
@@ -845,7 +1005,9 @@
components: components:
- type: Pda - type: Pda
id: VisitorIDCard id: VisitorIDCard
state: pda - type: Tag # Ignore Chameleon tags
tags:
- DoorBumpOpener
- type: entity - type: entity
parent: BasePDA parent: BasePDA
@@ -855,7 +1017,11 @@
components: components:
- type: Pda - type: Pda
id: SyndicateIDCard id: SyndicateIDCard
state: pda-syndi - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-syndi
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#891417" borderColor: "#891417"
- type: Icon - type: Icon
@@ -874,7 +1040,11 @@
components: components:
- type: Pda - type: Pda
id: ERTLeaderIDCard id: ERTLeaderIDCard
state: pda-ert - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-ert
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#A32D26" borderColor: "#A32D26"
accentHColor: "#447987" accentHColor: "#447987"
@@ -963,7 +1133,11 @@
components: components:
- type: Pda - type: Pda
id: PsychologistIDCard id: PsychologistIDCard
state: pda-medical - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-medical
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#d7d7d0" borderColor: "#d7d7d0"
accentVColor: "#447987" accentVColor: "#447987"
@@ -978,13 +1152,17 @@
components: components:
- type: Pda - type: Pda
id: ReporterIDCard id: ReporterIDCard
state: pda-reporter
penSlot: penSlot:
startingItem: LuxuryPen startingItem: LuxuryPen
priority: -1 priority: -1
whitelist: whitelist:
tags: tags:
- Write - Write
- type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-reporter
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#3f3f74" borderColor: "#3f3f74"
- type: Icon - type: Icon
@@ -998,7 +1176,11 @@
components: components:
- type: Pda - type: Pda
id: ZookeeperIDCard id: ZookeeperIDCard
state: pda-zookeeper - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-zookeeper
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#ffe685" borderColor: "#ffe685"
- type: Icon - type: Icon
@@ -1012,7 +1194,11 @@
components: components:
- type: Pda - type: Pda
id: BoxerIDCard id: BoxerIDCard
state: pda-boxer - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-boxer
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#333333" borderColor: "#333333"
accentVColor: "#390504" accentVColor: "#390504"
@@ -1027,7 +1213,11 @@
components: components:
- type: Pda - type: Pda
id: DetectiveIDCard id: DetectiveIDCard
state: pda-detective - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-detective
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#774705" borderColor: "#774705"
- type: Icon - type: Icon
@@ -1048,7 +1238,11 @@
components: components:
- type: Pda - type: Pda
id: BrigmedicIDCard id: BrigmedicIDCard
state: pda-brigmedic - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-brigmedic
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#A32D26" borderColor: "#A32D26"
accentHColor: "#d7d7d0" accentHColor: "#d7d7d0"
@@ -1072,7 +1266,11 @@
components: components:
- type: Pda - type: Pda
id: CluwneIDCard id: CluwneIDCard
state: pda-cluwne - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-cluwne
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#1c8f4d" borderColor: "#1c8f4d"
- type: Icon - type: Icon
@@ -1094,7 +1292,11 @@
components: components:
- type: Pda - type: Pda
id: SeniorEngineerIDCard id: SeniorEngineerIDCard
state: pda-seniorengineer - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-seniorengineer
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#949137" borderColor: "#949137"
accentVColor: "#CD6900" accentVColor: "#CD6900"
@@ -1109,7 +1311,11 @@
components: components:
- type: Pda - type: Pda
id: SeniorResearcherIDCard id: SeniorResearcherIDCard
state: pda-seniorresearcher - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-seniorresearcher
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#d7d7d0" borderColor: "#d7d7d0"
accentHColor: "#8900c9" accentHColor: "#8900c9"
@@ -1125,7 +1331,11 @@
components: components:
- type: Pda - type: Pda
id: SeniorPhysicianIDCard id: SeniorPhysicianIDCard
state: pda-seniorphysician - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-seniorphysician
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#d7d7d0" borderColor: "#d7d7d0"
accentHColor: "#447987" accentHColor: "#447987"
@@ -1141,7 +1351,11 @@
components: components:
- type: Pda - type: Pda
id: SeniorOfficerIDCard id: SeniorOfficerIDCard
state: pda-seniorofficer - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-seniorofficer
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#A32D26" borderColor: "#A32D26"
accentVColor: "#DFDFDF" accentVColor: "#DFDFDF"
@@ -1156,7 +1370,11 @@
components: components:
- type: Pda - type: Pda
id: PirateIDCard id: PirateIDCard
state: pda-pirate - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-pirate
- type: Icon - type: Icon
state: pda-pirate state: pda-pirate
@@ -1168,7 +1386,11 @@
components: components:
- type: Pda - type: Pda
id: SyndicateIDCard id: SyndicateIDCard
state: pda-syndi-agent - type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-syndi-agent
- type: PdaBorderColor - type: PdaBorderColor
borderColor: "#891417" borderColor: "#891417"
- type: Icon - type: Icon
@@ -1178,3 +1400,34 @@
preinstalled: preinstalled:
- NotekeeperCartridge - NotekeeperCartridge
- MedTekCartridge - MedTekCartridge
- type: entity
parent: BasePDA
id: ChameleonPDA
name: passenger PDA
description: Why isn't it gray?
suffix: Chameleon
components:
- type: PdaBorderColor
borderColor: "#717059"
- type: Tag
tags: # ignore "WhitelistChameleon" tag
- DoorBumpOpener
- type: ChameleonClothing
slot: [idcard]
default: PassengerPDA
requireTag: WhitelistChameleonPDA
- type: UserInterface
interfaces:
enum.PdaUiKey.Key:
type: PdaBoundUserInterface
enum.StoreUiKey.Key:
type: StoreBoundUserInterface
enum.RingerUiKey.Key:
type: RingerBoundUserInterface
enum.InstrumentUiKey.Key:
type: InstrumentBoundUserInterface
enum.HealthAnalyzerUiKey.Key:
type: HealthAnalyzerBoundUserInterface
enum.ChameleonUiKey.Key:
type: ChameleonBoundUserInterface

View File

@@ -22,6 +22,7 @@
tags: tags:
- DoorBumpOpener - DoorBumpOpener
- WhitelistChameleon - WhitelistChameleon
- WhitelistChameleonIdCard
- type: StealTarget - type: StealTarget
stealGroup: IDCard stealGroup: IDCard
@@ -116,6 +117,7 @@
tags: tags:
- DoorBumpOpener - DoorBumpOpener
- WhitelistChameleon - WhitelistChameleon
- WhitelistChameleonIdCard
- HighRiskItem - HighRiskItem
- type: StealTarget - type: StealTarget
stealGroup: CaptainIDCard stealGroup: CaptainIDCard
@@ -314,6 +316,9 @@
- type: PresetIdCard - type: PresetIdCard
job: Bartender job: Bartender
name: Pun Pun name: Pun Pun
- type: Tag # Ignore Chameleon tags
tags:
- DoorBumpOpener
- type: entity - type: entity
parent: IDCardStandard parent: IDCardStandard
@@ -599,6 +604,7 @@
- type: ChameleonClothing - type: ChameleonClothing
slot: [idcard] slot: [idcard]
default: PassengerIDCard default: PassengerIDCard
requireTag: WhitelistChameleonIdCard
- type: UserInterface - type: UserInterface
interfaces: interfaces:
enum.AgentIDCardUiKey.Key: enum.AgentIDCardUiKey.Key:
@@ -811,3 +817,6 @@
- NuclearOperative - NuclearOperative
- SyndicateAgent - SyndicateAgent
- Wizard - Wizard
- type: Tag # Ignore Chameleon tags
tags:
- DoorBumpOpener

View File

@@ -1330,6 +1330,12 @@
- type: Tag - type: Tag
id: WhitelistChameleon id: WhitelistChameleon
- type: Tag
id: WhitelistChameleonIdCard
- type: Tag
id: WhitelistChameleonPDA
- type: Tag - type: Tag
id: Window id: Window