This commit is contained in:
Zekins
2025-02-07 00:36:01 +03:00
parent 65833126e1
commit 7dba69b114
590 changed files with 32639 additions and 28708 deletions

View File

@@ -146,10 +146,10 @@ public sealed class HumanoidAppearanceSystem : SharedHumanoidAppearanceSystem
// We need to ensure hair before applying it or coloring can try depend on markings that can be invalid
var hairColor = _markingManager.MustMatchSkin(profile.Species, HumanoidVisualLayers.Hair, out var hairAlpha, _prototypeManager)
? profile.Appearance.SkinColor.WithAlpha(hairAlpha)
? new List<Color> { profile.Appearance.SkinColor.WithAlpha(hairAlpha) } // Corvax-Wega-Hair-Extended
: profile.Appearance.HairColor;
var hair = new Marking(profile.Appearance.HairStyleId,
new[] { hairColor });
hairColor); // Corvax-Wega-Hair-Extended
var facialHairColor = _markingManager.MustMatchSkin(profile.Species, HumanoidVisualLayers.FacialHair, out var facialHairAlpha, _prototypeManager)
? profile.Appearance.SkinColor.WithAlpha(facialHairAlpha)

View File

@@ -18,7 +18,7 @@
</ScrollContainer>
<!-- Color sliders -->
<ScrollContainer MinHeight="200" HorizontalExpand="True">
<ScrollContainer MinHeight="300" HorizontalExpand="True"> <!-- Corvax-Wega-Hair-Extended -->
<BoxContainer Name="ColorSelectorContainer" HorizontalExpand="True" />
</ScrollContainer>
</BoxContainer>

View File

@@ -291,8 +291,9 @@ namespace Content.Client.Lobby.UI
{
if (Profile is null)
return;
var hairColorList = new List<Robust.Shared.Maths.Color>(newColor.marking.MarkingColors); // Corvax-Wega-Hair-Extended
Profile = Profile.WithCharacterAppearance(
Profile.Appearance.WithHairColor(newColor.marking.MarkingColors[0]));
Profile.Appearance.WithHairColor(hairColorList));// Corvax-Wega-Hair-Extended
UpdateCMarkingsHair();
ReloadPreview();
};
@@ -1531,7 +1532,7 @@ namespace Content.Client.Lobby.UI
var hairMarking = Profile.Appearance.HairStyleId switch
{
HairStyles.DefaultHairStyle => new List<Marking>(),
_ => new() { new(Profile.Appearance.HairStyleId, new List<Color>() { Profile.Appearance.HairColor }) },
_ => new List<Marking> { new Marking(Profile.Appearance.HairStyleId, Profile.Appearance.HairColor) }, // Corvax-Wega-Hair-Extended
};
var facialHairMarking = Profile.Appearance.FacialHairStyleId switch
@@ -1571,7 +1572,7 @@ namespace Content.Client.Lobby.UI
}
else
{
hairColor = Profile.Appearance.HairColor;
hairColor = Profile.Appearance.HairColor.First(); // Corvax-Wega-Hair-Extended
}
}
}

View File

@@ -1,5 +1,7 @@
using Content.Shared.StationRecords;
using Robust.Client.UserInterface;
using Robust.Shared.Player; // Corvax-Wega-Record
using static Robust.Client.UserInterface.Controls.BaseButton; // Corvax-Wega-Record
namespace Content.Client.StationRecords;
@@ -12,6 +14,9 @@ public sealed class GeneralStationRecordConsoleBoundUserInterface : BoundUserInt
{
}
[Dependency] private readonly IEntityManager _entityManager = default!; // Corvax-Wega-Record
[Dependency] private readonly ISharedPlayerManager _playerManager = default!; // Corvax-Wega-Record
protected override void Open()
{
base.Open();
@@ -22,8 +27,33 @@ public sealed class GeneralStationRecordConsoleBoundUserInterface : BoundUserInt
_window.OnFiltersChanged += (type, filterValue) =>
SendMessage(new SetStationRecordFilter(type, filterValue));
_window.OnDeleted += id => SendMessage(new DeleteStationRecord(id));
_window.OnJobAdd += OnJobsAdd; // Corvax-Wega-Record
_window.OnJobSubtract += OnJobsSubtract; // Corvax-Wega-Record
}
// Corvax-Wega-Record-start
private void OnJobsAdd(ButtonEventArgs args)
{
if (args.Button.Parent?.Parent is not JobRow row || row.Job == null)
return;
var netEntity = _entityManager.GetNetEntity(_playerManager.LocalSession?.AttachedEntity ?? EntityUid.Invalid);
AdjustStationJobMsg msg = new(netEntity, row.Job, 1);
SendMessage(msg);
}
private void OnJobsSubtract(ButtonEventArgs args)
{
if (args.Button.Parent?.Parent is not JobRow row || row.Job == null)
return;
var netEntity = _entityManager.GetNetEntity(_playerManager.LocalSession?.AttachedEntity ?? EntityUid.Invalid);
AdjustStationJobMsg msg = new(netEntity, row.Job, -1);
SendMessage(msg);
}
// Corvax-Wega-Record-end
protected override void UpdateState(BoundUserInterfaceState state)
{
base.UpdateState(state);

View File

@@ -2,7 +2,7 @@
Title="{Loc 'general-station-record-console-window-title'}"
MinSize="750 500">
<BoxContainer Orientation="Vertical">
<BoxContainer Margin="5 5 5 10" HorizontalExpand="true" VerticalAlignment="Center">
<BoxContainer Margin="5 5 5 10" HorizontalExpand="true"> <!-- Corvax-Wega-Record -->
<OptionButton Name="StationRecordsFilterType" MinWidth="200" Margin="0 0 10 0"/>
<LineEdit Name="StationRecordsFiltersValue"
PlaceHolder="{Loc 'general-station-record-for-filter-line-placeholder'}" HorizontalExpand="True"/>
@@ -11,11 +11,20 @@
</BoxContainer>
<BoxContainer VerticalExpand="True">
<!-- Record listing -->
<BoxContainer Orientation="Vertical" Margin="5" MinWidth="250" MaxWidth="250">
<BoxContainer Orientation="Vertical" Margin="5" MinWidth="328" MaxWidth="360"> <!-- Corvax-Wega-Record -->
<Label Name="RecordListingStatus" Visible="False" />
<ScrollContainer VerticalExpand="True">
<ItemList Name="RecordListing" />
</ScrollContainer>
<!-- Corvax-Wega-Record-start -->
<ScrollContainer VerticalExpand="True">
<BoxContainer Name="JobListing"
Orientation="Vertical"
HorizontalExpand="True"
VerticalExpand="True">
</BoxContainer>
</ScrollContainer>
<!-- Corvax-Wega-Record-end -->
</BoxContainer>
<BoxContainer Orientation="Vertical" Margin="5">
<Label Name="RecordContainerStatus" Visible="False" Text="{Loc 'general-station-record-console-select-record-info'}"/>

View File

@@ -1,18 +1,25 @@
using static Robust.Client.UserInterface.Controls.BaseButton; // Corvax-Wega-Record
using Content.Shared.StationRecords;
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.CustomControls;
using Robust.Client.UserInterface.XAML;
using Robust.Shared.Prototypes; // Corvax-Wega-Record
using Content.Shared.Roles; // Corvax-Wega-Record
namespace Content.Client.StationRecords;
[GenerateTypedNameReferences]
public sealed partial class GeneralStationRecordConsoleWindow : DefaultWindow
{
private readonly IPrototypeManager _prototype = default!; // Corvax-Wega-Record
public Action<uint?>? OnKeySelected;
public Action<StationRecordFilterType, string>? OnFiltersChanged;
public Action<uint>? OnDeleted;
public event Action<ButtonEventArgs>? OnJobAdd; // Corvax-Wega-Record
public event Action<ButtonEventArgs>? OnJobSubtract; // Corvax-Wega-Record
private bool _isPopulating;
private StationRecordFilterType _currentFilterType;
@@ -21,6 +28,8 @@ public sealed partial class GeneralStationRecordConsoleWindow : DefaultWindow
{
RobustXamlLoader.Load(this);
_prototype = IoCManager.Resolve<IPrototypeManager>(); // Corvax-Wega-Record
_currentFilterType = StationRecordFilterType.Name;
foreach (var item in Enum.GetValues<StationRecordFilterType>())
@@ -87,6 +96,14 @@ public sealed partial class GeneralStationRecordConsoleWindow : DefaultWindow
StationRecordsFilterType.SelectId((int)_currentFilterType);
// Corvax-Wega-Record-start
if (state.JobList != null)
{
JobListing.Visible = true;
PopulateJobsContainer(state.JobList);
}
// Corvax-Wega-Record-end
if (state.RecordListing == null)
{
RecordListingStatus.Visible = true;
@@ -158,4 +175,26 @@ public sealed partial class GeneralStationRecordConsoleWindow : DefaultWindow
return Loc.GetString($"general-station-record-{type.ToString().ToLower()}-filter");
}
// Corvax-Wega-Record-end
private void PopulateJobsContainer(IReadOnlyDictionary<ProtoId<JobPrototype>, int?> jobList)
{
JobListing.RemoveAllChildren();
foreach (var (jobId, amount) in jobList)
{
if (!_prototype.TryIndex<JobPrototype>(jobId, out var jobPrototype))
continue;
var jobEntry = new JobRow
{
Job = jobId,
JobName = { Text = jobPrototype.LocalizedName },
JobAmount = { Text = amount?.ToString() },
};
jobEntry.DecreaseJobSlot.OnPressed += (args) => { OnJobSubtract?.Invoke(args); };
jobEntry.IncreaseJobSlot.OnPressed += (args) => { OnJobAdd?.Invoke(args); };
JobListing.AddChild(jobEntry);
}
}
// Corvax-Wega-Record-end
}

View File

@@ -0,0 +1,24 @@
<PanelContainer xmlns="https://spacestation14.io"
xmlns:gfx="clr-namespace:Robust.Client.Graphics;assembly=Robust.Client"
HorizontalExpand="True">
<BoxContainer Orientation="Horizontal"
HorizontalExpand="True">
<Label Name="JobName"
Access="Public"
MinWidth="210" />
<Button Name="DecreaseJobSlot"
Access="Public"
ToolTip=""
Text="-"
StyleClasses="OptionLeft" />
<Label Name="JobAmount"
Margin="6 0 0 0"
Access="Public"
MinWidth="22"/>
<Button Name="IncreaseJobSlot"
Access="Public"
ToolTip=""
Text="+"
StyleClasses="OptionRight" />
</BoxContainer>
</PanelContainer>

View File

@@ -0,0 +1,15 @@
using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.XAML;
namespace Content.Client.StationRecords;
[GenerateTypedNameReferences]
public sealed partial class JobRow : PanelContainer
{
public string? Job;
public JobRow()
{
RobustXamlLoader.Load(this);
}
}

View File

@@ -53,7 +53,7 @@ namespace Content.IntegrationTests.Tests.Preferences
Age = 21,
Appearance = new(
"Afro",
Color.Aqua,
new List<Color> { Color.Aqua }, // Corvax-Wega-Hair-Extended
"Shaved",
Color.Aquamarine,
Color.Azure,

View File

@@ -255,6 +255,19 @@ namespace Content.Server.Database
loadouts[role.RoleName] = loadout;
}
// Corvax-Wega-Hair-Extended-start
List<Color> hairColors;
try
{
var hairColorHexCodes = JsonSerializer.Deserialize<List<string>>(profile.HairColor);
hairColors = hairColorHexCodes?.Select(color => Color.FromHex(color.Trim())).ToList() ?? new List<Color> { Color.White };
}
catch (JsonException)
{
hairColors = new List<Color> { Color.White };
}
// Corvax-Wega-Hair-Extended-end
return new HumanoidCharacterProfile(
profile.CharacterName,
profile.FlavorText,
@@ -269,7 +282,7 @@ namespace Content.Server.Database
new HumanoidCharacterAppearance
(
profile.HairName,
Color.FromHex(profile.HairColor),
hairColors, // Corvax-Wega-Hair-Extended
profile.FacialHairName,
Color.FromHex(profile.FacialHairColor),
Color.FromHex(profile.EyeColor),
@@ -307,7 +320,7 @@ namespace Content.Server.Database
profile.Sex = humanoid.Sex.ToString();
profile.Gender = humanoid.Gender.ToString();
profile.HairName = appearance.HairStyleId;
profile.HairColor = appearance.HairColor.ToHex();
profile.HairColor = JsonSerializer.Serialize(appearance.HairColor.Select(c => c.ToHex()).ToList()); // Corvax-Wega-Hair-Extended
profile.FacialHairName = appearance.FacialHairStyleId;
profile.FacialHairColor = appearance.FacialHairColor.ToHex();
profile.EyeColor = appearance.EyeColor.ToHex();

View File

@@ -230,6 +230,9 @@ namespace Content.Server.Lathe
{
var result = Spawn(resultProto, Transform(uid).Coordinates);
_stack.TryMergeToContacts(result);
var ev = new LatheResultSpawnEvent(uid); // Corvax-Wega
RaiseLocalEvent(result, ref ev); // Corvax-Wega
}
if (comp.CurrentRecipe.ResultReagents is { } resultReagents &&

View File

@@ -284,6 +284,14 @@ public sealed class MagicMirrorSystem : SharedMagicMirrorSystem
_humanoid.RemoveMarking(component.Target.Value, category, args.Slot);
// Corvax-Wega-Skrell-start
if (category == MarkingCategories.Hair)
{
var netEntity = GetNetEntity(component.Target.Value);
RaiseLocalEvent(new HairMarkingRemovedEvent(netEntity));
}
// Corvax-Wega-Skrell-end
UpdateInterface(uid, component.Target.Value, component);
}

View File

@@ -1,22 +1,38 @@
using System.Linq;
using Content.Server.NukeOps; // Corvax-Wega-Record
using Content.Server.Popups; // Corvax-Wega-Record
using Content.Server.Station.Systems;
using Content.Server.StationRecords.Components;
using Content.Shared.Access.Components; // Corvax-Wega-Record
using Content.Shared.Inventory; // Corvax-Wega-Record
using Content.Shared.PDA; // Corvax-Wega-Record
using Content.Shared.StationRecords;
using Robust.Server.Audio; // Corvax-Wega-Record
using Robust.Server.GameObjects;
using Robust.Shared.Timing; // Corvax-Wega-Record
namespace Content.Server.StationRecords.Systems;
public sealed class GeneralStationRecordConsoleSystem : EntitySystem
{
[Dependency] private readonly AudioSystem _audio = default!;
[Dependency] private readonly UserInterfaceSystem _ui = default!;
[Dependency] private readonly StationSystem _station = default!;
[Dependency] private readonly StationRecordsSystem _stationRecords = default!;
[Dependency] private readonly StationJobsSystem _stationJobsSystem = default!; // Corvax-Wega-Record
[Dependency] private readonly PopupSystem _popup = default!; // Corvax-Wega-Record
[Dependency] private readonly InventorySystem _inventory = default!; // Corvax-Wega-Record
private readonly HashSet<string> _requiredAccessLevels = new HashSet<string> { "Captain", "HeadOfPersonnel" }; // Corvax-Wega-Record
private bool _war = false; // Corvax-Wega-Record
public override void Initialize()
{
SubscribeLocalEvent<GeneralStationRecordConsoleComponent, RecordModifiedEvent>(UpdateUserInterface);
SubscribeLocalEvent<GeneralStationRecordConsoleComponent, AfterGeneralRecordCreatedEvent>(UpdateUserInterface);
SubscribeLocalEvent<GeneralStationRecordConsoleComponent, RecordRemovedEvent>(UpdateUserInterface);
SubscribeLocalEvent<GeneralStationRecordConsoleComponent, AdjustStationJobMsg>(OnAdjustJob); // Corvax-Wega-Record
SubscribeLocalEvent<WarDeclaredEvent>(OnWarDeclared);
Subs.BuiEvents<GeneralStationRecordConsoleComponent>(GeneralStationRecordConsoleKey.Key, subs =>
{
@@ -63,6 +79,93 @@ public sealed class GeneralStationRecordConsoleSystem : EntitySystem
}
}
// Corvax-Wega-Record-start
private void OnWarDeclared(ref WarDeclaredEvent ev)
{
_war = true;
Timer.Spawn((int)(40f * 60000), () => { _war = false; });
}
private void OnAdjustJob(Entity<GeneralStationRecordConsoleComponent> ent, ref AdjustStationJobMsg msg)
{
var user = GetEntity(msg.User);
var idCard = GetIdCard(user);
if (idCard is null || !HasRequiredAccess(idCard.Value, msg.JobProto))
{
_audio.PlayPvs("/Audio/Effects/Cargo/buzz_sigh.ogg", ent);
_popup.PopupCursor(Loc.GetString("general-station-record-console-access-denied"), user);
return;
}
else if (_war)
{
_audio.PlayPvs("/Audio/Effects/Cargo/buzz_sigh.ogg", ent);
_popup.PopupCursor(Loc.GetString("general-station-record-console-error"), user);
return;
}
var stationUid = _station.GetOwningStation(ent);
if (stationUid is not EntityUid station || !_stationJobsSystem.TryGetJobSlot(station, msg.JobProto, out var currentSlots))
return;
var commandJobs = new HashSet<string>
{
"Captain", "IAA", "ChiefEngineer", "ChiefMedicalOfficer",
"HeadOfPersonnel", "HeadOfSecurity", "ResearchDirector", "Quartermaster"
};
var newSlotCount = currentSlots + msg.Amount;
if (commandJobs.Contains(msg.JobProto) && currentSlots == 1 && msg.Amount > 0)
{
_audio.PlayPvs("/Audio/Effects/Cargo/buzz_sigh.ogg", ent);
_popup.PopupCursor(Loc.GetString("general-station-record-console-job-slot-limit"), user);
return;
}
else if (msg.Amount > 0 && (currentSlots > 3 || newSlotCount > 3))
{
_audio.PlayPvs("/Audio/Effects/Cargo/buzz_sigh.ogg", ent);
_popup.PopupCursor(Loc.GetString("general-station-record-console-job-slot-limit"), user);
return;
}
_stationJobsSystem.TryAdjustJobSlot(station, msg.JobProto, msg.Amount, clamp: true);
UpdateUserInterface(ent);
}
private EntityUid? GetIdCard(EntityUid senderUid)
{
if (!_inventory.TryGetSlotEntity(senderUid, "id", out var idUid))
return null;
if (EntityManager.TryGetComponent(idUid, out PdaComponent? pda) && pda.ContainedId != null)
{
return pda.ContainedId;
}
return idUid;
}
private bool HasRequiredAccess(EntityUid idCard, string jobProtoId)
{
if (!TryComp<AccessComponent>(idCard, out var accessComp))
return false;
var cardAccess = new HashSet<string>(accessComp.Tags.Select(tag => tag.ToString()));
var centcommAccessJobs = new HashSet<string> { "Captain", "IAA" };
var highAccessJobs = new HashSet<string>
{
"ChiefEngineer", "ChiefMedicalOfficer", "HeadOfPersonnel",
"HeadOfSecurity", "ResearchDirector", "Quartermaster"
};
if (centcommAccessJobs.Contains(jobProtoId))
return cardAccess.Contains("CentralCommand");
else if (highAccessJobs.Contains(jobProtoId))
return cardAccess.Contains("Captain");
return _requiredAccessLevels.Any(cardAccess.Contains);
}
// Corvax-Wega-Record-end
private void UpdateUserInterface(Entity<GeneralStationRecordConsoleComponent> ent)
{
var (uid, console) = ent;
@@ -74,6 +177,8 @@ public sealed class GeneralStationRecordConsoleSystem : EntitySystem
return;
}
var jobList = _stationJobsSystem.GetJobs(owningStation.Value); // Corvax-Wega-Record
var listing = _stationRecords.BuildListing((owningStation.Value, stationRecords), console.Filter);
switch (listing.Count)
@@ -93,7 +198,7 @@ public sealed class GeneralStationRecordConsoleSystem : EntitySystem
var key = new StationRecordKey(id, owningStation.Value);
_stationRecords.TryGetRecord<GeneralStationRecord>(key, out var record, stationRecords);
GeneralStationRecordConsoleState newState = new(id, record, listing, console.Filter, ent.Comp.CanDeleteEntries);
GeneralStationRecordConsoleState newState = new(id, record, listing, jobList, console.Filter, ent.Comp.CanDeleteEntries); // Corvax-Wega-Record
_ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, newState);
}
}

View File

@@ -30,6 +30,7 @@ namespace Content.Server.Voting.Managers
[Dependency] private readonly IServerDbManager _dbManager = default!;
[Dependency] private readonly VoteWebhooks _voteWebhooks = default!;
private List<string> _lastPickedMaps = new(); // Corvax-Wega-Vote
private VotingSystem? _votingSystem;
private RoleSystem? _roleSystem;
private GameTicker? _gameTicker;
@@ -263,7 +264,13 @@ namespace Content.Server.Voting.Managers
private void CreateMapVote(ICommonSession? initiator)
{
var maps = _gameMapManager.CurrentlyEligibleMaps().ToDictionary(map => map, map => map.MapName);
// Corvax-Wega-Vote-start
var allMaps = _gameMapManager.CurrentlyEligibleMaps();
var maps = allMaps
.Where(map => !_lastPickedMaps.Contains(map.ID))
.ToDictionary(map => map, map => map.MapName);
// Corvax-Wega-Vote-end
var alone = _playerManager.PlayerCount == 1 && initiator != null;
var options = new VoteOptions
@@ -302,6 +309,14 @@ namespace Content.Server.Voting.Managers
Loc.GetString("ui-vote-map-win", ("winner", maps[picked])));
}
// Corvax-Wega-Vote-start
_lastPickedMaps.Add(picked.ID);
if (_lastPickedMaps.Count > 2)
{
_lastPickedMaps.RemoveAt(0);
}
// Corvax-Wega-Vote-end
_adminLogger.Add(LogType.Vote, LogImpact.Medium, $"Map vote finished: {picked.MapName}");
var ticker = _entityManager.EntitySysManager.GetEntitySystem<GameTicker>();
if (ticker.CanUpdateMap())

View File

@@ -0,0 +1,70 @@
using Content.Shared.Interaction;
using Content.Shared.Timing;
using Content.Shared.Popups;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Examine;
using Content.Shared.Paper;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Systems;
namespace Content.Server.Paper;
public sealed class TicketMachineSystem : EntitySystem
{
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly PaperSystem _paperSystem = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly SharedHandsSystem _hands = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly UseDelaySystem _useDelay = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<TicketMachineComponent, InteractHandEvent>(OnTicket);
SubscribeLocalEvent<TicketMachineComponent, ExaminedEvent>(OnExamined);
}
private void OnTicket(EntityUid machine, TicketMachineComponent component, InteractHandEvent args)
{
var user = args.User;
if (!TryComp<UseDelayComponent>(machine, out var useDelay) || _useDelay.IsDelayed((machine, useDelay)))
{
_popup.PopupEntity(Loc.GetString("paper-component-ticket-failed"), user, user, PopupType.Small);
return;
}
var number = (component.Queue + 1).ToString();
var ticket = _entityManager.SpawnEntity(component.TicketProto, Transform(machine).Coordinates);
if (!TryComp<PaperComponent>(ticket, out var paper) || !TryAddTicket((ticket, paper), machine, number))
return;
component.Queue++;
_hands.TryPickupAnyHand(user, ticket);
_useDelay.TryResetDelay((machine, useDelay));
}
private bool TryAddTicket(Entity<PaperComponent> ticket, EntityUid machine, string number)
{
StampDisplayInfo info = new StampDisplayInfo
{
StampedName = number,
StampedColor = Color.FromHex("#333333"),
};
if (_paperSystem.TryStamp(ticket, info, "paper_stamp-hop"))
{
_paperSystem.SetContent(ticket, Loc.GetString("paper-component-ticket", ("queue", number)));
_audio.PlayPvs(new SoundPathSpecifier("/Audio/Machines/short_print_and_rip.ogg"), machine, AudioParams.Default.WithLoop(false));
}
return true;
}
private void OnExamined(Entity<TicketMachineComponent> entity, ref ExaminedEvent args)
{
if (args.IsInDetailsRange)
args.AddMarkup($"{Loc.GetString("paper-component-ticket-count", ("number", (entity.Comp.Queue + 1).ToString()))}{Environment.NewLine}");
}
}

View File

@@ -0,0 +1,12 @@
namespace Content.Server.PrinterInsert
{
[RegisterComponent]
public sealed partial class PrinterComponent : Component
{
[DataField]
public string UserName = string.Empty;
[DataField]
public string UserJob = string.Empty;
}
}

View File

@@ -0,0 +1,77 @@
using Content.Server.Station.Systems;
using Content.Shared.Paper;
using Content.Shared.Lathe;
using Robust.Shared.Timing;
using Content.Shared.GameTicking;
using Content.Shared.UserInterface;
using Content.Server.Roles.Jobs;
using Content.Shared.Mind.Components;
using Content.Server.Mind;
namespace Content.Server.PrinterInsert;
public sealed class PrinterInsertSystem : EntitySystem
{
[Dependency] private readonly StationSystem _stationSystem = default!;
[Dependency] private readonly PaperSystem _paperSystem = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly SharedGameTicker _gameTicker = default!;
[Dependency] private readonly JobSystem _jobs = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly MindSystem _minds = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<PaperComponent, LatheResultSpawnEvent>(PaperSpawn);
SubscribeLocalEvent<PrinterComponent, BeforeActivatableUIOpenEvent>(UpdateUserInterfaceState);
}
private void UpdateUserInterfaceState(Entity<PrinterComponent> uid, ref BeforeActivatableUIOpenEvent args)
{
if (!_entityManager.TryGetComponent<MindContainerComponent>(args.User, out var _))
{
uid.Comp.UserName = string.Empty;
uid.Comp.UserJob = string.Empty;
return;
}
uid.Comp.UserName = Name(args.User);
if (_minds.TryGetMind(args.User, out var mindId, out var _))
{
if (_jobs.MindTryGetJobName(mindId, out var jobName))
{
uid.Comp.UserJob = jobName;
return;
}
}
uid.Comp.UserJob = string.Empty;
}
private void PaperSpawn(Entity<PaperComponent> entity, ref LatheResultSpawnEvent args)
{
var station = _stationSystem.GetOwningStation(entity);
if (station != null)
{
var data = DateTime.Today.ToShortDateString().Replace(Loc.GetString("printer-paper-year"), Loc.GetString("printer-paper-replace-year"));
var time = _gameTiming.CurTime.Subtract(_gameTicker.RoundStartTimeSpan).ToString("hh\\:mm\\:ss");
_paperSystem.SetContent(entity, entity.Comp.Content.Replace(Loc.GetString("printer-paper-replace-station"), Name(station.Value)));
_paperSystem.SetContent(entity, entity.Comp.Content.Replace(Loc.GetString("printer-paper-replace-date"),
Loc.GetString("printer-paper-date", ("time", time), ("data", data))));
if (_entityManager.TryGetComponent<PrinterComponent>(args.Lathe, out var comp))
{
_paperSystem.SetContent(entity, entity.Comp.Content.Replace(Loc.GetString("printer-paper-replace-name"),
Loc.GetString("printer-paper-name", ("name", comp.UserName))));
_paperSystem.SetContent(entity, entity.Comp.Content.Replace(Loc.GetString("printer-paper-replace-job"), Loc.GetString("printer-paper-job",
("job", comp.UserJob))));
}
}
}
}

View File

@@ -0,0 +1,57 @@
using Content.Shared.Inventory.Events;
using Content.Shared.Skrell;
using Content.Shared.Inventory;
using Content.Shared.Humanoid;
using Content.Shared.Humanoid.Markings;
using Content.Shared.MagicMirror;
using Robust.Shared.Timing;
namespace Content.Server.Skrell;
public sealed class SkrellSystem : EntitySystem
{
[Dependency] private readonly InventorySystem _inventorySystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<SkrellComponent, DidEquipEvent>(OnEquip);
SubscribeLocalEvent<HairMarkingRemovedEvent>(OnRemoveSlot);
}
private void OnEquip(Entity<SkrellComponent> entity, ref DidEquipEvent args)
{
var slot = args.Slot;
if (slot == "pocket3")
{
var item = args.Equipee;
if (CheckCondition(entity))
{
Timer.Spawn(1, () => _inventorySystem.TryUnequip(item, slot, force: true));
}
}
}
private bool CheckCondition(EntityUid uid)
{
if (TryComp<HumanoidAppearanceComponent>(uid, out var humanoid))
{
if (!humanoid.MarkingSet.TryGetCategory(MarkingCategories.Hair, out var hairMarkings) || hairMarkings.Count == 0)
return true;
}
return false;
}
private void OnRemoveSlot(HairMarkingRemovedEvent args)
{
var target = GetEntity(args.Target);
if (!HasComp<SkrellComponent>(target))
return;
if (_inventorySystem.TryGetSlotEntity(target, "pocket3", out _))
{
_inventorySystem.TryUnequip(target, "pocket3");
}
}
}

View File

@@ -15,7 +15,7 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance,
public string HairStyleId { get; set; } = HairStyles.DefaultHairStyle;
[DataField]
public Color HairColor { get; set; } = Color.Black;
public List<Color> HairColor { get; set; } = new() { Color.Black }; // Corvax-Wega-Hair-Extended
[DataField("facialHair")]
public string FacialHairStyleId { get; set; } = HairStyles.DefaultFacialHairStyle;
@@ -33,7 +33,7 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance,
public List<Marking> Markings { get; set; } = new();
public HumanoidCharacterAppearance(string hairStyleId,
Color hairColor,
List<Color> hairColor, // Corvax-Wega-Hair-Extended
string facialHairStyleId,
Color facialHairColor,
Color eyeColor,
@@ -41,7 +41,7 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance,
List<Marking> markings)
{
HairStyleId = hairStyleId;
HairColor = ClampColor(hairColor);
HairColor = hairColor.Select(ClampColor).ToList(); // Corvax-Wega-Hair-Extended
FacialHairStyleId = facialHairStyleId;
FacialHairColor = ClampColor(facialHairColor);
EyeColor = ClampColor(eyeColor);
@@ -60,7 +60,7 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance,
return new(newName, HairColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Markings);
}
public HumanoidCharacterAppearance WithHairColor(Color newColor)
public HumanoidCharacterAppearance WithHairColor(List<Color> newColor) // Corvax-Wega-Hair-Extended
{
return new(HairStyleId, newColor, FacialHairStyleId, FacialHairColor, EyeColor, SkinColor, Markings);
}
@@ -104,7 +104,7 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance,
return new(
HairStyles.DefaultHairStyle,
Color.Black,
new List<Color> { Color.Black }, // Corvax-Wega-Hair-Extended
HairStyles.DefaultFacialHairStyle,
Color.Black,
Color.Black,
@@ -166,7 +166,7 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance,
break;
}
return new HumanoidCharacterAppearance(newHairStyle, newHairColor, newFacialHairStyle, newHairColor, newEyeColor, newSkinColor, new ());
return new HumanoidCharacterAppearance(newHairStyle, new List<Color> { newHairColor }, newFacialHairStyle, newHairColor, newEyeColor, newSkinColor, new ()); // Corvax-Wega-Hair-Extended
float RandomizeColor(float channel)
{
@@ -184,7 +184,7 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance,
var hairStyleId = appearance.HairStyleId;
var facialHairStyleId = appearance.FacialHairStyleId;
var hairColor = ClampColor(appearance.HairColor);
var hairColor = appearance.HairColor.Select(ClampColor).ToList(); // Corvax-Wega-Hair-Extended
var facialHairColor = ClampColor(appearance.FacialHairColor);
var eyeColor = ClampColor(appearance.EyeColor);
@@ -250,7 +250,7 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance,
{
if (maybeOther is not HumanoidCharacterAppearance other) return false;
if (HairStyleId != other.HairStyleId) return false;
if (!HairColor.Equals(other.HairColor)) return false;
if (!HairColor.SequenceEqual(other.HairColor)) return false; // Corvax-Wega-Hair-Extended
if (FacialHairStyleId != other.FacialHairStyleId) return false;
if (!FacialHairColor.Equals(other.FacialHairColor)) return false;
if (!EyeColor.Equals(other.EyeColor)) return false;

View File

@@ -383,7 +383,8 @@ public abstract class SharedHumanoidAppearanceSystem : EntitySystem
// Hair/facial hair - this may eventually be deprecated.
// We need to ensure hair before applying it or coloring can try depend on markings that can be invalid
var hairColor = _markingManager.MustMatchSkin(profile.Species, HumanoidVisualLayers.Hair, out var hairAlpha, _proto)
? profile.Appearance.SkinColor.WithAlpha(hairAlpha) : profile.Appearance.HairColor;
? new List<Color> { profile.Appearance.SkinColor.WithAlpha(hairAlpha) } // Corvax-Wega-Hair-Extended
: profile.Appearance.HairColor; // Corvax-Wega-Hair-Extended
var facialHairColor = _markingManager.MustMatchSkin(profile.Species, HumanoidVisualLayers.FacialHair, out var facialHairAlpha, _proto)
? profile.Appearance.SkinColor.WithAlpha(facialHairAlpha) : profile.Appearance.FacialHairColor;

View File

@@ -97,4 +97,20 @@ namespace Content.Shared.Lathe
/// </summary>
[ByRefEvent]
public readonly record struct LatheStartPrintingEvent(LatheRecipePrototype Recipe);
// Corvax-Wega-start
/// <summary>
/// Event is called when the lathe creates something.
/// </summary>
[ByRefEvent]
public sealed class LatheResultSpawnEvent : EntityEventArgs
{
public readonly EntityUid Lathe;
public LatheResultSpawnEvent(EntityUid lathe)
{
Lathe = lathe;
}
}
// Corvax-Wega-end
}

View File

@@ -224,3 +224,16 @@ public sealed partial class MagicMirrorChangeColorDoAfterEvent : DoAfterEvent
public int Slot;
public List<Color> Colors = new List<Color>();
}
// Corvax-Wega-Skrell-start
[Serializable, NetSerializable]
public sealed partial class HairMarkingRemovedEvent : EntityEventArgs
{
public NetEntity Target { get; }
public HairMarkingRemovedEvent(NetEntity target)
{
Target = target;
}
}
// Corvax-Wega-Skrell-end

View File

@@ -6,6 +6,7 @@ using Content.Shared.Examine;
using Content.Shared.Interaction;
using Content.Shared.Popups;
using Content.Shared.Tag;
using Content.Shared.Verbs; // Corvax-Wega-Bureaucracy-end
using Robust.Shared.Player;
using Robust.Shared.Audio.Systems;
using static Content.Shared.Paper.PaperComponent;
@@ -35,6 +36,7 @@ public sealed class PaperSystem : EntitySystem
SubscribeLocalEvent<PaperComponent, PaperInputTextMessage>(OnInputTextMessage);
SubscribeLocalEvent<ActivateOnPaperOpenedComponent, PaperWriteEvent>(OnPaperWrite);
SubscribeLocalEvent<PenComponent, GetVerbsEvent<AlternativeVerb>>(AddSignVerb); // Corvax-Wega-Bureaucracy
}
private void OnMapInit(Entity<PaperComponent> entity, ref MapInitEvent args)
@@ -103,7 +105,14 @@ public sealed class PaperSystem : EntitySystem
var editable = entity.Comp.StampedBy.Count == 0 || _tagSystem.HasTag(args.Used, "WriteIgnoreStamps");
if (_tagSystem.HasTag(args.Used, "Write"))
{
if (editable)
// Corvax-Wega-Bureaucracy-edit
if (TryComp<PenComponent>(args.Used, out var pen) && pen.Signature)
{
TrySign(entity, args.User, entity.Comp);
args.Handled = true;
return;
}
else if (editable)
{
if (entity.Comp.EditingDisabled)
{
@@ -182,6 +191,50 @@ public sealed class PaperSystem : EntitySystem
_interaction.UseInHandInteraction(args.User, entity);
}
// Corvax-Wega-Bureaucracy-start
private void AddSignVerb(EntityUid uid, PenComponent pen, ref GetVerbsEvent<AlternativeVerb> args)
{
if (!args.CanAccess || !args.CanInteract || !args.Using.HasValue
|| !_tagSystem.HasTag(args.Using.Value, "Write"))
return;
AlternativeVerb verb = new()
{
Text = pen.Signature
? Loc.GetString("paper-component-verb-sign-write")
: Loc.GetString("paper-component-verb-sign-signature"),
Act = () =>
{
pen.Signature = !pen.Signature;
},
};
args.Verbs.Add(verb);
}
public bool TrySign(Entity<PaperComponent> entity, EntityUid signer, PaperComponent paperComp)
{
StampDisplayInfo info = new StampDisplayInfo
{
StampedName = Name(signer),
StampedColor = Color.FromHex("#333333"),
};
if (TryStamp(entity, info, "paper_stamp-generic"))
{
var stampPaperOtherMessage = Loc.GetString("paper-component-action-signed-other", ("user", signer), ("target", entity));
_popupSystem.PopupEntity(stampPaperOtherMessage, signer, Filter.PvsExcept(signer, entityManager: EntityManager), true);
var stampPaperSelfMessage = Loc.GetString("paper-component-action-signed-self", ("target", entity));
_popupSystem.PopupClient(stampPaperSelfMessage, signer, signer);
_audio.PlayPredicted(paperComp.Sound, entity, signer);
_adminLogger.Add(LogType.Verb, LogImpact.Low, $"{ToPrettyString(signer):player} has signed {ToPrettyString(entity):paper}.");
UpdateUserInterface(entity);
}
return true;
}
// Corvax-Wega-Bureaucracy-end
/// <summary>
/// Accepts the name and state to be stamped onto the paper, returns true if successful.
/// </summary>

View File

@@ -1,3 +1,5 @@
using Robust.Shared.Prototypes; // Corvax-Wega-Record
using Content.Shared.Roles; // Corvax-Wega-Record
using Robust.Shared.Serialization;
namespace Content.Shared.StationRecords;
@@ -36,12 +38,14 @@ public sealed class GeneralStationRecordConsoleState : BoundUserInterfaceState
public readonly uint? SelectedKey;
public readonly GeneralStationRecord? Record;
public readonly Dictionary<uint, string>? RecordListing;
public IReadOnlyDictionary<ProtoId<JobPrototype>, int?>? JobList { get; } // Corvax-Wega-Record
public readonly StationRecordsFilter? Filter;
public readonly bool CanDeleteEntries;
public GeneralStationRecordConsoleState(uint? key,
GeneralStationRecord? record,
Dictionary<uint, string>? recordListing,
IReadOnlyDictionary<ProtoId<JobPrototype>, int?>? jobList, // Corvax-Wega-Record
StationRecordsFilter? newFilter,
bool canDeleteEntries)
{
@@ -49,10 +53,11 @@ public sealed class GeneralStationRecordConsoleState : BoundUserInterfaceState
Record = record;
RecordListing = recordListing;
Filter = newFilter;
JobList = jobList; // Corvax-Wega-Record
CanDeleteEntries = canDeleteEntries;
}
public GeneralStationRecordConsoleState() : this(null, null, null, null, false)
public GeneralStationRecordConsoleState() : this(null, null, null, null, null, false) // Corvax-Wega-Record
{
}

View File

@@ -42,3 +42,19 @@ public enum StationRecordFilterType : byte
Prints,
DNA,
}
// Corvax-Wega-Record-start
[Serializable, NetSerializable]
public sealed class AdjustStationJobMsg : BoundUserInterfaceMessage
{
public NetEntity User { get; }
public string JobProto { get; }
public int Amount { get; }
public AdjustStationJobMsg(NetEntity user, string jobProto, int amount)
{
User = user;
JobProto = jobProto;
Amount = amount;
}
}
// Corvax-Wega-Record-end

View File

@@ -0,0 +1,8 @@
namespace Content.Shared.Paper;
[RegisterComponent]
public sealed partial class PenComponent : Component
{
[DataField("signature")]
public bool Signature = false;
}

View File

@@ -0,0 +1,10 @@
namespace Content.Shared.Paper;
[RegisterComponent]
public sealed partial class TicketMachineComponent : Component
{
[ViewVariables(VVAccess.ReadOnly), DataField]
public int Queue = 0;
public string TicketProto = "PaperTicket";
}

View File

@@ -0,0 +1,6 @@
namespace Content.Shared.Skrell;
[RegisterComponent]
public sealed partial class SkrellComponent : Component
{
}

Binary file not shown.

View File

@@ -57,5 +57,5 @@ arrivals_map = "/Maps/Corvax/Misc/corvax_terminal.yml"
auto_call_time = 150
[vote]
preset_enabled = true
preset_enabled = false
map_enabled = true

View File

@@ -0,0 +1,203 @@
# Gradient
marking-HumanHairAfroGradient = Афро (Градиент)
marking-HumanHairAfro2Gradient = Афро 2 (Градиент)
marking-HumanHairBigafroGradient = Афро (Большая, Градиент)
marking-HumanHairAntennaGradient = Ахоге (Градиент)
marking-HumanHairBaldingGradient = Лысеющий (Градиент)
marking-HumanHairBedheadGradient = Небрежная (Градиент)
marking-HumanHairBedheadv2Gradient = Небрежная 2 (Градиент)
marking-HumanHairBedheadv3Gradient = Небрежная 3 (Градиент)
marking-HumanHairLongBedheadGradient = Небрежная (Длинная, Градиент)
marking-HumanHairLongBedhead2Gradient = Небрежная (Длинная 2, Градиент)
marking-HumanHairFloorlengthBedheadGradient = Небрежная (До пола, Градиент)
marking-HumanHairBeehiveGradient = Улей (Градиент)
marking-HumanHairBeehivev2Gradient = Улей 2 (Градиент)
marking-HumanHairBobGradient = Каре (Градиент)
marking-HumanHairBob2Gradient = Каре 2 (Градиент)
marking-HumanHairBobcutGradient = Каре 3 (Градиент)
marking-HumanHairBob4Gradient = Каре 4 (Градиент)
marking-HumanHairBob5Gradient = Каре 5 (Градиент)
marking-HumanHairBobcurlGradient = Каре (Завитки, Градиент)
marking-HumanHairBoddickerGradient = Боддикер (Градиент)
marking-HumanHairBowlcutGradient = Горшок (Градиент)
marking-HumanHairBowlcut2Gradient = Горшок 2 (Градиент)
marking-HumanHairBraidGradient = Плетение (До пола, Градиент)
marking-HumanHairBraidedGradient = Плетение (Градиент)
marking-HumanHairBraidfrontGradient = Плетение (Спереди, Градиент)
marking-HumanHairBraid2Gradient = Плетение (Высокое, Градиент)
marking-HumanHairHbraidGradient = Плетение (Низкое, Градиент)
marking-HumanHairShortbraidGradient = Плетение (Короткое, Градиент)
marking-HumanHairBraidtailGradient = Плетёный хвостик (Градиент)
marking-HumanHairBunGradient = Пучок (Градиент)
marking-HumanHairBunhead2Gradient = Пучок 2 (Градиент)
marking-HumanHairBun3Gradient = Пучок 3 (Градиент)
marking-HumanHairLargebunGradient = Пучок (Большой, Градиент)
marking-HumanHairManbunGradient = Пучок (Мужской, Градиент)
marking-HumanHairTightbunGradient = Пучок (Затянутый, Градиент)
marking-HumanHairBusinessGradient = Деловая (Градиент)
marking-HumanHairBusiness2Gradient = Деловая 2 (Градиент)
marking-HumanHairBusiness3Gradient = Деловая 3 (Градиент)
marking-HumanHairBusiness4Gradient = Деловая 4 (Градиент)
marking-HumanHairBuzzcutGradient = Баз кат (Градиент)
marking-HumanHairCiaGradient = ЦРУ (Градиент)
marking-HumanHairClassicAfroGradient = Классическая Афро (Градиент)
marking-HumanHairClassicBigAfroGradient = Классическая Афро (Большая, Градиент)
marking-HumanHairClassicBusinessGradient = Классическая Деловая (Градиент)
marking-HumanHairClassicCiaGradient = Классическая ЦРУ (Градиент)
marking-HumanHairClassicCornrows2Gradient = Классическая Корнроу 2 (Градиент)
marking-HumanHairClassicFloorlengthBedheadGradient = Классическая Небрежная (До пола, Градиент)
marking-HumanHairClassicLong2Gradient = Классическая Длинные волосы 2 (Градиент)
marking-HumanHairClassicLong3Gradient = Классическая Длинные волосы 3 (Градиент)
marking-HumanHairClassicModernGradient = Классическая Современная (Градиент)
marking-HumanHairClassicMulderGradient = Классическая Малдер (Градиент)
marking-HumanHairClassicWispGradient = Классическая Пряди (Градиент)
marking-HumanHairCoffeehouseGradient = Кофейная (Градиент)
marking-HumanHairComboverGradient = Зачёс (Назад, Градиент)
marking-HumanHairCornrowsGradient = Корнроу (Градиент)
marking-HumanHairCornrows2Gradient = Корнроу 2 (Градиент)
marking-HumanHairCornrowbunGradient = Корнроу (Пучок, Градиент)
marking-HumanHairCornrowbraidGradient = Корнроу (Косичка, Градиент)
marking-HumanHairCornrowtailGradient = Корнроу (Хвостик, Градиент)
marking-HumanHairSpookyLongGradient = Длинная (Зловещая, Градиент)
marking-HumanHairCrewcutGradient = Крю-кат (Градиент)
marking-HumanHairCrewcut2Gradient = Крю-кат 2 (Градиент)
marking-HumanHairCurlsGradient = Завитки (Градиент)
marking-HumanHairCGradient = Подстриженная (Градиент)
marking-HumanHairDandypompadourGradient = Денди Помпадур (Градиент)
marking-HumanHairDevilockGradient = Дьявольский замок (Градиент)
marking-HumanHairDoublebunGradient = Двойной пучок (Градиент)
marking-HumanHairDoublebunLongGradient = Двойной пучок (Длинные, Градиент)
marking-HumanHairDreadsGradient = Дреды (Градиент)
marking-HumanHairDrillruruGradient = Дрели (Градиент)
marking-HumanHairDrillhairextendedGradient = Дрели (Распущенные, Градиент)
marking-HumanHairEmoGradient = Эмо (Градиент)
marking-HumanHairEmofringeGradient = Эмо (Чёлка, Градиент)
marking-HumanHairNofadeGradient = Фэйд (Отсутствует, Градиент)
marking-HumanHairHighfadeGradient = Фэйд (Высокий, Градиент)
marking-HumanHairMedfadeGradient = Фэйд (Средний, Градиент)
marking-HumanHairLowfadeGradient = Фэйд (Низкий, Градиент)
marking-HumanHairBaldfadeGradient = Фэйд (Лысый, Градиент)
marking-HumanHairFeatherGradient = Перья (Градиент)
marking-HumanHairFatherGradient = Отец (Градиент)
marking-HumanHairSargeantGradient = Флэттоп (Градиент)
marking-HumanHairFlairGradient = Флейр (Градиент)
marking-HumanHairBigflattopGradient = Флэттоп (Большой, Градиент)
marking-HumanHairFlowGradient = Флоу (Градиент)
marking-HumanHairGelledGradient = Уложенная (Градиент)
marking-HumanHairGentleGradient = Аккуратная (Градиент)
marking-HumanHairHalfbangGradient = Полурасчесанная (Градиент)
marking-HumanHairHalfbang2Gradient = Полурасчесанная 2 (Градиент)
marking-HumanHairHalfshavedGradient = Полувыбритая (Градиент)
marking-HumanHairHedgehogGradient = Ёжик (Градиент)
marking-HumanHairHimecutGradient = Химэ (Градиент)
marking-HumanHairHimecut2Gradient = Химэ 2 (Градиент)
marking-HumanHairShorthimeGradient = Химэ (Короткая, Градиент)
marking-HumanHairHimeupGradient = Химэ (Укладка, Градиент)
marking-HumanHairHitopGradient = Хайтоп (Градиент)
marking-HumanHairJadeGradient = Джейд (Градиент)
marking-HumanHairJensenGradient = Дженсен (Градиент)
marking-HumanHairJoestarGradient = Джостар (Градиент)
marking-HumanHairKeanuGradient = Киану (Градиент)
marking-HumanHairLongBowGradient = Длинная с бантом (Градиент)
marking-HumanHairKusanagiGradient = Кусанаги (Градиент)
marking-HumanHairLongGradient = Длинная 1 (Градиент)
marking-HumanHairLong2Gradient = Длинная 2 (Градиент)
marking-HumanHairLong3Gradient = Длинная 3 (Градиент)
marking-HumanHairLongWithBundlesGradient = Длинная с пучками (Градиент)
marking-HumanHairLongovereyeGradient = Длинная (Через глаз, Градиент)
marking-HumanHairLbangsGradient = Длинная (Чёлка, Градиент)
marking-HumanHairLongemoGradient = Длинная (Эмо, Градиент)
marking-HumanHairLongfringeGradient = Длинная чёлка (Градиент)
marking-HumanHairLongsidepartGradient = Длинная сайд-парт (Градиент)
marking-HumanHairMegaeyebrowsGradient = Широкие брови (Градиент)
marking-HumanHairMessyGradient = Растрёпанная (Градиент)
marking-HumanHairModernGradient = Современная (Градиент)
marking-HumanHairMohawkGradient = Могавк (Градиент)
marking-HumanHairNitoriGradient = Нитори (Градиент)
marking-HumanHairReversemohawkGradient = Могавк (Обратный, Градиент)
marking-HumanHairUnshavenMohawkGradient = Могавк (Небритый, Градиент)
marking-HumanHairMulderGradient = Малдер (Градиент)
marking-HumanHairOdangoGradient = Оданго (Градиент)
marking-HumanHairOmbreGradient = Омбре (Градиент)
marking-HumanHairOneshoulderGradient = На одно плечо (Градиент)
marking-HumanHairShortovereyeGradient = Через глаз (Градиент)
marking-HumanHairOxtonGradient = Окстон (Градиент)
marking-HumanHairPartedGradient = С пробором (Градиент)
marking-HumanHairPartGradient = С пробором (Сбоку, Градиент)
marking-HumanHairKagamiGradient = Хвостики (Градиент)
marking-HumanHairPigtailsGradient = Хвостики 2 (Градиент)
marking-HumanHairPigtails2Gradient = Хвостики 3 (Градиент)
marking-HumanHairPixieGradient = Пикси (Градиент)
marking-HumanHairPompadourGradient = Помпадур (Градиент)
marking-HumanHairBigpompadourGradient = Помпадур (Большая, Градиент)
marking-HumanHairPonytailGradient = Хвостик (Градиент)
marking-HumanHairPonytail2Gradient = Хвостик 2 (Градиент)
marking-HumanHairPonytail3Gradient = Хвостик 3 (Градиент)
marking-HumanHairPonytail4Gradient = Хвостик 4 (Градиент)
marking-HumanHairPonytail5Gradient = Хвостик 5 (Градиент)
marking-HumanHairPonytail6Gradient = Хвостик 6 (Градиент)
marking-HumanHairPonytail7Gradient = Хвостик 7 (Градиент)
marking-HumanHairHighponytailGradient = Хвостик (Высокий, Градиент)
marking-HumanHairStailGradient = Хвостик (Короткий, Градиент)
marking-HumanHairLongstraightponytailGradient = Хвостик (Длинный, Градиент)
marking-HumanHairCountryGradient = Хвостик (Деревенский, Градиент)
marking-HumanHairFringetailGradient = Хвостик (Чёлка, Градиент)
marking-HumanHairSidetailGradient = Хвостик (Сбоку, Градиент)
marking-HumanHairSidetail2Gradient = Хвостик (Сбоку, Градиент) 2
marking-HumanHairSidetail3Gradient = Хвостик (Сбоку, Градиент) 3
marking-HumanHairSidetail4Gradient = Хвостик (Сбоку, Градиент) 4
marking-HumanHairSpikyponytailGradient = Хвостик (Шипастый, Градиент)
marking-HumanHairPulatoGradient = Пулато (Градиент)
marking-HumanHairPoofyGradient = Пышная (Градиент)
marking-HumanHairQuiffGradient = Квифф (Градиент)
marking-HumanHairShapedGradient = Фигурная (Градиент)
marking-HumanHairRoninGradient = Ронин (Градиент)
marking-HumanHairShavedGradient = Бритая (Градиент)
marking-HumanHairShavedpartGradient = Бритая часть (Градиент)
marking-HumanHairShortbangsGradient = Каре (Чёлка, Градиент)
marking-HumanHairAGradient = Короткая (Градиент)
marking-HumanHairShorthair2Gradient = Короткая 2 (Градиент)
marking-HumanHairShorthair3Gradient = Короткая 3 (Градиент)
marking-HumanHairDGradient = Короткая 5 (Градиент)
marking-HumanHairEGradient = Короткая 6 (Градиент)
marking-HumanHairFGradient = Короткая 7 (Градиент)
marking-HumanHairShorthairgGradient = Короткая 8 (Градиент)
marking-HumanHair80sGradient = Короткая (80-ые, Градиент)
marking-HumanHairRosaGradient = Короткая (Роза, Градиент)
marking-HumanHairBGradient = Волосы до плеч (Градиент)
marking-HumanHairShoulderLengthOverEyeGradient = До плеч через глаз (Градиент)
marking-HumanHairSidecutGradient = Боковой вырез (Градиент)
marking-HumanHairSkinheadGradient = Бритоголовый (Градиент)
marking-HumanHairProtagonistGradient = Слегка длинная (Градиент)
marking-HumanHairSpikeyGradient = Колючая (Градиент)
marking-HumanHairSpikyGradient = Колючая 2 (Градиент)
marking-HumanHairSpiky2Gradient = Колючая 3 (Градиент)
marking-HumanHairSweptGradient = Зачёс назад (Градиент)
marking-HumanHairSwept2Gradient = Зачёс назад 2 (Градиент)
marking-HumanHairTailedGradient = Хвостатая (Градиент)
marking-HumanHairThinningGradient = Редеющая (Градиент)
marking-HumanHairThinningfrontGradient = Редеющая (Спереди, Градиент)
marking-HumanHairThinningrearGradient = Редеющая (Сзади, Градиент)
marking-HumanHairTopknotGradient = Пучок на макушке (Градиент)
marking-HumanHairTressshoulderGradient = Коса на плече (Градиент)
marking-HumanHairTrimmedGradient = Под машинку (Градиент)
marking-HumanHairTrimflatGradient = Под машинку (Плоская, Градиент)
marking-HumanHairTwintailGradient = Два хвостика (Градиент)
marking-HumanHairTwoStrandsGradient = Две пряди (Градиент)
marking-HumanHairUndercutGradient = Андеркат (Градиент)
marking-HumanHairUndercutleftGradient = Андеркат (Слева, Градиент)
marking-HumanHairUndercutrightGradient = Андеркат (Справа, Градиент)
marking-HumanHairUnevenGradient = Неровная (Градиент)
marking-HumanHairUnkeptGradient = Неухоженная (Градиент)
marking-HumanHairUpdoGradient = Высокая (Градиент)
marking-HumanHairVlongGradient = Очень длинная (Градиент)
marking-HumanHairLongestGradient = Очень длинная 2 (Градиент)
marking-HumanHairLongest2Gradient = Очень длинная (Через гла, Градиентз)
marking-HumanHairVeryshortovereyealternateGradient = Очень короткая (Через глаз альт, Градиент)
marking-HumanHairVlongfringeGradient = Очень короткая (Чёлка, Градиент)
marking-HumanHairVolajuGradient = Воладзю (Градиент)
marking-HumanHairWispGradient = Пряди (Градиент)
# Mixed Color
marking-HumanHairNitoriTwo = Нитори (Градиент, Кончики)
marking-HumanHairNitoriHarley = Харли (Градиент)

View File

@@ -0,0 +1,33 @@
# Basic
marking-HairSkrellExcited = Возбужденный (Эмоциональный)
marking-HairSkrellInsulate = Изолирующий (Практичный)
marking-HairSkrellLong = Длинный (Классический)
marking-HairSkrellLongbun = Длинный пучок (Аккуратный)
marking-HairSkrellLongtuux = Длинный туукс (Традиционный)
marking-HairSkrellLoose = Распущенный (Свободный стиль)
marking-HairSkrellLowbun = Низкий пучок (Элегантный)
marking-HairSkrellMidbun = Средний пучок (Универсальный)
marking-HairSkrellMullet = Маллет (Ретро)
marking-HairSkrellReserve = Резервный (Строгий)
marking-HairSkrellShort = Короткий (Простой)
marking-HairSkrellShortbun = Короткий пучок (Минималистичный)
marking-HairSkrellTuux = Туукс (Культурный)
marking-HairSkrellVeryLong = Очень длинный (Эпический)
marking-HairSkrellVeryShort = Очень короткий (Сдержанный)
# Gradient
marking-HairSkrellExcitedGradient = Возбужденный (Эмоциональный, Градиент)
marking-HairSkrellInsulateGradient = Изолирующий (Практичный, Градиент)
marking-HairSkrellLongGradient = Длинный (Классический, Градиент)
marking-HairSkrellLongbunGradient = Длинный пучок (Аккуратный, Градиент)
marking-HairSkrellLongtuuxGradient = Длинный туукс (Традиционный, Градиент)
marking-HairSkrellLooseGradient = Распущенный (Свободный стиль, Градиент)
marking-HairSkrellLowbunGradient = Низкий пучок (Элегантный, Градиент)
marking-HairSkrellMidbunGradient = Средний пучок (Универсальный, Градиент)
marking-HairSkrellMulletGradient = Маллет (Ретро, Градиент)
marking-HairSkrellReserveGradient = Резервный (Строгий, Градиент)
marking-HairSkrellShortGradient = Короткий (Простой, Градиент)
marking-HairSkrellShortbunGradient = Короткий пучок (Минималистичный, Градиент)
marking-HairSkrellTuuxGradient = Туукс (Культурный, Градиент)
marking-HairSkrellVeryLongGradient = Очень длинный (Эпический, Градиент)
marking-HairSkrellVeryShortGradient = Очень короткий (Сдержанный, Градиент)

View File

@@ -1,2 +1,48 @@
flavor-complex-bacchus = как стена кирпичей...
flavor-complex-unholy = как ком пепла
flavor-complex-aperol = как травянистая сладость
flavor-complex-jagermeister = как горечь охоты
flavor-complex-schnaps = как пшеничная мята
flavor-complex-sambuka = как крутящийся огонь
flavor-complex-sheridan = как сливочный кофе
flavor-complex-eggnog = как яйцо
flavor-complex-black-blood = как кровавая тьма
flavor-complex-light-storm = как морское волнение
flavor-complex-cream-heaven = как кофейное облако
flavor-complex-hirosima = как алкогольный пепел
flavor-complex-nagasaki = как радиоактивный пепел
flavor-complex-chocolate-sheridan = как алкогольное мокко
flavor-complex-panama = как судоходный канал
flavor-complex-pegu-club = как судоходный канал
flavor-complex-star-amnesia = как диско-амнезия
flavor-complex-silverhand = как угасание суперзвезды
flavor-complex-french-75 = как артиллерийская бомбардировка
flavor-complex-milk-plus = как потеря человечности
flavor-complex-aviation = как дуновение ветра
flavor-complex-fizz = как шипение
flavor-complex-brandy-crusta = как солено-сладкое
flavor-complex-aperolspritz = как отдельность вкуса
flavor-complex-tuxedo = как строгость стиля
flavor-complex-horse-neck = как лошадиная сила
flavor-complex-cuban-sunset = как тоталитаризм
flavor-complex-sake-bomb = как пиво и саке
flavor-complex-woo-woo = как ву-ву
flavor-complex-mulled-wine = как горячее вино
flavor-complex-white-bear = как идеологическая война
flavor-complex-vampiro = как истощение
flavor-complex-queen-mary = как вишневое пиво
flavor-complex-inabox = как скрытность
flavor-complex-beer-berry-royal = как пивная ягода
flavor-complex-sazerac = как горький виски
flavor-complex-monako = как фруктовый джин
flavor-complex-slime-drink = как желеобразный алкоголь
flavor-complex-innocent-erp = как потеря флирта
flavor-complex-blue-lagoon = как пляжный отдых
flavor-complex-green-fairy = как вера в фей
flavor-complex-home-lebovsky = как халат
flavor-complex-top-billing = как рекламное пространство
flavor-complex-trans-siberian-express = как ужасная инфраструктура
flavor-complex-sun = как солнечное тепло
flavor-complex-tick-tack = как тиканье часов
flavor-complex-uragan-shot = как порывы ветра
flavor-complex-new-yorker = как крах

View File

@@ -0,0 +1 @@
job-description-barber = Вы должны обеспечить станцию неповторимым стилем.

View File

@@ -0,0 +1,3 @@
job-name-barber = барбер
JobBarber = барбер

View File

@@ -1,15 +0,0 @@
marking-HairSkrellExcited = Возбужденный (Эмоциональный)
marking-HairSkrellInsulate = Изолирующий (Практичный)
marking-HairSkrellLong = Длинный (Классический)
marking-HairSkrellLongbun = Длинный пучок (Аккуратный)
marking-HairSkrellLongtuux = Длинный туукс (Традиционный)
marking-HairSkrellLoose = Распущенный (Свободный стиль)
marking-HairSkrellLowbun = Низкий пучок (Элегантный)
marking-HairSkrellMidbun = Средний пучок (Универсальный)
marking-HairSkrellMullet = Маллет (Ретро)
marking-HairSkrellReserve = Резервный (Строгий)
marking-HairSkrellShort = Короткий (Простой)
marking-HairSkrellShortbun = Короткий пучок (Минималистичный)
marking-HairSkrellTuux = Туукс (Культурный)
marking-HairSkrellVeryLong = Очень длинный (Эпический)
marking-HairSkrellVeryShort = Очень короткий (Сдержанный)

View File

@@ -0,0 +1,9 @@
paper-component-verb-sign-signature = Подписать
paper-component-verb-sign-write = Писать
paper-component-action-signed-self = Вы подписываете { $target }.
paper-component-action-signed-other = { CAPITALIZE(THE($user)) } подписывает { $target }.
paper-component-ticket =
Тикет №{ $queue }
Ожидайте своей очереди
paper-component-ticket-count = Следующий тикет будет №{ $number }
paper-component-ticket-failed = Подождите чтобы распечатать следующий тикет

View File

@@ -12,6 +12,8 @@ loadout-group-captain-socks = Капитан, носки
loadout-group-hop-top = Глава персонала, верхнее белье
loadout-group-hop-bottom = Глава персонала, нижнее белье
loadout-group-hop-socks = Глава персонала, носки
# Medical
loadout-group-barber-outerclothing = Барбер, верхняя одежда
# Cargo
loadout-group-quartermaster-top = Квартирмейстер, верхнее белье
loadout-group-quartermaster-bottom = Квартирмейстер, нижнее белье
@@ -28,6 +30,10 @@ loadout-group-research-director-socks = Научный руководитель,
loadout-group-head-of-security-top = Глава службы безопасности, верхнее белье
loadout-group-head-of-security-bottom = Глава службы безопасности, нижнее белье
loadout-group-head-of-security-socks = Глава службы безопасности, носки
loadout-group-brigmedic-head = Бригмедик, голова
loadout-group-brigmedic-jumpsuit = Бригмедик, комбинезон
loadout-group-brigmedic-backpack = Бригмедик, рюкзак
loadout-group-brigmedic-outerclothing = Бригмедик, верхняя одежда
# Medical
loadout-group-chief-medical-officer-top = Главный врач, верхнее белье
loadout-group-chief-medical-officer-bottom = Главный врач, нижнее белье

View File

@@ -0,0 +1,10 @@
printer-paper-year = 302
printer-paper-date = Время от начала смены и дата: { $time } { $data }
printer-paper-name = Составитель документа: { $name }
printer-paper-job = Должность составителя: { $job }
printer-paper-replace-year = 202
printer-paper-replace-station = Station XX-000
printer-paper-replace-date = Время от начала смены и дата:
printer-paper-replace-name = Составитель документа:
printer-paper-replace-job = Должность составителя:

View File

@@ -1,2 +1,97 @@
reagent-name-bacchus-blessing = благословение бахуса
reagent-name-aperol = апероль
reagent-name-jagermeister = джагермейстер
reagent-name-schnaps = шнапс
reagent-name-sambuka = самбука
reagent-name-bitter = горький
reagent-name-sheridan = шеридан
reagent-name-black-blood = чёрная кровь
reagent-name-light-storm = лёгкий Шторм
reagent-name-cream-heaven = кремовый рай
reagent-name-hirosima = хиросима
reagent-name-nagasaki = нагасаки
reagent-name-chocolate-sheridan = шоколад шеридана
reagent-name-panama = панама
reagent-name-pegu-club = клуб пегу
reagent-name-star-amnesia = звездная амнезия
reagent-name-silverhand = серебряная рука
reagent-name-french-75 = французский 75
reagent-name-milk-plus = молоко +
reagent-name-light = свет
reagent-name-aviation = авиация
reagent-name-fizz = физз
reagent-name-brandy-crusta = brandy crusta
reagent-name-aperolspritz = апероль спритц
reagent-name-tuxedo = смокинг
reagent-name-horse-neck = лошадиная шея
reagent-name-cuban-sunset = кубинский закат
reagent-name-sake-bomb = бомба саке
reagent-name-woo-woo = ву-ву
reagent-name-mulled-wine = глинтвейн
reagent-name-white-bear = белый медведь
reagent-name-vampiro = вампиро
reagent-name-queen-mary = королева мария
reagent-name-inabox = коробка
reagent-name-beer-berry-royal = пиво королевской ягоды
reagent-name-sazerac = сазерак
reagent-name-monako = монако
reagent-name-slime-drink = слаймовый напиток
reagent-name-innocent-erp = невинный ужас
reagent-name-blue-lagoon = голубая лагуна
reagent-name-green-fairy = зеленая фея
reagent-name-home-lebovsky = дом лебовски
reagent-name-top-billing = лучший счет
reagent-name-trans-siberian-express = транс-сибирский экспресс
reagent-name-sun = солнце
reagent-name-tick-tack = тик-ток
reagent-name-uragan-shot = урагановый выстрел
reagent-name-new-yorker = нью-йоркер
reagent-desc-bacchus-blessing = Вас предупредили.
reagent-desc-aperol = Ох-ох-ох... Похоже, это засада для печени.
reagent-desc-jagermeister = Охотник на пьяниц пришел из глубин космоса, и похоже, он нашел жертву.
reagent-desc-schnaps = От такого шнапса не грех начать йодль.
reagent-desc-sambuka = Улетая в космос, многие думали, что схватили судьбу за хвост.
reagent-desc-bitter = Не перепутай размеры этикеток, потому что я ничего менять не буду.
reagent-desc-sheridan = Охладите, наливайте под углом 45 градусов, не смешивайте, наслаждайтесь.
reagent-desc-black-blood = Нужно пить быстрее, пока оно не начало сворачиваться.
reagent-desc-light-storm = Даже вдали от океана можно почувствовать, как это сотрясает.
reagent-desc-cream-heaven = Это сочетание сливок и кофе — настоящее творение небес.
reagent-desc-hirosima = Мои руки по локоть в крови... Ой, подождите, это алкоголь.
reagent-desc-nagasaki = Сначала никто не знал, что будет дальше. Опьянение было ужасным. Нет сомнений, что это самое сильное опьянение, которое человек когда-либо видел.
reagent-desc-chocolate-sheridan = В ситуациях, когда очень хочется поднять настроение и выпить.
reagent-desc-panama = Это соединит вашу кровь и алкоголь, как Катунский шлюз.
reagent-desc-pegu-club = Это как группа джентльменов, колонизирующих ваш язык.
reagent-desc-star-amnesia = Это просто бутылка медицинского спирта?
reagent-desc-silverhand = Проснись, самурай. У нас есть станция, которую нужно сжечь.
reagent-desc-french-75 = Заряди печень, прицелься, стреляй!
reagent-desc-milk-plus = Когда человек не может выбирать, он перестает быть человеком.
reagent-desc-light = Любимый напиток Ниан и Дионеи, кто-то говорит, что это мини-термоядерная реакция, но только тсс...
reagent-desc-aviation = Трудно делать коктейли, когда над твоим домом летает дирижабль.
reagent-desc-fizz = Это как жить с дикой кошкой.
reagent-desc-brandy-crusta = Сахарная корочка может быть совсем не сладкой.
reagent-desc-aperolspritz = Многие считают его отдельным алкоголем, но это больше похоже на коня в шахматах.
reagent-desc-tuxedo = Я могу пообещать тебе колумбийский галстук.
reagent-desc-horse-neck = Будь осторожен с подковами своей лошади.
reagent-desc-cuban-sunset = Новый день, новый переворот.
reagent-desc-sake-bomb = Ковровая бомбардировка твоего бамбукового печени.
reagent-desc-woo-woo = И какой ребенок придумал это название? Да, я вижу, вопрос решен.
reagent-desc-mulled-wine = Просто горячее вино со специями, но такое приятное.
reagent-desc-white-bear = Два исторических врага в одном круге.
reagent-desc-vampiro = Не имеет ничего общего с вампирами, кроме цвета.
reagent-desc-queen-mary = Мэри очистили от крови, и оказалось, что она тоже красная.
reagent-desc-inabox = Это... Просто коробка?
reagent-desc-beer-berry-royal = Почему-то они продолжают плавать вверх и вниз.
reagent-desc-sazerac = Лучшие фармацевты — это бармены.
reagent-desc-monako = Можно подумать, что на рынке больше фруктов.
reagent-desc-slime-drink = Не волнуйтесь, это просто желе. И слизь давно мертва.
reagent-desc-innocent-erp = Помните, что Большой Брат видит всё.
reagent-desc-blue-lagoon = Что может быть лучше, чем отдых на пляже с хорошим напитком?
reagent-desc-green-fairy = Какое-то ненормальное зеленое.
reagent-desc-home-lebovsky = Позвольте мне кое-что объяснить. Эм, я не Домашний Лебовски. Вы — Домашний Лебовски. Я — Чувак.
reagent-desc-top-billing = На видном месте наш топовый биллинг!
reagent-desc-trans-siberian-express = От Владивостока до белой горячки за день.
reagent-desc-sun = Красное солнце над раем!
reagent-desc-tick-tack = Тик-так, тик-так Бзззз...
reagent-desc-uragan-shot = Это ураган? Нет, это ураганный алкоголь.
reagent-desc-new-yorker = Будь осторожен с биржей, иначе будет "Черный вторник".

View File

@@ -0,0 +1,17 @@
reagent-name-cafe-mocha = моккачино
reagent-name-chocolate-milk = шоколадное молоко
reagent-name-chocolate-pudding = шоколадный пудинг
reagent-name-gibb-floats = всплывший гибб
reagent-name-milkshake = милкшейк
reagent-name-triple-citrus = тройной цитрус
reagent-name-mate-de-coca = мате де кока
reagent-name-true-milkshake = милкшейк
reagent-desc-cafe-mocha = Изысканный кофейный напиток с шоколадом и молоком, идеальный для любителей сладкого.
reagent-desc-chocolate-milk = Прохладное молоко с насыщенным шоколадным вкусом, любимый напиток детей и взрослых.
reagent-desc-chocolate-pudding = Густой и нежный шоколадный десерт, который тает во рту.
reagent-desc-gibb-floats = Газированный напиток с шариком мороженого, создающий ощущение праздника.
reagent-desc-milkshake = Взбитый молочный коктейль, идеальный для освежения.
reagent-desc-triple-citrus = Освежающий микс из лимона, лайма и апельсина, который бодрит и утоляет жажду.
reagent-desc-mate-de-coca = Тонизирующий напиток на основе листьев коки.
reagent-desc-true-milkshake = Настоящий милкшейк с насыщенным вкусом, который не оставит вас равнодушным.

View File

@@ -0,0 +1,6 @@
seeds-rose-name = розы
seeds-rose-display-name = роза
seeds-sunflower-name = подсолнух
seeds-sunflower-display-name = подсолнух
seeds-clownflower-name = цветок клоуна
seeds-clownflower-display-name = цветок клоуна

View File

@@ -97,3 +97,4 @@ reagent-physical-desc-slimy = склизкое
reagent-physical-desc-neural = нейронное
# Corvax-Wega
reagent-physical-desc-cum = солоноватое
reagent-physical-desc-bitter = горькое

View File

@@ -0,0 +1,2 @@
ent-CrateHydroponicsSoil = ящик почвы
.desc = Ящик с обычной почвой.

View File

@@ -1,4 +1,4 @@
ent-ClothingUnderBottomGrey = серые трусы
ent-ClothingUnderBottomGrey = серые бойшортсы
.desc = Единственные и незаменимые трусы, которые всегда с вами.
ent-ClothingUnderBottomBabydoll = ночнушка
.desc = Эта изысканная прозрачная ночнушка, выполненная из легкого и нежного материала, подчеркивает фигуру и создает романтичный образ. Её тонкие бретельки и элегантные детали придают сексуальность и утонченность, идеально подходят для уютных вечеров.
@@ -16,43 +16,43 @@ ent-ClothingUnderBottomThong = стринги
.desc = Сексуальное и минималистичное нижнее белье, подчеркивающее формы и обеспечивающее максимальную свободу движений. Изготовленные из мягкого материала, они идеально подходят для ношения под облегающей одеждой, добавляя уверенности и романтики в каждый день.
ent-ClothingUnderBottomDeath = трусы
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomFAssblastusa = трусы
ent-ClothingUnderBottomFAssblastusa = трусы в полоску
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomFBriefs = брифы
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomFCommie = трусы
ent-ClothingUnderBottomFCommie = трусы в полоску
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomFishnet = ажурные трусы
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomFKinky = трусы
ent-ClothingUnderBottomFKinky = трусы с бретельками
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomHearts = трусы с сердечками
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomLace = трусы
ent-ClothingUnderBottomLace = полупрозрачные трусы
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomLatex = латексные трусы
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomLizard = трусы
ent-ClothingUnderBottomLizard = трусы бразилиана
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomMAssblastusa = трусы
ent-ClothingUnderBottomMAssblastusa = полосатые боксёры
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomMBriefs = трусы
ent-ClothingUnderBottomMBriefs = классические трусы
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomMCommie = трусы
ent-ClothingUnderBottomMCommie = полосатые боксёры
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomMKinky = трусы
ent-ClothingUnderBottomMKinky = трусы с разрезом
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomNekoBlack = трусы
ent-ClothingUnderBottomNekoBlack = трусы-неко чёрные
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomNekoWhite = трусы
ent-ClothingUnderBottomNekoWhite = трусы-неко белые
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomPanties = трусы
ent-ClothingUnderBottomPanties = трусы бойшортсы
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomSport = спортивные трусы
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomStripe = полосатые трусы
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomStrippedPanties = трусы
ent-ClothingUnderBottomStrippedPanties = трусы тонг
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomTacticool = трусы
.desc = { ent-ClothingUnderBottomBoxers.desc }
@@ -64,35 +64,35 @@ ent-ClothingUnderBottomSwimStrapless = купательный костюм
.desc = { ent-ClothingUnderBottomSwimHalter.desc }
ent-ClothingUnderBottomSwimStripe = купательный костюм
.desc = { ent-ClothingUnderBottomSwimHalter.desc }
ent-ClothingUnderBottomFBso = трусы синего щита
ent-ClothingUnderBottomFBso = боксёры синего щита
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomMBso = трусы синего щита
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomFCaptain = трусы капитана
ent-ClothingUnderBottomFCaptain = боксёры капитана
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomMCaptain = трусы капитана
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomFCe = трусы старшего инженера
ent-ClothingUnderBottomFCe = боксёры старшего инженера
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomMCe = трусы старшего инженера
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomFCmo = трусы главного врача
ent-ClothingUnderBottomFCmo = боксёры главного врача
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomMCmo = трусы главного врача
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomFHop = трусы главы персонала
ent-ClothingUnderBottomFHop = боксёры главы персонала
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomMHop = трусы главы персонала
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomFHos = трусы главы службы безопасности
ent-ClothingUnderBottomFHos = боксёры главы службы безопасности
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomMHos = трусы главы службы безопасности
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomFQm = трусы квартирмейстра
ent-ClothingUnderBottomFQm = боксёры квартирмейстра
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomMQm = трусы квартирмейстра
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomFRd = трусы научного руководителя
ent-ClothingUnderBottomFRd = боксёры научного руководителя
.desc = { ent-ClothingUnderBottomBoxers.desc }
ent-ClothingUnderBottomMRd = трусы научного руководителя
.desc = { ent-ClothingUnderBottomBoxers.desc }

View File

@@ -1,91 +1,91 @@
ent-ClothingUnderSocksBeeKnee = носки с пчёлами
ent-ClothingUnderSocksBeeKnee = носочки с пчёлами
.desc = { ent-ClothingUnderSocksBee.desc }
ent-ClothingUnderSocksBlackNorm = черные носки
ent-ClothingUnderSocksBlackNorm = чёрные носки
.desc = Идеальное сочетание комфорта и стиля, способные добавить изюминку даже в самый обычный образ. Мягкий материал гарантирует уют в любое время года, а универсальный цвет делает их подходящими для любых случаев!
ent-ClothingUnderSocksBlackShort = черные носки
ent-ClothingUnderSocksBlackShort = чёрные следки
.desc = { ent-ClothingUnderSocksBlackNorm.desc }
.suffix = Короткие
ent-ClothingUnderSocksBlackKnee = черные носки
ent-ClothingUnderSocksBlackKnee = чёрные носки
.desc = { ent-ClothingUnderSocksBlackNorm.desc }
.suffix = По колено
ent-ClothingUnderSocksBlackThigh = черные носки
ent-ClothingUnderSocksBlackThigh = чёрные чулки
.desc = { ent-ClothingUnderSocksBlackNorm.desc }
.suffix = По бедро
ent-ClothingUnderSocksWhiteNorm = белые носки
.desc = Эти классические белые носки являются незаменимым элементом гардероба! Простота их дизайна позволяет сочетать их с любым образом, а комфортный материал обеспечивает удобство на каждый день.
ent-ClothingUnderSocksWhiteShort = белые носки
ent-ClothingUnderSocksWhiteShort = белые следки
.desc = { ent-ClothingUnderSocksWhiteNorm.desc }
.suffix = Короткие
ent-ClothingUnderSocksWhiteKnee = белые носки
ent-ClothingUnderSocksWhiteKnee = белые гольфы
.desc = { ent-ClothingUnderSocksWhiteNorm.desc }
.suffix = По колено
ent-ClothingUnderSocksWhiteThigh = белые носки
ent-ClothingUnderSocksWhiteThigh = белые чулки
.desc = { ent-ClothingUnderSocksWhiteNorm.desc }
.suffix = По бедро
ent-ClothingUnderSocksBlue = синие носки
ent-ClothingUnderSocksBlue = полосатые синие носки
.desc = Отличный способ добавить яркости в ваш гардероб! Их стильные синие полоски не только привлекают внимание, но и делают каждую пару уникальной, позволяя вам выразить свою индивидуальность.
ent-ClothingUnderSocksCyan = бирюзовые носки
ent-ClothingUnderSocksCyan = полосатые бирюзовые носки
.desc = Эти белые носки с бирюзовыми полосками добавят яркости в ваш повседневный стиль. Комфортный материал и свежий цвет создают идеальное сочетание, позволяя вам оставаться модным даже в самых обычных нарядах!
ent-ClothingUnderSocksGreen = зеленые носки
ent-ClothingUnderSocksGreen = полосатые зеленые носки
.desc = Эти белые носки с зелеными полосками добавят яркости и свежести вашему гардеробу! Удобный материал и стильный дизайн делают их идеальным аксессуаром для повседневной носки, позволяя вам выделяться даже в самых простых образах.
ent-ClothingUnderSocksOrange = оранжевые носки
ent-ClothingUnderSocksOrange = полосатые оранжевые носки
.desc = Эти белые носки с оранжевыми полосками добавят яркий акцент в ваш гардероб! Удобный материал и игривый дизайн делают их отличным выбором для повседневной носки, позволяя вам выделяться и поднимать настроение в любое время дня.
ent-ClothingUnderSocksPink = розовые носки
ent-ClothingUnderSocksPink = полосатые розовые носки
.desc = Эти белые носки с розовыми полосками добавят нежности и игривости в ваш образ! Комфортный материал и стильный дизайн делают их идеальным аксессуаром для повседневной носки, позволяя вам выразить свою индивидуальность с яркими акцентами.
ent-ClothingUnderSocksPurple = фиолетовые носки
ent-ClothingUnderSocksPurple = полосатые фиолетовые носки
.desc = Эти белые носки с фиолетовыми полосками станут стильным акцентом в вашем гардеробе! Их яркие полоски добавляют нотку оригинальности и свежести, делая каждый ваш шаг более уверенным и выразительным.
ent-ClothingUnderSocksYellow = желтые носки
ent-ClothingUnderSocksYellow = полосатые желтые носки
.desc = Эти белые носки с желтыми полосами добавят яркий акцент в ваш гардероб! Их стильный дизайн и комфортный материал делают их идеальным выбором для повседневной носки, позволяя вам выразить свою индивидуальность с ноткой веселья.
ent-ClothingUnderSocksRainbowKnee = радужные носки
ent-ClothingUnderSocksRainbowKnee = радужные гольфы
.desc = Эти носки, исполненные в ярких цветах радуги, добавят веселья и жизнерадостности в любой образ! Идеальны для смелых личностей, они позволяют выразить свою индивидуальность и поднять настроение даже в самый серый день.
.suffix = По колено
ent-ClothingUnderSocksRainbowThigh = радужные носки
ent-ClothingUnderSocksRainbowThigh = радужные чулки
.desc = { ent-ClothingUnderSocksRainbowKnee.desc }
.suffix = По бедро
ent-ClothingUnderSocksCommieKnee = носки
ent-ClothingUnderSocksCommieKnee = полосатые носки
.desc = Эти носки с параллельными красными и желтыми линиями добавят яркости и энергии в ваш гардероб! Их игривый дизайн делает их идеальным аксессуаром для тех, кто хочет выделиться и подчеркнуть свою индивидуальность в повседневной носке.
.suffix = По колено
ent-ClothingUnderSocksCommieThigh = носки
ent-ClothingUnderSocksCommieThigh = полосатые чулки
.desc = { ent-ClothingUnderSocksCommieKnee.desc }
.suffix = По бедро
ent-ClothingUnderSocksAssblastusaKnee = носки
ent-ClothingUnderSocksAssblastusaKnee = красно-бело-синие носки
.desc = Эти носки с чередующимися перпендикулярными линиями в красном, белом и синем цветах создают динамичный и стильный образ! Их оригинальный дизайн делает их отличным аксессуаром, позволяя вам выразить свою индивидуальность и добавить нотку игривости в повседневную носку.
.suffix = По колено
ent-ClothingUnderSocksAssblastusaThigh = носки
ent-ClothingUnderSocksAssblastusaThigh = красно-бело-синие чулки
.desc = { ent-ClothingUnderSocksAssblastusaKnee.desc }
.suffix = По бедро
ent-ClothingUnderSocksStripedKnee = полосатые носки
ent-ClothingUnderSocksStripedKnee = чёрно-белые носки
.desc = Эти носки в серо-черной гамме с перпендикулярными линиями добавляют современный акцент к любому образу! Их стильный и лаконичный дизайн идеально подходит для повседневной носки, сочетая комфорт и элегантность в каждом шаге.
.suffix = По колено
ent-ClothingUnderSocksStripedThigh = полосатые носки
ent-ClothingUnderSocksStripedThigh = чулки чёрно-белые
.desc = { ent-ClothingUnderSocksStripedKnee.desc }
.suffix = По бедро
ent-ClothingUnderSocksThinKnee = тонкие носки
ent-ClothingUnderSocksThinKnee = капроновые носки
.desc = Эти тонкие прозрачные носки являются идеальным выбором для легкости и утонченности! Они прекрасно дополнят как повседневный, так и вечерний образ, придавая вашим ногам элегантный вид, сохраняя при этом комфорт и свободу движений.
.suffix = По колено
ent-ClothingUnderSocksThinThigh = тонкие носки
ent-ClothingUnderSocksThinThigh = капроновые чулки
.desc = { ent-ClothingUnderSocksThinKnee.desc }
.suffix = По бедро
ent-ClothingUnderSocksFishnet = ажурные колготки
ent-ClothingUnderSocksFishnet = сетчатые колготки
.desc = Эти колготки в стильной клетке с ажурной сеткой добавят вашему образу утонченности и оригинальности! Легкий и дышащий материал делает их идеальными для создания эффектного наряда, подчеркивая вашу индивидуальность и стиль.
.suffix = Полные
ent-ClothingUnderSocksFishnetKnee = ажурные колготки
ent-ClothingUnderSocksFishnetKnee = сетчатые носки
.desc = { ent-ClothingUnderSocksFishnet.desc }
.suffix = По колено
ent-ClothingUnderSocksFishnetThigh = ажурные колготки
ent-ClothingUnderSocksFishnetThigh = чулки-сетка
.desc = { ent-ClothingUnderSocksFishnet.desc }
.suffix = По бедро
ent-ClothingUnderSocksPantyhose = колготки
ent-ClothingUnderSocksPantyhose = капроновые колготки
.desc = Эти универсальные колготки станут незаменимым элементом вашего гардероба! Они идеально подходят для создания стильных образов, обеспечивая комфорт и элегантность, а разнообразие текстур и цветов позволяет экспериментировать с модой каждый день.
ent-ClothingUnderSocksCapNorm = капитанские носки
.desc = Символ стиля и уверенности! Их роскошные золотые полосы придают носкам оригинальный вид, делая вас настоящим капитаном моды в любой ситуации.
ent-ClothingUnderSocksCapShort = капитанские носки
.desc = { ent-ClothingUnderSocksCapNorm.desc }
.suffix = Короткие
ent-ClothingUnderSocksCapKnee = капитанские носки
ent-ClothingUnderSocksCapKnee = капитанские следки
.desc = { ent-ClothingUnderSocksCapNorm.desc }
.suffix = По колено
ent-ClothingUnderSocksCapThigh = капитанские носки
ent-ClothingUnderSocksCapThigh = капитанские чулки
.desc = { ent-ClothingUnderSocksCapNorm.desc }
.suffix = По бедро
ent-ClothingUnderSocksCeNorm = носки старшего инженера
@@ -93,10 +93,10 @@ ent-ClothingUnderSocksCeNorm = носки старшего инженера
ent-ClothingUnderSocksCeShort = носки старшего инженера
.desc = { ent-ClothingUnderSocksCeNorm.desc }
.suffix = Короткие
ent-ClothingUnderSocksCeKnee = носки старшего инженера
ent-ClothingUnderSocksCeKnee = следки старшего инженера
.desc = { ent-ClothingUnderSocksCeNorm.desc }
.suffix = По колено
ent-ClothingUnderSocksCeThigh = носки старшего инженера
ent-ClothingUnderSocksCeThigh = чулки старшего инженера
.desc = { ent-ClothingUnderSocksCeNorm.desc }
.suffix = По бедро
ent-ClothingUnderSocksCmoNorm = носки главного врача
@@ -104,10 +104,10 @@ ent-ClothingUnderSocksCmoNorm = носки главного врача
ent-ClothingUnderSocksCmoShort = носки главного врача
.desc = { ent-ClothingUnderSocksCmoNorm.desc }
.suffix = Короткие
ent-ClothingUnderSocksCmoKnee = носки главного врача
ent-ClothingUnderSocksCmoKnee = следки главного врача
.desc = { ent-ClothingUnderSocksCmoNorm.desc }
.suffix = По колено
ent-ClothingUnderSocksCmoThigh = носки главного врача
ent-ClothingUnderSocksCmoThigh = чулки главного врача
.desc = { ent-ClothingUnderSocksCmoNorm.desc }
.suffix = По бедро
ent-ClothingUnderSocksHopNorm = носки главы персонала
@@ -115,10 +115,10 @@ ent-ClothingUnderSocksHopNorm = носки главы персонала
ent-ClothingUnderSocksHopShort = носки главы персонала
.desc = { ent-ClothingUnderSocksHopNorm.desc }
.suffix = Короткие
ent-ClothingUnderSocksHopKnee = носки главы персонала
ent-ClothingUnderSocksHopKnee = следки главы персонала
.desc = { ent-ClothingUnderSocksHopNorm.desc }
.suffix = По колено
ent-ClothingUnderSocksHopThigh = носки главы персонала
ent-ClothingUnderSocksHopThigh = чулки главы персонала
.desc = { ent-ClothingUnderSocksHopNorm.desc }
.suffix = По бедро
ent-ClothingUnderSocksHosNorm = носки главы службы безопасности
@@ -126,10 +126,10 @@ ent-ClothingUnderSocksHosNorm = носки главы службы безопа
ent-ClothingUnderSocksHosShort = носки главы службы безопасности
.desc = { ent-ClothingUnderSocksHosNorm.desc }
.suffix = Короткие
ent-ClothingUnderSocksHosKnee = носки главы службы безопасности
ent-ClothingUnderSocksHosKnee = следки главы службы безопасности
.desc = { ent-ClothingUnderSocksHosNorm.desc }
.suffix = По колено
ent-ClothingUnderSocksHosThigh = носки главы службы безопасности
ent-ClothingUnderSocksHosThigh = чулки главы службы безопасности
.desc = { ent-ClothingUnderSocksHosNorm.desc }
.suffix = По бедро
ent-ClothingUnderSocksQmNorm = носки квартирмейстра
@@ -137,10 +137,10 @@ ent-ClothingUnderSocksQmNorm = носки квартирмейстра
ent-ClothingUnderSocksQmShort = носки квартирмейстра
.desc = { ent-ClothingUnderSocksQmNorm.desc }
.suffix = Короткие
ent-ClothingUnderSocksQmKnee = носки квартирмейстра
ent-ClothingUnderSocksQmKnee = следки квартирмейстра
.desc = { ent-ClothingUnderSocksQmNorm.desc }
.suffix = По колено
ent-ClothingUnderSocksQmThigh = носки квартирмейстра
ent-ClothingUnderSocksQmThigh = чулки квартирмейстра
.desc = { ent-ClothingUnderSocksQmNorm.desc }
.suffix = По бедро
ent-ClothingUnderSocksRdNorm = носки научного руководителя
@@ -148,9 +148,9 @@ ent-ClothingUnderSocksRdNorm = носки научного руководите
ent-ClothingUnderSocksRdShort = носки научного руководителя
.desc = { ent-ClothingUnderSocksRdNorm.desc }
.suffix = Короткие
ent-ClothingUnderSocksRdKnee = носки научного руководителя
ent-ClothingUnderSocksRdKnee = следки научного руководителя
.desc = { ent-ClothingUnderSocksRdNorm.desc }
.suffix = По колено
ent-ClothingUnderSocksRdThigh = носки научного руководителя
ent-ClothingUnderSocksRdThigh = чулки научного руководителя
.desc = { ent-ClothingUnderSocksRdNorm.desc }
.suffix = По бедро

View File

@@ -2,31 +2,31 @@ ent-ClothingUnderTopBraGrey = серый лифчик
.desc = Единственный и незаменимый лифчик, который всегда с вами.
ent-ClothingUnderTopBraAssblastusa = лифчик
.desc = Элемент нижнего белья, поддерживающий грудь и создающий комфорт. Оно изготовлено из мягких материалов и украшено различными деталями.
ent-ClothingUnderTopBraChast = лифчик
ent-ClothingUnderTopBraChast = лифчик с пуш-ап
.desc = { ent-ClothingUnderTopBraAssblastusa.desc }
ent-ClothingUnderTopBraLatex = латексный лифчик
.desc = { ent-ClothingUnderTopBraAssblastusa.desc }
ent-ClothingUnderTopBraStripped = полосатый лифчик
ent-ClothingUnderTopBraStripped = чёрно-белый лифчик
.desc = { ent-ClothingUnderTopBraAssblastusa.desc }
ent-ClothingUnderTopBraCommie = лифчик
ent-ClothingUnderTopBraCommie = полосатый лифчик
.desc = { ent-ClothingUnderTopBraAssblastusa.desc }
ent-ClothingUnderTopBraFishnet = лифчик
ent-ClothingUnderTopBraFishnet = лифчик фишнет
.desc = { ent-ClothingUnderTopBraAssblastusa.desc }
ent-ClothingUnderTopBraKinky = лифчик
ent-ClothingUnderTopBraKinky = сексуальный лифчик
.desc = { ent-ClothingUnderTopBraAssblastusa.desc }
ent-ClothingUnderTopBraLace = лифчик
ent-ClothingUnderTopBraLace = полупрозрачный лифчик
.desc = { ent-ClothingUnderTopBraAssblastusa.desc }
ent-ClothingUnderTopBraLizard = лифчик
ent-ClothingUnderTopBraLizard = топ-бра
.desc = { ent-ClothingUnderTopBraAssblastusa.desc }
ent-ClothingUnderTopBraNekoBlack = лифчик
ent-ClothingUnderTopBraNekoBlack = лифчик-неко чёрный
.desc = { ent-ClothingUnderTopBraAssblastusa.desc }
ent-ClothingUnderTopBraNekoWhite = лифчик
ent-ClothingUnderTopBraNekoWhite = лифчик-неко белый
.desc = { ent-ClothingUnderTopBraAssblastusa.desc }
ent-ClothingUnderTopBraSport = спортивный лифчик
ent-ClothingUnderTopBraSport = спортивный топ
.desc = { ent-ClothingUnderTopBraAssblastusa.desc }
ent-ClothingUnderTopBraStrapless = лифчик без брютелек
ent-ClothingUnderTopBraStrapless = лифчик без бретелек
.desc = { ent-ClothingUnderTopBraAssblastusa.desc }
ent-ClothingUnderTopBraThong = лифчик
ent-ClothingUnderTopBraThong = лифчик без бретелек
.desc = { ent-ClothingUnderTopBraAssblastusa.desc }
ent-ClothingUnderTopBraBso = лифчик синего щита
.desc = { ent-ClothingUnderTopBraAssblastusa.desc }

View File

@@ -0,0 +1,2 @@
ent-SpawnPointBarber = барбер
.desc = { ent-SpawnPointJobBase.desc }

View File

@@ -0,0 +1,12 @@
ent-DrinkAperolBottleFull = бутылка апероля
.desc = Аперитив с ярким апельсиновым вкусом и горьковатым послевкусием. Идеален для летних коктейлей.
ent-DrinkJagermeisterBottleFull = бутылка джагермейстера
.desc = Легендарный ликёр с насыщенным травяным вкусом. Часто употребляется в чистом виде или в составе коктейлей.
ent-DrinkSchnapsBottleFull = бутылка шнапса
.desc = Крепкий алкогольный напиток, обычно фруктовый, с ярким ароматом и резким вкусом.
ent-DrinkSambukaBottleFull = бутылка самбуки
.desc = Анисовый ликёр с характерным сладковатым вкусом. Часто подаётся с кофейными зёрнами.
ent-DrinkBitterBottleFull = бутылка горького
.desc = Крепкий алкогольный напиток с горьковатым травяным вкусом. Используется как дижестив или компонент коктейлей.
ent-DrinkSheridanBottleFull = бутылка шеридана
.desc = Слоистый кофейно-сливочный ликёр с нежным вкусом. Идеален для десертов или в качестве самостоятельного напитка.

View File

@@ -0,0 +1,12 @@
ent-DrinkAperolBottle = бутылка от апероля
.desc = { ent-DrinkBottleBaseEmpty.desc }
ent-DrinkJagermeisterBottle = бутылка от джагермейстера
.desc = { ent-DrinkBottleBaseEmpty.desc }
ent-DrinkSchnapsBottle = бутылка от шнапса
.desc = { ent-DrinkBottleBaseEmpty.desc }
ent-DrinkSambukaBottle = бутылка от самбуки
.desc = { ent-DrinkBottleBaseEmpty.desc }
ent-DrinkBitterBottle = бутылка от горького
.desc = { ent-DrinkBottleBaseEmpty.desc }
ent-DrinkSheridanBottle = бутылка от шеридана
.desc = { ent-DrinkBottleBaseEmpty.desc }

View File

@@ -0,0 +1,17 @@
ent-DoughDangoBall = шарик данго
.desc = Выглядит как шарик из теста.
ent-RawNoodles = сухая лапша для рамэна
.desc = Сухая лапша.
ent-HanamiDango = трёхцветное данго
.desc = Похоже что тебе нравятся разные цвета, не так ли?
ent-MitarashiDango = митараши данго
.desc = Рисовая сладость, манящая за собой
ent-Onigiri = онигири
.desc = Лучший рис в галактике!
ent-SpicyPorkRamenNoodles = острый рамэн
.desc = Выглядит так горячо... И так аппетитно!
ent-PorkRamenNoodles = свиной рамэн
.desc = Оу, да я вижу вы человек высокой культуры...
ent-ChocolatePockyPack = коробочка шоколадных покки
ent-Chocopocky = шоколадная палочка покки
.desc = Не забудьте поиграть в игру со своим спутником...

View File

@@ -0,0 +1,8 @@
ent-FlowerRose = роза
.desc = Нечто прекрасное.
ent-FlowerSunflower = подсолнух
.desc = Желтый яркий, как звезды в космосе.
ent-FlowerPeaceFlower = пион
.desc = Нечто прекрасное.
ent-FlowerClown = цветок клоуна
.desc = Нечто ужасающее.

View File

@@ -0,0 +1,2 @@
ent-BarberPDA = КПК барбера
.desc = Почему он не зеленый?

View File

@@ -0,0 +1,8 @@
ent-FlowerBouquetRose = букет роз
.desc = Красиво выглядит и приятно пахнет.
ent-FlowerBouquetSunflower = букет подсолнухов
.desc = Красиво выглядит и приятно пахнет.
ent-FlowerBouquetPoppy = букет маков
.desc = Красиво выглядит и приятно пахнет.
ent-FlowerBouquetMixed = смешанный букет
.desc = Красиво выглядит и приятно пахнет.

View File

@@ -0,0 +1,2 @@
ent-BarberIDCard = ID карта барбера
.desc = { ent-IDCardStandard.desc }

View File

@@ -0,0 +1,2 @@
ent-PaperTicket = тикет
.desc = Следующий!

View File

@@ -0,0 +1,2 @@
ent-SoilBag = мешок почвы
.desc = Грязь.

View File

@@ -0,0 +1,2 @@
ent-BarberRazor = бритва
.desc = Бззззззззззз.

View File

@@ -0,0 +1,6 @@
ent-RoseSeeds = пакет семян (розы)
.desc = { ent-SeedBase.desc }
ent-SunflowerSeeds = пакет семян (подсолнух)
.desc = { ent-SeedBase.desc }
ent-ClownflowerSeeds = пакет семян (цветка клоуна)
.desc = { ent-SeedBase.desc }

View File

@@ -0,0 +1,2 @@
ent-TicketMachine = машина тикетов
.desc = СЛЕДУЮЩИЙ!

View File

@@ -15,3 +15,6 @@ general-station-record-dna-filter = ДНК
general-station-record-console-search-records = Поиск
general-station-record-console-reset-filters = Сброс
general-station-record-console-delete = Удалить
general-station-record-console-access-denied = В доступе отказано
general-station-record-console-job-slot-limit = Нельзя превышать лимит должностей.
general-station-record-console-error = Ошибка: консоль не отвечает. Возможны неполадки в системе связи.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -20,6 +20,12 @@
amount: 2
- id: BungoSeeds
amount: 2
# Corvax-Wega-start
- id: RoseSeeds
amount: 2
- id: SunflowerSeeds
amount: 2
# Corvax-Wega-end
- type: entity
id: CrateHydroponicsSeedsMedicinal

View File

@@ -96,6 +96,11 @@
- id: WeaponDisabler
- id: TrackingImplanter
amount: 2
- id: ClothingMaskBreathMedicalSecurity # Corvax-Wega-Brigmedic
- id: BoxBodyBag # Corvax-Wega-Brigmedic
- id: Defibrillator # Corvax-Wega-Brigmedic
- id: PowerCellHigh # Corvax-Wega-Brigmedic
amount: 2 # Corvax-Wega-Brigmedic
- id: ClothingOuterHardsuitBrigmedic
- id: BoxSterileMask
- id: ClothingHeadHatBeretBrigmedic

View File

@@ -36,3 +36,9 @@
- DrinkVodkaBottleFull
- DrinkWhiskeyBottleFull
- DrinkWineBottleFull
- DrinkAperolBottleFull # Corvax-Wega
- DrinkJagermeisterBottleFull # Corvax-Wega
- DrinkSchnapsBottleFull # Corvax-Wega
- DrinkSambukaBottleFull # Corvax-Wega
- DrinkBitterBottleFull # Corvax-Wega
- DrinkSheridanBottleFull # Corvax-Wega

View File

@@ -45,6 +45,12 @@
DrinkWineBottleFull: 5
DrinkChampagneBottleFull: 2 #because the premium drink
DrinkSakeBottleFull: 3
DrinkAperolBottleFull: 5 # Corvax-Wega
DrinkJagermeisterBottleFull: 5 # Corvax-Wega
DrinkSchnapsBottleFull: 5 # Corvax-Wega
DrinkSambukaBottleFull: 5 # Corvax-Wega
DrinkBitterBottleFull: 5 # Corvax-Wega
DrinkSheridanBottleFull: 5 # Corvax-Wega
DrinkBeerCan: 5
DrinkWineCan: 5
emaggedInventory:

View File

@@ -108,3 +108,4 @@
- Document
storage:
Paper: 0
- type: Printer # Corvax-Wega

View File

@@ -241,8 +241,8 @@
- type: DiseaseProtection # Corvax-Wega-Disease
protection: 0.2 # Corvax-Wega-Disease
- type: ClothingSpeedModifier
walkModifier: 0.65
sprintModifier: 0.65
walkModifier: 0.9 # Corvax-Wega-Brigmedic
sprintModifier: 0.9 # Corvax-Wega-Brigmedic
- type: HeldSpeedModifier
- type: ToggleableClothing
clothingPrototype: ClothingHeadHelmetHardsuitBrigmedic

View File

@@ -491,6 +491,8 @@
parent: SpawnPointJobBase
name: brigmedic
components:
- type: SpawnPoint # Corvax-Wega-Brigmedic
job_id: Brigmedic # Corvax-Wega-Brigmedic
- type: Sprite
layers:
- state: green

View File

@@ -462,6 +462,8 @@
layers:
- state: default
- state: idbrigmedic
- type: PresetIdCard # Corvax-Wega-Brigmedic
job: Brigmedic # Corvax-Wega-Brigmedic
- type: entity
parent: IDCardStandard

View File

@@ -26,6 +26,7 @@
maxDistance: 2
- type: UseDelay
delay: 1.5
- type: Pen # Corvax-Wega-Bureaucracy
- type: entity
parent: Pen

View File

@@ -14,6 +14,7 @@
radius: 5
energy: 3
color: "#FFC90C"
- type: NightLightBlocked # Corvax-Wega-NightLight
- type: Damageable
damageContainer: StructuralInorganic
damageModifierSet: Wood

View File

@@ -55,3 +55,8 @@
solution: soil
- type: Appearance
- type: PlantHolderVisuals
# Corvax-Wega-start
- type: Construction
graph: SoilGraph
node: soil
# Corvax-Wega-end

View File

@@ -196,6 +196,7 @@
name: loadout-group-hop-outerclothing
minLimit: 0
loadouts:
- HoPCoat # Corvax-Wega
- HoPWintercoat
# Civilian
@@ -394,6 +395,9 @@
loadouts:
- JanitorJumpsuit
- JanitorJumpskirt
- JanitorJanimaid # Corvax-Wega
- JanitorJanimaidmini # Corvax-Wega
- JanitorElegantMaid # Corvax-Wega
- type: loadoutGroup
id: JanitorGloves

View File

@@ -116,21 +116,21 @@
- WeaponMeleeToolboxRobust
#Brigmedic
- type: startingGear
id: BrigmedicGear
equipment:
jumpsuit: ClothingUniformJumpsuitBrigmedic
outerClothing: ClothingOuterCoatAMG
back: ClothingBackpackBrigmedic
shoes: ClothingShoesColorRed
gloves: ClothingHandsGlovesNitrile
eyes: ClothingEyesHudMedical
head: ClothingHeadHatBeretBrigmedic
id: BrigmedicPDA
ears: ClothingHeadsetBrigmedic
mask: ClothingMaskBreathMedicalSecurity
belt: ClothingBeltMedicalFilled
# Corvax-Wega-Brigmedic / Fuck this shit
#- type: startingGear
# id: BrigmedicGear
# equipment:
# jumpsuit: ClothingUniformJumpsuitBrigmedic
# outerClothing: ClothingOuterCoatAMG
# back: ClothingBackpackBrigmedic
# shoes: ClothingShoesColorRed
# gloves: ClothingHandsGlovesNitrile
# eyes: ClothingEyesHudMedical
# head: ClothingHeadHatBeretBrigmedic
# id: BrigmedicPDA
# ears: ClothingHeadsetBrigmedic
# mask: ClothingMaskBreathMedicalSecurity
# belt: ClothingBeltMedicalFilled
# Aghost
- type: startingGear

View File

@@ -32,6 +32,7 @@
- Visitor
- Zookeeper
- ServiceWorker
- Barber # Corvax-Wega-Barber
- type: department
id: CentralCommand
@@ -111,6 +112,7 @@
- HeadOfSecurity
- SecurityCadet
- SecurityOfficer
- Brigmedic # Corvax-Wega-Brigmedic
- Pilot # Corvax-Pilot
- Detective
- Warden
@@ -146,4 +148,5 @@
- Zookeeper
- Psychologist
- Pilot # Corvax-Pilot
- Barber # Corvax-Wega-Barber
primary: false

View File

@@ -0,0 +1,9 @@
- type: cargoProduct
id: HydroponicsSoil
icon:
sprite: _Wega/Objects/Misc/soilbag.rsi
state: icon
product: CrateHydroponicsSoil
cost: 5000
category: cargoproduct-category-name-hydroponics
group: market

View File

@@ -0,0 +1,10 @@
- type: entity
id: CrateHydroponicsSoil
parent: CrateHydroponics
name: soil crate
description: "A crate with plain soil."
components:
- type: StorageFill
contents:
- id: SoilBag
amount: 2

View File

@@ -0,0 +1,11 @@
- type: entity
id: SpawnPointBarber
parent: SpawnPointJobBase
name: barber
components:
- type: SpawnPoint
job_id: Barber
- type: Sprite
layers:
- state: green
- state: serviceworker

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,4 @@
# Basic
- type: marking
id: HairSkrellExcited
bodyPart: Hair
@@ -5,7 +6,7 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_excited
state: excited
- type: marking
id: HairSkrellInsulate
@@ -14,7 +15,7 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_insulate
state: insulate
- type: marking
id: HairSkrellLong
@@ -23,7 +24,7 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_long
state: long
- type: marking
id: HairSkrellLongbun
@@ -32,7 +33,7 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_longbun
state: longbun
- type: marking
id: HairSkrellLongtuux
@@ -41,7 +42,7 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_longtuux
state: longtuux
- type: marking
id: HairSkrellLoose
@@ -50,7 +51,7 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_loose
state: loose
- type: marking
id: HairSkrellLowbun
@@ -59,7 +60,7 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_lowbun
state: lowbun
- type: marking
id: HairSkrellMidbun
@@ -68,7 +69,7 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_midbun
state: midbun
- type: marking
id: HairSkrellMullet
@@ -77,7 +78,7 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_mullet
state: mullet
- type: marking
id: HairSkrellReserve
@@ -86,7 +87,7 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_reserve
state: reserve
- type: marking
id: HairSkrellShort
@@ -95,7 +96,7 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_short
state: short
- type: marking
id: HairSkrellShortbun
@@ -104,7 +105,7 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_shortbun
state: shortbun
- type: marking
id: HairSkrellTuux
@@ -113,7 +114,7 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_tuux
state: tuux
- type: marking
id: HairSkrellVeryLong
@@ -122,7 +123,7 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_verylong
state: verylong
- type: marking
id: HairSkrellVeryShort
@@ -131,4 +132,170 @@
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: skrell_hair_veryshort
state: veryshort
# Gradient
- type: marking
id: HairSkrellExcitedGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: excited
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: excited_secondary
- type: marking
id: HairSkrellInsulateGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: insulate
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: insulate_secondary
- type: marking
id: HairSkrellLongGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: long
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: long_secondary
- type: marking
id: HairSkrellLongbunGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: longbun
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: longbun_secondary
- type: marking
id: HairSkrellLongtuuxGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: longtuux
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: longtuux_secondary
- type: marking
id: HairSkrellLooseGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: loose
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: loose_secondary
- type: marking
id: HairSkrellLowbunGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: lowbun
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: lowbun_secondary
- type: marking
id: HairSkrellMidbunGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: midbun
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: midbun_secondary
- type: marking
id: HairSkrellMulletGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: mullet
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: mullet_secondary
- type: marking
id: HairSkrellReserveGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: reserve
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: reserve_secondary
- type: marking
id: HairSkrellShortGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: short
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: short_secondary
- type: marking
id: HairSkrellShortbunGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: shortbun
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: shortbun_secondary
- type: marking
id: HairSkrellTuuxGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: tuux
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: tuux_secondary
- type: marking
id: HairSkrellVeryLongGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: verylong
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: verylong_secondary
- type: marking
id: HairSkrellVeryShortGradient
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Skrell]
sprites:
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: veryshort
- sprite: _Wega/Mobs/Customization/skrell_hair.rsi
state: veryshort_secondary

View File

@@ -8,6 +8,7 @@
species: Skrell
- type: Carriable
- type: DiseaseCarrier
- type: Skrell
- type: Thirst
baseDecayRate: 0.4
- type: Hunger
@@ -49,6 +50,8 @@
types:
Heat: -0.25
Blunt: -0.25
- type: Inventory
templateId: skrell
- type: Butcherable
butcheringType: Spike
spawned:

View File

@@ -0,0 +1,107 @@
- type: entity
parent: [DrinkBottleVisualsOpenable, DrinkBottleGlassBaseFull]
id: DrinkAperolBottleFull
name: aperol bottle
description: "An aperitif with a bright orange flavor and a bitter aftertaste. Perfect for summer cocktails."
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: Aperol
Quantity: 100
- type: Label
currentLabel: reagent-name-aperol
- type: Sprite
sprite: _Wega/Objects/Consumable/Drinks/aperolbottle.rsi
- type: Sealable
- type: entity
parent: [DrinkBottleVisualsOpenable, DrinkBottleGlassBaseFull]
id: DrinkJagermeisterBottleFull
name: jagermeister bottle
description: "A legendary herbal liqueur with a rich, complex flavor. Often consumed neat or in cocktails."
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: Jagermeister
Quantity: 100
- type: Label
currentLabel: reagent-name-jagermeister
- type: Sprite
sprite: _Wega/Objects/Consumable/Drinks/jagermeisterbottle.rsi
- type: Sealable
- type: entity
parent: [DrinkBottleVisualsOpenable, DrinkBottleGlassBaseFull]
id: DrinkSchnapsBottleFull
name: schnaps bottle
description: "A strong alcoholic drink, usually fruit-based, with a bold aroma and sharp taste."
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: Schnaps
Quantity: 100
- type: Label
currentLabel: reagent-name-schnaps
- type: Sprite
sprite: _Wega/Objects/Consumable/Drinks/schnapsbottle.rsi
- type: Sealable
- type: entity
parent: [DrinkBottleVisualsOpenable, DrinkBottleGlassBaseFull]
id: DrinkSambukaBottleFull
name: sambuka bottle
description: "An anise-flavored liqueur with a characteristic sweetish taste. Often served with coffee beans."
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: Sambuka
Quantity: 100
- type: Label
currentLabel: reagent-name-sambuka
- type: Sprite
sprite: _Wega/Objects/Consumable/Drinks/sambukabottle.rsi
- type: Sealable
- type: entity
parent: [DrinkBottleVisualsOpenable, DrinkBottleGlassBaseFull]
id: DrinkBitterBottleFull
name: bitter bottle
description: "A strong alcoholic drink with a bitter herbal flavor. Used as a digestif or cocktail ingredient."
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: Bitter
Quantity: 100
- type: Label
currentLabel: reagent-name-bitter
- type: Sprite
sprite: _Wega/Objects/Consumable/Drinks/bitterbottle.rsi
- type: Sealable
- type: entity
parent: [DrinkBottleVisualsOpenable, DrinkBottleGlassBaseFull]
id: DrinkSheridanBottleFull
name: sheridan bottle
description: "A layered coffee-cream liqueur with a delicate flavor. Ideal for desserts or as a standalone drink."
components:
- type: SolutionContainerManager
solutions:
drink:
reagents:
- ReagentId: Sheridan
Quantity: 100
- type: Label
currentLabel: reagent-name-sheridan
- type: Sprite
sprite: _Wega/Objects/Consumable/Drinks/sheridanbottle.rsi
- type: Sealable

View File

@@ -0,0 +1,47 @@
- type: entity
name: aperol bottle
parent: DrinkBottleBaseEmpty
id: DrinkAperolBottle
components:
- type: Sprite
sprite: _Wega/Objects/Consumable/Drinks/aperolbottle.rsi
- type: entity
name: aperol bottle
parent: DrinkBottleBaseEmpty
id: DrinkJagermeisterBottle
components:
- type: Sprite
sprite: _Wega/Objects/Consumable/Drinks/jagermeisterbottle.rsi
- type: entity
name: aperol bottle
parent: DrinkBottleBaseEmpty
id: DrinkSchnapsBottle
components:
- type: Sprite
sprite: _Wega/Objects/Consumable/Drinks/schnapsbottle.rsi
- type: entity
name: aperol bottle
parent: DrinkBottleBaseEmpty
id: DrinkSambukaBottle
components:
- type: Sprite
sprite: _Wega/Objects/Consumable/Drinks/sambukabottle.rsi
- type: entity
name: aperol bottle
parent: DrinkBottleBaseEmpty
id: DrinkBitterBottle
components:
- type: Sprite
sprite: _Wega/Objects/Consumable/Drinks/bitterbottle.rsi
- type: entity
name: aperol bottle
parent: DrinkBottleBaseEmpty
id: DrinkSheridanBottle
components:
- type: Sprite
sprite: _Wega/Objects/Consumable/Drinks/sheridanbottle.rsi

View File

@@ -0,0 +1,30 @@
- type: entity
name: chocolate pocky
parent: FoodBakedBase
id: Chocopocky
description: Don't forget to play the game with your date...
components:
- type: Item
storedRotation: -90
- type: Food
- type: Sprite
sprite: _Wega/Objects/Consumable/Food/japanfood.rsi
state: chocopocky
- type: SolutionContainerManager
solutions:
food:
maxVol: 15
reagents:
- ReagentId: Nutriment
Quantity: 10
- ReagentId: Theobromine
Quantity: 3
- ReagentId: CocoaPowder
Quantity: 1
- type: Tag
tags:
- Cigarette
- type: Clothing
sprite: _Wega\Objects\Consumable\Food\pockypacks.rsi
slots: [ mask ]
equippedPrefix: unlit

View File

@@ -0,0 +1,52 @@
- type: entity
name: dango ball
parent: FoodBakingBase
id: DoughDangoBall
description: "It looks like a ball of dough."
components:
- type: FlavorProfile
flavors:
- dough
- type: Sprite
sprite: _Wega/Objects/Consumable/Food/ingredients.rsi
state: doughdangoball
- type: entity
name: tricolor dango
parent: FoodBakedBase
id: HanamiDango
description: You like that colors, don't you?
components:
- type: Item
storedRotation: -90
- type: Food
- type: Sprite
sprite: _Wega/Objects/Consumable/Food/japanfood.rsi
state: hanamidango
- type: SolutionContainerManager
solutions:
food:
maxVol: 20
reagents:
- ReagentId: Nutriment
Quantity: 15
- type: entity
name: mitarashi dango
parent: FoodBakedBase
id: MitarashiDango
description: "Rice sweetness that beckons."
components:
- type: Item
storedRotation: -90
- type: Food
- type: Sprite
sprite: _Wega/Objects/Consumable/Food/japanfood.rsi
state: mitarashidango
- type: SolutionContainerManager
solutions:
food:
maxVol: 20
reagents:
- ReagentId: Nutriment
Quantity: 15

View File

@@ -0,0 +1,19 @@
- type: entity
name: onigiri
parent: FoodBakedBase
id: Onigiri
description: "Best fried geometric shape in the galaxy."
components:
- type: Item
storedRotation: -90
- type: Food
- type: Sprite
sprite: _Wega/Objects/Consumable/Food/japanfood.rsi
state: onigiri
- type: SolutionContainerManager
solutions:
food:
maxVol: 25
reagents:
- ReagentId: Nutriment
Quantity: 20

View File

@@ -0,0 +1,65 @@
- type: entity
id: PockyPackBase
parent: [ BaseStorageItem, BaseBagOpenClose ]
name: pocky pack
abstract: true
components:
- type: Sprite
layers:
- state: closed
- state: open
map: ["openLayer"]
visible: false
- state: pok1
map: ["pok1"]
sprite: _Wega/Objects/Consumable/Food/pokvisualizer.rsi
visible: false
- state: pok2
map: ["pok2"]
sprite: _Wega/Objects/Consumable/Food/pokvisualizer.rsi
visible: false
- state: pok3
map: ["pok3"]
sprite: _Wega/Objects/Consumable/Food/pokvisualizer.rsi
visible: false
- type: Tag
tags:
- CigPack
- Trash
- type: PhysicalComposition
materialComposition:
Steel: 50
- type: SpaceGarbage
- type: Item
size: Tiny
shape:
- 0,0,0,1
- type: Storage
grid:
- 0,0,4,1
- type: StorageFill
contents:
- id: Chocopocky
amount: 10
- type: ItemCounter
count:
tags: [Cigarette]
composite: true
layerStates:
- pok1
- pok2
- pok3
- type: Appearance
- type: StaticPrice
price: 150
- type: entity
id: ChocolatePockyPack
parent: PockyPackBase
name: chocolate pocky pack
description:
components:
- type: Sprite
sprite: _Wega/Objects/Consumable/Food/pockypacks.rsi
- type: Item
sprite: _Wega/Objects/Consumable/Food/pockypacks.rsi

View File

@@ -0,0 +1,76 @@
- type: entity
parent: BaseItem
id: FlowerRose
name: rose
description: "Something beautiful."
components:
- type: Clothing
slots:
- HEAD
quickEquip: false
- type: Sprite
sprite: _Wega/Objects/Specific/Hydroponics/rose.rsi
state: produce
- type: Produce
seedId: rose
- type: PotencyVisuals
- type: Appearance
- type: Tag
tags:
- Rose
- type: entity
parent: BaseItem
id: FlowerSunflower
name: sunflower
description: "Yellow is bright, like stars in space."
components:
- type: Clothing
slots:
- HEAD
quickEquip: false
- type: Sprite
sprite: _Wega/Objects/Specific/Hydroponics/sunflower.rsi
state: produce
- type: Produce
seedId: sunflower
- type: PotencyVisuals
- type: Appearance
- type: Tag
tags:
- Sunflower
- type: entity
parent: BaseItem
id: FlowerPeaceFlower
name: peaceflower
description: "Something beautiful."
components:
- type: Clothing
slots:
- HEAD
quickEquip: false
- type: Sprite
sprite: _Wega/Objects/Specific/Hydroponics/peaceflower.rsi
state: produce
- type: Tag
tags:
- Peaceflower
- type: entity
parent: BaseItem
id: FlowerClown
name: clown flower
description: "Something terrible."
components:
- type: Clothing
slots:
- HEAD
quickEquip: false
- type: Sprite
sprite: _Wega/Objects/Specific/Hydroponics/clownflower.rsi
state: produce
- type: Produce
seedId: clownflower
- type: PotencyVisuals
- type: Appearance

View File

@@ -0,0 +1,70 @@
- type: entity
name: dry ramen noodles
parent: FoodBakingBase
id: RawNoodles
description: "Dry noodles."
components:
- type: FlavorProfile
- type: Sprite
sprite: _Wega/Objects/Consumable/Food/ingredients.rsi
state: rawnoodles
- type: entity
name: pork ramen
parent: FoodBowlBase
id: PorkRamenNoodles
description: "Ah, I See You're a Man of Culture As Well..."
components:
- type: Item
- type: Food
- type: Sprite
sprite: _Wega/Objects/Consumable/Food/japanfood.rsi
state: porkramen
- type: SolutionContainerManager
solutions:
food:
maxVol: 30
reagents:
- ReagentId: Nutriment
Quantity: 10
- ReagentId: Protein
Quantity: 3
- ReagentId: Flavorol
Quantity: 5
- ReagentId: Soysauce
Quantity: 2
- type: Tag
tags:
- Meat
- Soup
- type: entity
name: spicy ramen
parent: FoodBowlBase
id: SpicyPorkRamenNoodles
description: So hot and so cute!
components:
- type: Item
- type: Food
- type: Sprite
sprite: _Wega/Objects/Consumable/Food/japanfood.rsi
state: spicyporkramen
- type: SolutionContainerManager
solutions:
food:
maxVol: 30
reagents:
- ReagentId: Nutriment
Quantity: 10
- ReagentId: Protein
Quantity: 3
- ReagentId: Flavorol
Quantity: 5
- ReagentId: CapsaicinOil
Quantity: 2
- ReagentId: Soysauce
Quantity: 2
- type: Tag
tags:
- Meat
- Soup

View File

@@ -0,0 +1,18 @@
- type: entity
parent: BasePDA
id: BarberPDA
name: barber PDA
description: "Why isn't it green?"
components:
- type: Pda
id: BarberIDCard
- type: Appearance
appearanceDataInit:
enum.PdaVisuals.PdaType:
!type:String
pda-barber
- type: PdaBorderColor
borderColor: "#44843c"
accentHColor: "#00cc35"
- type: Icon
state: pda-barber

View File

@@ -0,0 +1,71 @@
- type: entity
name: bouquet roses
parent: BaseItem
id: FlowerBouquetRose
description: "It looks beautiful and smells good."
components:
- type: Sprite
sprite: _Wega/Objects/Misc/rosebouquet.rsi
state: icon
scale: 1.3,1.3
- type: Item
size: Normal
- type: Construction
graph: FlowerRoseBouquetCraft
node: rosebouquet
containers:
- entity_storage
- type: entity
name: bouquet sunflowers
parent: BaseItem
id: FlowerBouquetSunflower
description: "It looks beautiful and smells good."
components:
- type: Sprite
sprite: _Wega/Objects/Misc/sunbouquet.rsi
state: icon
scale: 1.15,1.15
- type: Item
size: Normal
- type: Construction
graph: FlowerSunflowerBouquetCraft
node: sunflowerbouquet
containers:
- entity_storage
- type: entity
name: bouquet poppies
parent: BaseItem
id: FlowerBouquetPoppy
description: "It looks beautiful and smells good."
components:
- type: Sprite
sprite: _Wega/Objects/Misc/poppybouquet.rsi
state: icon
scale: 1.15,1.15
- type: Item
size: Normal
- type: Construction
graph: PoppyFlowerBouquetCraft
node: poppybouquet
containers:
- entity_storage
- type: entity
name: mixed bouquet
parent: BaseItem
id: FlowerBouquetMixed
description: "It looks beautiful and smells good."
components:
- type: Sprite
sprite: _Wega/Objects/Misc/mixedbouquet.rsi
state: icon
scale: 1.15,1.15
- type: Item
size: Normal
- type: Construction
graph: MixedFlowerBouquetCraft
node: bouquetmixed
containers:
- entity_storage

View File

@@ -0,0 +1,28 @@
- type: entity
parent: BaseItem
id: BarberRazor
name: razor
description: "Bzzzzzzzzzzz."
components:
- type: Sprite
sprite: _Wega/Objects/Misc/razor.rsi
state: icon
- type: MagicMirror
changeHairSound: "/Audio/_Wega/Items/hair-clippers.ogg"
addSlotTime: 4
removeSlotTime: 4
selectSlotTime: 4
changeSlotTime: 4
- type: ActivatableUI
key: enum.MagicMirrorUiKey.Key
inHandsOnly: true
requireActiveHand: true
- type: UserInterface
interfaces:
enum.MagicMirrorUiKey.Key:
type: MagicMirrorBoundUserInterface
- type: MeleeWeapon
attackRate: 1
damage:
types:
Blunt: 5

View File

@@ -0,0 +1,11 @@
- type: entity
parent: IDCardStandard
id: BarberIDCard
name: barber ID card
components:
- type: Sprite
layers:
- state: default
- state: idbarber
- type: PresetIdCard
job: Barber

View File

@@ -0,0 +1,22 @@
- type: entity
name: ticket
parent: Paper
id: PaperTicket
description: "Next!"
components:
- type: Sprite
layers:
- state: paper_ticket
color: "#e6e6fa"
- state: paper_ticket_words
map: ["enum.PaperVisualLayers.Writing"]
color: "#e6e6fa"
visible: false
- state: paper_stamp-generic
map: ["enum.PaperVisualLayers.Stamp"]
visible: false
- type: PaperVisuals
backgroundModulate: "#d9d9d9"
backgroundPatchMargin: 16.0, 16.0, 16.0, 16.0
contentMargin: 32.0, 16.0, 32.0, 0.0
maxWritableArea: 400.0, 200.0

View File

@@ -0,0 +1,14 @@
- type: entity
parent: BaseItem
id: SoilBag
name: bag soil
description: "Mud."
components:
- type: Sprite
sprite: _Wega/Objects/Misc/soilbag.rsi
state: icon
- type: Item
size: Ginormous
- type: Tag
tags:
- SoilBag

View File

@@ -0,0 +1,29 @@
- type: entity
parent: SeedBase
name: packet of roses seeds
id: RoseSeeds
components:
- type: Seed
seedId: rose
- type: Sprite
sprite: _Wega/Objects/Specific/Hydroponics/rose.rsi
- type: entity
parent: SeedBase
name: packet of sunflower seeds
id: SunflowerSeeds
components:
- type: Seed
seedId: sunflower
- type: Sprite
sprite: _Wega/Objects/Specific/Hydroponics/sunflower.rsi
- type: entity
parent: SeedBase
name: packet of clownflower seeds
id: ClownflowerSeeds
components:
- type: Seed
seedId: clownflower
- type: Sprite
sprite: _Wega/Objects/Specific/Hydroponics/clownflower.rsi

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