diff --git a/Content.IntegrationTests/Tests/Backmen/Language/LanguageTest.cs b/Content.IntegrationTests/Tests/Backmen/Language/LanguageTest.cs index 45b95caec5d..505e707836e 100644 --- a/Content.IntegrationTests/Tests/Backmen/Language/LanguageTest.cs +++ b/Content.IntegrationTests/Tests/Backmen/Language/LanguageTest.cs @@ -1,8 +1,15 @@ -using Content.Server.Backmen.Blob.NPC.BlobPod; +using Content.Server.Antag.Components; +using Content.Server.Backmen.Blob.NPC.BlobPod; +using Content.Server.Backmen.Cloning.Components; +using Content.Server.Backmen.Language; +using Content.Server.GameTicking; +using Content.Server.Ghost.Roles.Components; using Content.Shared.Backmen.Blob.Components; using Content.Shared.Backmen.Language; +using Content.Shared.Backmen.Language.Components; using Content.Shared.Backmen.Language.Systems; using Content.Shared.Destructible; +using Content.Shared.Ghost.Roles.Components; using Robust.Client.UserInterface.RichText; using Robust.Shared.GameObjects; using Robust.Shared.Prototypes; @@ -13,6 +20,66 @@ namespace Content.IntegrationTests.Tests.Backmen.Language; [TestOf(typeof(SharedLanguageSystem))] public sealed class LanguageTest { + [Test] + public async Task RoleCanUnderstandTest() + { + await using var pair = await PoolManager.GetServerClient(new PoolSettings + { + Dirty = false, + DummyTicker = false, + Connected = true + }); + + var server = pair.Server; + var client = pair.Client; + + var entMan = server.EntMan; + var ticker = server.System(); + var sys = (LanguageSystem)server.System(); + var proto = server.ResolveDependency(); + var compFactory = server.ResolveDependency(); + + var testMap = await pair.CreateTestMap(); + + Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.InRound)); + + await server.WaitAssertion(() => + { + foreach (var entProto in proto.EnumeratePrototypes()) + { + if(entProto.ID is "GhostRoleTestEntity" or "SpawnPointReturnToMenu") + continue; + + EntityUid ent; + if ( + entProto.TryGetComponent(out _, compFactory) || + entProto.TryGetComponent(out _, compFactory) + ) + { + continue; + } + if (entProto.TryGetComponent(out var ghostRoleMobSpawnerComponent, compFactory)) + { + ent = entMan.Spawn(ghostRoleMobSpawnerComponent.Prototype, testMap.MapCoords); + } + else if (entProto.TryGetComponent(out var ghostRoleComponent, compFactory)) + { + ent = entMan.Spawn(entProto.ID, testMap.MapCoords); + } + else + { + continue; + } + Assert.That(entMan.HasComponent(ent), Is.True, $"{entMan.ToPrettyString(ent)} does not have a language speaker component"); + Assert.That(entMan.HasComponent(ent), Is.True, $"{entMan.ToPrettyString(ent)} does not have a language knowledge"); + Assert.That(sys.CanUnderstand(ent, "TauCetiBasic"), $"{entMan.ToPrettyString(ent)} does not understand TauCetiBasic"); + entMan.DeleteEntity(ent); + } + }); + + await pair.CleanReturnAsync(); + } + [Test] public async Task FontsTest() { diff --git a/Content.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs b/Content.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs index cebc5c55ff6..217a8d9e627 100644 --- a/Content.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs +++ b/Content.Server/Backmen/Abilities/Psionics/Abilities/MindSwapPowerSystem.cs @@ -25,7 +25,7 @@ namespace Content.Server.Backmen.Abilities.Psionics; -public sealed class MindSwapPowerSystem : EntitySystem +public sealed class MindSwapPowerSystem : SharedMindSwapPowerSystem { [Dependency] private readonly SharedActionsSystem _actions = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!; diff --git a/Content.Server/Backmen/Blob/BlobTileSystem.cs b/Content.Server/Backmen/Blob/BlobTileSystem.cs index 905bd10c1e1..72adf342817 100644 --- a/Content.Server/Backmen/Blob/BlobTileSystem.cs +++ b/Content.Server/Backmen/Blob/BlobTileSystem.cs @@ -10,6 +10,12 @@ using Content.Shared.Damage; using Content.Shared.Destructible; using Content.Shared.FixedPoint; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.NPC.Components; +using Content.Shared.NPC.Prototypes; +using Content.Shared.NPC.Systems; using Robust.Server.Audio; using Robust.Server.GameObjects; using Robust.Shared.Audio; @@ -28,13 +34,19 @@ public sealed class BlobTileSystem : SharedBlobTileSystem [Dependency] private readonly MapSystem _mapSystem = default!; [Dependency] private readonly TransformSystem _transform = default!; [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly NpcFactionSystem _npcFactionSystem = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; private EntityQuery _blobCoreQuery; + [ValidatePrototypeId] + private const string BlobFaction = "Blob"; + public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnDestruction); SubscribeLocalEvent(OnPulsed); SubscribeLocalEvent(OnFlashAttempt); @@ -43,6 +55,18 @@ public override void Initialize() _blobCoreQuery = GetEntityQuery(); } + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + var faction = EnsureComp(ent); + Entity factionEnt = (ent, faction); + + _npcFactionSystem.ClearFactions(factionEnt, false); + _npcFactionSystem.AddFaction(factionEnt, BlobFaction, true); + + // make alive - true for npc combat + EnsureComp(ent); + } + private void OnTerminate(EntityUid uid, BlobTileComponent component, EntityTerminatingEvent args) { if (TerminatingOrDeleted(component.Core)) diff --git a/Content.Server/Backmen/Blob/NPC/BlobPod/BlobPodSystem.cs b/Content.Server/Backmen/Blob/NPC/BlobPod/BlobPodSystem.cs index b4a4db61de8..944d15683cb 100644 --- a/Content.Server/Backmen/Blob/NPC/BlobPod/BlobPodSystem.cs +++ b/Content.Server/Backmen/Blob/NPC/BlobPod/BlobPodSystem.cs @@ -16,6 +16,7 @@ using Content.Shared.Inventory; using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Components; +using Content.Shared.Movement.Systems; using Content.Shared.Rejuvenate; using Robust.Server.Audio; using Robust.Shared.Containers; @@ -34,6 +35,7 @@ public sealed class BlobPodSystem : SharedBlobPodSystem [Dependency] private readonly ExplosionSystem _explosionSystem = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly NPCSystem _npc = default!; + [Dependency] private readonly SharedMoverController _mover = default!; public override void Initialize() { @@ -116,6 +118,7 @@ public bool Zombify(Entity ent, EntityUid target) if (HasComp(ent)) { _npc.SleepNPC(target); + _mover.SetRelay(ent, target); } return true; diff --git a/Content.Server/Backmen/Blob/ZombieBlobSystem.cs b/Content.Server/Backmen/Blob/ZombieBlobSystem.cs index 498bc6fd507..d2510e0f8ca 100644 --- a/Content.Server/Backmen/Blob/ZombieBlobSystem.cs +++ b/Content.Server/Backmen/Blob/ZombieBlobSystem.cs @@ -172,6 +172,7 @@ private void OnStartup(EntityUid uid, ZombieBlobComponent component, ComponentSt var htn = EnsureComp(uid); htn.RootTask = new HTNCompoundTask() {Task = "SimpleHostileCompound"}; htn.Blackboard.SetValue(NPCBlackboard.Owner, uid); + htn.Blackboard.SetValue(NPCBlackboard.NavBlob, true); if (!HasComp(component.BlobPodUid)) { diff --git a/Content.Server/Backmen/Disease/DiseaseSystem.cs b/Content.Server/Backmen/Disease/DiseaseSystem.cs index 81554ac4d30..6d48e7b9bd5 100644 --- a/Content.Server/Backmen/Disease/DiseaseSystem.cs +++ b/Content.Server/Backmen/Disease/DiseaseSystem.cs @@ -106,9 +106,12 @@ public override void Update(float frameTime) } _cureQueue.Clear(); - var q = EntityQueryEnumerator(); - while (q.MoveNext(out var owner, out _, out var carrierComp, out var mobState)) + var q = EntityQueryEnumerator(); + while (q.MoveNext(out var owner, out _, out var carrierComp, out var mobState, out var metaDataComponent)) { + if(Paused(owner, metaDataComponent)) + continue; + if (carrierComp.Diseases.Count == 0) { continue; @@ -129,7 +132,8 @@ public override void Update(float frameTime) System = this, Owner = (owner, carrierComp, mobState), FrameTime = frameTime - }, carrierComp.Diseases.Count); + }, + carrierComp.Diseases.Count); } } diff --git a/Content.Server/Backmen/StationEvents/Events/BlobSpawn.cs b/Content.Server/Backmen/StationEvents/Events/BlobSpawn.cs index cdb5b6e5157..486e4a4ca82 100644 --- a/Content.Server/Backmen/StationEvents/Events/BlobSpawn.cs +++ b/Content.Server/Backmen/StationEvents/Events/BlobSpawn.cs @@ -10,8 +10,10 @@ using Content.Server.StationEvents.Events; using Content.Shared.Backmen.Blob.Components; using Content.Shared.GameTicking.Components; +using Content.Shared.Players; using Content.Shared.Station.Components; using Robust.Server.Player; +using Robust.Shared.Player; namespace Content.Server.Backmen.StationEvents.Events; @@ -82,5 +84,7 @@ private void OnSpawned(EntityUid uid, BlobCarrierComponent component, GhostRoleS // Blob doesn't spawn when blob carrier was eaten. RemComp(carrier); RemComp(carrier); + + } } diff --git a/Content.Server/NPC/NPCBlackboard.cs b/Content.Server/NPC/NPCBlackboard.cs index ffdb55045d3..fb0ad44c2be 100644 --- a/Content.Server/NPC/NPCBlackboard.cs +++ b/Content.Server/NPC/NPCBlackboard.cs @@ -319,6 +319,8 @@ public string GetVisionRadiusKey(IEntityManager entMan) /// public const string NavClimb = "NavClimb"; + public const string NavBlob = "NavBlob"; + /// /// Default key storage for a movement pathfind. /// diff --git a/Content.Server/NPC/Pathfinding/PathFlags.cs b/Content.Server/NPC/Pathfinding/PathFlags.cs index 656dc679de0..c06b433354b 100644 --- a/Content.Server/NPC/Pathfinding/PathFlags.cs +++ b/Content.Server/NPC/Pathfinding/PathFlags.cs @@ -29,4 +29,6 @@ public enum PathFlags : byte /// Can we open stuff that requires interaction (e.g. click-open doors). /// Interact = 1 << 4, + + Blob = 1 << 5, } diff --git a/Content.Server/NPC/Pathfinding/PathfindingSystem.Common.cs b/Content.Server/NPC/Pathfinding/PathfindingSystem.Common.cs index 5d31f47e266..ca17ce9ad0a 100644 --- a/Content.Server/NPC/Pathfinding/PathfindingSystem.Common.cs +++ b/Content.Server/NPC/Pathfinding/PathfindingSystem.Common.cs @@ -59,6 +59,13 @@ private float GetTileCost(PathRequest request, PathPoly start, PathPoly end) var isAccess = (end.Data.Flags & PathfindingBreadcrumbFlag.Access) != 0x0; var isClimb = (end.Data.Flags & PathfindingBreadcrumbFlag.Climb) != 0x0; + // start-backmen: blob + if ((end.Data.Flags & PathfindingBreadcrumbFlag.Blob) != 0x0 && (request.Flags & PathFlags.Blob) != 0x0) + { + modifier += 0f; + } + else + // end-backmen: blob // TODO: Handling power + door prying // Door we should be able to open if (isDoor && !isAccess && (request.Flags & PathFlags.Interact) != 0x0) diff --git a/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs b/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs index f4af65c6174..108b9a760f2 100644 --- a/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs +++ b/Content.Server/NPC/Pathfinding/PathfindingSystem.Grid.cs @@ -514,6 +514,13 @@ private void BuildBreadcrumbs(GridPathfindingChunk chunk, Entity _portals = new(); + private EntityQuery _tilesQuery; // backmen: blob private EntityQuery _accessQuery; private EntityQuery _destructibleQuery; private EntityQuery _doorQuery; @@ -80,6 +81,7 @@ public override void Initialize() { base.Initialize(); + _tilesQuery = GetEntityQuery(); // backmen: blob _accessQuery = GetEntityQuery(); _destructibleQuery = GetEntityQuery(); _doorQuery = GetEntityQuery(); @@ -472,6 +474,13 @@ public PathFlags GetFlags(NPCBlackboard blackboard) flags |= PathFlags.Interact; } + // start-backmen: blob + if (blackboard.TryGetValue(NPCBlackboard.NavBlob, out var blob, EntityManager) && blob) + { + flags |= PathFlags.Blob; + } + // end-backmen: blob + return flags; } diff --git a/Content.Server/Polymorph/Systems/PolymorphSystem.cs b/Content.Server/Polymorph/Systems/PolymorphSystem.cs index 104485ededd..55f6cfbf76a 100644 --- a/Content.Server/Polymorph/Systems/PolymorphSystem.cs +++ b/Content.Server/Polymorph/Systems/PolymorphSystem.cs @@ -363,7 +363,11 @@ public void CreatePolymorphAction(ProtoId id, Entity _query; - private EntityQuery _inputQuery; public override void Initialize() { @@ -31,21 +32,7 @@ public override void Initialize() SubscribeLocalEvent(OnCanDragDropOn); SubscribeLocalEvent(OnBlobPodDragDrop); - SubscribeLocalEvent(OnRelayMoveInput); - _query = GetEntityQuery(); - _inputQuery = GetEntityQuery(); - } - - private void OnRelayMoveInput(Entity ent, ref MoveInputEvent args) - { - if (ent.Comp.ZombifiedEntityUid == null || TerminatingOrDeleted(ent.Comp.ZombifiedEntityUid.Value) || !_inputQuery.TryComp(ent.Comp.ZombifiedEntityUid.Value, out var inputMoverComponent)) - return; - - var inputMoverEntity = new Entity(EntityUid.FirstUid, inputMoverComponent); - var moveEvent = new MoveInputEvent(inputMoverEntity, args.OldMovement); - inputMoverComponent.HeldMoveButtons = args.OldMovement; - RaiseLocalEvent(ent.Comp.ZombifiedEntityUid.Value, ref moveEvent); } private void OnBlobPodDragDrop(Entity ent, ref DragDropTargetEvent args) diff --git a/Content.Shared/Mobs/Components/MobThresholdsComponent.cs b/Content.Shared/Mobs/Components/MobThresholdsComponent.cs index 0e37cf9b10e..84acc598a0e 100644 --- a/Content.Shared/Mobs/Components/MobThresholdsComponent.cs +++ b/Content.Shared/Mobs/Components/MobThresholdsComponent.cs @@ -44,6 +44,7 @@ public sealed partial class MobThresholdsComponent : Component /// /// Whether or not this entity can be revived out of a dead state. /// + [ViewVariables(VVAccess.ReadWrite)] [DataField("allowRevives")] public bool AllowRevives; } diff --git a/Content.Shared/NPC/PathfindingBreadcrumb.cs b/Content.Shared/NPC/PathfindingBreadcrumb.cs index f0d3f266658..1da6c27d6f4 100644 --- a/Content.Shared/NPC/PathfindingBreadcrumb.cs +++ b/Content.Shared/NPC/PathfindingBreadcrumb.cs @@ -120,4 +120,6 @@ public enum PathfindingBreadcrumbFlag : ushort /// Is there climbing involved /// Climb = 1 << 4, + + Blob = 1 << 5 } diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 89275f93ea8..68455038779 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -60,6 +60,7 @@ - Mouse understands: - Mouse + - TauCetiBasic - type: MeleeWeapon soundHit: path: /Audio/Effects/bite.ogg @@ -544,6 +545,7 @@ - Moffic understands: - Moffic + - TauCetiBasic - type: ZombieAccentOverride accent: zombieMoth - type: Vocal diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 0f0ab19f110..a57f7dca88c 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -88,6 +88,7 @@ - SpaceMob - Carp - Dragon + - TauCetiBasic - type: Speech speechVerb: LargeMob - type: InteractionPopup diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml b/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml index 563f9a966b3..fb8ef66192d 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml @@ -122,15 +122,6 @@ groups: Brute: -2 Burn: -2 -# - type: ReplacementAccent -# accent: tomatoKiller - - type: LanguageSpeaker - currentLanguage: TauCetiBasic - - type: LanguageKnowledge #backmen: languages - speaks: - - SpaceMob - understands: - - SpaceMob - type: Item - type: NpcFactionMember factions: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index f82f4c43ff7..2dc2acad8ff 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -3,6 +3,14 @@ abstract: true id: MobSiliconBase components: + - type: LanguageSpeaker + currentLanguage: Binary + - type: LanguageKnowledge #backmen: languages + speaks: + - Binary + understands: + - Binary + - TauCetiBasic - type: LagCompensation - type: Reactive groups: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml index d1df60af7e4..f75a8c749e4 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml @@ -69,12 +69,13 @@ price: 1000 # Living critters are valuable in space. - type: Perishable - type: LanguageSpeaker - currentLanguage: TauCetiBasic + currentLanguage: SpaceMob - type: LanguageKnowledge #backmen: languages speaks: - SpaceMob understands: - SpaceMob + - TauCetiBasic - type: entity parent: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml index 9c053860f8b..18ae47f0901 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/slimes.yml @@ -113,12 +113,13 @@ - type: TypingIndicator proto: slime - type: LanguageSpeaker - currentLanguage: TauCetiBasic + currentLanguage: Slime - type: LanguageKnowledge #backmen: languages speaks: - Slime understands: - Slime + - TauCetiBasic - type: entity name: basic slime @@ -129,13 +130,6 @@ components: # - type: ReplacementAccent # accent: slimes - - type: LanguageSpeaker - currentLanguage: TauCetiBasic - - type: LanguageKnowledge #backmen: languages - speaks: - - Slime - understands: - - Slime - type: GhostTakeoverAvailable - type: GhostRole makeSentient: true diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml index cd0c8c4d9e0..82d6a52d25a 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/xeno.yml @@ -127,6 +127,16 @@ isToggle: true color: "#808080" playSoundOn: false + - type: LanguageSpeaker + currentLanguage: Xeno + - type: LanguageKnowledge #backmen: languages + speaks: + - Xeno + understands: + - Xeno + - TauCetiBasic + - type: TTS + voice: Xenia - type: entity name: praetorian diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml index 3f39f2c125e..6fa7a9dbe73 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -163,6 +163,7 @@ understands: - Carp - Dragon + - TauCetiBasic - type: Puller diff --git a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml index b21f19edd3c..496d576857f 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml @@ -109,6 +109,15 @@ - type: Tag tags: - CannotSuicide + - type: LanguageSpeaker + currentLanguage: Nekomimetic + - type: LanguageKnowledge #backmen: languages + speaks: + - Nekomimetic + - TauCetiBasic + understands: + - TauCetiBasic + - Nekomimetic # From the uplink injector - type: entity diff --git a/Resources/Prototypes/Entities/Mobs/base.yml b/Resources/Prototypes/Entities/Mobs/base.yml index d1c6f878bdc..c6f1b7c14b7 100644 --- a/Resources/Prototypes/Entities/Mobs/base.yml +++ b/Resources/Prototypes/Entities/Mobs/base.yml @@ -44,6 +44,13 @@ - type: TTS # Corvax-TTS - type: RequireProjectileTarget active: False + - type: LanguageSpeaker + - type: LanguageKnowledge #backmen: languages + speaks: + - SpaceMob + understands: + - TauCetiBasic + - SpaceMob - type: entity save: false diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml index 0fb3df4d278..437874dba7e 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml @@ -927,3 +927,11 @@ damage: groups: Brute: 1 + - type: LanguageSpeaker + currentLanguage: Dog + - type: LanguageKnowledge #backmen: languages + speaks: + - Dog + understands: + - Dog + - TauCetiBasic diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml index 448ef0868d6..a6804c6f84f 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml @@ -729,6 +729,14 @@ damage: groups: Brute: 1 + - type: LanguageSpeaker + currentLanguage: Cat + - type: LanguageKnowledge #backmen: languages + speaks: + - Cat + understands: + - Cat + - TauCetiBasic # Suppermatter # I can't figure out where to put this. It kind of acts like a cake I guess? diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml index 1901859ea29..4055cb380c7 100644 --- a/Resources/Prototypes/Reagents/biological.yml +++ b/Resources/Prototypes/Reagents/biological.yml @@ -351,6 +351,14 @@ collection: FootstepBlood params: volume: 6 + reactiveEffects: + Acidic: + methods: [ Touch ] + effects: + - !type:ChemMiasmaPoolSource + conditions: + - !type:ReagentThreshold + min: 1 - type: reagent id: GreyMatter diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index e709fee6eab..59b9cb3a09b 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -244,6 +244,15 @@ - !type:Emote emote: Scream probability: 0.2 +# start-backmen: Disease + - !type:ChemCauseDisease + conditions: + - !type:ReagentThreshold + reagent: FluorosulfuricAcid + min: 1 + causeChance: 0.3 + disease: XenoVirus +# end-backmen: Disease metabolisms: Poison: metabolismRate: 3.00 # High damage, high metabolism rate. You need a lot of units to crit. Simulates acid burning through you fast. diff --git a/Resources/Prototypes/_Backmen/Diseases/noninfectious.yml b/Resources/Prototypes/_Backmen/Diseases/noninfectious.yml index feeb57a2ca6..7e725985cde 100644 --- a/Resources/Prototypes/_Backmen/Diseases/noninfectious.yml +++ b/Resources/Prototypes/_Backmen/Diseases/noninfectious.yml @@ -142,72 +142,3 @@ path: /Audio/Animals/space_dragon_roar.ogg stages: - 2 - -- type: disease - id: XenoDroneVirus - name: disease-proto-xenodrone - cureResist: 0.5 - infectious: false - stages: - - 0 - - 120 - - 300 - effects: - # compulsion pop ups - - !type:DiseasePopUp - probability: 0.020 - type: Pvs - message: disease-seizures-compulsion - visualType: Medium - stages: - - 0 - - 1 - - 2 - - !type:DiseasePopUp - probability: 0.035 - message: disease-blood-compulsion - visualType: Medium - stages: - - 0 - - 1 - - 2 - - !type:DiseasePopUp - probability: 0.07 - message: disease-eaten-inside - visualType: Medium - # Seizures - - !type:DiseaseAdjustReagent - probability: 0.03 - reagent: - ReagentId: Licoxide - amount: 0.5 - # accent chance when speaking - - !type:DiseaseGenericStatusEffect - probability: 0.3 - key: Stutter - component: XenoAccent - stages: - - 1 - - !type:DiseaseGenericStatusEffect - probability: 0.75 - key: Stutter - component: XenoAccent - stages: - - 2 - # cellular damage, from being eaten on the inside - - !type:DiseaseHealthChange - probability: 0.025 - damage: - types: - Genetic: 1 - stages: - - 2 - # possible xeno polymorph - - !type:DiseasePolymorph - probability: 0.050 - polymorphId: XenoDroneMorph - polymorphMessage: disease-xeno-polymorph - polymorphSound: - path: /Audio/Animals/space_dragon_roar.ogg - stages: - - 2 diff --git a/Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/TGMC_xeno.yml b/Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/TGMC_xeno.yml index 1193b431779..f374aa99f34 100644 --- a/Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/TGMC_xeno.yml +++ b/Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/TGMC_xeno.yml @@ -46,15 +46,6 @@ - type: Polymorphable - type: Buckle - type: Insulated - - type: LanguageSpeaker - currentLanguage: Xeno - - type: LanguageKnowledge #backmen: languages - speaks: - - Xeno - understands: - - Xeno - - type: TTS - voice: Xenia - type: Hands showInHands: true - type: MobState @@ -157,6 +148,9 @@ description: Молодой ксеноморф. parent: KsenosXenoBase components: + - type: ActionGrant + actions: + - ActionViewLaws - type: Sprite drawdepth: Mobs layers: @@ -1773,6 +1767,14 @@ description: На вид мерзкое. save: false components: + - type: LanguageSpeaker + currentLanguage: Xeno + - type: LanguageKnowledge #backmen: languages + speaks: + - Xeno + understands: + - Xeno + - TauCetiBasic - type: ContainerContainer - type: ActionsContainer - type: Actions @@ -1810,7 +1812,7 @@ # softness: 5 # color: "#FF33FF" # autoRot: true - - type: GhostTakeoverAvailable + #- type: GhostTakeoverAvailable - type: GhostRole allowMovement: false allowSpeech: false @@ -1820,8 +1822,8 @@ rules: "Вырасти в полноценного защитника улья." raffle: settings: default - - type: Polymorphable - innatePolymorphs: [ EggToLarva ] + - type: GhostRoleMobSpawner + prototype: KsenosXenoLarva # LOCATOR # @@ -1873,7 +1875,7 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: true - delay: 30 + cooldown: 30 - type: polymorph id: LarvaToDrone @@ -1884,7 +1886,7 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: true - delay: 30 + cooldown: 30 - type: polymorph id: LarvaToRunner @@ -1895,7 +1897,7 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: true - delay: 30 + cooldown: 30 - type: polymorph id: DroneToSpitter @@ -1906,7 +1908,7 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: true - delay: 30 + cooldown: 30 - type: polymorph id: RunnerToWarrior @@ -1917,7 +1919,7 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: true - delay: 30 + cooldown: 30 - type: polymorph id: RunnerToHunter @@ -1928,7 +1930,7 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: true - delay: 30 + cooldown: 30 # ABILITIES # @@ -1954,7 +1956,7 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: false - delay: 30 + cooldown: 30 - type: polymorph id: Larva @@ -1965,7 +1967,7 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: true - delay: 30 + cooldown: 30 - type: polymorph id: Drone @@ -1976,7 +1978,7 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: true - delay: 30 + cooldown: 30 - type: polymorph id: Runner @@ -1987,7 +1989,7 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: true - delay: 30 + cooldown: 30 - type: polymorph id: Spitter @@ -1998,7 +2000,7 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: true - delay: 30 + cooldown: 30 - type: polymorph id: Warrior @@ -2009,7 +2011,7 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: true - delay: 30 + cooldown: 30 - type: polymorph id: Praetorian @@ -2020,7 +2022,7 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: true - delay: 30 + cooldown: 30 - type: polymorph id: Ravager @@ -2031,7 +2033,7 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: true - delay: 30 + cooldown: 30 - type: polymorph id: Queen @@ -2042,4 +2044,4 @@ revertOnCrit: false revertOnDeath: false allowRepeatedMorphs: true - delay: 30 + cooldown: 30 diff --git a/Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_mobs.yml b/Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_mobs.yml index b8ad60b013b..c5cb1248669 100644 --- a/Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_mobs.yml +++ b/Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/blob/blob_mobs.yml @@ -45,6 +45,9 @@ - type: HTN rootTask: task: BlobPodCompound + blackboard: + NavBlob: !type:Bool + true - type: BlobMob - type: BlobSpeak - type: LanguageSpeaker diff --git a/Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/robots.yml b/Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/robots.yml index c3de7ed4534..50f60bfe41f 100644 --- a/Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/robots.yml +++ b/Resources/Prototypes/_Backmen/Entities/Mobs/NPCs/robots.yml @@ -68,14 +68,6 @@ - type: CombatMode # - type: ReplacementAccent # accent: silicon - - type: LanguageSpeaker - currentLanguage: TauCetiBasic - - type: LanguageKnowledge #backmen: languages - speaks: - - Binary - understands: - - Binary - - TauCetiBasic - type: UnpoweredFlashlight - type: PointLight enabled: true diff --git a/Resources/Prototypes/_Backmen/Entities/Objects/Misc/soul_stones.yml b/Resources/Prototypes/_Backmen/Entities/Objects/Misc/soul_stones.yml index 0fe0833ba4c..6568ecef929 100644 --- a/Resources/Prototypes/_Backmen/Entities/Objects/Misc/soul_stones.yml +++ b/Resources/Prototypes/_Backmen/Entities/Objects/Misc/soul_stones.yml @@ -32,4 +32,13 @@ - type: PointLight radius: 1.3 energy: 3.0 - color: "#FF0000" \ No newline at end of file + color: "#FF0000" + - type: LanguageSpeaker + currentLanguage: Nekomimetic + - type: LanguageKnowledge #backmen: languages + speaks: + - Nekomimetic + - TauCetiBasic + understands: + - Nekomimetic + - TauCetiBasic diff --git a/Resources/Prototypes/_Backmen/Polymorphs/xeno.yml b/Resources/Prototypes/_Backmen/Polymorphs/xeno.yml index 3a3574248a7..5d5275a4879 100644 --- a/Resources/Prototypes/_Backmen/Polymorphs/xeno.yml +++ b/Resources/Prototypes/_Backmen/Polymorphs/xeno.yml @@ -2,7 +2,7 @@ - type: polymorph id: XenoQueenMorph configuration: - entity: MobXenoQueen + entity: KsenosXenoQueen forced: true inventory: Drop transferName: true @@ -12,7 +12,7 @@ - type: polymorph id: XenoDroneMorph configuration: - entity: MobXenoDrone + entity: KsenosXenoDrone forced: true inventory: Drop transferName: true