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