Compare commits

...

8 Commits

Author SHA1 Message Date
Vape 245e4e0e30
Merge 2306aa5553 into c3c6a6abd9 2026-05-10 11:45:50 +00:00
Delta-V bot c3c6a6abd9 Automatic changelog update 2026-05-10 13:35:34 +02:00
Stxcking 6f0ad0c181
New: Wallmount Water Dispenser (#5792)
Everything
2026-05-10 13:35:15 +02:00
github-actions[bot] 7abc7a7b66
Update Credits (#5794)
Co-authored-by: DeltaV-Bot <github@deltav.gay>
2026-05-10 04:28:06 +02:00
Delta-V bot 7dc4c5f3fc Automatic changelog update 2026-05-10 01:04:45 +02:00
Cepelinas1 0400ffa8e3
Customizable sec belt/webbing inventory (#5701)
* first

* fix

* spacing

Signed-off-by: Cepelinas1 <kakelis01@gmail.com>

* forgot ftl

---------

Signed-off-by: Cepelinas1 <kakelis01@gmail.com>
2026-05-09 19:04:25 -04:00
Delta-V bot c2fa015a84 Automatic changelog update 2026-05-10 00:20:07 +02:00
pathetic meowmeow ab62d18431
Give silicons PDAs (#5738)
* Give silicons PDAs

* unsaved

* borgos can have a little notification as a treat

* .Value
2026-05-09 22:19:47 +00:00
33 changed files with 519 additions and 66 deletions

View File

@ -1,4 +1,5 @@
using Content.Shared.Movement.Components;
using Content.Client.PDA; // DeltaV
using Content.Shared.Movement.Components;
using Content.Shared.Silicons.Borgs;
using Content.Shared.Silicons.Borgs.Components;
using Robust.Client.GameObjects;
@ -66,6 +67,15 @@ public sealed partial class BorgSwitchableTypeSystem : SharedBorgSwitchableTypeS
}
}
// DeltaV - borg pdas
if (TryComp<PdaBorderColorComponent>(entity, out var pdaBorders))
{
pdaBorders.BorderColor = prototype.PdaBorderColor ?? pdaBorders.BorderColor;
pdaBorders.AccentHColor = prototype.PdaAccentHorizontalColor ?? pdaBorders.AccentHColor;
pdaBorders.AccentVColor = prototype.PdaAccentVerticalColor ?? pdaBorders.AccentVColor;
}
// DeltaV - borg pdas
base.UpdateEntityAppearance(entity, prototype);
}
}

View File

@ -18,6 +18,8 @@ using Content.Shared.Light;
using Content.Shared.Light.EntitySystems;
using Content.Shared.PDA;
using Content.Shared.PDA.Ringer;
using Content.Shared.Silicons.Borgs.Components; // DeltaV - silicon PDAs
using Content.Shared.Silicons.StationAi; // DeltaV - silicon PDAs
using Robust.Server.Containers;
using Robust.Server.GameObjects;
using Robust.Shared.Configuration; // DeltaV - PDA date
@ -168,9 +170,12 @@ namespace Content.Server.PDA
{
_ringer.RingerPlayRingtone(ent.Owner);
if (!_containerSystem.TryGetContainingContainer((ent, null, null), out var container)
|| !TryComp<ActorComponent>(container.Owner, out var actor))
// Begin DeltaV - PDAs can be self-viewed
if (!(TryComp<ActorComponent>(ent, out var actor) ||
(_containerSystem.TryGetContainingContainer((ent, null, null), out var container)
&& TryComp<ActorComponent>(container.Owner, out actor))))
return;
// End DeltaV - PDAs can be self-viewed
var message = FormattedMessage.EscapeText(args.Message);
var wrappedMessage = Loc.GetString("pda-notification-message",
@ -213,6 +218,26 @@ namespace Content.Server.PDA
var programs = _cartridgeLoader.GetAvailablePrograms(uid, loader);
var id = CompOrNull<IdCardComponent>(pda.ContainedId);
// Begin DeltaV - PDAs can be silicons
var owner = id?.FullName;
var job = id?.LocalizedJobTitle;
if (HasComp<BorgChassisComponent>(uid))
{
if (TryComp<BorgSwitchableTypeComponent>(uid, out var switchable) && switchable.SelectedBorgType is { } borgType)
job = Loc.GetString($"borg-type-{borgType}-transponder");
else
job = Loc.GetString("borg-type-any-transponder");
owner = MetaData(uid).EntityName;
}
if (HasComp<StationAiHeldComponent>(uid))
{
job = Loc.GetString($"station-ai-transponder");
owner = MetaData(uid).EntityName;
}
// End DeltaV - PDAs can be silicons
var state = new PdaUpdateState(
programs,
GetNetEntity(loader.ActiveProgram),
@ -222,8 +247,8 @@ namespace Content.Server.PDA
new PdaIdInfoText
{
ActualOwnerName = pda.OwnerName,
IdOwner = id?.FullName,
JobTitle = id?.LocalizedJobTitle,
IdOwner = owner, // DeltaV - silicon PDAs
JobTitle = job, // DeltaV - silicon PDAs
CurrentDate = pda.CurrentDate, // DeltaV - PDA date
StationAlertLevel = pda.StationAlertLevel,
StationAlertColor = pda.StationAlertColor

View File

@ -1,3 +1,4 @@
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Server.Administration.Logs;
using Content.Server.CartridgeLoader;
@ -12,6 +13,8 @@ using Content.Shared._DV.CartridgeLoader.Cartridges;
using Content.Shared._DV.NanoChat;
using Content.Shared.PDA;
using Content.Shared.Radio.Components;
using Content.Shared.Silicons.Borgs.Components;
using Content.Shared.Silicons.StationAi;
using Robust.Shared.Configuration;
using Robust.Shared.Prototypes;
using Robust.Shared.Timing;
@ -63,13 +66,10 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
private void OnActiveProgramChanged(Entity<CartridgeLoaderComponent> ent, ref ActiveProgramChangedEvent args)
{
if (!_pdaQuery.TryGetComponent(ent, out var pda) || pda.ContainedId is not { } cardUid)
if (!GetCardEntity(ent, out var nanoChatCard))
return;
if (!_cardQuery.TryGetComponent(cardUid, out var nanoChatCard))
return;
_nanoChat.SetClosed((cardUid, nanoChatCard), !HasComp<NanoChatCartridgeComponent>(args.NewActiveProgram));
_nanoChat.SetClosed(nanoChatCard.Value.AsNullable(), !HasComp<NanoChatCartridgeComponent>(args.NewActiveProgram));
}
private void OnUiOpened(Entity<CartridgeLoaderComponent> ent, ref BoundUIOpenedEvent args)
@ -77,14 +77,11 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
if (!PdaUiKey.Key.Equals(args.UiKey))
return;
if (!_pdaQuery.TryGetComponent(ent, out var pda) || pda.ContainedId is not { } cardUid)
if (!GetCardEntity(ent, out var nanoChatCard))
return;
if (!_cardQuery.TryGetComponent(cardUid, out var nanoChatCard))
return;
if (nanoChatCard.IsClosed)
_nanoChat.SetClosed((cardUid, nanoChatCard), !HasComp<NanoChatCartridgeComponent>(ent.Comp.ActiveProgram));
if (nanoChatCard.Value.Comp.IsClosed)
_nanoChat.SetClosed(nanoChatCard.Value.AsNullable(), !HasComp<NanoChatCartridgeComponent>(ent.Comp.ActiveProgram));
}
@ -93,15 +90,12 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
if (!PdaUiKey.Key.Equals(args.UiKey))
return;
if (!_pdaQuery.TryGetComponent(ent, out var pda) || pda.ContainedId is not { } cardUid)
return;
if (!_cardQuery.TryGetComponent(cardUid, out var nanoChatCard))
if (!GetCardEntity(ent, out var nanoChatCard))
return;
// Since the UI got closed we always set it to be closed
if (!nanoChatCard.IsClosed)
_nanoChat.SetClosed((cardUid, nanoChatCard), true);
if (!nanoChatCard.Value.Comp.IsClosed)
_nanoChat.SetClosed(nanoChatCard.Value.AsNullable(), true);
}
public override void Update(float frameTime)
@ -120,7 +114,8 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
continue; // TODO Perf: this could be faster if we get rid of the trycomp in the update loop altogether
// There was a reason I did this in the Update loop but I can't remember.
var newCard = pda.ContainedId;
GetCardEntity(cartridge.LoaderUid.Value, out var newCardEnt);
var newCard = newCardEnt?.Owner;
var currentCard = nanoChat.Card;
// If the cards match, nothing to do
@ -149,31 +144,31 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
switch (msg.Type)
{
case NanoChatUiMessageType.NewChat:
HandleNewChat(card, msg);
HandleNewChat(card.Value, msg);
break;
case NanoChatUiMessageType.SelectChat:
HandleSelectChat(card, msg);
HandleSelectChat(card.Value, msg);
break;
case NanoChatUiMessageType.EditChat:
HandleEditChat(card, msg);
HandleEditChat(card.Value, msg);
break;
case NanoChatUiMessageType.CloseChat:
HandleCloseChat(card);
HandleCloseChat(card.Value);
break;
case NanoChatUiMessageType.ToggleMute:
HandleToggleMute(card);
HandleToggleMute(card.Value);
break;
case NanoChatUiMessageType.ToggleMuteChat:
HandleToggleMuteChat(card, msg);
HandleToggleMuteChat(card.Value, msg);
break;
case NanoChatUiMessageType.DeleteChat:
HandleDeleteChat(card, msg);
HandleDeleteChat(card.Value, msg);
break;
case NanoChatUiMessageType.SendMessage:
HandleSendMessage(ent, card, msg);
HandleSendMessage(ent, card.Value, msg);
break;
case NanoChatUiMessageType.ToggleListNumber:
HandleToggleListNumber(card);
HandleToggleListNumber(card.Value);
break;
}
@ -188,9 +183,15 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
/// <returns>True if a valid NanoChat card was found</returns>
private bool GetCardEntity(
EntityUid loaderUid,
out Entity<NanoChatCardComponent> card)
[NotNullWhen(true)] out Entity<NanoChatCardComponent>? card)
{
card = default;
card = null;
if (TryComp<NanoChatCardComponent>(loaderUid, out var selfCard))
{
card = (loaderUid, selfCard);
return true;
}
// Get the PDA and check if it has an ID card
if (!_pdaQuery.TryComp(loaderUid, out var pda) ||
@ -202,6 +203,30 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
return true;
}
/// <summary>
/// Gets the cartridge loader associated with a card.
/// </summary>
private bool GetCartridgeLoader(
Entity<NanoChatCardComponent> card,
[NotNullWhen(true)] out Entity<CartridgeLoaderComponent>? loader)
{
loader = null;
if (TryComp<CartridgeLoaderComponent>(card, out var selfLoader))
{
loader = (card, selfLoader);
return true;
}
if (card.Comp.PdaUid is { } pdaUid && TryComp<CartridgeLoaderComponent>(pdaUid, out var pdaLoader))
{
loader = (pdaUid, pdaLoader);
return true;
}
return false;
}
/// <summary>
/// Handles creation of a new chat conversation.
/// </summary>
@ -562,12 +587,11 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
HashSet<uint> mutedChats = recipient.Comp.MutedChats;
if (recipient.Comp.NotificationsMuted ||
mutedChats.Contains(message.SenderId) ||
recipient.Comp.PdaUid is not { } pdaUid ||
!TryComp<CartridgeLoaderComponent>(pdaUid, out var loader) ||
!GetCartridgeLoader(recipient, out var loader) ||
// Don't notify if the recipient has the NanoChat program open with this chat selected.
(hasSelectedCurrentChat &&
_ui.IsUiOpen(pdaUid, PdaUiKey.Key) &&
HasComp<NanoChatCartridgeComponent>(loader.ActiveProgram)))
_ui.IsUiOpen(loader.Value.Owner, PdaUiKey.Key) &&
HasComp<NanoChatCartridgeComponent>(loader.Value.Comp.ActiveProgram)))
return;
var title = "";
@ -580,10 +604,10 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
else
title = Loc.GetString("nano-chat-new-message-title", ("sender", senderName));
_cartridge.SendNotification(pdaUid,
_cartridge.SendNotification(loader.Value,
title,
Loc.GetString("nano-chat-new-message-body", ("message", SharedNanoChatSystem.Truncate(message.Content, NotificationMaxLength, " [...]"))),
loader);
loader.Value);
}
/// <summary>
@ -628,6 +652,18 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
if (card.Number != number)
continue;
if (HasComp<BorgChassisComponent>(uid))
{
if (!TryComp<BorgSwitchableTypeComponent>(uid, out var switchable) || switchable.SelectedBorgType is not { } borgType)
return new NanoChatRecipient(number, MetaData(uid).EntityName, null);
return new NanoChatRecipient(number, MetaData(uid).EntityName, Loc.GetString($"borg-type-{borgType}-transponder"));
}
if (HasComp<StationAiHeldComponent>(uid))
{
return new NanoChatRecipient(number, MetaData(uid).EntityName, Loc.GetString($"station-ai-transponder"));
}
// Try to get job title from ID card if possible
string? jobTitle = null;
var name = "Unknown";
@ -666,6 +702,25 @@ public sealed class NanoChatCartridgeSystem : EntitySystem
contacts.Add(new NanoChatRecipient(nanoChatNumber, fullName));
}
}
var borgQuery = AllEntityQuery<NanoChatCardComponent, BorgChassisComponent>();
while (borgQuery.MoveNext(out var borgId, out var borgChatCard, out var _))
{
if (borgChatCard.ListNumber && borgChatCard.Number is uint nanoChatNumber && _station.GetOwningStation(borgId) == station)
{
contacts.Add(new NanoChatRecipient(nanoChatNumber, MetaData(borgId).EntityName));
}
}
var aiQuery = AllEntityQuery<NanoChatCardComponent, StationAiHeldComponent>();
while (aiQuery.MoveNext(out var aiId, out var aiChatCard, out var _))
{
if (aiChatCard.ListNumber && aiChatCard.Number is uint nanoChatNumber && _station.GetOwningStation(aiId) == station)
{
contacts.Add(new NanoChatRecipient(nanoChatNumber, MetaData(aiId).EntityName));
}
}
contacts.Sort((contactA, contactB) => string.CompareOrdinal(contactA.Name, contactB.Name));
}
else

View File

@ -164,6 +164,17 @@ public sealed partial class BorgTypePrototype : IPrototype
[DataField]
public string PetFailureString { get; set; } = "petting-failure-generic-cyborg";
// Begin DeltaV
[DataField]
public string? PdaBorderColor;
[DataField]
public string? PdaAccentHorizontalColor;
[DataField]
public string? PdaAccentVerticalColor;
// End DeltaV
//
// Sounds
//

View File

@ -0,0 +1,9 @@
using Robust.Shared.GameStates;
namespace Content.Shared._DV.Silicon;
/// <summary>
/// Component that indicates a built-in PDA on a cyborg that can be accessed by the AI
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class BorgPdaComponent : Component;

View File

@ -0,0 +1,36 @@
using Content.Shared.PDA;
using Content.Shared.Silicons.StationAi;
using Content.Shared.Verbs;
namespace Content.Shared._DV.Silicon;
public sealed class BorgPdaSystem : EntitySystem
{
[Dependency] private readonly SharedUserInterfaceSystem _userInterface = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<BorgPdaComponent, GetVerbsEvent<AlternativeVerb>>(OnGetAlternativeVerbs);
}
private void OnGetAlternativeVerbs(Entity<BorgPdaComponent> ent, ref GetVerbsEvent<AlternativeVerb> args)
{
if (!args.CanComplexInteract || !HasComp<StationAiHeldComponent>(args.User) || !args.CanInteract)
return;
var user = args.User;
var target = args.Target;
var verb = new AlternativeVerb
{
Text = Loc.GetString("toggle-borg-pda"),
Act = () =>
{
_userInterface.TryToggleUi(target, PdaUiKey.Key, user);
}
};
args.Verbs.Add(verb);
}
}

View File

@ -0,0 +1,30 @@
using Content.Shared.Actions;
using Content.Shared.PDA;
using Robust.Shared.GameObjects;
using Robust.Shared.Player;
namespace Content.Shared._DV.Silicon;
public sealed class SiliconPdaScreenSystem : EntitySystem
{
[Dependency] private readonly SharedUserInterfaceSystem _userInterface = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PdaComponent, TogglePdaScreenEvent>(OnTogglePdaScreen);
}
private void OnTogglePdaScreen(Entity<PdaComponent> ent, ref TogglePdaScreenEvent args)
{
if (args.Handled || !TryComp<ActorComponent>(ent, out var actor))
return;
args.Handled = true;
_userInterface.TryToggleUi(ent.Owner, PdaUiKey.Key, actor.PlayerSession);
}
}
public sealed partial class TogglePdaScreenEvent : InstantActionEvent;

View File

@ -1,27 +1,4 @@
Entries:
- author: ShepardToTheStars
changes:
- message: 'ADMIN: Lots of new toys - Bluespace lifelines, emergency medical pods,
aghost pockets and belt, automatic aghost color, better `spawncharacter`, new
`spawnplayer` command, admin log sorting'
type: Add
id: 1776
time: '2025-10-30T01:52:30.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4577
- author: turtlemutt
changes:
- message: Add a new snack to the game, spicy pickle moffs!
type: Add
id: 1777
time: '2025-11-02T05:28:33.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4425
- author: SirWarock
changes:
- message: Rollerbed sprites now don't stack when a patient is buckled to it!
type: Add
id: 1778
time: '2025-11-02T05:44:53.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/4521
- author: HTMLSystem
changes:
- message: Added arachnid and moth sprites for the night vision and thermal goggles
@ -4419,4 +4396,29 @@
id: 2276
time: '2026-05-08T08:35:42.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5788
- author: sowelipililimute
changes:
- message: Silicons now have an inbuilt PDA that allows for using NanoChat, viewing
the crew manifest, and other things.
type: Add
id: 2277
time: '2026-05-09T22:19:48.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5738
- author: Cepelinas1
changes:
- message: "In an effort to save money on tear gas grenade production, Security\
\ can now choose up to 4 items for their secbelt in the character loadout under\
\ the \u201CUtility\u201D section! Remember to actually choose what you want,\
\ unless you want to go in with just a baton and cuffs."
type: Add
id: 2278
time: '2026-05-09T23:04:26.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5701
- author: Stxcking
changes:
- message: Added Water Wall Dispenser
type: Add
id: 2279
time: '2026-05-10T11:35:15.0000000+00:00'
url: https://github.com/DeltaV-Station/Delta-v/pull/5792
Order: 1

File diff suppressed because one or more lines are too long

View File

@ -3,3 +3,7 @@ borg-type-security-desc = Assist security in the fight for justice by detaining
borg-type-security-transponder = security cyborg
brain-cannot-be-borged-message = [color=red]This brain is damaged beyond use.[/color]
borg-type-any-transponder = cyborg
station-ai-transponder = station ai
toggle-borg-pda = View PDA

View File

@ -140,6 +140,7 @@ loadout-group-all-gun = Security Sidearm
loadout-group-security-gun-ammo = Ammunition
loadout-group-revolver-ammo = Ammunition
loadout-group-all-ammo = Ammunition
security-utility = Utility
# Justice
loadout-group-chiefjustice-head = Chief Justice head

View File

@ -75,6 +75,12 @@
# Only used for NT borgs that can switch type, defined here to avoid copy-pasting the rest of this component.
enum.BorgSwitchableTypeUiKey.SelectBorgType:
type: BorgSelectTypeUserInterface
# Begin DeltaV - borg PDAs
enum.PdaUiKey.Key:
type: PdaBoundUserInterface
enum.RingerUiKey.Key:
type: RingerBoundUserInterface
# End DeltaV - borg PDAs
- type: Targeting # Shitmed Change
- type: ActivatableUI
key: enum.BorgUiKey.Key
@ -130,6 +136,8 @@
borg_id_chip: !type:ContainerSlot # DeltaV - borg id chips
borg_module: !type:Container { }
part-container: !type:Container
program-container: !type:Container # DeltaV - Borg PDAs
Cartridge-Slot: !type:ContainerSlot # DeltaV - Borg PDAs
- type: PowerCellSlot
cellSlotId: cell_slot
fitsInCharger: true

View File

@ -31,6 +31,41 @@
inherentRadioChannels:
- Common
- Binary
# Begin Impstation - Borg PDAs
- type: Pda
idSlot:
locked: true
penSlot:
locked: true
paiSlot:
locked: true
- type: PdaBorderColor
borderColor: "#717059"
- type: Ringer
- type: NanoChatCard
- type: CartridgeLoader
uiKey: enum.PdaUiKey.Key
preinstalled:
- CrewManifestCartridge
- NotekeeperCartridge
- NanoTaskCartridge
- NewsReaderCartridge
- NanoChatCartridge
cartridgeSlot:
locked: true
priority: -1
name: device-pda-slot-component-slot-name-cartridge
ejectSound: /Audio/Machines/id_swipe.ogg
insertSound: /Audio/Machines/id_insert.ogg
whitelist:
components:
- Cartridge
- type: ActionGrant
actions:
- ActionOpenCartridges
- type: StationAiWhitelist
- type: BorgPda
# End Impstation - Borg PDAs
- type: entity
id: BorgChassisGeneric

View File

@ -1,6 +1,7 @@
# Be careful with these as they get removed on shutdown too!
- type: entity
id: AiHeld
save: false # DeltaV - AI PDAs
description: Components added / removed from an entity that gets inserted into an AI core.
categories: [ HideSpawnMenu ]
components:
@ -46,6 +47,7 @@
- ActionJumpToCore
- ActionSurvCameraLights
- ActionAIViewLaws
- ActionOpenCartridges # DeltaV - AI PDA
- type: UserInterface
interfaces:
enum.RadarConsoleUiKey.Key:
@ -60,6 +62,12 @@
type: CommunicationsConsoleBoundUserInterface
enum.StoreUiKey.Key: # DeltaV - AI shop system
type: StoreBoundUserInterface
# Begin DeltaV - AI PDAs
enum.PdaUiKey.Key:
type: PdaBoundUserInterface
enum.RingerUiKey.Key:
type: RingerBoundUserInterface
# End DeltaV - AI PDAs
- type: IntrinsicUI
uis:
enum.RadarConsoleUiKey.Key:
@ -418,6 +426,7 @@
# The actual brain inside the core
- type: entity
id: StationAiBrain
save: false # DeltaV - AI PDAs
parent: PositronicBrain
categories: [ HideSpawnMenu, DoNotMap ]
components:
@ -495,6 +504,39 @@
mindRoles:
- MindRoleGhostRoleSilicon
job: StationAi
# Begin DeltaV - AI PDAs
- type: Pda
idSlot:
locked: true
penSlot:
locked: true
paiSlot:
locked: true
- type: Ringer
- type: NanoChatCard
- type: CartridgeLoader
uiKey: enum.PdaUiKey.Key
preinstalled:
- NewsReaderCartridge
- NanoChatCartridge
cartridgeSlot:
locked: true
priority: -1
name: device-pda-slot-component-slot-name-cartridge
ejectSound: /Audio/Machines/id_swipe.ogg
insertSound: /Audio/Machines/id_insert.ogg
whitelist:
components:
- Cartridge
- type: ContainerContainer
containers:
program-container: !type:Container
Cartridge-Slot: !type:ContainerSlot
- type: ItemSlots
- type: PdaBorderColor
borderColor: "#45453f"
accentVColor: "#447987"
# End DeltaV - AI PDAs
# Hologram projection that the AI's eye tracks.
- type: entity

View File

@ -86,12 +86,12 @@
- type: loadout
id: SecurityBelt
equipment:
belt: ClothingBeltSecurityFilled
belt: ClothingBeltSecurityBeltCustom # DeltaV - loadouts
- type: loadout
id: SecurityWebbing
equipment:
belt: ClothingBeltSecurityWebbingFilled
belt: ClothingBeltSecurityWebbingCustom # DeltaV - loadouts
# Outerclothing
- type: loadout

View File

@ -413,6 +413,7 @@
- GroupSpeciesBreathToolSecurity
- SecurityAllFirearm # DeltaV - loadouts
- SecurityAllAmmo # DeltaV - loadouts
- SecurityUtility # DeltaV - loadouts
- type: roleLoadout
id: JobWarden
@ -432,6 +433,7 @@
- GroupSpeciesBreathToolSecurity
- SecurityAllFirearm # DeltaV - loadouts
- SecurityAllAmmo # DeltaV - loadouts
- SecurityUtility # DeltaV - loadouts
- type: roleLoadout
id: JobSecurityOfficer
@ -452,6 +454,7 @@
- GroupSpeciesBreathToolSecurity
- SecurityFirearm # DeltaV - loadouts
- SecurityFirearmAmmo # DeltaV - loadouts
- SecurityUtility # DeltaV - loadouts
- type: roleLoadout
id: JobDetective

View File

@ -44,6 +44,7 @@
- GroupSpeciesBreathToolSecurity
- SecurityFirearm # DeltaV - loadouts
- SecurityFirearmAmmo # DeltaV - loadouts
- SecurityUtility
# Wildcards
- type: roleLoadout

View File

@ -24,3 +24,18 @@
- type: InstantAction
event: !type:FabricateCandyActionEvent
item: FoodGumball
- type: entity
parent: BaseMentalAction
id: ActionOpenCartridges
name: Open Programs
description: View software installed on you
components:
- type: Action
itemIconStyle: NoItem
icon:
sprite: _DV/Interface/Actions/actions_ai.rsi
state: pda
useDelay: 0.5
- type: InstantAction
event: !type:TogglePdaScreenEvent

View File

@ -25,6 +25,30 @@
- id: SyringeEphedrine
- id: EmergencyMedipen
- type: entity
id: ClothingBeltSecurityBeltCustom
parent: ClothingBeltSecurity
suffix: Filled
components:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: Stunbaton
- id: Handcuffs
- type: entity
id: ClothingBeltSecurityWebbingCustom
parent: ClothingBeltSecurityWebbing
suffix: Filled
components:
- type: EntityTableContainerFill
containers:
storagebase: !type:AllSelector
children:
- id: Stunbaton
- id: Handcuffs
- type: entity
id: ClothingBeltFoamSheathFilled
parent: ClothingBeltFoamSheath

View File

@ -0,0 +1,23 @@
- type: entity
parent: BaseDispenser
id: WaterDispenser
name: water dispenser
description: Wallmount water dispenser.
components:
- type: Sprite
sprite: _DV/Structures/Wallmounts/walldispenser.rsi
layers:
- state: waterdispenser
- state: fill-1
map: ["enum.SolutionContainerLayers.Fill"]
visible: false
- type: SolutionContainerVisuals
maxFillLevels: 5
fillBaseName: fill-
- type: SolutionContainerManager
solutions:
tank:
maxVol: 5000
reagents:
- ReagentId: Water
Quantity: 5000

View File

@ -145,3 +145,47 @@
id: SecurityClothingHandsGlovesFingerless
equipment:
gloves: ClothingHandsGlovesFingerless
# SecBelt utility
- type: loadout
id: FlashBangLoadout
storage:
belt:
- GrenadeFlashBang
- type: loadout
id: TearGasLoadout
storage:
belt:
- TearGasGrenade
- type: loadout
id: SecHoloProjectorLoadout
storage:
belt:
- HoloprojectorSecurity
- type: loadout
id: StingerGrenadeLoadout
storage:
belt:
- GrenadeStinger
- type: loadout
id: RadioHandheldSecurityLoadout
storage:
belt:
- RadioHandheldSecurity
- type: loadout
id: HandcuffsLoadout
storage:
belt:
- Handcuffs
- type: loadout
id: SecLiteLoadout
storage:
belt:
- FlashlightSeclite

View File

@ -414,6 +414,21 @@
- SecurityFirearmSpeedLoaderSpecialRubber
- SecurityFirearmSpeedLoaderSpecial
## Security utility
- type: loadoutGroup
id: SecurityUtility
name: security-utility
minLimit: 0
maxLimit: 4
loadouts:
- FlashBangLoadout
- TearGasLoadout
- StingerGrenadeLoadout
- RadioHandheldSecurityLoadout
- SecHoloProjectorLoadout
- HandcuffsLoadout
- SecLiteLoadout
## Security Gloves
- type: loadoutGroup
id: SecurityGloves

View File

@ -71,3 +71,7 @@
# Pet
petSuccessString: petting-success-security-cyborg
petFailureString: petting-failure-security-cyborg
# Begin DeltaV - Borg PDAs
pdaBorderColor: "#A32D26"
# End DeltaV - Borg PDAs

View File

@ -76,6 +76,11 @@
petSuccessString: petting-success-engineer-cyborg
petFailureString: petting-failure-engineer-cyborg
# Begin DeltaV - Borg PDAs
pdaBorderColor: "#bf803a"
pdaAccentVerticalColor: "#ffd187"
# End DeltaV - Borg PDAs
# Salvage borg
- type: borgType
@ -122,6 +127,11 @@
petSuccessString: petting-success-salvage-cyborg
petFailureString: petting-failure-salvage-cyborg
# Begin DeltaV - Borg PDAs
pdaBorderColor: "#af9366"
pdaAccentVerticalColor: "#8900c9"
# End DeltaV - Borg PDAs
# Janitor borg
- type: borgType
@ -166,6 +176,10 @@
petSuccessString: petting-success-janitor-cyborg
petFailureString: petting-failure-janitor-cyborg
# Begin DeltaV - Borg PDAs
pdaBorderColor: "#5D2D56"
# End DeltaV - Borg PDAs
# Medical borg
- type: borgType
@ -231,6 +245,11 @@
footstepCollection:
collection: FootstepHoverBorg
# Begin DeltaV - Borg PDAs
pdaBorderColor: "#d7d7d0"
pdaAccentVerticalColor: "#447987"
# End DeltaV - Borg PDAs
# Service borg
- type: borgType
@ -271,3 +290,8 @@
# Pet
petSuccessString: petting-success-service-cyborg
petFailureString: petting-failure-service-cyborg
# Begin DeltaV - Borg PDAs
pdaBorderColor: "#717059"
pdaAccentVerticalColor: "#00cc35"
# End DeltaV - Borg PDAs

View File

@ -27,6 +27,9 @@
},
{
"name": "store"
},
{
"name": "pda"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 568 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 595 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 599 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 619 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 649 B

View File

@ -0,0 +1,29 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Modifications made by [scrivoy], Dispenser originally taken from paradise at https://github.com/ParadiseSS13/Paradise/commit/846ce475b2258a4336d8895f07f2c0f4053963bc, waterdispenser by @Stxcking (github)",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "waterdispenser"
},
{
"name": "fill-1"
},
{
"name": "fill-2"
},
{
"name": "fill-3"
},
{
"name": "fill-4"
},
{
"name": "fill-5"
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 737 B