This commit is contained in:
Vovock
2026-04-08 12:12:40 +03:00
527 changed files with 4966 additions and 1454 deletions
+1
View File
@@ -95,6 +95,7 @@ namespace Content.Client.Input
human.AddFunction(ContentKeyFunctions.Arcade1);
human.AddFunction(ContentKeyFunctions.Arcade2);
human.AddFunction(ContentKeyFunctions.Arcade3);
human.AddFunction(ContentKeyFunctions.TogglePosing); // Corvax-Wega-Add
// actions should be common (for ghosts, mobs, etc)
common.AddFunction(ContentKeyFunctions.OpenActionsMenu);
@@ -195,6 +195,13 @@ namespace Content.Client.Options.UI.Tabs
AddButton(ContentKeyFunctions.RotateStoredItem);
AddButton(ContentKeyFunctions.SaveItemLocation);
AddButton(ContentKeyFunctions.OfferItem); /// Corvax-Wega-Offer
AddButton(ContentKeyFunctions.TogglePosing); // Corvax-Wega-Posing
AddButton(ContentKeyFunctions.PosingOffsetLeft); // Corvax-Wega-Posing
AddButton(ContentKeyFunctions.PosingOffsetRight); // Corvax-Wega-Posing
AddButton(ContentKeyFunctions.PosingOffsetUp); // Corvax-Wega-Posing
AddButton(ContentKeyFunctions.PosingOffsetDown); // Corvax-Wega-Posing
AddButton(ContentKeyFunctions.PosingRotateNegative); // Corvax-Wega-Posing
AddButton(ContentKeyFunctions.PosingRotatePositive); // Corvax-Wega-Posing
AddHeader("ui-options-header-interaction-adv");
AddButton(ContentKeyFunctions.SmartEquipBackpack);
@@ -16,7 +16,7 @@ public sealed class UtilityVendorBoundUserInterface : BoundUserInterface
_window = this.CreateWindow<UtilityVendorMenu>();
_window.Title = EntMan.GetComponent<MetaDataComponent>(Owner).EntityName;
_window.OpenCentered();
_window.OpenCenteredLeft();
_window.OnClose += Close;
@@ -1,7 +1,7 @@
<controls:FancyWindow xmlns="https://spacestation14.io"
xmlns:controls="clr-namespace:Content.Client.UserInterface.Controls"
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
MinSize="950 600">
MinSize="600 600">
<BoxContainer Orientation="Vertical"
VerticalExpand="True"
HorizontalExpand="True">
@@ -0,0 +1,73 @@
using Content.Shared.Posing;
using Content.Shared.Input;
using Robust.Client.GameObjects;
using Robust.Client.Input;
using Robust.Client.Player;
namespace Content.Client.Posing;
public sealed partial class PosingSystem : SharedPosingSystem
{
[Dependency] private readonly IInputManager _input = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PosingComponent, AfterAutoHandleStateEvent>(OnAfterHandleState);
var posing = _input.Contexts.New("posing", "common");
posing.AddFunction(ContentKeyFunctions.TogglePosing);
posing.AddFunction(ContentKeyFunctions.PosingOffsetUp);
posing.AddFunction(ContentKeyFunctions.PosingOffsetDown);
posing.AddFunction(ContentKeyFunctions.PosingOffsetLeft);
posing.AddFunction(ContentKeyFunctions.PosingOffsetRight);
posing.AddFunction(ContentKeyFunctions.PosingRotatePositive);
posing.AddFunction(ContentKeyFunctions.PosingRotateNegative);
}
public override void Shutdown()
{
base.Shutdown();
_input.Contexts.Remove("posing");
}
private void OnAfterHandleState(EntityUid uid, PosingComponent component, ref AfterAutoHandleStateEvent args)
{
if (_playerManager.LocalEntity == uid)
return;
if (!component.Posing)
{
_sprite.SetOffset(uid, component.DefaultOffset);
_sprite.SetRotation(uid, Angle.FromDegrees(component.DefaultAngle));
return;
}
}
protected override void ClientTogglePosing(EntityUid uid, PosingComponent posing)
{
base.ClientTogglePosing(uid, posing);
_input.Contexts.SetActiveContext(posing.Posing ? "posing" : posing.DefaultInputContext);
_sprite.SetOffset(uid, posing.DefaultOffset);
_sprite.SetRotation(uid, Angle.FromDegrees(posing.DefaultAngle));
}
public override void FrameUpdate(float frameTime)
{
base.FrameUpdate(frameTime);
var query = EntityQueryEnumerator<PosingComponent>();
while (query.MoveNext(out var uid, out var posing))
{
if (posing.Posing)
{
_sprite.SetOffset(uid, posing.DefaultOffset + posing.CurrentOffset);
_sprite.SetRotation(uid, posing.CurrentAngle);
}
}
}
}
@@ -13,7 +13,7 @@ public sealed class VampireSystem : SharedVampireSystem
{
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly ContentEyeSystem _contentEye = default!;
[Dependency] private readonly SharedEyeSystem _eye = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
@@ -32,8 +32,11 @@ public sealed class VampireSystem : SharedVampireSystem
var userEntity = _entityManager.GetEntity(args.User);
var eyeComponent = _entityManager.GetComponent<EyeComponent>(userEntity);
if (userEntity == _playerManager.LocalEntity)
_contentEye.RequestToggleFov(userEntity, eyeComponent);
}
{
eyeComponent.NetSyncEnabled = false;
_eye.SetDrawFov(userEntity, args.Enabled, eyeComponent);
}
}
private void GetVampireIcons(Entity<VampireComponent> ent, ref GetStatusIconsEvent args)
{
@@ -141,10 +141,12 @@ public sealed partial class DungeonJob
}
}
#if DEBUG // Corvax-Wega-Add-start
if (groupSize > 0)
{
_sawmill.Warning($"Found remaining group size for ore veins of {gen.Replacement ?? "null"}!");
}
#endif // Corvax-Wega-Add-end
}
}
}
@@ -22,50 +22,40 @@ public sealed class TimePackCommand : IConsoleCommand
{
{ 1, new List<(string, int)>
{
("Overall", 8400),
("JobCaptain", 1200),
("JobStationEngineer", 1200),
("JobMedicalDoctor", 1200),
("JobSecurityOfficer", 1200),
("JobWarden", 600),
("JobAtmosphericTechnician", 1200),
("JobChemist", 600),
("JobScientist", 900),
("JobSalvageSpecialist", 600),
("Overall", 60),
("JobStationEngineer", 300),
("JobTechnicalAssistant", 300),
("JobMedicalDoctor", 180),
("JobMedicalIntern", 120),
("JobResearchAssistant", 300),
("JobCargoTechnician", 180),
("JobServiceWorker", 60)
}
},
{ 2, new List<(string, int)>
{
("JobSecurityOfficer", 1200),
("JobWarden", 600),
("Overall", 600)
("JobStationEngineer", 300),
("JobTechnicalAssistant", 300),
("Overall", 60)
}
},
{ 3, new List<(string, int)>
{
("JobAtmosphericTechnician", 600),
("JobStationEngineer", 1200)
("JobMedicalDoctor", 180),
("JobMedicalIntern", 120)
}
},
{ 4, new List<(string, int)>
{
("JobChemist", 600),
("JobMedicalDoctor", 1200)
("JobResearchAssistant", 300)
}
},
{ 5, new List<(string, int)>
{
("JobScientist", 900)
("JobCargoTechnician", 180)
}
},
{ 6, new List<(string, int)>
{
("JobSalvageSpecialist", 600),
("Overall", 2400)
}
},
{ 7, new List<(string, int)>
{
("JobBorg", 900)
}
@@ -149,7 +139,11 @@ public sealed class TimePackCommand : IConsoleCommand
public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
{
if (args.Length == 1)
return CompletionResult.FromHint("Enter username");
{
return CompletionResult.FromHintOptions(
CompletionHelper.SessionNames(players: _playerManager),
"Enter username");
}
if (args.Length > 1)
{
@@ -362,8 +362,14 @@ public sealed class NanoChatCartridgeSystem : SharedNanoChatCartridgeSystem
if (TryComp<CartridgeComponent>(recipientEntity, out var cartridge)
&& cartridge.LoaderUid.HasValue && !recipientComp.MutedSound)
_audio.PlayPvs(recipientComp.Sound, recipientEntity);
{
_audio.PlayPvs(recipientComp.Sound, recipientEntity);
_cartridgeLoader.SendNotification(
cartridge.LoaderUid.Value,
Loc.GetString("nanochat-pda-notification-header"),
Loc.GetString("nanochat-pda-notification-fromwho", ("user", sender.Comp.OwnerName)));
}
UpdateUiState((recipientEntity, recipientComp));
UpdateUiState(sender);
}
@@ -3,7 +3,6 @@ using System.Numerics;
using Content.Server.Lavaland.Mobs.Components;
using Content.Server.NPC.HTN;
using Content.Server.NPC.Systems;
using Content.Shared.Achievements;
using Content.Shared.Camera;
using Content.Shared.Damage.Components;
using Content.Shared.Damage.Systems;
@@ -30,7 +29,6 @@ namespace Content.Server.Lavaland.Mobs;
public sealed partial class AshDrakeSystem : EntitySystem
{
[Dependency] private readonly SharedAchievementsSystem _achievement = default!;
[Dependency] private readonly AppearanceSystem _appearance = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly GibbingSystem _gibbing = default!;
@@ -52,21 +50,11 @@ public sealed partial class AshDrakeSystem : EntitySystem
{
base.Initialize();
SubscribeLocalEvent<AshDrakeBossComponent, MegafaunaKilledEvent>(OnAshDrakeKilled);
SubscribeLocalEvent<AshDrakeBossComponent, AshDrakeConeFireActionEvent>(OnConeFireAction);
SubscribeLocalEvent<AshDrakeBossComponent, AshDrakeBreathingFireActionEvent>(OnBreathingFireAction);
SubscribeLocalEvent<AshDrakeBossComponent, AshDrakeLavaActionEvent>(OnLavaAction);
}
private void OnAshDrakeKilled(EntityUid uid, AshDrakeBossComponent component, MegafaunaKilledEvent args)
{
if (args.Killer == null)
return;
_achievement.QueueAchievement(args.Killer.Value, AchievementsEnum.AshDrakeBoss);
}
#region Cone Fire
private void OnConeFireAction(Entity<AshDrakeBossComponent> ent, ref AshDrakeConeFireActionEvent args)
{
@@ -1,5 +1,4 @@
using Content.Server.Lavaland.Mobs.Components;
using Content.Shared.Achievements;
using Content.Shared.Lavaland.Events;
using Content.Shared.SSDIndicator;
using Robust.Shared.Audio.Systems;
@@ -8,7 +7,6 @@ namespace Content.Server.Lavaland.Mobs;
public sealed partial class BloodDrunkMinerSystem : EntitySystem
{
[Dependency] private readonly SharedAchievementsSystem _achievement = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
@@ -18,7 +16,6 @@ public sealed partial class BloodDrunkMinerSystem : EntitySystem
SubscribeLocalEvent<BloodDrunkMinerComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<BloodDrunkMinerComponent, MegafaunaKilledEvent>(OnBloodDrunkMinerKilled);
SubscribeLocalEvent<BloodDrunkMinerComponent, BloodDrunkMinerDashAction>(OnDash);
}
@@ -28,14 +25,6 @@ public sealed partial class BloodDrunkMinerSystem : EntitySystem
RemComp<SSDIndicatorComponent>(ent);
}
private void OnBloodDrunkMinerKilled(EntityUid uid, BloodDrunkMinerComponent component, MegafaunaKilledEvent args)
{
if (args.Killer == null)
return;
_achievement.QueueAchievement(args.Killer.Value, AchievementsEnum.MinerBoss);
}
private void OnDash(Entity<BloodDrunkMinerComponent> ent, ref BloodDrunkMinerDashAction args)
{
args.Handled = true;
@@ -4,7 +4,6 @@ using Content.Server.Lavaland.Mobs.Components;
using Content.Server.NPC.Components;
using Content.Server.NPC.HTN;
using Content.Server.NPC.Systems;
using Content.Shared.Achievements;
using Content.Shared.Actions.Components;
using Content.Shared.Chemistry.Components;
using Content.Shared.Damage;
@@ -34,7 +33,6 @@ namespace Content.Server.Lavaland.Mobs;
public sealed partial class BubblegumSystem : EntitySystem
{
[Dependency] private readonly SharedAchievementsSystem _achievement = default!;
[Dependency] private readonly AppearanceSystem _appearance = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly DamageableSystem _damage = default!;
@@ -145,9 +143,6 @@ public sealed partial class BubblegumSystem : EntitySystem
foreach (var reward in component.RewardsProto)
Spawn(reward, coords);
if (args.Killer != null)
_achievement.QueueAchievement(args.Killer.Value, AchievementsEnum.BubblegumBoss);
QueueDel(uid);
}
@@ -1,7 +1,6 @@
using System.Numerics;
using Content.Server.Chat.Systems;
using Content.Server.Lavaland.Mobs.Components;
using Content.Shared.Achievements;
using Content.Shared.Chat;
using Content.Shared.Damage.Components;
using Content.Shared.Damage.Systems;
@@ -18,7 +17,6 @@ namespace Content.Server.Lavaland;
public sealed class ColossusSystem : EntitySystem
{
[Dependency] private readonly SharedAchievementsSystem _achievement = default!;
[Dependency] private readonly ChatSystem _chat = default!;
[Dependency] private readonly DamageableSystem _damage = default!;
[Dependency] private readonly SharedGunSystem _gun = default!;
@@ -45,10 +43,6 @@ public sealed class ColossusSystem : EntitySystem
Spawn(reward, coords);
QueueDel(uid);
if (args.Killer != null)
{
_achievement.QueueAchievement(args.Killer.Value, AchievementsEnum.ColossusBoss);
}
}
private void OnFractionAction(Entity<ColossusBossComponent> ent, ref ColossusFractionActionEvent args)
@@ -2,8 +2,6 @@ using System.Numerics;
using Content.Server.Lavaland.Mobs.Components;
using Content.Server.NPC.HTN;
using Content.Server.NPC.Systems;
using Content.Shared.Achievements;
using Content.Shared.Damage.Components;
using Content.Shared.Damage.Systems;
using Content.Shared.Lavaland.Components;
using Content.Shared.Lavaland.Events;
@@ -25,7 +23,6 @@ namespace Content.Server.Lavaland.Mobs;
/// </summary>
public sealed partial class HierophantSystem : EntitySystem
{
[Dependency] private readonly SharedAchievementsSystem _achievement = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly DamageableSystem _damage = default!;
[Dependency] private readonly IGameTiming _timing = default!;
@@ -72,10 +69,6 @@ public sealed partial class HierophantSystem : EntitySystem
Spawn(reward, coords);
QueueDel(uid);
if (args.Killer != null)
{
_achievement.QueueAchievement(args.Killer.Value, AchievementsEnum.HierophantBoss);
}
}
#region Passive Movement
@@ -8,6 +8,7 @@ using Content.Server.Surgery;
using Content.Shared.Achievements;
using Content.Shared.Damage.Components;
using Content.Shared.Damage.Systems;
using Content.Shared.FixedPoint;
using Content.Shared.Height;
using Content.Shared.Humanoid;
using Content.Shared.Interaction;
@@ -260,7 +261,8 @@ public sealed partial class LegionSystem : EntitySystem
var spawnPos = FindSpawnPositionNear(coords, 2f);
if (spawnPos != null)
{
Spawn(prototype, spawnPos.Value);
var splitEntity = Spawn(prototype, spawnPos.Value);
TransferDamageContributors(uid, splitEntity);
}
}
@@ -269,6 +271,8 @@ public sealed partial class LegionSystem : EntitySystem
private void OnSplitKilled(EntityUid uid, LegionSplitComponent component, MegafaunaKilledEvent args)
{
RedistributeDamageToAllSplits(uid);
if (!string.IsNullOrEmpty(component.NextSplitPrototype))
{
SplitToNextLevel(uid, component);
@@ -285,11 +289,7 @@ public sealed partial class LegionSystem : EntitySystem
foreach (var reward in legion.RewardsProto)
Spawn(reward, coords);
if (args.Killer != null)
{
_achievement.QueueAchievement(args.Killer.Value, AchievementsEnum.FirstBoss);
_achievement.QueueAchievement(args.Killer.Value, AchievementsEnum.LegionBoss);
}
GrantAchievementsForLegion(uid);
}
}
@@ -304,7 +304,8 @@ public sealed partial class LegionSystem : EntitySystem
var spawnPos = FindSpawnPositionNear(coords, 2f);
if (spawnPos != null)
{
Spawn(component.NextSplitPrototype, spawnPos.Value);
var nextSplit = Spawn(component.NextSplitPrototype, spawnPos.Value);
TransferDamageContributors(uid, nextSplit);
}
}
}
@@ -324,6 +325,84 @@ public sealed partial class LegionSystem : EntitySystem
}
}
private void GrantAchievementsForLegion(EntityUid lastSplit)
{
if (!TryComp<MegafaunaDamageContributorComponent>(lastSplit, out var contributor))
return;
if (contributor.AchievementsGranted)
return;
contributor.AchievementsGranted = true;
FixedPoint2 totalDamage = 0f;
foreach (var damage in contributor.Contributors.Values)
totalDamage += damage;
if (totalDamage <= 0)
return;
var threshold = contributor.Threshold;
foreach (var (player, damage) in contributor.Contributors)
{
var percentage = damage / totalDamage;
if (percentage >= threshold)
{
_achievement.QueueAchievement(player, AchievementsEnum.FirstBoss);
_achievement.QueueAchievement(player, AchievementsEnum.LegionBoss);
}
}
contributor.Contributors.Clear();
}
private void RedistributeDamageToAllSplits(EntityUid dyingSplit)
{
if (!TryComp<MegafaunaDamageContributorComponent>(dyingSplit, out var dyingContrib))
return;
var livingSplits = new List<EntityUid>();
var allSplits = EntityQueryEnumerator<LegionSplitComponent>();
while (allSplits.MoveNext(out var uid, out _))
{
if (uid == dyingSplit || Exists(uid))
continue;
livingSplits.Add(uid);
}
if (livingSplits.Count == 0)
return;
foreach (var living in livingSplits)
{
var livingContrib = EnsureComp<MegafaunaDamageContributorComponent>(living);
foreach (var (player, damage) in dyingContrib.Contributors)
{
livingContrib.Contributors.TryGetValue(player, out var current);
livingContrib.Contributors[player] = current + damage;
}
livingContrib.Threshold = dyingContrib.Threshold;
}
}
private void TransferDamageContributors(EntityUid from, EntityUid to)
{
if (!TryComp<MegafaunaDamageContributorComponent>(from, out var fromContrib))
return;
var toContrib = EnsureComp<MegafaunaDamageContributorComponent>(to);
foreach (var (player, damage) in fromContrib.Contributors)
{
toContrib.Contributors.TryGetValue(player, out var current);
toContrib.Contributors[player] = current + damage;
}
toContrib.Threshold = fromContrib.Threshold;
toContrib.AchievementId = fromContrib.AchievementId;
}
#endregion
#region Utility Methods
@@ -40,6 +40,19 @@ public sealed partial class MegafaunaSystem : EntitySystem
if (!component.IsActive && totalDamage > 0)
ActivateMegafauna(uid, component);
if (args.Origin != null && HasComp<ActorComponent>(args.Origin))
{
var damageContributor = EnsureComp<MegafaunaDamageContributorComponent>(uid);
var damageDelta = args.DamageDelta?.GetTotal() ?? 0f;
if (damageDelta > 0)
{
damageContributor.Contributors.TryGetValue(args.Origin.Value, out var current);
damageContributor.Contributors[args.Origin.Value] = current + damageDelta;
damageContributor.TotalDamageReceived += damageDelta;
}
}
if (TryComp<HTNComponent>(uid, out var htn) && args.Origin != null)
htn.Blackboard.SetValue(component.TargetKey, args.Origin.Value);
}
@@ -49,6 +62,8 @@ public sealed partial class MegafaunaSystem : EntitySystem
if (args.NewMobState != MobState.Dead)
return;
GrantAchievementsToContributors(uid);
HandleDeath(uid, args);
}
@@ -69,13 +84,42 @@ public sealed partial class MegafaunaSystem : EntitySystem
_npc.WakeNPC(uid);
}
private void GrantAchievementsToContributors(EntityUid megafaunaUid)
{
if (HasComp<LegionBossComponent>(megafaunaUid)) // Specific
return;
if (!TryComp<MegafaunaDamageContributorComponent>(megafaunaUid, out var contributor))
return;
if (contributor.AchievementsGranted)
return;
contributor.AchievementsGranted = true;
var totalDamage = contributor.TotalDamageReceived;
if (totalDamage <= 0)
return;
var threshold = contributor.Threshold;
var achievementId = contributor.AchievementId;
foreach (var (player, damage) in contributor.Contributors)
{
var percentage = damage / totalDamage;
if (percentage >= threshold)
{
_achievement.QueueAchievement(player, achievementId);
_achievement.QueueAchievement(player, AchievementsEnum.FirstBoss);
}
}
contributor.Contributors.Clear();
}
private void HandleDeath(EntityUid uid, MobStateChangedEvent args)
{
_ambient.SetAmbience(uid, false);
if (args.Origin != null && !HasComp<LegionBossComponent>(uid))
{
_achievement.QueueAchievement(args.Origin.Value, AchievementsEnum.FirstBoss);
}
var killedEvent = new MegafaunaKilledEvent
{
@@ -0,0 +1,8 @@
using Content.Shared.Posing;
namespace Content.Server.Posing;
public sealed partial class PosingSystem : SharedPosingSystem
{
}
@@ -813,6 +813,7 @@ public sealed partial class VampireSystem
_emp.EmpPulse(originCoords, 4, 5000, TimeSpan.FromSeconds(30), uid);
SubtractBloodEssence(uid, 20);
args.Handled = true;
}
@@ -850,14 +851,14 @@ public sealed partial class VampireSystem
{
component.PowerActive = false;
_alerts.ClearAlert(uid, "AlertEternalDarkness");
RaiseNetworkEvent(new VampireToggleFovEvent(netEntity));
RaiseNetworkEvent(new VampireToggleFovEvent(netEntity, true));
args.Handled = true;
return;
}
_alerts.ShowAlert(uid, "AlertEternalDarkness", 0);
component.PowerActive = true;
RaiseNetworkEvent(new VampireToggleFovEvent(netEntity));
RaiseNetworkEvent(new VampireToggleFovEvent(netEntity, false));
_popup.PopupEntity(Loc.GetString("vampire-blood-true-power-started"), uid, uid, PopupType.SmallCaution);
void ExecuteTick()
@@ -874,7 +875,7 @@ public sealed partial class VampireSystem
{
_popup.PopupEntity(Loc.GetString("vampire-blood-sacrifice-insufficient-blood"), uid, uid, PopupType.SmallCaution);
component.PowerActive = false;
RaiseNetworkEvent(new VampireToggleFovEvent(netEntity));
RaiseNetworkEvent(new VampireToggleFovEvent(netEntity, true));
_alerts.ClearAlert(uid, "AlertEternalDarkness");
return;
}
@@ -6,6 +6,8 @@ using Content.Server.Bible.Components;
using Content.Server.Body.Systems;
using Content.Server.Chat.Systems;
using Content.Server.Polymorph.Systems;
using Content.Server.NPC.HTN;
using Content.Server.Humanoid.Components;
using Content.Shared.Actions;
using Content.Shared.Actions.Components;
using Content.Shared.Alert;
@@ -37,6 +39,7 @@ using Robust.Shared.Map;
using Robust.Shared.Prototypes;
using Robust.Shared.Utility;
using Robust.Shared.GameObjects;
using Robust.Shared.Timing;
using Content.Shared.Genetics;
using Content.Shared.Nutrition.EntitySystems;
using Content.Shared.Hands.EntitySystems;
@@ -47,7 +50,11 @@ using Content.Shared.Damage.Systems;
using Content.Shared.Damage.Components;
using Content.Shared.Tag;
using Content.Shared.Shaders;
using Content.Shared.SSDIndicator;
using Content.Shared.Mobs.Components;
using Content.Shared.Mobs;
using Content.Shared.Body;
using Content.Shared.HealthExaminable;
namespace Content.Server.Vampire;
@@ -96,6 +103,10 @@ public sealed partial class VampireSystem : SharedVampireSystem
SubscribeLocalEvent<VampireComponent, VampireDrinkingBloodActionEvent>(OnDrinkBlood);
SubscribeLocalEvent<VampireComponent, VampireDrinkingBloodDoAfterEvent>(DrinkDoAfter);
// Got bitten
SubscribeLocalEvent<BittenByVampireComponent, ComponentInit>(OnGotBitten);
SubscribeLocalEvent<BittenByVampireComponent, HealthBeingExaminedEvent>(OnHealthBeingExamined);
// Distribute Damage
SubscribeLocalEvent<VampireComponent, DamageChangedEvent>(OnDamageChanged);
SubscribeLocalEvent<ThrallComponent, DamageChangedEvent>(OnDamageChanged);
@@ -231,6 +242,21 @@ public sealed partial class VampireSystem : SharedVampireSystem
return false;
}
if (TryComp<SSDIndicatorComponent>(args.Target, out var targetSSDComponent) && TryComp<MobStateComponent>(args.Target, out var targetMobState))
{
if (targetSSDComponent.IsSSD && targetMobState.CurrentState != MobState.Dead)
{
_popup.PopupEntity(Loc.GetString("vampire-blooddrink-ssd"), uid, uid, PopupType.SmallCaution);
return false;
}
}
if (TryComp<HTNComponent>(args.Target, out var htnComponent) || TryComp<RandomHumanoidAppearanceComponent>(args.Target, out var targetRandomAppearence))
{
_popup.PopupEntity(Loc.GetString("vampire-blooddrink-not-sentient"), uid, uid, PopupType.SmallCaution);
return false;
}
return true;
}
@@ -268,6 +294,7 @@ public sealed partial class VampireSystem : SharedVampireSystem
_audio.PlayPvs(component.BloodDrainSound, uid, AudioParams.Default.WithVolume(-3f));
_blood.TryModifyBloodLevel(args.Target.Value, -(byte)(volumeToConsume * 0.5f));
EnsureComp<BittenByVampireComponent>(args.Target.Value);
if (HasComp<BibleUserComponent>(args.Target) && !component.TruePowerActive)
{
@@ -643,4 +670,20 @@ public sealed partial class VampireSystem : SharedVampireSystem
return null;
}
// Medics can see bite on your neck
private void OnGotBitten(EntityUid uid, BittenByVampireComponent component, ComponentInit args)
{
Timer.Spawn(TimeSpan.FromSeconds(900f), () => RemComp<BittenByVampireComponent>(uid));
}
private void OnHealthBeingExamined(Entity<BittenByVampireComponent> ent, ref HealthBeingExaminedEvent args)
{
if (HasComp<SurgicalSkillComponent>(args.Examiner))
{
args.Message.PushNewline();
args.Message.AddMarkupOrThrow(Loc.GetString("vampire-bittenbyvampire-examine"));
}
}
}
@@ -31,7 +31,7 @@ public sealed class HealthExaminableSystem : EntitySystem
{
Act = () =>
{
var markup = CreateMarkup(uid, component, damage);
var markup = CreateMarkup(uid, component, damage, args.User); // Corvax-Wega-Edit
_examineSystem.SendExamineTooltip(args.User, uid, markup, false, false);
},
Text = Loc.GetString("health-examinable-verb-text"),
@@ -44,7 +44,7 @@ public sealed class HealthExaminableSystem : EntitySystem
args.Verbs.Add(verb);
}
public FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent component, DamageableComponent damage)
public FormattedMessage CreateMarkup(EntityUid uid, HealthExaminableComponent component, DamageableComponent damage, EntityUid examiner) // Corvax-Wega-Edit
{
var msg = new FormattedMessage();
@@ -97,7 +97,7 @@ public sealed class HealthExaminableSystem : EntitySystem
}
// Anything else want to add on to this?
RaiseLocalEvent(uid, new HealthBeingExaminedEvent(msg), true);
RaiseLocalEvent(uid, new HealthBeingExaminedEvent(msg, examiner), true); // Corvax-Wega-Edit
return msg;
}
@@ -111,9 +111,11 @@ public sealed class HealthExaminableSystem : EntitySystem
public sealed class HealthBeingExaminedEvent
{
public FormattedMessage Message;
public EntityUid Examiner; // Corvax-Wega-Add
public HealthBeingExaminedEvent(FormattedMessage message)
public HealthBeingExaminedEvent(FormattedMessage message, EntityUid examiner) // Corvax-Wega-Edit
{
Message = message;
Examiner = examiner; // Corvax-Wega-Add
}
}
@@ -158,8 +158,23 @@ public sealed partial class HumanoidCharacterAppearanceV1
[DataField("hair")]
public string HairStyleId;
// Corvax-Wega-Convert-Edit-start
[DataField]
public Color HairColor;
private object? _hairColor;
public Color HairColor
{
get
{
if (_hairColor is string str)
return Color.TryFromHex(str) ?? Color.Black;
if (_hairColor is List<object> list && list.Count > 0 && list[0] is string listStr)
return Color.TryFromHex(listStr) ?? Color.Black;
return Color.Black;
}
set => _hairColor = value.ToHex();
}
// Corvax-Wega-Convert-Edit-end
[DataField("facialHair")]
public string FacialHairStyleId;
@@ -69,6 +69,14 @@ namespace Content.Shared.Input
public static readonly BoundKeyFunction ZoomIn = "ZoomIn";
public static readonly BoundKeyFunction ResetZoom = "ResetZoom";
public static readonly BoundKeyFunction TogglePosing = "TogglePosing"; // Corvax-Wega-Posing
public static readonly BoundKeyFunction PosingOffsetLeft = "PosingOffsetLeft"; // Corvax-Wega-Posing
public static readonly BoundKeyFunction PosingOffsetRight = "PosingOffsetRight"; // Corvax-Wega-Posing
public static readonly BoundKeyFunction PosingOffsetUp = "PosingOffsetUp"; // Corvax-Wega-Posing
public static readonly BoundKeyFunction PosingOffsetDown = "PosingOffsetDown"; // Corvax-Wega-Posing
public static readonly BoundKeyFunction PosingRotateNegative = "PosingRotateNegative"; // Corvax-Wega-Posing
public static readonly BoundKeyFunction PosingRotatePositive = "PosingRotatePositive"; // Corvax-Wega-Posing
public static readonly BoundKeyFunction ArcadeUp = "ArcadeUp";
public static readonly BoundKeyFunction ArcadeDown = "ArcadeDown";
public static readonly BoundKeyFunction ArcadeLeft = "ArcadeLeft";
@@ -15,7 +15,7 @@ public sealed partial class MouseRotatorComponent : Component
/// How much the desired angle needs to change before a predictive event is sent
/// </summary>
[DataField, AutoNetworkedField]
public Angle AngleTolerance = Angle.FromDegrees(20.0);
public Angle AngleTolerance = Angle.FromDegrees(5.0); // Corvax-Wega-SmoothFlashlight
/// <summary>
/// The angle that will be lerped to
@@ -37,7 +37,7 @@ public sealed partial class MouseRotatorComponent : Component
/// like turrets or ship guns, which have finer range of movement.
/// </summary>
[DataField, AutoNetworkedField]
public bool Simple4DirMode = true;
public bool Simple4DirMode = false; // Corvax-Wega-SmoothFlashlight
}
/// <summary>
@@ -57,4 +57,12 @@ public sealed partial class BallisticAmmoProviderComponent : Component
/// </summary>
[DataField]
public TimeSpan FillDelay = TimeSpan.FromSeconds(0.5);
// Corvax-Wega-Add-start
/// <summary>
/// TryStartDoAfter boolean for BreakOnMove, Corvax Wega thing
/// </summary>
[ViewVariables(VVAccess.ReadWrite), DataField]
public bool BreakOnMoveFill = true;
// Corvax-Wega-Add-start
}
@@ -78,7 +78,7 @@ public abstract partial class SharedGunSystem
// Continuous loading
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.FillDelay, new AmmoFillDoAfterEvent(), used: uid, target: args.Target, eventTarget: uid)
{
BreakOnMove = true,
BreakOnMove = component.BreakOnMoveFill, // Corvax-Wega-Edit
BreakOnDamage = false,
NeedHand = true,
});
@@ -2,9 +2,10 @@ using Robust.Shared.GameStates;
namespace Content.Shared.Clothing.Components;
[RegisterComponent, NetworkedComponent, Access(typeof(ClothingAshStormProtectionSystem))]
[Access(typeof(ClothingAshStormProtectionSystem))]
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)]
public sealed partial class ClothingAshStormProtectionComponent : Component
{
[DataField]
[DataField, AutoNetworkedField]
public float Modifier = 0.5f;
}
@@ -1,5 +1,6 @@
using Content.Shared.Clothing.Components;
using Content.Shared.DoAfter;
using Content.Shared.Inventory;
using Content.Shared.Verbs;
using Robust.Shared.Audio.Systems;
using Robust.Shared.GameStates;
@@ -18,7 +19,7 @@ public sealed class ToggleableSpriteClothingSystem : EntitySystem
SubscribeLocalEvent<ToggleableSpriteClothingComponent, ComponentGetState>(OnGetState);
SubscribeLocalEvent<ToggleableSpriteClothingComponent, GetVerbsEvent<AlternativeVerb>>(AddToggleVerb);
SubscribeLocalEvent<ToggleSpriteClothingDoAfterEvent>(OnDoAfter);
SubscribeLocalEvent<InventoryComponent, ToggleSpriteClothingDoAfterEvent>(OnDoAfter);
}
private static void OnGetState(EntityUid uid, ToggleableSpriteClothingComponent component, ref ComponentGetState args)
@@ -59,7 +60,7 @@ public sealed class ToggleableSpriteClothingSystem : EntitySystem
_doAfterSystem.TryStartDoAfter(args);
}
private void OnDoAfter(ToggleSpriteClothingDoAfterEvent args)
private void OnDoAfter(Entity<InventoryComponent> entity, ref ToggleSpriteClothingDoAfterEvent args)
{
if (args.Handled || args.Target == null)
return;
@@ -0,0 +1,23 @@
using Content.Shared.Achievements;
using Content.Shared.FixedPoint;
namespace Content.Shared.Lavaland.Components;
[RegisterComponent]
public sealed partial class MegafaunaDamageContributorComponent : Component
{
[DataField("achievement", required: true)]
public AchievementsEnum AchievementId = default!;
[DataField]
public float Threshold = 0.3f;
[ViewVariables(VVAccess.ReadOnly)]
public bool AchievementsGranted = false;
[ViewVariables(VVAccess.ReadOnly)]
public FixedPoint2 TotalDamageReceived = 0f;
[ViewVariables(VVAccess.ReadOnly)]
public Dictionary<EntityUid, FixedPoint2> Contributors = new();
}
@@ -238,7 +238,7 @@ public abstract partial class SharedModularSuitSystem : EntitySystem
{
if (Inventory.TryGetSlotEntity(wearer, slot, out var equipped) && equipped == partUid)
{
if (Inventory.TryUnequip(wearer, slot, out var removedItem))
if (Inventory.TryUnequip(wearer, slot, out var removedItem, force: true))
{
Container.Insert(removedItem.Value, partContainer);
RemComp<AttachedModularSuitPartComponent>(removedItem.Value);
@@ -344,7 +344,7 @@ public abstract partial class SharedModularSuitSystem : EntitySystem
}
if (Container.Remove(itemUid, hiddenContainer))
Inventory.TryEquip(wearer, itemUid, slot);
Inventory.TryEquip(wearer, itemUid, slot, force: true);
hiddenComp.HiddenItems.Remove(slot);
Dirty(suit.Owner, hiddenComp);
@@ -0,0 +1,32 @@
using System.Numerics;
using Robust.Shared.GameStates;
namespace Content.Shared.Posing;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)]
public sealed partial class PosingComponent : Component
{
[ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public Vector2 CurrentOffset = Vector2.Zero;
[ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public Angle CurrentAngle = Angle.Zero;
[DataField, AutoNetworkedField]
public Vector2 OffsetLimits = new(0.3f, 0.3f);
[DataField, AutoNetworkedField]
public float AngleLimits = 180f;
[ViewVariables(VVAccess.ReadWrite), AutoNetworkedField]
public bool Posing = false;
[DataField]
public string DefaultInputContext = "human";
[DataField]
public Vector2 DefaultOffset = Vector2.Zero;
[DataField]
public float DefaultAngle = 0f;
}
@@ -0,0 +1,170 @@
using System.Numerics;
using Content.Shared.ActionBlocker;
using Content.Shared.Damage.Components;
using Content.Shared.Input;
using Content.Shared.Mobs;
using Content.Shared.Movement.Events;
using Content.Shared.Standing;
using Content.Shared.Stunnable;
using Robust.Shared.Input.Binding;
namespace Content.Shared.Posing;
public abstract partial class SharedPosingSystem : EntitySystem
{
[Dependency] private readonly StandingStateSystem _standing = default!;
[Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PosingComponent, UpdateCanMoveEvent>(OnUpdateCanMove);
SubscribeLocalEvent<PosingComponent, DownedEvent>(OnDowned);
SubscribeLocalEvent<PosingComponent, MobStateChangedEvent>(OnMobStateChanged);
CommandBinds.Builder
.Bind(ContentKeyFunctions.TogglePosing,
InputCmdHandler.FromDelegate(session =>
{
if (session?.AttachedEntity is { } userUid && !CanTogglePosing(userUid))
TogglePosing(userUid);
},
handle: false))
.Bind(ContentKeyFunctions.PosingOffsetRight,
InputCmdHandler.FromDelegate(session =>
{
if (session?.AttachedEntity is { } userUid)
TryAdjustPosingOffset(userUid, new(0.05f, 0f));
},
handle: false))
.Bind(ContentKeyFunctions.PosingOffsetLeft,
InputCmdHandler.FromDelegate(session =>
{
if (session?.AttachedEntity is { } userUid)
TryAdjustPosingOffset(userUid, new(-0.05f, 0f));
},
handle: false))
.Bind(ContentKeyFunctions.PosingOffsetUp,
InputCmdHandler.FromDelegate(session =>
{
if (session?.AttachedEntity is { } userUid)
TryAdjustPosingOffset(userUid, new(0f, 0.05f));
},
handle: false))
.Bind(ContentKeyFunctions.PosingOffsetDown,
InputCmdHandler.FromDelegate(session =>
{
if (session?.AttachedEntity is { } userUid)
TryAdjustPosingOffset(userUid, new(0f, -0.05f));
},
handle: false))
.Bind(ContentKeyFunctions.PosingRotatePositive,
InputCmdHandler.FromDelegate(session =>
{
if (session?.AttachedEntity is { } userUid)
TryAdjustPosingAngle(userUid, -5f);
},
handle: false))
.Bind(ContentKeyFunctions.PosingRotateNegative,
InputCmdHandler.FromDelegate(session =>
{
if (session?.AttachedEntity is { } userUid)
TryAdjustPosingAngle(userUid, 5f);
},
handle: false))
.Register<SharedPosingSystem>();
}
public override void Shutdown()
{
base.Shutdown();
CommandBinds.Unregister<SharedPosingSystem>();
}
private void OnUpdateCanMove(EntityUid uid, PosingComponent component, UpdateCanMoveEvent args)
{
if (component.Posing)
args.Cancel();
}
private void OnDowned(EntityUid uid, PosingComponent component, EntityEventArgs args)
{
if (component.Posing)
TogglePosing(uid, component);
}
private void OnMobStateChanged(EntityUid uid, PosingComponent component, ref MobStateChangedEvent args)
{
if (component.Posing)
TogglePosing(uid, component);
}
private void TogglePosing(EntityUid uid, PosingComponent? posingComp = null)
{
if (!Resolve(uid, ref posingComp, false))
return;
posingComp.Posing = !posingComp.Posing;
_actionBlocker.UpdateCanMove(uid);
posingComp.CurrentAngle = Angle.Zero;
posingComp.CurrentOffset = Vector2.Zero;
ClientTogglePosing(uid, posingComp);
Dirty(uid, posingComp);
}
private void TryAdjustPosingOffset(EntityUid uid, Vector2 offset, PosingComponent? posingComp = null)
{
if (!Resolve(uid, ref posingComp, false) || !posingComp.Posing)
return;
var previousOffset = posingComp.CurrentOffset;
posingComp.CurrentOffset += offset;
posingComp.CurrentOffset = Vector2.Clamp(posingComp.CurrentOffset, -posingComp.OffsetLimits, posingComp.OffsetLimits);
if (posingComp.CurrentOffset.Equals(previousOffset))
return;
Dirty(uid, posingComp);
}
private void TryAdjustPosingAngle(EntityUid uid, float angle, PosingComponent? posingComp = null)
{
if (!Resolve(uid, ref posingComp, false) || !posingComp.Posing)
return;
var previousAngle = posingComp.CurrentAngle;
var newAngle = posingComp.CurrentAngle.Degrees + angle;
posingComp.CurrentAngle = Angle.FromDegrees(Math.Clamp(newAngle, -posingComp.AngleLimits, posingComp.AngleLimits));
if (posingComp.CurrentAngle.Equals(previousAngle))
return;
Dirty(uid, posingComp);
}
protected virtual void ClientTogglePosing(EntityUid uid, PosingComponent posing)
{
}
private bool CanTogglePosing(EntityUid uid)
{
if (_actionBlocker.CanConsciouslyPerformAction(uid))
return false;
if (TryComp<StaminaComponent>(uid, out var stamina) && stamina.Critical)
return false;
if (HasComp<StunnedComponent>(uid))
return false;
if (_standing.IsDown(uid))
return false;
return true;
}
}
@@ -0,0 +1,93 @@
using System.Diagnostics.CodeAnalysis;
using Content.Shared.Preferences;
using JetBrains.Annotations;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
using Robust.Shared.Utility;
namespace Content.Shared.Roles;
/// <summary>
/// Requires that at least one of the listed requirements is met.
/// </summary>
[UsedImplicitly]
[Serializable, NetSerializable]
public sealed partial class AnyRequirement : JobRequirement
{
[DataField(required: true)]
public List<JobRequirement> Requirements = new();
public override bool Check(
IEntityManager entManager,
IPrototypeManager protoManager,
HumanoidCharacterProfile? profile,
IReadOnlyDictionary<string, TimeSpan> playTimes,
[NotNullWhen(false)] out FormattedMessage? reason)
{
reason = null;
var anyPassed = false;
var failedReasons = new List<FormattedMessage>();
foreach (var requirement in Requirements)
{
if (requirement.Check(entManager, protoManager, profile, playTimes, out var reqReason))
{
anyPassed = true;
if (!Inverted)
break;
}
else if (reqReason != null)
{
failedReasons.Add(reqReason);
}
}
// Normal mode: need at least one to pass
if (!Inverted)
{
if (anyPassed)
return true;
reason = BuildCombinedFailureMessage(failedReasons, false);
return false;
}
// Inverted mode: need ALL to fail
if (!anyPassed)
return true;
reason = BuildCombinedFailureMessage(failedReasons, true);
return false;
}
private FormattedMessage BuildCombinedFailureMessage(List<FormattedMessage> failedReasons, bool inverted)
{
var message = new FormattedMessage();
if (failedReasons.Count == 0)
{
message.AddMarkupPermissive(Loc.GetString(inverted
? "role-any-requirement-inverted-failed"
: "role-any-requirement-failed"));
return message;
}
if (inverted)
{
message.AddMarkupPermissive(Loc.GetString("role-any-requirement-inverted-need-all") + "\n");
}
else
{
message.AddMarkupPermissive(Loc.GetString("role-any-requirement-need-one") + "\n");
}
for (var i = 0; i < failedReasons.Count; i++)
{
message.AddMarkupPermissive($"- ");
message.AddMarkupPermissive(failedReasons[i].ToMarkup());
if (i < failedReasons.Count - 1)
message.AddMarkupPermissive("\n");
}
return message;
}
}
@@ -100,6 +100,9 @@ public sealed partial class BeaconSoulComponent : Component
public EntityUid VampireOwner = EntityUid.Invalid;
}
[RegisterComponent, NetworkedComponent]
public sealed partial class BittenByVampireComponent : Component;
/// <summary>
/// A component for testing vampire arson near holy sites.
/// </summary>
@@ -134,10 +134,12 @@ public sealed partial class VampireEternalDarknessActionEvent : InstantActionEve
public sealed partial class VampireToggleFovEvent : EntityEventArgs
{
public NetEntity User { get; }
public bool Enabled { get; }
public VampireToggleFovEvent(NetEntity user)
public VampireToggleFovEvent(NetEntity user, bool enabled)
{
User = user;
Enabled = enabled;
}
}
@@ -1 +1,3 @@
nano-chat-program-name = НаноЧат
nano-chat-program-name = НаноЧат
nanochat-pda-notification-header = Получено новое сообщение
nanochat-pda-notification-fromwho = Отправитель: { $user }
@@ -1,2 +1,9 @@
ui-options-function-strangle = Душить
ui-options-function-offer-item = Переключить режим передачи предмета
ui-options-function-toggle-posing = Переключить режим позирования
ui-options-function-posing-offset-left = Переместиться влево (позирование)
ui-options-function-posing-offset-right = Переместиться вправо (позирование)
ui-options-function-posing-offset-up = Переместиться вверх (позирование)
ui-options-function-posing-offset-down = Переместиться вниз (позирование)
ui-options-function-posing-rotate-negative = Повернуть против часовой (позирование)
ui-options-function-posing-rotate-positive = Повернуть по часовой (позирование)
@@ -0,0 +1,25 @@
wega-ruleset-name = Правила сервера
wega-punishment-types-name = Игровые наказания
wega-rule-0-name = Правило 0
wega-rule-1-name = Правило 1
wega-rule-2-name = Правило 2
wega-rule-3-name = Правило 3
wega-rule-31-name = Правило 3.1
wega-rule-32-name = Правило 3.2
wega-rule-33-name = Правило 3.3
wega-rule-34-name = Правило 3.4
wega-rule-35-name = Правило 3.5
wega-rule-36-name = Правило 3.6
wega-rule-37-name = Правило 3.7
wega-rule-38-name = Правило 3.8
wega-rule-39-name = Правило 3.9
wega-rule-4-name = Правило 4
wega-rule-5-name = Правило 5
wega-rule-6-name = Правило 6
wega-rule-7-name = Правило 7
wega-rule-8-name = Правило 8
wega-rule-81-name = Правило 8.1
wega-rule-82-name = Правило 8.2
wega-rule-83-name = Правило 8.3
wega-rule-9-name = Правило 9
@@ -0,0 +1,5 @@
role-any-requirement-failed = Не выполнено ни одно из требований.
role-any-requirement-need-one = Требуется выполнить одно из условий:
role-any-requirement-inverted-failed = Требования не должны быть выполнены, но они выполнены.
role-any-requirement-inverted-need-all = Следующие условия НЕ должны быть выполнены:
@@ -23,8 +23,8 @@ lavaland-shuttle-info-ready = Система готова к транспорт
prison-shuttle-status = Статус шаттла:
prison-shuttle-current-location = Ваше местоположение:
prison-shuttle-status-docked-station = Пристыкован на станции
prison-shuttle-status-docked-prison = Пристыкован в каторге
prison-shuttle-status-docked-station = Пристыкован к станции
prison-shuttle-status-docked-prison = Пристыкован к каторге
prison-shuttle-status-enroute-station = Направляется на станцию
prison-shuttle-status-enroute-prison = Направляется в каторгу
prison-shuttle-status-unknown = Неизвестно
@@ -11,12 +11,15 @@ vampire-blooddrink-self = Вы не можете пить свою кровь
vampire-blooddrink-rotted = Оно гниет!
vampire-blooddrink-not-vampire = Вы не можете испить кровь вампира
vampire-blooddrink-not-thrall = Вы не можете испить кровь тралла
vampire-blooddrink-not-sentient = Вы не можете испить кровь неразумного
vampire-blooddrink-empty = Жертва иссякла
vampire-blooddrink-maxed-out = Вы уже насытились достаточно с этой жертвы
vampire-blooddrink-ssd = Вы не можете испить кровь спящего
vampire-ingest-holyblood = ВЫ НЕ МОЖЕТЕ ПИТЬ СВЯТУЮ КРОВЬ!!!
vampire-full-stomach = Вы не можете пить больше
vampire-startlight-burning = ВАША КОЖА ПОЛЫХАЕТ!
vampire-true-power = Вы чувствуете истинную силу
vampire-bittenbyvampire-examine = [color=red]Кажется, на шее есть укус[/color]
# Abilities
vampire-hungry = Вы ещё слишком голодны для эволюции
@@ -11,6 +11,16 @@ voucher-security-first-aid-desc = Содержит в себе пару набо
voucher-security-riots-desc = Содержит в себе пару баллистических и противоударных щитов, пару кластерных светошумовых гранат, пару шок-дубинок и стяжки
voucher-security-supervision-desc = Содержит в себе пару нагрудных камер, 4 тренировчоных магазина для Mk58, дубинку, запасную шок-дубинку, пару наручников и вспышку
# BlueShield
voucher-security-jay-name = Набор штурмовой винтовки
voucher-security-berkut-name = Набор пистолета-пулемёта
voucher-security-pulsar-name = Набор энерго-карабина
voucher-security-baton-name = Набор многофункциональной дубинки
voucher-security-jay-desc = Содержит в себе штурмовую винтовку - Сойка, и дополнительные патроны к ней
voucher-security-berkut-desc = Содержит в себе пистолет-пулемёт - Беркут, и дополнительные патроны к нему
voucher-security-pulsar-desc = Содержит в себе энергетический карабин "Пульсар"
voucher-security-baton-desc = Содержит в себе многофункциональную дубинку, способную наносить повышенный вред здоровью при включенном состоянии.
# Salvage
voucher-explorer-kit-name = Набор Иследователя
voucher-fulton-kit-name = Набор Эвакуации фултона
@@ -0,0 +1,2 @@
ent-ExplosionPackage = взрыв пакет
.desc = Некрепко держащаяся бомба которая явно не должна существовать.
@@ -20,7 +20,7 @@ genpop-prisoner-id-examine-served = Вы отбыли своё наказани
genpop-locker-name-default = шкаф заключённого
genpop-locker-desc-default = Это защищённый шкафчик для персональных вещей заключённого во время его пребывания в тюрьме.
genpop-locker-name-used = prisoner closet ({ $name })
genpop-locker-name-used = шкаф заключённого ({ $name })
genpop-locker-desc-used = Это защищённый шкафчик для персональных вещей заключённого во время его пребывания в тюрьме. Содержит личные вещи { $name }.
genpop-locker-ui-label-name = [bold]Имя осуждённого:[/bold]
@@ -8,7 +8,7 @@ admin-verb-make-head-rev = Сделать цель главой революци
admin-verb-make-thief = Сделать цель вором.
admin-verb-make-paradox-clone = Создать роль призрака парадоксального клона цели.
admin-verb-make-wizard = Сделать цель волшебником.
admin-verb-make-space-ninja = Make the target into a Space Ninja.
admin-verb-make-space-ninja = Сделать цель космическим ниндзя.
admin-verb-make-changeling = Сделать цель генокрадом.
@@ -21,7 +21,7 @@ admin-verb-text-make-head-rev = Сделать главой революции
admin-verb-text-make-thief = Сделать вором
admin-verb-text-make-paradox-clone = Создать парадоксального клона
admin-verb-text-make-wizard = Сделать волшебником
admin-verb-text-make-space-ninja = Make Ninja
admin-verb-text-make-space-ninja = Сделать ниндзя
admin-verb-text-make-changeling = Сделать генокрадом (WIP)
admin-overlay-antag-classic = АНТАГ
+2 -2
View File
@@ -123,5 +123,5 @@ alerts-rooted-desc = Вы прикреплены к земле. Вы не мож
alerts-stealthy-name = Карманничество
alerts-stealthy-desc = Определяет режим скрытой кражи. Нажмите для переключения.
alerts-prying-name = Prying
alerts-prying-desc = You can innately pry doors open using alternative interaction.
alerts-prying-name = Вскрытие
alerts-prying-desc = Вы можете вскрывать двери, используя альтернативное взаимодействие.
+1 -1
View File
@@ -102,4 +102,4 @@ anomaly-behavior-inconstancy = [color=crimson]Обнаружено непост
anomaly-behavior-fast = [color=crimson]Частота импульсов значительно повышена.[/color]
anomaly-behavior-strenght = [color=crimson]Мощность импульсов значительно повышена.[/color]
anomaly-behavior-moving = [color=crimson]Обнаружена координатная нестабильность.[/color]
anomaly-secret-admin = [color=red](ERROR)[/color]
anomaly-secret-admin = [color=red](ОШИБКА)[/color]
@@ -105,7 +105,7 @@ barsign-prototype-name-whiskeyechoes = Виски Эхо
barsign-prototype-description-whiskeyechoes = Элитный бар для элитных опер... Подождите, это же станция Nanotrasen. Почему эта вывеска в базе данных?
## EmpBarSign
barsign-prototype-name-empbarsign = glitchy bar sign
barsign-prototype-name-empbarsign = глючащая вывеска бара
barsign-prototype-description-empbarsign = Что-то пошло совсем не так.
## SignOff
@@ -6,15 +6,15 @@ blocking-coefficient-value = - Получает [color=lightblue]{ $value }%[/co
blocking-reduction-value = - Получает на [color=lightblue]{ $value }[/color] меньше [color=yellow]{ $type }[/color] урона.
# Shown when examining the shield. Each entry represents the shield's health condition
comp-shield-damaged-1 = It looks fully intact.
comp-shield-damaged-2 = It has a few scratches.
comp-shield-damaged-3 = It has a few small holes and divots.
comp-shield-damaged-4 = [color=yellow]It has several holes and bent parts.[/color]
comp-shield-damaged-5 = [color=orange]It has deep cracks, several holes and parts of it have broken off.[/color]
comp-shield-damaged-6 = [color=red]It's been extremely brutalized and is nearly falling apart.[/color]
comp-shield-damaged-1 = Выглядит прямо с завода.
comp-shield-damaged-2 = На нём несколько царапин.
comp-shield-damaged-3 = На нём имеются небольшие вмятины и выбоины
comp-shield-damaged-4 = [color=yellow]На нём несколько отверстий и искривлений.[/color]
comp-shield-damaged-5 = [color=orange]У него есть глубокие трещины, несколько дырок и отломанные части.[/color]
comp-shield-damaged-6 = [color=red]Он подвергся крайней жестокости и вот-вот развалится.[/color]
# Shown when examining the e-shield. Each entry represents the e-shield's health condition
comp-eshield-damaged-1 = It looks fully intact.
comp-eshield-damaged-2 = [color=yellow]The battery light is yellow.[/color]
comp-eshield-damaged-3 = [color=orange]The battery light is orange, the hardlight flickers.[/color]
comp-eshield-damaged-4 = [color=red]The battery light is red, the hardlight can barely stay alight.[/color]
comp-eshield-damaged-1 = Выглядит прямо с завода.
comp-eshield-damaged-2 = [color=yellow]Индикатор заряда горит жёлтым.[/color]
comp-eshield-damaged-3 = [color=orange]Индикатор заряда горит оранжевым, энергетический щит мигает.[/color]
comp-eshield-damaged-4 = [color=red]Индикатор заряда горит красным, энергетический щит едва держится включённым.[/color]
+1 -1
View File
@@ -9,7 +9,7 @@ borg-mind-removed = { CAPITALIZE($name) } выключается!
borg-module-too-many = Для ещё одного модуля не хватает места...
borg-module-duplicate = Этот модуль уже установлен в этого киборга.
borg-module-whitelist-deny = Этот модуль не подходит для данного типа киборгов...
borg-module-incompatible = This module isn't compatible with { THE($existing) }.
borg-module-incompatible = Этот модуль не совместим с { THE($existing) }.
borg-module-action-name = Активировать { $moduleName }
borg-module-action-description = Выбрать { $moduleName }, чтобы использовать предоставляемые им инструменты.
+1 -1
View File
@@ -1,2 +1,2 @@
bodyburn-text-others = { CAPITALIZE($name) } сгорает дотла!
bodyburn-vox-text-others = { CAPITALIZE(THE($name)) } turned into fried vox!
bodyburn-vox-text-others = { CAPITALIZE(THE($name)) } стал жареным воксом!
+1 -1
View File
@@ -101,7 +101,7 @@ bounty-description-lime = После сильной попойки адмира
bounty-description-lung = Лига сторонников курения тысячелетиями боролась за то, чтобы сигареты оставались на наших станциях. К сожалению, их лёгкие уже не так сильно сопротивляются. Пошлите им новые.
bounty-description-monkey-cube = В связи с недавней генетической катастрофой Центральное командование испытывает острую потребность в обезьянах. Ваша задача — доставить обезьяньи кубы.
bounty-description-mouse = На космической станции 15 закончились сублимированные мыши. Отправьте свежих, чтобы их уборщик не объявил забастовку.
bounty-description-pancake = В Nanotrasen мы считаем сотрудников семьёй. А вы знаете, что любят семьи? Блины. Отправьте дюжину.
bounty-description-pancake = В Nanotrasen мы считаем сотрудников семьёй. А вы знаете, что любят семьи? Блины. Отправьте полдюжины.
bounty-description-pen = Мы проводим межгалактическое соревнование по балансировке ручек. Нам нужно, чтобы вы прислали нам несколько стандартизированных шариковых ручек.
bounty-description-percussion = Из-за неудачной драки в баре, Объединённый смешанный ансамбль ударных инструментов всея Галактики потерял все свои инструменты. Пришлите им новый набор, чтобы они снова могли играть.
bounty-description-pie = 3.14159? Нет! Руководство Центком хочет покушать ПИрогов! Отправьте им один.
@@ -1,7 +1,7 @@
## UI
cargo-console-menu-title = Консоль заказа грузов
cargo-console-menu-flavor-left = Order even more pizza boxes than usual!
cargo-console-menu-flavor-left = Закажи еще больше коробок пиццы, чем обычно!
cargo-console-menu-flavor-right = v2.1
cargo-console-menu-account-name-label = Аккаунт:{ " " }
cargo-console-menu-account-name-none-text = Нет
@@ -20,13 +20,13 @@ cargo-console-menu-search-bar-placeholder = Поиск
cargo-console-menu-requests-label = Запросы
cargo-console-menu-orders-label = Заказы
cargo-console-menu-populate-categories-all-text = Все
cargo-console-menu-order-row-title = { $productName } (x{ $orderAmount } for { $orderPrice }$)
cargo-console-menu-populate-orders-cargo-order-row-product-name-text = { $productName } (x{ $orderAmount }) от { $orderRequester } со счёта [color={ $accountColor }]{ $account }[/color]
cargo-console-menu-order-row-product-description = Reason: { $orderReason }
cargo-console-menu-order-row-button-approve = Approve
cargo-console-menu-order-row-button-cancel = Cancel
cargo-console-menu-order-row-alerts-reason-absent = The reason is not specified
cargo-console-menu-order-row-alerts-requester-unknown = Unknown
cargo-console-menu-order-row-title = { $productName } (x{ $orderAmount } за { $orderPrice }$)
cargo-console-menu-populate-orders-cargo-order-row-product-name-text = Заказчик: { $orderRequester } со счета [color={ $accountColor }]{ $account }[/color]
cargo-console-menu-order-row-product-description = Причина: { $orderReason }
cargo-console-menu-order-row-button-approve = Одобрить
cargo-console-menu-order-row-button-cancel = Отменить
cargo-console-menu-order-row-alerts-reason-absent = Причина не указана
cargo-console-menu-order-row-alerts-requester-unknown = Неизвестно
cargo-console-menu-tab-title-orders = Заказы
cargo-console-menu-tab-title-funds = Переводы
cargo-console-menu-account-action-transfer-limit = [bold]Лимит перевода:[/bold] ${ $limit }
+2 -2
View File
@@ -37,7 +37,7 @@ chat-emote-name-snarl = Скалиться
chat-emote-name-whine = Скулить
chat-emote-name-howl = Выть
chat-emote-name-growl = Рычать
chat-emote-name-flap = Flap Wings
chat-emote-name-flap = Взмахнуть крыльями
# Message
chat-emote-msg-scream = кричит!
@@ -79,4 +79,4 @@ chat-emote-msg-snarl = скалится.
chat-emote-msg-whine = скулит.
chat-emote-msg-howl = воет.
chat-emote-msg-growl = рычит.
chat-emote-msg-flap = flaps { POSS-ADJ($entity) } wings.
chat-emote-msg-flap = машет { POSS-ADJ($entity) } крыльями.
+1 -1
View File
@@ -42,7 +42,7 @@ highlights-janitor = уборщик
highlights-lawyer = адвокат, юрист
highlights-librarian = библиотекар, библиотека
highlights-mime = мим
highlights-musician = Musician, "Music", Theatre, Theater, Service, "Serv"
highlights-musician = музыкант, театрал, артист, сервисный работник, сервисник
highlights-passenger = пассажир, грейтайдер, "тайдер"
highlights-service-worker = сервисный работник, сервисник
@@ -14,5 +14,5 @@ mixing-verb-shake = метод шейк
default-mixing-success = Вы смешиваете { $mixed } при помощи { $mixer }
bible-mixing-success = Вы благословляете { $mixed } при помощи { $mixer }
spoon-mixing-success = Вы размешиваете { $mixed } при помощи { $mixer }
handheld-centrifuge-success = You seperate chemicals in the { $mixed }
handheld-centrifuge-success = Вы разделяете вещества при помощи { $mixed }
@@ -1,5 +1,5 @@
accept-cloning-window-title = Клонирующая машина
accept-cloning-window-prompt-text-part = Вас клонируют!
accept-cloning-window-prompt-text-part = Вас клонируют! Вы забудете детали своей смерти.
Перенести свою душу в тело клона?
accept-cloning-window-accept-button = Да
accept-cloning-window-deny-button = Нет
@@ -1,2 +1,2 @@
insulated-examinable-verb-text = Insulated
insulated-examinable-verb-text-message = This item appears to be electrically insulated. It should protect the wearer from shocks.
insulated-examinable-verb-text = Изолированный
insulated-examinable-verb-text-message = Этот предмет, по всей видимости, имеет электрическую изоляцию. Оно должно защищать от поражения электрическим током.
@@ -1,10 +1,10 @@
command-description-xenoartifact-list =
List all EntityUids of spawned artifacts.
Выводит Uid список всех существующих ксеноартефактов.
command-description-xenoartifact-printMatrix =
Prints out matrix that displays all edges between nodes.
Выводит матрицу, отображающую все ребра между узлами.
command-description-xenoartifact-totalResearch =
Gets all research points that can be extracted from artifact currently.
Получает все исследовательские очки, которые в данный момент можно извлечь из артефакта.
command-description-xenoartifact-averageResearch =
Calculates amount of research points average generated xeno artifact will output when fully activated.
Вычисляет количество очков исследований, которое сгенерированный ксеноартефакт выдаст при полной активации.
command-description-xenoartifact-unlockAllNodes =
Unlocks all nodes of artifact.
Разблокирует все узлы артефакта.
@@ -8,7 +8,7 @@ flatpacker-ui-title = Упаковщик 1001
flatpacker-ui-materials-label = Материалы
flatpacker-ui-cost-label = Стоимость запаковки
flatpacker-ui-no-board-label = Отсутствует машинная плата!
flatpacker-ui-board-invalid-label = [color=red]Invalid board!
Unable to print![/color]
flatpacker-ui-board-invalid-label = [color=red]Недопустимая плата!
Невозможно распечатать![/color]
flatpacker-ui-insert-board = Для начала вставьте машинную плату.
flatpacker-ui-pack-button = Упаковать
@@ -58,3 +58,23 @@ names-xenoborg-dataset-57 = Кусок Разрушения
names-xenoborg-dataset-58 = Талос
names-xenoborg-dataset-59 = Агробот
names-xenoborg-dataset-60 = Вспинубой
names-xenoborg-dataset-61 = Kill.exe
names-xenoborg-dataset-62 = Фатальная Прошивка
names-xenoborg-dataset-63 = W.A.R unit
names-xenoborg-dataset-64 = Тостер рока
names-xenoborg-dataset-65 = Griller
names-xenoborg-dataset-66 = Умный Убийца
names-xenoborg-dataset-67 = Borg.Smith-7
names-xenoborg-dataset-68 = Crewcracker pr1nce
names-xenoborg-dataset-69 = Процессазинатор
names-xenoborg-dataset-70 = H.4.T.3.R
names-xenoborg-dataset-71 = JUGGER-8
names-xenoborg-dataset-72 = Null-Zero
names-xenoborg-dataset-73 = Балистический Борг
names-xenoborg-dataset-74 = Ошибка 666
names-xenoborg-dataset-75 = Slaughter-o-tron
names-xenoborg-dataset-76 = Железный Фантом
names-xenoborg-dataset-77 = DESTRO-NIAC
names-xenoborg-dataset-78 = Машина Индиго
names-xenoborg-dataset-79 = MARK.ILLER-1
names-xenoborg-dataset-80 = Battle Borg
@@ -7,4 +7,4 @@ ui-escape-guidebook = Руководство
ui-escape-wiki = Wiki
ui-escape-disconnect = Отключиться
ui-escape-quit = Выйти
ui-escape-feedback = Feedback
ui-escape-feedback = Обратная связь
@@ -49,7 +49,7 @@ ui-options-misc-label = Разное
ui-options-interface-label = Интерфейс
ui-options-auto-fill-highlights = Автозаполнение подсветки информацией персонажа
ui-options-auto-fill-highlights = Автоматическое заполнение списка подсветки на основе имени и должности персонажа
ui-options-highlights-color = Цвет подсветки:
ui-options-highlights-color-example = Это подсвеченный текст.
ui-options-show-held-item = Показать удерживаемый элемент рядом с курсором
@@ -108,8 +108,8 @@ ui-options-hud-layout = Тип HUD:
## Controls menu
ui-options-hold-to-attack-melee = Hold to attack (melee)
ui-options-hold-to-attack-ranged = Hold to attack (ranged)
ui-options-hold-to-attack-melee = Удерживать чтобы атаковать (ближний бой)
ui-options-hold-to-attack-ranged = Удерживать чтобы атаковать (дальний бой)
ui-options-binds-reset-all = Сбросить ВСЕ привязки
ui-options-binds-explanation = ЛКМ — изменить кнопку, ПКМ — убрать кнопку
+4 -4
View File
@@ -29,7 +29,7 @@ fax-machine-printed-paper-name = распечатанная бумага
fax-machine-sender-info =
─────────────────────────────────────
Fax sent
from: { $sender_name } [address: { $sender_addr }]
to: { $recipient_name } [address: { $recipient_addr }]
at: { $time }
Факс отправлен
от: { $sender_name } [address: { $sender_addr }]
кому: { $recipient_name } [address: { $recipient_addr }]
когда: { $time }
@@ -1,13 +1,13 @@
feedbackpopup-window-name = Request for feedback
feedbackpopup-window-name = Запрос на обратную связь
feedbackpopup-control-button-text = Open Link
feedbackpopup-control-button-text = Открыть ссылку
feedbackpopup-control-total-surveys = {$num ->
[one] { $num } entry
*[other] { $num } entries
[one] { $num } запись
*[other] { $num } записей
}
feedbackpopup-control-no-entries= No entries
feedbackpopup-control-ui-footer = Let us know what you think!
feedbackpopup-control-no-entries= Нет записей
feedbackpopup-control-ui-footer = Поделитесь своим мнением!
# Command strings
command-description-openfeedbackpopup = Opens the feedback popup window.
@@ -1 +1 @@
equip-spray-verb-press = Press
equip-spray-verb-press = Нажать
@@ -17,9 +17,9 @@ guidebook-reagent-sources-header = Источники
guidebook-reagent-sources-ent-wrapper = [bold]{ $name }[/bold] \[1\]
guidebook-reagent-sources-gas-wrapper = [bold]{ $name } (газ)[/bold] \[1\]
guidebook-reagent-effects-header = Эффекты
guidebook-reagent-effects-metabolism-stage-rate = [bold]{ $stage }[/bold] [color=gray]({ $rate } units per second)[/color]
guidebook-reagent-effects-metabolite-item = { $reagent } at a rate of { NATURALPERCENT($rate, 2) }
guidebook-reagent-effects-metabolites = Metabolizes into { $items }.
guidebook-reagent-effects-metabolism-stage-rate = [bold]{ $stage }[/bold] [color=gray]({ $rate } ед. в секунду)[/color]
guidebook-reagent-effects-metabolite-item = { $reagent } с коэффициентом { NATURALPERCENT($rate, 2) }
guidebook-reagent-effects-metabolites = Метаболизируется в { $items }.
guidebook-reagent-plant-metabolisms-header = Метаболизм растений
guidebook-reagent-plant-metabolisms-rate = [bold]Метаболизм растений[/bold] [color=gray](1 единица каждые 3 секунды базово)[/color]
guidebook-reagent-physical-description = [italic]На вид вещество { $description }.[/italic].
+7 -7
View File
@@ -8,7 +8,7 @@ job-name-captain = капитан
job-name-cargotech = грузчик
job-name-cburn = агент карантинной службы Центком
job-name-ce = старший инженер
job-name-centcommoff = CentComm Official
job-name-centcommoff = представитель Центрального Командования
job-name-chef = шеф-повар
job-name-chaplain = священник
job-name-chemist = химик
@@ -62,13 +62,13 @@ job-name-virologist = вирусолог
job-name-zookeeper = зоотехник
# antagonist jobs
job-name-ninja = Ninja
job-name-ninja = ниндзя
job-name-syndicate = синдикат
job-name-syndicate-commander = Syndicate Commander
job-name-syndicate-corpsman = Syndicate Corpsman
job-name-syndicate-operative = Syndicate Operative
job-name-pirate = Pirate
job-name-wizard = Wizard
job-name-syndicate-commander = командир оперативников
job-name-syndicate-corpsman = медик оперативников
job-name-syndicate-operative = ядерный оперативник
job-name-pirate = пират
job-name-wizard = волшебник
job-name-zombie = зомби
# Job titles
@@ -56,4 +56,4 @@ comp-kitchen-spike-victim-examine = [color=orange]{ CAPITALIZE(SUBJECT($target))
*[neuter] худым
}.[/color]
comp-kitchen-spike-deconstruct-occupied = Next, [color=red]unhook the body[/color].
comp-kitchen-spike-deconstruct-occupied = Далее, [color=red]снимите тело с крюка[/color].
@@ -1,4 +1,4 @@
bypass-lock-verb = Force open the access lock
bypass-lock-disabled-healthy = The lock needs to be damaged further before it can be forced open.
bypass-lock-disabled-wrong-tool = This lock requires { $quality } to be forced open.
bypass-lock-disabled-already-open = The lock is already open.
bypass-lock-verb = Силой открыть блокирующий замок.
bypass-lock-disabled-healthy = Необходимо ещё больше повредить замок, прежде чем его можно будет взломать.
bypass-lock-disabled-wrong-tool = Этот замок требует { $quality }, чтобы его открыть.
bypass-lock-disabled-already-open = Замок уже открыт.
@@ -82,10 +82,10 @@ signal-port-description-logic-input-b = Второй порт логическо
signal-port-name-logic-input = Вход
signal-port-description-logic-input = Входной порт, который принимает только уровни сигнала, высокий или низкий.
signal-port-description-logic-memory-input = Signal to load into the memory cell, when enabled.
signal-port-description-logic-memory-input = Сигнал для загрузки в ячейку памяти, если она включена.
signal-port-name-logic-enable = Enable
signal-port-description-logic-enable = Only loads the input signal into the memory cell when HIGH.
signal-port-name-logic-enable = Включить
signal-port-description-logic-enable = Входной сигнал загружается в ячейку памяти только, если он высок.
signal-port-name-logic-random-input = Input Signal
signal-port-description-logic-random-input = Receives any signal to trigger a random output.
signal-port-name-logic-random-input = Входной сигнал
signal-port-description-logic-random-input = Получает любой сигнал для события случайного вывода.
+31 -31
View File
@@ -92,7 +92,7 @@ marking-GauzeMothUpperArmLeft-gauze_moth_upperarm_l = Инсектоид, Бин
marking-GauzeMothUpperArmLeft = Инсектоид, Бинт, Перевязь предплечья (Левый)
marking-GauzeMothUpperLegRight-gauze_moth_upperleg_r = Инсектоид, Бинт, Перевязь бедра (Правый)
marking-GauzeMothUpperLegRight = Инсектоид, Инсектоид, Бинт, Перевязь бедра (Правый)
marking-GauzeMothUpperLegRight = Инсектоид, Бинт, Перевязь бедра (Правый)
marking-GauzeMothUpperLegLeft-gauze_moth_upperleg_l = Инсектоид, Бинт, Перевязь бедра (Левый)
marking-GauzeMothUpperLegLeft = Инсектоид, Бинт, Перевязь бедра (Левый)
@@ -103,48 +103,48 @@ marking-GauzeMothLowerLegRight = Инсектоид, Бинт, Перевязь
marking-GauzeMothLowerLegLeft-gauze_moth_lowerleg_l = Инсектоид, Бинт, Перевязь голени (Левый)
marking-GauzeMothLowerLegLeft = Инсектоид, Бинт, Перевязь голени (Левый)
marking-GauzeVulpStomach-gauze_vulp_abdomen = Vulpkanin Gauze Stomach Wrap
marking-GauzeVulpStomach = Vulpkanin Gauze Stomach Wrap
marking-GauzeVulpStomach-gauze_vulp_abdomen = Вульпканин, Бинт, Перевязь живота
marking-GauzeVulpStomach = Вульпканин, Бинт, Перевязь живота
marking-GauzeVulpBlindfold-gauze_vulp_blindfold = Vulpkanin Blindfold
marking-GauzeVulpBlindfold = Vulpkanin Blindfold
marking-GauzeVulpBlindfold-gauze_vulp_blindfold = Вульпканин, Бинт, Повязка на глаза
marking-GauzeVulpBlindfold = Вульпканин, Бинт, Повязка на глаза
marking-GauzeVulpBoxerwrapLeft-gauze_vulp_boxerwrap_l = Vulpkanin Gauze Hand Wrap (Left)
marking-GauzeVulpBoxerwrapLeft = Vulpkanin Gauze Hand Wrap (Left)
marking-GauzeVulpBoxerwrapLeft-gauze_vulp_boxerwrap_l = Вульпканин, Бинт, Перевязь кисти (Левый)
marking-GauzeVulpBoxerwrapLeft = Вульпканин, Бинт, Повязка на кисть (Левый)
marking-GauzeVulpBoxerwrapRight-gauze_vulp_boxerwrap_r = Vulpkanin Gauze Hand Wrap (Right)
marking-GauzeVulpBoxerwrapRight = Vulpkanin Gauze Hand Wrap (Right)
marking-GauzeVulpBoxerwrapRight-gauze_vulp_boxerwrap_r = Вульпканин, Бинт, Повязка на кисть (Правый)
marking-GauzeVulpBoxerwrapRight = Вульпканин, Бинт, Повязка на кисть (Правый)
marking-GauzeVulpHead-gauze_vulp_head = Vulpkanin Gauze Head Wrap
marking-GauzeVulpHead = Vulpkanin Gauze Head Wrap
marking-GauzeVulpHead-gauze_vulp_head = Вульпканин, Бинт, Повязка на голову
marking-GauzeVulpHead = Вульпканин, Бинт, Повязка на голову
marking-GauzeVulpLeftArm-gauze_vulp_leftarm = Vulpkanin Gauze Arm Wrap (Left)
marking-GauzeVulpLeftArm = Vulpkanin Gauze Arm Wrap (Left)
marking-GauzeVulpLeftArm-gauze_vulp_leftarm = Вульпканин, Бинт, Повязка на руку (Левый)
marking-GauzeVulpLeftArm = Вульпканин, Бинт, Повязка на руку (Левый)
marking-GauzeVulpLefteyePatch-gauze_vulp_lefteye_2 = Vulpkanin Gauze Eyepatch (Left)
marking-GauzeVulpLefteyePatch = Vulpkanin Gauze Eyepatch (Left)
marking-GauzeVulpLefteyePatch-gauze_vulp_lefteye_2 = Вульпканин, Бинт, Перевязь глаза (Левый)
marking-GauzeVulpLefteyePatch = Вульпканин, Бинт, Перевязь глаза (Левый)
marking-GauzeVulpLowerArmRight-gauze_vulp_lowerarm_r = Vulpkanin Gauze Wrist Wrap (Right)
marking-GauzeVulpLowerArmRight = Vulpkanin Gauze Wrist Wrap (Right)
marking-GauzeVulpLowerArmRight-gauze_vulp_lowerarm_r = Вульпканин, Бинт, Перевязь запястья (Правый)
marking-GauzeVulpLowerArmRight = Вульпканин, Бинт, Перевязь запястья (Правый)
marking-GauzeVulpLowerLegLeft-gauze_vulp_lowerleg_l = Vulpkanin Gauze Ankle Wrap (Left)
marking-GauzeVulpLowerLegLeft = Vulpkanin Gauze Ankle Wrap (Left)
marking-GauzeVulpLowerLegLeft-gauze_vulp_lowerleg_l = Вульпканин, Бинт, Перевязь голени (Левый)
marking-GauzeVulpLowerLegLeft = Вульпканин, Бинт, Перевязь голени (Левый)
marking-GauzeVulpLowerLegRight-gauze_vulp_lowerleg_r = Vulpkanin Gauze Ankle Wrap (Right)
marking-GauzeVulpLowerLegRight = Vulpkanin Gauze Ankle Wrap (Right)
marking-GauzeVulpLowerLegRight-gauze_vulp_lowerleg_r = Вульпканин, Бинт, Перевязь голени (Правый)
marking-GauzeVulpLowerLegRight = Вульпканин, Бинт, Перевязь голени (Правый)
marking-GauzeVulpRighteyePatch-gauze_vulp_righteye_2 = Vulpkanin Gauze Eyepatch (Right)
marking-GauzeVulpRighteyePatch = Vulpkanin Gauze Eyepatch (Right)
marking-GauzeVulpRighteyePatch-gauze_vulp_righteye_2 = Вульпканин, Бинт, Перевязь глаза (Правый)
marking-GauzeVulpRighteyePatch = Вульпканин, Бинт, Перевязь глаза (Правый)
marking-GauzeVulpShoulder-gauze_vulp_shoulder = Vulpkanin Gauze Shoulder Sling
marking-GauzeVulpShoulder = Vulpkanin Gauze Shoulder Sling
marking-GauzeVulpShoulder-gauze_vulp_shoulder = Вульпканин, Бинт, Перевязь плеча
marking-GauzeVulpShoulder = Вульпканин, Бинт, Перевязь плеча
marking-GauzeVulpUpperArmRight-gauze_vulp_upperarm_r = Vulpkanin Gauze Forearm Wrap (Right)
marking-GauzeVulpUpperArmRight = Vulpkanin Gauze Forearm Wrap (Right)
marking-GauzeVulpUpperArmRight-gauze_vulp_upperarm_r = Вульпканин, Бинт, Перевязь предплечья (Правый)
marking-GauzeVulpUpperArmRight = Вульпканин, Бинт, Перевязь предплечья (Правый)
marking-GauzeVulpUpperLegLeft-gauze_vulp_upperleg_l = Vulpkanin Gauze Thigh Wrap (Left)
marking-GauzeVulpUpperLegLeft = Vulpkanin Gauze Thigh Wrap (Left)
marking-GauzeVulpUpperLegLeft-gauze_vulp_upperleg_l = Вульпканин, Бинт, Перевязь бедра (Левый)
marking-GauzeVulpUpperLegLeft = Вульпканин, Бинт, Перевязь бедра (Левый)
marking-GauzeVulpUpperLegRight-gauze_vulp_upperleg_r = Vulpkanin Gauze Thigh Wrap (Right)
marking-GauzeVulpUpperLegRight = Vulpkanin Gauze Thigh Wrap (Right)
marking-GauzeVulpUpperLegRight-gauze_vulp_upperleg_r = Вульпканин, Бинт, Перевязь бедра (Правый)
marking-GauzeVulpUpperLegRight = Вульпканин, Бинт, Перевязь бедра (Правый)
@@ -120,8 +120,8 @@ marking-VulpTailVulpFade-vulp = Хвост вульпканина (Основа)
marking-VulpTailVulpFade-vulp-fade = Хвост вульпканина (Градиент)
marking-VulpTailVulpFade = Вульпканин (Градиент)
marking-VulpTailCoyote-coyote = Coyote Tail (Base)
marking-VulpTailCoyote = Vulpkanin Coyote
marking-VulpTailCoyote-coyote = Хвост койота (Основа)
marking-VulpTailCoyote = Вульпканин Койот
# Chest
@@ -1,6 +1,6 @@
metabolism-stage-respiration = Respiration
metabolism-stage-digestion = Digestion
metabolism-stage-bloodstream = Bloodstream
metabolism-stage-metabolites = Metabolites
metabolism-stage-respiration = Дыхание
metabolism-stage-digestion = Пищеварение
metabolism-stage-bloodstream = Кровоток
metabolism-stage-metabolites = Метаболизм
metabolism-stage-plant = Plant Metabolism
metabolism-stage-plant = Метаболизм растений
@@ -26,15 +26,15 @@ ingestion-verb-drink = Пить
# Edible Component
-edible-satiated = { $satiated ->
[true] { " " }You don't feel like you could { $verb } any more.
*[false] { "" }
[true] { " " }Вам кажется вы не можете больше { $verb }.
*[false] { "" }
}
edible-nom = Ням. { $flavors }
edible-nom = Ням. { $flavors }{ -edible-satiated(satiated: $satiated, verb: "есть") }
edible-nom-other = Ням.
edible-slurp = Сёрб. { $flavors }
edible-slurp = Сёрб. { $flavors }{ -edible-satiated(satiated: $satiated, verb: "пить") }
edible-slurp-other = Сёрб.
edible-swallow = Вы проглатываете { $food }
edible-swallow = Вы проглатываете { $food }.{ -edible-satiated(satiated: $satiated, verb: "проглотить") }
edible-gulp = Глоть. { $flavors }
edible-gulp-other = Глоть.
@@ -57,5 +57,5 @@ edible-verb-pill = глотать
## Force feeding
edible-force-feed = { CAPITALIZE($user) } пытается заставить вас что-то { $verb }!
edible-force-feed-success = { CAPITALIZE($user) } заставил вас что-то { $verb }! { $flavors }
edible-force-feed-success = { CAPITALIZE($user) } заставил вас что-то { $verb }! { $flavors }{ -edible-satiated(satiated: $satiated, verb: $verb) }
edible-force-feed-success-user = Вы успешно накормили { $target }
@@ -1,21 +1,21 @@
# Positive
magic-9-ball-1 = Yes
magic-9-ball-2 = YES!!!!
magic-9-ball-3 = Without a doubt
magic-9-ball-4 = It is certain
magic-9-ball-5 = Outlook good
magic-9-ball-6 = Positive
magic-9-ball-7 = Absolutely
magic-9-ball-1 = Да
magic-9-ball-2 = ДАА!!!!
magic-9-ball-3 = Без сомнения
magic-9-ball-4 = Это несомненно
magic-9-ball-5 = Перспективы хорошие
magic-9-ball-6 = Позитивно
magic-9-ball-7 = Абсолютно
# Negative
magic-9-ball-8 = No
magic-9-ball-9 = NOOO!!!!!!
magic-9-ball-10 = No no no no no no no
magic-9-ball-11 = Nuh uh
magic-9-ball-12 = Nah
magic-9-ball-13 = Negative
magic-9-ball-14 = Absolutely not
magic-9-ball-8 = Нет
magic-9-ball-9 = НЕЕЕТ!!!!!!
magic-9-ball-10 = Нет нет нет нет нет нет нет
magic-9-ball-11 = Неа
magic-9-ball-12 = Нее
magic-9-ball-13 = Отрицательно
magic-9-ball-14 = Категорически нет
# Neutral
magic-9-ball-15 = Perchance
magic-9-ball-16 = I dunno
magic-9-ball-15 = Возможно
magic-9-ball-16 = Я не знаю
@@ -203,7 +203,7 @@ loadout-group-paramedic-shoes = Парамедик, обувь
# Wildcards
loadout-group-reporter-jumpsuit = Репортёр, комбинезон
loadout-group-reporter-head = Reporter hat
loadout-group-reporter-outerclothing = Reporter vest
loadout-group-reporter-head = Репортёр, голова
loadout-group-reporter-outerclothing = Репортёр, верхняя одежда
loadout-group-psychologist-jumpsuit = Психолог, комбинезон
@@ -1,67 +1,67 @@
markings-search = Поиск
-markings-selection = { $selectable ->
[0] You have no markings remaining.
[one] You can select one more marking.
*[other] You can select { $selectable } more markings.
[0] Вы больше не можете выбрать черту.
[one] Вы можете выбрать еще одну черту.
*[other] Вы можете выбрать ещё { $selectable } черты.
}
markings-limits = { $required ->
[true] { $count ->
[-1] Select at least one marking.
[0] You cannot select any markings, but somehow, you have to? This is a bug.
[one] Select one marking.
*[other] Select at least one marking and up to { $count } markings. { -markings-selection(selectable: $selectable) }
}
*[false] { $count ->
[-1] Select any number of markings.
[0] You cannot select any markings.
[one] Select up to one marking.
*[other] Select up to { $count } markings. { -markings-selection(selectable: $selectable) }
}
[-1] Выберите хотя бы одну черту.
[0] Вы не можете выбрать ещё черту, но как-то, должны? Это баг.
[one] Выберите одну черту.
*[other] Выберите хотя бы одну черту и до { $count }. { -markings-selection(selectable: $selectable) }
}
*[false] { $count ->
[-1] Выберите любое количество черт.
[0] Вы больше не можете выбрать черту.
[one] Выберите до одной черты.
*[other] Выберите до { $count } черт. { -markings-selection(selectable: $selectable) }
}
}
markings-reorder = Reorder markings
markings-reorder = Выбранные черты
humanoid-marking-modifier-respect-limits = Respect limits
humanoid-marking-modifier-respect-group-sex = Respect group & sex restrictions
humanoid-marking-modifier-respect-limits = Учитывать ограничения
humanoid-marking-modifier-respect-group-sex = Учитывать ограничение расы и пола
humanoid-marking-modifier-base-layers = Базовый слой
humanoid-marking-modifier-enable = Включить
humanoid-marking-modifier-prototype-id = ID прототипа:
# Categories
markings-organ-Torso = Torso
markings-organ-Head = Head
markings-organ-ArmLeft = Left Arm
markings-organ-ArmRight = Right Arm
markings-organ-HandRight = Right Hand
markings-organ-HandLeft = Left Hand
markings-organ-LegLeft = Left Leg
markings-organ-LegRight = Right Leg
markings-organ-FootLeft = Left Foot
markings-organ-FootRight = Right Foot
markings-organ-Eyes = Eyes
markings-organ-Torso = Туловище
markings-organ-Head = Голова
markings-organ-ArmLeft = Левая рука
markings-organ-ArmRight = Правая рука
markings-organ-HandRight = Правая кисть
markings-organ-HandLeft = Левая кисть
markings-organ-LegLeft = Левая нога
markings-organ-LegRight = Правая нога
markings-organ-FootLeft = Левая стопа
markings-organ-FootRight = Правая стопа
markings-organ-Eyes = Глаза
markings-layer-Special = Special
markings-layer-Tail = Tail
markings-layer-Tail-Moth = Wings
markings-layer-Hair = Hair
markings-layer-FacialHair = Facial Hair
markings-layer-UndergarmentTop = Undershirt
markings-layer-UndergarmentBottom = Underpants
markings-layer-Chest = Chest
markings-layer-Head = Head
markings-layer-Snout = Snout
markings-layer-SnoutCover = Snout (Cover)
markings-layer-HeadSide = Head (Side)
markings-layer-HeadTop = Head (Top)
markings-layer-Eyes = Eyes
markings-layer-RArm = Right Arm
markings-layer-LArm = Left Arm
markings-layer-RHand = Right Hand
markings-layer-LHand = Left Hand
markings-layer-RLeg = Right Leg
markings-layer-LLeg = Left Leg
markings-layer-RFoot = Right Foot
markings-layer-LFoot = Left Foot
markings-layer-Overlay = Overlay
markings-layer-TailOverlay = Overlay
markings-layer-Special = Особое
markings-layer-Tail = Хвост
markings-layer-Tail-Moth = Крылья
markings-layer-Hair = Волосы
markings-layer-FacialHair = Лицевая растительность
markings-layer-UndergarmentTop = Нижняя рубашка
markings-layer-UndergarmentBottom = Трусы
markings-layer-Chest = Туловищие
markings-layer-Head = Голова
markings-layer-Snout = Нос
markings-layer-SnoutCover = Нос (Покрытие)
markings-layer-HeadSide = Голова (Бок)
markings-layer-HeadTop = Голова (Верх)
markings-layer-Eyes = Глаза
markings-layer-RArm = Правая рука
markings-layer-LArm = Левая рука
markings-layer-RHand = Правая кисть
markings-layer-LHand = Левая кисть
markings-layer-RLeg = Правая нога
markings-layer-LLeg = Левая нога
markings-layer-RFoot = Правая стопа
markings-layer-LFoot = Левая стопа
markings-layer-Overlay = Наложение
markings-layer-TailOverlay = Наложение
@@ -1,12 +1,12 @@
# Emergency
cargoproduct-description-emergencyinflatablewall = Three stacks of inflatable walls for when the stations metal walls don't want to hold atmosphere anymore.
cargoproduct-description-emergencyinflatablewall = Три стопки надувных стен на случай, если металлические стены станции перестанут удерживать атмосферу.
# Materials
cargoproduct-name-material-gold = gold ingots
cargoproduct-description-material-gold = 30 ingots of gold.
cargoproduct-name-material-gold = золотые слитки
cargoproduct-description-material-gold = 30 слитков золота.
cargoproduct-name-material-plasteel = plasteel sheets
cargoproduct-description-material-plasteel = 30 sheets of plasteel.
cargoproduct-name-material-plasteel = листы пластали
cargoproduct-description-material-plasteel = 30 листов пластали.
cargoproduct-name-material-silver = silver ingots
cargoproduct-description-material-silver = 30 ingots of silver.
cargoproduct-name-material-silver = серебряные слитки
cargoproduct-description-material-silver = 30 слитков серебра.
@@ -36,7 +36,7 @@ roles-antag-space-ninja-objective = Используйте свою скрытн
roles-antag-paradox-clone-name = Парадоксальный клон
roles-antag-paradox-clone-objective = Странная пространственно-временная аномалия телепортировала вас в другую реальность! Теперь вам предстоит найти своего двойника, убить и заменить его.
roles-antag-pirate-name = Pirate
roles-antag-pirate-name = Пират
roles-antag-thief-name = Вор
roles-antag-thief-objective = Пополните свою личную коллекцию имуществом Nanotrasen, не прибегая к насилию.
@@ -16,17 +16,16 @@ name-format-nukie-agent = Медик { $part0 }
name-format-nukie-commander = Командир { $part0 }
name-format-nukie-operator = Оператор { $part0 }
# "<title> <name>"
name-format-ert = { $part0 } { $part1 }
name-format-ert-leader = Сержант {$part0}
name-format-ert-specialist = Специалист {$part0}
name-format-ert-pointman = Сапёр {$part0}
name-format-ert-officer = Офицер {$part0}
name-format-ert-rifle = Стрелок {$part0}
name-format-ert-grenade = Гренадер {$part0}
name-format-ert-vanguard = Авангард {$part0}
name-format-ert-doctor = Врач {$part0}
name-format-ert-corpsman = Медик {$part0}
name-format-ert-leader = Сержант { $part0 }
name-format-ert-specialist = Специалист { $part0 }
name-format-ert-pointman = Сапёр { $part0 }
name-format-ert-officer = Офицер { $part0 }
name-format-ert-rifle = Стрелок { $part0 }
name-format-ert-grenade = Гренадер { $part0 }
name-format-ert-vanguard = Авангард { $part0 }
name-format-ert-doctor = Врач { $part0 }
name-format-ert-corpsman = Медик { $part0 }
# "<appearance> <type>"
name-format-book = { $part0 } { $part1 }
@@ -29,7 +29,7 @@ rcd-component-must-build-on-subfloor-message = Это может быть пос
rcd-component-cannot-build-on-subfloor-message = Это не может быть построено на покрытии!
rcd-component-cannot-build-on-occupied-tile-message = Здесь нельзя строить, место уже занято!
rcd-component-cannot-build-identical-tile = Эта клетка уже тут имеется!
rcd-component-cannot-build-identical-entity = That already exists there!
rcd-component-cannot-build-identical-entity = Эта постройка уже есть тут!
### Category names
@@ -16,8 +16,8 @@ reagent-desc-hemocyanin-blood = Содержит медь, а не железо,
reagent-name-ammonia-blood = анаэробная кровь
reagent-desc-ammonia-blood = Ничто другое во всей галактике не пахнет так отвратительно.
reagent-name-sulfur-blood = sulfuric blood
reagent-desc-sulfur-blood = Feels almost acidic.
reagent-name-sulfur-blood = сернистая кровь
reagent-desc-sulfur-blood = Ощущение почти кислотное.
reagent-name-zombie-blood = кровь зомби
reagent-desc-zombie-blood = Не рекомендуется употреблять в пищу. Может быть использована для создания прививки от инфекции.
@@ -151,5 +151,5 @@ reagent-desc-potassium-iodide = Снижает разрушительное во
reagent-name-haloperidol = галоперидол
reagent-desc-haloperidol = Выводит из организма большинство стимулирующих и галлюциногенных препаратов. Уменьшает наркотический эффект и дрожание. Вызывает сонливость.
reagent-name-heparin = heparin
reagent-desc-heparin = Commonly used as an anticoagulant medication. Causes blood to have difficulty forming clots. Can cause internal bleeding when overdosed.
reagent-name-heparin = гепарин
reagent-desc-heparin = Обычно используется в качестве антикоагулянта. Затрудняет образование тромбов. При передозировке может вызвать внутреннее кровотечение.
@@ -1,9 +1,9 @@
tech-disk-inserted = Вы вставляете диск, добавляя на сервер новый рецепт.
tech-disk-examine-none = Этикетка пуста.
tech-disk-examine = На этикетке имеется небольшое матричное изображение, представляющее { $result }.
tech-disk-examine = На этикетке имеется небольшое матричное изображение, представляющее [bold]{ $result }[/bold].
tech-disk-examine-more = Имеются и другие изображения, но они слишком малы, чтобы разглядеть их.
tech-disk-examine-desc = [color=lightGray]A disk for the R&D server containing a [bold]Tier { $tier } { $branch }[/bold] branch research technology.[/color]
tech-disk-examine-desc-unknown = [color=lightGray]A disk for the R&D server containing research technology.[/color]
tech-disk-examine-desc = [color=lightGray]Диск для РНД сервера содержащий технологию [bold]{ $tier } уровня[/bold] для ветки технологий [bold]{ $branch }.[/bold][/color]
tech-disk-examine-desc-unknown = [color=lightGray]Диск для РНД сервера содержащий технологию.[/color]
tech-disk-name-format = { $baseName } ({ $technology })
tech-disk-ui-name = Терминал технологических дисков
@@ -19,4 +19,4 @@ sandbox-window-toggle-suicide-button = Самоубийство
sandbox-window-show-spawns-button = Показать спавны
sandbox-window-show-bb-button = Показать BB
sandbox-window-show-npc-button = Показать NPC
sandbox-window-toggle-thermal-vision = Toggle Thermal Vision
sandbox-window-toggle-thermal-vision = Переключить тепловизор
@@ -14,7 +14,7 @@ comp-emitter-not-anchored = { $target } не закреплён!
emitter-component-current-type = Установленный тип: [color=yellow]{ $type }[/color].
emitter-component-type-set = Установить тип: { $type }
emitter-destroyed-broadcast = A powered emitter { $location } has been destroyed.
emitter-deconstructed-broadcast = A powered emitter { $location } has been deconstructed.
emitter-unlocked-broadcast = A powered emitter { $location } has been unlocked.
emitter-unpowered-broadcast = A powered emitter { $location } has lost power.
emitter-destroyed-broadcast = Включенный эмиттер { $location } был уничтожен.
emitter-deconstructed-broadcast = Включенный эмиттер { $location } был разобран.
emitter-unlocked-broadcast = Включенный эмиттер { $location } разблокирован.
emitter-unpowered-broadcast = Включенный эмиттер { $location } потерял питание.
@@ -9,8 +9,8 @@ spray-painter-ammo-after-interact-refilled = Вы заправляете кра
spray-painter-interact-no-charges = Не хватает краски.
spray-painter-interact-nothing-to-remove = Нечего удалять!
spray-painter-interact-no-color-pick = Can't find a color to pick!
spray-painter-interact-color-picked = Picked color from '{ $id }'.
spray-painter-interact-no-color-pick = Нет цвета для взятия!
spray-painter-interact-color-picked = Взят цвет из '{ $id }'.
spray-painter-on-examined-painted-message = Выглядит свежеокрашенным.
spray-painter-style-not-available = Выбранный стиль нельзя применить к этому объекту.
@@ -1,3 +1,9 @@
ent-SuitStorageExplorerSuit = { ent-SuitStorageBase }
.desc = { ent-SuitStorageBase.desc }
.suffix = Костюм Исследователя
ent-SuitStorageHardsuitClown = { ent-SuitStorageBase }
.desc = { ent-SuitStorageBase.desc }
.suffix = Клоун
ent-SuitStorageHardsuitMime = { ent-SuitStorageBase }
.desc = { ent-SuitStorageBase.desc }
.suffix = Мим
@@ -5,4 +5,6 @@ ent-ClothingDuffelPostman = вещмешок почтальона
ent-ClothingDuffelsCapitanGreen = вещмешок шерифа
.desc = Это особый вещмешок, изготавливаемый исключительно для шерифов Nanotrasen.
ent-ClothingDuffelsCapitanWhite = белый вещмешок капитана
.desc = Это особый вещмешок, изготавливаемый исключительно для элегантных капитанов Nanotrasen.
.desc = Это особый вещмешок, изготавливаемый исключительно для элегантных капитанов Nanotrasen.
ent-ClothingBackpackBig = большой вещмешок
.desc = Большая сумка для больших вещей.
@@ -14,3 +14,5 @@ ent-ClothingBeltWhiteSheath = белые сабельные ножны
.desc = Стиль, блеск, всё для лучших сабель во вселенной.
ent-ClothingBeltSheriffSheath = сабельные ножны шерифа
.desc = Практичность, прочность, сабля точно не окажется в вашей ноге.
ent-ClothingBeltMilitaryWebbingAlt = облегчённая армейская РПС
.desc = Универсальная разгрузочная система выполненния в стиле "Синий Щит".
@@ -0,0 +1,2 @@
ent-ClothingHeadsetMiningMedical = шахтёрская гарнитура медика
.desc = Гарнитура, используемая шахтёрами-медиками.
@@ -10,3 +10,5 @@ ent-ClothingHandsGlovesSheriff = перчатки шерифа
.desc = Перчатки с эргономичной формой, предназначенные для удержания револьвера.
ent-ClothingHandsGlovesConcussiveGauntlets = ударные перчатки
.desc = Кирки... для ваших рук!
ent-ClothingHandsRazorGloves = разрывные перчатки
.desc = Всё гениальное просто.
@@ -1,2 +1,4 @@
ent-ClothingHeadHelmetHostileEnv = H.E.C.K. шлем
.desc = Экспериментальный Кинетический Защитный Обшитый Шлем: шлем, специально созданный для защиты от широкого спектра опасностей Лазиса. Прошлому его владельцу этого, видимо, не хватило.
ent-ClothingHeadHelmetBlueShield = шлем офицера "Синий Щит"
.desc = Крепкий шлем , для тех кто готов подставить голову ради NanoTrasen.
@@ -18,3 +18,5 @@ ent-ClothingNeckCloakSyndicateAdmiral = плащ адмирала синдика
.desc = Красный плащ, прошитый золотой тканью.
ent-ClothingNeckWhiteMantleCaptain = белая мантия капитана
.desc = Мантия капитана, с белым пухом.
ent-ClothingNeckMantleBlueShield = мантия офицера "Синий Щит"
.desc = Мантия для защитников, рискующих своей грудью ради НаноТрейзен!
@@ -22,3 +22,5 @@ ent-ClothingOuterArmorHostileEnv = H.E.C.K. костюм
.desc = Экспериментальный Кинетический Защитный Обшитый Костюм: костюм, специально созданный для защиты от широкого спектра опасностей Лазиса. Прошлому его владельцу этого, видимо, не хватило.
ent-ClothingOuterArmorBloodCult = { ent-ClothingOuterArmorCult }
.desc = { ent-ClothingOuterArmorCult.desc }
ent-ClothingVestBlueShieldAlt = бронежилет офицера "Синий Щит"
.desc = Бронежилет типа МК V. Более эластичен. Менее громоздкий.
@@ -1,2 +1,4 @@
ent-ClothingOuterWinterBlueShield = зимнее броне-пальто офицера "Синий Щит"
.desc = Утепленное зимнее броне-пальто с минималистичным дизайном, выполненное из прочного материала.
ent-ClothingOuterWinterBlueShieldAlt = зимнее броне-пальто офицера "Синий Щит"
.desc = Утепленное зимнее броне-пальто с минималистичным дизайном, выполненное из прочного материала. Затемнённая версия.
@@ -4,6 +4,8 @@ ent-ClothingUniformJumpsuitSurgeon = комбинезон хирурга
.desc = На нем есть пятна крови..?
ent-ClothingUniformJumpsuitBlueShield = комбинезон офицера "Синий Щит"
.desc = Пурпурная униформа офицера "Синий щит" изготовлена из плотных материалов.
ent-ClothingUniformJumpsuitBlueShieldRock = комбинезон "Скала" офицера "Синий Щит"
.desc = Пурпурная униформа офицера "Синий щит" изготовлена из плотных материалов. Только для самого крепкого орешка!
ent-ClothingUniformJumpsuitAltBlueShield = водолазка офицера "Синий Щит"
.desc = Темная водолазка из плотных материалов.
ent-ClothingUniformJumpsuitPostman = комбинезон почтальона
@@ -1,5 +1,5 @@
ent-DrinkUnholyFlask = старый флакон
.desc = Покрыт слоем пыли
.desc = Покрыт слоем пыли.
ent-DrinkUnholyFlaskFull = { ent-DrinkUnholyFlask }
.desc = { ent-DrinkUnholyFlask.desc }
.suffix = Полный
@@ -3,9 +3,9 @@ ent-WiretappingTerminal = терминал прослушки
ent-WiretappingServerAlpha = сервер бодикамер
.desc = Сервер для создания защищенной сети службы безопасности.
ent-WiretappingCameraAlpha = бодикамера
.desc = Небольшая камера на закрытой частоте СБ, которая явно не смотрит за вами. Не забудьте настроить перед использованием. Для сброса названия камеры, нужно использовать мультитул на бодикамере, для отключения используйте отвертку.
.desc = Небольшая камера на закрытой частоте СБ, которая явно не смотрит за вами. Не забудьте настроить перед использованием. Для сброса названия камеры, нужно использовать мультитул на бодикамере, для отключения используйте отвертку или нож.
ent-WiretappingCameraAlphaAlt = { ent-WiretappingCameraAlpha }
.desc = { ent-WiretappingCameraAlpha.desc }
.suffix = Альт
ent-WiretappingCameraAlphaOff = выключенная бодикамера
.desc = Небольшая камера на закрытой частоте СБ, которая явно не смотрит за вами. Не забудьте включить её при помощи отвертки.
.desc = Небольшая камера на закрытой частоте СБ, которая явно не смотрит за вами. Не забудьте включить её при помощи отвертки или ножа.
@@ -0,0 +1,2 @@
ent-CirularSaw = часть пилы
.desc = Острое.

Some files were not shown because too many files have changed in this diff Show More