From bc55df1fe3f7d453ebfcb772f4239bc637b8ef15 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Sun, 24 Aug 2025 01:47:46 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=9A=D1=80=D1=8B=D1=81=D0=B8=D0=BD=D0=BE=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=9A=D0=BE=D1=80=D0=BE=D0=BB=D1=8F:=20=D1=83=D0=B2?= =?UTF-8?q?=D0=B5=D0=BB=D0=B8=D1=87=D0=B5=D0=BD=20=D0=BB=D0=B8=D0=BC=D0=B8?= =?UTF-8?q?=D1=82=20=D0=B0=D1=80=D0=BC=D0=B8=D0=B8,=20=D0=B4=D0=BE=D0=B1?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B3=D0=B2=D0=B0=D1=80?= =?UTF-8?q?=D0=B4=D0=B5=D0=B9=D1=86=D1=8B=20(#2923)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: VigersRay <60344369+VigersRay@users.noreply.github.com> Co-authored-by: KaiserMaus Co-authored-by: Vigers Ray --- Content.Server/RatKing/RatKingSystem.cs | 53 +++++ Content.Shared/RatKing/RatKingActions.cs | 7 + Content.Shared/RatKing/RatKingComponent.cs | 38 +++- Content.Shared/RatKing/SharedRatKingSystem.cs | 22 ++ .../_strings/animals/rat-king/rat-king.ftl | 4 + .../ghost/roles/ghost-role-component.ftl | 3 + .../en-US/datasets/names/regalrat_kingdom.ftl | 16 ++ .../en-US/datasets/names/regalrat_title.ftl | 22 ++ .../_sunrise/animals/rat-king/rat-king.ftl | 3 +- .../ghost/roles/ghost-role-component.ftl | 3 + .../ru-RU/datasets/names/regalrat_kingdom.ftl | 16 ++ .../ru-RU/datasets/names/regalrat_title.ftl | 22 ++ .../Prototypes/Datasets/Names/regalrat.yml | 14 ++ .../Entities/Mobs/NPCs/regalrat.yml | 209 +++++++++++++++++- .../Actions/actions_rat_king.rsi/meta.json | 3 + .../actions_rat_king.rsi/ratKingGuard.png | Bin 0 -> 986 bytes 16 files changed, 424 insertions(+), 11 deletions(-) create mode 100644 Resources/Textures/Interface/Actions/actions_rat_king.rsi/ratKingGuard.png diff --git a/Content.Server/RatKing/RatKingSystem.cs b/Content.Server/RatKing/RatKingSystem.cs index e401380d73..21c5d5d26d 100644 --- a/Content.Server/RatKing/RatKingSystem.cs +++ b/Content.Server/RatKing/RatKingSystem.cs @@ -34,6 +34,7 @@ namespace Content.Server.RatKing base.Initialize(); SubscribeLocalEvent(OnRaiseArmy); + SubscribeLocalEvent(OnRaiseGuard); // Sunrise-Edit SubscribeLocalEvent(OnDomain); SubscribeLocalEvent(OnPointedAt); } @@ -82,6 +83,51 @@ namespace Content.Server.RatKing UpdateServantNpc(servant, component.CurrentOrder); } + // Sunrise-Start + /// + /// Summons an allied rat guard at the King, costing a large amount of hunger + /// + private void OnRaiseGuard(EntityUid uid, RatKingComponent component, RatKingRaiseGuardActionEvent args) + { + if (args.Handled) + return; + + if (!TryComp(uid, out var hunger)) + return; + + // Check living guards count + var livingGuards = 0; + foreach (var guardId in component.Guards) + { + if (TryComp(guardId, out var mobState) && mobState.CurrentState != MobState.Dead) + livingGuards++; + } + + if (livingGuards >= component.MaxGuardCount) + { + _popup.PopupEntity(Loc.GetString("rat-king-max-guards", ("amount", component.MaxGuardCount)), uid, uid); + return; + } + + //make sure the hunger doesn't go into the negatives + if (_hunger.GetHunger(hunger) < component.HungerPerGuardUse) + { + _popup.PopupEntity(Loc.GetString("rat-king-too-hungry"), uid, uid); + return; + } + args.Handled = true; + _hunger.ModifyHunger(uid, -component.HungerPerGuardUse, hunger); + var guard = Spawn(component.GuardMobSpawnId, Transform(uid).Coordinates); + var comp = EnsureComp(guard); + comp.King = uid; + Dirty(guard, comp); + + component.Guards.Add(guard); + _npc.SetBlackboard(guard, NPCBlackboard.FollowTarget, new EntityCoordinates(uid, Vector2.Zero)); + UpdateServantNpc(guard, component.CurrentOrder); + } + // Sunrise-End + /// /// uses hunger to release a specific amount of ammonia into the air. This heals the rat king /// and his servants through a specific metabolism. @@ -117,6 +163,13 @@ namespace Content.Server.RatKing { _npc.SetBlackboard(servant, NPCBlackboard.CurrentOrderedTarget, args.Pointed); } + + // Sunrise-Start + foreach (var guard in component.Guards) + { + _npc.SetBlackboard(guard, NPCBlackboard.CurrentOrderedTarget, args.Pointed); + } + // Sunrise-End } public override void UpdateServantNpc(EntityUid uid, RatKingOrderType orderType) diff --git a/Content.Shared/RatKing/RatKingActions.cs b/Content.Shared/RatKing/RatKingActions.cs index e2031e972b..dd1ad9a749 100644 --- a/Content.Shared/RatKing/RatKingActions.cs +++ b/Content.Shared/RatKing/RatKingActions.cs @@ -7,6 +7,13 @@ public sealed partial class RatKingRaiseArmyActionEvent : InstantActionEvent } +// Sunrise-Start +public sealed partial class RatKingRaiseGuardActionEvent : InstantActionEvent +{ + +} +// Sunrise-End + public sealed partial class RatKingDomainActionEvent : InstantActionEvent { diff --git a/Content.Shared/RatKing/RatKingComponent.cs b/Content.Shared/RatKing/RatKingComponent.cs index fbb320f07b..7e870a65c1 100644 --- a/Content.Shared/RatKing/RatKingComponent.cs +++ b/Content.Shared/RatKing/RatKingComponent.cs @@ -18,6 +18,29 @@ public sealed partial class RatKingComponent : Component [DataField("actionRaiseArmyEntity")] public EntityUid? ActionRaiseArmyEntity; + // Sunrise-Start + [DataField("actionRaiseGuard", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ActionRaiseGuard = "ActionRatKingRaiseGuard"; + + /// + /// The action for the Raise Guard ability + /// + [DataField("actionRaiseGuardEntity")] + public EntityUid? ActionRaiseGuardEntity; + + /// + /// The amount of hunger one use of Raise Guard consumes + /// + [ViewVariables(VVAccess.ReadWrite), DataField("hungerPerGuardUse", required: true)] + public float HungerPerGuardUse = 75f; + + /// + /// The entity prototype of the mob that Raise Guard summons + /// + [ViewVariables(VVAccess.ReadWrite), DataField("guardMobSpawnId", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string GuardMobSpawnId = "MobRatGuard"; + // Sunrise-End + /// /// The amount of hunger one use of Raise Army consumes /// @@ -100,10 +123,19 @@ public sealed partial class RatKingComponent : Component { RatKingOrderType.Loose, "RatKingCommandLoose" } }; - // Sunrise-start + // Sunrise-Start [DataField] - public int MaxArmyCount = 20; - // Sunrise-end + public int MaxArmyCount = 50; + + [DataField] + public int MaxGuardCount = 4; + + /// + /// The guards that the rat king is currently controlling + /// + [DataField("guards")] + public HashSet Guards = new(); + // Sunrise-End } [Serializable, NetSerializable] diff --git a/Content.Shared/RatKing/SharedRatKingSystem.cs b/Content.Shared/RatKing/SharedRatKingSystem.cs index edb2ab90db..6466ad2a11 100644 --- a/Content.Shared/RatKing/SharedRatKingSystem.cs +++ b/Content.Shared/RatKing/SharedRatKingSystem.cs @@ -41,6 +41,7 @@ public abstract class SharedRatKingSystem : EntitySystem return; _action.AddAction(uid, ref component.ActionRaiseArmyEntity, component.ActionRaiseArmy, component: comp); + _action.AddAction(uid, ref component.ActionRaiseGuardEntity, component.ActionRaiseGuard, component: comp); // Sunrise-Edit _action.AddAction(uid, ref component.ActionDomainEntity, component.ActionDomain, component: comp); _action.AddAction(uid, ref component.ActionOrderStayEntity, component.ActionOrderStay, component: comp); _action.AddAction(uid, ref component.ActionOrderFollowEntity, component.ActionOrderFollow, component: comp); @@ -58,11 +59,20 @@ public abstract class SharedRatKingSystem : EntitySystem servantComp.King = null; } + // Sunrise-Start + foreach (var guard in component.Guards) + { + if (TryComp(guard, out RatKingServantComponent? guardComp)) + guardComp.King = null; + } + // Sunrise-End + if (!TryComp(uid, out ActionsComponent? comp)) return; var actions = new Entity(uid, comp); _action.RemoveAction(actions, component.ActionRaiseArmyEntity); + _action.RemoveAction(actions, component.ActionRaiseGuardEntity); // Sunrise-Edit _action.RemoveAction(actions, component.ActionDomainEntity); _action.RemoveAction(actions, component.ActionOrderStayEntity); _action.RemoveAction(actions, component.ActionOrderFollowEntity); @@ -86,8 +96,13 @@ public abstract class SharedRatKingSystem : EntitySystem private void OnServantShutdown(EntityUid uid, RatKingServantComponent component, ComponentShutdown args) { + // Sunrise-Start if (TryComp(component.King, out RatKingComponent? ratKingComponent)) + { ratKingComponent.Servants.Remove(uid); + ratKingComponent.Guards.Remove(uid); + } + // Sunrise-End } private void UpdateActions(EntityUid uid, RatKingComponent? component = null) @@ -148,6 +163,13 @@ public abstract class SharedRatKingSystem : EntitySystem { UpdateServantNpc(servant, component.CurrentOrder); } + + // Sunrise-Start + foreach (var guard in component.Guards) + { + UpdateServantNpc(guard, component.CurrentOrder); + } + // Sunrise-End } public virtual void UpdateServantNpc(EntityUid uid, RatKingOrderType orderType) diff --git a/Resources/Locale/en-US/_strings/animals/rat-king/rat-king.ftl b/Resources/Locale/en-US/_strings/animals/rat-king/rat-king.ftl index bc06ab2ddd..385c512814 100644 --- a/Resources/Locale/en-US/_strings/animals/rat-king/rat-king.ftl +++ b/Resources/Locale/en-US/_strings/animals/rat-king/rat-king.ftl @@ -2,4 +2,8 @@ rat-king-domain-popup = A cloud of ammonia is released into the air! rat-king-too-hungry = You are too hungry to use this ability! +rat-king-max-army = You can't have more than {$amount} rats in your army! + +rat-king-max-guards = You can't have more than {$amount} rat guards! + rat-king-rummage-text = Rummage diff --git a/Resources/Locale/en-US/_strings/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/_strings/ghost/roles/ghost-role-component.ftl index 147ddba121..de92116fd2 100644 --- a/Resources/Locale/en-US/_strings/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/_strings/ghost/roles/ghost-role-component.ftl @@ -95,6 +95,9 @@ ghost-role-information-rat-king-description = You are the Rat King, your interes ghost-role-information-rat-servant-name = Rat Servant ghost-role-information-rat-servant-description = You are a Rat Servant. You must follow your king's orders. +rat-guard-ghost-role-name = Rat Guard +rat-guard-ghost-role-description = You are an elite Rat Guard. Protect your king and follow his orders. + ghost-role-information-salvage-carp-name = Space Carp on Salvage Wreck ghost-role-information-salvage-carp-description = Defend the loot inside the salvage wreck! diff --git a/Resources/Locale/en-US/datasets/names/regalrat_kingdom.ftl b/Resources/Locale/en-US/datasets/names/regalrat_kingdom.ftl index 5cd76c61b0..00648e26ea 100644 --- a/Resources/Locale/en-US/datasets/names/regalrat_kingdom.ftl +++ b/Resources/Locale/en-US/datasets/names/regalrat_kingdom.ftl @@ -13,3 +13,19 @@ names-regal-rat-kingdom-dataset-12 = Sewer names-regal-rat-kingdom-dataset-13 = Disposal names-regal-rat-kingdom-dataset-14 = Service names-regal-rat-kingdom-dataset-15 = The + +names-guard-rat-dataset-1 = Squeaky +names-guard-rat-dataset-2 = Moldy +names-guard-rat-dataset-3 = Nasty +names-guard-rat-dataset-4 = Itchy +names-guard-rat-dataset-5 = Greedy +names-guard-rat-dataset-6 = Rabid +names-guard-rat-dataset-7 = Hungry +names-guard-rat-dataset-8 = Slimy +names-guard-rat-dataset-9 = Cheesy +names-guard-rat-dataset-10 = Rotten +names-guard-rat-dataset-11 = Crusty +names-guard-rat-dataset-12 = Filthy +names-guard-rat-dataset-13 = Wriggly +names-guard-rat-dataset-14 = Foul +names-guard-rat-dataset-15 = Shady diff --git a/Resources/Locale/en-US/datasets/names/regalrat_title.ftl b/Resources/Locale/en-US/datasets/names/regalrat_title.ftl index d6df7fb18b..3869408bcb 100644 --- a/Resources/Locale/en-US/datasets/names/regalrat_title.ftl +++ b/Resources/Locale/en-US/datasets/names/regalrat_title.ftl @@ -15,3 +15,25 @@ names-regal-rat-title-dataset-14 = Mayor names-regal-rat-title-dataset-15 = Boss names-regal-rat-title-dataset-16 = Prophet names-regal-rat-title-dataset-17 = Cheese + +names-guard-rat-title-dataset-1 = Fang +names-guard-rat-title-dataset-2 = Whisker +names-guard-rat-title-dataset-3 = Snout +names-guard-rat-title-dataset-4 = Claw +names-guard-rat-title-dataset-5 = Tail +names-guard-rat-title-dataset-6 = Nibbler +names-guard-rat-title-dataset-7 = Chewer +names-guard-rat-title-dataset-8 = Scab +names-guard-rat-title-dataset-9 = Scratch +names-guard-rat-title-dataset-10 = Muzzle +names-guard-rat-title-dataset-11 = Paws +names-guard-rat-title-dataset-12 = Tooth +names-guard-rat-title-dataset-13 = Bite +names-guard-rat-title-dataset-14 = Gnasher +names-guard-rat-title-dataset-15 = Crumb +names-guard-rat-title-dataset-16 = Ironfang +names-guard-rat-title-dataset-17 = Bloodtail +names-guard-rat-title-dataset-18 = Plaguetooth +names-guard-rat-title-dataset-19 = Spearclaw +names-guard-rat-title-dataset-20 = Rotwhisker +names-guard-rat-title-dataset-21 = Kaiser diff --git a/Resources/Locale/ru-RU/_strings/_sunrise/animals/rat-king/rat-king.ftl b/Resources/Locale/ru-RU/_strings/_sunrise/animals/rat-king/rat-king.ftl index 96202c9b7f..4c71f40e31 100644 --- a/Resources/Locale/ru-RU/_strings/_sunrise/animals/rat-king/rat-king.ftl +++ b/Resources/Locale/ru-RU/_strings/_sunrise/animals/rat-king/rat-king.ftl @@ -1 +1,2 @@ -rat-king-max-army = У вас превышено максимальное количество подданных: { $amount } \ No newline at end of file +rat-king-max-army = У вас не может быть больше {$amount} крыс в армии! +rat-king-max-guards = У вас не может быть больше {$amount} крысиных гвардейцев! \ No newline at end of file diff --git a/Resources/Locale/ru-RU/_strings/ghost/roles/ghost-role-component.ftl b/Resources/Locale/ru-RU/_strings/ghost/roles/ghost-role-component.ftl index 49e9e31bd1..9015aad8ca 100644 --- a/Resources/Locale/ru-RU/_strings/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/ru-RU/_strings/ghost/roles/ghost-role-component.ftl @@ -75,6 +75,9 @@ ghost-role-information-kobold-name = Кобольд ghost-role-information-kobold-description = Будьте маленьким гремлином, которым и являетесь, кричите на членов экипажа и просите мяса! ghost-role-information-rat-king-name = Крысиный король ghost-role-information-rat-king-description = Вы - Крысиный король, вас интересует еда, еда и ещё раз еда. Сотрудничайте со станцией или сражайтесь с ней ради еды. Я уже упоминал, что вас интересует еда? + +rat-guard-ghost-role-name = Крысиный гвардеец +rat-guard-ghost-role-description = Вы элитный крысиный гвардеец. Защищайте своего короля и выполняйте его приказы. ghost-role-information-rat-servant-name = Крысиный слуга ghost-role-information-rat-servant-description = Вы Крысиный слуга. Выполняйте приказы своего короля. ghost-role-information-salvage-carp-name = Космический карп на аварийном обломке diff --git a/Resources/Locale/ru-RU/datasets/names/regalrat_kingdom.ftl b/Resources/Locale/ru-RU/datasets/names/regalrat_kingdom.ftl index 6e3520ad98..1896d96af1 100644 --- a/Resources/Locale/ru-RU/datasets/names/regalrat_kingdom.ftl +++ b/Resources/Locale/ru-RU/datasets/names/regalrat_kingdom.ftl @@ -13,3 +13,19 @@ names-regal-rat-kingdom-dataset-12 = Водосточный names-regal-rat-kingdom-dataset-13 = Помойный names-regal-rat-kingdom-dataset-14 = Сервисный names-regal-rat-kingdom-dataset-15 = Конкретный + +names-guard-rat-dataset-1 = Пискливый +names-guard-rat-dataset-2 = Плесневый +names-guard-rat-dataset-3 = Гнусный +names-guard-rat-dataset-4 = Зудящий +names-guard-rat-dataset-5 = Жадный +names-guard-rat-dataset-6 = Бешеный +names-guard-rat-dataset-7 = Голодный +names-guard-rat-dataset-8 = Слизкий +names-guard-rat-dataset-9 = Сырный +names-guard-rat-dataset-10 = Гнилой +names-guard-rat-dataset-11 = Корявый +names-guard-rat-dataset-12 = Грязный +names-guard-rat-dataset-13 = Извивающийся +names-guard-rat-dataset-14 = Вонючий +names-guard-rat-dataset-15 = Теневой diff --git a/Resources/Locale/ru-RU/datasets/names/regalrat_title.ftl b/Resources/Locale/ru-RU/datasets/names/regalrat_title.ftl index cc46d80844..e3fef0e5e3 100644 --- a/Resources/Locale/ru-RU/datasets/names/regalrat_title.ftl +++ b/Resources/Locale/ru-RU/datasets/names/regalrat_title.ftl @@ -15,3 +15,25 @@ names-regal-rat-title-dataset-14 = Мэр names-regal-rat-title-dataset-15 = Босс names-regal-rat-title-dataset-16 = Пророк names-regal-rat-title-dataset-17 = Сыр + +names-guard-rat-title-dataset-1 = Клык +names-guard-rat-title-dataset-2 = Ус +names-guard-rat-title-dataset-3 = Пятачок +names-guard-rat-title-dataset-4 = Коготь +names-guard-rat-title-dataset-5 = Хвост +names-guard-rat-title-dataset-6 = Грызун +names-guard-rat-title-dataset-7 = Жевун +names-guard-rat-title-dataset-8 = Струп +names-guard-rat-title-dataset-9 = Царап +names-guard-rat-title-dataset-10 = Мордень +names-guard-rat-title-dataset-11 = Лапы +names-guard-rat-title-dataset-12 = Зуб +names-guard-rat-title-dataset-13 = Укус +names-guard-rat-title-dataset-14 = Склепун +names-guard-rat-title-dataset-15 = Крошка +names-guard-rat-title-dataset-16 = Железноклык +names-guard-rat-title-dataset-17 = Кровехвост +names-guard-rat-title-dataset-18 = Чумозуб +names-guard-rat-title-dataset-19 = Копьекоготь +names-guard-rat-title-dataset-20 = Гнилоус +names-guard-rat-title-dataset-21 = Кайзер diff --git a/Resources/Prototypes/Datasets/Names/regalrat.yml b/Resources/Prototypes/Datasets/Names/regalrat.yml index 94e55035dc..22a199d651 100644 --- a/Resources/Prototypes/Datasets/Names/regalrat.yml +++ b/Resources/Prototypes/Datasets/Names/regalrat.yml @@ -9,3 +9,17 @@ values: prefix: names-regal-rat-title-dataset- count: 17 + +# Sunrise-Start +- type: localizedDataset + id: NamesRatGuard + values: + prefix: names-guard-rat-dataset- + count: 15 + +- type: localizedDataset + id: NamesRatGuardTitle + values: + prefix: names-guard-rat-title-dataset- + count: 21 +# Sunrise-End diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index 4b68ebcd72..cf795269bd 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -12,8 +12,8 @@ # Sunrise edit end - type: CombatMode - type: MovementSpeedModifier - baseWalkSpeed : 3.00 - baseSprintSpeed : 5.00 + baseSprintSpeed: 5 + baseWalkSpeed: 4.5 - type: InputMover - type: MobMover - type: HTN @@ -54,7 +54,7 @@ - type: MobThresholds thresholds: 0: Alive - 200: Dead + 400: Dead # Sunrise-Edit # Пусть стреляют Экспансивками - type: MeleeWeapon altDisarm: false soundHit: @@ -70,7 +70,7 @@ requiredLegs: 1 # TODO: More than 1 leg - type: Hunger # probably should be prototyped thresholds: - Overfed: 200 + Overfed: 250 # Sunrise-Edit Okay: 150 Peckish: 100 Starving: 50 @@ -111,6 +111,7 @@ - type: RatKing hungerPerArmyUse: 15 # Sunrise-edit hungerPerDomainUse: 50 # Sunrise-edit + hungerPerGuardUse: 75 # High cost for guards - type: MobsterAccent - type: Speech speechVerb: SmallMob @@ -137,6 +138,7 @@ bleedReductionAmount: 1 bloodRefreshAmount: 1.5 - type: VentCrawler + - type: NightVision # Sunrise-end - type: entity @@ -188,6 +190,7 @@ name: ghost-panel-antagonist-rats-name description: ghost-panel-antagonist-rats-description priority: 110 + - type: NightVision # Sunrise edit end - type: VentCrawler # Sunrise-edit - type: CombatMode @@ -208,7 +211,7 @@ 3.0 - type: Bloodstream bloodReagent: Blood - bloodMaxVolume: 75 + bloodMaxVolume: 60 - type: Reactive groups: Flammable: [Touch] @@ -249,8 +252,8 @@ - type: MobThresholds thresholds: 0: Alive - 50: Critical # Sunrise-edit - 60: Dead # Sunrise-edit + 40: Critical # Sunrise-edit + 50: Dead # Sunrise-edit - type: Destructible thresholds: - trigger: @@ -327,6 +330,182 @@ sprite: Mobs/Effects/onfire.rsi normalState: Mouse_burning +# Sunrise-Start +- type: entity + name: rat guard + id: MobRatGuard + parent: [ SimpleMobBase, MobCombat ] + description: A massive, imposing rat that serves as the king's elite guard. + categories: [ HideSpawnMenu ] #Must be configured to a King or the AI breaks. + components: + - type: GhostPanelAntagonistMarker + name: ghost-panel-antagonist-rats-name + description: ghost-panel-antagonist-rats-description + priority: 110 + - type: TypingIndicator + proto: lizard + - type: VentCrawler # Sunrise-edit + - type: CombatMode + - type: MovementSpeedModifier + baseWalkSpeed : 3.2 + baseSprintSpeed : 3.8 + - type: InputMover + - type: MobMover + - type: HTN + rootTask: + task: RatServantCompound + blackboard: + IdleRange: !type:Single + 4.0 + FollowCloseRange: !type:Single + 2.5 + FollowRange: !type:Single + 3.5 + - type: Bloodstream + bleedReductionAmount: 1 + bloodRefreshAmount: 1.5 + bloodReagent: Blood + bloodMaxVolume: 200 + - type: Reactive + groups: + Flammable: [Touch] + Extinguish: [Touch] + - type: NpcFactionMember + factions: + - SimpleHostile + - type: Sprite + drawdepth: SmallMobs + sprite: Mobs/Animals/buffrat.rsi + # scale: 1.2, 1.2 # Smaller that RatKingBuff + layers: + - map: ["enum.DamageStateVisualLayers.Base"] + state: regalrat + - map: [ "enum.DamageStateVisualLayers.BaseUnshaded"] + state: eyes + shader: unshaded + - type: Physics + bodyType: KinematicController + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeCircle + radius: 0.35 + density: 80 #Bulky guard + mask: + - SmallMobMask + layer: + - SmallMobLayer + - type: MobState + - type: MobThresholds + thresholds: + 0: Alive + 350: Critical # High HP as requested + 400: Dead # High HP as requested + - type: SlowOnDamage + speedModifierThresholds: + 200: 0.8 + 250: 0.6 + - type: Destructible + thresholds: + - trigger: + !type:DamageTypeTrigger + damageType: Blunt + damage: 600 + behaviors: + - !type:GibBehavior + recursive: false + - type: Stamina + critThreshold: 400 + - type: MeleeWeapon + soundHit: + path: /Audio/Weapons/Xeno/alien_claw_flesh2.ogg + angle: 0 + animation: WeaponArcClaw + damage: + types: + Slash: 5 # Additional claw damage + Piercing: 5 # Additional claw damage + Blunt: 25 # Strong guard attack + Structural: 10 # Strong guard attack + bluntStaminaDamageFactor: 1.75 + - type: MeleeThrowOnHit + distance: 0.75 + speed: 8 + - type: Body + prototype: Rat + requiredLegs: 1 # TODO: More than 1 leg + - type: Hunger # probably should be prototyped + thresholds: + Overfed: 300 + Okay: 200 + Peckish: 150 + Starving: 100 + Dead: 0 + baseDecayRate: 0.025 # Faster hunger decay for guards + - type: Thirst + thresholds: + OverHydrated: 600 + Okay: 450 + Thirsty: 300 + Parched: 150 + Dead: 0 + baseDecayRate: 0.15 # Faster thirst decay + - type: DamageStateVisuals + states: + Alive: + Base: regalrat + BaseUnshaded: eyes + Critical: + Base: dead + Dead: + Base: dead + - type: Butcherable + spawned: + - id: FoodMeatRat + amount: 3 # More meat from guards + - type: Vocal + sounds: + Male: Mouse + Female: Mouse + Unsexed: Mouse + wilhelmProbability: 0.001 + - type: Tag + tags: + - CannotSuicide + - FootstepSound + - type: NoSlip + - type: MobPrice + price: 1500 # Higher value for guards + - type: MobsterAccent + isBoss: false + - type: Speech + speechVerb: SmallMob + - type: GuideHelp + guides: + - MinorAntagonists + - type: FireVisuals + sprite: Mobs/Effects/onfire.rsi + normalState: Mouse_burning + - type: RatKingServant # Make them servants too + - type: GhostRole + makeSentient: true + name: rat-guard-ghost-role-name + description: rat-guard-ghost-role-description + rules: ghost-role-information-antagonist-rules + mindRoles: + - MindRoleGhostRoleSoloAntagonist + raffle: + settings: short + - type: GhostTakeoverAvailable + - type: NightVision + - type: RandomMetadata + nameSegments: + - NamesRatGuard + - NamesRatGuardTitle + nameFormat: name-format-regal-rat +# Sunrise-end + - type: weightedRandomEntity id: RatKingLoot weights: @@ -438,3 +617,19 @@ event: !type:RatKingOrderActionEvent type: Loose + +# Sunrise-Start +- type: entity + parent: BaseAction + id: ActionRatKingRaiseGuard + name: Raise Guard + description: Spend a large amount of hunger to summon an elite rat guard to serve you. + components: + - type: Action + useDelay: 8 + icon: + sprite: Interface/Actions/actions_rat_king.rsi + state: ratKingGuard + - type: InstantAction + event: !type:RatKingRaiseGuardActionEvent +# Sunrise-End diff --git a/Resources/Textures/Interface/Actions/actions_rat_king.rsi/meta.json b/Resources/Textures/Interface/Actions/actions_rat_king.rsi/meta.json index 62c8977309..5d08926317 100644 --- a/Resources/Textures/Interface/Actions/actions_rat_king.rsi/meta.json +++ b/Resources/Textures/Interface/Actions/actions_rat_king.rsi/meta.json @@ -36,6 +36,9 @@ }, { "name": "ratKingDomain" + }, + { + "name": "ratKingGuard" } ] } diff --git a/Resources/Textures/Interface/Actions/actions_rat_king.rsi/ratKingGuard.png b/Resources/Textures/Interface/Actions/actions_rat_king.rsi/ratKingGuard.png new file mode 100644 index 0000000000000000000000000000000000000000..1682d8137ffe144c36e03e7ddee496c9f369c1c2 GIT binary patch literal 986 zcmV<0110>4P)Px&lu1NER9J=0mQQFCSscedBhnlK6PJc$4A|9pzEG+0f8x+Tb7S`9hhD#;)xx9?wC-=YW)>5giy=TAcc?|#HuUFMh z)7fLc`4h7lcP^iUdc7+`7!_jybv~7XL;}uEx#R3QWHK@z^of8DsTBM%>%Pw^WV(43 zcYhg{(l!75lc5!0ovxD4jRCUvM}at#&$-VxH-|k^a9eWz`KQ5)aCsS{RD#=in9IuH z%w#a;vhG@`B-e_-kHbS8zx>b}k1ZAqP`aS$>;YiE9iydmqFU{05%${)uy^T$*0I0{ zL?Z4pk&vr-@kWvdt4V2ZezSK@6rmr9lkpy&fr?NVda#-#ZdnJU-E}dycmuBfR`Je= zC<65wp`X6pCfymgW5l#WJ(gGaj+n8;SHM*9s7bL|hTA7Mwce zK9^Q1+<&r0dUAqCk2e5#^mv2x!fIzF&B^Ehu*fs#MDC~UP zCHv>b!8j}t`)dN=(v=D)P8>misA!c~%oU1d(vuSaq$ej1#-rXo@r+v*4clhzp=%Cmkh4J*o>(1(}iypBb4cjJeS(v7&cLi`9$J?hv!?t<$vLbOxgY)N-9hJm!9Phm! zxo*FDMhNta@VekI@mI y`LWkB&D^%puZWMqm-YMqh2uE1_uFy=gph`9ORdu0Z)@916q~MPgU+kY8X&i! zAm7Yw8vs8~oss_Eg@!_b-wHt*8VX4^gdP9cckljYGq-Jg27t=a_;z|oeE