Merge pull request #133 from crystallpunk-14/04-05-2024-upstream

04 05 2024 upstream
This commit is contained in:
Ed
2024-05-04 21:35:22 +03:00
committed by GitHub
144 changed files with 1514 additions and 307 deletions

View File

@@ -2,7 +2,4 @@ using Content.Shared.Station;
namespace Content.Client.Station;
public sealed class StationSpawningSystem : SharedStationSpawningSystem
{
}
public sealed class StationSpawningSystem : SharedStationSpawningSystem;

View File

@@ -64,7 +64,8 @@ namespace Content.IntegrationTests.Tests.Utility
var testMap = await pair.CreateTestMap();
var mapCoordinates = testMap.MapCoords;
var sEntities = server.ResolveDependency<IEntityManager>();
var sEntities = server.EntMan;
var sys = server.System<EntityWhitelistSystem>();
await server.WaitAssertion(() =>
{
@@ -80,22 +81,14 @@ namespace Content.IntegrationTests.Tests.Utility
Components = new[] { $"{ValidComponent}" },
Tags = new() { "WhitelistTestValidTag" }
};
whitelistInst.UpdateRegistrations();
Assert.That(whitelistInst, Is.Not.Null);
Assert.Multiple(() =>
{
Assert.That(whitelistInst.Components, Is.Not.Null);
Assert.That(whitelistInst.Tags, Is.Not.Null);
});
Assert.That(sys.IsValid(whitelistInst, validComponent), Is.True);
Assert.That(sys.IsValid(whitelistInst, WhitelistTestValidTag), Is.True);
Assert.Multiple(() =>
{
Assert.That(whitelistInst.IsValid(validComponent), Is.True);
Assert.That(whitelistInst.IsValid(WhitelistTestValidTag), Is.True);
Assert.That(whitelistInst.IsValid(invalidComponent), Is.False);
Assert.That(whitelistInst.IsValid(WhitelistTestInvalidTag), Is.False);
Assert.That(sys.IsValid(whitelistInst, invalidComponent), Is.False);
Assert.That(sys.IsValid(whitelistInst, WhitelistTestInvalidTag), Is.False);
});
// Test from serialized
@@ -111,11 +104,11 @@ namespace Content.IntegrationTests.Tests.Utility
Assert.Multiple(() =>
{
Assert.That(whitelistSer.IsValid(validComponent), Is.True);
Assert.That(whitelistSer.IsValid(WhitelistTestValidTag), Is.True);
Assert.That(sys.IsValid(whitelistSer, validComponent), Is.True);
Assert.That(sys.IsValid(whitelistSer, WhitelistTestValidTag), Is.True);
Assert.That(whitelistSer.IsValid(invalidComponent), Is.False);
Assert.That(whitelistSer.IsValid(WhitelistTestInvalidTag), Is.False);
Assert.That(sys.IsValid(whitelistSer, invalidComponent), Is.False);
Assert.That(sys.IsValid(whitelistSer, WhitelistTestInvalidTag), Is.False);
});
});
await pair.CleanReturnAsync();

View File

@@ -96,6 +96,16 @@ public sealed class AlertLevelSystem : EntitySystem
RaiseLocalEvent(new AlertLevelPrototypeReloadedEvent());
}
public string GetLevel(EntityUid station, AlertLevelComponent? alert = null)
{
if (!Resolve(station, ref alert))
{
return string.Empty;
}
return alert.CurrentLevel;
}
public float GetAlertLevelDelay(EntityUid station, AlertLevelComponent? alert = null)
{
if (!Resolve(station, ref alert))

View File

@@ -12,9 +12,10 @@ namespace Content.Server.Atmos.Components
/// <summary>
/// Tool is functional only in allowed slots
/// </summary>
[DataField("allowedSlots")]
[DataField]
public SlotFlags AllowedSlots = SlotFlags.MASK | SlotFlags.HEAD;
public bool IsFunctional;
public EntityUid? ConnectedInternalsEntity;
}
}

View File

@@ -8,6 +8,7 @@ using Content.Shared.DoAfter;
using Content.Shared.Hands.Components;
using Content.Shared.Internals;
using Content.Shared.Inventory;
using Content.Shared.Roles;
using Content.Shared.Verbs;
using Robust.Shared.Containers;
using Robust.Shared.Utility;
@@ -23,17 +24,29 @@ public sealed class InternalsSystem : EntitySystem
[Dependency] private readonly InventorySystem _inventory = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
public const SlotFlags InventorySlots = SlotFlags.POCKET | SlotFlags.BELT;
private EntityQuery<InternalsComponent> _internalsQuery;
public override void Initialize()
{
base.Initialize();
_internalsQuery = GetEntityQuery<InternalsComponent>();
SubscribeLocalEvent<InternalsComponent, InhaleLocationEvent>(OnInhaleLocation);
SubscribeLocalEvent<InternalsComponent, ComponentStartup>(OnInternalsStartup);
SubscribeLocalEvent<InternalsComponent, ComponentShutdown>(OnInternalsShutdown);
SubscribeLocalEvent<InternalsComponent, GetVerbsEvent<InteractionVerb>>(OnGetInteractionVerbs);
SubscribeLocalEvent<InternalsComponent, InternalsDoAfterEvent>(OnDoAfter);
SubscribeLocalEvent<StartingGearEquippedEvent>(OnStartingGear);
}
private void OnStartingGear(ref StartingGearEquippedEvent ev)
{
if (!_internalsQuery.TryComp(ev.Entity, out var internals) || internals.BreathToolEntity == null)
return;
ToggleInternals(ev.Entity, ev.Entity, force: false, internals);
}
private void OnGetInteractionVerbs(
@@ -217,7 +230,7 @@ public sealed class InternalsSystem : EntitySystem
if (component.BreathToolEntity is null || !AreInternalsWorking(component))
return 2;
// If pressure in the tank is below low pressure threshhold, flash warning on internals UI
// If pressure in the tank is below low pressure threshold, flash warning on internals UI
if (TryComp<GasTankComponent>(component.GasTankEntity, out var gasTank)
&& gasTank.IsLowPressure)
{

View File

@@ -26,7 +26,7 @@ public abstract partial class GameRuleSystem<T> : EntitySystem where T : ICompon
SubscribeLocalEvent<T, GameRuleAddedEvent>(OnGameRuleAdded);
SubscribeLocalEvent<T, GameRuleStartedEvent>(OnGameRuleStarted);
SubscribeLocalEvent<T, GameRuleEndedEvent>(OnGameRuleEnded);
SubscribeLocalEvent<T, RoundEndTextAppendEvent>(OnRoundEndTextAppend);
SubscribeLocalEvent<RoundEndTextAppendEvent>(OnRoundEndTextAppend);
}
private void OnStartAttempt(RoundStartAttemptEvent args)
@@ -70,11 +70,16 @@ public abstract partial class GameRuleSystem<T> : EntitySystem where T : ICompon
Ended(uid, component, ruleData, args);
}
private void OnRoundEndTextAppend(Entity<T> ent, ref RoundEndTextAppendEvent args)
private void OnRoundEndTextAppend(RoundEndTextAppendEvent ev)
{
if (!TryComp<GameRuleComponent>(ent, out var ruleData))
return;
AppendRoundEndText(ent, ent, ruleData, ref args);
var query = AllEntityQuery<T>();
while (query.MoveNext(out var uid, out var comp))
{
if (!TryComp<GameRuleComponent>(uid, out var ruleData))
continue;
AppendRoundEndText(uid, comp, ruleData, ref ev);
}
}
/// <summary>

View File

@@ -1,7 +1,7 @@
using Content.Server.Actions;
using Content.Server.Polymorph.Systems;
using Content.Shared.Zombies;
using Content.Server.Actions;
using Content.Server.Popups;
using Content.Shared.Actions;
using Content.Shared.Geras;
using Robust.Shared.Player;
@@ -10,8 +10,9 @@ namespace Content.Server.Geras;
/// <inheritdoc/>
public sealed class GerasSystem : SharedGerasSystem
{
[Dependency] private readonly ActionsSystem _actionsSystem = default!;
[Dependency] private readonly PolymorphSystem _polymorphSystem = default!;
[Dependency] private readonly MetaDataSystem _metaDataSystem = default!;
[Dependency] private readonly ActionsSystem _actionsSystem = default!;
[Dependency] private readonly PopupSystem _popupSystem = default!;
/// <inheritdoc/>
@@ -19,6 +20,12 @@ public sealed class GerasSystem : SharedGerasSystem
{
SubscribeLocalEvent<GerasComponent, MorphIntoGeras>(OnMorphIntoGeras);
SubscribeLocalEvent<GerasComponent, MapInitEvent>(OnMapInit);
SubscribeLocalEvent<GerasComponent, EntityZombifiedEvent>(OnZombification);
}
private void OnZombification(EntityUid uid, GerasComponent component, EntityZombifiedEvent args)
{
_actionsSystem.RemoveAction(uid, component.GerasActionEntity);
}
private void OnMapInit(EntityUid uid, GerasComponent component, MapInitEvent args)
@@ -29,6 +36,9 @@ public sealed class GerasSystem : SharedGerasSystem
private void OnMorphIntoGeras(EntityUid uid, GerasComponent component, MorphIntoGeras args)
{
if (HasComp<ZombieComponent>(uid))
return; // i hate zomber.
var ent = _polymorphSystem.PolymorphEntity(uid, component.GerasPolymorphId);
if (!ent.HasValue)
@@ -36,6 +46,7 @@ public sealed class GerasSystem : SharedGerasSystem
_popupSystem.PopupEntity(Loc.GetString("geras-popup-morph-message-others", ("entity", ent.Value)), ent.Value, Filter.PvsExcept(ent.Value), true);
_popupSystem.PopupEntity(Loc.GetString("geras-popup-morph-message-user"), ent.Value, ent.Value);
args.Handled = true;
}
}

View File

@@ -32,5 +32,11 @@ namespace Content.Server.Speech.Components
{
[DataField("accent", customTypeSerializer: typeof(PrototypeIdSerializer<ReplacementAccentPrototype>), required: true)]
public string Accent = default!;
/// <summary>
/// Allows you to substitute words, not always, but with some chance
/// </summary>
[DataField]
public float ReplacementChance = 1f;
}
}

View File

@@ -24,6 +24,9 @@ namespace Content.Server.Speech.EntitySystems
private void OnAccent(EntityUid uid, ReplacementAccentComponent component, AccentGetEvent args)
{
if (!_random.Prob(component.ReplacementChance))
return;
args.Message = ApplyReplacements(args.Message, component.Accent);
}
@@ -46,6 +49,12 @@ namespace Content.Server.Speech.EntitySystems
if (prototype.WordReplacements == null)
return message;
// Prohibition of repeated word replacements.
// All replaced words placed in the final message are placed here as dashes (___) with the same length.
// The regex search goes through this buffer message, from which the already replaced words are crossed out,
// ensuring that the replaced words cannot be replaced again.
var maskMessage = message;
foreach (var (first, replace) in prototype.WordReplacements)
{
var f = _loc.GetString(first);
@@ -53,10 +62,10 @@ namespace Content.Server.Speech.EntitySystems
// this is kind of slow but its not that bad
// essentially: go over all matches, try to match capitalization where possible, then replace
// rather than using regex.replace
for (int i = Regex.Count(message, $@"(?<!\w){f}(?!\w)", RegexOptions.IgnoreCase); i > 0; i--)
for (int i = Regex.Count(maskMessage, $@"(?<!\w){f}(?!\w)", RegexOptions.IgnoreCase); i > 0; i--)
{
// fetch the match again as the character indices may have changed
Match match = Regex.Match(message, $@"(?<!\w){f}(?!\w)", RegexOptions.IgnoreCase);
Match match = Regex.Match(maskMessage, $@"(?<!\w){f}(?!\w)", RegexOptions.IgnoreCase);
var replacement = r;
// Intelligently replace capitalization
@@ -80,6 +89,8 @@ namespace Content.Server.Speech.EntitySystems
// In-place replace the match with the transformed capitalization replacement
message = message.Remove(match.Index, match.Length).Insert(match.Index, replacement);
string mask = new string('_', match.Length);
maskMessage = message.Remove(match.Index, match.Length).Insert(match.Index, mask);
}
}

View File

@@ -59,6 +59,7 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem
/// <inheritdoc/>
public override void Initialize()
{
base.Initialize();
Subs.CVar(_configurationManager, CCVars.ICRandomCharacters, e => _randomizeCharacters = e, true);
_spawnerCallbacks = new Dictionary<SpawnPriorityPreference, Action<PlayerSpawningEvent>>()
@@ -181,7 +182,7 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem
if (prototype?.StartingGear != null)
{
var startingGear = _prototypeManager.Index<StartingGearPrototype>(prototype.StartingGear);
EquipStartingGear(entity.Value, startingGear);
EquipStartingGear(entity.Value, startingGear, raiseEvent: false);
}
// Run loadouts after so stuff like storage loadouts can get
@@ -217,11 +218,14 @@ public sealed class StationSpawningSystem : SharedStationSpawningSystem
}
// Handle any extra data here.
EquipStartingGear(entity.Value, startingGear);
EquipStartingGear(entity.Value, startingGear, raiseEvent: false);
}
}
}
var gearEquippedEv = new StartingGearEquippedEvent(entity.Value);
RaiseLocalEvent(entity.Value, ref gearEquippedEv, true);
if (profile != null)
{
if (prototype != null)

View File

@@ -0,0 +1,15 @@
using Content.Server.StationEvents.Events;
using Content.Server.AlertLevel;
using Robust.Shared.Prototypes;
namespace Content.Server.StationEvents.Components;
[RegisterComponent, Access(typeof(AlertLevelInterceptionRule))]
public sealed partial class AlertLevelInterceptionRuleComponent : Component
{
/// <summary>
/// Alert level to set the station to when the event starts.
/// </summary>
[DataField]
public string AlertLevel = "blue";
}

View File

@@ -0,0 +1,23 @@
using Content.Server.GameTicking.Components;
using Content.Server.StationEvents.Components;
using Content.Server.AlertLevel;
namespace Content.Server.StationEvents.Events;
public sealed class AlertLevelInterceptionRule : StationEventSystem<AlertLevelInterceptionRuleComponent>
{
[Dependency] private readonly AlertLevelSystem _alertLevelSystem = default!;
protected override void Started(EntityUid uid, AlertLevelInterceptionRuleComponent component, GameRuleComponent gameRule,
GameRuleStartedEvent args)
{
base.Started(uid, component, gameRule, args);
if (!TryGetRandomStation(out var chosenStation))
return;
if (_alertLevelSystem.GetLevel(chosenStation.Value) != "green")
return;
_alertLevelSystem.SetLevel(chosenStation.Value, component.AlertLevel, true, true, true);
}
}

View File

@@ -3,7 +3,7 @@ using Content.Shared.Actions;
namespace Content.Shared.Geras;
/// <summary>
/// A Geras is the small morph of a slime. This system handles exactly that.
/// Geras is the god of old age, and A geras is the small morph of a slime. This system allows the slimes to have the morphing action.
/// </summary>
public abstract class SharedGerasSystem : EntitySystem
{

View File

@@ -151,7 +151,6 @@ public partial class InventorySystem : EntitySystem
slotDefinitions = null;
return false;
}
slotDefinitions = inv.Slots;
return true;
}

View File

@@ -0,0 +1,10 @@
namespace Content.Shared.Roles;
/// <summary>
/// Raised directed on an entity when a new starting gear prototype has been equipped.
/// </summary>
[ByRefEvent]
public record struct StartingGearEquippedEvent(EntityUid Entity)
{
public readonly EntityUid Entity = Entity;
}

View File

@@ -17,12 +17,24 @@ public abstract class SharedStationSpawningSystem : EntitySystem
[Dependency] private readonly SharedStorageSystem _storage = default!;
[Dependency] private readonly SharedTransformSystem _xformSystem = default!;
private EntityQuery<HandsComponent> _handsQuery;
private EntityQuery<InventoryComponent> _inventoryQuery;
private EntityQuery<StorageComponent> _storageQuery;
private EntityQuery<TransformComponent> _xformQuery;
public override void Initialize()
{
base.Initialize();
_handsQuery = GetEntityQuery<HandsComponent>();
_inventoryQuery = GetEntityQuery<InventoryComponent>();
_storageQuery = GetEntityQuery<StorageComponent>();
_xformQuery = GetEntityQuery<TransformComponent>();
}
/// <summary>
/// Equips starting gear onto the given entity.
/// <see cref="EquipStartingGear(Robust.Shared.GameObjects.EntityUid,System.Nullable{Robust.Shared.Prototypes.ProtoId{Content.Shared.Roles.StartingGearPrototype}},bool)"/>
/// </summary>
/// <param name="entity">Entity to load out.</param>
/// <param name="startingGear">Starting gear to use.</param>
public void EquipStartingGear(EntityUid entity, ProtoId<StartingGearPrototype>? startingGear)
public void EquipStartingGear(EntityUid entity, ProtoId<StartingGearPrototype>? startingGear, bool raiseEvent = true)
{
PrototypeManager.TryIndex(startingGear, out var gearProto);
EquipStartingGear(entity, gearProto);
@@ -33,11 +45,14 @@ public abstract class SharedStationSpawningSystem : EntitySystem
/// </summary>
/// <param name="entity">Entity to load out.</param>
/// <param name="startingGear">Starting gear to use.</param>
public void EquipStartingGear(EntityUid entity, StartingGearPrototype? startingGear)
/// <param name="raiseEvent">Should we raise the event for equipped. Set to false if you will call this manually</param>
public void EquipStartingGear(EntityUid entity, StartingGearPrototype? startingGear, bool raiseEvent = true)
{
if (startingGear == null)
return;
var xform = _xformQuery.GetComponent(entity);
if (InventorySystem.TryGetSlots(entity, out var slotDefinitions))
{
foreach (var slot in slotDefinitions)
@@ -45,16 +60,16 @@ public abstract class SharedStationSpawningSystem : EntitySystem
var equipmentStr = startingGear.GetGear(slot.Name);
if (!string.IsNullOrEmpty(equipmentStr))
{
var equipmentEntity = EntityManager.SpawnEntity(equipmentStr, EntityManager.GetComponent<TransformComponent>(entity).Coordinates);
var equipmentEntity = EntityManager.SpawnEntity(equipmentStr, xform.Coordinates);
InventorySystem.TryEquip(entity, equipmentEntity, slot.Name, silent: true, force:true);
}
}
}
if (TryComp(entity, out HandsComponent? handsComponent))
if (_handsQuery.TryComp(entity, out var handsComponent))
{
var inhand = startingGear.Inhand;
var coords = EntityManager.GetComponent<TransformComponent>(entity).Coordinates;
var coords = xform.Coordinates;
foreach (var prototype in inhand)
{
var inhandEntity = EntityManager.SpawnEntity(prototype, coords);
@@ -70,7 +85,7 @@ public abstract class SharedStationSpawningSystem : EntitySystem
{
var coords = _xformSystem.GetMapCoordinates(entity);
var ents = new ValueList<EntityUid>();
TryComp(entity, out InventoryComponent? inventoryComp);
_inventoryQuery.TryComp(entity, out var inventoryComp);
foreach (var (slot, entProtos) in startingGear.Storage)
{
@@ -84,7 +99,7 @@ public abstract class SharedStationSpawningSystem : EntitySystem
if (inventoryComp != null &&
InventorySystem.TryGetSlotEntity(entity, slot, out var slotEnt, inventoryComponent: inventoryComp) &&
TryComp(slotEnt, out StorageComponent? storage))
_storageQuery.TryComp(slotEnt, out var storage))
{
foreach (var ent in ents)
{
@@ -93,5 +108,11 @@ public abstract class SharedStationSpawningSystem : EntitySystem
}
}
}
if (raiseEvent)
{
var ev = new StartingGearEquippedEvent(entity);
RaiseLocalEvent(entity, ref ev, true);
}
}
}

View File

@@ -1,3 +1,4 @@
using System.Diagnostics;
using System.Linq;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
@@ -185,6 +186,7 @@ public sealed class TagSystem : EntitySystem
/// <summary>
/// Checks if a tag has been added to an entity.
/// </summary>
[Obsolete]
public bool HasTag(EntityUid entity, string id, EntityQuery<TagComponent> tagQuery)
{
return tagQuery.TryGetComponent(entity, out var component) &&
@@ -243,7 +245,7 @@ public sealed class TagSystem : EntitySystem
/// </exception>
public bool HasAllTags(EntityUid entity, List<ProtoId<TagPrototype>> ids)
{
return TryComp<TagComponent>(entity, out var component) &&
return _tagQuery.TryComp(entity, out var component) &&
HasAllTags(component, ids);
}
@@ -521,16 +523,18 @@ public sealed class TagSystem : EntitySystem
/// </exception>
public bool HasAllTags(TagComponent component, List<ProtoId<TagPrototype>> ids)
{
var stringIds = new List<string>();
foreach (var tag in ids)
foreach (var id in ids)
{
stringIds.Add(tag.Id);
AssertValidTag(id);
if (!component.Tags.Contains(id))
return false;
}
return HasAllTags(component, stringIds);
return true;
}
/// <summary>
/// Checks if any of the given tags have been added.
/// </summary>
@@ -552,7 +556,6 @@ public sealed class TagSystem : EntitySystem
return false;
}
/// <summary>
/// Checks if any of the given tags have been added.
/// </summary>
@@ -619,13 +622,15 @@ public sealed class TagSystem : EntitySystem
/// </exception>
public bool HasAnyTag(TagComponent comp, List<ProtoId<TagPrototype>> ids)
{
var stringIds = new List<string>();
foreach (var tag in ids)
foreach (var id in ids)
{
stringIds.Add(tag.Id);
AssertValidTag(id);
if (comp.Tags.Contains(id))
return true;
}
return HasAnyTag(comp, stringIds);
return false;
}
/// <summary>

View File

@@ -5,6 +5,7 @@ using Content.Shared.Hands;
using Content.Shared.Hands.Components;
using Content.Shared.Hands.EntitySystems;
using Content.Shared.Interaction;
using Content.Shared.Interaction.Events;
using Content.Shared.Popups;
using Content.Shared.Verbs;
using Robust.Shared.Containers;
@@ -27,6 +28,7 @@ public sealed partial class ActivatableUISystem : EntitySystem
{
base.Initialize();
SubscribeLocalEvent<ActivatableUIComponent, UseInHandEvent>(OnUseInHand);
SubscribeLocalEvent<ActivatableUIComponent, ActivateInWorldEvent>(OnActivate);
SubscribeLocalEvent<ActivatableUIComponent, InteractUsingEvent>(OnInteractUsing);
SubscribeLocalEvent<ActivatableUIComponent, HandDeselectedEvent>(OnHandDeselected);
@@ -99,6 +101,9 @@ public sealed partial class ActivatableUISystem : EntitySystem
if (!args.CanAccess)
return false;
if (!component.RequiredItems?.IsValid(args.Using ?? default, EntityManager) ?? false)
return false;
if (component.RequireHands)
{
if (args.Hands == null)
@@ -117,6 +122,20 @@ public sealed partial class ActivatableUISystem : EntitySystem
return args.CanInteract || component.AllowSpectator && HasComp<GhostComponent>(args.User);
}
private void OnUseInHand(EntityUid uid, ActivatableUIComponent component, UseInHandEvent args)
{
if (args.Handled)
return;
if (component.VerbOnly)
return;
if (component.RequiredItems != null)
return;
args.Handled = InteractUI(args.User, uid, component);
}
private void OnActivate(EntityUid uid, ActivatableUIComponent component, ActivateInWorldEvent args)
{
if (args.Handled)

View File

@@ -38,8 +38,8 @@ public sealed partial class EntityWhitelist
[DataField]
public List<ProtoId<ItemSizePrototype>>? Sizes;
[NonSerialized]
private List<ComponentRegistration>? _registrations;
[NonSerialized, Access(typeof(EntityWhitelistSystem))]
public List<ComponentRegistration>? Registrations;
/// <summary>
/// Tags that are allowed in the whitelist.
@@ -55,67 +55,13 @@ public sealed partial class EntityWhitelist
[DataField]
public bool RequireAll;
public void UpdateRegistrations()
[Obsolete("Use WhitelistSystem")]
public bool IsValid(EntityUid uid, IEntityManager? man = null)
{
var sys = man?.System<EntityWhitelistSystem>() ??
IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<EntityWhitelistSystem>();
if (Components == null)
return;
return sys.IsValid(this, uid);
var compFact = IoCManager.Resolve<IComponentFactory>();
_registrations = new List<ComponentRegistration>();
foreach (var name in Components)
{
var availability = compFact.GetComponentAvailability(name);
if (compFact.TryGetRegistration(name, out var registration)
&& availability == ComponentAvailability.Available)
{
_registrations.Add(registration);
}
else if (availability == ComponentAvailability.Unknown)
{
Logger.Warning($"Unknown component name {name} passed to EntityWhitelist!");
}
}
}
/// <summary>
/// Returns whether a given entity fits the whitelist.
/// </summary>
public bool IsValid(EntityUid uid, IEntityManager? entityManager = null)
{
if (Components != null && _registrations == null)
UpdateRegistrations();
IoCManager.Resolve(ref entityManager);
if (_registrations != null)
{
foreach (var reg in _registrations)
{
if (entityManager.HasComponent(uid, reg.Type))
{
if (!RequireAll)
return true;
}
else if (RequireAll)
return false;
}
}
if (Sizes != null && entityManager.TryGetComponent(uid, out ItemComponent? itemComp))
{
if (Sizes.Contains(itemComp.Size))
return true;
}
if (Tags != null && entityManager.TryGetComponent(uid, out TagComponent? tags))
{
var tagSystem = entityManager.System<TagSystem>();
return RequireAll ? tagSystem.HasAllTags(tags, Tags) : tagSystem.HasAnyTag(tags, Tags);
}
if (RequireAll)
return true;
return false;
}
}

View File

@@ -0,0 +1,84 @@
using System.Diagnostics.CodeAnalysis;
using Content.Shared.Item;
using Content.Shared.Tag;
namespace Content.Shared.Whitelist;
public sealed class EntityWhitelistSystem : EntitySystem
{
[Dependency] private readonly IComponentFactory _factory = default!;
[Dependency] private readonly TagSystem _tag = default!;
private EntityQuery<ItemComponent> _itemQuery;
public override void Initialize()
{
base.Initialize();
_itemQuery = GetEntityQuery<ItemComponent>();
}
/// <inheritdoc cref="IsValid(Content.Shared.Whitelist.EntityWhitelist,Robust.Shared.GameObjects.EntityUid)"/>
public bool IsValid(EntityWhitelist list, [NotNullWhen(true)] EntityUid? uid)
{
return uid != null && IsValid(list, uid.Value);
}
/// <summary>
/// Checks whether a given entity satisfies a whitelist.
/// </summary>
public bool IsValid(EntityWhitelist list, EntityUid uid)
{
if (list.Components != null)
EnsureRegistrations(list);
if (list.Registrations != null)
{
foreach (var reg in list.Registrations)
{
if (HasComp(uid, reg.Type))
{
if (!list.RequireAll)
return true;
}
else if (list.RequireAll)
return false;
}
}
if (list.Sizes != null && _itemQuery.TryComp(uid, out var itemComp))
{
if (list.Sizes.Contains(itemComp.Size))
return true;
}
if (list.Tags != null)
{
return list.RequireAll
? _tag.HasAllTags(uid, list.Tags)
: _tag.HasAnyTag(uid, list.Tags);
}
return list.RequireAll;
}
private void EnsureRegistrations(EntityWhitelist list)
{
if (list.Components == null)
return;
list.Registrations = new List<ComponentRegistration>();
foreach (var name in list.Components)
{
var availability = _factory.GetComponentAvailability(name);
if (_factory.TryGetRegistration(name, out var registration)
&& availability == ComponentAvailability.Available)
{
list.Registrations.Add(registration);
}
else if (availability == ComponentAvailability.Unknown)
{
Log.Warning($"Unknown component name {name} passed to EntityWhitelist!");
}
}
}
}

View File

@@ -42,3 +42,8 @@
license: "CC-BY-SA-3.0"
copyright: "Paradise, volume and pitch changed, merged with redalert.ogg"
source: "https://github.com/ParadiseSS13/Paradise/blob/07b26ee6b4a11a0607986d322ee007020569feae/sound/effects/siren.ogg"
- files: ["intercept.ogg"]
license: "CC-BY-SA-3.0"
copyright: "Taken from tgstation"
source: "https://github.com/tgstation/tgstation/blob/95731342b97167d7883ff091d389f79c36442ee6/sound/ai/default/intercept.ogg"

Binary file not shown.

View File

@@ -1,84 +1,4 @@
Entries:
- author: metalgearsloth
changes:
- message: Remove executions pending code rewrite.
type: Remove
id: 6017
time: '2024-02-25T11:36:17.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25555
- author: Krunk
changes:
- message: Candy bowls function properly again!
type: Fix
id: 6018
time: '2024-02-25T13:08:15.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25514
- author: Whisper
changes:
- message: Added juice that makes you Weh! Juice a lizard plushie today!
type: Add
id: 6019
time: '2024-02-25T13:54:07.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25132
- author: wafehling
changes:
- message: Secret mode has become more secret, with the 4th option Survival added
to the rotation.
type: Tweak
id: 6020
time: '2024-02-25T21:15:35.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25568
- author: Tayrtahn
changes:
- message: Added a live preview display to reagent dispensers.
type: Add
id: 6021
time: '2024-02-25T23:03:22.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25391
- author: Krunk
changes:
- message: Fixed grid inventory occasionally messing with your item rotation.
type: Fix
id: 6022
time: '2024-02-25T23:24:21.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25510
- author: Ubaser
changes:
- message: Satchels no longer have darkened space representing a gap, and is instead
transparent.
type: Tweak
id: 6023
time: '2024-02-25T23:24:59.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25147
- author: TheShuEd
changes:
- message: Huge flora anomaly nerf
type: Tweak
id: 6024
time: '2024-02-25T23:41:24.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25499
- author: OctoRocket
changes:
- message: Removed the hands requirement to read paper.
type: Tweak
id: 6025
time: '2024-02-26T02:40:22.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25580
- author: SlamBamActionman
changes:
- message: Self-uncuff damage has been removed, but attempting to self-uncuff now
has a cooldown instead.
type: Tweak
id: 6026
time: '2024-02-26T02:41:20.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25161
- author: deltanedas
changes:
- message: Traitors can now be asked to steal the CMO's Handheld Crew Monitor.
type: Tweak
id: 6027
time: '2024-02-26T03:40:48.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25563
- author: MACMAN2003
changes:
- message: You can now make LED light tubes and LED light bulbs at an autolathe.
@@ -3860,3 +3780,97 @@
id: 6516
time: '2024-05-02T17:09:38.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27628
- author: ElectroJr
changes:
- message: Fixed various interactions not prioritizing opening a UI. No more trying
to eat mission critical faxes.
type: Fix
id: 6517
time: '2024-05-02T23:37:21.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27631
- author: Plykiya
changes:
- message: Blast grenades have had their manufacturing cost tripled.
type: Tweak
- message: Blast grenades are now part of the Basic Shuttle Armament research and
can be printed at the secfab.
type: Tweak
id: 6518
time: '2024-05-03T00:03:52.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27580
- author: Vasilis, Dutch-VanDerLinde
changes:
- message: A new event has been added, syndicate sleeper agents, which raises the
alert level and selects 1-2 players to be traitors rarely throughout the round.
type: Add
id: 6519
time: '2024-05-03T00:13:35.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27501
- author: Errant
changes:
- message: Space Ninjas now automatically turn their internals on when they spawn.
type: Tweak
id: 6520
time: '2024-05-03T01:24:22.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/25083
- author: Hanzdegloker
changes:
- message: Added 6 new energy drink based mixed drinks.
type: Add
- message: Added Red Bool energy drink back to the soda dispenser and gave it a
new canned sprite.
type: Add
id: 6521
time: '2024-05-03T06:57:37.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27597
- author: DuskyJay
changes:
- message: Allowed EMP implants to be used while stunned or cuffed.
type: Tweak
id: 6522
time: '2024-05-03T07:51:33.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27644
- author: Just-a-Unity-Dev
changes:
- message: Fixed Geras not having their speed buff.
type: Fix
- message: Geras are no longer immune to other AI mobs.
type: Fix
- message: Slimes can no longer morph into a Geras when zombified.
type: Fix
- message: Lowered the Geras death threshold.
type: Tweak
id: 6523
time: '2024-05-03T17:26:09.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27308
- author: nikthechampiongr
changes:
- message: Ninjas will no longer be pointed to random wreckage in space.
type: Fix
id: 6524
time: '2024-05-03T20:23:43.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27552
- author: Dutch-VanDerLinde
changes:
- message: Fixed nuclear operatives, zombies, and head revolutionary round end summaries
not showing.
type: Fix
id: 6525
time: '2024-05-04T00:03:52.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27654
- author: TheShuEd
changes:
- message: Added Train station!
type: Add
id: 6526
time: '2024-05-04T11:10:08.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27534
- author: TheShuEd
changes:
- message: "Added Pathological Liar trait accent. The accent has a 15% chance of\
\ inverting your message to the opposite. Replacing \u201CYes\u201D with \u201C\
No\u201D, \u201CCan\u201D with \u201Ccan't\u201D and so on."
type: Add
id: 6527
time: '2024-05-04T11:11:46.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/27618

View File

@@ -1,5 +1,5 @@
marking-VoxFacialHairColonel = Vox Colonel
marking-VoxFacialHairFu = Quill Fu
marking-VoxFacialHairNeck = Neck Quills
marking-VoxFacialHairBeard = Quill Beard
marking-VoxFacialHairRuffBeard = Ruff Beard
marking-VoxFacialHairBeard = Vox Beard (Quills)
marking-VoxFacialHairColonel = Vox Moustache (Colonel)
marking-VoxFacialHairFu = Vox Moustache (Quill Fu)
marking-VoxFacialHairNeck = Vox Beard (Neck Quills)
marking-VoxFacialHairMane = Vox Beard (Mane)

View File

@@ -1,13 +1,22 @@
marking-VoxHairShortQuills = Short Vox Quills
marking-VoxHairKingly = Vox Kingly
marking-VoxHairAfro = Vox Afro
marking-VoxHairMohawk = Vox Mohawk
marking-VoxHairYasuhiro = Vox Yasuhiro
marking-VoxHairBraids = Vox Braids
marking-VoxHairCrestedQuills = Vox Crested Quills
marking-VoxHairEmperorQuills = Vox Emperor Quills
marking-VoxHairFlowing = Vox Flowing
marking-VoxHairHawk = Vox Hawk
marking-VoxHairHorns = Vox Horns
marking-VoxHairNights = Vox Nights
marking-VoxHairSurf = Vox Surf
marking-VoxHairCropped = Vox Cropped
marking-VoxHairRuffhawk = Vox Ruffhawk
marking-VoxHairRows = Vox Rows
marking-VoxHairKeelQuills = Vox Keel Quills
marking-VoxHairKeetQuills = Vox Keet Quills
marking-VoxHairKingly = Vox Kingly
marking-VoxHairLongBraid = Vox Long Braid
marking-VoxHairMange = Vox Mange
marking-VoxHairMohawk = Vox Mohawk
marking-VoxHairNights = Vox Nights
marking-VoxHairPony = Vox Pony
marking-VoxHairRazorClipped = Vox Razor (Clipped)
marking-VoxHairRazor = Vox Razor
marking-VoxHairSortBraid = Vox Short Braid
marking-VoxHairShortQuills = Vox Short Quills
marking-VoxHairSurf = Vox Surf
marking-VoxHairTielQuills = Vox Tiel Quills
marking-VoxHairYasu = Vox Yasuhiro

View File

@@ -243,6 +243,12 @@ flavor-complex-atomic-cola = like hoarding bottle caps
flavor-complex-cuba-libre = like spiked cola
flavor-complex-gin-tonic = like spiked lemon-lime soda
flavor-complex-screwdriver = like spiked orange juice
flavor-complex-vodka-red-bool = like a heart attack
flavor-complex-irish-bool = caffine and Ireland
flavor-complex-xeno-basher = like killing bugs
flavor-complex-budget-insuls-drink = like door hacking
flavor-complex-watermelon-wakeup = like a sweet wakeup call
flavor-complex-rubberneck = like synthetics
flavor-complex-irish-car-bomb = like a spiked cola float
flavor-complex-themartinez = like violets and lemon vodka
flavor-complex-cogchamp = like brass

View File

@@ -1,4 +1,4 @@
job-supervisors-centcom = CentCom official
job-supervisors-centcom = Central Command
job-supervisors-captain = the captain
job-supervisors-hop = the head of personnel
job-supervisors-hos = the head of security

View File

@@ -0,0 +1,11 @@
marking-TattooVoxHeartLeftArm-heart_l_arm = Vox Left Arm Tattoo (Heart)
marking-TattooVoxHeartLeftArm = Vox Left Arm Tattoo (Heart)
marking-TattooVoxHeartRightArm-heart_r_arm = Vox Right Arm Tattoo (Heart)
marking-TattooVoxHeartRightArm = Vox Right Arm Tattoo (Heart)
marking-TattooVoxHiveChest-hive_s = Vox Chest Tattoo (hive)
marking-TattooVoxHiveChest = Vox Chest Tattoo (hive)
marking-TattooVoxNightlingChest-nightling_s = Vox Chest Tattoo (nightling)
marking-TattooVoxNightlingChest = Vox Chest Tattoo (nightling)

View File

@@ -261,3 +261,21 @@ reagent-desc-whiskey-soda = For the more refined griffon.
reagent-name-white-russian = white russian
reagent-desc-white-russian = That's just, like, your opinion, man...
reagent-name-vodka-red-bool = vodka red bool
reagent-desc-vodka-red-bool = Because heart failure and liver failure go hand in hand.
reagent-name-xeno-basher = xeno basher
reagent-desc-xeno-basher = The perfect drink before an expedition.
reagent-name-irish-bool = irish bool
reagent-desc-irish-bool = Like a bool in a Ireland shop.
reagent-name-budget-insuls = budget insuls
reagent-desc-budget-insuls = A tider's preferred drink.
reagent-name-watermelon-wakeup = watermelon wakeup
reagent-desc-watermelon-wakeup = If you want to be awake, this will do it... Also sweet.
reagent-name-rubberneck = rubberneck
reagent-desc-rubberneck = A popular drink amongst those adhering to an all synthetic diet.

View File

@@ -0,0 +1,132 @@
liar-word-1 = yes
liar-word-replacement-1 = no
liar-word-2 = no
liar-word-replacement-2 = yes
liar-word-3 = yeah
liar-word-replacement-3 = nah
liar-word-4 = nah
liar-word-replacement-4 = yeah
liar-word-5 = yep
liar-word-replacement-5 = nope
liar-word-6 = nope
liar-word-replacement-6 = yep
liar-word-7 = sure
liar-word-replacement-7 = nah
liar-word-8 = was
liar-word-replacement-8 = wasnt
liar-word-9 = wasnt
liar-word-replacement-9 = was
liar-word-10 = was
liar-word-replacement-10 = wasnt
liar-word-11 = is
liar-word-replacement-11 = isnt
liar-word-12 = will
liar-word-replacement-12 = wont
liar-word-12 = not
liar-word-replacement-12 = ""
liar-word-13 = dont
liar-word-replacement-13 = ""
liar-word-14 = can
liar-word-replacement-14 = cant
liar-word-15 = cant
liar-word-replacement-15 = can
liar-word-16 = should
liar-word-replacement-16 = shouldnt
liar-word-17 = dead
liar-word-replacement-17 = alive
liar-word-18 = alive
liar-word-replacement-18 = dead
liar-word-19 = does
liar-word-replacement-19 = doesnt
liar-word-20 = did
liar-word-replacement-20 = didnt
liar-word-21 = didnt
liar-word-replacement-21 = ""
liar-word-22 = nothing
liar-word-replacement-22 = something
liar-word-23 = something
liar-word-replacement-23 = nothing
liar-word-24 = somebody
liar-word-replacement-24 = nobody
liar-word-25 = nobody
liar-word-replacement-25 = somebody
liar-word-26 = can
liar-word-replacement-26 = "can't"
liar-word-27 = "can't"
liar-word-replacement-27 = can
liar-word-28 = should
liar-word-replacement-28 = "shouldn't"
liar-word-29 = do
liar-word-replacement-29 = "don't"
liar-word-30 = "don't"
liar-word-replacement-30 = ""
liar-word-31 = does
liar-word-replacement-31 = "doesn't"
liar-word-32 = did
liar-word-replacement-32 = "didn't"
liar-word-33 = "didn't"
liar-word-replacement-33 = did
liar-word-34 = ye
liar-word-34-2 = ya
liar-word-replacement-34 = na
liar-word-35 = na
liar-word-replacement-35 = ye
liar-word-36 = yuh
liar-word-replacement-36 = nuh
liar-word-37 = nuh
liar-word-replacement-37 = yuh
liar-word-38 = love
liar-word-replacement-38 = hate
liar-word-39 = hate
liar-word-replacement-39 = love
liar-word-40 = like
liar-word-replacement-40 = don't like
liar-word-41 = good
liar-word-replacement-41 = bad
liar-word-42 = bad
liar-word-replacement-42 = good
liar-word-42 = want
liar-word-replacement-42 = "don't want"

View File

@@ -1 +1 @@
station-event-immovable-rod-start-announcement = What the fuck was that?!?
station-event-immovable-rod-start-announcement = High velocity unidentified object is on a collision course with the station. Impact imminent.

View File

@@ -0,0 +1 @@
station-event-communication-interception = Attention! Enemy communication intercepted. Security level elevated.

View File

@@ -38,3 +38,6 @@ trait-southern-desc = You have a different way of speakin'.
trait-snoring-name = Snoring
trait-snoring-desc = You will snore while sleeping.
trait-liar-name = Pathological liar
trait-liar-desc = You can hardly bring yourself to tell the truth. Sometimes you lie anyway.

View File

@@ -425,3 +425,50 @@
chatsan-word-42: chatsan-replacement-42
chatsan-word-43: chatsan-replacement-43
chatsan-word-44: chatsan-replacement-44
- type: accent
id: liar
wordReplacements:
liar-word-1: liar-word-replacement-1
liar-word-2: liar-word-replacement-2
liar-word-3: liar-word-replacement-3
liar-word-4: liar-word-replacement-4
liar-word-5: liar-word-replacement-5
liar-word-6: liar-word-replacement-6
liar-word-7: liar-word-replacement-7
liar-word-8: liar-word-replacement-8
liar-word-9: liar-word-replacement-9
liar-word-10: liar-word-replacement-10
liar-word-11: liar-word-replacement-11
liar-word-12: liar-word-replacement-12
liar-word-13: liar-word-replacement-13
liar-word-14: liar-word-replacement-14
liar-word-15: liar-word-replacement-15
liar-word-16: liar-word-replacement-16
liar-word-17: liar-word-replacement-17
liar-word-18: liar-word-replacement-18
liar-word-19: liar-word-replacement-19
liar-word-20: liar-word-replacement-20
liar-word-21: liar-word-replacement-21
liar-word-22: liar-word-replacement-22
liar-word-23: liar-word-replacement-23
liar-word-24: liar-word-replacement-24
liar-word-25: liar-word-replacement-25
liar-word-26: liar-word-replacement-26
liar-word-27: liar-word-replacement-27
liar-word-28: liar-word-replacement-28
liar-word-29: liar-word-replacement-29
liar-word-30: liar-word-replacement-30
liar-word-31: liar-word-replacement-31
liar-word-32: liar-word-replacement-32
liar-word-33: liar-word-replacement-33
liar-word-34: liar-word-replacement-34
liar-word-34-2: liar-word-replacement-34
liar-word-35: liar-word-replacement-35
liar-word-36: liar-word-replacement-36
liar-word-37: liar-word-replacement-37
liar-word-38: liar-word-replacement-38
liar-word-39: liar-word-replacement-39
liar-word-40: liar-word-replacement-40
liar-word-41: liar-word-replacement-41
liar-word-42: liar-word-replacement-42

View File

@@ -129,6 +129,7 @@
noSpawn: true
components:
- type: InstantAction
checkCanInteract: false
charges: 3
useDelay: 5
itemIconStyle: BigAction

View File

@@ -6,6 +6,7 @@
- DrinkColaBottleFull
- DrinkCreamCartonXL
- DrinkDrGibbJug
- DrinkEnergyDrinkJug
- DrinkGreenTeaJug
- DrinkIceJug
- DrinkJuiceLimeCartonXL

View File

@@ -18,6 +18,7 @@
DrinkCognacBottleFull: 4
DrinkCoconutWaterCarton: 3
DrinkColaBottleFull: 4
DrinkEnergyDrinkCan: 8
DrinkMilkCarton: 2
DrinkCreamCarton: 5
DrinkGinBottleFull: 3

View File

@@ -4,6 +4,7 @@
FoodSnackCheesie: 3
FoodSnackChips: 3
FoodSnackBoritos: 3
DrinkEnergyDrinkCan: 4
FoodSnackPopcorn: 3
FoodSnackEnergy: 3
CigPackMixed: 2

View File

@@ -32,6 +32,7 @@
- DrinkBloodyMaryGlass
- DrinkBooger
- DrinkBraveBullGlass
- BudgetInsulsDrinkGlass
- DrinkCarrotJuice
- DrinkCoconutRum
- DrinkChocolateGlass
@@ -57,6 +58,7 @@
- DrinkIcedGreenTeaGlass
- DrinkIcedBeerGlass
- DrinkIceCreamGlass
- IrishBoolGlass
- DrinkIrishCarBomb
- DrinkIrishCoffeeGlass
- DrinkLemonadeGlass
@@ -78,6 +80,7 @@
- DrinkRewriter
- DrinkRoyRogersGlass
- DrinkRootBeerFloatGlass
- RubberneckGlass
- DrinkRumGlass
- DrinkSakeGlass
- DrinkSbitenGlass
@@ -91,12 +94,15 @@
- DrinkThreeMileIslandGlass
- DrinkToxinsSpecialGlass
- DrinkVodkaMartiniGlass
- DrinkVodkaRedBool
- DrinkVodkaTonicGlass
- DrinkWatermelonJuice
- DrinkWatermelonWakeup
- DrinkWhiskeyColaGlass
- DrinkWhiskeySodaGlass
- DrinkWhiteRussianGlass
- DrinkWineGlass
- XenoBasherGlass
- DrinkShakeBlue
- DrinkShakeWhite
- DrinkTheMartinez

View File

@@ -1,27 +1,3 @@
- type: marking
id: VoxFacialHairColonel
bodyPart: FacialHair
markingCategory: FacialHair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_facial_hair.rsi
state: vox_colonel_s
- type: marking
id: VoxFacialHairFu
bodyPart: FacialHair
markingCategory: FacialHair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_facial_hair.rsi
state: vox_fu_s
- type: marking
id: VoxFacialHairNeck
bodyPart: FacialHair
markingCategory: FacialHair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_facial_hair.rsi
state: vox_neck_s
- type: marking
id: VoxFacialHairBeard
bodyPart: FacialHair
@@ -29,12 +5,40 @@
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_facial_hair.rsi
state: vox_beard_s
state: beard_s
- type: marking
id: VoxFacialHairRuffBeard
id: VoxFacialHairColonel
bodyPart: FacialHair
markingCategory: FacialHair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_facial_hair.rsi
state: vox_ruff_beard_s
state: colonel_s
- type: marking
id: VoxFacialHairFu
bodyPart: FacialHair
markingCategory: FacialHair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_facial_hair.rsi
state: fu_s
- type: marking
id: VoxFacialHairMane
bodyPart: FacialHair
markingCategory: FacialHair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_facial_hair.rsi
state: mane_s
- type: marking
id: VoxFacialHairNeck
bodyPart: FacialHair
markingCategory: FacialHair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_facial_hair.rsi
state: neck_s

View File

@@ -1,19 +1,3 @@
- type: marking
id: VoxHairShortQuills
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: vox_shortquills_s
- type: marking
id: VoxHairKingly
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: vox_kingly_s
- type: marking
id: VoxHairAfro
bodyPart: Hair
@@ -21,23 +5,53 @@
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: vox_afro_s
state: afro_s
- type: marking
id: VoxHairMohawk
id: VoxHairBraids
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: vox_mohawk_s
state: braid_s
- type: marking
id: VoxHairYasuhiro
id: VoxHairCrestedQuills
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: vox_yasu_s
state: crestedquills_s
- type: marking
id: VoxHairEmperorQuills
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: emperorquills_s
- type: marking
id: VoxHairFlowing
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: flowing_s
- type: marking
id: VoxHairHawk
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: hawk_s
- type: marking
id: VoxHairHorns
bodyPart: Hair
@@ -45,47 +59,44 @@
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: vox_horns_s
state: horns_s
- type: marking
id: VoxHairNights
id: VoxHairKeelQuills
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: vox_nights_s
state: keelquills_s
- type: marking
id: VoxHairSurf
id: VoxHairKeetQuills
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: vox_surf_s
state: keetquills_s
- type: marking
id: VoxHairCropped
id: VoxHairKingly
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: vox_cropped_s
state: kingly_s
- type: marking
id: VoxHairRuffhawk
id: VoxHairLongBraid
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: vox_ruff_hawk_s
- type: marking
id: VoxHairRows
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: vox_rows_s
state: afro_s
- type: marking
id: VoxHairMange
bodyPart: Hair
@@ -93,7 +104,26 @@
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: vox_mange_s
state: mange_s
- type: marking
id: VoxHairMohawk
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: mohawk_s
- type: marking
id: VoxHairNights
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: nights_s
- type: marking
id: VoxHairPony
bodyPart: Hair
@@ -101,4 +131,67 @@
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: vox_pony_s
state: ponytail_s
- type: marking
id: VoxHairRazorClipped
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: razor_clipped_s
- type: marking
id: VoxHairRazor
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: razor_s
- type: marking
id: VoxHairSortBraid
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: short_braid_s
- type: marking
id: VoxHairShortQuills
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: shortquills_s
- type: marking
id: VoxHairSurf
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: surf_s
- type: marking
id: VoxHairTielQuills
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: tielquills_s
- type: marking
id: VoxHairYasu
bodyPart: Hair
markingCategory: Hair
speciesRestriction: [Vox]
sprites:
- sprite: Mobs/Customization/vox_hair.rsi
state: yasu_s

View File

@@ -0,0 +1,55 @@
- type: marking
id: TattooVoxHeartLeftArm
bodyPart: LArm
markingCategory: Arms
speciesRestriction: [Vox]
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: heart_l_arm
- type: marking
id: TattooVoxHeartRightArm
bodyPart: RArm
markingCategory: Arms
speciesRestriction: [Vox]
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: heart_r_arm
- type: marking
id: TattooVoxHiveChest
bodyPart: Chest
markingCategory: Chest
speciesRestriction: [Vox]
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: hive_s
- type: marking
id: TattooVoxNightlingChest
bodyPart: Chest
markingCategory: Chest
speciesRestriction: [Vox]
coloring:
default:
type:
!type:TattooColoring
fallbackColor: "#666666"
sprites:
- sprite: Mobs/Customization/vox_tattoos.rsi
state: nightling_s

View File

@@ -147,6 +147,16 @@
noSpawn: true
components:
# they portable...
- type: MovementSpeedModifier
baseWalkSpeed: 3
baseSprintSpeed: 5 # +.5 from normal movement speed
- type: MobThresholds
thresholds:
0: Alive
80: Dead # weak af tho
- type: NpcFactionMember
factions:
- NanoTrasen
- type: MultiHandedItem
- type: Item
size: Huge

View File

@@ -1,6 +1,7 @@
- type: entity
save: false
name: Urisst' Mzhand
name: Urist McScales
suffix: Urisst' Mzhand
parent: BaseMobReptilian
id: MobReptilian

View File

@@ -503,6 +503,22 @@
sprite: Objects/Consumable/Drinks/bravebullglass.rsi
state: icon
- type: entity
parent: DrinkGlass
id: BudgetInsulsDrinkGlass
suffix: budget insuls
components:
- type: SolutionContainerManager
solutions:
drink:
maxVol: 30
reagents:
- ReagentId: BudgetInsulsDrink
Quantity: 30
- type: Icon
sprite: Objects/Consumable/Drinks/budgetinsulsdrink.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkCarrotJuice
@@ -535,6 +551,22 @@
sprite: Objects/Consumable/Drinks/chocolateglass.rsi
state: icon
- type: entity
parent: DrinkGlass
id: RubberneckGlass
suffix: rubberneck
components:
- type: SolutionContainerManager
solutions:
drink:
maxVol: 30
reagents:
- ReagentId: Rubberneck
Quantity: 30
- type: Icon
sprite: Objects/Consumable/Drinks/rubberneck.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkCoconutRum
@@ -1061,6 +1093,22 @@
sprite: Objects/Consumable/Drinks/icecreamglass.rsi
state: icon
- type: entity
parent: DrinkGlass
id: IrishBoolGlass
suffix: irish bool
components:
- type: SolutionContainerManager
solutions:
drink:
maxVol: 30
reagents:
- ReagentId: IrishBool
Quantity: 30
- type: Icon
sprite: Objects/Consumable/Drinks/beerglass.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkIrishCarBomb
@@ -2054,6 +2102,22 @@
sprite: Objects/Consumable/Drinks/martiniglass.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkVodkaRedBool
suffix: vodka red bool
components:
- type: SolutionContainerManager
solutions:
drink:
maxVol: 30
reagents:
- ReagentId: VodkaRedBool
Quantity: 30
- type: Icon
sprite: Objects/Consumable/Drinks/ginvodkaglass.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkVodkaTonicGlass
@@ -2100,6 +2164,22 @@
- ReagentId: JuiceWatermelon
Quantity: 30
- type: entity
parent: DrinkGlass
id: DrinkWatermelonWakeup
suffix: watermelon wakeup
components:
- type: SolutionContainerManager
solutions:
drink:
maxVol: 30
reagents:
- ReagentId: WatermelonWakeup
Quantity: 30
- type: Icon
sprite: Objects/Consumable/Drinks/champagneglass.rsi
state: icon
- type: entity
parent: DrinkGlass
id: DrinkWhiskeyColaGlass
@@ -2180,6 +2260,22 @@
sprite: Objects/Consumable/Drinks/wineglass.rsi
state: icon
- type: entity
parent: DrinkGlass
id: XenoBasherGlass
suffix: xeno basher
components:
- type: SolutionContainerManager
solutions:
drink:
maxVol: 30
reagents:
- ReagentId: XenoBasher
Quantity: 30
- type: Icon
sprite: Objects/Consumable/Drinks/xenobasher.rsi
state: icon
# TODO: MOVE
- type: entity

View File

@@ -106,5 +106,5 @@
- type: Icon
state: pinpointer-station
- type: Pinpointer
component: BecomesStation
component: ResearchServer
targetName: the station

View File

@@ -165,7 +165,6 @@
emagStaticRecipes:
- BoxLethalshot
- BoxShotgunFlare
- GrenadeBlast
- MagazineBoxLightRifle
- MagazineBoxMagnum
- MagazineBoxPistol
@@ -187,6 +186,7 @@
- BoxBeanbag
- BoxShotgunIncendiary
- BoxShotgunUranium
- GrenadeBlast
- GrenadeEMP
- GrenadeFlash
- MagazineBoxLightRifleIncendiary
@@ -711,6 +711,7 @@
- BoxShotgunUranium
- ExplosivePayload
- FlashPayload
- GrenadeBlast
- GrenadeEMP
- GrenadeFlash
- HoloprojectorSecurity
@@ -731,6 +732,7 @@
- MagazineRifleUranium
- MagazineShotgunBeanbag
- MagazineShotgunIncendiary
- PortableRecharger
- PowerCageHigh
- PowerCageMedium
- PowerCageSmall
@@ -753,14 +755,6 @@
- WeaponLaserCannon
- WeaponLaserCarbine
- WeaponXrayCannon
- PowerCageSmall
- PowerCageMedium
- PowerCageHigh
- ShuttleGunSvalinnMachineGunCircuitboard
- ShuttleGunPerforatorCircuitboard
- ShuttleGunFriendshipCircuitboard
- ShuttleGunDusterCircuitboard
- PortableRecharger
- type: MaterialStorage
whitelist:
tags:

View File

@@ -589,6 +589,36 @@
flavorType: Complex
description: flavor-complex-irish-car-bomb
- type: flavor
id: vodkaredbool
flavorType: Complex
description: flavor-complex-vodka-red-bool
- type: flavor
id: xenobasher
flavorType: Complex
description: flavor-complex-xeno-basher
- type: flavor
id: irishbool
flavorType: Complex
description: flavor-complex-irish-bool
- type: flavor
id: budgetinsulsdrink
flavorType: Complex
description: flavor-complex-budget-insuls-drink
- type: flavor
id: watermelonwakeup
flavorType: Complex
description: flavor-complex-watermelon-wakeup
- type: flavor
id: rubberneck
flavorType: Complex
description: flavor-complex-rubberneck
- type: flavor
id: blackrussian
flavorType: Complex

View File

@@ -454,6 +454,31 @@
- type: NukeopsRole
prototype: Nukeops
- type: entity
id: SleeperAgentsRule
parent: BaseGameRule
noSpawn: true
components:
- type: StationEvent
earliestStart: 25
weight: 15
minimumPlayers: 15
reoccurrenceDelay: 60
startAnnouncement: station-event-communication-interception
startAudio:
path: /Audio/Announcements/intercept.ogg
- type: AlertLevelInterceptionRule
- type: TraitorRule
- type: AntagSelection
definitions:
- prefRoles: [ Traitor ]
min: 1
max: 2
playerRatio: 10
mindComponents:
- type: TraitorRole
prototype: Traitor
- type: entity
id: MassHallucinations
parent: BaseGameRule
@@ -476,11 +501,11 @@
noSpawn: true
components:
- type: StationEvent
endAnnouncement: station-event-immovable-rod-start-announcement
endAudio:
startAnnouncement: station-event-immovable-rod-start-announcement
startAudio:
path: /Audio/Announcements/attention.ogg
weight: 5
duration: 25
duration: 1
earliestStart: 45
minimumPlayers: 20
- type: ImmovableRodRule

View File

@@ -16,4 +16,4 @@
# - Saltern
# - Packed
# - Reach
#- Train <- return after station anchoring PR is finished and merged
# - Train

View File

@@ -49,7 +49,7 @@
# #security
# HeadOfSecurity: [ 1, 1 ]
# Warden: [ 1, 1 ]
# SecurityOfficer: [ 4, 4 ]
# SecurityOfficer: [ 6, 6 ]
# SecurityCadet: [ 2, 3 ]
# Lawyer: [ 1, 2 ]
# #supply

View File

@@ -79,7 +79,7 @@
id: SlimeMorphGeras
configuration:
entity: MobSlimesGeras
transferName: false
transferName: true
transferHumanoidAppearance: false
inventory: Drop
transferDamage: true

View File

@@ -1769,3 +1769,165 @@
- !type:AdjustReagent
reagent: Ethanol
amount: 0.15
- type: reagent
id: VodkaRedBool
name: reagent-name-vodka-red-bool
parent: BaseAlcohol
desc: reagent-desc-vodka-red-bool
physicalDesc: reagent-physical-desc-strong-smelling
flavor: vodkaredbool
color: "#c4c27655"
metamorphicSprite:
sprite: Objects/Consumable/Drinks/ginvodkaglass.rsi
state: icon_empty
metamorphicMaxFillLevels: 4
metamorphicFillBaseName: fill-
metamorphicChangeColor: true
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 1
- !type:AdjustReagent
reagent: Ethanol
amount: 0.10
- !type:AdjustReagent
reagent: Theobromine
amount: 0.05
fizziness: 0.25
- type: reagent
id: XenoBasher
name: reagent-name-xeno-basher
parent: BaseAlcohol
desc: reagent-desc-xeno-basher
physicalDesc: reagent-physical-desc-fizzy-and-creamy
flavor: xenobasher
color: "#4d6600"
metamorphicSprite:
sprite: Objects/Consumable/Drinks/xenobasher.rsi
state: icon_empty
metamorphicMaxFillLevels: 2
metamorphicFillBaseName: fill-
metamorphicChangeColor: false
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 1
- !type:AdjustReagent
reagent: Ethanol
amount: 0.15
- !type:AdjustReagent
reagent: Theobromine
amount: 0.05
fizziness: 0.15
- type: reagent
id: IrishBool
name: reagent-name-irish-bool
parent: BaseAlcohol
desc: reagent-desc-irish-bool
physicalDesc: reagent-physical-desc-bubbly
flavor: irishbool
color: "#71672e99"
metamorphicSprite:
sprite: Objects/Consumable/Drinks/beerglass.rsi
state: icon_empty
metamorphicMaxFillLevels: 6
metamorphicFillBaseName: fill-
metamorphicChangeColor: true
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 1
- !type:AdjustReagent
reagent: Ethanol
amount: 0.10
- !type:AdjustReagent
reagent: Theobromine
amount: 0.05
fizziness: 0.15
- type: reagent
id: BudgetInsulsDrink
name: reagent-name-budget-insuls
parent: BaseAlcohol
desc: reagent-desc-budget-insuls
physicalDesc: reagent-physical-desc-strong-smelling
flavor: budgetinsulsdrink
color: "#dede73"
metamorphicSprite:
sprite: Objects/Consumable/Drinks/budgetinsulsdrink.rsi
state: icon_empty
metamorphicMaxFillLevels: 3
metamorphicFillBaseName: fill-
metamorphicChangeColor: false
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 1
- !type:AdjustReagent
reagent: Ethanol
amount: 0.15
- !type:AdjustReagent
reagent: Theobromine
amount: 0.05
fizziness: 0.25
- type: reagent
id: WatermelonWakeup
name: reagent-name-watermelon-wakeup
parent: BaseAlcohol
desc: reagent-desc-watermelon-wakeup
physicalDesc: reagent-physical-desc-sweet
flavor: watermelonwakeup
color: "#d49dca"
metamorphicSprite:
sprite: Objects/Consumable/Drinks/champagneglass.rsi
state: icon_empty
metamorphicMaxFillLevels: 4
metamorphicFillBaseName: fill-
metamorphicChangeColor: true
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 1
- !type:AdjustReagent
reagent: Ethanol
amount: 0.07
- !type:AdjustReagent
reagent: Theobromine
amount: 0.05
fizziness: 0.15
- type: reagent
id: Rubberneck
name: reagent-name-rubberneck
parent: BaseAlcohol
desc: reagent-desc-rubberneck
physicalDesc: reagent-physical-desc-strong-smelling
flavor: rubberneck
color: "#f0d74a"
metamorphicSprite:
sprite: Objects/Consumable/Drinks/rubberneck.rsi
state: icon_empty
metamorphicMaxFillLevels: 3
metamorphicFillBaseName: fill-
metamorphicChangeColor: false
metabolisms:
Drink:
effects:
- !type:SatiateThirst
factor: 1
- !type:AdjustReagent
reagent: Ethanol
amount: 0.15
- !type:AdjustReagent
reagent: Theobromine
amount: 0.05
fizziness: 0.25

View File

@@ -70,7 +70,7 @@
factor: 2
- !type:AdjustReagent
reagent: Theobromine
amount: 0.05
amount: 0.1
fizziness: 0.4
- type: reagent

View File

@@ -678,9 +678,9 @@
result: GrenadeBlast
completetime: 3
materials:
Steel: 150
Plastic: 100
Gold: 50
Steel: 450
Plastic: 300
Gold: 150
- type: latheRecipe
id: GrenadeFlash
@@ -700,4 +700,4 @@
Uranium: 2000
Plastic: 1000
Plasma: 500
Glass: 500
Glass: 500

View File

@@ -86,6 +86,16 @@
products:
B52: 3
- type: reaction
id: BudgetInsulsDrink
reactants:
Tequila:
amount: 1
VodkaRedBool:
amount: 2
products:
BudgetInsulsDrink: 3
- type: reaction
id: BlueHawaiian
reactants:
@@ -516,6 +526,16 @@
products:
IcedTea: 3
- type: reaction
id: IrishBool
reactants:
EnergyDrink:
amount: 1
IrishCarBomb:
amount: 1
products:
IrishBool: 2
- type: reaction
id: IrishCarBomb
reactants:
@@ -794,6 +814,18 @@
products:
RoyRogers: 3
- type: reaction
id: Rubberneck
reactants:
EnergyDrink:
amount: 2
Moonshine:
amount: 1
Sugar:
amount: 1
products:
Rubberneck: 4
- type: reaction
id: Sbiten
reactants:
@@ -943,6 +975,16 @@
products:
VodkaMartini: 3
- type: reaction
id: VodkaRedBool
reactants:
Vodka:
amount: 1
EnergyDrink:
amount: 2
products:
VodkaRedBool: 3
- type: reaction
id: VodkaTonic
reactants:
@@ -963,6 +1005,18 @@
products:
WhiskeyCola: 3
- type: reaction
id: WatermelonWakeup
reactants:
JuiceWatermelon:
amount: 1
Whiskey:
amount: 1
EnergyDrink:
amount: 1
products:
WatermelonWakeup: 3
- type: reaction
id: WhiteRussian
reactants:
@@ -983,6 +1037,16 @@
products:
WhiskeySoda: 3
- type: reaction
id: XenoBasher
reactants:
ManlyDorf:
amount: 2
EnergyDrink:
amount: 1
products:
XenoBasher: 3
- type: reaction
id: HotRamen
minTemp: 323.15

View File

@@ -156,6 +156,7 @@
- PowerCageMedium
- MagazineGrenadeEmpty
- GrenadeFlash
- GrenadeBlast
- ShuttleGunSvalinnMachineGunCircuitboard
- ShuttleGunPerforatorCircuitboard
- ShuttleGunFriendshipCircuitboard

View File

@@ -23,3 +23,12 @@
description: trait-southern-desc
components:
- type: SouthernAccent
- type: trait
id: Liar
name: trait-liar-name
description: trait-liar-desc
components:
- type: ReplacementAccent
replacementChance: 0.15
accent: liar

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 412 B

View File

@@ -1 +1,31 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/vgstation-coders/vgstation13/blob/02ff588d59b3c560c685d9ca75e882d32a72d8cb/icons/mob/human_face.dmi", "states": [{"name": "vox_beard_s", "directions": 4}, {"name": "vox_colonel_s", "directions": 4}, {"name": "vox_fu_s", "directions": 4}, {"name": "vox_neck_s", "directions": 4}, {"name": "vox_ruff_beard_s", "directions": 4}, {"name": "vox_ruff_beard_s2", "directions": 4}]}
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from Paradise at https://github.com/ParadiseSS13/Paradise/blob/0f9ef5962f4422836c0a42f289fb24d018918cbc/icons/mob/sprite_accessories/vox/vox_facial_hair.dmi and greyscaled",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "colonel_s",
"directions": 4
},
{
"name": "fu_s",
"directions": 4
},
{
"name": "neck_s",
"directions": 4
},
{
"name": "beard_s",
"directions": 4
},
{
"name": "mane_s",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 150 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 186 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 314 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 420 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 397 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 381 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 457 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 913 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 B

View File

@@ -1 +1,99 @@
{"version": 1, "size": {"x": 32, "y": 32}, "license": "CC-BY-SA-3.0", "copyright": "https://github.com/vgstation-coders/vgstation13/blob/02ff588d59b3c560c685d9ca75e882d32a72d8cb/icons/mob/human_face.dmi", "states": [{"name": "vox_afro_s", "directions": 4}, {"name": "vox_afro_s2", "directions": 4}, {"name": "vox_bald_s", "directions": 4}, {"name": "vox_cropped_s", "directions": 4}, {"name": "vox_cropped_s2", "directions": 4}, {"name": "vox_horns_s", "directions": 4}, {"name": "vox_horns_s2", "directions": 4}, {"name": "vox_kingly_s", "directions": 4}, {"name": "vox_kingly_s2", "directions": 4}, {"name": "vox_mange_s", "directions": 4}, {"name": "vox_mange_s2", "directions": 4}, {"name": "vox_mohawk_s", "directions": 4}, {"name": "vox_mohawk_s2", "directions": 4}, {"name": "vox_nights_s", "directions": 4}, {"name": "vox_nights_s2", "directions": 4}, {"name": "vox_pony_s", "directions": 4}, {"name": "vox_pony_s2", "directions": 4}, {"name": "vox_rows_s", "directions": 4}, {"name": "vox_rows_s2", "directions": 4}, {"name": "vox_ruff_hawk_s", "directions": 4}, {"name": "vox_ruff_hawk_s2", "directions": 4}, {"name": "vox_shortquills_s", "directions": 4}, {"name": "vox_shortquills_s2", "directions": 4}, {"name": "vox_surf_s", "directions": 4}, {"name": "vox_surf_s2", "directions": 4}, {"name": "vox_yasu_s", "directions": 4}, {"name": "vox_yasu_s2", "directions": 4}]}
{
"version": 1,
"license": "CC-BY-SA-3.0",
"copyright": "Taken from Paradise at https://github.com/ParadiseSS13/Paradise/blob/dcd1f5d88a8c5ba9634fc3fce67a76ada45f71dc/icons/mob/sprite_accessories/vox/vox_hair.dmi and greyscaled",
"size": {
"x": 32,
"y": 32
},
"states": [
{
"name": "crestedquills_s",
"directions": 4
},
{
"name": "emperorquills_s",
"directions": 4
},
{
"name": "keelquills_s",
"directions": 4
},
{
"name": "keetquills_s",
"directions": 4
},
{
"name": "shortquills_s",
"directions": 4
},
{
"name": "tielquills_s",
"directions": 4
},
{
"name": "kingly_s",
"directions": 4
},
{
"name": "afro_s",
"directions": 4
},
{
"name": "yasu_s",
"directions": 4
},
{
"name": "razor_s",
"directions": 4
},
{
"name": "razor_clipped_s",
"directions": 4
},
{
"name": "mohawk_s",
"directions": 4
},
{
"name": "horns_s",
"directions": 4
},
{
"name": "nights_s",
"directions": 4
},
{
"name": "hawk_s",
"directions": 4
},
{
"name": "long_braid_s",
"directions": 4
},
{
"name": "short_braid_s",
"directions": 4
},
{
"name": "mange_s",
"directions": 4
},
{
"name": "ponytail_s",
"directions": 4
},
{
"name": "braid_s",
"directions": 4
},
{
"name": "surf_s",
"directions": 4
},
{
"name": "flowing_s",
"directions": 4
}
]
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 337 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 747 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 391 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 298 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 236 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 309 B

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