mirror of
https://github.com/wega-team/ss14-wega.git
synced 2026-06-09 10:06:49 +02:00
Merge branch 'gost' of https://github.com/wega-team/ss14-wega into gost
This commit is contained in:
@@ -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 = АНТАГ
|
||||
|
||||
@@ -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 = Вы можете вскрывать двери, используя альтернативное взаимодействие.
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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,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)) } стал жареным воксом!
|
||||
|
||||
@@ -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 }
|
||||
|
||||
@@ -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) } крыльями.
|
||||
|
||||
@@ -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 = ЛКМ — изменить кнопку, ПКМ — убрать кнопку
|
||||
|
||||
@@ -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].
|
||||
|
||||
@@ -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 = Получает любой сигнал для события случайного вывода.
|
||||
|
||||
@@ -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 = Мантия для защитников, рискующих своей грудью ради НаноТрейзен!
|
||||
|
||||
+2
@@ -22,3 +22,5 @@ ent-ClothingOuterArmorHostileEnv = H.E.C.K. костюм
|
||||
.desc = Экспериментальный Кинетический Защитный Обшитый Костюм: костюм, специально созданный для защиты от широкого спектра опасностей Лазиса. Прошлому его владельцу этого, видимо, не хватило.
|
||||
ent-ClothingOuterArmorBloodCult = { ent-ClothingOuterArmorCult }
|
||||
.desc = { ent-ClothingOuterArmorCult.desc }
|
||||
ent-ClothingVestBlueShieldAlt = бронежилет офицера "Синий Щит"
|
||||
.desc = Бронежилет типа МК V. Более эластичен. Менее громоздкий.
|
||||
|
||||
+2
@@ -1,2 +1,4 @@
|
||||
ent-ClothingOuterWinterBlueShield = зимнее броне-пальто офицера "Синий Щит"
|
||||
.desc = Утепленное зимнее броне-пальто с минималистичным дизайном, выполненное из прочного материала.
|
||||
ent-ClothingOuterWinterBlueShieldAlt = зимнее броне-пальто офицера "Синий Щит"
|
||||
.desc = Утепленное зимнее броне-пальто с минималистичным дизайном, выполненное из прочного материала. Затемнённая версия.
|
||||
|
||||
+2
@@ -4,6 +4,8 @@ ent-ClothingUniformJumpsuitSurgeon = комбинезон хирурга
|
||||
.desc = На нем есть пятна крови..?
|
||||
ent-ClothingUniformJumpsuitBlueShield = комбинезон офицера "Синий Щит"
|
||||
.desc = Пурпурная униформа офицера "Синий щит" изготовлена из плотных материалов.
|
||||
ent-ClothingUniformJumpsuitBlueShieldRock = комбинезон "Скала" офицера "Синий Щит"
|
||||
.desc = Пурпурная униформа офицера "Синий щит" изготовлена из плотных материалов. Только для самого крепкого орешка!
|
||||
ent-ClothingUniformJumpsuitAltBlueShield = водолазка офицера "Синий Щит"
|
||||
.desc = Темная водолазка из плотных материалов.
|
||||
ent-ClothingUniformJumpsuitPostman = комбинезон почтальона
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
ent-DrinkUnholyFlask = старый флакон
|
||||
.desc = Покрыт слоем пыли
|
||||
.desc = Покрыт слоем пыли.
|
||||
ent-DrinkUnholyFlaskFull = { ent-DrinkUnholyFlask }
|
||||
.desc = { ent-DrinkUnholyFlask.desc }
|
||||
.suffix = Полный
|
||||
|
||||
+2
-2
@@ -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 = Небольшая камера на закрытой частоте СБ, которая явно не смотрит за вами. Не забудьте включить её при помощи отвертки или ножа.
|
||||
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
ent-CirularSaw = часть пилы
|
||||
.desc = Острое.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user