diff --git a/Content.Client/_CorvaxNext/Cards/Card/CardSystem.cs b/Content.Client/_CorvaxNext/Cards/Card/CardSystem.cs
new file mode 100644
index 00000000000..5cb827a465a
--- /dev/null
+++ b/Content.Client/_CorvaxNext/Cards/Card/CardSystem.cs
@@ -0,0 +1,89 @@
+using System.Linq;
+using Content.Shared._CorvaxNext.Cards.Card;
+using Robust.Client.GameObjects;
+using Robust.Shared.Utility;
+
+namespace Content.Client._CorvaxNext.Cards.Card;
+
+///
+/// Handles the initialization and updating of card sprites on the client side,
+/// particularly when a card is flipped or when the component starts up.
+///
+public sealed class CardSystem : EntitySystem
+{
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnComponentStartupEvent);
+ SubscribeNetworkEvent(OnFlip);
+ }
+
+ private void OnComponentStartupEvent(EntityUid uid, CardComponent comp, ComponentStartup args)
+ {
+ if (!TryComp(uid, out SpriteComponent? spriteComponent))
+ return;
+
+ var layerCount = spriteComponent.AllLayers.Count();
+ for (var i = 0; i < layerCount; i++)
+ {
+ if (!spriteComponent.TryGetLayer(i, out var layer) || layer.State == null || layer.State.Name == null)
+ continue;
+
+ var rsi = layer.RSI ?? spriteComponent.BaseRSI;
+ if (rsi == null)
+ continue;
+
+ comp.FrontSprite.Add(new SpriteSpecifier.Rsi(rsi.Path, layer.State.Name));
+ }
+
+ comp.BackSprite ??= comp.FrontSprite;
+
+ // Removed Dirty(uid, comp); as calling Dirty on the client is inappropriate.
+ UpdateSprite(uid, comp);
+ }
+
+ private void OnFlip(CardFlipUpdatedEvent args)
+ {
+ var entity = GetEntity(args.Card);
+ if (!TryComp(entity, out CardComponent? comp))
+ return;
+
+ UpdateSprite(entity, comp);
+ }
+
+ private void UpdateSprite(EntityUid uid, CardComponent comp)
+ {
+ var newSprite = comp.Flipped ? comp.BackSprite : comp.FrontSprite;
+ if (newSprite == null)
+ return;
+
+ if (!TryComp(uid, out SpriteComponent? spriteComponent))
+ return;
+
+ var layerCount = newSprite.Count;
+ var spriteLayerCount = spriteComponent.AllLayers.Count();
+
+ // Inserts missing layers
+ if (spriteLayerCount < layerCount)
+ {
+ for (var i = spriteLayerCount; i < layerCount; i++)
+ {
+ spriteComponent.AddBlankLayer(i);
+ }
+ }
+ // Removes extra layers
+ else if (spriteLayerCount > layerCount)
+ {
+ for (var i = spriteLayerCount - 1; i >= layerCount; i--)
+ {
+ spriteComponent.RemoveLayer(i);
+ }
+ }
+
+ for (var i = 0; i < layerCount; i++)
+ {
+ var layer = newSprite[i];
+ spriteComponent.LayerSetSprite(i, layer);
+ }
+ }
+}
diff --git a/Content.Client/_CorvaxNext/Cards/CardSpriteSystem.cs b/Content.Client/_CorvaxNext/Cards/CardSpriteSystem.cs
new file mode 100644
index 00000000000..d38c98ae41e
--- /dev/null
+++ b/Content.Client/_CorvaxNext/Cards/CardSpriteSystem.cs
@@ -0,0 +1,85 @@
+using System.Linq;
+using Content.Shared._CorvaxNext.Cards.Stack;
+using Robust.Client.GameObjects;
+
+namespace Content.Client._CorvaxNext.Cards;
+
+///
+/// Manages the visual representation of card stacks by dynamically adjusting and configuring sprite layers
+/// based on the number of cards in the stack and their properties.
+///
+public sealed class CardSpriteSystem : EntitySystem
+{
+ ///
+ public override void Initialize()
+ {
+
+ }
+
+ public bool TryAdjustLayerQuantity(Entity uid, int? cardLimit = null)
+ {
+ var sprite = uid.Comp1;
+ var stack = uid.Comp2;
+ var cardCount = cardLimit == null ? stack.Cards.Count : Math.Min(stack.Cards.Count, cardLimit.Value);
+
+ var layerCount = 0;
+ //Gets the quantity of layers
+ foreach (var card in stack.Cards.TakeLast(cardCount))
+ {
+ if (!TryComp(card, out SpriteComponent? cardSprite))
+ return false;
+
+ layerCount += cardSprite.AllLayers.Count();
+ }
+ //inserts Missing Layers
+ if (sprite.AllLayers.Count() < layerCount)
+ {
+ for (var i = sprite.AllLayers.Count(); i < layerCount; i++)
+ {
+ sprite.AddBlankLayer(i);
+ }
+ }
+ //Removes extra layers
+ else if (sprite.AllLayers.Count() > layerCount)
+ {
+ for (var i = sprite.AllLayers.Count() - 1; i >= layerCount; i--)
+ {
+ sprite.RemoveLayer(i);
+ }
+ }
+
+
+ return true;
+ }
+
+ public bool TryHandleLayerConfiguration(Entity uid, int cardCount, Func, int, int, bool> layerFunc)
+ {
+ var sprite = uid.Comp1;
+ var stack = uid.Comp2;
+
+ // int = index of what card it is from
+ List<(int, ISpriteLayer)> layers = [];
+
+ var i = 0;
+ foreach (var card in stack.Cards.TakeLast(cardCount))
+ {
+ if (!TryComp(card, out SpriteComponent? cardSprite))
+ return false;
+ layers.AddRange(cardSprite.AllLayers.Select(layer => (i, layer)));
+ i++;
+ }
+
+ var j = 0;
+ foreach (var obj in layers)
+ {
+ var (cardIndex, layer) = obj;
+ sprite.LayerSetVisible(j, true);
+ sprite.LayerSetTexture(j, layer.Texture);
+ sprite.LayerSetState(j, layer.RsiState.Name);
+ layerFunc.Invoke((uid, sprite), cardIndex, j);
+ j++;
+ }
+
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/Content.Client/_CorvaxNext/Cards/Deck/CardDeckSystem.cs b/Content.Client/_CorvaxNext/Cards/Deck/CardDeckSystem.cs
new file mode 100644
index 00000000000..704d0617797
--- /dev/null
+++ b/Content.Client/_CorvaxNext/Cards/Deck/CardDeckSystem.cs
@@ -0,0 +1,162 @@
+using System.Collections.Generic;
+using System.Numerics;
+using Content.Shared._CorvaxNext.Cards.Deck;
+using Content.Shared._CorvaxNext.Cards.Stack;
+using Robust.Client.GameObjects;
+
+namespace Content.Client._CorvaxNext.Cards.Deck;
+
+///
+/// Handles the visual representation and sprite updates for card decks on the client side,
+/// responding to events such as card stack changes, flips, and reordering.
+///
+public sealed class CardDeckSystem : EntitySystem
+{
+ private readonly Dictionary _notInitialized = new();
+ [Dependency] private readonly CardSpriteSystem _cardSpriteSystem = default!;
+
+ ///
+ public override void Initialize()
+ {
+ UpdatesOutsidePrediction = false;
+ SubscribeLocalEvent(OnComponentStartupEvent);
+ SubscribeNetworkEvent(OnStackStart);
+ SubscribeNetworkEvent(OnStackUpdate);
+ SubscribeNetworkEvent(OnReorder);
+ SubscribeNetworkEvent(OnStackFlip);
+ SubscribeLocalEvent(OnAppearanceChanged);
+ }
+
+ public override void Update(float frameTime)
+ {
+ base.Update(frameTime);
+
+ // Lazy initialization of card deck sprites
+ var entitiesToRemove = new List();
+
+ foreach (var kvp in _notInitialized)
+ {
+ var uid = kvp.Key;
+ var attempts = kvp.Value;
+
+ if (attempts >= 5)
+ {
+ // Maximum attempts reached, remove from tracking
+ entitiesToRemove.Add(uid);
+ continue;
+ }
+
+ _notInitialized[uid] = attempts + 1;
+
+ if (!TryComp(uid, out CardStackComponent? stack) || stack.Cards.Count <= 0)
+ continue;
+
+ // Check if the card's sprite layer is initialized
+ if (!TryGetCardLayer(stack.Cards[^1], out _))
+ continue;
+
+ // Update the sprite now that the card is initialized
+ if (TryComp(uid, out CardDeckComponent? comp))
+ {
+ UpdateSprite(uid, comp);
+ }
+
+ entitiesToRemove.Add(uid);
+ }
+
+ // Remove entities outside the loop to avoid modifying the collection during iteration
+ foreach (var uid in entitiesToRemove)
+ {
+ _notInitialized.Remove(uid);
+ }
+ }
+
+ private bool TryGetCardLayer(EntityUid card, out SpriteComponent.Layer? layer)
+ {
+ layer = null;
+ if (!TryComp(card, out SpriteComponent? cardSprite))
+ return false;
+
+ if (!cardSprite.TryGetLayer(0, out var l))
+ return false;
+
+ layer = l;
+ return true;
+ }
+
+ private void UpdateSprite(EntityUid uid, CardDeckComponent comp)
+ {
+ if (!TryComp(uid, out SpriteComponent? sprite))
+ return;
+
+ if (!TryComp(uid, out CardStackComponent? cardStack))
+ return;
+
+ // Prevent errors when the card stack is empty or not initialized
+ if (cardStack.Cards.Count <= 0 || !TryGetCardLayer(cardStack.Cards[^1], out _))
+ {
+ _notInitialized[uid] = 0;
+ return;
+ }
+
+ _cardSpriteSystem.TryAdjustLayerQuantity((uid, sprite, cardStack), comp.CardLimit);
+
+ _cardSpriteSystem.TryHandleLayerConfiguration(
+ (uid, sprite, cardStack),
+ comp.CardLimit,
+ (sprt, cardIndex, layerIndex) =>
+ {
+ sprite.LayerSetRotation(layerIndex, Angle.FromDegrees(90));
+ sprite.LayerSetOffset(layerIndex, new Vector2(0, comp.YOffset * cardIndex));
+ sprite.LayerSetScale(layerIndex, new Vector2(comp.Scale, comp.Scale));
+ return true;
+ }
+ );
+ }
+
+ private void OnStackUpdate(CardStackQuantityChangeEvent args)
+ {
+ var entity = GetEntity(args.Stack);
+ if (!TryComp(entity, out CardDeckComponent? comp))
+ return;
+
+ UpdateSprite(entity, comp);
+ }
+
+ private void OnStackFlip(CardStackFlippedEvent args)
+ {
+ var entity = GetEntity(args.CardStack);
+ if (!TryComp(entity, out CardDeckComponent? comp))
+ return;
+
+ UpdateSprite(entity, comp);
+ }
+
+ private void OnReorder(CardStackReorderedEvent args)
+ {
+ var entity = GetEntity(args.Stack);
+ if (!TryComp(entity, out CardDeckComponent? comp))
+ return;
+
+ UpdateSprite(entity, comp);
+ }
+
+ private void OnAppearanceChanged(EntityUid uid, CardDeckComponent comp, AppearanceChangeEvent args)
+ {
+ UpdateSprite(uid, comp);
+ }
+
+ private void OnComponentStartupEvent(EntityUid uid, CardDeckComponent comp, ComponentStartup args)
+ {
+ UpdateSprite(uid, comp);
+ }
+
+ private void OnStackStart(CardStackInitiatedEvent args)
+ {
+ var entity = GetEntity(args.CardStack);
+ if (!TryComp(entity, out CardDeckComponent? comp))
+ return;
+
+ UpdateSprite(entity, comp);
+ }
+}
diff --git a/Content.Client/_CorvaxNext/Cards/Hand/CardHandSystem.cs b/Content.Client/_CorvaxNext/Cards/Hand/CardHandSystem.cs
new file mode 100644
index 00000000000..fe2747fa885
--- /dev/null
+++ b/Content.Client/_CorvaxNext/Cards/Hand/CardHandSystem.cs
@@ -0,0 +1,118 @@
+using System.Numerics;
+using Content.Shared._CorvaxNext.Cards.Hand;
+using Content.Shared._CorvaxNext.Cards.Stack;
+using Robust.Client.GameObjects;
+
+namespace Content.Client._CorvaxNext.Cards.Hand;
+
+///
+/// Handles the visual representation and sprite updates for the player's hand of cards on the client side.
+/// Responds to events related to the card stack to update the card hand's appearance accordingly.
+///
+public sealed class CardHandSystem : EntitySystem
+{
+ [Dependency] private readonly CardSpriteSystem _cardSpriteSystem = default!;
+
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnComponentStartupEvent);
+ SubscribeNetworkEvent(OnStackStart);
+ SubscribeNetworkEvent(OnStackUpdate);
+ SubscribeNetworkEvent(OnStackReorder);
+ SubscribeNetworkEvent(OnStackFlip);
+ }
+
+ private void UpdateSprite(EntityUid uid, CardHandComponent comp)
+ {
+ if (!TryComp(uid, out var sprite))
+ return;
+
+ if (!TryComp(uid, out var cardStack))
+ return;
+
+ if (!_cardSpriteSystem.TryAdjustLayerQuantity((uid, sprite, cardStack), comp.CardLimit))
+ return;
+
+ var cardCount = Math.Min(cardStack.Cards.Count, comp.CardLimit);
+
+ if (cardCount <= 1)
+ {
+ // Single card case
+ _cardSpriteSystem.TryHandleLayerConfiguration(
+ (uid, sprite, cardStack),
+ cardCount,
+ (spriteEntity, cardIndex, layerIndex) =>
+ {
+ spriteEntity.Comp.LayerSetRotation(layerIndex, Angle.Zero);
+ spriteEntity.Comp.LayerSetOffset(layerIndex, new Vector2(0, 0.10f));
+ spriteEntity.Comp.LayerSetScale(layerIndex, new Vector2(comp.Scale, comp.Scale));
+ return true;
+ }
+ );
+ }
+ else
+ {
+ // Multiple cards case
+ var intervalAngle = comp.Angle / (cardCount - 1);
+ var intervalSize = comp.XOffset / (cardCount - 1);
+
+ _cardSpriteSystem.TryHandleLayerConfiguration(
+ (uid, sprite, cardStack),
+ cardCount,
+ (spriteEntity, cardIndex, layerIndex) =>
+ {
+ var angle = -(comp.Angle / 2) + cardIndex * intervalAngle;
+ var xOffset = -(comp.XOffset / 2) + cardIndex * intervalSize;
+ var yOffset = -(xOffset * xOffset) + 0.10f;
+
+ spriteEntity.Comp.LayerSetRotation(layerIndex, Angle.FromDegrees(-angle));
+ spriteEntity.Comp.LayerSetOffset(layerIndex, new Vector2(xOffset, yOffset));
+ spriteEntity.Comp.LayerSetScale(layerIndex, new Vector2(comp.Scale, comp.Scale));
+ return true;
+ }
+ );
+ }
+ }
+
+ private void OnStackUpdate(CardStackQuantityChangeEvent args)
+ {
+ var entity = GetEntity(args.Stack);
+ if (!TryComp(entity, out var comp))
+ return;
+
+ UpdateSprite(entity, comp);
+ }
+
+ private void OnStackStart(CardStackInitiatedEvent args)
+ {
+ var entity = GetEntity(args.CardStack);
+ if (!TryComp(entity, out var comp))
+ return;
+
+ UpdateSprite(entity, comp);
+ }
+
+ private void OnComponentStartupEvent(EntityUid uid, CardHandComponent comp, ComponentStartup args)
+ {
+ UpdateSprite(uid, comp);
+ }
+
+ private void OnStackReorder(CardStackReorderedEvent args)
+ {
+ var entity = GetEntity(args.Stack);
+ if (!TryComp(entity, out var comp))
+ return;
+
+ UpdateSprite(entity, comp);
+ }
+
+ private void OnStackFlip(CardStackFlippedEvent args)
+ {
+ var entity = GetEntity(args.CardStack);
+ if (!TryComp(entity, out var comp))
+ return;
+
+ UpdateSprite(entity, comp);
+ }
+}
diff --git a/Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenu.xaml b/Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenu.xaml
new file mode 100644
index 00000000000..9704763a5e0
--- /dev/null
+++ b/Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenu.xaml
@@ -0,0 +1,11 @@
+
+
+
+
\ No newline at end of file
diff --git a/Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenu.xaml.cs b/Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenu.xaml.cs
new file mode 100644
index 00000000000..54b9e3d962a
--- /dev/null
+++ b/Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenu.xaml.cs
@@ -0,0 +1,101 @@
+using Content.Client.UserInterface.Controls;
+using Content.Shared.Popups;
+using Robust.Client.AutoGenerated;
+using Robust.Client.GameObjects;
+using Robust.Client.Player;
+using Robust.Client.UserInterface.Controls;
+using Robust.Client.UserInterface.XAML;
+using System.Numerics;
+using Content.Shared._CorvaxNext.Cards.Card;
+using Content.Shared._CorvaxNext.Cards.Stack;
+
+namespace Content.Client._CorvaxNext.Cards.Hand.UI;
+
+[GenerateTypedNameReferences]
+public sealed partial class CardHandMenu : RadialMenu
+{
+ [Dependency] private readonly IEntityManager _entManager = default!;
+ [Dependency] private readonly IPlayerManager _playerManager = default!;
+
+ private readonly SpriteSystem _spriteSystem;
+ private readonly SharedPopupSystem _popup;
+
+ public event Action? CardHandDrawMessageAction;
+
+ private EntityUid _owner;
+
+ ///
+ /// Represents the radial menu UI for displaying the player's hand of cards,
+ /// allowing the player to select a card to draw.
+ ///
+ public CardHandMenu(EntityUid owner, CardHandMenuBoundUserInterface bui)
+ {
+ IoCManager.InjectDependencies(this);
+ RobustXamlLoader.Load(this);
+
+ _spriteSystem = _entManager.System();
+ _popup = _entManager.System();
+
+ _owner = owner;
+
+ // Find the main radial container
+ var main = FindControl("Main");
+
+ if (!_entManager.TryGetComponent(owner, out var stack))
+ return;
+
+ if (_playerManager.LocalSession == null)
+ return;
+
+ foreach (var card in stack.Cards)
+ {
+ if (!_entManager.TryGetComponent(card, out var cardComp))
+ continue;
+
+ string cardName;
+ if (cardComp.Flipped && _entManager.TryGetComponent(card, out var metadata))
+ {
+ cardName = metadata.EntityName;
+ }
+ else
+ {
+ cardName = Loc.GetString(cardComp.Name);
+ }
+
+ var button = new CardMenuButton()
+ {
+ StyleClasses = { "RadialMenuButton" },
+ SetSize = new Vector2(64f, 64f),
+ ToolTip = cardName,
+ };
+
+ if (_entManager.TryGetComponent(card, out var sprite))
+ {
+ if (sprite.Icon == null)
+ continue;
+
+ var tex = new TextureRect()
+ {
+ VerticalAlignment = VAlignment.Center,
+ HorizontalAlignment = HAlignment.Center,
+ Texture = sprite.Icon.Default,
+ TextureScale = new Vector2(2f, 2f),
+ };
+
+ button.AddChild(tex);
+ }
+
+ main.AddChild(button);
+
+ button.OnButtonUp += _ =>
+ {
+ CardHandDrawMessageAction?.Invoke(_entManager.GetNetEntity(card));
+ Close();
+ };
+ }
+
+ CardHandDrawMessageAction += bui.SendCardHandDrawMessage;
+ }
+}
+
+public sealed class CardMenuButton : RadialMenuTextureButton;
\ No newline at end of file
diff --git a/Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenuBoundUserInterface.cs b/Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenuBoundUserInterface.cs
new file mode 100644
index 00000000000..e720b374f47
--- /dev/null
+++ b/Content.Client/_CorvaxNext/Cards/Hand/UI/CardHandMenuBoundUserInterface.cs
@@ -0,0 +1,51 @@
+using Content.Shared._CorvaxNext.Cards.Hand;
+using Content.Shared.RCD;
+using JetBrains.Annotations;
+using Robust.Client.Graphics;
+using Robust.Client.Input;
+using Robust.Shared.Prototypes;
+
+namespace Content.Client._CorvaxNext.Cards.Hand.UI;
+
+[UsedImplicitly]
+public sealed class CardHandMenuBoundUserInterface : BoundUserInterface
+{
+ [Dependency] private readonly IClyde _displayManager = default!;
+ [Dependency] private readonly IInputManager _inputManager = default!;
+
+ private CardHandMenu? _menu;
+
+ ///
+ /// Initializes a new instance of the class,
+ /// which manages the interaction between the card hand UI and the game logic.
+ ///
+ public CardHandMenuBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey)
+ {
+ IoCManager.InjectDependencies(this);
+ }
+
+ protected override void Open()
+ {
+ base.Open();
+
+ _menu = new CardHandMenu(Owner, this);
+ _menu.OnClose += Close;
+
+ // Open the menu, centered on the mouse
+ var vpSize = _displayManager.ScreenSize;
+ _menu.OpenCenteredAt(_inputManager.MouseScreenPosition.Position / vpSize);
+ }
+
+ public void SendCardHandDrawMessage(NetEntity e)
+ {
+ SendMessage(new CardHandDrawMessage(e));
+ }
+
+ protected override void Dispose(bool disposing)
+ {
+ base.Dispose(disposing);
+ if (!disposing) return;
+
+ _menu?.Close();
+ }
+}
\ No newline at end of file
diff --git a/Content.Server/Storage/EntitySystems/StorageSystem.Fill.cs b/Content.Server/Storage/EntitySystems/StorageSystem.Fill.cs
index 768491f9876..d43e4e34e1b 100644
--- a/Content.Server/Storage/EntitySystems/StorageSystem.Fill.cs
+++ b/Content.Server/Storage/EntitySystems/StorageSystem.Fill.cs
@@ -31,7 +31,7 @@ private void OnStorageFillMapInit(EntityUid uid, StorageFillComponent component,
}
}
- private void FillStorage(Entity entity)
+ public void FillStorage(Entity entity) // Corvax-Next-Cards
{
var (uid, component, storage) = entity;
diff --git a/Content.Server/_CorvaxNext/OpenTriggeredStorageFill/OpenTriggeredStorageFillComponent.cs b/Content.Server/_CorvaxNext/OpenTriggeredStorageFill/OpenTriggeredStorageFillComponent.cs
new file mode 100644
index 00000000000..e939c8f48c8
--- /dev/null
+++ b/Content.Server/_CorvaxNext/OpenTriggeredStorageFill/OpenTriggeredStorageFillComponent.cs
@@ -0,0 +1,13 @@
+using Content.Shared.Storage;
+using Robust.Shared.Prototypes;
+
+namespace Content.Server._CorvaxNext.OpenTriggeredStorageFill;
+
+///
+/// This is used for storing an item prototype to be inserted into a container when the trigger is activated. This is deleted from the entity after the item is inserted.
+///
+[RegisterComponent]
+public sealed partial class OpenTriggeredStorageFillComponent : Component
+{
+ [DataField("contents")] public List Contents = new();
+}
diff --git a/Content.Server/_CorvaxNext/OpenTriggeredStorageFill/OpenTriggeredStorageFillSystem.cs b/Content.Server/_CorvaxNext/OpenTriggeredStorageFill/OpenTriggeredStorageFillSystem.cs
new file mode 100644
index 00000000000..0850951f6d8
--- /dev/null
+++ b/Content.Server/_CorvaxNext/OpenTriggeredStorageFill/OpenTriggeredStorageFillSystem.cs
@@ -0,0 +1,50 @@
+using Content.Server.Spawners.Components;
+using Content.Shared.Interaction;
+using Content.Shared.Item;
+using Content.Shared.Prototypes;
+using Content.Shared.Storage;
+using Content.Shared.Storage.EntitySystems;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Utility;
+
+namespace Content.Server._CorvaxNext.OpenTriggeredStorageFill;
+
+///
+/// Handles spawning and inserting items into a storage entity when it is activated for the first time.
+///
+public sealed class OpenTriggeredStorageFillSystem : EntitySystem
+{
+ [Dependency] private readonly SharedStorageSystem _storage = default!;
+ [Dependency] private readonly IPrototypeManager _prototype = default!;
+
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnOpenEvent);
+ }
+
+ //Yes, that's a copy of StorageSystem StorageFill method
+ private void OnOpenEvent(EntityUid uid, OpenTriggeredStorageFillComponent comp, ActivateInWorldEvent args)
+ {
+ var coordinates = Transform(uid).Coordinates;
+
+ var spawnItems = EntitySpawnCollection.GetSpawns(comp.Contents);
+ foreach (var item in spawnItems)
+ {
+ DebugTools.Assert(!_prototype.Index(item)
+ .HasComponent(typeof(RandomSpawnerComponent)));
+ var ent = Spawn(item, coordinates);
+
+ if (!TryComp(ent, out var itemComp))
+ {
+ Log.Error($"Tried to fill {ToPrettyString(uid)} with non-item {item}.");
+ Del(ent);
+ continue;
+ }
+ if (!_storage.Insert(uid, ent, out _, out var _, playSound: false))
+ Log.Error($"Failed attemp while trying to fill {ToPrettyString(uid)}");
+ }
+
+ RemComp(uid, comp);
+ }
+}
diff --git a/Content.Shared/_CorvaxNext/Cards/Card/CardComponent.cs b/Content.Shared/_CorvaxNext/Cards/Card/CardComponent.cs
new file mode 100644
index 00000000000..37d124b4f2c
--- /dev/null
+++ b/Content.Shared/_CorvaxNext/Cards/Card/CardComponent.cs
@@ -0,0 +1,45 @@
+using Robust.Shared.GameStates;
+using Robust.Shared.Serialization;
+using Robust.Shared.Utility;
+
+namespace Content.Shared._CorvaxNext.Cards.Card;
+
+///
+/// Represents a card entity that has both a front and back sprite, and can be flipped.
+/// This component is networked and supports updating the state of the card's visuals and name across the network.
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class CardComponent : Component
+{
+ ///
+ /// The back of the card
+ ///
+ [DataField("backSpriteLayers", readOnly: true)]
+ public List? BackSprite = [];
+
+ ///
+ /// The front of the card
+ ///
+ [DataField("frontSpriteLayers", readOnly: true)]
+ public List FrontSprite = [];
+
+ ///
+ /// If it is currently flipped. This is used to update sprite and name.
+ ///
+ [DataField("flipped", readOnly: true), AutoNetworkedField]
+ public bool Flipped = false;
+
+
+ ///
+ /// The name of the card.
+ ///
+ [DataField("name", readOnly: true), AutoNetworkedField]
+ public string Name = "";
+
+}
+
+[Serializable, NetSerializable]
+public sealed class CardFlipUpdatedEvent(NetEntity card) : EntityEventArgs
+{
+ public NetEntity Card = card;
+}
diff --git a/Content.Shared/_CorvaxNext/Cards/Card/CardSystem.cs b/Content.Shared/_CorvaxNext/Cards/Card/CardSystem.cs
new file mode 100644
index 00000000000..4d51135a6bf
--- /dev/null
+++ b/Content.Shared/_CorvaxNext/Cards/Card/CardSystem.cs
@@ -0,0 +1,222 @@
+using Content.Shared._CorvaxNext.Cards.Deck;
+using Content.Shared._CorvaxNext.Cards.Hand;
+using Content.Shared._CorvaxNext.Cards.Stack;
+using Content.Shared.Examine;
+using Content.Shared.Hands.Components;
+using Content.Shared.Hands.EntitySystems;
+using Content.Shared.Interaction;
+using Content.Shared.Interaction.Events;
+using Content.Shared.Verbs;
+using Robust.Shared.Containers;
+using Robust.Shared.Network;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Utility;
+
+namespace Content.Shared._CorvaxNext.Cards.Card;
+
+///
+/// Handles the core functionality and interactions of card entities, including flipping cards,
+/// combining them into stacks, hands, or decks, and providing contextual actions such as drawing and joining.
+/// This system manages both server-side and client-side behavior, ensuring synchronized state across the network.
+///
+public sealed class CardSystem : EntitySystem
+{
+ [Dependency] private readonly INetManager _net = default!;
+ [Dependency] private readonly CardStackSystem _cardStack = default!;
+ [Dependency] private readonly CardDeckSystem _cardDeck = default!;
+ [Dependency] private readonly CardHandSystem _cardHand = default!;
+ [Dependency] private readonly SharedContainerSystem _container = default!;
+ [Dependency] private readonly SharedHandsSystem _hands = default!;
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent>(AddTurnOnVerb);
+ SubscribeLocalEvent>(OnActivationVerb);
+ SubscribeLocalEvent(OnExamined);
+ SubscribeLocalEvent(OnUse);
+ SubscribeLocalEvent(OnActivate);
+ }
+ private void OnExamined(EntityUid uid, CardComponent component, ExaminedEvent args)
+ {
+ if (args.IsInDetailsRange && !component.Flipped)
+ {
+ args.PushMarkup(Loc.GetString("card-examined", ("target", Loc.GetString(component.Name))));
+ }
+ }
+
+ private void AddTurnOnVerb(EntityUid uid, CardComponent component, GetVerbsEvent args)
+ {
+ if (!args.CanAccess || !args.CanInteract || args.Hands == null)
+ return;
+
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => FlipCard(uid, component),
+ Text = Loc.GetString("cards-verb-flip"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/flip.svg.192dpi.png")),
+ Priority = 1
+ });
+
+ if (args.Using == null || args.Using == args.Target)
+ return;
+
+ if (TryComp(args.Using, out var usingStack))
+ {
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => JoinCards(args.User, args.Target, component, (EntityUid)args.Using, usingStack),
+ Text = Loc.GetString("card-verb-join"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")),
+ Priority = 2
+ });
+ }
+ else if (TryComp(args.Using, out var usingCard))
+ {
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => _cardHand.TrySetupHandOfCards(args.User, args.Target, component, args.Using.Value, usingCard, false),
+ Text = Loc.GetString("card-verb-join"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")),
+ Priority = 2
+ });
+ }
+ }
+
+ private void OnUse(EntityUid uid, CardComponent comp, UseInHandEvent args)
+ {
+ if (args.Handled)
+ return;
+
+ FlipCard(uid, comp);
+ args.Handled = true;
+ }
+
+ ///
+ /// Server-Side only method to flip card. This starts CardFlipUpdatedEvent event
+ ///
+ ///
+ ///
+ private void FlipCard(EntityUid uid, CardComponent component)
+ {
+ if (_net.IsClient)
+ return;
+ component.Flipped = !component.Flipped;
+ Dirty(uid, component);
+ RaiseNetworkEvent(new CardFlipUpdatedEvent(GetNetEntity(uid)));
+ }
+
+ private void JoinCards(EntityUid user, EntityUid first, CardComponent firstComp, EntityUid second, CardStackComponent secondStack)
+ {
+ if (_net.IsClient)
+ return;
+
+ EntityUid cardStack;
+ bool? flip = null;
+ if (HasComp(second))
+ {
+ cardStack = SpawnInSameParent(_cardDeck.CardDeckBaseName, first);
+ }
+ else if (HasComp(second))
+ {
+ cardStack = SpawnInSameParent(_cardHand.CardHandBaseName, first);
+ if(TryComp(cardStack, out var stackHand))
+ stackHand.Flipped = firstComp.Flipped;
+ flip = firstComp.Flipped;
+ }
+ else
+ return;
+
+ if (!TryComp(cardStack, out CardStackComponent? stack))
+ return;
+ if (!_cardStack.TryInsertCard(cardStack, first, stack))
+ return;
+ _cardStack.TransferNLastCardFromStacks(user, secondStack.Cards.Count, second, secondStack, cardStack, stack);
+ if (flip != null)
+ _cardStack.FlipAllCards(cardStack, stack, flip); //???
+ }
+
+ // Frontier: tries to spawn an entity with the same parent as another given entity.
+ // Useful when spawning decks/hands in a backpack, for example.
+ private EntityUid SpawnInSameParent(EntProtoId prototype, EntityUid uid)
+ {
+ if (_container.IsEntityOrParentInContainer(uid) &&
+ _container.TryGetOuterContainer(uid, Transform(uid), out var container))
+ {
+ return SpawnInContainerOrDrop(prototype, container.Owner, container.ID);
+ }
+ return Spawn(prototype, Transform(uid).Coordinates);
+ }
+
+ // Frontier: hacky misuse of the activation verb, but allows us a separate way to draw cards without needing additional buttons and event fiddling
+ private void OnActivationVerb(EntityUid uid, CardComponent component, GetVerbsEvent args)
+ {
+ if (!args.CanAccess || !args.CanInteract || args.Hands == null)
+ return;
+
+ if (args.Using == args.Target)
+ return;
+
+ if (HasComp(uid))
+ return;
+
+ if (args.Using == null)
+ {
+ args.Verbs.Add(new ActivationVerb()
+ {
+ Act = () => _hands.TryPickupAnyHand(args.User, args.Target),
+ Text = Loc.GetString("cards-verb-draw"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")),
+ Priority = 16
+ });
+ }
+ else if (TryComp(args.Using, out var cardStack))
+ {
+ args.Verbs.Add(new ActivationVerb()
+ {
+ Act = () => _cardStack.InsertCardOnStack(args.User, args.Using.Value, cardStack, args.Target),
+ Text = Loc.GetString("cards-verb-draw"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")),
+ Priority = 16
+ });
+ }
+ else if (TryComp(args.Using, out var card))
+ {
+ args.Verbs.Add(new ActivationVerb()
+ {
+ Act = () => _cardHand.TrySetupHandOfCards(args.User, args.Using.Value, card, args.Target, component, true),
+ Text = Loc.GetString("cards-verb-draw"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")),
+ Priority = 16
+ });
+ }
+ }
+ // End Frontier
+
+ private void OnActivate(EntityUid uid, CardComponent component, ActivateInWorldEvent args)
+ {
+ if (!args.Complex || args.Handled)
+ return;
+
+ if (!TryComp(args.User, out var hands))
+ return;
+
+ // Card stacks are handled differently
+ if (HasComp(args.Target))
+ return;
+
+ var activeItem = _hands.GetActiveItem((args.User, hands));
+
+ if (activeItem == null)
+ {
+ _hands.TryPickupAnyHand(args.User, args.Target);
+ }
+ else if (TryComp(activeItem, out var cardStack))
+ {
+ _cardStack.InsertCardOnStack(args.User, activeItem.Value, cardStack, args.Target);
+ }
+ else if (TryComp(activeItem, out var card))
+ {
+ _cardHand.TrySetupHandOfCards(args.User, activeItem.Value, card, args.Target, component, true);
+ }
+ }
+}
diff --git a/Content.Shared/_CorvaxNext/Cards/Deck/CardDeckComponent.cs b/Content.Shared/_CorvaxNext/Cards/Deck/CardDeckComponent.cs
new file mode 100644
index 00000000000..ece8ec1b2c0
--- /dev/null
+++ b/Content.Shared/_CorvaxNext/Cards/Deck/CardDeckComponent.cs
@@ -0,0 +1,29 @@
+using Robust.Shared.Audio;
+
+namespace Content.Shared._CorvaxNext.Cards.Deck;
+
+///
+/// Represents a deck of cards with configurable properties such as sound effects for interactions,
+/// visual scaling, and a limit on the number of cards it can hold.
+///
+[RegisterComponent]
+public sealed partial class CardDeckComponent : Component
+{
+ [DataField("shuffleSound")]
+ public SoundSpecifier ShuffleSound = new SoundCollectionSpecifier("cardFan");
+
+ [DataField("pickUpSound")]
+ public SoundSpecifier PickUpSound = new SoundCollectionSpecifier("cardSlide");
+
+ [DataField("placeDownSound")]
+ public SoundSpecifier PlaceDownSound = new SoundCollectionSpecifier("cardShove");
+
+ [DataField("yOffset")]
+ public float YOffset = 0.02f;
+
+ [DataField("scale")]
+ public float Scale = 1;
+
+ [DataField("limit")]
+ public int CardLimit = 5;
+}
diff --git a/Content.Shared/_CorvaxNext/Cards/Deck/CardDeckSystem.cs b/Content.Shared/_CorvaxNext/Cards/Deck/CardDeckSystem.cs
new file mode 100644
index 00000000000..44d72e029a1
--- /dev/null
+++ b/Content.Shared/_CorvaxNext/Cards/Deck/CardDeckSystem.cs
@@ -0,0 +1,125 @@
+using Content.Shared._CorvaxNext.Cards.Card;
+using Content.Shared._CorvaxNext.Cards.Stack;
+using Content.Shared.Audio;
+using Content.Shared.Hands.EntitySystems;
+using Content.Shared.Interaction;
+using Content.Shared.Item;
+using Content.Shared.Popups;
+using Content.Shared.Verbs;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Containers;
+using Robust.Shared.Network;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Random;
+using Robust.Shared.Utility;
+
+namespace Content.Shared._CorvaxNext.Cards.Deck;
+
+///
+/// Handles the interactions and management of card decks, including shuffling, splitting, and organizing cards.
+/// Provides contextual actions for users and ensures proper state synchronization across the network.
+///
+public sealed class CardDeckSystem : EntitySystem
+{
+ [Dependency] private readonly SharedHandsSystem _hands = default!;
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly SharedPopupSystem _popup = default!;
+ [Dependency] private readonly CardStackSystem _cardStackSystem = default!;
+ [Dependency] private readonly IRobustRandom _random = default!;
+ [Dependency] private readonly INetManager _net = default!;
+ [Dependency] private readonly SharedContainerSystem _container = default!;
+
+ public readonly EntProtoId CardDeckBaseName = "CardDeckBase";
+
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent>(AddTurnOnVerb);
+ }
+
+ private void AddTurnOnVerb(EntityUid uid, CardDeckComponent component, GetVerbsEvent args)
+ {
+ if (!args.CanAccess || !args.CanInteract || args.Hands == null)
+ return;
+
+ if (!TryComp(uid, out CardStackComponent? comp))
+ return;
+
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => TryShuffle(uid, component, comp),
+ Text = Loc.GetString("cards-verb-shuffle"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/die.svg.192dpi.png")),
+ Priority = 4
+ });
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => TrySplit(args.Target, component, comp, args.User),
+ Text = Loc.GetString("cards-verb-split"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/dot.svg.192dpi.png")),
+ Priority = 3
+ });
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => TryOrganize(uid, component, comp, true),
+ Text = Loc.GetString("cards-verb-organize-down"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/flip.svg.192dpi.png")),
+ Priority = 2
+ });
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => TryOrganize(uid, component, comp, false),
+ Text = Loc.GetString("cards-verb-organize-up"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/flip.svg.192dpi.png")),
+ Priority = 1
+ });
+ }
+
+ private void TrySplit(EntityUid uid, CardDeckComponent deck, CardStackComponent stack, EntityUid user)
+ {
+ if (stack.Cards.Count <= 1)
+ return;
+
+ _audio.PlayPredicted(deck.PickUpSound, Transform(uid).Coordinates, user);
+
+ if (!_net.IsServer)
+ return;
+
+ var cardDeck = SpawnInSameParent(CardDeckBaseName, uid);
+
+ EnsureComp(cardDeck, out var deckStack);
+
+ _cardStackSystem.TransferNLastCardFromStacks(user, stack.Cards.Count / 2, uid, stack, cardDeck, deckStack);
+ _hands.PickupOrDrop(user, cardDeck);
+ }
+
+ private void TryShuffle(EntityUid deck, CardDeckComponent comp, CardStackComponent? stack)
+ {
+ _cardStackSystem.ShuffleCards(deck, stack);
+ if (_net.IsClient)
+ return;
+
+ _audio.PlayPvs(comp.ShuffleSound, deck, AudioHelpers.WithVariation(0.05f, _random));
+ _popup.PopupEntity(Loc.GetString("card-verb-shuffle-success", ("target", MetaData(deck).EntityName)), deck);
+ }
+
+ private void TryOrganize(EntityUid deck, CardDeckComponent comp, CardStackComponent? stack, bool isFlipped)
+ {
+ if (_net.IsClient)
+ return;
+ _cardStackSystem.FlipAllCards(deck, stack, isFlipped: isFlipped);
+
+ _audio.PlayPvs(comp.ShuffleSound, deck, AudioHelpers.WithVariation(0.05f, _random));
+ _popup.PopupEntity(Loc.GetString("card-verb-organize-success", ("target", MetaData(deck).EntityName), ("facedown", isFlipped)), deck);
+ }
+
+ private EntityUid SpawnInSameParent(string prototype, EntityUid uid)
+ {
+ if (_container.IsEntityOrParentInContainer(uid) &&
+ _container.TryGetOuterContainer(uid, Transform(uid), out var container))
+ {
+ return SpawnInContainerOrDrop(prototype, container.Owner, container.ID);
+ }
+ return Spawn(prototype, Transform(uid).Coordinates);
+ }
+}
diff --git a/Content.Shared/_CorvaxNext/Cards/Hand/CardHandComponent.cs b/Content.Shared/_CorvaxNext/Cards/Hand/CardHandComponent.cs
new file mode 100644
index 00000000000..1ea225185c1
--- /dev/null
+++ b/Content.Shared/_CorvaxNext/Cards/Hand/CardHandComponent.cs
@@ -0,0 +1,39 @@
+using Robust.Shared.Serialization;
+
+namespace Content.Shared._CorvaxNext.Cards.Hand;
+
+///
+/// Represents a hand of cards with configurable properties such as the arrangement angle,
+/// offsets, scaling, card limit, and whether the cards are flipped.
+///
+[RegisterComponent]
+public sealed partial class CardHandComponent : Component
+{
+ [DataField("angle")]
+ public float Angle = 120f;
+
+ [DataField("xOffset")]
+ public float XOffset = 0.5f;
+
+ [DataField("scale")]
+ public float Scale = 1;
+
+ [DataField("limit")]
+ public int CardLimit = 10;
+
+ [DataField("flipped")]
+ public bool Flipped = false;
+}
+
+
+[Serializable, NetSerializable]
+public enum CardUiKey : byte
+{
+ Key
+}
+
+[Serializable, NetSerializable]
+public sealed class CardHandDrawMessage(NetEntity card) : BoundUserInterfaceMessage
+{
+ public NetEntity Card = card;
+}
diff --git a/Content.Shared/_CorvaxNext/Cards/Hand/CardHandSystem.cs b/Content.Shared/_CorvaxNext/Cards/Hand/CardHandSystem.cs
new file mode 100644
index 00000000000..2efef30b1e6
--- /dev/null
+++ b/Content.Shared/_CorvaxNext/Cards/Hand/CardHandSystem.cs
@@ -0,0 +1,206 @@
+using System.Linq;
+using Content.Shared._CorvaxNext.Cards.Card;
+using Content.Shared._CorvaxNext.Cards.Stack;
+using Content.Shared.Hands.EntitySystems;
+using Content.Shared.Interaction;
+using Content.Shared.Popups;
+using Content.Shared.Storage.EntitySystems;
+using Content.Shared.Verbs;
+using Robust.Shared.Containers;
+using Robust.Shared.Network;
+using Robust.Shared.Player;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Utility;
+
+namespace Content.Shared._CorvaxNext.Cards.Hand;
+
+///
+/// Manages interactions with hands of cards, including drawing, shuffling, flipping,
+/// converting to decks, and providing contextual actions for users.
+/// Handles state synchronization and animation effects across the network.
+///
+public sealed class CardHandSystem : EntitySystem
+{
+ public readonly EntProtoId CardHandBaseName = "CardHandBase";
+ public readonly EntProtoId CardDeckBaseName = "CardDeckBase";
+
+ [Dependency] private readonly CardStackSystem _cardStack = default!;
+ [Dependency] private readonly SharedHandsSystem _hands = default!;
+ [Dependency] private readonly INetManager _net = default!;
+ [Dependency] private readonly SharedUserInterfaceSystem _ui = default!;
+ [Dependency] private readonly SharedPopupSystem _popupSystem = default!;
+ [Dependency] private readonly SharedContainerSystem _container = default!;
+ [Dependency] private readonly SharedStorageSystem _storage = default!; // Frontier
+
+ ///
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnInteractUsing);
+ SubscribeLocalEvent(OnCardDraw);
+ SubscribeLocalEvent(OnStackQuantityChange);
+ SubscribeLocalEvent>(OnAlternativeVerb);
+ }
+
+ private void OnStackQuantityChange(EntityUid uid, CardHandComponent comp, CardStackQuantityChangeEvent args)
+ {
+ if (_net.IsClient)
+ return;
+
+ if (!TryComp(uid, out CardStackComponent? stack))
+ return;
+
+ var text = args.Type switch
+ {
+ StackQuantityChangeType.Added => "cards-stackquantitychange-added",
+ StackQuantityChangeType.Removed => "cards-stackquantitychange-removed",
+ StackQuantityChangeType.Joined => "cards-stackquantitychange-joined",
+ StackQuantityChangeType.Split => "cards-stackquantitychange-split",
+ _ => "cards-stackquantitychange-unknown"
+ };
+
+ _popupSystem.PopupEntity(Loc.GetString(text, ("quantity", stack.Cards.Count)), uid);
+
+ _cardStack.FlipAllCards(uid, stack, comp.Flipped);
+ }
+
+ private void OnCardDraw(EntityUid uid, CardHandComponent comp, CardHandDrawMessage args)
+ {
+ if (!TryComp(uid, out CardStackComponent? stack))
+ return;
+ var cardEnt = GetEntity(args.Card);
+ if (!_cardStack.TryRemoveCard(uid, cardEnt, stack))
+ return;
+
+ if (_net.IsServer)
+ _storage.PlayPickupAnimation(cardEnt, Transform(cardEnt).Coordinates, Transform(args.Actor).Coordinates, 0);
+
+ _hands.TryPickupAnyHand(args.Actor, cardEnt);
+ }
+
+ private void OpenHandMenu(EntityUid user, EntityUid hand)
+ {
+ if (!TryComp(user, out var actor))
+ return;
+
+ _ui.OpenUi(hand, CardUiKey.Key, actor.PlayerSession);
+
+ }
+
+ private void OnAlternativeVerb(EntityUid uid, CardHandComponent comp, GetVerbsEvent args)
+ {
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => OpenHandMenu(args.User, uid),
+ Text = Loc.GetString("cards-verb-pickcard"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/die.svg.192dpi.png")),
+ Priority = 4
+ });
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => _cardStack.ShuffleCards(uid),
+ Text = Loc.GetString("cards-verb-shuffle"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/die.svg.192dpi.png")),
+ Priority = 3
+ });
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => FlipCards(uid, comp),
+ Text = Loc.GetString("cards-verb-flip"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/flip.svg.192dpi.png")),
+ Priority = 2
+ });
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Act = () => ConvertToDeck(args.User, uid),
+ Text = Loc.GetString("cards-verb-convert-to-deck"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/rotate_cw.svg.192dpi.png")),
+ Priority = 1
+ });
+ }
+
+ private void OnInteractUsing(EntityUid uid, CardComponent comp, InteractUsingEvent args)
+ {
+ if (args.Handled)
+ return;
+
+ if (HasComp(args.Used) ||
+ !TryComp(args.Used, out CardComponent? usedComp))
+ return;
+
+ if (!HasComp(args.Target) &&
+ TryComp(args.Target, out CardComponent? targetCardComp))
+ {
+ TrySetupHandOfCards(args.User, args.Used, usedComp, args.Target, targetCardComp, true);
+ args.Handled = true;
+ }
+ }
+
+ private void ConvertToDeck(EntityUid user, EntityUid hand)
+ {
+ if (_net.IsClient)
+ return;
+
+ var cardDeck = SpawnInSameParent(CardDeckBaseName, hand);
+ bool isHoldingCards = _hands.IsHolding(user, hand);
+
+ EnsureComp(cardDeck, out var deckStack);
+ if (!TryComp(hand, out CardStackComponent? handStack))
+ return;
+ _cardStack.TryJoinStacks(cardDeck, hand, deckStack, handStack, null);
+
+ if (isHoldingCards)
+ _hands.TryPickupAnyHand(user, cardDeck);
+ }
+ public void TrySetupHandOfCards(EntityUid user, EntityUid card, CardComponent comp, EntityUid target, CardComponent targetComp, bool pickup)
+ {
+ if (_net.IsClient)
+ return;
+ var cardHand = SpawnInSameParent(CardHandBaseName, card);
+ if (TryComp(cardHand, out var handComp))
+ handComp.Flipped = targetComp.Flipped;
+ if (!TryComp(cardHand, out CardStackComponent? stack))
+ return;
+ if (!_cardStack.TryInsertCard(cardHand, card, stack) || !_cardStack.TryInsertCard(cardHand, target, stack))
+ return;
+ if (_net.IsServer)
+ _storage.PlayPickupAnimation(card, Transform(card).Coordinates, Transform(cardHand).Coordinates, 0);
+ if (pickup && !_hands.TryPickupAnyHand(user, cardHand))
+ return;
+ _cardStack.FlipAllCards(cardHand, stack, targetComp.Flipped);
+ }
+
+ public void TrySetupHandFromStack(EntityUid user, EntityUid card, CardComponent comp, EntityUid target, CardStackComponent targetComp, bool pickup)
+ {
+ if (_net.IsClient)
+ return;
+ var cardHand = SpawnInSameParent(CardHandBaseName, card);
+ if (TryComp(cardHand, out var handComp))
+ handComp.Flipped = comp.Flipped;
+ if (!TryComp(cardHand, out CardStackComponent? stack))
+ return;
+ if (!_cardStack.TryInsertCard(cardHand, card, stack))
+ return;
+ _cardStack.TransferNLastCardFromStacks(user, 1, target, targetComp, cardHand, stack);
+ if (pickup && !_hands.TryPickupAnyHand(user, cardHand))
+ return;
+ _cardStack.FlipAllCards(cardHand, stack, comp.Flipped);
+ }
+
+ private void FlipCards(EntityUid hand, CardHandComponent comp)
+ {
+ comp.Flipped = !comp.Flipped;
+ _cardStack.FlipAllCards(hand, null, comp.Flipped);
+ }
+
+ // Frontier: tries to spawn an entity with the same parent as another given entity.
+ // Useful when spawning decks/hands in a backpack, for example.
+ private EntityUid SpawnInSameParent(EntProtoId prototype, EntityUid uid)
+ {
+ if (_container.IsEntityOrParentInContainer(uid) &&
+ _container.TryGetOuterContainer(uid, Transform(uid), out var container))
+ {
+ return SpawnInContainerOrDrop(prototype, container.Owner, container.ID);
+ }
+ return Spawn(prototype, Transform(uid).Coordinates);
+ }
+}
diff --git a/Content.Shared/_CorvaxNext/Cards/Stack/CardStackComponent.cs b/Content.Shared/_CorvaxNext/Cards/Stack/CardStackComponent.cs
new file mode 100644
index 00000000000..2762e1f7937
--- /dev/null
+++ b/Content.Shared/_CorvaxNext/Cards/Stack/CardStackComponent.cs
@@ -0,0 +1,83 @@
+using Robust.Shared.Audio;
+using Robust.Shared.Containers;
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization;
+
+namespace Content.Shared._CorvaxNext.Cards.Stack;
+
+///
+/// This is used for holding the prototype ids of the cards in the stack or hand.
+///
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+
+public sealed partial class CardStackComponent : Component
+{
+ [DataField("content")]
+ public List InitialContent = [];
+
+ [DataField("shuffleSound")]
+ public SoundSpecifier ShuffleSound = new SoundCollectionSpecifier("cardFan");
+
+ [DataField("pickUpSound")]
+ public SoundSpecifier PickUpSound = new SoundCollectionSpecifier("cardSlide");
+
+ [DataField("placeDownSound")]
+ public SoundSpecifier PlaceDownSound = new SoundCollectionSpecifier("cardShove");
+
+
+ ///
+ /// The containers that contain the items held in the stack
+ ///
+ [ViewVariables]
+ public Container ItemContainer = default!;
+
+ ///
+ /// The list EntityUIds of Cards
+ ///
+ [DataField, AutoNetworkedField]
+ public List Cards = [];
+}
+
+[Serializable, NetSerializable]
+public sealed class CardStackInitiatedEvent(NetEntity cardStack) : EntityEventArgs
+{
+ public NetEntity CardStack = cardStack;
+}
+
+///
+/// This gets Updated when new cards are added or removed from the stack
+///
+[Serializable, NetSerializable]
+public sealed class CardStackQuantityChangeEvent(NetEntity stack, NetEntity? card, StackQuantityChangeType type) : EntityEventArgs
+{
+ public NetEntity Stack = stack;
+ public NetEntity? Card = card;
+ public StackQuantityChangeType Type = type;
+}
+
+[Serializable, NetSerializable]
+public enum StackQuantityChangeType : sbyte
+{
+ Added,
+ Removed,
+ Joined,
+ Split
+}
+
+
+
+[Serializable, NetSerializable]
+public sealed class CardStackReorderedEvent(NetEntity stack) : EntityEventArgs
+{
+ public NetEntity Stack = stack;
+}
+
+[Serializable, NetSerializable]
+public sealed class CardStackFlippedEvent(NetEntity cardStack) : EntityEventArgs
+{
+ public NetEntity CardStack = cardStack;
+}
+
+
+
diff --git a/Content.Shared/_CorvaxNext/Cards/Stack/CardStackSystem.cs b/Content.Shared/_CorvaxNext/Cards/Stack/CardStackSystem.cs
new file mode 100644
index 00000000000..0f0e5997c04
--- /dev/null
+++ b/Content.Shared/_CorvaxNext/Cards/Stack/CardStackSystem.cs
@@ -0,0 +1,453 @@
+using System.Linq;
+using Content.Shared._CorvaxNext.Cards.Card;
+using Content.Shared._CorvaxNext.Cards.Deck;
+using Content.Shared._CorvaxNext.Cards.Hand;
+using Content.Shared.Examine;
+using Content.Shared.Hands.Components;
+using Content.Shared.Hands.EntitySystems;
+using Content.Shared.Interaction;
+using Content.Shared.Storage.EntitySystems;
+using Content.Shared.Verbs;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Containers;
+using Robust.Shared.Map;
+using Robust.Shared.Network;
+using Robust.Shared.Random;
+using Robust.Shared.Utility;
+
+namespace Content.Shared._CorvaxNext.Cards.Stack;
+
+///
+/// This handles stack of cards.
+/// It is used to shuffle, flip, insert, remove, and join stacks of cards.
+/// It also handles the events related to the stack of cards.
+///
+public sealed class CardStackSystem : EntitySystem
+{
+ public const string ContainerId = "cardstack-container";
+ public const int MaxCardsInStack = 212; // Frontier: four 53-card decks.
+
+ [Dependency] private readonly SharedContainerSystem _container = default!;
+ [Dependency] private readonly EntityManager _entityManager = default!;
+ [Dependency] private readonly INetManager _net = default!;
+ [Dependency] private readonly SharedAudioSystem _audio = default!;
+ [Dependency] private readonly IRobustRandom _random = default!;
+ [Dependency] private readonly SharedStorageSystem _storage = default!;
+ [Dependency] private readonly CardHandSystem _cardHandSystem = default!; // Frontier
+ [Dependency] private readonly SharedHandsSystem _hands = default!;
+
+ ///
+ public override void Initialize()
+ {
+ // Pretty much a rip-off of the BinSystem
+ SubscribeLocalEvent(OnStartup);
+ SubscribeLocalEvent(OnMapInit);
+ SubscribeLocalEvent(OnEntRemoved);
+ SubscribeLocalEvent>(OnAlternativeVerb);
+ SubscribeLocalEvent>(OnActivationVerb);
+ SubscribeLocalEvent(OnActivate);
+ SubscribeLocalEvent(OnExamine);
+ SubscribeLocalEvent(OnInteractUsing);
+ }
+
+ public bool TryRemoveCard(EntityUid uid, EntityUid card, CardStackComponent? comp = null)
+ {
+ if (!Resolve(uid, ref comp))
+ return false;
+
+ if (!TryComp(card, out CardComponent? _))
+ return false;
+
+ _container.Remove(card, comp.ItemContainer);
+ comp.Cards.Remove(card);
+
+ Dirty(uid, comp);
+
+ RaiseLocalEvent(uid, new CardStackQuantityChangeEvent(GetNetEntity(uid), GetNetEntity(card), StackQuantityChangeType.Removed));
+ RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(uid), GetNetEntity(card), StackQuantityChangeType.Removed));
+ // Prevents prediction ruining things
+ if (_net.IsServer && comp.Cards.Count <= 0)
+ {
+ _entityManager.DeleteEntity(uid);
+ }
+ return true;
+ }
+
+ public bool TryInsertCard(EntityUid uid, EntityUid card, CardStackComponent? comp = null)
+ {
+ if (!Resolve(uid, ref comp))
+ return false;
+
+ if (!TryComp(card, out CardComponent? _))
+ return false;
+
+ if (comp.Cards.Count >= MaxCardsInStack)
+ return false;
+
+ _container.Insert(card, comp.ItemContainer);
+ comp.Cards.Add(card);
+
+ Dirty(uid, comp);
+ RaiseLocalEvent(uid, new CardStackQuantityChangeEvent(GetNetEntity(uid), GetNetEntity(card), StackQuantityChangeType.Added));
+ RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(uid), GetNetEntity(card), StackQuantityChangeType.Added));
+ return true;
+ }
+
+ public bool ShuffleCards(EntityUid uid, CardStackComponent? comp = null)
+ {
+ if (!Resolve(uid, ref comp))
+ return false;
+
+ _random.Shuffle(comp.Cards);
+
+ Dirty(uid, comp);
+ RaiseLocalEvent(uid, new CardStackReorderedEvent(GetNetEntity(uid)));
+ RaiseNetworkEvent(new CardStackReorderedEvent(GetNetEntity(uid)));
+ return true;
+ }
+
+ ///
+ /// Server-Side only method to flip all cards within a stack. This starts CardFlipUpdatedEvent and CardStackFlippedEvent event
+ ///
+ ///
+ ///
+ /// If null, all cards will just invert direction, if it contains a value, then all cards will receive that value
+ ///
+ public bool FlipAllCards(EntityUid uid, CardStackComponent? comp = null, bool? isFlipped = null)
+ {
+ if (_net.IsClient)
+ return false;
+ if (!Resolve(uid, ref comp))
+ return false;
+ foreach (var card in comp.Cards)
+ {
+ if (!TryComp(card, out CardComponent? cardComponent))
+ continue;
+
+ cardComponent.Flipped = isFlipped ?? !cardComponent.Flipped;
+
+ Dirty(card, cardComponent);
+ RaiseNetworkEvent(new CardFlipUpdatedEvent(GetNetEntity(card)));
+ }
+
+ RaiseNetworkEvent(new CardStackFlippedEvent(GetNetEntity(uid)));
+ return true;
+ }
+
+ public bool TryJoinStacks(EntityUid firstStack, EntityUid secondStack, CardStackComponent? firstComp = null, CardStackComponent? secondComp = null, EntityUid? soundUser = null)
+ {
+ if (firstStack == secondStack)
+ return false;
+ if (!Resolve(firstStack, ref firstComp) || !Resolve(secondStack, ref secondComp))
+ return false;
+
+ bool changed = false;
+ var cardList = secondComp.Cards.ToList();
+ EntityUid? firstCard = secondComp.Cards.Count > 0 ? cardList[0] : null; // Cache the first card transferred for animations (better to have something moving than nothing, and we destroy the other stack)
+
+ foreach (var card in cardList)
+ {
+ if (firstComp.Cards.Count >= MaxCardsInStack)
+ break;
+ _container.Remove(card, secondComp.ItemContainer);
+ secondComp.Cards.Remove(card);
+ firstComp.Cards.Add(card);
+ _container.Insert(card, firstComp.ItemContainer);
+ changed = true;
+ }
+ if (changed)
+ {
+ if (_net.IsClient)
+ return changed;
+
+ if (soundUser != null)
+ {
+ _audio.PlayPredicted(firstComp.PlaceDownSound, Transform(firstStack).Coordinates, soundUser.Value);
+
+ _storage.PlayPickupAnimation(firstCard!.Value, Transform(secondStack).Coordinates, Transform(firstStack).Coordinates, 0);
+ }
+
+ Dirty(firstStack, firstComp);
+ if (secondComp.Cards.Count <= 0)
+ {
+ _entityManager.DeleteEntity(secondStack);
+ }
+ else
+ {
+ Dirty(secondStack, secondComp);
+ RaiseLocalEvent(secondStack, new CardStackQuantityChangeEvent(GetNetEntity(secondStack), null, StackQuantityChangeType.Split));
+ RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(secondStack), null, StackQuantityChangeType.Split));
+ }
+ RaiseLocalEvent(firstStack, new CardStackQuantityChangeEvent(GetNetEntity(firstStack), null, StackQuantityChangeType.Joined));
+ RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(firstStack), null, StackQuantityChangeType.Joined));
+ }
+
+ return changed;
+ }
+
+ #region EventHandling
+
+ private void OnStartup(EntityUid uid, CardStackComponent component, ComponentStartup args)
+ {
+ component.ItemContainer = _container.EnsureContainer(uid, ContainerId);
+ }
+
+ private void OnMapInit(EntityUid uid, CardStackComponent comp, MapInitEvent args)
+ {
+ if (_net.IsClient)
+ return;
+
+ var coordinates = Transform(uid).Coordinates;
+ foreach (var id in comp.InitialContent)
+ {
+ var ent = Spawn(id, coordinates);
+ if (TryInsertCard(uid, ent, comp))
+ continue;
+ Log.Error($"Entity {ToPrettyString(ent)} was unable to be initialized into stack {ToPrettyString(uid)}");
+ return;
+ }
+ RaiseNetworkEvent(new CardStackInitiatedEvent(GetNetEntity(uid)));
+ }
+
+ // It seems the cards don't get removed if this event is not subscribed... strange right? thanks again bin system
+ private void OnEntRemoved(EntityUid uid, CardStackComponent component, EntRemovedFromContainerMessage args)
+ {
+ component.Cards.Remove(args.Entity);
+ }
+
+ private void OnExamine(EntityUid uid, CardStackComponent component, ExaminedEvent args)
+ {
+ args.PushText(Loc.GetString("card-stack-examine", ("count", component.Cards.Count)));
+ }
+
+ private void OnAlternativeVerb(EntityUid uid, CardStackComponent component, GetVerbsEvent args)
+ {
+ if (args.Using == args.Target)
+ return;
+ if (!TryComp(args.Target, out CardStackComponent? targetStack))
+ return;
+
+ if (TryComp(args.Using, out CardStackComponent? usingStack))
+ {
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Text = Loc.GetString("card-verb-join"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")),
+ Priority = 8,
+ Act = () => JoinStacks(args.User, args.Target, targetStack, (EntityUid)args.Using, usingStack)
+ });
+ }
+ else if (TryComp(args.Using, out CardComponent? usingCard)) // Frontier: single card interaction
+ {
+ args.Verbs.Add(new AlternativeVerb()
+ {
+ Text = Loc.GetString("card-verb-join"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/refresh.svg.192dpi.png")),
+ Priority = 8,
+ Act = () => InsertCardOnStack(args.User, args.Target, targetStack, (EntityUid)args.Using)
+ });
+ } // End Frontier: single card interaction
+ }
+
+ // Frontier: hacky misuse of the activation verb, but allows us a separate way to draw cards without needing additional buttons and event fiddling
+ private void OnActivationVerb(EntityUid uid, CardStackComponent component, GetVerbsEvent args)
+ {
+ if (!args.CanAccess || !args.CanInteract || args.Hands == null)
+ return;
+
+ if (args.Using == args.Target)
+ return;
+
+ if (args.Using == null)
+ {
+ args.Verbs.Add(new ActivationVerb()
+ {
+ Act = () => OnInteractHand(args.Target, component, args.User),
+ Text = Loc.GetString("cards-verb-draw"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")),
+ Priority = 16
+ });
+ }
+ else if (TryComp(args.Using, out var cardStack))
+ {
+ args.Verbs.Add(new ActivationVerb()
+ {
+ Act = () => TransferNLastCardFromStacks(args.User, 1, args.Target, component, args.Using.Value, cardStack),
+ Text = Loc.GetString("cards-verb-draw"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")),
+ Priority = 16
+ });
+ }
+ else if (TryComp(args.Using, out var card))
+ {
+ args.Verbs.Add(new ActivationVerb()
+ {
+ Act = () => _cardHandSystem.TrySetupHandFromStack(args.User, args.Using.Value, card, args.Target, component, true),
+ Text = Loc.GetString("cards-verb-draw"),
+ Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/eject.svg.192dpi.png")),
+ Priority = 16
+ });
+ }
+ }
+ // End Frontier
+
+ private void JoinStacks(EntityUid user, EntityUid first, CardStackComponent firstComp, EntityUid second, CardStackComponent secondComp)
+ {
+ if (_net.IsServer)
+ {
+ TryJoinStacks(first, second, firstComp, secondComp, user);
+ }
+ else
+ {
+ if (firstComp.Cards.Count < MaxCardsInStack)
+ _audio.PlayPredicted(firstComp.PlaceDownSound, Transform(first).Coordinates, user);
+ }
+ }
+
+ public void InsertCardOnStack(EntityUid user, EntityUid stack, CardStackComponent stackComponent, EntityUid card)
+ {
+ if (!TryInsertCard(stack, card))
+ return;
+
+ _audio.PlayPredicted(stackComponent.PlaceDownSound, Transform(stack).Coordinates, user);
+ if (_net.IsClient)
+ return;
+ _storage.PlayPickupAnimation(card, Transform(user).Coordinates, Transform(stack).Coordinates, 0);
+ }
+
+ ///
+ /// This takes the last card from the first stack and inserts it into the second stack
+ ///
+ public void TransferNLastCardFromStacks(EntityUid user, int n, EntityUid first, CardStackComponent firstComp, EntityUid second, CardStackComponent secondComp)
+ {
+ if (firstComp.Cards.Count <= 0)
+ return;
+
+ var cards = firstComp.Cards.TakeLast(n).ToList(); // Frontier: make a copy we don't munge during iteration
+
+ var firstCard = cards.First(); // Cache first card for animation - enumerable changes in foreach
+
+ bool changed = false;
+ foreach (var card in cards)
+ {
+ if (secondComp.Cards.Count >= MaxCardsInStack)
+ break;
+ _container.Remove(card, firstComp.ItemContainer);
+ firstComp.Cards.Remove(card);
+ secondComp.Cards.Add(card);
+ _container.Insert(card, secondComp.ItemContainer);
+ changed = true;
+ }
+
+ if (changed)
+ {
+ _audio.PlayPredicted(firstComp.PlaceDownSound, Transform(second).Coordinates, user);
+ if (_net.IsClient)
+ return;
+
+ _storage.PlayPickupAnimation(firstCard, Transform(first).Coordinates, Transform(second).Coordinates, 0);
+
+ Dirty(second, secondComp);
+ if (firstComp.Cards.Count <= 0)
+ {
+ _entityManager.DeleteEntity(first);
+ }
+ else
+ {
+ Dirty(first, firstComp);
+ RaiseLocalEvent(first, new CardStackQuantityChangeEvent(GetNetEntity(first), null, StackQuantityChangeType.Removed));
+ RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(first), null, StackQuantityChangeType.Removed));
+ }
+ RaiseLocalEvent(second, new CardStackQuantityChangeEvent(GetNetEntity(second), null, StackQuantityChangeType.Added));
+ RaiseNetworkEvent(new CardStackQuantityChangeEvent(GetNetEntity(second), null, StackQuantityChangeType.Added));
+ }
+ }
+
+ private void OnInteractUsing(InteractUsingEvent args)
+ {
+ if (args.Handled)
+ return;
+
+ if (args.Target == args.Used)
+ return;
+
+ // This checks if the user is using an item with Stack component
+ if (TryComp(args.Used, out CardStackComponent? usedStack))
+ {
+ // If the target is a card, then it will insert the card into the stack
+ if (TryComp(args.Target, out CardComponent? _))
+ {
+ InsertCardOnStack(args.User, args.Used, usedStack, args.Target);
+ args.Handled = true;
+ return;
+ }
+
+ // If instead, the target is a stack, then it will join the two stacks
+ if (!TryComp(args.Target, out CardStackComponent? targetStack))
+ return;
+
+ TransferNLastCardFromStacks(args.User, 1, args.Target, targetStack, args.Used, usedStack);
+ args.Handled = true;
+ }
+
+ // This handles the reverse case, where the user is using a card and inserting it to a stack
+ else if (TryComp(args.Target, out CardStackComponent? stack))
+ {
+ //InsertCardOnStack(args.User, args.Target, stack, args.Used); // Frontier: old version
+ if (TryComp(args.Used, out CardComponent? card))
+ {
+ _cardHandSystem.TrySetupHandFromStack(args.User, args.Used, card, args.Target, stack, true);
+ args.Handled = true;
+ }
+ }
+ }
+
+ private void OnInteractHand(EntityUid uid, CardStackComponent component, EntityUid user)
+ {
+ if (component.Cards.Count <= 0)
+ return;
+
+ if (!component.Cards.TryGetValue(component.Cards.Count - 1, out var card))
+ return;
+
+ if (!TryRemoveCard(uid, card, component))
+ return;
+
+ _hands.TryPickupAnyHand(user, card);
+
+ if (TryComp(uid, out var deck))
+ _audio.PlayPredicted(deck.PickUpSound, Transform(card).Coordinates, user);
+ else
+ _audio.PlayPredicted(component.PickUpSound, Transform(card).Coordinates, user);
+ }
+
+ private void OnActivate(EntityUid uid, CardStackComponent component, ActivateInWorldEvent args)
+ {
+ if (!args.Complex || args.Handled)
+ return;
+
+ if (!TryComp(args.User, out var hands))
+ return;
+
+ var activeItem = _hands.GetActiveItem((args.User, hands));
+
+ if (activeItem == null)
+ {
+ OnInteractHand(args.Target, component, args.User);
+ }
+ else if (activeItem == args.Target)
+ {
+ return;
+ }
+ else if (TryComp(activeItem, out var cardStack))
+ {
+ TransferNLastCardFromStacks(args.User, 1, args.Target, component, activeItem.Value, cardStack);
+ }
+ else if (TryComp(activeItem, out var card))
+ {
+ _cardHandSystem.TrySetupHandFromStack(args.User, activeItem.Value, card, args.Target, component, true);
+ }
+ }
+
+ #endregion
+}
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/attributions.yml b/Resources/Audio/_CorvaxNext/Effects/Cards/attributions.yml
new file mode 100644
index 00000000000..879bb3bc044
--- /dev/null
+++ b/Resources/Audio/_CorvaxNext/Effects/Cards/attributions.yml
@@ -0,0 +1,6 @@
+- files: [ "cardFan1.ogg", "cardFan2.ogg", "cardOpenPackage1.ogg", "cardOpenPackage2.ogg", "cardPlace1.ogg", "cardPlace2.ogg", "cardPlace3.ogg", "cardPlace4.ogg", "cardShove1.ogg", "cardShove2.ogg", "cardShove3.ogg", "cardShove4.ogg", "cardShuffle.ogg", "cardSlide1.ogg", "cardSlide2.ogg", "cardSlide3.ogg", "cardSlide4.ogg", "cardSlide5.ogg", "cardSlide6.ogg", "cardSlide7.ogg", "cardSlide8.ogg", "cardTakeOutPackage1.ogg", "cardTakeOutPackage2.ogg"]
+ license: "CC0-1.0"
+ copyright: "Kenney.nl"
+ source: "https://opengameart.org/content/54-casino-sound-effects-cards-dice-chips"
+
+
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardFan1.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardFan1.ogg
new file mode 100644
index 00000000000..6d059e204b8
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardFan1.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardFan2.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardFan2.ogg
new file mode 100644
index 00000000000..b744067444a
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardFan2.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardOpenPackage1.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardOpenPackage1.ogg
new file mode 100644
index 00000000000..9d04ade0be6
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardOpenPackage1.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardOpenPackage2.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardOpenPackage2.ogg
new file mode 100644
index 00000000000..32afa72eb7b
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardOpenPackage2.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace1.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace1.ogg
new file mode 100644
index 00000000000..61d8b7170f7
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace1.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace2.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace2.ogg
new file mode 100644
index 00000000000..827baa8dfd6
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace2.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace3.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace3.ogg
new file mode 100644
index 00000000000..7f1b11ce4c9
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace3.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace4.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace4.ogg
new file mode 100644
index 00000000000..088455b47db
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardPlace4.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardShove1.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardShove1.ogg
new file mode 100644
index 00000000000..89fb73a9a55
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardShove1.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardShove2.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardShove2.ogg
new file mode 100644
index 00000000000..5b625d30124
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardShove2.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardShove3.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardShove3.ogg
new file mode 100644
index 00000000000..282d1a870ea
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardShove3.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardShove4.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardShove4.ogg
new file mode 100644
index 00000000000..cc10d9248d5
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardShove4.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardShuffle.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardShuffle.ogg
new file mode 100644
index 00000000000..6b2724fe5ea
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardShuffle.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide1.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide1.ogg
new file mode 100644
index 00000000000..9545e244850
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide1.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide2.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide2.ogg
new file mode 100644
index 00000000000..d41969c20b8
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide2.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide3.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide3.ogg
new file mode 100644
index 00000000000..4e229522176
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide3.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide4.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide4.ogg
new file mode 100644
index 00000000000..47dd7e9032f
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide4.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide5.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide5.ogg
new file mode 100644
index 00000000000..281d89da0af
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide5.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide6.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide6.ogg
new file mode 100644
index 00000000000..b11d1b90927
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide6.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide7.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide7.ogg
new file mode 100644
index 00000000000..700e64b893b
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide7.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide8.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide8.ogg
new file mode 100644
index 00000000000..8aff3ea887b
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardSlide8.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardTakeOutPackage1.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardTakeOutPackage1.ogg
new file mode 100644
index 00000000000..cc90ece1584
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardTakeOutPackage1.ogg differ
diff --git a/Resources/Audio/_CorvaxNext/Effects/Cards/cardTakeOutPackage2.ogg b/Resources/Audio/_CorvaxNext/Effects/Cards/cardTakeOutPackage2.ogg
new file mode 100644
index 00000000000..95755e66144
Binary files /dev/null and b/Resources/Audio/_CorvaxNext/Effects/Cards/cardTakeOutPackage2.ogg differ
diff --git a/Resources/Locale/ru-RU/_corvaxnext/cards/cards.ftl b/Resources/Locale/ru-RU/_corvaxnext/cards/cards.ftl
new file mode 100644
index 00000000000..5dfbf082345
--- /dev/null
+++ b/Resources/Locale/ru-RU/_corvaxnext/cards/cards.ftl
@@ -0,0 +1,85 @@
+card-examined = Это {$target}.
+cards-verb-shuffle = Перемешать
+card-verb-shuffle-success = Карты перемешаны
+cards-verb-draw = Вытянуть карту
+cards-verb-flip = Перевернуть карты
+card-verb-join = Положить в колоду
+card-verb-organize-success = Карты перевёрнуты лицом { $facedown ->
+ [true] вниз
+ *[false] вверх
+}
+cards-verb-organize-up = Перевернуть карты лицом вверх
+cards-verb-organize-down = Перевернуть карты лицом вниз
+cards-verb-pickcard = Выбрать карту
+card-stack-examine = { $count ->
+ [one] В этой стопке {$count} карт.
+ *[other] Здесь {$count} карт в стопке.
+}
+cards-stackquantitychange-added = Вы взяли карту (Всего карт: {$quantity})
+cards-stackquantitychange-removed = Кто-то взял карту (Всего карт: {$quantity})
+cards-stackquantitychange-joined = Вы объединили карты (Всего карт: {$quantity})
+cards-stackquantitychange-split = Стопка разделена (Всего карт: {$quantity})
+cards-stackquantitychange-unknown = Изменено количество стеков (Всего карт: {$quantity})
+cards-verb-convert-to-deck = Сделать стопкой
+cards-verb-split = Разделить пополам
+
+card-base-name = карта
+card-deck-name = колода карт
+
+card-sc-2-clubs-black = 2 крести
+card-sc-3-clubs-black = 3 крести
+card-sc-4-clubs-black = 4 крести
+card-sc-5-clubs-black = 5 крести
+card-sc-6-clubs-black = 6 крести
+card-sc-7-clubs-black = 7 крести
+card-sc-8-clubs-black = 8 крести
+card-sc-9-clubs-black = 9 крести
+card-sc-10-clubs-black = 10 крести
+card-sc-ace-clubs-black = Туз крести
+card-sc-jack-clubs-black = Валет крести
+card-sc-king-clubs-black = Король крести
+card-sc-queen-clubs-black = Королева крести
+
+card-sc-2-diamonds-black = 2 бубны
+card-sc-3-diamonds-black = 3 бубны
+card-sc-4-diamonds-black = 4 бубны
+card-sc-5-diamonds-black = 5 бубны
+card-sc-6-diamonds-black = 6 бубны
+card-sc-7-diamonds-black = 7 бубны
+card-sc-8-diamonds-black = 8 бубны
+card-sc-9-diamonds-black = 9 бубны
+card-sc-10-diamonds-black = 10 бубны
+card-sc-ace-diamonds-black = Туз бубны
+card-sc-jack-diamonds-black = Валет бубны
+card-sc-king-diamonds-black = Король бубны
+card-sc-queen-diamonds-black = Королева бубны
+
+card-sc-2-hearts-black = 2 черви
+card-sc-3-hearts-black = 3 черви
+card-sc-4-hearts-black = 4 черви
+card-sc-5-hearts-black = 5 черви
+card-sc-6-hearts-black = 6 черви
+card-sc-7-hearts-black = 7 черви
+card-sc-8-hearts-black = 8 черви
+card-sc-9-hearts-black = 9 черви
+card-sc-10-hearts-black = 10 черви
+card-sc-ace-hearts-black = Туз черви
+card-sc-jack-hearts-black = Валет черви
+card-sc-king-hearts-black = Король черви
+card-sc-queen-hearts-black = Королева черви
+
+card-sc-2-spades-black = 2 пики
+card-sc-3-spades-black = 3 пики
+card-sc-4-spades-black = 4 пики
+card-sc-5-spades-black = 5 пики
+card-sc-6-spades-black = 6 пики
+card-sc-7-spades-black = 7 пики
+card-sc-8-spades-black = 8 пики
+card-sc-9-spades-black = 9 пики
+card-sc-10-spades-black = 10 пики
+card-sc-ace-spades-black = Туз пики
+card-sc-jack-spades-black = Валет пики
+card-sc-king-spades-black = Король пики
+card-sc-queen-spades-black = Королева пики
+
+card-sc-joker-black = Джокер
\ No newline at end of file
diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/misc/cards.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/misc/cards.ftl
new file mode 100644
index 00000000000..34b9a3969f3
--- /dev/null
+++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/_corvaxnext/entities/objects/misc/cards.ftl
@@ -0,0 +1,6 @@
+ent-CardBoxBlack = чёрная упаковка с колодой
+ .desc = Картонная коробка для хранения карт.
+ent-CardDeckBlack = колода карт
+ent-CardBase = карта
+ent-CardHandBase = карты на руке
+ent-CardStackBase = карты
\ No newline at end of file
diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml
index 9f8a65dc11b..98704f017b1 100644
--- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml
+++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/games.yml
@@ -17,3 +17,4 @@
PaperCNCSheet: 6
MysteryFigureBox: 2
BooksBag: 3
+ CardBoxBlack: 5 # Corvax Next Cards
diff --git a/Resources/Prototypes/_CorvaxNext/Entities/Objects/Misc/cards.yml b/Resources/Prototypes/_CorvaxNext/Entities/Objects/Misc/cards.yml
new file mode 100644
index 00000000000..ea5e20dbf15
--- /dev/null
+++ b/Resources/Prototypes/_CorvaxNext/Entities/Objects/Misc/cards.yml
@@ -0,0 +1,775 @@
+- type: entity
+ parent: [ BoxCardboard, BaseBagOpenClose ]
+ id: CardBoxBase
+ name: deck box
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: Item
+ size: Small
+ shape:
+ - 0,0,1,1
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: box
+ layers:
+ - state: black_box
+ - state: black_box_open
+ map: [ "openLayer" ]
+ visible: false
+ - type: Storage
+ maxItemSize: Normal
+ grid:
+ - 0,0,1,1
+ whitelist:
+ components:
+ - CardDeck
+ - type: OpenTriggeredStorageFill
+ contents:
+ - id: CardDeckBase
+ amount: 1
+ - type: Appearance
+
+- type: entity
+ parent: BaseItem
+ id: CardStackBase
+ name: stack of cards
+ abstract: true
+ components:
+ - type: Item
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ size: Small
+ - type: CardStack
+ - type: ContainerContainer
+ containers:
+ cardstack-container: !type:Container
+
+- type: entity
+ parent: CardStackBase
+ id: CardHandBase
+ categories: [ HideSpawnMenu ]
+ name: hand of cards
+ components:
+ - type: CardHand
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: singlecard_down_black
+ - type: UserInterface
+ interfaces:
+ enum.CardUiKey.Key:
+ type: CardHandMenuBoundUserInterface
+ - type: ActivatableUI
+ key: enum.CardUiKey.Key
+
+- type: entity
+ parent: CardStackBase
+ id: CardDeckBase
+ categories: [ HideSpawnMenu ]
+ name: deck of cards
+ components:
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: deck_black_full
+ - type: Item
+ size: Normal
+ - type: CardDeck
+
+
+- type: entity
+ parent: CardBoxBase
+ id: CardBoxBlack
+ name: black deck box
+ components:
+ - type: Item
+ size: Small
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: box
+ layers:
+ - state: black_box
+ - state: black_box_open
+ map: [ "openLayer" ]
+ visible: false
+ - type: OpenTriggeredStorageFill
+ contents:
+ - id: CardDeckBlack
+ amount: 1
+
+- type: entity
+ parent: CardDeckBase
+ id: CardDeckBlack
+ name: deck of cards
+ components:
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: deck_black_full
+ - type: CardStack
+ content:
+ # Clubs
+ - CardScAceOfClubsBlack
+ - CardSc2OfClubsBlack
+ - CardSc3OfClubsBlack
+ - CardSc4OfClubsBlack
+ - CardSc5OfClubsBlack
+ - CardSc6OfClubsBlack
+ - CardSc7OfClubsBlack
+ - CardSc8OfClubsBlack
+ - CardSc9OfClubsBlack
+ - CardSc10OfClubsBlack
+ - CardScJackOfClubsBlack
+ - CardScQueenOfClubsBlack
+ - CardScKingOfClubsBlack
+ # Diamonds
+ - CardScAceOfDiamondsBlack
+ - CardSc2OfDiamondsBlack
+ - CardSc3OfDiamondsBlack
+ - CardSc4OfDiamondsBlack
+ - CardSc5OfDiamondsBlack
+ - CardSc6OfDiamondsBlack
+ - CardSc7OfDiamondsBlack
+ - CardSc8OfDiamondsBlack
+ - CardSc9OfDiamondsBlack
+ - CardSc10OfDiamondsBlack
+ - CardScJackOfDiamondsBlack
+ - CardScQueenOfDiamondsBlack
+ - CardScKingOfDiamondsBlack
+ # Hearts
+ - CardScAceOfHeartsBlack
+ - CardSc2OfHeartsBlack
+ - CardSc3OfHeartsBlack
+ - CardSc4OfHeartsBlack
+ - CardSc5OfHeartsBlack
+ - CardSc6OfHeartsBlack
+ - CardSc7OfHeartsBlack
+ - CardSc8OfHeartsBlack
+ - CardSc9OfHeartsBlack
+ - CardSc10OfHeartsBlack
+ - CardScJackOfHeartsBlack
+ - CardScQueenOfHeartsBlack
+ - CardScKingOfHeartsBlack
+ # Spades
+ - CardScAceOfSpadesBlack
+ - CardSc2OfSpadesBlack
+ - CardSc3OfSpadesBlack
+ - CardSc4OfSpadesBlack
+ - CardSc5OfSpadesBlack
+ - CardSc6OfSpadesBlack
+ - CardSc7OfSpadesBlack
+ - CardSc8OfSpadesBlack
+ - CardSc9OfSpadesBlack
+ - CardSc10OfSpadesBlack
+ - CardScKingOfSpadesBlack
+ - CardScQueenOfSpadesBlack
+ - CardScJackOfSpadesBlack
+ # Joker
+ - CardScJokerBlack
+
+- type: entity
+ parent: BaseItem
+ id: CardBase
+ name: card
+ categories: [ HideSpawnMenu ]
+ components:
+ - type: EmitSoundOnLand
+ sound:
+ collection: cardShove
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: singlecard_down_black
+ - type: Rotatable
+ - type: Item
+ size: Small
+ - type: UseDelay
+ delay: 0.5
+ - type: Card
+ backSpriteLayers:
+ - sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: singlecard_down_black
+ flipped: true
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-2-clubs-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_2_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-3-clubs-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_3_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-4-clubs-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_4_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-5-clubs-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_5_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-6-clubs-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_6_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-7-clubs-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_7_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-8-clubs-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_8_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-9-clubs-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_9_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-10-clubs-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_10_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-ace-clubs-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Clubs_black
+
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-jack-clubs-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-king-clubs-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_King_of_Clubs_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfClubsBlack
+ components:
+ - type: Card
+ name: card-sc-queen-clubs-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Clubs_black
+
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-jack-diamonds-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-queen-diamonds-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-king-diamonds-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_King_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-ace-diamonds-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-2-diamonds-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_2_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-3-diamonds-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_3_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-4-diamonds-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_4_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-5-diamonds-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_5_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-6-diamonds-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_6_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-7-diamonds-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_7_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-8-diamonds-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_8_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-9-diamonds-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_9_of_Diamonds_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfDiamondsBlack
+ components:
+ - type: Card
+ name: card-sc-10-diamonds-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_10_of_Diamonds_black
+
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-2-hearts-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_2_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-3-hearts-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_3_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-4-hearts-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_4_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-5-hearts-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_5_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-6-hearts-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_6_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-7-hearts-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_7_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-8-hearts-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_8_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-9-hearts-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_9_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-10-hearts-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_10_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-king-hearts-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_King_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-queen-hearts-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-jack-hearts-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Hearts_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfHeartsBlack
+ components:
+ - type: Card
+ name: card-sc-ace-hearts-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Hearts_black
+
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc2OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-2-spades-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_2_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc3OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-3-spades-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_3_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc4OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-4-spades-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_4_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc5OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-5-spades-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_5_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc6OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-6-spades-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_6_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc7OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-7-spades-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_7_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc8OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-8-spades-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_8_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc9OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-9-spades-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_9_of_Spades_black
+
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardSc10OfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-10-spades-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_10_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScKingOfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-king-spades-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_King_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScQueenOfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-queen-spades-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_Queen_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScJackOfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-jack-spades-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_Jack_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScAceOfSpadesBlack
+ components:
+ - type: Card
+ name: card-sc-ace-spades-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: sc_Ace_of_Spades_black
+
+- type: entity
+ parent: CardBase
+ categories: [ HideSpawnMenu ]
+ id: CardScJokerBlack
+ components:
+ - type: Card
+ name: card-sc-joker-black
+ - type: Sprite
+ sprite: _CorvaxNext/Objects/Misc/cards.rsi
+ state: black_joker
diff --git a/Resources/Prototypes/_CorvaxNext/SoundCollections/cards.yml b/Resources/Prototypes/_CorvaxNext/SoundCollections/cards.yml
new file mode 100644
index 00000000000..44b6d8812bc
--- /dev/null
+++ b/Resources/Prototypes/_CorvaxNext/SoundCollections/cards.yml
@@ -0,0 +1,50 @@
+- type: soundCollection
+ id: cardFan
+ files:
+ - /Audio/_CorvaxNext/Effects/Cards//cardFan1.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardFan2.ogg
+
+- type: soundCollection
+ id: cardOpenPackage
+ files:
+ - /Audio/_CorvaxNext/Effects/Cards/cardOpenPackage1.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardOpenPackage2.ogg
+
+- type: soundCollection
+ id: cardPlace
+ files:
+ - /Audio/_CorvaxNext/Effects/Cards/cardPlace1.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardPlace2.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardPlace3.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardPlace4.ogg
+
+- type: soundCollection
+ id: cardShove
+ files:
+ - /Audio/_CorvaxNext/Effects/Cards/cardShove1.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardShove2.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardShove3.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardShove4.ogg
+
+- type: soundCollection
+ id: cardShuffle
+ files:
+ - /Audio/_CorvaxNext/Effects/Cards/cardShuffle.ogg
+
+- type: soundCollection
+ id: cardSlide
+ files:
+ - /Audio/_CorvaxNext/Effects/Cards/cardSlide1.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardSlide2.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardSlide3.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardSlide4.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardSlide5.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardSlide6.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardSlide7.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardSlide8.ogg
+
+- type: soundCollection
+ id: cardTakeOutPackage
+ files:
+ - /Audio/_CorvaxNext/Effects/Cards/cardTakeOutPackage1.ogg
+ - /Audio/_CorvaxNext/Effects/Cards/cardTakeOutPackage2.ogg
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_box.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_box.png
new file mode 100644
index 00000000000..5145216bf3d
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_box.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_box_open.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_box_open.png
new file mode 100644
index 00000000000..8b3c3fbe05c
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_box_open.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand1.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand1.png
new file mode 100644
index 00000000000..8797bc9b52b
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand1.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand2.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand2.png
new file mode 100644
index 00000000000..7d217388d0a
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand2.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand3.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand3.png
new file mode 100644
index 00000000000..646ec3241b5
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand3.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand4.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand4.png
new file mode 100644
index 00000000000..a10b441e1c6
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand4.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand5.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand5.png
new file mode 100644
index 00000000000..b348eef2cac
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_hand5.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_joker.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_joker.png
new file mode 100644
index 00000000000..dcb21b4f8c0
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/black_joker.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_empty.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_empty.png
new file mode 100644
index 00000000000..666e33a6eff
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_empty.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_full.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_full.png
new file mode 100644
index 00000000000..e475aea4f25
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_full.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_half.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_half.png
new file mode 100644
index 00000000000..6121837e311
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_half.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_low.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_low.png
new file mode 100644
index 00000000000..812fa134de5
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_black_low.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_empty.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_empty.png
new file mode 100644
index 00000000000..3eab35d483a
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_empty.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_full.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_full.png
new file mode 100644
index 00000000000..b68e72fad5b
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_full.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_half.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_half.png
new file mode 100644
index 00000000000..aaf8d07645a
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_half.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_low.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_low.png
new file mode 100644
index 00000000000..22f8db3c706
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_nanotrasen_low.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_empty.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_empty.png
new file mode 100644
index 00000000000..df0f80a270c
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_empty.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_full.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_full.png
new file mode 100644
index 00000000000..fd54e580a4f
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_full.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_half.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_half.png
new file mode 100644
index 00000000000..45e53d99e05
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_half.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_low.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_low.png
new file mode 100644
index 00000000000..364885508c5
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/deck_syndicate_low.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/meta.json b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/meta.json
new file mode 100644
index 00000000000..b5035a33bf2
--- /dev/null
+++ b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/meta.json
@@ -0,0 +1,614 @@
+{
+ "version": 1,
+ "copyright": "Cards, Decks and Hands Sprites were originally from Paradise Station (https://github.com/ParadiseSS13/Paradise) and modified by VictorJob. Boxes are from VictorJob.",
+ "license": "CC-BY-SA-3.0",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "black_hand1"
+ },
+ {
+ "name": "black_hand2"
+ },
+ {
+ "name": "black_hand3"
+ },
+ {
+ "name": "black_hand4"
+ },
+ {
+ "name": "black_hand5"
+ },
+ {
+ "name": "deck_black_empty"
+ },
+ {
+ "name": "deck_black_full"
+ },
+ {
+ "name": "deck_black_half"
+ },
+ {
+ "name": "deck_black_low"
+ },
+ {
+ "name": "deck_nanotrasen_empty"
+ },
+ {
+ "name": "deck_nanotrasen_full"
+ },
+ {
+ "name": "deck_nanotrasen_half"
+ },
+ {
+ "name": "deck_nanotrasen_low"
+ },
+ {
+ "name": "deck_syndicate_empty"
+ },
+ {
+ "name": "deck_syndicate_full"
+ },
+ {
+ "name": "deck_syndicate_half"
+ },
+ {
+ "name": "deck_syndicate_low"
+ },
+ {
+ "name": "nanotrasen_hand1"
+ },
+ {
+ "name": "nanotrasen_hand2"
+ },
+ {
+ "name": "nanotrasen_hand3"
+ },
+ {
+ "name": "nanotrasen_hand4"
+ },
+ {
+ "name": "nanotrasen_hand5"
+ },
+ {
+ "name": "sc_10_of_Clubs_black"
+ },
+ {
+ "name": "sc_10_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_10_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_10_of_Diamonds_black"
+ },
+ {
+ "name": "sc_10_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_10_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_10_of_Hearts_black"
+ },
+ {
+ "name": "sc_10_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_10_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_10_of_Spades_black"
+ },
+ {
+ "name": "sc_10_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_10_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_2_of_Clubs_black"
+ },
+ {
+ "name": "sc_2_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_2_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_2_of_Diamonds_black"
+ },
+ {
+ "name": "sc_2_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_2_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_2_of_Hearts_black"
+ },
+ {
+ "name": "sc_2_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_2_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_2_of_Spades_black"
+ },
+ {
+ "name": "sc_2_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_2_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_3_of_Clubs_black"
+ },
+ {
+ "name": "sc_3_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_3_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_3_of_Diamonds_black"
+ },
+ {
+ "name": "sc_3_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_3_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_3_of_Hearts_black"
+ },
+ {
+ "name": "sc_3_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_3_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_3_of_Spades_black"
+ },
+ {
+ "name": "sc_3_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_3_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_4_of_Clubs_black"
+ },
+ {
+ "name": "sc_4_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_4_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_4_of_Diamonds_black"
+ },
+ {
+ "name": "sc_4_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_4_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_4_of_Hearts_black"
+ },
+ {
+ "name": "sc_4_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_4_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_4_of_Spades_black"
+ },
+ {
+ "name": "sc_4_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_4_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_5_of_Clubs_black"
+ },
+ {
+ "name": "sc_5_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_5_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_5_of_Diamonds_black"
+ },
+ {
+ "name": "sc_5_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_5_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_5_of_Hearts_black"
+ },
+ {
+ "name": "sc_5_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_5_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_5_of_Spades_black"
+ },
+ {
+ "name": "sc_5_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_5_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_6_of_Clubs_black"
+ },
+ {
+ "name": "sc_6_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_6_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_6_of_Diamonds_black"
+ },
+ {
+ "name": "sc_6_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_6_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_6_of_Hearts_black"
+ },
+ {
+ "name": "sc_6_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_6_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_6_of_Spades_black"
+ },
+ {
+ "name": "sc_6_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_6_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_7_of_Clubs_black"
+ },
+ {
+ "name": "sc_7_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_7_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_7_of_Diamonds_black"
+ },
+ {
+ "name": "sc_7_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_7_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_7_of_Hearts_black"
+ },
+ {
+ "name": "sc_7_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_7_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_7_of_Spades_black"
+ },
+ {
+ "name": "sc_7_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_7_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_8_of_Clubs_black"
+ },
+ {
+ "name": "sc_8_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_8_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_8_of_Diamonds_black"
+ },
+ {
+ "name": "sc_8_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_8_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_8_of_Hearts_black"
+ },
+ {
+ "name": "sc_8_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_8_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_8_of_Spades_black"
+ },
+ {
+ "name": "sc_8_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_8_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_9_of_Clubs_black"
+ },
+ {
+ "name": "sc_9_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_9_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_9_of_Diamonds_black"
+ },
+ {
+ "name": "sc_9_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_9_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_9_of_Hearts_black"
+ },
+ {
+ "name": "sc_9_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_9_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_9_of_Spades_black"
+ },
+ {
+ "name": "sc_9_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_9_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_Ace_of_Clubs_black"
+ },
+ {
+ "name": "sc_Ace_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_Ace_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_Ace_of_Diamonds_black"
+ },
+ {
+ "name": "sc_Ace_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_Ace_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_Ace_of_Hearts_black"
+ },
+ {
+ "name": "sc_Ace_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_Ace_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_Ace_of_Spades_black"
+ },
+ {
+ "name": "sc_Ace_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_Ace_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_Jack_of_Clubs_black"
+ },
+ {
+ "name": "sc_Jack_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_Jack_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_Jack_of_Diamonds_black"
+ },
+ {
+ "name": "sc_Jack_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_Jack_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_Jack_of_Hearts_black"
+ },
+ {
+ "name": "sc_Jack_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_Jack_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_Jack_of_Spades_black"
+ },
+ {
+ "name": "sc_Jack_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_Jack_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_King_of_Clubs_black"
+ },
+ {
+ "name": "sc_King_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_King_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_King_of_Diamonds_black"
+ },
+ {
+ "name": "sc_King_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_King_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_King_of_Hearts_black"
+ },
+ {
+ "name": "sc_King_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_King_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_King_of_Spades_black"
+ },
+ {
+ "name": "sc_King_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_King_of_Spades_syndicate"
+ },
+ {
+ "name": "sc_Queen_of_Clubs_black"
+ },
+ {
+ "name": "sc_Queen_of_Clubs_nanotrasen"
+ },
+ {
+ "name": "sc_Queen_of_Clubs_syndicate"
+ },
+ {
+ "name": "sc_Queen_of_Diamonds_black"
+ },
+ {
+ "name": "sc_Queen_of_Diamonds_nanotrasen"
+ },
+ {
+ "name": "sc_Queen_of_Diamonds_syndicate"
+ },
+ {
+ "name": "sc_Queen_of_Hearts_black"
+ },
+ {
+ "name": "sc_Queen_of_Hearts_nanotrasen"
+ },
+ {
+ "name": "sc_Queen_of_Hearts_syndicate"
+ },
+ {
+ "name": "sc_Queen_of_Spades_black"
+ },
+ {
+ "name": "sc_Queen_of_Spades_nanotrasen"
+ },
+ {
+ "name": "sc_Queen_of_Spades_syndicate"
+ },
+ {
+ "name": "singlecard_down_black"
+ },
+ {
+ "name": "singlecard_down_nanotrasen"
+ },
+ {
+ "name": "singlecard_down_syndicate"
+ },
+ {
+ "name": "syndicate_hand1"
+ },
+ {
+ "name": "syndicate_hand2"
+ },
+ {
+ "name": "syndicate_hand3"
+ },
+ {
+ "name": "syndicate_hand4"
+ },
+ {
+ "name": "syndicate_hand5"
+ },
+ {
+ "name": "syndicate_joker",
+ "delays": [
+ [
+ 0.5,
+ 0.5
+ ]
+ ]
+ },
+ {
+ "name": "nanotrasen_joker",
+ "delays": [
+ [
+ 0.5,
+ 0.5
+ ]
+ ]
+ },
+ {
+ "name": "black_joker",
+ "delays": [
+ [
+ 0.5,
+ 0.5
+ ]
+ ]
+ },
+ {
+ "name": "syndicate_box"
+ },
+ {
+ "name": "syndicate_box_open"
+ },
+ {
+ "name": "black_box"
+ },
+ {
+ "name": "black_box_open"
+ },
+ {
+ "name": "nanotrasen_box"
+ },
+ {
+ "name": "nanotrasen_box_open"
+ }
+ ]
+}
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_box.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_box.png
new file mode 100644
index 00000000000..b80b2ccd71f
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_box.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_box_open.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_box_open.png
new file mode 100644
index 00000000000..b86bfb1c2d0
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_box_open.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand1.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand1.png
new file mode 100644
index 00000000000..2c532c3148a
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand1.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand2.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand2.png
new file mode 100644
index 00000000000..073d79718c4
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand2.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand3.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand3.png
new file mode 100644
index 00000000000..1edfe42011d
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand3.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand4.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand4.png
new file mode 100644
index 00000000000..b788969f0f3
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand4.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand5.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand5.png
new file mode 100644
index 00000000000..8836dc110bf
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_hand5.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_joker.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_joker.png
new file mode 100644
index 00000000000..c7c5c9e0615
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/nanotrasen_joker.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Clubs_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Clubs_black.png
new file mode 100644
index 00000000000..1c45b9f176b
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Clubs_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Clubs_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Clubs_nanotrasen.png
new file mode 100644
index 00000000000..23f499fe81b
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Clubs_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Clubs_syndicate.png
new file mode 100644
index 00000000000..ae4d73c1a65
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Diamonds_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Diamonds_black.png
new file mode 100644
index 00000000000..17a7cb99d2e
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Diamonds_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Diamonds_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Diamonds_nanotrasen.png
new file mode 100644
index 00000000000..afad380277d
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Diamonds_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Diamonds_syndicate.png
new file mode 100644
index 00000000000..100b213afc8
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Hearts_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Hearts_black.png
new file mode 100644
index 00000000000..0a179f78eed
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Hearts_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Hearts_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Hearts_nanotrasen.png
new file mode 100644
index 00000000000..eca6193c86a
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Hearts_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Hearts_syndicate.png
new file mode 100644
index 00000000000..b9a84674854
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Spades_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Spades_black.png
new file mode 100644
index 00000000000..5fc75d0bce8
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Spades_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Spades_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Spades_nanotrasen.png
new file mode 100644
index 00000000000..01187507f6e
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Spades_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Spades_syndicate.png
new file mode 100644
index 00000000000..b4ac829a241
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_10_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Clubs_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Clubs_black.png
new file mode 100644
index 00000000000..ba33f6b6a7a
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Clubs_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Clubs_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Clubs_nanotrasen.png
new file mode 100644
index 00000000000..2067145ca03
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Clubs_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Clubs_syndicate.png
new file mode 100644
index 00000000000..1a057ecf79c
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Diamonds_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Diamonds_black.png
new file mode 100644
index 00000000000..e5e5afcbf30
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Diamonds_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Diamonds_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Diamonds_nanotrasen.png
new file mode 100644
index 00000000000..f0ee45883dd
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Diamonds_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Diamonds_syndicate.png
new file mode 100644
index 00000000000..8f6549e8d3d
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Hearts_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Hearts_black.png
new file mode 100644
index 00000000000..b16deb15ae8
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Hearts_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Hearts_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Hearts_nanotrasen.png
new file mode 100644
index 00000000000..af710d07111
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Hearts_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Hearts_syndicate.png
new file mode 100644
index 00000000000..7f99d786cfe
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Spades_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Spades_black.png
new file mode 100644
index 00000000000..4ff15e41368
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Spades_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Spades_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Spades_nanotrasen.png
new file mode 100644
index 00000000000..c8c01eb2d55
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Spades_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Spades_syndicate.png
new file mode 100644
index 00000000000..bea976dc1b9
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_2_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Clubs_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Clubs_black.png
new file mode 100644
index 00000000000..36fcb2d6541
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Clubs_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Clubs_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Clubs_nanotrasen.png
new file mode 100644
index 00000000000..b64b1a6650a
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Clubs_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Clubs_syndicate.png
new file mode 100644
index 00000000000..feeefb7bccf
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Diamonds_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Diamonds_black.png
new file mode 100644
index 00000000000..a100b460580
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Diamonds_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Diamonds_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Diamonds_nanotrasen.png
new file mode 100644
index 00000000000..34e8feae6f1
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Diamonds_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Diamonds_syndicate.png
new file mode 100644
index 00000000000..1cf21d7723e
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Hearts_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Hearts_black.png
new file mode 100644
index 00000000000..50be1e655a0
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Hearts_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Hearts_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Hearts_nanotrasen.png
new file mode 100644
index 00000000000..20cf0ab74e7
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Hearts_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Hearts_syndicate.png
new file mode 100644
index 00000000000..8d62899fe29
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Spades_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Spades_black.png
new file mode 100644
index 00000000000..d43b828a499
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Spades_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Spades_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Spades_nanotrasen.png
new file mode 100644
index 00000000000..dd9ba51947d
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Spades_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Spades_syndicate.png
new file mode 100644
index 00000000000..6a51db9b7eb
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_3_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Clubs_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Clubs_black.png
new file mode 100644
index 00000000000..67f25777ea1
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Clubs_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Clubs_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Clubs_nanotrasen.png
new file mode 100644
index 00000000000..fb1266f3910
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Clubs_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Clubs_syndicate.png
new file mode 100644
index 00000000000..2b14b3777d4
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Diamonds_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Diamonds_black.png
new file mode 100644
index 00000000000..653109f088d
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Diamonds_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Diamonds_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Diamonds_nanotrasen.png
new file mode 100644
index 00000000000..93d00aa65e8
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Diamonds_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Diamonds_syndicate.png
new file mode 100644
index 00000000000..1b63837065f
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Hearts_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Hearts_black.png
new file mode 100644
index 00000000000..30e3525c7ea
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Hearts_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Hearts_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Hearts_nanotrasen.png
new file mode 100644
index 00000000000..8d55ea1df9c
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Hearts_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Hearts_syndicate.png
new file mode 100644
index 00000000000..2fb582d5698
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Spades_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Spades_black.png
new file mode 100644
index 00000000000..cb82281e406
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Spades_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Spades_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Spades_nanotrasen.png
new file mode 100644
index 00000000000..6bd780f2504
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Spades_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Spades_syndicate.png
new file mode 100644
index 00000000000..e6d0a439eea
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_4_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Clubs_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Clubs_black.png
new file mode 100644
index 00000000000..61c3ad81f1b
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Clubs_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Clubs_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Clubs_nanotrasen.png
new file mode 100644
index 00000000000..bf156aceb7e
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Clubs_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Clubs_syndicate.png
new file mode 100644
index 00000000000..8183e0defab
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Diamonds_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Diamonds_black.png
new file mode 100644
index 00000000000..3dd9f7c95b2
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Diamonds_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Diamonds_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Diamonds_nanotrasen.png
new file mode 100644
index 00000000000..66032a9ddde
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Diamonds_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Diamonds_syndicate.png
new file mode 100644
index 00000000000..eef3d3322d6
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Hearts_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Hearts_black.png
new file mode 100644
index 00000000000..f1fa1b4f34c
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Hearts_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Hearts_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Hearts_nanotrasen.png
new file mode 100644
index 00000000000..95d5ed72a20
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Hearts_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Hearts_syndicate.png
new file mode 100644
index 00000000000..b9a25077a1f
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Spades_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Spades_black.png
new file mode 100644
index 00000000000..48290bd26c4
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Spades_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Spades_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Spades_nanotrasen.png
new file mode 100644
index 00000000000..5f557f6f116
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Spades_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Spades_syndicate.png
new file mode 100644
index 00000000000..22f74e05357
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_5_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Clubs_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Clubs_black.png
new file mode 100644
index 00000000000..7b4eb021bf6
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Clubs_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Clubs_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Clubs_nanotrasen.png
new file mode 100644
index 00000000000..f94cc860771
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Clubs_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Clubs_syndicate.png
new file mode 100644
index 00000000000..7b7905bd38f
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Diamonds_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Diamonds_black.png
new file mode 100644
index 00000000000..c44ddd87e6d
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Diamonds_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Diamonds_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Diamonds_nanotrasen.png
new file mode 100644
index 00000000000..970bef60e4a
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Diamonds_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Diamonds_syndicate.png
new file mode 100644
index 00000000000..729c0def3f4
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Hearts_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Hearts_black.png
new file mode 100644
index 00000000000..23697e2f9a4
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Hearts_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Hearts_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Hearts_nanotrasen.png
new file mode 100644
index 00000000000..e099806d233
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Hearts_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Hearts_syndicate.png
new file mode 100644
index 00000000000..fabd88049a1
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Spades_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Spades_black.png
new file mode 100644
index 00000000000..429b9c9dcf3
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Spades_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Spades_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Spades_nanotrasen.png
new file mode 100644
index 00000000000..7fc01c72b52
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Spades_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Spades_syndicate.png
new file mode 100644
index 00000000000..b1021e01bc3
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_6_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Clubs_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Clubs_black.png
new file mode 100644
index 00000000000..444a83394ef
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Clubs_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Clubs_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Clubs_nanotrasen.png
new file mode 100644
index 00000000000..8d795e524e2
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Clubs_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Clubs_syndicate.png
new file mode 100644
index 00000000000..6f786cca2a4
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Diamonds_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Diamonds_black.png
new file mode 100644
index 00000000000..2308d43d4f2
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Diamonds_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Diamonds_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Diamonds_nanotrasen.png
new file mode 100644
index 00000000000..efbe7248ecb
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Diamonds_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Diamonds_syndicate.png
new file mode 100644
index 00000000000..7954748eab3
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Hearts_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Hearts_black.png
new file mode 100644
index 00000000000..e466ae71205
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Hearts_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Hearts_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Hearts_nanotrasen.png
new file mode 100644
index 00000000000..452bd851e4f
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Hearts_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Hearts_syndicate.png
new file mode 100644
index 00000000000..7beeded1736
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Spades_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Spades_black.png
new file mode 100644
index 00000000000..b72505fb878
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Spades_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Spades_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Spades_nanotrasen.png
new file mode 100644
index 00000000000..c9923e0c89e
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Spades_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Spades_syndicate.png
new file mode 100644
index 00000000000..07f4d96f75d
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_7_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Clubs_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Clubs_black.png
new file mode 100644
index 00000000000..3367fa0d2e6
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Clubs_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Clubs_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Clubs_nanotrasen.png
new file mode 100644
index 00000000000..83eafee6c79
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Clubs_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Clubs_syndicate.png
new file mode 100644
index 00000000000..76d30fab1a6
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Diamonds_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Diamonds_black.png
new file mode 100644
index 00000000000..58a1130c4a8
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Diamonds_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Diamonds_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Diamonds_nanotrasen.png
new file mode 100644
index 00000000000..6204855e3c8
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Diamonds_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Diamonds_syndicate.png
new file mode 100644
index 00000000000..e1b2aba48e3
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Hearts_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Hearts_black.png
new file mode 100644
index 00000000000..2ce9b69f164
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Hearts_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Hearts_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Hearts_nanotrasen.png
new file mode 100644
index 00000000000..86b3c37cd0e
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Hearts_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Hearts_syndicate.png
new file mode 100644
index 00000000000..1ad0852935b
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Spades_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Spades_black.png
new file mode 100644
index 00000000000..69154bbc3b1
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Spades_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Spades_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Spades_nanotrasen.png
new file mode 100644
index 00000000000..587025d064e
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Spades_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Spades_syndicate.png
new file mode 100644
index 00000000000..ec1158a360d
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_8_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Clubs_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Clubs_black.png
new file mode 100644
index 00000000000..59686360af8
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Clubs_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Clubs_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Clubs_nanotrasen.png
new file mode 100644
index 00000000000..9c88a1a275a
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Clubs_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Clubs_syndicate.png
new file mode 100644
index 00000000000..4ef37da096e
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Diamonds_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Diamonds_black.png
new file mode 100644
index 00000000000..7104afcd64b
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Diamonds_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Diamonds_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Diamonds_nanotrasen.png
new file mode 100644
index 00000000000..35aba68cfeb
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Diamonds_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Diamonds_syndicate.png
new file mode 100644
index 00000000000..f6bad838259
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Hearts_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Hearts_black.png
new file mode 100644
index 00000000000..43341bb1f8c
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Hearts_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Hearts_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Hearts_nanotrasen.png
new file mode 100644
index 00000000000..389004ac91b
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Hearts_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Hearts_syndicate.png
new file mode 100644
index 00000000000..c3b7cc61429
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Spades_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Spades_black.png
new file mode 100644
index 00000000000..ab89960ba01
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Spades_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Spades_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Spades_nanotrasen.png
new file mode 100644
index 00000000000..dbdff6554ec
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Spades_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Spades_syndicate.png
new file mode 100644
index 00000000000..1a68d32b7c0
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_9_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_black.png
new file mode 100644
index 00000000000..5c524bad648
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_nanotrasen.png
new file mode 100644
index 00000000000..4aab2f09d47
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_syndicate.png
new file mode 100644
index 00000000000..47fe7da11d2
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_black.png
new file mode 100644
index 00000000000..eff87dcb562
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_nanotrasen.png
new file mode 100644
index 00000000000..bc1f38c11ee
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_syndicate.png
new file mode 100644
index 00000000000..f3bb83907bb
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_black.png
new file mode 100644
index 00000000000..da4360e0e50
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_nanotrasen.png
new file mode 100644
index 00000000000..d5823c0fb7c
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_syndicate.png
new file mode 100644
index 00000000000..e17eaab8cf6
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Spades_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Spades_black.png
new file mode 100644
index 00000000000..4be96b088aa
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Spades_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Spades_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Spades_nanotrasen.png
new file mode 100644
index 00000000000..11bea7d14b3
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Spades_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Spades_syndicate.png
new file mode 100644
index 00000000000..94d9ce9f9d9
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Ace_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_black.png
new file mode 100644
index 00000000000..83e604757ba
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_nanotrasen.png
new file mode 100644
index 00000000000..5aa923cba29
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_syndicate.png
new file mode 100644
index 00000000000..9b1a9ee48c1
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_black.png
new file mode 100644
index 00000000000..0e79933147c
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_nanotrasen.png
new file mode 100644
index 00000000000..8b9d7cb53f4
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_syndicate.png
new file mode 100644
index 00000000000..c11bda0bf3e
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_black.png
new file mode 100644
index 00000000000..e9ab75342fe
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_nanotrasen.png
new file mode 100644
index 00000000000..bfeaa7d8d2e
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_syndicate.png
new file mode 100644
index 00000000000..6b07df35200
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Spades_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Spades_black.png
new file mode 100644
index 00000000000..df544772310
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Spades_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Spades_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Spades_nanotrasen.png
new file mode 100644
index 00000000000..5fa983d5e19
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Spades_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Spades_syndicate.png
new file mode 100644
index 00000000000..1da0de75ba5
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Jack_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Clubs_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Clubs_black.png
new file mode 100644
index 00000000000..2ec99fc8dd8
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Clubs_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Clubs_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Clubs_nanotrasen.png
new file mode 100644
index 00000000000..28488799a0a
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Clubs_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Clubs_syndicate.png
new file mode 100644
index 00000000000..446c79e0b39
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Diamonds_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Diamonds_black.png
new file mode 100644
index 00000000000..0c561befb99
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Diamonds_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Diamonds_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Diamonds_nanotrasen.png
new file mode 100644
index 00000000000..b6af7d62185
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Diamonds_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Diamonds_syndicate.png
new file mode 100644
index 00000000000..b6f8e32cc26
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Hearts_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Hearts_black.png
new file mode 100644
index 00000000000..fe38670021e
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Hearts_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Hearts_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Hearts_nanotrasen.png
new file mode 100644
index 00000000000..c53d7fe5d0f
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Hearts_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Hearts_syndicate.png
new file mode 100644
index 00000000000..7ebf4ce24ff
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Spades_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Spades_black.png
new file mode 100644
index 00000000000..6fc8241b115
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Spades_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Spades_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Spades_nanotrasen.png
new file mode 100644
index 00000000000..adb48697f98
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Spades_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Spades_syndicate.png
new file mode 100644
index 00000000000..5da2adf32a2
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_King_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_black.png
new file mode 100644
index 00000000000..de3cf80db96
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_nanotrasen.png
new file mode 100644
index 00000000000..c22d142b63e
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_syndicate.png
new file mode 100644
index 00000000000..e234569093c
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Clubs_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_black.png
new file mode 100644
index 00000000000..7a529a19159
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_nanotrasen.png
new file mode 100644
index 00000000000..537de98404b
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_syndicate.png
new file mode 100644
index 00000000000..184f90b5de3
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Diamonds_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_black.png
new file mode 100644
index 00000000000..1b190bd9342
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_nanotrasen.png
new file mode 100644
index 00000000000..74a5fe35c46
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_syndicate.png
new file mode 100644
index 00000000000..30c4271fc96
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Hearts_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Spades_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Spades_black.png
new file mode 100644
index 00000000000..40edb50caab
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Spades_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Spades_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Spades_nanotrasen.png
new file mode 100644
index 00000000000..613f4e81ca6
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Spades_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Spades_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Spades_syndicate.png
new file mode 100644
index 00000000000..0106a46014b
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/sc_Queen_of_Spades_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/singlecard_down_black.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/singlecard_down_black.png
new file mode 100644
index 00000000000..e634a9f8a0a
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/singlecard_down_black.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/singlecard_down_nanotrasen.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/singlecard_down_nanotrasen.png
new file mode 100644
index 00000000000..a219d059541
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/singlecard_down_nanotrasen.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/singlecard_down_syndicate.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/singlecard_down_syndicate.png
new file mode 100644
index 00000000000..03b7154520d
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/singlecard_down_syndicate.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_box.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_box.png
new file mode 100644
index 00000000000..24d143e40dc
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_box.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_box_open.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_box_open.png
new file mode 100644
index 00000000000..a8edb3d5cd6
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_box_open.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand1.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand1.png
new file mode 100644
index 00000000000..a0c5cf0e139
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand1.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand2.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand2.png
new file mode 100644
index 00000000000..88a445a27ae
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand2.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand3.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand3.png
new file mode 100644
index 00000000000..c30454d2b51
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand3.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand4.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand4.png
new file mode 100644
index 00000000000..7a9eb2d197a
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand4.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand5.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand5.png
new file mode 100644
index 00000000000..3dc0f71ddc2
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_hand5.png differ
diff --git a/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_joker.png b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_joker.png
new file mode 100644
index 00000000000..2e282d0c7d1
Binary files /dev/null and b/Resources/Textures/_CorvaxNext/Objects/Misc/cards.rsi/syndicate_joker.png differ
diff --git a/runclient - Release.bat b/runclient - Release.bat
new file mode 100644
index 00000000000..f13eda8cd57
--- /dev/null
+++ b/runclient - Release.bat
@@ -0,0 +1,2 @@
+@echo off
+dotnet run --project Content.Client --configuration Release
diff --git a/runserver - Release.bat b/runserver - Release.bat
new file mode 100644
index 00000000000..73f7db6f3ee
--- /dev/null
+++ b/runserver - Release.bat
@@ -0,0 +1,3 @@
+@echo off
+dotnet run --project Content.Server --configuration Release
+pause