Merge branch 'master' into upstream

This commit is contained in:
Charlotte Tezuka
2026-01-14 18:18:43 +02:00
71 changed files with 133869 additions and 18080 deletions

View File

@@ -27,4 +27,8 @@ public static class Palettes
// Intended to be used with `ModulateSelf` to darken / lighten something
public static readonly ColorPalette AlphaModulate = ColorPalette.FromHexBase("#ffffff");
// wl tones
public static readonly ColorPalette WL1 = ColorPalette.FromHexBase("#9051A8");
public static readonly ColorPalette WL2 = ColorPalette.FromHexBase("#2d2d2d", lightnessShift: 0.015f, chromaShift: 0.0055f);
}

View File

@@ -1,12 +1,14 @@
using Content.Client.Stylesheets.Palette;
using Content.Client.Stylesheets.Palette;
namespace Content.Client.Stylesheets.Stylesheets;
public sealed partial class NanotrasenStylesheet
{
public override ColorPalette PrimaryPalette => Palettes.Navy;
public override ColorPalette SecondaryPalette => Palettes.Slate;
public override ColorPalette PositivePalette => Palettes.Green;
public override ColorPalette NegativePalette => Palettes.Red;
public override ColorPalette HighlightPalette => Palettes.Gold;
//WL-Change-start
public override ColorPalette PrimaryPalette => Palettes.WL2;
public override ColorPalette SecondaryPalette => Palettes.WL2;
public override ColorPalette PositivePalette => Palettes.WL1;
public override ColorPalette NegativePalette => Palettes.WL1;
public override ColorPalette HighlightPalette => Palettes.WL1;
//WL-Change-end
}

View File

@@ -4,9 +4,11 @@ namespace Content.Client.Stylesheets.Stylesheets;
public partial class SystemStylesheet
{
public override ColorPalette PrimaryPalette => Palettes.Cyan;
public override ColorPalette SecondaryPalette => Palettes.Neutral;
public override ColorPalette PositivePalette => Palettes.Green;
public override ColorPalette NegativePalette => Palettes.Red;
public override ColorPalette HighlightPalette => Palettes.Maroon;
//WL-Change-start
public override ColorPalette PrimaryPalette => Palettes.WL2;
public override ColorPalette SecondaryPalette => Palettes.WL2;
public override ColorPalette PositivePalette => Palettes.WL1;
public override ColorPalette NegativePalette => Palettes.WL1;
public override ColorPalette HighlightPalette => Palettes.WL1;
//WL-Change-end
}

View File

@@ -95,24 +95,7 @@ public sealed partial class SkillsForcedWindow : FancyWindow
HorizontalAlignment = Control.HAlignment.Center
};
confirmButton.OnPressed += _ =>
{
if (_totalPoints - _spentPoints == 0)
{
Close();
}
else
{
warningContainer.RemoveAllChildren();
var warning = new Label
{
Text = Loc.GetString("skills-unspent-warning"),
FontColorOverride = Color.Yellow,
HorizontalAlignment = Control.HAlignment.Center
};
warningContainer.AddChild(warning);
}
};
confirmButton.OnPressed += _ => Close();
bottomContainer.AddChild(confirmButton);
bottomContainer.AddChild(warningContainer);

View File

@@ -438,8 +438,16 @@ public sealed partial class ChatSystem : SharedChatSystem
}
// WL-Change: No talk in vacuum Start
if (!TryEntitySpeak(source))
var pressureCheckEv = new PressureLanguageCheckEvent(message, source);
RaiseLocalEvent(source, ref pressureCheckEv);
if (pressureCheckEv.Cancelled)
return;
else if (pressureCheckEv.ForceWhisper)
{
SendEntityWhisper(source, originalMessage, range, null, nameOverride);
return;
}
message = pressureCheckEv.Message;
// WL-Change: No talk in vacuum End
name = FormattedMessage.EscapeText(name);
@@ -471,18 +479,18 @@ public sealed partial class ChatSystem : SharedChatSystem
if (originalMessage == message)
{
if (name != Name(source))
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Say from {source} as {name}: {originalMessage}.");
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Say from {source} as {name}: {originalMessage}. Obfuscated to {obfusMessage}."); //WL-Changes: Languages
else
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Say from {source}: {originalMessage}.");
_adminLogger.Add(LogType.Chat, LogImpact.Low, $"Say from {source}: {originalMessage}. Obfuscated to {obfusMessage}."); //WL-Changes: Languages
}
else
{
if (name != Name(source))
_adminLogger.Add(LogType.Chat, LogImpact.Low,
$"Say from {source} as {name}, original: {originalMessage}, transformed: {message}.");
$"Say from {source} as {name}, original: {originalMessage}, transformed: {message}. Obfuscated to {obfusMessage}."); //WL-Changes: Languages
else
_adminLogger.Add(LogType.Chat, LogImpact.Low,
$"Say from {source}, original: {originalMessage}, transformed: {message}.");
$"Say from {source}, original: {originalMessage}, transformed: {message}. Obfuscated to {obfusMessage}."); //WL-Changes: Languages
}
}
@@ -591,9 +599,6 @@ public sealed partial class ChatSystem : SharedChatSystem
_chatManager.ChatMessageToOne(ChatChannel.Whisper, /*WL-Changes: Languages*/afterObfusMessage, afterUnknownMessage/*WL-Changes: Languages*/, source, false, session.Channel);
}
if (TryEntitySpeak(source)) // WL-Change: No talk in vacuum
_replay.RecordServerMessage(new ChatMessage(ChatChannel.Whisper, message, wrappedMessage, GetNetEntity(source), null, MessageRangeHideChatForReplay(range)));
var ev = new EntitySpokeEvent(source, message, originalMessage, channel, obfuscatedMessage, /*WL-Changes: Languages*/biobfMessage, langObfusMessage/*WL-Changes: Languages*/);
RaiseLocalEvent(source, ev, true);
if (!hideLog)

View File

@@ -103,6 +103,13 @@ public sealed class RadioSystem : EntitySystem
RaiseLocalEvent(radioSource, ref sendAttemptEv);
var canSend = !sendAttemptEv.Cancelled;
//WL-Changes: Languages start
var checkLanguageEv = new RadioLanguageCheckEvent(content, radioSource);
RaiseLocalEvent(messageSource, ref checkLanguageEv);
canSend = canSend && !checkLanguageEv.Cancelled;
content = checkLanguageEv.Message;
//WL-Changes: Languages end
var sourceMapId = Transform(radioSource).MapID;
var hasActiveServer = HasActiveServer(sourceMapId, channel.ID);
var sourceServerExempt = _exemptQuery.HasComp(radioSource);
@@ -157,6 +164,7 @@ public sealed class RadioSystem : EntitySystem
radioSource,
chatMsgEv);
RaiseLocalEvent(receiver, ref ev);
// WL-Changes-end
}

View File

@@ -53,7 +53,7 @@ public sealed class LanguagesSoundsSystem : EntitySystem
var soundEvent = new LanguageSoundEvent(proto.ID, GetNetEntity(uid));
var whispSoundEvent = new LanguageSoundEvent(proto.ID, GetNetEntity(uid), true);
if (!proto.NeedSound)
if (!proto.CustomSound)
return;
var xformQuery = GetEntityQuery<TransformComponent>();

View File

@@ -1,13 +1,17 @@
using Content.Shared._WL.Languages;
using Content.Shared._WL.Languages.Components;
using Content.Shared.IdentityManagement;
using Content.Shared.Popups;
using Content.Shared.Timing;
using Content.Shared.Radio;
using Content.Shared.Speech;
using Content.Shared.Trigger.Systems;
using Content.Server.Atmos.EntitySystems;
using Robust.Shared.Network;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Utility;
using Robust.Shared.Timing;
namespace Content.Server._WL.Languages;
@@ -15,40 +19,33 @@ public sealed class LanguagesSystem : SharedLanguagesSystem
{
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IEntityManager _ent = default!;
[Dependency] private readonly AtmosphereSystem _atmosphereSystem = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
/// <summary>
/// Потому что <see cref="Shared.Chat.ChatChannelExtensions.TextColor(Shared.Chat.ChatChannel)" />.
/// </summary>
private static readonly Color DefaultChatTextColor = Color.LightGray;
private static readonly string DefaultChatTextFontId = "Default";
private static readonly int DefaultChatTextFontSize = 12;
private static readonly float FullTalkPressure = 50f;
private static readonly float MinTalkPressure = 5f;
private static readonly float ForceWhisperProb = .3f;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<LanguagesComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<LanguagesComponent, ComponentInit>(OnComponentInit);
SubscribeLocalEvent<AddLanguagesComponent, ComponentInit>(OnAddInit);
SubscribeLocalEvent<LanguagesComponent, PressureLanguageCheckEvent>(OnPressureLanguageCheck);
SubscribeLocalEvent<ModifyLanguagesComponent, ComponentInit>(OnModifyInit);
SubscribeNetworkEvent<LanguageChangeEvent>(OnGlobalLanguageChange);
SubscribeNetworkEvent<LanguagesSyncEvent>(OnLanguagesSync);
}
public void OnMapInit(EntityUid ent, LanguagesComponent component, ref MapInitEvent args)
{
var langs = component.Speaking;
if (langs.Count == 0)
return;
foreach (ProtoId<LanguagePrototype> protoid in langs)
{
var proto = GetLanguagePrototype(protoid);
if (proto != null)
{
if (TryChangeLanguage(_ent.GetNetEntity(ent), protoid))
return;
}
}
}
public void AddLanguage(EntityUid ent, string language)
{
if (!TryComp<LanguagesComponent>(ent, out var comp))
@@ -61,28 +58,45 @@ public sealed class LanguagesSystem : SharedLanguagesSystem
SyncLanguages(net_ent, comp);
}
public void OnAddInit(EntityUid ent, AddLanguagesComponent component, ref ComponentInit args)
public void OnModifyInit(EntityUid ent, ModifyLanguagesComponent component, ref ComponentInit args)
{
var langs = component.Languages;
if (langs.Count == 0 || !TryComp<LanguagesComponent>(ent, out var out_comp))
if (!TryComp<LanguagesComponent>(ent, out var out_comp))
{
RemComp<AddLanguagesComponent>(ent);
RemComp<ModifyLanguagesComponent>(ent);
return;
}
foreach (ProtoId<LanguagePrototype> protoid in langs)
if (!component.SpecieLanguage)
{
var proto = GetLanguagePrototype(protoid);
if (proto != null)
foreach (ProtoId<LanguagePrototype> protoid in langs)
{
if (component.ToSpeaking)
out_comp.Speaking.Add(protoid);
var proto = GetLanguagePrototype(protoid);
if (proto != null)
{
if (component.ToSpeaking)
out_comp.Speaking.Add(protoid);
if (component.ToUnderstood)
out_comp.Understood.Add(protoid);
if (component.ToUnderstood)
out_comp.Understood.Add(protoid);
}
}
}
RemComp<AddLanguagesComponent>(ent);
else
{
var protoid = out_comp.SpecieLanguage;
var proto = GetLanguagePrototype(protoid);
if (proto != null && protoid != null)
{
if (component.ToSpeaking)
out_comp.Speaking.Remove(protoid.Value);
if (component.ToUnderstood)
out_comp.Understood.Remove(protoid.Value);
}
}
RemComp<ModifyLanguagesComponent>(ent);
Dirty(ent, out_comp);
@@ -95,6 +109,10 @@ public sealed class LanguagesSystem : SharedLanguagesSystem
var langs = component.Speaking;
if (langs.Count == 0)
return;
if (component.SpecieLanguage != null)
AddLanguage(ent, component.SpecieLanguage);
foreach (ProtoId<LanguagePrototype> protoid in langs)
{
var proto = GetLanguagePrototype(protoid);
@@ -126,6 +144,42 @@ public sealed class LanguagesSystem : SharedLanguagesSystem
OnLanguageChange(entity, (string)msg.Language);
}
public void OnPressureLanguageCheck(EntityUid source, LanguagesComponent comp, ref PressureLanguageCheckEvent args)
{
var passability = CheckPressurePass(source, args.Message);
if (passability == 0)
{
args.Cancelled = true;
var time = _timing.CurTime;
if (true || time > comp.LastPopup + comp.PopupCooldown)
{
comp.LastPopup = time;
var message = Loc.GetString("languages-vacuum-block");
_popup.PopupEntity(message, source);
}
}
else if (passability < 1)
{
args.Message = ObfuscateMessageReadability(args.Message, passability);
if (passability < ForceWhisperProb)
args.ForceWhisper = true;
var time = _timing.CurTime;
if (true || time > comp.LastPopup + comp.PopupCooldown)
{
comp.LastPopup = time;
var message = Loc.GetString("languages-vacuum-part-pass");
_popup.PopupEntity(message, source);
}
}
}
public string ObfuscateMessageFromSource(string message, EntityUid source)
{
LanguagePrototype? proto = null;
@@ -172,13 +226,13 @@ public sealed class LanguagesSystem : SharedLanguagesSystem
public bool NeedTTS(EntityUid source)
{
if (!TryComp<LanguagesComponent>(source, out var source_lang))
return false;
return true;
else
{
var message_language = source_lang.CurrentLanguage;
var proto = GetLanguagePrototype(message_language);
if (proto == null)
return false;
return true;
else
{
return proto.NeedTTS;
@@ -198,7 +252,7 @@ public sealed class LanguagesSystem : SharedLanguagesSystem
return false;
else
{
return proto.Obfuscation.IsEmoting();
return proto.Emoting;
}
}
}
@@ -207,7 +261,7 @@ public sealed class LanguagesSystem : SharedLanguagesSystem
{
var proto = GetLanguagePrototype(source, message);
if (proto != null)
return proto.Obfuscation.IsEmoting();
return proto.Emoting;
return IsObfusEmoting(source);
}
@@ -232,7 +286,11 @@ public sealed class LanguagesSystem : SharedLanguagesSystem
var isSelf = listener == source;
var canUnderstand = CanUnderstand(source, listener, msg);
var color = GetColor(msg, source, channel.Color);
var language = GetLanguagePrototype(source, msg);
var color = GetColor(language, channel.Color);
var (fontSize, fontId) = GetFontParams(language, speech.FontSize, speech.FontId);
string message;
if (isSelf || canUnderstand)
@@ -251,24 +309,39 @@ public sealed class LanguagesSystem : SharedLanguagesSystem
if (!isSelf && !canUnderstand && IsObfusEmoting(source, msg))
locId = "chat-radio-message-wrap-emote-lang";
return Loc.GetString(locId,
var wrappedMessage = Loc.GetString(locId,
("color", channel.Color),
("fontType", speech.FontId),
("fontSize", speech.FontSize),
("fontType", fontId),
("fontSize", fontSize),
("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))),
("channel", $"\\[{channel.LocalizedName}\\]"),
("name", name),
("message", message),
("langColor", color));
return SanitizeWrappedMessage(source, wrappedMessage);
}
public Color GetColor(string message, EntityUid source, Color? fallback = null)
public (int, string) GetFontParams(LanguagePrototype? language, int? fallbackSize = null, string? fallbackId = null)
{
var language = GetLanguagePrototype(source, message);
int size;
string id;
if (TryComp<LanguagesComponent>(source, out var comp))
language ??= GetLanguagePrototype(comp.CurrentLanguage);
if (language == null || language.FontSize == DefaultChatTextFontSize)
size = fallbackSize ?? DefaultChatTextFontSize;
else
size = language.FontSize;
if (language == null || language.FontId == DefaultChatTextFontId)
id = fallbackId ?? DefaultChatTextFontId;
else
id = language.FontId;
return (size, id);
}
public Color GetColor(LanguagePrototype? language, Color? fallback = null)
{
if (language == null || language.Color == DefaultChatTextColor)
return fallback ?? DefaultChatTextColor;
@@ -282,14 +355,18 @@ public sealed class LanguagesSystem : SharedLanguagesSystem
TryProcessLanguageMessage(source, message, out string new_message);
var color = GetColor(message, source);
var language = GetLanguagePrototype(source, message);
var color = GetColor(language);
var escapedMessage = FormattedMessage.EscapeText(new_message);
return Loc.GetString("chat-manager-entity-whisper-wrap-message-lang",
var wrappedMessage = Loc.GetString("chat-manager-entity-whisper-wrap-message-lang",
("entityName", name),
("message", escapedMessage),
("langColor", color));
return SanitizeWrappedMessage(source, wrappedMessage);
}
public string GetEmoteWrappedMessage(string message, EntityUid source, string name)
@@ -302,7 +379,7 @@ public sealed class LanguagesSystem : SharedLanguagesSystem
("message", FormattedMessage.RemoveMarkupOrThrow(message))
);
return wrappedMessage;
return SanitizeWrappedMessage(source, wrappedMessage);
}
public string GetWrappedMessage(string message, EntityUid source, string name, SpeechVerbPrototype speech)
@@ -312,16 +389,45 @@ public sealed class LanguagesSystem : SharedLanguagesSystem
TryProcessLanguageMessage(source, message, out string new_message);
var color = GetColor(message, source);
var language = GetLanguagePrototype(source, message);
var color = GetColor(language);
var (fontSize, fontId) = GetFontParams(language, speech.FontSize, speech.FontId);
var locId = speech.Bold ? "chat-manager-entity-say-bold-wrap-message-lang" : "chat-manager-entity-say-wrap-message-lang";
Logger.Debug(fontId);
return Loc.GetString(locId,
var wrappedMessage = Loc.GetString(locId,
("entityName", name),
("verb", Loc.GetString(_random.Pick(speech.SpeechVerbStrings))),
("fontType", speech.FontId),
("fontSize", speech.FontSize),
("fontType", fontId), //Оно не работает, даже если захардкодить. Не понимаю почему. (tau)
("fontSize", fontSize),
("message", FormattedMessage.EscapeText(new_message)),
("langColor", color));
return SanitizeWrappedMessage(source, wrappedMessage);
}
private float CheckPressurePass(EntityUid source, string msg)
{
var language = GetLanguagePrototype(source, msg);
if (language == null)
return 1f;
if (_atmosphereSystem.GetContainingMixture(source) is { } mixture)
{
var fixed_pressure = MathF.Max(mixture.Pressure - MinTalkPressure, 0f);
var pressure_prob = MathF.Min(fixed_pressure/(FullTalkPressure - MinTalkPressure), 1f);
var full_prob = MathF.Min(pressure_prob + language.PressurePass, 1f);
return full_prob;
}
else
return 1f;
}
}

View File

@@ -6,7 +6,7 @@ using Robust.Shared.Serialization.TypeSerializers.Implementations;
namespace Content.Shared._WL.Languages.Components;
[RegisterComponent, NetworkedComponent]
public sealed partial class AddLanguagesComponent : Component
public sealed partial class ModifyLanguagesComponent : Component
{
[DataField]
public bool ToRemove = false;
@@ -17,6 +17,9 @@ public sealed partial class AddLanguagesComponent : Component
[DataField]
public bool ToSpeaking = true;
[DataField]
public bool SpecieLanguage = false;
[DataField]
public List<ProtoId<LanguagePrototype>> Languages = [];

View File

@@ -4,7 +4,7 @@ using Robust.Shared.Serialization;
namespace Content.Shared._WL.Languages.Components;
[RegisterComponent, NetworkedComponent]
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class LanguagesComponent : Component
{
[DataField]
@@ -22,6 +22,15 @@ public sealed partial class LanguagesComponent : Component
[DataField]
public ProtoId<LanguagePrototype>? CurrentLanguage = null;
[DataField]
public ProtoId<LanguagePrototype>? SpecieLanguage = null;
[DataField, AutoNetworkedField]
public TimeSpan LastPopup;
[DataField, AutoNetworkedField]
public TimeSpan PopupCooldown = TimeSpan.FromSeconds(1);
[Serializable, NetSerializable]
public sealed class State : ComponentState
{

View File

@@ -33,8 +33,23 @@ public sealed partial class LanguagePrototype : IPrototype
[DataField("needtts")]
public bool NeedTTS = true;
[DataField("needsound")]
public bool NeedSound = false;
[DataField("emoting")]
public bool Emoting = false;
[DataField("radioPass")]
public float RadioPass = 1f;
[DataField("pressurePass")]
public float PressurePass = 0f;
[DataField("fontId")]
public string FontId = "Default";
[DataField("fontSize")]
public int FontSize = 12;
[DataField("customSound")]
public bool CustomSound = false;
[DataField("sound")]
public SoundCollectionSpecifier Sound = new SoundCollectionSpecifier("TernarySounds");

View File

@@ -1,11 +1,36 @@
using Content.Shared.Chat;
using Content.Shared._WL.Languages;
using Content.Shared._WL.Languages.Components;
using Content.Shared.DoAfter;
using Robust.Shared.Serialization;
using Robust.Shared.Prototypes;
namespace Content.Shared._WL.Languages;
/// <summary>
/// Проверка на окружающее давление
/// </summary>
[ByRefEvent]
public record struct PressureLanguageCheckEvent(string Message, EntityUid Source)
{
public string Message = Message;
public readonly EntityUid Source = Source;
public bool Cancelled = false;
public bool ForceWhisper = false;
}
/// <summary>
/// Проверка на то, можно ли на языке говорить по радио
/// </summary>
[ByRefEvent]
public record struct RadioLanguageCheckEvent(string Message, EntityUid RadioSource)
{
public string Message = Message;
public readonly EntityUid RadioSource = RadioSource;
public bool Cancelled = false;
}
[Serializable, NetSerializable]
public sealed partial class LanguageChangeEvent : EntityEventArgs
{

View File

@@ -34,25 +34,18 @@ public abstract partial class ObfuscationMethod
Obfuscate(builder, message, global_seed);
return builder.ToString();
}
public abstract bool IsEmoting();
}
public partial class ReplacementObfuscation : ObfuscationMethod
{
[DataField(required: true)]
public List<string> Replacement = [];
public List<string> Replacement = [];
internal override void Obfuscate(StringBuilder builder, string message, int global_seed)
{
var index = PseudoRandom(message.GetHashCode(), global_seed, 0, Replacement.Count - 1);
builder.Append(Replacement[index]);
}
public override bool IsEmoting()
{
return false;
}
}
public partial class WordsReplacementObfuscation : ObfuscationMethod
@@ -96,11 +89,6 @@ public partial class WordsReplacementObfuscation : ObfuscationMethod
}
}
}
public override bool IsEmoting()
{
return false;
}
}
public partial class Utf16ReplacementObfuscation : ObfuscationMethod
@@ -164,11 +152,6 @@ public partial class Utf16ReplacementObfuscation : ObfuscationMethod
}
}
}
public override bool IsEmoting()
{
return false;
}
}
@@ -230,14 +213,9 @@ public partial class ByCharReplacementObfuscation : ObfuscationMethod
}
}
}
public override bool IsEmoting()
{
return false;
}
}
public partial class EmoteObfuscation : ObfuscationMethod
public partial class LengthObfuscation : ObfuscationMethod
{
[DataField(required: true)]
public List<string> Replacement = [];
@@ -257,9 +235,4 @@ public partial class EmoteObfuscation : ObfuscationMethod
index = System.Math.Max(0, System.Math.Min(index, Replacement.Count - 1));
builder.Append(Replacement[index]);
}
public override bool IsEmoting()
{
return true;
}
}

View File

@@ -3,9 +3,12 @@ using Content.Shared.Chat;
using Content.Shared.GameTicking;
using Content.Shared.Popups;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Serialization;
using Robust.Shared.Timing;
using System.Collections.Frozen;
using System.Diagnostics.CodeAnalysis;
using System.Text;
namespace Content.Shared._WL.Languages;
@@ -16,6 +19,8 @@ public abstract class SharedLanguagesSystem : EntitySystem
[Dependency] private readonly IEntityManager _ent = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedChatSystem _chat = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IRobustRandom _random = default!;
private FrozenDictionary<char, LanguagePrototype> _keylan = default!;
@@ -24,6 +29,9 @@ public abstract class SharedLanguagesSystem : EntitySystem
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<LanguagesComponent, RadioLanguageCheckEvent>(OnRadioLanguageCheck);
CacheLanguages();
}
@@ -46,6 +54,39 @@ public abstract class SharedLanguagesSystem : EntitySystem
return proto;
}
public void OnRadioLanguageCheck(EntityUid source, LanguagesComponent comp, ref RadioLanguageCheckEvent args)
{
var passability = CheckRadioPass(source, args.Message);
if (passability == 0)
{
args.Cancelled = true;
var time = _timing.CurTime;
if (time > comp.LastPopup + comp.PopupCooldown)
{
comp.LastPopup = time;
var message = Loc.GetString("languages-radio-block");
_popup.PopupEntity(message, source);
}
}
else if (passability < 1)
{
args.Message = ObfuscateMessageReadability(args.Message, 1.0f - passability);
var time = _timing.CurTime;
if (time > comp.LastPopup + comp.PopupCooldown)
{
comp.LastPopup = time;
var message = Loc.GetString("languages-radio-part-pass");
_popup.PopupEntity(message, source);
}
}
}
public string ObfuscateMessage(EntityUid uid, string message, ProtoId<LanguagePrototype> language)
{
var proto = GetLanguagePrototype(language);
@@ -71,6 +112,12 @@ public abstract class SharedLanguagesSystem : EntitySystem
if (!comp.Understood.Contains(protoid))
return false;
if (ent == null)
return false;
comp.CurrentLanguage = protoid;
Dirty(ent.Value, comp);
var ev = new LanguageChangeEvent(netEnt, protoid);
RaiseNetworkEvent(ev);
RaiseLocalEvent(ent.Value, ev);
@@ -106,7 +153,7 @@ public abstract class SharedLanguagesSystem : EntitySystem
/// <param name="uid"></param>
/// <param name="message"></param>
/// <returns></returns>
public LanguagePrototype? GetLanguagePrototype(EntityUid uid, string? message)
public LanguagePrototype? GetLanguagePrototype(EntityUid uid, string? message = null)
{
LanguagePrototype? language = null;
@@ -114,11 +161,12 @@ public abstract class SharedLanguagesSystem : EntitySystem
return null;
if (string.IsNullOrEmpty(message) || message.Length < 2 || !(message.StartsWith(LanguagePrefix)))
return null;
{
return GetLanguagePrototype(comp.CurrentLanguage);
}
var prefix = char.ToLower(message[1]);
return _keylan.TryGetValue(prefix, out language)
? language : null;
}
@@ -166,6 +214,46 @@ public abstract class SharedLanguagesSystem : EntitySystem
return false;
}
private float CheckRadioPass(EntityUid source, string msg)
{
var language = GetLanguagePrototype(source, msg);
if (language == null)
return 1.0f;
return language.RadioPass;
}
public string ObfuscateMessageReadability(string message, float chance)
{
var modifiedMessage = new StringBuilder(message);
for (var i = 0; i < message.Length; i++)
{
if (char.IsWhiteSpace((modifiedMessage[i])))
{
continue;
}
if (_random.Prob(1 - chance))
{
modifiedMessage[i] = '~';
}
}
return modifiedMessage.ToString();
}
public string SanitizeWrappedMessage(EntityUid source, string message, bool capitalize = true)
{
var newMessage = message.Trim();
if (capitalize)
newMessage = _chat.SanitizeMessageCapital(newMessage);
return newMessage ?? "";
}
[Serializable, NetSerializable]
public sealed class LanguagesInfoEvent : EntityEventArgs
{

Binary file not shown.

Binary file not shown.

View File

@@ -30,3 +30,21 @@ language-sareng-desc = В языке саренгов преобладают г
language-slimish = Слаймолюдский
language-slimish-desc = Адаптированный под биологию слаймолюдов человеческий английский. Образовался естественным образом во время развития вида в виду необходимости коммуникации между особями. Не имеет письменной вариации, но устно широко распространён благодаря своему удобству для слаймолюдов. Состоит из разных хлюпающих, булькающих звуков и различных вибраций, являющихся переиначиванием человеческой английской речи.
language-wingdings = Общегалактический жестовый
language-wingdings-desc = Наиболее распространённый жестовый язык, подходящий практически для всех разумных рас. Крайне популярен среди инженеров, учёных и любых других профессий, которые требуют работу при низком давлении и в экстримальных условиях.
language-toptranslate = Высший транслит
language-toptranslate-desc = Усложнённая версия транслита, обладающая высококомплексной грамматикой и невероятно большим количеством слов. Говорить на нём — это отличный способ показать как своё аристократичное происхождение, так и снобизм. Наиболее популярен в КОГе и крайне распространён в Ноократии Эранта среди высоких классов и в Консорциуме "Нексус". По звучанию и словообразование похож на человеческий французский и некоторые другие романские языки.
language-bottomtranslate = Адаптированный транслит
language-bottomtranslate-desc = Упрощённая версия транслита, обладающая примитивной грамматикой и сниженным количеством слов. Появился во время образования СоцКона для максимального упращения перехода неразвитых планет в индустриальную эру. В сравнении с высшим транслитом часто зовётся низшим, хотя многие считают такое название оскорбительным. Распространён в СоцКоне, особенно в Умпорской Федерации из-за вечного противостояния Ноократии.
language-urhs = Урсахский
language-urhs-desc = Диалект Синта'Унати, включающий в себя больше рычащих, чем шипящих звуков. Звучит знчаительно грубее и "животнее" Синта'Унати.
language-urlum = Урлюм
language-urlum-desc = Язык муринов. По большей части состоит из различных писков и сложных высоких гласных, от чего иногда может больше напоминать чириканье, чем полноценную речь.
language-siktair = Сик'Таир
language-siktair-desc = Язык таяран. Из-за их консервативности почти не изменяется, от того в нём отсутствует множество современных терминов. Один из прородителей адаптированного транслита.

View File

@@ -0,0 +1,5 @@
languages-radio-block = Вы не можете говорить на этом языке по радио!
languages-radio-part-pass = Вы не можете полностью передать смысл на этом языке по радио!
languages-vacuum-block = Вы не можете говорить на этом языке в низком давлении!
languages-vacuum-part-pass = Вы не можете полностью передать смысл на этом языке в низком давлении!

View File

@@ -0,0 +1,22 @@
trait-category-languages = Языки
trait-language-unspecie = Убрать язык вида
trait-language-unspecie-desc = Удаляет родной язык вида. Используйте с умом.
trait-language-oldearth = Староземной
trait-language-oldearth-desc = Человеческий язык. Крайне сложен в изучении для не людей.
trait-language-sinta = Синта'Унати
trait-language-sinta-desc = Наиболее популярный язык среди унатхов.
trait-language-urhs = Урсахский
trait-language-urhs-desc = Второй по популярности диалект Синта'Унати. Обладает большей грубостью.
trait-language-top = Высший транслит
trait-language-top-desc = Усложнённая версия транслита. Для аристократов.
trait-language-bottom = Адаптированный транслит
trait-language-bottom-desc = Упрощённая версия транслита. Для бедных и необразованных.
trait-language-wingdings = Общегалактический жестовый
trait-language-wingdings-desc = Популярный жестовый язык. Позволяет говорить в вакууме.

View File

@@ -1,5 +1,5 @@
lathe-category-reports = Отчёты
lathe-category-statements = Заключения
lathe-category-statements = Заявления
lathe-category-inquiries-and-appeals = Запросы и обращения
lathe-category-complaints = Жалобы
lathe-category-permissions = Разрешения

View File

@@ -1,4 +1,4 @@
# Errors
# Errors
loadout-group-species-restriction = Этот предмет недоступен для вашего текущего вида.
# Miscellaneous
loadout-group-trinkets = Безделушки
@@ -173,3 +173,5 @@ loadout-group-psychologist-jumpsuit = Психотерапевт, комбине
# WL-change-psych
loadout-group-boxer-jumpsuit = Боксёр, комбинезон
loadout-group-boxer-gloves = Боксёр, перчатки
# WL-change-bartender
loadout-group-bartender-glasses = Бармен, очки

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

@@ -638,8 +638,8 @@
# corvax-chatsan-word-64: corvax-chatsan-replacement-64
# corvax-chatsan-word-65: corvax-chatsan-replacement-65
# corvax-chatsan-word-66: corvax-chatsan-replacement-66
# corvax-chatsan-word-67: corvax-chatsan-replacement-67
# corvax-chatsan-word-68: corvax-chatsan-replacement-68
corvax-chatsan-word-67: corvax-chatsan-replacement-67 #WL-Changes: автозамена для пж и спс
corvax-chatsan-word-68: corvax-chatsan-replacement-68 #WL-Changes: автозамена для пж и спс
# corvax-chatsan-word-69: corvax-chatsan-replacement-69
# corvax-chatsan-word-70: corvax-chatsan-replacement-70
# corvax-chatsan-word-71: corvax-chatsan-replacement-71

View File

@@ -394,10 +394,9 @@
- type: Languages
speaking:
- Translate
- Ternary
understood:
- Translate
- Ternary
specieLanguage: Ternary
#WL-Changes: Languages end
- type: MobCollision # WL-Changes: MobCollision works for players only

View File

@@ -7,6 +7,14 @@
components:
- type: HumanoidAppearance
species: Tajaran
# WL-Change Start
hideLayersOnEquip:
- Hair
- Snout
- FacialHair
- HeadTop
- HeadSide
# WL-Change End
- type: Hunger
baseDecayRate: 0.02
- type: Thirst
@@ -80,6 +88,7 @@
- Translate
understood:
- Translate
specieLanguage: SikTair
# WL-Changes: Languages
- type: entity

View File

@@ -7,6 +7,14 @@
components:
- type: HumanoidAppearance
species: CorvaxVulpkanin
# WL-Change Start
hideLayersOnEquip:
- Hair
- Snout
- FacialHair
- HeadTop
- HeadSide
# WL-Change End
- type: Hunger # on 1.5x more
thresholds:
Overfed: 250
@@ -105,10 +113,9 @@
- type: Languages
speaking:
- Translate
- Kuniluc
understood:
- Translate
- Kuniluc
specieLanguage: Kuniluc
#WL-Changes: Languages end
- type: entity

View File

@@ -10,7 +10,8 @@
- type: RandomSpawner
prototypes:
- Grille
- GrilleBroken
# - GrilleBroken #Corvax-WL Changes
- ClockworkGrille #Corvax-WL Changes
chance: 1.0
placement:
mode: AlignTileAny

View File

@@ -119,10 +119,9 @@
- type: Languages
speaking:
- Translate
- RootSpeak
understood:
- Translate
- RootSpeak
specieLanguage: RootSpeak
#WL-Changes: Languages end
- type: entity

View File

@@ -20,6 +20,7 @@
hideLayersOnEquip:
- Hair
- Snout
- FacialHair # WL-Change
- type: Inventory
femaleDisplacements:
jumpsuit:
@@ -31,10 +32,9 @@
- type: Languages
speaking:
- Translate
- OldEarth
understood:
- Translate
- OldEarth
specieLanguage: OldEarth
#WL-Changes: Languages end
- type: entity

View File

@@ -182,10 +182,9 @@
- type: Languages
speaking:
- Translate
- Weaver
understood:
- Translate
- Weaver
specieLanguage: Weaver
#WL-Changes: Languages end
- type: entity

View File

@@ -123,10 +123,9 @@
- type: Languages
speaking:
- Translate
- SintaUnati
understood:
- Translate
- SintaUnati
specieLanguage: SintaUnati
#WL-Changes: Languages end
- type: entity

View File

@@ -39,6 +39,12 @@
delay: 0.5
- type: HumanoidAppearance
species: SlimePerson
# WL-Change start
hideLayersOnEquip:
- Hair
- Snout
- FacialHair
# WL-Change end
- type: Speech
speechVerb: Slime
speechSounds: Slime

View File

@@ -149,6 +149,12 @@
visible: false
- type: HumanoidAppearance
species: Vox
# WL-Change start
hideLayersOnEquip:
- Hair
- Snout
- FacialHair
# WL-Change end
undergarmentTop: UndergarmentTopTanktopVox
undergarmentBottom: UndergarmentBottomBoxersVox
markingsDisplacement:
@@ -215,10 +221,9 @@
- type: Languages
speaking:
- Translate
- VoxPigin
understood:
- Translate
- VoxPigin
specieLanguage: VoxPigin
#WL-Changes: Languages end
- type: entity

View File

@@ -1,4 +1,4 @@
- type: entity
- type: entity
abstract: true
save: false
parent: [BaseMobSpeciesOrganic]

View File

@@ -249,7 +249,7 @@
job: AtmosphericTechnician
- type: entity
parent: EngineeringIDCard
parent: IDCardStandard
id: SeniorEngineerIDCard
name: senior engineer ID card
components:
@@ -264,6 +264,8 @@
- sprite: *icon-rsi
offset: *icon-offset
state: SeniorEngineer
- type: PresetIdCard
job: SeniorEngineer
#Medical
@@ -361,7 +363,7 @@
job: Psychologist
- type: entity
parent: MedicalIDCard
parent: IDCardStandard
id: SeniorPhysicianIDCard
name: senior physician ID card
components:
@@ -375,6 +377,8 @@
- sprite: *icon-rsi
offset: *icon-offset
state: SeniorPhysician
- type: PresetIdCard
job: SeniorPhysician
#Science
@@ -415,7 +419,7 @@
job: Scientist
- type: entity
parent: ResearchIDCard
parent: IDCardStandard
id: SeniorResearcherIDCard
name: senior researcher ID card
components:
@@ -429,6 +433,8 @@
- sprite: *icon-rsi
offset: *icon-offset
state: SeniorResearcher
- type: PresetIdCard
job: SeniorResearcher
#Security
@@ -519,9 +525,11 @@
- sprite: *icon-rsi
offset: *icon-offset
state: Brigmedic
- type: PresetIdCard
job: Brigmedic
- type: entity
parent: SecurityIDCard
parent: IDCardStandard
id: SeniorOfficerIDCard
name: senior officer ID card
components:
@@ -535,6 +543,8 @@
- sprite: *icon-rsi
offset: *icon-offset
state: SeniorOfficer
- type: PresetIdCard
job: SeniorOfficer
#Service

View File

@@ -327,6 +327,8 @@
solutions:
absorbed:
maxVol: 30
- type: CleansForensics
cleanDelay: 10
- type: UseDelay
delay: 1.5
- type: Tag

View File

@@ -18,6 +18,13 @@
equipment:
head: ClothingHeadHatBowlerHat
# WL-Changes: Bartender Bartender eyes loadout Start
- type: loadout
id: BartenderHudBeer
equipment:
eyes: ClothingEyesHudBeer
# WL-Changes: Bartender Bartender eyes loadout End
# Jumpsuit
- type: loadout
id: BartenderJumpsuit

View File

@@ -309,6 +309,18 @@
- BartenderHead
- BartenderBowler
# WL-Changes: Bartender Bartender eyes loadout Start
- type: loadoutGroup
id: BartenderEyewear
name: loadout-group-bartender-glasses
minLimit: 0
loadouts:
- BartenderHudBeer
- Glasses
- GlassesJamjar
- GlassesJensen
# WL-Changes: Bartender Bartender eyes loadout End
- type: loadoutGroup
id: BartenderJumpsuit
name: loadout-group-bartender-jumpsuit

View File

@@ -71,7 +71,7 @@
- BartenderJumpsuit
- CommonBackpack
- BartenderOuterClothing
- Glasses
- BartenderEyewear # WL-Changes: Bartender eyes loadout
- Survival
- Trinkets
- WLNeck # WL-Changes: Neck add

View File

@@ -226,9 +226,9 @@
- !type:HealthChange
# WL species start
conditions:
# Golem
# Golem, Android
- !type:MetabolizerTypeCondition
type: [ Golem ]
type: [ Golem, Biorobotic ]
inverted: true
# WL species end
- !type:MetabolizerTypeCondition
@@ -259,6 +259,15 @@
conditions:
- !type:MetabolizerTypeCondition
type: [ Golem ]
Medicine:
effects:
- !type:ModifyBloodLevel
conditions:
- !type:MetabolizerTypeCondition
# Android
type: [ Biorobotic ]
amount: 0.5
# WL species end
- type: reagent

View File

@@ -17,6 +17,7 @@
accent: dwarf
- type: GrowlingAccent # Corvax-Vulps
- type: OwOAccent
- type: CischiAccent # WL-Change
# 1 Cost

View File

@@ -26,6 +26,13 @@
- type: Item
storedRotation: -90
- type: IdentityBlocker
- type: HideLayerClothing
slots:
- Hair
- Snout
- FacialHair
- HeadTop
- HeadSide
- type: entity
abstract: true

View File

@@ -1,7 +1,7 @@
- type: marking
- type: marking
id: UndershirtShirtBand
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine, Murine]
forcedColoring: true
coloring:
@@ -15,8 +15,8 @@
- type: marking
id: UndershirtPoloBlue
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -30,8 +30,8 @@
- type: marking
id: UndershirtShirtSportBlue
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -45,8 +45,8 @@
- type: marking
id: UndershirtPoloGrayYellow
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -60,8 +60,8 @@
- type: marking
id: UndershirtShirtSportGreen
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -75,8 +75,8 @@
- type: marking
id: UndershirtShirtIan
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -90,8 +90,8 @@
- type: marking
id: UndershirtShirtIlovent
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -105,8 +105,8 @@
- type: marking
id: UndershirtShirtLover
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -120,8 +120,8 @@
- type: marking
id: UndershirtShirtMatroska
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -135,8 +135,8 @@
- type: marking
id: UndershirtShirtPeace
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -150,8 +150,8 @@
- type: marking
id: UndershirtShirtPogoman
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -165,8 +165,8 @@
- type: marking
id: UndershirtPoloRed
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -180,8 +180,8 @@
- type: marking
id: UndershirtShirtSportRed
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -195,8 +195,8 @@
- type: marking
id: UndershirtTopRed
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -210,8 +210,8 @@
- type: marking
id: UndershirtShirtAlien
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -225,8 +225,8 @@
- type: marking
id: UndershirtShirtAssblastusa
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -240,8 +240,8 @@
- type: marking
id: UndershirtJerseyBlue
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -255,8 +255,8 @@
- type: marking
id: UndershirtShirtClown
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -270,8 +270,8 @@
- type: marking
id: UndershirtShirtCommie
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -285,8 +285,8 @@
- type: marking
id: UndershirtShirtMeat
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -300,8 +300,8 @@
- type: marking
id: UndershirtShirtNano
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -315,8 +315,8 @@
- type: marking
id: UndershirtShirtQuestion
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -330,8 +330,8 @@
- type: marking
id: UndershirtJerseyRed
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -345,8 +345,8 @@
- type: marking
id: UndershirtShirtSkull
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -360,8 +360,8 @@
- type: marking
id: UndershirtShirtSS14
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -375,8 +375,8 @@
- type: marking
id: UndershirtShirtStripes
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -390,8 +390,8 @@
- type: marking
id: UndershirtShirtTiedye
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -405,8 +405,8 @@
- type: marking
id: UndershirtShirtWhite
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
coloring:
default:
@@ -419,8 +419,8 @@
- type: marking
id: UndershirtBraSports
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Female
coloring:
@@ -434,8 +434,8 @@
- type: marking
id: UndershirtBraSportsAlt
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Female
coloring:
@@ -449,8 +449,8 @@
- type: marking
id: UndershirtTankFire
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -464,8 +464,8 @@
- type: marking
id: UndershirtTankMidriff
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Female
coloring:
@@ -479,8 +479,8 @@
- type: marking
id: UndershirtTankStripes
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -494,8 +494,8 @@
- type: marking
id: UndershirtShirtUK
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
forcedColoring: true
coloring:
@@ -509,8 +509,8 @@
- type: marking
id: UndershirtPoloWhite
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
coloring:
default:
@@ -523,8 +523,8 @@
- type: marking
id: UndershirtShortSleeveWhite
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
coloring:
default:
@@ -537,8 +537,8 @@
- type: marking
id: UndershirtTopWhite
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Female
coloring:

View File

@@ -1,8 +1,8 @@
# Male
# Male
- type: marking
id: UnderwearMaleMidway
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Male
coloring:
@@ -16,8 +16,8 @@
- type: marking
id: UnderwearMaleStripe
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Male
coloring:
@@ -31,8 +31,8 @@
- type: marking
id: UnderwearMaleUk
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Male
forcedColoring: true
@@ -47,8 +47,8 @@
- type: marking
id: UnderwearMankini
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Male
coloring:
@@ -62,8 +62,8 @@
- type: marking
id: UnderwearLongjohns
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Male
coloring:
@@ -77,8 +77,8 @@
- type: marking
id: UnderwearMaleKinky
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Male
coloring:
@@ -92,8 +92,8 @@
- type: marking
id: UnderwearMaleHearts
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Male
forcedColoring: true
@@ -108,8 +108,8 @@
- type: marking
id: UnderwearMaleCommie
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Male
forcedColoring: true
@@ -124,8 +124,8 @@
- type: marking
id: UnderwearMaleBriefs
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Male
coloring:
@@ -139,8 +139,8 @@
- type: marking
id: UnderwearMaleBoxers
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Male
coloring:
@@ -154,8 +154,8 @@
- type: marking
id: UnderwearMaleAssblastusa
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
speciesRestriction: [Human, SlimePerson, Dwarf, Reptilian, Moth, Arachnid, Akula, Felinid, HumanoidKidanes, Vulpkanines, Android, Murine]
sexRestriction: Male
forcedColoring: true
@@ -171,8 +171,8 @@
# Female
- type: marking
id: UnderwearFemaleUk
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
sexRestriction: Female
forcedColoring: true
coloring:
@@ -186,8 +186,8 @@
- type: marking
id: UnderwearFemaleThong
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
sexRestriction: Female
coloring:
default:
@@ -200,8 +200,8 @@
- type: marking
id: UnderwearFemaleStrapless
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
sexRestriction: Female
coloring:
default:
@@ -214,8 +214,8 @@
- type: marking
id: UnderwearFemaleSport
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
sexRestriction: Female
coloring:
default:
@@ -228,8 +228,8 @@
- type: marking
id: UnderwearFemaleNeko
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
sexRestriction: Female
coloring:
default:
@@ -242,8 +242,8 @@
- type: marking
id: UnderwearFemaleLace
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
sexRestriction: Female
forcedColoring: true
coloring:
@@ -257,8 +257,8 @@
- type: marking
id: UnderwearFemaleKinky
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
sexRestriction: Female
forcedColoring: true
coloring:
@@ -272,8 +272,8 @@
- type: marking
id: UnderwearFemaleCommie
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
sexRestriction: Female
forcedColoring: true
coloring:
@@ -287,8 +287,8 @@
- type: marking
id: UnderwearFemaleBralette
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
sexRestriction: Female
coloring:
default:
@@ -301,8 +301,8 @@
- type: marking
id: UnderwearFemaleBikini
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
sexRestriction: Female
coloring:
default:
@@ -315,8 +315,8 @@
- type: marking
id: UnderwearFemaleBabydoll
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
sexRestriction: Female
coloring:
default:
@@ -329,8 +329,8 @@
- type: marking
id: UnderwearFemaleAssblastusa
bodyPart: UndergarmentTop
markingCategory: UndergarmentTop
bodyPart: UndergarmentBottom
markingCategory: UndergarmentBottom
sexRestriction: Female
forcedColoring: true
coloring:

View File

@@ -34,10 +34,9 @@
- type: Languages
speaking:
- Translate
- Sarengis
understood:
- Translate
- Sarengis
specieLanguage: Sarengis
- type: entity
save: false

View File

@@ -110,6 +110,10 @@
thermalRegulationTemperatureThreshold: 25
- type: HumanoidAppearance
species: Android
hideLayersOnEquip:
- Hair
- Snout
- FacialHair
- type: Body
prototype: Android
requiredLegs: 2
@@ -227,10 +231,9 @@
- type: Languages
speaking:
- Translate
- Ternary
understood:
- Translate
- Ternary
specieLanguage: Ternary
- type: MobCollision # WL-Changes: MobCollision works for players only
- type: OfferItem # CorvaxGoob-Offer

View File

@@ -9,6 +9,10 @@
- type: Thirst
- type: HumanoidAppearance
species: Cischi
hideLayersOnEquip:
- Hair
- Snout
- FacialHair
- type: Damageable
damageModifierSet: Cischi
- type: Inventory
@@ -103,6 +107,7 @@
- Translate
understood:
- Translate
- type: NoSlip
- type: entity
save: false

View File

@@ -12,6 +12,12 @@
Unsexed: MaleFelinid
- type: HumanoidAppearance
species: Felinid
hideLayersOnEquip:
- Hair
- Snout
- FacialHair
- HeadTop
- HeadSide
- type: Body
prototype: Felinid
# - type: Damageable
@@ -58,10 +64,9 @@
- type: Languages
speaking:
- Translate
- OldEarth
understood:
- Translate
- OldEarth
specieLanguage: OldEarth
- type: Inventory
femaleDisplacements:
jumpsuit:

View File

@@ -7,6 +7,12 @@
components:
- type: HumanoidAppearance
species: Murine
hideLayersOnEquip:
- Hair
- Snout
- FacialHair
- HeadTop
- HeadSide
- type: Body
prototype: HumanoidMurine
requiredLegs: 2
@@ -53,13 +59,12 @@
speechVerb: SmallMob
audioParams:
volume: -5
#WL-Changes: Languages start
- type: Languages
speaking:
- Translate
understood:
- Translate
#WL-Changes: Languages end
specieLanguage: Urlum
- type: AddHeightItem
- type: entity

View File

@@ -11,6 +11,10 @@
- state: locked
map: ["enum.LockVisualLayers.Lock"]
shader: unshaded
- state: paper
visible: false
sprite: _WL/Objects/Storage/ManualStorage/Paper/labels.rsi
map: ["enum.PaperLabelVisuals.Layer"]
- type: Item
sprite: _WL/Objects/Storage/ManualStorage/Command/small.rsi
- type: AccessReader

View File

@@ -9,6 +9,10 @@
layers:
- map: [ base ]
state: icon
- state: paper
visible: false
sprite: _WL/Objects/Storage/ManualStorage/Paper/labels.rsi
map: ["enum.PaperLabelVisuals.Layer"]
- type: Item
sprite: _WL/Objects/Storage/ManualStorage/Default/small.rsi
size: Large

View File

@@ -11,6 +11,10 @@
- state: locked
map: ["enum.LockVisualLayers.Lock"]
shader: unshaded
- state: paper
visible: false
sprite: _WL/Objects/Storage/ManualStorage/Paper/labels.rsi
map: ["enum.PaperLabelVisuals.Layer"]
- type: Item
sprite: _WL/Objects/Storage/ManualStorage/Security/small.rsi
- type: AccessReader

View File

@@ -0,0 +1,131 @@
- type: language
id: Wingdings
name: language-wingdings
description: language-wingdings-desc
color: '#a6a6a6'
keylang: 'ж'
needtts: false
emoting: true
radioPass: 0
pressurePass: 1
obfuscation:
!type:LengthObfuscation
replacement:
- показывает жест
- показывает несколько жестов
- быстро показывает множество различных жестов
icon:
sprite: /Textures/_WL/Interface/Languages/languages.rsi
state: hand
- type: language
id: TopTranslate
name: language-toptranslate
description: language-toptranslate-desc
color: '#00c5d7'
keylang: 'ш'
obfuscation:
!type:ByCharReplacementObfuscation
replacement:
- les
- as
- ter
- ro
- ew
- wote
- im
- um
- un
- nu
- ret
- w
- a
- b
- hes
- je
- uex
- xer
- x
- th
- tho
- the
- tha
- ro
- ium
- lam
- terr
- jo
- je
- re
- la
- le
- xlo
- ry
- y
- thx
icon:
sprite: /Textures/_WL/Interface/Languages/languages.rsi
state: top
- type: language
id: BottomTranslate
name: language-bottomtranslate
description: language-bottomtranslate-desc
color: '#963a1e'
keylang: 'ц'
obfuscation:
!type:ByCharReplacementObfuscation
replacement:
- e
- a
- i
- o
- u
- re
- lo
- ke
- tu
- ru
- fi
- ti
- m
- d
- s
- k
- t
- p
- oo
icon:
sprite: /Textures/_WL/Interface/Languages/languages.rsi
state: bottom
- type: language
id: Urhas
name: language-urhs
description: language-urhs-desc
color: '#470806'
keylang: 'х'
obfuscation:
!type:ByCharReplacementObfuscation
replacement:
- r
- s
- h
- k
- t
- a
- ss
- so
- se
- h
- he
- ro
- ta
- o
- e
- u
- k
- ka
icon:
sprite: /Textures/_WL/Interface/Languages/languages.rsi
state: urhs

View File

@@ -1,17 +1,3 @@
- type: language
id: BaseLang
name: Base language
description: Base language description.
abstract: true
needtts: true
obfuscation:
!type:ReplacementObfuscation
replacement:
- base
icon:
sprite: /Textures/_WL/Interface/Languages/languages.rsi
state: default
- type: language
id: Translate
name: language-translate
@@ -99,31 +85,33 @@
color: '#ede028'
keylang: 'у'
obfuscation:
!type:WordsReplacementObfuscation
!type:ByCharReplacementObfuscation
replacement:
- weh
- sswah
- hassi
- shis
- khwasi
- ashwa
- ihhsa
- assihi
- hissa
- essewa
- wssahhi
- ehess
- hesso
- awsssai
- essewa
- ssihisa
- shirskl
- we
- s
- i
- ss
- te
- re
- so
- tsso
- tesso
- asi
- attater
- he
- su
- ky
- i
- s
- w
- e
- h
- h
- weh
- l
- s
- o
- f
- h
- k
- c
- r
icon:
sprite: /Textures/_WL/Interface/Languages/languages.rsi
state: unati
@@ -176,8 +164,11 @@
description: language-weaver-desc
color: '#f5ee8c'
keylang: 'н'
emoting: true
radioPass: .9
pressurePass: .4
obfuscation:
!type:EmoteObfuscation
!type:LengthObfuscation
replacement:
- пищит
- щебечет
@@ -195,7 +186,7 @@
color: '#03b5fc'
keylang: 'а'
needtts: false
needsound: true
customSound: true
sound:
collection: TernarySounds
obfuscation:
@@ -214,8 +205,11 @@
description: language-rootspeak-desc
color: '#309100'
keylang: 'д'
emoting: true
radioPass: .3
pressurePass: .4
obfuscation:
!type:EmoteObfuscation
!type:LengthObfuscation
replacement:
- шуршит
- трещит ветками
@@ -232,8 +226,9 @@
color: "#8bebb3"
keylang: 'с'
needtts: false
emoting: true
obfuscation:
!type:EmoteObfuscation
!type:LengthObfuscation
replacement:
- булькает
- несколько раз булькает
@@ -276,33 +271,33 @@
sprite: /Textures/_WL/Interface/Languages/languages.rsi
state: vox
- type: entity
parent: MobDebugRandomCounter
id: MobDebugCounterLanguageSmart
name: language tester
description: He can language
suffix: DEBUG, LANG
components:
- type: Languages
understood:
- Translate
- OldEarth
- SintaUnati
- Sarengis
- Weaver
- Ternary
- RootSpeak
- Slimish
- VoxPigin
- Kuniluc
speaking:
- Translate
- OldEarth
- SintaUnati
- Sarengis
- Weaver
- Ternary
- RootSpeak
- Slimish
- VoxPigin
- Kuniluc
- type: language
id: Urlum
name: language-urlum
description: language-urlum-desc
color: "#999999"
keylang: 'м'
needtts: false
emoting: true
obfuscation:
!type:LengthObfuscation
replacement:
- слегка попискивает
- пищит
icon:
sprite: /Textures/_WL/Interface/Languages/languages.rsi
state: murine
- type: language
id: SikTair
name: language-siktair
description: language-siktair-desc
color: '#00ccaa'
keylang: 'я'
obfuscation:
!type:Utf16ReplacementObfuscation
utf16start: 224
utf16end: 382
icon:
sprite: /Textures/_WL/Interface/Languages/languages.rsi
state: default

View File

@@ -51,7 +51,7 @@
# science
SeniorResearcher: [ 1, 1 ]
Scientist: [ 2, 2 ]
Scientist: [ 3, 3 ]
ResearchAssistant: [ 2, 2 ]
# security

View File

@@ -1,109 +1,37 @@
- type: dungeonRoom
id: MaintsPaperZooBottomA
size: 3,3
size: 6,3
atlas: /Maps/_WL/Dungeon/wl_paper_zoo.yml
offset: 1,1
tags:
- StationElementZOOPaperBOTTOM
- StationElementZOOPaper
- type: dungeonRoom
id: MaintsPaperZooBottomB
size: 3,3
size: 6,3
atlas: /Maps/_WL/Dungeon/wl_paper_zoo.yml
offset: 5,1
offset: 8,1
tags:
- StationElementZOOPaperBOTTOM
- StationElementZOOPaper
- type: dungeonRoom
id: MaintsPaperZooBottomC
size: 3,3
size: 6,3
atlas: /Maps/_WL/Dungeon/wl_paper_zoo.yml
offset: 9,1
offset: 15,1
tags:
- StationElementZOOPaperBOTTOM
- type: dungeonRoom
id: MaintsPaperZooBottomD
size: 3,3
atlas: /Maps/_WL/Dungeon/wl_paper_zoo.yml
offset: 13,1
tags:
- StationElementZOOPaperBOTTOM
- type: dungeonRoom
id: MaintsPaperZooBottomE
size: 3,3
atlas: /Maps/_WL/Dungeon/wl_paper_zoo.yml
offset: 17,1
tags:
- StationElementZOOPaperBOTTOM
- type: dungeonRoom
id: MaintsPaperZooTopA
size: 3,3
atlas: /Maps/_WL/Dungeon/wl_paper_zoo.yml
offset: 1,5
tags:
- StationElementZOOPaperTOP
- type: dungeonRoom
id: MaintsPaperZooTopB
size: 3,3
atlas: /Maps/_WL/Dungeon/wl_paper_zoo.yml
offset: 5,5
tags:
- StationElementZOOPaperTOP
- type: dungeonRoom
id: MaintsPaperZooTopC
size: 3,3
atlas: /Maps/_WL/Dungeon/wl_paper_zoo.yml
offset: 9,5
tags:
- StationElementZOOPaperTOP
- type: dungeonRoom
id: MaintsPaperZooTopD
size: 3,3
atlas: /Maps/_WL/Dungeon/wl_paper_zoo.yml
offset: 13,5
tags:
- StationElementZOOPaperTOP
- type: dungeonRoom
id: MaintsPaperZooTopE
size: 3,3
atlas: /Maps/_WL/Dungeon/wl_paper_zoo.yml
offset: 17,5
tags:
- StationElementZOOPaperTOP
- StationElementZOOPaper
- type: entity
parent: BaseRoomMarker
id: StationElementsZOOTOPPaperRoomMarker
name: Paper Zoo TOP
suffix: 3x3, Paper
components:
- type: RoomFill
minSize: 3,3
maxSize: 3,3
roomWhitelist:
tags:
- StationElementZOOPaperTOP
- type: entity
parent: BaseRoomMarker
id: StationElementsZOOBOTTOMPaperRoomMarker
id: StationElementsZOOPaperRoomMarker
name: Paper Zoo BOTTOM
suffix: 3x3, Paper
suffix: 6x3, Paper
components:
- type: RoomFill
minSize: 3,3
maxSize: 3,3
minSize: 6,3
maxSize: 6,3
roomWhitelist:
tags:
- StationElementZOOPaperBOTTOM
- StationElementZOOPaper

View File

@@ -1 +1,102 @@
# If you add a new trait, make sure to add the corresponding component to the whitelist in \Resources\Prototypes\Entities\Mobs\Player\clone.yml so it gets copied to clones correctly!
- type: traitCategory
id: Languages
name: trait-category-languages
maxTraitPoints: 2
- type: trait
id: UnSpecie
name: trait-language-unspecie
description: trait-language-unspecie-desc
category: Languages
cost: -1
whitelist:
components:
- Languages
components:
- type: ModifyLanguages
specieLanguage: true
- type: trait
id: OldEarth
name: trait-language-oldearth
description: trait-language-oldearth-desc
category: Languages
cost: 3
whitelist:
components:
- Languages
components:
- type: ModifyLanguages
languages:
- OldEarth
- type: trait
id: SintaUnati
name: trait-language-sinta
description: trait-language-sinta-desc
category: Languages
cost: 1
whitelist:
components:
- Languages
components:
- type: ModifyLanguages
languages:
- SintaUnati
- type: trait
id: Urhas
name: trait-language-urhs
description: trait-language-urhs-desc
category: Languages
cost: 1
whitelist:
components:
- Languages
components:
- type: ModifyLanguages
languages:
- Urhas
- type: trait
id: TopTranslate
name: trait-language-top
description: trait-language-top-desc
category: Languages
cost: 2
whitelist:
components:
- Languages
components:
- type: ModifyLanguages
languages:
- TopTranslate
- type: trait
id: BottomTranslate
name: trait-language-bottom
description: trait-language-bottom-desc
category: Languages
cost: 1
whitelist:
components:
- Languages
components:
- type: ModifyLanguages
languages:
- BottomTranslate
- type: trait
id: Wingdings
name: trait-language-wingdings
description: trait-language-wingdings-desc
category: Languages
cost: 1
whitelist:
components:
- Languages
components:
- type: ModifyLanguages
languages:
- Wingdings

View File

@@ -0,0 +1,3 @@
- type: font
id: WingdingsPixel
path: /Fonts/_WL/Pixelated-Wingdings.ttf

View File

@@ -20,10 +20,7 @@
id: MaintsCMOPaper
- type: Tag
id: StationElementZOOPaperTOP
- type: Tag
id: StationElementZOOPaperBOTTOM
id: StationElementZOOPaper
- type: Tag
id: MaintsPaperAproved

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 B

View File

@@ -23,6 +23,10 @@
"name": "equipped-MASK-vox",
"directions": 4
},
{
"name": "equipped-MASK-moth",
"directions": 4
},
{
"name": "up-equipped-MASK",
"directions": 4
@@ -31,6 +35,10 @@
"name": "up-equipped-MASK-vox",
"directions": 4
},
{
"name": "up-equipped-MASK-moth",
"directions": 4
},
{
"name": "inhand-left",
"directions": 4

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 495 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 600 B

View File

@@ -52,6 +52,18 @@
{
"name": "sareng"
},
{
"name": "top"
},
{
"name": "bottom"
},
{
"name": "hand"
},
{
"name": "urhs"
},
{
"name": "slime"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 474 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 422 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 KiB