diff --git a/Content.Server/Disease/Components/DiseaseCarrierComponent.cs b/Content.Server/Disease/Components/DiseaseCarrierComponent.cs index e9280235f3..56c71b46bc 100644 --- a/Content.Server/Disease/Components/DiseaseCarrierComponent.cs +++ b/Content.Server/Disease/Components/DiseaseCarrierComponent.cs @@ -1,13 +1,14 @@ using System.Linq; using Content.Shared.Disease; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; namespace Content.Server.Disease.Components { - [RegisterComponent] /// - /// Allows the enity to be infected with diseases. + /// Allows the entity to be infected with diseases. /// Please use only on mobs. /// + [RegisterComponent] public sealed class DiseaseCarrierComponent : Component { /// @@ -15,22 +16,33 @@ namespace Content.Server.Disease.Components /// [ViewVariables(VVAccess.ReadWrite)] public List Diseases = new(); + /// /// The carrier's resistance to disease /// [DataField("diseaseResist")] [ViewVariables(VVAccess.ReadWrite)] public float DiseaseResist = 0f; + /// /// Diseases the carrier has had, used for immunity. - /// + /// [ViewVariables(VVAccess.ReadWrite)] public List PastDiseases = new(); + /// /// All the diseases the carrier has or has had. /// Checked against when trying to add a disease - /// + /// [ViewVariables(VVAccess.ReadWrite)] public List AllDiseases => PastDiseases.Concat(Diseases).ToList(); + + /// + /// A list of diseases which the entity does not + /// exhibit direct symptoms from. They still transmit + /// these diseases, just without symptoms. + /// + [ViewVariables, DataField("carrierDiseases", customTypeSerializer: typeof(PrototypeIdHashSetSerializer))] + public HashSet? CarrierDiseases; } } diff --git a/Content.Server/Disease/DiseaseSystem.cs b/Content.Server/Disease/DiseaseSystem.cs index 97367115df..f55ee6b03d 100644 --- a/Content.Server/Disease/DiseaseSystem.cs +++ b/Content.Server/Disease/DiseaseSystem.cs @@ -96,17 +96,23 @@ namespace Content.Server.Disease for (var i = 0; i < carrierComp.Diseases.Count; i++) //this is a for-loop so that it doesn't break when new diseases are added { var disease = carrierComp.Diseases[i]; - - var args = new DiseaseEffectArgs(carrierComp.Owner, disease, EntityManager); disease.Accumulator += frameTime; - if (disease.Accumulator >= disease.TickTime) + + if (disease.Accumulator < disease.TickTime) continue; + + // if the disease is on the silent disease list, don't do effects + var doEffects = carrierComp.CarrierDiseases?.Contains(disease.ID) != true; + var args = new DiseaseEffectArgs(carrierComp.Owner, disease, EntityManager); + disease.Accumulator -= disease.TickTime; + + foreach (var cure in disease.Cures) + { + if (cure.Cure(args)) + CureDisease(carrierComp, disease); + } + + if (doEffects) { - disease.Accumulator -= disease.TickTime; - foreach (var cure in disease.Cures) - { - if (cure.Cure(args)) - CureDisease(carrierComp, disease); - } foreach (var effect in disease.Effects) { if (_random.Prob(effect.Probability)) @@ -383,6 +389,14 @@ namespace Content.Server.Disease TryAddDisease(carrier.Owner, disease, carrier); } + public void TryInfect(DiseaseCarrierComponent carrier, string? disease, float chance = 0.7f, bool forced = false) + { + if (disease == null || !_prototypeManager.TryIndex(disease, out var d)) + return; + + TryInfect(carrier, d, chance, forced); + } + /// /// Plays a sneeze/cough popup if applicable /// and then tries to infect anyone in range diff --git a/Content.Server/RatKing/RatKingComponent.cs b/Content.Server/RatKing/RatKingComponent.cs new file mode 100644 index 0000000000..4685d14cf2 --- /dev/null +++ b/Content.Server/RatKing/RatKingComponent.cs @@ -0,0 +1,54 @@ +using Content.Shared.Actions.ActionTypes; +using Content.Shared.Disease; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Server.RatKing +{ + [RegisterComponent] + public sealed class RatKingComponent : Component + { + /// + /// The action for the Raise Army ability + /// + [DataField("actionRaiseArmy", required: true)] + public InstantAction ActionRaiseArmy = new(); + + /// + /// The amount of hunger one use of Raise Army consumes + /// + [ViewVariables(VVAccess.ReadWrite), DataField("hungerPerArmyUse", required: true)] + public float HungerPerArmyUse = 25f; + + /// + /// The entity prototype of the mob that Raise Army summons + /// + [ViewVariables(VVAccess.ReadWrite), DataField("armyMobSpawnId", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ArmyMobSpawnId = "MobRatServant"; + + /// + /// The action for the Domain ability + /// + [ViewVariables, DataField("actionDomain", required: true)] + public InstantAction ActionDomain = new(); + + /// + /// The amount of hunger one use of Domain consumes + /// + [ViewVariables(VVAccess.ReadWrite), DataField("hungerPerDomainUse", required: true)] + public float HungerPerDomainUse = 50f; + + /// + /// The disease prototype id that the Domain ability spreads + /// + [ViewVariables, DataField("domainDiseaseId", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string DomainDiseaseId = "Plague"; + + /// + /// The range of the Domain ability. + /// + [ViewVariables(VVAccess.ReadWrite), DataField("domainRange")] + public float DomainRange = 3f; + + } +}; diff --git a/Content.Server/RatKing/RatKingSystem.cs b/Content.Server/RatKing/RatKingSystem.cs new file mode 100644 index 0000000000..c39dd090ad --- /dev/null +++ b/Content.Server/RatKing/RatKingSystem.cs @@ -0,0 +1,93 @@ +using Content.Server.Actions; +using Content.Server.Disease; +using Content.Server.Disease.Components; +using Content.Server.Nutrition.Components; +using Content.Server.Popups; +using Content.Shared.Actions; +using Robust.Shared.Player; + +namespace Content.Server.RatKing +{ + public sealed class RatKingSystem : EntitySystem + { + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly ActionsSystem _action = default!; + [Dependency] private readonly DiseaseSystem _disease = default!; + [Dependency] private readonly EntityLookupSystem _lookup = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStartup); + + SubscribeLocalEvent(OnRaiseArmy); + SubscribeLocalEvent(OnDomain); + } + + private void OnStartup(EntityUid uid, RatKingComponent component, ComponentStartup args) + { + _action.AddAction(uid, component.ActionRaiseArmy, null); + _action.AddAction(uid, component.ActionDomain, null); + } + + /// + /// Summons an allied rat servant at the King, costing a small amount of hunger + /// + private void OnRaiseArmy(EntityUid uid, RatKingComponent component, RatKingRaiseArmyActionEvent args) + { + if (args.Handled) + return; + + if (!TryComp(uid, out var hunger)) + return; + + //make sure the hunger doesn't go into the negatives + if (hunger.CurrentHunger < component.HungerPerArmyUse) + { + _popup.PopupEntity(Loc.GetString("rat-king-too-hungry"), uid, Filter.Entities(uid)); + return; + } + args.Handled = true; + hunger.CurrentHunger -= component.HungerPerArmyUse; + Spawn(component.ArmyMobSpawnId, Transform(uid).Coordinates); //spawn the little mouse boi + } + + /// + /// Gets all of the nearby disease-carrying entities in a radius + /// and gives them the specified disease. It has a hunger cost as well + /// + private void OnDomain(EntityUid uid, RatKingComponent component, RatKingDomainActionEvent args) + { + if (args.Handled) + return; + + if (!TryComp(uid, out var hunger)) + return; + + //make sure the hunger doesn't go into the negatives + if (hunger.CurrentHunger < component.HungerPerDomainUse) + { + _popup.PopupEntity(Loc.GetString("rat-king-too-hungry"), uid, Filter.Entities(uid)); + return; + } + args.Handled = true; + hunger.CurrentHunger -= component.HungerPerDomainUse; + + _popup.PopupEntity(Loc.GetString("rat-king-domain-popup"), uid, Filter.Pvs(uid, default, EntityManager)); + + var tstalker = GetEntityQuery(); + foreach (var entity in _lookup.GetEntitiesInRange(uid, component.DomainRange)) //go through all of them, filtering only those in range that are not the king itself + { + if (entity == uid) + continue; + + if (tstalker.TryGetComponent(entity, out var diseasecomp)) + _disease.TryInfect(diseasecomp, component.DomainDiseaseId); //infect them with w/e disease + } + } + } + + public sealed class RatKingRaiseArmyActionEvent : InstantActionEvent { }; + public sealed class RatKingDomainActionEvent : InstantActionEvent { }; +}; diff --git a/Content.Server/StationEvents/Events/MouseMigration.cs b/Content.Server/StationEvents/Events/MouseMigration.cs new file mode 100644 index 0000000000..ee831de699 --- /dev/null +++ b/Content.Server/StationEvents/Events/MouseMigration.cs @@ -0,0 +1,50 @@ +using System.Linq; +using Content.Server.StationEvents.Components; +using Robust.Shared.Random; + +namespace Content.Server.StationEvents.Events; + +public sealed class MouseMigration : StationEvent +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + + public static List SpawnedPrototypeChoices = new List() //we double up for that ez fake probability + {"MobMouse", "MobMouse1", "MobMouse2", "MobRatServant"}; + + public override string Name => "MouseMigration"; + + public override string? StartAnnouncement => + Loc.GetString("station-event-mouse-migration-announcement"); + + public override int EarliestStart => 30; + + public override int MinimumPlayers => 35; //this just ensures that it doesn't spawn on lowpop maps. + + public override float Weight => WeightLow; + + public override int? MaxOccurrences => 1; + + protected override float StartAfter => 30f; + + protected override float EndAfter => 60; + + public override void Startup() + { + base.Startup(); + + var spawnLocations = _entityManager.EntityQuery().ToList(); + _random.Shuffle(spawnLocations); + + var spawnAmount = _random.Next(7, 15); // A small colony of critters. + + for (int i = 0; i < spawnAmount && i < spawnLocations.Count - 1; i++) + { + var spawnChoice = _random.Pick(SpawnedPrototypeChoices); + if (_random.Prob(0.01f) || i == 0) //small chance for multiple, but always at least 1 + spawnChoice = "MobRatKing"; + + _entityManager.SpawnEntity(spawnChoice, spawnLocations[i].Item2.Coordinates); + } + } +} diff --git a/Resources/Locale/en-US/animals/rat-king/rat-king.ftl b/Resources/Locale/en-US/animals/rat-king/rat-king.ftl new file mode 100644 index 0000000000..35354daa08 --- /dev/null +++ b/Resources/Locale/en-US/animals/rat-king/rat-king.ftl @@ -0,0 +1,8 @@ +rat-king-raise-army-name = Raise Army +rat-king-raise-army-description = Spend some hunger to summon an allied rat to help defend you. + +rat-king-domain-name = Rat King's Domain +rat-king-domain-description = Spend some hunger to infect those around you with the plague. +rat-king-domain-popup = A cloud of plague is released into the air! + +rat-king-too-hungry = You are too hungry to use this ability! \ No newline at end of file diff --git a/Resources/Locale/en-US/station-events/events/mouse-migration.ftl b/Resources/Locale/en-US/station-events/events/mouse-migration.ftl new file mode 100644 index 0000000000..98a86ca153 --- /dev/null +++ b/Resources/Locale/en-US/station-events/events/mouse-migration.ftl @@ -0,0 +1 @@ +station-event-mouse-migration-announcement = We have detected an oncoming migration of rodents to the station. Please stay out of maintenance tunnels and try and avoid excessive contact. \ No newline at end of file diff --git a/Resources/Prototypes/Diseases/infectious.yml b/Resources/Prototypes/Diseases/infectious.yml index 067ce166b6..58f222c1f3 100644 --- a/Resources/Prototypes/Diseases/infectious.yml +++ b/Resources/Prototypes/Diseases/infectious.yml @@ -168,6 +168,31 @@ - !type:DiseaseReagentCure reagent: DemonsBlood +- type: disease + id: Plague + name: plague + cureResist: 0.1 + effects: + - !type:DiseaseVomit + probability: 0.005 + - !type:DiseasePopUp + probability: 0.025 + - !type:DiseaseSnough + probability: 0.025 + snoughMessage: disease-cough + snoughSound: + collection: Coughs + - !type:DiseaseHealthChange + probability: 0.05 + damage: + types: + Poison: 2 + cures: + - !type:DiseaseBedrestCure + maxLength: 120 + - !type:DiseaseJustWaitCure + maxLength: 240 + - type: disease id: OwOnavirus name: OwOnavirus diff --git a/Resources/Prototypes/Entities/Clothing/Head/misc.yml b/Resources/Prototypes/Entities/Clothing/Head/misc.yml index 915c43b47f..cdbba6024d 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/misc.yml @@ -112,6 +112,19 @@ - type: Clothing sprite: Clothing/Head/Misc/cone.rsi +- type: entity + parent: ClothingHeadBase + id: ClothingHeadHatFancyCrown + name: fancy crown + description: It smells like dead rat. + components: + - type: Sprite + sprite: Clothing/Head/Misc/fancycrown.rsi + - type: Clothing + sprite: Clothing/Head/Misc/fancycrown.rsi + - type: MobPrice + price: 3000 + - type: entity parent: ClothingHeadBase id: ClothingHeadHatCatEars diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml new file mode 100644 index 0000000000..c6aa09c805 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -0,0 +1,189 @@ +- type: entity + name: Rat King + id: MobRatKing + parent: SimpleMobBase + description: He's da rat. He make da roolz. + components: + - type: CombatMode + - type: MovementSpeedModifier + baseWalkSpeed : 3.75 + baseSprintSpeed : 3.75 + - type: UtilityAI + behaviorSets: + - Idle + - UnarmedAttackHostiles + - type: Reactive + groups: + Flammable: [Touch] + Extinguish: [Touch] + - type: AiFactionTag + factions: + - SimpleHostile + - type: Sprite + drawdepth: Mobs + sprite: Mobs/Animals/regalrat.rsi + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: regalrat + - type: Physics + bodyType: KinematicController + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.25 + mass: 120 + mask: + - MobMask + layer: + - MobLayer + - type: MobState + thresholds: + 0: !type:NormalMobState {} + 150: !type:CriticalMobState {} + 200: !type:DeadMobState {} + - type: MeleeWeapon + range: 1 + arcwidth: 0 + arc: claw + damage: + types: + Slash: 12 + Piercing: 8 + - type: Appearance + visuals: + - type: DamageStateVisualizer + rotate: true + normal: regalrat + crit: dead + dead: dead + - type: Puller + - type: GhostTakeoverAvailable + makeSentient: true + name: Rat King + description: You are the Rat King, scavenge food in order to produce rat minions to do your bidding. + rules: You are an antagonist, scavenge, attack, and grow your hoarde! + - type: Tag + tags: + - CannotSuicide + - DoorBumpOpener + - FootstepSound + - type: NoSlip + - type: RatKing + actionRaiseArmy: + useDelay: 4 + icon: Interface/Actions/ratKingArmy.png + name: rat-king-raise-army-name + description: rat-king-raise-army-description + itemIconStyle: NoItem + event: !type:RatKingRaiseArmyActionEvent + hungerPerArmyUse: 25 + actionDomain: + useDelay: 10 + icon: Interface/Actions/ratKingDomain.png + name: rat-king-domain-name + description: rat-king-domain-description + itemIconStyle: NoItem + event: !type:RatKingDomainActionEvent + hungerPerDomainUse: 50 + - type: Access #he's so baller he gets his own access. NT got nothing on him + tags: + - Maintenance + - Service + - type: Butcherable + spawned: + - id: ClothingHeadHatFancyCrown #how did that get there? + amount: 1 + - type: DiseaseCarrier + carrierDiseases: + - Plague + - type: SlowOnDamage + speedModifierThresholds: + 50: 0.9 + 75: 0.8 + 100: 0.7 + - type: MobPrice + price: 2500 # rat wealth + +- type: entity + name: Rat Servant + id: MobRatServant + parent: SimpleMobBase + description: He's da mini rat. He don't make da roolz. + components: + - type: CombatMode + - type: MovementSpeedModifier + baseWalkSpeed : 4 + baseSprintSpeed : 4 + - type: UtilityAI + behaviorSets: + - Idle + - UnarmedAttackHostiles + - type: Reactive + groups: + Flammable: [Touch] + Extinguish: [Touch] + - type: AiFactionTag + factions: + - SimpleHostile + - type: Sprite + drawdepth: SmallMobs + sprite: Mobs/Animals/mouse.rsi + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: mouse-3 + - type: Physics + bodyType: KinematicController + - type: Fixtures + fixtures: + - shape: + !type:PhysShapeCircle + radius: 0.2 + mass: 10 + mask: + - SmallMobMask + layer: + - SmallMobLayer + - type: MobState + thresholds: + 0: !type:NormalMobState {} + 25: !type:CriticalMobState {} + 50: !type:DeadMobState {} + - type: MeleeWeapon + range: 1 + arcwidth: 0 + arc: claw + damage: + types: + Slash: 5 + Piercing: 2 + - type: Appearance + visuals: + - type: DamageStateVisualizer + rotate: true + normal: mouse-3 + crit: dead-3 + dead: splat-3 + - type: Puller + - type: DiseaseCarrier + carrierDiseases: + - Plague + - type: Vocal + # mice are gender neutral who cares + maleScream: /Audio/Animals/mouse_squeak.ogg + femaleScream: /Audio/Animals/mouse_squeak.ogg + wilhelmProbability: 0.001 + - type: GhostTakeoverAvailable + makeSentient: true + name: Rat Servant + description: You are a Rat Servant. You must follow your king's orders. + rules: You are an antagonist, scavenge, attack, and serve your king! + - type: Tag + tags: + - CannotSuicide + - DoorBumpOpener + - FootstepSound + - type: NoSlip + - type: MobPrice + price: 500 # rat wealth + diff --git a/Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/equipped-HELMET.png b/Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/equipped-HELMET.png new file mode 100644 index 0000000000..e44fd7e7e2 Binary files /dev/null and b/Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/equipped-HELMET.png differ diff --git a/Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/icon.png b/Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/icon.png new file mode 100644 index 0000000000..f656459ea6 Binary files /dev/null and b/Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/meta.json b/Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/meta.json new file mode 100644 index 0000000000..5868e6f365 --- /dev/null +++ b/Resources/Textures/Clothing/Head/Misc/fancycrown.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-HELMET", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Interface/Actions/meta.json b/Resources/Textures/Interface/Actions/meta.json index 316ef865c0..47a312ecf3 100644 --- a/Resources/Textures/Interface/Actions/meta.json +++ b/Resources/Textures/Interface/Actions/meta.json @@ -24,6 +24,12 @@ }, { "name": "manifest" - } + }, + { + "name": "ratKingArmy" + }, + { + "name": "ratKingDomain" + } ] } diff --git a/Resources/Textures/Interface/Actions/ratKingArmy.png b/Resources/Textures/Interface/Actions/ratKingArmy.png new file mode 100644 index 0000000000..fee9c2a444 Binary files /dev/null and b/Resources/Textures/Interface/Actions/ratKingArmy.png differ diff --git a/Resources/Textures/Interface/Actions/ratKingDomain.png b/Resources/Textures/Interface/Actions/ratKingDomain.png new file mode 100644 index 0000000000..4fbdb4d94b Binary files /dev/null and b/Resources/Textures/Interface/Actions/ratKingDomain.png differ diff --git a/Resources/Textures/Mobs/Animals/mouse.rsi/dead-3.png b/Resources/Textures/Mobs/Animals/mouse.rsi/dead-3.png new file mode 100644 index 0000000000..63c0d553ac Binary files /dev/null and b/Resources/Textures/Mobs/Animals/mouse.rsi/dead-3.png differ diff --git a/Resources/Textures/Mobs/Animals/mouse.rsi/icon-3.png b/Resources/Textures/Mobs/Animals/mouse.rsi/icon-3.png new file mode 100644 index 0000000000..19c758da48 Binary files /dev/null and b/Resources/Textures/Mobs/Animals/mouse.rsi/icon-3.png differ diff --git a/Resources/Textures/Mobs/Animals/mouse.rsi/meta.json b/Resources/Textures/Mobs/Animals/mouse.rsi/meta.json index 20f5439e93..b144e0e973 100644 --- a/Resources/Textures/Mobs/Animals/mouse.rsi/meta.json +++ b/Resources/Textures/Mobs/Animals/mouse.rsi/meta.json @@ -15,6 +15,9 @@ }, { "name": "icon-2" + }, + { + "name": "icon-3" }, { "name": "mouse-0", @@ -93,6 +96,32 @@ 0.2 ] ] + }, + { + "name": "mouse-3", + "directions": 4, + "delays": [ + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ], + [ + 0.2, + 0.2, + 0.2 + ] + ] }, { "name": "dead-0" @@ -102,6 +131,9 @@ }, { "name": "dead-2" + }, + { + "name": "dead-3" }, { "name": "splat-0" @@ -111,6 +143,9 @@ }, { "name": "splat-2" + }, + { + "name": "splat-3" }, { "name": "0-equipped-HELMET", diff --git a/Resources/Textures/Mobs/Animals/mouse.rsi/mouse-3.png b/Resources/Textures/Mobs/Animals/mouse.rsi/mouse-3.png new file mode 100644 index 0000000000..6f98406802 Binary files /dev/null and b/Resources/Textures/Mobs/Animals/mouse.rsi/mouse-3.png differ diff --git a/Resources/Textures/Mobs/Animals/mouse.rsi/splat-3.png b/Resources/Textures/Mobs/Animals/mouse.rsi/splat-3.png new file mode 100644 index 0000000000..057e71d6aa Binary files /dev/null and b/Resources/Textures/Mobs/Animals/mouse.rsi/splat-3.png differ diff --git a/Resources/Textures/Mobs/Animals/regalrat.rsi/dead.png b/Resources/Textures/Mobs/Animals/regalrat.rsi/dead.png new file mode 100644 index 0000000000..83c8014fda Binary files /dev/null and b/Resources/Textures/Mobs/Animals/regalrat.rsi/dead.png differ diff --git a/Resources/Textures/Mobs/Animals/regalrat.rsi/icon.png b/Resources/Textures/Mobs/Animals/regalrat.rsi/icon.png new file mode 100644 index 0000000000..601624ced4 Binary files /dev/null and b/Resources/Textures/Mobs/Animals/regalrat.rsi/icon.png differ diff --git a/Resources/Textures/Mobs/Animals/regalrat.rsi/meta.json b/Resources/Textures/Mobs/Animals/regalrat.rsi/meta.json new file mode 100644 index 0000000000..98a5d7e891 --- /dev/null +++ b/Resources/Textures/Mobs/Animals/regalrat.rsi/meta.json @@ -0,0 +1,21 @@ +{ + "version": 1, + "size": { + "x": 32, + "y": 32 + }, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/tgstation/tgstation/commit/53d1f1477d22a11a99c6c6924977cd431075761b", + "states": [ + { + "name": "dead" + }, + { + "name": "icon" + }, + { + "name": "regalrat", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Animals/regalrat.rsi/regalrat.png b/Resources/Textures/Mobs/Animals/regalrat.rsi/regalrat.png new file mode 100644 index 0000000000..340c0b46dd Binary files /dev/null and b/Resources/Textures/Mobs/Animals/regalrat.rsi/regalrat.png differ