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