Merge remote-tracking branch 'space-wizards/master'

# Conflicts:
#	.github/CODEOWNERS
#	Content.Client/Movement/Systems/EyeCursorOffsetSystem.cs
#	Resources/Maps/_Sunrise/Station/bagel.yml
This commit is contained in:
Vigers Ray 2025-08-19 15:38:23 +03:00
commit a3d094ba50
53 changed files with 586 additions and 426 deletions

View file

@ -1,5 +1,6 @@
using Content.Shared.Drunk;
using Content.Shared.StatusEffect;
using Content.Shared.StatusEffectNew;
using Robust.Client.Graphics;
using Robust.Client.Player;
using Robust.Shared.Enums;
@ -43,19 +44,21 @@ public sealed class DrunkOverlay : Overlay
if (playerEntity == null)
return;
if (!_entityManager.HasComponent<DrunkComponent>(playerEntity)
|| !_entityManager.TryGetComponent<StatusEffectsComponent>(playerEntity, out var status))
var statusSys = _sysMan.GetEntitySystem<Shared.StatusEffectNew.StatusEffectsSystem>();
if (!statusSys.TryGetMaxTime<DrunkStatusEffectComponent>(playerEntity.Value, out var status))
return;
var statusSys = _sysMan.GetEntitySystem<StatusEffectsSystem>();
if (!statusSys.TryGetTime(playerEntity.Value, SharedDrunkSystem.DrunkKey, out var time, status))
return;
var time = status.Item2;
var power = SharedDrunkSystem.MagicNumber;
if (time != null)
{
var curTime = _timing.CurTime;
var timeLeft = (float) (time.Value.Item2 - curTime).TotalSeconds;
power = (float) (time - curTime).Value.TotalSeconds;
}
CurrentBoozePower += 8f * (0.5f*timeLeft - CurrentBoozePower) * args.DeltaSeconds / (timeLeft+1);
CurrentBoozePower += 8f * (power * 0.5f - CurrentBoozePower) * args.DeltaSeconds / (power+1);
}
protected override bool BeforeDraw(in OverlayDrawArgs args)

View file

@ -1,4 +1,5 @@
using Content.Shared.Drunk;
using Content.Shared.StatusEffectNew;
using Robust.Client.Graphics;
using Robust.Client.Player;
using Robust.Shared.Player;
@ -16,38 +17,41 @@ public sealed class DrunkSystem : SharedDrunkSystem
{
base.Initialize();
SubscribeLocalEvent<DrunkComponent, ComponentInit>(OnDrunkInit);
SubscribeLocalEvent<DrunkComponent, ComponentShutdown>(OnDrunkShutdown);
SubscribeLocalEvent<DrunkStatusEffectComponent, StatusEffectAppliedEvent>(OnStatusApplied);
SubscribeLocalEvent<DrunkStatusEffectComponent, StatusEffectRemovedEvent>(OnStatusRemoved);
SubscribeLocalEvent<DrunkComponent, LocalPlayerAttachedEvent>(OnPlayerAttached);
SubscribeLocalEvent<DrunkComponent, LocalPlayerDetachedEvent>(OnPlayerDetached);
SubscribeLocalEvent<DrunkStatusEffectComponent, StatusEffectRelayedEvent<LocalPlayerAttachedEvent>>(OnPlayerAttached);
SubscribeLocalEvent<DrunkStatusEffectComponent, StatusEffectRelayedEvent<LocalPlayerDetachedEvent>>(OnPlayerDetached);
_overlay = new();
}
private void OnPlayerAttached(EntityUid uid, DrunkComponent component, LocalPlayerAttachedEvent args)
private void OnStatusApplied(Entity<DrunkStatusEffectComponent> entity, ref StatusEffectAppliedEvent args)
{
if (!_overlayMan.HasOverlay<DrunkOverlay>())
_overlayMan.AddOverlay(_overlay);
}
private void OnPlayerDetached(EntityUid uid, DrunkComponent component, LocalPlayerDetachedEvent args)
private void OnStatusRemoved(Entity<DrunkStatusEffectComponent> entity, ref StatusEffectRemovedEvent args)
{
if (Status.HasEffectComp<DrunkStatusEffectComponent>(args.Target))
return;
if (_player.LocalEntity != args.Target)
return;
_overlay.CurrentBoozePower = 0;
_overlayMan.RemoveOverlay(_overlay);
}
private void OnDrunkInit(EntityUid uid, DrunkComponent component, ComponentInit args)
private void OnPlayerAttached(Entity<DrunkStatusEffectComponent> entity, ref StatusEffectRelayedEvent<LocalPlayerAttachedEvent> args)
{
if (_player.LocalEntity == uid)
_overlayMan.AddOverlay(_overlay);
}
private void OnDrunkShutdown(EntityUid uid, DrunkComponent component, ComponentShutdown args)
{
if (_player.LocalEntity == uid)
private void OnPlayerDetached(Entity<DrunkStatusEffectComponent> entity, ref StatusEffectRelayedEvent<LocalPlayerDetachedEvent> args)
{
_overlay.CurrentBoozePower = 0;
_overlayMan.RemoveOverlay(_overlay);
}
}
}

View file

@ -21,7 +21,6 @@ namespace Content.Client.Inventory
{
[Dependency] private readonly IPlayerManager _playerManager = default!;
[Dependency] private readonly IUserInterfaceManager _ui = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly ClientClothingSystem _clothingVisualsSystem = default!;
[Dependency] private readonly ExamineSystem _examine = default!;

View file

@ -1,7 +1,6 @@
using System.Numerics;
using Content.Shared.Movement.Components;
using Content.Shared.Movement.Systems;
using Robust.Client.GameObjects;
using Robust.Client.Player;
namespace Content.Client.Movement.Systems;
@ -63,4 +62,15 @@ public sealed class ContentEyeSystem : SharedContentEyeSystem
UpdateEyeOffset((entity, eyeComponent));
}
}
public override void Update(float frameTime)
{
base.Update(frameTime);
// TODO: Ideally we wouldn't want this to run in both FrameUpdate and Update, but we kind of have to since the visual update happens in FrameUpdate, but interaction update happens in Update. It's a workaround and a better solution should be found.
var eyeEntities = AllEntityQuery<ContentEyeComponent, EyeComponent>();
while (eyeEntities.MoveNext(out var entity, out ContentEyeComponent? contentComponent, out EyeComponent? eyeComponent))
{
UpdateEyeOffset((entity, eyeComponent));
}
}
}

View file

@ -1,6 +1,7 @@
using System.Numerics;
using Content.Client.Movement.Components;
using Content.Shared._Sunrise.SunriseCCVars;
using Content.Client.Viewport;
using Content.Shared.Camera;
using Content.Shared.Input;
using Robust.Client.GameObjects;
@ -31,7 +32,7 @@ public sealed partial class EyeCursorOffsetSystem : EntitySystem
// This value is here to make sure the user doesn't have to move their mouse
// all the way out to the edge of the screen to get the full offset.
private readonly float _edgeOffset = 0.9f;
private static float _edgeOffset = 0.8f;
public override void Initialize()
{
@ -63,6 +64,10 @@ public sealed partial class EyeCursorOffsetSystem : EntitySystem
public Vector2? OffsetAfterMouse(EntityUid uid, EyeCursorOffsetComponent? component)
{
// We need the main viewport where the game content is displayed, as certain UI layouts (e.g. Separated HUD) can make it a different size to the game window.
if (_eyeManager.MainViewport is not ScalingViewport vp)
return null;
// Sunrise-Start
if (_holdLookUp)
{
@ -77,24 +82,25 @@ public sealed partial class EyeCursorOffsetSystem : EntitySystem
}
// Sunrise-End
var localPlayer = _player.LocalEntity;
var mousePos = _inputManager.MouseScreenPosition;
var screenControl = _eyeManager.MainViewport as Control;
var screenSize = screenControl?.PixelSize ?? _clyde.MainWindow.Size;
var minValue = MathF.Min(screenSize.X / 2, screenSize.Y / 2) * _edgeOffset;
var mousePos = _inputManager.MouseScreenPosition.Position; // TODO: If we ever get a right-aligned Separated HUD setting, this might need to be adjusted for that.
var mouseNormalizedPos = new Vector2(-(mousePos.X - screenSize.X / 2) / minValue, (mousePos.Y - screenSize.Y / 2) / minValue); // X needs to be inverted here for some reason, otherwise it ends up flipped.
var viewportSize = vp.PixelSize; // The size of the game viewport, including black bars - does not include the chatbox in Separated HUD view.
var scalingViewportSize = vp.ViewportSize * vp.CurrentRenderScale; // The size of the viewport in which the game is rendered (i.e. not including black bars). Note! Can extend outside the game window with certain zoom settings!
var visibleViewportSize = Vector2.Min(viewportSize, scalingViewportSize); // The size of the game viewport that is "actually visible" to the player, cutting off over-extensions and not counting black bar padding.
if (localPlayer == null)
return null;
Matrix3x2.Invert(_eyeManager.MainViewport.GetLocalToScreenMatrix(), out var matrix);
var mouseCoords = Vector2.Transform(mousePos, matrix); // Gives the mouse position inside of the *scaling viewport*, i.e. 0,0 is inside the black bars. Note! 0,0 can be outside the game window with certain zoom settings!
var boundedMousePos = Vector2.Clamp(Vector2.Min(mouseCoords, mousePos), Vector2.Zero, visibleViewportSize); // Mouse position inside the visible game viewport's bounds.
var offsetRadius = MathF.Min(visibleViewportSize.X / 2f, visibleViewportSize.Y / 2f) * _edgeOffset;
var mouseNormalizedPos = new Vector2(-(boundedMousePos.X - visibleViewportSize.X / 2f) / offsetRadius, (boundedMousePos.Y - visibleViewportSize.Y / 2f) / offsetRadius);
if (component == null)
{
component = EnsureComp<EyeCursorOffsetComponent>(uid);
}
// Doesn't move the offset if the mouse has left the game window!
if (mousePos.Window != WindowId.Invalid)
if (_inputManager.MouseScreenPosition.Window != WindowId.Invalid)
{
// The offset must account for the in-world rotation.
var eyeRotation = _eyeManager.CurrentEye.Rotation;
@ -115,7 +121,7 @@ public sealed partial class EyeCursorOffsetSystem : EntitySystem
var vectorOffset = component.TargetPosition - component.CurrentPosition;
if (vectorOffset.Length() > component.OffsetSpeed)
{
vectorOffset = vectorOffset.Normalized() * component.OffsetSpeed;
vectorOffset = vectorOffset.Normalized() * component.OffsetSpeed; // TODO: Probably needs to properly account for time delta or something.
}
component.CurrentPosition += vectorOffset;
}

View file

@ -12,7 +12,6 @@ namespace Content.Client.Stack
{
[Dependency] private readonly AppearanceSystem _appearanceSystem = default!;
[Dependency] private readonly ItemCounterSystem _counterSystem = default!;
[Dependency] private readonly SpriteSystem _sprite = default!;
public override void Initialize()
{

View file

@ -25,7 +25,7 @@ public sealed class MenuButton : ContainerButton
private Color NormalColor => HasStyleClass(StyleClassRedTopButton) ? ColorRedNormal : ColorNormal;
private Color HoveredColor => HasStyleClass(StyleClassRedTopButton) ? ColorRedHovered : ColorHovered;
private BoundKeyFunction _function;
private BoundKeyFunction? _function;
private readonly BoxContainer _root;
private readonly TextureRect? _buttonIcon;
private readonly Label? _buttonLabel;
@ -33,13 +33,13 @@ public sealed class MenuButton : ContainerButton
public string AppendStyleClass { set => AddStyleClass(value); }
public Texture? Icon { get => _buttonIcon!.Texture; set => _buttonIcon!.Texture = value; }
public BoundKeyFunction BoundKey
public BoundKeyFunction? BoundKey
{
get => _function;
set
{
_function = value;
_buttonLabel!.Text = BoundKeyHelper.ShortKeyName(value);
_buttonLabel!.Text = _function == null ? "" : BoundKeyHelper.ShortKeyName(_function.Value);
}
}
@ -95,12 +95,12 @@ public sealed class MenuButton : ContainerButton
private void OnKeyBindingChanged(IKeyBinding obj)
{
_buttonLabel!.Text = BoundKeyHelper.ShortKeyName(_function);
_buttonLabel!.Text = _function == null ? "" : BoundKeyHelper.ShortKeyName(_function.Value);
}
private void OnKeyBindingChanged()
{
_buttonLabel!.Text = BoundKeyHelper.ShortKeyName(_function);
_buttonLabel!.Text = _function == null ? "" : BoundKeyHelper.ShortKeyName(_function.Value);
}
protected override void StylePropertiesChanged()

View file

@ -29,7 +29,10 @@ public sealed class WieldableSystem : SharedWieldableSystem
return;
if (_gameTiming.IsFirstTimePredicted)
{
cursorOffsetComp.CurrentPosition = Vector2.Zero;
cursorOffsetComp.TargetPosition = Vector2.Zero;
}
}
public void OnGetEyeOffset(Entity<CursorOffsetRequiresWieldComponent> entity, ref HeldRelayedEvent<GetEyeOffsetRelayedEvent> args)

View file

@ -29,12 +29,10 @@ public sealed partial class ParrotMemorySystem : SharedParrotMemorySystem
{
[Dependency] private readonly EntityWhitelistSystem _whitelist = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly IAdminManager _admin = default!;
[Dependency] private readonly IGameTiming _gameTiming = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly MindSystem _mind = default!;
[Dependency] private readonly MobStateSystem _mobState = default!;
[Dependency] private readonly PopupSystem _popup = default!;
public override void Initialize()
{

View file

@ -418,7 +418,7 @@ public sealed class ElectrocutionSystem : SharedElectrocutionSystem
}
}
_stuttering.DoStutter(uid, time * StutteringTimeMultiplier, refresh, statusEffects);
_stuttering.DoStutter(uid, time * StutteringTimeMultiplier, refresh);
_jittering.DoJitter(uid, time * JitterTimeMultiplier, refresh, JitterAmplitude, JitterFrequency, true, statusEffects);
_popup.PopupEntity(Loc.GetString("electrocuted-component-mob-shocked-popup-player"), uid, uid);

View file

@ -42,14 +42,12 @@ public sealed class NPCUtilitySystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _proto = default!;
[Dependency] private readonly ContainerSystem _container = default!;
[Dependency] private readonly DrinkSystem _drink = default!;
[Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly HandsSystem _hands = default!;
[Dependency] private readonly InventorySystem _inventory = default!;
[Dependency] private readonly IngestionSystem _ingestion = default!;
[Dependency] private readonly MobStateSystem _mobState = default!;
[Dependency] private readonly NpcFactionSystem _npcFaction = default!;
[Dependency] private readonly OpenableSystem _openable = default!;
[Dependency] private readonly PuddleSystem _puddle = default!;
[Dependency] private readonly SharedTransformSystem _transform = default!;
[Dependency] private readonly SharedSolutionContainerSystem _solutions = default!;

View file

@ -16,8 +16,6 @@ public sealed class PickObjectiveTargetSystem : EntitySystem
{
[Dependency] private readonly TargetObjectiveSystem _target = default!;
[Dependency] private readonly SharedMindSystem _mind = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly TraitorRuleSystem _traitorRule = default!;
public override void Initialize()
{

View file

@ -19,7 +19,6 @@ namespace Content.Server.Silicons.Borgs;
public sealed partial class BorgSystem
{
[Dependency] private readonly EmagSystem _emag = default!;
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly MobThresholdSystem _mobThresholdSystem = default!;
[Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!;

View file

@ -28,7 +28,6 @@ namespace Content.Server.Singularity.EntitySystems
public sealed class EmitterSystem : SharedEmitterSystem
{
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;

View file

@ -6,29 +6,25 @@ namespace Content.Server.Speech.Components
/// <summary>
/// Percentage chance that a stutter will occur if it matches.
/// </summary>
[DataField("matchRandomProb")]
[ViewVariables(VVAccess.ReadWrite)]
[DataField]
public float MatchRandomProb = 0.8f;
/// <summary>
/// Percentage chance that a stutter occurs f-f-f-f-four times.
/// </summary>
[DataField("fourRandomProb")]
[ViewVariables(VVAccess.ReadWrite)]
[DataField]
public float FourRandomProb = 0.1f;
/// <summary>
/// Percentage chance that a stutter occurs t-t-t-three times.
/// </summary>
[DataField("threeRandomProb")]
[ViewVariables(VVAccess.ReadWrite)]
[DataField]
public float ThreeRandomProb = 0.2f;
/// <summary>
/// Percentage chance that a stutter cut off.
/// </summary>
[DataField("cutRandomProb")]
[ViewVariables(VVAccess.ReadWrite)]
[DataField]
public float CutRandomProb = 0.05f;
}
}

View file

@ -3,8 +3,7 @@ using Content.Server.Speech.Components;
using Content.Shared.Drunk;
using Content.Shared.Speech;
using Content.Shared.Speech.EntitySystems;
using Content.Shared.StatusEffect;
using Robust.Shared.Prototypes;
using Content.Shared.StatusEffectNew;
using Robust.Shared.Random;
using Robust.Shared.Timing;
@ -12,26 +11,15 @@ namespace Content.Server.Speech.EntitySystems;
public sealed class SlurredSystem : SharedSlurredSystem
{
[Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!;
[Dependency] private readonly StatusEffectsSystem _status = default!;
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IGameTiming _timing = default!;
private static readonly ProtoId<StatusEffectPrototype> SlurKey = "SlurredSpeech";
public override void Initialize()
{
SubscribeLocalEvent<SlurredAccentComponent, AccentGetEvent>(OnAccent);
}
public override void DoSlur(EntityUid uid, TimeSpan time, StatusEffectsComponent? status = null)
{
if (!Resolve(uid, ref status, false))
return;
if (!_statusEffectsSystem.HasStatusEffect(uid, SlurKey, status))
_statusEffectsSystem.TryAddStatusEffect<SlurredAccentComponent>(uid, SlurKey, time, true, status);
else
_statusEffectsSystem.TryAddTime(uid, SlurKey, time, status);
SubscribeLocalEvent<SlurredAccentComponent, StatusEffectRelayedEvent<AccentGetEvent>>(OnAccentRelayed);
}
/// <summary>
@ -39,15 +27,33 @@ public sealed class SlurredSystem : SharedSlurredSystem
/// </summary>
private float GetProbabilityScale(EntityUid uid)
{
if (!_statusEffectsSystem.TryGetTime(uid, SharedDrunkSystem.DrunkKey, out var time))
if (!_status.TryGetMaxTime<DrunkStatusEffectComponent>(uid, out var time))
return 0;
// This is a magic number. Why this value? No clue it was made 3 years before I refactored this.
var magic = SharedDrunkSystem.MagicNumber;
if (time.Item2 != null)
{
var curTime = _timing.CurTime;
var timeLeft = (float) (time.Value.Item2 - curTime).TotalSeconds;
return Math.Clamp((timeLeft - 80) / 1100, 0f, 1f);
magic = (float) (time.Item2 - curTime).Value.TotalSeconds - 80f;
}
private void OnAccent(EntityUid uid, SlurredAccentComponent component, AccentGetEvent args)
return Math.Clamp(magic / SharedDrunkSystem.MagicNumber, 0f, 1f);
}
private void OnAccent(Entity<SlurredAccentComponent> entity, ref AccentGetEvent args)
{
GetAccent(entity, ref args);
}
private void OnAccentRelayed(Entity<SlurredAccentComponent> entity, ref StatusEffectRelayedEvent<AccentGetEvent> args)
{
var ev = args.Args;
GetAccent(args.Args.Entity, ref ev);
}
private void GetAccent(EntityUid uid, ref AccentGetEvent args)
{
var scale = GetProbabilityScale(uid);
args.Message = Accentuate(args.Message, scale);

View file

@ -3,14 +3,13 @@ using System.Text.RegularExpressions;
using Content.Server.Speech.Components;
using Content.Shared.Speech;
using Content.Shared.Speech.EntitySystems;
using Content.Shared.StatusEffect;
using Content.Shared.StatusEffectNew;
using Robust.Shared.Random;
namespace Content.Server.Speech.EntitySystems
{
public sealed class StutteringSystem : SharedStutteringSystem
{
[Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!;
[Dependency] private readonly IRobustRandom _random = default!;
// Regex of characters to stutter.
@ -20,19 +19,36 @@ namespace Content.Server.Speech.EntitySystems
public override void Initialize()
{
SubscribeLocalEvent<StutteringAccentComponent, AccentGetEvent>(OnAccent);
SubscribeLocalEvent<StutteringAccentComponent, StatusEffectRelayedEvent<AccentGetEvent>>(OnAccent);
}
public override void DoStutter(EntityUid uid, TimeSpan time, bool refresh, StatusEffectsComponent? status = null)
public override void DoStutter(EntityUid uid, TimeSpan time, bool refresh)
{
if (!Resolve(uid, ref status, false))
return;
_statusEffectsSystem.TryAddStatusEffect<StutteringAccentComponent>(uid, StutterKey, time, refresh, status);
if (refresh)
Status.TryUpdateStatusEffectDuration(uid, Stuttering, time);
else
Status.TryAddStatusEffectDuration(uid, Stuttering, time);
}
private void OnAccent(EntityUid uid, StutteringAccentComponent component, AccentGetEvent args)
public override void DoRemoveStutterTime(EntityUid uid, TimeSpan timeRemoved)
{
args.Message = Accentuate(args.Message, component);
Status.TryAddTime(uid, Stuttering, -timeRemoved);
}
public override void DoRemoveStutter(EntityUid uid)
{
Status.TryRemoveStatusEffect(uid, Stuttering);
}
private void OnAccent(Entity<StutteringAccentComponent> entity, ref AccentGetEvent args)
{
args.Message = Accentuate(args.Message, entity.Comp);
}
private void OnAccent(Entity<StutteringAccentComponent> entity, ref StatusEffectRelayedEvent<AccentGetEvent> args)
{
args.Args.Message = Accentuate(args.Args.Message, entity.Comp);
}
public string Accentuate(string message, StutteringAccentComponent component)

View file

@ -16,13 +16,9 @@ namespace Content.Server.Stack
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
public static readonly int[] DefaultSplitAmounts = { 1, 5, 10, 20, 30, 50 };
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<StackComponent, GetVerbsEvent<AlternativeVerb>>(OnStackAlternativeInteract);
}
public override void SetCount(EntityUid uid, int amount, StackComponent? component = null)
@ -165,42 +161,7 @@ namespace Content.Server.Stack
return amounts;
}
private void OnStackAlternativeInteract(EntityUid uid, StackComponent stack, GetVerbsEvent<AlternativeVerb> args)
{
if (!args.CanAccess || !args.CanInteract || args.Hands == null || stack.Count == 1)
return;
AlternativeVerb halve = new()
{
Text = Loc.GetString("comp-stack-split-halve"),
Category = VerbCategory.Split,
Act = () => UserSplit(uid, args.User, stack.Count / 2, stack),
Priority = 1
};
args.Verbs.Add(halve);
var priority = 0;
foreach (var amount in DefaultSplitAmounts)
{
if (amount >= stack.Count)
continue;
AlternativeVerb verb = new()
{
Text = amount.ToString(),
Category = VerbCategory.Split,
Act = () => UserSplit(uid, args.User, amount, stack),
// we want to sort by size, not alphabetically by the verb text.
Priority = priority
};
priority--;
args.Verbs.Add(verb);
}
}
private void UserSplit(EntityUid uid, EntityUid userUid, int amount,
protected override void UserSplit(EntityUid uid, EntityUid userUid, int amount,
StackComponent? stack = null,
TransformComponent? userTransform = null)
{

View file

@ -198,12 +198,6 @@ public sealed partial class BloodstreamComponent : Component
[ViewVariables]
public Entity<SolutionComponent>? TemporarySolution;
/// <summary>
/// Variable that stores the amount of status time added by having a low blood level.
/// </summary>
[DataField, AutoNetworkedField]
public TimeSpan StatusTime;
/// <summary>
/// Alert to show when bleeding.
/// </summary>

View file

@ -6,7 +6,6 @@ using Content.Shared.Chemistry.EntitySystems;
using Content.Shared.Chemistry.Reaction;
using Content.Shared.Chemistry.Reagent;
using Content.Shared.Damage;
using Content.Shared.Drunk;
using Content.Shared.EntityEffects.Effects;
using Content.Shared.FixedPoint;
using Content.Shared.Fluids;
@ -16,7 +15,7 @@ using Content.Shared.Mobs.Systems;
using Content.Shared.Popups;
using Content.Shared.Random.Helpers;
using Content.Shared.Rejuvenate;
using Content.Shared.Speech.EntitySystems;
using Content.Shared.StatusEffectNew;
using Robust.Shared.Audio.Systems;
using Robust.Shared.Containers;
using Robust.Shared.Prototypes;
@ -27,17 +26,18 @@ namespace Content.Shared.Body.Systems;
public abstract class SharedBloodstreamSystem : EntitySystem
{
public static readonly EntProtoId Bloodloss = "StatusEffectBloodloss";
[Dependency] protected readonly SharedSolutionContainerSystem SolutionContainer = default!;
[Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedPuddleSystem _puddle = default!;
[Dependency] private readonly StatusEffectsSystem _status = default!;
[Dependency] private readonly AlertsSystem _alertsSystem = default!;
[Dependency] private readonly MobStateSystem _mobStateSystem = default!;
[Dependency] private readonly DamageableSystem _damageableSystem = default!;
[Dependency] private readonly SharedDrunkSystem _drunkSystem = default!;
[Dependency] private readonly SharedStutteringSystem _stutteringSystem = default!;
public override void Initialize()
{
@ -100,15 +100,7 @@ public abstract class SharedBloodstreamSystem : EntitySystem
// Apply dizziness as a symptom of bloodloss.
// The effect is applied in a way that it will never be cleared without being healthy.
// Multiplying by 2 is arbitrary but works for this case, it just prevents the time from running out
_drunkSystem.TryApplyDrunkenness(
uid,
(float)bloodstream.AdjustedUpdateInterval.TotalSeconds * 2,
applySlur: false);
_stutteringSystem.DoStutter(uid, bloodstream.AdjustedUpdateInterval * 2, refresh: false);
// storing the drunk and stutter time so we can remove it independently from other effects additions
bloodstream.StatusTime += bloodstream.AdjustedUpdateInterval * 2;
DirtyField(uid, bloodstream, nameof(BloodstreamComponent.StatusTime));
_status.TrySetStatusEffectDuration(uid, Bloodloss);
}
else if (!_mobStateSystem.IsDead(uid))
{
@ -118,12 +110,7 @@ public abstract class SharedBloodstreamSystem : EntitySystem
bloodstream.BloodlossHealDamage * bloodPercentage,
ignoreResistances: true, interruptsDoAfters: false);
// Remove the drunk effect when healthy. Should only remove the amount of drunk and stutter added by low blood level
_drunkSystem.TryRemoveDrunkenessTime(uid, bloodstream.StatusTime.TotalSeconds);
_stutteringSystem.DoRemoveStutterTime(uid, bloodstream.StatusTime.TotalSeconds);
// Reset the drunk and stutter time to zero
bloodstream.StatusTime = TimeSpan.Zero;
DirtyField(uid, bloodstream, nameof(BloodstreamComponent.StatusTime));
_status.TryRemoveStatusEffect(uid, Bloodloss);
}
}
}

View file

@ -207,7 +207,7 @@ public sealed class HypospraySystem : EntitySystem
return returnValue;
// Sunrise-End
_popup.PopupClient(Loc.GetString(msgFormat ?? "hypospray-component-inject-other-message", ("other", target)), target, user);
_popup.PopupClient(Loc.GetString(msgFormat ?? "hypospray-component-inject-other-message", ("other", Identity.Entity(target, EntityManager))), target, user);
if (target != user)
{

View file

@ -1,6 +0,0 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Drunk;
[RegisterComponent, NetworkedComponent]
public sealed partial class DrunkComponent : Component { }

View file

@ -0,0 +1,11 @@
using Robust.Shared.GameStates;
namespace Content.Shared.Drunk;
/// <summary>
/// This is used by a status effect entity to apply the <see cref="DrunkComponent"/> to an entity.
/// </summary>
[RegisterComponent, NetworkedComponent]
public sealed partial class DrunkStatusEffectComponent : Component
{
}

View file

@ -1,48 +0,0 @@
using Content.Shared.Speech.EntitySystems;
using Content.Shared.StatusEffect;
using Content.Shared.Traits.Assorted;
using Robust.Shared.Prototypes;
namespace Content.Shared.Drunk;
public abstract class SharedDrunkSystem : EntitySystem
{
public static readonly ProtoId<StatusEffectPrototype> DrunkKey = "Drunk";
[Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!;
[Dependency] private readonly SharedSlurredSystem _slurredSystem = default!;
public void TryApplyDrunkenness(EntityUid uid, float boozePower, bool applySlur = true,
StatusEffectsComponent? status = null)
{
if (!Resolve(uid, ref status, false))
return;
if (TryComp<LightweightDrunkComponent>(uid, out var trait))
boozePower *= trait.BoozeStrengthMultiplier;
if (applySlur)
{
_slurredSystem.DoSlur(uid, TimeSpan.FromSeconds(boozePower), status);
}
if (!_statusEffectsSystem.HasStatusEffect(uid, DrunkKey, status))
{
_statusEffectsSystem.TryAddStatusEffect<DrunkComponent>(uid, DrunkKey, TimeSpan.FromSeconds(boozePower), true, status);
}
else
{
_statusEffectsSystem.TryAddTime(uid, DrunkKey, TimeSpan.FromSeconds(boozePower), status);
}
}
public void TryRemoveDrunkenness(EntityUid uid)
{
_statusEffectsSystem.TryRemoveStatusEffect(uid, DrunkKey);
}
public void TryRemoveDrunkenessTime(EntityUid uid, double timeRemoved)
{
_statusEffectsSystem.TryRemoveTime(uid, DrunkKey, TimeSpan.FromSeconds(timeRemoved));
}
}

View file

@ -0,0 +1,50 @@
using Content.Shared.Speech.EntitySystems;
using Content.Shared.StatusEffectNew;
using Content.Shared.Traits.Assorted;
using Robust.Shared.Prototypes;
namespace Content.Shared.Drunk;
public abstract class SharedDrunkSystem : EntitySystem
{
public static EntProtoId Drunk = "StatusEffectDrunk";
public static EntProtoId Woozy = "StatusEffectWoozy";
/* I have no clue why this magic number was chosen, I copied it from slur system and needed it for the overlay
If you have a more intelligent magic number be my guest to completely explode this value.
There were no comments as to why this value was chosen three years ago. */
public static float MagicNumber = 1100f;
[Dependency] protected readonly StatusEffectsSystem Status = default!;
public override void Initialize()
{
SubscribeLocalEvent<LightweightDrunkComponent, DrunkEvent>(OnLightweightDrinking);
}
public void TryApplyDrunkenness(EntityUid uid, TimeSpan boozePower)
{
var ev = new DrunkEvent(boozePower);
RaiseLocalEvent(uid, ref ev);
Status.TryAddStatusEffectDuration(uid, Drunk, ev.Duration);
}
public void TryRemoveDrunkenness(EntityUid uid)
{
Status.TryRemoveStatusEffect(uid, Drunk);
}
public void TryRemoveDrunkennessTime(EntityUid uid, TimeSpan boozePower)
{
Status.TryAddTime(uid, Drunk, - boozePower);
}
private void OnLightweightDrinking(Entity<LightweightDrunkComponent> entity, ref DrunkEvent args)
{
args.Duration *= entity.Comp.BoozeStrengthMultiplier;
}
[ByRefEvent]
public record struct DrunkEvent(TimeSpan Duration);
}

View file

@ -9,13 +9,7 @@ public sealed partial class Drunk : EntityEffect
/// BoozePower is how long each metabolism cycle will make the drunk effect last for.
/// </summary>
[DataField]
public float BoozePower = 3f;
/// <summary>
/// Whether speech should be slurred.
/// </summary>
[DataField]
public bool SlurSpeech = true;
public TimeSpan BoozePower = TimeSpan.FromSeconds(3f);
protected override string? ReagentEffectGuidebookText(IPrototypeManager prototype, IEntitySystemManager entSys)
=> Loc.GetString("reagent-effect-guidebook-drunk", ("chance", Probability));
@ -24,11 +18,10 @@ public sealed partial class Drunk : EntityEffect
{
var boozePower = BoozePower;
if (args is EntityEffectReagentArgs reagentArgs) {
if (args is EntityEffectReagentArgs reagentArgs)
boozePower *= reagentArgs.Scale.Float();
}
var drunkSys = args.EntityManager.EntitySysManager.GetEntitySystem<SharedDrunkSystem>();
drunkSys.TryApplyDrunkenness(args.TargetEntity, boozePower, SlurSpeech);
drunkSys.TryApplyDrunkenness(args.TargetEntity, boozePower);
}
}

View file

@ -12,7 +12,6 @@ namespace Content.Shared.Movement.Systems;
public sealed class WormSystem : EntitySystem
{
[Dependency] private readonly AlertsSystem _alerts = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
[Dependency] private readonly SharedStunSystem _stun = default!;
public override void Initialize()

View file

@ -1,8 +1,11 @@
using Content.Shared.StatusEffect;
using Robust.Shared.Prototypes;
namespace Content.Shared.Speech.EntitySystems;
public abstract class SharedSlurredSystem : EntitySystem
{
public static readonly EntProtoId Stutter = "StatusEffectSlurred";
public virtual void DoSlur(EntityUid uid, TimeSpan time, StatusEffectsComponent? status = null) { }
}

View file

@ -1,26 +1,24 @@
using Content.Shared.StatusEffect;
using Content.Shared.StatusEffectNew;
using Robust.Shared.Prototypes;
namespace Content.Shared.Speech.EntitySystems;
public abstract class SharedStutteringSystem : EntitySystem
{
public static readonly ProtoId<StatusEffectPrototype> StutterKey = "Stutter";
public static readonly EntProtoId Stuttering = "StatusEffectStutter";
[Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!;
[Dependency] protected readonly StatusEffectsSystem Status = default!;
// For code in shared... I imagine we ain't getting accent prediction anytime soon so let's not bother.
public virtual void DoStutter(EntityUid uid, TimeSpan time, bool refresh, StatusEffectsComponent? status = null)
public virtual void DoStutter(EntityUid uid, TimeSpan time, bool refresh)
{
}
public virtual void DoRemoveStutterTime(EntityUid uid, double timeRemoved)
public virtual void DoRemoveStutterTime(EntityUid uid, TimeSpan timeRemoved)
{
_statusEffectsSystem.TryRemoveTime(uid, StutterKey, TimeSpan.FromSeconds(timeRemoved));
}
public void DoRemoveStutter(EntityUid uid, double timeRemoved)
public virtual void DoRemoveStutter(EntityUid uid)
{
_statusEffectsSystem.TryRemoveStatusEffect(uid, StutterKey);
}
}

View file

@ -6,6 +6,7 @@ using Content.Shared.Interaction;
using Content.Shared.Nutrition;
using Content.Shared.Popups;
using Content.Shared.Storage.EntitySystems;
using Content.Shared.Verbs;
using JetBrains.Annotations;
using Robust.Shared.GameStates;
using Robust.Shared.Physics.Systems;
@ -29,6 +30,8 @@ namespace Content.Shared.Stacks
[Dependency] protected readonly SharedPopupSystem Popup = default!;
[Dependency] private readonly SharedStorageSystem _storage = default!;
public static readonly int[] DefaultSplitAmounts = { 1, 5, 10, 20, 30, 50 };
public override void Initialize()
{
base.Initialize();
@ -40,6 +43,7 @@ namespace Content.Shared.Stacks
SubscribeLocalEvent<StackComponent, InteractUsingEvent>(OnStackInteractUsing);
SubscribeLocalEvent<StackComponent, BeforeIngestedEvent>(OnBeforeEaten);
SubscribeLocalEvent<StackComponent, IngestedEvent>(OnEaten);
SubscribeLocalEvent<StackComponent, GetVerbsEvent<AlternativeVerb>>(OnStackAlternativeInteract);
_vvm.GetTypeHandler<StackComponent>()
.AddPath(nameof(StackComponent.Count), (_, comp) => comp.Count, SetCount);
@ -432,6 +436,55 @@ namespace Content.Shared.Stacks
// Here to tell the food system to do destroy stuff.
args.Destroy = true;
}
private void OnStackAlternativeInteract(EntityUid uid, StackComponent stack, GetVerbsEvent<AlternativeVerb> args)
{
if (!args.CanAccess || !args.CanInteract || args.Hands == null || stack.Count == 1)
return;
AlternativeVerb halve = new()
{
Text = Loc.GetString("comp-stack-split-halve"),
Category = VerbCategory.Split,
Act = () => UserSplit(uid, args.User, stack.Count / 2, stack),
Priority = 1
};
args.Verbs.Add(halve);
var priority = 0;
foreach (var amount in DefaultSplitAmounts)
{
if (amount >= stack.Count)
continue;
AlternativeVerb verb = new()
{
Text = amount.ToString(),
Category = VerbCategory.Split,
Act = () => UserSplit(uid, args.User, amount, stack),
// we want to sort by size, not alphabetically by the verb text.
Priority = priority
};
priority--;
args.Verbs.Add(verb);
}
}
/// <remarks>
/// OnStackAlternativeInteract() was moved to shared in order to faciliate prediction of stack splitting verbs.
/// However, prediction of interacitons with spawned entities is non-functional (or so i'm told)
/// So, UserSplit() and Split() should remain on the server for the time being.
/// This empty virtual method allows for UserSplit() to be called on the server from the client.
/// When prediction is improved, those two methods should be moved to shared, in order to predict the splitting itself (not just the verbs)
/// </remarks>
protected virtual void UserSplit(EntityUid uid, EntityUid userUid, int amount,
StackComponent? stack = null,
TransformComponent? userTransform = null)
{
}
}
/// <summary>

View file

@ -1,4 +1,3 @@
using Content.Shared.Alert;
using Content.Shared.Whitelist;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;

View file

@ -1,6 +1,7 @@
using Content.Shared.Movement.Events;
using Content.Shared.Movement.Systems;
using Content.Shared.Rejuvenate;
using Content.Shared.Speech;
using Content.Shared.StatusEffectNew.Components;
using Content.Shared.Stunnable;
using Robust.Shared.Player;
@ -23,6 +24,8 @@ public sealed partial class StatusEffectsSystem
SubscribeLocalEvent<StatusEffectContainerComponent, StandUpAttemptEvent>(RefRelayStatusEffectEvent);
SubscribeLocalEvent<StatusEffectContainerComponent, StunEndAttemptEvent>(RefRelayStatusEffectEvent);
SubscribeLocalEvent<StatusEffectContainerComponent, AccentGetEvent>(RelayStatusEffectEvent);
}
private void RefRelayStatusEffectEvent<T>(EntityUid uid, StatusEffectContainerComponent component, ref T args) where T : struct

View file

@ -8,7 +8,6 @@ using Content.Shared.Interaction;
using Content.Shared.Item;
using Content.Shared.Materials;
using Content.Shared.Nutrition;
using Content.Shared.Nutrition.EntitySystems;
using Content.Shared.Popups;
using Content.Shared.Storage.Components;
using Content.Shared.Tools.EntitySystems;
@ -26,7 +25,6 @@ namespace Content.Shared.Storage.EntitySystems;
/// </summary>
public sealed class SecretStashSystem : EntitySystem
{
[Dependency] private readonly IngestionSystem _ingestion = default!;
[Dependency] private readonly SharedPopupSystem _popupSystem = default!;
[Dependency] private readonly SharedHandsSystem _handsSystem = default!;
[Dependency] private readonly SharedContainerSystem _containerSystem = default!;

View file

@ -1,13 +1,21 @@
using Content.Shared.Lock;
using Robust.Shared.GameStates;
using Robust.Shared.Serialization;
namespace Content.Shared.Trigger.Components.Effects;
/// <summary>
/// Will lock, unlock or toggle an entity with the <see cref="LockComponent"/>.
/// If TargetUser is true then they will be (un)locked instead.
/// </summary>
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
public sealed partial class LockOnTriggerComponent : BaseXOnTriggerComponent
{
/// <summary>
/// If the trigger will lock, unlock or toggle the lock.
/// </summary>
[DataField, AutoNetworkedField]
public LockAction LockOnTrigger = LockAction.Toggle;
public LockAction LockMode = LockAction.Toggle;
}
[Serializable, NetSerializable]

View file

@ -19,16 +19,21 @@ public sealed class LockOnTriggerSystem : EntitySystem
if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key))
return;
switch (ent.Comp.LockOnTrigger)
var target = ent.Comp.TargetUser ? args.User : ent.Owner;
if (!TryComp<LockComponent>(target, out var lockComp))
return; // prevent the Resolve in Lock/Unlock/ToggleLock from logging errors in case the user does not have the component
switch (ent.Comp.LockMode)
{
case LockAction.Lock:
_lock.Lock(ent.Owner, args.User);
_lock.Lock(target.Value, args.User, lockComp);
break;
case LockAction.Unlock:
_lock.Unlock(ent, args.User);
_lock.Unlock(target.Value, args.User, lockComp);
break;
case LockAction.Toggle:
_lock.ToggleLock(ent, args.User);
_lock.ToggleLock(target.Value, args.User, lockComp);
break;
}
}

View file

@ -1,46 +1,4 @@
Entries:
- author: EmoGarbage404
changes:
- message: Added 3 modkits for the proto-kinetic accelerator, granting increased
damage, range, and fire rate. They can be researched via the new "Kinetic Modifications"
arsenal tech.
type: Add
- message: Reduced damage and range on the proto-kinetic accelerator.
type: Tweak
id: 8351
time: '2025-04-25T18:18:24.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/31247
- author: Wolfkey-SomeoneElseTookMyUsername
changes:
- message: Added cotton buns, which can be be used for the creation of custom burgers
that can be eaten by moths.
type: Add
id: 8352
time: '2025-04-26T01:54:14.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36405
- author: Booblesnoot42
changes:
- message: Due to a lack of functionality, light-switches have temporarily been
removed from the construction menu.
type: Remove
id: 8353
time: '2025-04-26T01:54:23.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/34664
- author: OnyxTheBrave
changes:
- message: Cloth is now able to be made in the Sheet-Meister 2000
type: Add
id: 8354
time: '2025-04-26T03:22:52.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/32676
- author: SyaoranFox
changes:
- message: Pulse Pistol, Pulse Carbine, and Pulse Rifle now share the same sound
file.
type: Tweak
id: 8355
time: '2025-04-26T13:36:51.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36952
- author: RedBookcase
changes:
- message: Various changes to edged weapons, including new storage sprites and new
@ -3953,3 +3911,44 @@
id: 8863
time: '2025-08-18T14:33:16.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/39727
- author: SlamBamActionman
changes:
- message: Aiming with the Hristov is now working correctly when using the Separated
Chat HUD mode.
type: Fix
- message: Cursor targetting with the Hristov now correctly selects the target underneath
the cursor.
type: Fix
id: 8864
time: '2025-08-18T18:22:02.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/35087
- author: Zokkie
changes:
- message: Lone Operative is now assigned the Solo Antagonist role ingame instead
of the Team Antagonist role.
type: Fix
id: 8865
time: '2025-08-18T18:57:30.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36521
- author: beck-thompson, slarticodefast
changes:
- message: Fixed rebinding keys crashing the client.
type: Fix
id: 8866
time: '2025-08-18T18:58:30.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/39732
- author: Princess-Cheeseballs
changes:
- message: Being a Lightweight drunk no longer extends your bloodloss
type: Fix
id: 8867
time: '2025-08-18T20:26:29.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/38678
- author: SlamBamActionman
changes:
- message: Auto-injector/medipen pop-ups now show the correct identity when injecting
someone else.
type: Fix
id: 8868
time: '2025-08-18T20:42:41.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/39735

View file

@ -538,4 +538,17 @@
id: 66
time: '2025-08-18T04:33:37.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/39090
- author: beck-thompson
changes:
- message: Replaced the guaranteed explosives on the infiltrator with a random grenade
spawner and ammo bundle.
type: Tweak
- message: Replaced the guaranteed med spawns on the infiltrator with random med
kit spawners.
type: Tweak
- message: Added a random loot spawner to the infiltrator.
type: Add
id: 67
time: '2025-08-18T18:22:15.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/39091
Order: 1

View file

@ -8,7 +8,7 @@ hypospray-volume-label = Volume: [color=white]{$currentVolume}/{$totalVolume}u[/
## Entity
hypospray-component-inject-other-message = You inject {$other}.
hypospray-component-inject-other-message = You inject {THE($other)}.
hypospray-component-inject-self-message = You inject yourself.
hypospray-component-empty-message = Nothing to inject.
hypospray-component-feel-prick-message = You feel a tiny prick!

View file

@ -2,7 +2,7 @@
roles-antag-changeling-objective = A intelligent predator that assumes the identities of its victims.
changeling-devour-attempt-failed-rotting = This corpse has only rotted biomass.
changeling-devour-attempt-failed-protected = This victim's biomass is protected.
changeling-devour-attempt-failed-protected = This victim's biomass is protected by armor!
changeling-devour-begin-windup-self = Our uncanny mouth reveals itself with otherworldly hunger.
changeling-devour-begin-windup-others = { CAPITALIZE(POSS-ADJ($user)) } uncanny mouth reveals itself with otherworldly hunger.

View file

@ -1,6 +1,17 @@
meta:
format: 6
postmapinit: false
format: 7
category: Grid
engineVersion: 266.0.0
forkId: ""
forkVersion: ""
time: 08/18/2025 05:46:30
entityCount: 822
maps: []
grids:
- 1
orphans:
- 1
nullspace: []
tilemap:
0: Space
3: FloorArcadeRed
@ -34,20 +45,20 @@ entities:
chunks:
-1,-1:
ind: -1,-1
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAADHwAAAAABHwAAAAACHwAAAAABHwAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAbgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAWAAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAWAAAAAAAHwAAAAACfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAWAAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAACHwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAHwAAAAABHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAHwAAAAACHwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAXQAAAAACWAAAAAAAHwAAAAACHwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAACaAAAAAAAWQAAAAAAHwAAAAADHwAAAAAAHwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAXQAAAAADWQAAAAAAaAAAAAABWAAAAAAAHwAAAAAAHwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAXQAAAAAAXQAAAAADWAAAAAAAHwAAAAACHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAWAAAAAAAWAAAAAAAWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAfAAAAAAMAHwAAAAABAB8AAAAAAgAfAAAAAAEAHwAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAbgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAB8AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAWAAAAAAAAB8AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAFgAAAAAAAAfAAAAAAIAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAABYAAAAAAAAHwAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAB8AAAAAAgAfAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAH0AAAAAAAB9AAAAAAAAfQAAAAAAAH4AAAAAAAAfAAAAAAEAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAH4AAAAAAAB+AAAAAAAAHwAAAAACAB8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAfAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAXQAAAAACAFgAAAAAAAAfAAAAAAIAHwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAABdAAAAAAIAaAAAAAAAAFkAAAAAAAAfAAAAAAMAHwAAAAAAAB8AAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAXQAAAAADAFkAAAAAAABoAAAAAAEAWAAAAAAAAB8AAAAAAAAfAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAABdAAAAAAAAXQAAAAADAFgAAAAAAAAfAAAAAAIAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAABYAAAAAAAAWAAAAAAAAFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
version: 7
0,-1:
ind: 0,-1
tiles: HwAAAAABHwAAAAABHwAAAAABHwAAAAABfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAbgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACWAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACWAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABWAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAADfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABWAAAAAAAegAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAADHwAAAAAAHwAAAAAAegAAAAADegAAAAABfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAWAAAAAAAegAAAAAAAwAAAAAAegAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAADWAAAAAAAfgAAAAAAAwAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWAAAAAAAWAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
tiles: HwAAAAABAB8AAAAAAQAfAAAAAAEAHwAAAAABAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAG4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAIAWAAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACAFgAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAQBYAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABAH4AAAAAAAB9AAAAAAAAfQAAAAAAAH0AAAAAAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAwB+AAAAAAAAfgAAAAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABAFgAAAAAAAB6AAAAAAMAfgAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAwAfAAAAAAAAHwAAAAAAAHoAAAAAAwB6AAAAAAEAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAAAWAAAAAAAAHoAAAAAAAADAAAAAAAAegAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAADAFgAAAAAAAB+AAAAAAAAAwAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFgAAAAAAABYAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
version: 7
-1,-2:
ind: -1,-2
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAWAAAAAAAWAAAAAAAWAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAOAAAAAAAJAAAAAAAOAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAOAAAAAAAJAAAAAAAOAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAOAAAAAAAJAAAAAAAOAAAAAAAWAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAACHwAAAAAAHwAAAAADWAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAACTwAAAAAAHwAAAAABWAAAAAAAfgAAAAAAfgAAAAAAbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAWAAAAAAAfgAAAAAAHwAAAAAAHwAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAKAAAAAAAKAAAAAAAWAAAAAAAHwAAAAADHwAAAAAAHwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAWAAAAAAAHwAAAAAAWAAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAACHwAAAAABHwAAAAAAHwAAAAADHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAbgAAAAAAHwAAAAAAHwAAAAABfgAAAAAAfgAAAAAAfgAAAAAA
version: 6
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAB9AAAAAAAAfQAAAAAAAH0AAAAAAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAFgAAAAAAABYAAAAAAAAWAAAAAAAAH4AAAAAAAB9AAAAAAAAfQAAAAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAA4AAAAAAAAJAAAAAAAADgAAAAAAAB+AAAAAAAAfQAAAAAAAH0AAAAAAAB9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAOAAAAAAAACQAAAAAAAA4AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAADgAAAAAAAAkAAAAAAAAOAAAAAAAAFgAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAAfAAAAAAIAHwAAAAAAAB8AAAAAAwBYAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAHwAAAAACAE8AAAAAAAAfAAAAAAEAWAAAAAAAAH4AAAAAAAB+AAAAAAAAbgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAB8AAAAAAAAfAAAAAAAAHwAAAAAAAFgAAAAAAAB+AAAAAAAAHwAAAAAAAB8AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAB+AAAAAAAAKAAAAAAAACgAAAAAAABYAAAAAAAAHwAAAAADAB8AAAAAAAAfAAAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAfgAAAAAAAFgAAAAAAAAfAAAAAAAAWAAAAAAAAH4AAAAAAAAfAAAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAB8AAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAB8AAAAAAgAfAAAAAAEAHwAAAAAAAB8AAAAAAwAfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAG4AAAAAAAAfAAAAAAAAHwAAAAABAH4AAAAAAAB+AAAAAAAAfgAAAAAAAA==
version: 7
0,-2:
ind: 0,-2
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAATwAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAATwAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAATwAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAABfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABHwAAAAADHwAAAAABHwAAAAADHwAAAAABWAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAADHwAAAAACHwAAAAAAHwAAAAACHwAAAAADfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAHwAAAAACHwAAAAAAHwAAAAADHwAAAAABfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABHwAAAAAAHwAAAAABHwAAAAADfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAHwAAAAAAHwAAAAACbgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
version: 6
tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAfQAAAAAAAH0AAAAAAAB9AAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH0AAAAAAAB9AAAAAAAAfgAAAAAAAE8AAAAAAAB+AAAAAAAATwAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB9AAAAAAAAfQAAAAAAAH4AAAAAAABPAAAAAAAAfgAAAAAAAE8AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAATwAAAAAAAH4AAAAAAABPAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAHwAAAAABAH4AAAAAAAB+AAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AAAAAAQAfAAAAAAMAHwAAAAABAB8AAAAAAwAfAAAAAAEAWAAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAMAHwAAAAACAB8AAAAAAAAfAAAAAAIAHwAAAAADAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAAB8AAAAAAgAfAAAAAAAAHwAAAAADAB8AAAAAAQB+AAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAAAAAAEAHwAAAAAAAB8AAAAAAQAfAAAAAAMAfgAAAAAAAH4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAH4AAAAAAAAfAAAAAAAAHwAAAAACAG4AAAAAAAB+AAAAAAAAfgAAAAAAAH4AAAAAAAB+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
version: 7
- type: Broadphase
- type: Physics
bodyStatus: InAir
@ -576,12 +587,14 @@ entities:
flags: Hide
- type: OccluderTree
- type: Shuttle
dampingModifier: 0.25
- type: RadiationGridResistance
- type: GravityShake
shakeTimes: 10
- type: GasTileOverlay
- type: SpreaderGrid
- type: GridPathfinding
- type: ImplicitRoof
- proto: AirlockExternalGlassShuttleSyndicateLocked
entities:
- uid: 8
@ -593,7 +606,8 @@ entities:
- type: DeviceLinkSource
linkedPorts:
13:
- DoorStatus: Close
- - DoorStatus
- Close
- type: DeviceLinkSink
invokeCounter: 1
- uid: 10
@ -605,7 +619,8 @@ entities:
- type: DeviceLinkSource
linkedPorts:
3:
- DoorStatus: Close
- - DoorStatus
- Close
- type: DeviceLinkSink
invokeCounter: 1
- proto: AirlockExternalSyndicateLocked
@ -618,7 +633,8 @@ entities:
- type: DeviceLinkSource
linkedPorts:
14:
- DoorStatus: DoorBolt
- - DoorStatus
- DoorBolt
- uid: 3
components:
- type: Transform
@ -629,7 +645,8 @@ entities:
- type: DeviceLinkSource
linkedPorts:
10:
- DoorStatus: Close
- - DoorStatus
- Close
- uid: 7
components:
- type: Transform
@ -638,7 +655,8 @@ entities:
- type: DeviceLinkSource
linkedPorts:
12:
- DoorStatus: DoorBolt
- - DoorStatus
- DoorBolt
- uid: 9
components:
- type: Transform
@ -647,7 +665,8 @@ entities:
- type: DeviceLinkSource
linkedPorts:
22:
- DoorStatus: DoorBolt
- - DoorStatus
- DoorBolt
- uid: 12
components:
- type: Transform
@ -656,7 +675,8 @@ entities:
- type: DeviceLinkSource
linkedPorts:
7:
- DoorStatus: DoorBolt
- - DoorStatus
- DoorBolt
- uid: 13
components:
- type: Transform
@ -667,7 +687,8 @@ entities:
- type: DeviceLinkSource
linkedPorts:
8:
- DoorStatus: Close
- - DoorStatus
- Close
- uid: 14
components:
- type: Transform
@ -676,7 +697,8 @@ entities:
- type: DeviceLinkSource
linkedPorts:
2:
- DoorStatus: DoorBolt
- - DoorStatus
- DoorBolt
- uid: 22
components:
- type: Transform
@ -685,7 +707,8 @@ entities:
- type: DeviceLinkSource
linkedPorts:
9:
- DoorStatus: DoorBolt
- - DoorStatus
- DoorBolt
- proto: AirlockSyndicateGlassLocked
entities:
- uid: 4
@ -727,12 +750,16 @@ entities:
- type: Transform
pos: -3.5,-18.5
parent: 1
- type: Fixtures
fixtures: {}
- uid: 19
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: 1.5,-8.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: AtmosFixNitrogenMarker
entities:
- uid: 25
@ -820,45 +847,6 @@ entities:
- type: Transform
pos: 1.4510483,-2.399527
parent: 1
- proto: Brutepack
entities:
- uid: 44
components:
- type: Transform
pos: -3.292087,-4.1600046
parent: 1
- uid: 45
components:
- type: Transform
pos: -3.354587,-4.4256296
parent: 1
- proto: C4
entities:
- uid: 46
components:
- type: Transform
pos: 1.7857682,-12.631323
parent: 1
- uid: 47
components:
- type: Transform
pos: 1.5045182,-12.646948
parent: 1
- uid: 48
components:
- type: Transform
pos: 1.5982682,-12.646948
parent: 1
- uid: 49
components:
- type: Transform
pos: 1.4107682,-12.646948
parent: 1
- uid: 50
components:
- type: Transform
pos: 1.6920182,-12.631323
parent: 1
- proto: CableApcExtension
entities:
- uid: 51
@ -2210,26 +2198,26 @@ entities:
rot: 3.141592653589793 rad
pos: -0.5,-3.5
parent: 1
- proto: CigPackSyndicate
- proto: ClothingBackpackDuffelSyndicateAmmoFilled
entities:
- uid: 313
- uid: 49
components:
- type: Transform
pos: -3.5658307,-17.516623
pos: 1.4468282,-11.670399
parent: 1
- proto: ClothingBackpackDuffelSyndicateFilledMedical
entities:
- uid: 314
components:
- type: Transform
pos: -3.5044222,-6.293252
pos: -5.6167116,-4.2485933
parent: 1
- proto: ClothingHeadHatSyndie
entities:
- uid: 315
components:
- type: Transform
pos: -3.1200604,-17.289778
pos: -3.0420556,-17.469692
parent: 1
- proto: ClothingHeadHatSyndieMAA
entities:
@ -3617,18 +3605,6 @@ entities:
- type: Transform
pos: -4.5,-3.5
parent: 1
- proto: MedkitCombatFilled
entities:
- uid: 501
components:
- type: Transform
pos: -3.401462,-3.5350046
parent: 1
- uid: 502
components:
- type: Transform
pos: -3.557712,-3.4256296
parent: 1
- proto: Mirror
entities:
- uid: 503
@ -3636,6 +3612,8 @@ entities:
- type: Transform
pos: 4.5,-3.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: Multitool
entities:
- uid: 504
@ -3672,17 +3650,38 @@ entities:
- type: Transform
pos: -2.5,-12.5
parent: 1
- proto: Ointment
- proto: NukeOpsGrenadeSpawner
entities:
- uid: 511
- uid: 44
components:
- type: Transform
pos: -3.651462,-4.5193796
pos: 1.5,-12.5
parent: 1
- uid: 512
- proto: NukeOpsLootSpawner
entities:
- uid: 46
components:
- type: Transform
pos: -3.667087,-4.2225046
pos: -3.5,-17.5
parent: 1
- proto: NukeOpsMedkitBruteSpawner
entities:
- uid: 48
components:
- type: Transform
pos: -3.5,-3.5
parent: 1
- uid: 50
components:
- type: Transform
pos: -3.5,-6.5
parent: 1
- proto: NukeOpsMedkitSpawner
entities:
- uid: 47
components:
- type: Transform
pos: -3.5,-4.5
parent: 1
- proto: OperatingTable
entities:
@ -3761,6 +3760,8 @@ entities:
- type: Transform
pos: 1.5,-14.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: PosterContrabandCC64KAd
entities:
- uid: 525
@ -3768,6 +3769,8 @@ entities:
- type: Transform
pos: -5.5,-18.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: PosterContrabandCybersun600
entities:
- uid: 526
@ -3775,6 +3778,8 @@ entities:
- type: Transform
pos: 2.5,-6.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: PosterContrabandDonk
entities:
- uid: 527
@ -3783,6 +3788,8 @@ entities:
rot: 3.141592653589793 rad
pos: 3.5,-18.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: PosterContrabandDonutCorp
entities:
- uid: 528
@ -3791,6 +3798,8 @@ entities:
rot: 3.141592653589793 rad
pos: 1.5,-22.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: PosterContrabandEnergySwords
entities:
- uid: 529
@ -3798,6 +3807,8 @@ entities:
- type: Transform
pos: 2.5,-18.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: PosterContrabandEnlistGorlex
entities:
- uid: 530
@ -3806,6 +3817,8 @@ entities:
rot: 3.141592653589793 rad
pos: 2.5,-13.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: PosterContrabandFreeSyndicateEncryptionKey
entities:
- uid: 531
@ -3813,6 +3826,8 @@ entities:
- type: Transform
pos: -2.5,-8.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: PosterContrabandInterdyne
entities:
- uid: 532
@ -3821,6 +3836,8 @@ entities:
rot: 3.141592653589793 rad
pos: -4.5,-6.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: PosterContrabandKosmicheskayaStantsiya
entities:
- uid: 533
@ -3828,6 +3845,8 @@ entities:
- type: Transform
pos: -2.5,-22.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: PosterContrabandMoth
entities:
- uid: 534
@ -3835,11 +3854,15 @@ entities:
- type: Transform
pos: -2.5,-14.5
parent: 1
- type: Fixtures
fixtures: {}
- uid: 535
components:
- type: Transform
pos: 2.5,-3.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: PosterContrabandNuclearDeviceInformational
entities:
- uid: 536
@ -3848,11 +3871,15 @@ entities:
rot: 3.141592653589793 rad
pos: -3.5,-13.5
parent: 1
- type: Fixtures
fixtures: {}
- uid: 537
components:
- type: Transform
pos: 0.5,-14.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: PosterContrabandSyndicatePistol
entities:
- uid: 538
@ -3860,6 +3887,8 @@ entities:
- type: Transform
pos: 1.5,-10.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: PosterContrabandSyndicateRecruitment
entities:
- uid: 539
@ -3867,6 +3896,8 @@ entities:
- type: Transform
pos: -1.5,-14.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: PosterContrabandWaffleCorp
entities:
- uid: 540
@ -3875,6 +3906,8 @@ entities:
rot: 3.141592653589793 rad
pos: -2.5,-23.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: Poweredlight
entities:
- uid: 541
@ -4302,9 +4335,13 @@ entities:
- type: DeviceLinkSource
linkedPorts:
600:
- Pressed: Toggle
- - Pressed
- Toggle
599:
- Pressed: Toggle
- - Pressed
- Toggle
- type: Fixtures
fixtures: {}
- uid: 611
components:
- type: Transform
@ -4313,7 +4350,10 @@ entities:
- type: DeviceLinkSource
linkedPorts:
605:
- Pressed: Toggle
- - Pressed
- Toggle
- type: Fixtures
fixtures: {}
- proto: SignalButtonDirectional
entities:
- uid: 20
@ -4325,9 +4365,13 @@ entities:
- type: DeviceLinkSource
linkedPorts:
602:
- Pressed: Toggle
- - Pressed
- Toggle
598:
- Pressed: Toggle
- - Pressed
- Toggle
- type: Fixtures
fixtures: {}
- uid: 21
components:
- type: Transform
@ -4337,19 +4381,28 @@ entities:
- type: DeviceLinkSource
linkedPorts:
597:
- Pressed: Toggle
- - Pressed
- Toggle
601:
- Pressed: Toggle
- - Pressed
- Toggle
608:
- Pressed: Toggle
- - Pressed
- Toggle
606:
- Pressed: Toggle
- - Pressed
- Toggle
604:
- Pressed: Toggle
- - Pressed
- Toggle
607:
- Pressed: Toggle
- - Pressed
- Toggle
603:
- Pressed: Toggle
- - Pressed
- Toggle
- type: Fixtures
fixtures: {}
- proto: SignDirectionalEvac
entities:
- uid: 613
@ -4357,30 +4410,40 @@ entities:
- type: Transform
pos: 0.5,-22.5
parent: 1
- type: Fixtures
fixtures: {}
- uid: 614
components:
- type: Transform
rot: 1.5707963267948966 rad
pos: 4.5,-15.5
parent: 1
- type: Fixtures
fixtures: {}
- uid: 615
components:
- type: Transform
rot: 3.141592653589793 rad
pos: -5.5,-14.5
parent: 1
- type: Fixtures
fixtures: {}
- uid: 616
components:
- type: Transform
rot: 3.141592653589793 rad
pos: 4.5,-14.5
parent: 1
- type: Fixtures
fixtures: {}
- uid: 617
components:
- type: Transform
rot: -1.5707963267948966 rad
pos: -5.5,-15.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: SignElectricalMed
entities:
- uid: 618
@ -4388,6 +4451,8 @@ entities:
- type: Transform
pos: -2.5,-18.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: SignNosmoking
entities:
- uid: 619
@ -4395,6 +4460,8 @@ entities:
- type: Transform
pos: 5.5,-22.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: SignSecureSmallRed
entities:
- uid: 620
@ -4402,16 +4469,22 @@ entities:
- type: Transform
pos: -3.5,-11.5
parent: 1
- type: Fixtures
fixtures: {}
- uid: 621
components:
- type: Transform
pos: 4.5,-17.5
parent: 1
- type: Fixtures
fixtures: {}
- uid: 622
components:
- type: Transform
pos: 2.5,-11.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: SMESBasic
entities:
- uid: 623
@ -4481,30 +4554,6 @@ entities:
- type: Transform
pos: 3.5,-19.5
parent: 1
- proto: SyndieMiniBomb
entities:
- uid: 633
components:
- type: Transform
pos: 1.4127003,-11.973867
parent: 1
- uid: 634
components:
- type: Transform
pos: 1.6939503,-11.973867
parent: 1
- proto: SyringeInaprovaline
entities:
- uid: 635
components:
- type: Transform
pos: -3.510837,-4.3787546
parent: 1
- uid: 636
components:
- type: Transform
pos: -3.510837,-4.0193796
parent: 1
- proto: Table
entities:
- uid: 637
@ -4689,14 +4738,7 @@ entities:
- uid: 669
components:
- type: Transform
pos: -2.5731854,-17.414778
parent: 1
- proto: ToolboxSyndicateFilled
entities:
- uid: 670
components:
- type: Transform
pos: 1.5034143,-11.298322
pos: -2.468854,-17.396727
parent: 1
- proto: VendingMachineTankDispenserEVA
entities:
@ -5516,6 +5558,8 @@ entities:
- type: Transform
pos: 4.5,-25.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: WarningO2
entities:
- uid: 828
@ -5523,6 +5567,8 @@ entities:
- type: Transform
pos: 2.5,-25.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: WarningWaste
entities:
- uid: 829
@ -5530,6 +5576,8 @@ entities:
- type: Transform
pos: 4.5,-18.5
parent: 1
- type: Fixtures
fixtures: {}
- proto: WaterCooler
entities:
- uid: 830

View file

@ -113,7 +113,7 @@
raffle:
settings: default
mindRoles:
- MindRoleGhostRoleSoloAntagonist
- MindRoleLoneops
- type: Sprite
sprite: Markers/jobs.rsi
layers:

View file

@ -19,7 +19,6 @@
group: GenericNumber
- type: StatusEffects
allowed:
- Stutter
- Electrocution
- TemporaryBlindness
- RadiationProtection

View file

@ -35,7 +35,6 @@
bodyType: KinematicController # Same for all inheritors
- type: StatusEffects
allowed:
- Stutter
- Electrocution
- type: Pullable
- type: Tag

View file

@ -15,7 +15,6 @@
bodyType: KinematicController # Same for all inheritors
- type: StatusEffects
allowed:
- Stutter
- Electrocution
- Jump # Sunrise-Edit
- Fall # Sunrise-Edit

View file

@ -19,7 +19,6 @@
baseSprintSpeed : 4
- type: StatusEffects
allowed:
- Stutter
- Electrocution
- TemporaryBlindness
- Pacified
@ -97,7 +96,6 @@
baseDecayRate: 0.04
- type: StatusEffects
allowed:
- Stutter
- Electrocution
- TemporaryBlindness
- Pacified

View file

@ -104,7 +104,6 @@
types: {}
- type: StatusEffects # Overwriting basesimplemob to remove flash, getting flashed as dragon just feelsbad
allowed:
- Stutter
- Electrocution
- TemporaryBlindness
- Pacified

View file

@ -125,10 +125,7 @@
- !type:WashCreamPieReaction
- type: StatusEffects
allowed:
- Stutter
- Electrocution
- Drunk
- SlurredSpeech
- RatvarianLanguage
- PressureImmunity
- Muted

View file

@ -0,0 +1,18 @@
- type: entity
parent: MobStatusEffectBase
id: BloodstreamStatusEffectBase
abstract: true
components:
- type: StatusEffect
whitelist:
components:
- Bloodstream
- type: entity
parent: [ BloodstreamStatusEffectBase ]
id: StatusEffectBloodloss
name: bloodloss
components:
- type: StutteringAccent
- type: DrunkStatusEffect
- type: RejuvenateRemovedStatusEffect

View file

@ -78,3 +78,17 @@
name: hallucinations
components:
- type: SeeingRainbowsStatusEffect
# Causes your vision to become blurry and gives me a headache.
- type: entity
parent: MobStatusEffectDebuff
id: StatusEffectWoozy
name: woozy
components:
- type: DrunkStatusEffect
# Causes you to get drunk
- type: entity
parent: [ StatusEffectWoozy, StatusEffectSlurred ]
id: StatusEffectDrunk
name: drunk

View file

@ -0,0 +1,27 @@
- type: entity
parent: MobStatusEffectDebuff
id: SpeechStatusEffectBase
abstract: true
components:
- type: StatusEffect
whitelist:
components:
- MobState
- Speech
requireAll: true
# Causes you to st-t-u-t-t-t-er randomly when talking.
- type: entity
parent: SpeechStatusEffectBase
id: StatusEffectStutter
name: stutter
components:
- type: StutteringAccent
# Causes you to schlur your words schwhen talking.
- type: entity
parent: SpeechStatusEffectBase
id: StatusEffectSlurred
name: slurred
components:
- type: SlurredAccent

View file

@ -588,7 +588,7 @@
factions:
- Syndicate
mindRoles:
- MindRoleNukeops
- MindRoleLoneops
- type: DynamicRuleCost
cost: 75

View file

@ -12,9 +12,9 @@
- !type:GenericStatusEffect
key: Stutter
component: ScrambledAccent
- !type:Drunk
slurSpeech: false
boozePower: 20
- !type:ModifyStatusEffect
effectProto: StatusEffectSlurred
time: 20.0
- type: reagent
id: Dylovene
@ -106,8 +106,8 @@
metabolisms:
Medicine:
effects:
- !type:GenericStatusEffect
key: Drunk
- !type:ModifyStatusEffect
effectProto: StatusEffectDrunk
time: 6.0
type: Remove
- !type:HealthChange
@ -1461,8 +1461,8 @@
key: Jitter
time: 2.0
type: Remove
- !type:GenericStatusEffect
key: Drunk
- !type:ModifyStatusEffect
effectProto: StatusEffectDrunk
time: 6.0
type: Remove
- !type:PopupMessage # we dont have sanity/mood so this will have to do

View file

@ -197,6 +197,14 @@
- type: MindRole
antagPrototype: NukeopsCommander
- type: entity
parent: MindRoleNukeops
id: MindRoleLoneops
name: Loneops Operative Role
components:
- type: MindRole
roleType: SoloAntagonist
# Revolutionaries
- type: entity
parent: BaseMindRoleAntag