diff --git a/Content.Shared/Clothing/Components/EmitsSoundOnMoveComponent.cs b/Content.Shared/Clothing/Components/EmitsSoundOnMoveComponent.cs new file mode 100644 index 00000000000..095b0daf384 --- /dev/null +++ b/Content.Shared/Clothing/Components/EmitsSoundOnMoveComponent.cs @@ -0,0 +1,35 @@ +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Map; + +namespace Content.Shared.Clothing.Components; + +/// +/// Indicates that the clothing entity emits sound when it moves. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class EmitsSoundOnMoveComponent : Component +{ + [ViewVariables(VVAccess.ReadWrite)] + [DataField(required: true), AutoNetworkedField] + public SoundSpecifier SoundCollection = default!; + + [ViewVariables(VVAccess.ReadWrite)] + [DataField("requiresGravity"), AutoNetworkedField] + public bool RequiresGravity = true; + + [ViewVariables(VVAccess.ReadOnly)] + public EntityCoordinates LastPosition = EntityCoordinates.Invalid; + + /// + /// The distance moved since the played sound. + /// + [ViewVariables(VVAccess.ReadOnly)] + public float SoundDistance = 0f; + + /// + /// Whether this item is equipped in a inventory item slot. + /// + [ViewVariables(VVAccess.ReadOnly)] + public bool IsSlotValid = true; +} diff --git a/Content.Shared/Clothing/EntitySystems/EmitsSoundOnMoveSystem.cs b/Content.Shared/Clothing/EntitySystems/EmitsSoundOnMoveSystem.cs new file mode 100644 index 00000000000..a60abd484d1 --- /dev/null +++ b/Content.Shared/Clothing/EntitySystems/EmitsSoundOnMoveSystem.cs @@ -0,0 +1,99 @@ +using System.Numerics; +using Content.Shared.Clothing.Components; +using Content.Shared.Gravity; +using Content.Shared.Inventory; +using Content.Shared.Inventory.Events; +using Content.Shared.Mobs.Components; +using Content.Shared.Movement.Components; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Physics.Components; +using Robust.Shared.Timing; + +namespace Content.Shared.Clothing.Systems; + +public sealed class EmitsSoundOnMoveSystem : EntitySystem +{ + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedMapSystem _grid = default!; + [Dependency] private readonly SharedGravitySystem _gravity = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + private EntityQuery _moverQuery; + private EntityQuery _physicsQuery; + private EntityQuery _xformQuery; + private EntityQuery _clothingQuery; + + public override void Initialize() + { + _moverQuery = GetEntityQuery(); + _physicsQuery = GetEntityQuery(); + _xformQuery = GetEntityQuery(); + _clothingQuery = GetEntityQuery(); + + SubscribeLocalEvent(OnEquipped); + SubscribeLocalEvent(OnUnequipped); + } + + private void OnEquipped(EntityUid uid, EmitsSoundOnMoveComponent component, GotEquippedEvent args) + { + component.IsSlotValid = !args.SlotFlags.HasFlag(SlotFlags.POCKET); + } + + private void OnUnequipped(EntityUid uid, EmitsSoundOnMoveComponent component, GotUnequippedEvent args) + { + component.IsSlotValid = true; + } + + public override void Update(float frameTime) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var comp)) + { + UpdateSound(uid, comp); + } + query.Dispose(); + } + + private void UpdateSound(EntityUid uid, EmitsSoundOnMoveComponent component) + { + if (!_xformQuery.TryGetComponent(uid, out var xform) || + !_physicsQuery.TryGetComponent(uid, out var physics)) + return; + + // Space does not transmit sound + if (xform.GridUid == null) + return; + + if (component.RequiresGravity && _gravity.IsWeightless(uid, physics, xform)) + return; + + var parent = xform.ParentUid; + + var isWorn = parent is { Valid: true } && + _clothingQuery.TryGetComponent(uid, out var clothing) + && clothing.InSlot != null + && component.IsSlotValid; + // If this entity is worn by another entity, use that entity's coordinates + var coordinates = isWorn ? Transform(parent).Coordinates : xform.Coordinates; + var distanceNeeded = (isWorn && _moverQuery.TryGetComponent(parent, out var mover) && mover.Sprinting) + ? 1.5f // The parent is a mob that is currently sprinting + : 2f; // The parent is not a mob or is not sprinting + + if (!coordinates.TryDistance(EntityManager, component.LastPosition, out var distance) || distance > distanceNeeded) + component.SoundDistance = distanceNeeded; + else + component.SoundDistance += distance; + + component.LastPosition = coordinates; + if (component.SoundDistance < distanceNeeded) + return; + component.SoundDistance -= distanceNeeded; + + var sound = component.SoundCollection; + var audioParams = sound.Params + .WithVolume(sound.Params.Volume) + .WithVariation(sound.Params.Variation ?? 0f); + + _audio.PlayPredicted(sound, uid, uid, audioParams); + } +} diff --git a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl index bb56233ff14..0106ba94b12 100644 --- a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl +++ b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl @@ -4,6 +4,7 @@ petting-success-generic = You pet {THE($target)} on {POSS-ADJ($target)} head. petting-success-soft-floofy = You pet {THE($target)} on {POSS-ADJ($target)} soft floofy head. +petting-success-generic-others = { CAPITALIZE(THE($user)) } pets {THE($target)}. petting-success-bingus = You pet {THE($target)} on {POSS-ADJ($target)} wrinkly little head. petting-success-bird = You pet {THE($target)} on {POSS-ADJ($target)} cute feathery head. diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml index 2c4c27137f0..bc7a5470b83 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml @@ -67,6 +67,7 @@ ClothingShoesColorOrange: 2 ClothingShoesColorRed: 2 ClothingShoesColorPurple: 2 + ClothingsClothwarp: 4 ClothingHeadHatGreysoft: 8 ClothingHeadHatMimesoft: 3 ClothingHeadHatBluesoft: 2 @@ -111,6 +112,8 @@ ClothingHandsGlovesColorOrange: 2 ClothingHandsGlovesColorPurple: 2 ClothingEyesGlassesCheapSunglasses: 3 + ClothingNeckOldMantle: 2 + ClothingNeckUnathiMantle: 2 contrabandInventory: ClothingMaskNeckGaiter: 2 ClothingUniformJumpsuitTacticool: 1 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml index bb21bc36d47..a4eb5229e6a 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml @@ -88,6 +88,8 @@ ClothingShoesBootsCowboyBlack: 1 ClothingShoesBootsCowboyWhite: 1 ClothingMaskNeckGaiterRed: 2 + ClothingNeckBellCollar: 2 + ClothingOuterUnathiRobe: 1 emaggedInventory: ClothingShoesBling: 1 ClothingShoesBootsCowboyFancy: 1 diff --git a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml index 06abe8c45fa..a50587039a4 100644 --- a/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml +++ b/Resources/Prototypes/DeltaV/Entities/Mobs/Player/vulpkanin.yml @@ -7,9 +7,9 @@ - type: CombatMode - type: InteractionPopup successChance: 1 - interactSuccessString: hugging-success-generic + interactSuccessString: petting-success-generic interactSuccessSound: /Audio/Effects/thudswoosh.ogg - messagePerceivedByOthers: hugging-success-generic-others + messagePerceivedByOthers: petting-success-generic-others - type: MindContainer showExamineInfo: true - type: Input diff --git a/Resources/Prototypes/Entities/Clothing/Neck/mantles.yml b/Resources/Prototypes/Entities/Clothing/Neck/mantles.yml index 7b4ab078911..18976b9a34b 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/mantles.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/mantles.yml @@ -74,3 +74,25 @@ sprite: Clothing/Neck/mantles/qmmantle.rsi - type: Clothing sprite: Clothing/Neck/mantles/qmmantle.rsi + +- type: entity + parent: ClothingNeckBase + id: ClothingNeckOldMantle + name: old wrap + description: A tattered fabric wrap, faded over the years. Smells faintly of cigars. + components: + - type: Sprite + sprite: Clothing/Neck/Mantles/oldmantle.rsi + - type: Clothing + sprite: Clothing/Neck/Mantles/oldmantle.rsi + +- type: entity + parent: ClothingNeckBase + id: ClothingNeckUnathiMantle + name: hide mantle + description: A rather grisly selection of cured hides and skin, sewn together to form a ragged mantle. + components: + - type: Sprite + sprite: Clothing/Neck/Mantles/unathimantle.rsi + - type: Clothing + sprite: Clothing/Neck/Mantles/unathimantle.rsi diff --git a/Resources/Prototypes/Entities/Clothing/Neck/misc.yml b/Resources/Prototypes/Entities/Clothing/Neck/misc.yml index 6b4be3c9f84..4f8015367b1 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/misc.yml @@ -93,3 +93,17 @@ - type: Construction graph: flowerwreath node: flowerwreath + +- type: entity + parent: ClothingNeckBase + id: ClothingNeckBellCollar + name: bell collar + description: A way to inform others about your presence, or just to annoy everyone around you! + components: + - type: Sprite + sprite: Clothing/Neck/Misc/bellcollar.rsi + - type: Clothing + sprite: Clothing/Neck/Misc/bellcollar.rsi + - type: EmitsSoundOnMove + soundCollection: + collection: FootstepJester diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml index d17fb275c13..4b2c3c9c3ff 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml @@ -377,3 +377,14 @@ sprite: Clothing/OuterClothing/Misc/red_racoon.rsi - type: Clothing sprite: Clothing/OuterClothing/Misc/red_racoon.rsi + +- type: entity + parent: ClothingOuterBase + id: ClothingOuterUnathiRobe + name: roughspun robes + description: A traditional Unathi garment. + components: + - type: Sprite + sprite: Clothing/OuterClothing/Misc/unathirobe.rsi + - type: Clothing + sprite: Clothing/OuterClothing/Misc/unathirobe.rsi diff --git a/Resources/Prototypes/Entities/Clothing/clothwarps.yml b/Resources/Prototypes/Entities/Clothing/clothwarps.yml new file mode 100644 index 00000000000..1a48c39a264 --- /dev/null +++ b/Resources/Prototypes/Entities/Clothing/clothwarps.yml @@ -0,0 +1,38 @@ +- type: entity + parent: Clothing + id: ClothingsClothwarp + name: clothwarps + description: A roll of treated canvas used for wrapping claws or paws. + components: + - type: Item + size: Small + storedRotation: -90 + - type: Sprite + state: icon + sprite: Clothing/Shoes/Misc/clothwarp.rsi + - type: Clothing + slots: + - gloves + - FEET + sprite: Clothing/Shoes/Misc/clothwarp.rsi + - type: Construction + graph: ClothingsClothwarp + node: shoes + - type: Butcherable + butcheringType: Knife + spawned: + - id: MaterialCloth1 + amount: 1 + - type: Food + requiresSpecialDigestion: true + - type: SolutionContainerManager + solutions: + food: + maxVol: 10 + reagents: + - ReagentId: Fiber + Quantity: 10 + - type: Tag + tags: + - ClothMade + - WhitelistChameleon diff --git a/Resources/Prototypes/Loadouts/neck.yml b/Resources/Prototypes/Loadouts/neck.yml index eb933de29ee..93093b08887 100644 --- a/Resources/Prototypes/Loadouts/neck.yml +++ b/Resources/Prototypes/Loadouts/neck.yml @@ -30,6 +30,30 @@ items: - ClothingNeckScarfStripedZebra +- type: loadout + id: LoadoutNeckBellCollar + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckBellCollar + +- type: loadout + id: LoadoutNeckOldMantle + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckOldMantle + +- type: loadout + id: LoadoutNeckUnathiMantle + category: Neck + cost: 1 + exclusive: true + items: + - ClothingNeckUnathiMantle + #Pride Accessories - type: loadout id: LoadoutItemsPrideLGBTPin diff --git a/Resources/Prototypes/Loadouts/shoes.yml b/Resources/Prototypes/Loadouts/shoes.yml index 3c2e21e631b..67dcaa0c96b 100644 --- a/Resources/Prototypes/Loadouts/shoes.yml +++ b/Resources/Prototypes/Loadouts/shoes.yml @@ -164,3 +164,11 @@ exclusive: true items: - ClothingShoesMiscWhite + +- type: loadout + id: LoadoutShoesClothwarp + category: Shoes + cost: 1 + exclusive: true + items: + - ClothingsClothwarp diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/clothing/clothwarp.yml b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/clothwarp.yml new file mode 100644 index 00000000000..65bc8f9ae66 --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/clothwarp.yml @@ -0,0 +1,13 @@ +- type: constructionGraph + id: ClothingsClothwarp + start: start + graph: + - node: start + edges: + - to: warps + steps: + - material: Cloth + amount: 2 + doAfter: 1 + - node: warps + entity: ClothingsClothwarp diff --git a/Resources/Prototypes/Recipes/Construction/clothing.yml b/Resources/Prototypes/Recipes/Construction/clothing.yml index f1eb270af73..99a6cfb13d3 100644 --- a/Resources/Prototypes/Recipes/Construction/clothing.yml +++ b/Resources/Prototypes/Recipes/Construction/clothing.yml @@ -96,3 +96,14 @@ description: Comfy, yet haunted by the ghosts of ducks you fed bread to as a child. icon: { sprite: Clothing/Shoes/Misc/duck-slippers.rsi, state: icon } objectType: Item + +- type: construction + name: clothwarps + id: ClothingsClothwarp + graph: ClothingsClothwarp + startNode: start + targetNode: warps + category: construction-category-clothing + description: A roll of treated canvas used for wrapping claws or paws. + icon: { sprite: Clothing/Shoes/Misc/clothwarp.rsi, state: icon } + objectType: Item diff --git a/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/equipped-NECK.png b/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/equipped-NECK.png new file mode 100644 index 00000000000..2190dc844db Binary files /dev/null and b/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/equipped-NECK.png differ diff --git a/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/icon.png b/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/icon.png new file mode 100644 index 00000000000..17904840397 Binary files /dev/null and b/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/inhand-left.png b/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/inhand-left.png new file mode 100644 index 00000000000..2d727adbb21 Binary files /dev/null and b/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/inhand-left.png differ diff --git a/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/inhand-right.png b/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/inhand-right.png new file mode 100644 index 00000000000..0e2c555c5c1 Binary files /dev/null and b/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/meta.json b/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/meta.json new file mode 100644 index 00000000000..25dc7b17c84 --- /dev/null +++ b/Resources/Textures/Clothing/Neck/Misc/bellcollar.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by mnemotechnician (GitHub, Frontier) for Frontier Station 14", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-NECK", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Neck/mantles/oldmantle.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/Neck/mantles/oldmantle.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..d317412c9dd Binary files /dev/null and b/Resources/Textures/Clothing/Neck/mantles/oldmantle.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/Neck/mantles/oldmantle.rsi/icon.png b/Resources/Textures/Clothing/Neck/mantles/oldmantle.rsi/icon.png new file mode 100644 index 00000000000..4cf647611dc Binary files /dev/null and b/Resources/Textures/Clothing/Neck/mantles/oldmantle.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Neck/mantles/oldmantle.rsi/meta.json b/Resources/Textures/Clothing/Neck/mantles/oldmantle.rsi/meta.json new file mode 100644 index 00000000000..9c6fab40625 --- /dev/null +++ b/Resources/Textures/Clothing/Neck/mantles/oldmantle.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Neck/mantles/unathimantle.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/Neck/mantles/unathimantle.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..5df12ac9933 Binary files /dev/null and b/Resources/Textures/Clothing/Neck/mantles/unathimantle.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/Neck/mantles/unathimantle.rsi/icon.png b/Resources/Textures/Clothing/Neck/mantles/unathimantle.rsi/icon.png new file mode 100644 index 00000000000..d59144a0524 Binary files /dev/null and b/Resources/Textures/Clothing/Neck/mantles/unathimantle.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Neck/mantles/unathimantle.rsi/meta.json b/Resources/Textures/Clothing/Neck/mantles/unathimantle.rsi/meta.json new file mode 100644 index 00000000000..9c6fab40625 --- /dev/null +++ b/Resources/Textures/Clothing/Neck/mantles/unathimantle.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/OuterClothing/Misc/unathirobe.rsi/equipped-OUTERCLOTHING.png b/Resources/Textures/Clothing/OuterClothing/Misc/unathirobe.rsi/equipped-OUTERCLOTHING.png new file mode 100644 index 00000000000..f470372379d Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Misc/unathirobe.rsi/equipped-OUTERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Misc/unathirobe.rsi/icon.png b/Resources/Textures/Clothing/OuterClothing/Misc/unathirobe.rsi/icon.png new file mode 100644 index 00000000000..54fd0c07413 Binary files /dev/null and b/Resources/Textures/Clothing/OuterClothing/Misc/unathirobe.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/OuterClothing/Misc/unathirobe.rsi/meta.json b/Resources/Textures/Clothing/OuterClothing/Misc/unathirobe.rsi/meta.json new file mode 100644 index 00000000000..9c6fab40625 --- /dev/null +++ b/Resources/Textures/Clothing/OuterClothing/Misc/unathirobe.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/ParadiseSS13/Paradise", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-OUTERCLOTHING", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Shoes/Misc/clothwarp.rsi/equipped-FEET.png b/Resources/Textures/Clothing/Shoes/Misc/clothwarp.rsi/equipped-FEET.png new file mode 100644 index 00000000000..4a3104fead9 Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/Misc/clothwarp.rsi/equipped-FEET.png differ diff --git a/Resources/Textures/Clothing/Shoes/Misc/clothwarp.rsi/equipped-HAND.png b/Resources/Textures/Clothing/Shoes/Misc/clothwarp.rsi/equipped-HAND.png new file mode 100644 index 00000000000..b78a810df85 Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/Misc/clothwarp.rsi/equipped-HAND.png differ diff --git a/Resources/Textures/Clothing/Shoes/Misc/clothwarp.rsi/icon.png b/Resources/Textures/Clothing/Shoes/Misc/clothwarp.rsi/icon.png new file mode 100644 index 00000000000..8f531e890c1 Binary files /dev/null and b/Resources/Textures/Clothing/Shoes/Misc/clothwarp.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Shoes/Misc/clothwarp.rsi/meta.json b/Resources/Textures/Clothing/Shoes/Misc/clothwarp.rsi/meta.json new file mode 100644 index 00000000000..a7542e75bb1 --- /dev/null +++ b/Resources/Textures/Clothing/Shoes/Misc/clothwarp.rsi/meta.json @@ -0,0 +1 @@ +{"version": 1, "license": "CC-BY-SA-3.0", "copyright": "Taken from https://github.com/ParadiseSS13/Paradise/", "size": {"x": 32, "y": 32}, "states": [{"name": "icon"}, {"name": "equipped-FEET", "directions": 4}, {"name": "equipped-HAND", "directions": 4}]}