diff --git a/Content.Client/Entry/IgnoredComponents.cs b/Content.Client/Entry/IgnoredComponents.cs index cd713ae714..83d6e142a2 100644 --- a/Content.Client/Entry/IgnoredComponents.cs +++ b/Content.Client/Entry/IgnoredComponents.cs @@ -18,6 +18,7 @@ namespace Content.Client.Entry "Explosive", "ExplosionResistance", "Vocal", + "Summonable", "OnUseTimerTrigger", "WarpPoint", "EmitSoundOnUse", diff --git a/Content.Server/Bible/BibleSystem.cs b/Content.Server/Bible/BibleSystem.cs index 26f94c67e5..121c44cdb1 100644 --- a/Content.Server/Bible/BibleSystem.cs +++ b/Content.Server/Bible/BibleSystem.cs @@ -2,6 +2,9 @@ using Content.Shared.Interaction; using Content.Shared.Inventory; using Content.Shared.MobState.Components; using Content.Shared.Damage; +using Content.Shared.Verbs; +using Content.Shared.Tag; +using Content.Shared.ActionBlocker; using Content.Server.Cooldown; using Content.Server.Bible.Components; using Content.Server.Popups; @@ -20,12 +23,15 @@ namespace Content.Server.Bible [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly TagSystem _tagSystem = default!; + [Dependency] private readonly ActionBlockerSystem _blocker = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnAfterInteract); + SubscribeLocalEvent>(AddSummonVerb); } private void OnAfterInteract(EntityUid uid, BibleComponent component, AfterInteractEvent args) @@ -52,20 +58,20 @@ namespace Content.Server.Bible { _popupSystem.PopupEntity(Loc.GetString("bible-sizzle"), args.User, Filter.Entities(args.User)); - SoundSystem.Play(Filter.Pvs(args.User), "/Audio/Effects/lightburn.ogg", args.User); + SoundSystem.Play(Filter.Pvs(args.User), component.SizzleSoundPath.GetSound(), args.User); _damageableSystem.TryChangeDamage(args.User, component.DamageOnUntrainedUse, true); return; } - if (!_invSystem.TryGetSlotEntity(args.Target.Value, "head", out var entityUid)) + if (!_invSystem.TryGetSlotEntity(args.Target.Value, "head", out var entityUid) && !_tagSystem.HasTag(args.Target.Value, "Familiar")) { if (_random.Prob(component.FailChance)) { - var othersFailMessage = Loc.GetString("bible-heal-fail-others", ("user", args.User),("target", args.Target),("bible", uid)); + var othersFailMessage = Loc.GetString(component.LocPrefix + "-heal-fail-others", ("user", args.User),("target", args.Target),("bible", uid)); _popupSystem.PopupEntity(othersFailMessage, args.User, Filter.Pvs(args.User).RemoveWhereAttachedEntity(puid => puid == args.User)); - var selfFailMessage = Loc.GetString("bible-heal-fail-self", ("target", args.Target),("bible", uid)); + var selfFailMessage = Loc.GetString(component.LocPrefix + "-heal-fail-self", ("target", args.Target),("bible", uid)); _popupSystem.PopupEntity(selfFailMessage, args.User, Filter.Entities(args.User)); SoundSystem.Play(Filter.Pvs(args.Target.Value), "/Audio/Effects/hit_kick.ogg", args.User); @@ -74,15 +80,52 @@ namespace Content.Server.Bible } } - var othersMessage = Loc.GetString("bible-heal-success-others", ("user", args.User),("target", args.Target),("bible", uid)); + var othersMessage = Loc.GetString(component.LocPrefix + "-heal-success-others", ("user", args.User),("target", args.Target),("bible", uid)); _popupSystem.PopupEntity(othersMessage, args.User, Filter.Pvs(args.User).RemoveWhereAttachedEntity(puid => puid == args.User)); - var selfMessage = Loc.GetString("bible-heal-success-self", ("target", args.Target),("bible", uid)); + var selfMessage = Loc.GetString(component.LocPrefix + "-heal-success-self", ("target", args.Target),("bible", uid)); _popupSystem.PopupEntity(selfMessage, args.User, Filter.Entities(args.User)); - SoundSystem.Play(Filter.Pvs(args.Target.Value), "/Audio/Effects/holy.ogg", args.User); + SoundSystem.Play(Filter.Pvs(args.Target.Value), component.HealSoundPath.GetSound(), args.User); _damageableSystem.TryChangeDamage(args.Target.Value, component.Damage, true); } + private void AddSummonVerb(EntityUid uid, SummonableComponent component, GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess || component.AlreadySummoned || component.SpecialItemPrototype == null) + return; + + if (component.RequiresBibleUser && !HasComp(args.User)) + return; + + AlternativeVerb verb = new() + { + Act = () => + { + TransformComponent? position = Comp(args.User); + AttemptSummon(component, args.User, position); + }, + Text = Loc.GetString("bible-summon-verb"), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void AttemptSummon(SummonableComponent component, EntityUid user, TransformComponent? position) + { + if (component.AlreadySummoned || component.SpecialItemPrototype == null) + return; + if (component.RequiresBibleUser && !HasComp(user)) + return; + if (!Resolve(user, ref position)) + return; + if (component.Deleted || Deleted(component.Owner)) + return; + if (!_blocker.CanInteract(user, component.Owner)) + return; + + EntityManager.SpawnEntity(component.SpecialItemPrototype, position.Coordinates); + component.AlreadySummoned = true; + } } } diff --git a/Content.Server/Bible/Components/BibleComponent.cs b/Content.Server/Bible/Components/BibleComponent.cs index d6b42a2e5c..e4af9ebc0a 100644 --- a/Content.Server/Bible/Components/BibleComponent.cs +++ b/Content.Server/Bible/Components/BibleComponent.cs @@ -1,18 +1,13 @@ -using System; -using Robust.Shared.Analyzers; -using Robust.Shared.GameObjects; using Content.Shared.Damage; -using Content.Shared.Damage.Prototypes; -using Robust.Shared.Serialization.Manager.Attributes; +using Content.Shared.Sound; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -using Robust.Shared.ViewVariables; +using Robust.Shared.Prototypes; namespace Content.Server.Bible.Components { [RegisterComponent] public sealed class BibleComponent : Component { - // Damage that will be healed on a success [DataField("damage", required: true)] [ViewVariables(VVAccess.ReadWrite)] @@ -33,6 +28,15 @@ namespace Content.Server.Bible.Components public TimeSpan LastAttackTime; public TimeSpan CooldownEnd; + [DataField("cooldownTime")] public float CooldownTime { get; } = 5f; + + [DataField("sizzleSound")] + public SoundSpecifier SizzleSoundPath = new SoundPathSpecifier("/Audio/Effects/lightburn.ogg"); + [DataField("healSound")] + public SoundSpecifier HealSoundPath = new SoundPathSpecifier("/Audio/Effects/holy.ogg"); + + [DataField("locPrefix")] + public string LocPrefix = "bible"; } } diff --git a/Content.Server/Bible/Components/SummonableComponent.cs b/Content.Server/Bible/Components/SummonableComponent.cs new file mode 100644 index 0000000000..20acff747a --- /dev/null +++ b/Content.Server/Bible/Components/SummonableComponent.cs @@ -0,0 +1,23 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.Prototypes; + +namespace Content.Server.Bible.Components +{ + /// + /// This lets you summon a mob or item with an alternative verb on the item + /// + [RegisterComponent] + public sealed class SummonableComponent : Component + { + /// + /// Used for a special item only the Chaplain can summon. Usually a mob, but supports regular items too. + /// + [DataField("specialItem", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? SpecialItemPrototype = null; + public bool AlreadySummoned = false; + + [DataField("requriesBibleUser")] + public bool RequiresBibleUser = true; + + } +} diff --git a/Content.Server/VendingMachines/VendingMachineComponent.cs b/Content.Server/VendingMachines/VendingMachineComponent.cs index 0c5e9d876e..19b3745947 100644 --- a/Content.Server/VendingMachines/VendingMachineComponent.cs +++ b/Content.Server/VendingMachines/VendingMachineComponent.cs @@ -9,6 +9,7 @@ using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.ViewVariables; using Content.Server.VendingMachines.systems; using static Content.Shared.Wires.SharedWiresComponent; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.VendingMachines { @@ -16,9 +17,10 @@ namespace Content.Server.VendingMachines public sealed class VendingMachineComponent : SharedVendingMachineComponent, IWires { public bool Ejecting; + public bool Emagged = false; public TimeSpan AnimationDuration = TimeSpan.Zero; - [DataField("pack")] - public string PackPrototypeId = string.Empty; + [ViewVariables] [DataField("pack", customTypeSerializer:typeof(PrototypeIdSerializer))] public string PackPrototypeId = string.Empty; + [ViewVariables] [DataField("emagPack", customTypeSerializer:typeof(PrototypeIdSerializer))] public string EmagPackPrototypeId = string.Empty; public string SpriteName = ""; public bool Broken; /// diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs index 6ea90cce20..c6c18dccf4 100644 --- a/Content.Server/VendingMachines/VendingMachineSystem.cs +++ b/Content.Server/VendingMachines/VendingMachineSystem.cs @@ -10,6 +10,7 @@ using Robust.Server.GameObjects; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Content.Shared.Acts; +using Content.Shared.Emag.Systems; using static Content.Shared.VendingMachines.SharedVendingMachineComponent; using Content.Shared.Throwing; @@ -31,6 +32,7 @@ namespace Content.Server.VendingMachines.systems SubscribeLocalEvent(OnInventoryRequestMessage); SubscribeLocalEvent(OnInventoryEjectMessage); SubscribeLocalEvent(OnBreak); + SubscribeLocalEvent(OnEmagged); } private void OnComponentInit(EntityUid uid, VendingMachineComponent component, ComponentInit args) @@ -75,6 +77,16 @@ namespace Content.Server.VendingMachines.systems TryUpdateVisualState(uid, VendingMachineVisualState.Broken, vendComponent); } + private void OnEmagged(EntityUid uid, VendingMachineComponent component, GotEmaggedEvent args) + { + if (component.Emagged || component.EmagPackPrototypeId == string.Empty) + return; + + AddVendEntries(component, component.EmagPackPrototypeId); + component.Emagged = true; + args.Handled = true; + } + public bool IsPowered(EntityUid uid, VendingMachineComponent? vendComponent = null) { if (!Resolve(uid, ref vendComponent)) @@ -121,6 +133,27 @@ namespace Content.Server.VendingMachines.systems vendComponent.Inventory = inventory; } + /// + /// Add more entries for any reason AFTER initialization (emag, machine upgrades, etc) + /// + public void AddVendEntries(VendingMachineComponent component, string pack) + { + if (!_prototypeManager.TryIndex(pack, out VendingMachineInventoryPrototype? packPrototype)) + { + Logger.Error($"Pack has no valid inventory prototype: {pack}"); + return; + } + + foreach (var (id, amount) in packPrototype.StartingInventory) + { + if (!_prototypeManager.TryIndex(id, out EntityPrototype? prototype)) + { + continue; + } + component.Inventory.Add(new VendingMachineInventoryEntry(id, amount)); + } + } + public void Deny(EntityUid uid, VendingMachineComponent? vendComponent = null) { if (!Resolve(uid, ref vendComponent)) diff --git a/Resources/Locale/en-US/chapel/bible.ftl b/Resources/Locale/en-US/chapel/bible.ftl index 276d7d0b24..dc49e62972 100644 --- a/Resources/Locale/en-US/chapel/bible.ftl +++ b/Resources/Locale/en-US/chapel/bible.ftl @@ -1,5 +1,10 @@ -bible-heal-success-self = You hit {THE($target)} with {THE($bible)}, and their wounds close in a flash of holy light! -bible-heal-success-others = {CAPITALIZE(THE($user))} hits {THE($target)} with {THE($bible)}, and their wounds close in a flash of holy light! -bible-heal-fail-self = You hit {THE($target)} with {THE($bible)}, and it lands with a sad thwack, dazing them! -bible-heal-fail-others = {CAPITALIZE(THE($user))} hits {THE($target)} with {THE($bible)}, and it lands with a sad thack, dazing them! +bible-heal-success-self = You hit {THE($target)} with {THE($bible)}, and {POSS-ADJ($target)} wounds close in a flash of holy light! +bible-heal-success-others = {CAPITALIZE(THE($user))} hits {THE($target)} with {THE($bible)}, and {POSS-ADJ($target)} wounds close in a flash of holy light! +bible-heal-fail-self = You hit {THE($target)} with {THE($bible)}, and it lands with a sad thwack, dazing {OBJECT($target)}! +bible-heal-fail-others = {CAPITALIZE(THE($user))} hits {THE($target)} with {THE($bible)}, and it lands with a sad thack, dazing {OBJECT($target)}! bible-sizzle = The book sizzles in your hands! +bible-summon-verb = Summon familiar +necro-heal-success-self = You hit {THE($target)} with {THE($bible)}, and {POSS-ADJ($target)} flesh warps as it melts! +necro-heal-success-others = {CAPITALIZE(THE($user))} hits {THE($target)} with {THE($bible)}, and {POSS-ADJ($target)} flesh warps as it melts! +necro-heal-fail-self = You hit {THE($target)} with {THE($bible)}, and it lands with a sad thwack, failing to smite {OBJECT($target)}. +necro-heal-fail-others = {CAPITALIZE(THE($user))} hits {THE($target)} with {THE($bible)}, and it lands with a sad thack, failing to smite {OBJECT($target)}. diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml index c35bc66387..e4ca117a07 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chapel.yml @@ -7,16 +7,25 @@ ClothingUniformJumpskirtChaplain: 2 ClothingOuterHoodieChaplain: 1 ClothingOuterHoodieBlack: 1 - ClothingOuterRobesCult: 1 - ClothingOuterArmorCult: 1 ClothingHeadHatHoodChaplainHood: 1 - ClothingHeadHatHoodCulthood: 1 ClothingHeadHatHoodNunHood: 1 ClothingHeadHatFez: 1 ClothingHeadHatPlaguedoctor: 1 ClothingHeadHatWitch: 1 ClothingHeadHatWitch1: 1 - ClothingHeadHelmetCult: 1 - ClothingHeadsetService: 2 ClothingOuterPlagueSuit: 1 ClothingMaskPlague: 1 + ClothingHeadsetService: 2 + +- type: vendingMachineInventory + id: PietyVendEmagInventory + spriteName: chapel + startingInventory: + ClothingOuterArmorCult: 1 + ClothingHeadHelmetCult: 1 + ClothingOuterRobesCult: 3 + ClothingHeadHatHoodCulthood: 3 + ClothingShoesCult: 4 + BedsheetCult: 4 + BibleNecronomicon: 1 + diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 50e6d50b5c..98bfe724d2 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -83,6 +83,18 @@ Cold: 1.5 Poison: 0.8 +- type: damageModifierSet + id: Infernal + coefficients: + Blunt: 0.8 + Slash: 0.8 + Piercing: 0.8 + Cold: 0.8 + Heat: 0.2 +# Holy: 3 If we ever get some holy or magic sort of damage type they should be vulnerable + flatReductions: + Heat: 3 + - type: damageModifierSet id: Scale # Skin tougher, bones weaker, strong stomachs, cold-blooded (kindof) coefficients: diff --git a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml index 65a4019217..b43e6e69fe 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml @@ -16,7 +16,7 @@ coefficients: Blunt: 0.5 Slash: 0.8 - Piercing: 0.8 + Piercing: 0.8 - type: entity parent: ClothingHeadEVAHelmetBase @@ -41,6 +41,13 @@ - type: Clothing sprite: Clothing/Head/Helmets/cult.rsi - type: IngestionBlocker + - type: Armor + modifiers: + coefficients: + Blunt: 0.8 + Slash: 0.8 + Piercing: 0.9 + Heat: 0.8 - type: entity parent: ClothingHeadEVAHelmetBase @@ -248,4 +255,3 @@ Slash: 0.5 Piercing: 0.5 Heat: 0.9 - diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 5d84fb7aeb..b4d79e0721 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -49,6 +49,8 @@ flavorKind: organic - type: Bloodstream bloodMaxVolume: 50 + - type: ReplacementAccent + accent: mouse - type: entity name: bee diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index c4dbdf314e..4cf2f5db58 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -88,6 +88,72 @@ - type: Grammar attributes: gender: epicene + - type: Bloodstream + bloodReagent: DemonsBlood + bloodlossDamage: + types: + Bloodloss: + 1 + bloodlossHealDamage: + types: + Bloodloss: + -0.25 + - type: Damageable + damageContainer: Biological + damageModifierSet: Infernal + - type: Temperature + heatDamageThreshold: 4000 #They come from hell, so... + coldDamageThreshold: 260 + currentTemperature: 310.15 + coldDamage: + types: + Cold : 1 #per second, scales with temperature & other constants + specificHeat: 42 + heatDamage: + types: + Heat : 1 #per second, scales with temperature & other constants + +- type: entity + name: Cerberus + parent: MobCorgiNarsi + id: MobCorgiCerberus + description: This pupper is not wholesome. + components: + - type: GhostTakeoverAvailable + makeSentient: true + name: Cerberus, Evil Familiar + description: Obey your master. Spread chaos. + rules: You are an intelligent, demonic dog. Try to help the chaplain and any of his flock. As an antagonist, you're otherwise unrestrained. + - type: UnarmedCombat + range: 1.5 + arcwidth: 0 + arc: bite + damage: + types: + Piercing: 8 + Slash: 7 + - type: UtilityAI + behaviorSets: + - Idle + - type: AiFactionTag + factions: + - SimpleNeutral + - type: InteractionPopup + successChance: 0.5 + interactSuccessString: petting-success-corrupted-corgi + interactFailureString: petting-failure-corrupted-corgi + - type: MobState + thresholds: + 0: !type:NormalMobState {} + 80: !type:CriticalMobState {} + 160: !type:DeadMobState {} + - type: Grammar + attributes: + gender: male + proper: true + - type: Tag + tags: + - Familiar - type: entity name: Ian @@ -135,6 +201,25 @@ proper: true gender: male +- type: entity + name: Remilia + parent: MobBat + id: MobBatRemilia + description: The chaplain's familiar. Likes fruit. + components: + - type: GhostTakeoverAvailable + makeSentient: true + name: Remilia, the chaplain's familiar + description: Obey your master. Eat fruit. + rules: Follow the chaplain around. Don't cause any trouble unless the chaplain tells you to. + - type: Grammar + attributes: + gender: female + proper: true + - type: Tag + tags: + - Familiar + - type: entity name: Lisa parent: MobCorgi diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml index ad9fb4393d..778db8cabd 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml @@ -68,6 +68,8 @@ types: Bloodloss: -0.25 + - type: DrawableSolution + solution: bloodstream - type: Damageable damageContainer: Biological - type: AtmosExposed @@ -182,6 +184,5 @@ heatDamage: types: Heat : 1 #per second, scales with temperature & other constants - - type: Bloodstream bloodMaxVolume: 150 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml index b1acad0c09..0f8cfdefb7 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml @@ -16,6 +16,8 @@ damageOnUntrainedUse: ## What a non-chaplain takes when attempting to heal someone groups: Burn: 30 + - type: Summonable + specialItem: MobBatRemilia - type: ItemCooldown - type: Sprite netsync: false @@ -30,3 +32,34 @@ storageSoundCollection: collection: storageRustle +- type: entity + parent: Bible + name: necronomicon + description: "There's a note: Klatuu, Verata, Nikto -- Don't forget it again!" + id: BibleNecronomicon + components: + - type: Bible + damage: + groups: + Caustic: 20 ## ~15 dps + damageOnFail: + groups: + Brute: 15 + Airloss: 25 + damageOnUntrainedUse: + groups: + Caustic: 50 + failChance: 0 + locPrefix: "necro" + healSound: "/Audio/Effects/lightburn.ogg" + cooldownTime: 1.3 + - type: Summonable + specialItem: MobCorgiCerberus + - type: Sprite + netsync: false + sprite: Objects/Specific/Chapel/necronomicon.rsi + state: icon + - type: Item + size: 15 + sprite: Objects/Specific/Chapel/necronomicon.rsi + prefix: inhand diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index 786b279041..33a517b7fd 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -924,6 +924,7 @@ components: - type: VendingMachine pack: PietyVendInventory + emagPack: PietyVendEmagInventory - type: Sprite sprite: Structures/Machines/VendingMachines/chapdrobe.rsi layers: diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index b917aa25a6..4edcb7aa4f 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -135,6 +135,9 @@ - type: Tag id: ExplosivePassable +- type: Tag + id: Familiar + - type: Tag id: FireAlarmElectronics diff --git a/Resources/Textures/Objects/Specific/Chapel/necronomicon.rsi/icon.png b/Resources/Textures/Objects/Specific/Chapel/necronomicon.rsi/icon.png new file mode 100644 index 0000000000..c6743ce420 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Chapel/necronomicon.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Specific/Chapel/necronomicon.rsi/inhand-left.png b/Resources/Textures/Objects/Specific/Chapel/necronomicon.rsi/inhand-left.png new file mode 100644 index 0000000000..2ef7ed3db8 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Chapel/necronomicon.rsi/inhand-left.png differ diff --git a/Resources/Textures/Objects/Specific/Chapel/necronomicon.rsi/inhand-right.png b/Resources/Textures/Objects/Specific/Chapel/necronomicon.rsi/inhand-right.png new file mode 100644 index 0000000000..d7fb4bfd97 Binary files /dev/null and b/Resources/Textures/Objects/Specific/Chapel/necronomicon.rsi/inhand-right.png differ diff --git a/Resources/Textures/Objects/Specific/Chapel/necronomicon.rsi/meta.json b/Resources/Textures/Objects/Specific/Chapel/necronomicon.rsi/meta.json new file mode 100644 index 0000000000..a253b74d97 --- /dev/null +++ b/Resources/Textures/Objects/Specific/Chapel/necronomicon.rsi/meta.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +}