diff --git a/Content.Client/Cargo/UI/CargoConsoleMenu.xaml b/Content.Client/Cargo/UI/CargoConsoleMenu.xaml
index 72d8cf7daf..940352dc48 100644
--- a/Content.Client/Cargo/UI/CargoConsoleMenu.xaml
+++ b/Content.Client/Cargo/UI/CargoConsoleMenu.xaml
@@ -38,9 +38,10 @@
-
+
+ SizeFlagsStretchRatio="1"
+ Name="Orders">
diff --git a/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs b/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs
index b837d59855..4c729b795b 100644
--- a/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs
+++ b/Content.Client/Cargo/UI/CargoConsoleMenu.xaml.cs
@@ -208,6 +208,7 @@ namespace Content.Client.Cargo.UI
var product = _protoManager.Index(order.ProductId);
var productName = product.Name;
+ var account = _protoManager.Index(order.Account);
var row = new CargoOrderRow
{
@@ -219,7 +220,9 @@ namespace Content.Client.Cargo.UI
"cargo-console-menu-populate-orders-cargo-order-row-product-name-text",
("productName", productName),
("orderAmount", order.OrderQuantity),
- ("orderRequester", order.Requester))
+ ("orderRequester", order.Requester),
+ ("accountColor", account.Color),
+ ("account", Loc.GetString(account.Code)))
},
Description =
{
@@ -282,6 +285,9 @@ namespace Content.Client.Cargo.UI
AccountActionButton.Disabled = TransferSpinBox.Value <= 0 ||
TransferSpinBox.Value > bankAccount.Accounts[orderConsole.Account] * orderConsole.TransferLimit ||
_timing.CurTime < orderConsole.NextAccountActionTime;
+
+ OrdersSpacer.Visible = !orderConsole.SlipPrinter;
+ Orders.Visible = !orderConsole.SlipPrinter;
}
}
}
diff --git a/Content.Client/Cargo/UI/CargoOrderRow.xaml b/Content.Client/Cargo/UI/CargoOrderRow.xaml
index 22bd2291ae..e4ec95d981 100644
--- a/Content.Client/Cargo/UI/CargoOrderRow.xaml
+++ b/Content.Client/Cargo/UI/CargoOrderRow.xaml
@@ -11,11 +11,10 @@
-
+ StyleClasses="LabelSubText" />
+
diff --git a/Content.Client/Paper/UI/PaperWindow.xaml.cs b/Content.Client/Paper/UI/PaperWindow.xaml.cs
index 9086145f83..f58a74b8b4 100644
--- a/Content.Client/Paper/UI/PaperWindow.xaml.cs
+++ b/Content.Client/Paper/UI/PaperWindow.xaml.cs
@@ -149,6 +149,16 @@ namespace Content.Client.Paper.UI
HeaderImage.Margin = new Thickness(visuals.HeaderMargin.Left, visuals.HeaderMargin.Top,
visuals.HeaderMargin.Right, visuals.HeaderMargin.Bottom);
+ // Then the footer
+ if (visuals.FooterImagePath is {} path)
+ {
+ FooterImage.TexturePath = path.ToString();
+ FooterImage.MinSize = FooterImage.TextureNormal?.Size ?? Vector2.Zero;
+ }
+
+ FooterImage.ModulateSelfOverride = visuals.FooterImageModulate;
+ FooterImage.Margin = new Thickness(visuals.FooterMargin.Left, visuals.FooterMargin.Top,
+ visuals.FooterMargin.Right, visuals.FooterMargin.Bottom);
PaperContent.ModulateSelfOverride = visuals.ContentImageModulate;
WrittenTextLabel.ModulateSelfOverride = visuals.FontAccentColor;
diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
index fe37f56e02..c0e59d4ab6 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
@@ -13,6 +13,7 @@ using Content.Shared.Interaction;
using Content.Shared.Labels.Components;
using Content.Shared.Paper;
using JetBrains.Annotations;
+using Robust.Shared.Audio;
using Robust.Shared.Map;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
@@ -35,11 +36,8 @@ namespace Content.Server.Cargo.Systems
SubscribeLocalEvent(OnEmagged);
}
- private void OnInteractUsing(EntityUid uid, CargoOrderConsoleComponent component, ref InteractUsingEvent args)
+ private void OnInteractUsingCash(EntityUid uid, CargoOrderConsoleComponent component, ref InteractUsingEvent args)
{
- if (!HasComp(args.Used))
- return;
-
var price = _pricing.GetPrice(args.Used);
if (price == 0)
@@ -56,6 +54,55 @@ namespace Content.Server.Cargo.Systems
args.Handled = true;
}
+ private void OnInteractUsingSlip(Entity ent, ref InteractUsingEvent args, CargoSlipComponent slip)
+ {
+ if (slip.OrderQuantity <= 0)
+ return;
+
+ var stationUid = _station.GetOwningStation(ent);
+
+ if (!TryGetOrderDatabase(stationUid, out var orderDatabase))
+ return;
+
+ if (!_protoMan.TryIndex(slip.Product, out var product))
+ {
+ Log.Error($"Tried to add invalid cargo product {slip.Product} as order!");
+ return;
+ }
+
+ if (!ent.Comp.AllowedGroups.Contains(product.Group))
+ return;
+
+ var orderId = GenerateOrderId(orderDatabase);
+ var data = new CargoOrderData(orderId, product.Product, product.Name, product.Cost, slip.OrderQuantity, slip.Requester, slip.Reason, slip.Account);
+
+ if (!TryAddOrder(stationUid.Value, ent.Comp.Account, data, orderDatabase))
+ {
+ PlayDenySound(ent, ent.Comp);
+ return;
+ }
+
+ // Log order addition
+ _audio.PlayPvs(ent.Comp.ScanSound, ent);
+ _adminLogger.Add(LogType.Action,
+ LogImpact.Low,
+ $"{ToPrettyString(args.User):user} inserted order slip [orderId:{data.OrderId}, quantity:{data.OrderQuantity}, product:{data.ProductId}, requester:{data.Requester}, reason:{data.Reason}]");
+ QueueDel(args.Used);
+ args.Handled = true;
+ }
+
+ private void OnInteractUsing(EntityUid uid, CargoOrderConsoleComponent component, ref InteractUsingEvent args)
+ {
+ if (HasComp(args.Used))
+ {
+ OnInteractUsingCash(uid, component, ref args);
+ }
+ else if (TryComp(args.Used, out var slip) && !component.SlipPrinter)
+ {
+ OnInteractUsingSlip((uid, component), ref args, slip);
+ }
+ }
+
private void OnInit(EntityUid uid, CargoOrderConsoleComponent orderConsole, ComponentInit args)
{
var station = _station.GetOwningStation(uid);
@@ -94,6 +141,9 @@ namespace Content.Server.Cargo.Systems
if (args.Actor is not { Valid: true } player)
return;
+ if (component.SlipPrinter)
+ return;
+
if (!_accessReaderSystem.IsAllowed(player, uid))
{
ConsolePopup(args.Actor, Loc.GetString("cargo-console-order-not-allowed"));
@@ -115,7 +165,7 @@ namespace Content.Server.Cargo.Systems
// Find our order again. It might have been dispatched or approved already
var order = orderDatabase.Orders[component.Account].Find(order => args.OrderId == order.OrderId && !order.Approved);
- if (order == null)
+ if (order == null || !_protoMan.TryIndex(order.Account, out var account))
{
return;
}
@@ -128,7 +178,7 @@ namespace Content.Server.Cargo.Systems
return;
}
- var amount = GetOutstandingOrderCount(orderDatabase, component.Account);
+ var amount = GetOutstandingOrderCount(orderDatabase, order.Account);
var capacity = orderDatabase.Capacity;
// Too many orders, avoid them getting spammed in the UI.
@@ -150,7 +200,7 @@ namespace Content.Server.Cargo.Systems
}
var cost = order.Price * order.OrderQuantity;
- var accountBalance = GetBalanceFromAccount((station.Value, bank), component.Account);
+ var accountBalance = GetBalanceFromAccount((station.Value, bank), order.Account);
// Not enough balance
if (cost > accountBalance)
@@ -166,7 +216,7 @@ namespace Content.Server.Cargo.Systems
if (!ev.Handled)
{
- ev.FulfillmentEntity = TryFulfillOrder((station.Value, stationData), component.Account, order, orderDatabase);
+ ev.FulfillmentEntity = TryFulfillOrder((station.Value, stationData), order.Account, order, orderDatabase);
if (ev.FulfillmentEntity == null)
{
@@ -190,8 +240,8 @@ namespace Content.Server.Cargo.Systems
("orderAmount", order.OrderQuantity),
("approver", order.Approver ?? string.Empty),
("cost", cost));
- _radio.SendRadioMessage(uid, message, component.AnnouncementChannel, uid, escapeMarkup: false);
- if (CargoOrderConsoleComponent.BaseAnnouncementChannel != component.AnnouncementChannel)
+ _radio.SendRadioMessage(uid, message, account.RadioChannel, uid, escapeMarkup: false);
+ if (CargoOrderConsoleComponent.BaseAnnouncementChannel != account.RadioChannel)
_radio.SendRadioMessage(uid, message, CargoOrderConsoleComponent.BaseAnnouncementChannel, uid, escapeMarkup: false);
}
@@ -200,10 +250,10 @@ namespace Content.Server.Cargo.Systems
// Log order approval
_adminLogger.Add(LogType.Action,
LogImpact.Low,
- $"{ToPrettyString(player):user} approved order [orderId:{order.OrderId}, quantity:{order.OrderQuantity}, product:{order.ProductId}, requester:{order.Requester}, reason:{order.Reason}] on account {component.Account} with balance at {accountBalance}");
+ $"{ToPrettyString(player):user} approved order [orderId:{order.OrderId}, quantity:{order.OrderQuantity}, product:{order.ProductId}, requester:{order.Requester}, reason:{order.Reason}] on account {order.Account} with balance at {accountBalance}");
orderDatabase.Orders[component.Account].Remove(order);
- UpdateBankAccount((station.Value, bank), -cost, component.Account);
+ UpdateBankAccount((station.Value, bank), -cost, order.Account);
UpdateOrders(station.Value);
}
@@ -259,12 +309,48 @@ namespace Content.Server.Cargo.Systems
{
var station = _station.GetOwningStation(uid);
+ if (component.SlipPrinter)
+ return;
+
if (!TryGetOrderDatabase(station, out var orderDatabase))
return;
RemoveOrder(station.Value, component.Account, args.OrderId, orderDatabase);
}
+ private void OnAddOrderMessageSlipPrinter(EntityUid uid, CargoOrderConsoleComponent component, CargoConsoleAddOrderMessage args, CargoProductPrototype product)
+ {
+ if (!_protoMan.TryIndex(component.Account, out var account))
+ return;
+
+ if (Timing.CurTime < component.NextPrintTime)
+ return;
+
+ var label = Spawn(account.AcquisitionSlip, Transform(uid).Coordinates);
+ component.NextPrintTime = Timing.CurTime + component.PrintDelay;
+ _audio.PlayPvs(component.PrintSound, uid);
+
+ var paper = EnsureComp(label);
+ var msg = new FormattedMessage();
+
+ msg.AddMarkupPermissive(Loc.GetString("cargo-acquisition-slip-body",
+ ("product", product.Name),
+ ("description", product.Description),
+ ("unit", product.Cost),
+ ("amount", args.Amount),
+ ("cost", product.Cost * args.Amount),
+ ("orderer", args.Requester),
+ ("reason", args.Reason)));
+ _paperSystem.SetContent((label, paper), msg.ToMarkup());
+
+ var slip = EnsureComp(label);
+ slip.Product = product.ID;
+ slip.Requester = args.Requester;
+ slip.Reason = args.Reason;
+ slip.OrderQuantity = args.Amount;
+ slip.Account = component.Account;
+ }
+
private void OnAddOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, CargoConsoleAddOrderMessage args)
{
if (args.Actor is not { Valid: true } player)
@@ -287,7 +373,13 @@ namespace Content.Server.Cargo.Systems
if (!component.AllowedGroups.Contains(product.Group))
return;
- var data = GetOrderData(args, product, GenerateOrderId(orderDatabase));
+ if (component.SlipPrinter)
+ {
+ OnAddOrderMessageSlipPrinter(uid, component, args, product);
+ return;
+ }
+
+ var data = GetOrderData(args, product, GenerateOrderId(orderDatabase), component.Account);
if (!TryAddOrder(stationUid.Value, component.Account, data, orderDatabase))
{
@@ -342,9 +434,9 @@ namespace Content.Server.Cargo.Systems
_audio.PlayPvs(_audio.ResolveSound(component.ErrorSound), uid);
}
- private static CargoOrderData GetOrderData(CargoConsoleAddOrderMessage args, CargoProductPrototype cargoProduct, int id)
+ private static CargoOrderData GetOrderData(CargoConsoleAddOrderMessage args, CargoProductPrototype cargoProduct, int id, ProtoId account)
{
- return new CargoOrderData(id, cargoProduct.Product, cargoProduct.Name, cargoProduct.Cost, args.Amount, args.Requester, args.Reason);
+ return new CargoOrderData(id, cargoProduct.Product, cargoProduct.Name, cargoProduct.Cost, args.Amount, args.Requester, args.Reason, account);
}
public static int GetOutstandingOrderCount(StationCargoOrderDatabaseComponent component, ProtoId account)
@@ -397,7 +489,7 @@ namespace Content.Server.Cargo.Systems
DebugTools.Assert(_protoMan.HasIndex(spawnId));
// Make an order
var id = GenerateOrderId(component);
- var order = new CargoOrderData(id, spawnId, name, cost, qty, sender, description);
+ var order = new CargoOrderData(id, spawnId, name, cost, qty, sender, description, account);
// Approve it now
order.SetApproverData(dest, sender);
diff --git a/Content.Shared/Cargo/CargoOrderData.cs b/Content.Shared/Cargo/CargoOrderData.cs
index 9813457910..a0b3fbed50 100644
--- a/Content.Shared/Cargo/CargoOrderData.cs
+++ b/Content.Shared/Cargo/CargoOrderData.cs
@@ -1,3 +1,5 @@
+using Content.Shared.Cargo.Prototypes;
+using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
using System.Text;
namespace Content.Shared.Cargo
@@ -52,7 +54,13 @@ namespace Content.Shared.Cargo
[DataField]
public string? Approver;
- public CargoOrderData(int orderId, string productId, string productName, int price, int amount, string requester, string reason)
+ ///
+ /// Which account to deduct funds from when ordering
+ ///
+ [DataField]
+ public ProtoId Account;
+
+ public CargoOrderData(int orderId, string productId, string productName, int price, int amount, string requester, string reason, ProtoId account)
{
OrderId = orderId;
ProductId = productId;
@@ -61,6 +69,7 @@ namespace Content.Shared.Cargo
OrderQuantity = amount;
Requester = requester;
Reason = reason;
+ Account = account;
}
public void SetApproverData(string? approver)
diff --git a/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs b/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs
index 90abfe8bfa..200dc7c575 100644
--- a/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs
+++ b/Content.Shared/Cargo/Components/CargoOrderConsoleComponent.cs
@@ -96,6 +96,36 @@ public sealed partial class CargoOrderConsoleComponent : Component
/// Secondary radio channel which always receives order announcements.
///
public static readonly ProtoId BaseAnnouncementChannel = "Supply";
+
+ ///
+ /// If set to true, restricts this console from ordering and has it print slips instead
+ ///
+ [DataField]
+ public bool SlipPrinter;
+
+ ///
+ /// The time at which the console will be able to print a slip again.
+ ///
+ [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField]
+ public TimeSpan NextPrintTime = TimeSpan.Zero;
+
+ ///
+ /// The time between prints.
+ ///
+ [DataField]
+ public TimeSpan PrintDelay = TimeSpan.FromSeconds(5);
+
+ ///
+ /// The sound made when printing occurs
+ ///
+ [DataField]
+ public SoundSpecifier PrintSound = new SoundCollectionSpecifier("PrinterPrint");
+
+ ///
+ /// The sound made when an order slip is scanned
+ ///
+ [DataField]
+ public SoundSpecifier ScanSound = new SoundCollectionSpecifier("CargoBeep");
}
///
diff --git a/Content.Shared/Cargo/Components/CargoSlipComponent.cs b/Content.Shared/Cargo/Components/CargoSlipComponent.cs
new file mode 100644
index 0000000000..78104679ab
--- /dev/null
+++ b/Content.Shared/Cargo/Components/CargoSlipComponent.cs
@@ -0,0 +1,41 @@
+using Content.Shared.Cargo.Prototypes;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared.Cargo.Components;
+
+///
+/// Holds data for an order slip required for insertion into a console
+///
+[RegisterComponent]
+public sealed partial class CargoSlipComponent : Component
+{
+ ///
+ /// The requested product
+ ///
+ [DataField]
+ public ProtoId Product;
+
+ ///
+ /// The provided value for the requester form field
+ ///
+ [DataField]
+ public string Requester;
+
+ ///
+ /// The provided value for the reason form field
+ ///
+ [DataField]
+ public string Reason;
+
+ ///
+ /// How many of the product to order
+ ///
+ [DataField]
+ public int OrderQuantity;
+
+ ///
+ /// How many of the product to order
+ ///
+ [DataField]
+ public ProtoId Account;
+}
diff --git a/Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs b/Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs
index 185c8f909a..c1c474abf8 100644
--- a/Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs
+++ b/Content.Shared/Cargo/Prototypes/CargoAccountPrototype.cs
@@ -36,4 +36,10 @@ public sealed partial class CargoAccountPrototype : IPrototype
///
[DataField]
public ProtoId RadioChannel;
+
+ ///
+ /// Paper prototype used for acquisition slips.
+ ///
+ [DataField]
+ public EntProtoId AcquisitionSlip;
}
diff --git a/Resources/Audio/Effects/Cargo/attributions.yml b/Resources/Audio/Effects/Cargo/attributions.yml
index c3f950f9b5..f7d6c0eede 100644
--- a/Resources/Audio/Effects/Cargo/attributions.yml
+++ b/Resources/Audio/Effects/Cargo/attributions.yml
@@ -5,3 +5,9 @@
copyright: '"buzz_sigh.ogg", "buzz_two.ogg", and "ping.ogg" by /tg/station'
license: CC-BY-SA-3.0
source: https://github.com/tgstation/tgstation/tree/d6f15fb717e7c047f8befefabb4b7735b3c39a84/sound
+
+- files:
+ - beep.ogg
+ copyright: 'Store Scanner Beep by zerolagtime'
+ license: CC0-1.0
+ source: https://freesound.org/people/zerolagtime/sounds/144418/
diff --git a/Resources/Audio/Effects/Cargo/beep.ogg b/Resources/Audio/Effects/Cargo/beep.ogg
new file mode 100644
index 0000000000..48a0444d11
Binary files /dev/null and b/Resources/Audio/Effects/Cargo/beep.ogg differ
diff --git a/Resources/Locale/en-US/cargo/cargo-console-component.ftl b/Resources/Locale/en-US/cargo/cargo-console-component.ftl
index 22e75ae6dc..bc28306db1 100644
--- a/Resources/Locale/en-US/cargo/cargo-console-component.ftl
+++ b/Resources/Locale/en-US/cargo/cargo-console-component.ftl
@@ -18,7 +18,7 @@ cargo-console-menu-requests-label = Requests
cargo-console-menu-orders-label = Orders
cargo-console-menu-order-reason-description = Reasons: {$reason}
cargo-console-menu-populate-categories-all-text = All
-cargo-console-menu-populate-orders-cargo-order-row-product-name-text = {$productName} (x{$orderAmount}) by {$orderRequester}
+cargo-console-menu-populate-orders-cargo-order-row-product-name-text = {$productName} (x{$orderAmount}) by {$orderRequester} from [color={$accountColor}]{$account}[/color]
cargo-console-menu-cargo-order-row-approve-button = Approve
cargo-console-menu-cargo-order-row-cancel-button = Cancel
cargo-console-menu-tab-title-orders = Orders
@@ -82,3 +82,15 @@ cargo-funding-alloc-console-label-save-fail = [bold]Revenue Divisions Invalid![/
[1] +
*[-1] -
}{$val}%)[/color]
+
+# Slip template
+cargo-acquisition-slip-body = [head=3]Asset Detail[/head]
+ {"[bold]Product:[/bold]"} {$product}
+ {"[bold]Description:[/bold]"} {$description}
+ {"[bold]Unit cost:[/bold"}] ${$unit}
+ {"[bold]Amount:[/bold]"} {$amount}
+ {"[bold]Cost:[/bold]"} ${$cost}
+
+ {"[head=3]Purchase Detail[/head]"}
+ {"[bold]Orderer:[/bold]"} {$orderer}
+ {"[bold]Reason:[/bold]"} {$reason}
diff --git a/Resources/Prototypes/Catalog/cargo_accounts.yml b/Resources/Prototypes/Catalog/cargo_accounts.yml
index 7ddc07e65b..1b366de8c6 100644
--- a/Resources/Prototypes/Catalog/cargo_accounts.yml
+++ b/Resources/Prototypes/Catalog/cargo_accounts.yml
@@ -4,6 +4,7 @@
code: cargo-account-cargo-code
color: "#b48b57"
radioChannel: Supply
+ acquisitionSlip: PaperAcquisitionSlipCargo
- type: cargoAccount
id: Engineering
@@ -11,6 +12,7 @@
code: cargo-account-engineering-code
color: "#ff733c"
radioChannel: Engineering
+ acquisitionSlip: PaperAcquisitionSlipEngineering
- type: cargoAccount
id: Medical
@@ -18,6 +20,7 @@
code: cargo-account-medical-code
color: "#57b8f0"
radioChannel: Medical
+ acquisitionSlip: PaperAcquisitionSlipMedical
- type: cargoAccount
id: Science
@@ -25,6 +28,7 @@
code: cargo-account-science-code
color: "#cd7ccd"
radioChannel: Science
+ acquisitionSlip: PaperAcquisitionSlipScience
- type: cargoAccount
id: Security
@@ -32,6 +36,7 @@
code: cargo-account-security-code
color: "#ff4242"
radioChannel: Security
+ acquisitionSlip: PaperAcquisitionSlipSecurity
- type: cargoAccount
id: Service
@@ -39,4 +44,4 @@
code: cargo-account-service-code
color: "#539c00"
radioChannel: Service
-
+ acquisitionSlip: PaperAcquisitionSlipService
diff --git a/Resources/Prototypes/Entities/Objects/Misc/acquisition_slips.yml b/Resources/Prototypes/Entities/Objects/Misc/acquisition_slips.yml
new file mode 100644
index 0000000000..c94ca44f2b
--- /dev/null
+++ b/Resources/Prototypes/Entities/Objects/Misc/acquisition_slips.yml
@@ -0,0 +1,139 @@
+- type: entity
+ abstract: true
+ parent: Paper
+ id: PaperAcquisitionSlip
+ name: acquisition slip
+ description: A slip with order details on it. It can be given to Cargo to complete the order.
+ components:
+ - type: Sprite
+ layers:
+ - state: acquisition_form
+ - state: acquisition_form_words
+ map: ["enum.PaperVisualLayers.Writing"]
+ visible: false
+ - state: acquisition_form_header
+ - state: paper_stamp-generic
+ map: ["enum.PaperVisualLayers.Stamp"]
+ visible: false
+ - type: Tag
+ tags:
+ - Trash
+ - type: Paper
+ editingDisabled: true
+ - type: PaperVisuals
+ footerImagePath: "/Textures/Interface/Paper/AcquisitionSlips/barcode.svg.192dpi.png"
+ maxWritableArea: 512.0, 512.0
+
+- type: entity
+ parent: PaperAcquisitionSlip
+ id: PaperAcquisitionSlipMedical
+ suffix: Medical
+ components:
+ - type: Sprite
+ layers:
+ - state: acquisition_form
+ - state: acquisition_form_words
+ map: ["enum.PaperVisualLayers.Writing"]
+ visible: false
+ - state: acquisition_form_header
+ color: "#57b8f0"
+ - state: paper_stamp-generic
+ map: ["enum.PaperVisualLayers.Stamp"]
+ visible: false
+ - type: PaperVisuals
+ headerImagePath: "/Textures/Interface/Paper/AcquisitionSlips/medical.svg.192dpi.png"
+
+- type: entity
+ parent: PaperAcquisitionSlip
+ id: PaperAcquisitionSlipScience
+ suffix: Science
+ components:
+ - type: Sprite
+ layers:
+ - state: acquisition_form
+ - state: acquisition_form_words
+ map: ["enum.PaperVisualLayers.Writing"]
+ visible: false
+ - state: acquisition_form_header
+ color: "#cd7ccd"
+ - state: paper_stamp-generic
+ map: ["enum.PaperVisualLayers.Stamp"]
+ visible: false
+ - type: PaperVisuals
+ headerImagePath: "/Textures/Interface/Paper/AcquisitionSlips/science.svg.192dpi.png"
+
+- type: entity
+ parent: PaperAcquisitionSlip
+ id: PaperAcquisitionSlipSecurity
+ suffix: Security
+ components:
+ - type: Sprite
+ layers:
+ - state: acquisition_form
+ - state: acquisition_form_words
+ map: ["enum.PaperVisualLayers.Writing"]
+ visible: false
+ - state: acquisition_form_header
+ color: "#ff4242"
+ - state: paper_stamp-generic
+ map: ["enum.PaperVisualLayers.Stamp"]
+ visible: false
+ - type: PaperVisuals
+ headerImagePath: "/Textures/Interface/Paper/AcquisitionSlips/security.svg.192dpi.png"
+
+- type: entity
+ parent: PaperAcquisitionSlip
+ id: PaperAcquisitionSlipService
+ suffix: Service
+ components:
+ - type: Sprite
+ layers:
+ - state: acquisition_form
+ - state: acquisition_form_words
+ map: ["enum.PaperVisualLayers.Writing"]
+ visible: false
+ - state: acquisition_form_header
+ color: "#539c00"
+ - state: paper_stamp-generic
+ map: ["enum.PaperVisualLayers.Stamp"]
+ visible: false
+ - type: PaperVisuals
+ headerImagePath: "/Textures/Interface/Paper/AcquisitionSlips/service.svg.192dpi.png"
+
+- type: entity
+ parent: PaperAcquisitionSlip
+ id: PaperAcquisitionSlipCargo
+ suffix: Cargo
+ components:
+ - type: Sprite
+ layers:
+ - state: acquisition_form
+ - state: acquisition_form_words
+ map: ["enum.PaperVisualLayers.Writing"]
+ visible: false
+ - state: acquisition_form_header
+ color: "#b48b57"
+ - state: paper_stamp-generic
+ map: ["enum.PaperVisualLayers.Stamp"]
+ visible: false
+ - type: PaperVisuals
+ headerImagePath: "/Textures/Interface/Paper/AcquisitionSlips/cargo.svg.192dpi.png"
+
+- type: entity
+ parent: PaperAcquisitionSlip
+ id: PaperAcquisitionSlipEngineering
+ suffix: Engineering
+ components:
+ - type: Sprite
+ layers:
+ - state: acquisition_form
+ - state: acquisition_form_words
+ map: ["enum.PaperVisualLayers.Writing"]
+ visible: false
+ - state: acquisition_form_header
+ color: "#ff733c"
+ - state: paper_stamp-generic
+ map: ["enum.PaperVisualLayers.Stamp"]
+ visible: false
+ - type: PaperVisuals
+ headerImagePath: "/Textures/Interface/Paper/AcquisitionSlips/engineering.svg.192dpi.png"
diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
index a0bd67a3c2..2ade0e4664 100644
--- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
+++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml
@@ -929,6 +929,7 @@
account: Engineering
announcementChannel: Engineering
removeLimitAccess: [ "ChiefEngineer" ]
+ slipPrinter: true
- type: ActiveRadio
channels:
- Engineering
@@ -961,6 +962,7 @@
account: Medical
announcementChannel: Medical
removeLimitAccess: [ "ChiefMedicalOfficer" ]
+ slipPrinter: true
- type: ActiveRadio
channels:
- Medical
@@ -993,6 +995,7 @@
account: Science
announcementChannel: Science
removeLimitAccess: [ "ResearchDirector" ]
+ slipPrinter: true
- type: ActiveRadio
channels:
- Science
@@ -1025,6 +1028,7 @@
account: Security
announcementChannel: Security
removeLimitAccess: [ "HeadOfSecurity" ]
+ slipPrinter: true
- type: ActiveRadio
channels:
- Security
@@ -1057,6 +1061,7 @@
account: Service
announcementChannel: Service
removeLimitAccess: [ "HeadOfPersonnel" ]
+ slipPrinter: true
- type: ActiveRadio
channels:
- Service
diff --git a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml
index 9efa7ce6f2..5a1a166954 100644
--- a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml
+++ b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml
@@ -48,6 +48,9 @@
whitelist:
components:
- FaxableObject #used to be PaperComponent - brainfood1183
+ blacklist:
+ components:
+ - CargoSlip
- type: GenericVisualizer
visuals:
enum.PowerDeviceVisuals.Powered:
diff --git a/Resources/Prototypes/SoundCollections/machines.yml b/Resources/Prototypes/SoundCollections/machines.yml
index 7848da0268..3c567ab7b3 100644
--- a/Resources/Prototypes/SoundCollections/machines.yml
+++ b/Resources/Prototypes/SoundCollections/machines.yml
@@ -1,3 +1,8 @@
+- type: soundCollection
+ id: PrinterPrint
+ files:
+ - /Audio/Machines/printer.ogg
+
- type: soundCollection
id: CargoPing
files:
@@ -12,3 +17,8 @@
id: CargoToggleLimit
files:
- /Audio/Machines/quickbeep.ogg
+
+- type: soundCollection
+ id: CargoBeep
+ files:
+ - /Audio/Effects/Cargo/beep.ogg
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/barcode.svg b/Resources/Textures/Interface/Paper/AcquisitionSlips/barcode.svg
new file mode 100644
index 0000000000..074df1ee36
--- /dev/null
+++ b/Resources/Textures/Interface/Paper/AcquisitionSlips/barcode.svg
@@ -0,0 +1,48 @@
+
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/barcode.svg.192dpi.png b/Resources/Textures/Interface/Paper/AcquisitionSlips/barcode.svg.192dpi.png
new file mode 100644
index 0000000000..8abdea9c47
Binary files /dev/null and b/Resources/Textures/Interface/Paper/AcquisitionSlips/barcode.svg.192dpi.png differ
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/barcode.svg.192dpi.png.yml b/Resources/Textures/Interface/Paper/AcquisitionSlips/barcode.svg.192dpi.png.yml
new file mode 100644
index 0000000000..5c43e23305
--- /dev/null
+++ b/Resources/Textures/Interface/Paper/AcquisitionSlips/barcode.svg.192dpi.png.yml
@@ -0,0 +1,2 @@
+sample:
+ filter: true
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/cargo.svg b/Resources/Textures/Interface/Paper/AcquisitionSlips/cargo.svg
new file mode 100644
index 0000000000..1e66e6425f
--- /dev/null
+++ b/Resources/Textures/Interface/Paper/AcquisitionSlips/cargo.svg
@@ -0,0 +1,23 @@
+
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/cargo.svg.192dpi.png b/Resources/Textures/Interface/Paper/AcquisitionSlips/cargo.svg.192dpi.png
new file mode 100644
index 0000000000..94a016ec17
Binary files /dev/null and b/Resources/Textures/Interface/Paper/AcquisitionSlips/cargo.svg.192dpi.png differ
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/cargo.svg.192dpi.png.yml b/Resources/Textures/Interface/Paper/AcquisitionSlips/cargo.svg.192dpi.png.yml
new file mode 100644
index 0000000000..5c43e23305
--- /dev/null
+++ b/Resources/Textures/Interface/Paper/AcquisitionSlips/cargo.svg.192dpi.png.yml
@@ -0,0 +1,2 @@
+sample:
+ filter: true
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/engineering.svg b/Resources/Textures/Interface/Paper/AcquisitionSlips/engineering.svg
new file mode 100644
index 0000000000..9a3901a9e3
--- /dev/null
+++ b/Resources/Textures/Interface/Paper/AcquisitionSlips/engineering.svg
@@ -0,0 +1,29 @@
+
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/engineering.svg.192dpi.png b/Resources/Textures/Interface/Paper/AcquisitionSlips/engineering.svg.192dpi.png
new file mode 100644
index 0000000000..79beedb9ec
Binary files /dev/null and b/Resources/Textures/Interface/Paper/AcquisitionSlips/engineering.svg.192dpi.png differ
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/engineering.svg.192dpi.png.yml b/Resources/Textures/Interface/Paper/AcquisitionSlips/engineering.svg.192dpi.png.yml
new file mode 100644
index 0000000000..5c43e23305
--- /dev/null
+++ b/Resources/Textures/Interface/Paper/AcquisitionSlips/engineering.svg.192dpi.png.yml
@@ -0,0 +1,2 @@
+sample:
+ filter: true
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/medical.svg b/Resources/Textures/Interface/Paper/AcquisitionSlips/medical.svg
new file mode 100644
index 0000000000..4912c9fc66
--- /dev/null
+++ b/Resources/Textures/Interface/Paper/AcquisitionSlips/medical.svg
@@ -0,0 +1,25 @@
+
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/medical.svg.192dpi.png b/Resources/Textures/Interface/Paper/AcquisitionSlips/medical.svg.192dpi.png
new file mode 100644
index 0000000000..aaa3ed92ef
Binary files /dev/null and b/Resources/Textures/Interface/Paper/AcquisitionSlips/medical.svg.192dpi.png differ
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/medical.svg.192dpi.png.yml b/Resources/Textures/Interface/Paper/AcquisitionSlips/medical.svg.192dpi.png.yml
new file mode 100644
index 0000000000..5c43e23305
--- /dev/null
+++ b/Resources/Textures/Interface/Paper/AcquisitionSlips/medical.svg.192dpi.png.yml
@@ -0,0 +1,2 @@
+sample:
+ filter: true
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/science.svg b/Resources/Textures/Interface/Paper/AcquisitionSlips/science.svg
new file mode 100644
index 0000000000..6016bddc48
--- /dev/null
+++ b/Resources/Textures/Interface/Paper/AcquisitionSlips/science.svg
@@ -0,0 +1,26 @@
+
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/science.svg.192dpi.png b/Resources/Textures/Interface/Paper/AcquisitionSlips/science.svg.192dpi.png
new file mode 100644
index 0000000000..9de86a3970
Binary files /dev/null and b/Resources/Textures/Interface/Paper/AcquisitionSlips/science.svg.192dpi.png differ
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/science.svg.192dpi.png.yml b/Resources/Textures/Interface/Paper/AcquisitionSlips/science.svg.192dpi.png.yml
new file mode 100644
index 0000000000..5c43e23305
--- /dev/null
+++ b/Resources/Textures/Interface/Paper/AcquisitionSlips/science.svg.192dpi.png.yml
@@ -0,0 +1,2 @@
+sample:
+ filter: true
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/security.svg b/Resources/Textures/Interface/Paper/AcquisitionSlips/security.svg
new file mode 100644
index 0000000000..8051f1ef32
--- /dev/null
+++ b/Resources/Textures/Interface/Paper/AcquisitionSlips/security.svg
@@ -0,0 +1,26 @@
+
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/security.svg.192dpi.png b/Resources/Textures/Interface/Paper/AcquisitionSlips/security.svg.192dpi.png
new file mode 100644
index 0000000000..3e1608f3c5
Binary files /dev/null and b/Resources/Textures/Interface/Paper/AcquisitionSlips/security.svg.192dpi.png differ
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/security.svg.192dpi.png.yml b/Resources/Textures/Interface/Paper/AcquisitionSlips/security.svg.192dpi.png.yml
new file mode 100644
index 0000000000..5c43e23305
--- /dev/null
+++ b/Resources/Textures/Interface/Paper/AcquisitionSlips/security.svg.192dpi.png.yml
@@ -0,0 +1,2 @@
+sample:
+ filter: true
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/service.svg b/Resources/Textures/Interface/Paper/AcquisitionSlips/service.svg
new file mode 100644
index 0000000000..7028bb0f48
--- /dev/null
+++ b/Resources/Textures/Interface/Paper/AcquisitionSlips/service.svg
@@ -0,0 +1,25 @@
+
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/service.svg.192dpi.png b/Resources/Textures/Interface/Paper/AcquisitionSlips/service.svg.192dpi.png
new file mode 100644
index 0000000000..6cc1447e72
Binary files /dev/null and b/Resources/Textures/Interface/Paper/AcquisitionSlips/service.svg.192dpi.png differ
diff --git a/Resources/Textures/Interface/Paper/AcquisitionSlips/service.svg.192dpi.png.yml b/Resources/Textures/Interface/Paper/AcquisitionSlips/service.svg.192dpi.png.yml
new file mode 100644
index 0000000000..5c43e23305
--- /dev/null
+++ b/Resources/Textures/Interface/Paper/AcquisitionSlips/service.svg.192dpi.png.yml
@@ -0,0 +1,2 @@
+sample:
+ filter: true
diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/acquisition_form.png b/Resources/Textures/Objects/Misc/bureaucracy.rsi/acquisition_form.png
new file mode 100644
index 0000000000..f5b55f7706
Binary files /dev/null and b/Resources/Textures/Objects/Misc/bureaucracy.rsi/acquisition_form.png differ
diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/acquisition_form_header.png b/Resources/Textures/Objects/Misc/bureaucracy.rsi/acquisition_form_header.png
new file mode 100644
index 0000000000..ab22e0e3c1
Binary files /dev/null and b/Resources/Textures/Objects/Misc/bureaucracy.rsi/acquisition_form_header.png differ
diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/acquisition_form_words.png b/Resources/Textures/Objects/Misc/bureaucracy.rsi/acquisition_form_words.png
new file mode 100644
index 0000000000..3f7e0b7fbd
Binary files /dev/null and b/Resources/Textures/Objects/Misc/bureaucracy.rsi/acquisition_form_words.png differ
diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json
index 87d5f9d0c1..a88ef6eda2 100644
--- a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json
+++ b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json
@@ -1,12 +1,21 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432. paper_stamp-syndicate by Veritius. paper_receipt, paper_receipt_horizontal by eoineoineoin. paper_stamp-greytide by ubaser. paper_stamp-psychologist by clinux. syndicate_card by Aserovich. paper_stamp_wizard by brassicaprime69 (Discord)",
+ "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432. paper_stamp-syndicate by Veritius. paper_receipt, paper_receipt_horizontal by eoineoineoin. paper_stamp-greytide by ubaser. paper_stamp-psychologist by clinux. syndicate_card by Aserovich. paper_stamp_wizard by brassicaprime69 (Discord), acquisition_form acquisition_form_words and acquisition_form_header by sowelipililimute (GitHub)",
"size": {
"x": 32,
"y": 32
},
"states": [
+ {
+ "name": "acquisition_form"
+ },
+ {
+ "name": "acquisition_form_words"
+ },
+ {
+ "name": "acquisition_form_header"
+ },
{
"name": "envelope_closed"
},