Files
wwdpublic/Content.Shared/StatusIcon/StatusIconPrototype.cs
John Willis c565776b57 Psionics Registry Computer, PsiWatch, and Epi-Glasses/Epi-HUD (#1598)
# Description
This adds the wonderful `Psionics Registry Computer` which allows you
to, just like Criminal Records, mark people that will show their icons
to other individuals wearing the appropriate gear, and will allow you to
keep track of such individuals in a similar way by making a `PsiWatch`
app that will show the reasons.

For the purposes of easement, I've left the fingerprints and DNA in
there, but individuals will not show up with it in the actual file. The
game would just crash when I removed the filters, so I left them in. The
dropdown also just looked cleaner when it was there instead of removing
it and replacing it with a label.

I've recolored the sprites for the sec-glasses and sec-HUD to make the
epi-glasses and epi-HUD using Epistemics colors.
I've recolored the sprite for the CriminalRecords computer to look
different and be cool.

---

# TODO
A list of things I've done split into categories.

### Spriting
- [x] (Recolor) Sprite the epi-glasses and epi-HUD.
- [x] Sprite the PsionicsRecords computer screen.
- [x] Sprite the Psionics Status icons.
- [x] Change the sprite for the Psionics Abusing (it is hard to tell any
difference from suspected right now).

### Records
- [x] Set up records XAML that basically duplicates the Criminal
Records.
- [x] Remove History (not necessary).
- [x] Change all the naming schema to match.
- [x] Change the categories and setup reason-requirement for each
submission type.
- [x] Change the "reason" to "psionics" so it is more intuitive.

### Computer Setup
- [x] Setup computer to show UI.
- [x] Setup system to report to report to Epistemics (Science) radio
when anything is changed.
- [x] Setup the system to only accept Epistemics (Research) access.
- [x] Setup the computer board.
- [x] Setup the sprites for the computers.

### Equipment and Icons
- [x] Create the icons and ensure the ShowPsionicsRecordIcons prototype
works.
- [x] Create the entity prototypes for the glasses and HUD in the game
to show textures.
- [x] Set it up so the glasses and HUD show the user the icons when
they're wearing them (having hard time fixing this at 06:00 in the
morning).

### PDA App
- [x] Setup the PDA app to mimic the SecWatch app as its own (PsiWatch).
- [x] Add the PDA app cartridge to Chaplain, Mantis, Cataloguer, and
Mystagogue.
- [x] Add cartridge to the Mystagogue locker (so they can give others
it).

### Loadouts
- [x] Add the epi-HUD to the Chaplain, Mantis, Cataloguer and
Mystagogue.
- [x] Add the epi-glasses to the Mystagogue.
- [x] Add the epi-glasses to Chaplain, Mantis, and Cataloguer (for 3
points).

### Mapping
- [x] Add the Psionics Registry Computer to every map.

### Miscellaneous Fixes/Changes
- [x] Make the computer only work for Chaplain (Chapel), Cataloguer
(Library), Mantis (Mantis), and Mystagogue (ResearchDirector).
- [x] Fix Chaplain PDA (did not have any programs installed
automatically, now it does).

---

# Media
I will add more media when I finish the rest. For now, it's just us.

<details><summary><h3>Registry Working</h3></summary>
<p>

https://github.com/user-attachments/assets/f534a1b6-6873-4bcd-9fe5-c7138069ecc0

</p>
</details>
<details><summary><h3>Loadouts and PsiWatch</h3></summary>
<p>

Cataloguer

![image](https://github.com/user-attachments/assets/3a5c3b2c-13e8-470f-8ea7-cff828f03e8d)
Chaplain

![image](https://github.com/user-attachments/assets/35a1255c-9447-4aeb-b200-48f2d00782e1)
Mantis

![image](https://github.com/user-attachments/assets/155ac859-10fd-4233-a84d-31f8f32b2f71)
Mystagogue

![image](https://github.com/user-attachments/assets/ddfd178f-2d79-4e1f-9226-51352eb8c0c9)

---

No Users in PsiWatch

![image](https://github.com/user-attachments/assets/63186e30-8c04-409b-8478-eb6bc9006f5f)
Suspected in PsiWatch

![image](https://github.com/user-attachments/assets/e9009714-0ed5-496f-a836-04f01f9e13e8)
Registered in PsiWatch

![image](https://github.com/user-attachments/assets/5f565ec6-4f5f-4303-89cc-f9201de01568)
Abusing in PsiWatch

![image](https://github.com/user-attachments/assets/d2f623b4-f2fa-419b-9b3e-a77001aff8ae)
PsiWatch in PDA

![image](https://github.com/user-attachments/assets/262ffd2e-f798-41db-8e45-4b64613aac0d)
Picture of the PDAs and PsiWatch Cartridge

![image](https://github.com/user-attachments/assets/ed334e8d-6236-4252-82b8-327f59609751)

---

Mystagogue Lockers with PsiWatch Cartridge

![image](https://github.com/user-attachments/assets/e56cef9c-2d9e-46bb-87ca-3e6cd2c85240)

</p>
</details>
<details><summary><h3>Mapping Locations</h3></summary>
<p>

Arena

![image](https://github.com/user-attachments/assets/b24e997d-051d-4def-a28c-dc1029566f0d)
Asterisk

![image](https://github.com/user-attachments/assets/6e2faf02-350e-4608-b629-c402d8c2a0fc)
Core

![image](https://github.com/user-attachments/assets/0d43e3a0-36c2-4c51-9745-d2a4e1d70217)
Edge

![image](https://github.com/user-attachments/assets/478180e2-e63a-4d9a-bf13-365b2648778b)
Europa

![image](https://github.com/user-attachments/assets/a385fc48-016e-40bd-8dbc-dc3904b62f05)
Gaxstation

![image](https://github.com/user-attachments/assets/207c267b-bf01-4ba5-b829-034ad26d48ef)
Glacier

![image](https://github.com/user-attachments/assets/2432840a-2ecc-4957-b82e-ed8406453fbc)
Hive

![image](https://github.com/user-attachments/assets/d03ec8a0-de82-4f0f-af90-3bb3e76c1ff7)
Lighthouse

![image](https://github.com/user-attachments/assets/3a6b8cc0-5692-4e12-a90f-8d0427469cd5)
Meta

![image](https://github.com/user-attachments/assets/c8092fd1-a2cb-4b07-966c-c13a673f16ac)
Pebble

![image](https://github.com/user-attachments/assets/084d76a1-b458-4693-a22e-3787a00f69fd)
Radstation

![image](https://github.com/user-attachments/assets/a98b48dc-70e3-429c-b2f5-99ba2a5f194a)
Saltern

![image](https://github.com/user-attachments/assets/b7e52f6f-8d55-476f-9991-de72c559fc16)
Shoukou

![image](https://github.com/user-attachments/assets/2495e13f-f07a-414d-993e-7e29e48c7f9c)
Submarine

![image](https://github.com/user-attachments/assets/08a92a84-513f-40d2-8ed3-313189805838)
Tortuga

![image](https://github.com/user-attachments/assets/0009b512-ff07-4d17-8825-71a182cb67dc)

</p>
</details>

---

# Changelog
🆑
- add: Added Psionics Registry Computer. Now you can record Psionics
users in Epistemics.
- add: Added epi-glasses and epi-HUD to see Psionics Users icons.
(Chaplain, Cataloguer, Mantis, and Mystagogue have access in loadout).
- add: Added PsiWatch. Now you can see the Psionics Records data on your
PDA!
- fix: Fixed Chaplain not having any programs in their PDA on spawn.

---------

Signed-off-by: sleepyyapril <123355664+sleepyyapril@users.noreply.github.com>
Co-authored-by: sleepyyapril <123355664+sleepyyapril@users.noreply.github.com>

(cherry picked from commit fc7ecc44a748f8ef7a4cec613033f51acf238288)
2025-01-20 21:39:09 +03:00

243 lines
6.5 KiB
C#

using Content.Shared.Stealth.Components;
using Content.Shared.Whitelist;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Array;
using Robust.Shared.Utility;
namespace Content.Shared.StatusIcon;
/// <summary>
/// A data structure that holds relevant
/// information for status icons.
/// </summary>
[Virtual, DataDefinition]
public partial class StatusIconData : IComparable<StatusIconData>
{
/// <summary>
/// The icon that's displayed on the entity.
/// </summary>
[DataField(required: true)]
public SpriteSpecifier Icon = default!;
/// <summary>
/// A priority for the order in which the icons will be displayed.
/// </summary>
[DataField]
public int Priority = 10;
/// <summary>
/// Whether or not to hide the icon to ghosts
/// </summary>
[DataField]
public bool VisibleToGhosts = true;
/// <summary>
/// Whether or not to hide the icon when we are inside a container like a locker or a crate.
/// </summary>
[DataField]
public bool HideInContainer = true;
/// <summary>
/// Whether or not to hide the icon when the entity has an active <see cref="StealthComponent"/>
/// </summary>
[DataField]
public bool HideOnStealth = true;
/// <summary>
/// Specifies what entities and components/tags this icon can be shown to.
/// </summary>
[DataField]
public EntityWhitelist? ShowTo;
/// <summary>
/// A preference for where the icon will be displayed. None | Left | Right
/// </summary>
[DataField]
public StatusIconLocationPreference LocationPreference = StatusIconLocationPreference.None;
/// <summary>
/// The layer the icon is displayed on. Mod is drawn above Base. Base | Mod
/// </summary>
[DataField]
public StatusIconLayer Layer = StatusIconLayer.Base;
/// <summary>
/// Sets if the icon should be rendered with or without the effect of lighting.
/// </summary>
[DataField]
public bool IsShaded = false;
public int CompareTo(StatusIconData? other)
{
return Priority.CompareTo(other?.Priority ?? int.MaxValue);
}
}
/// <summary>
/// <see cref="StatusIconData"/> but in new convenient prototype form!
/// </summary>
public abstract partial class StatusIconPrototype : StatusIconData, IPrototype
{
/// <inheritdoc/>
[IdDataField]
public string ID { get; private set; } = default!;
}
/// <summary>
/// StatusIcons for showing jobs on the sec HUD
/// </summary>
[Prototype]
public sealed partial class JobIconPrototype : StatusIconPrototype, IInheritingPrototype
{
/// <inheritdoc />
[ParentDataField(typeof(AbstractPrototypeIdArraySerializer<JobIconPrototype>))]
public string[]? Parents { get; }
/// <inheritdoc />
[NeverPushInheritance]
[AbstractDataField]
public bool Abstract { get; }
/// <summary>
/// Name of the icon used for menu tooltips.
/// </summary>
[DataField]
public string JobName { get; private set; } = string.Empty;
[ViewVariables(VVAccess.ReadOnly)]
public string LocalizedJobName => Loc.GetString(JobName);
/// <summary>
/// Should the agent ID or ID card console be able to use this job icon?
/// </summary>
[DataField]
public bool AllowSelection = true;
}
/// <summary>
/// StatusIcons for the med HUD
/// </summary>
[Prototype]
public sealed partial class HealthIconPrototype : StatusIconPrototype, IInheritingPrototype
{
/// <inheritdoc />
[ParentDataField(typeof(AbstractPrototypeIdArraySerializer<HealthIconPrototype>))]
public string[]? Parents { get; }
/// <inheritdoc />
[NeverPushInheritance]
[AbstractDataField]
public bool Abstract { get; }
}
/// <summary>
/// StatusIcons for the beer goggles and fried onion goggles
/// </summary>
[Prototype]
public sealed partial class SatiationIconPrototype : StatusIconPrototype, IInheritingPrototype
{
/// <inheritdoc />
[ParentDataField(typeof(AbstractPrototypeIdArraySerializer<SatiationIconPrototype>))]
public string[]? Parents { get; }
/// <inheritdoc />
[NeverPushInheritance]
[AbstractDataField]
public bool Abstract { get; }
}
/// <summary>
/// StatusIcons for showing the wanted status on the sec HUD
/// </summary>
[Prototype]
public sealed partial class SecurityIconPrototype : StatusIconPrototype, IInheritingPrototype
{
/// <inheritdoc />
[ParentDataField(typeof(AbstractPrototypeIdArraySerializer<SecurityIconPrototype>))]
public string[]? Parents { get; }
/// <inheritdoc />
[NeverPushInheritance]
[AbstractDataField]
public bool Abstract { get; }
}
/// <summary>
/// StatusIcons for showing the psionics status on the epi HUD
/// </summary>
[Prototype]
public sealed partial class PsionicsIconPrototype : StatusIconPrototype, IInheritingPrototype
{
/// <inheritdoc />
[ParentDataField(typeof(AbstractPrototypeIdArraySerializer<PsionicsIconPrototype>))]
public string[]? Parents { get; }
/// <inheritdoc />
[NeverPushInheritance]
[AbstractDataField]
public bool Abstract { get; }
}
/// <summary>
/// StatusIcons for faction membership
/// </summary>
[Prototype]
public sealed partial class FactionIconPrototype : StatusIconPrototype, IInheritingPrototype
{
/// <inheritdoc />
[ParentDataField(typeof(AbstractPrototypeIdArraySerializer<FactionIconPrototype>))]
public string[]? Parents { get; }
/// <inheritdoc />
[NeverPushInheritance]
[AbstractDataField]
public bool Abstract { get; }
}
/// <summary>
/// StatusIcons for debugging purposes
/// </summary>
[Prototype]
public sealed partial class DebugIconPrototype : StatusIconPrototype, IInheritingPrototype
{
/// <inheritdoc />
[ParentDataField(typeof(AbstractPrototypeIdArraySerializer<DebugIconPrototype>))]
public string[]? Parents { get; }
/// <inheritdoc />
[NeverPushInheritance]
[AbstractDataField]
public bool Abstract { get; }
}
/// <summary>
/// StatusIcons for the SSD indicator
/// </summary>
[Prototype]
public sealed partial class SsdIconPrototype : StatusIconPrototype, IInheritingPrototype
{
/// <inheritdoc />
[ParentDataField(typeof(AbstractPrototypeIdArraySerializer<SsdIconPrototype>))]
public string[]? Parents { get; }
/// <inheritdoc />
[NeverPushInheritance]
[AbstractDataField]
public bool Abstract { get; }
}
[Serializable, NetSerializable]
public enum StatusIconLocationPreference : byte
{
None,
Left,
Right,
}
public enum StatusIconLayer : byte
{
Base,
Mod,
}