diff --git a/Content.Server/Bible/BibleSystem.cs b/Content.Server/Bible/BibleSystem.cs index c193578f822..78d59cc1184 100644 --- a/Content.Server/Bible/BibleSystem.cs +++ b/Content.Server/Bible/BibleSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Bible.Components; using Content.Server.Ghost.Roles.Events; using Content.Server.Popups; +using Content.Server.Saw; using Content.Shared._Sunrise.Mood; using Content.Shared.ActionBlocker; using Content.Shared.Actions; @@ -8,11 +9,13 @@ using Content.Shared.Damage; using Content.Shared.Ghost.Roles.Components; using Content.Shared.IdentityManagement; +using Content.Shared.IdentityManagement.Components; using Content.Shared.Interaction; using Content.Shared.Inventory; using Content.Shared.Mobs; using Content.Shared.Mobs.Systems; using Content.Shared.Popups; +using Content.Shared.Prayer; using Content.Shared.Stunnable; using Content.Shared.Timing; using Content.Shared.Vampire.Components; @@ -21,13 +24,17 @@ using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.Player; +using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; +using System.Linq; namespace Content.Server.Bible { public sealed class BibleSystem : EntitySystem { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ActionBlockerSystem _blocker = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; @@ -39,6 +46,8 @@ public sealed class BibleSystem : EntitySystem [Dependency] private readonly UseDelaySystem _delay = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedStunSystem _stun = default!; + [Dependency] private readonly EntityLookupSystem _lookUp = default!; + [Dependency] private readonly MetaDataSystem _metaData = default!; public override void Initialize() { @@ -150,6 +159,25 @@ private void OnAfterInteract(EntityUid uid, BibleComponent component, AfterInter return; } + //Sunrise-start + + if (TryPrototype((EntityUid) args.Target, out var prototype) + && (prototype.ID == "MobPig" || (prototype.Parents != null && prototype.Parents.Contains("MobPig"))) + && !HasComp(args.Target)) + { + if (_lookUp.GetEntitiesInRange(Transform(uid).Coordinates, 5).Count >= 5 + && _lookUp.GetEntitiesInRange(Transform(uid).Coordinates, 5).Count >= 2) + { + _entityManager.AddComponents((EntityUid) args.Target, _prototypeManager.Index("MobSaw").Components, false); + _metaData.SetEntityName((EntityUid)args.Target, "свиноматерь"); + _popupSystem.PopupEntity(Loc.GetString("bible-saw-transformation"), (EntityUid) args.Target); + _audio.PlayPvs(component.HealSoundPath, (EntityUid) args.Target); + } + return; + } + + //Sunrise-end + // This only has a chance to fail if the target is not wearing anything on their head and is not a familiar.. if (!_invSystem.TryGetSlotEntity(args.Target.Value, "head", out var _) && !HasComp(args.Target.Value)) { diff --git a/Content.Server/Body/Components/StomachComponent.cs b/Content.Server/Body/Components/StomachComponent.cs index d541ca4d7c4..a21af34147a 100644 --- a/Content.Server/Body/Components/StomachComponent.cs +++ b/Content.Server/Body/Components/StomachComponent.cs @@ -47,6 +47,16 @@ public sealed partial class StomachComponent : Component [DataField] public EntityWhitelist? SpecialDigestible = null; + //Sunrise-start + + /// + /// If true, whitelist from the top will only be used as an addition to the already digestible by default food + /// + [DataField] + public bool IsDigestibleAddition = false; + + //Sunrise-end + /// /// Used to track how long each reagent has been in the stomach /// diff --git a/Content.Server/FaceCast/FaceCastComponent.cs b/Content.Server/FaceCast/FaceCastComponent.cs new file mode 100644 index 00000000000..1c6595f9a22 --- /dev/null +++ b/Content.Server/FaceCast/FaceCastComponent.cs @@ -0,0 +1,14 @@ + +using Content.Shared.FixedPoint; + +namespace Content.Server.FaceCast; + +[RegisterComponent] +public sealed partial class FaceCastComponent : Component +{ + public TimeSpan? StartCastingTime = null; + + public EntityUid? Equiper = null; + + public Double TimeToCast = 5; +} diff --git a/Content.Server/FaceCast/FaceCastSystem.cs b/Content.Server/FaceCast/FaceCastSystem.cs new file mode 100644 index 00000000000..fa1f91b4705 --- /dev/null +++ b/Content.Server/FaceCast/FaceCastSystem.cs @@ -0,0 +1,69 @@ +using Content.Shared.Inventory.Events; +using Robust.Shared.Timing; +using Content.Shared.IdentityManagement.Components; +using Content.Shared.Clothing.Components; +using Content.Shared.Inventory; +using Content.Shared.Nutrition.AnimalHusbandry; + +namespace Content.Server.FaceCast; + +public sealed class FaceCastSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly MetaDataSystem _metaData = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + public override void Initialize() + { + SubscribeLocalEvent(OnEquip); + SubscribeLocalEvent(OnUnequip); + } + + private void OnEquip(EntityUid ent, FaceCastComponent faceCast, ref GotEquippedEvent args) + { + if (!HasComp(args.Equipee)) + return; + faceCast.Equiper = args.Equipee; + if (HasComp(args.Equipee)) + return; + faceCast.StartCastingTime = _timing.CurTime; + } + + private void OnUnequip(EntityUid ent, FaceCastComponent faceCast, ref GotUnequippedEvent args) + { + faceCast.StartCastingTime = null; + faceCast.Equiper = null; + } + + public override void Update(float frameTime) + { + base.Update(frameTime); + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var faceCast)) + { + if (!TryComp(uid, out var cloth)) + continue; + + if (faceCast.Equiper == null) + continue; + + if (!HasComp(faceCast.Equiper) && faceCast.StartCastingTime == null) + { + if (Name(uid) != Loc.GetEntityData("ClothingMaskFaceCast").Name) + _metaData.SetEntityName((EntityUid) faceCast.Equiper, Name(uid)); + faceCast.StartCastingTime = _timing.CurTime; + continue; + } + + if (faceCast.StartCastingTime == null) + continue; + + if ((_timing.CurTime - faceCast.StartCastingTime) >= TimeSpan.FromSeconds(faceCast.TimeToCast)) + { + _metaData.SetEntityName(uid, Name((EntityUid)faceCast.Equiper)); + faceCast.StartCastingTime = _timing.CurTime; + } + + } + } +} diff --git a/Content.Server/Nutrition/EntitySystems/AnimalHusbandrySystem.cs b/Content.Server/Nutrition/EntitySystems/AnimalHusbandrySystem.cs index e5f590a3626..e7c33acbd8b 100644 --- a/Content.Server/Nutrition/EntitySystems/AnimalHusbandrySystem.cs +++ b/Content.Server/Nutrition/EntitySystems/AnimalHusbandrySystem.cs @@ -76,6 +76,9 @@ public bool TryReproduceNearby(EntityUid uid, ReproductiveComponent? component = if (partners.Count >= component.Capacity) return false; + if (!component.IsPartnerNeed) //Sunrise + return TryReproduce(uid, uid, component); //Sunrise + foreach (var comp in partners) { var partner = comp.Owner; @@ -98,13 +101,13 @@ public bool TryReproduce(EntityUid uid, EntityUid partner, ReproductiveComponent if (!Resolve(uid, ref component)) return false; - if (uid == partner) + if (uid == partner && component.IsPartnerNeed) //Sunrise: component.IsPartnerNeed return false; if (!CanReproduce(uid, component)) return false; - if (!IsValidPartner(uid, partner, component)) + if (!IsValidPartner(uid, partner, component) && component.IsPartnerNeed) //Sunrise: component.IsPartnerNeed return false; // if the partner is valid, yet it fails the random check @@ -181,6 +184,8 @@ public void Birth(EntityUid uid, ReproductiveComponent? component = null) if (!Resolve(uid, ref component)) return; + BirthEvent birthEvent = new BirthEvent(); //Sunrise + // this is kinda wack but it's the only sound associated with most animals if (TryComp(uid, out var interactionPopup)) _audio.PlayPvs(interactionPopup.InteractSuccessSound, uid); @@ -190,6 +195,7 @@ public void Birth(EntityUid uid, ReproductiveComponent? component = null) foreach (var spawn in spawns) { var offspring = Spawn(spawn, xform.Coordinates.Offset(_random.NextVector2(0.3f))); + birthEvent.Spawns.Add(offspring); //Sunrise _transform.AttachToGridOrMap(offspring); if (component.MakeOffspringInfant) { @@ -205,6 +211,8 @@ public void Birth(EntityUid uid, ReproductiveComponent? component = null) component.Gestating = false; component.GestationEndTime = null; + + RaiseLocalEvent(uid, birthEvent); //Sunrise } public override void Update(float frameTime) @@ -249,3 +257,11 @@ public override void Update(float frameTime) } } } + +//Sunrise-start + +public sealed class BirthEvent : EntityEventArgs +{ + public List Spawns = new List(); +} +//Sunrise-end diff --git a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs index 158c7f4955c..29f53060b4a 100644 --- a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs @@ -335,10 +335,24 @@ public void DeleteAndSpawnTrash(FoodComponent component, EntityUid food, EntityU RaiseLocalEvent(food, ev); if (ev.Cancelled) return; - var dev = new DestructionEventArgs(); RaiseLocalEvent(food, dev); + //Sunrise-start + + if (TryComp(food, out InventoryComponent? inventory)) + { + foreach (SlotDefinition sl in inventory.Slots) + { + _inventory.TryUnequip(food, sl.Name, out EntityUid? item); + if (!TryComp(item, out TransformComponent? transform)) + continue; + _transform.DropNextTo((EntityUid)item, food); + } + } + + //Sunrise-end + if (component.Trash.Count == 0) { QueueDel(food); @@ -433,6 +447,11 @@ private bool IsDigestibleBy(EntityUid food, FoodComponent component, List(OnBeforeFullyEaten); + SubscribeLocalEvent(SawInit); + SubscribeLocalEvent(OnBirth); + } + + private void OnBeforeFullyEaten(Entity food, ref BeforeFullyEatenEvent args) + { + if (!TryComp(args.User, out SawComponent? sawComp) || + !TryComp(args.User, out ReproductiveComponent? reproductive) || + !TryComp(food, out MindContainerComponent? mind) || + !HasComp(food)) + return; + + EntityUid? foodMind = _mindSystem.GetMind(food); + sawComp.EatenMind = foodMind; + + if (_prototypeManager.Index("MobSaw").Components.TryGetComponent("Reproductive", out var defaultReproductive)) + reproductive.Capacity = 6; + } + + private void SawInit(EntityUid ent, SawComponent saw, ComponentInit args) + { + if (HasComp(ent)) + RemComp(ent); + + _entityManager.AddComponents(ent, _prototypeManager.Index("MobSaw").Components, false); + Comp(ent).Capacity = 0; + } + + private void OnBirth(Entity saw, ref BirthEvent args) + { + if (TryComp(saw, out ReproductiveComponent? reproductive)) + reproductive.Capacity = 0; + EntityUid child = args.Spawns[0]; + EntityUid? eatenMind = Comp(saw).EatenMind; + saw.Comp.EatenMind = null; + if (eatenMind == null) + return; + if (!TryComp(saw, out var hungerComp)) + return; + + if (TryComp(child, out var thresholds)) + { + FixedPoint2 thresholdModifier = _hungerSystem.GetHunger(hungerComp) * saw.Comp.HungerToThresholdModifier; + + _thresholdSystem.SetMobStateThreshold(child, _thresholdSystem.GetThresholdForState(child, MobState.Critical) + thresholdModifier, MobState.Critical); + _thresholdSystem.SetMobStateThreshold(child, _thresholdSystem.GetThresholdForState(child, MobState.Dead) + thresholdModifier, MobState.Dead); + if (TryComp(child, out var mood)) + mood.CritThresholdBeforeModify = _thresholdSystem.GetThresholdForState(child, MobState.Critical); + } + + _mindSystem.TransferTo((EntityUid) eatenMind, child); + _metaData.SetEntityName(args.Spawns[0], "троттин"); + } +} diff --git a/Content.Shared/Nutrition/AnimalHusbandry/ReproductiveComponent.cs b/Content.Shared/Nutrition/AnimalHusbandry/ReproductiveComponent.cs index 8d128f547e6..a25ddcecb67 100644 --- a/Content.Shared/Nutrition/AnimalHusbandry/ReproductiveComponent.cs +++ b/Content.Shared/Nutrition/AnimalHusbandry/ReproductiveComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared.Storage; +using Content.Shared.Storage; using Content.Shared.Whitelist; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; @@ -12,6 +12,9 @@ namespace Content.Shared.Nutrition.AnimalHusbandry; [RegisterComponent, AutoGenerateComponentPause] public sealed partial class ReproductiveComponent : Component { + [DataField] + public bool IsPartnerNeed = true; //Sunrise + /// /// The next time when breeding will be attempted. /// diff --git a/Resources/Locale/ru-RU/_prototypes/_sunrise/catalog/fills/boxes/misc.ftl b/Resources/Locale/ru-RU/_prototypes/_sunrise/catalog/fills/boxes/misc.ftl new file mode 100644 index 00000000000..e01c2291e29 --- /dev/null +++ b/Resources/Locale/ru-RU/_prototypes/_sunrise/catalog/fills/boxes/misc.ftl @@ -0,0 +1,2 @@ +ent-BoxFacecast = коробка лицевых слепков + .desc = Она заполнена лицами. \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_prototypes/_sunrise/entities/clothing/masks/masks.ftl b/Resources/Locale/ru-RU/_prototypes/_sunrise/entities/clothing/masks/masks.ftl index 881bfd7a160..ed424a5b6ea 100644 --- a/Resources/Locale/ru-RU/_prototypes/_sunrise/entities/clothing/masks/masks.ftl +++ b/Resources/Locale/ru-RU/_prototypes/_sunrise/entities/clothing/masks/masks.ftl @@ -18,3 +18,5 @@ ent-ClothingBreathMaskCMO = медицинский респиратор .desc = Качественный респиратор. ent-ClothingMaskGasCE = противогаз старшего инженера .desc = Очень прочный и стильный белый противогаз с зелёной полосой на лобной части. Позволит исправить последствия работы атмосферных техников с купленными дипломами. +ent-ClothingMaskFaceCast = слепок лица + .desc = Он может украсть твою личность... diff --git a/Resources/Locale/ru-RU/_prototypes/_sunrise/entities/mobs/npcs/animals.ftl b/Resources/Locale/ru-RU/_prototypes/_sunrise/entities/mobs/npcs/animals.ftl new file mode 100644 index 00000000000..6b4b674774c --- /dev/null +++ b/Resources/Locale/ru-RU/_prototypes/_sunrise/entities/mobs/npcs/animals.ftl @@ -0,0 +1,2 @@ +ent-MobSaw = свиноматерь + .desc = Хрю. \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_strings/_sunrise/chapel/bible.ftl b/Resources/Locale/ru-RU/_strings/_sunrise/chapel/bible.ftl new file mode 100644 index 00000000000..9d3e7031929 --- /dev/null +++ b/Resources/Locale/ru-RU/_strings/_sunrise/chapel/bible.ftl @@ -0,0 +1 @@ +bible-saw-transformation = Свинья божественным чудом превращается в свиноматерь. \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_strings/nutrition/components/animal-husbandry.ftl b/Resources/Locale/ru-RU/_strings/nutrition/components/animal-husbandry.ftl index 10bc16aed72..44315a0c2b8 100644 --- a/Resources/Locale/ru-RU/_strings/nutrition/components/animal-husbandry.ftl +++ b/Resources/Locale/ru-RU/_strings/nutrition/components/animal-husbandry.ftl @@ -1,3 +1,3 @@ -infant-name-prefix = детёныш { $name } +infant-name-prefix = детёныш { $baseName } reproductive-birth-popup = { CAPITALIZE($parent) } родила! reproductive-laid-egg-popup = { CAPITALIZE($parent) } отложила яйцо! diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml index 636ecda05eb..fd75568b18a 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml @@ -21,6 +21,7 @@ ClothingNeckStoleTallit: 1 # Sunrise BoxCandle: 2 BoxCandleSmall: 2 + BoxFacecast: 2 # Sunrise Urn: 5 Bible: 1 RedFlowers: 3 # Sunrise diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index b69cca69e22..81a1b380877 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -3419,6 +3419,10 @@ - type: HTN rootTask: task: RuminantCompound + # Sunrise-start + - type: Body + prototype: ManeaterAnimal + # Sunrise-end - type: entity name: diona nymph diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index 8cd6f75f70e..418138aa600 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -233,16 +233,26 @@ emotesTakeDamage: - Scream - Crying + - type: SolutionContainerManager + solutions: + food: + maxVol: 25 + reagents: + - ReagentId: UncookedAnimalProteins + Quantity: 25 + - type: Food + requiresSpecialDigestion: true # Sunrise-End - type: entity save: false parent: + - BaseMobSpecies # Sunrise - MobBloodstream - MobRespirator - MobAtmosStandard - MobFlammable - - BaseMobSpecies + #- BaseMobSpecies # Wizards id: BaseMobSpeciesOrganic abstract: true components: diff --git a/Resources/Prototypes/_Sunrise/Body/Organs/animal.yml b/Resources/Prototypes/_Sunrise/Body/Organs/animal.yml new file mode 100644 index 00000000000..68e43c63b15 --- /dev/null +++ b/Resources/Prototypes/_Sunrise/Body/Organs/animal.yml @@ -0,0 +1,11 @@ +- type: entity + id: OrganManeaterAnimalStomach + parent: OrganAnimalStomach + name: maneater stomach + categories: [ HideSpawnMenu ] + components: + - type: Stomach + specialDigestible: + components: + - Identity + isDigestibleAddition: true \ No newline at end of file diff --git a/Resources/Prototypes/_Sunrise/Body/Prototypes/animal.yml b/Resources/Prototypes/_Sunrise/Body/Prototypes/animal.yml new file mode 100644 index 00000000000..d60ee2f7edb --- /dev/null +++ b/Resources/Prototypes/_Sunrise/Body/Prototypes/animal.yml @@ -0,0 +1,21 @@ +- type: body + id: ManeaterAnimal + name: "maneater animal" + root: torso + slots: + torso: + part: TorsoAnimal + connections: + - legs + organs: + lungs: OrganAnimalLungs + stomach: OrganManeaterAnimalStomach + liver: OrganAnimalLiver + heart: OrganAnimalHeart + kidneys: OrganAnimalKidneys + legs: + part: LegsAnimal + connections: + - feet + feet: + part: FeetAnimal \ No newline at end of file diff --git a/Resources/Prototypes/_Sunrise/Catalog/Fills/Boxes/misc.yml b/Resources/Prototypes/_Sunrise/Catalog/Fills/Boxes/misc.yml new file mode 100644 index 00000000000..a09671db905 --- /dev/null +++ b/Resources/Prototypes/_Sunrise/Catalog/Fills/Boxes/misc.yml @@ -0,0 +1,17 @@ +- type: entity + name: face casts box + parent: BoxCardboard + id: BoxFacecast + description: This box is full of faces. + components: + - type: Sprite + layers: + - state: box + - state: facecast + - type: Storage + grid: + - 0,0,4,1 + - type: StorageFill + contents: + - id: ClothingMaskFaceCast + amount: 5 \ No newline at end of file diff --git a/Resources/Prototypes/_Sunrise/Entities/Clothing/Masks/masks.yml b/Resources/Prototypes/_Sunrise/Entities/Clothing/Masks/masks.yml index 9dd3197b5fc..133685f79c6 100644 --- a/Resources/Prototypes/_Sunrise/Entities/Clothing/Masks/masks.yml +++ b/Resources/Prototypes/_Sunrise/Entities/Clothing/Masks/masks.yml @@ -129,3 +129,20 @@ sprite: _Sunrise/Clothing/Mask/cemask.rsi - type: BreathMask - type: IngestionBlocker + +- type: entity + parent: ClothingMaskBase + id: ClothingMaskFaceCast + name: face cast + description: It can steal your personality! + components: + - type: Sprite + sprite: _Sunrise/Clothing/Mask/facecast.rsi + - type: Clothing + sprite: _Sunrise/Clothing/Mask/facecast.rsi + - type: BreathMask + - type: Tag + - type: HideLayerClothing + slots: + - Snout + - type: FaceCast \ No newline at end of file diff --git a/Resources/Prototypes/_Sunrise/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/_Sunrise/Entities/Mobs/NPCs/animals.yml new file mode 100644 index 00000000000..02407df7b70 --- /dev/null +++ b/Resources/Prototypes/_Sunrise/Entities/Mobs/NPCs/animals.yml @@ -0,0 +1,12 @@ +- type: entity + name: saw + parent: MobPig + id: MobSaw + description: The Mother. + components: + - type: Saw + - type: Reproductive + offspring: + - id: MobSwine + capacity: 6 + isPartnerNeed: false \ No newline at end of file diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/facecast.png b/Resources/Textures/Objects/Storage/boxes.rsi/facecast.png new file mode 100644 index 00000000000..2597b8026c7 Binary files /dev/null and b/Resources/Textures/Objects/Storage/boxes.rsi/facecast.png differ diff --git a/Resources/Textures/Objects/Storage/boxes.rsi/meta.json b/Resources/Textures/Objects/Storage/boxes.rsi/meta.json index 1d3aee5be60..d4982d1d2ef 100644 --- a/Resources/Textures/Objects/Storage/boxes.rsi/meta.json +++ b/Resources/Textures/Objects/Storage/boxes.rsi/meta.json @@ -262,6 +262,9 @@ }, { "name": "agrichemkit" - } + }, + { + "name": "facecast" + } ] } diff --git a/Resources/Textures/_Sunrise/Clothing/Mask/facecast.rsi/equipped-MASK.png b/Resources/Textures/_Sunrise/Clothing/Mask/facecast.rsi/equipped-MASK.png new file mode 100644 index 00000000000..a231b2aee2d Binary files /dev/null and b/Resources/Textures/_Sunrise/Clothing/Mask/facecast.rsi/equipped-MASK.png differ diff --git a/Resources/Textures/_Sunrise/Clothing/Mask/facecast.rsi/icon.png b/Resources/Textures/_Sunrise/Clothing/Mask/facecast.rsi/icon.png new file mode 100644 index 00000000000..d44cd6141e0 Binary files /dev/null and b/Resources/Textures/_Sunrise/Clothing/Mask/facecast.rsi/icon.png differ diff --git a/Resources/Textures/_Sunrise/Clothing/Mask/facecast.rsi/meta.json b/Resources/Textures/_Sunrise/Clothing/Mask/facecast.rsi/meta.json new file mode 100644 index 00000000000..372f749307c --- /dev/null +++ b/Resources/Textures/_Sunrise/Clothing/Mask/facecast.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created for Sunrise ss14 repo https://github.com/space-sunrise/space-station-14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-MASK", + "directions": 4 + } + ] +}