diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 4d5db5747f..3b998ddbeb 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -25,7 +25,7 @@ Для записей в списке изменений есть 4 значка: add, remove, tweak, fix. Думаю, вы сможете разобраться с остальным. Вы можете поставить свое имя после символа :cl:, чтобы изменить имя, которое будет отображаться в журнале изменений (в противном случае будет использоваться ваше имя пользователя GitHub) -Например: ":cl: DVOniksWyvern". +Например: ":cl: Amongus". Как правило, в журналы изменений следует помещать только то, что действительно важно игрокам. Вещи вроде "Рефактор системы X, но изменений вы не увидите" - не должны быть в журнале изменений, эти изменения обычные игроки не смогут заметить. diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.CVars.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.CVars.cs index 4d50700738..3aaa5429fb 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.CVars.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.CVars.cs @@ -12,14 +12,9 @@ namespace Content.Server.Atmos.EntitySystems public float SpaceWindPressureForceDivisorPush { get; private set; } public float SpaceWindMaxVelocity { get; private set; } public float SpaceWindMaxPushForce { get; private set; } - public float SpaceWindMinimumCalculatedMass { get; private set; } - public float SpaceWindMaximumCalculatedInverseMass { get; private set; } - public bool MonstermosUseExpensiveAirflow { get; private set; } public bool MonstermosEqualization { get; private set; } public bool MonstermosDepressurization { get; private set; } public bool MonstermosRipTiles { get; private set; } - public float MonstermosRipTilesMinimumPressure { get; private set; } - public float MonstermosRipTilesPressureOffset { get; private set; } public bool GridImpulse { get; private set; } public float SpacingEscapeRatio { get; private set; } public float SpacingMinGas { get; private set; } @@ -31,7 +26,6 @@ namespace Content.Server.Atmos.EntitySystems public float AtmosTickRate { get; private set; } public float Speedup { get; private set; } public float HeatScale { get; private set; } - public float HumanoidThrowMultiplier { get; private set; } /// /// Time between each atmos sub-update. If you are writing an atmos device, use AtmosDeviceUpdateEvent.dt @@ -47,14 +41,9 @@ namespace Content.Server.Atmos.EntitySystems Subs.CVar(_cfg, CCVars.SpaceWindPressureForceDivisorPush, value => SpaceWindPressureForceDivisorPush = value, true); Subs.CVar(_cfg, CCVars.SpaceWindMaxVelocity, value => SpaceWindMaxVelocity = value, true); Subs.CVar(_cfg, CCVars.SpaceWindMaxPushForce, value => SpaceWindMaxPushForce = value, true); - Subs.CVar(_cfg, CCVars.SpaceWindMinimumCalculatedMass, value => SpaceWindMinimumCalculatedMass = value, true); - Subs.CVar(_cfg, CCVars.SpaceWindMaximumCalculatedInverseMass, value => SpaceWindMaximumCalculatedInverseMass = value, true); - Subs.CVar(_cfg, CCVars.MonstermosUseExpensiveAirflow, value => MonstermosUseExpensiveAirflow = value, true); Subs.CVar(_cfg, CCVars.MonstermosEqualization, value => MonstermosEqualization = value, true); Subs.CVar(_cfg, CCVars.MonstermosDepressurization, value => MonstermosDepressurization = value, true); Subs.CVar(_cfg, CCVars.MonstermosRipTiles, value => MonstermosRipTiles = value, true); - Subs.CVar(_cfg, CCVars.MonstermosRipTilesMinimumPressure, value => MonstermosRipTilesMinimumPressure = value, true); - Subs.CVar(_cfg, CCVars.MonstermosRipTilesPressureOffset, value => MonstermosRipTilesPressureOffset = value, true); Subs.CVar(_cfg, CCVars.AtmosGridImpulse, value => GridImpulse = value, true); Subs.CVar(_cfg, CCVars.AtmosSpacingEscapeRatio, value => SpacingEscapeRatio = value, true); Subs.CVar(_cfg, CCVars.AtmosSpacingMinGas, value => SpacingMinGas = value, true); @@ -66,7 +55,6 @@ namespace Content.Server.Atmos.EntitySystems Subs.CVar(_cfg, CCVars.AtmosHeatScale, value => { HeatScale = value; InitializeGases(); }, true); Subs.CVar(_cfg, CCVars.ExcitedGroups, value => ExcitedGroups = value, true); Subs.CVar(_cfg, CCVars.ExcitedGroupsSpaceIsAllConsuming, value => ExcitedGroupsSpaceIsAllConsuming = value, true); - Subs.CVar(_cfg, CCVars.AtmosHumanoidThrowMultiplier, value => HumanoidThrowMultiplier = value, true); } } } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs index 461435f062..d063f1e333 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.HighPressureDelta.cs @@ -1,6 +1,5 @@ using Content.Server.Atmos.Components; using Content.Shared.Atmos; -using Content.Shared.Humanoid; using Content.Shared.Mobs.Components; using Content.Shared.Physics; using Robust.Shared.Audio; @@ -50,7 +49,8 @@ namespace Content.Server.Atmos.EntitySystems comp.Accumulator = 0f; toRemove.Add(ent); - if (TryComp(uid, out var body)) + if (HasComp(uid) && + TryComp(uid, out var body)) { _physics.SetBodyStatus(uid, body, BodyStatus.OnGround); } @@ -70,10 +70,27 @@ namespace Content.Server.Atmos.EntitySystems } } + private void AddMobMovedByPressure(EntityUid uid, MovedByPressureComponent component, PhysicsComponent body) + { + if (!TryComp(uid, out var fixtures)) + return; + + _physics.SetBodyStatus(uid, body, BodyStatus.InAir); + + foreach (var (id, fixture) in fixtures.Fixtures) + { + _physics.RemoveCollisionMask(uid, id, fixture, (int) CollisionGroup.TableLayer, manager: fixtures); + } + + // TODO: Make them dynamic type? Ehh but they still want movement so uhh make it non-predicted like weightless? + // idk it's hard. + + component.Accumulator = 0f; + _activePressures.Add((uid, component)); + } + private void HighPressureMovements(Entity gridAtmosphere, TileAtmosphere tile, EntityQuery bodies, EntityQuery xforms, EntityQuery pressureQuery, EntityQuery metas) { - if (tile.PressureDifference < SpaceWindMinimumCalculatedMass * SpaceWindMinimumCalculatedMass) - return; // TODO ATMOS finish this // Don't play the space wind sound on tiles that are on fire... @@ -104,7 +121,7 @@ namespace Content.Server.Atmos.EntitySystems // If we're using monstermos, smooth out the yeet direction to follow the flow //TODO This is bad, don't run this. It just makes the throws worse by somehow rounding them to orthogonal - if (!MonstermosEqualization) + if (MonstermosEqualization) { // We step through tiles according to the pressure direction on the current tile. // The goal is to get a general direction of the airflow in the area. @@ -144,7 +161,7 @@ namespace Content.Server.Atmos.EntitySystems (entity, pressureMovements), gridAtmosphere.Comp.UpdateCounter, tile.PressureDifference, - tile.PressureDirection, + tile.PressureDirection, 0, tile.PressureSpecificTarget != null ? _mapSystem.ToCenterCoordinates(tile.GridIndex, tile.PressureSpecificTarget.GridIndices) : EntityCoordinates.Invalid, gridWorldRotation, xforms.GetComponent(entity), @@ -165,29 +182,12 @@ namespace Content.Server.Atmos.EntitySystems tile.PressureDirection = differenceDirection; } - //INFO The EE version of this function drops pressureResistanceProbDelta, since it's not needed. If you are for whatever reason calling this function - //INFO And if it isn't working, you've probably still got the pressureResistanceProbDelta line included. - /// - /// EXPLANATION: - /// pressureDifference = Force of Air Flow on a given tile - /// physics.Mass = Mass of the object potentially being thrown - /// physics.InvMass = 1 divided by said Mass. More CPU efficient way to do division. - /// - /// Objects can only be thrown if the force of air flow is greater than the SQUARE of their mass or {SpaceWindMinimumCalculatedMass}, whichever is heavier - /// This means that the heavier an object is, the exponentially more force is required to move it - /// The force of a throw is equal to the force of air pressure, divided by an object's mass. So not only are heavier objects - /// less likely to be thrown, they are also harder to throw, - /// while lighter objects are yeeted easily, and from great distance. - /// - /// For a human sized entity with a standard weight of 80kg and a spacing between a hard vacuum and a room pressurized at 101kpa, - /// The human shall only be moved if he is either very close to the hole, or is standing in a region of high airflow - /// - public void ExperiencePressureDifference( Entity ent, int cycle, float pressureDifference, AtmosDirection direction, + float pressureResistanceProbDelta, EntityCoordinates throwTarget, Angle gridWorldRotation, TransformComponent? xform = null, @@ -200,28 +200,50 @@ namespace Content.Server.Atmos.EntitySystems if (!Resolve(uid, ref xform)) return; + // TODO ATMOS stuns? - if (physics.BodyType != BodyType.Static - && !float.IsPositiveInfinity(component.MoveResist)) + var maxForce = MathF.Sqrt(pressureDifference) * 2.25f; + var moveProb = 100f; + + if (component.PressureResistance > 0) + moveProb = MathF.Abs((pressureDifference / component.PressureResistance * MovedByPressureComponent.ProbabilityBasePercent) - + MovedByPressureComponent.ProbabilityOffset); + + // Can we yeet the thing (due to probability, strength, etc.) + if (moveProb > MovedByPressureComponent.ProbabilityOffset && _robustRandom.Prob(MathF.Min(moveProb / 100f, 1f)) + && !float.IsPositiveInfinity(component.MoveResist) + && (physics.BodyType != BodyType.Static + && (maxForce >= (component.MoveResist * MovedByPressureComponent.MoveForcePushRatio))) + || (physics.BodyType == BodyType.Static && (maxForce >= (component.MoveResist * MovedByPressureComponent.MoveForceForcePushRatio)))) { - var moveForce = pressureDifference * MathF.Max(physics.InvMass, SpaceWindMaximumCalculatedInverseMass); - if (HasComp(ent)) - moveForce *= HumanoidThrowMultiplier; - if (moveForce > physics.Mass) + if (HasComp(uid)) { + AddMobMovedByPressure(uid, component, physics); + } + + if (maxForce > MovedByPressureComponent.ThrowForce) + { + var moveForce = maxForce; + moveForce /= (throwTarget != EntityCoordinates.Invalid) ? SpaceWindPressureForceDivisorThrow : SpaceWindPressureForceDivisorPush; + moveForce *= MathHelper.Clamp(moveProb, 0, 100); + + // Apply a sanity clamp to prevent being thrown through objects. + var maxSafeForceForObject = SpaceWindMaxVelocity * physics.Mass; + moveForce = MathF.Min(moveForce, maxSafeForceForObject); + // Grid-rotation adjusted direction var dirVec = (direction.ToAngle() + gridWorldRotation).ToWorldVec(); - moveForce *= MathF.Max(physics.InvMass, SpaceWindMaximumCalculatedInverseMass); - //TODO Consider replacing throw target with proper trigonometry angles. + // TODO: Technically these directions won't be correct but uhh I'm just here for optimisations buddy not to fix my old bugs. if (throwTarget != EntityCoordinates.Invalid) { - var pos = throwTarget.ToMap(EntityManager, _transformSystem).Position - xform.WorldPosition + dirVec; - _throwing.TryThrow(uid, pos.Normalized() * MathF.Min(moveForce, SpaceWindMaxVelocity), moveForce); + var pos = ((throwTarget.ToMap(EntityManager, _transformSystem).Position - xform.WorldPosition).Normalized() + dirVec).Normalized(); + _physics.ApplyLinearImpulse(uid, pos * moveForce, body: physics); } else { - _throwing.TryThrow(uid, dirVec.Normalized() * MathF.Min(moveForce, SpaceWindMaxVelocity), moveForce); + moveForce = MathF.Min(moveForce, SpaceWindMaxPushForce); + _physics.ApplyLinearImpulse(uid, dirVec * moveForce, body: physics); } component.LastHighPressureMovementAirCycle = cycle; diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs index 8bb34cc1c3..5de5f60922 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Monstermos.cs @@ -5,11 +5,8 @@ using Content.Server.Doors.Systems; using Content.Shared.Atmos; using Content.Shared.Atmos.Components; using Content.Shared.Database; -using Content.Shared.Maps; -using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; -using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Utility; namespace Content.Server.Atmos.EntitySystems @@ -139,7 +136,7 @@ namespace Content.Server.Atmos.EntitySystems var logN = MathF.Log2(tileCount); // Optimization - try to spread gases using an O(n log n) algorithm that has a chance of not working first to avoid O(n^2) - if (!MonstermosUseExpensiveAirflow && giverTilesLength > logN && takerTilesLength > logN) + if (giverTilesLength > logN && takerTilesLength > logN) { // Even if it fails, it will speed up the next part. Array.Sort(_equalizeTiles, 0, tileCount, _monstermosComparer); @@ -552,8 +549,7 @@ namespace Content.Server.Atmos.EntitySystems } InvalidateVisuals(ent, otherTile); - if (MonstermosRipTiles && otherTile.PressureDifference > MonstermosRipTilesMinimumPressure) - HandleDecompressionFloorRip(mapGrid, otherTile, otherTile.PressureDifference); + HandleDecompressionFloorRip(mapGrid, otherTile, otherTile.MonstermosInfo.CurrentTransferAmount); } if (GridImpulse && tileCount > 0) @@ -685,14 +681,14 @@ namespace Content.Server.Atmos.EntitySystems adj.MonstermosInfo[idx.ToOppositeDir()] -= amount; } - private void HandleDecompressionFloorRip(MapGridComponent mapGrid, TileAtmosphere tile, float delta) + private void HandleDecompressionFloorRip(MapGridComponent mapGrid, TileAtmosphere tile, float sum) { - if (!mapGrid.TryGetTileRef(tile.GridIndices, out var tileRef)) + if (!MonstermosRipTiles) return; - var tileref = tileRef.Tile; - var tileDef = (ContentTileDefinition) _tileDefinitionManager[tileref.TypeId]; - if (!tileDef.Reinforced && tileDef.TileRipResistance < delta * MonstermosRipTilesPressureOffset) + var chance = MathHelper.Clamp(0.01f + (sum / SpacingMaxWind) * 0.3f, 0.003f, 0.3f); + + if (sum > 20 && _robustRandom.Prob(chance)) PryTile(mapGrid, tile.GridIndices); } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs index dbbe769bea..44bfa4cc10 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs @@ -6,7 +6,6 @@ using Content.Server.NodeContainer.EntitySystems; using Content.Shared.Atmos.EntitySystems; using Content.Shared.Doors.Components; using Content.Shared.Maps; -using Content.Shared.Throwing; using JetBrains.Annotations; using Robust.Server.GameObjects; using Robust.Shared.Audio.Systems; @@ -38,7 +37,6 @@ public sealed partial class AtmosphereSystem : SharedAtmosphereSystem [Dependency] private readonly TileSystem _tile = default!; [Dependency] private readonly MapSystem _map = default!; [Dependency] public readonly PuddleSystem Puddle = default!; - [Dependency] private readonly ThrowingSystem _throwing = default!; private const float ExposedUpdateDelay = 1f; private float _exposedTimer = 0f; diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index fdf29d659d..3262514b96 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -1,6 +1,5 @@ using Content.Server._White.Accent.Bloodloss; using Content.Server.Body.Components; -using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Chemistry.ReactionEffects; using Content.Server.Fluids.EntitySystems; using Content.Server.Forensics; @@ -13,7 +12,6 @@ using Content.Shared.Chemistry.EntitySystems; using Content.Shared.Chemistry.Reaction; using Content.Shared.Damage; using Content.Shared.Damage.Components; -using Content.Shared.Damage.Prototypes; using Content.Shared.Drunk; using Content.Shared.FixedPoint; using Content.Shared.Mobs; @@ -23,7 +21,6 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Systems; using Content.Shared.Popups; using Content.Shared.Rejuvenate; -using Content.Shared.Speech.EntitySystems; using Robust.Server.Audio; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -42,8 +39,7 @@ public sealed class BloodstreamSystem : EntitySystem [Dependency] private readonly PuddleSystem _puddleSystem = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!; [Dependency] private readonly SharedDrunkSystem _drunkSystem = default!; - [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; - [Dependency] private readonly SharedStutteringSystem _stutteringSystem = default!; + [Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!; [Dependency] private readonly AlertsSystem _alertsSystem = default!; [Dependency] private readonly ForensicsSystem _forensicsSystem = default!; [Dependency] private readonly MovementSpeedModifierSystem _speed = default!; // WD @@ -188,12 +184,23 @@ public sealed class BloodstreamSystem : EntitySystem private void OnComponentInit(Entity entity, ref ComponentInit args) { - var chemicalSolution = _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.ChemicalSolutionName); - var bloodSolution = _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodSolutionName); - var tempSolution = _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodTemporarySolutionName); + _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.ChemicalSolutionName, out var chemicalSolution); + _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodSolutionName, out var bloodSolution); + _solutionContainerSystem.EnsureSolution(entity.Owner, entity.Comp.BloodTemporarySolutionName, out var tempSolution); + + if (chemicalSolution == null) + return; chemicalSolution.MaxVolume = entity.Comp.ChemicalMaxVolume; + + if (bloodSolution == null) + return; + bloodSolution.MaxVolume = entity.Comp.BloodMaxVolume; + + if (tempSolution == null) + return; + tempSolution.MaxVolume = entity.Comp.BleedPuddleThreshold * 4; // give some leeway, for chemstream as well // Fill blood solution with BLOOD @@ -203,12 +210,10 @@ public sealed class BloodstreamSystem : EntitySystem private void OnDamageChanged(Entity ent, ref DamageChangedEvent args) { if (args.DamageDelta is null || !args.DamageIncreased) - { return; - } // TODO probably cache this or something. humans get hurt a lot - if (!_prototypeManager.TryIndex(ent.Comp.DamageBleedModifiers, out var modifiers)) + if (!_prototypeManager.TryIndex(ent.Comp.DamageBleedModifiers, out var modifiers)) return; var bloodloss = DamageSpecifier.ApplyModifierSet(args.DamageDelta, modifiers); @@ -222,11 +227,12 @@ public sealed class BloodstreamSystem : EntitySystem var totalFloat = total.Float(); TryModifyBleedAmount(ent, totalFloat, ent); - /// - /// Critical hit. Causes target to lose blood, using the bleed rate modifier of the weapon, currently divided by 5 - /// The crit chance is currently the bleed rate modifier divided by 25. - /// Higher damage weapons have a higher chance to crit! - /// + /* + Critical hit. Causes target to lose blood, using the bleed rate modifier of the weapon, currently divided by 5 + The crit chance is currently the bleed rate modifier divided by 25. + Higher damage weapons have a higher chance to crit! + */ + var prob = Math.Clamp(totalFloat / 25, 0, 1); if (totalFloat > 0 && _robustRandom.Prob(prob)) { @@ -413,7 +419,7 @@ public sealed class BloodstreamSystem : EntitySystem if (HasComp(uid)) // WD { - if (component.BleedAmount == 0f) + if (component.BleedAmount == 0) RemComp(uid); _speed.RefreshMovementSpeedModifiers(uid); diff --git a/Content.Server/Nuke/NukeSystem.cs b/Content.Server/Nuke/NukeSystem.cs index db425b491e..fbc25027d0 100644 --- a/Content.Server/Nuke/NukeSystem.cs +++ b/Content.Server/Nuke/NukeSystem.cs @@ -4,6 +4,7 @@ using Content.Server.Chat.Systems; using Content.Server.Explosion.EntitySystems; using Content.Server.Pinpointer; using Content.Server.Popups; +using Content.Server.RoundEnd; using Content.Server.Station.Systems; using Content.Shared.Audio; using Content.Shared.Containers.ItemSlots; @@ -43,6 +44,7 @@ public sealed class NukeSystem : EntitySystem [Dependency] private readonly StationSystem _station = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; [Dependency] private readonly AppearanceSystem _appearance = default!; + [Dependency] private readonly RoundEndSystem _roundEndSystem = default!; /// /// Used to calculate when the nuke song should start playing for maximum kino with the nuke sfx @@ -568,6 +570,8 @@ public sealed class NukeSystem : EntitySystem _sound.StopStationEventMusic(uid, StationEventMusicType.Nuke); Del(uid); + + _roundEndSystem.EndRound(TimeSpan.FromSeconds(30)); //Giedi EDIT } /// diff --git a/Content.Server/Speech/EntitySystems/FrontalLispSystem.cs b/Content.Server/Speech/EntitySystems/FrontalLispSystem.cs index 1508a8b2d4..7d55cd491d 100644 --- a/Content.Server/Speech/EntitySystems/FrontalLispSystem.cs +++ b/Content.Server/Speech/EntitySystems/FrontalLispSystem.cs @@ -10,6 +10,12 @@ public sealed class FrontalLispSystem : EntitySystem private static readonly Regex RegexLowerTh = new(@"[t]+[s]+|[s]+[c]+(?=[iey]+)|[c]+(?=[iey]+)|[p][s]+|([s]+[t]+|[t]+)(?=[i]+[o]+[u]*[n]*)|[c]+[h]+(?=[i]*[e]*)|[z]+|[s]+|[x]+(?=[e]+)"); private static readonly Regex RegexUpperEcks = new(@"[E]+[Xx]+[Cc]*|[X]+"); private static readonly Regex RegexLowerEcks = new(@"[e]+[x]+[c]*|[x]+"); + // WD start + private static readonly Regex RegexUpperS = new(@"С"); + private static readonly Regex RegexLowerS = new(@"с"); + private static readonly Regex RegexUpperZ = new(@"З"); + private static readonly Regex RegexLowerZ = new(@"з"); + // WD end // @formatter:on public override void Initialize() @@ -29,6 +35,13 @@ public sealed class FrontalLispSystem : EntitySystem message = RegexUpperEcks.Replace(message, "EKTH"); message = RegexLowerEcks.Replace(message, "ekth"); + // WD start + message = RegexUpperS.Replace(message, "Ш"); + message = RegexLowerS.Replace(message, "ш"); + message = RegexUpperZ.Replace(message, "Ж"); + message = RegexLowerZ.Replace(message, "ж"); + // WD end + args.Message = message; } } diff --git a/Content.Server/StationEvents/Events/IonStormRule.cs b/Content.Server/StationEvents/Events/IonStormRule.cs index 8361cc6048..0523e0669d 100644 --- a/Content.Server/StationEvents/Events/IonStormRule.cs +++ b/Content.Server/StationEvents/Events/IonStormRule.cs @@ -234,6 +234,8 @@ public sealed class IonStormRule : StationEventSystem if (plural) feeling = feelingPlural; + var subjects = RobustRandom.Prob(0.5f) ? objectsThreats : Loc.GetString("ion-storm-people"); // WD ahead of wizden upstream + // message logic!!! return RobustRandom.Next(0, 36) switch { @@ -265,7 +267,7 @@ public sealed class IonStormRule : StationEventSystem 26 => Loc.GetString("ion-storm-law-crew-must-go", ("who", crewAll), ("area", area)), 27 => Loc.GetString("ion-storm-law-crew-only-1", ("who", crew1), ("part", part)), 28 => Loc.GetString("ion-storm-law-crew-only-2", ("who", crew1), ("other", crew2), ("part", part)), - 29 => Loc.GetString("ion-storm-law-crew-only-subjects", ("adjective", adjective), ("subjects", RobustRandom.Prob(0.5f) ? objectsThreats : "PEOPLE"), ("part", part)), + 29 => Loc.GetString("ion-storm-law-crew-only-subjects", ("adjective", adjective), ("subjects", subjects), ("part", part)), // WD ahead of wizden upstream 30 => Loc.GetString("ion-storm-law-crew-must-do", ("must", must), ("part", part)), 31 => Loc.GetString("ion-storm-law-crew-must-have", ("adjective", adjective), ("objects", objects), ("part", part)), 32 => Loc.GetString("ion-storm-law-crew-must-eat", ("who", who), ("adjective", adjective), ("food", food), ("part", part)), diff --git a/Content.Server/Temperature/Systems/TemperatureSystem.cs b/Content.Server/Temperature/Systems/TemperatureSystem.cs index c082aade28..5436f11fd9 100644 --- a/Content.Server/Temperature/Systems/TemperatureSystem.cs +++ b/Content.Server/Temperature/Systems/TemperatureSystem.cs @@ -171,9 +171,7 @@ public sealed class TemperatureSystem : EntitySystem { return Atmospherics.MinimumHeatCapacity; } - if (physics.Mass < 1) - return comp.SpecificHeat; - else return comp.SpecificHeat * physics.FixturesMass; + return comp.SpecificHeat * physics.FixturesMass; } private void OnInit(EntityUid uid, InternalTemperatureComponent comp, MapInitEvent args) diff --git a/Content.Server/VoiceMask/VoiceMaskerComponent.cs b/Content.Server/VoiceMask/VoiceMaskerComponent.cs index a209393bf8..b0eb874ff2 100644 --- a/Content.Server/VoiceMask/VoiceMaskerComponent.cs +++ b/Content.Server/VoiceMask/VoiceMaskerComponent.cs @@ -7,7 +7,7 @@ namespace Content.Server.VoiceMask; public sealed partial class VoiceMaskerComponent : Component { [ViewVariables(VVAccess.ReadWrite), DataField] - public string LastSetName = "Unknown"; + public string LastSetName = "Неизвестный"; // WD translate [ViewVariables(VVAccess.ReadWrite)] public string? LastSetVoice; // tts @@ -20,4 +20,4 @@ public sealed partial class VoiceMaskerComponent : Component [DataField] public EntityUid? ActionEntity; -} \ No newline at end of file +} diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index a8211480fd..b75600dfcf 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -1122,7 +1122,7 @@ namespace Content.Shared.CCVar /// Useful to prevent clipping through objects. /// public static readonly CVarDef SpaceWindMaxVelocity = - CVarDef.Create("atmos.space_wind_max_velocity", 7f, CVar.SERVERONLY); + CVarDef.Create("atmos.space_wind_max_velocity", 30f, CVar.SERVERONLY); /// /// The maximum force that may be applied to an object by pushing (i.e. not throwing) atmospheric pressure differences. @@ -1131,24 +1131,6 @@ namespace Content.Shared.CCVar public static readonly CVarDef SpaceWindMaxPushForce = CVarDef.Create("atmos.space_wind_max_push_force", 17f, CVar.SERVERONLY); - /// - /// If an object's mass is below this number, then this number is used in place of mass to determine whether air pressure can throw an object. - /// This has nothing to do with throwing force, only acting as a way of reducing the odds of tiny 5 gram objects from being yeeted by people's breath - /// - /// - /// If you are reading this because you want to change it, consider looking into why almost every item in the game weighs only 5 grams - /// And maybe do your part to fix that? :) - /// - public static readonly CVarDef SpaceWindMinimumCalculatedMass = - CVarDef.Create("atmos.space_wind_minimum_calculated_mass", 10f, CVar.SERVERONLY); - - /// - /// Calculated as 1/Mass, where Mass is the physics.Mass of the desired threshold. - /// If an object's inverse mass is lower than this, it is capped at this. Basically, an upper limit to how heavy an object can be before it stops resisting space wind more. - /// - public static readonly CVarDef SpaceWindMaximumCalculatedInverseMass = - CVarDef.Create("atmos.space_wind_maximum_calculated_inverse_mass", 0.08f, CVar.SERVERONLY); - /// /// Whether monstermos tile equalization is enabled. /// @@ -1170,21 +1152,7 @@ namespace Content.Shared.CCVar /// Also looks weird on slow spacing for unrelated reasons. If you do want to enable this, you should probably turn on instaspacing. /// public static readonly CVarDef MonstermosRipTiles = - CVarDef.Create("atmos.monstermos_rip_tiles", true, CVar.SERVERONLY); - - /// - /// Taken as the cube of a tile's mass, this acts as a minimum threshold of mass for which air pressure calculates whether or not to rip a tile from the floor - /// This should be set by default to the cube of the game's lowest mass tile as defined in their prototypes, but can be increased for server performance reasons - /// - public static readonly CVarDef MonstermosRipTilesMinimumPressure = - CVarDef.Create("atmos.monstermos_rip_tiles_min_pressure", 7500f, CVar.SERVERONLY); - - /// - /// Taken after the minimum pressure is checked, the effective pressure is multiplied by this amount. - /// This allows server hosts to finely tune how likely floor tiles are to be ripped apart by air pressure - /// - public static readonly CVarDef MonstermosRipTilesPressureOffset = - CVarDef.Create("atmos.monstermos_rip_tiles_pressure_offset", 0.44f, CVar.SERVERONLY); + CVarDef.Create("atmos.monstermos_rip_tiles", false, CVar.SERVERONLY); /// /// Whether explosive depressurization will cause the grid to gain an impulse. @@ -1215,13 +1183,6 @@ namespace Content.Shared.CCVar public static readonly CVarDef AtmosSpacingMaxWind = CVarDef.Create("atmos.mmos_max_wind", 500f, CVar.SERVERONLY); - /// - /// Increases default airflow calculations to O(n^2) complexity, for use with heavy space wind optimizations. Potato servers BEWARE - /// This solves the problem of objects being trapped in an infinite loop of slamming into a wall repeatedly. - /// - public static readonly CVarDef MonstermosUseExpensiveAirflow = - CVarDef.Create("atmos.mmos_expensive_airflow", true, CVar.SERVERONLY); - /// /// Whether atmos superconduction is enabled. /// @@ -1278,13 +1239,6 @@ namespace Content.Shared.CCVar public static readonly CVarDef AtmosHeatScale = CVarDef.Create("atmos.heat_scale", 8f, CVar.SERVERONLY); - /// - /// A multiplier on the amount of force applied to Humanoid entities, as tracked by HumanoidAppearanceComponent - /// This multiplier is added after all other checks are made, and applies to both throwing force, and how easy it is for an entity to be thrown. - /// - public static readonly CVarDef AtmosHumanoidThrowMultiplier = - CVarDef.Create("atmos.humanoid_throw_multiplier", 2f, CVar.SERVERONLY); - /* * MIDI instruments */ diff --git a/Content.Shared/Item/ItemToggle/Components/ItemToggleComponent.cs b/Content.Shared/Item/ItemToggle/Components/ItemToggleComponent.cs index 620ddfd194..be8f1b5912 100644 --- a/Content.Shared/Item/ItemToggle/Components/ItemToggleComponent.cs +++ b/Content.Shared/Item/ItemToggle/Components/ItemToggleComponent.cs @@ -51,6 +51,14 @@ public sealed partial class ItemToggleComponent : Component /// [ViewVariables(VVAccess.ReadWrite), DataField, AutoNetworkedField] public bool ToggleLight = true; + + // WD added start + [DataField] + public string ActivatedDescription = "comp-item-toggle-on"; // fallback/standard text + + [DataField] + public string DeactivatedDescription = "comp-item-toggle-off"; // fallback/standard text + // WD added end } /// diff --git a/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs b/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs index 4ef614f298..5b69bca6b9 100644 --- a/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs +++ b/Content.Shared/Item/ItemToggle/SharedItemToggleSystem.cs @@ -1,3 +1,4 @@ +using Content.Shared.Examine; using Content.Shared.Interaction.Events; using Content.Shared.Item.ItemToggle.Components; using Content.Shared.Popups; @@ -23,6 +24,8 @@ public abstract class SharedItemToggleSystem : EntitySystem [Dependency] private readonly INetManager _netManager = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedItemSystem _item = default!; // WD + public override void Initialize() { base.Initialize(); @@ -35,6 +38,9 @@ public abstract class SharedItemToggleSystem : EntitySystem SubscribeLocalEvent(OnIsHotEvent); SubscribeLocalEvent(UpdateActiveSound); + + SubscribeLocalEvent(OnExamined); // WD + SubscribeLocalEvent(UpdatePrefix); // WD } private void OnStartup(Entity ent, ref ComponentStartup args) @@ -255,4 +261,21 @@ public abstract class SharedItemToggleSystem : EntitySystem activeSound.PlayingStream = _audio.Stop(activeSound.PlayingStream); } } + + // WD added start + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + var onMsg = IsActivated(ent.Owner) + ? Loc.GetString(ent.Comp.ActivatedDescription) + : Loc.GetString(ent.Comp.DeactivatedDescription); + + args.PushMarkup(onMsg); + } + + private void UpdatePrefix(Entity ent, ref ItemToggledEvent args) + { + _item.SetHeldPrefix(ent.Owner, args.Activated ? "on" : "off"); + } + + // WD added end } diff --git a/Content.Shared/Maps/ContentTileDefinition.cs b/Content.Shared/Maps/ContentTileDefinition.cs index 12885f20a4..839d920df9 100644 --- a/Content.Shared/Maps/ContentTileDefinition.cs +++ b/Content.Shared/Maps/ContentTileDefinition.cs @@ -117,11 +117,5 @@ namespace Content.Shared.Maps { TileId = id; } - - [DataField] - public bool Reinforced = false; - - [DataField] - public float TileRipResistance = 125f; } } diff --git a/Content.Shared/RCD/Systems/RCDAmmoSystem.cs b/Content.Shared/RCD/Systems/RCDAmmoSystem.cs index 159da03d1b..b1d1f2d233 100644 --- a/Content.Shared/RCD/Systems/RCDAmmoSystem.cs +++ b/Content.Shared/RCD/Systems/RCDAmmoSystem.cs @@ -63,6 +63,21 @@ public sealed class RCDAmmoSystem : EntitySystem var user = args.User; args.Handled = true; + + // WD edit start + TryComp(uid, out var stackComponent); + if (stackComponent != null) + { + var realValue = (int) (stackComponent.Count * comp.ChargeCountModifier); + comp.Charges = realValue; + if (realValue == 0) + { + _popup.PopupClient(Loc.GetString("rcd-ammo-component-after-interact-not-enough"), target, user); + return; + } + } + // WD edit end + var count = Math.Min(charges.MaxCharges - charges.Charges, comp.Charges); if (count <= 0) { @@ -73,7 +88,7 @@ public sealed class RCDAmmoSystem : EntitySystem _popup.PopupClient(Loc.GetString("rcd-ammo-component-after-interact-refilled"), target, user); // WD edit start - if (TryComp(uid, out var stackComponent)) + if (stackComponent != null) { var spent = (int) (count / comp.ChargeCountModifier) == 0 ? 1 : (int) (count / comp.ChargeCountModifier); _stack.SetCount(uid, stackComponent.Count - spent); diff --git a/Content.Shared/Silicons/Laws/Components/IonStormTargetComponent.cs b/Content.Shared/Silicons/Laws/Components/IonStormTargetComponent.cs index 2d44408b8d..70fa460dec 100644 --- a/Content.Shared/Silicons/Laws/Components/IonStormTargetComponent.cs +++ b/Content.Shared/Silicons/Laws/Components/IonStormTargetComponent.cs @@ -26,25 +26,25 @@ public sealed partial class IonStormTargetComponent : Component /// Chance to replace the lawset with a random one /// [DataField, ViewVariables(VVAccess.ReadWrite)] - public float RandomLawsetChance = 0.40f; // WD was 0.25f + public float RandomLawsetChance = 0.25f; /// /// Chance to remove a random law. /// [DataField, ViewVariables(VVAccess.ReadWrite)] - public float RemoveChance = 0.15f; // WD was 0.20f + public float RemoveChance = 0.20f; /// /// Chance to replace a random law with the new one, rather than have it be a glitched-order law. /// [DataField, ViewVariables(VVAccess.ReadWrite)] - public float ReplaceChance = 0.15f; // WD was 0.20f + public float ReplaceChance = 0.20f; /// /// Chance to shuffle laws after everything is done. /// [DataField, ViewVariables(VVAccess.ReadWrite)] - public float ShuffleChance = 0.15f; // WD was 0.20f + public float ShuffleChance = 0.20f; } /// diff --git a/Content.Shared/StatusEffect/StatusEffectsSystem.cs b/Content.Shared/StatusEffect/StatusEffectsSystem.cs index f3e3e12bd8..50435d9fa9 100644 --- a/Content.Shared/StatusEffect/StatusEffectsSystem.cs +++ b/Content.Shared/StatusEffect/StatusEffectsSystem.cs @@ -123,6 +123,30 @@ namespace Content.Shared.StatusEffect return false; } + // WD added start + // May god forgive us + public bool TryAddStatusEffect(EntityUid uid, string key, TimeSpan time, bool refresh, Component component, + StatusEffectsComponent? status = null) + where T : IComponent, new() + { + if (!Resolve(uid, ref status, false)) + return false; + + if (TryAddStatusEffect(uid, key, time, refresh, status)) + { + // If they already have the comp, we just won't bother updating anything. + if (!EntityManager.HasComponent(uid)) + { + EntityManager.AddComponent(uid, component); + status.ActiveEffects[key].RelevantComponent = _componentFactory.GetComponentName(component.GetType()); + } + return true; + } + + return false; + } + // WD added end + public bool TryAddStatusEffect(EntityUid uid, string key, TimeSpan time, bool refresh, string component, StatusEffectsComponent? status = null) { diff --git a/Content.Shared/Stunnable/KnockedDownComponent.cs b/Content.Shared/Stunnable/KnockedDownComponent.cs index e4f11b8cda..cd1d8077c2 100644 --- a/Content.Shared/Stunnable/KnockedDownComponent.cs +++ b/Content.Shared/Stunnable/KnockedDownComponent.cs @@ -1,18 +1,24 @@ +using Content.Shared.Standing.Systems; using Robust.Shared.Audio; using Robust.Shared.GameStates; -using Robust.Shared.Serialization; namespace Content.Shared.Stunnable; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState, Access(typeof(SharedStunSystem))] public sealed partial class KnockedDownComponent : Component { - [DataField("helpInterval"), AutoNetworkedField] + [DataField, AutoNetworkedField] public float HelpInterval = 1f; - [DataField("helpAttemptSound")] + [DataField] public SoundSpecifier StunAttemptSound = new SoundPathSpecifier("/Audio/Effects/thudswoosh.ogg"); [ViewVariables, AutoNetworkedField] public float HelpTimer = 0f; + + // WD added start + // Holy shit why is this so long + [DataField, AutoNetworkedField] + public SharedStandingStateSystem.DropHeldItemsBehavior KnockDownBehavior = SharedStandingStateSystem.DropHeldItemsBehavior.DropIfStanding; + // WD added end } diff --git a/Content.Shared/Stunnable/SharedStunSystem.cs b/Content.Shared/Stunnable/SharedStunSystem.cs index 6053086196..7b3866791d 100644 --- a/Content.Shared/Stunnable/SharedStunSystem.cs +++ b/Content.Shared/Stunnable/SharedStunSystem.cs @@ -106,25 +106,25 @@ public abstract class SharedStunSystem : EntitySystem private void OnKnockInit(EntityUid uid, KnockedDownComponent component, ComponentInit args) { - RaiseNetworkEvent(new CheckAutoGetUpEvent()); // WD EDIT - _standingState.TryLieDown(uid, null, SharedStandingStateSystem.DropHeldItemsBehavior.DropIfStanding); + RaiseNetworkEvent(new CheckAutoGetUpEvent()); // WD edit + _standingState.TryLieDown(uid, null, component.KnockDownBehavior); // WD edit } private void OnKnockShutdown(EntityUid uid, KnockedDownComponent component, ComponentShutdown args) { - // WD EDIT START + // WD edit start // Don't stand up if we can lie down via keybind - if (!TryComp(uid, out StandingStateComponent? standing) || !(!standing.CanLieDown || standing.AutoGetUp)) // WD EDIT + if (!TryComp(uid, out StandingStateComponent? standing) || !(!standing.CanLieDown || standing.AutoGetUp)) // WD edit return; - if (standing.AutoGetUp && !_container.IsEntityInContainer(uid)) // WD EDIT + if (standing.AutoGetUp && !_container.IsEntityInContainer(uid)) // WD edit { _standingState.TryStandUp(uid, standing); return; } _standingState.Stand(uid, standing); - // WD EDIT END + // WD edit end } private void OnStandAttempt(EntityUid uid, KnockedDownComponent component, StandAttemptEvent args) @@ -178,7 +178,7 @@ public abstract class SharedStunSystem : EntitySystem /// Knocks down the entity, making it fall to the ground. /// public bool TryKnockdown(EntityUid uid, TimeSpan time, bool refresh, - StatusEffectsComponent? status = null) + StatusEffectsComponent? status = null, SharedStandingStateSystem.DropHeldItemsBehavior? behavior = null) { if (time <= TimeSpan.Zero) return false; @@ -186,8 +186,24 @@ public abstract class SharedStunSystem : EntitySystem if (!Resolve(uid, ref status, false)) return false; - if (!_statusEffect.TryAddStatusEffect(uid, "KnockedDown", time, refresh)) - return false; + // WD added start + // May god forgive us + if (behavior.HasValue && !HasComp(uid)) + { + var knockedDownComponent = new KnockedDownComponent + { + KnockDownBehavior = behavior.Value + }; + + if (!_statusEffect.TryAddStatusEffect(uid, "KnockedDown", time, refresh, knockedDownComponent)) + return false; + } + else + { + if (!_statusEffect.TryAddStatusEffect(uid, "KnockedDown", time, refresh)) + return false; + } + // WD added end var ev = new KnockedDownEvent(); RaiseLocalEvent(uid, ref ev); diff --git a/Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs b/Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs index 43425ad798..f63941569a 100644 --- a/Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs +++ b/Content.Shared/Weapons/Melee/Components/MeleeThrowOnHitComponent.cs @@ -48,7 +48,7 @@ public sealed partial class MeleeThrowOnHitComponent : Component [AutoNetworkedField] public bool Enabled = true; - // WD START + // WD added [DataField, ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] public float StunTime; @@ -56,7 +56,15 @@ public sealed partial class MeleeThrowOnHitComponent : Component [DataField, ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] public bool ThrowOnThrowHit; - // WD END + + [DataField, ViewVariables(VVAccess.ReadWrite)] + [AutoNetworkedField] + public bool FallAfterHit; + + [DataField, ViewVariables(VVAccess.ReadWrite)] + [AutoNetworkedField] + public bool RequireWield = true; + // WD added } /// diff --git a/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs b/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs index 65693dc506..c6b5bcf277 100644 --- a/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs +++ b/Content.Shared/Weapons/Melee/MeleeThrowOnHitSystem.cs @@ -1,9 +1,11 @@ using System.Numerics; using Content.Shared.Construction.Components; +using Content.Shared.Standing.Systems; using Content.Shared.Stunnable; using Content.Shared.Throwing; using Content.Shared.Weapons.Melee.Components; using Content.Shared.Weapons.Melee.Events; +using Content.Shared.Wieldable.Components; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; @@ -20,8 +22,9 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly SharedStunSystem _stun = default!; // WD - [Dependency] private readonly ThrownItemSystem _thrownItem = default!; // WD + [Dependency] private readonly SharedStunSystem _stun = default!; // WD added + [Dependency] private readonly ThrownItemSystem _thrownItem = default!; // WD added + [Dependency] private readonly SharedStandingStateSystem _standingState = default!; // WD added /// public override void Initialize() @@ -36,8 +39,10 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem private void OnDoHit(Entity ent, ref ThrowDoHitEvent args) // WD { + // WD edit start if (!ent.Comp.ThrowOnThrowHit) return; + // WD edit end if (!CanThrowOnHit(ent, args.Target)) return; @@ -55,9 +60,15 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem MinLifetime = ent.Comp.MinLifetime }; AddComp(args.Target, thrownComp); + + // WD added start if (ent.Comp.StunTime != 0f) _stun.TryParalyze(args.Target, TimeSpan.FromSeconds(ent.Comp.StunTime), true); + else if (ent.Comp.FallAfterHit) + _standingState.TryLieDown(ent, null, SharedStandingStateSystem.DropHeldItemsBehavior.DropIfStanding); + // WD added end + _thrownItem.LandComponent(ent, args.Component, physics, false); _physics.SetLinearVelocity(ent, Vector2.Zero); } @@ -67,14 +78,24 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem if (args.Handled) // WD return; - var (_, comp) = ent; if (!args.IsHit) return; - // WD START - var stunTime = comp.StunTime; - var speed = comp.Speed; - var lifetime = comp.Lifetime; + // WD added start + if (ent.Comp.RequireWield) + { + if (!TryComp(args.Weapon, out var weapon)) + return; + + if (!weapon.Wielded) + return; + } + // WD added end + + // WD edit start + var stunTime = ent.Comp.StunTime; + var speed = ent.Comp.Speed; + var lifetime = ent.Comp.Lifetime; if (args.Direction != null) // Heavy attack { @@ -82,7 +103,7 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem speed *= 0.5f; lifetime *= 0.5f; } - // WD END + // WD edit end var mapPos = _transform.GetMapCoordinates(args.User).Position; foreach (var hit in args.HitEntities) @@ -95,7 +116,7 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem if (!CanThrowOnHit(ent, hit)) continue; - if (comp.UnanchorOnHit && HasComp(hit)) + if (ent.Comp.UnanchorOnHit && HasComp(hit)) { _transform.Unanchor(hit, Transform(hit)); } @@ -105,13 +126,19 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem RaiseLocalEvent(hit, ref ev); var thrownComp = new MeleeThrownComponent { - Velocity = angle.Normalized() * speed, // WD EDIT - Lifetime = lifetime, // WD EDIT - MinLifetime = comp.MinLifetime + Velocity = angle.Normalized() * speed, // WD edit + Lifetime = lifetime, // WD edit + MinLifetime = ent.Comp.MinLifetime }; AddComp(hit, thrownComp); + + // WD added end if (stunTime != 0f) _stun.TryParalyze(hit, TimeSpan.FromSeconds(stunTime), true); + + else if (ent.Comp.FallAfterHit) + _standingState.TryLieDown(hit); + // WD added start } } @@ -126,9 +153,11 @@ public sealed class MeleeThrowOnHitSystem : EntitySystem comp.PreviousStatus = body.BodyStatus; comp.ThrownEndTime = _timing.CurTime + TimeSpan.FromSeconds(comp.Lifetime); comp.MinLifetimeTime = _timing.CurTime + TimeSpan.FromSeconds(comp.MinLifetime); + _physics.SetBodyStatus(ent, body, BodyStatus.InAir); _physics.SetLinearVelocity(ent, Vector2.Zero, body: body); _physics.ApplyLinearImpulse(ent, comp.Velocity * body.Mass, body: body); + Dirty(ent, ent.Comp); } diff --git a/Content.Shared/_White/Item/KnockDownOnHit/KnockDownOnHitComponent.cs b/Content.Shared/_White/Item/KnockDownOnHit/KnockDownOnHitComponent.cs new file mode 100644 index 0000000000..16ecba2f9f --- /dev/null +++ b/Content.Shared/_White/Item/KnockDownOnHit/KnockDownOnHitComponent.cs @@ -0,0 +1,17 @@ +using Content.Shared.Standing.Systems; +using Robust.Shared.GameStates; + +namespace Content.Shared._White.Item.KnockDownOnHit; + +[RegisterComponent, NetworkedComponent] +public sealed partial class KnockDownOnHitComponent : Component +{ + [DataField, ViewVariables(VVAccess.ReadWrite)] + public TimeSpan KnockdownTime = TimeSpan.FromSeconds(1.5f); + + [DataField] + public SharedStandingStateSystem.DropHeldItemsBehavior? KnockDownBehavior; + + [DataField] + public bool RequireWield; +} diff --git a/Content.Shared/_White/Item/KnockDownOnHit/KnockDownOnHitSystem.cs b/Content.Shared/_White/Item/KnockDownOnHit/KnockDownOnHitSystem.cs new file mode 100644 index 0000000000..891049ae98 --- /dev/null +++ b/Content.Shared/_White/Item/KnockDownOnHit/KnockDownOnHitSystem.cs @@ -0,0 +1,49 @@ +using Content.Shared.Damage.Events; +using Content.Shared.Item.ItemToggle; +using Content.Shared.Stunnable; +using Content.Shared.Weapons.Melee.Events; +using Content.Shared.Wieldable.Components; + +namespace Content.Shared._White.Item.KnockDownOnHit; + +public sealed class KnockDownOnHitSystem : EntitySystem +{ + + [Dependency] private readonly SharedStunSystem _stun = default!; + [Dependency] private readonly SharedItemToggleSystem _itemToggle = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnStaminaHitAttempt); + SubscribeLocalEvent(OnHit); + } + + private void OnHit(Entity ent, ref MeleeHitEvent args) + { + var time = ent.Comp.KnockdownTime; + if (time <= TimeSpan.Zero) + return; + + foreach (var uid in args.HitEntities) + { + if (ent.Comp.RequireWield) + { + if (!TryComp(args.Weapon, out var weapon)) + continue; + + if (!weapon.Wielded) + continue; + } + + _stun.TryKnockdown(uid, time, true, behavior: ent.Comp.KnockDownBehavior); + } + } + + private void OnStaminaHitAttempt(Entity entity, ref StaminaDamageOnHitAttemptEvent args) + { + if (!_itemToggle.IsActivated(entity.Owner)) + args.Cancelled = true; + } +} diff --git a/Content.Shared/_White/Item/TelescopicBaton/TelescopicBatonComponent.cs b/Content.Shared/_White/Item/TelescopicBaton/TelescopicBatonComponent.cs deleted file mode 100644 index b8811c8a23..0000000000 --- a/Content.Shared/_White/Item/TelescopicBaton/TelescopicBatonComponent.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Content.Shared._White.Item.TelescopicBaton; - -[RegisterComponent] -public sealed partial class TelescopicBatonComponent : Component -{ - [DataField, ViewVariables(VVAccess.ReadWrite)] - public TimeSpan KnockdownTime = TimeSpan.FromSeconds(1.5f); -} diff --git a/Content.Shared/_White/Item/TelescopicBaton/TelescopicBatonSystem.cs b/Content.Shared/_White/Item/TelescopicBaton/TelescopicBatonSystem.cs deleted file mode 100644 index f341059862..0000000000 --- a/Content.Shared/_White/Item/TelescopicBaton/TelescopicBatonSystem.cs +++ /dev/null @@ -1,56 +0,0 @@ -using Content.Shared.Damage.Events; -using Content.Shared.Examine; -using Content.Shared.Item; -using Content.Shared.Item.ItemToggle; -using Content.Shared.Item.ItemToggle.Components; -using Content.Shared.Stunnable; - -namespace Content.Shared._White.Item.TelescopicBaton; - -public sealed class TelescopicBatonSystem : EntitySystem -{ - [Dependency] private readonly SharedItemSystem _item = default!; - [Dependency] private readonly SharedStunSystem _stun = default!; - [Dependency] private readonly SharedItemToggleSystem _itemToggle = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnExamined); - SubscribeLocalEvent(OnStaminaHitAttempt); - SubscribeLocalEvent(ToggleDone); - SubscribeLocalEvent(OnHit); - } - - private void OnHit(Entity ent, ref StaminaMeleeHitEvent args) - { - var time = ent.Comp.KnockdownTime; - if (time <= TimeSpan.Zero) - return; - - foreach (var (uid, _) in args.HitList) - { - _stun.TryKnockdown(uid, time, true); - } - } - - private void OnStaminaHitAttempt(Entity entity, ref StaminaDamageOnHitAttemptEvent args) - { - if (!_itemToggle.IsActivated(entity.Owner)) - args.Cancelled = true; - } - - private void OnExamined(Entity entity, ref ExaminedEvent args) - { - var onMsg = _itemToggle.IsActivated(entity.Owner) - ? Loc.GetString("comp-telebaton-examined-on") - : Loc.GetString("comp-telebaton-examined-off"); - args.PushMarkup(onMsg); - } - - private void ToggleDone(Entity entity, ref ItemToggledEvent args) - { - _item.SetHeldPrefix(entity.Owner, args.Activated ? "on" : "off"); - } -} diff --git a/Resources/Changelog/ChangelogWhite.yml b/Resources/Changelog/ChangelogWhite.yml index 94149018e6..f503e29ec3 100644 --- a/Resources/Changelog/ChangelogWhite.yml +++ b/Resources/Changelog/ChangelogWhite.yml @@ -1,84 +1,4 @@ Entries: -- author: RavMorgan - changes: - - message: "\u0423\u0434\u0430\u043B\u0435\u043D\u043E \u0432\u0441\u044F\u043A\u043E\ - \u0435!" - type: Add - id: 41 - time: '2023-01-22T11:26:16.0000000+00:00' -- author: RavMorgan - changes: - - message: "\u041A\u043E\u043D\u0441\u043E\u043B\u044C \u0445\u043E\u043F\u0430\ - \ \u0442\u0435\u043F\u0435\u0440\u044C \u043D\u043E\u0440\u043C\u0430\u043B\u044C\ - \u043D\u043E \u043E\u0442\u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\ - \u043D\u0430!" - type: Add - id: 42 - time: '2023-01-22T11:28:17.0000000+00:00' -- author: RavMorgan - changes: - - message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u0440\u0435\u0437\ - \u043D\u044F \u0432 \u043A\u043E\u043D\u0446\u0435 \u0440\u0430\u0443\u043D\u0434\ - \u0430!" - type: Add - id: 43 - time: '2023-01-22T12:11:03.0000000+00:00' -- author: RavMorgan - changes: - - message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0430 \u0431\u043B\u043E\ - \u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u043F\u0440\u043E\u0444\u0435\u0441\ - \u0441\u0438\u0439 \u0434\u043B\u044F \u043E\u043F\u0440\u0435\u0434\u0435\u043B\ - \u0435\u043D\u043D\u044B\u0445 \u0432\u0438\u0434\u043E\u0432. \u0415\u0441\u043B\ - \u0438 \u0432\u0430\u0448\u0435\u0433\u043E \u0432\u0438\u0434\u0430 \u043D\u0435\ - \u0442 \u0432 \u0441\u043F\u0438\u0441\u043A\u0435 \u0440\u0430\u0437\u0440\u0435\ - \u0448\u0435\u043D\u043D\u044B\u0445 \u0432 \u0432\u044B\u0431\u0440\u0430\u043D\ - \u043D\u043E\u0439 \u0432\u0430\u043C\u0438 \u043F\u0440\u043E\u0444\u0435\u0441\ - \u0441\u0438\u0438, \u0442\u043E \u0432\u0430\u0448\u0430 \u0432\u043D\u0435\ - \u0448\u043D\u043E\u0441\u0442\u044C \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\ - \u043C\u0435\u043D\u0435\u043D\u0430 \u043D\u0430 \u0440\u0430\u043D\u0434\u043E\ - \u043C\u043D\u0443\u044E \u0432\u043D\u0435\u0448\u043D\u043E\u0441\u0442\u044C\ - \ \u0438\u0437 \u0441\u043F\u0438\u0441\u043A\u0430 \u043F\u043E\u0434\u0445\ - \u043E\u0434\u044F\u0449\u0438\u0445 \u0432\u0438\u0434\u043E\u0432, \u043B\u0438\ - \u0431\u043E \u0436\u0435 \u043D\u0430 \u043E\u0434\u043D\u043E\u0433\u043E\ - \ \u0438\u0437 \u0432\u0430\u0448\u0438\u0445 \u043F\u0435\u0440\u0441\u043E\ - \u043D\u0430\u0436\u0435\u0439, \u0435\u0441\u043B\u0438 \u0435\u0433\u043E\ - \ \u0432\u0438\u0434 \u043F\u043E\u0434\u0445\u043E\u0434\u0438\u0442!" - type: Add - id: 44 - time: '2023-01-23T11:45:06.0000000+00:00' -- author: BronyUraj - changes: - - message: "\u0421\u043A\u0440\u0443\u0431\u0431\u0435\u0440 \u0440\u0430\u0431\u043E\ - \u0442\u0430\u0435\u0442 \u0431\u044B\u0441\u0442\u0440\u0435\u0435" - type: Add - id: 45 - time: '2023-01-23T18:17:29.0000000+00:00' -- author: BronyUraj - changes: - - message: "\u041C\u0435\u0434\u0432\u0435\u0434\u0438 \u0442\u0435\u043F\u0435\u0440\ - \u044C \u043F\u0440\u043E\u0445\u043E\u0434\u044F\u0442 \u0432 \u0434\u0432\u0435\ - \u0440\u0438." - type: Add - - message: "\u0413\u043E\u0440\u0438\u043B\u043B\u044B \u0441\u0442\u0430\u043B\u0438\ - \ \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043D\u044B\u043C\u0438." - type: Add - - message: "\u0420\u0435\u0430\u0433\u0435\u043D\u0442 \u043F\u0447\u0435\u043B\ - \ \u0441\u0442\u0430\u043B \u0441\u043F\u0430\u0432\u043D\u0438\u0442\u044C\ - \ \u0437\u043B\u044B\u0445 \u043F\u0447\u0435\u043B." - type: Add - - message: "\u041F\u0447\u0435\u043B\u044B \u0438\u0437\u0434\u0430\u044E\u0442\ - \ \u0437\u0432\u0443\u043A (\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E\ - \u0435 \u0440\u0435\u0448\u0435\u043D\u0438\u0435)" - type: Add - id: 46 - time: '2023-01-24T07:41:12.0000000+00:00' -- author: RavMorgan - changes: - - message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E \u0432\u0441\ - \u044F\u043A\u043E\u0435!" - type: Add - id: 47 - time: '2023-01-24T09:28:49.0000000+00:00' - author: RavMorgan changes: - message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u044B \u043D\u043E\u0432\ @@ -8710,3 +8630,94 @@ id: 540 time: '2024-09-08T04:00:32.0000000+00:00' url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/689 +- author: BIG_Zi_348 + changes: + - message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044B \u043C\u0435\ + \u043B\u043E\u0447\u0438" + type: Fix + id: 541 + time: '2024-09-10T17:20:56.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/690 +- author: Jabak + changes: + - message: "\u042F\u0434\u0435\u0440\u043A\u0430 \u0434\u0435\u043B\u0430\u0435\u0442\ + \ \u0411\u0423\u041C!!! \u0420\u0430\u0443\u043D\u0434 \u0437\u0430\u043A\u0430\ + \u043D\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044F." + type: Fix + id: 542 + time: '2024-09-12T18:30:03.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/692 +- author: BIG_Zi + changes: + - message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u043F\u0435\u0440\u0435\ + \u0432\u043E\u0434 \u0430\u043A\u0446\u0435\u043D\u0442\u0430 \u0448\u0435\u043F\ + \u0435\u043B\u044F\u0432\u043E\u0441\u0442\u0438." + type: Add + id: 543 + time: '2024-09-12T18:29:30.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/691 +- author: ThereDrD0 + changes: + - message: "\u041C\u0438\u043B\u0438 \u043E\u0440\u0443\u0436\u0438\u0435 \u043F\ + \u0435\u0440\u0435\u0440\u0430\u0431\u043E\u0442\u0430\u043D\u043E. \u0422\u0435\ + \u043F\u0435\u0440\u044C \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u043F\ + \u043E-\u0434\u0440\u0443\u0433\u043E\u043C\u0443." + type: Add + id: 544 + time: '2024-09-12T18:52:04.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/681 +- author: BIG_Zi + changes: + - message: "\u0423\u0431\u0440\u0430\u043D\u044B \u043F\u0430\u0441\u0441\u0430\u0436\ + \u0438\u0440\u044B." + type: Remove + id: 545 + time: '2024-09-14T07:16:24.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/695 +- author: BIG_Zi_348 + changes: + - message: "\u041F\u0435\u0440\u0435\u0432\u043E\u0434\u044B \u043C\u0435\u043B\u043E\ + \u0447\u0435\u0439." + type: Add + id: 546 + time: '2024-09-15T12:23:31.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/697 +- author: BIG_Zi_348 + changes: + - message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u043F\u0435\u0440\u0435\ + \u0432\u043E\u0434 \u0441\u0443\u043F\u0435\u0440\u043C\u0430\u0442\u0435\u0440\ + \u0438\u0438 \u0438 \u0432\u0441\u0435\u0445 \u0435\u0451 \u0441\u0438\u0441\ + \u0442\u0435\u043C." + type: Add + - message: "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D \u043F\u0435\u0440\u0435\ + \u0432\u043E\u0434 \u043F\u0440\u043E\u0436\u0435\u043A\u0442\u043E\u0440\u0430\ + \ \u0445\u0430\u043C\u0435\u043B\u0435\u043E\u043D\u0430 \u0438 \u0432\u0441\ + \u0435\u0445 \u0435\u0433\u043E \u0441\u0438\u0441\u0442\u0435\u043C." + type: Add + - message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430 \u043E\u0448\ + \u0438\u0431\u043A\u0430 \u043B\u043E\u043A\u0430\u043B\u0438\u0437\u0430\u0446\ + \u0438\u0438 \u0437\u0430\u043A\u043E\u043D\u0430 \u0431\u043E\u0440\u0433\u043E\ + \u0432 \u043E\u0442 \u0438\u043E\u043D\u043D\u043E\u0433\u043E \u0448\u0442\u043E\ + \u0440\u043C\u0430." + type: Fix + - message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E \u043E\u043F\ + \u0438\u0441\u0430\u043D\u0438\u0435 \u0438\u043C\u043F\u043B\u0430\u043D\u0442\ + \u0435\u0440\u043E\u0432 \u0432 \u0440\u0443\u043A\u0435." + type: Fix + - message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044B \u043E\u043F\ + \u0435\u0447\u0430\u0442\u043A\u0438 \u0432 \u043D\u0435\u043A\u043E\u0442\u043E\ + \u0440\u044B\u0445 \u043C\u0435\u0441\u0442\u0430\u0445." + type: Fix + - message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D \u0431\u0430\u0433\ + \ \u0441 \u0431\u043B\u0438\u043D\u0447\u0438\u043A\u0430\u043C\u0438." + type: Fix + - message: "\u0418\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0430 \u043B\u043E\ + \u0433\u0438\u043A\u0430 \u043F\u043E\u043F\u043E\u043B\u043D\u0435\u043D\u0438\ + \u044F \u0437\u0430\u0440\u044F\u0434\u043E\u0432 \u0420\u0426\u0414." + type: Fix + - message: "\u041F\u043E\u0434\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u044B \u043C\ + \u0435\u043B\u043E\u0447\u0438." + type: Tweak + id: 547 + time: '2024-09-17T18:00:13.0000000+00:00' + url: https://api.github.com/repos/frosty-dev/ss14-core/pulls/700 diff --git a/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl b/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl index b525c9da1a..c9a96b7f7d 100644 --- a/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl +++ b/Resources/Locale/en-US/chameleon-projector/chameleon-projector.ftl @@ -2,3 +2,9 @@ chameleon-projector-inside-container = There's no room to scan that! chameleon-projector-invalid = You can't disguise as that! chameleon-projector-success = Projected new disguise. chameleon-projector-set-disguise = Set Disguise + +# Actions +ent-ActionDisguiseNoRot = Toggle Rotation + .desc = Use this to prevent your disguise from rotating, making it easier to hide in some scenarios. +ent-ActionDisguiseAnchor = Toggle Anchored + .desc = For many objects you will want to be anchored to not be completely obvious. diff --git a/Resources/Locale/en-US/rcd/components/rcd-ammo-component.ftl b/Resources/Locale/en-US/rcd/components/rcd-ammo-component.ftl index e65a9b3147..20039ecafb 100644 --- a/Resources/Locale/en-US/rcd/components/rcd-ammo-component.ftl +++ b/Resources/Locale/en-US/rcd/components/rcd-ammo-component.ftl @@ -1,3 +1,4 @@ rcd-ammo-component-on-examine = It holds {$charges} charges. rcd-ammo-component-after-interact-full = The RCD is full! rcd-ammo-component-after-interact-refilled = You refill the RCD. +rcd-ammo-component-after-interact-not-enough = Not enough material for charge. diff --git a/Resources/Locale/ru-RU/_white/locales-new/autotranslate-67.ftl b/Resources/Locale/ru-RU/_white/locales-new/autotranslate-67.ftl index 25b141dd17..11ef580b35 100644 --- a/Resources/Locale/ru-RU/_white/locales-new/autotranslate-67.ftl +++ b/Resources/Locale/ru-RU/_white/locales-new/autotranslate-67.ftl @@ -27,8 +27,8 @@ ent-SpawnMobSyndicateFootSoldier = генератор пехотинца син .desc = "генератор пехотинца синдиката" ent-SpawnMobSyndicateFootsoldierPilot = генератор пилота челнока синдиката .desc = "генератор пилота челнока синдиката" -ent-SpawnPointPassenger = пассажир - .desc = "пассажир" +ent-SpawnPointPassenger = ассистент + .desc = "ассистент" ent-SpawnPointInspector = инспектор .desc = "инспектор" ent-SpawnPointBomzh = бомж diff --git a/Resources/Locale/ru-RU/_white/locales-new/autotranslate-96.ftl b/Resources/Locale/ru-RU/_white/locales-new/autotranslate-96.ftl index 88494d33be..ae9e23f5bd 100644 --- a/Resources/Locale/ru-RU/_white/locales-new/autotranslate-96.ftl +++ b/Resources/Locale/ru-RU/_white/locales-new/autotranslate-96.ftl @@ -20,8 +20,8 @@ ent-ERTMedicIDCard = удостоверение личности медика ER .desc = "удостоверение личности медика ERT" ent-ERTSecurityIDCard = удостоверение личности службы безопасности ERT .desc = "удостоверение личности службы безопасности ERT" -ent-NukieAgentIDCard = пропуск пассажира - .desc = "пропуск пассажира" +ent-NukieAgentIDCard = ID карта ассистента + .desc = "Карта, необходимая для доступа в различные области станции." .suffix = Нюки ent-PirateIDCard = пиратское удостоверение личности .desc = "пиратское удостоверение личности" @@ -39,4 +39,4 @@ ent-LandMineAspectExplosive = мина аспекта ent-KoboldCubeBox = коробка с кубиками кобольдов .desc = Сжатые кобольды в кубе. Просто добавьте воды! ent-VariantCubeBox = коробка с вариативными кубиками - .desc = И кобольды, и обезьяны в кубиках. Просто добавьте воды! + .desc = И кобольды, и обезьяны в кубиках. Просто добавьте воды! diff --git a/Resources/Locale/ru-RU/_white/object/telebaton.ftl b/Resources/Locale/ru-RU/_white/object/telebaton.ftl index 31327974e4..e0681828d2 100644 --- a/Resources/Locale/ru-RU/_white/object/telebaton.ftl +++ b/Resources/Locale/ru-RU/_white/object/telebaton.ftl @@ -3,3 +3,6 @@ ent-TelescopicBaton = телескопическая дубинка comp-telebaton-examined-on = Дубинка в боевом положении. comp-telebaton-examined-off = Дубинка сложена. + +comp-item-toggle-on = Активировано +comp-item-toggle-off = Деактивировано diff --git a/Resources/Locale/ru-RU/burning/bodyburn.ftl b/Resources/Locale/ru-RU/burning/bodyburn.ftl new file mode 100644 index 0000000000..009cf26939 --- /dev/null +++ b/Resources/Locale/ru-RU/burning/bodyburn.ftl @@ -0,0 +1 @@ +bodyburn-text-others = {$name} сгорел до тла! diff --git a/Resources/Locale/ru-RU/chameleon-projector/chameleon-projector.ftl b/Resources/Locale/ru-RU/chameleon-projector/chameleon-projector.ftl new file mode 100644 index 0000000000..ee41964332 --- /dev/null +++ b/Resources/Locale/ru-RU/chameleon-projector/chameleon-projector.ftl @@ -0,0 +1,10 @@ +chameleon-projector-inside-container = Здесь нет места для сканирования! +chameleon-projector-invalid = Неверный объект для маскировки! +chameleon-projector-success = Маскировка выполнена успешно. +chameleon-projector-set-disguise = Выбрать для маскировки + +# Actions +ent-ActionDisguiseNoRot = Переключить вращение + .desc = Используйте это, чтобы предотвратить вращение вашей маскировки, что упрощает маскировку в некоторых ситуациях. +ent-ActionDisguiseAnchor = Переключить закрепление + .desc = Для многих объектов вам надо быть закреплённым, чтобы быть менее заметным. diff --git a/Resources/Locale/ru-RU/implant/implant.ftl b/Resources/Locale/ru-RU/implant/implant.ftl index f79a2f79a7..2d4f4e2973 100644 --- a/Resources/Locale/ru-RU/implant/implant.ftl +++ b/Resources/Locale/ru-RU/implant/implant.ftl @@ -12,7 +12,8 @@ implanter-inject-text = Установка implanter-empty-text = Пусто -implanter-label = [color=white]Имплант: { $implantName }{ $lineBreak }Режим: { $modeString }[/color] +implanter-label = [color=white]{$implantName} + Режим: {$modeString}[/color] implanter-contained-implant-text = [color=green]{ $desc }[/color] diff --git a/Resources/Locale/ru-RU/locales-new/autotranslate-21.ftl b/Resources/Locale/ru-RU/locales-new/autotranslate-21.ftl index b3a980910a..83a83889ff 100644 --- a/Resources/Locale/ru-RU/locales-new/autotranslate-21.ftl +++ b/Resources/Locale/ru-RU/locales-new/autotranslate-21.ftl @@ -2,7 +2,7 @@ ent-ToyFigurineBoxer = фигурка боксёра .desc = Статуэтка, изображающая боксера в красных перчатках. ent-ToyFigurineCaptain = фигурка капитана .desc = Статуэтка, изображающая стандартную экипировку капитана, принадлежащего гражданскому судну Nanotrasen. -ent-ToyFigurineHeadOfSecurity = фигурка главый службы безопасности +ent-ToyFigurineHeadOfSecurity = фигурка главы службы безопасности .desc = Статуэтка, изображающая славного начальника отдела безопасности. ent-ToyFigurineWarden = фигурка надзирателя .desc = Статуэтка, изображающая надзирателя, готового в любой момент посадить кого-нибудь в тюрьму. diff --git a/Resources/Locale/ru-RU/locales-new/autotranslate-43.ftl b/Resources/Locale/ru-RU/locales-new/autotranslate-43.ftl index b1b831c97b..12339e2ee7 100644 --- a/Resources/Locale/ru-RU/locales-new/autotranslate-43.ftl +++ b/Resources/Locale/ru-RU/locales-new/autotranslate-43.ftl @@ -25,9 +25,9 @@ ent-ParticleAcceleratorUnfinishedBase = "" .desc = "" ent-ParticleAcceleratorEmitterPort = правый эмиттер УЧ .desc = Это запускает альфа-частицы, возможно, они не захотят стоять рядом с этим концом. -ent-ParticleAcceleratorEmitterFore = центральный эммитер УЧ +ent-ParticleAcceleratorEmitterFore = центральный эмиттер УЧ .desc = Это запускает альфа-частицы, возможно, они не захотят стоять рядом с этим концом. -ent-ParticleAcceleratorEmitterStarboard = левый эммитер УЧ +ent-ParticleAcceleratorEmitterStarboard = левый эмиттер УЧ .desc = Это запускает альфа-частицы, возможно, они не захотят стоять рядом с этим концом. ent-ParticleAcceleratorEmitterPortUnfinished = { ent-ParticleAcceleratorEmitterPort } .desc = Это запускает альфа-частицы, возможно, они не захотят стоять рядом с этим концом. Он выглядит незаконченным. diff --git a/Resources/Locale/ru-RU/locales-new/autotranslate-8.ftl b/Resources/Locale/ru-RU/locales-new/autotranslate-8.ftl index 3d7af70c72..fbfaca8d29 100644 --- a/Resources/Locale/ru-RU/locales-new/autotranslate-8.ftl +++ b/Resources/Locale/ru-RU/locales-new/autotranslate-8.ftl @@ -23,7 +23,7 @@ ent-ClothingUniformJumpsuitSeniorSalvageSpecialist = комбинезон охо ent-ClothingUniformJumpsuitRecruitNT = комбинезон новобранца .desc = Стильный серый комбинезон с синей отделкой. Идеально подходит для достойного помощника. ent-ClothingUniformJumpsuitRecruitSyndie = комбинезон новобранца синдиката - .desc = Сомнительный темно-серый комбинезон. Как будто пассажиры и без того недостаточно сомневались. + .desc = Сомнительный темно-серый комбинезон. Как будто ассистенты и без того недостаточно сомневались. ent-ClothingUniformJumpsuitRepairmanNT = комбинезон ремонтника .desc = Комбинезон, который напоминает вам об определенной рабочей должности в секторе экипажа. Надеюсь, тебе не придется выполнять ту же работу, что и ЭТИМ уродам. ent-ClothingUniformJumpsuitRepairmanSyndie = комбинезон ремонтника синдиката diff --git a/Resources/Locale/ru-RU/mind/components/mind-component.ftl b/Resources/Locale/ru-RU/mind/components/mind-component.ftl index 41a5de8e61..305720479b 100644 --- a/Resources/Locale/ru-RU/mind/components/mind-component.ftl +++ b/Resources/Locale/ru-RU/mind/components/mind-component.ftl @@ -6,11 +6,11 @@ comp-mind-ghosting-prevented = Вы не можете стать призрак comp-mind-examined-catatonic = { CAPITALIZE(SUBJECT($ent)) } в кататоническом ступоре. Стрессы жизни в глубоком космосе, должно быть, оказались слишком тяжелы для { OBJECT($ent) }. Восстановление маловероятно. comp-mind-examined-dead = { CAPITALIZE(POSS-PRONOUN($ent)) } душа покинула тело. -comp-mind-examined-ssd = { CAPITALIZE(SUBJECT($ent)) } рассеяно смотрит в пустоту и ни на что не реагирует. { CAPITALIZE(SUBJECT($ent)) } может скоро придти в себя. +comp-mind-examined-ssd = { CAPITALIZE(SUBJECT($ent)) } рассеяно смотрит в пустоту и ни на что не реагирует. { CAPITALIZE(SUBJECT($ent)) } может скоро прийти в себя. comp-mind-examined-dead-and-ssd = { CAPITALIZE(POSS-ADJ($ent)) } душа дремлет и может скоро вернуться. comp-mind-examined-dead-and-irrecoverable = { CAPITALIZE(POSS-ADJ($ent)) } душа покинула тело и пропала. Восстановление маловероятно. mind-component-no-mind-and-alive-text = { CAPITALIZE(SUBJECT($ent)) } в кататоническом ступоре. Стрессы жизни в глубоком космосе, должно быть, оказались слишком тяжелы для него. Восстановление маловероятно. mind-component-no-mind-and-dead-text = { CAPITALIZE(POSS-PRONOUN($ent)) } душа покинула тело и пропала. Восстановление маловероятно. -mind-component-mind-and-no-session-text = { CAPITALIZE(SUBJECT($ent)) } рассеяно смотрит в пустоту и ни на что не реагирует. { CAPITALIZE(SUBJECT($ent)) } может скоро придти в себя. +mind-component-mind-and-no-session-text = { CAPITALIZE(SUBJECT($ent)) } рассеяно смотрит в пустоту и ни на что не реагирует. { CAPITALIZE(SUBJECT($ent)) } может скоро прийти в себя. diff --git a/Resources/Locale/ru-RU/rcd/components/rcd-ammo-component.ftl b/Resources/Locale/ru-RU/rcd/components/rcd-ammo-component.ftl index b16b4b88ad..7c95fa6b0b 100644 --- a/Resources/Locale/ru-RU/rcd/components/rcd-ammo-component.ftl +++ b/Resources/Locale/ru-RU/rcd/components/rcd-ammo-component.ftl @@ -1,6 +1,7 @@ rcd-ammo-component-on-examine = Оно содержит { $charges } зарядов. -rcd-ammo-component-after-interact-full = РЦд полностью заряжена! +rcd-ammo-component-after-interact-full = РЦД полностью заряжен! rcd-ammo-component-after-interact-refilled = Вы перезаряжаете РЦД. rcd-ammo-component-on-examine-text = Содержит { $ammo } зарядов. rcd-ammo-component-after-interact-full-text = РЦД полностью заряжен! rcd-ammo-component-after-interact-refilled-text = Вы перезаряжаете РЦД. +rcd-ammo-component-after-interact-not-enough = Недостаточно материала для заряда. diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/ears/headsets.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/ears/headsets.ftl index 3493910f12..fede15a463 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/ears/headsets.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/ears/headsets.ftl @@ -43,7 +43,7 @@ ent-ClothingHeadsetSecurity = охранная гарнитура ent-ClothingHeadsetService = сервисная гарнитура .desc = Гарнитура, используемая обслуживающим персоналом, задачей которого является поддержание станции в полноценном, счастливом и чистом состоянии. .suffix = { "" } -ent-ClothingHeadsetGrey = гарнитура пассажира +ent-ClothingHeadsetGrey = гарнитура ассистента .desc = Модифицированный модульный интерком, надеваемый на голову. Принимает ключи шифрования. .suffix = { "" } ent-ClothingHeadsetFreelance = гарнитура наемника diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/ears/specific.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/ears/specific.ftl index dda22145dd..baf7945c46 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/ears/specific.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/clothing/ears/specific.ftl @@ -1,3 +1,3 @@ -ent-ClothingHeadsetChameleon = гарнитура пассажира +ent-ClothingHeadsetChameleon = гарнитура ассистента .desc = Модифицированный модульный интерком, надеваемый на голову. Принимает ключи шифрования. .suffix = Хамелеон diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/holoprojectors.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/holoprojectors.ftl index 34e740a667..a52746bb46 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/holoprojectors.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/devices/holoprojectors.ftl @@ -2,5 +2,5 @@ ent-Holoprojector = проектор голографических знаков .desc = Удобный голографический проектор, отображающий табличку уборщика. .suffix = { "" } ent-HolofanProjector = атмос голопроектор - .desc = Останавливает суицидально настроеных пассажиров от убийства остальных во время разгерметизации. + .desc = Останавливает суицидально настроеных ассистентов от убийства остальных во время разгерметизации. .suffix = { "" } diff --git a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/specific/service/vending_machine_restock.ftl b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/specific/service/vending_machine_restock.ftl index e1575f317c..f1158c434a 100644 --- a/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/specific/service/vending_machine_restock.ftl +++ b/Resources/Locale/ru-RU/ss14-ru/prototypes/entities/objects/specific/service/vending_machine_restock.ftl @@ -2,7 +2,7 @@ ent-BaseVendingMachineRestock = набор пополнения Торгомат .desc = Набор для пополнения торговых автоматов фирменными товарами. .suffix = { "" } ent-VendingMachineRestockBooze = набор пополнения АлкоМат - .desc = Поместите в АлкоМат чтобы начать вечеринку! Не для продажи пассажирам, не достигшим совершеннолетия. + .desc = Поместите в АлкоМат чтобы начать вечеринку! Не для продажи ассистентам, не достигшим совершеннолетия. .suffix = { "" } ent-VendingMachineRestockChang = набор пополнения Мистер Чанг .desc = Коробка, покрытая белыми наклейками с крупными красными китайскими иероглифами, готовая к загрузке в ближайший торгомат Мистер Чанг. diff --git a/Resources/Locale/ru-RU/station-events/events/ion-storm.ftl b/Resources/Locale/ru-RU/station-events/events/ion-storm.ftl index 6546057323..3d5a48449e 100644 --- a/Resources/Locale/ru-RU/station-events/events/ion-storm.ftl +++ b/Resources/Locale/ru-RU/station-events/events/ion-storm.ftl @@ -9,6 +9,7 @@ ion-storm-the-job = { CAPITALIZE($job) } ion-storm-clowns = КЛОУНЫ ion-storm-heads = ГЛАВЫ ion-storm-crew = ЭКИПАЖ +ion-storm-people = ЛЮДИ ion-storm-adjective-things = {$adjective} ОБЪЕКТЫ ion-storm-x-and-y = {$x} И {$y} diff --git a/Resources/Locale/ru-RU/store/uplink-catalog.ftl b/Resources/Locale/ru-RU/store/uplink-catalog.ftl index e06be4c31d..0e742cfba7 100644 --- a/Resources/Locale/ru-RU/store/uplink-catalog.ftl +++ b/Resources/Locale/ru-RU/store/uplink-catalog.ftl @@ -349,7 +349,7 @@ uplink-cigarettes-name = Пачка сигарет Синдиката uplink-cigarettes-desc = Элитные сигареты для элитных агентов. Насыщенные лекарствами, когда вам нужно больше, чем просто успокоить нервы. uplink-clothing-conducting-gloves-name = Токопроводящие перчатки -uplink-clothing-conducting-gloves-desc = Выглядят как изолированные перчатки, но удар током нанесёт вам гораздо больше повреждений, чем если бы у вас вообще ничего не было на руках! Лучше всего подойдут в качестве подарка пассажирам, которых вы искренне недолюбливаете. +uplink-clothing-conducting-gloves-desc = Выглядят как изолированные перчатки, но удар током нанесёт вам гораздо больше повреждений, чем если бы у вас вообще ничего не было на руках! Лучше всего подойдут в качестве подарка ассистентам, которых вы искренне недолюбливаете. uplink-snack-box-name = Коробка закусок Синдиката uplink-snack-box-desc = Коробка с вкусными закусками и напитками, которые можно съесть в одиночку или разделить с командой. Включает одну нежеланную игрушку. diff --git a/Resources/Locale/ru-RU/white/something.ftl b/Resources/Locale/ru-RU/white/something.ftl index 4a3a292e92..cf3a8e3cdc 100644 --- a/Resources/Locale/ru-RU/white/something.ftl +++ b/Resources/Locale/ru-RU/white/something.ftl @@ -88,13 +88,13 @@ character-information-ui-flavor-text-disabled = На этом сервере о # sm -supermatter-self = Supermatter -supermatter-danger-message = Danger! Crystal hyperstructure integrity faltering! Integrity: { $integrity }% -supermatter-warning-message = WARNING! Crystal hyperstructure integrity reaching critical levels! Integrity: { $integrity }% -supermatter-safe-alert = Crystalline hyperstructure returning to safe operating parameters. Failsafe has been Disengaged. Integrity: { $integrity }% -supermatter-delamination-overmass = The Supermatter has Reached Critical Mass Falure. Singularity formation Imminent -supermatter-delamination-default = The Supermatter has Reached Critical Integrity Falure. Emergency Causality Destabilization Field has been Activated. -supermatter-seconds-before-delam = { $Seconds } Seconds Remain Before Delamination. +supermatter-self = Суперматерия +supermatter-danger-message = Опасность! Нарушение целостности кристаллической гиперструктуры! Целостность: { $integrity }% +supermatter-warning-message = ВНИМАНИЕ! Целостность кристаллической гиперструктуры достигает критических уровней! Целостность: { $integrity }% +supermatter-safe-alert = Кристаллическая гиперструктура возвращается к безопасным рабочим параметрам. Предохранитель отключён. Целостность: { $integrity }% +supermatter-delamination-overmass = Суперматерия достигла уровня критической массы. Обнаружена угроза формирования сингулярности. +supermatter-delamination-default = Суперматерия достигла уровня критической целостности. Активироанно экстренное поле дестабилизации причинности. +supermatter-seconds-before-delam = { $Seconds } секунд осталось до деламинации. # MobStateShit diff --git a/Resources/Maps/White/Triumph.yml b/Resources/Maps/White/Triumph.yml index 8a42879a54..0cd0a27a09 100644 --- a/Resources/Maps/White/Triumph.yml +++ b/Resources/Maps/White/Triumph.yml @@ -256120,8 +256120,8 @@ entities: - uid: 38080 components: - type: MetaData - desc: Переключает работу эмитеров. - name: переключатель эммитеров + desc: Переключает работу эмиттеров. + name: переключатель эмиттеров - type: Transform rot: 3.141592653589793 rad pos: -157.5,71.5 diff --git a/Resources/Prototypes/Damage/modifier_sets.yml b/Resources/Prototypes/Damage/modifier_sets.yml index 35a95b58e5..3971053cbe 100644 --- a/Resources/Prototypes/Damage/modifier_sets.yml +++ b/Resources/Prototypes/Damage/modifier_sets.yml @@ -241,10 +241,10 @@ # in relation to how they cause bleed rate. - type: damageModifierSet id: BloodlossHuman - coefficients: - Blunt: 0.05 - Slash: 0.25 - Piercing: 0.2 + coefficients: # WD edit alert!! Weapons rebalanced - only slash and piercing damage should cast bleeding + Blunt: 0.0 + Slash: 0.45 # WD + Piercing: 0.3 # WD Shock: 0.0 Cold: 0.0 Heat: -0.5 # heat damage cauterizes wounds, but will still hurt obviously. diff --git a/Resources/Prototypes/Datasets/ion_storm.yml b/Resources/Prototypes/Datasets/ion_storm.yml index fffef4145b..c3638219e2 100644 --- a/Resources/Prototypes/Datasets/ion_storm.yml +++ b/Resources/Prototypes/Datasets/ion_storm.yml @@ -315,7 +315,7 @@ - ВРАЧИ - МИМЫ - ПАРАМЕДИКИ - - ПАССАЖИРЫ + - АССИСТЕНТЫ - КВАРТИРМЕЙСТЕРЫ - НАУЧНЫЕ РУКОВОДИТЕЛИ - РОБОТОТЕХНИКИ diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 574ed112bd..3792869ff1 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -22,7 +22,7 @@ shape: !type:PhysShapeCircle radius: 0.25 - density: 0.8 + density: 10 mask: - FlyingMobMask layer: @@ -89,7 +89,7 @@ shape: !type:PhysShapeCircle radius: 0.1 - density: 0.1 + density: 30 mask: - FlyingMobMask layer: @@ -325,7 +325,7 @@ shape: !type:PhysShapeCircle radius: 0.2 - density: 0.0007 + density: 100 mask: - SmallMobMask layer: @@ -429,7 +429,7 @@ shape: !type:PhysShapeCircle radius: 0.2 - density: 0.007 + density: 100 mask: - SmallMobMask layer: @@ -1565,7 +1565,7 @@ shape: !type:PhysShapeCircle radius: 0.2 - density: 0.76 + density: 100 mask: - SmallMobMask layer: @@ -2532,7 +2532,7 @@ shape: !type:PhysShapeCircle radius: 0.35 - density: 16.66 + density: 50 #They actually are pretty light, I looked it up mask: - MobMask layer: @@ -2609,7 +2609,7 @@ shape: !type:PhysShapeCircle radius: 0.35 - density: 25.5 + density: 50 mask: - MobMask layer: @@ -2758,7 +2758,7 @@ shape: !type:PhysShapeCircle radius: 0.35 - density: 9 + density: 15 mask: - MobMask layer: @@ -2927,17 +2927,6 @@ Base: caracal_flop Dead: Base: caracal_dead - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeCircle - radius: 0.35 - density: 30 - mask: - - MobMask - layer: - - MobLayer - type: entity name: kitten @@ -2971,17 +2960,6 @@ thresholds: 0: Alive 25: Dead - - type: Fixtures - fixtures: - fix1: - shape: - !type:PhysShapeCircle - radius: 0.35 - density: 2 - mask: - - MobMask - layer: - - MobLayer - type: entity name: sloth @@ -3062,7 +3040,7 @@ shape: !type:PhysShapeCircle radius: 0.35 - density: 4 + density: 5 mask: - MobMask layer: @@ -3141,7 +3119,7 @@ shape: !type:PhysShapeCircle radius: 0.2 - density: 0.8 + density: 120 mask: - SmallMobMask layer: @@ -3263,7 +3241,7 @@ shape: !type:PhysShapeCircle radius: 0.35 - density: 750 + density: 250 mask: - MobMask layer: @@ -3348,7 +3326,7 @@ shape: !type:PhysShapeCircle radius: 0.35 - density: 15 + density: 100 # High, because wood is heavy. mask: - MobMask layer: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml index b1bbdfb530..235b07057d 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml @@ -228,13 +228,13 @@ layers: - state: pancakes1 map: ["pancakes1"] - visible: false + visible: true # WD changed to fix chameleon projector bug - state: pancakes2 map: ["pancakes2"] - visible: false + visible: true # WD changed to fix chameleon projector bug - state: pancakes3 map: ["pancakes3"] - visible: false + visible: true # WD changed to fix chameleon projector bug - state: pancakes4 map: ["pancakes4"] visible: false @@ -277,7 +277,7 @@ layers: - state: pancakesbb1 map: ["pancakesbb1"] - visible: false + visible: true # WD changed to fix chameleon projector bug - state: pancakesbb2 map: ["pancakesbb2"] visible: false @@ -309,7 +309,7 @@ layers: - state: pancakescc1 map: ["pancakescc1"] - visible: false + visible: true # WD changed to fix chameleon projector bug - state: pancakescc2 map: ["pancakescc2"] visible: false diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml index 900479b660..4e02adf438 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml @@ -9,7 +9,7 @@ - type: Item size: Normal sprite: Objects/Tanks/generic.rsi - storedRotation: 45 + storedRotation: 44 # WD fixing some rare texture bug - type: Clothing quickEquip: false sprite: Objects/Tanks/generic.rsi diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml index c1ba38ac0f..02bd2b5f0d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/baseball_bat.yml @@ -11,15 +11,16 @@ wideAnimationRotation: -135 damage: types: - Blunt: 10 + Blunt: 8 # WD Structural: 5 soundHit: path: "/Audio/Weapons/smash.ogg" + canHeavyAttack: false - type: Wieldable - type: IncreaseDamageOnWield damage: types: - Blunt: 5 + Blunt: 4 # WD Structural: 10 - type: Item size: Normal @@ -42,6 +43,14 @@ - type: Tag tags: - BaseballBat + - type: MeleeThrowOnHit # WD + lifetime: 0.2 + speed: 5 + requireWield: true + - type: KnockDownOnHit + knockDownBehavior: NoDrop + knockdownTime: 0.5 + requireWield: true - type: entity name: incomplete baseball bat diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cane.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cane.yml index 5c26020d72..eb66e095a3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cane.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cane.yml @@ -41,7 +41,7 @@ attackRate: 1.5 damage: types: - Slash: 14 + Slash: 12 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml index 73eb55cdf4..cfc6202d17 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/cult.yml @@ -13,7 +13,7 @@ attackRate: 1.5 damage: types: - Slash: 12 + Slash: 9 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -66,7 +66,7 @@ attackRate: 0.75 damage: types: - Slash: 33 + Slash: 27 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -104,7 +104,7 @@ damage: types: Blunt: 10 - Slash: 20 + Slash: 18 # WD Structural: 5 soundHit: path: "/Audio/Weapons/smash.ogg" @@ -113,7 +113,7 @@ damage: types: Blunt: 4 - Slash: 12 + Slash: 10 # WD Structural: 10 - type: Item size: Ginormous diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/daggers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/daggers.yml index 9828b66e0a..becaa862e7 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/daggers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/daggers.yml @@ -13,7 +13,7 @@ attackRate: 1.3 damage: types: - Slash: 10.5 + Slash: 10.5 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -45,7 +45,7 @@ attackRate: 1.5 damage: types: - Slash: 17.5 + Slash: 15 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: EmbeddableProjectile @@ -55,7 +55,7 @@ - type: DamageOtherOnHit damage: types: - Slash: 20 + Slash: 44 # WD - type: Item size: Small - type: DisarmMalus diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index 649c26b5bb..558f53cd02 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -36,8 +36,7 @@ variation: 0.125 activatedDamage: types: - Slash: 15 - Heat: 15 + Slash: 41 # WD Structural: 20 - type: Sprite sprite: Objects/Weapons/Melee/e_sword.rsi @@ -131,8 +130,7 @@ variation: 0.250 activatedDamage: types: - Slash: 10 - Heat: 10 + Slash: 23 # WD deactivatedSecret: true - type: ItemToggleActiveSound activeSound: @@ -263,8 +261,7 @@ - type: IncreaseDamageOnWield damage: types: - Slash: 15 - Heat: 15 + Slash: 30 # WD - type: Reflect reflectProb: 1 enabled: false @@ -299,8 +296,7 @@ variation: 0.125 activatedDamage: types: - Slash: 15 - Heat: 15 + Slash: 33 # WD Structural: 20 - type: Reflect reflectProb: 0.8 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml index 047c6b12bf..f905047b2f 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/fireaxe.yml @@ -18,8 +18,8 @@ damage: types: # axes are kinda like sharp hammers, you know? - Blunt: 5 - Slash: 13 + Blunt: 3 # WD + Slash: 10 # WD Structural: 10 soundHit: path: "/Audio/Weapons/smash.ogg" @@ -28,7 +28,7 @@ damage: types: Blunt: 2.5 - Slash: 10.5 + Slash: 8 # WD Structural: 60 - type: Item size: Ginormous diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml index 8e93fccaee..6652b98efe 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/knife.yml @@ -14,7 +14,7 @@ wideAnimationRotation: -135 damage: types: - Slash: 12 + Slash: 10 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Sprite @@ -42,6 +42,10 @@ - type: Item sprite: Objects/Weapons/Melee/kitchen_knife.rsi storedRotation: -45 + - type: DamageOtherOnHit # WD + damage: + types: + Piercing: 20 - type: GuideHelp guides: - Chef @@ -68,7 +72,7 @@ attackRate: 1.5 damage: types: - Slash: 12 + Slash: 13 # WD - type: Item size: Normal sprite: Objects/Weapons/Melee/cleaver.rsi @@ -100,7 +104,7 @@ - type: DamageOtherOnHit damage: types: - Slash: 10 + Piercing: 27 # WD - type: Item sprite: Objects/Weapons/Melee/combat_knife.rsi storedRotation: -45 @@ -136,7 +140,11 @@ attackRate: 1.0 damage: types: - Slash: 18 # Same DPS as combat knife + Slash: 12 # WD + - type: DamageOtherOnHit # WD + damage: + types: + Piercing: 44 - type: Item sprite: Objects/Weapons/Melee/kukri_knife.rsi @@ -159,7 +167,7 @@ - type: DamageOtherOnHit damage: types: - Slash: 10 + Piercing: 10 # WD - type: Sprite sprite: Clothing/Head/Hats/greyflatcap.rsi - type: Clothing @@ -289,7 +297,7 @@ damage: types: Slash: 10 - Piercing: 15 + Piercing: 35 # WD - type: Item sprite: Objects/Weapons/Melee/throwing_knife.rsi storedRotation: -45 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml index b3f4362f02..0bcd987881 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/sword.yml @@ -13,7 +13,7 @@ attackRate: 1.5 damage: types: - Slash: 19 + Slash: 14 # WD # WD edit sounds start soundHit: path: /Audio/White/Items/hit/sabre_hit2.ogg @@ -27,12 +27,12 @@ storedRotation: 44 # It just works shape: - 0, 0, 4, 0 - - type: Tag - tags: - - CaptainSabre - type: DisarmMalus - type: MeleeBlock delay: 6.1 + - type: Tag + tags: + - CaptainSabre - type: entity name: katana @@ -51,7 +51,7 @@ wideAnimationRotation: -135 damage: types: - Slash: 24 + Slash: 20 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -80,7 +80,7 @@ wideAnimationRotation: -60 damage: types: - Slash: 30 + Slash: 33 # WD - type: Item size: Huge sprite: Objects/Weapons/Melee/energykatana.rsi @@ -123,7 +123,7 @@ wideAnimationRotation: -135 damage: types: - Slash: 20 + Slash: 17 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -155,7 +155,7 @@ attackRate: 0.75 damage: types: - Slash: 30 + Slash: 21 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item @@ -191,7 +191,7 @@ wideAnimationRotation: -135 damage: types: - Slash: 20 + Slash: 20 # WD soundHit: path: /Audio/Weapons/bladeslice.ogg - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/tagilla_hammer.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/tagilla_hammer.yml index b21bfd08d3..52b02eb7e2 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/tagilla_hammer.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/tagilla_hammer.yml @@ -14,8 +14,7 @@ attackRate: 0.75 damage: types: - Blunt: 5 - Slash: 5 + Blunt: 10 Structural: 10 soundHit: path: "/Audio/Weapons/sledgehammer_hit_1.ogg" @@ -23,8 +22,7 @@ - type: IncreaseDamageOnWield damage: types: - Blunt: 10 - Slash: 5 + Blunt: 15 Structural: 40 - type: Item size: Ginormous diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml index 788e95e8e1..c70683e6c9 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/throwing_stars.yml @@ -77,7 +77,7 @@ damage: types: Slash: 8 - Piercing: 10 + Piercing: 16 # WD - type: StaminaDamageOnCollide damage: 45 - type: StaminaDamageOnEmbed diff --git a/Resources/Prototypes/Tiles/floors.yml b/Resources/Prototypes/Tiles/floors.yml index 046add35a8..b4007a1c08 100644 --- a/Resources/Prototypes/Tiles/floors.yml +++ b/Resources/Prototypes/Tiles/floors.yml @@ -15,7 +15,6 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorSteelCheckerLight @@ -34,7 +33,6 @@ collection: FootstepFloor itemDrop: FloorTileItemSteelCheckerLight heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorSteelCheckerDark @@ -53,7 +51,6 @@ collection: FootstepFloor itemDrop: FloorTileItemSteelCheckerDark heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorSteelMini @@ -72,7 +69,6 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorSteelPavement @@ -91,7 +87,6 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorSteelDiagonal @@ -110,7 +105,6 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorSteelOffset @@ -123,7 +117,6 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorSteelMono @@ -142,7 +135,6 @@ collection: FootstepTile itemDrop: FloorTileItemSteel heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorSteelPavementVertical @@ -161,7 +153,6 @@ collection: FootstepTile itemDrop: FloorTileItemSteel heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorSteelHerringbone @@ -180,7 +171,6 @@ collection: FootstepTile itemDrop: FloorTileItemSteel heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorSteelDiagonalMini @@ -199,7 +189,6 @@ collection: FootstepTile itemDrop: FloorTileItemSteel heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorBrassFilled @@ -212,7 +201,6 @@ collection: FootstepHull itemDrop: FloorTileItemBrassFilled heatCapacity: 10000 - tileRipResistance: 220 - type: tile id: FloorBrassReebe @@ -225,7 +213,6 @@ collection: FootstepHull itemDrop: FloorTileItemBrassReebe heatCapacity: 10000 - tileRipResistance: 220 - type: tile id: FloorPlastic @@ -244,7 +231,6 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel heatCapacity: 10000 - tileRipResistance: 80 - type: tile id: FloorWood @@ -265,7 +251,6 @@ collection: BarestepWood itemDrop: FloorTileItemWood heatCapacity: 10000 - tileRipResistance: 80 - type: tile id: FloorWhite @@ -284,7 +269,6 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 - tileRipResistance: 80 - type: tile id: FloorWhiteMini @@ -303,7 +287,6 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 - tileRipResistance: 80 - type: tile id: FloorWhitePavement @@ -322,7 +305,6 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 - tileRipResistance: 80 - type: tile id: FloorWhiteDiagonal @@ -341,7 +323,6 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 - tileRipResistance: 80 - type: tile id: FloorWhiteOffset @@ -354,7 +335,6 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 - tileRipResistance: 80 - type: tile id: FloorWhiteMono @@ -373,7 +353,6 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 - tileRipResistance: 80 - type: tile id: FloorWhitePavementVertical @@ -392,7 +371,6 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 - tileRipResistance: 80 - type: tile id: FloorWhiteHerringbone @@ -411,7 +389,6 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 - tileRipResistance: 80 - type: tile id: FloorWhiteDiagonalMini @@ -430,7 +407,6 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 - tileRipResistance: 80 - type: tile id: FloorWhitePlastic @@ -449,7 +425,6 @@ collection: FootstepTile itemDrop: FloorTileItemWhite heatCapacity: 10000 - tileRipResistance: 80 - type: tile id: FloorDark @@ -468,7 +443,6 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 - tileRipResistance: 100 - type: tile id: FloorDarkMini @@ -487,7 +461,6 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 - tileRipResistance: 100 - type: tile id: FloorDarkPavement @@ -506,7 +479,6 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 - tileRipResistance: 100 - type: tile id: FloorDarkDiagonal @@ -525,7 +497,6 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 - tileRipResistance: 100 - type: tile id: FloorDarkOffset @@ -538,7 +509,6 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 - tileRipResistance: 100 - type: tile id: FloorDarkMono @@ -557,7 +527,6 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 - tileRipResistance: 100 - type: tile id: FloorDarkPavementVertical @@ -576,7 +545,6 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 - tileRipResistance: 100 - type: tile id: FloorDarkHerringbone @@ -595,7 +563,6 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 - tileRipResistance: 100 - type: tile id: FloorDarkDiagonalMini @@ -614,7 +581,6 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 - tileRipResistance: 100 - type: tile id: FloorDarkPlastic @@ -633,7 +599,6 @@ collection: FootstepTile itemDrop: FloorTileItemDark heatCapacity: 10000 - tileRipResistance: 50 - type: tile id: FloorTechMaint @@ -646,7 +611,6 @@ collection: FootstepHull itemDrop: FloorTileItemTechmaint heatCapacity: 10000 - tileRipResistance: 250 - type: tile id: FloorReinforced @@ -659,7 +623,6 @@ collection: FootstepHull itemDrop: FloorTileItemReinforced heatCapacity: 10000 - reinforced: true - type: tile id: FloorMono @@ -672,7 +635,6 @@ collection: FootstepTile itemDrop: FloorTileItemMono heatCapacity: 10000 - tileRipResistance: 100 - type: tile id: FloorLino @@ -685,7 +647,6 @@ collection: FootstepTile itemDrop: FloorTileItemLino heatCapacity: 10000 - tileRipResistance: 100 - type: tile id: FloorSteelDirty @@ -698,7 +659,6 @@ collection: FootstepPlating itemDrop: FloorTileItemDirty heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorElevatorShaft @@ -711,7 +671,6 @@ collection: FootstepHull itemDrop: FloorTileItemElevatorShaft heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorMetalDiamond @@ -724,7 +683,6 @@ collection: FootstepHull itemDrop: FloorTileItemMetalDiamond heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorRockVault @@ -737,7 +695,6 @@ collection: FootstepAsteroid itemDrop: FloorTileItemRockVault heatCapacity: 10000 - tileRipResistance: 400 - type: tile id: FloorBlue @@ -750,7 +707,6 @@ collection: FootstepTile itemDrop: FloorTileItemBlue heatCapacity: 10000 - tileRipResistance: 50 - type: tile id: FloorSteelLime @@ -769,7 +725,6 @@ collection: FootstepFloor itemDrop: FloorTileItemLime heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorMining @@ -782,7 +737,6 @@ collection: FootstepTile itemDrop: FloorTileItemMining heatCapacity: 10000 - tileRipResistance: 250 - type: tile id: FloorMiningDark @@ -795,7 +749,6 @@ collection: FootstepTile itemDrop: FloorTileItemMiningDark heatCapacity: 10000 - tileRipResistance: 250 - type: tile id: FloorMiningLight @@ -808,7 +761,6 @@ collection: FootstepTile itemDrop: FloorTileItemMiningLight heatCapacity: 10000 - tileRipResistance: 250 # Departamental - type: tile @@ -822,7 +774,6 @@ collection: FootstepHull itemDrop: FloorTileItemFreezer heatCapacity: 10000 - tileRipResistance: 100 - type: tile id: FloorShowroom @@ -841,7 +792,6 @@ collection: FootstepFloor itemDrop: FloorTileItemShowroom heatCapacity: 10000 - tileRipResistance: 100 - type: tile id: FloorHydro @@ -854,7 +804,6 @@ collection: FootstepFloor itemDrop: FloorTileItemHydro heatCapacity: 10000 - tileRipResistance: 50 - type: tile id: FloorBar @@ -873,7 +822,6 @@ collection: FootstepFloor itemDrop: FloorTileItemBar heatCapacity: 10000 - tileRipResistance: 100 - type: tile id: FloorClown @@ -886,7 +834,6 @@ collection: FootstepFloor itemDrop: FloorTileItemClown heatCapacity: 10000 - tileRipResistance: 50 - type: tile id: FloorMime @@ -899,7 +846,6 @@ collection: FootstepFloor itemDrop: FloorTileItemMime heatCapacity: 10000 - tileRipResistance: 50 - type: tile id: FloorKitchen @@ -912,7 +858,6 @@ collection: FootstepTile itemDrop: FloorTileItemKitchen heatCapacity: 10000 - tileRipResistance: 50 - type: tile id: FloorLaundry @@ -925,7 +870,6 @@ collection: FootstepTile itemDrop: FloorTileItemLaundry heatCapacity: 10000 - tileRipResistance: 50 - type: tile id: FloorSteelDamaged @@ -945,7 +889,6 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel #This should probably be made null when it becomes possible to make it such, in SS13 prying destroyed tiles wouldn't give you anything. heatCapacity: 10000 - tileRipResistance: 175 - type: tile id: FloorSteelBurnt @@ -962,7 +905,6 @@ collection: FootstepFloor itemDrop: FloorTileItemSteel #Same case as FloorSteelDamaged, make it null when possible heatCapacity: 10000 - tileRipResistance: 175 # Concrete @@ -984,7 +926,6 @@ itemDrop: FloorTileItemConcrete heatCapacity: 10000 weather: true - tileRipResistance: 300 - type: tile id: FloorConcreteMono @@ -1004,7 +945,6 @@ itemDrop: FloorTileItemConcrete heatCapacity: 10000 weather: true - tileRipResistance: 300 - type: tile id: FloorConcreteSmooth @@ -1024,7 +964,6 @@ itemDrop: FloorTileItemConcrete heatCapacity: 10000 weather: true - tileRipResistance: 300 - type: tile id: FloorGrayConcrete @@ -1044,7 +983,6 @@ itemDrop: FloorTileItemGrayConcrete heatCapacity: 10000 weather: true - tileRipResistance: 300 - type: tile id: FloorGrayConcreteMono @@ -1064,7 +1002,6 @@ itemDrop: FloorTileItemGrayConcrete heatCapacity: 10000 weather: true - tileRipResistance: 300 - type: tile id: FloorGrayConcreteSmooth @@ -1084,7 +1021,6 @@ itemDrop: FloorTileItemGrayConcrete heatCapacity: 10000 weather: true - tileRipResistance: 300 - type: tile id: FloorOldConcrete @@ -1104,7 +1040,6 @@ itemDrop: FloorTileItemOldConcrete heatCapacity: 10000 weather: true - tileRipResistance: 300 - type: tile id: FloorOldConcreteMono @@ -1124,7 +1059,6 @@ itemDrop: FloorTileItemOldConcrete heatCapacity: 10000 weather: true - tileRipResistance: 300 - type: tile id: FloorOldConcreteSmooth @@ -1144,7 +1078,6 @@ itemDrop: FloorTileItemOldConcrete heatCapacity: 10000 weather: true - tileRipResistance: 300 # Carpets (non smoothing) - type: tile @@ -1161,7 +1094,6 @@ friction: 0.25 itemDrop: FloorTileItemArcadeBlue heatCapacity: 10000 - tileRipResistance: 75 - type: tile id: FloorArcadeBlue2 @@ -1177,7 +1109,6 @@ friction: 0.25 itemDrop: FloorTileItemArcadeBlue2 heatCapacity: 10000 - tileRipResistance: 75 - type: tile id: FloorArcadeRed @@ -1193,7 +1124,6 @@ friction: 0.25 itemDrop: FloorTileItemArcadeRed heatCapacity: 10000 - tileRipResistance: 75 - type: tile id: FloorEighties @@ -1209,7 +1139,6 @@ friction: 0.25 itemDrop: FloorTileItemEighties heatCapacity: 10000 - tileRipResistance: 75 - type: tile id: FloorCarpetClown @@ -1225,7 +1154,6 @@ friction: 0.25 itemDrop: FloorTileItemCarpetClown heatCapacity: 10000 - tileRipResistance: 75 - type: tile id: FloorCarpetOffice @@ -1241,7 +1169,6 @@ friction: 0.25 itemDrop: FloorTileItemCarpetOffice heatCapacity: 10000 - tileRipResistance: 75 - type: tile id: FloorBoxing @@ -1261,7 +1188,6 @@ friction: 0.25 itemDrop: FloorTileItemBoxing heatCapacity: 10000 - tileRipResistance: 50 - type: tile id: FloorGym @@ -1281,7 +1207,6 @@ friction: 0.25 itemDrop: FloorTileItemGym heatCapacity: 10000 - tileRipResistance: 50 # Shuttle - type: tile @@ -1300,7 +1225,6 @@ collection: FootstepFloor itemDrop: FloorTileItemShuttleWhite heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorShuttleGrey @@ -1319,7 +1243,6 @@ collection: FootstepFloor itemDrop: FloorTileItemShuttleGrey heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorShuttleBlack @@ -1338,7 +1261,6 @@ collection: FootstepFloor itemDrop: FloorTileItemShuttleBlack heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorShuttleBlue @@ -1356,7 +1278,6 @@ collection: FootstepFloor itemDrop: FloorTileItemShuttleBlue heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorShuttleOrange @@ -1374,7 +1295,6 @@ collection: FootstepFloor itemDrop: FloorTileItemShuttleOrange heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorShuttlePurple @@ -1392,7 +1312,6 @@ collection: FootstepFloor itemDrop: FloorTileItemShuttlePurple heatCapacity: 10000 - tileRipResistance: 4500 - type: tile id: FloorShuttleRed @@ -1410,7 +1329,6 @@ collection: FootstepFloor itemDrop: FloorTileItemShuttleRed heatCapacity: 10000 - tileRipResistance: 4500 # Materials @@ -1425,7 +1343,6 @@ collection: FootstepTile itemDrop: FloorTileItemGold heatCapacity: 10000 - tileRipResistance: 600 - type: tile id: FloorSilver @@ -1438,7 +1355,6 @@ collection: FootstepTile itemDrop: FloorTileItemSilver heatCapacity: 10000 - tileRipResistance: 500 - type: tile id: FloorGlass @@ -1451,7 +1367,6 @@ collection: FootstepTile itemDrop: SheetGlass1 heatCapacity: 10000 - tileRipResistance: 150 - type: tile id: FloorRGlass @@ -1470,7 +1385,6 @@ collection: FootstepTile itemDrop: SheetRGlass1 heatCapacity: 10000 - tileRipResistance: 175 # Circuits - type: tile @@ -1484,7 +1398,6 @@ collection: FootstepHull itemDrop: FloorTileItemGCircuit heatCapacity: 10000 - tileRipResistance: 225 - type: tile id: FloorBlueCircuit @@ -1497,7 +1410,6 @@ collection: FootstepHull itemDrop: FloorTileItemBCircuit heatCapacity: 10000 - tileRipResistance: 225 # Terrain - type: tile @@ -1783,7 +1695,6 @@ itemDrop: FloorTileItemFlesh friction: 0.05 #slippy heatCapacity: 10000 - tileRipResistance: 80 - type: tile id: FloorTechMaint2 @@ -1796,7 +1707,6 @@ collection: FootstepHull itemDrop: FloorTileItemSteelMaint heatCapacity: 10000 - tileRipResistance: 225 - type: tile id: FloorTechMaint3 @@ -1815,7 +1725,6 @@ collection: FootstepHull itemDrop: FloorTileItemGratingMaint heatCapacity: 10000 - tileRipResistance: 225 - type: tile id: FloorWoodTile @@ -1836,7 +1745,6 @@ collection: BarestepWood itemDrop: FloorTileItemWoodPattern heatCapacity: 10000 - tileRipResistance: 75 - type: tile id: FloorBrokenWood @@ -1860,7 +1768,6 @@ collection: BarestepWood itemDrop: MaterialWoodPlank1 heatCapacity: 10000 - tileRipResistance: 60 - type: tile id: FloorWebTile @@ -1875,7 +1782,6 @@ collection: BarestepCarpet itemDrop: FloorTileItemWeb heatCapacity: 10000 - tileRipResistance: 30 - type: tile id: FloorChromite @@ -1907,7 +1813,6 @@ collection: FootstepHull itemDrop: FloorTileItemSteel #probably should not be normally obtainable, but the game shits itself and dies when you try to put null here heatCapacity: 10000 - tileRipResistance: 500 - type: tile id: FloorHullReinforced @@ -1920,7 +1825,6 @@ itemDrop: FloorTileItemSteel heatCapacity: 100000 #/tg/ has this set as "INFINITY." I don't know if that exists here so I've just added an extra 0 indestructible: true - reinforced: true - type: tile id: FloorReinforcedHardened @@ -1931,7 +1835,6 @@ footstepSounds: collection: FootstepHull itemDrop: FloorTileItemReinforced #same case as FloorHull - reinforced: true # Faux sci tiles @@ -1963,7 +1866,6 @@ collection: FootstepGrass itemDrop: FloorTileItemAstroGrass heatCapacity: 10000 - tileRipResistance: 50 - type: tile id: FloorMowedAstroGrass @@ -1973,7 +1875,6 @@ isSubfloor: false deconstructTools: [ Cutting ] itemDrop: FloorTileItemMowedAstroGrass - tileRipResistance: 50 - type: tile id: FloorJungleAstroGrass @@ -1983,7 +1884,6 @@ isSubfloor: false deconstructTools: [ Cutting ] itemDrop: FloorTileItemJungleAstroGrass - tileRipResistance: 50 # Ice - type: tile @@ -1999,7 +1899,6 @@ mobFrictionNoInput: 0.05 mobAcceleration: 2 itemDrop: FloorTileItemAstroIce - tileRipResistance: 50 - type: tile id: FloorAstroSnow @@ -2009,7 +1908,6 @@ isSubfloor: false deconstructTools: [ Prying ] itemDrop: FloorTileItemAstroSnow - tileRipResistance: 50 - type: tile id: FloorWoodLarge @@ -2030,4 +1928,3 @@ collection: BarestepWood itemDrop: FloorTileItemWoodLarge heatCapacity: 10000 - tileRipResistance: 100 diff --git a/Resources/Prototypes/_White/Entities/Clothing/OuterClothing/chaplain_armor.yml b/Resources/Prototypes/_White/Entities/Clothing/OuterClothing/chaplain_armor.yml index 4267448a7d..7de4eea0e0 100644 --- a/Resources/Prototypes/_White/Entities/Clothing/OuterClothing/chaplain_armor.yml +++ b/Resources/Prototypes/_White/Entities/Clothing/OuterClothing/chaplain_armor.yml @@ -1,5 +1,5 @@ - type: entity - parent: ClothingOuterBaseLarge + parent: [ClothingOuterBaseLarge, AllowSuitStorageClothing] id: ClothingOuterArmorTemplar name: доспехи крестоносца description: Бог желает этого! diff --git a/Resources/Prototypes/_White/Entities/Objects/Weapons/chaplain_weapons.yml b/Resources/Prototypes/_White/Entities/Objects/Weapons/chaplain_weapons.yml index 0a29e7b361..8bb031ba6d 100644 --- a/Resources/Prototypes/_White/Entities/Objects/Weapons/chaplain_weapons.yml +++ b/Resources/Prototypes/_White/Entities/Objects/Weapons/chaplain_weapons.yml @@ -1,5 +1,21 @@ +# Так как мечей много, а смысла в них не очень - я буду писать в комментариях геймдизайнерских прикол каждого из них + - type: entity parent: BaseItem + id: BaseHolyWeapon + abstract: true + components: + - type: HolyWeapon + - type: Sprite + sprite: White/Objects/Weapons/Chaplain/forceweapon.rsi + state: icon + - type: MeleeWeapon + soundHit: + path: /Audio/Weapons/bladeslice.ogg + +# Базовая палка, чтобы как можно быстрее сменить ее. +- type: entity + parent: BaseHolyWeapon id: NullRod name: жезл нулификации description: Жезл из чистого обсидиана. Само его присутствие разрушает и ослабляет "магические силы". Во всяком случае так написано в путеводителе. @@ -11,6 +27,8 @@ damage: types: Blunt: 18 + soundHit: + collection: MetalThud - type: Item size: Normal sprite: White/Objects/Weapons/Chaplain/nullrod.rsi @@ -43,10 +61,10 @@ - UnholyPitchfork - WarHammer - HyperTool - - type: HolyWeapon +# Прикольно выглядящая рука, нельзя снять и бьет ожогами. - type: entity - parent: BaseItem + parent: BaseHolyWeapon id: GodHand name: божья длань description: Эта рука сияет с потрясающей силой! @@ -63,26 +81,22 @@ wideAnimationRotation: 180 damage: types: - Heat: 18 + Heat: 15 - type: Item size: Ginormous sprite: White/Objects/Weapons/Chaplain/godhand.rsi - type: Unremoveable deleteOnDrop: true - - type: HolyWeapon +# Типичный меч, база базовая. Может блокировать, острый. - type: entity - parent: Claymore + parent: BaseHolyWeapon id: HolyClaymore name: священный клеймор description: Оружие, подходящее для крестового похода! components: - type: Sprite sprite: White/Objects/Weapons/Chaplain/claymore.rsi - - type: MeleeWeapon - damage: - types: - Slash: 33 - type: Clothing sprite: White/Objects/Weapons/Chaplain/claymore.rsi slots: @@ -91,29 +105,45 @@ - suitStorage - type: Item sprite: White/Objects/Weapons/Chaplain/claymore.rsi - - type: HolyWeapon + - type: MeleeWeapon + damage: + types: + Slash: 15 + - type: Sharp + - type: MeleeBlock + delay: 12.1 +# Отсылка на вархаммер, больше всего урона, так как не может блокировать - type: entity - parent: HolyClaymore + parent: BaseHolyWeapon id: Chainsword name: цепной меч description: Не позволь еретику жить. components: - type: Sprite sprite: White/Objects/Weapons/Chaplain/chainsword.rsi + state: icon + - type: Clothing + sprite: White/Objects/Weapons/Chaplain/chainsword.rsi + slots: + - back + - belt + - suitStorage + - type: Item + sprite: White/Objects/Weapons/Chaplain/chainsword.rsi - type: MeleeWeapon soundHit: path: /Audio/Weapons/chainsaw.ogg - - type: Clothing - sprite: White/Objects/Weapons/Chaplain/chainsword.rsi - - type: Item - sprite: White/Objects/Weapons/Chaplain/chainsword.rsi + damage: + types: + Slash: 21 - type: Tool qualities: - Sawing speed: 0.5 - - type: HolyWeapon + - type: Sharp +# Он светится - type: entity parent: HolyClaymore id: SwordGlowing @@ -130,10 +160,10 @@ color: lightblue - type: Item sprite: White/Objects/Weapons/Chaplain/forceweapon.rsi - - type: HolyWeapon +# Позволяет блокировать быстрее, средненький урон. - type: entity - parent: Katana + parent: BaseHolyWeapon id: HolyKatana name: лезвие ханзо description: Способен прорезать святой клеймор. @@ -148,10 +178,24 @@ - suitStorage - type: Item sprite: White/Objects/Weapons/Chaplain/katana.rsi - - type: HolyWeapon + - type: MeleeWeapon + wideAnimationRotation: -135 + damage: + types: + Slash: 13 + soundHit: + path: /Audio/Weapons/bladeslice.ogg + - type: DisarmMalus + - type: MeleeBlock + delay: 8.1 + - type: Sharp + - type: Tag + tags: + - Katana +# Смешной меч с разбросом дамага - type: entity - parent: HolyKatana + parent: BaseHolyWeapon id: MultiverseBlade name: внепространственный клинок description: Будучи когда-то предвестником межпространственной войны, его острота сильно колеблется. Наносит от 1 до 50 урона. @@ -170,10 +214,11 @@ - type: Item sprite: White/Objects/Weapons/Chaplain/multiverse.rsi - type: RandomDamage - - type: HolyWeapon + - type: Sharp +# Пробивает броню - type: entity - parent: HolyClaymore + parent: BaseHolyWeapon id: VorpalScythe name: коса жнеца description: И жрец, и жнец, и на дуде игрец! Коса способна пробить броню противника. @@ -184,7 +229,7 @@ ignoreResistances: true damage: types: - Slash: 24 + Slash: 14 - type: Clothing sprite: White/Objects/Weapons/Chaplain/scythe.rsi slots: @@ -192,8 +237,9 @@ - suitStorage - type: Item sprite: White/Objects/Weapons/Chaplain/scythe-inhands.rsi - - type: HolyWeapon + - type: Sharp +# Может пиздеть - type: entity parent: HolyKatana id: PossessedBlade @@ -218,10 +264,10 @@ - type: Examiner - type: Item sprite: White/Objects/Weapons/Chaplain/possessed.rsi - - type: HolyWeapon +# Приклеен к руке, быстро и громко бьет - type: entity - parent: BaseItem + parent: BaseHolyWeapon id: ChainsawHand name: рука-бензопила description: Добро? Зло? Ты парень с бензопилой в руке. @@ -251,10 +297,10 @@ qualities: - Sawing speed: 0.5 - - type: HolyWeapon +# Нокдаунит при ударе - type: entity - parent: BaseItem + parent: BaseHolyWeapon id: HolyWhip name: священная плеть description: Какая ужасная ночь на космической станции 14. @@ -265,10 +311,11 @@ - type: MeleeWeapon soundHit: path: /Audio/White/Items/hit/chainhit.ogg - range: 2.5 + range: 1.5 + attackRate: 0.5 damage: types: - Blunt: 18 + Blunt: 10 - type: Item size: Normal sprite: White/Objects/Weapons/Chaplain/whip.rsi @@ -277,10 +324,13 @@ slots: - belt - type: DisarmMalus - - type: HolyWeapon + - type: KnockDownOnHit + knockDownBehavior: NoDrop + knockdownTime: 0.4 +# Отбрасывает при ударе и может блокировать, требует держать себя в двух руках для отброса - type: entity - parent: BaseItem + parent: BaseHolyWeapon id: HolyStaff name: посох монаха description: Длинный высокий посох из полированного дерева. Традиционно используемый в боевых искусствах древней Земли, теперь он используется для преследования клоуна. @@ -288,11 +338,6 @@ - type: Sprite sprite: White/Objects/Weapons/Chaplain/staff.rsi state: icon - - type: MeleeWeapon - wideAnimationRotation: 135 - damage: - types: - Blunt: 10 - type: Item size: Huge sprite: White/Objects/Weapons/Chaplain/staff.rsi @@ -301,23 +346,64 @@ slots: - back - suitStorage + - type: MeleeWeapon + wideAnimationRotation: 135 + damage: + types: + Blunt: 6 + soundHit: + collection: MetalThud - type: Wieldable - type: IncreaseDamageOnWield damage: types: Blunt: 8 + - type: MeleeThrowOnHit + lifetime: 0.2 + speed: 5 + fallAfterHit: true + requireWield: true - type: UseDelay - - type: DisarmMalus - type: MeleeBlock - delay: 6.1 - - type: HolyWeapon + delay: 8.1 +# Можно кинуть, если попасть нанесет ебать как много, не попадет - ты проебал ее. Далеко бьет - type: entity - parent: BaseItem + parent: BaseHolyWeapon id: UnholyPitchfork name: нечестивые вилы description: Держа это, ты выглядишь абсолютно по дьявольски. components: + - type: Sprite + sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi + state: icon + - type: Item + sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi + size: Huge + - type: Clothing + sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi + slots: + - back + - suitStorage + - type: MeleeWeapon + range: 2 + wideAnimationRotation: -135 + damage: + types: + Piercing: 8 + angle: 0 + animation: WeaponArcThrust + soundHit: + path: /Audio/Weapons/bladeslice.ogg + - type: DamageOtherOnHit + damage: + types: + Piercing: 77 + - type: Wieldable + - type: IncreaseDamageOnWield + damage: + types: + Piercing: 4 - type: EmbeddableProjectile offset: 0.15,0.15 - type: ThrowingAngle @@ -337,42 +423,12 @@ restitution: 0.3 friction: 0.2 - type: Sharp - - type: Sprite - sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi - state: icon - - type: MeleeWeapon - range: 2 - wideAnimationRotation: -135 - damage: - types: - Piercing: 15 - angle: 0 - animation: WeaponArcThrust - soundHit: - path: /Audio/Weapons/bladeslice.ogg - - type: DamageOtherOnHit - damage: - types: - Piercing: 25 - - type: Item - sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi - size: Huge - - type: Clothing - sprite: White/Objects/Weapons/Chaplain/pitchfork.rsi - slots: - - back - - suitStorage - - type: Wieldable - - type: IncreaseDamageOnWield - damage: - types: - Piercing: 9 - type: UseDelay - type: DisarmMalus - - type: HolyWeapon +# Высокий структурный урон - type: entity - parent: BaseItem + parent: BaseHolyWeapon id: WarHammer name: реликтовый боевой молот description: Этот боевой молот обошелся священнику в сорок тысяч кредитов. @@ -380,17 +436,6 @@ - type: Sprite sprite: White/Objects/Weapons/Chaplain/hammer.rsi state: icon - - type: MeleeWeapon - wideAnimationRotation: -135 - attackRate: 0.75 - damage: - types: - Blunt: 24 - Structural: 40 - soundHit: - collection: HammerHit - soundSwing: - collection: HammerMiss - type: Item size: Huge sprite: White/Objects/Weapons/Chaplain/hammer.rsi @@ -400,14 +445,25 @@ - belt - back - suitStorage + - type: MeleeWeapon + wideAnimationRotation: -135 + attackRate: 0.75 + damage: + types: + Blunt: 16 + Structural: 40 + soundHit: + collection: HammerHit + soundSwing: + collection: HammerMiss - type: DisarmMalus - - type: HolyWeapon +# Имеет все инструменты в себе, но работает медленно и почти не наносит урона - type: entity - parent: BaseItem + parent: BaseHolyWeapon id: HyperTool name: гиперинструмент - description: Инструмент настолько мощный, что даже вы не можете им идеально пользоваться. + description: Кто-то додумался склеить все инструменты вместе и вот, что вышло. Настолько продуманный, что вы не понимаете, как этим адекватно пользоваться components: - type: Sprite sprite: White/Objects/Weapons/Chaplain/hypertool.rsi @@ -417,9 +473,9 @@ canHeavyAttack: false damage: types: - Blunt: 0 - - type: StaminaDamageOnHit - damage: 40 + Blunt: 4 + soundHit: + collection: HyperToolUsing - type: Item size: Normal sprite: White/Objects/Weapons/Chaplain/hypertool.rsi @@ -428,4 +484,29 @@ slots: - belt - type: DisarmMalus - - type: HolyWeapon + - type: Tool + qualities: + - Screwing + - Prying + - Anchoring + - Cutting + - Pulsing + speed: 0.7 + useSound: + collection: HyperToolUsing + +- type: soundCollection + id: HyperToolUsing + files: + - /Audio/Effects/RingtoneNotes/a.ogg + - /Audio/Effects/RingtoneNotes/asharp.ogg + - /Audio/Effects/RingtoneNotes/b.ogg + - /Audio/Effects/RingtoneNotes/c.ogg + - /Audio/Effects/RingtoneNotes/csharp.ogg + - /Audio/Effects/RingtoneNotes/d.ogg + - /Audio/Effects/RingtoneNotes/dsharp.ogg + - /Audio/Effects/RingtoneNotes/e.ogg + - /Audio/Effects/RingtoneNotes/f.ogg + - /Audio/Effects/RingtoneNotes/fsharp.ogg + - /Audio/Effects/RingtoneNotes/g.ogg + - /Audio/Effects/RingtoneNotes/gsharp.ogg diff --git a/Resources/Prototypes/_White/Entities/Objects/Weapons/telescopic_baton.yml b/Resources/Prototypes/_White/Entities/Objects/Weapons/telescopic_baton.yml index da46efab0d..1ea81d0778 100644 --- a/Resources/Prototypes/_White/Entities/Objects/Weapons/telescopic_baton.yml +++ b/Resources/Prototypes/_White/Entities/Objects/Weapons/telescopic_baton.yml @@ -4,7 +4,6 @@ name: telescopic baton description: A compact yet robust personal defense weapon. Can be concealed when folded. components: - - type: TelescopicBaton - type: Sprite sprite: White/Objects/Weapons/telebaton.rsi layers: @@ -23,6 +22,8 @@ path: /Audio/Weapons/telescopicoff.ogg params: volume: -5 + activatedDescription: comp-telebaton-examined-on + deactivatedDescription: comp-telebaton-examined-off - type: Appearance - type: GenericVisualizer visuals: @@ -64,3 +65,4 @@ - Belt - type: StaticPrice price: 150 + - type: KnockDownOnHit diff --git a/Resources/Prototypes/_White/Fluff/fluff.yml b/Resources/Prototypes/_White/Fluff/fluff.yml index fb3db181aa..67d5624465 100644 --- a/Resources/Prototypes/_White/Fluff/fluff.yml +++ b/Resources/Prototypes/_White/Fluff/fluff.yml @@ -824,7 +824,7 @@ wideAnimationRotation: -135 damage: types: - Slash: 18 + Slash: 14 soundHit: path: /Audio/Weapons/bladeslice.ogg - type: HolyWeapon diff --git a/Resources/Prototypes/_White/Wizard/magic_items.yml b/Resources/Prototypes/_White/Wizard/magic_items.yml index aecf11ac6c..7bc0ef44c9 100644 --- a/Resources/Prototypes/_White/Wizard/magic_items.yml +++ b/Resources/Prototypes/_White/Wizard/magic_items.yml @@ -11,7 +11,7 @@ attackRate: 5 damage: types: - Slash: 10 + Slash: 25 - type: Clothing sprite: White/Objects/Weapons/Chaplain/hfrequency.rsi slots: @@ -101,6 +101,7 @@ minLifetime: 0.01 speed: 20 stunTime: 1.5 + fallAfterHit: true throwOnThrowHit: true - type: DamageOtherOnHit sound: diff --git a/Resources/ServerInfo/Guidebook/Jobs.xml b/Resources/ServerInfo/Guidebook/Jobs.xml index 6e01381c40..4717ba143a 100644 --- a/Resources/ServerInfo/Guidebook/Jobs.xml +++ b/Resources/ServerInfo/Guidebook/Jobs.xml @@ -4,9 +4,9 @@ SS14 имеет большое количество должностей, разделенных на семь основных отделов: ## Сервисный -В этот отдел входят уборщик, пассажиры, клоун, мим, музыкант, шеф-повар, бармен, начальник персонала и другие работники, которые существуют для обслуживания станции. +В этот отдел входят уборщик, ассистенты, клоун, мим, музыкант, шеф-повар, бармен, начальник персонала и другие работники, которые существуют для обслуживания станции. -В первую очередь это люди, которые развлекают, убирают и обслуживают остальную команду, за исключением пассажиров, у которых нет никакой конкретной работы. +В первую очередь это люди, которые развлекают, убирают и обслуживают остальную команду, за исключением ассистентов, у которых нет никакой конкретной работы. ## Карго Снабжения или карго состоит из грузчиков, утилизаторов и квартирмейстера. Как отдел, он отвечает за распределение ресурсов и торговлю, способен покупать и продавать вещи на галактическом рынке.