diff --git a/Content.Client/Actions/ActionsSystem.cs b/Content.Client/Actions/ActionsSystem.cs index 4eaf06b691..5ff003452a 100644 --- a/Content.Client/Actions/ActionsSystem.cs +++ b/Content.Client/Actions/ActionsSystem.cs @@ -94,6 +94,7 @@ private void BaseHandleState(EntityUid uid, BaseActionComponent component, Ba component.Container = EnsureEntity(state.Container, uid); component.EntityIcon = EnsureEntity(state.EntityIcon, uid); component.CheckCanInteract = state.CheckCanInteract; + component.CheckConsciousness = state.CheckConsciousness; component.ClientExclusive = state.ClientExclusive; component.Priority = state.Priority; component.AttachedEntity = EnsureEntity(state.AttachedEntity, uid); diff --git a/Content.Client/Alerts/ClientAlertsSystem.cs b/Content.Client/Alerts/ClientAlertsSystem.cs index 237f24e3ea..9c4ebb9cd2 100644 --- a/Content.Client/Alerts/ClientAlertsSystem.cs +++ b/Content.Client/Alerts/ClientAlertsSystem.cs @@ -4,6 +4,7 @@ using Robust.Client.Player; using Robust.Shared.Player; using Robust.Shared.Prototypes; +using Robust.Shared.Timing; namespace Content.Client.Alerts; @@ -12,6 +13,7 @@ public sealed class ClientAlertsSystem : AlertsSystem { public AlertOrderPrototype? AlertOrder { get; set; } + [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; @@ -49,24 +51,23 @@ public IReadOnlyDictionary? ActiveAlerts protected override void AfterShowAlert(Entity alerts) { - if (_playerManager.LocalEntity != alerts.Owner) - return; - - SyncAlerts?.Invoke(this, alerts.Comp.Alerts); + UpdateHud(alerts); } - protected override void AfterClearAlert(Entity alertsComponent) + protected override void AfterClearAlert(Entity alerts) { - if (_playerManager.LocalEntity != alertsComponent.Owner) - return; + UpdateHud(alerts); + } - SyncAlerts?.Invoke(this, alertsComponent.Comp.Alerts); + private void ClientAlertsHandleState(Entity alerts, ref AfterAutoHandleStateEvent args) + { + UpdateHud(alerts); } - private void ClientAlertsHandleState(EntityUid uid, AlertsComponent component, ref AfterAutoHandleStateEvent args) + private void UpdateHud(Entity entity) { - if (_playerManager.LocalEntity == uid) - SyncAlerts?.Invoke(this, component.Alerts); + if (_playerManager.LocalEntity == entity.Owner) + SyncAlerts?.Invoke(this, entity.Comp.Alerts); } private void OnPlayerAttached(EntityUid uid, AlertsComponent component, LocalPlayerAttachedEvent args) diff --git a/Content.Client/Antag/AntagStatusIconSystem.cs b/Content.Client/Antag/AntagStatusIconSystem.cs index 5d87837893..804ae21ad4 100644 --- a/Content.Client/Antag/AntagStatusIconSystem.cs +++ b/Content.Client/Antag/AntagStatusIconSystem.cs @@ -22,6 +22,7 @@ public override void Initialize() SubscribeLocalEvent(GetRevIcon); SubscribeLocalEvent(GetIcon); SubscribeLocalEvent(GetIcon); + SubscribeLocalEvent(GetIcon); } /// diff --git a/Content.Client/CardboardBox/CardboardBoxSystem.cs b/Content.Client/CardboardBox/CardboardBoxSystem.cs index 50f9de239d..90a21d8e41 100644 --- a/Content.Client/CardboardBox/CardboardBoxSystem.cs +++ b/Content.Client/CardboardBox/CardboardBoxSystem.cs @@ -1,4 +1,4 @@ -using System.Numerics; +using System.Numerics; using Content.Shared.CardboardBox; using Content.Shared.CardboardBox.Components; using Content.Shared.Examine; @@ -11,6 +11,7 @@ public sealed class CardboardBoxSystem : SharedCardboardBoxSystem { [Dependency] private readonly EntityLookupSystem _entityLookup = default!; [Dependency] private readonly TransformSystem _transform = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; public override void Initialize() { @@ -55,7 +56,7 @@ private void OnBoxEffect(PlayBoxEffectMessage msg) foreach (var mob in mobMoverEntities) { var mapPos = _transform.GetMapCoordinates(mob); - if (!ExamineSystemShared.InRangeUnOccluded(sourcePos, mapPos, box.Distance, null)) + if (!_examine.InRangeUnOccluded(sourcePos, mapPos, box.Distance, null)) continue; var ent = Spawn(box.Effect, mapPos); diff --git a/Content.Client/Chat/UI/SpeechBubble.cs b/Content.Client/Chat/UI/SpeechBubble.cs index 82eccbcec8..68c937a788 100644 --- a/Content.Client/Chat/UI/SpeechBubble.cs +++ b/Content.Client/Chat/UI/SpeechBubble.cs @@ -252,7 +252,8 @@ protected override Control BuildBubble(ChatMessage message, string speechStyleCl var bubbleContent = new RichTextLabel { MaxWidth = SpeechMaxWidth, - Margin = new Thickness(2, 6, 2, 2) + Margin = new Thickness(2, 6, 2, 2), + StyleClasses = { "bubbleContent" } }; //We'll be honest. *Yes* this is hacky. Doing this in a cleaner way would require a bottom-up refactor of how saycode handles sending chat messages. -Myr diff --git a/Content.Client/Clothing/ClientClothingSystem.cs b/Content.Client/Clothing/ClientClothingSystem.cs index f7b017045e..1e624d4a9f 100644 --- a/Content.Client/Clothing/ClientClothingSystem.cs +++ b/Content.Client/Clothing/ClientClothingSystem.cs @@ -283,6 +283,9 @@ private void RenderEquipment(EntityUid equipee, EntityUid equipment, string slot // note that every insertion requires reshuffling & remapping all the existing layers. sprite.AddBlankLayer(index); sprite.LayerMapSet(key, index); + + if (layerData.Color != null) + sprite.LayerSetColor(key, layerData.Color.Value); } else index = sprite.LayerMapReserveBlank(key); diff --git a/Content.Client/Entry/EntryPoint.cs b/Content.Client/Entry/EntryPoint.cs index 3acc4ab180..7dde4557cd 100644 --- a/Content.Client/Entry/EntryPoint.cs +++ b/Content.Client/Entry/EntryPoint.cs @@ -70,6 +70,7 @@ public sealed class EntryPoint : GameClient [Dependency] private readonly IResourceManager _resourceManager = default!; [Dependency] private readonly IReplayLoadManager _replayLoad = default!; [Dependency] private readonly ILogManager _logManager = default!; + [Dependency] private readonly ContentReplayPlaybackManager _replayMan = default!; public override void Init() { @@ -100,12 +101,10 @@ public override void Init() _prototypeManager.RegisterIgnore("seed"); // Seeds prototypes are server-only. _prototypeManager.RegisterIgnore("objective"); _prototypeManager.RegisterIgnore("holiday"); - _prototypeManager.RegisterIgnore("aiFaction"); _prototypeManager.RegisterIgnore("htnCompound"); _prototypeManager.RegisterIgnore("htnPrimitive"); _prototypeManager.RegisterIgnore("gameMap"); _prototypeManager.RegisterIgnore("gameMapPool"); - _prototypeManager.RegisterIgnore("npcFaction"); _prototypeManager.RegisterIgnore("lobbyBackground"); _prototypeManager.RegisterIgnore("advertisementsPack"); _prototypeManager.RegisterIgnore("gamePreset"); @@ -193,6 +192,7 @@ private void SwitchToDefaultState(bool disconnected = false) _resourceManager, ReplayConstants.ReplayZipFolder.ToRootedPath()); + _replayMan.LastLoad = (null, ReplayConstants.ReplayZipFolder.ToRootedPath()); _replayLoad.LoadAndStartReplay(reader); } else if (_gameController.LaunchState.FromLauncher) diff --git a/Content.Client/Launcher/LauncherConnecting.cs b/Content.Client/Launcher/LauncherConnecting.cs index 9625f9e31c..29b241ae5d 100644 --- a/Content.Client/Launcher/LauncherConnecting.cs +++ b/Content.Client/Launcher/LauncherConnecting.cs @@ -54,6 +54,7 @@ private set public event Action? PageChanged; public event Action? ConnectFailReasonChanged; public event Action? ConnectionStateChanged; + public event Action? ConnectFailed; protected override void Startup() { @@ -85,6 +86,7 @@ private void OnConnectFailed(object? _, NetConnectFailArgs args) } ConnectFailReason = args.Reason; CurrentPage = Page.ConnectFailed; + ConnectFailed?.Invoke(args); } private void OnConnectStateChanged(ClientConnectionState state) diff --git a/Content.Client/Launcher/LauncherConnectingGui.xaml b/Content.Client/Launcher/LauncherConnectingGui.xaml index 083e4ca871..3734fa5b3a 100644 --- a/Content.Client/Launcher/LauncherConnectingGui.xaml +++ b/Content.Client/Launcher/LauncherConnectingGui.xaml @@ -33,10 +33,6 @@ [DataField("blockSlots"), ViewVariables(VVAccess.ReadWrite)] public SlotFlags BlockSlots = SlotFlags.MASK; - - [DataField] - public string FixtureId = SharedProjectileSystem.ProjectileFixture; } diff --git a/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs b/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs index 40e637615e..85d4ade3a4 100644 --- a/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/InjectorSystem.cs @@ -128,9 +128,21 @@ private void InjectDoAfter(Entity injector, EntityUid target, return; var actualDelay = MathHelper.Max(injector.Comp.Delay, TimeSpan.FromSeconds(1)); + float amountToInject; + if (injector.Comp.ToggleState == InjectorToggleMode.Draw) + { + // additional delay is based on actual volume left to draw in syringe when smaller than transfer amount + amountToInject = Math.Min(injector.Comp.TransferAmount.Float(), (solution.MaxVolume - solution.Volume).Float()); + } + else + { + // additional delay is based on actual volume left to inject in syringe when smaller than transfer amount + amountToInject = Math.Min(injector.Comp.TransferAmount.Float(), solution.Volume.Float()); + } + + // Injections take 0.5 seconds longer per 5u of possible space/content + actualDelay += TimeSpan.FromSeconds(amountToInject / 10); - // Injections take 0.5 seconds longer per additional 5u - actualDelay += TimeSpan.FromSeconds(injector.Comp.TransferAmount.Float() / injector.Comp.Delay.TotalSeconds - 0.5f); var isTarget = user != target; @@ -193,9 +205,9 @@ private void InjectDoAfter(Entity injector, EntityUid target, DoAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, user, actualDelay, new InjectorDoAfterEvent(), injector.Owner, target: target, used: injector.Owner) { - BreakOnUserMove = true, + BreakOnMove = true, + BreakOnWeightlessMove = false, BreakOnDamage = true, - BreakOnTargetMove = true, NeedHand = true, BreakOnHandChange = true, MovementThreshold = 0.1f, diff --git a/Content.Server/Chemistry/EntitySystems/SolutionInjectOnCollideSystem.cs b/Content.Server/Chemistry/EntitySystems/SolutionInjectOnCollideSystem.cs index 0f696774ae..fb84aca3e4 100644 --- a/Content.Server/Chemistry/EntitySystems/SolutionInjectOnCollideSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/SolutionInjectOnCollideSystem.cs @@ -3,8 +3,7 @@ using Content.Server.Chemistry.Components; using Content.Server.Chemistry.Containers.EntitySystems; using Content.Shared.Inventory; -using JetBrains.Annotations; -using Robust.Shared.Physics.Events; +using Content.Shared.Projectiles; namespace Content.Server.Chemistry.EntitySystems; @@ -17,17 +16,15 @@ public sealed class SolutionInjectOnCollideSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(HandleInjection); + SubscribeLocalEvent(HandleInjection); } - private void HandleInjection(Entity ent, ref StartCollideEvent args) + private void HandleInjection(Entity ent, ref ProjectileHitEvent args) { var component = ent.Comp; - var target = args.OtherEntity; + var target = args.Target; - if (!args.OtherBody.Hard || - args.OurFixtureId != ent.Comp.FixtureId || - !EntityManager.TryGetComponent(target, out var bloodstream) || + if (!TryComp(target, out var bloodstream) || !_solutionContainersSystem.TryGetInjectableSolution(ent.Owner, out var solution, out _)) { return; diff --git a/Content.Server/Chemistry/EntitySystems/VaporSystem.cs b/Content.Server/Chemistry/EntitySystems/VaporSystem.cs index 2c23b8f039..d945c1f818 100644 --- a/Content.Server/Chemistry/EntitySystems/VaporSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/VaporSystem.cs @@ -31,12 +31,10 @@ internal sealed class VaporSystem : EntitySystem private const float ReactTime = 0.125f; - private ISawmill _sawmill = default!; - public override void Initialize() { base.Initialize(); - _sawmill = Logger.GetSawmill("vapor"); + SubscribeLocalEvent(HandleCollide); } @@ -128,7 +126,7 @@ private void Update(float frameTime, Entity ent, Entity reagentQuantity.Quantity) { - _sawmill.Error($"Tried to tile react more than we have for reagent {reagentQuantity}. Found {reaction} and we only have {reagentQuantity.Quantity}"); + Log.Error($"Tried to tile react more than we have for reagent {reagentQuantity}. Found {reaction} and we only have {reagentQuantity.Quantity}"); reaction = reagentQuantity.Quantity; } diff --git a/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs b/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs index 49fdaa5c7e..8f8b0626a2 100644 --- a/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs +++ b/Content.Server/Chemistry/TileReactions/SpillTileReaction.cs @@ -45,9 +45,9 @@ public FixedPoint2 TileReact(TileRef tile, ReagentPrototype reagent, FixedPoint2 var step = entityManager.EnsureComponent(puddleUid); entityManager.EntitySysManager.GetEntitySystem().SetRequiredTriggerSpeed(puddleUid, _requiredSlipSpeed, step); - var slow = entityManager.EnsureComponent(puddleUid); + var slow = entityManager.EnsureComponent(puddleUid); var speedModifier = 1 - reagent.Viscosity; - entityManager.EntitySysManager.GetEntitySystem().ChangeModifiers(puddleUid, speedModifier, slow); + entityManager.EntitySysManager.GetEntitySystem().ChangeModifiers(puddleUid, speedModifier, slow); return reactVolume; } diff --git a/Content.Server/Communications/CommsHackerSystem.cs b/Content.Server/Communications/CommsHackerSystem.cs index 1248d21400..44b3aa28bd 100644 --- a/Content.Server/Communications/CommsHackerSystem.cs +++ b/Content.Server/Communications/CommsHackerSystem.cs @@ -45,7 +45,7 @@ private void OnBeforeInteractHand(EntityUid uid, CommsHackerComponent comp, Befo var doAfterArgs = new DoAfterArgs(EntityManager, uid, comp.Delay, new TerrorDoAfterEvent(), target: target, used: uid, eventTarget: uid) { BreakOnDamage = true, - BreakOnUserMove = true, + BreakOnMove = true, MovementThreshold = 0.5f, CancelDuplicate = false }; diff --git a/Content.Server/Connection/ConnectionManager.cs b/Content.Server/Connection/ConnectionManager.cs index 0ba8afb819..0734170785 100644 --- a/Content.Server/Connection/ConnectionManager.cs +++ b/Content.Server/Connection/ConnectionManager.cs @@ -1,4 +1,5 @@ using System.Collections.Immutable; +using System.Text.Json.Nodes; using System.Threading.Tasks; using Content.Server.Database; using Content.Server.GameTicking; @@ -83,7 +84,11 @@ private async Task NetMgrOnConnecting(NetConnectingArgs e) if (banHits is { Count: > 0 }) await _db.AddServerBanHitsAsync(id, banHits); - e.Deny(msg); + var properties = new Dictionary(); + if (reason == ConnectionDenyReason.Full) + properties["delay"] = _cfg.GetCVar(CCVars.GameServerFullReconnectDelay); + + e.Deny(new NetDenyReason(msg, properties)); } else { @@ -162,7 +167,8 @@ private async Task NetMgrOnConnecting(NetConnectingArgs e) var wasInGame = EntitySystem.TryGet(out var ticker) && ticker.PlayerGameStatuses.TryGetValue(userId, out var status) && status == PlayerGameStatus.JoinedGame; - if ((_plyMgr.PlayerCount >= _cfg.GetCVar(CCVars.SoftMaxPlayers) && adminData is null) && !wasInGame) + var adminBypass = _cfg.GetCVar(CCVars.AdminBypassMaxPlayers) && adminData != null; + if ((_plyMgr.PlayerCount >= _cfg.GetCVar(CCVars.SoftMaxPlayers) && !adminBypass) && !wasInGame) { return (ConnectionDenyReason.Full, Loc.GetString("soft-player-cap-full"), null); } diff --git a/Content.Server/Construction/ConstructionSystem.Initial.cs b/Content.Server/Construction/ConstructionSystem.Initial.cs index e0bdf09629..2980366500 100644 --- a/Content.Server/Construction/ConstructionSystem.Initial.cs +++ b/Content.Server/Construction/ConstructionSystem.Initial.cs @@ -250,8 +250,7 @@ void ShutdownContainers() var doAfterArgs = new DoAfterArgs(EntityManager, user, doAfterTime, new AwaitedDoAfterEvent(), null) { BreakOnDamage = true, - BreakOnTargetMove = false, - BreakOnUserMove = true, + BreakOnMove = true, NeedHand = false, // allow simultaneously starting several construction jobs using the same stack of materials. CancelDuplicate = false, diff --git a/Content.Server/Construction/ConstructionSystem.Interactions.cs b/Content.Server/Construction/ConstructionSystem.Interactions.cs index 946aaa0d3e..59a5fd6af5 100644 --- a/Content.Server/Construction/ConstructionSystem.Interactions.cs +++ b/Content.Server/Construction/ConstructionSystem.Interactions.cs @@ -288,8 +288,7 @@ private HandleResult HandleInteraction(EntityUid uid, object ev, ConstructionGra var doAfterEventArgs = new DoAfterArgs(EntityManager, interactUsing.User, step.DoAfter, doAfterEv, uid, uid, interactUsing.Used) { BreakOnDamage = false, - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, NeedHand = true }; diff --git a/Content.Server/Construction/PartExchangerSystem.cs b/Content.Server/Construction/PartExchangerSystem.cs index ee5edcbd0a..174dd1d2fa 100644 --- a/Content.Server/Construction/PartExchangerSystem.cs +++ b/Content.Server/Construction/PartExchangerSystem.cs @@ -174,7 +174,7 @@ private void OnAfterInteract(EntityUid uid, PartExchangerComponent component, Af _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.ExchangeDuration, new ExchangerDoAfterEvent(), uid, target: args.Target, used: uid) { BreakOnDamage = true, - BreakOnUserMove = true + BreakOnMove = true }); } } diff --git a/Content.Server/Database/ServerDbBase.cs b/Content.Server/Database/ServerDbBase.cs index 6121ab8843..aa3d40324b 100644 --- a/Content.Server/Database/ServerDbBase.cs +++ b/Content.Server/Database/ServerDbBase.cs @@ -1383,6 +1383,8 @@ public async Task> GetVisibleAdminRemarks(Guid player) .Include(note => note.Player) .ToListAsync()).Select(MakeAdminNoteRecord)); notesCol.AddRange(await GetMessagesImpl(db, player)); + notesCol.AddRange(await GetServerBansAsNotesForUser(db, player)); + notesCol.AddRange(await GetGroupedServerRoleBansAsNotesForUser(db, player)); return notesCol; } diff --git a/Content.Server/DeviceNetwork/Systems/DeviceListSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceListSystem.cs index 978dbc0ed9..a8d40882c4 100644 --- a/Content.Server/DeviceNetwork/Systems/DeviceListSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/DeviceListSystem.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using Content.Server.DeviceNetwork.Components; using Content.Shared.DeviceNetwork; using Content.Shared.DeviceNetwork.Components; @@ -12,8 +12,6 @@ namespace Content.Server.DeviceNetwork.Systems; [UsedImplicitly] public sealed class DeviceListSystem : SharedDeviceListSystem { - private ISawmill _sawmill = default!; - [Dependency] private readonly NetworkConfiguratorSystem _configurator = default!; public override void Initialize() @@ -23,7 +21,6 @@ public override void Initialize() SubscribeLocalEvent(OnBeforeBroadcast); SubscribeLocalEvent(OnBeforePacketSent); SubscribeLocalEvent(OnMapSave); - _sawmill = Logger.GetSawmill("devicelist"); } private void OnShutdown(EntityUid uid, DeviceListComponent component, ComponentShutdown args) @@ -154,7 +151,7 @@ private void OnMapSave(BeforeSaveEvent ev) // TODO full game saves. // when full saves are supported, this should instead add data to the BeforeSaveEvent informing the // saving system that this map (or null-space entity) also needs to be included in the save. - _sawmill.Error( + Log.Error( $"Saving a device list ({ToPrettyString(uid)}) that has a reference to an entity on another map ({ToPrettyString(ent)}). Removing entity from list."); } diff --git a/Content.Server/Disposal/Tube/DisposalTubeSystem.cs b/Content.Server/Disposal/Tube/DisposalTubeSystem.cs index b7d8455d85..20aa8b6d2c 100644 --- a/Content.Server/Disposal/Tube/DisposalTubeSystem.cs +++ b/Content.Server/Disposal/Tube/DisposalTubeSystem.cs @@ -122,7 +122,7 @@ private void OnUiAction(EntityUid uid, DisposalRouterComponent router, SharedDis if (trimmed == "") continue; - router.Tags.Add(tag.Trim()); + router.Tags.Add(trimmed); } _audioSystem.PlayPvs(router.ClickSound, uid, AudioParams.Default.WithVolume(-2f)); diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs index 6938792315..df375de695 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs @@ -512,8 +512,7 @@ public bool TryInsert(EntityUid unitId, EntityUid toInsertId, EntityUid? userId, var doAfterArgs = new DoAfterArgs(EntityManager, userId.Value, delay, new DisposalDoAfterEvent(), unitId, target: toInsertId, used: unitId) { BreakOnDamage = true, - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, NeedHand = false }; diff --git a/Content.Server/Dragon/Components/DragonComponent.cs b/Content.Server/Dragon/Components/DragonComponent.cs index f403979a00..80461e156a 100644 --- a/Content.Server/Dragon/Components/DragonComponent.cs +++ b/Content.Server/Dragon/Components/DragonComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.NPC.Prototypes; using Robust.Shared.Audio; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -57,5 +58,12 @@ public sealed partial class DragonComponent : Component { Params = AudioParams.Default.WithVolume(3f), }; + + /// + /// NPC faction to re-add after being zombified. + /// Prevents zombie dragon from being attacked by its own carp. + /// + [DataField] + public ProtoId Faction = "Dragon"; } } diff --git a/Content.Server/Dragon/DragonSystem.cs b/Content.Server/Dragon/DragonSystem.cs index 93d6bc8db0..36df6fb6f2 100644 --- a/Content.Server/Dragon/DragonSystem.cs +++ b/Content.Server/Dragon/DragonSystem.cs @@ -10,6 +10,8 @@ using Content.Shared.Mind.Components; using Content.Shared.Mobs; using Content.Shared.Movement.Systems; +using Content.Shared.NPC.Systems; +using Content.Shared.Zombies; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.GameStates; @@ -24,6 +26,7 @@ public sealed partial class DragonSystem : EntitySystem [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ITileDefinitionManager _tileDef = default!; [Dependency] private readonly MovementSpeedModifierSystem _movement = default!; + [Dependency] private readonly NpcFactionSystem _faction = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly RoleSystem _role = default!; [Dependency] private readonly SharedActionsSystem _actions = default!; @@ -55,6 +58,7 @@ public override void Initialize() SubscribeLocalEvent(OnDragonMove); SubscribeLocalEvent(OnMobStateChanged); SubscribeLocalEvent(OnCreated); + SubscribeLocalEvent(OnZombified); } public override void Update(float frameTime) @@ -202,6 +206,12 @@ private void OnCreated(EntityUid uid, DragonComponent comp, ref GenericAntagCrea }, mind); } + private void OnZombified(Entity ent, ref EntityZombifiedEvent args) + { + // prevent carp attacking zombie dragon + _faction.AddFaction(ent.Owner, ent.Comp.Faction); + } + private void Roar(EntityUid uid, DragonComponent comp) { if (comp.SoundRoar != null) diff --git a/Content.Server/Electrocution/ElectrocutionSystem.cs b/Content.Server/Electrocution/ElectrocutionSystem.cs index f71f8b6974..d967013f65 100644 --- a/Content.Server/Electrocution/ElectrocutionSystem.cs +++ b/Content.Server/Electrocution/ElectrocutionSystem.cs @@ -19,7 +19,6 @@ using Content.Shared.Maps; using Content.Shared.Mobs; using Content.Shared.Popups; -using Content.Shared.Pulling.Components; using Content.Shared.Speech.EntitySystems; using Content.Shared.StatusEffect; using Content.Shared.Stunnable; @@ -32,6 +31,8 @@ using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; +using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; +using PullerComponent = Content.Shared.Movement.Pulling.Components.PullerComponent; namespace Content.Server.Electrocution; @@ -475,14 +476,14 @@ private void GetChainedElectrocutionTargetsRecurse( all.Add((entity, depth)); visited.Add(entity); - if (TryComp(entity, out var pullable) && + if (TryComp(entity, out var pullable) && pullable.Puller is { Valid: true } pullerId && !visited.Contains(pullerId)) { GetChainedElectrocutionTargetsRecurse(pullerId, depth + 1, visited, all); } - if (TryComp(entity, out var puller) && + if (TryComp(entity, out var puller) && puller.Pulling is { Valid: true } pullingId && !visited.Contains(pullingId)) { diff --git a/Content.Server/Engineering/EntitySystems/DisassembleOnAltVerbSystem.cs b/Content.Server/Engineering/EntitySystems/DisassembleOnAltVerbSystem.cs index 08bf68c4d2..61b6f3d93d 100644 --- a/Content.Server/Engineering/EntitySystems/DisassembleOnAltVerbSystem.cs +++ b/Content.Server/Engineering/EntitySystems/DisassembleOnAltVerbSystem.cs @@ -45,7 +45,7 @@ public async void AttemptDisassemble(EntityUid uid, EntityUid user, EntityUid ta { var doAfterArgs = new DoAfterArgs(EntityManager, user, component.DoAfterTime, new AwaitedDoAfterEvent(), null) { - BreakOnUserMove = true, + BreakOnMove = true, }; var result = await doAfterSystem.WaitDoAfter(doAfterArgs); diff --git a/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs b/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs index 61c4937a27..57999ae48c 100644 --- a/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs +++ b/Content.Server/Engineering/EntitySystems/SpawnAfterInteractSystem.cs @@ -47,7 +47,7 @@ bool IsTileClear() { var doAfterArgs = new DoAfterArgs(EntityManager, args.User, component.DoAfterTime, new AwaitedDoAfterEvent(), null) { - BreakOnUserMove = true, + BreakOnMove = true, }; var result = await _doAfterSystem.WaitDoAfter(doAfterArgs); diff --git a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs index 169daca07a..12c701866c 100644 --- a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs +++ b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs @@ -118,8 +118,7 @@ public void TryFree(EntityUid target, EntityUid user, EntityUid ensnare, Ensnar var doAfterEventArgs = new DoAfterArgs(EntityManager, user, freeTime, new EnsnareableDoAfterEvent(), target, target: target, used: ensnare) { - BreakOnUserMove = breakOnMove, - BreakOnTargetMove = breakOnMove, + BreakOnMove = breakOnMove, BreakOnDamage = false, NeedHand = true, BlockDuplicate = true, diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs index 31451c425f..ba937d77ad 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.Processing.cs @@ -17,11 +17,15 @@ using Robust.Shared.Timing; using Robust.Shared.Utility; using TimedDespawnComponent = Robust.Shared.Spawners.TimedDespawnComponent; +using Content.Server.Atmos.Components; +using Content.Server.Atmos.EntitySystems; namespace Content.Server.Explosion.EntitySystems; public sealed partial class ExplosionSystem { + [Dependency] private readonly FlammableSystem _flammableSystem = default!; + /// /// Used to limit explosion processing time. See . /// @@ -95,7 +99,7 @@ public override void Update(float frameTime) { // EXPLOSION TODO allow explosion spawning to be interrupted by time limit. In the meantime, ensure that // there is at-least 1ms of time left before creating a new explosion - if (MathF.Max(MaxProcessingTime - 1, 0.1f) < Stopwatch.Elapsed.TotalMilliseconds) + if (MathF.Max(MaxProcessingTime - 1, 0.1f) < Stopwatch.Elapsed.TotalMilliseconds) break; if (!_explosionQueue.TryDequeue(out var spawnNextExplosion)) @@ -130,11 +134,11 @@ public override void Update(float frameTime) try { #endif - var processed = _activeExplosion.Process(tilesRemaining); - tilesRemaining -= processed; + var processed = _activeExplosion.Process(tilesRemaining); + tilesRemaining -= processed; - // has the explosion finished processing? - if (_activeExplosion.FinishedProcessing) + // has the explosion finished processing? + if (_activeExplosion.FinishedProcessing) { var comp = EnsureComp(_activeExplosion.VisualEnt); comp.Lifetime = _cfg.GetCVar(CCVars.ExplosionPersistence); @@ -203,7 +207,8 @@ internal bool ExplodeTile(BroadphaseComponent lookup, DamageSpecifier damage, MapCoordinates epicenter, HashSet processed, - string id) + string id, + float? fireStacks) { var size = grid.Comp.TileSize; var gridBox = new Box2(tile * size, (tile + 1) * size); @@ -222,7 +227,7 @@ internal bool ExplodeTile(BroadphaseComponent lookup, // process those entities foreach (var (uid, xform) in list) { - ProcessEntity(uid, epicenter, damage, throwForce, id, xform); + ProcessEntity(uid, epicenter, damage, throwForce, id, xform, fireStacks); } // process anchored entities @@ -232,7 +237,7 @@ internal bool ExplodeTile(BroadphaseComponent lookup, foreach (var entity in _anchored) { processed.Add(entity); - ProcessEntity(entity, epicenter, damage, throwForce, id, null); + ProcessEntity(entity, epicenter, damage, throwForce, id, null, fireStacks); } // Walls and reinforced walls will break into girders. These girders will also be considered turf-blocking for @@ -268,7 +273,7 @@ internal bool ExplodeTile(BroadphaseComponent lookup, { // Here we only throw, no dealing damage. Containers n such might drop their entities after being destroyed, but // they should handle their own damage pass-through, with their own damage reduction calculation. - ProcessEntity(uid, epicenter, null, throwForce, id, xform); + ProcessEntity(uid, epicenter, null, throwForce, id, xform, null); } return !tileBlocked; @@ -303,7 +308,8 @@ internal void ExplodeSpace(BroadphaseComponent lookup, DamageSpecifier damage, MapCoordinates epicenter, HashSet processed, - string id) + string id, + float? fireStacks) { var gridBox = Box2.FromDimensions(tile * DefaultTileSize, new Vector2(DefaultTileSize, DefaultTileSize)); var worldBox = spaceMatrix.TransformBox(gridBox); @@ -319,7 +325,7 @@ internal void ExplodeSpace(BroadphaseComponent lookup, foreach (var (uid, xform) in state.Item1) { processed.Add(uid); - ProcessEntity(uid, epicenter, damage, throwForce, id, xform); + ProcessEntity(uid, epicenter, damage, throwForce, id, xform, fireStacks); } if (throwForce <= 0) @@ -333,7 +339,7 @@ internal void ExplodeSpace(BroadphaseComponent lookup, foreach (var (uid, xform) in list) { - ProcessEntity(uid, epicenter, null, throwForce, id, xform); + ProcessEntity(uid, epicenter, null, throwForce, id, xform, fireStacks); } } @@ -430,7 +436,8 @@ private void ProcessEntity( DamageSpecifier? originalDamage, float throwForce, string id, - TransformComponent? xform) + TransformComponent? xform, + float? fireStacksOnIgnite) { if (originalDamage != null) { @@ -439,6 +446,17 @@ private void ProcessEntity( { // TODO EXPLOSIONS turn explosions into entities, and pass the the entity in as the damage origin. _damageableSystem.TryChangeDamage(entity, damage, ignoreResistances: true); + + } + } + + // ignite + if (fireStacksOnIgnite != null) + { + if (_flammableQuery.TryGetComponent(uid, out var flammable)) + { + flammable.FireStacks += fireStacksOnIgnite.Value; + _flammableSystem.Ignite(uid, uid, flammable); } } @@ -705,14 +723,14 @@ private bool TryGetNextTileEnumerator() { _currentIntensity = _tileSetIntensity[CurrentIteration]; - #if DEBUG +#if DEBUG if (_expectedDamage != null) { // Check that explosion processing hasn't somehow accidentally mutated the damage set. DebugTools.Assert(_expectedDamage.Equals(_currentDamage)); _expectedDamage = ExplosionType.DamagePerIntensity * _currentIntensity; } - #endif +#endif _currentDamage = ExplosionType.DamagePerIntensity * _currentIntensity; @@ -811,7 +829,8 @@ public int Process(int processingTarget) _currentDamage, Epicenter, ProcessedEntities, - ExplosionType.ID); + ExplosionType.ID, + ExplosionType.FireStacks); // If the floor is not blocked by some dense object, damage the floor tiles. if (canDamageFloor) @@ -828,7 +847,8 @@ public int Process(int processingTarget) _currentDamage, Epicenter, ProcessedEntities, - ExplosionType.ID); + ExplosionType.ID, + ExplosionType.FireStacks); } if (!MoveNext()) diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs index 1a5a5c4011..24ccf611bd 100644 --- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs +++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs @@ -52,7 +52,7 @@ public sealed partial class ExplosionSystem : EntitySystem [Dependency] private readonly SharedMapSystem _map = default!; private EntityQuery _transformQuery; - private EntityQuery _damageQuery; + private EntityQuery _flammableQuery; private EntityQuery _physicsQuery; private EntityQuery _projectileQuery; @@ -104,7 +104,7 @@ public override void Initialize() InitVisuals(); _transformQuery = GetEntityQuery(); - _damageQuery = GetEntityQuery(); + _flammableQuery = GetEntityQuery(); _physicsQuery = GetEntityQuery(); _projectileQuery = GetEntityQuery(); } diff --git a/Content.Server/Fax/FaxSystem.cs b/Content.Server/Fax/FaxSystem.cs index 265a20ce1c..3ff139466f 100644 --- a/Content.Server/Fax/FaxSystem.cs +++ b/Content.Server/Fax/FaxSystem.cs @@ -313,7 +313,7 @@ private void OnFileButtonPressed(EntityUid uid, FaxMachineComponent component, F private void OnCopyButtonPressed(EntityUid uid, FaxMachineComponent component, FaxCopyMessage args) { - Copy(uid, component); + Copy(uid, component, args); } private void OnSendButtonPressed(EntityUid uid, FaxMachineComponent component, FaxSendMessage args) @@ -416,13 +416,20 @@ public void PrintFile(EntityUid uid, FaxMachineComponent component, FaxFileMessa component.SendTimeoutRemaining += component.SendTimeout; UpdateUserInterface(uid, component); + + if (args.Session.AttachedEntity != null) + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} added print job to {ToPrettyString(uid):tool} with text: {args.Content}"); + else + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"Someone added print job to {ToPrettyString(uid):tool} with text: {args.Content}"); } /// /// Copies the paper in the fax. A timeout is set after copying, /// which is shared by the send button. /// - public void Copy(EntityUid uid, FaxMachineComponent? component = null) + public void Copy(EntityUid uid, FaxMachineComponent? component, FaxCopyMessage args) { if (!Resolve(uid, ref component)) return; @@ -449,6 +456,10 @@ public void Copy(EntityUid uid, FaxMachineComponent? component = null) // will start immediately. UpdateUserInterface(uid, component); + + if (args.Session.AttachedEntity != null) + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} added copy job to {ToPrettyString(uid):tool} with text: {ToPrettyString(component.PaperSlot.Item):subject}"); } /// diff --git a/Content.Server/Fluids/EntitySystems/DrainSystem.cs b/Content.Server/Fluids/EntitySystems/DrainSystem.cs index 19cb650db7..b8fa04b872 100644 --- a/Content.Server/Fluids/EntitySystems/DrainSystem.cs +++ b/Content.Server/Fluids/EntitySystems/DrainSystem.cs @@ -239,9 +239,8 @@ private void OnInteract(Entity entity, ref AfterInteractUsingEve var doAfterArgs = new DoAfterArgs(EntityManager, args.User, entity.Comp.UnclogDuration, new DrainDoAfterEvent(), entity, args.Target, args.Used) { - BreakOnTargetMove = true, - BreakOnUserMove = true, BreakOnDamage = true, + BreakOnMove = true, BreakOnHandChange = true }; diff --git a/Content.Server/Fluids/EntitySystems/PuddleDebugDebugOverlaySystem.cs b/Content.Server/Fluids/EntitySystems/PuddleDebugDebugOverlaySystem.cs index ac967b3c20..859f2d80a6 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleDebugDebugOverlaySystem.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleDebugDebugOverlaySystem.cs @@ -13,9 +13,11 @@ public sealed class PuddleDebugDebugOverlaySystem : SharedPuddleDebugOverlaySyst [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly PuddleSystem _puddle = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly SharedMapSystem _map = default!; - private readonly HashSet _playerObservers = new(); - private List> _grids = new(); + private readonly HashSet _playerObservers = []; + private List> _grids = []; public bool ToggleObserver(ICommonSession observer) { @@ -55,7 +57,8 @@ public override void Update(float frameTime) var transform = EntityManager.GetComponent(entity); - var worldBounds = Box2.CenteredAround(transform.WorldPosition, + + var worldBounds = Box2.CenteredAround(_transform.GetWorldPosition(transform), new Vector2(LocalViewRange, LocalViewRange)); _grids.Clear(); @@ -69,14 +72,14 @@ public override void Update(float frameTime) if (!Exists(gridUid)) continue; - foreach (var uid in grid.Comp.GetAnchoredEntities(worldBounds)) + foreach (var uid in _map.GetAnchoredEntities(gridUid, grid, worldBounds)) { PuddleComponent? puddle = null; TransformComponent? xform = null; if (!Resolve(uid, ref puddle, ref xform, false)) continue; - var pos = xform.Coordinates.ToVector2i(EntityManager, _mapManager); + var pos = xform.Coordinates.ToVector2i(EntityManager, _mapManager, _transform); var vol = _puddle.CurrentVolume(uid, puddle); data.Add(new PuddleDebugOverlayData(pos, vol)); } diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.Spillable.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.Spillable.cs index 3cd6d06aeb..efaca271d3 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.Spillable.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.Spillable.cs @@ -203,9 +203,8 @@ private void AddSpillVerb(Entity entity, ref GetVerbsEvent] @@ -124,7 +124,7 @@ private void OnPuddleSpread(Entity entity, ref SpreadNeighborsE foreach (var neighbor in args.NeighborFreeTiles) { var split = overflow.SplitSolution(spillAmount); - TrySpillAt(neighbor.Grid.GridTileToLocal(neighbor.Tile), split, out _, false); + TrySpillAt(_map.GridTileToLocal(neighbor.Tile.GridUid, neighbor.Grid, neighbor.Tile.GridIndices), split, out _, false); args.Updates--; if (args.Updates <= 0) @@ -435,13 +435,13 @@ private void UpdateSlow(EntityUid uid, Solution solution) if (maxViscosity > 0) { - var comp = EnsureComp(uid); + var comp = EnsureComp(uid); var speed = 1 - maxViscosity; - _slowContacts.ChangeModifiers(uid, speed, comp); + _speedModContacts.ChangeModifiers(uid, speed, comp); } else { - RemComp(uid); + RemComp(uid); } } @@ -612,13 +612,14 @@ public bool TrySpillAt(EntityCoordinates coordinates, Solution solution, out Ent return false; } - if (!_mapManager.TryGetGrid(coordinates.GetGridUid(EntityManager), out var mapGrid)) + var gridUid = coordinates.GetGridUid(EntityManager); + if (!TryComp(gridUid, out var mapGrid)) { puddleUid = EntityUid.Invalid; return false; } - return TrySpillAt(mapGrid.GetTileRef(coordinates), solution, out puddleUid, sound); + return TrySpillAt(_map.GetTileRef(gridUid.Value, mapGrid, coordinates), solution, out puddleUid, sound); } /// @@ -657,7 +658,7 @@ public bool TrySpillAt(TileRef tileRef, Solution solution, out EntityUid puddleU // Let's not spill to invalid grids. var gridId = tileRef.GridUid; - if (!_mapManager.TryGetGrid(gridId, out var mapGrid)) + if (!TryComp(gridId, out var mapGrid)) { puddleUid = EntityUid.Invalid; return false; @@ -678,7 +679,7 @@ public bool TrySpillAt(TileRef tileRef, Solution solution, out EntityUid puddleU // Get normalized co-ordinate for spill location and spill it in the centre // TODO: Does SnapGrid or something else already do this? - var anchored = mapGrid.GetAnchoredEntitiesEnumerator(tileRef.GridIndices); + var anchored = _map.GetAnchoredEntitiesEnumerator(gridId, mapGrid, tileRef.GridIndices); var puddleQuery = GetEntityQuery(); var sparklesQuery = GetEntityQuery(); @@ -703,7 +704,7 @@ public bool TrySpillAt(TileRef tileRef, Solution solution, out EntityUid puddleU return true; } - var coords = mapGrid.GridTileToLocal(tileRef.GridIndices); + var coords = _map.GridTileToLocal(gridId, mapGrid, tileRef.GridIndices); puddleUid = EntityManager.SpawnEntity("Puddle", coords); EnsureComp(puddleUid); if (TryAddSolution(puddleUid, solution, sound)) @@ -740,7 +741,7 @@ public bool TryGetPuddle(TileRef tile, out EntityUid puddleUid) if (!TryComp(tile.GridUid, out var grid)) return false; - var anc = grid.GetAnchoredEntitiesEnumerator(tile.GridIndices); + var anc = _map.GetAnchoredEntitiesEnumerator(tile.GridUid, grid, tile.GridIndices); var puddleQuery = GetEntityQuery(); while (anc.MoveNext(out var ent)) diff --git a/Content.Server/Fluids/EntitySystems/SmokeSystem.cs b/Content.Server/Fluids/EntitySystems/SmokeSystem.cs index cb6f9c13ef..ae170842a0 100644 --- a/Content.Server/Fluids/EntitySystems/SmokeSystem.cs +++ b/Content.Server/Fluids/EntitySystems/SmokeSystem.cs @@ -13,7 +13,7 @@ using Content.Shared.FixedPoint; using Content.Shared.Smoking; using Robust.Server.GameObjects; -using Robust.Shared.Map; +using Robust.Shared.Map.Components; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; @@ -35,7 +35,7 @@ public sealed class SmokeSystem : EntitySystem // If I could do it all again this could probably use a lot more of puddles. [Dependency] private readonly IAdminLogManager _logger = default!; [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly IMapManager _mapManager = default!; + [Dependency] private readonly SharedMapSystem _map = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly AppearanceSystem _appearance = default!; @@ -45,7 +45,6 @@ public sealed class SmokeSystem : EntitySystem [Dependency] private readonly SharedBroadphaseSystem _broadphase = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default!; - [Dependency] private readonly TransformSystem _transform = default!; private EntityQuery _smokeQuery; private EntityQuery _smokeAffectedQuery; @@ -137,7 +136,7 @@ private void OnSmokeSpread(Entity entity, ref SpreadNeighborsEve return; } - if (!args.NeighborFreeTiles.Any()) + if (args.NeighborFreeTiles.Count == 0) return; TryComp(entity, out var timer); @@ -146,10 +145,10 @@ private void OnSmokeSpread(Entity entity, ref SpreadNeighborsEve var smokePerSpread = entity.Comp.SpreadAmount / Math.Max(1, args.NeighborFreeTiles.Count); foreach (var neighbor in args.NeighborFreeTiles) { - var coords = neighbor.Grid.GridTileToLocal(neighbor.Tile); + var coords = _map.GridTileToLocal(neighbor.Tile.GridUid, neighbor.Grid, neighbor.Tile.GridIndices); var ent = Spawn(prototype.ID, coords); var spreadAmount = Math.Max(0, smokePerSpread); - entity.Comp.SpreadAmount -= args.NeighborFreeTiles.Count(); + entity.Comp.SpreadAmount -= args.NeighborFreeTiles.Count; StartSmoke(ent, solution.Clone(), timer?.Lifetime ?? entity.Comp.Duration, spreadAmount); @@ -305,10 +304,10 @@ private void ReactOnTile(EntityUid uid, SmokeComponent? component = null, Transf if (!_solutionContainerSystem.ResolveSolution(uid, SmokeComponent.SolutionName, ref component.Solution, out var solution) || !solution.Any()) return; - if (!_mapManager.TryGetGrid(xform.GridUid, out var mapGrid)) + if (!TryComp(xform.GridUid, out var mapGrid)) return; - var tile = mapGrid.GetTileRef(xform.Coordinates.ToVector2i(EntityManager, _mapManager, _transform)); + var tile = _map.GetTileRef(xform.GridUid.Value, mapGrid, xform.Coordinates); foreach (var reagentQuantity in solution.Contents.ToArray()) { diff --git a/Content.Server/Forensics/Systems/ForensicPadSystem.cs b/Content.Server/Forensics/Systems/ForensicPadSystem.cs index ad39817f8b..42512cb1fd 100644 --- a/Content.Server/Forensics/Systems/ForensicPadSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicPadSystem.cs @@ -83,9 +83,8 @@ private void StartScan(EntityUid used, EntityUid user, EntityUid target, Forensi var doAfterEventArgs = new DoAfterArgs(EntityManager, user, pad.ScanDelay, ev, used, target: target, used: used) { - BreakOnTargetMove = true, - BreakOnUserMove = true, - NeedHand = true + NeedHand = true, + BreakOnMove = true, }; _doAfterSystem.TryStartDoAfter(doAfterEventArgs); diff --git a/Content.Server/Forensics/Systems/ForensicScannerSystem.cs b/Content.Server/Forensics/Systems/ForensicScannerSystem.cs index be44f9e203..729b7304fa 100644 --- a/Content.Server/Forensics/Systems/ForensicScannerSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicScannerSystem.cs @@ -28,14 +28,10 @@ public sealed class ForensicScannerSystem : EntitySystem [Dependency] private readonly SharedAudioSystem _audioSystem = default!; [Dependency] private readonly MetaDataSystem _metaData = default!; - private ISawmill _sawmill = default!; - public override void Initialize() { base.Initialize(); - _sawmill = Logger.GetSawmill("forensics.scanner"); - SubscribeLocalEvent(OnAfterInteract); SubscribeLocalEvent(OnAfterInteractUsing); SubscribeLocalEvent(OnBeforeActivatableUIOpen); @@ -57,7 +53,7 @@ private void UpdateUserInterface(EntityUid uid, ForensicScannerComponent compone component.PrintReadyAt); if (!_uiSystem.TrySetUiState(uid, ForensicScannerUiKey.Key, state)) - _sawmill.Warning($"{ToPrettyString(uid)} was unable to set UI state."); + Log.Warning($"{ToPrettyString(uid)} was unable to set UI state."); } private void OnDoAfter(EntityUid uid, ForensicScannerComponent component, DoAfterEvent args) @@ -99,8 +95,7 @@ private void StartScan(EntityUid uid, ForensicScannerComponent component, Entity { _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.ScanDelay, new ForensicScannerDoAfterEvent(), uid, target: target, used: uid) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, NeedHand = true }); } @@ -180,7 +175,7 @@ private void OnPrint(EntityUid uid, ForensicScannerComponent component, Forensic { if (!args.Session.AttachedEntity.HasValue) { - _sawmill.Warning($"{ToPrettyString(uid)} got OnPrint without Session.AttachedEntity"); + Log.Warning($"{ToPrettyString(uid)} got OnPrint without Session.AttachedEntity"); return; } @@ -200,7 +195,7 @@ private void OnPrint(EntityUid uid, ForensicScannerComponent component, Forensic if (!HasComp(printed)) { - _sawmill.Error("Printed paper did not have PaperComponent."); + Log.Error("Printed paper did not have PaperComponent."); return; } diff --git a/Content.Server/Forensics/Systems/ForensicsSystem.cs b/Content.Server/Forensics/Systems/ForensicsSystem.cs index a081429fd3..a9ef23a2f5 100644 --- a/Content.Server/Forensics/Systems/ForensicsSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicsSystem.cs @@ -116,7 +116,7 @@ private void OnAfterInteract(EntityUid uid, CleansForensicsComponent component, BreakOnHandChange = true, NeedHand = true, BreakOnDamage = true, - BreakOnTargetMove = true, + BreakOnMove = true, MovementThreshold = 0.01f, DistanceThreshold = forensicsComp.CleanDistance, }; diff --git a/Content.Server/Friends/Components/PettableFriendComponent.cs b/Content.Server/Friends/Components/PettableFriendComponent.cs deleted file mode 100644 index fe68029a66..0000000000 --- a/Content.Server/Friends/Components/PettableFriendComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Content.Server.Friends.Systems; - -namespace Content.Server.Friends.Components; - -/// -/// Pet something to become friends with it (use in hand, press Z) -/// Uses FactionExceptionComponent behind the scenes -/// -[RegisterComponent, Access(typeof(PettableFriendSystem))] -public sealed partial class PettableFriendComponent : Component -{ - /// - /// Localized popup sent when petting for the first time - /// - [DataField("successString", required: true), ViewVariables(VVAccess.ReadWrite)] - public string SuccessString = string.Empty; - - /// - /// Localized popup sent when petting multiple times - /// - [DataField("failureString", required: true), ViewVariables(VVAccess.ReadWrite)] - public string FailureString = string.Empty; -} diff --git a/Content.Server/Friends/Systems/PettableFriendSystem.cs b/Content.Server/Friends/Systems/PettableFriendSystem.cs deleted file mode 100644 index 8f70c843e7..0000000000 --- a/Content.Server/Friends/Systems/PettableFriendSystem.cs +++ /dev/null @@ -1,50 +0,0 @@ -using Content.Server.Friends.Components; -using Content.Server.NPC.Components; -using Content.Server.NPC.Systems; -using Content.Shared.Chemistry.Components; -using Content.Shared.Interaction.Events; -using Content.Shared.Popups; - -namespace Content.Server.Friends.Systems; - -public sealed class PettableFriendSystem : EntitySystem -{ - [Dependency] private readonly NpcFactionSystem _factionException = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnUseInHand); - SubscribeLocalEvent(OnRehydrated); - } - - private void OnUseInHand(EntityUid uid, PettableFriendComponent comp, UseInHandEvent args) - { - var user = args.User; - if (args.Handled || !TryComp(uid, out var factionException)) - return; - - if (_factionException.IsIgnored(uid, user, factionException)) - { - _popup.PopupEntity(Loc.GetString(comp.FailureString, ("target", uid)), user, user); - return; - } - - // you have made a new friend :) - _popup.PopupEntity(Loc.GetString(comp.SuccessString, ("target", uid)), user, user); - _factionException.IgnoreEntity(uid, user, factionException); - args.Handled = true; - } - - private void OnRehydrated(EntityUid uid, PettableFriendComponent _, ref GotRehydratedEvent args) - { - // can only pet before hydrating, after that the fish cannot be negotiated with - if (!TryComp(uid, out var comp)) - return; - - var targetComp = AddComp(args.Target); - _factionException.IgnoreEntities(args.Target, comp.Ignored, targetComp); - } -} diff --git a/Content.Server/GameTicking/GameTicker.Spawning.cs b/Content.Server/GameTicking/GameTicker.Spawning.cs index 882d5e37d8..65de36cf80 100644 --- a/Content.Server/GameTicking/GameTicker.Spawning.cs +++ b/Content.Server/GameTicking/GameTicker.Spawning.cs @@ -338,6 +338,7 @@ public void SpawnObserver(ICommonSession player) _metaData.SetEntityName(ghost, name); _ghost.SetCanReturnToBody(ghost, false); _mind.TransferTo(mind.Value, ghost); + _adminLogger.Add(LogType.LateJoin, LogImpact.Low, $"{player.Name} late joined the round as an Observer with {ToPrettyString(ghost):entity}."); } #region Mob Spawning Helpers diff --git a/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs index 73221d3b73..1463d00682 100644 --- a/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/NukeopsRuleComponent.cs @@ -1,8 +1,8 @@ using Content.Server.Maps; -using Content.Server.NPC.Components; using Content.Server.RoundEnd; using Content.Server.StationEvents.Events; using Content.Shared.Dataset; +using Content.Shared.NPC.Prototypes; using Content.Shared.Roles; using Robust.Shared.Map; using Robust.Shared.Prototypes; diff --git a/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs index 62619db76a..e904d8a7c2 100644 --- a/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs @@ -1,5 +1,5 @@ -using Content.Server.NPC.Components; using Content.Shared.Dataset; +using Content.Shared.NPC.Prototypes; using Content.Shared.Random; using Content.Shared.Roles; using Robust.Shared.Audio; diff --git a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs index b9255bcbe4..ea5ab9c2ab 100644 --- a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs @@ -7,8 +7,6 @@ using Content.Server.Ghost.Roles.Events; using Content.Server.Humanoid; using Content.Server.Mind; -using Content.Server.NPC.Components; -using Content.Server.NPC.Systems; using Content.Server.Nuke; using Content.Server.NukeOps; using Content.Server.Popups; @@ -30,6 +28,8 @@ using Content.Shared.Mind.Components; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; +using Content.Shared.NPC.Components; +using Content.Shared.NPC.Systems; using Content.Shared.Nuke; using Content.Shared.NukeOps; using Content.Shared.Preferences; @@ -474,7 +474,7 @@ private void OnRoundStart(EntityUid uid, NukeopsRuleComponent? component = null) var eligibleQuery = EntityQueryEnumerator(); while (eligibleQuery.MoveNext(out var eligibleUid, out var eligibleComp, out var member)) { - if (!_npcFaction.IsFactionHostile(component.Faction, eligibleUid, member)) + if (!_npcFaction.IsFactionHostile(component.Faction, (eligibleUid, member))) continue; eligible.Add((eligibleUid, eligibleComp, member)); diff --git a/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs b/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs index f83d719c21..900554d824 100644 --- a/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/PiratesRuleSystem.cs @@ -4,8 +4,6 @@ using Content.Server.Cargo.Systems; using Content.Server.Chat.Managers; using Content.Server.GameTicking.Rules.Components; -using Content.Server.NPC.Components; -using Content.Server.NPC.Systems; using Content.Server.Preferences.Managers; using Content.Server.Spawners.Components; using Content.Server.Station.Components; @@ -14,6 +12,8 @@ using Content.Shared.Humanoid; using Content.Shared.Humanoid.Prototypes; using Content.Shared.Mind; +using Content.Shared.NPC.Prototypes; +using Content.Shared.NPC.Systems; using Content.Shared.Preferences; using Content.Shared.Roles; using Robust.Server.GameObjects; @@ -201,7 +201,7 @@ private void OnPlayerSpawningEvent(RulePlayerSpawningEvent ev) if (!gridId.HasValue) { - Logger.ErrorS("pirates", $"Gridid was null when loading \"{map}\", aborting."); + Log.Error($"Gridid was null when loading \"{map}\", aborting."); foreach (var session in ops) { ev.PlayerPool.Add(session); @@ -230,7 +230,7 @@ private void OnPlayerSpawningEvent(RulePlayerSpawningEvent ev) if (spawns.Count == 0) { spawns.Add(Transform(pirates.PirateShip).Coordinates); - Logger.WarningS("pirates", $"Fell back to default spawn for pirates!"); + Log.Warning($"Fell back to default spawn for pirates!"); } for (var i = 0; i < ops.Length; i++) diff --git a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs index d20775c734..5caa223c9c 100644 --- a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs @@ -4,8 +4,6 @@ using Content.Server.Flash; using Content.Server.GameTicking.Rules.Components; using Content.Server.Mind; -using Content.Server.NPC.Components; -using Content.Server.NPC.Systems; using Content.Server.Popups; using Content.Server.Revolutionary; using Content.Server.Revolutionary.Components; @@ -23,6 +21,8 @@ using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; +using Content.Shared.NPC.Prototypes; +using Content.Shared.NPC.Systems; using Content.Shared.Revolutionary.Components; using Content.Shared.Roles; using Content.Shared.Stunnable; diff --git a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs index fc9f0a9a9f..769d7e0a5b 100644 --- a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs @@ -1,7 +1,6 @@ using Content.Server.Antag; using Content.Server.GameTicking.Rules.Components; using Content.Server.Mind; -using Content.Server.NPC.Systems; using Content.Server.Objectives; using Content.Server.PDA.Ringer; using Content.Server.Roles; @@ -10,6 +9,7 @@ using Content.Shared.Dataset; using Content.Shared.Mind; using Content.Shared.Mobs.Systems; +using Content.Shared.NPC.Systems; using Content.Shared.Objectives.Components; using Content.Shared.PDA; using Content.Shared.Roles; diff --git a/Content.Server/Guardian/GuardianSystem.cs b/Content.Server/Guardian/GuardianSystem.cs index 627c336a36..808de9f667 100644 --- a/Content.Server/Guardian/GuardianSystem.cs +++ b/Content.Server/Guardian/GuardianSystem.cs @@ -193,11 +193,7 @@ private void UseCreator(EntityUid user, EntityUid target, EntityUid injector, Gu return; } - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.InjectionDelay, new GuardianCreatorDoAfterEvent(), injector, target: target, used: injector) - { - BreakOnTargetMove = true, - BreakOnUserMove = true - }); + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.InjectionDelay, new GuardianCreatorDoAfterEvent(), injector, target: target, used: injector){BreakOnMove = true}); } private void OnDoAfter(EntityUid uid, GuardianCreatorComponent component, DoAfterEvent args) diff --git a/Content.Server/Hands/Systems/HandsSystem.cs b/Content.Server/Hands/Systems/HandsSystem.cs index 62278064b6..99958db272 100644 --- a/Content.Server/Hands/Systems/HandsSystem.cs +++ b/Content.Server/Hands/Systems/HandsSystem.cs @@ -1,6 +1,5 @@ using System.Numerics; using Content.Server.Inventory; -using Content.Server.Pulling; using Content.Server.Stack; using Content.Server.Stunnable; using Content.Shared.ActionBlocker; @@ -13,9 +12,9 @@ using Content.Shared.IdentityManagement; using Content.Shared.Input; using Content.Shared.Inventory.VirtualItem; -using Content.Shared.Physics.Pull; -using Content.Shared.Popups; -using Content.Shared.Pulling.Components; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Stacks; using Content.Shared.Throwing; using Robust.Shared.Audio; @@ -88,9 +87,8 @@ private void OnDisarmed(EntityUid uid, HandsComponent component, DisarmedEvent a return; // Break any pulls - if (TryComp(uid, out SharedPullerComponent? puller) && puller.Pulling is EntityUid pulled && - TryComp(pulled, out SharedPullableComponent? pullable)) - _pullingSystem.TryStopPull(pullable); + if (TryComp(uid, out PullerComponent? puller) && TryComp(puller.Pulling, out PullableComponent? pullable)) + _pullingSystem.TryStopPull(puller.Pulling.Value, pullable); if (!_handsSystem.TryDrop(uid, component.ActiveHand!, null, checkActionBlocker: false)) return; @@ -130,13 +128,13 @@ private void HandleBodyPartRemoved(EntityUid uid, HandsComponent component, ref private void HandlePullStarted(EntityUid uid, HandsComponent component, PullStartedMessage args) { - if (args.Puller.Owner != uid) + if (args.PullerUid != uid) return; - if (TryComp(args.Puller.Owner, out var pullerComp) && !pullerComp.NeedsHands) + if (TryComp(args.PullerUid, out var pullerComp) && !pullerComp.NeedsHands) return; - if (!_virtualItemSystem.TrySpawnVirtualItemInHand(args.Pulled.Owner, uid)) + if (!_virtualItemSystem.TrySpawnVirtualItemInHand(args.PulledUid, uid)) { DebugTools.Assert("Unable to find available hand when starting pulling??"); } @@ -144,7 +142,7 @@ private void HandlePullStarted(EntityUid uid, HandsComponent component, PullStar private void HandlePullStopped(EntityUid uid, HandsComponent component, PullStoppedMessage args) { - if (args.Puller.Owner != uid) + if (args.PullerUid != uid) return; // Try find hand that is doing this pull. @@ -153,8 +151,10 @@ private void HandlePullStopped(EntityUid uid, HandsComponent component, PullStop { if (hand.HeldEntity == null || !TryComp(hand.HeldEntity, out VirtualItemComponent? virtualItem) - || virtualItem.BlockingEntity != args.Pulled.Owner) + || virtualItem.BlockingEntity != args.PulledUid) + { continue; + } QueueDel(hand.HeldEntity.Value); break; diff --git a/Content.Server/Implants/ImplanterSystem.cs b/Content.Server/Implants/ImplanterSystem.cs index 0d46241f41..56d0bd3bbd 100644 --- a/Content.Server/Implants/ImplanterSystem.cs +++ b/Content.Server/Implants/ImplanterSystem.cs @@ -78,9 +78,8 @@ public void TryImplant(ImplanterComponent component, EntityUid user, EntityUid t { var args = new DoAfterArgs(EntityManager, user, component.ImplantTime, new ImplantEvent(), implanter, target: target, used: implanter) { - BreakOnUserMove = true, - BreakOnTargetMove = true, BreakOnDamage = true, + BreakOnMove = true, NeedHand = true, }; @@ -105,9 +104,8 @@ public void TryDraw(ImplanterComponent component, EntityUid user, EntityUid targ { var args = new DoAfterArgs(EntityManager, user, component.DrawTime, new DrawEvent(), implanter, target: target, used: implanter) { - BreakOnUserMove = true, - BreakOnTargetMove = true, BreakOnDamage = true, + BreakOnMove = true, NeedHand = true, }; diff --git a/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs b/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs index 0419e13d23..b145bec014 100644 --- a/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/KitchenSpikeSystem.cs @@ -257,9 +257,8 @@ public bool TrySpike(EntityUid uid, EntityUid userUid, EntityUid victimUid, Kitc var doAfterArgs = new DoAfterArgs(EntityManager, userUid, component.SpikeDelay + butcherable.ButcherDelay, new SpikeDoAfterEvent(), uid, target: victimUid, used: uid) { - BreakOnTargetMove = true, - BreakOnUserMove = true, BreakOnDamage = true, + BreakOnMove = true, NeedHand = true }; diff --git a/Content.Server/Kitchen/EntitySystems/SharpSystem.cs b/Content.Server/Kitchen/EntitySystems/SharpSystem.cs index 814a64a4e3..2caab4063c 100644 --- a/Content.Server/Kitchen/EntitySystems/SharpSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/SharpSystem.cs @@ -5,6 +5,7 @@ using Content.Shared.Database; using Content.Shared.Interaction; using Content.Shared.Nutrition.Components; +using Content.Server.Nutrition.EntitySystems; using Content.Shared.Popups; using Content.Shared.Storage; using Content.Shared.Verbs; @@ -34,7 +35,7 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnAfterInteract); + SubscribeLocalEvent(OnAfterInteract, before: new[] { typeof(UtensilSystem) }); SubscribeLocalEvent(OnDoAfter); SubscribeLocalEvent>(OnGetInteractionVerbs); @@ -42,41 +43,44 @@ public override void Initialize() private void OnAfterInteract(EntityUid uid, SharpComponent component, AfterInteractEvent args) { + if (args.Handled) + return; + if (args.Target is null || !args.CanReach) return; - TryStartButcherDoafter(uid, args.Target.Value, args.User); + args.Handled = TryStartButcherDoAfter(uid, args.Target.Value, args.User); } - private void TryStartButcherDoafter(EntityUid knife, EntityUid target, EntityUid user) + private bool TryStartButcherDoAfter(EntityUid knife, EntityUid target, EntityUid user) { if (!TryComp(target, out var butcher)) - return; + return false; if (!TryComp(knife, out var sharp)) - return; + return false; + + if (TryComp(target, out var mobState) && !_mobStateSystem.IsDead(target, mobState)) + return false; - if (butcher.Type != ButcheringType.Knife) + if (butcher.Type != ButcheringType.Knife && target != user) { _popupSystem.PopupEntity(Loc.GetString("butcherable-different-tool", ("target", target)), knife, user); - return; + return true; } - if (TryComp(target, out var mobState) && !_mobStateSystem.IsDead(target, mobState)) - return; - if (!sharp.Butchering.Add(target)) - return; + return true; var doAfter = new DoAfterArgs(EntityManager, user, sharp.ButcherDelayModifier * butcher.ButcherDelay, new SharpDoAfterEvent(), knife, target: target, used: knife) { - BreakOnTargetMove = true, - BreakOnUserMove = true, BreakOnDamage = true, + BreakOnMove = true, NeedHand = true }; _doAfterSystem.TryStartDoAfter(doAfter); + return true; } private void OnDoAfter(EntityUid uid, SharpComponent component, DoAfterEvent args) @@ -161,7 +165,7 @@ private void OnGetInteractionVerbs(EntityUid uid, ButcherableComponent component Act = () => { if (!disabled) - TryStartButcherDoafter(args.Using!.Value, args.Target, args.User); + TryStartButcherDoAfter(args.Using!.Value, args.Target, args.User); }, Message = message, Disabled = disabled, diff --git a/Content.Server/Light/EntitySystems/LightReplacerSystem.cs b/Content.Server/Light/EntitySystems/LightReplacerSystem.cs index 1260a0dd0d..71cc0173da 100644 --- a/Content.Server/Light/EntitySystems/LightReplacerSystem.cs +++ b/Content.Server/Light/EntitySystems/LightReplacerSystem.cs @@ -233,7 +233,7 @@ public bool TryInsertBulbsFromStorage(EntityUid replacerUid, EntityUid storageUi // show some message if success if (insertedBulbs > 0 && userUid != null) { - var msg = Loc.GetString("comp-light-replacer-refill-from-storage", ("light-replacer", storageUid)); + var msg = Loc.GetString("comp-light-replacer-refill-from-storage", ("light-replacer", replacerUid)); _popupSystem.PopupEntity(msg, replacerUid, userUid.Value, PopupType.Medium); } diff --git a/Content.Server/Light/EntitySystems/PoweredLightSystem.cs b/Content.Server/Light/EntitySystems/PoweredLightSystem.cs index e880cec5bb..8aa432c21e 100644 --- a/Content.Server/Light/EntitySystems/PoweredLightSystem.cs +++ b/Content.Server/Light/EntitySystems/PoweredLightSystem.cs @@ -150,7 +150,7 @@ private void OnInteractHand(EntityUid uid, PoweredLightComponent light, Interact // removing a working bulb, so require a delay _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, userUid, light.EjectBulbDelay, new PoweredLightDoAfterEvent(), uid, target: uid) { - BreakOnUserMove = true, + BreakOnMove = true, BreakOnDamage = true, }); diff --git a/Content.Server/Magic/MagicSystem.cs b/Content.Server/Magic/MagicSystem.cs index 2c9b11dbd3..371814cacb 100644 --- a/Content.Server/Magic/MagicSystem.cs +++ b/Content.Server/Magic/MagicSystem.cs @@ -118,9 +118,8 @@ private void AttemptLearn(EntityUid uid, SpellbookComponent component, UseInHand { var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.LearnTime, new SpellbookDoAfterEvent(), uid, target: uid) { - BreakOnTargetMove = true, - BreakOnUserMove = true, BreakOnDamage = true, + BreakOnMove = true, NeedHand = true //What, are you going to read with your eyes only?? }; diff --git a/Content.Server/MagicMirror/MagicMirrorSystem.cs b/Content.Server/MagicMirror/MagicMirrorSystem.cs index aef6e11d71..9ffd9a07a9 100644 --- a/Content.Server/MagicMirror/MagicMirrorSystem.cs +++ b/Content.Server/MagicMirror/MagicMirrorSystem.cs @@ -95,11 +95,9 @@ private void OnMagicMirrorSelect(EntityUid uid, MagicMirrorComponent component, _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.SelectSlotTime, doAfter, uid, target: target, used: uid) { DistanceThreshold = SharedInteractionSystem.InteractionRange, - BreakOnTargetMove = true, BreakOnDamage = true, + BreakOnMove = true, BreakOnHandChange = false, - BreakOnUserMove = true, - BreakOnWeightlessMove = false, NeedHand = true }, out var doAfterId); @@ -151,11 +149,9 @@ private void OnTryMagicMirrorChangeColor(EntityUid uid, MagicMirrorComponent com _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.ChangeSlotTime, doAfter, uid, target: target, used: uid) { - BreakOnTargetMove = true, BreakOnDamage = true, + BreakOnMove = true, BreakOnHandChange = false, - BreakOnUserMove = true, - BreakOnWeightlessMove = false, NeedHand = true }, out var doAfterId); @@ -206,11 +202,8 @@ private void OnTryMagicMirrorRemoveSlot(EntityUid uid, MagicMirrorComponent comp _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.RemoveSlotTime, doAfter, uid, target: target, used: uid) { DistanceThreshold = SharedInteractionSystem.InteractionRange, - BreakOnTargetMove = true, BreakOnDamage = true, BreakOnHandChange = false, - BreakOnUserMove = true, - BreakOnWeightlessMove = false, NeedHand = true }, out var doAfterId); @@ -263,11 +256,9 @@ private void OnTryMagicMirrorAddSlot(EntityUid uid, MagicMirrorComponent compone _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Session.AttachedEntity.Value, component.AddSlotTime, doAfter, uid, target: component.Target.Value, used: uid) { - BreakOnTargetMove = true, BreakOnDamage = true, + BreakOnMove = true, BreakOnHandChange = false, - BreakOnUserMove = true, - BreakOnWeightlessMove = false, NeedHand = true }, out var doAfterId); diff --git a/Content.Server/Mapping/MappingSystem.cs b/Content.Server/Mapping/MappingSystem.cs index 0678dab7ce..28bb3afbe1 100644 --- a/Content.Server/Mapping/MappingSystem.cs +++ b/Content.Server/Mapping/MappingSystem.cs @@ -1,4 +1,4 @@ -using System.IO; +using System.IO; using Content.Server.Administration; using Content.Shared.Administration; using Content.Shared.CCVar; @@ -32,7 +32,6 @@ public sealed class MappingSystem : EntitySystem /// private Dictionary _currentlyAutosaving = new(); - private ISawmill _sawmill = default!; private bool _autosaveEnabled; public override void Initialize() @@ -44,7 +43,6 @@ public override void Initialize() "autosave ", ToggleAutosaveCommand); - _sawmill = Logger.GetSawmill("autosave"); Subs.CVar(_cfg, CCVars.AutosaveEnabled, SetAutosaveEnabled, true); } @@ -69,7 +67,7 @@ public override void Update(float frameTime) if (!_mapManager.MapExists(map) || _mapManager.IsMapInitialized(map)) { - _sawmill.Warning($"Can't autosave map {map}; it doesn't exist, or is initialized. Removing from autosave."); + Log.Warning($"Can't autosave map {map}; it doesn't exist, or is initialized. Removing from autosave."); _currentlyAutosaving.Remove(map); return; } @@ -79,7 +77,7 @@ public override void Update(float frameTime) var path = Path.Combine(saveDir, $"{DateTime.Now.ToString("yyyy-M-dd_HH.mm.ss")}-AUTO.yml"); _currentlyAutosaving[map] = (CalculateNextTime(), name); - _sawmill.Info($"Autosaving map {name} ({map}) to {path}. Next save in {ReadableTimeLeft(map)} seconds."); + Log.Info($"Autosaving map {name} ({map}) to {path}. Next save in {ReadableTimeLeft(map)} seconds."); _map.SaveMap(map, path); } } @@ -105,17 +103,17 @@ public void ToggleAutosave(MapId map, string? path=null) { if (!_mapManager.MapExists(map) || _mapManager.IsMapInitialized(map)) { - _sawmill.Warning("Tried to enable autosaving on non-existant or already initialized map!"); + Log.Warning("Tried to enable autosaving on non-existant or already initialized map!"); _currentlyAutosaving.Remove(map); return; } - _sawmill.Info($"Started autosaving map {path} ({map}). Next save in {ReadableTimeLeft(map)} seconds."); + Log.Info($"Started autosaving map {path} ({map}). Next save in {ReadableTimeLeft(map)} seconds."); } else { _currentlyAutosaving.Remove(map); - _sawmill.Info($"Stopped autosaving on map {map}"); + Log.Info($"Stopped autosaving on map {map}"); } } diff --git a/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs b/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs index fa46792d2a..4b2ba8ffbd 100644 --- a/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs +++ b/Content.Server/Mech/Equipment/EntitySystems/MechGrabberSystem.cs @@ -157,8 +157,7 @@ private void OnInteract(EntityUid uid, MechGrabberComponent component, InteractN component.AudioStream = _audio.PlayPvs(component.GrabSound, uid).Value.Entity; var doAfterArgs = new DoAfterArgs(EntityManager, args.User, component.GrabDelay, new GrabberDoAfterEvent(), uid, target: target, used: uid) { - BreakOnTargetMove = true, - BreakOnUserMove = true + BreakOnMove = true }; _doAfter.TryStartDoAfter(doAfterArgs, out component.DoAfter); diff --git a/Content.Server/Mech/Systems/MechEquipmentSystem.cs b/Content.Server/Mech/Systems/MechEquipmentSystem.cs index 5191f53004..f51c0444e6 100644 --- a/Content.Server/Mech/Systems/MechEquipmentSystem.cs +++ b/Content.Server/Mech/Systems/MechEquipmentSystem.cs @@ -47,8 +47,7 @@ private void OnUsed(EntityUid uid, MechEquipmentComponent component, AfterIntera var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.InstallDuration, new InsertEquipmentEvent(), uid, target: mech, used: uid) { - BreakOnTargetMove = true, - BreakOnUserMove = true + BreakOnMove = true, }; _doAfter.TryStartDoAfter(doAfterEventArgs); diff --git a/Content.Server/Mech/Systems/MechSystem.cs b/Content.Server/Mech/Systems/MechSystem.cs index eef9bcb8ec..206eb894d7 100644 --- a/Content.Server/Mech/Systems/MechSystem.cs +++ b/Content.Server/Mech/Systems/MechSystem.cs @@ -39,15 +39,11 @@ public sealed partial class MechSystem : SharedMechSystem [Dependency] private readonly SharedPopupSystem _popup = default!; [Dependency] private readonly UserInterfaceSystem _ui = default!; - private ISawmill _sawmill = default!; - /// public override void Initialize() { base.Initialize(); - _sawmill = Logger.GetSawmill("mech"); - SubscribeLocalEvent(OnInteractUsing); SubscribeLocalEvent(OnInsertBattery); SubscribeLocalEvent(OnMapInit); @@ -96,10 +92,10 @@ private void OnInteractUsing(EntityUid uid, MechComponent component, InteractUsi if (TryComp(args.Used, out var tool) && tool.Qualities.Contains("Prying") && component.BatterySlot.ContainedEntity != null) { - var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.BatteryRemovalDelay, new RemoveBatteryEvent(), uid, target: uid, used: args.Target) + var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.BatteryRemovalDelay, + new RemoveBatteryEvent(), uid, target: uid, used: args.Target) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true }; _doAfter.TryStartDoAfter(doAfterEventArgs); @@ -186,7 +182,7 @@ private void OnAlternativeVerb(EntityUid uid, MechComponent component, GetVerbsE { var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.EntryDelay, new MechEntryEvent(), uid, target: uid) { - BreakOnUserMove = true, + BreakOnMove = true, }; _doAfter.TryStartDoAfter(doAfterEventArgs); @@ -214,11 +210,8 @@ private void OnAlternativeVerb(EntityUid uid, MechComponent component, GetVerbsE return; } - var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.ExitDelay, new MechExitEvent(), uid, target: uid) - { - BreakOnUserMove = true, - BreakOnTargetMove = true, - }; + var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.ExitDelay, + new MechExitEvent(), uid, target: uid); _doAfter.TryStartDoAfter(doAfterEventArgs); } @@ -343,7 +336,7 @@ public override bool TryChangeEnergy(EntityUid uid, FixedPoint2 delta, MechCompo _battery.SetCharge(battery!.Value, batteryComp.CurrentCharge + delta.Float(), batteryComp); if (batteryComp.CurrentCharge != component.Energy) //if there's a discrepency, we have to resync them { - _sawmill.Debug($"Battery charge was not equal to mech charge. Battery {batteryComp.CurrentCharge}. Mech {component.Energy}"); + Log.Debug($"Battery charge was not equal to mech charge. Battery {batteryComp.CurrentCharge}. Mech {component.Energy}"); component.Energy = batteryComp.CurrentCharge; Dirty(component); } diff --git a/Content.Server/Medical/BiomassReclaimer/BiomassReclaimerSystem.cs b/Content.Server/Medical/BiomassReclaimer/BiomassReclaimerSystem.cs index d07858aec5..f8d5139a46 100644 --- a/Content.Server/Medical/BiomassReclaimer/BiomassReclaimerSystem.cs +++ b/Content.Server/Medical/BiomassReclaimer/BiomassReclaimerSystem.cs @@ -165,9 +165,8 @@ private void OnAfterInteractUsing(Entity reclaimer, r var delay = reclaimer.Comp.BaseInsertionDelay * physics.FixturesMass; _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, delay, new ReclaimerDoAfterEvent(), reclaimer, target: args.Target, used: args.Used) { - BreakOnTargetMove = true, - BreakOnUserMove = true, - NeedHand = true + NeedHand = true, + BreakOnMove = true }); } diff --git a/Content.Server/Medical/CryoPodSystem.cs b/Content.Server/Medical/CryoPodSystem.cs index 4ab94c72b9..a7d12d9f0f 100644 --- a/Content.Server/Medical/CryoPodSystem.cs +++ b/Content.Server/Medical/CryoPodSystem.cs @@ -142,8 +142,7 @@ private void HandleDragDropOn(Entity entity, ref DragDropTarge var doAfterArgs = new DoAfterArgs(EntityManager, args.User, entity.Comp.EntryDelay, new CryoPodDragFinished(), entity, target: args.Dragged, used: entity) { BreakOnDamage = true, - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, NeedHand = false, }; _doAfterSystem.TryStartDoAfter(doAfterArgs); diff --git a/Content.Server/Medical/DefibrillatorSystem.cs b/Content.Server/Medical/DefibrillatorSystem.cs index 467085f49e..64861fdc51 100644 --- a/Content.Server/Medical/DefibrillatorSystem.cs +++ b/Content.Server/Medical/DefibrillatorSystem.cs @@ -178,8 +178,6 @@ public bool TryStartZap(EntityUid uid, EntityUid target, EntityUid user, Defibri uid, target, uid) { BlockDuplicate = true, - BreakOnUserMove = true, - BreakOnTargetMove = true, BreakOnHandChange = true, NeedHand = true }); diff --git a/Content.Server/Medical/HealingSystem.cs b/Content.Server/Medical/HealingSystem.cs index 1b90d195c4..fb6883dfd1 100644 --- a/Content.Server/Medical/HealingSystem.cs +++ b/Content.Server/Medical/HealingSystem.cs @@ -196,12 +196,11 @@ targetDamage.DamageContainerID is not null && var doAfterEventArgs = new DoAfterArgs(EntityManager, user, delay, new HealingDoAfterEvent(), target, target: target, used: uid) { - //Raise the event on the target if it's not self, otherwise raise it on self. - BreakOnUserMove = true, - BreakOnTargetMove = true, // Didn't break on damage as they may be trying to prevent it and // not being able to heal your own ticking damage would be frustrating. NeedHand = true, + BreakOnMove = true, + BreakOnWeightlessMove = false, }; _doAfter.TryStartDoAfter(doAfterEventArgs); diff --git a/Content.Server/Medical/HealthAnalyzerSystem.cs b/Content.Server/Medical/HealthAnalyzerSystem.cs index 0e893c4114..01d0d5c791 100644 --- a/Content.Server/Medical/HealthAnalyzerSystem.cs +++ b/Content.Server/Medical/HealthAnalyzerSystem.cs @@ -76,9 +76,8 @@ private void OnAfterInteract(Entity uid, ref AfterInter _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, uid.Comp.ScanDelay, new HealthAnalyzerDoAfterEvent(), uid, target: args.Target, used: uid) { - BreakOnTargetMove = true, - BreakOnUserMove = true, - NeedHand = true + NeedHand = true, + BreakOnMove = true }); } diff --git a/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs b/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs index 9521c14f2e..f1864bb3a1 100644 --- a/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs +++ b/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs @@ -107,9 +107,8 @@ private void StartListening(EntityUid scope, EntityUid user, EntityUid target, S { _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, comp.Delay, new StethoscopeDoAfterEvent(), scope, target: target, used: scope) { - BreakOnTargetMove = true, - BreakOnUserMove = true, - NeedHand = true + NeedHand = true, + BreakOnMove = true, }); } diff --git a/Content.Server/Medical/SuitSensors/SuitSensorComponent.cs b/Content.Server/Medical/SuitSensors/SuitSensorComponent.cs index 9079655c80..8d75d3840a 100644 --- a/Content.Server/Medical/SuitSensors/SuitSensorComponent.cs +++ b/Content.Server/Medical/SuitSensors/SuitSensorComponent.cs @@ -87,3 +87,9 @@ public sealed partial class SuitSensorComponent : Component [DataField, ViewVariables] public bool PreviousControlsLocked = false; } + +[ByRefEvent] +public record struct SuitSensorsSendAttemptEvent +{ + public bool Cancelled; +}; diff --git a/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs b/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs index b807b63e21..f19b3d5b81 100644 --- a/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs +++ b/Content.Server/Medical/SuitSensors/SuitSensorSystem.cs @@ -73,6 +73,11 @@ public override void Update(float frameTime) // TODO: This would cause imprecision at different tick rates. sensor.NextUpdate = curTime + sensor.UpdateRate; + var canEv = new SuitSensorsSendAttemptEvent(); + RaiseLocalEvent(uid, ref canEv); + if (canEv.Cancelled) + continue; + // get sensor status var status = GetSensorState(uid, sensor); if (status == null) diff --git a/Content.Server/Movement/Systems/LagCompensationSystem.cs b/Content.Server/Movement/Systems/LagCompensationSystem.cs index 0576fe8f25..8496a8a9b9 100644 --- a/Content.Server/Movement/Systems/LagCompensationSystem.cs +++ b/Content.Server/Movement/Systems/LagCompensationSystem.cs @@ -18,12 +18,10 @@ public sealed class LagCompensationSystem : EntitySystem // Max ping I've had is 350ms from aus to spain. public static readonly TimeSpan BufferTime = TimeSpan.FromMilliseconds(750); - private ISawmill _sawmill = Logger.GetSawmill("lagcomp"); - public override void Initialize() { base.Initialize(); - _sawmill.Level = LogLevel.Info; + Log.Level = LogLevel.Info; SubscribeLocalEvent(OnLagMove); } @@ -87,13 +85,13 @@ private void OnLagMove(EntityUid uid, LagCompensationComponent component, ref Mo if (coordinates == default) { - _sawmill.Debug($"No long comp coords found, using {xform.Coordinates}"); + Log.Debug($"No long comp coords found, using {xform.Coordinates}"); coordinates = xform.Coordinates; angle = xform.LocalRotation; } else { - _sawmill.Debug($"Actual coords is {xform.Coordinates} and got {coordinates}"); + Log.Debug($"Actual coords is {xform.Coordinates} and got {coordinates}"); } return (coordinates, angle); diff --git a/Content.Server/NPC/Components/FactionExceptionTrackerComponent.cs b/Content.Server/NPC/Components/FactionExceptionTrackerComponent.cs deleted file mode 100644 index 804a61b456..0000000000 --- a/Content.Server/NPC/Components/FactionExceptionTrackerComponent.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Content.Server.NPC.Systems; - -namespace Content.Server.NPC.Components; - -/// -/// This is used for tracking entities stored in -/// -[RegisterComponent, Access(typeof(NpcFactionSystem))] -public sealed partial class FactionExceptionTrackerComponent : Component -{ - /// - /// entities with that are tracking this entity. - /// - [DataField("entities")] - public HashSet Entities = new(); -} diff --git a/Content.Server/NPC/Components/NpcFactionMemberComponent.cs b/Content.Server/NPC/Components/NpcFactionMemberComponent.cs deleted file mode 100644 index 72df5d0c8a..0000000000 --- a/Content.Server/NPC/Components/NpcFactionMemberComponent.cs +++ /dev/null @@ -1,29 +0,0 @@ -using Content.Server.NPC.Systems; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set; - -namespace Content.Server.NPC.Components -{ - [RegisterComponent] - [Access(typeof(NpcFactionSystem))] - public sealed partial class NpcFactionMemberComponent : Component - { - /// - /// Factions this entity is a part of. - /// - [ViewVariables(VVAccess.ReadWrite), - DataField("factions", customTypeSerializer:typeof(PrototypeIdHashSetSerializer))] - public HashSet Factions = new(); - - /// - /// Cached friendly factions. - /// - [ViewVariables] - public readonly HashSet FriendlyFactions = new(); - - /// - /// Cached hostile factions. - /// - [ViewVariables] - public readonly HashSet HostileFactions = new(); - } -} diff --git a/Content.Server/NPC/Components/NpcFactionPrototype.cs b/Content.Server/NPC/Components/NpcFactionPrototype.cs deleted file mode 100644 index fe5774710a..0000000000 --- a/Content.Server/NPC/Components/NpcFactionPrototype.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; - -namespace Content.Server.NPC.Components -{ - /// - /// Contains data about this faction's relations with other factions. - /// - [Prototype("npcFaction")] - public sealed partial class NpcFactionPrototype : IPrototype - { - [ViewVariables] - [IdDataField] - public string ID { get; private set; } = default!; - - [ViewVariables(VVAccess.ReadWrite), DataField("friendly", customTypeSerializer:typeof(PrototypeIdListSerializer))] - public List Friendly = new(); - - [ViewVariables(VVAccess.ReadWrite), DataField("hostile", customTypeSerializer:typeof(PrototypeIdListSerializer))] - public List Hostile = new(); - } -} diff --git a/Content.Server/NPC/FactionData.cs b/Content.Server/NPC/FactionData.cs deleted file mode 100644 index b74150acc9..0000000000 --- a/Content.Server/NPC/FactionData.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Content.Server.NPC; - -/// -/// Cached data for the faction prototype. Can be modified at runtime. -/// -public sealed class FactionData -{ - [ViewVariables] - public HashSet Friendly = new(); - - [ViewVariables] - public HashSet Hostile = new(); -} diff --git a/Content.Server/NPC/HTN/Preconditions/PulledPrecondition.cs b/Content.Server/NPC/HTN/Preconditions/PulledPrecondition.cs index 64a72b13cf..d276be7218 100644 --- a/Content.Server/NPC/HTN/Preconditions/PulledPrecondition.cs +++ b/Content.Server/NPC/HTN/Preconditions/PulledPrecondition.cs @@ -1,4 +1,5 @@ using Content.Shared.Pulling; +using PullingSystem = Content.Shared.Movement.Pulling.Systems.PullingSystem; namespace Content.Server.NPC.HTN.Preconditions; @@ -7,14 +8,14 @@ namespace Content.Server.NPC.HTN.Preconditions; /// public sealed partial class PulledPrecondition : HTNPrecondition { - private SharedPullingSystem _pulling = default!; + private PullingSystem _pulling = default!; [ViewVariables(VVAccess.ReadWrite)] [DataField("isPulled")] public bool IsPulled = true; public override void Initialize(IEntitySystemManager sysManager) { base.Initialize(sysManager); - _pulling = sysManager.GetEntitySystem(); + _pulling = sysManager.GetEntitySystem(); } public override bool IsMet(NPCBlackboard blackboard) diff --git a/Content.Server/NPC/Systems/NPCRetaliationSystem.cs b/Content.Server/NPC/Systems/NPCRetaliationSystem.cs index cde8decefc..d6b2000f32 100644 --- a/Content.Server/NPC/Systems/NPCRetaliationSystem.cs +++ b/Content.Server/NPC/Systems/NPCRetaliationSystem.cs @@ -1,7 +1,9 @@ -using Content.Server.NPC.Components; +using Content.Server.NPC.Components; using Content.Shared.CombatMode; using Content.Shared.Damage; using Content.Shared.Mobs.Components; +using Content.Shared.NPC.Components; +using Content.Shared.NPC.Systems; using Robust.Shared.Collections; using Robust.Shared.Timing; @@ -22,37 +24,35 @@ public override void Initialize() SubscribeLocalEvent(OnDisarmed); } - private void OnDamageChanged(EntityUid uid, NPCRetaliationComponent component, DamageChangedEvent args) + private void OnDamageChanged(Entity ent, ref DamageChangedEvent args) { if (!args.DamageIncreased) return; - if (args.Origin is not { } origin) + if (args.Origin is not {} origin) return; - TryRetaliate(uid, origin, component); + TryRetaliate(ent, origin); } - private void OnDisarmed(EntityUid uid, NPCRetaliationComponent component, DisarmedEvent args) + private void OnDisarmed(Entity ent, ref DisarmedEvent args) { - TryRetaliate(uid, args.Source, component); + TryRetaliate(ent, args.Source); } - public bool TryRetaliate(EntityUid uid, EntityUid target, NPCRetaliationComponent? component = null) + public bool TryRetaliate(Entity ent, EntityUid target) { - if (!Resolve(uid, ref component)) - return false; - // don't retaliate against inanimate objects. if (!HasComp(target)) return false; - if (_npcFaction.IsEntityFriendly(uid, target)) + // don't retaliate against the same faction + if (_npcFaction.IsEntityFriendly(ent.Owner, target)) return false; - _npcFaction.AggroEntity(uid, target); - if (component.AttackMemoryLength is { } memoryLength) - component.AttackMemories[target] = _timing.CurTime + memoryLength; + _npcFaction.AggroEntity(ent.Owner, target); + if (ent.Comp.AttackMemoryLength is {} memoryLength) + ent.Comp.AttackMemories[target] = _timing.CurTime + memoryLength; return true; } @@ -64,12 +64,14 @@ public override void Update(float frameTime) var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var retaliationComponent, out var factionException)) { + // TODO: can probably reuse this allocation and clear it foreach (var entity in new ValueList(retaliationComponent.AttackMemories.Keys)) { if (!TerminatingOrDeleted(entity) && _timing.CurTime < retaliationComponent.AttackMemories[entity]) continue; - _npcFaction.DeAggroEntity(uid, entity, factionException); + _npcFaction.DeAggroEntity((uid, factionException), entity); + // TODO: should probably remove the AttackMemory, thats the whole point of the ValueList right?? } } } diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs index e7af2c9107..c58dc261fe 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.Context.cs @@ -582,7 +582,7 @@ private void Separation( (mask & otherBody.CollisionLayer) == 0x0 && (layer & otherBody.CollisionMask) == 0x0 || !_factionQuery.TryGetComponent(ent, out var otherFaction) || - !_npcFaction.IsEntityFriendly(uid, ent, ourFaction, otherFaction) || + !_npcFaction.IsEntityFriendly((uid, ourFaction), (ent, otherFaction)) || // Use <= 0 so we ignore stationary friends in case. Vector2.Dot(otherBody.LinearVelocity, ourVelocity) <= 0f) { diff --git a/Content.Server/NPC/Systems/NPCSteeringSystem.cs b/Content.Server/NPC/Systems/NPCSteeringSystem.cs index c00375d648..f04dc56bc4 100644 --- a/Content.Server/NPC/Systems/NPCSteeringSystem.cs +++ b/Content.Server/NPC/Systems/NPCSteeringSystem.cs @@ -13,6 +13,8 @@ using Content.Shared.Movement.Components; using Content.Shared.Movement.Systems; using Content.Shared.NPC; +using Content.Shared.NPC.Components; +using Content.Shared.NPC.Systems; using Content.Shared.NPC.Events; using Content.Shared.Physics; using Content.Shared.Weapons.Melee; diff --git a/Content.Server/NPC/Systems/NPCUtilitySystem.cs b/Content.Server/NPC/Systems/NPCUtilitySystem.cs index fc483f68c3..6793161105 100644 --- a/Content.Server/NPC/Systems/NPCUtilitySystem.cs +++ b/Content.Server/NPC/Systems/NPCUtilitySystem.cs @@ -12,6 +12,7 @@ using Content.Shared.Hands.Components; using Content.Shared.Inventory; using Content.Shared.Mobs.Systems; +using Content.Shared.NPC.Systems; using Content.Shared.Nutrition.Components; using Content.Shared.Tools.Systems; using Content.Shared.Weapons.Melee; @@ -43,6 +44,7 @@ public sealed class NPCUtilitySystem : EntitySystem [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SolutionContainerSystem _solutions = default!; [Dependency] private readonly WeldableSystem _weldable = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; private EntityQuery _puddleQuery; private EntityQuery _xformQuery; @@ -296,7 +298,7 @@ private float GetScore(NPCBlackboard blackboard, EntityUid targetUid, UtilityCon { var radius = blackboard.GetValueOrDefault(NPCBlackboard.VisionRadius, EntityManager); - return ExamineSystemShared.InRangeUnOccluded(owner, targetUid, radius + 0.5f, null) ? 1f : 0f; + return _examine.InRangeUnOccluded(owner, targetUid, radius + 0.5f, null) ? 1f : 0f; } case TargetInLOSOrCurrentCon: { @@ -313,7 +315,7 @@ private float GetScore(NPCBlackboard blackboard, EntityUid targetUid, UtilityCon return 1f; } - return ExamineSystemShared.InRangeUnOccluded(owner, targetUid, radius + bufferRange, null) ? 1f : 0f; + return _examine.InRangeUnOccluded(owner, targetUid, radius + bufferRange, null) ? 1f : 0f; } case TargetIsAliveCon: { diff --git a/Content.Server/NPC/Systems/NpcFactionSystem.Exception.cs b/Content.Server/NPC/Systems/NpcFactionSystem.Exception.cs deleted file mode 100644 index acef9005ea..0000000000 --- a/Content.Server/NPC/Systems/NpcFactionSystem.Exception.cs +++ /dev/null @@ -1,130 +0,0 @@ -using System.Linq; -using Content.Server.NPC.Components; - -namespace Content.Server.NPC.Systems; - -/// -/// Prevents an NPC from attacking some entities from an enemy faction. -/// -public sealed partial class NpcFactionSystem -{ - private EntityQuery _exceptionQuery; - private EntityQuery _trackerQuery; - - public void InitializeException() - { - _exceptionQuery = GetEntityQuery(); - _trackerQuery = GetEntityQuery(); - - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnTrackerShutdown); - } - - private void OnShutdown(EntityUid uid, FactionExceptionComponent component, ComponentShutdown args) - { - foreach (var ent in component.Hostiles) - { - if (!_trackerQuery.TryGetComponent(ent, out var trackerComponent)) - continue; - trackerComponent.Entities.Remove(uid); - } - - foreach (var ent in component.Ignored) - { - if (!_trackerQuery.TryGetComponent(ent, out var trackerComponent)) - continue; - trackerComponent.Entities.Remove(uid); - } - } - - private void OnTrackerShutdown(EntityUid uid, FactionExceptionTrackerComponent component, ComponentShutdown args) - { - foreach (var ent in component.Entities) - { - if (!_exceptionQuery.TryGetComponent(ent, out var exceptionComponent)) - continue; - exceptionComponent.Ignored.Remove(uid); - exceptionComponent.Hostiles.Remove(uid); - } - } - - /// - /// Returns whether the entity from an enemy faction won't be attacked - /// - public bool IsIgnored(EntityUid uid, EntityUid target, FactionExceptionComponent? comp = null) - { - if (!Resolve(uid, ref comp, false)) - return false; - - return comp.Ignored.Contains(target); - } - - /// - /// Returns the specific hostile entities for a given entity. - /// - public IEnumerable GetHostiles(EntityUid uid, FactionExceptionComponent? comp = null) - { - if (!Resolve(uid, ref comp, false)) - return Array.Empty(); - - return comp.Hostiles; - } - - /// - /// Prevents an entity from an enemy faction from being attacked - /// - public void IgnoreEntity(EntityUid uid, EntityUid target, FactionExceptionComponent? comp = null) - { - comp ??= EnsureComp(uid); - comp.Ignored.Add(target); - EnsureComp(target).Entities.Add(uid); - } - - /// - /// Prevents a list of entities from an enemy faction from being attacked - /// - public void IgnoreEntities(EntityUid uid, IEnumerable ignored, FactionExceptionComponent? comp = null) - { - comp ??= EnsureComp(uid); - foreach (var ignore in ignored) - { - IgnoreEntity(uid, ignore, comp); - } - } - - /// - /// Makes an entity always be considered hostile. - /// - public void AggroEntity(EntityUid uid, EntityUid target, FactionExceptionComponent? comp = null) - { - comp ??= EnsureComp(uid); - comp.Hostiles.Add(target); - EnsureComp(target).Entities.Add(uid); - } - - /// - /// Makes an entity no longer be considered hostile, if it was. - /// Doesn't apply to regular faction hostilities. - /// - public void DeAggroEntity(EntityUid uid, EntityUid target, FactionExceptionComponent? comp = null) - { - if (!Resolve(uid, ref comp, false)) - return; - if (!comp.Hostiles.Remove(target) || !_trackerQuery.TryGetComponent(target, out var tracker)) - return; - tracker.Entities.Remove(uid); - } - - /// - /// Makes a list of entities no longer be considered hostile, if it was. - /// Doesn't apply to regular faction hostilities. - /// - public void AggroEntities(EntityUid uid, IEnumerable entities, FactionExceptionComponent? comp = null) - { - comp ??= EnsureComp(uid); - foreach (var ent in entities) - { - AggroEntity(uid, ent, comp); - } - } -} diff --git a/Content.Server/NPC/Systems/NpcFactionSystem.cs b/Content.Server/NPC/Systems/NpcFactionSystem.cs deleted file mode 100644 index 0657ab4af9..0000000000 --- a/Content.Server/NPC/Systems/NpcFactionSystem.cs +++ /dev/null @@ -1,273 +0,0 @@ -using System.Collections.Frozen; -using System.Linq; -using Content.Server.NPC.Components; -using JetBrains.Annotations; -using Robust.Shared.Prototypes; - -namespace Content.Server.NPC.Systems; - -/// -/// Outlines faction relationships with each other. -/// -public sealed partial class NpcFactionSystem : EntitySystem -{ - [Dependency] private readonly EntityLookupSystem _lookup = default!; - [Dependency] private readonly IPrototypeManager _protoManager = default!; - - private ISawmill _sawmill = default!; - - /// - /// To avoid prototype mutability we store an intermediary data class that gets used instead. - /// - private FrozenDictionary _factions = FrozenDictionary.Empty; - - public override void Initialize() - { - base.Initialize(); - _sawmill = Logger.GetSawmill("faction"); - SubscribeLocalEvent(OnFactionStartup); - SubscribeLocalEvent(OnProtoReload); - - InitializeException(); - RefreshFactions(); - } - - private void OnProtoReload(PrototypesReloadedEventArgs obj) - { - if (obj.WasModified()) - RefreshFactions(); - } - - private void OnFactionStartup(EntityUid uid, NpcFactionMemberComponent memberComponent, ComponentStartup args) - { - RefreshFactions(memberComponent); - } - - /// - /// Refreshes the cached factions for this component. - /// - private void RefreshFactions(NpcFactionMemberComponent memberComponent) - { - memberComponent.FriendlyFactions.Clear(); - memberComponent.HostileFactions.Clear(); - - foreach (var faction in memberComponent.Factions) - { - // YAML Linter already yells about this - if (!_factions.TryGetValue(faction, out var factionData)) - continue; - - memberComponent.FriendlyFactions.UnionWith(factionData.Friendly); - memberComponent.HostileFactions.UnionWith(factionData.Hostile); - } - } - - /// - /// Adds this entity to the particular faction. - /// - public void AddFaction(EntityUid uid, string faction, bool dirty = true) - { - if (!_protoManager.HasIndex(faction)) - { - _sawmill.Error($"Unable to find faction {faction}"); - return; - } - - var comp = EnsureComp(uid); - if (!comp.Factions.Add(faction)) - return; - - if (dirty) - { - RefreshFactions(comp); - } - } - - /// - /// Removes this entity from the particular faction. - /// - public void RemoveFaction(EntityUid uid, string faction, bool dirty = true) - { - if (!_protoManager.HasIndex(faction)) - { - _sawmill.Error($"Unable to find faction {faction}"); - return; - } - - if (!TryComp(uid, out var component)) - return; - - if (!component.Factions.Remove(faction)) - return; - - if (dirty) - { - RefreshFactions(component); - } - } - - /// - /// Remove this entity from all factions. - /// - public void ClearFactions(EntityUid uid, bool dirty = true) - { - if (!TryComp(uid, out var component)) - return; - - component.Factions.Clear(); - - if (dirty) - RefreshFactions(component); - } - - public IEnumerable GetNearbyHostiles(EntityUid entity, float range, NpcFactionMemberComponent? component = null) - { - if (!Resolve(entity, ref component, false)) - return Array.Empty(); - - var hostiles = GetNearbyFactions(entity, range, component.HostileFactions); - if (TryComp(entity, out var factionException)) - { - // ignore anything from enemy faction that we are explicitly friendly towards - return hostiles - .Union(GetHostiles(entity, factionException)) - .Where(target => !IsIgnored(entity, target, factionException)); - } - - return hostiles; - } - - [PublicAPI] - public IEnumerable GetNearbyFriendlies(EntityUid entity, float range, NpcFactionMemberComponent? component = null) - { - if (!Resolve(entity, ref component, false)) - return Array.Empty(); - - return GetNearbyFactions(entity, range, component.FriendlyFactions); - } - - private IEnumerable GetNearbyFactions(EntityUid entity, float range, HashSet factions) - { - var xformQuery = GetEntityQuery(); - - if (!xformQuery.TryGetComponent(entity, out var entityXform)) - yield break; - - foreach (var ent in _lookup.GetEntitiesInRange(entityXform.MapPosition, range)) - { - if (ent.Owner == entity) - continue; - - if (!factions.Overlaps(ent.Comp.Factions)) - continue; - - yield return ent.Owner; - } - } - - public bool IsEntityFriendly(EntityUid uidA, EntityUid uidB, NpcFactionMemberComponent? factionA = null, NpcFactionMemberComponent? factionB = null) - { - if (!Resolve(uidA, ref factionA, false) || !Resolve(uidB, ref factionB, false)) - return false; - - return factionA.Factions.Overlaps(factionB.Factions) || factionA.FriendlyFactions.Overlaps(factionB.Factions); - } - - public bool IsFactionFriendly(string target, string with) - { - return _factions[target].Friendly.Contains(with) && _factions[with].Friendly.Contains(target); - } - - public bool IsFactionFriendly(string target, EntityUid with, NpcFactionMemberComponent? factionWith = null) - { - if (!Resolve(with, ref factionWith, false)) - return false; - - return factionWith.Factions.All(x => IsFactionFriendly(target, x)) || - factionWith.FriendlyFactions.Contains(target); - } - - public bool IsFactionHostile(string target, string with) - { - return _factions[target].Hostile.Contains(with) && _factions[with].Hostile.Contains(target); - } - - public bool IsFactionHostile(string target, EntityUid with, NpcFactionMemberComponent? factionWith = null) - { - if (!Resolve(with, ref factionWith, false)) - return false; - - return factionWith.Factions.All(x => IsFactionHostile(target, x)) || - factionWith.HostileFactions.Contains(target); - } - - public bool IsFactionNeutral(string target, string with) - { - return !IsFactionFriendly(target, with) && !IsFactionHostile(target, with); - } - - /// - /// Makes the source faction friendly to the target faction, 1-way. - /// - public void MakeFriendly(string source, string target) - { - if (!_factions.TryGetValue(source, out var sourceFaction)) - { - _sawmill.Error($"Unable to find faction {source}"); - return; - } - - if (!_factions.ContainsKey(target)) - { - _sawmill.Error($"Unable to find faction {target}"); - return; - } - - sourceFaction.Friendly.Add(target); - sourceFaction.Hostile.Remove(target); - RefreshFactions(); - } - - private void RefreshFactions() - { - - _factions = _protoManager.EnumeratePrototypes().ToFrozenDictionary( - faction => faction.ID, - faction => new FactionData - { - Friendly = faction.Friendly.ToHashSet(), - Hostile = faction.Hostile.ToHashSet() - - }); - - foreach (var comp in EntityQuery(true)) - { - comp.FriendlyFactions.Clear(); - comp.HostileFactions.Clear(); - RefreshFactions(comp); - } - } - - /// - /// Makes the source faction hostile to the target faction, 1-way. - /// - public void MakeHostile(string source, string target) - { - if (!_factions.TryGetValue(source, out var sourceFaction)) - { - _sawmill.Error($"Unable to find faction {source}"); - return; - } - - if (!_factions.ContainsKey(target)) - { - _sawmill.Error($"Unable to find faction {target}"); - return; - } - - sourceFaction.Friendly.Remove(target); - sourceFaction.Hostile.Add(target); - RefreshFactions(); - } -} - diff --git a/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs b/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs index 552ee0397f..59dec556fa 100644 --- a/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs +++ b/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs @@ -50,9 +50,8 @@ private void OnBeforeInteractHand(EntityUid uid, BatteryDrainerComponent comp, B var doAfterArgs = new DoAfterArgs(EntityManager, uid, comp.DrainTime, new DrainDoAfterEvent(), target: target, eventTarget: uid) { - BreakOnUserMove = true, - BreakOnWeightlessMove = true, // prevent a ninja on a pod remotely draining it MovementThreshold = 0.5f, + BreakOnMove = true, CancelDuplicate = false, AttemptFrequency = AttemptFrequency.StartAndEnd }; diff --git a/Content.Server/Nuke/NukeSystem.cs b/Content.Server/Nuke/NukeSystem.cs index d6767cd2de..60163015cc 100644 --- a/Content.Server/Nuke/NukeSystem.cs +++ b/Content.Server/Nuke/NukeSystem.cs @@ -591,8 +591,7 @@ private void DisarmBombDoafter(EntityUid uid, EntityUid user, NukeComponent nuke var doAfter = new DoAfterArgs(EntityManager, user, nuke.DisarmDoafterLength, new NukeDisarmDoAfterEvent(), uid, target: uid) { BreakOnDamage = true, - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, NeedHand = true }; diff --git a/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs b/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs index f8d781bcff..a28679ddbc 100644 --- a/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/CreamPieSystem.cs @@ -1,12 +1,11 @@ using Content.Server.Chemistry.Containers.EntitySystems; -using Content.Server.Explosion.Components; using Content.Server.Explosion.EntitySystems; using Content.Server.Fluids.EntitySystems; using Content.Server.Nutrition.Components; using Content.Server.Popups; using Content.Shared.Containers.ItemSlots; using Content.Shared.Explosion.Components; -using Content.Shared.Interaction; +using Content.Shared.Nutrition; using Content.Shared.Nutrition.Components; using Content.Shared.Nutrition.EntitySystems; using Content.Shared.Rejuvenate; @@ -32,7 +31,10 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnInteractUsing); + // activate BEFORE entity is deleted and trash is spawned + SubscribeLocalEvent(OnConsume, before: [typeof(FoodSystem)]); + SubscribeLocalEvent(OnSlice); + SubscribeLocalEvent(OnRejuvenate); } @@ -56,7 +58,12 @@ protected override void SplattedCreamPie(EntityUid uid, CreamPieComponent creamP EntityManager.QueueDeleteEntity(uid); } - private void OnInteractUsing(Entity entity, ref InteractUsingEvent args) + private void OnConsume(Entity entity, ref ConsumeDoAfterEvent args) + { + ActivatePayload(entity); + } + + private void OnSlice(Entity entity, ref SliceFoodEvent args) { ActivatePayload(entity); } diff --git a/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs b/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs index 925e50b949..5fb090087a 100644 --- a/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/DrinkSystem.cs @@ -283,9 +283,8 @@ private bool TryDrink(EntityUid user, EntityUid target, DrinkComponent drink, En target: target, used: item) { - BreakOnUserMove = forceDrink, + BreakOnMove = forceDrink, BreakOnDamage = true, - BreakOnTargetMove = forceDrink, MovementThreshold = 0.01f, DistanceThreshold = 1.0f, // Mice and the like can eat without hands. @@ -311,6 +310,9 @@ private void OnDoAfter(Entity entity, ref ConsumeDoAfterEvent ar if (args.Used is null || !_solutionContainer.TryGetSolution(args.Used.Value, args.Solution, out var soln, out var solution)) return; + if (_openable.IsClosed(args.Used.Value, args.Target.Value)) + return; + // TODO this should really be checked every tick. if (_food.IsMouthBlocked(args.Target.Value)) return; diff --git a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs index 5a6a8c4120..6d56a2a2a1 100644 --- a/Content.Server/Nutrition/EntitySystems/FoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/FoodSystem.cs @@ -180,9 +180,8 @@ private void OnFeedFood(Entity entity, ref AfterInteractEvent arg target: target, used: food) { - BreakOnUserMove = forceFeed, + BreakOnMove = forceFeed, BreakOnDamage = true, - BreakOnTargetMove = forceFeed, MovementThreshold = 0.01f, DistanceThreshold = MaxFeedDistance, // Mice and the like can eat without hands. diff --git a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs index 679b2cdbc2..e966daf5e5 100644 --- a/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/SliceableFoodSystem.cs @@ -1,5 +1,6 @@ using Content.Server.Chemistry.Containers.EntitySystems; using Content.Server.Nutrition.Components; +using Content.Shared.Nutrition; using Content.Shared.Nutrition.Components; using Content.Shared.Chemistry.Components; using Content.Shared.Examine; @@ -66,6 +67,8 @@ private bool TrySliceFood(EntityUid uid, EntityUid user, EntityUid usedItem, FillSlice(sliceUid, lostSolution); _audio.PlayPvs(component.Sound, transform.Coordinates, AudioParams.Default.WithVolume(-2)); + var ev = new SliceFoodEvent(); + RaiseLocalEvent(uid, ref ev); // Decrease size of item based on count - Could implement in the future // Bug with this currently is the size in a container is not updated diff --git a/Content.Server/Nutrition/EntitySystems/SmokingSystem.Vape.cs b/Content.Server/Nutrition/EntitySystems/SmokingSystem.Vape.cs index fe0d1d0c16..fb56dffac9 100644 --- a/Content.Server/Nutrition/EntitySystems/SmokingSystem.Vape.cs +++ b/Content.Server/Nutrition/EntitySystems/SmokingSystem.Vape.cs @@ -113,8 +113,7 @@ private void OnVapeInteraction(Entity entity, ref AfterInteractEv var vapeDoAfterEvent = new VapeDoAfterEvent(solution, forced); _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, delay, vapeDoAfterEvent, entity.Owner, target: args.Target, used: entity.Owner) { - BreakOnTargetMove = true, - BreakOnUserMove = false, + BreakOnMove = false, BreakOnDamage = true }); } diff --git a/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs b/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs index f9feed955f..0edd0711b6 100644 --- a/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs +++ b/Content.Server/Nutrition/EntitySystems/UtensilSystem.cs @@ -1,3 +1,4 @@ +using Content.Shared.Containers.ItemSlots; using Content.Server.Nutrition.Components; using Content.Shared.Nutrition.Components; using Content.Shared.Nutrition.EntitySystems; @@ -25,7 +26,7 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnAfterInteract); + SubscribeLocalEvent(OnAfterInteract, after: new[] { typeof(ItemSlotsSystem) }); } /// @@ -33,6 +34,9 @@ public override void Initialize() /// private void OnAfterInteract(EntityUid uid, UtensilComponent component, AfterInteractEvent ev) { + if (ev.Handled) + return; + if (ev.Target == null || !ev.CanReach) return; diff --git a/Content.Server/Objectives/ObjectivesSystem.cs b/Content.Server/Objectives/ObjectivesSystem.cs index b18668247a..20205b8b72 100644 --- a/Content.Server/Objectives/ObjectivesSystem.cs +++ b/Content.Server/Objectives/ObjectivesSystem.cs @@ -12,6 +12,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Random; using System.Linq; +using System.Text; namespace Content.Server.Objectives; @@ -82,29 +83,32 @@ private void OnRoundEndText(RoundEndTextAppendEvent ev) totalInCustody += minds.Where(m => IsInCustody(m)).Count(); } - var result = Loc.GetString("objectives-round-end-result", ("count", total), ("agent", agent)); + var result = new StringBuilder(); + result.AppendLine(Loc.GetString("objectives-round-end-result", ("count", total), ("agent", agent))); if (agent == Loc.GetString("traitor-round-end-agent-name")) { - result += "\n" + Loc.GetString("objectives-round-end-result-in-custody", ("count", total), ("custody", totalInCustody), ("agent", agent)); + result.AppendLine(Loc.GetString("objectives-round-end-result-in-custody", ("count", total), ("custody", totalInCustody), ("agent", agent))); } // next add all the players with its own prepended text foreach (var (prepend, minds) in summary) { if (prepend != string.Empty) - result += prepend; + result.Append(prepend); // add space between the start text and player list - result += "\n"; + result.AppendLine(); - AddSummary(ref result, agent, minds); + AddSummary(result, agent, minds); } - ev.AddLine(result + "\n"); + ev.AddLine(result.AppendLine().ToString()); } } - private void AddSummary(ref string result, string agent, List minds) + private void AddSummary(StringBuilder result, string agent, List minds) { + var agentSummaries = new List<(string summary, float successRate, int completedObjectives)>(); + foreach (var mindId in minds) { if (!TryComp(mindId, out MindComponent? mind)) @@ -114,25 +118,26 @@ private void AddSummary(ref string result, string agent, List minds) if (title == null) continue; - result += "\n"; - var custody = IsInCustody(mindId, mind) ? Loc.GetString("objectives-in-custody") : string.Empty; var objectives = mind.Objectives; if (objectives.Count == 0) { - result += Loc.GetString("objectives-no-objectives", ("custody", custody), ("title", title), ("agent", agent)); + agentSummaries.Add((Loc.GetString("objectives-no-objectives", ("custody", custody), ("title", title), ("agent", agent)), 0f, 0)); continue; } - result += Loc.GetString("objectives-with-objectives", ("custody", custody), ("title", title), ("agent", agent)); + var completedObjectives = 0; + var totalObjectives = 0; + var agentSummary = new StringBuilder(); + agentSummary.AppendLine(Loc.GetString("objectives-with-objectives", ("custody", custody), ("title", title), ("agent", agent))); foreach (var objectiveGroup in objectives.GroupBy(o => Comp(o).Issuer)) { //TO DO: //check for the right group here. Getting the target issuer is easy: objectiveGroup.Key //It should be compared to the type of the group's issuer. - result += "\n" + Loc.GetString($"objective-issuer-{objectiveGroup.Key}"); + agentSummary.AppendLine(Loc.GetString($"objective-issuer-{objectiveGroup.Key}")); foreach (var objective in objectiveGroup) { @@ -142,26 +147,39 @@ private void AddSummary(ref string result, string agent, List minds) var objectiveTitle = info.Value.Title; var progress = info.Value.Progress; + totalObjectives++; + + agentSummary.Append("- "); if (progress > 0.99f) { - result += "\n- " + Loc.GetString( + agentSummary.AppendLine(Loc.GetString( "objectives-objective-success", ("objective", objectiveTitle), ("markupColor", "green") - ); + )); + completedObjectives++; } else { - result += "\n- " + Loc.GetString( + agentSummary.AppendLine(Loc.GetString( "objectives-objective-fail", ("objective", objectiveTitle), ("progress", (int) (progress * 100)), ("markupColor", "red") - ); + )); } } } + + var successRate = totalObjectives > 0 ? (float) completedObjectives / totalObjectives : 0f; + agentSummaries.Add((agentSummary.ToString(), successRate, completedObjectives)); } + + var sortedAgents = agentSummaries.OrderByDescending(x => x.successRate) + .ThenByDescending(x => x.completedObjectives); + + foreach (var (summary, _, _) in sortedAgents) + result.AppendLine(summary); } public EntityUid? GetRandomObjective(EntityUid mindId, MindComponent mind, string objectiveGroupProto) diff --git a/Content.Server/Objectives/Systems/StealConditionSystem.cs b/Content.Server/Objectives/Systems/StealConditionSystem.cs index 02d4ee010b..0fe6f0947c 100644 --- a/Content.Server/Objectives/Systems/StealConditionSystem.cs +++ b/Content.Server/Objectives/Systems/StealConditionSystem.cs @@ -6,11 +6,10 @@ using Robust.Shared.Containers; using Robust.Shared.Prototypes; using Robust.Shared.Random; -using Content.Shared.Pulling.Components; -using Content.Shared.Objectives; using Content.Shared.Mind.Components; using Content.Shared.Mobs.Systems; using Content.Shared.Mobs.Components; +using Content.Shared.Movement.Pulling.Components; namespace Content.Server.Objectives.Systems; @@ -100,19 +99,19 @@ private float GetProgress(MindComponent mind, StealConditionComponent condition) var count = 0; //check pulling object - if (TryComp(mind.OwnedEntity, out var pull)) //TO DO: to make the code prettier? don't like the repetition + if (TryComp(mind.OwnedEntity, out var pull)) //TO DO: to make the code prettier? don't like the repetition { - var pullid = pull.Pulling; - if (pullid != null) + var pulledEntity = pull.Pulling; + if (pulledEntity != null) { // check if this is the item - if (CheckStealTarget(pullid.Value, condition)) count++; + if (CheckStealTarget(pulledEntity.Value, condition)) count++; //we don't check the inventories of sentient entity - if (!TryComp(pullid, out var pullMind)) + if (!HasComp(pulledEntity)) { // if it is a container check its contents - if (_containerQuery.TryGetComponent(pullid, out var containerManager)) + if (_containerQuery.TryGetComponent(pulledEntity, out var containerManager)) stack.Push(containerManager); } } diff --git a/Content.Server/Paint/PaintSystem.cs b/Content.Server/Paint/PaintSystem.cs new file mode 100644 index 0000000000..892f961d63 --- /dev/null +++ b/Content.Server/Paint/PaintSystem.cs @@ -0,0 +1,178 @@ +using Content.Shared.Popups; +using Content.Shared.Paint; +using Content.Shared.Sprite; +using Content.Shared.DoAfter; +using Content.Shared.Interaction; +using Content.Server.Chemistry.Containers.EntitySystems; +using Robust.Shared.Audio.Systems; +using Content.Shared.Humanoid; +using Robust.Shared.Utility; +using Content.Shared.Verbs; +using Content.Shared.SubFloor; +using Content.Server.Nutrition.Components; +using Content.Shared.Inventory; +using Content.Server.Nutrition.EntitySystems; + +namespace Content.Server.Paint; + +/// +/// Colors target and consumes reagent on each color success. +/// +public sealed class PaintSystem : SharedPaintSystem +{ + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SolutionContainerSystem _solutionContainer = default!; + [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly OpenableSystem _openable = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInteract); + SubscribeLocalEvent(OnPaint); + SubscribeLocalEvent>(OnPaintVerb); + } + + private void OnInteract(EntityUid uid, PaintComponent component, AfterInteractEvent args) + { + if (!args.CanReach) + return; + + if (args.Target is not { Valid: true } target) + return; + + PrepPaint(uid, component, target, args.User); + } + + private void OnPaintVerb(EntityUid uid, PaintComponent component, GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess) + return; + + var paintText = Loc.GetString("paint-verb"); + + var verb = new UtilityVerb() + { + Act = () => + { + PrepPaint(uid, component, args.Target, args.User); + }, + + Text = paintText, + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/paint.svg.192dpi.png")) + }; + args.Verbs.Add(verb); + } + private void PrepPaint(EntityUid uid, PaintComponent component, EntityUid target, EntityUid user) + { + + var doAfterEventArgs = new DoAfterArgs(EntityManager, user, component.Delay, new PaintDoAfterEvent(), uid, target: target, used: uid) + { + BreakOnMove = true, + NeedHand = true, + BreakOnHandChange = true + }; + + _doAfterSystem.TryStartDoAfter(doAfterEventArgs); + } + + private void OnPaint(Entity entity, ref PaintDoAfterEvent args) + { + if (args.Target == null || args.Used == null) + return; + + if (args.Handled || args.Cancelled) + return; + + if (args.Target is not { Valid: true } target) + return; + + if (!_openable.IsOpen(entity)) + { + _popup.PopupEntity(Loc.GetString("paint-closed", ("used", args.Used)), args.User, args.User, PopupType.Medium); + return; + } + + if (HasComp(target) || HasComp(target)) + { + _popup.PopupEntity(Loc.GetString("paint-failure-painted", ("target", args.Target)), args.User, args.User, PopupType.Medium); + return; + } + + if (!entity.Comp.Blacklist?.IsValid(target, EntityManager) != true || HasComp(target) || HasComp(target)) + { + _popup.PopupEntity(Loc.GetString("paint-failure", ("target", args.Target)), args.User, args.User, PopupType.Medium); + return; + } + + if (TryPaint(entity, target)) + { + EnsureComp(target, out PaintedComponent? paint); + EnsureComp(target); + + paint.Color = entity.Comp.Color; // set the target color to the color specified in the spray paint yml. + _audio.PlayPvs(entity.Comp.Spray, entity); + paint.Enabled = true; + + if (HasComp(target)) // Paint any clothing the target is wearing. + { + if (_inventory.TryGetSlots(target, out var slotDefinitions)) + { + foreach (var slot in slotDefinitions) + { + if (!_inventory.TryGetSlotEntity(target, slot.Name, out var slotEnt)) + continue; + + if (HasComp(slotEnt.Value) || !entity.Comp.Blacklist?.IsValid(slotEnt.Value, + EntityManager) != true + || HasComp(slotEnt.Value) || + HasComp( + slotEnt.Value)) + { + continue; + } + + EnsureComp(slotEnt.Value, out PaintedComponent? slotpaint); + EnsureComp(slotEnt.Value); + slotpaint.Color = entity.Comp.Color; + _appearanceSystem.SetData(slotEnt.Value, PaintVisuals.Painted, true); + Dirty(slotEnt.Value, slotpaint); + } + } + } + + _popup.PopupEntity(Loc.GetString("paint-success", ("target", args.Target)), args.User, args.User, PopupType.Medium); + _appearanceSystem.SetData(target, PaintVisuals.Painted, true); + Dirty(target, paint); + args.Handled = true; + return; + } + + if (!TryPaint(entity, target)) + { + _popup.PopupEntity(Loc.GetString("paint-empty", ("used", args.Used)), args.User, args.User, PopupType.Medium); + return; + } + } + + private bool TryPaint(Entity reagent, EntityUid target) + { + if (HasComp(target) || HasComp(target)) + return false; + + if (_solutionContainer.TryGetSolution(reagent.Owner, reagent.Comp.Solution, out _, out var solution)) + { + var quantity = solution.RemoveReagent(reagent.Comp.Reagent, reagent.Comp.ConsumptionUnit); + if (quantity > 0)// checks quantity of solution is more than 0. + return true; + + if (quantity < 1) + return false; + } + return false; + } +} diff --git a/Content.Server/Physics/Controllers/PullController.cs b/Content.Server/Physics/Controllers/PullController.cs deleted file mode 100644 index 8f58f807aa..0000000000 --- a/Content.Server/Physics/Controllers/PullController.cs +++ /dev/null @@ -1,207 +0,0 @@ -using System.Numerics; -using Content.Shared.ActionBlocker; -using Content.Shared.Gravity; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; -using Content.Shared.Rotatable; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Controllers; - -namespace Content.Server.Physics.Controllers -{ - public sealed class PullController : VirtualController - { - // Parameterization for pulling: - // Speeds. Note that the speed is mass-independent (multiplied by mass). - // Instead, tuning to mass is done via the mass values below. - // Note that setting the speed too high results in overshoots (stabilized by drag, but bad) - private const float AccelModifierHigh = 15f; - private const float AccelModifierLow = 60.0f; - // High/low-mass marks. Curve is constant-lerp-constant, i.e. if you can even pull an item, - // you'll always get at least AccelModifierLow and no more than AccelModifierHigh. - private const float AccelModifierHighMass = 70.0f; // roundstart saltern emergency closet - private const float AccelModifierLowMass = 5.0f; // roundstart saltern emergency crowbar - // Used to control settling (turns off pulling). - private const float MaximumSettleVelocity = 0.1f; - private const float MaximumSettleDistance = 0.1f; - // Settle shutdown control. - // Mustn't be too massive, as that causes severe mispredicts *and can prevent it ever resolving*. - // Exists to bleed off "I pulled my crowbar" overshoots. - // Minimum velocity for shutdown to be necessary. This prevents stuff getting stuck b/c too much shutdown. - private const float SettleMinimumShutdownVelocity = 0.25f; - // Distance in which settle shutdown multiplier is at 0. It then scales upwards linearly with closer distances. - private const float SettleShutdownDistance = 1.0f; - // Velocity change of -LinearVelocity * frameTime * this - private const float SettleShutdownMultiplier = 20.0f; - - // How much you must move for the puller movement check to actually hit. - private const float MinimumMovementDistance = 0.005f; - - [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; - [Dependency] private readonly SharedPullingSystem _pullableSystem = default!; - [Dependency] private readonly SharedGravitySystem _gravity = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; - - // TODO: Move this stuff to pullingsystem - /// - /// If distance between puller and pulled entity lower that this threshold, - /// pulled entity will not change its rotation. - /// Helps with small distance jittering - /// - private const float ThresholdRotDistance = 1; - - /// - /// If difference between puller and pulled angle lower that this threshold, - /// pulled entity will not change its rotation. - /// Helps with diagonal movement jittering - /// As of further adjustments, should divide cleanly into 90 degrees - /// - private const float ThresholdRotAngle = 22.5f; - - public override void Initialize() - { - UpdatesAfter.Add(typeof(MoverController)); - SubscribeLocalEvent(OnPullerMove); - - base.Initialize(); - } - - private void OnPullerMove(EntityUid uid, SharedPullerComponent component, ref MoveEvent args) - { - if (component.Pulling is not { } pullable || !TryComp(pullable, out var pullableComponent)) - return; - - UpdatePulledRotation(uid, pullable); - - if (args.NewPosition.EntityId == args.OldPosition.EntityId && - (args.NewPosition.Position - args.OldPosition.Position).LengthSquared() < MinimumMovementDistance * MinimumMovementDistance) - return; - - if (TryComp(pullable, out var physics)) - PhysicsSystem.WakeBody(pullable, body: physics); - - _pullableSystem.StopMoveTo(pullableComponent); - } - - private void UpdatePulledRotation(EntityUid puller, EntityUid pulled) - { - // TODO: update once ComponentReference works with directed event bus. - if (!TryComp(pulled, out RotatableComponent? rotatable)) - return; - - if (!rotatable.RotateWhilePulling) - return; - - var xforms = GetEntityQuery(); - var pulledXform = xforms.GetComponent(pulled); - var pullerXform = xforms.GetComponent(puller); - - var pullerData = TransformSystem.GetWorldPositionRotation(pullerXform, xforms); - var pulledData = TransformSystem.GetWorldPositionRotation(pulledXform, xforms); - - var dir = pullerData.WorldPosition - pulledData.WorldPosition; - if (dir.LengthSquared() > ThresholdRotDistance * ThresholdRotDistance) - { - var oldAngle = pulledData.WorldRotation; - var newAngle = Angle.FromWorldVec(dir); - - var diff = newAngle - oldAngle; - if (Math.Abs(diff.Degrees) > ThresholdRotAngle / 2f) - { - // Ok, so this bit is difficult because ideally it would look like it's snapping to sane angles. - // Otherwise PIANO DOOR STUCK! happens. - // But it also needs to work with station rotation / align to the local parent. - // So... - var baseRotation = pulledData.WorldRotation - pulledXform.LocalRotation; - var localRotation = newAngle - baseRotation; - var localRotationSnapped = Angle.FromDegrees(Math.Floor((localRotation.Degrees / ThresholdRotAngle) + 0.5f) * ThresholdRotAngle); - TransformSystem.SetLocalRotation(pulledXform, localRotationSnapped); - } - } - } - - public override void UpdateBeforeSolve(bool prediction, float frameTime) - { - base.UpdateBeforeSolve(prediction, frameTime); - - foreach (var pullable in _pullableSystem.Moving) - { - // There's a 1-frame delay between stopping moving something and it leaving the Moving set. - // This can include if leaving the Moving set due to not being pulled anymore, - // or due to being deleted. - - if (pullable.Deleted) - continue; - - if (pullable.MovingTo == null) - continue; - - if (pullable.Puller is not {Valid: true} puller) - continue; - - var pullableEnt = pullable.Owner; - var pullableXform = Transform(pullableEnt); - var pullerXform = Transform(puller); - - // Now that's over with... - - var pullerPosition = pullerXform.MapPosition; - var movingTo = pullable.MovingTo.Value.ToMap(EntityManager, _transform); - if (movingTo.MapId != pullerPosition.MapId) - { - _pullableSystem.StopMoveTo(pullable); - continue; - } - - if (!TryComp(pullableEnt, out var physics) || - physics.BodyType == BodyType.Static || - movingTo.MapId != pullableXform.MapID) - { - _pullableSystem.StopMoveTo(pullable); - continue; - } - - var movingPosition = movingTo.Position; - var ownerPosition = pullableXform.MapPosition.Position; - - var diff = movingPosition - ownerPosition; - var diffLength = diff.Length(); - - if (diffLength < MaximumSettleDistance && physics.LinearVelocity.Length() < MaximumSettleVelocity) - { - PhysicsSystem.SetLinearVelocity(pullableEnt, Vector2.Zero, body: physics); - _pullableSystem.StopMoveTo(pullable); - continue; - } - - var impulseModifierLerp = Math.Min(1.0f, Math.Max(0.0f, (physics.Mass - AccelModifierLowMass) / (AccelModifierHighMass - AccelModifierLowMass))); - var impulseModifier = MathHelper.Lerp(AccelModifierLow, AccelModifierHigh, impulseModifierLerp); - var multiplier = diffLength < 1 ? impulseModifier * diffLength : impulseModifier; - // Note the implication that the real rules of physics don't apply to pulling control. - var accel = diff.Normalized() * multiplier; - // Now for the part where velocity gets shutdown... - if (diffLength < SettleShutdownDistance && physics.LinearVelocity.Length() >= SettleMinimumShutdownVelocity) - { - // Shutdown velocity increases as we get closer to centre - var scaling = (SettleShutdownDistance - diffLength) / SettleShutdownDistance; - accel -= physics.LinearVelocity * SettleShutdownMultiplier * scaling; - } - - PhysicsSystem.WakeBody(pullableEnt, body: physics); - - var impulse = accel * physics.Mass * frameTime; - PhysicsSystem.ApplyLinearImpulse(pullableEnt, impulse, body: physics); - - // if the puller is weightless or can't move, then we apply the inverse impulse (Newton's third law). - // doing it under gravity produces an unsatisfying wiggling when pulling. - // If player can't move, assume they are on a chair and we need to prevent pull-moving. - if ((_gravity.IsWeightless(puller) && pullerXform.GridUid == null) || !_actionBlockerSystem.CanMove(puller)) - { - PhysicsSystem.WakeBody(puller); - PhysicsSystem.ApplyLinearImpulse(puller, -impulse); - } - } - } - } -} diff --git a/Content.Server/Pointing/EntitySystems/PointingSystem.cs b/Content.Server/Pointing/EntitySystems/PointingSystem.cs index a7c455e6a5..06d2d6f58b 100644 --- a/Content.Server/Pointing/EntitySystems/PointingSystem.cs +++ b/Content.Server/Pointing/EntitySystems/PointingSystem.cs @@ -37,6 +37,7 @@ internal sealed class PointingSystem : SharedPointingSystem [Dependency] private readonly VisibilitySystem _visibilitySystem = default!; [Dependency] private readonly SharedMindSystem _minds = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; private static readonly TimeSpan PointDelay = TimeSpan.FromSeconds(0.5f); @@ -100,7 +101,7 @@ public bool InRange(EntityUid pointer, EntityCoordinates coordinates) } else { - return ExamineSystemShared.InRangeUnOccluded(pointer, coordinates, 15, predicate: e => e == pointer); + return _examine.InRangeUnOccluded(pointer, coordinates, 15, predicate: e => e == pointer); } } diff --git a/Content.Server/Power/EntitySystems/ChargerSystem.cs b/Content.Server/Power/EntitySystems/ChargerSystem.cs index b6b718455d..db16dfa008 100644 --- a/Content.Server/Power/EntitySystems/ChargerSystem.cs +++ b/Content.Server/Power/EntitySystems/ChargerSystem.cs @@ -6,7 +6,6 @@ using JetBrains.Annotations; using Robust.Shared.Containers; using System.Diagnostics.CodeAnalysis; -using System.Linq; using Content.Shared.Storage.Components; using Robust.Server.Containers; @@ -179,7 +178,7 @@ private CellChargerStatus GetStatus(EntityUid uid, ChargerComponent component) if (container.ContainedEntities.Count == 0) return CellChargerStatus.Empty; - if (!SearchForBattery(container.ContainedEntities.First(), out var heldBattery)) + if (!SearchForBattery(container.ContainedEntities[0], out _, out var heldBattery)) return CellChargerStatus.Off; if (Math.Abs(heldBattery.MaxCharge - heldBattery.CurrentCharge) < 0.01) @@ -199,27 +198,28 @@ private void TransferPower(EntityUid uid, EntityUid targetEntity, ChargerCompone if (component.Whitelist?.IsValid(targetEntity, EntityManager) == false) return; - if (!SearchForBattery(targetEntity, out var heldBattery)) + if (!SearchForBattery(targetEntity, out var batteryUid, out var heldBattery)) return; - _battery.SetCharge(targetEntity, heldBattery.CurrentCharge + component.ChargeRate * frameTime, heldBattery); + _battery.SetCharge(batteryUid.Value, heldBattery.CurrentCharge + component.ChargeRate * frameTime, heldBattery); // Just so the sprite won't be set to 99.99999% visibility if (heldBattery.MaxCharge - heldBattery.CurrentCharge < 0.01) { - _battery.SetCharge(targetEntity, heldBattery.MaxCharge, heldBattery); + _battery.SetCharge(batteryUid.Value, heldBattery.MaxCharge, heldBattery); } UpdateStatus(uid, component); } - private bool SearchForBattery(EntityUid uid, [NotNullWhen(true)] out BatteryComponent? component) + private bool SearchForBattery(EntityUid uid, [NotNullWhen(true)] out EntityUid? batteryUid, [NotNullWhen(true)] out BatteryComponent? component) { // try get a battery directly on the inserted entity if (!TryComp(uid, out component)) { // or by checking for a power cell slot on the inserted entity - return _powerCell.TryGetBatteryFromSlot(uid, out component); + return _powerCell.TryGetBatteryFromSlot(uid, out batteryUid, out component); } + batteryUid = uid; return true; } } diff --git a/Content.Server/Power/Generator/PortableGeneratorSystem.cs b/Content.Server/Power/Generator/PortableGeneratorSystem.cs index e8e9c5b45e..3cd18d7d56 100644 --- a/Content.Server/Power/Generator/PortableGeneratorSystem.cs +++ b/Content.Server/Power/Generator/PortableGeneratorSystem.cs @@ -84,7 +84,7 @@ private void StartGenerator(EntityUid uid, PortableGeneratorComponent component, _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.StartTime, new GeneratorStartedEvent(), uid, uid) { - BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = true, RequireCanInteract = true, + BreakOnDamage = true, BreakOnMove = true, RequireCanInteract = true, NeedHand = true }); } diff --git a/Content.Server/Pulling/PullingSystem.cs b/Content.Server/Pulling/PullingSystem.cs deleted file mode 100644 index 69bb7c9370..0000000000 --- a/Content.Server/Pulling/PullingSystem.cs +++ /dev/null @@ -1,48 +0,0 @@ -using Content.Shared.Input; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; -using JetBrains.Annotations; -using Robust.Server.GameObjects; -using Robust.Shared.Input.Binding; -using Robust.Shared.Player; - -namespace Content.Server.Pulling -{ - [UsedImplicitly] - public sealed class PullingSystem : SharedPullingSystem - { - public override void Initialize() - { - base.Initialize(); - - UpdatesAfter.Add(typeof(PhysicsSystem)); - - SubscribeLocalEvent(OnPullableMove); - SubscribeLocalEvent(OnPullableStopMove); - - CommandBinds.Builder - .Bind(ContentKeyFunctions.ReleasePulledObject, InputCmdHandler.FromDelegate(HandleReleasePulledObject)) - .Register(); - } - - private void HandleReleasePulledObject(ICommonSession? session) - { - if (session?.AttachedEntity is not {Valid: true} player) - { - return; - } - - if (!TryGetPulled(player, out var pulled)) - { - return; - } - - if (!EntityManager.TryGetComponent(pulled.Value, out SharedPullableComponent? pullable)) - { - return; - } - - TryStopPull(pullable); - } - } -} diff --git a/Content.Server/Radio/EntitySystems/JammerSystem.cs b/Content.Server/Radio/EntitySystems/JammerSystem.cs index dc6f476416..fdf02f94df 100644 --- a/Content.Server/Radio/EntitySystems/JammerSystem.cs +++ b/Content.Server/Radio/EntitySystems/JammerSystem.cs @@ -1,3 +1,4 @@ +using Content.Server.Medical.SuitSensors; using Content.Server.Popups; using Content.Server.Power.EntitySystems; using Content.Server.PowerCell; @@ -23,6 +24,7 @@ public override void Initialize() SubscribeLocalEvent(OnPowerCellChanged); SubscribeLocalEvent(OnExamine); SubscribeLocalEvent(OnRadioSendAttempt); + SubscribeLocalEvent(OnSensorSendAttempt); } public override void Update(float frameTime) @@ -76,15 +78,33 @@ private void OnExamine(EntityUid uid, RadioJammerComponent comp, ExaminedEvent a private void OnRadioSendAttempt(ref RadioSendAttemptEvent args) { - var source = Transform(args.RadioSource).Coordinates; + if (ShouldCancelSend(args.RadioSource)) + { + args.Cancelled = true; + } + } + + private void OnSensorSendAttempt(EntityUid uid, SuitSensorComponent comp, ref SuitSensorsSendAttemptEvent args) + { + if (ShouldCancelSend(uid)) + { + args.Cancelled = true; + } + } + + private bool ShouldCancelSend(EntityUid sourceUid) + { + var source = Transform(sourceUid).Coordinates; var query = EntityQueryEnumerator(); + while (query.MoveNext(out _, out _, out var jam, out var transform)) { if (source.InRange(EntityManager, _transform, transform.Coordinates, jam.Range)) { - args.Cancelled = true; - return; + return true; } } + + return false; } } diff --git a/Content.Server/Remotes/DoorRemoteSystem.cs b/Content.Server/Remotes/DoorRemoteSystem.cs index 9be7e5e96b..cb3243cb83 100644 --- a/Content.Server/Remotes/DoorRemoteSystem.cs +++ b/Content.Server/Remotes/DoorRemoteSystem.cs @@ -22,6 +22,7 @@ public sealed class DoorRemoteSystem : EntitySystem [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly DoorSystem _doorSystem = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; + [Dependency] private readonly ExamineSystemShared _examine = default!; // I'm so sorry [Dependency] private readonly SharedAirlockSystem _sharedAirlockSystem = default!; public override void Initialize() @@ -67,7 +68,7 @@ private void OnBeforeInteract(EntityUid uid, DoorRemoteComponent component, Befo || !TryComp(args.Target, out var doorComp) // If it isn't a door we don't use it // Only able to control doors if they are within your vision and within your max range. // Not affected by mobs or machines anymore. - || !ExamineSystemShared.InRangeUnOccluded(args.User, args.Target.Value, SharedInteractionSystem.MaxRaycastRange, null)) + || !_examine.InRangeUnOccluded(args.User, args.Target.Value, SharedInteractionSystem.MaxRaycastRange, null)) { return; } diff --git a/Content.Server/Resist/EscapeInventorySystem.cs b/Content.Server/Resist/EscapeInventorySystem.cs index 8cb6d218e2..6bce38fbac 100644 --- a/Content.Server/Resist/EscapeInventorySystem.cs +++ b/Content.Server/Resist/EscapeInventorySystem.cs @@ -63,8 +63,7 @@ private void AttemptEscape(EntityUid user, EntityUid container, CanEscapeInvento var doAfterEventArgs = new DoAfterArgs(EntityManager, user, component.BaseResistTime * multiplier, new EscapeInventoryEvent(), user, target: container) { - BreakOnTargetMove = false, - BreakOnUserMove = true, + BreakOnMove = true, BreakOnDamage = true, NeedHand = false }; diff --git a/Content.Server/Resist/ResistLockerSystem.cs b/Content.Server/Resist/ResistLockerSystem.cs index 7a17a2eba1..2ab277d0f1 100644 --- a/Content.Server/Resist/ResistLockerSystem.cs +++ b/Content.Server/Resist/ResistLockerSystem.cs @@ -47,8 +47,7 @@ private void AttemptResist(EntityUid user, EntityUid target, EntityStorageCompon var doAfterEventArgs = new DoAfterArgs(EntityManager, user, resistLockerComponent.ResistTime, new ResistLockerDoAfterEvent(), target, target: target) { - BreakOnTargetMove = false, - BreakOnUserMove = true, + BreakOnMove = true, BreakOnDamage = true, NeedHand = false //No hands 'cause we be kickin' }; diff --git a/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs b/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs index eb6eb5a426..0ac6ccd613 100644 --- a/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs +++ b/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs @@ -85,7 +85,7 @@ private void BeginSoulSearchDoAfter(EntityUid uid, EntityUid target, RevenantCom { var searchDoAfter = new DoAfterArgs(EntityManager, uid, revenant.SoulSearchDuration, new SoulEvent(), uid, target: target) { - BreakOnUserMove = true, + BreakOnMove = true, BreakOnDamage = true, DistanceThreshold = 2 }; @@ -140,7 +140,7 @@ private void BeginHarvestDoAfter(EntityUid uid, EntityUid target, RevenantCompon var doAfter = new DoAfterArgs(EntityManager, uid, revenant.HarvestDebuffs.X, new HarvestEvent(), uid, target: target) { DistanceThreshold = 2, - BreakOnUserMove = true, + BreakOnMove = true, BreakOnDamage = true, RequireCanInteract = false, // stuns itself }; diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs index 47aad6a603..f8d995b8a4 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs @@ -64,8 +64,6 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem [Dependency] private readonly TransformSystem _transformSystem = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; - private ISawmill _sawmill = default!; - private const float ShuttleSpawnBuffer = 1f; private bool _emergencyShuttleEnabled; @@ -75,7 +73,6 @@ public sealed partial class EmergencyShuttleSystem : EntitySystem public override void Initialize() { - _sawmill = Logger.GetSawmill("shuttle.emergency"); _emergencyShuttleEnabled = _configManager.GetCVar(CCVars.EmergencyShuttleEnabled); // Don't immediately invoke as roundstart will just handle it. Subs.CVar(_configManager, CCVars.EmergencyShuttleEnabled, SetEmergencyShuttleEnabled); @@ -391,7 +388,7 @@ private void AddCentcomm(StationCentcommComponent component) { if (component.MapEntity != null || component.Entity != null) { - _sawmill.Warning("Attempted to re-add an existing centcomm map."); + Log.Warning("Attempted to re-add an existing centcomm map."); return; } @@ -416,7 +413,7 @@ private void AddCentcomm(StationCentcommComponent component) if (string.IsNullOrEmpty(component.Map.ToString())) { - _sawmill.Warning("No CentComm map found, skipping setup."); + Log.Warning("No CentComm map found, skipping setup."); return; } @@ -491,7 +488,7 @@ private void AddEmergencyShuttle(EntityUid uid, StationEmergencyShuttleComponent if (shuttle == null) { - _sawmill.Error($"Unable to spawn emergency shuttle {shuttlePath} for {ToPrettyString(uid)}"); + Log.Error($"Unable to spawn emergency shuttle {shuttlePath} for {ToPrettyString(uid)}"); return; } diff --git a/Content.Server/SprayPainter/SprayPainterSystem.cs b/Content.Server/SprayPainter/SprayPainterSystem.cs index e49c49c1da..a8024e2d77 100644 --- a/Content.Server/SprayPainter/SprayPainterSystem.cs +++ b/Content.Server/SprayPainter/SprayPainterSystem.cs @@ -55,8 +55,7 @@ private void OnPipeInteract(Entity ent, ref InteractUsi var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, painter.PipeSprayTime, new SprayPainterPipeDoAfterEvent(color), args.Used, target: ent, used: args.Used) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, BreakOnDamage = true, CancelDuplicate = true, // multiple pipes can be sprayed at once just not the same one diff --git a/Content.Server/Spreader/KudzuSystem.cs b/Content.Server/Spreader/KudzuSystem.cs index 49698ea673..dc176ebc2a 100644 --- a/Content.Server/Spreader/KudzuSystem.cs +++ b/Content.Server/Spreader/KudzuSystem.cs @@ -10,6 +10,7 @@ public sealed class KudzuSystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!; + [Dependency] private readonly SharedMapSystem _map = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly DamageableSystem _damageable = default!; @@ -28,15 +29,12 @@ private void OnDamageChanged(EntityUid uid, KudzuComponent component, DamageChan { // Every time we take any damage, we reduce growth depending on all damage over the growth impact // So the kudzu gets slower growing the more it is hurt. - int growthDamage = (int) (args.Damageable.TotalDamage / component.GrowthHealth); + var growthDamage = (int) (args.Damageable.TotalDamage / component.GrowthHealth); if (growthDamage > 0) { - GrowingKudzuComponent? growing; - if (!TryComp(uid, out growing)) - { - growing = AddComp(uid); + if (!EnsureComp(uid, out _)) component.GrowthLevel = 3; - } + component.GrowthLevel = Math.Max(1, component.GrowthLevel - growthDamage); if (EntityManager.TryGetComponent(uid, out var appearance)) { @@ -69,7 +67,7 @@ private void OnKudzuSpread(EntityUid uid, KudzuComponent component, ref SpreadNe foreach (var neighbor in args.NeighborFreeTiles) { - var neighborUid = Spawn(prototype, neighbor.Grid.GridTileToLocal(neighbor.Tile)); + var neighborUid = Spawn(prototype, _map.GridTileToLocal(neighbor.Tile.GridUid, neighbor.Grid, neighbor.Tile.GridIndices)); DebugTools.Assert(HasComp(neighborUid)); DebugTools.Assert(HasComp(neighborUid)); DebugTools.Assert(Comp(neighborUid).Id == KudzuGroup); diff --git a/Content.Server/Spreader/SpreadNeighborsEvent.cs b/Content.Server/Spreader/SpreadNeighborsEvent.cs index 0cee55b588..022ef49f33 100644 --- a/Content.Server/Spreader/SpreadNeighborsEvent.cs +++ b/Content.Server/Spreader/SpreadNeighborsEvent.cs @@ -1,4 +1,5 @@ using Robust.Shared.Collections; +using Robust.Shared.Map; using Robust.Shared.Map.Components; namespace Content.Server.Spreader; @@ -10,7 +11,7 @@ namespace Content.Server.Spreader; [ByRefEvent] public record struct SpreadNeighborsEvent { - public ValueList<(MapGridComponent Grid, Vector2i Tile)> NeighborFreeTiles; + public ValueList<(MapGridComponent Grid, TileRef Tile)> NeighborFreeTiles; public ValueList Neighbors; /// diff --git a/Content.Server/Spreader/SpreaderSystem.cs b/Content.Server/Spreader/SpreaderSystem.cs index ad3033a14b..269d35d12f 100644 --- a/Content.Server/Spreader/SpreaderSystem.cs +++ b/Content.Server/Spreader/SpreaderSystem.cs @@ -18,9 +18,9 @@ namespace Content.Server.Spreader; /// public sealed class SpreaderSystem : EntitySystem { - [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!; + [Dependency] private readonly SharedMapSystem _map = default!; /// /// Cached maximum number of updates per spreader prototype. This is applied per-grid. @@ -31,7 +31,7 @@ public sealed class SpreaderSystem : EntitySystem /// Remaining number of updates per grid & prototype. /// // TODO PERFORMANCE Assign each prototype to an index and convert dictionary to array - private Dictionary> _gridUpdates = new(); + private readonly Dictionary> _gridUpdates = []; public const float SpreadCooldownSeconds = 1; @@ -57,7 +57,7 @@ private void OnPrototypeReload(PrototypesReloadedEventArgs obj) private void SetupPrototypes() { - _prototypeUpdates = new Dictionary(); + _prototypeUpdates = []; foreach (var proto in _prototype.EnumeratePrototypes()) { _prototypeUpdates.Add(proto.ID, proto.UpdatesPerSecond); @@ -80,9 +80,9 @@ private void OnGridInit(GridInitializeEvent ev) EnsureComp(ev.EntityUid); } - private void OnTerminating(EntityUid uid, EdgeSpreaderComponent component, ref EntityTerminatingEvent args) + private void OnTerminating(Entity entity, ref EntityTerminatingEvent args) { - var neighbors = GetSpreadableNeighbors(uid); + var neighbors = GetSpreadableNeighbors(entity); foreach (var neighbor in neighbors) { @@ -163,7 +163,7 @@ public override void Update(float frameTime) } } - private void Spread(EntityUid uid, TransformComponent xform, string prototype, ref int updates) + private void Spread(EntityUid uid, TransformComponent xform, ProtoId prototype, ref int updates) { GetNeighbors(uid, xform, prototype, out var freeTiles, out _, out var neighbors); @@ -181,18 +181,18 @@ private void Spread(EntityUid uid, TransformComponent xform, string prototype, r /// /// Gets the neighboring node data for the specified entity and the specified node group. /// - public void GetNeighbors(EntityUid uid, TransformComponent transform, string prototype, out ValueList<(MapGridComponent Grid, Vector2i Tile)> freeTiles, out ValueList occupiedTiles, out ValueList neighbors) + public void GetNeighbors(EntityUid uid, TransformComponent comp, ProtoId prototype, out ValueList<(MapGridComponent, TileRef)> freeTiles, out ValueList occupiedTiles, out ValueList neighbors) { // TODO remove occupiedTiles -- its currently unused and just slows this method down. - DebugTools.Assert(_prototype.HasIndex(prototype)); - freeTiles = new ValueList<(MapGridComponent Grid, Vector2i Tile)>(); - occupiedTiles = new ValueList(); - neighbors = new ValueList(); + DebugTools.Assert(_prototype.HasIndex(prototype)); + freeTiles = []; + occupiedTiles = []; + neighbors = []; - if (!_mapManager.TryGetGrid(transform.GridUid, out var grid)) + if (!TryComp(comp.GridUid, out var grid)) return; - var tile = grid.TileIndicesFor(transform.Coordinates); + var tile = _map.TileIndicesFor(comp.GridUid.Value, grid, comp.Coordinates); var spreaderQuery = GetEntityQuery(); var airtightQuery = GetEntityQuery(); var dockQuery = GetEntityQuery(); @@ -201,10 +201,10 @@ public void GetNeighbors(EntityUid uid, TransformComponent transform, string pro var blockedAtmosDirs = AtmosDirection.Invalid; // Due to docking ports they may not necessarily be opposite directions. - var neighborTiles = new ValueList<(MapGridComponent grid, Vector2i Indices, AtmosDirection OtherDir, AtmosDirection OurDir)>(); + var neighborTiles = new ValueList<(EntityUid entity, MapGridComponent grid, Vector2i Indices, AtmosDirection OtherDir, AtmosDirection OurDir)>(); // Check if anything on our own tile blocking that direction. - var ourEnts = grid.GetAnchoredEntitiesEnumerator(tile); + var ourEnts = _map.GetAnchoredEntitiesEnumerator(comp.GridUid.Value, grid, tile); while (ourEnts.MoveNext(out var ent)) { @@ -215,7 +215,7 @@ public void GetNeighbors(EntityUid uid, TransformComponent transform, string pro xformQuery.TryGetComponent(dock.DockedWith, out var dockedXform) && TryComp(dockedXform.GridUid, out var dockedGrid)) { - neighborTiles.Add((dockedGrid, dockedGrid.CoordinatesToTile(dockedXform.Coordinates), xform.LocalRotation.ToAtmosDirection(), dockedXform.LocalRotation.ToAtmosDirection())); + neighborTiles.Add((ent.Value, dockedGrid, _map.CoordinatesToTile(ent.Value, dockedGrid, dockedXform.Coordinates), xform.LocalRotation.ToAtmosDirection(), dockedXform.LocalRotation.ToAtmosDirection())); } // If we're on a blocked tile work out which directions we can go. @@ -225,7 +225,7 @@ public void GetNeighbors(EntityUid uid, TransformComponent transform, string pro continue; } - foreach (var value in new[] { AtmosDirection.North, AtmosDirection.East, AtmosDirection.South, AtmosDirection.West}) + foreach (var value in new[] { AtmosDirection.North, AtmosDirection.East, AtmosDirection.South, AtmosDirection.West }) { if ((value & airtight.AirBlockedDirection) == 0x0) continue; @@ -242,20 +242,20 @@ public void GetNeighbors(EntityUid uid, TransformComponent transform, string pro var direction = (Direction) (i * 2); var atmosDir = direction.ToAtmosDirection(); var neighborPos = SharedMapSystem.GetDirection(tile, direction); - neighborTiles.Add((grid, neighborPos, atmosDir, atmosDir.GetOpposite())); + neighborTiles.Add((comp.GridUid.Value, grid, neighborPos, atmosDir, atmosDir.GetOpposite())); } - foreach (var (neighborGrid, neighborPos, ourAtmosDir, otherAtmosDir) in neighborTiles) + foreach (var (neighborEnt, neighborGrid, neighborPos, ourAtmosDir, otherAtmosDir) in neighborTiles) { // This tile is blocked to that direction. if ((blockedAtmosDirs & ourAtmosDir) != 0x0) continue; - if (!neighborGrid.TryGetTileRef(neighborPos, out var tileRef) || tileRef.Tile.IsEmpty) + if (!_map.TryGetTileRef(neighborEnt, neighborGrid, neighborPos, out var tileRef) || tileRef.Tile.IsEmpty) continue; var directionEnumerator = - neighborGrid.GetAnchoredEntitiesEnumerator(neighborPos); + _map.GetAnchoredEntitiesEnumerator(neighborEnt, neighborGrid, neighborPos); var occupied = false; while (directionEnumerator.MoveNext(out var ent)) @@ -278,7 +278,7 @@ public void GetNeighbors(EntityUid uid, TransformComponent transform, string pro var oldCount = occupiedTiles.Count; directionEnumerator = - neighborGrid.GetAnchoredEntitiesEnumerator(neighborPos); + _map.GetAnchoredEntitiesEnumerator(neighborEnt, neighborGrid, neighborPos); while (directionEnumerator.MoveNext(out var ent)) { @@ -294,7 +294,7 @@ public void GetNeighbors(EntityUid uid, TransformComponent transform, string pro } if (oldCount == occupiedTiles.Count) - freeTiles.Add((neighborGrid, neighborPos)); + freeTiles.Add((neighborGrid, tileRef)); } } @@ -308,20 +308,23 @@ public List GetSpreadableNeighbors(EntityUid uid, AirtightComponent? var neighbors = new List(); Vector2i tile; + EntityUid ent; MapGridComponent? grid; if (position == null) { var transform = Transform(uid); - if (!_mapManager.TryGetGrid(transform.GridUid, out grid) || TerminatingOrDeleted(transform.GridUid.Value)) + if (!TryComp(transform.GridUid, out grid) || TerminatingOrDeleted(transform.GridUid.Value)) return neighbors; - tile = grid.TileIndicesFor(transform.Coordinates); + tile = _map.TileIndicesFor(transform.GridUid.Value, grid, transform.Coordinates); + ent = transform.GridUid.Value; } else { - if (!_mapManager.TryGetGrid(position.Value.Grid, out grid)) + if (!TryComp(position.Value.Grid, out grid)) return neighbors; tile = position.Value.Tile; + ent = position.Value.Grid; } var spreaderQuery = GetEntityQuery(); @@ -333,13 +336,13 @@ public List GetSpreadableNeighbors(EntityUid uid, AirtightComponent? continue; var directionEnumerator = - grid.GetAnchoredEntitiesEnumerator(SharedMapSystem.GetDirection(tile, direction.ToDirection())); + _map.GetAnchoredEntitiesEnumerator(ent, grid, SharedMapSystem.GetDirection(tile, direction.ToDirection())); - while (directionEnumerator.MoveNext(out var ent)) + while (directionEnumerator.MoveNext(out var entity)) { - DebugTools.Assert(Transform(ent.Value).Anchored); - if (spreaderQuery.HasComponent(ent) && !TerminatingOrDeleted(ent.Value)) - neighbors.Add(ent.Value); + DebugTools.Assert(Transform(entity.Value).Anchored); + if (spreaderQuery.HasComponent(entity) && !TerminatingOrDeleted(entity.Value)) + neighbors.Add(entity.Value); } } diff --git a/Content.Server/StationEvents/EventManagerSystem.cs b/Content.Server/StationEvents/EventManagerSystem.cs index a0ab037755..1a26417b05 100644 --- a/Content.Server/StationEvents/EventManagerSystem.cs +++ b/Content.Server/StationEvents/EventManagerSystem.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using Content.Server.GameTicking; using Content.Server.StationEvents.Components; using Content.Shared.CCVar; @@ -17,8 +17,6 @@ public sealed class EventManagerSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] public readonly GameTicker GameTicker = default!; - private ISawmill _sawmill = default!; - public bool EventsEnabled { get; private set; } private void SetEnabled(bool value) => EventsEnabled = value; @@ -26,8 +24,6 @@ public override void Initialize() { base.Initialize(); - _sawmill = Logger.GetSawmill("events"); - Subs.CVar(_configurationManager, CCVars.EventsEnabled, SetEnabled, true); } @@ -41,13 +37,13 @@ public string RunRandomEvent() if (randomEvent == null) { var errStr = Loc.GetString("station-event-system-run-random-event-no-valid-events"); - _sawmill.Error(errStr); + Log.Error(errStr); return errStr; } var ent = GameTicker.AddGameRule(randomEvent); var str = Loc.GetString("station-event-system-run-event",("eventName", ToPrettyString(ent))); - _sawmill.Info(str); + Log.Info(str); return str; } @@ -57,7 +53,7 @@ public string RunRandomEvent() public string? PickRandomEvent() { var availableEvents = AvailableEvents(); - _sawmill.Info($"Picking from {availableEvents.Count} total available events"); + Log.Info($"Picking from {availableEvents.Count} total available events"); return FindEvent(availableEvents); } @@ -69,7 +65,7 @@ public string RunRandomEvent() { if (availableEvents.Count == 0) { - _sawmill.Warning("No events were available to run!"); + Log.Warning("No events were available to run!"); return null; } @@ -92,7 +88,7 @@ public string RunRandomEvent() } } - _sawmill.Error("Event was not found after weighted pick process!"); + Log.Error("Event was not found after weighted pick process!"); return null; } @@ -116,7 +112,7 @@ private Dictionary AvailableEvents(bool { if (CanRun(proto, stationEvent, playerCount, currentTime)) { - _sawmill.Debug($"Adding event {proto.ID} to possibilities"); + Log.Debug($"Adding event {proto.ID} to possibilities"); result.Add(proto, stationEvent); } } diff --git a/Content.Server/Sticky/Systems/StickySystem.cs b/Content.Server/Sticky/Systems/StickySystem.cs index 2d1104e2ce..effe1b72f7 100644 --- a/Content.Server/Sticky/Systems/StickySystem.cs +++ b/Content.Server/Sticky/Systems/StickySystem.cs @@ -93,8 +93,7 @@ private bool StartSticking(EntityUid uid, EntityUid user, EntityUid target, Stic // start sticking object to target _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, delay, new StickyDoAfterEvent(), uid, target: target, used: uid) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, NeedHand = true }); } @@ -148,8 +147,7 @@ private void StartUnsticking(EntityUid uid, EntityUid user, StickyComponent? com // start unsticking object _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, delay, new StickyDoAfterEvent(), uid, target: uid) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, NeedHand = true }); } diff --git a/Content.Server/Storage/EntitySystems/SpawnItemsOnUseSystem.cs b/Content.Server/Storage/EntitySystems/SpawnItemsOnUseSystem.cs index c49bfdec93..0b4b13d6e4 100644 --- a/Content.Server/Storage/EntitySystems/SpawnItemsOnUseSystem.cs +++ b/Content.Server/Storage/EntitySystems/SpawnItemsOnUseSystem.cs @@ -80,11 +80,6 @@ private void OnUseInHand(EntityUid uid, SpawnItemsOnUseComponent component, UseI _adminLogger.Add(LogType.EntitySpawn, LogImpact.Low, $"{ToPrettyString(args.User)} used {ToPrettyString(uid)} which spawned {ToPrettyString(entityToPlaceInHands.Value)}"); } - if (component.Sound != null) - { - _audio.PlayPvs(component.Sound, uid); - } - component.Uses--; // Delete entity only if component was successfully used @@ -97,6 +92,7 @@ private void OnUseInHand(EntityUid uid, SpawnItemsOnUseComponent component, UseI if (entityToPlaceInHands != null) { _hands.PickupOrDrop(args.User, entityToPlaceInHands.Value); + _audio.PlayPvs(component.Sound, entityToPlaceInHands.Value); } } } diff --git a/Content.Server/Store/Systems/StoreSystem.Ui.cs b/Content.Server/Store/Systems/StoreSystem.Ui.cs index a7490fd27f..281d8f5726 100644 --- a/Content.Server/Store/Systems/StoreSystem.Ui.cs +++ b/Content.Server/Store/Systems/StoreSystem.Ui.cs @@ -165,8 +165,6 @@ private void OnBuyRequest(EntityUid uid, StoreComponent component, StoreBuyListi if (!IsOnStartingMap(uid, component)) component.RefundAllowed = false; - else - component.RefundAllowed = true; //subtract the cash foreach (var (currency, value) in listing.Cost) @@ -323,7 +321,7 @@ private void OnRequestRefund(EntityUid uid, StoreComponent component, StoreReque if (!component.RefundAllowed || component.BoughtEntities.Count == 0) return; - for (var i = component.BoughtEntities.Count; i >= 0; i--) + for (var i = component.BoughtEntities.Count - 1; i >= 0; i--) { var purchase = component.BoughtEntities[i]; @@ -332,7 +330,7 @@ private void OnRequestRefund(EntityUid uid, StoreComponent component, StoreReque component.BoughtEntities.RemoveAt(i); - if (_actions.TryGetActionData(purchase, out var actionComponent)) + if (_actions.TryGetActionData(purchase, out var actionComponent, logError: false)) { _actionContainer.RemoveAction(purchase, actionComponent); } @@ -340,6 +338,8 @@ private void OnRequestRefund(EntityUid uid, StoreComponent component, StoreReque EntityManager.DeleteEntity(purchase); } + component.BoughtEntities.Clear(); + foreach (var (currency, value) in component.BalanceSpent) { component.Balance[currency] += value; diff --git a/Content.Server/Strip/StrippableSystem.cs b/Content.Server/Strip/StrippableSystem.cs index 96b2ecc00c..d28744fe4a 100644 --- a/Content.Server/Strip/StrippableSystem.cs +++ b/Content.Server/Strip/StrippableSystem.cs @@ -1,4 +1,3 @@ -using System.Linq; using Content.Server.Administration.Logs; using Content.Server.Ensnaring; using Content.Shared.CombatMode; @@ -21,18 +20,21 @@ using Robust.Server.GameObjects; using Robust.Shared.Player; using Robust.Shared.Utility; +using System.Linq; namespace Content.Server.Strip { public sealed class StrippableSystem : SharedStrippableSystem { - [Dependency] private readonly SharedCuffableSystem _cuffable = default!; - [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; - [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; - [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly EnsnareableSystem _ensnaring = default!; + [Dependency] private readonly EnsnareableSystem _ensnaringSystem = default!; [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; + + [Dependency] private readonly SharedCuffableSystem _cuffableSystem = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly IAdminLogManager _adminLogger = default!; // TODO: ECS popups. Not all of these have ECS equivalents yet. @@ -48,64 +50,58 @@ public override void Initialize() // BUI SubscribeLocalEvent(OnStripButtonPressed); SubscribeLocalEvent(OnStripEnsnareMessage); + + // DoAfters + SubscribeLocalEvent>(OnStrippableDoAfterRunning); + SubscribeLocalEvent(OnStrippableDoAfterFinished); } - private void OnStripEnsnareMessage(EntityUid uid, EnsnareableComponent component, StrippingEnsnareButtonPressed args) + private void AddStripVerb(EntityUid uid, StrippableComponent component, GetVerbsEvent args) { - if (args.Session.AttachedEntity is not {Valid: true} user) + if (args.Hands == null || !args.CanAccess || !args.CanInteract || args.Target == args.User) return; - foreach (var entity in component.Container.ContainedEntities) + if (!HasComp(args.User)) + return; + + Verb verb = new() { - if (!TryComp(entity, out var ensnaring)) - continue; + Text = Loc.GetString("strip-verb-get-data-text"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")), + Act = () => StartOpeningStripper(args.User, (uid, component), true), + }; - _ensnaring.TryFree(uid, user, entity, ensnaring); - return; - } + args.Verbs.Add(verb); } - private void OnStripButtonPressed(Entity strippable, ref StrippingSlotButtonPressed args) + private void AddStripExamineVerb(EntityUid uid, StrippableComponent component, GetVerbsEvent args) { - if (args.Session.AttachedEntity is not {Valid: true} user || - !TryComp(user, out var userHands)) - return; - - if (args.IsHand) - { - StripHand(user, args.Slot, strippable, userHands); + if (args.Hands == null || !args.CanAccess || !args.CanInteract || args.Target == args.User) return; - } - if (!TryComp(strippable, out var inventory)) + if (!HasComp(args.User)) return; - var hasEnt = _inventorySystem.TryGetSlotEntity(strippable, args.Slot, out var held, inventory); + ExamineVerb verb = new() + { + Text = Loc.GetString("strip-verb-get-data-text"), + Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")), + Act = () => StartOpeningStripper(args.User, (uid, component), true), + Category = VerbCategory.Examine, + }; - if (userHands.ActiveHandEntity != null && !hasEnt) - PlaceActiveHandItemInInventory(user, strippable, userHands.ActiveHandEntity.Value, args.Slot, strippable); - else if (userHands.ActiveHandEntity == null && hasEnt) - TakeItemFromInventory(user, strippable, held!.Value, args.Slot, strippable); + args.Verbs.Add(verb); } - private void StripHand(EntityUid user, string handId, Entity target, HandsComponent userHands) + private void OnActivateInWorld(EntityUid uid, StrippableComponent component, ActivateInWorldEvent args) { - if (!_handsSystem.TryGetHand(target, handId, out var hand)) + if (args.Target == args.User) return; - // is the target a handcuff? - if (TryComp(hand.HeldEntity, out VirtualItemComponent? virt) - && TryComp(target, out CuffableComponent? cuff) - && _cuffable.GetAllCuffs(cuff).Contains(virt.BlockingEntity)) - { - _cuffable.TryUncuff(target, user, virt.BlockingEntity, cuffable: cuff); + if (!HasComp(args.User)) return; - } - if (userHands.ActiveHandEntity != null && hand.HeldEntity == null) - PlaceActiveHandItemInHands(user, target, userHands.ActiveHandEntity.Value, handId, target); - else if (userHands.ActiveHandEntity == null && hand.HeldEntity != null) - TakeItemFromHands(user, target, hand.HeldEntity.Value, handId, target); + StartOpeningStripper(args.User, (uid, component)); } public override void StartOpeningStripper(EntityUid user, Entity strippable, bool openInCombat = false) @@ -123,352 +119,516 @@ public override void StartOpeningStripper(EntityUid user, Entity args) + private void OnStripButtonPressed(Entity strippable, ref StrippingSlotButtonPressed args) { - if (args.Hands == null || !args.CanAccess || !args.CanInteract || args.Target == args.User) + if (args.Session.AttachedEntity is not { Valid: true } user || + !TryComp(user, out var userHands)) return; - if (!HasComp(args.User)) + if (args.IsHand) + { + StripHand((user, userHands), (strippable.Owner, null), args.Slot, strippable); return; + } - Verb verb = new() - { - Text = Loc.GetString("strip-verb-get-data-text"), - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")), - Act = () => StartOpeningStripper(args.User, (uid, component), true), - }; - args.Verbs.Add(verb); + if (!TryComp(strippable, out var inventory)) + return; + + var hasEnt = _inventorySystem.TryGetSlotEntity(strippable, args.Slot, out var held, inventory); + + if (userHands.ActiveHandEntity != null && !hasEnt) + StartStripInsertInventory((user, userHands), strippable.Owner, userHands.ActiveHandEntity.Value, args.Slot); + else if (userHands.ActiveHandEntity == null && hasEnt) + StartStripRemoveInventory(user, strippable.Owner, held!.Value, args.Slot); } - private void AddStripExamineVerb(EntityUid uid, StrippableComponent component, GetVerbsEvent args) + private void StripHand( + Entity user, + Entity target, + string handId, + StrippableComponent? targetStrippable) { - if (args.Hands == null || !args.CanAccess || !args.CanInteract || args.Target == args.User) + if (!Resolve(user, ref user.Comp) || + !Resolve(target, ref target.Comp) || + !Resolve(target, ref targetStrippable)) return; - if (!HasComp(args.User)) + if (!_handsSystem.TryGetHand(target.Owner, handId, out var handSlot)) return; - ExamineVerb verb = new() + // Is the target a handcuff? + if (TryComp(handSlot.HeldEntity, out var virtualItem) && + TryComp(target.Owner, out var cuffable) && + _cuffableSystem.GetAllCuffs(cuffable).Contains(virtualItem.BlockingEntity)) { - Text = Loc.GetString("strip-verb-get-data-text"), - Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")), - Act = () => StartOpeningStripper(args.User, (uid, component), true), - Category = VerbCategory.Examine, - }; + _cuffableSystem.TryUncuff(target.Owner, user, virtualItem.BlockingEntity, cuffable); + return; + } - args.Verbs.Add(verb); + if (user.Comp.ActiveHandEntity != null && handSlot.HeldEntity == null) + StartStripInsertHand(user, target, user.Comp.ActiveHandEntity.Value, handId, targetStrippable); + else if (user.Comp.ActiveHandEntity == null && handSlot.HeldEntity != null) + StartStripRemoveHand(user, target, handSlot.HeldEntity.Value, handId, targetStrippable); } - private void OnActivateInWorld(EntityUid uid, StrippableComponent component, ActivateInWorldEvent args) + private void OnStripEnsnareMessage(EntityUid uid, EnsnareableComponent component, StrippingEnsnareButtonPressed args) { - if (args.Target == args.User) + if (args.Session.AttachedEntity is not { Valid: true } user) return; - if (!HasComp(args.User)) - return; + foreach (var entity in component.Container.ContainedEntities) + { + if (!TryComp(entity, out var ensnaring)) + continue; - StartOpeningStripper(args.User, (uid, component)); + _ensnaringSystem.TryFree(uid, user, entity, ensnaring); + return; + } } /// - /// Places item in user's active hand to an inventory slot. + /// Checks whether the item is in a user's active hand and whether it can be inserted into the inventory slot. /// - private async void PlaceActiveHandItemInInventory( - EntityUid user, + private bool CanStripInsertInventory( + Entity user, EntityUid target, EntityUid held, - string slot, - StrippableComponent component) + string slot) { - var userHands = Comp(user); + if (!Resolve(user, ref user.Comp)) + return false; + + if (user.Comp.ActiveHand == null) + return false; + + if (user.Comp.ActiveHandEntity == null) + return false; + + if (user.Comp.ActiveHandEntity != held) + return false; + + if (!_handsSystem.CanDropHeld(user, user.Comp.ActiveHand)) + { + _popupSystem.PopupCursor(Loc.GetString("strippable-component-cannot-drop"), user); + return false; + } + + if (_inventorySystem.TryGetSlotEntity(target, slot, out _)) + { + _popupSystem.PopupCursor(Loc.GetString("strippable-component-item-slot-occupied", ("owner", target)), user); + return false; + } - bool Check() + if (!_inventorySystem.CanEquip(user, target, held, slot, out _)) { - if (userHands.ActiveHandEntity != held) - return false; - - if (!_handsSystem.CanDropHeld(user, userHands.ActiveHand!)) - { - _popup.PopupCursor(Loc.GetString("strippable-component-cannot-drop"), user); - return false; - } - - if (_inventorySystem.TryGetSlotEntity(target, slot, out _)) - { - _popup.PopupCursor(Loc.GetString("strippable-component-item-slot-occupied",("owner", target)), user); - return false; - } - - if (!_inventorySystem.CanEquip(user, target, held, slot, out _)) - { - _popup.PopupCursor(Loc.GetString("strippable-component-cannot-equip-message",("owner", target)), user); - return false; - } - - return true; + _popupSystem.PopupCursor(Loc.GetString("strippable-component-cannot-equip-message", ("owner", target)), user); + return false; } + return true; + } + + /// + /// Begins a DoAfter to insert the item in the user's active hand into the inventory slot. + /// + private void StartStripInsertInventory( + Entity user, + EntityUid target, + EntityUid held, + string slot) + { + if (!Resolve(user, ref user.Comp)) + return; + + if (!CanStripInsertInventory(user, target, held, slot)) + return; + if (!_inventorySystem.TryGetSlot(target, slot, out var slotDef)) { Log.Error($"{ToPrettyString(user)} attempted to place an item in a non-existent inventory slot ({slot}) on {ToPrettyString(target)}"); return; } - var userEv = new BeforeStripEvent(slotDef.StripTime); - RaiseLocalEvent(user, userEv); - var ev = new BeforeGettingStrippedEvent(userEv.Time, userEv.Stealth); - RaiseLocalEvent(target, ev); + var (time, stealth) = GetStripTimeModifiers(user, target, slotDef.StripTime); + + if (!stealth) + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-insert", ("user", Identity.Entity(user, EntityManager)), ("item", user.Comp.ActiveHandEntity!.Value)), target, target, PopupType.Large); + + var prefix = stealth ? "stealthily " : ""; + _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}place the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s {slot} slot"); - var doAfterArgs = new DoAfterArgs(EntityManager, user, ev.Time, new AwaitedDoAfterEvent(), null, target: target, used: held) + var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(true, true, slot), user, target, held) { - ExtraCheck = Check, - Hidden = ev.Stealth, + Hidden = stealth, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, NeedHand = true, - DuplicateCondition = DuplicateConditions.SameTool // Block any other DoAfters featuring this same entity. + DuplicateCondition = DuplicateConditions.SameTool }; - if (!ev.Stealth && Check() && userHands.ActiveHandEntity != null) - { - var message = Loc.GetString("strippable-component-alert-owner-insert", - ("user", Identity.Entity(user, EntityManager)), ("item", userHands.ActiveHandEntity)); - _popup.PopupEntity(message, target, target, PopupType.Large); - } + _doAfterSystem.TryStartDoAfter(doAfterArgs); + } - var prefix = ev.Stealth ? "stealthily " : ""; - _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}place the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s {slot} slot"); + /// + /// Inserts the item in the user's active hand into the inventory slot. + /// + private void StripInsertInventory( + Entity user, + EntityUid target, + EntityUid held, + string slot) + { + if (!Resolve(user, ref user.Comp)) + return; - var result = await _doAfter.WaitDoAfter(doAfterArgs); - if (result != DoAfterStatus.Finished) + if (!CanStripInsertInventory(user, target, held, slot)) return; - DebugTools.Assert(userHands.ActiveHand?.HeldEntity == held); + if (!_handsSystem.TryDrop(user, handsComp: user.Comp)) + return; + + _inventorySystem.TryEquip(user, target, held, slot); + _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has placed the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s {slot} slot"); + } - if (_handsSystem.TryDrop(user, handsComp: userHands)) + /// + /// Checks whether the item can be removed from the target's inventory. + /// + private bool CanStripRemoveInventory( + EntityUid user, + EntityUid target, + EntityUid item, + string slot) + { + if (!_inventorySystem.TryGetSlotEntity(target, slot, out var slotItem)) { - _inventorySystem.TryEquip(user, target, held, slot); + _popupSystem.PopupCursor(Loc.GetString("strippable-component-item-slot-free-message", ("owner", target)), user); + return false; + } - _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has placed the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s {slot} slot"); + if (slotItem != item) + return false; + + if (!_inventorySystem.CanUnequip(user, target, slot, out var reason)) + { + _popupSystem.PopupCursor(Loc.GetString(reason), user); + return false; } + + return true; } /// - /// Places item in user's active hand in one of the entity's hands. + /// Begins a DoAfter to remove the item from the target's inventory and insert it in the user's active hand. /// - private async void PlaceActiveHandItemInHands( + private void StartStripRemoveInventory( EntityUid user, EntityUid target, - EntityUid held, - string handName, - StrippableComponent component) + EntityUid item, + string slot) { - var hands = Comp(target); - var userHands = Comp(user); + if (!CanStripRemoveInventory(user, target, item, slot)) + return; + + if (!_inventorySystem.TryGetSlot(target, slot, out var slotDef)) + { + Log.Error($"{ToPrettyString(user)} attempted to take an item from a non-existent inventory slot ({slot}) on {ToPrettyString(target)}"); + return; + } + + var (time, stealth) = GetStripTimeModifiers(user, target, slotDef.StripTime); - bool Check() + if (!stealth) { - if (userHands.ActiveHandEntity != held) - return false; - - if (!_handsSystem.CanDropHeld(user, userHands.ActiveHand!)) - { - _popup.PopupCursor(Loc.GetString("strippable-component-cannot-drop"), user); - return false; - } - - if (!_handsSystem.TryGetHand(target, handName, out var hand, hands) - || !_handsSystem.CanPickupToHand(target, userHands.ActiveHandEntity.Value, hand, checkActionBlocker: false, hands)) - { - _popup.PopupCursor(Loc.GetString("strippable-component-cannot-put-message",("owner", target)), user); - return false; - } - - return true; + if (slotDef.StripHidden) + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-hidden", ("slot", slot)), target, target, PopupType.Large); + else + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner", ("user", Identity.Entity(user, EntityManager)), ("item", item)), target, target, PopupType.Large); } - var userEv = new BeforeStripEvent(component.HandStripDelay); - RaiseLocalEvent(user, userEv); - var ev = new BeforeGettingStrippedEvent(userEv.Time, userEv.Stealth); - RaiseLocalEvent(target, ev); + var prefix = stealth ? "stealthily " : ""; + _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s {slot} slot"); - var doAfterArgs = new DoAfterArgs(EntityManager, user, ev.Time, new AwaitedDoAfterEvent(), null, target: target, used: held) + var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(false, true, slot), user, target, item) { - ExtraCheck = Check, - Hidden = ev.Stealth, + Hidden = stealth, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, NeedHand = true, + BreakOnHandChange = false, // Allow simultaneously removing multiple items. DuplicateCondition = DuplicateConditions.SameTool }; - var prefix = ev.Stealth ? "stealthily " : ""; - _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}place the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s hands"); - - var result = await _doAfter.WaitDoAfter(doAfterArgs); - if (result != DoAfterStatus.Finished) return; - - _handsSystem.TryDrop(user, checkActionBlocker: false, handsComp: userHands); - _handsSystem.TryPickup(target, held, handName, checkActionBlocker: false, animateUser: !ev.Stealth, animate: !ev.Stealth, handsComp: hands); - _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has placed the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s hands"); - // hand update will trigger strippable update + _doAfterSystem.TryStartDoAfter(doAfterArgs); } /// - /// Takes an item from the inventory and places it in the user's active hand. + /// Removes the item from the target's inventory and inserts it in the user's active hand. /// - private async void TakeItemFromInventory( + private void StripRemoveInventory( EntityUid user, EntityUid target, EntityUid item, string slot, - Entity strippable) + bool stealth) + { + if (!CanStripRemoveInventory(user, target, item, slot)) + return; + + if (!_inventorySystem.TryUnequip(user, target, slot)) + return; + + RaiseLocalEvent(item, new DroppedEvent(user), true); // Gas tank internals etc. + + _handsSystem.PickupOrDrop(user, item, animateUser: stealth, animate: stealth); + _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has stripped the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s {slot} slot"); + } + + /// + /// Checks whether the item in the user's active hand can be inserted into one of the target's hands. + /// + private bool CanStripInsertHand( + Entity user, + Entity target, + EntityUid held, + string handName) { - bool Check() + if (!Resolve(user, ref user.Comp) || + !Resolve(target, ref target.Comp)) + return false; + + if (user.Comp.ActiveHand == null) + return false; + + if (user.Comp.ActiveHandEntity == null) + return false; + + if (user.Comp.ActiveHandEntity != held) + return false; + + if (!_handsSystem.CanDropHeld(user, user.Comp.ActiveHand)) { - if (!_inventorySystem.TryGetSlotEntity(target, slot, out var ent) && ent == item) - { - _popup.PopupCursor(Loc.GetString("strippable-component-item-slot-free-message", ("owner", target)), user); - return false; - } - - if (!_inventorySystem.CanUnequip(user, target, slot, out var reason)) - { - _popup.PopupCursor(Loc.GetString(reason), user); - return false; - } - - return true; + _popupSystem.PopupCursor(Loc.GetString("strippable-component-cannot-drop"), user); + return false; } - if (!_inventorySystem.TryGetSlot(target, slot, out var slotDef)) + if (!_handsSystem.TryGetHand(target, handName, out var handSlot, target.Comp) || + !_handsSystem.CanPickupToHand(target, user.Comp.ActiveHandEntity.Value, handSlot, checkActionBlocker: false, target.Comp)) { - Log.Error($"{ToPrettyString(user)} attempted to take an item from a non-existent inventory slot ({slot}) on {ToPrettyString(target)}"); - return; + _popupSystem.PopupCursor(Loc.GetString("strippable-component-cannot-put-message", ("owner", target)), user); + return false; } - var userEv = new BeforeStripEvent(slotDef.StripTime); - RaiseLocalEvent(user, userEv); - var ev = new BeforeGettingStrippedEvent(userEv.Time, userEv.Stealth); - RaiseLocalEvent(target, ev); + return true; + } + + /// + /// Begins a DoAfter to insert the item in the user's active hand into one of the target's hands. + /// + private void StartStripInsertHand( + Entity user, + Entity target, + EntityUid held, + string handName, + StrippableComponent? targetStrippable = null) + { + if (!Resolve(user, ref user.Comp) || + !Resolve(target, ref target.Comp) || + !Resolve(target, ref targetStrippable)) + return; + + if (!CanStripInsertHand(user, target, held, handName)) + return; + + var (time, stealth) = GetStripTimeModifiers(user, target, targetStrippable.HandStripDelay); - var doAfterArgs = new DoAfterArgs(EntityManager, user, ev.Time, new AwaitedDoAfterEvent(), null, target: target, used: item) + var prefix = stealth ? "stealthily " : ""; + _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}place the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s hands"); + + var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(true, false, handName), user, target, held) { - ExtraCheck = Check, - Hidden = ev.Stealth, + Hidden = stealth, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, NeedHand = true, - BreakOnHandChange = false, // allow simultaneously removing multiple items. DuplicateCondition = DuplicateConditions.SameTool }; - if (!ev.Stealth && Check()) - { - if (slotDef.StripHidden) - { - _popup.PopupEntity(Loc.GetString("strippable-component-alert-owner-hidden", ("slot", slot)), target, - target, PopupType.Large); - } - else if (_inventorySystem.TryGetSlotEntity(strippable, slot, out var slotItem)) - { - _popup.PopupEntity(Loc.GetString("strippable-component-alert-owner", ("user", Identity.Entity(user, EntityManager)), ("item", slotItem)), target, - target, PopupType.Large); - } - } - - var prefix = ev.Stealth ? "stealthily " : ""; - _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s {slot} slot"); + _doAfterSystem.TryStartDoAfter(doAfterArgs); + } - var result = await _doAfter.WaitDoAfter(doAfterArgs); - if (result != DoAfterStatus.Finished) + /// + /// Places the item in the user's active hand into one of the target's hands. + /// + private void StripInsertHand( + Entity user, + Entity target, + EntityUid held, + string handName, + bool stealth) + { + if (!Resolve(user, ref user.Comp) || + !Resolve(target, ref target.Comp)) return; - if (!_inventorySystem.TryUnequip(user, strippable, slot)) + if (!CanStripInsertHand(user, target, held, handName)) return; - // Raise a dropped event, so that things like gas tank internals properly deactivate when stripping - RaiseLocalEvent(item, new DroppedEvent(user), true); - - _handsSystem.PickupOrDrop(user, item, animateUser: !ev.Stealth, animate: !ev.Stealth); - _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has stripped the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s {slot} slot"); + _handsSystem.TryDrop(user, checkActionBlocker: false, handsComp: user.Comp); + _handsSystem.TryPickup(target, held, handName, checkActionBlocker: false, animateUser: stealth, animate: stealth, handsComp: target.Comp); + _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has placed the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s hands"); + // Hand update will trigger strippable update. } /// - /// Takes an item from a hand and places it in the user's active hand. + /// Checks whether the item is in the target's hand and whether it can be dropped. /// - private async void TakeItemFromHands(EntityUid user, EntityUid target, EntityUid item, string handName, Entity strippable) + private bool CanStripRemoveHand( + EntityUid user, + Entity target, + EntityUid item, + string handName) { - var hands = Comp(target); - var userHands = Comp(user); + if (!Resolve(target, ref target.Comp)) + return false; - bool Check() + if (!_handsSystem.TryGetHand(target, handName, out var handSlot, target.Comp)) { - if (!_handsSystem.TryGetHand(target, handName, out var hand, hands) || hand.HeldEntity != item) - { - _popup.PopupCursor(Loc.GetString("strippable-component-item-slot-free-message",("owner", target)), user); - return false; - } - - if (HasComp(hand.HeldEntity)) - return false; - - if (!_handsSystem.CanDropHeld(target, hand, false)) - { - _popup.PopupCursor(Loc.GetString("strippable-component-cannot-drop-message",("owner", target)), user); - return false; - } - - return true; + _popupSystem.PopupCursor(Loc.GetString("strippable-component-item-slot-free-message", ("owner", target)), user); + return false; } - var userEv = new BeforeStripEvent(strippable.Comp.HandStripDelay); - RaiseLocalEvent(user, userEv); - var ev = new BeforeGettingStrippedEvent(userEv.Time, userEv.Stealth); - RaiseLocalEvent(target, ev); + if (HasComp(handSlot.HeldEntity)) + return false; + + if (handSlot.HeldEntity == null) + return false; - var doAfterArgs = new DoAfterArgs(EntityManager, user, ev.Time, new AwaitedDoAfterEvent(), null, target: target, used: item) + if (handSlot.HeldEntity != item) + return false; + + if (!_handsSystem.CanDropHeld(target, handSlot, false)) { - ExtraCheck = Check, - Hidden = ev.Stealth, + _popupSystem.PopupCursor(Loc.GetString("strippable-component-cannot-drop-message", ("owner", target)), user); + return false; + } + + return true; + } + + /// + /// Begins a DoAfter to remove the item from the target's hand and insert it in the user's active hand. + /// + private void StartStripRemoveHand( + Entity user, + Entity target, + EntityUid item, + string handName, + StrippableComponent? targetStrippable = null) + { + if (!Resolve(user, ref user.Comp) || + !Resolve(target, ref target.Comp) || + !Resolve(target, ref targetStrippable)) + return; + + if (!CanStripRemoveHand(user, target, item, handName)) + return; + + var (time, stealth) = GetStripTimeModifiers(user, target, targetStrippable.HandStripDelay); + + if (!stealth) + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner", ("user", Identity.Entity(user, EntityManager)), ("item", item)), target, target); + + var prefix = stealth ? "stealthily " : ""; + _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands"); + + var doAfterArgs = new DoAfterArgs(EntityManager, user, time, new StrippableDoAfterEvent(false, false, handName), user, target, item) + { + Hidden = stealth, AttemptFrequency = AttemptFrequency.EveryTick, BreakOnDamage = true, - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, NeedHand = true, - BreakOnHandChange = false, // allow simultaneously removing multiple items. + BreakOnHandChange = false, // Allow simultaneously removing multiple items. DuplicateCondition = DuplicateConditions.SameTool }; - if (!ev.Stealth && Check() && _handsSystem.TryGetHand(target, handName, out var handSlot, hands) && handSlot.HeldEntity != null) + _doAfterSystem.TryStartDoAfter(doAfterArgs); + } + + /// + /// Takes the item from the target's hand and inserts it in the user's active hand. + /// + private void StripRemoveHand( + Entity user, + Entity target, + EntityUid item, + string handName, + bool stealth) + { + if (!Resolve(user, ref user.Comp) || + !Resolve(target, ref target.Comp)) + return; + + if (!CanStripRemoveHand(user, target, item, handName)) + return; + + _handsSystem.TryDrop(target, item, checkActionBlocker: false, handsComp: target.Comp); + _handsSystem.PickupOrDrop(user, item, animateUser: stealth, animate: stealth, handsComp: user.Comp); + _adminLogger.Add(LogType.Stripping, LogImpact.Medium, $"{ToPrettyString(user):actor} has stripped the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands"); + + // Hand update will trigger strippable update. + } + + private void OnStrippableDoAfterRunning(Entity entity, ref DoAfterAttemptEvent ev) + { + var args = ev.DoAfter.Args; + + DebugTools.Assert(entity.Owner == args.User); + DebugTools.Assert(args.Target != null); + DebugTools.Assert(args.Used != null); + DebugTools.Assert(ev.Event.SlotOrHandName != null); + + if (ev.Event.InventoryOrHand) { - _popup.PopupEntity( - Loc.GetString("strippable-component-alert-owner", - ("user", Identity.Entity(user, EntityManager)), ("item", item)), - strippable.Owner, - strippable.Owner); + if ( ev.Event.InsertOrRemove && !CanStripInsertInventory((entity.Owner, entity.Comp), args.Target.Value, args.Used.Value, ev.Event.SlotOrHandName) || + !ev.Event.InsertOrRemove && !CanStripRemoveInventory(entity.Owner, args.Target.Value, args.Used.Value, ev.Event.SlotOrHandName)) + ev.Cancel(); } + else + { + if ( ev.Event.InsertOrRemove && !CanStripInsertHand((entity.Owner, entity.Comp), args.Target.Value, args.Used.Value, ev.Event.SlotOrHandName) || + !ev.Event.InsertOrRemove && !CanStripRemoveHand(entity.Owner, args.Target.Value, args.Used.Value, ev.Event.SlotOrHandName)) + ev.Cancel(); + } + } - var prefix = ev.Stealth ? "stealthily " : ""; - _adminLogger.Add(LogType.Stripping, LogImpact.Low, - $"{ToPrettyString(user):actor} is trying to {prefix}strip the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands"); - - var result = await _doAfter.WaitDoAfter(doAfterArgs); - if (result != DoAfterStatus.Finished) + private void OnStrippableDoAfterFinished(Entity entity, ref StrippableDoAfterEvent ev) + { + if (ev.Cancelled) return; - _handsSystem.TryDrop(target, item, checkActionBlocker: false, handsComp: hands); - _handsSystem.PickupOrDrop(user, item, animateUser: !ev.Stealth, animate: !ev.Stealth, handsComp: userHands); - // hand update will trigger strippable update - _adminLogger.Add(LogType.Stripping, LogImpact.Medium, - $"{ToPrettyString(user):actor} has stripped the item {ToPrettyString(item):item} from {ToPrettyString(target):target}'s hands"); + DebugTools.Assert(entity.Owner == ev.User); + DebugTools.Assert(ev.Target != null); + DebugTools.Assert(ev.Used != null); + DebugTools.Assert(ev.SlotOrHandName != null); + + if (ev.InventoryOrHand) + { + if (ev.InsertOrRemove) + StripInsertInventory((entity.Owner, entity.Comp), ev.Target.Value, ev.Used.Value, ev.SlotOrHandName); + else StripRemoveInventory(entity.Owner, ev.Target.Value, ev.Used.Value, ev.SlotOrHandName, ev.Args.Hidden); + } + else + { + if (ev.InsertOrRemove) + StripInsertHand((entity.Owner, entity.Comp), ev.Target.Value, ev.Used.Value, ev.SlotOrHandName, ev.Args.Hidden); + else StripRemoveHand((entity.Owner, entity.Comp), ev.Target.Value, ev.Used.Value, ev.SlotOrHandName, ev.Args.Hidden); + } } } } diff --git a/Content.Server/Tabletop/TabletopSystem.Session.cs b/Content.Server/Tabletop/TabletopSystem.Session.cs index f16f3f01e9..c2bb8426fc 100644 --- a/Content.Server/Tabletop/TabletopSystem.Session.cs +++ b/Content.Server/Tabletop/TabletopSystem.Session.cs @@ -31,7 +31,7 @@ public TabletopSession EnsureSession(TabletopGameComponent tabletop) // Since this is the first time opening this session, set up the game tabletop.Setup.SetupTabletop(session, EntityManager); - Logger.Info($"Created tabletop session number {tabletop} at position {session.Position}."); + Log.Info($"Created tabletop session number {tabletop} at position {session.Position}."); return session; } diff --git a/Content.Server/Teleportation/HandTeleporterSystem.cs b/Content.Server/Teleportation/HandTeleporterSystem.cs index 29cde5d741..3d988b0916 100644 --- a/Content.Server/Teleportation/HandTeleporterSystem.cs +++ b/Content.Server/Teleportation/HandTeleporterSystem.cs @@ -58,7 +58,7 @@ private void OnUseInHand(EntityUid uid, HandTeleporterComponent component, UseIn var doafterArgs = new DoAfterArgs(EntityManager, args.User, component.PortalCreationDelay, new TeleporterDoAfterEvent(), uid, used: uid) { BreakOnDamage = true, - BreakOnUserMove = true, + BreakOnMove = true, MovementThreshold = 0.5f, }; diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs index 9443b0b394..b5fa611a39 100644 --- a/Content.Server/VendingMachines/VendingMachineSystem.cs +++ b/Content.Server/VendingMachines/VendingMachineSystem.cs @@ -41,13 +41,10 @@ public sealed class VendingMachineSystem : SharedVendingMachineSystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly AdvertiseSystem _advertise = default!; - private ISawmill _sawmill = default!; - public override void Initialize() { base.Initialize(); - _sawmill = Logger.GetSawmill("vending"); SubscribeLocalEvent(OnComponentMapInit); SubscribeLocalEvent(OnPowerChanged); SubscribeLocalEvent(OnBreak); @@ -86,7 +83,7 @@ private void OnVendingPrice(EntityUid uid, VendingMachineComponent component, re { if (!PrototypeManager.TryIndex(entry.ID, out var proto)) { - _sawmill.Error($"Unable to find entity prototype {entry.ID} on {ToPrettyString(uid)} vending."); + Log.Error($"Unable to find entity prototype {entry.ID} on {ToPrettyString(uid)} vending."); continue; } @@ -193,7 +190,7 @@ private void OnDoAfter(EntityUid uid, VendingMachineComponent component, DoAfter if (!TryComp(args.Args.Used, out var restockComponent)) { - _sawmill.Error($"{ToPrettyString(args.Args.User)} tried to restock {ToPrettyString(uid)} with {ToPrettyString(args.Args.Used.Value)} which did not have a VendingMachineRestockComponent."); + Log.Error($"{ToPrettyString(args.Args.User)} tried to restock {ToPrettyString(uid)} with {ToPrettyString(args.Args.Used.Value)} which did not have a VendingMachineRestockComponent."); return; } diff --git a/Content.Server/Wires/WiresSystem.cs b/Content.Server/Wires/WiresSystem.cs index 0f9ee8b0f7..a2deb11fe7 100644 --- a/Content.Server/Wires/WiresSystem.cs +++ b/Content.Server/Wires/WiresSystem.cs @@ -701,7 +701,7 @@ private void TryDoWireAction(EntityUid target, EntityUid user, EntityUid toolEnt { NeedHand = true, BreakOnDamage = true, - BreakOnUserMove = true + BreakOnMove = true }; _doAfter.TryStartDoAfter(args); diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs index 239b674160..9976d56da0 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Triggers/Systems/ArtifactInteractionTriggerSystem.cs @@ -1,6 +1,6 @@ using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; using Content.Shared.Interaction; -using Content.Shared.Physics.Pull; +using Content.Shared.Movement.Pulling.Events; using Content.Shared.Weapons.Melee.Events; namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; @@ -22,7 +22,7 @@ private void OnPull(EntityUid uid, ArtifactInteractionTriggerComponent component if (!component.PullActivation) return; - _artifactSystem.TryActivateArtifact(uid, args.Puller.Owner); + _artifactSystem.TryActivateArtifact(uid, args.PullerUid); } private void OnAttack(EntityUid uid, ArtifactInteractionTriggerComponent component, AttackedEvent args) diff --git a/Content.Server/Zombies/ZombieSystem.Transform.cs b/Content.Server/Zombies/ZombieSystem.Transform.cs index 386a7c6419..63cc873086 100644 --- a/Content.Server/Zombies/ZombieSystem.Transform.cs +++ b/Content.Server/Zombies/ZombieSystem.Transform.cs @@ -24,12 +24,14 @@ using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; +using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Systems; +using Content.Shared.NPC.Components; +using Content.Shared.NPC.Systems; using Content.Shared.Nutrition.AnimalHusbandry; using Content.Shared.Nutrition.Components; using Content.Shared.Popups; using Content.Shared.Roles; -using Content.Shared.Pulling.Components; using Content.Shared.Weapons.Melee; using Content.Shared.Zombies; using Content.Shared.Prying.Components; @@ -57,7 +59,6 @@ public sealed partial class ZombieSystem [Dependency] private readonly IChatManager _chatMan = default!; [Dependency] private readonly MindSystem _mind = default!; [Dependency] private readonly SharedRoleSystem _roles = default!; - [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; /// @@ -125,7 +126,10 @@ public void ZombifyEntity(EntityUid target, MobStateComponent? mobState = null) var melee = EnsureComp(target); melee.Animation = zombiecomp.AttackAnimation; melee.WideAnimation = zombiecomp.AttackAnimation; + melee.AltDisarm = false; melee.Range = 1.2f; + melee.Angle = 0.0f; + melee.HitSound = zombiecomp.BiteSound; if (mobState.CurrentState == MobState.Alive) { @@ -212,11 +216,7 @@ public void ZombifyEntity(EntityUid target, MobStateComponent? mobState = null) _damageable.SetAllDamage(target, damageablecomp, 0); _mobState.ChangeMobState(target, MobState.Alive); - var factionComp = EnsureComp(target); - foreach (var id in new List(factionComp.Factions)) - { - _faction.RemoveFaction(target, id); - } + _faction.ClearFactions(target, dirty: false); _faction.AddFaction(target, "Zombie"); //gives it the funny "Zombie ___" name. @@ -263,7 +263,9 @@ public void ZombifyEntity(EntityUid target, MobStateComponent? mobState = null) RemComp(target, handsComp); } - RemComp(target); + // Sloth: What the fuck? + // How long until compregistry lmao. + RemComp(target); // No longer waiting to become a zombie: // Requires deferral because this is (probably) the event which called ZombifyEntity in the first place. diff --git a/Content.Server/Zombies/ZombieSystem.cs b/Content.Server/Zombies/ZombieSystem.cs index e515c377be..bef57eceb3 100644 --- a/Content.Server/Zombies/ZombieSystem.cs +++ b/Content.Server/Zombies/ZombieSystem.cs @@ -55,7 +55,7 @@ public override void Initialize() SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnEmote, before: - new []{typeof(VocalSystem), typeof(BodyEmotesSystem)}); + new[] { typeof(VocalSystem), typeof(BodyEmotesSystem) }); SubscribeLocalEvent(OnMeleeHit); SubscribeLocalEvent(OnMobState); @@ -70,6 +70,12 @@ public override void Initialize() private void OnPendingMapInit(EntityUid uid, PendingZombieComponent component, MapInitEvent args) { + if (_mobState.IsDead(uid)) + { + ZombifyEntity(uid); + return; + } + component.NextTick = _timing.CurTime + TimeSpan.FromSeconds(1f); } @@ -196,7 +202,7 @@ private float GetZombieInfectionChance(EntityUid uid, ZombieComponent component) var min = component.MinZombieInfectionChance; //gets a value between the max and min based on how many items the entity is wearing - var chance = (max-min) * ((total - items)/total) + min; + var chance = (max - min) * ((total - items) / total) + min; return chance; } @@ -261,7 +267,7 @@ public bool UnZombify(EntityUid source, EntityUid target, ZombieComponent? zombi _humanoidAppearance.SetBaseLayerColor(target, layer, info.Color); _humanoidAppearance.SetBaseLayerId(target, layer, info.Id); } - if(TryComp(target, out var appcomp)) + if (TryComp(target, out var appcomp)) { appcomp.EyeColor = zombiecomp.BeforeZombifiedEyeColor; } diff --git a/Content.Shared/ActionBlocker/ActionBlockerSystem.cs b/Content.Shared/ActionBlocker/ActionBlockerSystem.cs index 6dff8161ee..a914a8f267 100644 --- a/Content.Shared/ActionBlocker/ActionBlockerSystem.cs +++ b/Content.Shared/ActionBlocker/ActionBlockerSystem.cs @@ -1,3 +1,4 @@ +using Content.Shared.Bed.Sleep; using Content.Shared.Body.Events; using Content.Shared.DragDrop; using Content.Shared.Emoting; @@ -5,6 +6,8 @@ using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Item; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; using Content.Shared.Movement.Components; using Content.Shared.Movement.Events; using Content.Shared.Speech; @@ -67,6 +70,9 @@ public bool UpdateCanMove(EntityUid uid, InputMoverComponent? component = null) /// public bool CanInteract(EntityUid user, EntityUid? target) { + if (!CanConsciouslyPerformAction(user)) + return false; + var ev = new InteractionAttemptEvent(user, target); RaiseLocalEvent(user, ev); @@ -98,6 +104,21 @@ public bool CanUseHeldEntity(EntityUid user) return !ev.Cancelled; } + + /// + /// Whether a user conscious to perform an action. + /// + /// + /// This should be used when you want a much more permissive check than + /// + public bool CanConsciouslyPerformAction(EntityUid user) + { + var ev = new ConsciousAttemptEvent(user); + RaiseLocalEvent(user, ev); + + return !ev.Cancelled; + } + public bool CanThrow(EntityUid user, EntityUid itemUid) { var ev = new ThrowAttemptEvent(user, itemUid); diff --git a/Content.Shared/Actions/BaseActionComponent.cs b/Content.Shared/Actions/BaseActionComponent.cs index cce7b912c7..6d9242acc1 100644 --- a/Content.Shared/Actions/BaseActionComponent.cs +++ b/Content.Shared/Actions/BaseActionComponent.cs @@ -1,4 +1,5 @@ -using Robust.Shared.Audio; +using Content.Shared.Mobs; +using Robust.Shared.Audio; using Robust.Shared.Serialization; using Robust.Shared.Utility; @@ -118,6 +119,12 @@ public EntityUid? EntityIcon /// [DataField("checkCanInteract")] public bool CheckCanInteract = true; + /// + /// Whether to check if the user is conscious or not. Can be used instead of + /// for a more permissive check. + /// + [DataField] public bool CheckConsciousness = true; + /// /// If true, this will cause the action to only execute locally without ever notifying the server. /// @@ -177,6 +184,7 @@ public abstract class BaseActionComponentState : ComponentState public NetEntity? Container; public NetEntity? EntityIcon; public bool CheckCanInteract; + public bool CheckConsciousness; public bool ClientExclusive; public int Priority; public NetEntity? AttachedEntity; @@ -204,6 +212,7 @@ protected BaseActionComponentState(BaseActionComponent component, IEntityManager MaxCharges = component.MaxCharges; RenewCharges = component.RenewCharges; CheckCanInteract = component.CheckCanInteract; + CheckConsciousness = component.CheckConsciousness; ClientExclusive = component.ClientExclusive; Priority = component.Priority; AutoPopulate = component.AutoPopulate; diff --git a/Content.Shared/Actions/SharedActionsSystem.cs b/Content.Shared/Actions/SharedActionsSystem.cs index a3bfa07130..e909f0a8a3 100644 --- a/Content.Shared/Actions/SharedActionsSystem.cs +++ b/Content.Shared/Actions/SharedActionsSystem.cs @@ -8,6 +8,7 @@ using Content.Shared.Interaction; using Content.Shared.Inventory.Events; using Content.Shared.Mind; +using Content.Shared.Mobs.Components; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.GameStates; @@ -370,6 +371,9 @@ private void OnActionRequest(RequestPerformActionEvent ev, EntitySessionEventArg BaseActionEvent? performEvent = null; + if (action.CheckConsciousness && !_actionBlockerSystem.CanConsciouslyPerformAction(user)) + return; + // Validate request by checking action blockers and the like: switch (action) { diff --git a/Content.Shared/Administration/AdminFrozenSystem.cs b/Content.Shared/Administration/AdminFrozenSystem.cs index 14438cc591..4ec9600b0b 100644 --- a/Content.Shared/Administration/AdminFrozenSystem.cs +++ b/Content.Shared/Administration/AdminFrozenSystem.cs @@ -1,13 +1,10 @@ using Content.Shared.ActionBlocker; using Content.Shared.Interaction.Events; using Content.Shared.Item; -using Content.Shared.Movement; using Content.Shared.Movement.Events; -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; -using Content.Shared.Pulling.Events; -using Content.Shared.Stunnable; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Throwing; namespace Content.Shared.Administration; @@ -15,7 +12,7 @@ namespace Content.Shared.Administration; public sealed class AdminFrozenSystem : EntitySystem { [Dependency] private readonly ActionBlockerSystem _blocker = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; public override void Initialize() { @@ -45,9 +42,9 @@ private void OnPullAttempt(EntityUid uid, AdminFrozenComponent component, PullAt private void OnStartup(EntityUid uid, AdminFrozenComponent component, ComponentStartup args) { - if (TryComp(uid, out var pullable)) + if (TryComp(uid, out var pullable)) { - _pulling.TryStopPull(pullable); + _pulling.TryStopPull(uid, pullable); } UpdateCanMove(uid, component, args); diff --git a/Content.Shared/Anomaly/SharedAnomalySystem.cs b/Content.Shared/Anomaly/SharedAnomalySystem.cs index 6cdcdf305b..c335cd7b85 100644 --- a/Content.Shared/Anomaly/SharedAnomalySystem.cs +++ b/Content.Shared/Anomaly/SharedAnomalySystem.cs @@ -35,8 +35,6 @@ public abstract class SharedAnomalySystem : EntitySystem [Dependency] protected readonly SharedPopupSystem Popup = default!; [Dependency] private readonly IRobustRandom _random = default!; - private ISawmill _sawmill = default!; - public override void Initialize() { base.Initialize(); @@ -45,8 +43,6 @@ public override void Initialize() SubscribeLocalEvent(OnAttacked); SubscribeLocalEvent(OnAnomalyThrowStart); SubscribeLocalEvent(OnAnomalyThrowEnd); - - _sawmill = Logger.GetSawmill("anomaly"); } private void OnInteractHand(EntityUid uid, AnomalyComponent component, InteractHandEvent args) @@ -98,7 +94,7 @@ public void DoAnomalyPulse(EntityUid uid, AnomalyComponent? component = null) component.NextPulseTime = Timing.CurTime + GetPulseLength(component) * variation; if (_net.IsServer) - _sawmill.Info($"Performing anomaly pulse. Entity: {ToPrettyString(uid)}"); + Log.Info($"Performing anomaly pulse. Entity: {ToPrettyString(uid)}"); // if we are above the growth threshold, then grow before the pulse if (component.Stability > component.GrowthThreshold) @@ -133,9 +129,9 @@ public void StartSupercriticalEvent(EntityUid uid) if (HasComp(uid)) return; - AdminLog.Add(LogType.Anomaly, LogImpact.High, $"Anomaly {ToPrettyString(uid)} began to go supercritical."); + AdminLog.Add(LogType.Anomaly, LogImpact.Extreme, $"Anomaly {ToPrettyString(uid)} began to go supercritical."); if (_net.IsServer) - _sawmill.Info($"Anomaly is going supercritical. Entity: {ToPrettyString(uid)}"); + Log.Info($"Anomaly is going supercritical. Entity: {ToPrettyString(uid)}"); var super = AddComp(uid); super.EndTime = Timing.CurTime + super.SupercriticalDuration; @@ -161,7 +157,7 @@ public void DoAnomalySupercriticalEvent(EntityUid uid, AnomalyComponent? compone Audio.PlayPvs(component.SupercriticalSound, uid); if (_net.IsServer) - _sawmill.Info($"Raising supercritical event. Entity: {ToPrettyString(uid)}"); + Log.Info($"Raising supercritical event. Entity: {ToPrettyString(uid)}"); var ev = new AnomalySupercriticalEvent(uid); RaiseLocalEvent(uid, ref ev, true); @@ -179,8 +175,9 @@ public void EndAnomaly(EntityUid uid, AnomalyComponent? component = null, bool s { // Logging before resolve, in case the anomaly has deleted itself. if (_net.IsServer) - _sawmill.Info($"Ending anomaly. Entity: {ToPrettyString(uid)}"); - AdminLog.Add(LogType.Anomaly, LogImpact.Extreme, $"Anomaly {ToPrettyString(uid)} went supercritical."); + Log.Info($"Ending anomaly. Entity: {ToPrettyString(uid)}"); + AdminLog.Add(LogType.Anomaly, supercritical ? LogImpact.High : LogImpact.Low, + $"Anomaly {ToPrettyString(uid)} {(supercritical ? "went supercritical" : "decayed")}."); if (!Resolve(uid, ref component)) return; diff --git a/Content.Shared/Atmos/Atmospherics.cs b/Content.Shared/Atmos/Atmospherics.cs index 7460e08e46..c56edd205b 100644 --- a/Content.Shared/Atmos/Atmospherics.cs +++ b/Content.Shared/Atmos/Atmospherics.cs @@ -276,7 +276,7 @@ static Atmospherics() public const float HazardLowPressure = 20f; /// - /// The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, + /// The amount of pressure damage someone takes is equal to ((pressure / HAZARD_HIGH_PRESSURE) - 1)*PRESSURE_DAMAGE_COEFFICIENT, /// with the maximum of MaxHighPressureDamage. /// public const float PressureDamageCoefficient = 4; diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs index cfaea47d30..261403f522 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs @@ -7,11 +7,9 @@ using Content.Shared.Hands.Components; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; -using Content.Shared.Interaction.Events; using Content.Shared.Mobs.Components; using Content.Shared.Movement.Events; using Content.Shared.Popups; -using Content.Shared.Pulling.Components; using Content.Shared.Standing; using Content.Shared.Storage.Components; using Content.Shared.Stunnable; @@ -21,6 +19,7 @@ using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; using Robust.Shared.Utility; +using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; namespace Content.Shared.Buckle; @@ -40,7 +39,6 @@ private void InitializeBuckle() SubscribeLocalEvent(OnBuckleStandAttempt); SubscribeLocalEvent(OnBuckleThrowPushbackAttempt); SubscribeLocalEvent(OnBuckleUpdateCanMove); - SubscribeLocalEvent(OnBuckleChangeDirectionAttempt); } private void OnBuckleComponentStartup(EntityUid uid, BuckleComponent component, ComponentStartup args) @@ -154,12 +152,6 @@ private void OnBuckleUpdateCanMove(EntityUid uid, BuckleComponent component, Upd args.Cancel(); } - private void OnBuckleChangeDirectionAttempt(EntityUid uid, BuckleComponent component, ChangeDirectionAttemptEvent args) - { - if (component.Buckled) - args.Cancel(); - } - public bool IsBuckled(EntityUid uid, BuckleComponent? component = null) { return Resolve(uid, ref component, false) && component.Buckled; @@ -368,11 +360,11 @@ public bool TryBuckle(EntityUid buckleUid, EntityUid userUid, EntityUid strapUid RaiseLocalEvent(ev.BuckledEntity, ref ev); RaiseLocalEvent(ev.StrapEntity, ref ev); - if (TryComp(buckleUid, out var ownerPullable)) + if (TryComp(buckleUid, out var ownerPullable)) { if (ownerPullable.Puller != null) { - _pulling.TryStopPull(ownerPullable); + _pulling.TryStopPull(buckleUid, ownerPullable); } } @@ -381,12 +373,12 @@ public bool TryBuckle(EntityUid buckleUid, EntityUid userUid, EntityUid strapUid _physics.ResetDynamics(physics); } - if (!buckleComp.PullStrap && TryComp(strapUid, out var toPullable)) + if (!buckleComp.PullStrap && TryComp(strapUid, out var toPullable)) { if (toPullable.Puller == buckleUid) { // can't pull it and buckle to it at the same time - _pulling.TryStopPull(toPullable); + _pulling.TryStopPull(strapUid, toPullable); } } diff --git a/Content.Shared/Buckle/SharedBuckleSystem.cs b/Content.Shared/Buckle/SharedBuckleSystem.cs index 8f68335663..67218657e5 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.cs @@ -15,6 +15,7 @@ using Robust.Shared.Physics.Systems; using Robust.Shared.Player; using Robust.Shared.Timing; +using PullingSystem = Content.Shared.Movement.Pulling.Systems.PullingSystem; namespace Content.Shared.Buckle; @@ -35,7 +36,7 @@ public abstract partial class SharedBuckleSystem : EntitySystem [Dependency] private readonly SharedInteractionSystem _interaction = default!; [Dependency] private readonly SharedJointSystem _joints = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly StandingStateSystem _standing = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; diff --git a/Content.Shared/Burial/BurialSystem.cs b/Content.Shared/Burial/BurialSystem.cs index 937784ca2a..e19ac2e9c6 100644 --- a/Content.Shared/Burial/BurialSystem.cs +++ b/Content.Shared/Burial/BurialSystem.cs @@ -45,8 +45,7 @@ private void OnInteractUsing(EntityUid uid, GraveComponent component, InteractUs { var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.DigDelay / shovel.SpeedModifier, new GraveDiggingDoAfterEvent(), uid, target: args.Target, used: uid) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, BreakOnDamage = true, NeedHand = true, BreakOnHandChange = true @@ -159,8 +158,7 @@ private void OnRelayMovement(EntityUid uid, GraveComponent component, ref Contai var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Entity, component.DigDelay / component.DigOutByHandModifier, new GraveDiggingDoAfterEvent(), uid, target: uid) { NeedHand = false, - BreakOnUserMove = true, - BreakOnTargetMove = false, + BreakOnMove = true, BreakOnHandChange = false, BreakOnDamage = false }; diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index b117e60359..51a225812f 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -260,6 +260,13 @@ public static readonly CVarDef public static readonly CVarDef SoftMaxPlayers = CVarDef.Create("game.soft_max_players", 30, CVar.SERVERONLY | CVar.ARCHIVE); + /// + /// If a player gets denied connection to the server, + /// how long they are forced to wait before attempting to reconnect. + /// + public static readonly CVarDef GameServerFullReconnectDelay = + CVarDef.Create("game.server_full_reconnect_delay", 30, CVar.SERVERONLY); + /// /// Whether or not panic bunker is currently enabled. /// @@ -858,6 +865,13 @@ public static readonly CVarDef public static readonly CVarDef AdminAfkTime = CVarDef.Create("admin.afk_time", 600f, CVar.SERVERONLY); + /// + /// If true, admins are able to connect even if + /// would otherwise block regular players. + /// + public static readonly CVarDef AdminBypassMaxPlayers = + CVarDef.Create("admin.bypass_max_players", true, CVar.SERVERONLY); + /* * Explosions */ diff --git a/Content.Shared/Chemistry/Components/InjectorComponent.cs b/Content.Shared/Chemistry/Components/InjectorComponent.cs index 437c5e327d..605a15d73a 100644 --- a/Content.Shared/Chemistry/Components/InjectorComponent.cs +++ b/Content.Shared/Chemistry/Components/InjectorComponent.cs @@ -52,7 +52,7 @@ public sealed partial class InjectorComponent : Component /// The maximum amount of solution that can be transferred at once from this solution. /// [DataField("maxTransferAmount")] - public FixedPoint2 MaximumTransferAmount = FixedPoint2.New(50); + public FixedPoint2 MaximumTransferAmount = FixedPoint2.New(15); /// /// Amount to inject or draw on each usage. If the injector is inject only, it will diff --git a/Content.Shared/Chemistry/EntitySystems/SharedInjectorSystem.cs b/Content.Shared/Chemistry/EntitySystems/SharedInjectorSystem.cs index dad8eb4091..7e41cb39bd 100644 --- a/Content.Shared/Chemistry/EntitySystems/SharedInjectorSystem.cs +++ b/Content.Shared/Chemistry/EntitySystems/SharedInjectorSystem.cs @@ -39,12 +39,34 @@ private void AddSetTransferVerbs(Entity entity, ref GetVerbsE if (!HasComp(args.User)) return; + var user = args.User; var (_, component) = entity; - // Add specific transfer verbs according to the container's size + var min = component.MinimumTransferAmount; + var max = component.MaximumTransferAmount; + var cur = component.TransferAmount; + var toggleAmount = cur == max ? min : max; + var priority = 0; - var user = args.User; + AlternativeVerb toggleVerb = new() + { + Text = Loc.GetString("comp-solution-transfer-verb-toggle", ("amount", toggleAmount)), + Category = VerbCategory.SetTransferAmount, + Act = () => + { + component.TransferAmount = toggleAmount; + Popup.PopupClient(Loc.GetString("comp-solution-transfer-set-amount", ("amount", toggleAmount)), user, user); + Dirty(entity); + }, + + Priority = priority + }; + args.Verbs.Add(toggleVerb); + + priority -= 1; + + // Add specific transfer verbs according to the container's size foreach (var amount in TransferAmounts) { if (amount < component.MinimumTransferAmount || amount > component.MaximumTransferAmount) diff --git a/Content.Shared/Climbing/Systems/BonkSystem.cs b/Content.Shared/Climbing/Systems/BonkSystem.cs index e91d1eadbe..149abee8b0 100644 --- a/Content.Shared/Climbing/Systems/BonkSystem.cs +++ b/Content.Shared/Climbing/Systems/BonkSystem.cs @@ -82,8 +82,7 @@ private void OnDragDrop(EntityUid uid, Components.BonkableComponent component, r var doAfterArgs = new DoAfterArgs(EntityManager, args.Dragged, component.BonkDelay, new BonkDoAfterEvent(), uid, target: uid) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, BreakOnDamage = true }; diff --git a/Content.Shared/Climbing/Systems/ClimbSystem.cs b/Content.Shared/Climbing/Systems/ClimbSystem.cs index 7c760f2c5d..fcf473f9f1 100644 --- a/Content.Shared/Climbing/Systems/ClimbSystem.cs +++ b/Content.Shared/Climbing/Systems/ClimbSystem.cs @@ -211,8 +211,7 @@ public bool TryClimb( target: climbable, used: entityToMove) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, BreakOnDamage = true }; diff --git a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs index 50a1d93a6c..f189db005b 100644 --- a/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ClothingSystem.cs @@ -217,5 +217,38 @@ public void CopyVisuals(EntityUid uid, ClothingComponent otherClothing, Clothing Dirty(uid, clothing); } + public void SetLayerColor(ClothingComponent clothing, string slot, string mapKey, Color? color) + { + if (clothing.ClothingVisuals == null) + return; + + foreach (var layer in clothing.ClothingVisuals[slot]) + { + if (layer.MapKeys == null) + return; + + if (!layer.MapKeys.Contains(mapKey)) + continue; + + layer.Color = color; + } + } + public void SetLayerState(ClothingComponent clothing, string slot, string mapKey, string state) + { + if (clothing.ClothingVisuals == null) + return; + + foreach (var layer in clothing.ClothingVisuals[slot]) + { + if (layer.MapKeys == null) + return; + + if (!layer.MapKeys.Contains(mapKey)) + continue; + + layer.State = state; + } + } + #endregion } diff --git a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs index 0138de7a98..c828b22481 100644 --- a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs @@ -95,12 +95,12 @@ private void StartDoAfter(EntityUid user, EntityUid item, EntityUid wearer, Togg if (component.StripDelay == null) return; - var (time, stealth) = _strippable.GetStripTimeModifiers(user, wearer, (float) component.StripDelay.Value.TotalSeconds); + var (time, stealth) = _strippable.GetStripTimeModifiers(user, wearer, component.StripDelay.Value); var args = new DoAfterArgs(EntityManager, user, time, new ToggleClothingDoAfterEvent(), item, wearer, item) { BreakOnDamage = true, - BreakOnTargetMove = true, + BreakOnMove = true, // This should just re-use the BUI range checks & cancel the do after if the BUI closes. But that is all // server-side at the moment. // TODO BUI REFACTOR. diff --git a/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs b/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs index 70bcfbab43..f06278c6d7 100644 --- a/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs +++ b/Content.Shared/Construction/EntitySystems/AnchorableSystem.cs @@ -6,16 +6,15 @@ using Content.Shared.Database; using Content.Shared.DoAfter; using Content.Shared.Interaction; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Popups; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; using Content.Shared.Tools; using Content.Shared.Tools.Components; using Robust.Shared.Map; using Robust.Shared.Map.Components; using Robust.Shared.Physics.Components; using Content.Shared.Tag; -using Robust.Shared.Player; using Robust.Shared.Serialization; using Robust.Shared.Utility; using SharedToolSystem = Content.Shared.Tools.Systems.SharedToolSystem; @@ -27,7 +26,7 @@ public sealed partial class AnchorableSystem : EntitySystem [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly SharedToolSystem _tool = default!; [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly TagSystem _tagSystem = default!; @@ -132,9 +131,9 @@ private void OnAnchorComplete(EntityUid uid, AnchorableComponent component, TryA var rot = xform.LocalRotation; xform.LocalRotation = Math.Round(rot / (Math.PI / 2)) * (Math.PI / 2); - if (TryComp(uid, out var pullable) && pullable.Puller != null) + if (TryComp(uid, out var pullable) && pullable.Puller != null) { - _pulling.TryStopPull(pullable); + _pulling.TryStopPull(uid, pullable); } // TODO: Anchoring snaps rn anyway! @@ -175,7 +174,7 @@ private void OnAnchorComplete(EntityUid uid, AnchorableComponent component, TryA public void TryToggleAnchor(EntityUid uid, EntityUid userUid, EntityUid usingUid, AnchorableComponent? anchorable = null, TransformComponent? transform = null, - SharedPullableComponent? pullable = null, + PullableComponent? pullable = null, ToolComponent? usingTool = null) { if (!Resolve(uid, ref transform)) @@ -198,7 +197,7 @@ public void TryToggleAnchor(EntityUid uid, EntityUid userUid, EntityUid usingUid private void TryAnchor(EntityUid uid, EntityUid userUid, EntityUid usingUid, AnchorableComponent? anchorable = null, TransformComponent? transform = null, - SharedPullableComponent? pullable = null, + PullableComponent? pullable = null, ToolComponent? usingTool = null) { if (!Resolve(uid, ref anchorable, ref transform)) diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index fc005fd30f..ca903719c4 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -21,9 +21,8 @@ using Content.Shared.Item; using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Events; -using Content.Shared.Physics.Pull; +using Content.Shared.Movement.Pulling.Events; using Content.Shared.Popups; -using Content.Shared.Pulling.Components; using Content.Shared.Pulling.Events; using Content.Shared.Rejuvenate; using Content.Shared.Stunnable; @@ -36,6 +35,7 @@ using Robust.Shared.Network; using Robust.Shared.Player; using Robust.Shared.Serialization; +using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; namespace Content.Shared.Cuffs { @@ -70,7 +70,7 @@ public override void Initialize() SubscribeLocalEvent(OnCuffsInsertedIntoContainer); SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnStartup); - SubscribeLocalEvent(HandleStopPull); + SubscribeLocalEvent(HandleStopPull); SubscribeLocalEvent(HandleMoveAttempt); SubscribeLocalEvent(OnEquipAttempt); SubscribeLocalEvent(OnUnequipAttempt); @@ -182,7 +182,7 @@ public void UpdateCuffState(EntityUid uid, CuffableComponent component) private void OnBeingPulledAttempt(EntityUid uid, CuffableComponent component, BeingPulledAttemptEvent args) { - if (!TryComp(uid, out var pullable)) + if (!TryComp(uid, out var pullable)) return; if (pullable.Puller != null && !component.CanStillInteract) // If we are being pulled already and cuffed, we can't get pulled again. @@ -214,19 +214,19 @@ private void OnPull(EntityUid uid, CuffableComponent component, PullMessage args private void HandleMoveAttempt(EntityUid uid, CuffableComponent component, UpdateCanMoveEvent args) { - if (component.CanStillInteract || !EntityManager.TryGetComponent(uid, out SharedPullableComponent? pullable) || !pullable.BeingPulled) + if (component.CanStillInteract || !EntityManager.TryGetComponent(uid, out PullableComponent? pullable) || !pullable.BeingPulled) return; args.Cancel(); } - private void HandleStopPull(EntityUid uid, CuffableComponent component, StopPullingEvent args) + private void HandleStopPull(EntityUid uid, CuffableComponent component, AttemptStopPullingEvent args) { if (args.User == null || !Exists(args.User.Value)) return; if (args.User.Value == uid && !component.CanStillInteract) - args.Cancel(); + args.Cancelled = true; } private void AddUncuffVerb(EntityUid uid, CuffableComponent component, GetVerbsEvent args) @@ -479,10 +479,11 @@ public bool TryCuffing(EntityUid user, EntityUid target, EntityUid handcuff, Han var doAfterEventArgs = new DoAfterArgs(EntityManager, user, cuffTime, new AddCuffDoAfterEvent(), handcuff, target, handcuff) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, + BreakOnWeightlessMove = false, BreakOnDamage = true, - NeedHand = true + NeedHand = true, + DistanceThreshold = 0.3f }; if (!_doAfter.TryStartDoAfter(doAfterEventArgs)) @@ -574,11 +575,12 @@ public void TryUncuff(EntityUid target, EntityUid user, EntityUid? cuffsToRemove var doAfterEventArgs = new DoAfterArgs(EntityManager, user, uncuffTime, new UnCuffDoAfterEvent(), target, target, cuffsToRemove) { - BreakOnUserMove = true, - BreakOnTargetMove = true, + BreakOnMove = true, + BreakOnWeightlessMove = false, BreakOnDamage = true, NeedHand = true, RequireCanInteract = false, // Trust in UncuffAttemptEvent + DistanceThreshold = 0.3f }; if (!_doAfter.TryStartDoAfter(doAfterEventArgs)) diff --git a/Content.Shared/Damage/Components/DamageableComponent.cs b/Content.Shared/Damage/Components/DamageableComponent.cs index f8ba661a66..be66d51e3b 100644 --- a/Content.Shared/Damage/Components/DamageableComponent.cs +++ b/Content.Shared/Damage/Components/DamageableComponent.cs @@ -1,6 +1,9 @@ using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; +using Content.Shared.Mobs; +using Content.Shared.StatusIcon; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; @@ -62,7 +65,18 @@ public sealed partial class DamageableComponent : Component public FixedPoint2 TotalDamage; [DataField("radiationDamageTypes", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List RadiationDamageTypeIDs = new() {"Radiation"}; + public List RadiationDamageTypeIDs = new() { "Radiation" }; + + [DataField] + public Dictionary> HealthIcons = new() + { + { MobState.Alive, "HealthIconFine" }, + { MobState.Critical, "HealthIconCritical" }, + { MobState.Dead, "HealthIconDead" }, + }; + + [DataField] + public ProtoId RottingIcon = "HealthIconRotting"; } [Serializable, NetSerializable] diff --git a/Content.Shared/DeviceLinking/SharedDeviceLinkSystem.cs b/Content.Shared/DeviceLinking/SharedDeviceLinkSystem.cs index 2ac525d154..83aa708589 100644 --- a/Content.Shared/DeviceLinking/SharedDeviceLinkSystem.cs +++ b/Content.Shared/DeviceLinking/SharedDeviceLinkSystem.cs @@ -13,7 +13,6 @@ public abstract class SharedDeviceLinkSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - private ISawmill _sawmill = default!; public const string InvokedPort = "link_port"; @@ -25,7 +24,6 @@ public override void Initialize() SubscribeLocalEvent(OnSinkStartup); SubscribeLocalEvent(OnSourceRemoved); SubscribeLocalEvent(OnSinkRemoved); - _sawmill = Logger.GetSawmill("devicelink"); } #region Link Validation @@ -386,12 +384,12 @@ public void RemoveSinkFromSource( if (sourceComponent == null) { - _sawmill.Error($"Attempted to remove link between {ToPrettyString(sourceUid)} and {ToPrettyString(sinkUid)}, but the source component was missing."); + Log.Error($"Attempted to remove link between {ToPrettyString(sourceUid)} and {ToPrettyString(sinkUid)}, but the source component was missing."); sinkComponent!.LinkedSources.Remove(sourceUid); } else { - _sawmill.Error($"Attempted to remove link between {ToPrettyString(sourceUid)} and {ToPrettyString(sinkUid)}, but the sink component was missing."); + Log.Error($"Attempted to remove link between {ToPrettyString(sourceUid)} and {ToPrettyString(sinkUid)}, but the sink component was missing."); sourceComponent.LinkedPorts.Remove(sourceUid); } } diff --git a/Content.Shared/Devour/SharedDevourSystem.cs b/Content.Shared/Devour/SharedDevourSystem.cs index a2b788f3f3..3d73b14dd3 100644 --- a/Content.Shared/Devour/SharedDevourSystem.cs +++ b/Content.Shared/Devour/SharedDevourSystem.cs @@ -57,8 +57,7 @@ protected void OnDevourAction(EntityUid uid, DevourerComponent component, Devour _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, uid, component.DevourTime, new DevourDoAfterEvent(), uid, target: target, used: uid) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, }); break; default: @@ -76,8 +75,7 @@ protected void OnDevourAction(EntityUid uid, DevourerComponent component, Devour _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, uid, component.StructureDevourTime, new DevourDoAfterEvent(), uid, target: target, used: uid) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, }); } } diff --git a/Content.Shared/DoAfter/DoAfter.cs b/Content.Shared/DoAfter/DoAfter.cs index d999b370b3..f77a6dc272 100644 --- a/Content.Shared/DoAfter/DoAfter.cs +++ b/Content.Shared/DoAfter/DoAfter.cs @@ -82,12 +82,6 @@ public DoAfter(ushort index, DoAfterArgs args, TimeSpan startTime) { Index = index; - if (args.Target == null) - { - DebugTools.Assert(!args.BreakOnTargetMove); - args.BreakOnTargetMove = false; - } - Args = args; StartTime = startTime; } diff --git a/Content.Shared/DoAfter/DoAfterArgs.cs b/Content.Shared/DoAfter/DoAfterArgs.cs index d2729ad3c6..d96ea84e17 100644 --- a/Content.Shared/DoAfter/DoAfterArgs.cs +++ b/Content.Shared/DoAfter/DoAfterArgs.cs @@ -92,29 +92,23 @@ public sealed partial class DoAfterArgs public bool BreakOnHandChange = true; /// - /// If do_after stops when the user moves + /// If do_after stops when the user or target moves /// - [DataField("breakOnUserMove")] - public bool BreakOnUserMove; - - /// - /// If this is true then any movement, even when weightless, will break the doafter. - /// When there is no gravity, BreakOnUserMove is ignored. If it is false to begin with nothing will change. - /// - [DataField("breakOnWeightlessMove")] - public bool BreakOnWeightlessMove; + [DataField] + public bool BreakOnMove; /// - /// If do_after stops when the target moves (if there is a target) + /// Whether to break on movement when the user is weightless. + /// This does nothing if is false. /// - [DataField("breakOnTargetMove")] - public bool BreakOnTargetMove; + [DataField] + public bool BreakOnWeightlessMove = true; /// /// Threshold for user and target movement /// [DataField("movementThreshold")] - public float MovementThreshold = 0.1f; + public float MovementThreshold = 0.3f; /// /// Threshold for distance user from the used OR target entities. @@ -250,9 +244,8 @@ public DoAfterArgs(DoAfterArgs other) Broadcast = other.Broadcast; NeedHand = other.NeedHand; BreakOnHandChange = other.BreakOnHandChange; - BreakOnUserMove = other.BreakOnUserMove; + BreakOnMove = other.BreakOnMove; BreakOnWeightlessMove = other.BreakOnWeightlessMove; - BreakOnTargetMove = other.BreakOnTargetMove; MovementThreshold = other.MovementThreshold; DistanceThreshold = other.DistanceThreshold; BreakOnDamage = other.BreakOnDamage; diff --git a/Content.Shared/DoAfter/SharedDoAfterSystem.Update.cs b/Content.Shared/DoAfter/SharedDoAfterSystem.Update.cs index abd8888f58..455491f524 100644 --- a/Content.Shared/DoAfter/SharedDoAfterSystem.Update.cs +++ b/Content.Shared/DoAfter/SharedDoAfterSystem.Update.cs @@ -1,5 +1,7 @@ using Content.Shared.Gravity; using Content.Shared.Hands.Components; +using Content.Shared.Interaction; +using Content.Shared.Physics; using Robust.Shared.Utility; namespace Content.Shared.DoAfter; @@ -8,6 +10,7 @@ public abstract partial class SharedDoAfterSystem : EntitySystem { [Dependency] private readonly IDynamicTypeFactory _factory = default!; [Dependency] private readonly SharedGravitySystem _gravity = default!; + [Dependency] private readonly SharedInteractionSystem _interaction = default!; private DoAfter[] _doAfters = Array.Empty(); @@ -163,24 +166,53 @@ private bool ShouldCancel(DoAfter doAfter, return true; // TODO: Re-use existing xform query for these calculations. - // when there is no gravity you will be drifting 99% of the time making many doafters impossible - // so this just ignores your movement if you are weightless (unless the doafter sets BreakOnWeightlessMove then moving will still break it) - if (args.BreakOnUserMove - && !userXform.Coordinates.InRange(EntityManager, _transform, doAfter.UserPosition, args.MovementThreshold) - && (args.BreakOnWeightlessMove || !_gravity.IsWeightless(args.User, xform: userXform))) - return true; - - if (args.BreakOnTargetMove) + if (args.BreakOnMove && !(!args.BreakOnWeightlessMove && _gravity.IsWeightless(args.User, xform: userXform))) { - DebugTools.Assert(targetXform != null, "Break on move is true, but no target specified?"); - if (targetXform != null && targetXform.Coordinates.TryDistance(EntityManager, userXform.Coordinates, out var distance)) + // Whether the user has moved too much from their original position. + if (!userXform.Coordinates.InRange(EntityManager, _transform, doAfter.UserPosition, args.MovementThreshold)) + return true; + + // Whether the distance between the user and target(if any) has changed too much. + if (targetXform != null && + targetXform.Coordinates.TryDistance(EntityManager, userXform.Coordinates, out var distance)) { - // once the target moves too far from you the do after breaks if (Math.Abs(distance - doAfter.TargetDistance) > args.MovementThreshold) return true; } } + // Whether the user and the target are too far apart. + if (args.Target != null) + { + if (args.DistanceThreshold != null) + { + if (!_interaction.InRangeUnobstructed(args.User, args.Target.Value, args.DistanceThreshold.Value)) + return true; + } + else + { + if (!_interaction.InRangeUnobstructed(args.User, args.Target.Value)) + return true; + } + } + + // Whether the distance between the tool and the user has grown too much. + if (args.Used != null) + { + if (args.DistanceThreshold != null) + { + if (!_interaction.InRangeUnobstructed(args.User, + args.Used.Value, + args.DistanceThreshold.Value)) + return true; + } + else + { + if (!_interaction.InRangeUnobstructed(args.User,args.Used.Value)) + return true; + } + } + if (args.AttemptFrequency == AttemptFrequency.EveryTick && !TryAttemptEvent(doAfter)) return true; @@ -199,23 +231,6 @@ private bool ShouldCancel(DoAfter doAfter, if (args.RequireCanInteract && !_actionBlocker.CanInteract(args.User, args.Target)) return true; - if (args.DistanceThreshold != null) - { - if (targetXform != null - && !args.User.Equals(args.Target) - && !userXform.Coordinates.InRange(EntityManager, _transform, targetXform.Coordinates, - args.DistanceThreshold.Value)) - { - return true; - } - - if (usedXform != null - && !userXform.Coordinates.InRange(EntityManager, _transform, usedXform.Coordinates, - args.DistanceThreshold.Value)) - { - return true; - } - } return false; } diff --git a/Content.Shared/DoAfter/SharedDoAfterSystem.cs b/Content.Shared/DoAfter/SharedDoAfterSystem.cs index 9e81c91550..d20da49485 100644 --- a/Content.Shared/DoAfter/SharedDoAfterSystem.cs +++ b/Content.Shared/DoAfter/SharedDoAfterSystem.cs @@ -214,12 +214,11 @@ public bool TryStartDoAfter(DoAfterArgs args, [NotNullWhen(true)] out DoAfterId? args.NetUser = GetNetEntity(args.User); args.NetEventTarget = GetNetEntity(args.EventTarget); - if (args.BreakOnUserMove || args.BreakOnTargetMove) + if (args.BreakOnMove) doAfter.UserPosition = Transform(args.User).Coordinates; - if (args.Target != null && args.BreakOnTargetMove) + if (args.Target != null && args.BreakOnMove) { - // Target should never be null if the bool is set. var targetPosition = Transform(args.Target.Value).Coordinates; doAfter.UserPosition.TryDistance(EntityManager, targetPosition, out doAfter.TargetDistance); } diff --git a/Content.Shared/Examine/ExamineSystemShared.cs b/Content.Shared/Examine/ExamineSystemShared.cs index 5a3fb87229..f792862be1 100644 --- a/Content.Shared/Examine/ExamineSystemShared.cs +++ b/Content.Shared/Examine/ExamineSystemShared.cs @@ -144,7 +144,7 @@ public bool IsOccluded(EntityUid uid) return TryComp(uid, out var eye) && eye.DrawFov; } - public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, Ignored? predicate, bool ignoreInsideBlocker = true, IEntityManager? entMan = null) + public bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, Ignored? predicate, bool ignoreInsideBlocker = true, IEntityManager? entMan = null) { // No, rider. This is better. // ReSharper disable once ConvertToLocalFunction @@ -154,7 +154,7 @@ public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other return InRangeUnOccluded(origin, other, range, predicate, wrapped, ignoreInsideBlocker, entMan); } - public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, + public bool InRangeUnOccluded(MapCoordinates origin, MapCoordinates other, float range, TState state, Func predicate, bool ignoreInsideBlocker = true, IEntityManager? entMan = null) { if (other.MapId != origin.MapId || @@ -171,7 +171,7 @@ public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinat if (length > MaxRaycastRange) { - Logger.Warning("InRangeUnOccluded check performed over extreme range. Limiting CollisionRay size."); + Log.Warning("InRangeUnOccluded check performed over extreme range. Limiting CollisionRay size."); length = MaxRaycastRange; } @@ -207,7 +207,7 @@ public static bool InRangeUnOccluded(MapCoordinates origin, MapCoordinat return true; } - public static bool InRangeUnOccluded(EntityUid origin, EntityUid other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) + public bool InRangeUnOccluded(EntityUid origin, EntityUid other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) { var entMan = IoCManager.Resolve(); var originPos = entMan.GetComponent(origin).MapPosition; @@ -216,7 +216,7 @@ public static bool InRangeUnOccluded(EntityUid origin, EntityUid other, float ra return InRangeUnOccluded(originPos, otherPos, range, predicate, ignoreInsideBlocker); } - public static bool InRangeUnOccluded(EntityUid origin, EntityCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) + public bool InRangeUnOccluded(EntityUid origin, EntityCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) { var entMan = IoCManager.Resolve(); var originPos = entMan.GetComponent(origin).MapPosition; @@ -225,7 +225,7 @@ public static bool InRangeUnOccluded(EntityUid origin, EntityCoordinates other, return InRangeUnOccluded(originPos, otherPos, range, predicate, ignoreInsideBlocker); } - public static bool InRangeUnOccluded(EntityUid origin, MapCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) + public bool InRangeUnOccluded(EntityUid origin, MapCoordinates other, float range = ExamineRange, Ignored? predicate = null, bool ignoreInsideBlocker = true) { var entMan = IoCManager.Resolve(); var originPos = entMan.GetComponent(origin).MapPosition; diff --git a/Content.Shared/Explosion/ExplosionPrototype.cs b/Content.Shared/Explosion/ExplosionPrototype.cs index 1be3e31939..ec9f2efa1e 100644 --- a/Content.Shared/Explosion/ExplosionPrototype.cs +++ b/Content.Shared/Explosion/ExplosionPrototype.cs @@ -25,6 +25,12 @@ public sealed partial class ExplosionPrototype : IPrototype [DataField("damagePerIntensity", required: true)] public DamageSpecifier DamagePerIntensity = default!; + /// + /// Amount of firestacks to apply in addition to igniting. + /// + [DataField] + public float? FireStacks; + /// /// This set of points, together with define a function that maps the /// explosion intensity to a tile break chance via linear interpolation. diff --git a/Content.Shared/Follower/FollowerSystem.cs b/Content.Shared/Follower/FollowerSystem.cs index 5656778a3f..fc7cccf9bd 100644 --- a/Content.Shared/Follower/FollowerSystem.cs +++ b/Content.Shared/Follower/FollowerSystem.cs @@ -4,8 +4,8 @@ using Content.Shared.Ghost; using Content.Shared.Hands; using Content.Shared.Movement.Events; +using Content.Shared.Movement.Pulling.Events; using Content.Shared.Movement.Systems; -using Content.Shared.Physics.Pull; using Content.Shared.Tag; using Content.Shared.Verbs; using Robust.Shared.Containers; diff --git a/Content.Shared/Friction/TileFrictionController.cs b/Content.Shared/Friction/TileFrictionController.cs index ba4d9fc24f..3583947ee3 100644 --- a/Content.Shared/Friction/TileFrictionController.cs +++ b/Content.Shared/Friction/TileFrictionController.cs @@ -2,8 +2,8 @@ using Content.Shared.CCVar; using Content.Shared.Gravity; using Content.Shared.Movement.Events; +using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Systems; -using Content.Shared.Pulling.Components; using JetBrains.Annotations; using Robust.Shared.Configuration; using Robust.Shared.Map; @@ -23,6 +23,12 @@ public sealed class TileFrictionController : VirtualController [Dependency] private readonly SharedMoverController _mover = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; + private EntityQuery _frictionQuery; + private EntityQuery _xformQuery; + private EntityQuery _pullerQuery; + private EntityQuery _pullableQuery; + private EntityQuery _gridQuery; + private float _stopSpeed; private float _frictionModifier; public const float DefaultFriction = 0.3f; @@ -33,18 +39,17 @@ public override void Initialize() Subs.CVar(_configManager, CCVars.TileFrictionModifier, value => _frictionModifier = value, true); Subs.CVar(_configManager, CCVars.StopSpeed, value => _stopSpeed = value, true); + _frictionQuery = GetEntityQuery(); + _xformQuery = GetEntityQuery(); + _pullerQuery = GetEntityQuery(); + _pullableQuery = GetEntityQuery(); + _gridQuery = GetEntityQuery(); } public override void UpdateBeforeMapSolve(bool prediction, PhysicsMapComponent mapComponent, float frameTime) { base.UpdateBeforeMapSolve(prediction, mapComponent, frameTime); - var frictionQuery = GetEntityQuery(); - var xformQuery = GetEntityQuery(); - var pullerQuery = GetEntityQuery(); - var pullableQuery = GetEntityQuery(); - var gridQuery = GetEntityQuery(); - foreach (var body in mapComponent.AwakeBodies) { var uid = body.Owner; @@ -60,16 +65,16 @@ public override void UpdateBeforeMapSolve(bool prediction, PhysicsMapComponent m if (body.LinearVelocity.Equals(Vector2.Zero) && body.AngularVelocity.Equals(0f)) continue; - if (!xformQuery.TryGetComponent(uid, out var xform)) + if (!_xformQuery.TryGetComponent(uid, out var xform)) { Log.Error($"Unable to get transform for {ToPrettyString(uid)} in tilefrictioncontroller"); continue; } - var surfaceFriction = GetTileFriction(uid, body, xform, gridQuery, frictionQuery); + var surfaceFriction = GetTileFriction(uid, body, xform); var bodyModifier = 1f; - if (frictionQuery.TryGetComponent(uid, out var frictionComp)) + if (_frictionQuery.TryGetComponent(uid, out var frictionComp)) { bodyModifier = frictionComp.Modifier; } @@ -82,8 +87,8 @@ public override void UpdateBeforeMapSolve(bool prediction, PhysicsMapComponent m // If we're sandwiched between 2 pullers reduce friction // Might be better to make this dynamic and check how many are in the pull chain? // Either way should be much faster for now. - if (pullerQuery.TryGetComponent(uid, out var puller) && puller.Pulling != null && - pullableQuery.TryGetComponent(uid, out var pullable) && pullable.BeingPulled) + if (_pullerQuery.TryGetComponent(uid, out var puller) && puller.Pulling != null && + _pullableQuery.TryGetComponent(uid, out var pullable) && pullable.BeingPulled) { bodyModifier *= 0.2f; } @@ -163,9 +168,7 @@ private void ReduceAngularVelocity(EntityUid uid, bool prediction, PhysicsCompon private float GetTileFriction( EntityUid uid, PhysicsComponent body, - TransformComponent xform, - EntityQuery gridQuery, - EntityQuery frictionQuery) + TransformComponent xform) { // TODO: Make IsWeightless event-based; we already have grid traversals tracked so just raise events if (_gravity.IsWeightless(uid, body, xform)) @@ -175,9 +178,9 @@ private float GetTileFriction( return 0.0f; // If not on a grid then return the map's friction. - if (!gridQuery.TryGetComponent(xform.GridUid, out var grid)) + if (!_gridQuery.TryGetComponent(xform.GridUid, out var grid)) { - return frictionQuery.TryGetComponent(xform.MapUid, out var friction) + return _frictionQuery.TryGetComponent(xform.MapUid, out var friction) ? friction.Modifier : DefaultFriction; } @@ -197,7 +200,7 @@ private float GetTileFriction( while (anc.MoveNext(out var tileEnt)) { - if (frictionQuery.TryGetComponent(tileEnt, out var friction)) + if (_frictionQuery.TryGetComponent(tileEnt, out var friction)) return friction.Modifier; } diff --git a/Content.Shared/Friends/Components/PettableFriendComponent.cs b/Content.Shared/Friends/Components/PettableFriendComponent.cs new file mode 100644 index 0000000000..d05e1769ae --- /dev/null +++ b/Content.Shared/Friends/Components/PettableFriendComponent.cs @@ -0,0 +1,24 @@ +using Content.Shared.Friends.Systems; +using Robust.Shared.GameStates; + +namespace Content.Shared.Friends.Components; + +/// +/// Pet something to become friends with it (use in hand, press Z) +/// Requires this entity to have FactionExceptionComponent to work. +/// +[RegisterComponent, NetworkedComponent, Access(typeof(PettableFriendSystem))] +public sealed partial class PettableFriendComponent : Component +{ + /// + /// Localized popup sent when petting for the first time + /// + [DataField(required: true)] + public LocId SuccessString = string.Empty; + + /// + /// Localized popup sent when petting multiple times + /// + [DataField(required: true)] + public LocId FailureString = string.Empty; +} diff --git a/Content.Shared/Friends/Systems/PettableFriendSystem.cs b/Content.Shared/Friends/Systems/PettableFriendSystem.cs new file mode 100644 index 0000000000..00a4ddd155 --- /dev/null +++ b/Content.Shared/Friends/Systems/PettableFriendSystem.cs @@ -0,0 +1,62 @@ +using Content.Shared.Chemistry.Components; +using Content.Shared.Friends.Components; +using Content.Shared.Interaction.Events; +using Content.Shared.NPC.Components; +using Content.Shared.NPC.Systems; +using Content.Shared.Popups; +using Content.Shared.Timing; + +namespace Content.Shared.Friends.Systems; + +public sealed class PettableFriendSystem : EntitySystem +{ + [Dependency] private readonly NpcFactionSystem _factionException = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly UseDelaySystem _useDelay = default!; + + private EntityQuery _exceptionQuery; + private EntityQuery _useDelayQuery; + + public override void Initialize() + { + base.Initialize(); + + _exceptionQuery = GetEntityQuery(); + _useDelayQuery = GetEntityQuery(); + + SubscribeLocalEvent(OnUseInHand); + SubscribeLocalEvent(OnRehydrated); + } + + private void OnUseInHand(Entity ent, ref UseInHandEvent args) + { + var (uid, comp) = ent; + var user = args.User; + if (args.Handled || !_exceptionQuery.TryGetComponent(uid, out var exceptionComp)) + return; + + if (_useDelayQuery.TryGetComponent(uid, out var useDelay) && !_useDelay.TryResetDelay((uid, useDelay), true)) + return; + + var exception = (uid, exceptionComp); + if (_factionException.IsIgnored(exception, user)) + { + _popup.PopupClient(Loc.GetString(comp.FailureString, ("target", uid)), user, user); + return; + } + + // you have made a new friend :) + _popup.PopupClient(Loc.GetString(comp.SuccessString, ("target", uid)), user, user); + _factionException.IgnoreEntity(exception, user); + args.Handled = true; + } + + private void OnRehydrated(Entity ent, ref GotRehydratedEvent args) + { + // can only pet before hydrating, after that the fish cannot be negotiated with + if (!TryComp(ent, out var comp)) + return; + + _factionException.IgnoreEntities(args.Target, comp.Ignored); + } +} diff --git a/Content.Shared/Interaction/Events/InteractionAttemptEvent.cs b/Content.Shared/Interaction/Events/InteractionAttemptEvent.cs index 46dfd20c34..0024811c36 100644 --- a/Content.Shared/Interaction/Events/InteractionAttemptEvent.cs +++ b/Content.Shared/Interaction/Events/InteractionAttemptEvent.cs @@ -15,6 +15,14 @@ public InteractionAttemptEvent(EntityUid uid, EntityUid? target) public EntityUid? Target { get; } } + /// + /// Raised to determine whether an entity is conscious to perform an action. + /// + public sealed class ConsciousAttemptEvent(EntityUid Uid) : CancellableEntityEventArgs + { + public EntityUid Uid { get; } = Uid; + } + /// /// Event raised directed at the target entity of an interaction to see if the user is allowed to perform some /// generic interaction. diff --git a/Content.Shared/Interaction/RotateToFaceSystem.cs b/Content.Shared/Interaction/RotateToFaceSystem.cs index 01dc572a73..ed950240af 100644 --- a/Content.Shared/Interaction/RotateToFaceSystem.cs +++ b/Content.Shared/Interaction/RotateToFaceSystem.cs @@ -80,14 +80,8 @@ public bool TryFaceCoordinates(EntityUid user, Vector2 coordinates, TransformCom public bool TryFaceAngle(EntityUid user, Angle diffAngle, TransformComponent? xform = null) { - if (_actionBlockerSystem.CanChangeDirection(user)) - { - if (!Resolve(user, ref xform)) - return false; - - _transform.SetWorldRotation(xform, diffAngle); - return true; - } + if (!_actionBlockerSystem.CanChangeDirection(user)) + return false; if (EntityManager.TryGetComponent(user, out BuckleComponent? buckle) && buckle.Buckled) { @@ -105,9 +99,16 @@ public bool TryFaceAngle(EntityUid user, Angle diffAngle, TransformComponent? xf return true; } } + + return false; } - return false; + // user is not buckled in; apply to their transform + if (!Resolve(user, ref xform)) + return false; + + _transform.SetWorldRotation(xform, diffAngle); + return true; } } } diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 7d5e390b6f..7c85ede9b0 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -15,10 +15,10 @@ using Content.Shared.Inventory.Events; using Content.Shared.Item; using Content.Shared.Movement.Components; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Physics; using Content.Shared.Popups; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; using Content.Shared.Tag; using Content.Shared.Timing; using Content.Shared.Verbs; @@ -60,7 +60,7 @@ public abstract partial class SharedInteractionSystem : EntitySystem [Dependency] private readonly SharedVerbSystem _verbSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly UseDelaySystem _useDelay = default!; - [Dependency] private readonly SharedPullingSystem _pullSystem = default!; + [Dependency] private readonly PullingSystem _pullSystem = default!; [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly TagSystem _tagSystem = default!; @@ -185,10 +185,10 @@ private bool HandleTryPullObject(ICommonSession? session, EntityCoordinates coor if (!InRangeUnobstructed(userEntity.Value, uid, popup: true)) return false; - if (!TryComp(uid, out SharedPullableComponent? pull)) + if (!TryComp(uid, out PullableComponent? pull)) return false; - _pullSystem.TogglePull(userEntity.Value, pull); + _pullSystem.TogglePull(uid, userEntity.Value, pull); return false; } diff --git a/Content.Shared/Inventory/InventorySystem.Equip.cs b/Content.Shared/Inventory/InventorySystem.Equip.cs index 15a5ba03d3..a2f87d34c6 100644 --- a/Content.Shared/Inventory/InventorySystem.Equip.cs +++ b/Content.Shared/Inventory/InventorySystem.Equip.cs @@ -165,8 +165,7 @@ public bool TryEquip(EntityUid actor, EntityUid target, EntityUid itemUid, strin { BlockDuplicate = true, BreakOnHandChange = true, - BreakOnUserMove = true, - BreakOnTargetMove = true, + BreakOnMove = true, CancelDuplicate = true, RequireCanInteract = true, NeedHand = true @@ -409,8 +408,7 @@ public bool TryUnequip( { BlockDuplicate = true, BreakOnHandChange = true, - BreakOnUserMove = true, - BreakOnTargetMove = true, + BreakOnMove = true, CancelDuplicate = true, RequireCanInteract = true, NeedHand = true diff --git a/Content.Shared/Inventory/InventoryTemplatePrototype.cs b/Content.Shared/Inventory/InventoryTemplatePrototype.cs index a477969962..585f80d4ce 100644 --- a/Content.Shared/Inventory/InventoryTemplatePrototype.cs +++ b/Content.Shared/Inventory/InventoryTemplatePrototype.cs @@ -20,7 +20,7 @@ public sealed partial class SlotDefinition [DataField("slotFlags")] public SlotFlags SlotFlags { get; private set; } = SlotFlags.PREVENTEQUIP; [DataField("showInWindow")] public bool ShowInWindow { get; private set; } = true; [DataField("slotGroup")] public string SlotGroup { get; private set; } = "Default"; - [DataField("stripTime")] public float StripTime { get; private set; } = 4f; + [DataField("stripTime")] public TimeSpan StripTime { get; private set; } = TimeSpan.FromSeconds(4f); [DataField("uiWindowPos", required: true)] public Vector2i UIWindowPosition { get; private set; } diff --git a/Content.Shared/Lock/LockSystem.cs b/Content.Shared/Lock/LockSystem.cs index 53c199e410..74cf5496d9 100644 --- a/Content.Shared/Lock/LockSystem.cs +++ b/Content.Shared/Lock/LockSystem.cs @@ -111,7 +111,7 @@ public bool TryLock(EntityUid uid, EntityUid user, LockComponent? lockComp = nul return _doAfter.TryStartDoAfter( new DoAfterArgs(EntityManager, user, lockComp.LockTime, new LockDoAfter(), uid, uid) { - BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = true, RequireCanInteract = true, + BreakOnDamage = true, BreakOnMove = true, RequireCanInteract = true, NeedHand = true }); } @@ -187,7 +187,7 @@ public bool TryUnlock(EntityUid uid, EntityUid user, LockComponent? lockComp = n return _doAfter.TryStartDoAfter( new DoAfterArgs(EntityManager, user, lockComp.LockTime, new UnlockDoAfter(), uid, uid) { - BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = true, RequireCanInteract = true, + BreakOnDamage = true, BreakOnMove = true, RequireCanInteract = true, NeedHand = true }); } diff --git a/Content.Shared/Materials/SharedMaterialReclaimerSystem.cs b/Content.Shared/Materials/SharedMaterialReclaimerSystem.cs index ad8547acc0..fb1702bb94 100644 --- a/Content.Shared/Materials/SharedMaterialReclaimerSystem.cs +++ b/Content.Shared/Materials/SharedMaterialReclaimerSystem.cs @@ -1,7 +1,8 @@ -using System.Linq; +using System.Linq; using Content.Shared.Administration.Logs; using Content.Shared.Audio; using Content.Shared.Body.Components; +using Content.Shared.Coordinates; using Content.Shared.Database; using Content.Shared.Emag.Components; using Content.Shared.Emag.Systems; @@ -11,6 +12,7 @@ using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; +using Robust.Shared.Map; using Robust.Shared.Physics.Events; using Robust.Shared.Timing; @@ -110,6 +112,9 @@ public bool TryStartProcessItem(EntityUid uid, EntityUid item, MaterialReclaimer component.NextSound = Timing.CurTime + component.SoundCooldown; } + var reclaimedEvent = new GotReclaimedEvent(Transform(uid).Coordinates); + RaiseLocalEvent(item, ref reclaimedEvent); + var duration = GetReclaimingDuration(uid, item, component); // if it's instant, don't bother with all the active comp stuff. if (duration == TimeSpan.Zero) @@ -237,3 +242,6 @@ public override void Update(float frameTime) } } } + +[ByRefEvent] +public record struct GotReclaimedEvent(EntityCoordinates ReclaimerCoordinates); diff --git a/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs b/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs index 7e44dea507..df0d7b78f0 100644 --- a/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs +++ b/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs @@ -434,7 +434,7 @@ private void OnDragDrop(EntityUid uid, MechComponent component, ref DragDropTarg var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Dragged, component.EntryDelay, new MechEntryEvent(), uid, target: uid) { - BreakOnUserMove = true, + BreakOnMove = true, }; _doAfter.TryStartDoAfter(doAfterEventArgs); diff --git a/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs b/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs index 5199133253..0c2fcc0579 100644 --- a/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs +++ b/Content.Shared/Mobs/Systems/MobStateSystem.Subscribers.cs @@ -28,7 +28,7 @@ private void SubscribeEvents() SubscribeLocalEvent(CheckAct); SubscribeLocalEvent(CheckAct); SubscribeLocalEvent(CheckAct); - SubscribeLocalEvent(CheckAct); + SubscribeLocalEvent(CheckAct); SubscribeLocalEvent(CheckAct); SubscribeLocalEvent(OnSpeakAttempt); SubscribeLocalEvent(OnEquipAttempt); diff --git a/Content.Shared/Movement/Components/SlowedByContactComponent.cs b/Content.Shared/Movement/Components/SpeedModifiedByContactComponent.cs similarity index 80% rename from Content.Shared/Movement/Components/SlowedByContactComponent.cs rename to Content.Shared/Movement/Components/SpeedModifiedByContactComponent.cs index eafefefee1..4f791e13ca 100644 --- a/Content.Shared/Movement/Components/SlowedByContactComponent.cs +++ b/Content.Shared/Movement/Components/SpeedModifiedByContactComponent.cs @@ -7,6 +7,6 @@ namespace Content.Shared.Movement.Components; /// Exists just to listen to a single event. What a life. /// [NetworkedComponent, RegisterComponent] // must be networked to properly predict adding & removal -public sealed partial class SlowedByContactComponent : Component +public sealed partial class SpeedModifiedByContactComponent : Component { } diff --git a/Content.Shared/Movement/Components/SlowContactsComponent.cs b/Content.Shared/Movement/Components/SpeedModifierContactsComponent.cs similarity index 83% rename from Content.Shared/Movement/Components/SlowContactsComponent.cs rename to Content.Shared/Movement/Components/SpeedModifierContactsComponent.cs index 00cbc55d19..73bb0690fd 100644 --- a/Content.Shared/Movement/Components/SlowContactsComponent.cs +++ b/Content.Shared/Movement/Components/SpeedModifierContactsComponent.cs @@ -6,8 +6,8 @@ namespace Content.Shared.Movement.Components; [NetworkedComponent, RegisterComponent] [AutoGenerateComponentState] -[Access(typeof(SlowContactsSystem))] -public sealed partial class SlowContactsComponent : Component +[Access(typeof(SpeedModifierContactsSystem))] +public sealed partial class SpeedModifierContactsComponent : Component { [DataField("walkSpeedModifier"), ViewVariables(VVAccess.ReadWrite)] [AutoNetworkedField] diff --git a/Content.Shared/Movement/Pulling/Components/PullableComponent.cs b/Content.Shared/Movement/Pulling/Components/PullableComponent.cs new file mode 100644 index 0000000000..db889e7e3b --- /dev/null +++ b/Content.Shared/Movement/Pulling/Components/PullableComponent.cs @@ -0,0 +1,39 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Movement.Pulling.Components; + +/// +/// Specifies an entity as being pullable by an entity with +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(Systems.PullingSystem))] +public sealed partial class PullableComponent : Component +{ + /// + /// The current entity pulling this component. + /// + [AutoNetworkedField, DataField] + public EntityUid? Puller; + + /// + /// The pull joint. + /// + [AutoNetworkedField, DataField] + public string? PullJointId; + + public bool BeingPulled => Puller != null; + + /// + /// If the physics component has FixedRotation should we keep it upon being pulled + /// + [Access(typeof(Systems.PullingSystem), Other = AccessPermissions.ReadExecute)] + [ViewVariables(VVAccess.ReadWrite), DataField("fixedRotation")] + public bool FixedRotationOnPull; + + /// + /// What the pullable's fixedrotation was set to before being pulled. + /// + [Access(typeof(Systems.PullingSystem), Other = AccessPermissions.ReadExecute)] + [AutoNetworkedField, DataField] + public bool PrevFixedRotation; +} diff --git a/Content.Shared/Movement/Pulling/Components/PullerComponent.cs b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs new file mode 100644 index 0000000000..1fc9b731bd --- /dev/null +++ b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs @@ -0,0 +1,41 @@ +using Content.Shared.Movement.Pulling.Systems; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Movement.Pulling.Components; + +/// +/// Specifies an entity as being able to pull another entity with +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(PullingSystem))] +public sealed partial class PullerComponent : Component +{ + // My raiding guild + /// + /// Next time the puller can throw what is being pulled. + /// Used to avoid spamming it for infinite spin + velocity. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] + public TimeSpan NextThrow; + + [DataField] + public TimeSpan ThrowCooldown = TimeSpan.FromSeconds(1); + + // Before changing how this is updated, please see SharedPullerSystem.RefreshMovementSpeed + public float WalkSpeedModifier => Pulling == default ? 1.0f : 0.95f; + + public float SprintSpeedModifier => Pulling == default ? 1.0f : 0.95f; + + /// + /// Entity currently being pulled if applicable. + /// + [AutoNetworkedField, DataField] + public EntityUid? Pulling; + + /// + /// Does this entity need hands to be able to pull something? + /// + [DataField] + public bool NeedsHands = true; +} diff --git a/Content.Shared/Movement/Pulling/Events/AttemptPullEvent.cs b/Content.Shared/Movement/Pulling/Events/AttemptPullEvent.cs new file mode 100644 index 0000000000..b0101c4699 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/AttemptPullEvent.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Physics.Components; + +namespace Content.Shared.Movement.Pulling.Events; + +/// +/// Raised directed on puller and pullable to determine if it can be pulled. +/// +public sealed class PullAttemptEvent : PullMessage +{ + public PullAttemptEvent(EntityUid pullerUid, EntityUid pullableUid) : base(pullerUid, pullableUid) { } + + public bool Cancelled { get; set; } +} diff --git a/Content.Shared/Movement/Pulling/Events/AttemptStopPullingEvent.cs b/Content.Shared/Movement/Pulling/Events/AttemptStopPullingEvent.cs new file mode 100644 index 0000000000..cd7edc5f62 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/AttemptStopPullingEvent.cs @@ -0,0 +1,10 @@ +namespace Content.Shared.Pulling.Events; + +/// +/// Raised when a request is made to stop pulling an entity. +/// +public record struct AttemptStopPullingEvent(EntityUid? User = null) +{ + public readonly EntityUid? User = User; + public bool Cancelled; +} \ No newline at end of file diff --git a/Content.Shared/Pulling/Events/BeingPulledAttemptEvent.cs b/Content.Shared/Movement/Pulling/Events/BeingPulledAttemptEvent.cs similarity index 100% rename from Content.Shared/Pulling/Events/BeingPulledAttemptEvent.cs rename to Content.Shared/Movement/Pulling/Events/BeingPulledAttemptEvent.cs diff --git a/Content.Shared/Movement/Pulling/Events/PullMessage.cs b/Content.Shared/Movement/Pulling/Events/PullMessage.cs new file mode 100644 index 0000000000..a427e448d5 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/PullMessage.cs @@ -0,0 +1,13 @@ +namespace Content.Shared.Movement.Pulling.Events; + +public abstract class PullMessage : EntityEventArgs +{ + public readonly EntityUid PullerUid; + public readonly EntityUid PulledUid; + + protected PullMessage(EntityUid pullerUid, EntityUid pulledUid) + { + PullerUid = pullerUid; + PulledUid = pulledUid; + } +} diff --git a/Content.Shared/Movement/Pulling/Events/PullStartedMessage.cs b/Content.Shared/Movement/Pulling/Events/PullStartedMessage.cs new file mode 100644 index 0000000000..29460e1dfc --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/PullStartedMessage.cs @@ -0,0 +1,9 @@ +namespace Content.Shared.Movement.Pulling.Events; + +public sealed class PullStartedMessage : PullMessage +{ + public PullStartedMessage(EntityUid pullerUid, EntityUid pullableUid) : + base(pullerUid, pullableUid) + { + } +} diff --git a/Content.Shared/Movement/Pulling/Events/PullStoppedMessage.cs b/Content.Shared/Movement/Pulling/Events/PullStoppedMessage.cs new file mode 100644 index 0000000000..47aa34562f --- /dev/null +++ b/Content.Shared/Movement/Pulling/Events/PullStoppedMessage.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Physics.Components; + +namespace Content.Shared.Movement.Pulling.Events; + +/// +/// Raised directed on both puller and pullable. +/// +public sealed class PullStoppedMessage : PullMessage +{ + public PullStoppedMessage(EntityUid pullerUid, EntityUid pulledUid) : base(pullerUid, pulledUid) + { + } +} diff --git a/Content.Shared/Pulling/Events/StartPullAttemptEvent.cs b/Content.Shared/Movement/Pulling/Events/StartPullAttemptEvent.cs similarity index 100% rename from Content.Shared/Pulling/Events/StartPullAttemptEvent.cs rename to Content.Shared/Movement/Pulling/Events/StartPullAttemptEvent.cs diff --git a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs new file mode 100644 index 0000000000..33794ba169 --- /dev/null +++ b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs @@ -0,0 +1,492 @@ +using System.Numerics; +using Content.Shared.ActionBlocker; +using Content.Shared.Administration.Logs; +using Content.Shared.Alert; +using Content.Shared.Buckle.Components; +using Content.Shared.Database; +using Content.Shared.Hands; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Input; +using Content.Shared.Interaction; +using Content.Shared.Movement.Events; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Movement.Systems; +using Content.Shared.Pulling.Events; +using Content.Shared.Throwing; +using Content.Shared.Verbs; +using Robust.Shared.Containers; +using Robust.Shared.Input.Binding; +using Robust.Shared.Map; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Events; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Player; +using Robust.Shared.Timing; + +namespace Content.Shared.Movement.Pulling.Systems; + +/// +/// Allows one entity to pull another behind them via a physics distance joint. +/// +public sealed class PullingSystem : EntitySystem +{ + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly ActionBlockerSystem _blocker = default!; + [Dependency] private readonly AlertsSystem _alertsSystem = default!; + [Dependency] private readonly MovementSpeedModifierSystem _modifierSystem = default!; + [Dependency] private readonly SharedJointSystem _joints = default!; + [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + [Dependency] private readonly SharedInteractionSystem _interaction = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly SharedTransformSystem _xformSys = default!; + [Dependency] private readonly ThrowingSystem _throwing = default!; + + public override void Initialize() + { + base.Initialize(); + + UpdatesAfter.Add(typeof(SharedPhysicsSystem)); + UpdatesOutsidePrediction = true; + + SubscribeLocalEvent(OnPullableMoveInput); + SubscribeLocalEvent(OnPullableCollisionChange); + SubscribeLocalEvent(OnJointRemoved); + SubscribeLocalEvent>(AddPullVerbs); + SubscribeLocalEvent(OnPullableContainerInsert); + + SubscribeLocalEvent(OnPullerContainerInsert); + SubscribeLocalEvent(OnPullerUnpaused); + SubscribeLocalEvent(OnVirtualItemDeleted); + SubscribeLocalEvent(OnRefreshMovespeed); + + CommandBinds.Builder + .Bind(ContentKeyFunctions.MovePulledObject, new PointerInputCmdHandler(OnRequestMovePulledObject)) + .Bind(ContentKeyFunctions.ReleasePulledObject, InputCmdHandler.FromDelegate(OnReleasePulledObject, handle: false)) + .Register(); + } + + private void OnPullerContainerInsert(Entity ent, ref EntGotInsertedIntoContainerMessage args) + { + if (ent.Comp.Pulling == null) return; + + if (!TryComp(ent.Comp.Pulling.Value, out PullableComponent? pulling)) + return; + + TryStopPull(ent.Comp.Pulling.Value, pulling, ent.Owner); + } + + private void OnPullableContainerInsert(Entity ent, ref EntGotInsertedIntoContainerMessage args) + { + TryStopPull(ent.Owner, ent.Comp); + } + + public override void Shutdown() + { + base.Shutdown(); + CommandBinds.Unregister(); + } + + private void OnPullerUnpaused(EntityUid uid, PullerComponent component, ref EntityUnpausedEvent args) + { + component.NextThrow += args.PausedTime; + } + + private void OnVirtualItemDeleted(EntityUid uid, PullerComponent component, VirtualItemDeletedEvent args) + { + // If client deletes the virtual hand then stop the pull. + if (component.Pulling == null) + return; + + if (component.Pulling != args.BlockingEntity) + return; + + if (EntityManager.TryGetComponent(args.BlockingEntity, out PullableComponent? comp)) + { + TryStopPull(args.BlockingEntity, comp, uid); + } + } + + private void AddPullVerbs(EntityUid uid, PullableComponent component, GetVerbsEvent args) + { + if (!args.CanAccess || !args.CanInteract) + return; + + // Are they trying to pull themselves up by their bootstraps? + if (args.User == args.Target) + return; + + //TODO VERB ICONS add pulling icon + if (component.Puller == args.User) + { + Verb verb = new() + { + Text = Loc.GetString("pulling-verb-get-data-text-stop-pulling"), + Act = () => TryStopPull(uid, component, user: args.User), + DoContactInteraction = false // pulling handle its own contact interaction. + }; + args.Verbs.Add(verb); + } + else if (CanPull(args.User, args.Target)) + { + Verb verb = new() + { + Text = Loc.GetString("pulling-verb-get-data-text"), + Act = () => TryStartPull(args.User, args.Target), + DoContactInteraction = false // pulling handle its own contact interaction. + }; + args.Verbs.Add(verb); + } + } + + private void OnRefreshMovespeed(EntityUid uid, PullerComponent component, RefreshMovementSpeedModifiersEvent args) + { + args.ModifySpeed(component.WalkSpeedModifier, component.SprintSpeedModifier); + } + + private void OnPullableMoveInput(EntityUid uid, PullableComponent component, ref MoveInputEvent args) + { + // If someone moves then break their pulling. + if (!component.BeingPulled) + return; + + var entity = args.Entity; + + if (!_blocker.CanMove(entity)) + return; + + TryStopPull(uid, component, user: uid); + } + + private void OnPullableCollisionChange(EntityUid uid, PullableComponent component, ref CollisionChangeEvent args) + { + // IDK what this is supposed to be. + if (!_timing.ApplyingState && component.PullJointId != null && !args.CanCollide) + { + _joints.RemoveJoint(uid, component.PullJointId); + } + } + + private void OnJointRemoved(EntityUid uid, PullableComponent component, JointRemovedEvent args) + { + // Just handles the joint getting nuked without going through pulling system (valid behavior). + + // Not relevant / pullable state handle it. + if (component.Puller != args.OtherEntity || + args.Joint.ID != component.PullJointId || + _timing.ApplyingState) + { + return; + } + + if (args.Joint.ID != component.PullJointId || component.Puller == null) + return; + + StopPulling(uid, component); + } + + /// + /// Forces pulling to stop and handles cleanup. + /// + private void StopPulling(EntityUid pullableUid, PullableComponent pullableComp) + { + if (!_timing.ApplyingState) + { + if (TryComp(pullableUid, out var pullablePhysics)) + { + _physics.SetFixedRotation(pullableUid, pullableComp.PrevFixedRotation, body: pullablePhysics); + } + } + + // No more joints with puller -> force stop pull. + if (TryComp(pullableComp.Puller, out var pullerComp)) + { + var pullerUid = pullableComp.Puller.Value; + _alertsSystem.ClearAlert(pullerUid, AlertType.Pulling); + pullerComp.Pulling = null; + Dirty(pullableComp.Puller.Value, pullerComp); + + // Messaging + var message = new PullStoppedMessage(pullerUid, pullableUid); + _modifierSystem.RefreshMovementSpeedModifiers(pullerUid); + _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(pullerUid):user} stopped pulling {ToPrettyString(pullableUid):target}"); + + RaiseLocalEvent(pullerUid, message); + RaiseLocalEvent(pullableUid, message); + } + + pullableComp.PullJointId = null; + pullableComp.Puller = null; + Dirty(pullableUid, pullableComp); + + _alertsSystem.ClearAlert(pullableUid, AlertType.Pulled); + } + + public bool IsPulled(EntityUid uid, PullableComponent? component = null) + { + return Resolve(uid, ref component, false) && component.BeingPulled; + } + + private bool OnRequestMovePulledObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid) + { + if (session?.AttachedEntity is not { } player || + !player.IsValid()) + { + return false; + } + + if (!TryComp(player, out var pullerComp)) + return false; + + var pulled = pullerComp.Pulling; + + if (!HasComp(pulled)) + return false; + + if (_containerSystem.IsEntityInContainer(player)) + return false; + + // Cooldown buddy + if (_timing.CurTime < pullerComp.NextThrow) + return false; + + pullerComp.NextThrow = _timing.CurTime + pullerComp.ThrowCooldown; + + // Cap the distance + const float range = 2f; + var fromUserCoords = coords.WithEntityId(player, EntityManager); + var userCoords = new EntityCoordinates(player, Vector2.Zero); + + if (!userCoords.InRange(EntityManager, _xformSys, fromUserCoords, range)) + { + var userDirection = fromUserCoords.Position - userCoords.Position; + fromUserCoords = userCoords.Offset(userDirection.Normalized() * range); + } + + Dirty(player, pullerComp); + _throwing.TryThrow(pulled.Value, fromUserCoords, user: player, strength: 4f, animated: false, recoil: false, playSound: false); + return false; + } + + public bool IsPulling(EntityUid puller, PullerComponent? component = null) + { + return Resolve(puller, ref component, false) && component.Pulling != null; + } + + private void OnReleasePulledObject(ICommonSession? session) + { + if (session?.AttachedEntity is not {Valid: true} player) + { + return; + } + + if (!TryComp(player, out PullerComponent? pullerComp) || + !TryComp(pullerComp.Pulling, out PullableComponent? pullableComp)) + { + return; + } + + TryStopPull(pullerComp.Pulling.Value, pullableComp, user: player); + } + + public bool CanPull(EntityUid puller, EntityUid pullableUid, PullerComponent? pullerComp = null) + { + if (!Resolve(puller, ref pullerComp, false)) + { + return false; + } + + if (pullerComp.NeedsHands && !_handsSystem.TryGetEmptyHand(puller, out _)) + { + return false; + } + + if (!_blocker.CanInteract(puller, pullableUid)) + { + return false; + } + + if (!EntityManager.TryGetComponent(pullableUid, out var physics)) + { + return false; + } + + if (physics.BodyType == BodyType.Static) + { + return false; + } + + if (puller == pullableUid) + { + return false; + } + + if (!_containerSystem.IsInSameOrNoContainer(puller, pullableUid)) + { + return false; + } + + if (EntityManager.TryGetComponent(puller, out BuckleComponent? buckle)) + { + // Prevent people pulling the chair they're on, etc. + if (buckle is { PullStrap: false, Buckled: true } && (buckle.LastEntityBuckledTo == pullableUid)) + { + return false; + } + } + + var getPulled = new BeingPulledAttemptEvent(puller, pullableUid); + RaiseLocalEvent(pullableUid, getPulled, true); + var startPull = new StartPullAttemptEvent(puller, pullableUid); + RaiseLocalEvent(puller, startPull, true); + return !startPull.Cancelled && !getPulled.Cancelled; + } + + public bool TogglePull(EntityUid pullableUid, EntityUid pullerUid, PullableComponent pullable) + { + if (pullable.Puller == pullerUid) + { + return TryStopPull(pullableUid, pullable); + } + + return TryStartPull(pullerUid, pullableUid, pullableComp: pullable); + } + + public bool TogglePull(EntityUid pullerUid, PullerComponent puller) + { + if (!TryComp(puller.Pulling, out var pullable)) + return false; + + return TogglePull(puller.Pulling.Value, pullerUid, pullable); + } + + public bool TryStartPull(EntityUid pullerUid, EntityUid pullableUid, EntityUid? user = null, + PullerComponent? pullerComp = null, PullableComponent? pullableComp = null) + { + if (!Resolve(pullerUid, ref pullerComp, false) || + !Resolve(pullableUid, ref pullableComp, false)) + { + return false; + } + + if (pullerComp.Pulling == pullableUid) + return true; + + if (!CanPull(pullerUid, pullableUid)) + return false; + + if (!EntityManager.TryGetComponent(pullerUid, out var pullerPhysics) || + !EntityManager.TryGetComponent(pullableUid, out var pullablePhysics)) + { + return false; + } + + // Ensure that the puller is not currently pulling anything. + var oldPullable = pullerComp.Pulling; + + if (oldPullable != null) + { + // Well couldn't stop the old one. + if (!TryStopPull(oldPullable.Value, pullableComp, user)) + return false; + } + + // Is the pullable currently being pulled by something else? + if (pullableComp.Puller != null) + { + // Uhhh + if (pullableComp.Puller == pullerUid) + return false; + + if (!TryStopPull(pullableUid, pullableComp, pullerUid)) + return false; + } + + var pullAttempt = new PullAttemptEvent(pullerUid, pullableUid); + RaiseLocalEvent(pullerUid, pullAttempt); + + if (pullAttempt.Cancelled) + return false; + + RaiseLocalEvent(pullableUid, pullAttempt); + + if (pullAttempt.Cancelled) + return false; + + // Pulling confirmed + + _interaction.DoContactInteraction(pullableUid, pullerUid); + + // Use net entity so it's consistent across client and server. + pullableComp.PullJointId = $"pull-joint-{GetNetEntity(pullableUid)}"; + + pullerComp.Pulling = pullableUid; + pullableComp.Puller = pullerUid; + + // joint state handling will manage its own state + if (!_timing.ApplyingState) + { + // Joint startup + var union = _physics.GetHardAABB(pullerUid).Union(_physics.GetHardAABB(pullableUid, body: pullablePhysics)); + var length = Math.Max((float) union.Size.X, (float) union.Size.Y) * 0.75f; + + var joint = _joints.CreateDistanceJoint(pullableUid, pullerUid, id: pullableComp.PullJointId); + joint.CollideConnected = false; + // This maximum has to be there because if the object is constrained too closely, the clamping goes backwards and asserts. + joint.MaxLength = Math.Max(1.0f, length); + joint.Length = length * 0.75f; + joint.MinLength = 0f; + joint.Stiffness = 1f; + + _physics.SetFixedRotation(pullableUid, pullableComp.FixedRotationOnPull, body: pullablePhysics); + } + + pullableComp.PrevFixedRotation = pullablePhysics.FixedRotation; + + // Messaging + var message = new PullStartedMessage(pullerUid, pullableUid); + _alertsSystem.ShowAlert(pullerUid, AlertType.Pulling); + _alertsSystem.ShowAlert(pullableUid, AlertType.Pulled); + + RaiseLocalEvent(pullerUid, message); + RaiseLocalEvent(pullableUid, message); + + Dirty(pullerUid, pullerComp); + Dirty(pullableUid, pullableComp); + + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(pullerUid):user} started pulling {ToPrettyString(pullableUid):target}"); + return true; + } + + public bool TryStopPull(EntityUid pullableUid, PullableComponent pullable, EntityUid? user = null) + { + var pullerUidNull = pullable.Puller; + + if (pullerUidNull == null) + return false; + + var msg = new AttemptStopPullingEvent(user); + RaiseLocalEvent(pullableUid, msg, true); + + if (msg.Cancelled) + return false; + + // Stop pulling confirmed! + if (!_timing.ApplyingState) + { + // Joint shutdown + if (pullable.PullJointId != null) + { + _joints.RemoveJoint(pullableUid, pullable.PullJointId); + pullable.PullJointId = null; + } + } + + StopPulling(pullableUid, pullable); + return true; + } +} diff --git a/Content.Shared/Movement/Systems/FrictionContactsSystem.cs b/Content.Shared/Movement/Systems/FrictionContactsSystem.cs index b104c549e6..b086bc0e05 100644 --- a/Content.Shared/Movement/Systems/FrictionContactsSystem.cs +++ b/Content.Shared/Movement/Systems/FrictionContactsSystem.cs @@ -10,7 +10,7 @@ public sealed class FrictionContactsSystem : EntitySystem [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly MovementSpeedModifierSystem _speedModifierSystem = default!; - // Comment copied from "original" SlowContactsSystem.cs + // Comment copied from "original" SlowContactsSystem.cs (now SpeedModifierContactsSystem.cs) // TODO full-game-save // Either these need to be processed before a map is saved, or slowed/slowing entities need to update on init. private HashSet _toUpdate = new(); diff --git a/Content.Shared/Movement/Systems/SharedMoverController.cs b/Content.Shared/Movement/Systems/SharedMoverController.cs index 2c03507f61..98b898615d 100644 --- a/Content.Shared/Movement/Systems/SharedMoverController.cs +++ b/Content.Shared/Movement/Systems/SharedMoverController.cs @@ -9,7 +9,6 @@ using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Components; using Content.Shared.Movement.Events; -using Content.Shared.Pulling.Components; using Content.Shared.Tag; using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; @@ -23,6 +22,7 @@ using Robust.Shared.Physics.Systems; using Robust.Shared.Timing; using Robust.Shared.Utility; +using PullableComponent = Content.Shared.Movement.Pulling.Components.PullableComponent; namespace Content.Shared.Movement.Systems { @@ -53,7 +53,7 @@ public abstract partial class SharedMoverController : VirtualController protected EntityQuery ModifierQuery; protected EntityQuery PhysicsQuery; protected EntityQuery RelayQuery; - protected EntityQuery PullableQuery; + protected EntityQuery PullableQuery; protected EntityQuery XformQuery; protected EntityQuery CanMoveInAirQuery; protected EntityQuery NoRotateQuery; @@ -85,7 +85,7 @@ public override void Initialize() RelayTargetQuery = GetEntityQuery(); PhysicsQuery = GetEntityQuery(); RelayQuery = GetEntityQuery(); - PullableQuery = GetEntityQuery(); + PullableQuery = GetEntityQuery(); XformQuery = GetEntityQuery(); NoRotateQuery = GetEntityQuery(); CanMoveInAirQuery = GetEntityQuery(); @@ -376,7 +376,7 @@ private bool IsAroundCollider(SharedPhysicsSystem broadPhaseSystem, TransformCom !otherCollider.CanCollide || ((collider.CollisionMask & otherCollider.CollisionLayer) == 0 && (otherCollider.CollisionMask & collider.CollisionLayer) == 0) || - (TryComp(otherCollider.Owner, out SharedPullableComponent? pullable) && pullable.BeingPulled)) + (TryComp(otherCollider.Owner, out PullableComponent? pullable) && pullable.BeingPulled)) { continue; } diff --git a/Content.Shared/Movement/Systems/SlowContactsSystem.cs b/Content.Shared/Movement/Systems/SpeedModifierContactsSystem.cs similarity index 59% rename from Content.Shared/Movement/Systems/SlowContactsSystem.cs rename to Content.Shared/Movement/Systems/SpeedModifierContactsSystem.cs index 1ee145075f..f9f6b82bb1 100644 --- a/Content.Shared/Movement/Systems/SlowContactsSystem.cs +++ b/Content.Shared/Movement/Systems/SpeedModifierContactsSystem.cs @@ -5,7 +5,7 @@ namespace Content.Shared.Movement.Systems; -public sealed class SlowContactsSystem : EntitySystem +public sealed class SpeedModifierContactsSystem : EntitySystem { [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly MovementSpeedModifierSystem _speedModifierSystem = default!; @@ -18,10 +18,10 @@ public sealed class SlowContactsSystem : EntitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnEntityEnter); - SubscribeLocalEvent(OnEntityExit); - SubscribeLocalEvent(MovementSpeedCheck); - SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnEntityEnter); + SubscribeLocalEvent(OnEntityExit); + SubscribeLocalEvent(MovementSpeedCheck); + SubscribeLocalEvent(OnShutdown); UpdatesAfter.Add(typeof(SharedPhysicsSystem)); } @@ -39,18 +39,18 @@ public override void Update(float frameTime) foreach (var ent in _toRemove) { - RemComp(ent); + RemComp(ent); } _toUpdate.Clear(); } - public void ChangeModifiers(EntityUid uid, float speed, SlowContactsComponent? component = null) + public void ChangeModifiers(EntityUid uid, float speed, SpeedModifierContactsComponent? component = null) { ChangeModifiers(uid, speed, speed, component); } - public void ChangeModifiers(EntityUid uid, float walkSpeed, float sprintSpeed, SlowContactsComponent? component = null) + public void ChangeModifiers(EntityUid uid, float walkSpeed, float sprintSpeed, SpeedModifierContactsComponent? component = null) { if (!Resolve(uid, ref component)) { @@ -62,7 +62,7 @@ public void ChangeModifiers(EntityUid uid, float walkSpeed, float sprintSpeed, S _toUpdate.UnionWith(_physics.GetContactingEntities(uid)); } - private void OnShutdown(EntityUid uid, SlowContactsComponent component, ComponentShutdown args) + private void OnShutdown(EntityUid uid, SpeedModifierContactsComponent component, ComponentShutdown args) { if (!TryComp(uid, out PhysicsComponent? phys)) return; @@ -71,48 +71,56 @@ private void OnShutdown(EntityUid uid, SlowContactsComponent component, Componen _toUpdate.UnionWith(_physics.GetContactingEntities(uid, phys)); } - private void MovementSpeedCheck(EntityUid uid, SlowedByContactComponent component, RefreshMovementSpeedModifiersEvent args) + private void MovementSpeedCheck(EntityUid uid, SpeedModifiedByContactComponent component, RefreshMovementSpeedModifiersEvent args) { if (!EntityManager.TryGetComponent(uid, out var physicsComponent)) return; - var walkSpeed = 1.0f; - var sprintSpeed = 1.0f; + var walkSpeed = 0.0f; + var sprintSpeed = 0.0f; bool remove = true; + var entries = 0; foreach (var ent in _physics.GetContactingEntities(uid, physicsComponent)) { - if (!TryComp(ent, out var slowContactsComponent)) + if (!TryComp(ent, out var slowContactsComponent)) continue; if (slowContactsComponent.IgnoreWhitelist != null && slowContactsComponent.IgnoreWhitelist.IsValid(uid)) continue; - walkSpeed = Math.Min(walkSpeed, slowContactsComponent.WalkSpeedModifier); - sprintSpeed = Math.Min(sprintSpeed, slowContactsComponent.SprintSpeedModifier); + walkSpeed += slowContactsComponent.WalkSpeedModifier; + sprintSpeed += slowContactsComponent.SprintSpeedModifier; remove = false; + entries++; } - args.ModifySpeed(walkSpeed, sprintSpeed); + if (entries > 0) + { + walkSpeed /= entries; + sprintSpeed /= entries; + + args.ModifySpeed(walkSpeed, sprintSpeed); + } // no longer colliding with anything if (remove) _toRemove.Add(uid); } - private void OnEntityExit(EntityUid uid, SlowContactsComponent component, ref EndCollideEvent args) + private void OnEntityExit(EntityUid uid, SpeedModifierContactsComponent component, ref EndCollideEvent args) { var otherUid = args.OtherEntity; _toUpdate.Add(otherUid); } - private void OnEntityEnter(EntityUid uid, SlowContactsComponent component, ref StartCollideEvent args) + private void OnEntityEnter(EntityUid uid, SpeedModifierContactsComponent component, ref StartCollideEvent args) { var otherUid = args.OtherEntity; if (!HasComp(otherUid)) return; - EnsureComp(otherUid); + EnsureComp(otherUid); _toUpdate.Add(otherUid); } } diff --git a/Content.Server/NPC/Components/FactionExceptionComponent.cs b/Content.Shared/NPC/Components/FactionExceptionComponent.cs similarity index 72% rename from Content.Server/NPC/Components/FactionExceptionComponent.cs rename to Content.Shared/NPC/Components/FactionExceptionComponent.cs index 6abd503537..54de0404c2 100644 --- a/Content.Server/NPC/Components/FactionExceptionComponent.cs +++ b/Content.Shared/NPC/Components/FactionExceptionComponent.cs @@ -1,23 +1,24 @@ -using Content.Server.NPC.Systems; +using Content.Shared.NPC.Systems; +using Robust.Shared.GameStates; -namespace Content.Server.NPC.Components; +namespace Content.Shared.NPC.Components; /// /// Prevents an NPC from attacking ignored entities from enemy factions. /// Can be added to if pettable, see PettableFriendComponent. /// -[RegisterComponent, Access(typeof(NpcFactionSystem))] +[RegisterComponent, NetworkedComponent, Access(typeof(NpcFactionSystem))] public sealed partial class FactionExceptionComponent : Component { /// /// Collection of entities that this NPC will refuse to attack /// - [DataField("ignored")] + [DataField] public HashSet Ignored = new(); /// /// Collection of entities that this NPC will attack, regardless of faction. /// - [DataField("hostiles")] + [DataField] public HashSet Hostiles = new(); } diff --git a/Content.Shared/NPC/Components/FactionExceptionTrackerComponent.cs b/Content.Shared/NPC/Components/FactionExceptionTrackerComponent.cs new file mode 100644 index 0000000000..f6eded7371 --- /dev/null +++ b/Content.Shared/NPC/Components/FactionExceptionTrackerComponent.cs @@ -0,0 +1,17 @@ +using Content.Shared.NPC.Systems; +using Robust.Shared.GameStates; + +namespace Content.Shared.NPC.Components; + +/// +/// This is used for tracking entities stored in . +/// +[RegisterComponent, NetworkedComponent, Access(typeof(NpcFactionSystem))] +public sealed partial class FactionExceptionTrackerComponent : Component +{ + /// + /// Entities with that are tracking this entity. + /// + [DataField] + public HashSet Entities = new(); +} diff --git a/Content.Shared/NPC/Components/NpcFactionMemberComponent.cs b/Content.Shared/NPC/Components/NpcFactionMemberComponent.cs new file mode 100644 index 0000000000..91521e9854 --- /dev/null +++ b/Content.Shared/NPC/Components/NpcFactionMemberComponent.cs @@ -0,0 +1,28 @@ +using Content.Shared.NPC.Prototypes; +using Content.Shared.NPC.Systems; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.NPC.Components; + +[RegisterComponent, NetworkedComponent, Access(typeof(NpcFactionSystem))] +public sealed partial class NpcFactionMemberComponent : Component +{ + /// + /// Factions this entity is a part of. + /// + [DataField] + public HashSet> Factions = new(); + + /// + /// Cached friendly factions. + /// + [ViewVariables] + public readonly HashSet> FriendlyFactions = new(); + + /// + /// Cached hostile factions. + /// + [ViewVariables] + public readonly HashSet> HostileFactions = new(); +} diff --git a/Content.Shared/NPC/Prototypes/NpcFactionPrototype.cs b/Content.Shared/NPC/Prototypes/NpcFactionPrototype.cs new file mode 100644 index 0000000000..1dcdd751c8 --- /dev/null +++ b/Content.Shared/NPC/Prototypes/NpcFactionPrototype.cs @@ -0,0 +1,32 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.NPC.Prototypes; + +/// +/// Contains data about this faction's relations with other factions. +/// +[Prototype("npcFaction")] +public sealed partial class NpcFactionPrototype : IPrototype +{ + [ViewVariables] + [IdDataField] + public string ID { get; private set; } = default!; + + [DataField] + public List> Friendly = new(); + + [DataField] + public List> Hostile = new(); +} + +/// +/// Cached data for the faction prototype. Is modified at runtime, whereas the prototype is not. +/// +public record struct FactionData +{ + [ViewVariables] + public HashSet> Friendly; + + [ViewVariables] + public HashSet> Hostile; +} diff --git a/Content.Shared/NPC/Systems/NpcFactionSystem.Exception.cs b/Content.Shared/NPC/Systems/NpcFactionSystem.Exception.cs new file mode 100644 index 0000000000..e69f0c2f7a --- /dev/null +++ b/Content.Shared/NPC/Systems/NpcFactionSystem.Exception.cs @@ -0,0 +1,135 @@ +using Content.Shared.NPC.Components; +using System.Linq; + +namespace Content.Shared.NPC.Systems; + +/// +/// Prevents an NPC from attacking some entities from an enemy faction. +/// Also makes it attack some entities even if they are in neutral factions (retaliation). +/// +public sealed partial class NpcFactionSystem +{ + private EntityQuery _exceptionQuery; + private EntityQuery _trackerQuery; + + public void InitializeException() + { + _exceptionQuery = GetEntityQuery(); + _trackerQuery = GetEntityQuery(); + + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnTrackerShutdown); + } + + private void OnShutdown(Entity ent, ref ComponentShutdown args) + { + foreach (var uid in ent.Comp.Hostiles) + { + if (_trackerQuery.TryGetComponent(uid, out var tracker)) + tracker.Entities.Remove(ent); + } + + foreach (var uid in ent.Comp.Ignored) + { + if (_trackerQuery.TryGetComponent(uid, out var tracker)) + tracker.Entities.Remove(ent); + } + } + + private void OnTrackerShutdown(Entity ent, ref ComponentShutdown args) + { + foreach (var uid in ent.Comp.Entities) + { + if (!_exceptionQuery.TryGetComponent(uid, out var exception)) + continue; + + exception.Ignored.Remove(ent); + exception.Hostiles.Remove(ent); + } + } + + /// + /// Returns whether the entity from an enemy faction won't be attacked + /// + public bool IsIgnored(Entity ent, EntityUid target) + { + if (!Resolve(ent, ref ent.Comp, false)) + return false; + + return ent.Comp.Ignored.Contains(target); + } + + /// + /// Returns the specific hostile entities for a given entity. + /// + public IEnumerable GetHostiles(Entity ent) + { + if (!Resolve(ent, ref ent.Comp, false)) + return Array.Empty(); + + // evil c# + return ent.Comp!.Hostiles; + } + + /// + /// Prevents an entity from an enemy faction from being attacked + /// + public void IgnoreEntity(Entity ent, Entity target) + { + ent.Comp ??= EnsureComp(ent); + ent.Comp.Ignored.Add(target); + target.Comp ??= EnsureComp(target); + target.Comp.Entities.Add(ent); + } + + /// + /// Prevents a list of entities from an enemy faction from being attacked + /// + public void IgnoreEntities(Entity ent, IEnumerable ignored) + { + ent.Comp ??= EnsureComp(ent); + foreach (var ignore in ignored) + { + IgnoreEntity(ent, ignore); + } + } + + /// + /// Makes an entity always be considered hostile. + /// + public void AggroEntity(Entity ent, Entity target) + { + ent.Comp ??= EnsureComp(ent); + ent.Comp.Hostiles.Add(target); + target.Comp ??= EnsureComp(target); + target.Comp.Entities.Add(ent); + } + + /// + /// Makes an entity no longer be considered hostile, if it was. + /// Doesn't apply to regular faction hostilities. + /// + public void DeAggroEntity(Entity ent, EntityUid target) + { + if (!Resolve(ent, ref ent.Comp, false)) + return; + + if (!ent.Comp.Hostiles.Remove(target) || !_trackerQuery.TryGetComponent(target, out var tracker)) + return; + + tracker.Entities.Remove(ent); + } + + /// + /// Makes a list of entities no longer be considered hostile, if it was. + /// Doesn't apply to regular faction hostilities. + /// + public void AggroEntities(Entity ent, IEnumerable entities) + { + ent.Comp ??= EnsureComp(ent); + foreach (var uid in entities) + { + AggroEntity(ent, uid); + } + } +} diff --git a/Content.Shared/NPC/Systems/NpcFactionSystem.cs b/Content.Shared/NPC/Systems/NpcFactionSystem.cs new file mode 100644 index 0000000000..ad81f01e1d --- /dev/null +++ b/Content.Shared/NPC/Systems/NpcFactionSystem.cs @@ -0,0 +1,277 @@ +using Content.Shared.NPC.Components; +using Content.Shared.NPC.Prototypes; +using Robust.Shared.Prototypes; +using System.Collections.Frozen; +using System.Linq; + +namespace Content.Shared.NPC.Systems; + +/// +/// Outlines faction relationships with each other. +/// +public sealed partial class NpcFactionSystem : EntitySystem +{ + [Dependency] private readonly EntityLookupSystem _lookup = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly SharedTransformSystem _xform = default!; + + /// + /// To avoid prototype mutability we store an intermediary data class that gets used instead. + /// + private FrozenDictionary _factions = FrozenDictionary.Empty; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnFactionStartup); + SubscribeLocalEvent(OnProtoReload); + + InitializeException(); + RefreshFactions(); + } + + private void OnProtoReload(PrototypesReloadedEventArgs obj) + { + if (obj.WasModified()) + RefreshFactions(); + } + + private void OnFactionStartup(Entity ent, ref ComponentStartup args) + { + RefreshFactions(ent); + } + + /// + /// Refreshes the cached factions for this component. + /// + private void RefreshFactions(Entity ent) + { + ent.Comp.FriendlyFactions.Clear(); + ent.Comp.HostileFactions.Clear(); + + foreach (var faction in ent.Comp.Factions) + { + // YAML Linter already yells about this, don't need to log an error here + if (!_factions.TryGetValue(faction, out var factionData)) + continue; + + ent.Comp.FriendlyFactions.UnionWith(factionData.Friendly); + ent.Comp.HostileFactions.UnionWith(factionData.Hostile); + } + } + + /// + /// Returns whether an entity is a member of a faction. + /// + public bool IsMember(Entity ent, string faction) + { + if (!Resolve(ent, ref ent.Comp, false)) + return false; + + return ent.Comp.Factions.Contains(faction); + } + + /// + /// Adds this entity to the particular faction. + /// + public void AddFaction(Entity ent, string faction, bool dirty = true) + { + if (!_proto.HasIndex(faction)) + { + Log.Error($"Unable to find faction {faction}"); + return; + } + + ent.Comp ??= EnsureComp(ent); + if (!ent.Comp.Factions.Add(faction)) + return; + + if (dirty) + RefreshFactions((ent, ent.Comp)); + } + + /// + /// Removes this entity from the particular faction. + /// + public void RemoveFaction(Entity ent, string faction, bool dirty = true) + { + if (!_proto.HasIndex(faction)) + { + Log.Error($"Unable to find faction {faction}"); + return; + } + + if (!Resolve(ent, ref ent.Comp, false)) + return; + + if (!ent.Comp.Factions.Remove(faction)) + return; + + if (dirty) + RefreshFactions((ent, ent.Comp)); + } + + /// + /// Remove this entity from all factions. + /// + public void ClearFactions(Entity ent, bool dirty = true) + { + if (!Resolve(ent, ref ent.Comp, false)) + return; + + ent.Comp.Factions.Clear(); + + if (dirty) + RefreshFactions((ent, ent.Comp)); + } + + public IEnumerable GetNearbyHostiles(Entity ent, float range) + { + if (!Resolve(ent, ref ent.Comp1, false)) + return Array.Empty(); + + var hostiles = GetNearbyFactions(ent, range, ent.Comp1.HostileFactions) + // ignore mobs that have both hostile faction and the same faction, + // otherwise having multiple factions is strictly negative + .Where(target => !IsEntityFriendly((ent, ent.Comp1), target)); + if (!Resolve(ent, ref ent.Comp2, false)) + return hostiles; + + // ignore anything from enemy faction that we are explicitly friendly towards + var faction = (ent.Owner, ent.Comp2); + return hostiles + .Union(GetHostiles(faction)) + .Where(target => !IsIgnored(faction, target)); + } + + public IEnumerable GetNearbyFriendlies(Entity ent, float range) + { + if (!Resolve(ent, ref ent.Comp, false)) + return Array.Empty(); + + return GetNearbyFactions(ent, range, ent.Comp.FriendlyFactions); + } + + private IEnumerable GetNearbyFactions(EntityUid entity, float range, HashSet> factions) + { + var xform = Transform(entity); + foreach (var ent in _lookup.GetEntitiesInRange(_xform.GetMapCoordinates((entity, xform)), range)) + { + if (ent.Owner == entity) + continue; + + if (!factions.Overlaps(ent.Comp.Factions)) + continue; + + yield return ent.Owner; + } + } + + /// + /// 1-way and purely faction based, ignores faction exception. + /// + public bool IsEntityFriendly(Entity ent, Entity other) + { + if (!Resolve(ent, ref ent.Comp, false) || !Resolve(other, ref other.Comp, false)) + return false; + + return ent.Comp.Factions.Overlaps(other.Comp.Factions) || ent.Comp.FriendlyFactions.Overlaps(other.Comp.Factions); + } + + public bool IsFactionFriendly(string target, string with) + { + return _factions[target].Friendly.Contains(with) && _factions[with].Friendly.Contains(target); + } + + public bool IsFactionFriendly(string target, Entity with) + { + if (!Resolve(with, ref with.Comp, false)) + return false; + + return with.Comp.Factions.All(x => IsFactionFriendly(target, x)) || + with.Comp.FriendlyFactions.Contains(target); + } + + public bool IsFactionHostile(string target, string with) + { + return _factions[target].Hostile.Contains(with) && _factions[with].Hostile.Contains(target); + } + + public bool IsFactionHostile(string target, Entity with) + { + if (!Resolve(with, ref with.Comp, false)) + return false; + + return with.Comp.Factions.All(x => IsFactionHostile(target, x)) || + with.Comp.HostileFactions.Contains(target); + } + + public bool IsFactionNeutral(string target, string with) + { + return !IsFactionFriendly(target, with) && !IsFactionHostile(target, with); + } + + /// + /// Makes the source faction friendly to the target faction, 1-way. + /// + public void MakeFriendly(string source, string target) + { + if (!_factions.TryGetValue(source, out var sourceFaction)) + { + Log.Error($"Unable to find faction {source}"); + return; + } + + if (!_factions.ContainsKey(target)) + { + Log.Error($"Unable to find faction {target}"); + return; + } + + sourceFaction.Friendly.Add(target); + sourceFaction.Hostile.Remove(target); + RefreshFactions(); + } + + /// + /// Makes the source faction hostile to the target faction, 1-way. + /// + public void MakeHostile(string source, string target) + { + if (!_factions.TryGetValue(source, out var sourceFaction)) + { + Log.Error($"Unable to find faction {source}"); + return; + } + + if (!_factions.ContainsKey(target)) + { + Log.Error($"Unable to find faction {target}"); + return; + } + + sourceFaction.Friendly.Remove(target); + sourceFaction.Hostile.Add(target); + RefreshFactions(); + } + + private void RefreshFactions() + { + _factions = _proto.EnumeratePrototypes().ToFrozenDictionary( + faction => faction.ID, + faction => new FactionData + { + Friendly = faction.Friendly.ToHashSet(), + Hostile = faction.Hostile.ToHashSet() + }); + + var query = AllEntityQuery(); + while (query.MoveNext(out var uid, out var comp)) + { + comp.FriendlyFactions.Clear(); + comp.HostileFactions.Clear(); + RefreshFactions((uid, comp)); + } + } +} diff --git a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs index b070cee283..29218f5719 100644 --- a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs @@ -18,14 +18,10 @@ public sealed class ThirstSystem : EntitySystem [Dependency] private readonly MovementSpeedModifierSystem _movement = default!; [Dependency] private readonly SharedJetpackSystem _jetpack = default!; - private ISawmill _sawmill = default!; - public override void Initialize() { base.Initialize(); - _sawmill = Logger.GetSawmill("thirst"); - SubscribeLocalEvent(OnRefreshMovespeed); SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnRejuvenate); @@ -156,7 +152,7 @@ private void UpdateEffects(EntityUid uid, ThirstComponent component) return; default: - _sawmill.Error($"No thirst threshold found for {component.CurrentThirstThreshold}"); + Log.Error($"No thirst threshold found for {component.CurrentThirstThreshold}"); throw new ArgumentOutOfRangeException($"No thirst threshold found for {component.CurrentThirstThreshold}"); } } diff --git a/Content.Shared/Nutrition/Events.cs b/Content.Shared/Nutrition/Events.cs index e27603763f..f2936d603d 100644 --- a/Content.Shared/Nutrition/Events.cs +++ b/Content.Shared/Nutrition/Events.cs @@ -53,3 +53,9 @@ public VapeDoAfterEvent(Solution solution, bool forced) public override DoAfterEvent Clone() => this; } + +/// +/// Raised before food is sliced +/// +[ByRefEvent] +public record struct SliceFoodEvent(); diff --git a/Content.Shared/Paint/PaintComponent.cs b/Content.Shared/Paint/PaintComponent.cs new file mode 100644 index 0000000000..ad09f4ca73 --- /dev/null +++ b/Content.Shared/Paint/PaintComponent.cs @@ -0,0 +1,60 @@ +using Content.Shared.Chemistry.Reagent; +using Content.Shared.FixedPoint; +using Robust.Shared.Audio; +using Content.Shared.Whitelist; +using Robust.Shared.Prototypes; +using Robust.Shared.GameStates; + +namespace Content.Shared.Paint; + +/// +/// Entity when used on another entity will paint target entity. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(SharedPaintSystem))] +public sealed partial class PaintComponent : Component +{ + /// + /// Noise made when paint applied. + /// + [DataField] + public SoundSpecifier Spray = new SoundPathSpecifier("/Audio/Effects/spray2.ogg"); + + /// + /// Solution on the entity that contains the paint. + /// + [DataField] + public string Solution = "drink"; + + /// + /// How long the doafter will take. + /// + [DataField] + public int Delay = 2; + + /// + /// Reagent that will be used as paint. + /// + [DataField, AutoNetworkedField] + public ProtoId Reagent = "SpaceGlue"; + + /// + /// Color that the painting entity will instruct the painted entity to be. + /// + [DataField, AutoNetworkedField] + public Color Color = Color.FromHex("#c62121"); + + [DataField, ViewVariables(VVAccess.ReadWrite)] + public EntityWhitelist? Blacklist; + /// + /// Reagent consumption per use. + /// + [DataField] + public FixedPoint2 ConsumptionUnit = FixedPoint2.New(5); + + /// + /// Duration per unit + /// + [DataField] + public TimeSpan DurationPerUnit = TimeSpan.FromSeconds(6); +} diff --git a/Content.Shared/Paint/PaintDoAfterEvent.cs b/Content.Shared/Paint/PaintDoAfterEvent.cs new file mode 100644 index 0000000000..0851f1541b --- /dev/null +++ b/Content.Shared/Paint/PaintDoAfterEvent.cs @@ -0,0 +1,9 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Shared.Paint; + +[Serializable, NetSerializable] +public sealed partial class PaintDoAfterEvent : SimpleDoAfterEvent +{ +} diff --git a/Content.Shared/Paint/PaintRemoverComponent.cs b/Content.Shared/Paint/PaintRemoverComponent.cs new file mode 100644 index 0000000000..54d0ed7a71 --- /dev/null +++ b/Content.Shared/Paint/PaintRemoverComponent.cs @@ -0,0 +1,24 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Audio; + +namespace Content.Shared.Paint; + +/// +/// Removes paint from an entity that was painted with spray paint. +/// +[RegisterComponent, NetworkedComponent] +[Access(typeof(PaintRemoverSystem))] +public sealed partial class PaintRemoverComponent : Component +{ + /// + /// Sound when target is cleaned. + /// + [DataField] + public SoundSpecifier Sound = new SoundPathSpecifier("/Audio/Effects/Fluids/watersplash.ogg"); + + /// + /// DoAfter wait time. + /// + [DataField] + public float CleanDelay = 2f; +} diff --git a/Content.Shared/Paint/PaintRemoverDoAfterEvent.cs b/Content.Shared/Paint/PaintRemoverDoAfterEvent.cs new file mode 100644 index 0000000000..940b1aa513 --- /dev/null +++ b/Content.Shared/Paint/PaintRemoverDoAfterEvent.cs @@ -0,0 +1,9 @@ +using Content.Shared.DoAfter; +using Robust.Shared.Serialization; + +namespace Content.Shared.Paint; + +[Serializable, NetSerializable] +public sealed partial class PaintRemoverDoAfterEvent : SimpleDoAfterEvent +{ +} diff --git a/Content.Shared/Paint/PaintRemoverSystem.cs b/Content.Shared/Paint/PaintRemoverSystem.cs new file mode 100644 index 0000000000..efc1ded067 --- /dev/null +++ b/Content.Shared/Paint/PaintRemoverSystem.cs @@ -0,0 +1,94 @@ +using Content.Shared.Popups; +using Content.Shared.Interaction; +using Content.Shared.DoAfter; +using Content.Shared.Verbs; +using Content.Shared.Sprite; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Timing; + +namespace Content.Shared.Paint; + +/// +/// Removes paint from an entity. +/// +public sealed class PaintRemoverSystem : SharedPaintSystem +{ + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnInteract); + SubscribeLocalEvent(OnDoAfter); + SubscribeLocalEvent>(OnPaintRemoveVerb); + } + + // When entity is painted, remove paint from that entity. + private void OnInteract(EntityUid uid, PaintRemoverComponent component, AfterInteractEvent args) + { + if (args.Handled) + return; + + if (!args.CanReach || args.Target is not { Valid: true } target || !HasComp(target)) + return; + + _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.CleanDelay, new PaintRemoverDoAfterEvent(), uid, args.Target, uid) + { + BreakOnMove = true, + BreakOnDamage = true, + MovementThreshold = 1.0f, + }); + args.Handled = true; + } + + private void OnDoAfter(EntityUid uid, PaintRemoverComponent component, DoAfterEvent args) + { + if (args.Cancelled || args.Handled || args.Args.Target == null) + return; + + if (args.Target is not { Valid: true } target) + return; + + if (!TryComp(target, out PaintedComponent? paint)) + return; + + paint.Enabled = false; + _audio.PlayPredicted(component.Sound, target, args.User); + _popup.PopupClient(Loc.GetString("paint-removed", ("target", target)), args.User, args.User, PopupType.Medium); + _appearanceSystem.SetData(target, PaintVisuals.Painted, false); + RemComp(target); + Dirty(target, paint); + + args.Handled = true; + } + + private void OnPaintRemoveVerb(EntityUid uid, PaintRemoverComponent component, GetVerbsEvent args) + { + if (!args.CanInteract || !args.CanAccess) + return; + + var paintremovalText = Loc.GetString("paint-remove-verb"); + + var verb = new UtilityVerb() + { + Act = () => + { + + _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.CleanDelay, new PaintRemoverDoAfterEvent(), uid, args.Target, uid) + { + BreakOnMove = true, + BreakOnDamage = true, + MovementThreshold = 1.0f, + }); + }, + + Text = paintremovalText + }; + + args.Verbs.Add(verb); + } +} diff --git a/Content.Shared/Paint/PaintedComponent.cs b/Content.Shared/Paint/PaintedComponent.cs new file mode 100644 index 0000000000..a6ee7377e1 --- /dev/null +++ b/Content.Shared/Paint/PaintedComponent.cs @@ -0,0 +1,41 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared.Paint; + +/// +/// Component applied to target entity when painted. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class PaintedComponent : Component +{ + /// + /// Color of the paint. + /// + [DataField, AutoNetworkedField] + public Color Color = Color.FromHex("#2cdbd5"); + + /// + /// Used to remove the color when component removed. + /// + [DataField, AutoNetworkedField] + public Color BeforeColor; + + /// + /// If paint is enabled. + /// + [DataField, AutoNetworkedField] + public bool Enabled; + + /// + /// Name of the shader. + /// + [DataField, AutoNetworkedField] + public string ShaderName = "Greyscale"; +} + +[Serializable, NetSerializable] +public enum PaintVisuals : byte +{ + Painted, +} diff --git a/Content.Shared/Paint/SharedPaintSystem.cs b/Content.Shared/Paint/SharedPaintSystem.cs new file mode 100644 index 0000000000..10185817b8 --- /dev/null +++ b/Content.Shared/Paint/SharedPaintSystem.cs @@ -0,0 +1,11 @@ +namespace Content.Shared.Paint; + +/// +/// Colors target and consumes reagent on each color success. +/// +public abstract class SharedPaintSystem : EntitySystem +{ + public virtual void UpdateAppearance(EntityUid uid, PaintedComponent? component = null) + { + } +} diff --git a/Content.Shared/Projectiles/SharedProjectileSystem.cs b/Content.Shared/Projectiles/SharedProjectileSystem.cs index f40a7a0363..372dc8a75d 100644 --- a/Content.Shared/Projectiles/SharedProjectileSystem.cs +++ b/Content.Shared/Projectiles/SharedProjectileSystem.cs @@ -53,10 +53,7 @@ private void OnEmbedActivate(EntityUid uid, EmbeddableProjectileComponent compon args.Handled = true; _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.RemovalTime.Value, - new RemoveEmbeddedProjectileEvent(), eventTarget: uid, target: uid) - { - DistanceThreshold = SharedInteractionSystem.InteractionRange, - }); + new RemoveEmbeddedProjectileEvent(), eventTarget: uid, target: uid)); } private void OnEmbedRemove(EntityUid uid, EmbeddableProjectileComponent component, RemoveEmbeddedProjectileEvent args) diff --git a/Content.Shared/Prying/Systems/PryingSystem.cs b/Content.Shared/Prying/Systems/PryingSystem.cs index fa7a135e6c..69a63f72b5 100644 --- a/Content.Shared/Prying/Systems/PryingSystem.cs +++ b/Content.Shared/Prying/Systems/PryingSystem.cs @@ -136,8 +136,7 @@ private bool StartPry(EntityUid target, EntityUid user, EntityUid? tool, float t var doAfterArgs = new DoAfterArgs(EntityManager, user, TimeSpan.FromSeconds(modEv.BaseTime * modEv.PryTimeModifier / toolModifier), new DoorPryDoAfterEvent(), target, target, tool) { BreakOnDamage = true, - BreakOnUserMove = true, - BreakOnWeightlessMove = true, + BreakOnMove = true, }; if (tool != null) diff --git a/Content.Shared/Pulling/Components/PullableComponent.cs b/Content.Shared/Pulling/Components/PullableComponent.cs deleted file mode 100644 index c5c3068869..0000000000 --- a/Content.Shared/Pulling/Components/PullableComponent.cs +++ /dev/null @@ -1,57 +0,0 @@ -using Robust.Shared.GameStates; -using Robust.Shared.Map; -using Robust.Shared.Serialization; - -namespace Content.Shared.Pulling.Components -{ - // Before you try to add another type than SharedPullingStateManagementSystem, consider the can of worms you may be opening! - [NetworkedComponent, AutoGenerateComponentState] - [Access(typeof(SharedPullingStateManagementSystem))] - [RegisterComponent] - public sealed partial class SharedPullableComponent : Component - { - /// - /// The current entity pulling this component. - /// - [DataField, AutoNetworkedField] - public EntityUid? Puller { get; set; } - - /// - /// The pull joint. - /// - [DataField, AutoNetworkedField] - public string? PullJointId { get; set; } - - public bool BeingPulled => Puller != null; - - [Access(typeof(SharedPullingStateManagementSystem), Other = AccessPermissions.ReadExecute)] // FIXME Friends - public EntityCoordinates? MovingTo { get; set; } - - /// - /// If the physics component has FixedRotation should we keep it upon being pulled - /// - [Access(typeof(SharedPullingSystem), Other = AccessPermissions.ReadExecute)] - [ViewVariables(VVAccess.ReadWrite), DataField("fixedRotation")] - public bool FixedRotationOnPull { get; set; } - - /// - /// What the pullable's fixedrotation was set to before being pulled. - /// - [Access(typeof(SharedPullingSystem), Other = AccessPermissions.ReadExecute)] - [ViewVariables] - public bool PrevFixedRotation; - } - - /// - /// Raised when a request is made to stop pulling an entity. - /// - public sealed class StopPullingEvent : CancellableEntityEventArgs - { - public EntityUid? User { get; } - - public StopPullingEvent(EntityUid? uid = null) - { - User = uid; - } - } -} diff --git a/Content.Shared/Pulling/Components/SharedPullerComponent.cs b/Content.Shared/Pulling/Components/SharedPullerComponent.cs deleted file mode 100644 index 57a86e7f7a..0000000000 --- a/Content.Shared/Pulling/Components/SharedPullerComponent.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Robust.Shared.GameStates; - -namespace Content.Shared.Pulling.Components -{ - [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] - [Access(typeof(SharedPullingStateManagementSystem))] - public sealed partial class SharedPullerComponent : Component - { - // Before changing how this is updated, please see SharedPullerSystem.RefreshMovementSpeed - public float WalkSpeedModifier => Pulling == default ? 1.0f : 0.95f; - - public float SprintSpeedModifier => Pulling == default ? 1.0f : 0.95f; - - [DataField, AutoNetworkedField] - public EntityUid? Pulling { get; set; } - - /// - /// Does this entity need hands to be able to pull something? - /// - [DataField("needsHands")] - public bool NeedsHands = true; - } -} diff --git a/Content.Shared/Pulling/Events/PullAttemptEvent.cs b/Content.Shared/Pulling/Events/PullAttemptEvent.cs deleted file mode 100644 index 6296dc2f14..0000000000 --- a/Content.Shared/Pulling/Events/PullAttemptEvent.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Physics.Pull -{ - public sealed class PullAttemptEvent : PullMessage - { - public PullAttemptEvent(PhysicsComponent puller, PhysicsComponent pulled) : base(puller, pulled) { } - - public bool Cancelled { get; set; } - } -} diff --git a/Content.Shared/Pulling/Events/PullMessage.cs b/Content.Shared/Pulling/Events/PullMessage.cs deleted file mode 100644 index b11de7c170..0000000000 --- a/Content.Shared/Pulling/Events/PullMessage.cs +++ /dev/null @@ -1,16 +0,0 @@ -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Physics.Pull -{ - public abstract class PullMessage : EntityEventArgs - { - public readonly PhysicsComponent Puller; - public readonly PhysicsComponent Pulled; - - protected PullMessage(PhysicsComponent puller, PhysicsComponent pulled) - { - Puller = puller; - Pulled = pulled; - } - } -} diff --git a/Content.Shared/Pulling/Events/PullStartedMessage.cs b/Content.Shared/Pulling/Events/PullStartedMessage.cs deleted file mode 100644 index 0ede284bb0..0000000000 --- a/Content.Shared/Pulling/Events/PullStartedMessage.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Physics.Pull -{ - public sealed class PullStartedMessage : PullMessage - { - public PullStartedMessage(PhysicsComponent puller, PhysicsComponent pulled) : - base(puller, pulled) - { - } - } -} diff --git a/Content.Shared/Pulling/Events/PullStoppedMessage.cs b/Content.Shared/Pulling/Events/PullStoppedMessage.cs deleted file mode 100644 index afcbcb7074..0000000000 --- a/Content.Shared/Pulling/Events/PullStoppedMessage.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Robust.Shared.Physics.Components; - -namespace Content.Shared.Physics.Pull -{ - public sealed class PullStoppedMessage : PullMessage - { - public PullStoppedMessage(PhysicsComponent puller, PhysicsComponent pulled) : base(puller, pulled) - { - } - } -} diff --git a/Content.Shared/Pulling/PullableMoveMessage.cs b/Content.Shared/Pulling/PullableMoveMessage.cs deleted file mode 100644 index 46c6b1291d..0000000000 --- a/Content.Shared/Pulling/PullableMoveMessage.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Content.Shared.Pulling -{ - public sealed class PullableMoveMessage : EntityEventArgs - { - } -} diff --git a/Content.Shared/Pulling/PullableStopMovingMessage.cs b/Content.Shared/Pulling/PullableStopMovingMessage.cs deleted file mode 100644 index 0233e32f2b..0000000000 --- a/Content.Shared/Pulling/PullableStopMovingMessage.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Content.Shared.Pulling -{ - public sealed class PullableStopMovingMessage : EntityEventArgs - { - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullableSystem.cs b/Content.Shared/Pulling/Systems/SharedPullableSystem.cs deleted file mode 100644 index 3dab476337..0000000000 --- a/Content.Shared/Pulling/Systems/SharedPullableSystem.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Content.Shared.ActionBlocker; -using Content.Shared.Mobs.Systems; -using Content.Shared.Pulling.Components; -using Content.Shared.Movement.Events; - -namespace Content.Shared.Pulling.Systems -{ - public sealed class SharedPullableSystem : EntitySystem - { - [Dependency] private readonly ActionBlockerSystem _blocker = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; - [Dependency] private readonly SharedPullingSystem _pullSystem = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnRelayMoveInput); - } - - private void OnRelayMoveInput(EntityUid uid, SharedPullableComponent component, ref MoveInputEvent args) - { - var entity = args.Entity; - if (_mobState.IsIncapacitated(entity) || !_blocker.CanMove(entity)) return; - - _pullSystem.TryStopPull(component); - } - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullerSystem.cs b/Content.Shared/Pulling/Systems/SharedPullerSystem.cs deleted file mode 100644 index e388d7a57c..0000000000 --- a/Content.Shared/Pulling/Systems/SharedPullerSystem.cs +++ /dev/null @@ -1,90 +0,0 @@ -using Content.Shared.Administration.Logs; -using Content.Shared.Alert; -using Content.Shared.Database; -using Content.Shared.Hands; -using Content.Shared.Movement.Systems; -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling.Components; -using JetBrains.Annotations; - -namespace Content.Shared.Pulling.Systems -{ - [UsedImplicitly] - public sealed class SharedPullerSystem : EntitySystem - { - [Dependency] private readonly SharedPullingStateManagementSystem _why = default!; - [Dependency] private readonly SharedPullingSystem _pullSystem = default!; - [Dependency] private readonly MovementSpeedModifierSystem _movementSpeedModifierSystem = default!; - [Dependency] private readonly AlertsSystem _alertsSystem = default!; - [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(PullerHandlePullStarted); - SubscribeLocalEvent(PullerHandlePullStopped); - SubscribeLocalEvent(OnVirtualItemDeleted); - SubscribeLocalEvent(OnRefreshMovespeed); - SubscribeLocalEvent(OnPullerShutdown); - } - - private void OnPullerShutdown(EntityUid uid, SharedPullerComponent component, ComponentShutdown args) - { - _why.ForceDisconnectPuller(component); - } - - private void OnVirtualItemDeleted(EntityUid uid, SharedPullerComponent component, VirtualItemDeletedEvent args) - { - if (component.Pulling == null) - return; - - if (component.Pulling == args.BlockingEntity) - { - if (EntityManager.TryGetComponent(args.BlockingEntity, out var comp)) - { - _pullSystem.TryStopPull(comp, uid); - } - } - } - - private void PullerHandlePullStarted( - EntityUid uid, - SharedPullerComponent component, - PullStartedMessage args) - { - if (args.Puller.Owner != uid) - return; - - _alertsSystem.ShowAlert(component.Owner, AlertType.Pulling); - - RefreshMovementSpeed(component); - } - - private void PullerHandlePullStopped( - EntityUid uid, - SharedPullerComponent component, - PullStoppedMessage args) - { - if (args.Puller.Owner != uid) - return; - - var euid = component.Owner; - if (_alertsSystem.IsShowingAlert(euid, AlertType.Pulling)) - _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(euid):user} stopped pulling {ToPrettyString(args.Pulled.Owner):target}"); - _alertsSystem.ClearAlert(euid, AlertType.Pulling); - - RefreshMovementSpeed(component); - } - - private void OnRefreshMovespeed(EntityUid uid, SharedPullerComponent component, RefreshMovementSpeedModifiersEvent args) - { - args.ModifySpeed(component.WalkSpeedModifier, component.SprintSpeedModifier); - } - - private void RefreshMovementSpeed(SharedPullerComponent component) - { - _movementSpeedModifierSystem.RefreshMovementSpeedModifiers(component.Owner); - } - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullingStateManagementSystem.cs b/Content.Shared/Pulling/Systems/SharedPullingStateManagementSystem.cs deleted file mode 100644 index 38ed899889..0000000000 --- a/Content.Shared/Pulling/Systems/SharedPullingStateManagementSystem.cs +++ /dev/null @@ -1,196 +0,0 @@ -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling.Components; -using JetBrains.Annotations; -using Robust.Shared.Map; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Systems; -using Robust.Shared.Timing; - -namespace Content.Shared.Pulling -{ - /// - /// This is the core of pulling state management. - /// Because pulling state is such a mess to get right, all writes to pulling state must go through this class. - /// - [UsedImplicitly] - public sealed class SharedPullingStateManagementSystem : EntitySystem - { - [Dependency] private readonly SharedJointSystem _jointSystem = default!; - [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly IGameTiming _timing = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnShutdown); - } - - private void OnShutdown(EntityUid uid, SharedPullableComponent component, ComponentShutdown args) - { - if (component.Puller != null) - ForceRelationship(null, component); - } - - // A WARNING: - // The following 2 functions are the most internal part of the pulling system's relationship management. - // They do not expect to be cancellable. - private void ForceDisconnect(SharedPullerComponent puller, SharedPullableComponent pullable) - { - var pullerPhysics = EntityManager.GetComponent(puller.Owner); - var pullablePhysics = EntityManager.GetComponent(pullable.Owner); - - // MovingTo shutdown - ForceSetMovingTo(pullable, null); - - // Joint shutdown - if (!_timing.ApplyingState && // During state-handling, joint component will handle its own state. - pullable.PullJointId != null && - TryComp(puller.Owner, out JointComponent? jointComp)) - { - if (jointComp.GetJoints.TryGetValue(pullable.PullJointId, out var j)) - _jointSystem.RemoveJoint(j); - } - pullable.PullJointId = null; - - // State shutdown - puller.Pulling = null; - pullable.Puller = null; - - // Messaging - var message = new PullStoppedMessage(pullerPhysics, pullablePhysics); - - RaiseLocalEvent(puller.Owner, message, broadcast: false); - - if (Initialized(pullable.Owner)) - RaiseLocalEvent(pullable.Owner, message, true); - - // Networking - Dirty(puller); - Dirty(pullable); - } - - public void ForceRelationship(SharedPullerComponent? puller, SharedPullableComponent? pullable) - { - if (_timing.ApplyingState) - return; - ; - if (pullable != null && puller != null && (puller.Pulling == pullable.Owner)) - { - // Already done - return; - } - - // Start by disconnecting the pullable from whatever it is currently connected to. - var pullableOldPullerE = pullable?.Puller; - if (pullableOldPullerE != null) - { - ForceDisconnect(EntityManager.GetComponent(pullableOldPullerE.Value), pullable!); - } - - // Continue with the puller. - var pullerOldPullableE = puller?.Pulling; - if (pullerOldPullableE != null) - { - ForceDisconnect(puller!, EntityManager.GetComponent(pullerOldPullableE.Value)); - } - - // And now for the actual connection (if any). - - if (puller != null && pullable != null) - { - var pullerPhysics = EntityManager.GetComponent(puller.Owner); - var pullablePhysics = EntityManager.GetComponent(pullable.Owner); - pullable.PullJointId = $"pull-joint-{pullable.Owner}"; - - // State startup - puller.Pulling = pullable.Owner; - pullable.Puller = puller.Owner; - - // joint state handling will manage its own state - if (!_timing.ApplyingState) - { - // Joint startup - var union = _physics.GetHardAABB(puller.Owner).Union(_physics.GetHardAABB(pullable.Owner, body: pullablePhysics)); - var length = Math.Max(union.Size.X, union.Size.Y) * 0.75f; - - var joint = _jointSystem.CreateDistanceJoint(pullablePhysics.Owner, pullerPhysics.Owner, id: pullable.PullJointId); - joint.CollideConnected = false; - // This maximum has to be there because if the object is constrained too closely, the clamping goes backwards and asserts. - joint.MaxLength = Math.Max(1.0f, length); - joint.Length = length * 0.75f; - joint.MinLength = 0f; - joint.Stiffness = 1f; - } - - // Messaging - var message = new PullStartedMessage(pullerPhysics, pullablePhysics); - - RaiseLocalEvent(puller.Owner, message, broadcast: false); - RaiseLocalEvent(pullable.Owner, message, true); - - // Networking - Dirty(puller); - Dirty(pullable); - } - } - - // For OnRemove use only. - public void ForceDisconnectPuller(SharedPullerComponent puller) - { - // DO NOT ADD ADDITIONAL LOGIC IN THIS FUNCTION. Do it in ForceRelationship. - ForceRelationship(puller, null); - } - - // For OnRemove use only. - public void ForceDisconnectPullable(SharedPullableComponent pullable) - { - // DO NOT ADD ADDITIONAL LOGIC IN THIS FUNCTION. Do it in ForceRelationship. - ForceRelationship(null, pullable); - } - - public void ForceSetMovingTo(SharedPullableComponent pullable, EntityCoordinates? movingTo) - { - if (_timing.ApplyingState) - return; - - if (pullable.MovingTo == movingTo) - { - return; - } - - // Don't allow setting a MovingTo if there's no puller. - // The other half of this guarantee (shutting down a MovingTo if the puller goes away) is enforced in ForceRelationship. - if (pullable.Puller == null && movingTo != null) - { - return; - } - - pullable.MovingTo = movingTo; - Dirty(pullable); - - if (movingTo == null) - { - RaiseLocalEvent(pullable.Owner, new PullableStopMovingMessage(), true); - } - else - { - RaiseLocalEvent(pullable.Owner, new PullableMoveMessage(), true); - } - } - - /// - /// Changes if the entity needs a hand in order to be able to pull objects. - /// - public void ChangeHandRequirement(EntityUid uid, bool needsHands, SharedPullerComponent? comp) - { - if (!Resolve(uid, ref comp, false)) - return; - - comp.NeedsHands = needsHands; - - Dirty(uid, comp); - } - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs b/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs deleted file mode 100644 index 1e2bb90c61..0000000000 --- a/Content.Shared/Pulling/Systems/SharedPullingSystem.Actions.cs +++ /dev/null @@ -1,239 +0,0 @@ -using Content.Shared.ActionBlocker; -using Content.Shared.Administration.Logs; -using Content.Shared.Buckle.Components; -using Content.Shared.Database; -using Content.Shared.Hands.EntitySystems; -using Content.Shared.Interaction; -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling.Components; -using Content.Shared.Pulling.Events; -using Robust.Shared.Containers; -using Robust.Shared.Map; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Components; -using Robust.Shared.Physics.Systems; -using Robust.Shared.Timing; -using Robust.Shared.Utility; - -namespace Content.Shared.Pulling -{ - public abstract partial class SharedPullingSystem - { - [Dependency] private readonly ActionBlockerSystem _blocker = default!; - [Dependency] private readonly SharedContainerSystem _containerSystem = default!; - [Dependency] private readonly SharedHandsSystem _handsSystem = default!; - [Dependency] private readonly SharedInteractionSystem _interaction = default!; - [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; - [Dependency] private readonly IGameTiming _timing = default!; - - public bool CanPull(EntityUid puller, EntityUid pulled) - { - if (!EntityManager.TryGetComponent(puller, out var comp)) - { - return false; - } - - if (comp.NeedsHands && !_handsSystem.TryGetEmptyHand(puller, out _)) - { - return false; - } - - if (!_blocker.CanInteract(puller, pulled)) - { - return false; - } - - if (!EntityManager.TryGetComponent(pulled, out var physics)) - { - return false; - } - - if (physics.BodyType == BodyType.Static) - { - return false; - } - - if (puller == pulled) - { - return false; - } - - if(_containerSystem.IsEntityInContainer(puller) || _containerSystem.IsEntityInContainer(pulled)) - { - return false; - } - - if (EntityManager.TryGetComponent(puller, out BuckleComponent? buckle)) - { - // Prevent people pulling the chair they're on, etc. - if (buckle is { PullStrap: false, Buckled: true } && (buckle.LastEntityBuckledTo == pulled)) - { - return false; - } - } - - var getPulled = new BeingPulledAttemptEvent(puller, pulled); - RaiseLocalEvent(pulled, getPulled, true); - var startPull = new StartPullAttemptEvent(puller, pulled); - RaiseLocalEvent(puller, startPull, true); - return (!startPull.Cancelled && !getPulled.Cancelled); - } - - public bool TogglePull(EntityUid puller, SharedPullableComponent pullable) - { - if (pullable.Puller == puller) - { - return TryStopPull(pullable); - } - return TryStartPull(puller, pullable.Owner); - } - - // -- Core attempted actions -- - - public bool TryStopPull(SharedPullableComponent pullable, EntityUid? user = null) - { - if (_timing.ApplyingState) - return false; - - if (!pullable.BeingPulled) - { - return false; - } - - var msg = new StopPullingEvent(user); - RaiseLocalEvent(pullable.Owner, msg, true); - - if (msg.Cancelled) return false; - - // Stop pulling confirmed! - - if (TryComp(pullable.Owner, out var pullablePhysics)) - { - _physics.SetFixedRotation(pullable.Owner, pullable.PrevFixedRotation, body: pullablePhysics); - } - - _pullSm.ForceRelationship(null, pullable); - return true; - } - - public bool TryStartPull(EntityUid puller, EntityUid pullable) - { - if (!EntityManager.TryGetComponent(puller, out SharedPullerComponent? pullerComp)) - { - return false; - } - if (!EntityManager.TryGetComponent(pullable, out SharedPullableComponent? pullableComp)) - { - return false; - } - return TryStartPull(pullerComp, pullableComp); - } - - // The main "start pulling" function. - public bool TryStartPull(SharedPullerComponent puller, SharedPullableComponent pullable) - { - if (_timing.ApplyingState) - return false; - - if (puller.Pulling == pullable.Owner) - return true; - - // Pulling a new object : Perform sanity checks. - - if (!CanPull(puller.Owner, pullable.Owner)) - { - return false; - } - - if (!EntityManager.TryGetComponent(puller.Owner, out var pullerPhysics)) - { - return false; - } - - if (!EntityManager.TryGetComponent(pullable.Owner, out var pullablePhysics)) - { - return false; - } - - // Ensure that the puller is not currently pulling anything. - // If this isn't done, then it happens too late, and the start/stop messages go out of order, - // and next thing you know it thinks it's not pulling anything even though it is! - - var oldPullable = puller.Pulling; - if (oldPullable != null) - { - if (EntityManager.TryGetComponent(oldPullable.Value, out SharedPullableComponent? oldPullableComp)) - { - if (!TryStopPull(oldPullableComp)) - { - return false; - } - } - else - { - Log.Warning("Well now you've done it, haven't you? Someone transferred pulling (onto {0}) while presently pulling something that has no Pullable component (on {1})!", pullable.Owner, oldPullable); - return false; - } - } - - // Ensure that the pullable is not currently being pulled. - // Same sort of reasons as before. - - var oldPuller = pullable.Puller; - if (oldPuller != null) - { - if (!TryStopPull(pullable)) - { - return false; - } - } - - // Continue with pulling process. - - var pullAttempt = new PullAttemptEvent(pullerPhysics, pullablePhysics); - - RaiseLocalEvent(puller.Owner, pullAttempt, broadcast: false); - - if (pullAttempt.Cancelled) - { - return false; - } - - RaiseLocalEvent(pullable.Owner, pullAttempt, true); - - if (pullAttempt.Cancelled) - return false; - - _interaction.DoContactInteraction(pullable.Owner, puller.Owner); - - _pullSm.ForceRelationship(puller, pullable); - pullable.PrevFixedRotation = pullablePhysics.FixedRotation; - _physics.SetFixedRotation(pullable.Owner, pullable.FixedRotationOnPull, body: pullablePhysics); - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(puller.Owner):user} started pulling {ToPrettyString(pullable.Owner):target}"); - return true; - } - - public bool TryMoveTo(SharedPullableComponent pullable, EntityCoordinates to) - { - if (pullable.Puller == null) - { - return false; - } - - if (!EntityManager.HasComponent(pullable.Owner)) - { - return false; - } - - _pullSm.ForceSetMovingTo(pullable, to); - return true; - } - - public void StopMoveTo(SharedPullableComponent pullable) - { - _pullSm.ForceSetMovingTo(pullable, null); - } - } -} diff --git a/Content.Shared/Pulling/Systems/SharedPullingSystem.cs b/Content.Shared/Pulling/Systems/SharedPullingSystem.cs deleted file mode 100644 index 0c139ee9e3..0000000000 --- a/Content.Shared/Pulling/Systems/SharedPullingSystem.cs +++ /dev/null @@ -1,243 +0,0 @@ -using System.Diagnostics.CodeAnalysis; -using Content.Shared.Alert; -using Content.Shared.GameTicking; -using Content.Shared.Input; -using Content.Shared.Physics.Pull; -using Content.Shared.Pulling.Components; -using Content.Shared.Verbs; -using JetBrains.Annotations; -using Robust.Shared.Containers; -using Robust.Shared.Input.Binding; -using Robust.Shared.Map; -using Robust.Shared.Physics; -using Robust.Shared.Physics.Events; -using Robust.Shared.Physics.Systems; -using Robust.Shared.Player; - -namespace Content.Shared.Pulling -{ - [UsedImplicitly] - public abstract partial class SharedPullingSystem : EntitySystem - { - [Dependency] private readonly SharedPullingStateManagementSystem _pullSm = default!; - [Dependency] private readonly AlertsSystem _alertsSystem = default!; - [Dependency] private readonly SharedJointSystem _joints = default!; - - /// - /// A mapping of pullers to the entity that they are pulling. - /// - private readonly Dictionary _pullers = - new(); - - private readonly HashSet _moving = new(); - private readonly HashSet _stoppedMoving = new(); - - public IReadOnlySet Moving => _moving; - - public override void Initialize() - { - base.Initialize(); - - UpdatesOutsidePrediction = true; - - SubscribeLocalEvent(Reset); - SubscribeLocalEvent(OnPullStarted); - SubscribeLocalEvent(OnPullStopped); - SubscribeLocalEvent(HandleContainerInsert); - SubscribeLocalEvent(OnJointRemoved); - SubscribeLocalEvent(OnPullableCollisionChange); - - SubscribeLocalEvent(PullableHandlePullStarted); - SubscribeLocalEvent(PullableHandlePullStopped); - - SubscribeLocalEvent>(AddPullVerbs); - - CommandBinds.Builder - .Bind(ContentKeyFunctions.MovePulledObject, new PointerInputCmdHandler(HandleMovePulledObject)) - .Register(); - } - - private void OnPullableCollisionChange(EntityUid uid, SharedPullableComponent component, ref CollisionChangeEvent args) - { - if (component.PullJointId != null && !args.CanCollide) - { - _joints.RemoveJoint(uid, component.PullJointId); - } - } - - private void OnJointRemoved(EntityUid uid, SharedPullableComponent component, JointRemovedEvent args) - { - if (component.Puller != args.OtherEntity) - return; - - // Do we have some other join with our Puller? - // or alternatively: - // TODO track the relevant joint. - - if (TryComp(uid, out JointComponent? joints)) - { - foreach (var jt in joints.GetJoints.Values) - { - if (jt.BodyAUid == component.Puller || jt.BodyBUid == component.Puller) - return; - } - } - - // No more joints with puller -> force stop pull. - _pullSm.ForceDisconnectPullable(component); - } - - private void AddPullVerbs(EntityUid uid, SharedPullableComponent component, GetVerbsEvent args) - { - if (!args.CanAccess || !args.CanInteract) - return; - - // Are they trying to pull themselves up by their bootstraps? - if (args.User == args.Target) - return; - - //TODO VERB ICONS add pulling icon - if (component.Puller == args.User) - { - Verb verb = new() - { - Text = Loc.GetString("pulling-verb-get-data-text-stop-pulling"), - Act = () => TryStopPull(component, args.User), - DoContactInteraction = false // pulling handle its own contact interaction. - }; - args.Verbs.Add(verb); - } - else if (CanPull(args.User, args.Target)) - { - Verb verb = new() - { - Text = Loc.GetString("pulling-verb-get-data-text"), - Act = () => TryStartPull(args.User, args.Target), - DoContactInteraction = false // pulling handle its own contact interaction. - }; - args.Verbs.Add(verb); - } - } - - // Raise a "you are being pulled" alert if the pulled entity has alerts. - private void PullableHandlePullStarted(EntityUid uid, SharedPullableComponent component, PullStartedMessage args) - { - if (args.Pulled.Owner != uid) - return; - - _alertsSystem.ShowAlert(uid, AlertType.Pulled); - } - - private void PullableHandlePullStopped(EntityUid uid, SharedPullableComponent component, PullStoppedMessage args) - { - if (args.Pulled.Owner != uid) - return; - - _alertsSystem.ClearAlert(uid, AlertType.Pulled); - } - - public bool IsPulled(EntityUid uid, SharedPullableComponent? component = null) - { - return Resolve(uid, ref component, false) && component.BeingPulled; - } - - public override void Update(float frameTime) - { - base.Update(frameTime); - - _moving.ExceptWith(_stoppedMoving); - _stoppedMoving.Clear(); - } - - public void Reset(RoundRestartCleanupEvent ev) - { - _pullers.Clear(); - _moving.Clear(); - _stoppedMoving.Clear(); - } - - private void OnPullStarted(PullStartedMessage message) - { - SetPuller(message.Puller.Owner, message.Pulled.Owner); - } - - private void OnPullStopped(PullStoppedMessage message) - { - RemovePuller(message.Puller.Owner); - } - - protected void OnPullableMove(EntityUid uid, SharedPullableComponent component, PullableMoveMessage args) - { - _moving.Add(component); - } - - protected void OnPullableStopMove(EntityUid uid, SharedPullableComponent component, PullableStopMovingMessage args) - { - _stoppedMoving.Add(component); - } - - // TODO: When Joint networking is less shitcodey fix this to use a dedicated joints message. - private void HandleContainerInsert(EntInsertedIntoContainerMessage message) - { - if (TryComp(message.Entity, out SharedPullableComponent? pullable)) - { - TryStopPull(pullable); - } - - if (TryComp(message.Entity, out SharedPullerComponent? puller)) - { - if (puller.Pulling == null) return; - - if (!TryComp(puller.Pulling.Value, out SharedPullableComponent? pulling)) - return; - - TryStopPull(pulling); - } - } - - private bool HandleMovePulledObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid) - { - if (session?.AttachedEntity is not { } player || - !player.IsValid()) - return false; - - if (!TryGetPulled(player, out var pulled)) - return false; - - if (!TryComp(pulled.Value, out SharedPullableComponent? pullable)) - return false; - - if (_containerSystem.IsEntityInContainer(player)) - return false; - - TryMoveTo(pullable, coords); - - return false; - } - - private void SetPuller(EntityUid puller, EntityUid pulled) - { - _pullers[puller] = pulled; - } - - private bool RemovePuller(EntityUid puller) - { - return _pullers.Remove(puller); - } - - public EntityUid GetPulled(EntityUid by) - { - return _pullers.GetValueOrDefault(by); - } - - public bool TryGetPulled(EntityUid by, [NotNullWhen(true)] out EntityUid? pulled) - { - return (pulled = GetPulled(by)) != null; - } - - public bool IsPulling(EntityUid puller) - { - return _pullers.ContainsKey(puller); - } - } -} diff --git a/Content.Shared/RCD/Systems/RCDSystem.cs b/Content.Shared/RCD/Systems/RCDSystem.cs index 187c8d8a9d..f767d0b99c 100644 --- a/Content.Shared/RCD/Systems/RCDSystem.cs +++ b/Content.Shared/RCD/Systems/RCDSystem.cs @@ -104,8 +104,7 @@ private void OnAfterInteract(EntityUid uid, RCDComponent comp, AfterInteractEven BreakOnDamage = true, NeedHand = true, BreakOnHandChange = true, - BreakOnUserMove = true, - BreakOnTargetMove = args.Target != null, + BreakOnMove = true, AttemptFrequency = AttemptFrequency.EveryTick }; diff --git a/Content.Shared/RatKing/SharedRatKingSystem.cs b/Content.Shared/RatKing/SharedRatKingSystem.cs index d7a8ee5460..ea489e332d 100644 --- a/Content.Shared/RatKing/SharedRatKingSystem.cs +++ b/Content.Shared/RatKing/SharedRatKingSystem.cs @@ -119,7 +119,7 @@ private void OnGetVerb(EntityUid uid, RatKingRummageableComponent component, Get { BlockDuplicate = true, BreakOnDamage = true, - BreakOnUserMove = true, + BreakOnMove = true, DistanceThreshold = 2f }); } diff --git a/Content.Shared/Research/Systems/SharedResearchStealerSystem.cs b/Content.Shared/Research/Systems/SharedResearchStealerSystem.cs index 1fffa8c025..070ff40b70 100644 --- a/Content.Shared/Research/Systems/SharedResearchStealerSystem.cs +++ b/Content.Shared/Research/Systems/SharedResearchStealerSystem.cs @@ -46,8 +46,8 @@ private void OnBeforeInteractHand(EntityUid uid, ResearchStealerComponent comp, var doAfterArgs = new DoAfterArgs(EntityManager, uid, comp.Delay, new ResearchStealDoAfterEvent(), target: target, used: uid, eventTarget: uid) { BreakOnDamage = true, - BreakOnUserMove = true, - MovementThreshold = 0.5f + BreakOnMove = true, + MovementThreshold = 0.5f, }; _doAfter.TryStartDoAfter(doAfterArgs); diff --git a/Content.Shared/Salvage/Fulton/SharedFultonSystem.cs b/Content.Shared/Salvage/Fulton/SharedFultonSystem.cs index 0599482bbe..b355ae5873 100644 --- a/Content.Shared/Salvage/Fulton/SharedFultonSystem.cs +++ b/Content.Shared/Salvage/Fulton/SharedFultonSystem.cs @@ -153,8 +153,7 @@ private void OnFultonInteract(EntityUid uid, FultonComponent component, AfterInt { CancelDuplicate = true, MovementThreshold = 0.5f, - BreakOnUserMove = true, - BreakOnTargetMove = true, + BreakOnMove = true, Broadcast = true, NeedHand = true, }); diff --git a/Content.Shared/Security/Systems/DeployableBarrierSystem.cs b/Content.Shared/Security/Systems/DeployableBarrierSystem.cs index 7b9ce841a9..622edc4b62 100644 --- a/Content.Shared/Security/Systems/DeployableBarrierSystem.cs +++ b/Content.Shared/Security/Systems/DeployableBarrierSystem.cs @@ -1,6 +1,6 @@ using Content.Shared.Lock; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Security.Components; using Robust.Shared.Physics.Systems; @@ -11,7 +11,7 @@ public sealed class DeployableBarrierSystem : EntitySystem [Dependency] private readonly FixtureSystem _fixtures = default!; [Dependency] private readonly SharedPointLightSystem _pointLight = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; public override void Initialize() @@ -54,8 +54,8 @@ private void ToggleBarrierDeploy(EntityUid uid, bool isDeployed, DeployableBarri _physics.SetHard(uid, fixture, false); } - if (TryComp(uid, out SharedPullableComponent? pullable)) - _pulling.TryStopPull(pullable); + if (TryComp(uid, out PullableComponent? pullable)) + _pulling.TryStopPull(uid, pullable); SharedPointLightComponent? pointLight = null; if (_pointLight.ResolveLight(uid, ref pointLight)) diff --git a/Content.Shared/Sericulture/SericultureSystem.cs b/Content.Shared/Sericulture/SericultureSystem.cs index 514ec79f68..f7586cc1ec 100644 --- a/Content.Shared/Sericulture/SericultureSystem.cs +++ b/Content.Shared/Sericulture/SericultureSystem.cs @@ -61,7 +61,7 @@ private void OnSericultureStart(EntityUid uid, SericultureComponent comp, Sericu var doAfter = new DoAfterArgs(EntityManager, uid, comp.ProductionLength, new SericultureDoAfterEvent(), uid) { // I'm not sure if more things should be put here, but imo ideally it should probably be set in the component/YAML. Not sure if this is currently possible. - BreakOnUserMove = true, + BreakOnMove = true, BlockDuplicate = true, BreakOnDamage = true, CancelDuplicate = true, diff --git a/Content.Shared/Species/Systems/ReformSystem.cs b/Content.Shared/Species/Systems/ReformSystem.cs index dc2ce3fb90..d2ceecf28e 100644 --- a/Content.Shared/Species/Systems/ReformSystem.cs +++ b/Content.Shared/Species/Systems/ReformSystem.cs @@ -69,7 +69,7 @@ private void OnReform(EntityUid uid, ReformComponent comp, ReformEvent args) // Create a doafter & start it var doAfter = new DoAfterArgs(EntityManager, uid, comp.ReformTime, new ReformDoAfterEvent(), uid) { - BreakOnUserMove = true, + BreakOnMove = true, BlockDuplicate = true, BreakOnDamage = true, CancelDuplicate = true, @@ -89,7 +89,7 @@ private void OnDoAfter(EntityUid uid, ReformComponent comp, ReformDoAfterEvent a return; // Spawn a new entity - // This is, to an extent, taken from polymorph. I don't use polymorph for various reasons- most notably that this is permanent. + // This is, to an extent, taken from polymorph. I don't use polymorph for various reasons- most notably that this is permanent. var child = Spawn(comp.ReformPrototype, Transform(uid).Coordinates); // This transfers the mind to the new entity @@ -105,7 +105,7 @@ private void OnZombified(EntityUid uid, ReformComponent comp, ref EntityZombifie _actionsSystem.RemoveAction(uid, comp.ActionEntity); // Zombies can't reform } - public sealed partial class ReformEvent : InstantActionEvent { } + public sealed partial class ReformEvent : InstantActionEvent { } [Serializable, NetSerializable] public sealed partial class ReformDoAfterEvent : SimpleDoAfterEvent { } diff --git a/Content.Shared/SprayPainter/SharedSprayPainterSystem.cs b/Content.Shared/SprayPainter/SharedSprayPainterSystem.cs index 529e321f8d..feb1cebb8e 100644 --- a/Content.Shared/SprayPainter/SharedSprayPainterSystem.cs +++ b/Content.Shared/SprayPainter/SharedSprayPainterSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Doors.Components; using Content.Shared.Interaction; using Content.Shared.Popups; +using Content.Shared.Paint; using Content.Shared.SprayPainter.Components; using Content.Shared.SprayPainter.Prototypes; using Robust.Shared.Audio.Systems; @@ -129,10 +130,11 @@ private void OnAirlockInteract(Entity ent, ref Intera return; } + RemComp(ent); + var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, painter.AirlockSprayTime, new SprayPainterDoorDoAfterEvent(sprite, style.Department), args.Used, target: ent, used: args.Used) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, BreakOnDamage = true, NeedHand = true }; diff --git a/Content.Shared/StatusIcon/StatusIconPrototype.cs b/Content.Shared/StatusIcon/StatusIconPrototype.cs index a313f55c05..428ca95082 100644 --- a/Content.Shared/StatusIcon/StatusIconPrototype.cs +++ b/Content.Shared/StatusIcon/StatusIconPrototype.cs @@ -40,6 +40,12 @@ public int CompareTo(StatusIconData? other) /// [DataField] public StatusIconLayer Layer = StatusIconLayer.Base; + + /// + /// Offset of the status icon, up and down only. + /// + [DataField] + public int Offset = 0; } /// diff --git a/Content.Shared/Storage/EntitySystems/DumpableSystem.cs b/Content.Shared/Storage/EntitySystems/DumpableSystem.cs index c87174ba88..480e59122b 100644 --- a/Content.Shared/Storage/EntitySystems/DumpableSystem.cs +++ b/Content.Shared/Storage/EntitySystems/DumpableSystem.cs @@ -117,8 +117,7 @@ private void StartDoAfter(EntityUid storageUid, EntityUid? targetUid, EntityUid _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, userUid, delay, new DumpableDoAfterEvent(), storageUid, target: targetUid, used: storageUid) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, NeedHand = true }); } diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index 937831df9f..87b9af2dca 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -2,6 +2,7 @@ using Content.Shared.ActionBlocker; using Content.Shared.CombatMode; using Content.Shared.Containers.ItemSlots; +using Content.Shared.Coordinates; using Content.Shared.Destructible; using Content.Shared.DoAfter; using Content.Shared.Hands; @@ -11,6 +12,7 @@ using Content.Shared.Interaction; using Content.Shared.Item; using Content.Shared.Lock; +using Content.Shared.Materials; using Content.Shared.Placeable; using Content.Shared.Popups; using Content.Shared.Stacks; @@ -73,6 +75,8 @@ public override void Initialize() SubscribeLocalEvent(OnDoAfter); SubscribeLocalEvent(OnInteractWithItem); + + SubscribeLocalEvent(OnReclaimed); } private void OnComponentInit(EntityUid uid, StorageComponent storageComp, ComponentInit args) @@ -208,7 +212,7 @@ private void AfterInteract(EntityUid uid, StorageComponent storageComp, AfterInt var doAfterArgs = new DoAfterArgs(EntityManager, args.User, 0.2f * validStorables.Count, new AreaPickupDoAfterEvent(GetNetEntityList(validStorables)), uid, target: uid) { BreakOnDamage = true, - BreakOnUserMove = true, + BreakOnMove = true, NeedHand = true }; @@ -309,6 +313,11 @@ private void OnDoAfter(EntityUid uid, StorageComponent component, AreaPickupDoAf args.Handled = true; } + private void OnReclaimed(EntityUid uid, StorageComponent storageComp, GotReclaimedEvent args) + { + _containerSystem.EmptyContainer(storageComp.Container, destination: args.ReclaimerCoordinates); + } + private void OnDestroy(EntityUid uid, StorageComponent storageComp, DestructionEventArgs args) { var coordinates = _transform.GetMoverCoordinates(uid); diff --git a/Content.Shared/Strip/Components/StrippableComponent.cs b/Content.Shared/Strip/Components/StrippableComponent.cs index fbf99992e3..4faca4d8f2 100644 --- a/Content.Shared/Strip/Components/StrippableComponent.cs +++ b/Content.Shared/Strip/Components/StrippableComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.DoAfter; using Content.Shared.Inventory; using Robust.Shared.GameStates; using Robust.Shared.Serialization; @@ -8,10 +9,10 @@ namespace Content.Shared.Strip.Components public sealed partial class StrippableComponent : Component { /// - /// The strip delay for hands. + /// The strip delay for hands. /// [ViewVariables(VVAccess.ReadWrite), DataField("handDelay")] - public float HandStripDelay = 4f; + public TimeSpan HandStripDelay = TimeSpan.FromSeconds(4f); } [NetSerializable, Serializable] @@ -21,63 +22,63 @@ public enum StrippingUiKey : byte } [NetSerializable, Serializable] - public sealed class StrippingSlotButtonPressed : BoundUserInterfaceMessage + public sealed class StrippingSlotButtonPressed(string slot, bool isHand) : BoundUserInterfaceMessage { - public readonly string Slot; - - public readonly bool IsHand; - - public StrippingSlotButtonPressed(string slot, bool isHand) - { - Slot = slot; - IsHand = isHand; - } + public readonly string Slot = slot; + public readonly bool IsHand = isHand; } [NetSerializable, Serializable] - public sealed class StrippingEnsnareButtonPressed : BoundUserInterfaceMessage - { - public StrippingEnsnareButtonPressed() - { - } - } + public sealed class StrippingEnsnareButtonPressed : BoundUserInterfaceMessage; - public abstract class BaseBeforeStripEvent : EntityEventArgs, IInventoryRelayEvent + [ByRefEvent] + public abstract class BaseBeforeStripEvent(TimeSpan initialTime, bool stealth = false) : EntityEventArgs, IInventoryRelayEvent { - public readonly float InitialTime; - public float Time => MathF.Max(InitialTime * Multiplier + Additive, 0f); - public float Additive = 0; + public readonly TimeSpan InitialTime = initialTime; public float Multiplier = 1f; - public bool Stealth; + public TimeSpan Additive = TimeSpan.Zero; + public bool Stealth = stealth; - public SlotFlags TargetSlots { get; } = SlotFlags.GLOVES; + public TimeSpan Time => TimeSpan.FromSeconds(MathF.Max(InitialTime.Seconds * Multiplier + Additive.Seconds, 0f)); - public BaseBeforeStripEvent(float initialTime, bool stealth = false) - { - InitialTime = initialTime; - Stealth = stealth; - } + public SlotFlags TargetSlots { get; } = SlotFlags.GLOVES; } /// - /// Used to modify strip times. Raised directed at the user. + /// Used to modify strip times. Raised directed at the user. /// /// - /// This is also used by some stripping related interactions, i.e., interactions with items that are currently equipped by another player. + /// This is also used by some stripping related interactions, i.e., interactions with items that are currently equipped by another player. /// - public sealed class BeforeStripEvent : BaseBeforeStripEvent - { - public BeforeStripEvent(float initialTime, bool stealth = false) : base(initialTime, stealth) { } - } + [ByRefEvent] + public sealed class BeforeStripEvent(TimeSpan initialTime, bool stealth = false) : BaseBeforeStripEvent(initialTime, stealth); /// - /// Used to modify strip times. Raised directed at the target. + /// Used to modify strip times. Raised directed at the target. /// /// - /// This is also used by some stripping related interactions, i.e., interactions with items that are currently equipped by another player. + /// This is also used by some stripping related interactions, i.e., interactions with items that are currently equipped by another player. /// - public sealed class BeforeGettingStrippedEvent : BaseBeforeStripEvent + [ByRefEvent] + public sealed class BeforeGettingStrippedEvent(TimeSpan initialTime, bool stealth = false) : BaseBeforeStripEvent(initialTime, stealth); + + /// + /// Organizes the behavior of DoAfters for . + /// + [Serializable, NetSerializable] + public sealed partial class StrippableDoAfterEvent : DoAfterEvent { - public BeforeGettingStrippedEvent(float initialTime, bool stealth = false) : base(initialTime, stealth) { } + public readonly bool InsertOrRemove; + public readonly bool InventoryOrHand; + public readonly string SlotOrHandName; + + public StrippableDoAfterEvent(bool insertOrRemove, bool inventoryOrHand, string slotOrHandName) + { + InsertOrRemove = insertOrRemove; + InventoryOrHand = inventoryOrHand; + SlotOrHandName = slotOrHandName; + } + + public override DoAfterEvent Clone() => this; } } diff --git a/Content.Shared/Strip/Components/ThievingComponent.cs b/Content.Shared/Strip/Components/ThievingComponent.cs index 83679f132c..a851dd5ef6 100644 --- a/Content.Shared/Strip/Components/ThievingComponent.cs +++ b/Content.Shared/Strip/Components/ThievingComponent.cs @@ -11,7 +11,7 @@ public sealed partial class ThievingComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] [DataField("stripTimeReduction")] - public float StripTimeReduction = 0.5f; + public TimeSpan StripTimeReduction = TimeSpan.FromSeconds(0.5f); /// /// Should it notify the user if they're stripping a pocket? diff --git a/Content.Shared/Strip/SharedStrippableSystem.cs b/Content.Shared/Strip/SharedStrippableSystem.cs index a698ae5035..7afd4f245a 100644 --- a/Content.Shared/Strip/SharedStrippableSystem.cs +++ b/Content.Shared/Strip/SharedStrippableSystem.cs @@ -14,12 +14,12 @@ public override void Initialize() SubscribeLocalEvent(OnDragDrop); } - public (float Time, bool Stealth) GetStripTimeModifiers(EntityUid user, EntityUid target, float initialTime) + public (TimeSpan Time, bool Stealth) GetStripTimeModifiers(EntityUid user, EntityUid target, TimeSpan initialTime) { var userEv = new BeforeStripEvent(initialTime); - RaiseLocalEvent(user, userEv); + RaiseLocalEvent(user, ref userEv); var ev = new BeforeGettingStrippedEvent(userEv.Time, userEv.Stealth); - RaiseLocalEvent(target, ev); + RaiseLocalEvent(target, ref ev); return (ev.Time, ev.Stealth); } diff --git a/Content.Shared/Strip/ThievingSystem.cs b/Content.Shared/Strip/ThievingSystem.cs index 0ef4b66571..2b3d3b38a0 100644 --- a/Content.Shared/Strip/ThievingSystem.cs +++ b/Content.Shared/Strip/ThievingSystem.cs @@ -1,4 +1,5 @@ using Content.Shared.Inventory; +using Content.Shared.Strip; using Content.Shared.Strip.Components; namespace Content.Shared.Strip; diff --git a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs index ebd8362411..8d67aec518 100644 --- a/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs +++ b/Content.Shared/Teleportation/Systems/SharedPortalSystem.cs @@ -1,9 +1,9 @@ using System.Linq; using Content.Shared.Ghost; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Popups; using Content.Shared.Projectiles; -using Content.Shared.Pulling; -using Content.Shared.Pulling.Components; using Content.Shared.Teleportation.Components; using Content.Shared.Verbs; using Robust.Shared.Audio; @@ -28,7 +28,7 @@ public abstract class SharedPortalSystem : EntitySystem [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; - [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly PullingSystem _pulling = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; private const string PortalFixture = "portalFixture"; @@ -93,15 +93,15 @@ private void OnCollide(EntityUid uid, PortalComponent component, ref StartCollid return; // break pulls before portal enter so we dont break shit - if (TryComp(subject, out var pullable) && pullable.BeingPulled) + if (TryComp(subject, out var pullable) && pullable.BeingPulled) { - _pulling.TryStopPull(pullable); + _pulling.TryStopPull(subject, pullable); } - if (TryComp(subject, out var pulling) - && pulling.Pulling != null && TryComp(pulling.Pulling.Value, out var subjectPulling)) + if (TryComp(subject, out var pullerComp) + && TryComp(pullerComp.Pulling, out var subjectPulling)) { - _pulling.TryStopPull(subjectPulling); + _pulling.TryStopPull(subject, subjectPulling); } // if they came from another portal, just return and wait for them to exit the portal diff --git a/Content.Shared/Throwing/ThrowingSystem.cs b/Content.Shared/Throwing/ThrowingSystem.cs index 5429431831..7c861a85ad 100644 --- a/Content.Shared/Throwing/ThrowingSystem.cs +++ b/Content.Shared/Throwing/ThrowingSystem.cs @@ -20,6 +20,11 @@ public sealed class ThrowingSystem : EntitySystem { public const float ThrowAngularImpulse = 5f; + /// + /// Speed cap on rotation in case of click-spam. + /// + public const float ThrowAngularCap = 3f * MathF.PI; + public const float PushbackDefault = 2f; /// @@ -42,15 +47,17 @@ public void TryThrow( float strength = 1.0f, EntityUid? user = null, float pushbackRatio = PushbackDefault, + bool recoil = true, + bool animated = true, bool playSound = true) { - var thrownPos = Transform(uid).MapPosition; - var mapPos = coordinates.ToMap(EntityManager, _transform); + var thrownPos = _transform.GetMapCoordinates(uid); + var mapPos = _transform.ToMapCoordinates(coordinates); if (mapPos.MapId != thrownPos.MapId) return; - TryThrow(uid, mapPos.Position - thrownPos.Position, strength, user, pushbackRatio, playSound); + TryThrow(uid, mapPos.Position - thrownPos.Position, strength, user, pushbackRatio, recoil: recoil, animated: animated, playSound: playSound); } /// @@ -65,6 +72,8 @@ public void TryThrow(EntityUid uid, float strength = 1.0f, EntityUid? user = null, float pushbackRatio = PushbackDefault, + bool recoil = true, + bool animated = true, bool playSound = true) { var physicsQuery = GetEntityQuery(); @@ -72,7 +81,6 @@ public void TryThrow(EntityUid uid, return; var projectileQuery = GetEntityQuery(); - var tagQuery = GetEntityQuery(); TryThrow( uid, @@ -82,8 +90,7 @@ public void TryThrow(EntityUid uid, projectileQuery, strength, user, - pushbackRatio, - playSound); + pushbackRatio, recoil: recoil, animated: animated, playSound: playSound); } /// @@ -101,6 +108,8 @@ public void TryThrow(EntityUid uid, float strength = 1.0f, EntityUid? user = null, float pushbackRatio = PushbackDefault, + bool recoil = true, + bool animated = true, bool playSound = true) { if (strength <= 0 || direction == Vector2Helpers.Infinity || direction == Vector2Helpers.NaN || direction == Vector2.Zero) @@ -116,12 +125,17 @@ public void TryThrow(EntityUid uid, if (projectileQuery.TryGetComponent(uid, out var proj) && !proj.OnlyCollideWhenShot) return; - var comp = new ThrownItemComponent(); - comp.Thrower = user; + var comp = new ThrownItemComponent + { + Thrower = user, + Animate = animated, + }; // Estimate time to arrival so we can apply OnGround status and slow it much faster. var time = direction.Length() / strength; comp.ThrownTime = _gameTiming.CurTime; + // TODO: This is a bandaid, don't do this. + // if you want to force landtime have the caller handle it or add a new method. // did we launch this with something stronger than our hands? if (TryComp(comp.Thrower, out var hands) && strength > hands.ThrowForceMultiplier) comp.LandTime = comp.ThrownTime + TimeSpan.FromSeconds(time); @@ -166,7 +180,8 @@ public void TryThrow(EntityUid uid, if (user == null) return; - _recoil.KickCamera(user.Value, -direction * 0.04f); + if (recoil) + _recoil.KickCamera(user.Value, -direction * 0.04f); // Give thrower an impulse in the other direction if (pushbackRatio != 0.0f && diff --git a/Content.Shared/Throwing/ThrownItemComponent.cs b/Content.Shared/Throwing/ThrownItemComponent.cs index 16c9b13254..f7defaa4aa 100644 --- a/Content.Shared/Throwing/ThrownItemComponent.cs +++ b/Content.Shared/Throwing/ThrownItemComponent.cs @@ -8,6 +8,12 @@ namespace Content.Shared.Throwing [RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true), AutoGenerateComponentPause] public sealed partial class ThrownItemComponent : Component { + /// + /// Should the in-air throwing animation play. + /// + [DataField, AutoNetworkedField] + public bool Animate = true; + /// /// The entity that threw this entity. /// diff --git a/Content.Shared/Throwing/ThrownItemSystem.cs b/Content.Shared/Throwing/ThrownItemSystem.cs index 0f38c4d753..8645d9b723 100644 --- a/Content.Shared/Throwing/ThrownItemSystem.cs +++ b/Content.Shared/Throwing/ThrownItemSystem.cs @@ -3,8 +3,7 @@ using Content.Shared.Database; using Content.Shared.Gravity; using Content.Shared.Physics; -using Content.Shared.Physics.Pull; -using Robust.Shared.GameStates; +using Content.Shared.Movement.Pulling.Events; using Robust.Shared.Physics; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Events; @@ -85,8 +84,8 @@ private void OnSleep(EntityUid uid, ThrownItemComponent thrownItem, ref PhysicsS private void HandlePullStarted(PullStartedMessage message) { // TODO: this isn't directed so things have to be done the bad way - if (EntityManager.TryGetComponent(message.Pulled.Owner, out ThrownItemComponent? thrownItemComponent)) - StopThrow(message.Pulled.Owner, thrownItemComponent); + if (EntityManager.TryGetComponent(message.PulledUid, out ThrownItemComponent? thrownItemComponent)) + StopThrow(message.PulledUid, thrownItemComponent); } public void StopThrow(EntityUid uid, ThrownItemComponent thrownItemComponent) diff --git a/Content.Shared/Tools/Systems/SharedToolSystem.cs b/Content.Shared/Tools/Systems/SharedToolSystem.cs index ee15b1e025..4204d7547e 100644 --- a/Content.Shared/Tools/Systems/SharedToolSystem.cs +++ b/Content.Shared/Tools/Systems/SharedToolSystem.cs @@ -124,8 +124,8 @@ public bool UseTool( var doAfterArgs = new DoAfterArgs(EntityManager, user, delay / toolComponent.SpeedModifier, toolEvent, tool, target: target, used: tool) { BreakOnDamage = true, - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, + BreakOnWeightlessMove = false, NeedHand = tool != user, AttemptFrequency = IsWelder(tool) ? AttemptFrequency.EveryTick : AttemptFrequency.Never }; diff --git a/Content.Shared/Vehicle/SharedVehicleSystem.Rider.cs b/Content.Shared/Vehicle/SharedVehicleSystem.Rider.cs index 3acd823c73..553ae0ea15 100644 --- a/Content.Shared/Vehicle/SharedVehicleSystem.Rider.cs +++ b/Content.Shared/Vehicle/SharedVehicleSystem.Rider.cs @@ -1,5 +1,5 @@ using Content.Shared.Hands; -using Content.Shared.Physics.Pull; +using Content.Shared.Movement.Pulling.Events; using Content.Shared.Vehicle.Components; using Robust.Shared.GameStates; diff --git a/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs b/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs index 87e2f0890a..6aef4d0949 100644 --- a/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs +++ b/Content.Shared/VendingMachines/SharedVendingMachineSystem.Restock.cs @@ -70,8 +70,7 @@ private void OnAfterInteract(EntityUid uid, VendingMachineRestockComponent compo var doAfterArgs = new DoAfterArgs(EntityManager, args.User, (float) component.RestockDelay.TotalSeconds, new RestockDoAfterEvent(), target, target: target, used: uid) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, BreakOnDamage = true, NeedHand = true }; diff --git a/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs b/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs index 50803e8ee2..59f8489ac6 100644 --- a/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs +++ b/Content.Shared/VendingMachines/SharedVendingMachineSystem.cs @@ -7,6 +7,7 @@ using Robust.Shared.Audio; using Robust.Shared.Audio.Systems; using Robust.Shared.Network; +using Robust.Shared.Random; namespace Content.Shared.VendingMachines; @@ -17,6 +18,7 @@ public abstract partial class SharedVendingMachineSystem : EntitySystem [Dependency] protected readonly SharedAudioSystem Audio = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] protected readonly SharedPopupSystem Popup = default!; + [Dependency] protected readonly IRobustRandom Randomizer = default!; public override void Initialize() { @@ -27,11 +29,11 @@ public override void Initialize() protected virtual void OnComponentInit(EntityUid uid, VendingMachineComponent component, ComponentInit args) { - RestockInventoryFromPrototype(uid, component); + RestockInventoryFromPrototype(uid, component, component.InitialStockQuality); } public void RestockInventoryFromPrototype(EntityUid uid, - VendingMachineComponent? component = null) + VendingMachineComponent? component = null, float restockQuality = 1f) { if (!Resolve(uid, ref component)) { @@ -41,9 +43,9 @@ public void RestockInventoryFromPrototype(EntityUid uid, if (!PrototypeManager.TryIndex(component.PackPrototypeId, out VendingMachineInventoryPrototype? packPrototype)) return; - AddInventoryFromPrototype(uid, packPrototype.StartingInventory, InventoryType.Regular, component); - AddInventoryFromPrototype(uid, packPrototype.EmaggedInventory, InventoryType.Emagged, component); - AddInventoryFromPrototype(uid, packPrototype.ContrabandInventory, InventoryType.Contraband, component); + AddInventoryFromPrototype(uid, packPrototype.StartingInventory, InventoryType.Regular, component, restockQuality); + AddInventoryFromPrototype(uid, packPrototype.EmaggedInventory, InventoryType.Emagged, component, restockQuality); + AddInventoryFromPrototype(uid, packPrototype.ContrabandInventory, InventoryType.Contraband, component, restockQuality); } /// @@ -80,7 +82,7 @@ public List GetAvailableInventory(EntityUid uid, V private void AddInventoryFromPrototype(EntityUid uid, Dictionary? entries, InventoryType type, - VendingMachineComponent? component = null) + VendingMachineComponent? component = null, float restockQuality = 1.0f) { if (!Resolve(uid, ref component) || entries == null) { @@ -107,6 +109,15 @@ private void AddInventoryFromPrototype(EntityUid uid, Dictionary? { if (PrototypeManager.HasIndex(id)) { + var restock = amount; + var chanceOfMissingStock = 1 - restockQuality; + + var result = Randomizer.NextFloat(0, 1); + if (result < chanceOfMissingStock) + { + restock = (uint) Math.Floor(amount * result / chanceOfMissingStock); + } + if (inventory.TryGetValue(id, out var entry)) // Prevent a machine's stock from going over three times // the prototype's normal amount. This is an arbitrary @@ -114,9 +125,9 @@ private void AddInventoryFromPrototype(EntityUid uid, Dictionary? // restocking a machine who doesn't want to force vend out // all the items just to restock one empty slot without // losing the rest of the restock. - entry.Amount = Math.Min(entry.Amount + amount, 3 * amount); + entry.Amount = Math.Min(entry.Amount + amount, 3 * restock); else - inventory.Add(id, new VendingMachineInventoryEntry(type, id, amount)); + inventory.Add(id, new VendingMachineInventoryEntry(type, id, restock)); } } } diff --git a/Content.Shared/VendingMachines/VendingMachineComponent.cs b/Content.Shared/VendingMachines/VendingMachineComponent.cs index a7c8ae299a..725dc60e3b 100644 --- a/Content.Shared/VendingMachines/VendingMachineComponent.cs +++ b/Content.Shared/VendingMachines/VendingMachineComponent.cs @@ -123,6 +123,14 @@ public sealed partial class VendingMachineComponent : Component public float DenyAccumulator = 0f; public float DispenseOnHitAccumulator = 0f; + /// + /// The quality of the stock in the vending machine on spawn. + /// Represents the percentage chance (0.0f = 0%, 1.0f = 100%) each set of items in the machine is fully-stocked. + /// If not fully stocked, the stock will have a random value between 0 (inclusive) and max stock (exclusive). + /// + [DataField] + public float InitialStockQuality = 1.0f; + /// /// While disabled by EMP it randomly ejects items /// diff --git a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs index e5b35f6c0b..85d2e4675f 100644 --- a/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs +++ b/Content.Shared/Weapons/Melee/MeleeWeaponComponent.cs @@ -18,7 +18,7 @@ public sealed partial class MeleeWeaponComponent : Component /// /// Does this entity do a disarm on alt attack. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public bool AltDisarm = true; /// diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs index a8f7ee2395..261243fea3 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs @@ -74,8 +74,7 @@ private void OnBallisticAfterInteract(EntityUid uid, BallisticAmmoProviderCompon _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.FillDelay, new AmmoFillDoAfterEvent(), used: uid, target: args.Target, eventTarget: uid) { - BreakOnTargetMove = true, - BreakOnUserMove = true, + BreakOnMove = true, BreakOnDamage = false, NeedHand = true }); diff --git a/Content.Shared/Weather/IgnoreWeatherComponent.cs b/Content.Shared/Weather/BlockWeatherComponent.cs similarity index 51% rename from Content.Shared/Weather/IgnoreWeatherComponent.cs rename to Content.Shared/Weather/BlockWeatherComponent.cs index 8b8d004ee2..2ca8ba1aaa 100644 --- a/Content.Shared/Weather/IgnoreWeatherComponent.cs +++ b/Content.Shared/Weather/BlockWeatherComponent.cs @@ -3,10 +3,10 @@ namespace Content.Shared.Weather; /// -/// This entity will be ignored for considering weather on a tile +/// This entity will block the weather if it's anchored to the floor. /// [RegisterComponent, NetworkedComponent] -public sealed partial class IgnoreWeatherComponent : Component +public sealed partial class BlockWeatherComponent : Component { } diff --git a/Content.Shared/Weather/SharedWeatherSystem.cs b/Content.Shared/Weather/SharedWeatherSystem.cs index c907137d84..45a2afe7cd 100644 --- a/Content.Shared/Weather/SharedWeatherSystem.cs +++ b/Content.Shared/Weather/SharedWeatherSystem.cs @@ -19,13 +19,13 @@ public abstract class SharedWeatherSystem : EntitySystem [Dependency] private readonly MetaDataSystem _metadata = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; - private EntityQuery _ignoreQuery; + private EntityQuery _blockQuery; private EntityQuery _physicsQuery; public override void Initialize() { base.Initialize(); - _ignoreQuery = GetEntityQuery(); + _blockQuery = GetEntityQuery(); _physicsQuery = GetEntityQuery(); SubscribeLocalEvent(OnWeatherUnpaused); } @@ -57,13 +57,8 @@ public bool CanWeatherAffect( while (anchoredEnts.MoveNext(out var ent)) { - if (!_ignoreQuery.HasComponent(ent.Value) && - _physicsQuery.TryGetComponent(ent, out var body) && - body.Hard && - body.CanCollide) - { + if (_blockQuery.HasComponent(ent.Value)) return false; - } } return true; diff --git a/Content.Shared/Zombies/InitialInfectedComponent.cs b/Content.Shared/Zombies/InitialInfectedComponent.cs new file mode 100644 index 0000000000..3200dd7f5e --- /dev/null +++ b/Content.Shared/Zombies/InitialInfectedComponent.cs @@ -0,0 +1,16 @@ +using Content.Shared.Antag; +using Content.Shared.StatusIcon; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Zombies; + +[RegisterComponent, NetworkedComponent] +public sealed partial class InitialInfectedComponent : Component, IAntagStatusIconComponent +{ + [DataField("initialInfectedStatusIcon")] + public ProtoId StatusIcon { get; set; } = "InitialInfectedFaction"; + + [DataField] + public bool IconVisibleToGhost { get; set; } = true; +} diff --git a/Content.Shared/Zombies/ZombieComponent.cs b/Content.Shared/Zombies/ZombieComponent.cs index 023bf751ff..be3fdbdd01 100644 --- a/Content.Shared/Zombies/ZombieComponent.cs +++ b/Content.Shared/Zombies/ZombieComponent.cs @@ -110,7 +110,9 @@ public sealed partial class ZombieComponent : Component, IAntagStatusIconCompone { { "Blunt", -0.4 }, { "Slash", -0.2 }, - { "Piercing", -0.2 } + { "Piercing", -0.2 }, + { "Heat", -0.02 }, + { "Shock", -0.02 } } }; @@ -140,6 +142,12 @@ public sealed partial class ZombieComponent : Component, IAntagStatusIconCompone [DataField("greetSoundNotification")] public SoundSpecifier GreetSoundNotification = new SoundPathSpecifier("/Audio/Ambience/Antag/zombie_start.ogg"); + /// + /// Hit sound on zombie bite. + /// + [DataField] + public SoundSpecifier BiteSound = new SoundPathSpecifier("/Audio/Effects/bite.ogg"); + /// /// The blood reagent of the humanoid to restore in case of cloning /// diff --git a/Resources/Audio/Items/attributions.yml b/Resources/Audio/Items/attributions.yml index 8942e41db2..e63b678ef8 100644 --- a/Resources/Audio/Items/attributions.yml +++ b/Resources/Audio/Items/attributions.yml @@ -102,3 +102,8 @@ license: "CC-BY-SA-3.0" copyright: "Taken from tgstation, modified by themias (github) for ss14" source: "https://github.com/tgstation/tgstation/tree/85a0925051bb00e7a950ee66cb7f87982cd22439/sound/effects/shovel_dig.ogg" + +- files: ["smoke_grenade_prime.ogg", "smoke_grenade_smoke.ogg"] + license: "CC0-1.0" + copyright: "Bhijn and Myr (github username deathride58)" + source: "https://github.com/space-wizards/space-station-14/pull/23476" diff --git a/Resources/Audio/Items/smoke_grenade_prime.ogg b/Resources/Audio/Items/smoke_grenade_prime.ogg new file mode 100644 index 0000000000..1c6cbcd25a Binary files /dev/null and b/Resources/Audio/Items/smoke_grenade_prime.ogg differ diff --git a/Resources/Audio/Items/smoke_grenade_smoke.ogg b/Resources/Audio/Items/smoke_grenade_smoke.ogg new file mode 100644 index 0000000000..7603869d17 Binary files /dev/null and b/Resources/Audio/Items/smoke_grenade_smoke.ogg differ diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index b0e69984b5..12588b9127 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,2902 +1,3814 @@ -Entries: -- author: Nairodian - changes: - - {message: Fixed Holobarriers being unable to be destroyed., type: Fix} - id: 4850 - time: '2023-09-18T01:22:39.0000000+00:00' -- author: Ilya246 - changes: - - {message: Blood-red magboots' jetpack now works again., type: Fix} - id: 4851 - time: '2023-09-18T06:13:12.0000000+00:00' -- author: JoeHammad - changes: - - {message: The syndicate have started using cheaper materials in the manufacture - of their over ear headsets, type: Add} - id: 4852 - time: '2023-09-18T19:18:56.0000000+00:00' -- author: PursuitinAshes - changes: - - {message: Nanotrasen now properly supplies its captains with appropriate headgear - in all of their lockers., type: Fix} - id: 4853 - time: '2023-09-18T19:20:10.0000000+00:00' -- author: deltanedas - changes: - - {message: The Syndicate has cracked the binary radio channel's encryption and - is offering keys for 4 TC., type: Add} - id: 4854 - time: '2023-09-18T19:20:56.0000000+00:00' -- author: liltenhead - changes: - - {message: Increased the amount of barotrauma damage you receive., type: Tweak} - id: 4855 - time: '2023-09-18T19:21:36.0000000+00:00' -- author: HerCoyote23 - changes: - - {message: 'The Syndicate has grown tired of losing overconfident "Loud" agents, - and has reduced their stealth gear prices to encourage a more sneaky approach.', - type: Tweak} - id: 4856 - time: '2023-09-18T21:07:00.0000000+00:00' -- author: Doru991 - changes: - - {message: Berry seeds are now available from the MegaSeed Servitor., type: Add} - - {message: Seeds for the bungo fruit are included in the exotic seed crate., type: Add} - id: 4857 - time: '2023-09-19T03:29:28.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Skeletons have been reported in the closets of various station officials. - And maintenance., type: Add} - - {message: Skeletons can no longer have a pitch-black coloration., type: Tweak} - id: 4858 - time: '2023-09-19T05:05:18.0000000+00:00' -- author: metalgearsloth - changes: - - {message: 'Expeditions have been massively tweaked. Timer is 7 minutes, loot count - is significantly up, added significantly more loot to the loot table, mob count - is significantly up, and mobs overall have been nerfed (no more 15 damage carps - ending you). It also has a flat 13 minute cooldown. Better bring your fultons - if you expect to bring stuff back.', type: Tweak} - id: 4859 - time: '2023-09-19T12:52:01.0000000+00:00' -- author: Repo - changes: - - {message: Time out for particular uplink items for balancing. Syndicate Bomb can - only be purchased after 30min., type: Add} - id: 4860 - time: '2023-09-19T23:51:15.0000000+00:00' -- author: liltenhead - changes: - - {message: Reduced the crafting costs of the buckler and makeshift shield., type: Tweak} - id: 4861 - time: '2023-09-20T04:49:43.0000000+00:00' -- author: dahnte - changes: - - {message: Added frontal lisp as a character trait for all species!, type: Add} - id: 4862 - time: '2023-09-20T04:51:50.0000000+00:00' -- author: Alekshhh - changes: - - {message: Changed most medkit fills, type: Tweak} - id: 4863 - time: '2023-09-20T07:50:19.0000000+00:00' -- author: Alekshhh - changes: - - {message: Added U-shaped rails, type: Add} - id: 4864 - time: '2023-09-20T08:26:17.0000000+00:00' -- author: Just_Art - changes: - - {message: Added corn in butter., type: Add} - - {message: Increased popcorn cooking time., type: Tweak} - id: 4865 - time: '2023-09-20T09:51:09.0000000+00:00' -- author: metalgearsloth - changes: - - {message: 'Fix some do_afters mispredicting, e.g. removing encryption keys from - headsets.', type: Fix} - id: 4866 - time: '2023-09-20T12:01:54.0000000+00:00' -- author: ike709 - changes: - - {message: Added a search filter to vending machines, type: Add} - id: 4867 - time: '2023-09-20T19:40:41.0000000+00:00' -- author: waylon531 - changes: - - {message: Centcomm is tired of the crew drunkenly wandering the station and starting - brawls. Many mixed drinks now have half as much alcohol., type: Tweak} - id: 4868 - time: '2023-09-21T00:58:57.0000000+00:00' -- author: metalgearsloth - changes: - - {message: Fix xeno ghost roles showing up for expeditions., type: Fix} - id: 4869 - time: '2023-09-21T13:21:43.0000000+00:00' -- author: mirrorcult - changes: - - {message: 'Added improvised bows & arrows to construction, have fun embedding - people with arrows', type: Add} - - {message: Added quivers as random maint loot drops, type: Add} - id: 4870 - time: '2023-09-22T09:45:21.0000000+00:00' -- author: Vasilis - changes: - - {message: The guidebook now has a pop-out button. This will turn it into a system - window that you can drag wherever is convenient such as a second monitor., type: Add} - - {message: 'The Steam overlay has been disabled due to conflicts with pop-out windows. - Due to a bug with Steam, the game''s graphics will corrupt when overlay is enabled - and a popout window is opened.', type: Remove} - id: 4871 - time: '2023-09-22T19:52:31.0000000+00:00' -- author: TheArturZh - changes: - - {message: Station records console works properly again, type: Fix} - id: 4872 - time: '2023-09-22T19:57:06.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: 'The rat king can now rummage through disposal units to get trash, cheese, - or gold.', type: Add} - - {message: 'The rat king now can command its servants to do various actions. They - can sit, follow, attack a target, or go buck-wild, all at the King''s command', - type: Add} - - {message: Rat servants are no longer ghost roles., type: Remove} - id: 4873 - time: '2023-09-22T20:01:05.0000000+00:00' -- author: waylon531 - changes: - - {message: The surgeons at Centcomm have made it so drinking too much alcohol will - now cause liver failure instead of heart failure. Alcoholics rejoice!, type: Fix} - id: 4874 - time: '2023-09-22T20:01:42.0000000+00:00' -- author: dahnte +Entries: +- author: degradka + changes: + - message: Prevent oversized items from being placed in the microwave. + type: Fix + id: 5697 + time: '2024-01-13T21:11:10.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24026 +- author: Bhijn and Myr changes: - - {message: Improved lisp letter matching and clarity., type: Fix} - id: 4875 - time: '2023-09-23T05:39:47.0000000+00:00' -- author: EmoGarbage404 + - message: The QM's uniform has received a redesign, making it more visually distinguishable + for those with colorblindness. + type: Tweak + id: 5698 + time: '2024-01-14T02:45:06.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24055 +- author: lzk228 changes: - - {message: Skeletons no longer asphyxiate due to their lack of lungs., type: Fix} - id: 4876 - time: '2023-09-23T08:24:58.0000000+00:00' -- author: PrPleGoo - changes: - - {message: Added onion goggles for the chef. It displays hunger icons for hungry/overfed - mobs. Can also be eaten., type: Add} - - {message: The beer goggles now display thirst icons for thirsty/overhydrated mobs., - type: Tweak} - id: 4877 - time: '2023-09-23T13:14:06.0000000+00:00' -- author: ElectroJr + - message: Removed archaic accent. + type: Remove + id: 5699 + time: '2024-01-14T02:45:54.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24052 +- author: 21Melkuu + changes: + - message: Added Mayo to the Chefvend. + type: Add + id: 5700 + time: '2024-01-14T02:47:19.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24017 +- author: Aexxie changes: - - {message: Fixed spellbooks not granting spell actions., type: Fix} - id: 4878 - time: '2023-09-23T16:33:39.0000000+00:00' + - message: Lizards' punch animation now matches their damage type + type: Fix + - message: Spiders now deal piercing damage instead of slash damage when unarmed, + as intended. Their animation has been changed to the biting animation as well. + type: Fix + id: 5701 + time: '2024-01-14T03:08:20.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24019 - author: deltanedas changes: - - {message: Armed nuclear explosives can be seen on station maps., type: Tweak} - id: 4879 - time: '2023-09-23T19:15:05.0000000+00:00' -- author: Repo - changes: - - {message: Nukies can declare war again., type: Fix} - id: 4880 - time: '2023-09-23T20:00:13.0000000+00:00' -- author: Doru991 - changes: - - {message: Trash spawns correctly after food is eaten., type: Fix} - id: 4881 - time: '2023-09-24T17:20:03.0000000+00:00' -- author: DrTeaSpoon - changes: - - {message: Arrows can now be doped with chemicals., type: Tweak} - - {message: Spears now correctly transfares chemicals when thrown., type: Fix} - id: 4882 - time: '2023-09-24T19:46:16.0000000+00:00' -- author: mirrorcult - changes: - - {message: You can now pick up items (and dead pickupable mobs) in combat mode, - type: Add} - id: 4883 - time: '2023-09-24T19:47:42.0000000+00:00' -- author: Slava0135 - changes: - - {message: Fixed people getting too thirsty., type: Fix} - id: 4884 - time: '2023-09-24T19:50:41.0000000+00:00' -- author: PixelTK - changes: - - {message: Arachnids have one new back marking., type: Add} - id: 4885 - time: '2023-09-24T19:54:39.0000000+00:00' -- author: Slava0135 - changes: - - {message: Syndicate agents can no longer buy hot potatoes because of food safety - regulations, type: Remove} - id: 4886 - time: '2023-09-24T19:56:07.0000000+00:00' -- author: Tunguso4ka - changes: - - {message: Added gladiator`s helmet and uniform for both the station and planet - gladiators., type: Add} - - {message: Added bone armor and spear to please our lava planet habitats., type: Add} - id: 4887 - time: '2023-09-24T19:57:10.0000000+00:00' -- author: liltenhead - changes: - - {message: Lowered the maximum explosion range of canister bombs., type: Tweak} - id: 4888 - time: '2023-09-24T19:59:05.0000000+00:00' -- author: CaptainSqrBeard - changes: - - {message: 'Now after killing all nuclear operatives, the emergency shuttle will - be called instead of instant round end. Shuttle arrives in 10 minutes and you - can recall it.', type: Tweak} - id: 4889 - time: '2023-09-24T20:16:33.0000000+00:00' -- author: mirrorcult - changes: - - {message: Ghosts can now toggle whether they hear out-of-range local messages - using an action, type: Add} - id: 4890 - time: '2023-09-24T20:34:09.0000000+00:00' -- author: daerSeebaer - changes: - - {message: The AME now shuts down when the inserted fuel jar is empty, type: Add} - - {message: The AME no longer makes sounds if no fuel was injected, type: Tweak} - id: 4891 - time: '2023-09-24T20:39:49.0000000+00:00' -- author: gusxyz - changes: - - {message: Empty ore boxes are now orderable from cargo., type: Add} - id: 4892 - time: '2023-09-24T20:52:07.0000000+00:00' -- author: mirrorcult - changes: - - {message: Your character will now rotate in the direction of your mouse cursor - while in combat mode, type: Add} - id: 4893 - time: '2023-09-24T21:22:45.0000000+00:00' -- author: TK-A369 - changes: - - {message: 'After several complaints from chemists, Nanotrasen decided to update - their Chemistry Guidebook to include information about environment required - by reaction to occur.', type: Add} - id: 4894 - time: '2023-09-24T21:33:25.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Fire extinguishers now use less fluid per burst and launch the user - farther in low-gravity., type: Tweak} - id: 4895 - time: '2023-09-25T01:33:29.0000000+00:00' -- author: Psychpsyo - changes: - - {message: 'People and animals no longer have two hearts, livers, sets of lungs - or kidneys. You probably didn''t need the extra pair anyways.', type: Fix} - id: 4896 - time: '2023-09-25T06:53:04.0000000+00:00' -- author: Nimfar11 + - message: Revolutionaries that are deconverted by headrevs dying get a window shown + explaining that they are no longer revs, to help with tunnel vision. + type: Tweak + id: 5702 + time: '2024-01-14T03:20:35.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23315 +- author: tday + changes: + - message: Add admin logs for thermomachines. + type: Add + id: 5703 + time: '2024-01-14T04:05:45.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24056 +- author: degradka + changes: + - message: The HOS's dresser now contains a neck gaiter. + type: Add + id: 5704 + time: '2024-01-14T04:12:37.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24003 +- author: Errant changes: - - {message: Adds a new sprite for Syndicate implanters., type: Add} - id: 4897 - time: '2023-09-26T00:04:03.0000000+00:00' -- author: Ubaser + - message: Map labels now adjust to zoom level and UI scale, retaining a consistent + look. + type: Fix + - message: Map labels now have better contrast over walls. + type: Tweak + - message: Examining (shift-click) the map screen now toggles map labels on/off. + type: Tweak + id: 5705 + time: '2024-01-14T05:08:43.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23777 +- author: Ilya246 changes: - - {message: Added four new lizard horn markings!, type: Add} - id: 4898 - time: '2023-09-26T02:24:09.0000000+00:00' + - message: Nuclear operatives may now buy syndicate bombs without waiting 30 minutes. + type: Tweak + id: 5706 + time: '2024-01-14T05:25:19.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24022 +- author: Tayrtahn + changes: + - message: Nanotrasen has started installing intercoms with unscrewable panels for + wire maintenance. + type: Add + id: 5707 + time: '2024-01-14T05:37:28.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23984 - author: Whisper changes: - - {message: The health analyzer no longer shows zero-damage groups., type: Fix} - id: 4899 - time: '2023-09-26T04:37:23.0000000+00:00' -- author: waylon531 - changes: - - {message: Nocturine and welder blindness work again., type: Fix} - id: 4900 - time: '2023-09-26T17:46:14.0000000+00:00' -- author: gusxyz - changes: - - {message: Syndicate bomb no longer has anomalous properties., type: Tweak} - id: 4901 - time: '2023-09-26T22:05:46.0000000+00:00' -- author: Bhijn and Myr - changes: - - {message: 'Interaction outlines have been slightly reworked, and feature finer - artistic control. Edge cases no longer result in interaction outlines being - faintly visible in pitch black areas, out-of-range outlines are far less visible - in dim conditions, outlines now properly fade when over a fullbright backdrop - like parallax, and outlines now do a much better job at fading with penumbras.', - type: Tweak} - id: 4902 - time: '2023-09-27T09:22:32.0000000+00:00' -- author: DrSmugleaf - changes: - - {message: Fixed there being no confirmation for role bans., type: Fix} - id: 4903 - time: '2023-09-27T15:27:08.0000000+00:00' -- author: c0rigin - changes: - - {message: What moths consider as food is now more consistent., type: Tweak} - id: 4904 - time: '2023-09-27T16:50:59.0000000+00:00' -- author: DrSmugleaf - changes: - - {message: Fixed getting moved briefly when closing a crematorium that you are - standing over., type: Fix} - id: 4905 - time: '2023-09-27T23:41:07.0000000+00:00' -- author: Psychpsyo - changes: - - {message: 'You can now pet Runtime instead of petting >the< Runtime. Also, Smile - is now a girl.', type: Fix} - id: 4906 - time: '2023-09-28T04:05:50.0000000+00:00' + - message: Cerberus now has hostile AI + type: Add + id: 5708 + time: '2024-01-14T10:19:36.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24028 - author: Psychpsyo changes: - - {message: Bingus is no longer fuzzy., type: Fix} - id: 4907 - time: '2023-09-28T04:06:13.0000000+00:00' -- author: Psychpsyo - changes: - - {message: The wet floor sign can now be worn as an outer clothing. This now gives - syndicate janitors access to a suicide vest in form the wet floor sign mine., - type: Add} - id: 4908 - time: '2023-09-28T04:09:45.0000000+00:00' -- author: LEVELcat - changes: - - {message: Eyeglass are now available from the ClothesMate., type: Add} - id: 4909 - time: '2023-09-28T10:52:05.0000000+00:00' -- author: Repo - changes: - - {message: Pun Pun now showing on crew monitoring., type: Fix} - id: 4910 - time: '2023-09-28T10:53:54.0000000+00:00' -- author: nikthechampiongr - changes: - - {message: Mappers can now place airlocks that can be pried open while unpowered - without tools., type: Add} - id: 4911 - time: '2023-09-28T11:34:22.0000000+00:00' -- author: Doru991 - changes: - - {message: Arcade machine maintenance panels can be opened again., type: Fix} - id: 4912 - time: '2023-09-28T14:00:19.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: The health alerts now have text to help discern how gravely injured - you are., type: Tweak} - id: 4913 - time: '2023-09-28T14:05:42.0000000+00:00' -- author: NULL882 - changes: - - {message: Added Necropolis Wall., type: Add} - - {message: Added Mine Wall., type: Add} - - {message: Added Sings for Mine Wall., type: Add} - id: 4914 - time: '2023-09-28T17:07:13.0000000+00:00' -- author: lunarcomets - changes: - - {message: 'Tweaked archaic issues to fix capitalization issues, and removed the - replacement for ''request'' for consistency.', type: Tweak} - id: 4915 - time: '2023-09-28T19:19:58.0000000+00:00' -- author: DrSmugleaf - changes: - - {message: Changed the player actions panel to ask for confirmation when kicking - and respawning players., type: Tweak} - id: 4916 - time: '2023-09-28T22:46:07.0000000+00:00' -- author: DrSmugleaf - changes: - - {message: Fixed not being able to choose a role that you were unbanned from in - the same round without reconnecting., type: Fix} - id: 4917 - time: '2023-09-28T23:46:39.0000000+00:00' -- author: Micr0byte - changes: - - {message: Pressing F11 now toggles between full-screen and windowed modes., type: Add} - id: 4918 - time: '2023-09-28T23:55:10.0000000+00:00' -- author: DrSmugleaf - changes: - - {message: Fixed everyone being bald., type: Fix} - id: 4919 - time: '2023-09-29T00:44:47.0000000+00:00' -- author: DrSmugleaf - changes: - - {message: Fixed the HoP's id card computer not opening., type: Fix} - id: 4920 - time: '2023-09-29T00:59:14.0000000+00:00' -- author: mirrorcult - changes: - - {message: 'Being damaged, being stunned, or going into crit will now force you - to send whatever message you were typing, if it was in local/whisper/radio. - You''ll sometimes find yours-AUGH', type: Add} - id: 4921 - time: '2023-09-29T01:05:37.0000000+00:00' -- author: DrSmugleaf - changes: - - {message: Fixed AHelp progressively gaining more panels., type: Fix} - id: 4922 - time: '2023-09-29T01:46:16.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Fixed skeletons spawning in folded containers., type: Fix} - id: 4923 - time: '2023-09-29T03:55:29.0000000+00:00' -- author: casperr04 - changes: - - {message: Fixed the true name of disguised players being shown when electrocuted., - type: Fix} - id: 4924 - time: '2023-09-29T15:01:19.0000000+00:00' -- author: TsjipTsjip - changes: - - {message: Kettle's medical ward was reworked., type: Tweak} - id: 4925 - time: '2023-09-29T19:14:53.0000000+00:00' -- author: daerSeebaer - changes: - - {message: Volumetric pumps now indicate if they can't pump., type: Add} - id: 4926 - time: '2023-09-30T03:35:23.0000000+00:00' -- author: deltanedas - changes: - - {message: Fixed cognizine not creating ghost roles., type: Fix} - id: 4927 - time: '2023-09-30T17:53:22.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Holofans can now be destroyed by explosions., type: Fix} - id: 4928 - time: '2023-09-30T19:08:09.0000000+00:00' -- author: deltanedas - changes: - - {message: 'Space dragons get a proper greentext in the round end summary, along - with objectives in the character menu.', type: Tweak} - id: 4929 - time: '2023-09-30T20:18:02.0000000+00:00' -- author: Ubaser - changes: - - {message: Winter Boots are now available in the Winterdrobe., type: Add} - id: 4930 - time: '2023-10-01T14:28:14.0000000+00:00' -- author: Ubaser - changes: - - {message: 'QM now has a mantle, available at HoP''s uniform printer.', type: Add} - id: 4931 - time: '2023-10-01T14:28:47.0000000+00:00' -- author: Nimfar11 - changes: - - {message: Added new sprites for slime organs, type: Add} - - {message: Slimes now breathe nitrogen too., type: Tweak} - id: 4932 - time: '2023-10-01T14:34:29.0000000+00:00' -- author: casperr04 - changes: - - {message: Space ninjas now have random appearance., type: Tweak} - id: 4933 - time: '2023-10-01T14:51:35.0000000+00:00' -- author: TomCruize - changes: - - {message: Made Space Cats lungs ROBUST (They now don't suffocate in space), type: Fix} - id: 4934 - time: '2023-10-01T14:55:59.0000000+00:00' -- author: TheShuEd - changes: - - {message: Added wide-spectrum anomaly locator., type: Add} - id: 4935 - time: '2023-10-01T16:41:32.0000000+00:00' -- author: michaelcu - changes: - - {message: Telescopic Shield no longer glows in the dark when deployed., type: Fix} - id: 4936 - time: '2023-10-01T17:16:54.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Nuclear Operative medics now come with a custom hardsuit., type: Add} - id: 4937 - time: '2023-10-01T17:36:20.0000000+00:00' -- author: DrTeaSpoon - changes: - - {message: Plant species mutation no longer resets other mutations., type: Fix} - id: 4938 - time: '2023-10-01T17:52:45.0000000+00:00' -- author: Nairodian - changes: - - {message: Science can now research practice ammunition for security., type: Add} - id: 4939 - time: '2023-10-01T20:18:05.0000000+00:00' -- author: Nimfar11 - changes: - - {message: Adds Advanced treatment cyborg module to the medical borg., type: Add} - - {message: Adds two new medical tools for the borg. Borghypo and Borgdropper., - type: Add} - id: 4940 - time: '2023-10-01T20:45:17.0000000+00:00' -- author: Velcroboy - changes: - - {message: Nanotrasen suppliers now carry restocks for ChefVends and popular condiments. - Get them at your nearest cargo depot., type: Add} - id: 4941 - time: '2023-10-01T20:49:10.0000000+00:00' -- author: chromiumboy + - message: Plates and money now go into inventories sideways, as they should. + type: Tweak + id: 5709 + time: '2024-01-14T16:44:17.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24075 +- author: themias changes: - - {message: Fix praying door hacking protections., type: Fix} - id: 4942 - time: '2023-10-01T21:08:03.0000000+00:00' + - message: Graves require a shovel or spade (trowel) to dig + type: Tweak + - message: Graves decay bodies faster + type: Tweak + id: 5710 + time: '2024-01-14T16:47:32.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23646 - author: Nairodian changes: - - {message: Small firearms now fit in boots., type: Tweak} - id: 4943 - time: '2023-10-01T21:23:41.0000000+00:00' -- author: deltanedas - changes: - - {message: 'Added the Electric Grill for cooking steaks quickly, research food - service to make it.', type: Add} - id: 4944 - time: '2023-10-02T00:17:50.0000000+00:00' -- author: Pigeonpeas - changes: - - {message: 'Added a new lizard horn marking for the head, kobold ears!', type: Add} - id: 4945 - time: '2023-10-02T07:08:20.0000000+00:00' -- author: JoeHammad - changes: - - {message: 'the north star gloves have had their damage changed back to 8, as was - originally intended', type: Tweak} - id: 4946 - time: '2023-10-02T15:34:22.0000000+00:00' -- author: Vasilis + - message: Added four new reagent slimes, Mute Toxin, Norepinephric Acid, Ephedrine, + and Robust Harvest. + type: Add + id: 5711 + time: '2024-01-14T22:14:19.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24087 +- author: Dygon + changes: + - message: The particle decelerator's projectile now deals less damage, has a shorter + lifespan and can be reflected by objects that reflect energy projectiles. + type: Tweak + - message: Bullet grenade projectiles no longer penetrate walls. + type: Fix + id: 5712 + time: '2024-01-14T23:39:09.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24032 +- author: Rainbeon changes: - - {message: The immovable rod gibs you instead of deleting your character again., - type: Fix} - id: 4947 - time: '2023-10-02T18:30:51.0000000+00:00' -- author: deltanedas + - message: Added Aloxadone, a cryogenics chemical for treating patients with third + degree burns. + type: Add + id: 5713 + time: '2024-01-15T03:57:31.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23980 +- author: Bhijn and Myr changes: - - {message: Pizza recipes now require flat dough. Get a rolling pin from the dinnerware - vendor., type: Add} - id: 4948 - time: '2023-10-02T19:21:15.0000000+00:00' -- author: VigersRay - changes: - - {message: The syndicate has begun to recruit more experienced people into the - ranks of nuclear operatives., type: Tweak} - id: 4949 - time: '2023-10-02T21:20:09.0000000+00:00' -- author: Doru991 - changes: - - {message: Plant species mutations correctly mutate reagents., type: Fix} - id: 4950 - time: '2023-10-03T23:07:29.0000000+00:00' -- author: crazybrain - changes: - - {message: The omnitool (advanced tool cyborg module) can pry airlocks and firelocks - again., type: Fix} - id: 4951 - time: '2023-10-04T05:22:48.0000000+00:00' -- author: EmoGarbage404 + - message: You can now open and close your eyes while cuffed if the action to do + so is available to you. (Such as if it was granted via blindness) + type: Fix + id: 5714 + time: '2024-01-15T05:11:21.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24097 +- author: Flareguy changes: - - {message: Cyborgs can toggle their flashlights again., type: Fix} - id: 4952 - time: '2023-10-04T14:30:11.0000000+00:00' -- author: nmajask - changes: - - {message: Clipboards are now available to the Head of Personnel and Quartermaster., - type: Add} - id: 4953 - time: '2023-10-04T22:28:29.0000000+00:00' -- author: coolmankid12345 - changes: - - {message: Added the Revolutionaries gamemode., type: Add} - - {message: Added Head Revolutionaries and conversion for the flash, type: Add} - - {message: Added Rev status icons., type: Add} - - {message: Added Mindshields, type: Add} - id: 4954 - time: '2023-10-05T01:47:33.0000000+00:00' + - message: Made lava & liquid plasma significantly less lethal. + type: Tweak + id: 5715 + time: '2024-01-15T06:33:05.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24100 - author: EmoGarbage404 changes: - - {message: Fixed access while riding vehicles and mechs., type: Fix} - id: 4955 - time: '2023-10-05T09:12:41.0000000+00:00' -- author: brainfood1183 - changes: - - {message: Rock anomalies have been detected by nanotrasen scientists., type: Add} - id: 4956 - time: '2023-10-05T19:53:54.0000000+00:00' -- author: notquitehadouken - changes: - - {message: Slimes no longer rot again, type: Fix} - id: 4957 - time: '2023-10-05T19:56:40.0000000+00:00' -- author: dahnte - changes: - - {message: Onion rings!, type: Add} - id: 4958 - time: '2023-10-05T21:31:40.0000000+00:00' -- author: gusxyz - changes: - - {message: Monkey's now are able to equip gas masks., type: Add} - id: 4959 - time: '2023-10-05T21:34:37.0000000+00:00' -- author: TheShuEd - changes: - - {message: The trees and rocks are now rotating to follow the camera., type: Tweak} - id: 4960 - time: '2023-10-06T01:50:25.0000000+00:00' -- author: gusxyz - changes: - - {message: Syndicate bombs collide again., type: Tweak} - id: 4961 - time: '2023-10-06T06:29:58.0000000+00:00' -- author: Ubaser - changes: - - {message: The Clothesmate now dispenses berets., type: Tweak} - id: 4962 - time: '2023-10-06T18:49:08.0000000+00:00' -- author: Lank - changes: - - {message: 'Reptilians have received a minor rework. Notable features include a - diet restriction to only meat, fruit and pills, and the ability to pull objects - using their tail.', type: Tweak} - id: 4963 - time: '2023-10-06T21:19:01.0000000+00:00' -- author: chromiumboy - changes: - - {message: Fixed wire panels on bombs and vending machines not opening correctly., - type: Fix} - id: 4964 - time: '2023-10-06T21:26:02.0000000+00:00' -- author: TheShuEd - changes: - - {message: 'Beer anomaly added! And no, it''s an anomaly of ominisine. Hmm. No. - It seems to be capable of producing ANY substance.', type: Add} - id: 4965 - time: '2023-10-07T00:26:35.0000000+00:00' -- author: DrSmugleaf + - message: Added cryogenic sleep units. Disconnecting or ghosting inside one of + these pods will keep your body secure and free up your job slot on the station. + type: Add + - message: Added cryogenics access, which allows someone to retrieve items from + inside of cryogenic sleep units. This is given to security and command by default. + type: Add + id: 5716 + time: '2024-01-15T06:35:28.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24096 +- author: Bhijn and Myr changes: - - {message: Fixed not being able to throw items into disposals from close up., type: Fix} - id: 4966 - time: '2023-10-07T00:43:54.0000000+00:00' + - message: Attempting to weld without protection will now cause eye damage proper. + Additionally, attempting to weld with a welder that's off when you aren't wearing + protection will no longer blind you. It's the bright light that hurts your eyes, + not the underwhelming lack of it! + type: Fix + id: 5717 + time: '2024-01-15T07:47:00.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24106 +- author: Boaz1111 + changes: + - message: Stimpack price has been reduced to 4 TC + type: Tweak + id: 5718 + time: '2024-01-15T09:30:37.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24117 - author: Nimfar11 changes: - - {message: Now the Secret Doors can be welded shut., type: Add} - id: 4967 - time: '2023-10-07T00:45:12.0000000+00:00' -- author: EmoGarbage404 + - message: Adds the ability to build blast doors. + type: Add + id: 5719 + time: '2024-01-15T12:49:08.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24050 +- author: Boaz1111 + changes: + - message: Reinforced Glass and Reinforced Plasma Glass no longer bubble randomly + type: Fix + id: 5720 + time: '2024-01-16T03:43:18.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24135 +- author: tday + changes: + - message: Explosion and Chemical Reaction admin logs now use grid-relative coordinates + when possible. + type: Fix + id: 5721 + time: '2024-01-16T07:53:46.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24136 +- author: Dygon + changes: + - message: Flare shells now embed into whatever they hit. + type: Tweak + - message: Flare shells ignite mobs again. + type: Fix + id: 5722 + time: '2024-01-16T09:17:05.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23648 +- author: Ubaser changes: - - {message: Certain mobs will now fight back when provoked. Try not to get robusted., - type: Add} - id: 4968 - time: '2023-10-07T00:56:18.0000000+00:00' -- author: HerCoyote23 - changes: - - {message: Tarantulas now inject real toxins into victims and they can pass through - armour., type: Tweak} - id: 4969 - time: '2023-10-07T13:05:40.0000000+00:00' -- author: DrSmugleaf - changes: - - {message: Fixed not being able to sleep on a bed., type: Fix} - id: 4970 - time: '2023-10-07T19:11:03.0000000+00:00' -- author: JoeHammad - changes: - - {message: 'traitor gamemode is rarer, nukies and revs are more common', type: Tweak} - id: 4971 - time: '2023-10-07T19:15:57.0000000+00:00' + - message: Resprited buckets. + type: Tweak + id: 5723 + time: '2024-01-16T13:47:53.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23866 - author: Lank changes: - - {message: Humanoid species now passively regenerate small bruises and burns., - type: Tweak} - id: 4972 - time: '2023-10-07T19:34:32.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Kudzu has been reenabled., type: Add} - id: 4973 - time: '2023-10-07T19:59:39.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Diona now move at the same speed as other species., type: Tweak} - id: 4974 - time: '2023-10-08T21:02:46.0000000+00:00' -- author: DrSmugleaf - changes: - - {message: Updated the PDA ringtone UI to have a small delay between sets., type: Tweak} - id: 4975 - time: '2023-10-08T21:25:08.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Brains now function properly when inserted into an MMI., type: Fix} - id: 4976 - time: '2023-10-09T04:49:20.0000000+00:00' -- author: gusxyz - changes: - - {message: Using capital letter for your department specific radio channels will - work now!, type: Tweak} - id: 4977 - time: '2023-10-09T05:07:54.0000000+00:00' -- author: nmajask - changes: - - {message: 'Added flannel jackets, find them at your local winterdrobe or dark - maint corridor.', type: Add} - id: 4978 - time: '2023-10-09T15:22:57.0000000+00:00' -- author: Vasilis - changes: - - {message: Contributors are automatically updated now once a week in the credits - section., type: Add} - id: 4979 - time: '2023-10-09T23:42:53.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: 'Fixed kudzu, foam, smoke, and puddles spreading at extremely high rates.', - type: Fix} - id: 4980 - time: '2023-10-10T03:32:34.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Reenabled Kudzu (again) (for real this time), type: Add} - id: 4981 - time: '2023-10-10T03:34:41.0000000+00:00' -- author: GoodWheatley - changes: - - {message: Dionas are actually the same speed as other species now., type: Fix} - id: 4982 - time: '2023-10-10T14:03:20.0000000+00:00' -- author: Potato1234_x - changes: - - {message: Added the CuraDrobe., type: Add} - - {message: Added the sensible suit and skirt., type: Add} - - {message: Fixed the librarian not having their own jumpskirt., type: Fix} - - {message: Resprited the librarian jumpsuit., type: Tweak} - id: 4983 - time: '2023-10-10T16:55:31.0000000+00:00' -- author: Whisper - changes: - - {message: Lizards can eat organs again!, type: Fix} - - {message: Organs now contain uncooked proteins instead of edible nutriment. Animals - will be able to consume this., type: Tweak} - id: 4984 - time: '2023-10-10T18:02:47.0000000+00:00' -- author: metalgearsloth - changes: - - {message: Fix shuttles sometimes clipping planet marker entities such as ore., - type: Fix} - id: 4985 - time: '2023-10-10T21:33:04.0000000+00:00' -- author: metalgearsloth - changes: - - {message: Fix expedition faction sometimes not aligning with the mission faction., - type: Fix} - id: 4986 - time: '2023-10-10T21:33:18.0000000+00:00' -- author: metalgearsloth - changes: - - {message: Vaulting tables is now predicted., type: Fix} - - {message: Fix buckle sound not playing., type: Fix} - - {message: Buckling is now predicted., type: Fix} - id: 4987 - time: '2023-10-10T23:41:12.0000000+00:00' -- author: deltanedas - changes: - - {message: Ninja uncloak after attacking with melee weapons., type: Tweak} - id: 4988 - time: '2023-10-11T02:55:54.0000000+00:00' -- author: gusxyz - changes: - - {message: Crabs will seek out food to eat now., type: Add} - id: 4989 - time: '2023-10-11T03:09:26.0000000+00:00' -- author: Vasilis - changes: - - {message: Potentially fix (or hopefully at least reduce) electrical anomaly lagging - everyone on supercrit., type: Fix} - id: 4990 - time: '2023-10-11T03:11:46.0000000+00:00' -- author: ShadowCommander - changes: - - {message: 'Added toggleselfghost command, which toggles being able to see your - own ghost.', type: Add} - - {message: 'Added replay_toggle_screenshot_mode command, which toggles the HUD - in replay mode to look similar to ingame.', type: Add} - id: 4991 - time: '2023-10-11T03:43:48.0000000+00:00' -- author: deltanedas + - message: Added a new "follow" command. + type: Add + - message: Replaced the ahelp menu's "Teleport to" verb with "Follow". + type: Tweak + id: 5724 + time: '2024-01-17T01:26:15.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24142 +- author: Dygon + changes: + - message: Water gun and spray nozzle projectiles now properly collide with objects. + type: Fix + id: 5725 + time: '2024-01-17T08:21:59.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24175 +- author: Veritius + changes: + - message: You can now dramatically execute cuffed people. + type: Add + - message: You can now kill yourself with guns. + type: Add + id: 5726 + time: '2024-01-17T08:45:45.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24150 +- author: TurboTrackerss14 + changes: + - message: Added Mothroach Burger. + type: Add + id: 5727 + time: '2024-01-17T08:46:34.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24156 +- author: Ubaser changes: - - {message: Rehargers can be examined to show the charge of the battery or weapon - inside., type: Tweak} - id: 4992 - time: '2023-10-11T09:22:09.0000000+00:00' -- author: Skarletto + - message: Robohand gloves now have a unique sprite and can be found in the RoboDrobe. + type: Tweak + id: 5728 + time: '2024-01-17T10:03:01.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24182 +- author: Ubaser changes: - - {message: Changed unary devices such as scrubbers and vents to not be able to - stack with each other, type: Tweak} - id: 4993 - time: '2023-10-11T15:20:21.0000000+00:00' -- author: ElectroJr + - message: Ore is now grindable to obtain basic chemicals. + type: Add + id: 5729 + time: '2024-01-17T13:08:31.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24185 +- author: mirrorcult changes: - - {message: Fixed explosion resistance from clothing/equipment not being applied., - type: Fix} - id: 4994 - time: '2023-10-11T16:31:10.0000000+00:00' -- author: JoeHammad + - message: Reagent grinders now shake around violently when grinding something + type: Add + id: 5730 + time: '2024-01-17T13:14:33.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24190 +- author: Boaz1111 + changes: + - message: Artifact analyzer now scans twice as fast! + type: Tweak + id: 5731 + time: '2024-01-17T16:45:19.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24188 +- author: mirrorcult changes: - - {message: The nukie ship now has syndicate access airlocks, type: Add} - id: 4995 - time: '2023-10-11T16:47:25.0000000+00:00' + - message: Eating/drinking sounds should be hopefully significantly less grating + type: Tweak + id: 5732 + time: '2024-01-17T16:46:07.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24195 - author: notafet changes: - - {message: Carbon dioxide poisoning is now more deadly. Victims of carbon dioxide - poisoning now gasp visibly., type: Tweak} - id: 4996 - time: '2023-10-12T07:35:31.0000000+00:00' -- author: Ubaser - changes: - - {message: Revamped the Paramedic Void Suit sprite., type: Tweak} - id: 4997 - time: '2023-10-12T22:20:24.0000000+00:00' -- author: pigeonpeas - changes: - - {message: Reptilians can now choose to have floppy kobold ears., type: Add} - id: 4998 - time: '2023-10-13T01:30:31.0000000+00:00' + - message: Chemical, booze, and soda dispensers now dispense reagents from stock + containers. Remember to refill! + type: Tweak + - message: Chemical, booze, and soda dispensers can no longer be emagged for extra + goodies. + type: Remove + id: 5733 + time: '2024-01-17T21:43:48.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23907 - author: TheShuEd changes: - - {message: Animals now give cute hearts when you pet them., type: Add} - id: 4999 - time: '2023-10-13T17:34:18.0000000+00:00' -- author: chromiumboy - changes: - - {message: The radiation collector has been updated to provide better visual feedback - on its status., type: Tweak} - id: 5000 - time: '2023-10-13T23:08:00.0000000+00:00' -- author: liltenhead - changes: - - {message: Increased containment field duration after power loss., type: Tweak} - id: 5001 - time: '2023-10-13T23:41:43.0000000+00:00' -- author: liltenhead - changes: - - {message: 'Increased the stability of the AME, it now takes about three minutes - for the AME to overload.', type: Tweak} - id: 5002 - time: '2023-10-13T23:42:46.0000000+00:00' -- author: deltanedas - changes: - - {message: 'Added the igniter for sparking flames, can be found in the vendomat - and robotics vendor or produced by science.', type: Add} - id: 5003 - time: '2023-10-14T07:11:50.0000000+00:00' -- author: DrSmugleaf - changes: - - {message: 'Fixed librarians, lawyers, ninjas and nukeops having their starting - in-hand items dropped on the floor.', type: Fix} - id: 5004 - time: '2023-10-14T17:28:52.0000000+00:00' -- author: liltenhead - changes: - - {message: Reduced the bombsuit helmet's explosive resistance., type: Tweak} - id: 5005 - time: '2023-10-14T17:34:58.0000000+00:00' -- author: JoeHammad - changes: - - {message: mindshields to meta station armory, type: Add} - id: 5006 - time: '2023-10-14T21:50:44.0000000+00:00' -- author: JoeHammad - changes: - - {message: 'chem dispensers to barratry, you can stop crying now', type: Add} - id: 5007 - time: '2023-10-14T21:51:33.0000000+00:00' -- author: ike709 - changes: - - {message: 'All non-high-security airlocks can now be pried open by hand when unpowered, - albeit much slower than using a crowbar', type: Tweak} - id: 5008 - time: '2023-10-15T22:17:45.0000000+00:00' -- author: iacore - changes: - - {message: Secure crates are now weldable!, type: Fix} - id: 5009 - time: '2023-10-16T05:27:23.0000000+00:00' -- author: brainfood1183 + - message: Added the ability to repair thrusters and gyroscopes on the shuttle. + type: Add + id: 5734 + time: '2024-01-17T23:57:40.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24193 +- author: Volotomite + changes: + - message: Flippo can burn plasma now! + type: Fix + id: 5735 + time: '2024-01-18T00:28:32.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24207 +- author: Ubaser changes: - - {message: Behonkers are fixed (in combat use right click to fire laser), type: Fix} - id: 5010 - time: '2023-10-16T05:29:14.0000000+00:00' -- author: ShadowCommander + - message: The paramedic's void suit now has a helmet toggle. + type: Tweak + id: 5736 + time: '2024-01-18T15:26:59.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24229 +- author: Ubaser changes: - - {message: Fixed material reclaimer sound error when processing something., type: Fix} - - {message: Fixed duplicate gib sound when the material reclaimer processes a mob., - type: Fix} - id: 5011 - time: '2023-10-16T05:30:35.0000000+00:00' + - message: Carrots now properly contain Oculine, and you can Juice them to obtain + the raw chemical. + type: Fix + id: 5737 + time: '2024-01-18T15:28:01.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24228 +- author: koteq + changes: + - message: Jugs with the same labels are now correctly grouped and sorted in the + context menu. + type: Tweak + id: 5738 + time: '2024-01-18T22:18:53.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24243 - author: EmoGarbage404 changes: - - {message: Fixed being permanently cuffed if you transformed into a zombie with - cuffs on., type: Fix} - id: 5012 - time: '2023-10-16T05:31:04.0000000+00:00' -- author: Lomcastar - changes: - - {message: Uranium crabs are more radioactive!, type: Tweak} - id: 5013 - time: '2023-10-16T05:34:18.0000000+00:00' -- author: JoeHammad - changes: - - {message: Stun batons now take three hits to stun and have had their battery use - dropped by half, type: Tweak} - id: 5014 - time: '2023-10-16T11:39:06.0000000+00:00' + - message: Duplicate players will no longer spawn in cryogenic sleep units. + type: Fix + id: 5739 + time: '2024-01-19T00:27:21.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24251 +- author: lapatison + changes: + - message: Guidebooks can now be found in random bookshelves. + type: Tweak + id: 5740 + time: '2024-01-19T00:32:00.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24036 - author: metalgearsloth changes: - - {message: Fix item drops mispredicting., type: Fix} - id: 5015 - time: '2023-10-16T11:49:41.0000000+00:00' -- author: Vasilis - changes: - - {message: Pneumatic Cannons can no longer shoot arrows., type: Tweak} - id: 5016 - time: '2023-10-17T22:58:05.0000000+00:00' -- author: Vasilis - changes: - - {message: Spears and arrows can now only hold up to 2u of liquids instead of 5u., - type: Tweak} - id: 5017 - time: '2023-10-17T23:01:25.0000000+00:00' -- author: notquitehadouken - changes: - - {message: The grey stick that shows up when you wide swing a weapon now looks - like the weapon used., type: Tweak} - id: 5018 - time: '2023-10-18T01:12:00.0000000+00:00' -- author: metalgearsloth - changes: - - {message: Fix vaulting mispredict., type: Fix} - id: 5019 - time: '2023-10-18T05:11:33.0000000+00:00' -- author: daerSeebaer - changes: - - {message: The AME controller now shows the current load and maximum capacity., - type: Add} - id: 5020 - time: '2023-10-18T17:46:33.0000000+00:00' -- author: Errant - changes: - - {message: Temperature alerts are now more accurate for different species., type: Fix} - id: 5021 - time: '2023-10-18T18:05:15.0000000+00:00' -- author: Phunny - changes: - - {message: Added Tortilla doughs and variants., type: Add} - - {message: Added Taco shells and recipe, type: Add} - - {message: Added various types of Tacos, type: Add} - - {message: Changed naming of the original taco to soft shell taco, type: Tweak} - id: 5022 - time: '2023-10-18T21:03:23.0000000+00:00' -- author: TemporalOroboros - changes: - - {message: Electric shocks now scale with the amount of power in the cables instead - of the type of cable., type: Tweak} - id: 5023 - time: '2023-10-18T21:04:47.0000000+00:00' -- author: Doru991 - changes: - - {message: Being gibbed through normal means will no longer delete all items on - the body., type: Fix} - id: 5024 - time: '2023-10-18T21:15:17.0000000+00:00' -- author: KingFroozy - changes: - - {message: Atmospheric technician's casual jumpsuit was resprited., type: Tweak} - id: 5025 - time: '2023-10-19T03:44:58.0000000+00:00' -- author: Vasilis - changes: - - {message: You will no longer be picked as a head revolutionary if you have not - checked it in the antag picker. Note you can still become a revolutionary if - someone converts you., type: Fix} - id: 5026 - time: '2023-10-19T03:48:56.0000000+00:00' -- author: TheShuEd - changes: - - {message: Added dart game!, type: Add} - id: 5027 - time: '2023-10-19T03:55:30.0000000+00:00' -- author: BurninDreamer - changes: - - {message: 'C4 now costs 2 TC instead of 4TC, the bundle costs 12TC instead of - 20TC', type: Tweak} - id: 5028 - time: '2023-10-19T15:19:33.0000000+00:00' -- author: IntegerTempest - changes: - - {message: Added lathe printing for rollerbed & wheelchairs., type: Add} - id: 5029 - time: '2023-10-20T05:46:33.0000000+00:00' -- author: deltanedas - changes: - - {message: Meats now cook based on internal temperature. Don't make steak in a - plasma fire unless you want to scorch the outside before the inside can even - cook., type: Tweak} - id: 5030 - time: '2023-10-20T20:21:49.0000000+00:00' -- author: metalgearsloth - changes: - - {message: Fix replays not starting., type: Fix} - id: 5031 - time: '2023-10-20T22:37:02.0000000+00:00' -- author: DrSmugleaf - changes: - - {message: Fixed not being able to run server commands without >., type: Fix} - - {message: Fixed not being able to use the help command to see another command's - help text., type: Fix} - id: 5032 - time: '2023-10-21T10:58:57.0000000+00:00' -- author: 27alaing - changes: - - {message: 'Common internet slang now gets replaced in IC chat. (example: brb --> - be right back)', type: Add} - id: 5033 - time: '2023-10-21T19:43:11.0000000+00:00' -- author: Vasilis - changes: - - {message: Added a s-social anxiety trait that m-makes you st-stutter your w-words - when you t-talk., type: Add} - id: 5034 - time: '2023-10-21T20:09:54.0000000+00:00' -- author: DrSmugleaf - changes: - - {message: Fixed shuttle thrusters and gyroscopes being disabled by default., type: Fix} - id: 5035 - time: '2023-10-21T21:33:49.0000000+00:00' -- author: DrSmugleaf - changes: - - {message: Fixed the expeditions console not showing any expeditions., type: Fix} - id: 5036 - time: '2023-10-21T21:34:00.0000000+00:00' -- author: nikthechampiongr - changes: - - {message: Players can no longer telekinetically pry open doors while they are - not under the effects of gravity., type: Fix} - id: 5037 - time: '2023-10-22T05:49:56.0000000+00:00' -- author: deltanedas - changes: - - {message: 'Emitters now destroy rocks in 1 hit like crushers and PKAs, you can - use them for laser mining.', type: Tweak} - id: 5038 - time: '2023-10-22T05:51:01.0000000+00:00' -- author: metalgearsloth - changes: - - {message: Fix tile placement mispredicting and flickering., type: Fix} - id: 5039 - time: '2023-10-22T05:53:39.0000000+00:00' -- author: ElectroJr - changes: - - {message: Fixed a bug that caused items to get stuck to vehicles when unequipping - clothing., type: Fix} - id: 5040 - time: '2023-10-22T05:54:30.0000000+00:00' -- author: Endecc - changes: - - {message: 'Added the Requisition Digi-board, a wireless cargo computer (and high-capacity - clipboard) for the Quartermaster''s Locker.', type: Add} - - {message: 'Added a new Steal objective for traitors, as this new fancy clipboard - has access to most of Nanotrasen''s accounting details!', type: Add} - id: 5041 - time: '2023-10-22T07:34:06.0000000+00:00' -- author: stopbreaking - changes: - - {message: Replaced wielding do_after with an interaction cooldown., type: Tweak} - id: 5042 - time: '2023-10-22T13:53:14.0000000+00:00' -- author: metalgearsloth - changes: - - {message: Tile-prying do_after is now predicted., type: Tweak} - id: 5043 - time: '2023-10-23T13:20:33.0000000+00:00' -- author: Tryded - changes: - - {message: Changed the damage of the double bladed energy sword to 17 heat + 17 - Slash (The Double Bladed energy sword use to deal as much damage as an energy - dagger.), type: Tweak} - id: 5044 - time: '2023-10-23T14:35:33.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Fixed activating artifacts with magboots., type: Fix} - id: 5045 - time: '2023-10-24T06:18:46.0000000+00:00' -- author: Stray-Pyramid - changes: - - {message: Ore bags now pickup artifact fragments as well as ores, type: Fix} - id: 5046 - time: '2023-10-24T06:20:46.0000000+00:00' -- author: Morb0 + - message: Added trade stations for cargo instead of FTL. + type: Add + id: 5741 + time: '2024-01-19T02:02:28.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23863 +- author: Emisse changes: - - {message: Syndicate have issued a new challenge objective for traitors with shuttle - hijacking, type: Add} - id: 5047 - time: '2023-10-24T07:55:47.0000000+00:00' -- author: VasilisThePikachu + - message: Title2 to lobby music + type: Add + id: 5742 + time: '2024-01-19T02:47:20.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24254 +- author: Repo changes: - - {message: Stuttering trait stutters less common., type: Fix} - id: 5048 - time: '2023-10-24T09:28:31.0000000+00:00' + - message: Round restarts require minimum ghost levels on populated servers. + type: Fix + id: 5743 + time: '2024-01-19T07:10:05.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23453 - author: metalgearsloth changes: - - {message: Fix climbing in the same position (e.g. exiting from medical scanners) - sending you to the farplanes., type: Fix} - id: 5049 - time: '2023-10-24T10:44:09.0000000+00:00' -- author: liltenhead - changes: - - {message: Fixed the "examine" trigger for artifacts not having a hint., type: Fix} - id: 5050 - time: '2023-10-24T20:37:16.0000000+00:00' -- author: Stealthbomber16 - changes: - - {message: You can actually grind corn into cornmeal now., type: Fix} - id: 5051 - time: '2023-10-24T20:38:43.0000000+00:00' -- author: Myakot - changes: - - {message: Skeletons can now heal by pouring milk over themselves, type: Add} - id: 5052 - time: '2023-10-24T20:58:34.0000000+00:00' -- author: TemporalOroboros - changes: - - {message: Fixed anomaly locators frantically beeping when they first enter detection - range for an anomaly., type: Fix} - id: 5053 - time: '2023-10-24T21:00:23.0000000+00:00' -- author: 27alaing - changes: - - {message: The anti-slang system allows for more leeway with certain phrases now., - type: Tweak} - - {message: 'The supply radio channel can be used with ":u" again.', type: Fix} - id: 5054 - time: '2023-10-25T00:56:19.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Medical cyborgs' stethoscopes can no longer be fed to moths to obtain - a free hand., type: Fix} - id: 5055 - time: '2023-10-25T04:51:32.0000000+00:00' -- author: deltanedas - changes: - - {message: Roundstart borg jobs get funny names., type: Tweak} - id: 5056 - time: '2023-10-25T13:00:09.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: The search bar in vending machines now works., type: Fix} - id: 5057 - time: '2023-10-25T13:01:16.0000000+00:00' -- author: deltanedas - changes: - - {message: 'The Syndicate''s chefs are now offering snack boxes for only 1 tc. - Usually contains a toy, drinks and food.', type: Add} - id: 5058 - time: '2023-10-25T13:26:27.0000000+00:00' + - message: Added ability to put spesos directly into cargo request consoles. + type: Add + id: 5744 + time: '2024-01-19T07:23:07.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24263 - author: metalgearsloth changes: - - {message: Fix docking UI not showing other grids., type: Fix} - id: 5059 - time: '2023-10-25T13:28:34.0000000+00:00' -- author: Doru991 + - message: Fix bolting guns causing exceptions. + type: Fix + id: 5745 + time: '2024-01-19T10:14:42.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24283 +- author: mirrorcult changes: - - {message: Potato batteries can be built by crew., type: Add} - - {message: New compact AI chips may be powered via potato batteries., type: Add} - id: 5060 - time: '2023-10-25T13:52:50.0000000+00:00' + - message: Destruction & impact sounds have been reworked in general, you should + expect better sounds/more variance/actually playing sounds when applicable + type: Add + - message: Melee hit sounds being cut off when an entity is destroyed has been fixed + type: Fix + id: 5746 + time: '2024-01-19T15:33:08.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24282 +- author: SpeltIncorrectyl + changes: + - message: Emagging the artifact crusher now stops it from being opened while it + is crushing. + type: Add + id: 5747 + time: '2024-01-19T15:35:02.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23957 - author: EmoGarbage404 changes: - - {message: 'Storage now functions based on slots and sizes, rather than numerical - values.', type: Tweak} - id: 5061 - time: '2023-10-25T22:53:39.0000000+00:00' -- author: EmoGarbage404 + - message: You can now sort lathe recipes by category. + type: Add + - message: Recipes in lathes are now sorted alphabetically. + type: Add + id: 5748 + time: '2024-01-20T00:45:04.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24247 +- author: Scribbles0 + changes: + - message: Added a new trait, the Unrevivable trait. + type: Add + id: 5749 + time: '2024-01-20T02:22:15.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24226 +- author: Drayff + changes: + - message: Animations for ToolBoxes! + type: Add + id: 5750 + time: '2024-01-20T02:29:13.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24305 +- author: Agoichi + changes: + - message: Rebalanced Lobbying Bundle + type: Tweak + id: 5751 + time: '2024-01-20T02:35:44.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24303 +- author: Dygon + changes: + - message: Storage objects can't be opened anymore while stored in a container. + type: Fix + id: 5752 + time: '2024-01-20T02:50:14.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24253 +- author: FairlySadPanda + changes: + - message: Lobby restart sound effects no longer cut-off. + type: Fix + id: 5753 + time: '2024-01-20T03:40:01.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24044 +- author: casperr04 changes: - - {message: Adjusted the sizes of space suits and belts., type: Tweak} - - {message: Reduced the slot count in the ore bag., type: Tweak} - - {message: Fixed not being to create pills at the ChemMaster 5000., type: Fix} - id: 5062 - time: '2023-10-26T02:47:45.0000000+00:00' + - message: Fixed players being able to re-anchor items after fultoning them. + type: Fix + - message: Changed which objects can be fultoned. + type: Tweak + id: 5754 + time: '2024-01-20T04:57:05.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/20628 +- author: Blackern5000 + changes: + - message: Crushers can no longer be researched. + type: Remove + id: 5755 + time: '2024-01-20T05:11:02.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24319 - author: metalgearsloth changes: - - {message: 'Reverted storage to function with numerical values again, instead of - slots and sizes.', type: Tweak} - id: 5063 - time: '2023-10-26T08:28:16.776154+00:00' -- author: nmajask - changes: - - {message: Bacon burgers require 1 bacon instead of 3 cutlets, type: Tweak} - - {message: Ghost burgers require 1 ectoplasm instead of 1 ghost sheet, type: Tweak} - - {message: Tofu creation no longer consumes the enzyme, type: Tweak} - - {message: Ribs and Mcribs now give back skewers when eaten, type: Fix} - id: 5064 - time: '2023-10-27T02:12:35.0000000+00:00' -- author: JoeHammad - changes: - - {message: 'Headrevs now have their own music on spawn, credits to A-Guy on youtube', - type: Add} - id: 5065 - time: '2023-10-27T02:19:35.0000000+00:00' -- author: crazybrain - changes: - - {message: Bodies of dead players who have taken a ghost role now show as "departed - and moved on"., type: Fix} - id: 5066 - time: '2023-10-27T02:27:36.0000000+00:00' -- author: deltanedas - changes: - - {message: Fixed being able to give pAIs implants., type: Fix} - id: 5067 - time: '2023-10-27T02:34:03.0000000+00:00' -- author: deltanedas - changes: - - {message: Ion storms have appeared and are causing malfunctions in cyborg law - modules., type: Add} - id: 5068 - time: '2023-10-27T02:40:13.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Foam and smoke can now transfer chemicals when inhaled. Wear internals - to avoid this., type: Add} - - {message: Fixed foam dissolution animation., type: Fix} - id: 5069 - time: '2023-10-27T02:52:11.0000000+00:00' -- author: Whisper - changes: - - {message: Increased funding in an undisclosed NT Operative Squad., type: Add} - - {message: CentComm staff will have their proper ID icons on security's sechud., - type: Add} - - {message: CentComm staff will have undying loyalty to Nanotrasen., type: Add} - - {message: ERT funding has been improved. Expect specialized ERT units to be able - to provide more assistance related to their role., type: Tweak} - - {message: Cut funding from ERT weaponry. They'll likely be seen using standard - security-level weapons., type: Remove} - - {message: 'Cut funding from ERT uniforms, they no longer have built in armor.', - type: Fix} - - {message: The medical ERT members have had their hardsuits refitted with proper - armor., type: Fix} - - {message: Updated the localization files., type: Fix} - id: 5070 - time: '2023-10-27T13:54:43.0000000+00:00' -- author: ficcialfaint - changes: - - {message: Fixed nuclear operatives sound not being played at round start, type: Fix} - id: 5071 - time: '2023-10-28T02:28:21.0000000+00:00' -- author: Arteben - changes: - - {message: Nanotrasen improved the health analyzer UI!, type: Tweak} - id: 5072 - time: '2023-10-28T05:54:18.0000000+00:00' -- author: Repo + - message: Fix buckle sound playing twice in some instances. + type: Fix + id: 5756 + time: '2024-01-20T06:22:19.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24321 +- author: tday + changes: + - message: Added admin log messages for adding and ending game rules, and for the + commands to do so. + type: Add + - message: Added admin log messages for secret mode rule selection. + type: Add + id: 5757 + time: '2024-01-20T18:02:13.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24092 +- author: Nimfar11 changes: - - {message: Stats menu on Character setup for total and role playtime., type: Add} - id: 5073 - time: '2023-10-28T12:01:11.0000000+00:00' -- author: TemporalOroboros + - message: Adds snake kebab and its recipe. + type: Add + id: 5758 + time: '2024-01-20T23:38:11.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24341 +- author: Alekshhh changes: - - {message: 'The space lube recipe now produces slightly more lube, but can overflow - its container.', type: Tweak} - id: 5074 - time: '2023-10-28T16:46:59.0000000+00:00' -- author: Ubaser + - message: Cerberus now has a wideswing that works similarly to spears. + type: Tweak + id: 5759 + time: '2024-01-20T23:38:27.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24328 +- author: TheShuEd changes: - - {message: The bee plush can now be worn on your head., type: Add} - id: 5075 - time: '2023-10-29T03:55:15.0000000+00:00' + - message: Added new Floral anomaly! + type: Add + id: 5760 + time: '2024-01-21T01:31:12.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24351 +- author: Menshin + changes: + - message: The PA control box should now properly detect the PA parts in all situations + (notably on Origin) + type: Fix + - message: The PA control box now automatically face the control box on part scanning + type: Tweak + id: 5761 + time: '2024-01-21T09:17:17.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24356 - author: metalgearsloth changes: - - {message: Audio rework is in which fixes a lot of audio bugs but may also introduce - new ones., type: Tweak} - - {message: Grid audio will now attenuate properly over distance and won't be ear - rupturingly loud., type: Fix} - - {message: FTL sound should no longer persist as it's attached to the shuttle instead - of being global., type: Fix} - - {message: Audio can now start at an offset so if an audio source comes into range - it won't play from the start., type: Fix} - - {message: Changed audio attenuation from InverseDistanceClamped to LinearDistanceClamped - so it's smoother. You may need to adjust your master audio volume., type: Tweak} - id: 5076 - time: '2023-10-29T03:58:23.0000000+00:00' -- author: Simyon264 - changes: - - {message: 'The PDA will now ring again, when a new station article gets published. - Reporters rejoice!', type: Fix} - id: 5077 - time: '2023-10-29T10:37:40.0000000+00:00' -- author: Subversionary - changes: - - {message: Bolas no longer deal stamina damage if you're already ensnared., type: Tweak} - - {message: Returned old bola recipe, type: Tweak} - - {message: Nerfed bola stamina damage from 80 to 55, type: Tweak} - - {message: You can break out of bolas while moving., type: Tweak} - id: 5078 - time: '2023-10-29T22:27:44.0000000+00:00' -- author: nmajask - changes: - - {message: Flannel jackets now keep you warm., type: Tweak} - id: 5079 - time: '2023-10-30T00:08:06.0000000+00:00' + - message: Fix revolver prediction. + type: Fix + id: 5762 + time: '2024-01-21T11:16:46.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/19649 - author: metalgearsloth changes: - - {message: Made thindows slightly thicker (0.03m to 0.13m) to reduce instances - of tunneling through them at high speeds. This only affects the outer edge so - you can still move through two parallel thindows on the same tile., type: Tweak} - id: 5080 - time: '2023-10-30T11:48:12.0000000+00:00' -- author: Vasilis - changes: - - {message: Fixed the issue where mice were cannibalizing fallen brethren., type: Fix} - id: 5081 - time: '2023-10-31T01:49:05.0000000+00:00' -- author: notquitehadouken - changes: - - {message: 'Despite being just as effective as the head, you no longer hit people - with the handle of fire axes.', type: Fix} - id: 5082 - time: '2023-10-31T03:30:59.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Skeletal crewmates have arrived on the station for Halloween only., - type: Add} - id: 5083 - time: '2023-10-31T03:40:12.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: 'Storage containers can now block large items from being inserted into - them, regardless of the space available.', type: Add} - - {message: Belts now function on a slot based storage system rather than a volume - based one., type: Add} - - {message: Standardized item sizes into regular categories., type: Tweak} - id: 5084 - time: '2023-10-31T03:55:56.0000000+00:00' -- author: Daemon - changes: - - {message: Add pea plants., type: Add} - id: 5085 - time: '2023-10-31T04:09:13.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Smoke now properly transfers reagents when inhaled., type: Fix} - id: 5086 - time: '2023-10-31T12:43:18.0000000+00:00' -- author: Lank - changes: - - {message: Slimes are fully immune to Nitrous Oxide again., type: Fix} - id: 5087 - time: '2023-10-31T12:57:27.0000000+00:00' -- author: potato1234x - changes: - - {message: Added cockroaches. Expect to see these mapped into maints soon., type: Add} - - {message: Added the glockroach admeme., type: Add} - id: 5088 - time: '2023-10-31T20:28:43.0000000+00:00' -- author: Psychpsyo - changes: - - {message: 'Soap and water now makes soapy water which can clean dirt off of floors. - Also please don''t eat the soap, it''s not good for you.', type: Add} - id: 5089 - time: '2023-10-31T20:39:12.0000000+00:00' -- author: brainfood1183 - changes: - - {message: Arachnid and other Blue (hemocyanin) blooded creatures now require copper - to treat bloodloss instead of iron and brute medkits contain 2 copper pills - and 1 less iron pill., type: Add} - id: 5090 - time: '2023-10-31T20:41:26.0000000+00:00' -- author: TheShuEd - changes: - - {message: 'When the anomaly explodes, a very expensive core falls from it. Be - sure to sell it in 10 minutes before it becomes useless.', type: Add} - id: 5091 - time: '2023-10-31T23:20:52.0000000+00:00' -- author: Vasilis - changes: - - {message: Getting turned into a rev will now play the rev antag sound effect., - type: Add} - id: 5092 - time: '2023-11-01T03:11:09.0000000+00:00' -- author: Titian3 + - message: Fix shuttle docking highlights being inaccurate. + type: Fix + id: 5763 + time: '2024-01-21T12:14:47.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24369 +- author: icekot8 + changes: + - message: Increased the size of flatpacks made by the Flatpacker 1001. + type: Tweak + id: 5764 + time: '2024-01-21T17:07:59.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24367 +- author: Nairodian changes: - - {message: No more skeletal crewmates., type: Remove} - id: 5093 - time: '2023-11-01T21:47:56.0000000+00:00' -- author: EmoGarbage404 + - message: All vent critter events now have a small delay and alert message before + they spawn. + type: Add + id: 5765 + time: '2024-01-22T01:33:38.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24383 +- author: Flareguy changes: - - {message: Many items have had their sizes adjusted., type: Tweak} - - {message: Survival boxes and medkits can no longer hold more items than their - size would suggest., type: Tweak} - - {message: Fixed missing max size text in storage UIs, type: Fix} - - {message: Fixed the ore bag being unable to collect items when there is still - room., type: Fix} - - {message: Fixed the food cart not being able to hold anything., type: Fix} - id: 5094 - time: '2023-11-01T23:19:41.0000000+00:00' -- author: liltenhead + - message: The Research Director's hardsuit now uses its older sprites. + type: Tweak + id: 5766 + time: '2024-01-22T01:52:32.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24377 +- author: SonicHDC + changes: + - message: Added reinforced diagonal! + type: Add + id: 5767 + time: '2024-01-22T14:53:19.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24393 +- author: Alekshhh changes: - - {message: Fixed nukie medics not spawning with their hypospray., type: Fix} - id: 5095 - time: '2023-11-02T19:35:56.0000000+00:00' -- author: TemporalOroboros + - message: Hud eyepatches have been added to BarDrobes, MediDrobes and SecTechs. + They're just cooler looking huds. + type: Add + id: 5768 + time: '2024-01-22T14:59:32.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24132 +- author: CrigCrag changes: - - {message: 'Thieving gloves now hide the entire pickpocketing action from other - players, not just the popup.', type: Tweak} - id: 5096 - time: '2023-11-03T02:10:59.0000000+00:00' + - message: Removed the revolutionaries gamemode pending a rework. + type: Remove + id: 5769 + time: '2024-01-23T02:11:09.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24420 - author: themias changes: - - {message: Tank pressure can no longer be set below zero, type: Fix} - id: 5097 - time: '2023-11-03T02:14:57.0000000+00:00' -- author: deltanedas - changes: - - {message: Increased the capacity of Bags of holding., type: Tweak} - id: 5098 - time: '2023-11-03T11:31:03.0000000+00:00' -- author: Tunguso4ka - changes: - - {message: Reptilians can now eat rat kebabs., type: Fix} - id: 5099 - time: '2023-11-03T17:50:32.0000000+00:00' -- author: photonicDog - changes: - - {message: 'Moth Head (Moonfly) marking texture is no longer rotated incorrectly, - causing it to appear offset from the player', type: Fix} - id: 5100 - time: '2023-11-03T20:37:26.0000000+00:00' + - message: Added different footstep sounds for blood, soda and juice + type: Add + id: 5770 + time: '2024-01-23T04:18:33.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24406 - author: TheShuEd changes: - - {message: Candles can now be found in PietyVend., type: Add} - id: 5101 - time: '2023-11-04T05:53:52.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Fixed being able to sell the same bounty multiple times., type: Fix} - id: 5102 - time: '2023-11-04T13:19:24.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Fixed needing to manually deselect to switch between borg modules., - type: Fix} - id: 5103 - time: '2023-11-04T13:29:19.0000000+00:00' -- author: TheEmber - changes: - - {message: Changed vomit probability for soap to 20% and soapy water to 10%., type: Tweak} - id: 5104 - time: '2023-11-04T15:19:30.0000000+00:00' -- author: Ubaser - changes: - - {message: The senior physician now spawns with a medical beret., type: Tweak} - id: 5105 - time: '2023-11-04T15:20:09.0000000+00:00' -- author: themias - changes: - - {message: You can now drag and drop to enter mechs., type: Tweak} - id: 5106 - time: '2023-11-04T15:23:46.0000000+00:00' -- author: daerSeebaer - changes: - - {message: Radiation Shutters (and some other things) are now better at keeping - out radiation., type: Tweak} - id: 5107 - time: '2023-11-04T15:25:56.0000000+00:00' -- author: themias - changes: - - {message: Critical vaccinated crew no longer immune to zombie fists, type: Fix} - id: 5108 - time: '2023-11-04T17:57:21.0000000+00:00' -- author: themias - changes: - - {message: Fixed accidental crayon graffiti when writing on paper, type: Fix} - id: 5109 - time: '2023-11-04T22:44:10.0000000+00:00' -- author: crazybrain - changes: - - {message: Mice no longer eat soap., type: Fix} - id: 5110 - time: '2023-11-05T23:47:19.0000000+00:00' -- author: deltanedas + - message: 'Flesh and Rock anom reworked: It should be easier to maintain them now + (I guess)' + type: Tweak + id: 5771 + time: '2024-01-23T12:32:05.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24381 +- author: metalgearsloth changes: - - {message: Chemistry bags had their storage rebalanced and can now hold beakers., - type: Tweak} - id: 5111 - time: '2023-11-05T23:49:29.0000000+00:00' -- author: deltanedas + - message: Fix thrusters. + type: Fix + id: 5772 + time: '2024-01-23T12:49:19.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24446 +- author: '0x6273' + changes: + - message: Hotplates now work again + type: Fix + id: 5773 + time: '2024-01-23T13:06:14.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24450 +- author: Boaz1111 + changes: + - message: Lizards can now properly eat fruit cakes and banana cream pie slices. + type: Fix + id: 5774 + time: '2024-01-23T18:08:32.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24457 +- author: icekot8 + changes: + - message: The bounty of briefcases has been removed + type: Remove + id: 5775 + time: '2024-01-23T18:26:28.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24392 +- author: Errant changes: - - {message: Fixed hotplates and some other devices not working., type: Fix} - id: 5112 - time: '2023-11-05T23:49:59.0000000+00:00' -- author: RiceMar - changes: - - {message: Paper is now lathable from the sheet-meister 2000., type: Add} - - {message: Crates of paper can now be purchased from the cargo request computer., - type: Add} - - {message: The sheet-meister 2000 research unlock has moved from the civilian services - tree to the industrial tree., type: Tweak} - id: 5113 - time: '2023-11-06T02:14:03.0000000+00:00' -- author: IProduceWidgets - changes: - - {message: 'Vomit, so much vomit. Now vomiting chems are less awful.', type: Remove} - id: 5114 - time: '2023-11-06T02:16:56.0000000+00:00' + - message: '"Not enough oxygen" hud alerts now indicate the proper gas for nitrogen + breathers.' + type: Fix + id: 5776 + time: '2024-01-23T20:17:41.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24373 - author: themias changes: - - {message: 'Bicaridine, Dylovene and Crytobiolin now metabolize at the same rate - for all species.', type: Fix} - id: 5115 - time: '2023-11-06T02:18:21.0000000+00:00' -- author: Tunguso4ka - changes: - - {message: CentCom allocated funds for the purchase of notice boards for kitchens, - type: Add} - id: 5116 - time: '2023-11-06T02:18:39.0000000+00:00' -- author: Ubaser - changes: - - {message: The access configurator now has a proper sprite., type: Tweak} - id: 5117 - time: '2023-11-06T02:21:41.0000000+00:00' + - message: Cyborgs can no longer spawn with the Wheelchair Bound or Muted trait + type: Fix + id: 5777 + time: '2024-01-23T20:18:01.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24459 - author: Nimfar11 changes: - - {message: Adds three new mobs from the Living Light family, type: Add} - id: 5118 - time: '2023-11-06T02:24:15.0000000+00:00' -- author: IProduceWidgets - changes: - - {message: Livestock crates are no longer airtight., type: Tweak} - id: 5119 - time: '2023-11-06T02:27:48.0000000+00:00' -- author: IntegerTempest - changes: - - {message: Added syndicate hud and syndicate visor for nuclear operatives, type: Add} - id: 5120 - time: '2023-11-06T02:36:08.0000000+00:00' -- author: JoeHammad - changes: - - {message: Aspid station has had its cargo department expanded., type: Tweak} - id: 5121 - time: '2023-11-06T02:36:46.0000000+00:00' -- author: ChrisThirtle - changes: - - {message: Fixed certain objects not fitting into crates and lockers due to the - angle of space itself., type: Fix} - id: 5122 - time: '2023-11-06T02:40:25.0000000+00:00' -- author: deltanedas - changes: - - {message: 'Microreactor powercells can be researched under the Tier 3 Portable - Fission technology, they slowly recharge on their own.', type: Add} - id: 5123 - time: '2023-11-06T03:00:12.0000000+00:00' -- author: deltanedas - changes: - - {message: IEDs can be crafted in desperate times to make a small explosion., type: Add} - id: 5124 - time: '2023-11-06T03:04:48.0000000+00:00' -- author: Whisper - changes: - - {message: 'Blood when consumed metabolizes into uncooked proteins, and sates thirst - of non-humans', type: Add} - - {message: Non-humans will have a small amount of hunger sated when consuming uncooked - proteins., type: Add} - - {message: Humans will take poison damage with a chance to vomit when metabolizing - uncooked protein., type: Tweak} - - {message: Humans take less damage from uncooked proteins (2->1), type: Tweak} - - {message: Humans will "feel sick" when they metabolize uncooked proteins., type: Add} - id: 5125 - time: '2023-11-06T03:51:33.0000000+00:00' -- author: TheShuEd - changes: - - {message: Added anomaly synchronizer! It allows you to link anomaly activity to - triggers on different devices., type: Add} - id: 5126 - time: '2023-11-06T04:02:03.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: Fixed a few items with invalid sizes., type: Fix} - id: 5127 - time: '2023-11-06T07:20:50.0000000+00:00' -- author: Tunguso4ka - changes: - - {message: NT found clown and mime lockers in its stockpiles., type: Add} - id: 5128 - time: '2023-11-07T23:38:18.0000000+00:00' -- author: VasilisThePikachu - changes: - - {message: Janibots and medibots cant bleed oil anymore, type: Remove} - - {message: Janibots and medibots health status on the inspection menu uses proper - "robot" terms (will say they are dented etc), type: Fix} - id: 5129 - time: '2023-11-08T01:24:05.0000000+00:00' -- author: Vasilis - changes: - - {message: The cloning pod and medical scanner can now fit through vertical doors., - type: Fix} - id: 5130 - time: '2023-11-08T01:24:25.0000000+00:00' -- author: EmoGarbage404 - changes: - - {message: 'Added speed boots! When powered, this research tech allows you to run - significantly faster.', type: Add} - id: 5131 - time: '2023-11-08T01:25:44.0000000+00:00' -- author: Vasilis - changes: - - {message: Characters with the pacifist trait will get their pacifist trait removed - as soon as they turn into a zombie., type: Fix} - id: 5132 - time: '2023-11-08T01:27:50.0000000+00:00' -- author: FluidRock - changes: - - {message: Lizards rediscovered their hunger for crayons., type: Tweak} - id: 5133 - time: '2023-11-08T01:28:37.0000000+00:00' -- author: Darkie - changes: - - {message: Added directional window cracks when damaged., type: Add} - id: 5134 - time: '2023-11-08T01:31:45.0000000+00:00' -- author: PixelTK - changes: - - {message: Arachnids can now weave a simple shield made out of silk., type: Add} - - {message: 'Arachnids now have two additional pocket slots. In exchange, they no - longer have slower hunger.', type: Tweak} - - {message: Arachnids are now the only species that can craft with silk., type: Tweak} - - {message: Arachnids now produce silk more efficiently., type: Tweak} - id: 5135 - time: '2023-11-08T20:18:53.0000000+00:00' -- author: Brandon_H - changes: - - {message: Fixed a spelling mistake in the description of the emergency medipen., - type: Fix} - id: 5136 - time: '2023-11-08T20:23:58.0000000+00:00' -- author: ps3moira - changes: - - {message: Changed electric grill sprites, type: Tweak} - id: 5137 - time: '2023-11-08T20:24:36.0000000+00:00' -- author: KingFroozy - changes: - - {message: Nitrile gloves have got their own sprite., type: Add} - id: 5138 - time: '2023-11-08T20:31:24.0000000+00:00' -- author: themias - changes: - - {message: Reduced clicks needed to dispense vending machine items, type: Tweak} - id: 5139 - time: '2023-11-09T01:42:07.0000000+00:00' -- author: themias - changes: - - {message: Fixed issue getting stuck while vaulting in space, type: Fix} - id: 5140 - time: '2023-11-09T01:43:43.0000000+00:00' -- author: eddiedd + - message: Adds solo comfy benches in different colors. + type: Add + id: 5778 + time: '2024-01-23T22:15:48.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24203 +- author: Tin-Man-Tim + changes: + - message: Attempting to microwave metal now can cause the microwave to spark and + explode. + type: Tweak + id: 5779 + time: '2024-01-23T22:59:10.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23887 +- author: DrMelon + changes: + - message: The Microwave works as intended after power outages again. + type: Fix + id: 5780 + time: '2024-01-24T01:14:55.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23997 +- author: Krunk + changes: + - message: To prevent accidental spills, buckets can no longer be quick-equipped. + type: Fix + id: 5781 + time: '2024-01-24T02:35:37.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24472 +- author: lzk228 changes: - - {message: cotton seeds are now available from the MegaSeed Servitor., type: Add} - id: 5141 - time: '2023-11-09T01:54:07.0000000+00:00' -- author: Vasilis + - message: Fixed escaping from locked artifact crate. + type: Fix + id: 5782 + time: '2024-01-25T00:46:07.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24442 +- author: Krunk + changes: + - message: Players will once again spawn at arrivals instead of cryostorage. + type: Fix + id: 5783 + time: '2024-01-25T00:48:58.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24476 +- author: Krunk + changes: + - message: Paper cups can now be worn as party hats! + type: Add + id: 5784 + time: '2024-01-25T01:02:33.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24334 +- author: Blackern5000 + changes: + - message: Botany's hatchet, spade, and hoe have received a damage decrease to 10, + 10, and 6 damage respectively. + type: Tweak + id: 5785 + time: '2024-01-25T01:37:11.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24481 +- author: Minty642 changes: - - {message: LOOC messages will appear on top of your head to be more noticeable., - type: Add} - - {message: 'For anyone who does not like LOOC messages appearing above people''s - heads, just disable it in settings!', type: Add} - id: 5142 - time: '2023-11-09T09:18:59.0000000+00:00' -- author: ravage123321 - changes: - - {message: Kitten was added, type: Add} - - {message: Cats now deals piercing damage istead of blunt, type: Tweak} - id: 5143 - time: '2023-11-09T12:24:00.0000000+00:00' -- author: Emisse + - message: Fixed Reinforced Glass Recipe in Ore Processor! + type: Fix + - message: Added Premium Material that can only be processed by Industrial Ore Processor! + type: Add + id: 5786 + time: '2024-01-25T08:33:56.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24345 +- author: Blackern5000 + changes: + - message: Smoking now causes mild lung cancer in the form of cellular damage. + type: Tweak + id: 5787 + time: '2024-01-25T09:51:26.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24546 +- author: metalgearsloth changes: - - {message: 'Borgs have had a QOL pass, they are access locked now and the department - specific ones start with applicable tools.', type: Tweak} - id: 5144 - time: '2023-11-09T22:22:50.0000000+00:00' -- author: EmoGarbage404 + - message: Add title2.ogg to space ambience tracks. + type: Tweak + id: 5788 + time: '2024-01-25T13:59:49.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24501 +- author: Tayrtahn + changes: + - message: Glued mobs can no longer struggle free from their captor's hands. + type: Tweak + id: 5789 + time: '2024-01-25T14:01:13.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24488 +- author: mirrorcult changes: - - {message: Cyborgs are much more resilient and no longer crumble immediately upon - death., type: Tweak} - id: 5145 - time: '2023-11-09T23:14:06.0000000+00:00' -- author: PixelTK + - message: Atomic Amnesia MMX, Vibe Ace, Monument and Marhaba have been removed + as lobby music tracks + type: Remove + id: 5790 + time: '2024-01-25T14:08:29.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24480 +- author: Dutch-VanDerLinde + changes: + - message: To prevent accidental spills, paper cups can no longer be quick-equipped. + type: Fix + id: 5791 + time: '2024-01-25T22:04:31.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24560 +- author: Agoichi + changes: + - message: Bio hoods hiding your face now + type: Tweak + - message: Bio hoods now can be used as a breath mask + type: Tweak + - message: You can not eat while you wearing bio hood + type: Tweak + id: 5792 + time: '2024-01-26T00:13:42.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24570 +- author: yathxyz + changes: + - message: Updated nixpkgs input + type: Tweak + id: 5793 + time: '2024-01-26T01:40:52.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24572 +- author: mirrorcult changes: - - {message: Fixed the strip menu for Arachnids., type: Fix} - id: 5146 - time: '2023-11-09T23:42:16.0000000+00:00' + - message: We lied Atomic Amnesia MMX is back + type: Add + id: 5794 + time: '2024-01-26T05:48:29.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24575 - author: EmoGarbage404 changes: - - {message: 'Reduced material costs for cyborg limbs, MMIs, positronic brains, and - cyborg modules.', type: Tweak} - id: 5147 - time: '2023-11-10T01:31:04.0000000+00:00' -- author: Vasilis - changes: - - {message: 'Made stasis beds actually buildable now. They require 2 steel, 3 wires, - a capacitor and manipulator (and of course the board).', type: Tweak} - - {message: Fixed a bug where the stasis bed getting deconstructed would delete - the player laying on it., type: Fix} - - {message: Microwave contents will be ejected on deconstruct., type: Fix} - id: 5148 - time: '2023-11-11T06:42:59.0000000+00:00' -- author: Doru991 - changes: - - {message: Entry-level cyborg modules for each chassis are now craftable by default., - type: Tweak} - id: 5149 - time: '2023-11-11T06:43:13.0000000+00:00' -- author: ElectroJr - changes: - - {message: Fixed spectating a player in a replay not following the spectated player - when they become a ghost., type: Fix} - id: 5150 - time: '2023-11-11T06:45:47.0000000+00:00' -- author: Brandon_H - changes: - - {message: Plants can no longer grow without sufficient water and nutrients., type: Fix} - id: 5151 - time: '2023-11-11T19:12:13.0000000+00:00' -- author: Vasilis - changes: - - {message: Bees can no longer turn into zombies., type: Fix} - id: 5152 - time: '2023-11-11T19:15:59.0000000+00:00' -- author: Slava0135 - changes: - - {message: Fixed radiation interrupting actions., type: Fix} - id: 5153 - time: '2023-11-12T18:02:39.0000000+00:00' -- author: ElectroJr - changes: - - {message: Fixed FOV & light rendering not being re-enabled when players stop spectating - as a ghost., type: Fix} - id: 5154 - time: '2023-11-12T18:36:00.0000000+00:00' -- author: eddiedd - changes: - - {message: Fresh harvested corn can actually be ground for cornmeal now., type: Fix} - id: 5155 - time: '2023-11-12T23:05:32.0000000+00:00' -- author: deltanedas - changes: - - {message: 'Raw eggs are no longer safe to eat, you have to make a dish or boil - them first.', type: Tweak} - id: 5156 - time: '2023-11-12T23:18:48.0000000+00:00' -- author: VasilisThePikachu - changes: - - {message: 'Added a Puppy Ian, Awww.', type: Add} - - {message: Puppy Ian can be randomly chosen to be hop's pet along with the other - corgis., type: Add} - - {message: 'Added a puppy corgi crate, it contains a single puppy for hard times. - It can be order by cargo.', type: Add} - id: 5157 - time: '2023-11-12T23:24:07.0000000+00:00' -- author: ElectroJr - changes: - - {message: Fixed being unable to re-add the storage implant action to the actions - bar once it has been removed., type: Fix} - id: 5158 - time: '2023-11-12T23:29:46.0000000+00:00' + - message: Cigarettes no longer deal cellular damage when smoked. + type: Remove + id: 5795 + time: '2024-01-26T09:50:03.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24568 +- author: ERORR404V1 + changes: + - message: Added mime hardsuit + type: Add + id: 5796 + time: '2024-01-26T14:43:50.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24198 +- author: icekot8 + changes: + - message: Correct display of syndicate jaws of life in hand + type: Add + id: 5797 + time: '2024-01-27T02:27:14.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24583 +- author: Agoichi + changes: + - message: Detective cabinet now have security holoprojector in interests of investigation + type: Tweak + - message: Security lockers have chance to spawn security holoprojector (0.5) + type: Tweak + id: 5798 + time: '2024-01-27T02:29:40.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24582 - author: TheShuEd changes: - - {message: New Thief figurine! New void cloak!, type: Add} - id: 5159 - time: '2023-11-12T23:41:45.0000000+00:00' -- author: Nimfar11 - changes: - - {message: Added space sharkminnow from the carp family., type: Add} - - {message: Added Bloodsucker's animal organs to heal by drinking blood., type: Add} - id: 5160 - time: '2023-11-13T00:42:48.0000000+00:00' -- author: themias + - message: Flesh and Rock anomalies have been reworked to place entities more dynamically + when spawning. + type: Tweak + id: 5799 + time: '2024-01-27T02:52:07.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24449 +- author: PJB3005 changes: - - {message: The round end summary screen now lists the syndies in custody. (Cuffed - on the shuttle), type: Add} - id: 5161 - time: '2023-11-13T10:04:33.0000000+00:00' -- author: metalgearsloth + - message: PACMAN-type portable generators now show power statistics for the network + they're connected to. + type: Add + - message: JRPACMAN has been buffed from 5 kW to 8 kW. + type: Tweak + id: 5800 + time: '2024-01-27T02:53:44.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24604 +- author: Blackern5000 + changes: + - message: Shotgun slugs can now be printed in the security techfab. + type: Add + - message: Shotgun slugs now fire a single strong projectile when fired. + type: Tweak + id: 5801 + time: '2024-01-27T02:56:57.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24196 +- author: I-JustUser-I + changes: + - message: Zombie Outbreak event now has a minimum limit of 15 players. + type: Tweak + id: 5802 + time: '2024-01-27T03:53:09.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24577 +- author: mirrorcult changes: - - {message: Make space ambient music more likely to play by reducing the required - space range., type: Tweak} - id: 5162 - time: '2023-11-13T11:10:56.0000000+00:00' -- author: metalgearsloth + - message: Navmap now defaults to showing departments + type: Tweak + id: 5803 + time: '2024-01-27T12:08:50.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24613 +- author: Tayrtahn + changes: + - message: Vending machines can now be repaired with a welder. + type: Tweak + id: 5804 + time: '2024-01-27T12:12:53.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24603 +- author: graevy + changes: + - message: Added hallway screen prototypes and comms console text broadcasts. + type: Add + id: 5805 + time: '2024-01-27T13:51:25.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24189 +- author: mirrorcult changes: - - {message: Expedition timer bumped from 7 minutes to 11 minutes., type: Tweak} - id: 5163 - time: '2023-11-13T22:39:34.0000000+00:00' -- author: Simyon + - message: Lights are now shaded with the same color that they glow. + type: Tweak + id: 5806 + time: '2024-01-27T17:43:45.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24612 +- author: Boaz1111 + changes: + - message: The PKA shuttle gun now breaks rocks in one hit. + type: Tweak + id: 5807 + time: '2024-01-27T17:47:35.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24627 +- author: FungiFellow + changes: + - message: Ion Storms are twice as likely to occur. + type: Tweak + id: 5808 + time: '2024-01-27T23:14:09.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24633 +- author: PJB3005 changes: - - {message: Muting the station news notification on your PDA now works again., type: Fix} - id: 5164 - time: '2023-11-13T22:43:09.0000000+00:00' -- author: deltanedas + - message: Security barriers need 5 seconds to lock and unlock. + type: Tweak + id: 5809 + time: '2024-01-28T00:28:02.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24637 +- author: themias changes: - - {message: Explosions now damage items in containers like backpacks or equipped - items., type: Tweak} - id: 5165 - time: '2023-11-13T22:57:52.0000000+00:00' -- author: TheShuEd + - message: Added cowboy hats and boots to autodrobe, secdrobe, and maints + type: Add + - message: Added cowboy accent + type: Add + id: 5810 + time: '2024-01-28T03:23:16.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24299 +- author: shampunj + changes: + - message: A new game preset! Can only be selected by admins. All at once. + type: Add + id: 5811 + time: '2024-01-28T10:41:36.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23171 +- author: Doctor-Cpu + changes: + - message: 3kliksphilips name. + type: Fix + id: 5812 + time: '2024-01-28T10:46:32.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24657 +- author: mirrorcult changes: - - {message: 'Now chefs can make a cake cat. You will need: 1 Cake plain, 1 raisin - snack, 1 animal heart, 5u cognizine, 15u milk, 15 second in microwave. And new - sweet ghost role CAK is created!', type: Add} - id: 5166 - time: '2023-11-13T23:23:03.0000000+00:00' + - message: Speech sounds are now quieter + type: Tweak + id: 5813 + time: '2024-01-28T10:49:55.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24579 - author: TheShuEd changes: - - {message: Animal carriers can now be found in the maintenance or bought in cargo. - They are useful for carrying someone heavy in your arms., type: Add} - id: 5167 - time: '2023-11-13T23:55:48.0000000+00:00' -- author: EmoGarbage404 + - message: The fire anomaly is now heavier in content. + type: Tweak + - message: Artifacts no longer block projectiles. + type: Tweak + id: 5814 + time: '2024-01-29T01:30:55.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24666 +- author: Krunk + changes: + - message: Health analysis interfaces now also display a subject's temperature in + Kelvin. + type: Add + id: 5815 + time: '2024-01-29T01:32:54.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24643 +- author: Ubaser changes: - - {message: The action bar now dynamically expands to the amount of actions present., - type: Tweak} - - {message: The action bar is now positioned along the top of the screen in the - separated UI mode., type: Tweak} - - {message: Fixed the action bar not displaying the correct hotkeys for actions., - type: Fix} - id: 5168 - time: '2023-11-14T03:27:14.0000000+00:00' -- author: ElectroJr + - message: Detectives now work as independent agents, separate from security, and + are encouraged to answer any requests for help. + type: Tweak + id: 5816 + time: '2024-01-29T06:45:27.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23114 +- author: mirrorcult changes: - - {message: Fixed candle in-hand sprites not updating when the candle is extinguished., - type: Fix} - - {message: Fixed flammable object collisions being processed twice. This may affect - how fires spread., type: Fix} - id: 5169 - time: '2023-11-14T11:55:45.0000000+00:00' -- author: Chubbygummibear - changes: - - {message: Fixed thrown entities physics being set to sleep if the throw was stopped - by colliding with something, type: Fix} - id: 5170 - time: '2023-11-14T12:54:35.0000000+00:00' -- author: themias + - message: Rotting examine text doesn't have weird grammatical errors now + type: Fix + id: 5817 + time: '2024-01-29T07:50:18.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24689 +- author: Eden077 + changes: + - message: Synaptizine now deals less poison damage. + type: Tweak + id: 5818 + time: '2024-01-29T07:55:52.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24676 +- author: mirrorcult changes: - - {message: Science built cyborgs can now emote, type: Fix} - id: 5171 - time: '2023-11-14T23:27:27.0000000+00:00' -- author: Sirionaut + - message: Various annoying sounds are now a little quieter + type: Tweak + id: 5819 + time: '2024-01-29T09:51:31.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24690 +- author: SpeltIncorrectyl + changes: + - message: Portable generators can now be connected to the signal network and controlled + remotely via devices like a signal transmitter. + type: Add + id: 5820 + time: '2024-01-29T14:56:29.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24157 +- author: Tayrtahn + changes: + - message: Welders properly display their lit status again. + type: Fix + id: 5821 + time: '2024-01-29T23:04:52.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24705 +- author: Tayrtahn + changes: + - message: Water bottles now display their fill level while held. + type: Add + id: 5822 + time: '2024-01-29T23:19:56.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24708 +- author: SlamBamActionman + changes: + - message: Arachnids slipping in water now get a cute hat! + type: Add + id: 5823 + time: '2024-01-30T00:21:26.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23822 +- author: Tayrtahn + changes: + - message: Pressing shift as a ghost no longer cancels following your target + type: Fix + id: 5824 + time: '2024-01-30T01:33:35.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24715 +- author: liltenhead changes: - - {message: cloth can be crafted from cotton (made from cotton bols), type: Add} - id: 5172 - time: '2023-11-14T23:27:56.0000000+00:00' -- author: deltanedas + - message: Jugs are now destructible. + type: Tweak + id: 5825 + time: '2024-01-30T08:11:43.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24719 +- author: Emisse changes: - - {message: Added the disposal signal router which is controlled by signals instead - of tags., type: Add} - id: 5173 - time: '2023-11-14T23:30:43.0000000+00:00' -- author: Slava0135 + - message: Aspid + type: Remove + id: 5826 + time: '2024-01-30T10:26:02.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24725 +- author: mirrorcult changes: - - {message: Traversing through disposal system now deals some blunt damage on every - turn. Be advised!, type: Tweak} - - {message: Fixed clang sound not playing when traversing through disposal system., - type: Fix} - id: 5174 - time: '2023-11-15T00:52:43.0000000+00:00' -- author: EmoGarbage404 + - message: Throwing items now scale a bit when thrown to simulate rising/falling + type: Add + id: 5827 + time: '2024-01-30T10:50:41.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24724 +- author: Emisse changes: - - {message: Artifacts now have a chance to spit out both medicinal and poisonous - foam., type: Add} - id: 5175 - time: '2023-11-15T01:34:43.0000000+00:00' -- author: EmoGarbage404 + - message: Gemini + type: Remove + id: 5828 + time: '2024-01-30T10:54:55.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24728 +- author: CrigCrag changes: - - {message: Fixed actions sometimes gaining phantom cooldown graphics., type: Fix} - - {message: 'Fixed an issue where clicking an action would interrupt hovering, making - it awkward to click multiple times.', type: Fix} - id: 5176 - time: '2023-11-15T01:35:43.0000000+00:00' -- author: metalgearsloth + - message: Added a new large salvage wreck. + type: Add + id: 5829 + time: '2024-01-30T10:56:38.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24656 +- author: themias changes: - - {message: Added 5 minute initial timer to gateway + bump new portal generation - from 45 minutes to 75 minutes., type: Tweak} - id: 5177 - time: '2023-11-15T06:23:53.0000000+00:00' -- author: liltenhead + - message: Fixed Centcom cargo gifts not being fulfilled + type: Fix + id: 5830 + time: '2024-01-30T11:05:20.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24701 +- author: Scribbles0 + changes: + - message: You can now make anomaly cores orbit you. + type: Add + id: 5831 + time: '2024-01-30T11:12:24.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24716 +- author: MIXnikita + changes: + - message: New sound effects for some shuttle guns + type: Tweak + id: 5832 + time: '2024-01-30T13:28:17.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24714 +- author: themias changes: - - {message: Removed the ability to link IEDs to a remote signal., type: Remove} - id: 5178 - time: '2023-11-15T10:02:37.0000000+00:00' -- author: TsjipTsjip + - message: Stun batons now toggle off after being drained by an EMP. + type: Fix + id: 5833 + time: '2024-01-30T23:04:26.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24706 +- author: Tayrtahn + changes: + - message: Fixed weird rotation while strapped to a bed. + type: Fix + id: 5834 + time: '2024-01-30T23:23:31.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24746 +- author: themias changes: - - {message: 'Kettle''s exterior airlocks are now far less likely to end up bolted, - but must be configured manually now.', type: Tweak} - id: 5179 - time: '2023-11-15T20:56:13.0000000+00:00' -- author: Vasilis + - message: Some glasses and masks can be worn together to hide your identity. + type: Tweak + id: 5835 + time: '2024-01-31T03:49:19.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24741 +- author: mirrorcult changes: - - {message: Made it so you can unbuckle players from Vehicles IF they are in incapacitated - (crit or dead)., type: Tweak} - - {message: You can no longer unbuckle yourself while you are incapacitated., type: Fix} - id: 5180 - time: '2023-11-16T02:39:04.0000000+00:00' -- author: EmoGarbage404 + - message: Throwing recoil reduced further + type: Tweak + id: 5836 + time: '2024-01-31T05:00:41.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24759 +- author: mirrorcult changes: - - {message: Clicking actions in the HUD no longer triggers them multiple times., - type: Fix} - - {message: Fixed action bar overlapping vote box in separated HUD., type: Fix} - - {message: Dragging actions to the action bar now shows an empty slot where they - can be added., type: Tweak} - id: 5181 - time: '2023-11-16T05:12:47.0000000+00:00' + - message: Various aspects of the station will now be varied automatically at the + start of the round. Expect more trash, some broken/oddly-functioning lights, + and spills (and more stuff in the future). + type: Add + id: 5837 + time: '2024-01-31T05:52:35.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24397 - author: metalgearsloth changes: - - {message: 'Added another mining song by Derflerp, Voyage Neverending.', type: Add} - id: 5182 - time: '2023-11-16T13:28:07.0000000+00:00' -- author: liltenhead + - message: Remove handheld crew monitors in lieu of computers. + type: Remove + id: 5838 + time: '2024-01-31T11:23:49.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24761 +- author: Hmeister-real + changes: + - message: You can now Sob and Chortle with emotes + type: Tweak + id: 5839 + time: '2024-01-31T11:26:46.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24585 +- author: TheShuEd changes: - - {message: Reduced IED's damage from 90 -> 45, type: Tweak} - id: 5183 - time: '2023-11-16T16:13:23.0000000+00:00' -- author: RaiIsNotYourGuy - changes: - - {message: Shuttle Call Time reduced to 3 minutes from 10 minutes for NukeOps gamerule, - type: Tweak} - id: 5184 - time: '2023-11-16T21:01:06.0000000+00:00' -- author: 2013HORSEMEATSCANDAL - changes: - - {message: Cybersun has begun naming their operations to make them easier to remember., - type: Add} - id: 5185 - time: '2023-11-16T21:04:50.0000000+00:00' + - message: Anomalies can no longer spawn entities in walls or other objects. + type: Fix + id: 5840 + time: '2024-01-31T21:05:29.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24783 +- author: EdenTheLiznerd + changes: + - message: The Syndicate has changed around their stock prices and gotten rid of + some old dusty headsets + type: Tweak + id: 5841 + time: '2024-02-01T00:28:42.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24765 - author: metalgearsloth changes: - - {message: Tweak biome generation on planets to make floors more varied and add - stalagmites to caves., type: Tweak} - id: 5186 - time: '2023-11-16T21:22:06.0000000+00:00' -- author: deltanedas - changes: - - {message: Atlas Station is back for lowpop rounds!, type: Add} - id: 5187 - time: '2023-11-16T22:35:33.0000000+00:00' -- author: deltanedas + - message: Removed vehicles pending rework (the code is bad I was told to make this + more obvious). + type: Remove + id: 5842 + time: '2024-02-01T00:33:10.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24681 +- author: Jajsha + changes: + - message: Emagged borgs now recieve laws recontextualizing who's a crew member + instead of recieving a completely new lawset. + type: Tweak + id: 5843 + time: '2024-02-01T05:02:49.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24698 +- author: PJB3005 changes: - - {message: Goats now grow wool which moths can eat., type: Add} - id: 5188 - time: '2023-11-17T08:51:51.0000000+00:00' -- author: deltanedas + - message: Health analyzers now show if somebody is starving. + type: Add + id: 5844 + time: '2024-02-01T06:28:17.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24789 +- author: PixelTK changes: - - {message: Fixed artifact crafting requiring separate stacks and wasting fragments., - type: Fix} - id: 5189 - time: '2023-11-18T04:31:50.0000000+00:00' + - message: The arachnid plushie now has a new sprite. + type: Tweak + id: 5845 + time: '2024-02-01T06:36:43.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24747 - author: lzk228 changes: - - {message: Moths can no longer eat welding masks., type: Fix} - id: 5190 - time: '2023-11-18T04:32:17.0000000+00:00' -- author: Jrpl + - message: Yellow oxygen tank was removed to standardise gas tank colourings. + type: Remove + id: 5846 + time: '2024-02-01T06:53:33.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24374 +- author: koteq + changes: + - message: Fixed indicator near SSD players + type: Fix + id: 5847 + time: '2024-02-01T08:30:07.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24589 +- author: TheShuEd changes: - - {message: Borgs no longer take structural damage., type: Tweak} - id: 5191 - time: '2023-11-19T06:44:22.0000000+00:00' -- author: metalgearsloth + - message: Anomaly generator can now only be used by a scientist. + type: Tweak + id: 5848 + time: '2024-02-01T08:45:24.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24464 +- author: PJB3005 changes: - - {message: Align windoor collision bounds with thindow collision bounds., type: Fix} - id: 5192 - time: '2023-11-19T06:44:36.0000000+00:00' -- author: Slava0135 + - message: Removed starvation damage + type: Remove + id: 5849 + time: '2024-02-01T09:01:52.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24790 +- author: SlamBamActionman + changes: + - message: The Visitor job can now be given to ID cards via the ID Card Console/Agent + IDs. + type: Add + id: 5850 + time: '2024-02-01T10:13:44.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/23972 +- author: Dygon + changes: + - message: When slipping on lube you now keep sliding until you reach a tile without + lube. + type: Tweak + id: 5851 + time: '2024-02-01T10:39:10.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24801 +- author: FungiFellow + changes: + - message: Added Binary Key in RD's Locker + type: Add + - message: 50% off Binary Key + type: Tweak + id: 5852 + time: '2024-02-01T10:42:12.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24778 +- author: Dygon + changes: + - message: Paraplegic entities have their legs healed when zombified. + type: Fix + id: 5853 + time: '2024-02-01T11:06:05.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24169 +- author: PJB3005 changes: - - {message: Disposal traversal damage is disabled for now., type: Tweak} - id: 5193 - time: '2023-11-19T10:25:02.0000000+00:00' -- author: deltanedas + - message: The AME can now single-handedly power the entire station until one of + our cool coders gets their shit together and fixes engineering. + type: Fix + id: 5854 + time: '2024-02-01T11:06:52.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24806 +- author: Varen + changes: + - message: Cutting wires will now properly electrocute if enough power is available. + type: Fix + id: 5855 + time: '2024-02-01T11:54:25.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24554 +- author: SlamBamActionman + changes: + - message: Paper is now edible, even for non-moths. + type: Tweak + id: 5856 + time: '2024-02-01T12:40:55.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24755 +- author: mac6na6na + changes: + - message: Tiered part crates will no longer appear on salvage expeditions. + type: Remove + id: 5857 + time: '2024-02-01T12:41:03.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24810 +- author: mirrorcult changes: - - {message: Fixed explosions deleting bodyparts and organs inside of people., type: Fix} - id: 5194 - time: '2023-11-19T17:44:42.0000000+00:00' -- author: nikthechampiongr + - message: Crayon/lathe/vendor/round end/gas analyzer windows now open closer to + the sides of the screen + type: Tweak + id: 5858 + time: '2024-02-01T12:49:49.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24767 +- author: Tayrtahn + changes: + - message: Plushies, whoopie cushions, and a few other noisemaking objects can be + used as modular grenade payloads. + type: Add + id: 5859 + time: '2024-02-01T12:59:42.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24306 +- author: Repo changes: - - {message: Zombified mice and other small animals no longer spread zombification., - type: Tweak} - id: 5195 - time: '2023-11-19T22:28:05.0000000+00:00' -- author: Kadeo64 + - message: AFK admins will trigger the SOS in aHelp relay. + type: Tweak + id: 5860 + time: '2024-02-01T13:03:50.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24482 +- author: Nopey + changes: + - message: Many belts and the plant bag no longer produce an erroneous "Can't insert" + and "This doesn't go in there!" messages while inserting certain items such + as Produce (plant bag) or Smoke Grenades (security belt). + type: Fix + - message: Ammunition can once again be stored in assault belts, as was the case + before June 2022. + type: Fix + id: 5861 + time: '2024-02-01T13:33:57.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24063 +- author: Blazeror + changes: + - message: Chemical analysis goggles can now inspect solutions inside spray bottles. + type: Fix + id: 5862 + time: '2024-02-01T22:19:01.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24838 +- author: themias changes: - - {message: The Ripley APLU is now Tier 1 Industrial., type: Tweak} - id: 5196 - time: '2023-11-20T00:58:07.0000000+00:00' -- author: Velcroboy + - message: Fixed dylovene overdoses not applying brute damage + type: Fix + id: 5863 + time: '2024-02-01T22:21:04.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24826 +- author: themias + changes: + - message: Added sound effect for Diona salutes + type: Add + id: 5864 + time: '2024-02-01T22:34:09.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24836 +- author: Dutch-VanDerLinde + changes: + - message: Detectives are now listed under civilian instead of security. + type: Tweak + id: 5865 + time: '2024-02-01T22:49:54.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24739 +- author: VasilisThePikachu + changes: + - message: The fridge's explosion resistance has been nerfed significantly, It's + no longer able to survive nukes at point blank range of the nuke. + type: Tweak + id: 5866 + time: '2024-02-01T23:41:43.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24844 +- author: Dygon + changes: + - message: You can't slip through chain link fences anymore. + type: Fix + id: 5867 + time: '2024-02-02T04:24:20.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24850 +- author: Psychpsyo changes: - - {message: Shuttle walls and windows can now be constructed., type: Tweak} - id: 5197 - time: '2023-11-21T01:20:24.0000000+00:00' + - message: You can now turn down the screen shake intensity in the accessibility + settings. + type: Add + id: 5868 + time: '2024-02-02T12:39:13.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24749 +- author: Anzarot121 + changes: + - message: Fixed a problem in the code due to which mobs, including hamsters, slimes, + spiders, xenos, could not pull things. + type: Fix + id: 5869 + time: '2024-02-03T01:25:11.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/22485 +- author: Tayrtahn + changes: + - message: 'Added a new flavor of Donk Pockets: Stonk Pockets' + type: Add + id: 5870 + time: '2024-02-03T01:55:03.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24876 +- author: Hmeister + changes: + - message: The guidebook entry for cargo is now up to date, and some other minor + changes to the guidebook. + type: Tweak + id: 5871 + time: '2024-02-03T02:07:21.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24828 +- author: FairlySadPanda + changes: + - message: The round restart audio, again... + type: Fix + id: 5872 + time: '2024-02-03T02:11:53.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24754 +- author: Adrian16199 + changes: + - message: Added scarfs to the uniform printer. + type: Add + id: 5873 + time: '2024-02-03T02:12:38.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24735 +- author: Jajsha + changes: + - message: Emagged Cyborgs are no longer affected by Ion Storm events. + type: Fix + - message: Improved wording of cyborg laws. + type: Tweak + id: 5874 + time: '2024-02-03T02:29:41.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24870 - author: metalgearsloth changes: - - {message: Fix being unable to FTL dock to planets., type: Fix} - id: 5198 - time: '2023-11-22T01:02:02.0000000+00:00' -- author: Feluk6174 + - message: Moving entities that are pulled now throws them instead of moving them + manually. + type: Tweak + id: 5875 + time: '2024-02-03T03:36:09.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/20906 +- author: lzk228 + changes: + - message: Soapy water removed. + type: Remove + id: 5876 + time: '2024-02-03T04:23:34.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24301 +- author: Krunk + changes: + - message: Characters can properly select 'None' as a preference for their spawn + priority. + type: Fix + id: 5877 + time: '2024-02-03T08:06:44.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24897 +- author: Krunk + changes: + - message: Pointing arrows now begin at the player and smoothly animate to their + target. + type: Add + id: 5878 + time: '2024-02-03T08:09:20.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24864 +- author: Dygon + changes: + - message: Single tile sized puddles of space lube won't let you slide extremely + far anymore. + type: Fix + id: 5879 + time: '2024-02-03T08:10:51.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24846 +- author: shampunj + changes: + - message: Fixed incorrect path to the uranium spear image in the construction menu + type: Fix + id: 5880 + time: '2024-02-03T08:11:02.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24895 +- author: nikthechampiongr changes: - - {message: 'Bananadine is now a psychedelic that can be obtained by grinding baked - banana peels, which can be obtained by microwaving banana peels.', type: Add} - id: 5199 - time: '2023-11-22T01:08:53.0000000+00:00' -- author: Gotimanga + - message: End of round messages no longer loop until the heat death of the universe. + type: Fix + id: 5881 + time: '2024-02-03T16:43:50.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24920 +- author: EmoGarbage404 changes: - - {message: The reagent "egg" is now known as "cooked egg", type: Tweak} - id: 5200 - time: '2023-11-22T04:32:35.0000000+00:00' -- author: themias + - message: Changed the colors used for chat names. + type: Tweak + id: 5882 + time: '2024-02-03T17:33:58.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24922 +- author: deltanedas changes: - - {message: You must now unlock a cyborg's panel to access it, type: Fix} - id: 5201 - time: '2023-11-22T17:16:03.0000000+00:00' -- author: Nyranu + - message: Dissolved the biochem technology discipline into others and roundstart + availability. + type: Add + id: 5883 + time: '2024-02-03T18:13:30.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24871 +- author: themias changes: - - {message: The ability to put a cakecat on your head., type: Add} - id: 5202 - time: '2023-11-23T00:41:48.0000000+00:00' -- author: metalgearsloth + - message: EMPs temporarily disable suit sensors + type: Tweak + id: 5884 + time: '2024-02-04T00:50:24.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24869 +- author: themias changes: - - {message: 'Audio rework got re-merged, the changelog has been re-posted here for - brevity.', type: Add} - - {message: Grid audio will now attenuate properly over distance and won't be ear - rupturingly loud., type: Fix} - - {message: FTL sound should no longer persist as it's attached to the shuttle instead - of being global., type: Fix} - - {message: Audio can now start at an offset so if an audio source comes into range - so it won't play from the start., type: Fix} - - {message: Changed audio attenuation from InverseDistanceClamped to LinearDistanceClamped - so it's smoother. You may need to adjust your master audio volume., type: Tweak} - id: 5203 - time: '2023-11-27T11:21:23.0000000+00:00' + - message: Added face bandanas + type: Add + - message: Bandanas can be switched between head and face type with an alt verb + (Fold) + type: Tweak + id: 5885 + time: '2024-02-04T00:52:44.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24597 - author: metalgearsloth changes: - - {message: Fix ahelp audio., type: Fix} - id: 5204 - time: '2023-11-27T13:42:04.0000000+00:00' -- author: Ilya246 + - message: Moving to open lockers is now predicted. + type: Fix + id: 5886 + time: '2024-02-04T02:23:16.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24937 +- author: Tayrtahn + changes: + - message: Added opened/closed visuals and fill levels for a variety of drinks. + type: Add + id: 5887 + time: '2024-02-04T20:13:48.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24600 +- author: deltanedas changes: - - {message: Refrigerators are now nearly immune to explosions and even nukes., type: Tweak} - id: 5205 - time: '2023-11-27T21:24:43.0000000+00:00' -- author: lzk228 + - message: Grilles are no longer incredibly strong. + type: Tweak + id: 5888 + time: '2024-02-04T20:48:06.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24881 +- author: Scribbles0 + changes: + - message: Holoparasites can now autoattack at their max attack rate when holding + down their attack button. + type: Add + id: 5889 + time: '2024-02-04T23:01:49.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24944 +- author: EdenTheLiznerd + changes: + - message: Sectech no longer says "Let's crack communist skulls!" It now says "Let's + crack syndicate skulls!" + type: Tweak + id: 5890 + time: '2024-02-05T12:24:52.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24965 +- author: Varen + changes: + - message: Rebalanced electrocution damage to ramp up slower with power levels. + type: Tweak + id: 5891 + time: '2024-02-05T18:47:52.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24829 +- author: ficcialfaint and deltanedas + changes: + - message: Criminal records and the console that manages them have been added to + the game. They also have a guidebook entry. + type: Add + id: 5892 + time: '2024-02-05T23:03:04.754935+00:00' + url: null +- author: themias changes: - - {message: Moth accent added! Buzzz!!!, type: Add} - id: 5206 - time: '2023-11-27T21:28:43.0000000+00:00' -- author: BurninDreamer + - message: Outlaw Glasses fully hide your identity again + type: Tweak + id: 5893 + time: '2024-02-05T23:23:44.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24971 +- author: Emisse changes: - - {message: The Captain's Carapace no longer has a 10% movement speed penalty., - type: Tweak} - id: 5207 - time: '2023-11-27T21:29:30.0000000+00:00' + - message: Nonstandard pens now embed again. (explosive pen good again) + type: Tweak + id: 5894 + time: '2024-02-05T23:30:06.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24849 +- author: FungiFellow + changes: + - message: Altered content of several Borg Modules for QoL + type: Tweak + - message: Removed Gas Analyzer Module + type: Remove + id: 5895 + time: '2024-02-05T23:46:39.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24702 - author: Rainfey changes: - - {message: Chameleon functionality to Agent and Nukie ID cards, type: Add} - id: 5208 - time: '2023-11-27T21:34:30.0000000+00:00' -- author: deltanedas + - message: Health Analysers now continuously update their UI after scanning a patient + type: Tweak + id: 5896 + time: '2024-02-06T13:20:10.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/22449 +- author: ada-please + changes: + - message: A Surveillance Camera Monitor Board has been added to the Syndicate Observation + Kit. + type: Add + id: 5897 + time: '2024-02-06T16:25:07.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24979 +- author: snebl + changes: + - message: Fixed the glass version of cargo airlock looking like an engineering + door when opened. + type: Fix + id: 5898 + time: '2024-02-06T19:38:39.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25003 +- author: Mangohydra + changes: + - message: New cargo shuttle for fland + type: Tweak + id: 5899 + time: '2024-02-07T08:49:06.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25016 +- author: Ilya246 changes: - - {message: Revenants can no longer emag evac to instantly launch the shuttle., - type: Fix} - id: 5209 - time: '2023-11-27T21:39:30.0000000+00:00' -- author: Flareguy + - message: Atmos devices can now be built behind directional windows and on lattice. + type: Tweak + id: 5900 + time: '2024-02-08T23:07:42.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25057 +- author: Ubaser changes: - - {message: Disabled space wind & atmos tile ripping., type: Remove} - id: 5210 - time: '2023-11-27T21:42:29.0000000+00:00' -- author: Vasilis + - message: T-Ray scanner sprite is tweaked. + type: Tweak + id: 5901 + time: '2024-02-08T23:09:00.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25047 +- author: nikthechampiongr changes: - - {message: 'Gibbed mothroaches wont drop all normal moth species parts, just animal - organs.', type: Fix} - id: 5211 - time: '2023-11-27T21:42:53.0000000+00:00' -- author: deltanedas + - message: Brig timers display their label properly again. + type: Fix + id: 5902 + time: '2024-02-08T23:12:05.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25033 +- author: vero5123 + changes: + - message: fixes mop buckets being indestructible. + type: Fix + id: 5903 + time: '2024-02-08T23:15:12.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25001 +- author: Adrian16199 + changes: + - message: Added a straw hat that can be crafted with wheat. + type: Add + id: 5904 + time: '2024-02-08T23:17:01.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24997 +- author: Sk1tch + changes: + - message: Guidebook entries are now alphabetically sorted + type: Tweak + id: 5905 + time: '2024-02-08T23:23:35.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24963 +- author: FairlySadPanda + changes: + - message: Swapped out the Skelly Vs The Rev art with a new, higher-res version. + type: Tweak + id: 5906 + time: '2024-02-10T02:06:02.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25088 +- author: Potato1234_x changes: - - {message: When Revolution rounds end each headrev has their number of converted - people shown., type: Tweak} - id: 5212 - time: '2023-11-27T21:43:49.0000000+00:00' -- author: Velcroboy + - message: Added laughin' peas, a new mutation for peas that can be ground into + Laughter, a chem that forces people to laugh. + type: Add + id: 5907 + time: '2024-02-10T08:21:44.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/25089 +- author: themias changes: - - {message: 'Fixed janitorial items (wet floor signs, spray bottles, light replacers, - and plungers) not fitting in the janitor''s trolley.', type: Fix} - id: 5213 - time: '2023-11-27T22:16:17.0000000+00:00' + - message: Soft caps can be flipped backwards with an alt-verb (Flip) + type: Tweak + id: 5908 + time: '2024-02-10T08:44:19.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24961 +- author: Blackern5000 + changes: + - message: Shotgun beanbag rounds now deal 40 stamina damage and stun in 3 hits. + type: Tweak + id: 5909 + time: '2024-02-10T08:49:24.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24653 - author: metalgearsloth changes: - - {message: Fix ambient audio not playing., type: Fix} - id: 5214 - time: '2023-11-28T03:09:26.0000000+00:00' -- author: M3739 + - message: Fix screenspace popups e.g. inventory / access popups drawing below the + UI. + type: Fix + id: 5910 + time: '2024-02-10T08:51:11.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24987 +- author: themias + changes: + - message: The ID card console now correctly updates the ID's department when you + update its job + type: Fix + - message: The Agent ID will update its department depending on the selected icon + type: Fix + id: 5911 + time: '2024-02-10T09:17:26.0000000+00:00' + url: https://api.github.com/repos/space-wizards/space-station-14/pulls/24975 +- author: Nimfar11 changes: - - {message: An entry regarding cyborgs has been added to the guidebook., type: Add} - id: 5215 - time: '2023-11-28T03:18:22.0000000+00:00' + - message: Adds a glass showcase for an antique laser pistol. + type: Add + id: 5912 + time: '2024-02-10T23:36:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25104 +- author: Jezithyr + changes: + - message: Changed gibbing to now rotate giblets randomly when they are spawned. + type: Tweak + - message: Giblets are now thrown around the body instead of spawning in a rough + pile. + type: Tweak + id: 5913 + time: '2024-02-10T23:37:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24989 +- author: Jajsha + changes: + - message: Cyborgs can no longer Emag themselves. + type: Fix + id: 5914 + time: '2024-02-11T06:23:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24748 - author: Ubaser changes: - - {message: Remove the Captain's spare gloves from his locker., type: Remove} - id: 5216 - time: '2023-11-28T05:45:56.0000000+00:00' + - message: Grinding ectoplasm now gives Necrosol. + type: Tweak + id: 5915 + time: '2024-02-11T06:24:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25053 - author: Ubaser changes: - - {message: The HoP now starts with a pair of papercut-proof gloves., type: Add} - id: 5217 - time: '2023-11-28T06:21:06.0000000+00:00' -- author: themias + - message: Food Service research is now roundstart. + type: Tweak + id: 5916 + time: '2024-02-11T06:37:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25046 +- author: SlamBamActionman + changes: + - message: Added setting to toggle chat name color in Options. + type: Add + id: 5917 + time: '2024-02-11T06:38:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24625 +- author: Emisse changes: - - {message: Fixed riot shield audio and popup spam, type: Fix} - id: 5218 - time: '2023-11-28T07:06:38.0000000+00:00' -- author: UbaserB + - message: Ambuzol now requires zombie blood + type: Tweak + id: 5918 + time: '2024-02-11T20:47:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25119 +- author: Plykiya + changes: + - message: Door remotes no longer have their 5G signals absorbed by mobs, machines, + or Ian's cute butt. + type: Fix + id: 5919 + time: '2024-02-12T02:34:13.532550+00:00' + url: null +- author: FungiFellow + changes: + - message: Lowered Reoccurence Delay for Ion Storm + type: Tweak + id: 5920 + time: '2024-02-12T02:35:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25135 +- author: PoorMansDreams + changes: + - message: Ammo is now tipped! + type: Tweak + id: 5921 + time: '2024-02-12T03:02:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25103 +- author: PoorMansDreams + changes: + - message: Buyable Janitorial Trolley! + type: Add + id: 5922 + time: '2024-02-12T06:35:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25139 +- author: Plykiya + changes: + - message: Stun batons and stun prods now display their hits remaining. + type: Tweak + id: 5923 + time: '2024-02-12T06:36:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25141 +- author: Ilya246 changes: - - {message: Blood now has a sprite when placed in metamorphic glasses., type: Add} - id: 5219 - time: '2023-11-28T07:09:56.0000000+00:00' -- author: metalgearsloth + - message: Autolathes may now make empty air tanks. + type: Add + id: 5924 + time: '2024-02-12T06:37:28.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25130 +- author: Ubaser changes: - - {message: Fix global audio not being global., type: Fix} - - {message: Update MIDI audio every frame rather than every 1/10 seconds to fix - positioning and occlusion weirdness., type: Tweak} - id: 5220 - time: '2023-11-28T09:48:18.0000000+00:00' -- author: metalgearsloth + - message: Resprited the CE's jetpack. + type: Tweak + id: 5925 + time: '2024-02-12T20:44:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25150 +- author: EdenTheLiznerd + changes: + - message: Deathnettles are no longer able to bypass armor and don't do as much + damage + type: Tweak + id: 5926 + time: '2024-02-13T01:20:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25068 +- author: Vasilis changes: - - {message: Fix audio not playing during weather., type: Fix} - id: 5221 - time: '2023-11-28T12:35:38.0000000+00:00' + - message: You can now inspect peoples id's and health though glass if you are within + details range. + type: Tweak + id: 5927 + time: '2024-02-13T06:41:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25163 - author: metalgearsloth changes: - - {message: Fix some sound sources not playing positionally (e.g. glass breaking)., - type: Fix} - id: 5222 - time: '2023-11-28T23:19:23.0000000+00:00' -- author: metalgearsloth + - message: Fix decal error spam in console due to a missing overlay. + type: Fix + id: 5928 + time: '2024-02-13T07:10:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25170 +- author: jamessimo + changes: + - message: Can now "wink" with the text emote ;) or ;] + type: Add + - message: Can now "tearfully smile" with the text emote :') and similar variants + type: Add + - message: Added more ways to "cry" with the emote :'( and similar variants + type: Tweak + id: 5929 + time: '2024-02-13T15:43:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25129 +- author: icekot8 + changes: + - message: Medical berets added to MediDrobe + type: Add + id: 5930 + time: '2024-02-13T21:37:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25176 +- author: PoorMansDreams + changes: + - message: Alternate ammo now has the proper appearance when spent. + type: Fix + id: 5931 + time: '2024-02-13T21:40:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25167 +- author: Agoichi + changes: + - message: All hoods have tag "Hides Hair" + type: Tweak + - message: Plague Doctor's hat and Witch hat (with red hair) have tag "Hides Hair" + type: Tweak + id: 5932 + time: '2024-02-13T21:43:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25142 +- author: Blackern5000 + changes: + - message: Advanced topical meds now cost significantly less chemicals + type: Tweak + id: 5933 + time: '2024-02-13T22:03:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24948 +- author: Tayrtahn + changes: + - message: Drink bottles can now be opened and closed from the verbs menu, and some + have been given tamper-evident seals. + type: Add + id: 5934 + time: '2024-02-13T22:08:07.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24780 +- author: TheShuEd changes: - - {message: Removed artifact spam on roundend due to the ensuing lag., type: Remove} - id: 5223 - time: '2023-11-29T03:39:16.0000000+00:00' -- author: metalgearsloth + - message: Darkness is coming. A new shadow anomaly added. + type: Add + id: 5935 + time: '2024-02-13T22:12:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24629 +- author: jamessimo + changes: + - message: Microwave UI enhancements + type: Tweak + - message: Microwaves now tell you how much time is left when cooking + type: Tweak + - message: Microwaves UI now uses prediction for user inputs. + type: Fix + id: 5936 + time: '2024-02-13T22:16:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24547 +- author: TheShuEd changes: - - {message: Fix doppler effect on shuttles by also setting player's velocity in - the audio API., type: Fix} - - {message: Fix left-right ear weirdness caused by floating-point imprecision on - audio positioning., type: Fix} - id: 5224 - time: '2023-11-29T05:44:45.0000000+00:00' -- author: metalgearsloth + - message: Remote signallers are now limited to a 15-tile radius + type: Tweak + - message: Added an advanced remote signaler, with a range of 30 tiles. + type: Add + - message: the anomaly synchronizer consumes much less power, and no longer causes + the anomaly pulses when powering down. + type: Tweak + id: 5937 + time: '2024-02-13T22:19:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24461 +- author: joshepvodka changes: - - {message: Fix getting stuck between tables., type: Fix} - id: 5225 - time: '2023-11-29T13:23:21.0000000+00:00' -- author: metalgearsloth + - message: Fax machines can now print text files from your computer. + type: Add + id: 5938 + time: '2024-02-14T01:14:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/23262 +- author: Plykiya + changes: + - message: Holosigns can now be placed at range. No more being eaten by forcefields! + type: Tweak + id: 5939 + time: '2024-02-14T05:25:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25120 +- author: Zadeon + changes: + - message: Disablers now fit inside the suit storage slot. + type: Fix + id: 5940 + time: '2024-02-14T23:07:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25238 +- author: Jezithyr + changes: + - message: Death Acidifier implants not deleting items when activated + type: Fix + id: 5941 + time: '2024-02-15T01:37:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25251 +- author: PJB3005 changes: - - {message: Fix remaining audio left-right transitioning too quickly., type: Fix} - id: 5226 - time: '2023-11-30T00:56:08.0000000+00:00' -- author: lzk228 + - message: Fixed disposals bins not automatically flushing after an item was inserted. + type: Fix + id: 5942 + time: '2024-02-15T20:52:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25233 +- author: liltenhead + changes: + - message: Reduced energy shield's hp from 150 to 100. + type: Tweak + id: 5943 + time: '2024-02-15T20:54:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25258 +- author: PJB3005 changes: - - {message: Skeletons are zombie immune now., type: Tweak} - id: 5227 - time: '2023-11-30T02:40:39.0000000+00:00' + - message: Nuke has some more blinkenlights now. + type: Tweak + id: 5944 + time: '2024-02-16T00:26:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25297 - author: MACMAN2003 changes: - - {message: Added a green central command cap like the captain's blue one., type: Add} - id: 5228 - time: '2023-11-30T07:20:45.0000000+00:00' + - message: Thindows no longer duplicate glass when broken. + type: Fix + id: 5945 + time: '2024-02-16T04:03:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25304 +- author: Golinth + changes: + - message: Mindshields are no longer separate and appear as a border around job + icons on the SecHUD + type: Tweak + id: 5946 + time: '2024-02-16T15:58:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25303 +- author: Lukasz825700516 + changes: + - message: Damaging stacked glass sheets now gives appropriate amount of glass shards + type: Fix + id: 5947 + time: '2024-02-16T18:42:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25308 +- author: Plykiya + changes: + - message: The firefighting door remote now has access to atmos doors. + type: Tweak + id: 5948 + time: '2024-02-16T18:50:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25097 +- author: themias + changes: + - message: t-ray scanners can now penetrate carpets and puddles + type: Tweak + id: 5949 + time: '2024-02-16T23:37:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25276 +- author: Krunk + changes: + - message: Sound effects have been added for writing on paper. + type: Add + id: 5950 + time: '2024-02-16T23:48:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25257 +- author: PotentiallyTom + changes: + - message: Added new covers for the medical, security, and science guidebooks + type: Add + id: 5951 + time: '2024-02-16T23:50:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25232 +- author: PJB3005 + changes: + - message: Fix some rounding issues with complex chemical reactions. + type: Fix + id: 5952 + time: '2024-02-16T23:54:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25199 +- author: data_redacted + changes: + - message: New lobby art (of an Air Alarm blueprint). + type: Add + id: 5953 + time: '2024-02-17T02:52:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25179 +- author: Lank + changes: + - message: Diona nymphs, small cat-like creatures, several of which make up a Diona. + type: Add + - message: Diona are now able to split into three nymphs on death, and will control + one of them. The controlled nymph is able to reform into a new diona after some + time. + type: Add + - message: Diona now combust into flames upon being hit with significant heat damage. + type: Tweak + id: 5954 + time: '2024-02-17T02:54:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24630 +- author: PolterTzi + changes: + - message: Seeds from sampled plants now inherit the sampled plant's health to discourage + excessive sampling. + type: Tweak + - message: Plants need to grow a bit before being sampled. + type: Tweak + id: 5955 + time: '2024-02-17T05:02:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25326 +- author: Dygon + changes: + - message: Diona nymphs aren't deleted immediately after spawning anymore. + type: Fix + id: 5956 + time: '2024-02-17T16:38:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25344 +- author: Geekyhobo + changes: + - message: Massban Flag has been added to admin ranks + type: Add + id: 5957 + time: '2024-02-17T20:32:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25327 +- author: Moomoobeef + changes: + - message: Detectives are now supplied with a box of evidence markers, useful for + marking evidence at a crime scene. + type: Add + id: 5958 + time: '2024-02-17T20:49:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25255 - author: Ubaser changes: - - {message: Core has been reworked and added back into the map pool., type: Add} - id: 5229 - time: '2023-11-30T08:13:13.0000000+00:00' + - message: New "tailed" hair. + type: Add + id: 5959 + time: '2024-02-17T20:49:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25216 - author: Ubaser changes: - - {message: Nuclear operative agents now spawn with a PDA that can scan for injuries., - type: Add} - id: 5230 - time: '2023-11-30T21:39:08.0000000+00:00' -- author: Rainfey + - message: A new chest scar marking is now available to humans and dwarves. + type: Add + id: 5960 + time: '2024-02-17T20:50:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25215 +- author: ArchPigeon + changes: + - message: Tails now stop wagging on crit + type: Fix + id: 5961 + time: '2024-02-17T21:33:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25323 +- author: Killerqu00 + changes: + - message: EVA and paramedic suits now play sound when putting helmet on. + type: Fix + id: 5962 + time: '2024-02-17T22:34:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25349 +- author: musicmanvr + changes: + - message: Toned down the newton cradle and added it to the bureaucracy crate for + bored accountants. + type: Fix + id: 5963 + time: '2024-02-17T23:55:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25357 +- author: genderGeometries + changes: + - message: Allicin, nutriment, and vitamin can now be centrifuged. Protein and fat + can now be electrolyzed. + type: Add + id: 5964 + time: '2024-02-19T06:05:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25366 +- author: azurerosegarden + changes: + - message: Drinks in the Solar's Best Hot Drinks menu now show their contents + type: Fix + id: 5965 + time: '2024-02-19T15:40:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25301 +- author: Lank + changes: + - message: Nymphs can now open doors and chirp. + type: Tweak + id: 5966 + time: '2024-02-19T17:11:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25363 +- author: PotentiallyTom + changes: + - message: Gave guidebooks to the 4 learner roles + type: Tweak + id: 5967 + time: '2024-02-19T18:54:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25388 +- author: jamessimo + changes: + - message: vending machine UI improved + type: Tweak + id: 5968 + time: '2024-02-19T22:18:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25377 +- author: marbow + changes: + - message: Moths can now eat plushies and with a distinctive sound! + type: Add + id: 5969 + time: '2024-02-19T22:35:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25382 +- author: ArchPigeon + changes: + - message: Liquid Tritium can now be used as a chem in flamethrowers + type: Add + id: 5970 + time: '2024-02-19T22:37:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25281 +- author: ElectroJr + changes: + - message: Fix actions sometimes disappearing. + type: Fix + id: 5971 + time: '2024-02-20T02:08:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25395 +- author: PJB3005 changes: - - {message: Agent ID not longer resets name when changing its appearance, type: Fix} - id: 5231 - time: '2023-11-30T21:42:44.0000000+00:00' -- author: eddiedd + - message: Fixed timezone issues with the admin notes window. + type: Fix + id: 5972 + time: '2024-02-20T09:13:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25280 +- author: PJB3005 changes: - - {message: 'Lemon has been discovered a mutation species, lemoon, which could be - grind for milk', type: Add} - id: 5232 - time: '2023-11-30T21:44:23.0000000+00:00' + - message: Fixed selection behavior for player lists such as the ban panel or ahelp + window. + type: Fix + id: 5973 + time: '2024-02-20T09:13:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25248 +- author: Tonydatguy + changes: + - message: Ore Crabs will now take structural damage. + type: Tweak + id: 5974 + time: '2024-02-20T10:43:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25390 +- author: Golinth + changes: + - message: The mindshield outline now flashes! + type: Tweak + id: 5975 + time: '2024-02-20T22:26:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25409 +- author: landwhale + changes: + - message: Resprited Nettles & Death Nettles. + type: Tweak + id: 5976 + time: '2024-02-20T23:58:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25421 +- author: takemysoult + changes: + - message: Explosive Technology changed to tier 2 arsenal and the cost has increased + to 10 000 + type: Tweak + id: 5977 + time: '2024-02-21T00:56:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25397 +- author: Callmore + changes: + - message: Shoving other people is now more consistent. + type: Fix + id: 5978 + time: '2024-02-21T04:01:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25353 - author: Ubaser changes: - - {message: The senior physician beret now matches their outfit more., type: Tweak} - id: 5233 - time: '2023-12-01T08:34:08.0000000+00:00' -- author: enumerate0 + - message: A new UI theme, "Ashen", is now available to select in the options menu. + type: Add + id: 5979 + time: '2024-02-21T05:26:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25408 +- author: Holinka4ever + changes: + - message: Sunglasses were removed from ClothesMate + type: Remove + id: 5980 + time: '2024-02-21T06:11:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25221 +- author: Errant changes: - - {message: 'Recognizable solutions now appear sorted by volume first, then by name', - type: Tweak} - id: 5234 - time: '2023-12-01T08:35:51.0000000+00:00' -- author: Whisper + - message: Rotten food is now less lethal to eat, and has a high chance to induce + vomiting. + type: Tweak + id: 5981 + time: '2024-02-21T06:12:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25418 +- author: EdenTheLiznerd + changes: + - message: Deathnettles no longer penetrate hardsuit armor + type: Tweak + id: 5982 + time: '2024-02-21T06:16:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25286 +- author: Tayrtahn + changes: + - message: Added fill level visuals to all the drinks. Cheers! + type: Add + id: 5983 + time: '2024-02-21T06:17:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25319 +- author: Potato1234_x changes: - - {message: 'Added the Death Acidifier, an implant that destroys your body and equipment - without harming allies.', type: Add} - - {message: Added the microbomb implanter back to nukie uplinks., type: Add} - - {message: Nukies have exchanged microbomb implants for Death Acidifiers., type: Tweak} - id: 5235 - time: '2023-12-01T20:14:45.0000000+00:00' -- author: Vasilis + - message: Happy Honk boxes can now hold normal sized items + type: Tweak + id: 5984 + time: '2024-02-21T06:21:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25245 +- author: Hanzdegloker + changes: + - message: Standardized amount of huds in vendors and added new diagnostics eyeapatch + hud + type: Tweak + id: 5985 + time: '2024-02-21T06:22:30.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25208 +- author: DebugOk + changes: + - message: Drones are now completely removed instead of just being disabled + type: Remove + id: 5986 + time: '2024-02-21T06:23:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25372 +- author: Hanzdegloker + changes: + - message: Dept. Heads are now guaranteed to have their respective winter coats + in their dressers + type: Tweak + - message: Standardized the contents of Dept. Heads dressers and lockers + type: Tweak + id: 5987 + time: '2024-02-21T06:26:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25206 +- author: deltanedas changes: - - {message: Tacos can be eaten by Lizards now. It's fricken Taco Tuesday!, type: Fix} - id: 5236 - time: '2023-12-01T22:27:09.0000000+00:00' -- author: Rainbeon + - message: Added Conducting Gloves to the uplink, they make shocks much worse rather + than stop them. + type: Add + id: 5988 + time: '2024-02-21T06:34:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25227 +- author: veliebm + changes: + - message: The guidebook now contains a page for the Radioisotope Thermoelectric + Generator (RTG). + type: Add + id: 5989 + time: '2024-02-21T06:38:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25040 +- author: PoorMansDreams + changes: + - message: New pirate start sound! + type: Add + id: 5990 + time: '2024-02-21T06:39:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25153 +- author: takemysoult + changes: + - message: Changed uplink catalog - add syndicate hud to nukeops uplink + type: Tweak + id: 5991 + time: '2024-02-21T06:41:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25087 +- author: Sphiral + changes: + - message: Took the AdminPDA from the backpack and gave it it's own slot on aghosts! + Also aghosts can smoke/wear masks now! + type: Tweak + id: 5992 + time: '2024-02-21T06:41:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25402 +- author: EdenTheLiznerd + changes: + - message: Nettles are now weaker than their deathnettle counterparts + type: Tweak + id: 5993 + time: '2024-02-21T06:42:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25177 +- author: potato1234x + changes: + - message: Added spaceman's trumpets which come from mutated lilies and can be ground + up into Polypyrylium Oligomers which are is just slightly better bic. + type: Add + - message: Added lilies which are mutated from poppies and are used to create spaceman's + trumpets. + type: Add + id: 5994 + time: '2024-02-21T06:49:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25090 +- author: FungiFellow + changes: + - message: Death Acidifer Price 2->4 + type: Tweak + - message: Removed Acidifier from Syndie Uplink + type: Remove + id: 5995 + time: '2024-02-21T06:51:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25039 +- author: Aquif + changes: + - message: Admins can now disable the bwoink sound if they don't want to scare players. + type: Add + id: 5996 + time: '2024-02-21T06:52:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25008 +- author: Fildrance + changes: + - message: now cryo pod health analyzer updates atomatically! + type: Fix + id: 5997 + time: '2024-02-21T14:47:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25109 +- author: landwhale + changes: + - message: Drink jugs can no longer be used by chemistry in place of a beaker. + type: Fix + - message: Updated names of several drink jugs to differentiate them from chem-specific + variants. + type: Tweak + id: 5998 + time: '2024-02-21T23:26:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25450 +- author: Killerqu00 + changes: + - message: EVA helmets are now quick-equippable again + type: Fix + id: 5999 + time: '2024-02-21T23:41:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25448 +- author: genderGeometries + changes: + - message: Crops are now harvested with decimal amounts of nutriment, vitamin, etc. + type: Fix + id: 6000 + time: '2024-02-22T00:19:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25453 +- author: Whisper changes: - - {message: Cyborgs can now speak while in a Critical state., type: Tweak} - id: 5237 - time: '2023-12-02T00:25:20.0000000+00:00' + - message: Dragon ichor when eating restores the dragon's blood. + type: Add + - message: Increased Xenomorph and Dragon blood level to 650u. + type: Tweak + id: 6001 + time: '2024-02-22T02:54:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25442 +- author: Beck Thompson + changes: + - message: Radio jammer now uses 3 times less power. + type: Tweak + id: 6002 + time: '2024-02-22T07:32:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25432 - author: metalgearsloth changes: - - {message: Potentially fix audio filters., type: Fix} - id: 5238 - time: '2023-12-02T08:47:41.0000000+00:00' -- author: EEASAS + - message: Added handheld crew monitor back just for CMO. + type: Add + id: 6003 + time: '2024-02-22T11:00:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25439 +- author: DrMelon + changes: + - message: Fixed incorrect job-specific Uplink items being given on occasion. + type: Fix + id: 6004 + time: '2024-02-22T11:03:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/23179 +- author: liltenhead changes: - - {message: 'Mothroaches have been vaccinated to be weaker and slower. Also, they - are more valuable!', type: Tweak} - - {message: Mothroaches and rats cannot pull items anymore., type: Tweak} - id: 5239 - time: '2023-12-02T16:45:07.0000000+00:00' -- author: Moomoobeef + - message: Changed the syndicate assault borg to have a red flashlight. + type: Tweak + id: 6005 + time: '2024-02-22T11:15:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25465 +- author: lzk228 changes: - - {message: 'Added sodium polyacrylate, an industrial desiccant. You probably should - not consume this.', type: Add} - id: 5240 - time: '2023-12-02T16:58:34.0000000+00:00' -- author: Doru991 - changes: - - {message: Ambrosia Deus and Koibeans's chemical amounts have been reduced., type: Tweak} - - {message: Plant chemical mutations can no longer produce any reagent in the game., - type: Tweak} - id: 5241 - time: '2023-12-02T17:01:58.0000000+00:00' -- author: Cohnway - changes: - - {message: Remilia's sprite made larger and more detailed, type: Tweak} - id: 5242 - time: '2023-12-02T17:12:32.0000000+00:00' -- author: Minty642 + - message: Fix some items becomes bigger after turning in trash. + type: Fix + id: 6006 + time: '2024-02-22T11:28:03.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25461 +- author: ps3moira changes: - - {message: Ash can now be created by burning oil., type: Add} - id: 5243 - time: '2023-12-02T17:15:12.0000000+00:00' -- author: enumerate0 + - message: Added Large Wooden floors + type: Add + id: 6007 + time: '2024-02-22T11:59:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25462 +- author: Whisper changes: - - {message: 'Added sound effects for throwing/inserting into disposals, and when - missing a throw.', type: Add} - id: 5244 - time: '2023-12-02T17:19:32.0000000+00:00' -- author: deltanedas + - message: Fixed reagent slime ghost role description. + type: Fix + id: 6008 + time: '2024-02-22T12:18:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25466 +- author: lzk228 changes: - - {message: Fixed ninja calling in a dragon not actually spawning a dragon., type: Fix} - id: 5245 - time: '2023-12-02T20:41:36.0000000+00:00' -- author: EmoGarbage404 + - message: Galoshes are added to the Janidrobe. + type: Tweak + - message: Galoshes now make you slower. + type: Tweak + id: 6009 + time: '2024-02-23T01:05:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25484 +- author: PJB3005 changes: - - {message: Improvised explosive devices now have unreliable timers that can take - anywhere from 0 to 60 seconds to explode., type: Add} - id: 5246 - time: '2023-12-03T02:21:51.0000000+00:00' + - message: sorting of departments and jobs has been made consistent in various menus. + type: Tweak + id: 6010 + time: '2024-02-23T04:04:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25486 - author: liltenhead changes: - - {message: Replaced the Engivend's individual inflatables with the boxed version., - type: Tweak} - id: 5247 - time: '2023-12-03T03:54:00.0000000+00:00' -- author: Doru991 - changes: - - {message: Skeletons now regain more health when coming in contact with milk., - type: Tweak} - id: 5248 - time: '2023-12-04T02:32:05.0000000+00:00' -- author: joshepvodka + - message: Changed emergency welder's fuel count from 25 -> 50 + type: Tweak + id: 6011 + time: '2024-02-23T06:53:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25483 +- author: Vasilis changes: - - {message: CentCom officers now finally have a jumpsuit that matches the ever stylish - green hue of CentCom equipment., type: Tweak} - id: 5249 - time: '2023-12-04T02:32:45.0000000+00:00' -- author: EmoGarbage404 + - message: Fixed a bug where the centcom official/any job that is not supposed to + have a preference option appeared anyway. + type: Fix + id: 6012 + time: '2024-02-23T13:19:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25496 +- author: Erisfiregamer1 + changes: + - message: Fixed a typo when forcefeeding someone. + type: Fix + id: 6013 + time: '2024-02-24T01:45:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25512 +- author: Beck Thompson + changes: + - message: The Fire Extinguishers safety can now only be toggled when in range. + type: Fix + id: 6014 + time: '2024-02-25T02:29:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25534 +- author: ArchPigeon + changes: + - message: Removed the ability for command or any antag-safe role to be initial + infected in zombie mode + type: Remove + id: 6015 + time: '2024-02-25T02:40:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25529 +- author: PolterTzi + changes: + - message: Cargo ordering multiple crates in one order should work now. + type: Fix + id: 6016 + time: '2024-02-25T07:36:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25518 +- author: metalgearsloth changes: - - {message: Roller skates are slower and have less friction and acceleration., type: Tweak} - - {message: Speed boots give a much more pronounced speed boost. Research them today!, - type: Tweak} - id: 5250 - time: '2023-12-04T04:31:11.0000000+00:00' -- author: Slava0135 + - 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: Gas tanks now deal damage when thrown. Be sure to hold them when opening - valve... or not., type: Tweak} - id: 5251 - time: '2023-12-04T06:32:18.0000000+00:00' -- author: Chronophylos + - 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: Included missing damage type localization for armor examination., type: Fix} - id: 5252 - time: '2023-12-04T12:57:29.0000000+00:00' -- author: EmoGarbage404 + - 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: 'Storage now uses a grid-based system. You can drag around items in - your bag, left click to remove them, and use right click to rotate them while - dragging.', type: Add} - - {message: The storage window is now a fixed singleton above the hands. You can - make it moveable by toggling "Static storage UI" in the controls menu., type: Add} - id: 5253 - time: '2023-12-04T23:04:39.0000000+00:00' -- author: qwerltaz - changes: - - {message: 'When ghosting from a critical state, the ghost command now kills with - damage relative to current health instead of flat 200.', type: Fix} - id: 5254 - time: '2023-12-04T23:06:11.0000000+00:00' -- author: MACMAN2003 + - 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: Autolathes can now print the snazzy orange "sodium" and blue "exterior" - light tubes., type: Tweak} - id: 5255 - time: '2023-12-04T23:06:30.0000000+00:00' + - 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: The jaws of life can now fit inside of regular toolbelts., type: Fix} - id: 5256 - time: '2023-12-04T23:06:46.0000000+00:00' -- author: Repo + - message: You can now make LED light tubes and LED light bulbs at an autolathe. + type: Add + id: 6028 + time: '2024-02-26T22:58:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25616 +- author: botanySupremist + changes: + - message: Fixed a few small typos in ghost role information. + type: Fix + id: 6029 + time: '2024-02-26T22:58:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25613 +- author: Whisper changes: - - {message: Doors can close over conveyor belts., type: Fix} - id: 5257 - time: '2023-12-04T23:07:48.0000000+00:00' -- author: 27alaing + - message: Juice that makes you Weh can be found in; anomalies, Artifacts, random + puddles. + type: Add + id: 6030 + time: '2024-02-26T22:59:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25611 +- author: Hanzdegloker + changes: + - message: ERT medic PDA now has a health analyzer built in. + type: Tweak + id: 6031 + time: '2024-02-26T23:00:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25606 +- author: Ilya246 changes: - - {message: Pun Pun can become a revolutionary again, type: Tweak} - id: 5258 - time: '2023-12-04T23:09:36.0000000+00:00' -- author: Bhijn and Myr + - message: Macrobomb implant price reduced 20->13 TC. + type: Tweak + id: 6032 + time: '2024-02-26T23:04:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25585 +- author: QuietlyWhisper + changes: + - message: Handcuff and handcuff replacements are faster to escape. You can allow + your teammates to uncuff themselves! + type: Tweak + id: 6033 + time: '2024-02-26T23:05:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25601 +- author: PoorMansDreams + changes: + - message: New lobby art (of horror) + type: Add + id: 6034 + time: '2024-02-26T23:06:09.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25455 +- author: TheShuEd changes: - - {message: 'Speech bubbles now display the name of whatever or whoever spoke them! - The options menu has a setting to disable this outright, or add a background - to the name for the sake of accessibility, for anyone who would like those options.', - type: Add} - - {message: The bubbles associated with emotes and LOOC now display exactly what - the associated message prints in your chatbox., type: Tweak} - id: 5259 - time: '2023-12-04T23:10:49.0000000+00:00' -- author: brainfood1183 + - message: Carpets can now be printed at the uniform printer. + type: Add + - message: Carpets can be collected from the floor and buthered into fabric. + type: Add + - message: New white and cyan carpets. + type: Add + - message: Carpets can now be placed on wooden tables to get beautiful new tables + with tablecloths. + type: Add + id: 6035 + time: '2024-02-26T23:11:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25562 +- author: SlamBamActionman + changes: + - message: Added new noses for humans and dwarves. + type: Add + id: 6036 + time: '2024-02-26T23:15:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25557 +- author: MACMAN2003 changes: - - {message: Clowns can now craft the Banana Clown outfit., type: Add} - id: 5260 - time: '2023-12-04T23:12:02.0000000+00:00' -- author: enumerate0 + - message: Added a NanoTrasen balloon toy. + type: Add + id: 6037 + time: '2024-02-26T23:15:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25543 +- author: TheShuEd changes: - - {message: Fixed Christmas tree bounding box, type: Fix} - id: 5261 - time: '2023-12-05T06:20:54.0000000+00:00' -- author: JoeHammad + - message: Added a new T2 industrial technology "Space Scanning"! It includes a + mass scanner console board, a Borg GPS module, and a new handheld mass scanner. + type: Add + - message: GPS borg module now have handheld mass scanner. + type: Add + id: 6038 + time: '2024-02-26T23:19:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25526 +- author: Sphiral + changes: + - message: NT has finally perfected methods for infusing Plasma/Uranium into Glass! + Windoors now have such varients! And Uranium Slim Windows exist! + type: Add + id: 6039 + time: '2024-02-26T23:25:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25501 +- author: Whisper changes: - - {message: Paramedics are now available on barratry, type: Add} - id: 5262 - time: '2023-12-05T07:35:36.0000000+00:00' -- author: JoeHammad + - message: Bleed wounds will no longer heal so fast they do not need to be treated. + Please see the medical guidebook. + type: Tweak + - message: Decreased passive bleed wound clotting by 60% (now 0.33u per 3 seconds). + type: Tweak + - message: Decreased all bloodloss damage (as a result of bleeding) by 50%. + type: Tweak + - message: Health analyzers will report if your patient is bleeding. + type: Add + id: 6040 + time: '2024-02-26T23:26:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25434 +- author: Velcroboy changes: - - {message: Paramedics are now available on marathon, type: Add} - id: 5263 - time: '2023-12-05T07:36:58.0000000+00:00' -- author: Whisper + - message: Tweaked wallmounted objects can not be interacted with through thindows + or windoors. + type: Tweak + - message: Fixed NanoMed vendor not being accessible from all directions. + type: Fix + id: 6041 + time: '2024-02-26T23:28:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25451 +- author: Lank changes: - - {message: 'Chloral Hydrate sleep effect will start at 11 units, down from 16.', - type: Tweak} - id: 5264 - time: '2023-12-05T08:52:47.0000000+00:00' -- author: DangerRevolution - changes: - - {message: Added Emergency Nitrogen Tanks, type: Add} - - {message: Added Nitrogen Tanks to Emergency Closets, type: Add} - id: 5265 - time: '2023-12-05T09:41:39.0000000+00:00' -- author: Lazzi0706 - changes: - - {message: Added a new stomach for mice and "hunger thresholds" in mice's prototype, - type: Add} - - {message: Fixed inadequate hunger in mice, type: Fix} - id: 5266 - time: '2023-12-05T10:39:09.0000000+00:00' -- author: JoeHammad - changes: - - {message: Removed the spare paramedic clothes and EVA suit from the medidrobe, - type: Remove} - - {message: added medical doctor jumpsuits and skirts to the medidrobe, type: Add} - id: 5267 - time: '2023-12-05T10:39:54.0000000+00:00' -- author: ForestNoises - changes: - - {message: The rejuvenate command/verb resets all action cooldowns., type: Add} - id: 5268 - time: '2023-12-05T21:00:03.0000000+00:00' -- author: themias + - message: Diona can no longer split or reform to cure themselves of a zombie infection. + type: Fix + id: 6042 + time: '2024-02-26T23:31:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25404 +- author: Zadeon + changes: + - message: Added salt as a new type of ore that can be mined from asteroids. Salt + can be ground up for its base components. + type: Add + id: 6043 + time: '2024-02-26T23:34:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25324 +- author: juliangiebel + changes: + - message: The mass media consoles UI got overhauled + type: Tweak + - message: Added PDA notifications in chat for new news articles. They can be turned + off in the news reader program and are only visible to you. + type: Add + id: 6044 + time: '2024-02-27T01:38:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/19610 +- author: rosieposieeee + changes: + - message: Added lockable wall buttons and decorative frames for differentiating + wall buttons. + type: Add + id: 6045 + time: '2024-02-27T07:57:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25631 +- author: metalgearsloth changes: - - {message: Empty hot cocoa can go in trash bags, type: Fix} - id: 5269 - time: '2023-12-05T21:39:26.0000000+00:00' -- author: Bhijn and Myr + - message: Fix chat bubbles. + type: Fix + id: 6046 + time: '2024-02-27T13:01:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25643 +- author: rosieposieeee + changes: + - message: Added grey stalagmites and made all stalagmites weaker and more fun to + break. + type: Add + id: 6047 + time: '2024-02-27T19:24:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25646 +- author: metalgearsloth changes: - - {message: Ghosts now have speech bubbles again, type: Fix} - id: 5270 - time: '2023-12-05T21:40:03.0000000+00:00' -- author: tgrkzus + - message: Made NPC movement less janky. + type: Fix + id: 6048 + time: '2024-02-28T06:41:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25666 +- author: musicmanvr + changes: + - message: Added the Syndicate decoy bundle, a creative way to trick your foes. + type: Add + - message: Snap pops have been added to the toy crate. + type: Add + - message: Syndicate Commanders now have a trench whistle, Avanti! + type: Add + id: 6049 + time: '2024-02-28T21:53:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25333 +- author: Whisper changes: - - {message: Paper cups are now available at water coolers., type: Add} - id: 5271 - time: '2023-12-05T21:47:21.0000000+00:00' -- author: EmoGarbage404 + - message: Iron and copper no longer grant infinite blood! + type: Fix + id: 6050 + time: '2024-02-28T21:56:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25678 +- author: Cojoke-dot + changes: + - message: E-sword now lights plasma fires + type: Tweak + id: 6051 + time: '2024-02-28T21:59:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25665 +- author: lzk228 changes: - - {message: You can now make the storage window opaque with the "enable opaque storage - window" toggle in the graphics menu., type: Add} - id: 5272 - time: '2023-12-05T23:38:10.0000000+00:00' -- author: EmoGarbage404 + - message: Engineering structures orders in cargo now supplied via flatpacks (e.g. + tesla & singulo generators, other stuff for them). + type: Tweak + - message: Thrusters and gyroscopes now supplied in crates via flatpacks. + type: Tweak + id: 6052 + time: '2024-02-28T22:02:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25647 +- author: c4llv07e + changes: + - message: Cryo won't remove you from the new body if you chose a new ghost role + before cryo deleted your old body. + type: Fix + id: 6053 + time: '2024-02-28T22:09:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24991 +- author: Nairodian changes: - - {message: Reverted duffel bags to their original storage capacity., type: Fix} - id: 5273 - time: '2023-12-06T03:11:01.0000000+00:00' -- author: metalgearsloth + - message: You can now remove the rust from reinforced walls with a welder. + type: Fix + id: 6054 + time: '2024-02-29T00:44:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25690 +- author: Ubaser changes: - - {message: Predict helmet toggling., type: Fix} - id: 5274 - time: '2023-12-06T06:59:31.0000000+00:00' -- author: deltanedas + - message: Eris UI theme has been removed. + type: Remove + id: 6055 + time: '2024-02-29T05:53:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25673 +- author: Rainfey changes: - - {message: Fixed emagged medibots not injecting healthy people with chloral hydrate., - type: Fix} - id: 5275 - time: '2023-12-06T21:30:32.0000000+00:00' -- author: metalgearsloth + - message: Disallow multiple antag roles per player + type: Fix + id: 6056 + time: '2024-02-29T06:25:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/23445 +- author: Kukutis96513 + changes: + - message: Changed the amount of plushies in the lizard plushie crate. + type: Tweak + id: 6057 + time: '2024-02-29T16:45:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25122 +- author: Aexxie changes: - - {message: Fix toggleable clothing still being interactable e.g. hardsuit helmets., - type: Fix} - id: 5276 - time: '2023-12-06T21:56:03.0000000+00:00' -- author: deltanedas + - message: Nutribricks spawn in Survival Kits in place of Tinned Meat. + type: Tweak + - message: Lizards can now eat Nutribricks. + type: Fix + - message: Moths can eat Nutribrick wrappers. + type: Add + id: 6058 + time: '2024-02-29T21:39:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25659 +- author: Flareguy changes: - - {message: Combat boots and friends use a slot for sidearms instead of a storage - window., type: Tweak} - id: 5277 - time: '2023-12-06T21:58:25.0000000+00:00' -- author: Bhijn and Myr + - message: Big O2 tanks and N2 tanks no longer spawn in any departmental locker. + Use tank dispensers to get them instead. + type: Tweak + - message: Removed all instances where N2 tanks spawned as counterparts to O2 tanks. + This includes things like lockers, suit storages, and the emergency toolbox. + type: Remove + id: 6059 + time: '2024-02-29T21:40:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25660 +- author: Potato1234_x changes: - - {message: Speech bubbles for the living now again have names when fancy speech - bubbles are enabled, type: Fix} - id: 5278 - time: '2023-12-06T21:58:53.0000000+00:00' -- author: TemporalOroboros + - message: Added fill levels to bowls, chefs rejoice! + type: Add + id: 6060 + time: '2024-02-29T21:41:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25639 +- author: Plykiya + changes: + - message: Dragging objects over gas pipes no longer slows you down. + type: Fix + id: 6061 + time: '2024-02-29T21:41:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25629 +- author: TheShuEd changes: - - {message: Pickaxes have a more accurate shape in storage., type: Tweak} - id: 5279 - time: '2023-12-07T00:52:57.0000000+00:00' + - message: 9 new colourful curtains. Can be crafted from carpets. + type: Add + id: 6062 + time: '2024-02-29T22:25:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25684 - author: Nairodian changes: - - {message: 'Added a new lizard chest marking, an underbelly.', type: Add} - id: 5280 - time: '2023-12-07T01:05:43.0000000+00:00' -- author: Nimfar11 - changes: - - {message: 'Adds Space Cobras, invisible at rest and venom blind.', type: Add} - - {message: Adds snake meat and fancy snakeskin boots., type: Add} - - {message: The too weak space spider has been strengthened., type: Tweak} - id: 5281 - time: '2023-12-07T01:25:57.0000000+00:00' -- author: CrigCrag + - message: The smooth tail now has a second color layer to customize. + type: Tweak + id: 6063 + time: '2024-02-29T22:27:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25685 +- author: Hanzdegloker + changes: + - message: Commonly used decals should no longer washout the details of the tiles + below. + type: Tweak + id: 6064 + time: '2024-02-29T22:27:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25689 +- author: lzk228 changes: - - {message: Added three new specialized brute healing chemicals and a guidebook - entry on how to safely use them., type: Add} - - {message: 'Added Razorium, which is basically liquid razor blades.', type: Add} - id: 5282 - time: '2023-12-07T03:05:29.0000000+00:00' -- author: EmoGarbage404 + - message: Added recipe of handheld station map to autolathe. + type: Add + id: 6065 + time: '2024-02-29T22:34:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25719 +- author: MACMAN2003 changes: - - {message: 'Speed penalties for duffels and hardsuits now apply when held, not - just when worn.', type: Add} - id: 5283 - time: '2023-12-07T03:41:29.0000000+00:00' + - message: There are now more ways to craft reinforced plasma/uranium glass. + type: Tweak + id: 6066 + time: '2024-02-29T22:57:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/22804 - author: deltanedas changes: - - {message: Fixed explosion resistance being ignored., type: Fix} - id: 5284 - time: '2023-12-07T18:51:46.0000000+00:00' -- author: Aexxie + - message: Acidifiers and microbombs now require confirmation before gibbing you. + type: Tweak + id: 6067 + time: '2024-03-01T02:48:43.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24609 +- author: exincore + changes: + - message: Chameleon gear now only reveals its menu button to its wearer. + type: Tweak + id: 6068 + time: '2024-03-01T12:49:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25746 +- author: Nairodian changes: - - {message: Paramed no longer has external access., type: Remove} - id: 5285 - time: '2023-12-07T23:27:18.0000000+00:00' + - message: Fixed all command and security roles not having cryogenics access. + type: Fix + id: 6069 + time: '2024-03-01T21:21:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25752 +- author: IlyaElDunaev + changes: + - message: Added detective's rubber stamp. + type: Add + id: 6070 + time: '2024-03-01T22:50:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25676 +- author: rosieposieeee + changes: + - message: Added additional signage to help the crew navigate. + type: Add + id: 6071 + time: '2024-03-02T06:42:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25766 - author: EmoGarbage404 changes: - - {message: Hovering over an item in storage now shows a tooltip with the name., - type: Add} - id: 5286 - time: '2023-12-08T02:38:07.0000000+00:00' -- author: Nimfar11 + - message: Space heaters machine boards are now printable round start and can additionally + be ordered by cargo. + type: Tweak + id: 6072 + time: '2024-03-02T06:43:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25735 +- author: Krunk + changes: + - message: Picking up and dumping trash is less arduous for tiny, plentiful items, + such as bullets. + type: Tweak + id: 6073 + time: '2024-03-02T13:57:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24899 +- author: Errant + changes: + - message: Breathing tritium or plasma now displays a HUD alert. + type: Add + id: 6074 + time: '2024-03-02T14:07:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24484 +- author: waylon531 changes: - - {message: Adds a bed for the psychologist's office., type: Add} - id: 5287 - time: '2023-12-08T05:24:35.0000000+00:00' + - message: Nutribrick and MRE wrappers can now be put in trash bags + type: Tweak + id: 6075 + time: '2024-03-02T14:23:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25760 +- author: Fildrance + changes: + - message: fixed lobby music restarting after volume change in options. Lobby music + is also not being looped by default - all lobby songs will play in shuffle mode. + type: Fix + id: 6076 + time: '2024-03-02T20:40:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25530 +- author: exincore + changes: + - message: Inventories now show a secondary smart-equip star. + type: Add + id: 6077 + time: '2024-03-02T23:57:42.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25696 - author: Emisse changes: - - {message: Chemical explosions are powerful again., type: Tweak} - id: 5288 - time: '2023-12-08T10:58:25.0000000+00:00' + - message: Rev's reenabled + type: Tweak + id: 6078 + time: '2024-03-03T00:30:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25704 - author: EmoGarbage404 changes: - - {message: 'V and shift-V can now be used to open the bag and belt, respectively.', - type: Add} - - {message: Interacting with a storage item now has context-sensitive logic based - on whether or not the window is open or focused., type: Fix} - id: 5289 - time: '2023-12-08T18:43:37.0000000+00:00' -- author: EmoGarbage404 + - message: Fixed issues where using the Quantum Spin Inverted would bug out the + character's physics. + type: Fix + id: 6079 + time: '2024-03-03T06:45:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25700 +- author: deltanedas + changes: + - message: No more raiding the jani vend for galoshes, which are back to normal + speed. + type: Remove + id: 6080 + time: '2024-03-03T07:07:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25795 +- author: metalgearsloth + changes: + - message: 'Reworked shuttle consoles, including: manual FTL jumps, new map screen, + fixed performance issues, new docking screen.' + type: Tweak + id: 6081 + time: '2024-03-03T07:39:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24430 +- author: Errant-4 + changes: + - message: Toggling your own internals no longer requires a delay. + type: Tweak + id: 6082 + time: '2024-03-03T08:31:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25781 +- author: SlamBamActionman + changes: + - message: Arachnids are no longer perma-pied and can clean it off. + type: Fix + id: 6083 + time: '2024-03-03T08:54:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25713 +- author: Dutch-VanDerLinde + changes: + - message: Monkeys and kobolds can now wear blood-red hardsuits. + type: Add + id: 6084 + time: '2024-03-04T03:56:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/22273 +- author: Plykiya + changes: + - message: Syringes now prevent injecting on empty and drawing on full. + type: Tweak + - message: You can now tell if you are being drawn from or injected by a syringe. + type: Tweak + id: 6085 + time: '2024-03-04T05:07:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25480 +- author: metalgearsloth + changes: + - message: Fix expedition FTL. + type: Fix + id: 6086 + time: '2024-03-04T06:24:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25823 +- author: Nairodian + changes: + - message: Welding masks can now be made in the Autolathe. + type: Add + id: 6087 + time: '2024-03-04T22:36:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25842 +- author: Lawdog + changes: + - message: Changed the max volume of shot glasses from 7u to 5u to better represent + drinking shots in real life + type: Tweak + id: 6088 + time: '2024-03-04T23:51:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25847 +- author: deltanedas changes: - - {message: 'When viewing a storage container, the item that will be removed via - smart-equip is now marked with a small star icon.', type: Add} - id: 5290 - time: '2023-12-08T18:43:58.0000000+00:00' + - message: Rehydrated mobs (carp) now keep their forensics data from their cube/plushie + form. + type: Tweak + id: 6089 + time: '2024-03-05T03:13:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25148 +- author: Brandon-Huu + changes: + - message: Removed the ability for command or any antag-safe role to be initial + infected in zombie mode + type: Remove + id: 6090 + time: '2024-03-05T04:34:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25785 - author: Whisper changes: - - {message: Rat king and his servants properly heal from miasma., type: Fix} - - {message: Rat king no longer rummages from an infinite distance., type: Fix} - - {message: Rat king generates more miasma to fill larger rooms., type: Tweak} - id: 5291 - time: '2023-12-08T18:46:28.0000000+00:00' -- author: Emisse + - message: Glass shards can be added to flatcaps to create bladed flatcaps! + type: Add + id: 6091 + time: '2024-03-05T20:57:55.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25780 +- author: MACMAN2003 changes: - - {message: Command staff has brig access., type: Tweak} - id: 5292 - time: '2023-12-08T18:50:07.0000000+00:00' -- author: EmoGarbage404 + - message: Added clockwork structures and brass to build them with. + type: Add + id: 6092 + time: '2024-03-06T00:25:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24673 +- author: deepdarkdepths + changes: + - message: Added the paramedic's cap to the uniform printer. + type: Add + id: 6093 + time: '2024-03-06T01:17:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25861 +- author: lzk228 changes: - - {message: Removed upgrades from the anomaly vessel., type: Remove} - - {message: 'Added the experimental anomaly vessel, which researches twice as fast - at the cost of being radioactive.', type: Add} - id: 5293 - time: '2023-12-08T18:50:41.0000000+00:00' + - message: Livestock crate and artifact container now can go under plastic flaps. + type: Tweak + id: 6094 + time: '2024-03-06T01:33:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25862 - author: PJB3005 changes: - - {message: Opening the chat channel selector works again., type: Fix} - id: 5294 - time: '2023-12-09T02:15:07.0000000+00:00' -- author: JoeHammad + - message: Saving paper is on ctrl+enter again. Also there's a visible "save" button + now. + type: Tweak + id: 6095 + time: '2024-03-06T01:35:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25870 +- author: ps3moira changes: - - {message: Some knives now deal some damage when thrown, type: Add} - id: 5295 - time: '2023-12-09T02:16:31.0000000+00:00' -- author: metalgearsloth + - message: Changed brick, wood, and web walls to be unable to conjoin with different + walls. + type: Tweak + id: 6096 + time: '2024-03-06T01:36:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25674 +- author: Froffy + changes: + - message: Water can now be scooped from water tiles, such as planetary rivers. + type: Add + id: 6097 + time: '2024-03-06T01:37:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25825 +- author: Ko4erga + changes: + - message: '"Post light" updated.' + type: Tweak + id: 6098 + time: '2024-03-06T01:39:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25814 +- author: Ilya246 changes: - - {message: Fixed a bug where the audio slider can get saved at 50% audio with no - sound. Unfortunately this means your audio sliders will reset., type: Fix} - - {message: Fix crash on options menu while game sim not running., type: Fix} - id: 5296 - time: '2023-12-09T03:03:08.0000000+00:00' -- author: EmoGarbage404 + - message: Gas leak events are now 4 times as strong, and may leak water vapor. + The fog is coming. + type: Tweak + id: 6099 + time: '2024-03-06T01:41:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25864 +- author: Just_Art + changes: + - message: Added bob 5 hair! + type: Add + - message: Added long hair with bundles! + type: Add + id: 6100 + time: '2024-03-06T01:42:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25772 +- author: Errant changes: - - {message: Radiation now works again., type: Fix} - id: 5297 - time: '2023-12-09T04:10:01.0000000+00:00' + - message: Debug coordinates are now automatically enabled on the F3 overlay upon + readmin. + type: Fix + id: 6101 + time: '2024-03-06T01:43:51.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25063 - author: metalgearsloth changes: - - {message: Reduced MIDI audio range so it's easier to reduce the volume to a comfortable - level., type: Tweak} - id: 5298 - time: '2023-12-09T04:18:15.0000000+00:00' -- author: nok-ko - changes: - - {message: 'Entities without hands (like mice and mothroaches) are now forbidden - from operating Syndicate Bombs, C4, and other timed explosives.', type: Fix} - id: 5299 - time: '2023-12-10T03:13:00.0000000+00:00' -- author: chromiumboy - changes: - - {message: Updated the crew monitoring console user interface, type: Tweak} - id: 5300 - time: '2023-12-10T05:38:51.0000000+00:00' -- author: ElectroJr + - message: Pod launches will now be offset slightly. + type: Add + id: 6102 + time: '2024-03-06T01:44:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25855 +- author: Brandon-Huu + changes: + - message: The Syndicate is now supplying barber scissors in the Hristov bundle + to make your disguises even balde- better. + type: Tweak + id: 6103 + time: '2024-03-06T02:03:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25695 +- author: Tayrtahn + changes: + - message: Flasks can once again be put into dispensers. + type: Fix + id: 6104 + time: '2024-03-06T17:19:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25883 +- author: Doctor-Cpu + changes: + - message: Cargo palllets can no longer be ordered from cargo request terminal + type: Remove + id: 6105 + time: '2024-03-07T17:53:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25882 +- author: Beck Thompson + changes: + - message: Lawdrobe has some new items and new ads! + type: Add + id: 6106 + time: '2024-03-07T19:18:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25299 +- author: Blackern5000 + changes: + - message: Salvagers can now pull in overgrown floral anomalies. + type: Add + id: 6107 + time: '2024-03-07T19:37:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24650 +- author: Nimfar11 changes: - - {message: 'Add color picker to color selection, e.g. for character colors.', type: Add} - - {message: Fix drag-drop interaction outline not updating properly., type: Fix} - id: 5301 - time: '2023-12-10T10:43:06.0000000+00:00' -- author: metalgearsloth + - message: Slimes can now drink FourteenLoko without harming their bodies. + type: Tweak + id: 6108 + time: '2024-03-07T20:50:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25889 +- author: NakataRin + changes: + - message: Evacuation shuttle arrives 10 minutes on green alert now. + type: Tweak + id: 6109 + time: '2024-03-07T21:01:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25906 +- author: Admiral-Obvious-001 + changes: + - message: Zombies are now tougher to kill. + type: Tweak + id: 6110 + time: '2024-03-07T21:02:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25876 +- author: TheShuEd changes: - - {message: Removed gas tank throwing damage., type: Remove} - id: 5302 - time: '2023-12-10T14:11:26.0000000+00:00' -- author: Nairodian + - message: Removed Hamlet, Smile and Pun Pun from Thief objectives + type: Remove + id: 6111 + time: '2024-03-07T23:53:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25921 +- author: MACMAN2003 changes: - - {message: Adjusted welder blindness to be much less forgiving., type: Tweak} - id: 5303 - time: '2023-12-10T23:10:07.0000000+00:00' -- author: KittenColony - changes: - - {message: Added various gauze wraps to most species in the form of markings, type: Add} - id: 5304 - time: '2023-12-10T23:16:38.0000000+00:00' -- author: Simyon - changes: - - {message: Moths that are turned into zombies will now prefer cloth instead of - brains., type: Tweak} - id: 5305 - time: '2023-12-11T03:17:55.0000000+00:00' -- author: TheKilk - changes: - - {message: Added 7 new winter boots textures!, type: Add} - id: 5306 - time: '2023-12-11T03:19:28.0000000+00:00' -- author: Sirionaut - changes: - - {message: 'Animals now require a more reasonable amount of satiation before producing - eggs, milk, or wool (unless they are undead)', type: Fix} - id: 5307 - time: '2023-12-11T03:20:41.0000000+00:00' -- author: notafet + - message: Diagonal windows no longer space you when in a pressurized environment. + type: Fix + id: 6112 + time: '2024-03-08T07:50:34.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25926 +- author: mryikes + changes: + - message: New Nuke Detonation Song "Clearly Nuclear". + type: Add + id: 6113 + time: '2024-03-09T01:44:54.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25765 +- author: Plykiya + changes: + - message: Pre-filled syringes start in inject mode now. + type: Tweak + id: 6114 + time: '2024-03-09T10:19:03.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25881 +- author: EmoGarbage404 changes: - - {message: Pipes now leak their contents when destroyed. Make sure to drain pipes - before removing them., type: Tweak} - id: 5308 - time: '2023-12-11T07:51:45.0000000+00:00' -- author: Ubaser + - message: Added a new "colorblind friendly" toggle in the accessibility menu. This + allows you to toggle between a standard and colorblind-friendly palette for + things like progress bars and the medical HUD. + type: Add + - message: The medical HUD is now bright, even in low light levels. + type: Tweak + id: 6115 + time: '2024-03-09T11:43:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25318 +- author: metalgearsloth changes: - - {message: Janitors can now buy their own bomb suit for cleaning chemical spills., - type: Add} - id: 5309 - time: '2023-12-11T08:41:54.0000000+00:00' -- author: nok-ko + - message: Fix NPC mouse movement. + type: Fix + id: 6116 + time: '2024-03-10T15:41:42.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25965 +- author: DoutorWhite + changes: + - message: Prevents rendering from crashing in certain scenarios + type: Fix + id: 6117 + time: '2024-03-10T17:07:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25960 +- author: nikthechampiongr changes: - - {message: "Fixed taking damage mid-sentence not activating \u201Cglorfcode\u201D", - type: Fix} - id: 5310 - time: '2023-12-11T08:53:10.0000000+00:00' -- author: Ubaser + - message: Shields will no longer absorb asphyxiation damage, or any other damage + they themselves can't take. + type: Fix + id: 6118 + time: '2024-03-11T01:55:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25972 +- author: metalgearsloth changes: - - {message: Added two eye scar markings for humans and dwarves., type: Add} - id: 5311 - time: '2023-12-11T09:18:20.0000000+00:00' -- author: Whisper + - message: Remove the buttons for generated debris from shuttle maps. + type: Tweak + id: 6119 + time: '2024-03-11T02:11:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25897 +- author: Errant changes: - - {message: Added black gloves to the clothesmate, type: Add} - id: 5312 - time: '2023-12-11T09:23:51.0000000+00:00' -- author: mirrorcult + - message: Species info is now available in the Guidebook and in the character editor. + type: Add + id: 6120 + time: '2024-03-11T03:01:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25844 +- author: Dygon + changes: + - message: 'The following criminal record statuses have been added: Suspect, Discharged, + Paroled.' + type: Add + - message: Security huds now show an icon on entities that have a visible name linked + to a criminal record. + type: Add + id: 6121 + time: '2024-03-11T03:12:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25192 +- author: Lank changes: - - {message: Emergency lights no longer make sound, type: Remove} - - {message: Emergency light radius and energy is now much lower, type: Tweak} - id: 5313 - time: '2023-12-11T09:24:10.0000000+00:00' -- author: Ubaser and Pigeonpeas + - message: The detective is no longer independent, and again works under Security. + type: Tweak + id: 6122 + time: '2024-03-11T03:33:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25986 +- author: pigeonpeas changes: - - {message: The kobold ear marking has received a new sprite., type: Tweak} - id: 5314 - time: '2023-12-11T09:25:55.0000000+00:00' -- author: Rainfey + - message: added new expedition ambience + type: Add + id: 6123 + time: '2024-03-11T06:56:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25983 +- author: Ilya246 changes: - - {message: Hardsuit helmets added to chameleon menu, type: Add} - id: 5315 - time: '2023-12-11T09:27:36.0000000+00:00' -- author: Flareguy + - message: The biomass reclaimer may now reclaim plants, and inserting smaller entities + into it is now faster. + type: Tweak + id: 6124 + time: '2024-03-11T21:59:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/23731 +- author: SlamBamActionman + changes: + - message: Moths eating lizard plushies will now start to Weh! + type: Tweak + id: 6125 + time: '2024-03-11T23:05:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26003 +- author: Ubaser changes: - - {message: 'Added 4 new HUD themes: Plasmafire, Slimecore, Clockwork, and Retro.', - type: Add} - - {message: The default HUD theme is now Classic. The old default HUD theme still - exists under the name "Minimalist.", type: Tweak} - - {message: The modernized HUD theme has been renamed to "Eris.", type: Tweak} - id: 5316 - time: '2023-12-11T09:28:17.0000000+00:00' -- author: metalgearsloth + - message: Unpressurized areas now deal heat damage along with blunt. + type: Tweak + id: 6126 + time: '2024-03-12T02:38:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25770 +- author: nikthechampiongr changes: - - {message: Arrivals is now stationed on a planet., type: Add} - id: 5317 - time: '2023-12-11T09:34:19.0000000+00:00' -- author: Whisper + - message: Recyclers now leave logs when they gib people. + type: Add + - message: People sending a broadcast in the communications console now leave logs. + type: Add + id: 6127 + time: '2024-03-12T10:57:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26008 +- author: ShadowCommander changes: - - {message: Added cosmetic sunglasses to the clothesmate., type: Add} - - {message: Musician and Bartender now have cosmetic sunglasses., type: Tweak} - id: 5318 - time: '2023-12-11T09:35:51.0000000+00:00' -- author: deltanedas + - message: Fixed arrivals shuttle not docking with the station when it was slowly + spinning. + type: Fix + id: 6128 + time: '2024-03-12T12:57:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26033 +- author: liltenhead changes: - - {message: 'Syndicate duffel bags heavily protect their items from explosions, - and regular bags have minor protection.', type: Tweak} - id: 5319 - time: '2023-12-11T09:43:00.0000000+00:00' -- author: metalgearsloth + - message: Buffed the zombie virus to do purely poison damage, and more likely to + spread the infection per bite. + type: Tweak + id: 6129 + time: '2024-03-12T18:44:09.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25954 +- author: UnicornOnLSD + changes: + - message: brought back the classic crew cut as an alternative to the current one + ! + type: Add + id: 6130 + time: '2024-03-12T18:47:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25935 +- author: FungiFellow + changes: + - message: Added Improvised Shotgun Shell Recipe + type: Add + id: 6131 + time: '2024-03-12T23:52:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25545 +- author: NakataRin + changes: + - message: Skeletons can only spawn with 10 people on the server now. + type: Tweak + id: 6132 + time: '2024-03-13T01:00:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26050 +- author: SlamBamActionman + changes: + - message: Syndicate implanters can no longer be recycled. + type: Tweak + id: 6133 + time: '2024-03-13T02:02:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26047 +- author: Gyrandola + changes: + - message: Adding Sky Blue carpets to tables no longer results in red carpet ones. + type: Fix + id: 6134 + time: '2024-03-13T02:03:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26049 +- author: Gyrandola + changes: + - message: Clicking yourself with a knife no longer triggers a butchering popup + type: Fix + id: 6135 + time: '2024-03-13T03:52:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26051 +- author: maylokana + changes: + - message: Italicized whisper bubbles + type: Tweak + id: 6136 + time: '2024-03-13T08:03:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25602 +- author: Slava0135 changes: - - {message: Fix game audio persisting to lobby., type: Fix} - id: 5320 - time: '2023-12-11T10:26:56.0000000+00:00' -- author: Whisper + - message: Fixed pie bomb not detonating when eaten or sliced (remember to keep + hungry mice away from it)! + type: Fix + - message: Pie bomb now cannot be ejected or swapped (just hope there is no bomb + inside) + type: Tweak + id: 6137 + time: '2024-03-13T08:36:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25928 +- author: Cojoke-dot + changes: + - message: Senior uniforms have been added to the Uniform Printer, visit your local + hop today! + type: Add + id: 6138 + time: '2024-03-13T08:45:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25668 +- author: Plykiya + changes: + - message: Additional syringe doafter delay is now based on syringe contents rather + than transfer amount setting. + type: Tweak + id: 6139 + time: '2024-03-13T09:35:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25890 +- author: SlamBamActionman + changes: + - message: Renamed Uplink categories and moved items to fit new category names. + type: Tweak + id: 6140 + time: '2024-03-13T09:47:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25079 +- author: veprolet + changes: + - message: Injectors like the syringe can now toggle their transfer amount using + alternative interactions. + type: Tweak + id: 6141 + time: '2024-03-13T10:00:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25566 +- author: Dutch-VanDerLinde + changes: + - message: Zombies can now wideswing, similar to how a space carp would. + type: Tweak + id: 6142 + time: '2024-03-13T10:02:11.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26064 +- author: Krunk + changes: + - message: Clown & Jester shoes can now hold plastic knives and cap guns! All clowning, + all the time! + type: Add + id: 6143 + time: '2024-03-13T10:03:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25661 +- author: 778b + changes: + - message: Guns which use battery as magazines now display ammo. Like Svalinn pistol. + type: Fix + id: 6144 + time: '2024-03-13T11:13:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26009 +- author: icekot8 + changes: + - message: Foxes are now neutral and deal 8 piercing damage + type: Tweak + id: 6145 + time: '2024-03-13T15:02:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25992 +- author: Mangohydra + changes: + - message: The lawyer now spawns with their own lawyer stamp for stamping very important + documents. + type: Add + id: 6146 + time: '2024-03-13T15:05:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26012 +- author: Errant changes: - - {message: Beer goggles can now scan solutions., type: Add} - id: 5321 - time: '2023-12-11T11:35:11.0000000+00:00' -- author: MACMAN2003 + - message: Clothes with alternate sprites for vox once again show the alternate + sprites, instead of the defaults. + type: Fix + id: 6147 + time: '2024-03-13T15:06:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25989 +- author: Gyrandola + changes: + - message: Fireaxe and Shotgun cabinets can now be destroyed. + type: Add + id: 6148 + time: '2024-03-13T15:09:06.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25962 +- author: lzk228 changes: - - {message: Added yellow tinted jensen glasses that may show up in maints from time - to time, type: Add} - id: 5322 - time: '2023-12-11T11:36:19.0000000+00:00' -- author: ninruB + - message: Surgery tools can be placed in medical belt. + type: Tweak + - message: Lantern can be placed in utility belt. + type: Tweak + - message: Hand labeler can be placed in utility and botanical belt + type: Tweak + id: 6149 + time: '2024-03-13T18:55:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26085 +- author: wafehling + changes: + - message: The trading outpost now has dedicated buy-only and sell-only pallets. + No more accidentally selling orders you just bought. Cargonians rejoice! + type: Tweak + id: 6150 + time: '2024-03-13T23:26:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25955 +- author: maylokana + changes: + - message: Entities can no longer drink from closed containers + type: Fix + id: 6151 + time: '2024-03-14T04:10:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26103 +- author: Dutch-VanDerLinde + changes: + - message: Gunpowder can now be made by chemists with 6 parts potassium, 2 parts + sulfur and charcoal. + type: Add + - message: Pipebombs may now be crafted with a pipe, gunpowder and LV cable. + type: Add + - message: IEDs have been reworked, they are now called "fire bombs" and generate + a weak explosion that ignites nearby objects. + type: Tweak + id: 6152 + time: '2024-03-14T04:27:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25705 +- author: PJB3005 changes: - - {message: Familiar Garbs may now appear as maintenance loot., type: Add} - id: 5324 - time: '2023-12-11T13:04:56.0000000+00:00' -- author: Errant + - message: You must now wait 30 seconds before attempting to reconnect to a full + server. + type: Tweak + id: 6153 + time: '2024-03-14T08:00:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/20972 +- author: Crotalus + changes: + - message: Sort agents by success rate in end game summary + type: Tweak + id: 6154 + time: '2024-03-14T15:52:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26058 +- author: nikthechampiongr changes: - - {message: Incapacitated mobs can no longer be shoved for a speed boost., type: Fix} - id: 5325 - time: '2023-12-11T13:05:14.0000000+00:00' -- author: willicassi + - message: The radio jammer is now able to jam the signal of suit sensors. + type: Tweak + id: 6155 + time: '2024-03-14T15:55:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26046 +- author: deltanedas changes: - - {message: Added info to botany guidebook entry, type: Add} - id: 5326 - time: '2023-12-11T17:42:22.0000000+00:00' -- author: EmoGarbage404 + - message: Holocarp and Magicarp plushies can now be found in maintenance. + type: Add + id: 6156 + time: '2024-03-15T02:58:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26081 +- author: TheShuEd changes: - - {message: 'Removed the Handheld Electrical Propulsion technology and its associated - item, tasers, from research.', type: Remove} - id: 5327 - time: '2023-12-11T22:33:29.0000000+00:00' -- author: EmoGarbage404 + - message: Added random colored jumpsuits to the mixed wardrobes. Each costume is + randomly generated from parts painted in random colors, which gives a huge number + of combinations of the appearance of such costumes. + type: Add + id: 6157 + time: '2024-03-15T07:37:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25888 +- author: Nopey + changes: + - message: Dead players can no longer spin on a bar stool. + type: Fix + id: 6158 + time: '2024-03-15T10:03:19.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24308 +- author: Nairodian changes: - - {message: Added the artifact crusher to research! Crush things today!, type: Add} - id: 5328 - time: '2023-12-11T23:15:47.0000000+00:00' -- author: notafet + - message: Added a new red neck gaiter to the AutoDrobe. + type: Add + id: 6159 + time: '2024-03-15T10:11:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25891 +- author: Tayrtahn + changes: + - message: Reflected tranquilizer rounds no longer inject the character who reflected + them. + type: Fix + id: 6160 + time: '2024-03-15T13:57:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26141 +- author: lzk228 changes: - - {message: Stations no longer produce limitless plasma. Plasma refills can now - be ordered at cargo., type: Tweak} - id: 5329 - time: '2023-12-11T23:21:25.0000000+00:00' -- author: nok-ko + - message: Refill light replacer from box popup now shows properly. + type: Fix + id: 6161 + time: '2024-03-15T15:23:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26136 +- author: FairlySadPanda + changes: + - message: Food and drink stocks in vending machines has been reduced to encourage + people to use the kitchen and bar. + type: Tweak + id: 6162 + time: '2024-03-15T23:28:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25999 +- author: Plykiya + changes: + - message: Ion storms now have a chance of happening from the start of shift. + type: Tweak + id: 6163 + time: '2024-03-16T03:47:14.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26165 +- author: Krunk + changes: + - message: Zombies and animals can be stripped once again. + type: Fix + - message: Dead or critical mobs can no longer be stripped instantly. + type: Fix + id: 6164 + time: '2024-03-16T03:50:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26166 +- author: metalgearsloth changes: - - {message: 'Pacified players can no longer throw dangerous objects such as spears, - bolas, and bottles.', type: Tweak} - id: 5330 - time: '2023-12-11T23:40:23.0000000+00:00' -- author: notafet + - message: Fix store refunds. + type: Fix + id: 6165 + time: '2024-03-16T14:06:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26173 +- author: LordCarve + changes: + - message: Decayed anomalies no longer show as having gone supercritical in logs. + type: Fix + id: 6166 + time: '2024-03-16T17:31:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26180 +- author: Velcroboy changes: - - {message: 'Pumps, vents, scrubbers, and heaters now work faster.', type: Tweak} - id: 5331 - time: '2023-12-11T23:59:47.0000000+00:00' -- author: EmoGarbage404 + - message: Tweaked gas canisters to pass through cargo flaps. + type: Tweak + id: 6167 + time: '2024-03-17T00:55:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26193 +- author: metalgearsloth changes: - - {message: 'Removed Senior Researcher, Senior Engineer, Senior Physician, and Senior - Officer.', type: Remove} - id: 5332 - time: '2023-12-12T02:37:06.0000000+00:00' -- author: Avalon - changes: - - {message: CentCom has begun unceremoniously plucking Mothroaches out of Maintenance - and selling them to nearby Space Stations after the discovery that they make - decent pets., type: Add} - id: 5333 - time: '2023-12-12T04:46:41.0000000+00:00' -- author: notafet + - message: Fix ID cards sometimes not loading properly. + type: Fix + id: 6168 + time: '2024-03-17T01:10:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26195 +- author: 21Melkuu + changes: + - message: Add new explosion-proof backpack in aplink. + type: Add + id: 6169 + time: '2024-03-17T02:21:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26187 +- author: Ilya246 changes: - - {message: Tritium and frezon can once again be sold for profit., type: Tweak} - id: 5334 - time: '2023-12-12T07:48:34.0000000+00:00' -- author: IProduceWidgets + - message: Syndicate decoy bombs may now be purchased from the uplink. + type: Add + - message: Syndicate bomb description no longer lies about their minimum detonation + time. + type: Fix + id: 6170 + time: '2024-03-17T02:31:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26034 +- author: wafehling + changes: + - message: Added 18 new bounties to cargo bounty system. + type: Add + id: 6171 + time: '2024-03-17T17:06:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26160 +- author: Ko4erga + changes: + - message: Added craftable high and small wooden fences, bench. New stairs. + type: Add + id: 6172 + time: '2024-03-17T21:18:59.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26182 +- author: potato1234_x + changes: + - message: Changed the puddle sprites so the smoothing is less jagged + type: Tweak + id: 6173 + time: '2024-03-17T23:15:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26171 +- author: FungiFellow + changes: + - message: Changed Monkey Reinf Price to 6TC + type: Tweak + id: 6174 + time: '2024-03-18T01:25:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26214 +- author: Golinth + changes: + - message: Criminal record icons now show up below job icons + type: Tweak + id: 6175 + time: '2024-03-18T01:37:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26203 +- author: PJB3005 changes: - - {message: Mayo Jar is bigger (50u), type: Tweak} - id: 5335 - time: '2023-12-12T07:48:52.0000000+00:00' -- author: EmoGarbage404 + - message: Fixed pressure damage calculations to what they were always supposed + to be. This means pressure damage now starts happening at more extreme values + (20 kPa for low pressure damage instead of 50 kPa) and high pressure damage + is scaled different. It also fixed the HUD alerts so that the "warning" alerts + show up before you actually start taking damage. + type: Fix + - message: Air alarms now start complaining about low pressure much earlier, when + the pressure drops so much that you can't breathe oxygen tank. + type: Tweak + id: 6176 + time: '2024-03-18T05:16:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26217 +- author: HappyRoach + changes: + - message: The correct magazines now appear in the WT550 safe. + type: Fix + id: 6177 + time: '2024-03-18T06:10:28.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26208 +- author: vanx + changes: + - message: You can now wear most guns in the suit slot, and see them on yourself! + type: Tweak + id: 6178 + time: '2024-03-18T06:16:09.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26152 +- author: Dutch-VanDerLinde + changes: + - message: Romerol now properly works on the dead. + type: Tweak + id: 6179 + time: '2024-03-18T06:25:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26222 +- author: ElectroJr changes: - - {message: Fixed the quick-remove star in the inventory sometimes not appearing., - type: Fix} - - {message: You can drag items out of the inventory window to drop them on the ground., - type: Add} - id: 5336 - time: '2023-12-12T07:49:37.0000000+00:00' -- author: IProduceWidgets - changes: - - {message: 'Pill canisters are slightly better than cig packs, go talk to the chemists.', - type: Tweak} - id: 5337 - time: '2023-12-12T07:51:38.0000000+00:00' -- author: IProduceWidgets - changes: - - {message: Sec belt holds sidearms and sidearm ammo., type: Tweak} - id: 5338 - time: '2023-12-12T07:52:26.0000000+00:00' -- author: IProduceWidgets - changes: - - {message: The syndie holster now holds the guns you always wanted it to., type: Tweak} - id: 5339 - time: '2023-12-12T07:53:00.0000000+00:00' -- author: IProduceWidgets - changes: - - {message: Jar now fills., type: Tweak} - id: 5340 - time: '2023-12-12T07:54:15.0000000+00:00' -- author: IProduceWidgets - changes: - - {message: Cig Cartons are slightly smaller., type: Tweak} - id: 5341 - time: '2023-12-12T07:55:56.0000000+00:00' -- author: IProduceWidgets - changes: - - {message: Cigar cases can now hold Small items., type: Tweak} - id: 5342 - time: '2023-12-12T07:56:19.0000000+00:00' -- author: IProduceWidgets - changes: - - {message: Pipes now have slightly bigger bowls! (30u), type: Tweak} - id: 5343 - time: '2023-12-12T07:56:44.0000000+00:00' -- author: IProduceWidgets - changes: - - {message: Long guns are now actually long., type: Tweak} - id: 5344 - time: '2023-12-12T07:59:43.0000000+00:00' -- author: IProduceWidgets - changes: - - {message: syndicate pens now come in suitably sized discarding boxes., type: Tweak} - id: 5345 - time: '2023-12-12T08:01:33.0000000+00:00' -- author: IProduceWidgets - changes: - - {message: Mops are now larger!, type: Tweak} - - {message: Defibs are now larger!, type: Tweak} - id: 5346 - time: '2023-12-12T08:02:44.0000000+00:00' -- author: metalgearsloth + - message: Added an option to try and ignore some errors if a replay fails to load, + type: Add + id: 6180 + time: '2024-03-18T07:31:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26212 +- author: Tayrtahn + changes: + - message: Cyborg recharging stations are able to charge cyborgs again. + type: Fix + id: 6181 + time: '2024-03-18T13:37:49.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26230 +- author: DoutorWhite + changes: + - message: Introduce new health status icons. + type: Add + - message: Enhance the Medical HUD to display the health status of players and mobs + using the newly added icons. + type: Tweak + id: 6182 + time: '2024-03-18T13:56:12.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26027 +- author: Plykiya + changes: + - message: Lone operatives now start with 60TC instead of 40TC. + type: Tweak + id: 6183 + time: '2024-03-18T14:15:53.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26130 +- author: PJB3005 changes: - - {message: 'Fix arrivals fog not actually blocking, no more free roaming.', type: Fix} - id: 5347 - time: '2023-12-12T09:20:33.0000000+00:00' -- author: themias + - message: Fixed hardsuits in space causing high pressure damage + type: Fix + id: 6184 + time: '2024-03-18T16:46:31.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26236 +- author: potato1234x changes: - - {message: Added fill visuals to Hot Chocolate, type: Tweak} - id: 5348 - time: '2023-12-13T00:01:24.0000000+00:00' -- author: themias + - message: Added crafting recipes for wall lockers and secure lockers + type: Add + - message: Fixed secure lockers and wall lockers not being deconstructible + type: Fix + id: 6185 + time: '2024-03-18T20:53:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/24942 +- author: brainfood1183 changes: - - {message: Fixed secret doors not requiring metal rods, type: Fix} - id: 5349 - time: '2023-12-13T00:01:51.0000000+00:00' -- author: Vasilis + - message: Added Spray Paints. + type: Add + id: 6186 + time: '2024-03-18T21:29:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/23003 +- author: PJB3005 + changes: + - message: Bans are now shown in the "adminremarks" command. + type: Add + id: 6187 + time: '2024-03-18T21:31:34.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26240 +- author: Terraspark4941 + changes: + - message: The TEG page in the guidebook has been updated with proper information! + type: Tweak + id: 6188 + time: '2024-03-18T21:33:07.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26170 +- author: Plykiya + changes: + - message: You can now craft ducky slippers. + type: Add + id: 6189 + time: '2024-03-18T21:34:35.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26138 +- author: Boaz1111 + changes: + - message: Lone operatives now require a minimum of 20 players to spawn + type: Tweak + id: 6190 + time: '2024-03-18T21:36:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26244 +- author: shampunj + changes: + - message: Zombies now passively heal 1 heat/shock damage every 50 seconds + type: Tweak + id: 6191 + time: '2024-03-18T21:47:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25925 +- author: Killerqu00 + changes: + - message: Initial Infected now can see each other. + type: Add + - message: Initial Infected can now see zombified entities. + type: Add + id: 6192 + time: '2024-03-18T21:57:36.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25934 +- author: nikthechampiongr changes: - - {message: 'Added a General settings tab, and moved a bunch of options into it.', - type: Add} - - {message: Added the ability to toggle on and off the Discord Rich Presence., type: Add} - id: 5350 - time: '2023-12-13T01:58:20.0000000+00:00' + - message: You can now use the SCRAM! implant while cuffed. + type: Fix + - message: The freedom implant can no longer be used while in crit, or dead. + type: Fix + id: 6193 + time: '2024-03-18T22:35:46.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25978 +- author: SlamBamActionman + changes: + - message: Recyclers no longer delete items stored inside of recycled entities. + type: Fix + id: 6194 + time: '2024-03-19T02:36:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26045 +- author: Vermidia + changes: + - message: Made the Artifact Reports page up to date with current Xenoarchaeology + type: Tweak + id: 6195 + time: '2024-03-19T03:22:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26252 +- author: keronshb + changes: + - message: Fixed a bug where stores were enabling refunds after a purchase + type: Fix + id: 6196 + time: '2024-03-19T03:48:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26251 diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt index bf4394fcdb..0320b4e135 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -08A, 0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlexUmAndXGabriel08X, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, artak10t, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, beck-thompson, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, ColdAutumnRain, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, deepy, Delete69, deltanedas, DerbyX, DmitriyMX, Doctor-Cpu, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, gusxyz, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, Kadeo64, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, luckyshotpictures, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Mangohydra, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, MishaUnity, MisterMecky, Mith-randalf, MjrLandWhale, ModeratelyAware, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nails-n-Tape, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, Nylux, OctoRocket, OldDanceJacket, OliverOtter, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, Phill101, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, PotentiallyTom, ProfanedBane, ProPandaBear, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, PursuitInAshes, Putnam3145, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, Ranger6012, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, renodubois, RiceMar1244, RieBi, RIKELOLDABOSS, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SamV522, SaphireLattice, ScalyChimp, scrato, Scribbles0, ScumbagDog, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, shampunj, SignalWalker, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, snebl, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, SphiraI, spoogemonster, ssdaniel24, Stanislav4ix, Stealthbomber16, StrawberryMoses, Subversionary, SweptWasTaken, Szunti, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, ThunderBear2006, timothyteakettle, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, tosatur, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, volundr-, Vordenburg, vulppine, wafehling, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, WTCWR68, xRiriq, yathxyz, Ygg01, YotaXP, youarereadingthis, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +08A, 0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, africalimedrop, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlexUmAndXGabriel08X, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, artak10t, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, avghdev, AzzyIsNotHere, BananaFlambe, BasedUser, beck-thompson, BGare, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, CaptainSqrBeard, Carbonhell, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, clement-or, Clyybber, Cojoke-dot, ColdAutumnRain, collinlunn, ComicIronic, coolmankid12345, corentt, CrafterKolyan, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, deepy, Delete69, deltanedas, DerbyX, DmitriyMX, Doctor-Cpu, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DoutorWhite, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, freeman2651, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, gusxyz, Gyrandola, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, Kadeo64, KaiShibaa, kalane15, kalanosh, KEEYNy, Keikiru, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Kmc2000, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, LetterN, Level10Cybermancer, lever1209, LightVillet, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, luckyshotpictures, LudwigVonChesterfield, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, M3739, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Mangohydra, matthst, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, MishaUnity, MisterMecky, Mith-randalf, MjrLandWhale, ModeratelyAware, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nails-n-Tape, Nairodian, Naive817, NakataRin, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, Nylux, OctoRocket, OldDanceJacket, OliverOtter, onoira, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, Phill101, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, PotentiallyTom, ProfanedBane, ProPandaBear, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, PursuitInAshes, Putnam3145, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, Ranger6012, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, renodubois, RiceMar1244, RieBi, RIKELOLDABOSS, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, Saakra, Samsterious, SamV522, SaphireLattice, ScalyChimp, scrato, Scribbles0, ScumbagDog, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, shampunj, SignalWalker, Simyon264, SirDragooon, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, Slava0135, snebl, Snowni, snowsignal, SonicHDC, SoulSloth, SpaceManiac, SpeltIncorrectyl, SphiraI, spoogemonster, ssdaniel24, Stanislav4ix, Stealthbomber16, StrawberryMoses, Subversionary, SweptWasTaken, Szunti, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, tom-leys, tomasalves8, Tomeno, tosatur, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UKNOWH, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Verslebas, VigersRay, Visne, volundr-, Vordenburg, vulppine, wafehling, waylon531, weaversam8, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, youarereadingthis, YuriyKiss, zach-hill, Zandario, Zap527, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem diff --git a/Resources/Locale/en-US/cargo/bounties.ftl b/Resources/Locale/en-US/cargo/bounties.ftl index 63c68de105..b332517c70 100644 --- a/Resources/Locale/en-US/cargo/bounties.ftl +++ b/Resources/Locale/en-US/cargo/bounties.ftl @@ -47,8 +47,24 @@ bounty-item-organs = Organ bounty-item-labeler = Hand labeler bounty-item-warm-cloth = Warm clothes bounty-item-battery = Battery -bounty-lasergun = Laser gun -bounty-food = Meat food +bounty-item-lasergun = Laser gun +bounty-item-food = Meat food +bounty-item-fruit = Fruit +bounty-item-vegetable = Vegetable +bounty-item-chili = Bowl of chili +bounty-item-rollerskates = Roller skates +bounty-item-bedsheet = Bedsheet +bounty-item-bandana = Bandana +bounty-item-steak = Steak +bounty-item-banana = Banana +bounty-item-beer = Beer +bounty-item-hi-viz-vest = Hi-viz vest +bounty-item-torch = Torch +bounty-item-medkit-box = Medkit box +bounty-item-cardboard-box = Cardboard box +bounty-item-wine = Wine bottle +bounty-item-cotton-boll = Cotton boll +bounty-item-microwave-machine-board = Microwave machine board bounty-description-artifact = NanoTrasen is in some hot water for stealing artifacts from non-spacefaring planets. Return one and we'll compensate you for it. bounty-description-baseball-bat = Baseball fever is going on at CentCom! Be a dear and ship them some baseball bats, so that management can live out their childhood dream. @@ -100,3 +116,19 @@ bounty-description-warm-cloth = The Unath construction crew freezes and is unabl bounty-description-battery = As the Arachnid settlement prepares for a solar flare, they are requesting a large shipment of power batteries. We're sending out a request for delivery. bounty-description-lasergun = The Salvage Caravan requests a large shipment of laser weapons to mop up a hive of xenomorphs. bounty-description-food = After the rat king invasion, a neighboring unathi station was left completely without food. A large meat food shipment is needed. +bounty-description-fruit = A heroic monkey helped the chaplain catch a troublemaker hiding in the chapel, and the crew wants to reward him for his good work. +bounty-description-vegetable = The new chef is a vegetarian, and botany can't keep up with their demands. We need some additional veggies to help keep things stocked. +bounty-description-chili = Today's the Centcomm Chili Cookoff, and, well, a few of us forgot to make some. Please help cover for us. +bounty-description-rollerskates = CentComm Security is proposing a new strategy for helping officers win foot pursuits. Send them a couple so they cna learn how bad an idea this is. +bounty-description-bedsheet = Someone in Atmos keeps turning down the heater, and we're all shivering in our beds. Please send us some extra sheets to stay warm. +bounty-description-bandana = Bzzzt... Transmission from prison planet OC-1001: We're... reorganizing our command structure. Send us some bandanas so we can tell gan- I mean, departments apart. +bounty-description-steak = The vegetarian cook is refusing to make us anything with meat, and the lizards are getting restless. Can you smuggle us a few steaks to keep them happy? +bounty-description-banana = Hi station! Botany won't gimme any more. They said slipping the HoS out an open airlock wasn't funny! Can you believe it? Help me out! HONK. +bounty-description-beer = Some nefarious agent has stolen every single drink in the bar. Yes, everything. Help tide us over until we can find them. +bounty-description-hi-viz-vest = The clown stole the AME controller and won't back. It's pretty dark in here. Some hi-viz vests would make seeing each other in the dark a little mroe bearable. +bounty-description-torch = The chef made all the monkeys and kobolds at once, and they rebelled and took over the cargo shuttle. They're demanding supplies and free passage to a jungle planet, and we're giving in to their demands. All they need now is a few torches. +bounty-description-medkit-box = CentComm is putting on a play set in a hospital, and needs some props. Just send us some empty medkit boxes, and the show will go on! +bounty-description-cardobard-box = "The Cardborgs Cometh" is a new play premiering tomorrow, and the costuming team is woefully unprepared. Send us some boxes to work with. +bounty-description-wine = The new librarian and the Quartermaster are falling head over heels for each other after she caught him disassembling the bookshelves for wood. Send a couple bottles of wine (Or cans, if you must) to help make the date go well. +bounty-description-cotton-boll = A massive swarm of mothroaches ate all the paper and cloth on the station. Send us some cotton to help keep our winged crewmembers fed. +bounty-description-microwave-machine-board = Mr. Giggles thought it'd be funny to stick forks in all the kitchen microwaves. Help us replace them before the chefs start making clown burgers. diff --git a/Resources/Locale/en-US/chemistry/components/solution-transfer-component.ftl b/Resources/Locale/en-US/chemistry/components/solution-transfer-component.ftl index 14cec95129..74e38f00ab 100644 --- a/Resources/Locale/en-US/chemistry/components/solution-transfer-component.ftl +++ b/Resources/Locale/en-US/chemistry/components/solution-transfer-component.ftl @@ -11,6 +11,7 @@ comp-solution-transfer-is-full = {THE($target)} is full! ## Displayed in change transfer amount verb's name comp-solution-transfer-verb-custom-amount = Custom comp-solution-transfer-verb-amount = {$amount}u +comp-solution-transfer-verb-toggle = Toggle to {$amount}u ## Displayed after you successfully change a solution's amount using the BUI comp-solution-transfer-set-amount = Transfer amount set to {$amount}u. diff --git a/Resources/Locale/en-US/clothing/boots.ftl b/Resources/Locale/en-US/clothing/boots.ftl new file mode 100644 index 0000000000..c86bec8455 --- /dev/null +++ b/Resources/Locale/en-US/clothing/boots.ftl @@ -0,0 +1 @@ +clothing-boots-sidearm = Sidearm diff --git a/Resources/Locale/en-US/flavors/flavor-profiles.ftl b/Resources/Locale/en-US/flavors/flavor-profiles.ftl index 5d42146f74..35de5555a2 100644 --- a/Resources/Locale/en-US/flavors/flavor-profiles.ftl +++ b/Resources/Locale/en-US/flavors/flavor-profiles.ftl @@ -47,9 +47,9 @@ flavor-base-clean = clean flavor-base-alkaline = alkaline flavor-base-holy = holy flavor-base-horrible = horrible - # lmao flavor-base-terrible = terrible +flavor-base-mindful = mindful # Complex flavors. Put a flavor here when you want something that's more # specific. diff --git a/Resources/Locale/en-US/materials/materials.ftl b/Resources/Locale/en-US/materials/materials.ftl index dca520b5b4..a354423d2b 100644 --- a/Resources/Locale/en-US/materials/materials.ftl +++ b/Resources/Locale/en-US/materials/materials.ftl @@ -25,6 +25,7 @@ materials-meat = meat materials-web = silk materials-bones = bone materials-coal = coal +materials-gunpowder = gunpowder # Ores materials-raw-iron = raw iron diff --git a/Resources/Locale/en-US/paint/paint.ftl b/Resources/Locale/en-US/paint/paint.ftl new file mode 100644 index 0000000000..200b1f6e3f --- /dev/null +++ b/Resources/Locale/en-US/paint/paint.ftl @@ -0,0 +1,8 @@ +paint-success = {THE($target)} has been covered in paint! +paint-failure = Can't cover {THE($target)} in paint! +paint-failure-painted = {THE($target)} is already covered in paint! +paint-empty = {THE($used)} is empty! +paint-removed = You clean off the paint! +paint-closed = You must open {THE($used)} first! +paint-verb = Paint +paint-remove-verb = Remove Paint diff --git a/Resources/Locale/en-US/paper/stamp-component.ftl b/Resources/Locale/en-US/paper/stamp-component.ftl index 3fc7fe64ba..18f103bf80 100644 --- a/Resources/Locale/en-US/paper/stamp-component.ftl +++ b/Resources/Locale/en-US/paper/stamp-component.ftl @@ -4,6 +4,7 @@ stamp-component-stamped-name-mime = Mime stamp-component-stamped-name-captain = Captain stamp-component-stamped-name-centcom = CentCom stamp-component-stamped-name-chaplain = Chaplain +stamp-component-stamped-name-lawyer = Lawyer stamp-component-stamped-name-clown = Clown stamp-component-stamped-name-cmo = Chief Medical Officer stamp-component-stamped-name-denied = DENIED diff --git a/Resources/Locale/en-US/reagents/meta/biological.ftl b/Resources/Locale/en-US/reagents/meta/biological.ftl index 10a9a07e08..a320bbdcb3 100644 --- a/Resources/Locale/en-US/reagents/meta/biological.ftl +++ b/Resources/Locale/en-US/reagents/meta/biological.ftl @@ -24,3 +24,6 @@ reagent-desc-fat = No matter how it was obtained, its application is important. reagent-name-vomit = vomit reagent-desc-vomit = You can see a few chunks of someone's last meal in it. + +reagent-name-grey-matter = grey matter +reagent-desc-grey-matter = Thought juice, the stuff that leaks out of your ears. diff --git a/Resources/Locale/en-US/reagents/meta/physical-desc.ftl b/Resources/Locale/en-US/reagents/meta/physical-desc.ftl index 24340e63a6..2e959bf14e 100644 --- a/Resources/Locale/en-US/reagents/meta/physical-desc.ftl +++ b/Resources/Locale/en-US/reagents/meta/physical-desc.ftl @@ -96,3 +96,4 @@ reagent-physical-desc-alkaline = alkaline reagent-physical-desc-reflective = reflective reagent-physical-desc-holy = holy reagent-physical-desc-slimy = slimy +reagent-physical-desc-neural = neural diff --git a/Resources/Locale/en-US/replays/replays.ftl b/Resources/Locale/en-US/replays/replays.ftl index 560285cbb1..7a7e551b3e 100644 --- a/Resources/Locale/en-US/replays/replays.ftl +++ b/Resources/Locale/en-US/replays/replays.ftl @@ -6,8 +6,9 @@ replay-loading-processing = Processing Files replay-loading-spawning = Spawning Entities replay-loading-initializing = Initializing Entities replay-loading-starting= Starting Entities -replay-loading-failed = Failed to load replay: +replay-loading-failed = Failed to load replay. Error: {$reason} +replay-loading-retry = Try load with more exception tolerance - MAY CAUSE BUGS! # Main Menu replay-menu-subtext = Replay Client diff --git a/Resources/Locale/en-US/store/categories.ftl b/Resources/Locale/en-US/store/categories.ftl index 437fc03ae0..17247b84f4 100644 --- a/Resources/Locale/en-US/store/categories.ftl +++ b/Resources/Locale/en-US/store/categories.ftl @@ -1,16 +1,16 @@ -# Uplink +# Uplink store-category-debug = debug category store-category-debug2 = debug category 2 -store-category-weapons = Weapons +store-category-weapons = Weaponry store-category-ammo = Ammo store-category-explosives = Explosives -store-category-misc = Misc -store-category-bundles = Bundles -store-category-tools = Tools -store-category-utility = Utility +store-category-chemicals = Chemicals +store-category-deception = Deception +store-category-disruption = Disruption store-category-implants = Implants +store-category-allies = Allies store-category-job = Job -store-category-armor = Armor +store-category-wearables = Wearables store-category-pointless = Pointless # Revenant diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 347d1a87e3..5a54d76e93 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -64,7 +64,10 @@ uplink-exploding-pen-name = Exploding pen uplink-exploding-pen-desc = A class IV explosive device contained within a standard pen. Comes with a 4 second fuse. uplink-exploding-syndicate-bomb-name = Syndicate Bomb -uplink-exploding-syndicate-bomb-desc = A big, anchored bomb that can create a huge explosion if not defused in time. Useful as a distraction. Has an adjustable timer with a minimum setting of 120 seconds. +uplink-exploding-syndicate-bomb-desc = A big, anchored bomb that can create a huge explosion if not defused in time. Useful as a distraction. Has an adjustable timer with a minimum setting of 180 seconds. + +uplink-exploding-syndicate-bomb-fake-name = Decoy Syndicate Bomb +uplink-exploding-syndicate-bomb-fake-desc = A training bomb carefully made to look just like the real thing. In all ways similar to a syndicate bomb, but only creates a tiny explosion. uplink-cluster-grenade-name = Cluster Grenade uplink-cluster-grenade-desc = Three explosive grenades bundled together, the grenades get launched after the 3.5 second timer runs out. @@ -146,7 +149,7 @@ uplink-clothing-eyes-hud-syndicate-name = Syndicate Visor uplink-clothing-eyes-hud-syndicate-desc = The syndicate's professional head-up display, designed for better detection of humanoids and their subsequent elimination. uplink-radio-jammer-name = Radio Jammer -uplink-radio-jammer-desc = This device will disrupt any nearby outgoing radio communication when activated. +uplink-radio-jammer-desc = This device will disrupt any nearby outgoing radio communication as well as suit sensors when activated. uplink-syndicate-weapon-module-name = Weapon Cyborg Module uplink-syndicate-weapon-module-desc = This module will give a cyborg advanced laser and machete @@ -409,3 +412,6 @@ uplink-hypodart-desc = A seemingly unremarkable dart with an enlarged reservoir uplink-barber-scissors-name = Barber Scissors uplink-barber-scissors-desc = A good tool to give your fellow agent a nice haircut, unless you want to give it to yourself. + +uplink-backpack-syndicate-name = Syndicate backpack +uplink-backpack-syndicate-desc = Lightweight explosion-proof а backpack for holding various traitor goods diff --git a/Resources/Maps/Shuttles/cargo_fland.yml b/Resources/Maps/Shuttles/cargo_fland.yml index dd1871a1ca..e91e228e5c 100644 --- a/Resources/Maps/Shuttles/cargo_fland.yml +++ b/Resources/Maps/Shuttles/cargo_fland.yml @@ -3,12 +3,12 @@ meta: postmapinit: false tilemap: 0: Space - 34: FloorDarkMono - 89: FloorSteel - 100: FloorSteelMono - 105: FloorTechMaint2 - 120: Lattice - 121: Plating + 36: FloorDarkMono + 93: FloorSteel + 104: FloorSteelMono + 109: FloorTechMaint2 + 125: Lattice + 126: Plating entities: - proto: "" entities: @@ -23,11 +23,11 @@ entities: chunks: 0,0: ind: 0,0 - tiles: WQAAAAABZAAAAAABeQAAAAAAeQAAAAAAeQAAAAAAZAAAAAAAWQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAZAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAZAAAAAADeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADZAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAZAAAAAACWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAZAAAAAADZAAAAAACZAAAAAABZAAAAAACZAAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAWQAAAAACWQAAAAACWQAAAAADeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAWQAAAAABWQAAAAAAWQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAWQAAAAADWQAAAAABWQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: XQAAAAABaAAAAAABfgAAAAAAfgAAAAAAfgAAAAAAaAAAAAAAXQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAaAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAaAAAAAADfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAADaAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAaAAAAAACXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAaAAAAAADaAAAAAACaAAAAAABaAAAAAACaAAAAAABfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAXQAAAAACXQAAAAACXQAAAAADfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAXQAAAAABXQAAAAAAXQAAAAACfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAXQAAAAADXQAAAAABXQAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,-1: ind: 0,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAaQAAAAAAIgAAAAACaQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAaQAAAAAAIgAAAAABaQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAaQAAAAAAIgAAAAACaQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAZAAAAAADZAAAAAADZAAAAAACZAAAAAAAZAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAZAAAAAACeQAAAAAAeQAAAAAAeQAAAAAAZAAAAAADeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAZAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAZAAAAAADeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAbQAAAAAAJAAAAAACbQAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAbQAAAAAAJAAAAAABbQAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAbQAAAAAAJAAAAAACbQAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAaAAAAAADaAAAAAADaAAAAAACaAAAAAAAaAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAaAAAAAACfgAAAAAAfgAAAAAAfgAAAAAAaAAAAAADfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAaAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAaAAAAAADfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 - type: Broadphase - type: Physics @@ -137,27 +137,25 @@ entities: data: tiles: 0,0: - 0: 117 - 1: 65418 + 0: 65535 0,-1: - 0: 4096 - 1: 61439 + 0: 65535 -1,-1: 0: 32768 -1,0: 0: 136 0,1: - 1: 61439 + 0: 61439 1,0: - 1: 30583 + 0: 30583 1,1: - 1: 14199 + 0: 14199 0,-2: - 1: 65504 + 0: 65504 1,-2: - 1: 30512 + 0: 30512 1,-1: - 1: 30583 + 0: 30583 uniqueMixes: - volume: 2500 temperature: 293.15 @@ -174,21 +172,6 @@ entities: - 0 - 0 - 0 - - volume: 2500 - temperature: 293.15 - moles: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 chunkSize: 4 - type: GasTileOverlay - type: RadiationGridResistance @@ -213,7 +196,7 @@ entities: pos: 0.5,0.5 parent: 1 - type: Door - secondsUntilStateChange: -4755.514 + secondsUntilStateChange: -4823.494 state: Opening - uid: 51 components: @@ -222,7 +205,7 @@ entities: pos: 0.5,2.5 parent: 1 - type: Door - secondsUntilStateChange: -4754.5474 + secondsUntilStateChange: -4822.5273 state: Opening - uid: 52 components: @@ -231,7 +214,7 @@ entities: pos: 6.5,2.5 parent: 1 - type: Door - secondsUntilStateChange: -4753.614 + secondsUntilStateChange: -4821.5938 state: Opening - uid: 53 components: @@ -240,7 +223,7 @@ entities: pos: 6.5,0.5 parent: 1 - type: Door - secondsUntilStateChange: -4768.614 + secondsUntilStateChange: -4836.5938 state: Opening - proto: APCBasic entities: diff --git a/Resources/Maps/Shuttles/trading_outpost.yml b/Resources/Maps/Shuttles/trading_outpost.yml index a10f070bd2..f040d58253 100644 --- a/Resources/Maps/Shuttles/trading_outpost.yml +++ b/Resources/Maps/Shuttles/trading_outpost.yml @@ -3,20 +3,20 @@ meta: postmapinit: false tilemap: 0: Space - 29: FloorDark - 34: FloorDarkMono - 37: FloorDarkPavementVertical - 49: FloorGrassJungle - 64: FloorMetalDiamond - 77: FloorReinforced - 89: FloorSteel - 100: FloorSteelMono - 104: FloorTechMaint - 105: FloorTechMaint2 - 118: FloorWood - 119: FloorWoodTile - 120: Lattice - 121: Plating + 31: FloorDark + 36: FloorDarkMono + 39: FloorDarkPavementVertical + 51: FloorGrassJungle + 66: FloorMetalDiamond + 79: FloorReinforced + 93: FloorSteel + 104: FloorSteelMono + 108: FloorTechMaint + 109: FloorTechMaint2 + 122: FloorWood + 124: FloorWoodTile + 125: Lattice + 126: Plating entities: - proto: "" entities: @@ -31,27 +31,27 @@ entities: chunks: 0,0: ind: 0,0 - tiles: WQAAAAABWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAAAWQAAAAADWQAAAAAAWQAAAAABWQAAAAADWQAAAAAAIgAAAAABJQAAAAADeQAAAAAAAAAAAAAAAAAAAAAAIgAAAAAAIgAAAAAAIgAAAAABIgAAAAAAIgAAAAAAIgAAAAACIgAAAAABIgAAAAAAIgAAAAAAIgAAAAABIgAAAAACeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdwAAAAABdwAAAAADdwAAAAACMQAAAAAAMQAAAAAAMQAAAAAAdwAAAAADdwAAAAABdwAAAAABdgAAAAACeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAADdwAAAAABdwAAAAADdwAAAAADdgAAAAADdgAAAAACdgAAAAADdwAAAAAAdwAAAAABdwAAAAAAdgAAAAACIgAAAAADJQAAAAACeQAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdgAAAAABdgAAAAACdgAAAAABdgAAAAAAdgAAAAACdgAAAAAAdgAAAAAAdgAAAAABdgAAAAADdgAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: XQAAAAABXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAABXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAADXQAAAAACXQAAAAADXQAAAAAAXQAAAAAAXQAAAAADXQAAAAAAXQAAAAABXQAAAAADXQAAAAAAJAAAAAABJwAAAAADfgAAAAAAAAAAAAAAAAAAAAAAJAAAAAAAJAAAAAAAJAAAAAABJAAAAAAAJAAAAAAAJAAAAAACJAAAAAABJAAAAAAAJAAAAAAAJAAAAAABJAAAAAACfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAegAAAAAAfAAAAAABfAAAAAADfAAAAAACMwAAAAAAMwAAAAAAMwAAAAAAfAAAAAADfAAAAAABfAAAAAABegAAAAACfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAegAAAAADfAAAAAABfAAAAAADfAAAAAADegAAAAADegAAAAACegAAAAADfAAAAAAAfAAAAAABfAAAAAAAegAAAAACJAAAAAADJwAAAAACfgAAAAAAAAAAAAAAAAAAAAAAegAAAAAAegAAAAABegAAAAACegAAAAABegAAAAAAegAAAAACegAAAAAAegAAAAAAegAAAAABegAAAAADegAAAAACfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,-1: ind: 0,-1 - tiles: eQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAIgAAAAAAeQAAAAAAeQAAAAAAIgAAAAABIgAAAAABHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAABIgAAAAACIgAAAAAAIgAAAAAAIgAAAAABIgAAAAABIgAAAAACIgAAAAAAIgAAAAACeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAAAWQAAAAACWQAAAAADWQAAAAACWQAAAAADWQAAAAAAWQAAAAACWQAAAAABWQAAAAABeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAADWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAACZAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAAAWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAABTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAABaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAAAZAAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAADWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAWQAAAAAAaQAAAAAAaQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaQAAAAAAaQAAAAAAWQAAAAABZAAAAAACeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAADTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADWQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAWQAAAAABWQAAAAACTQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAABWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAZAAAAAACWQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAWQAAAAADZAAAAAADeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA + tiles: fgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAJAAAAAAAfgAAAAAAfgAAAAAAJAAAAAABJAAAAAABHwAAAAACfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAABJAAAAAACJAAAAAAAJAAAAAAAJAAAAAABJAAAAAABJAAAAAACJAAAAAAAJAAAAAACfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAADXQAAAAAAXQAAAAACXQAAAAADXQAAAAACXQAAAAADXQAAAAAAXQAAAAACXQAAAAABXQAAAAABfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAAAXQAAAAABfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaAAAAAADXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAACaAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAAAXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAABTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAXQAAAAABbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAAAaAAAAAACfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAACXQAAAAAAbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAADXQAAAAACfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAAAXQAAAAAAbQAAAAAAbQAAAAAAbAAAAAAAfgAAAAAAbAAAAAAAbQAAAAAAbQAAAAAAXQAAAAABaAAAAAACfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAAAXQAAAAADTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADXQAAAAABfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAABXQAAAAACTwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAABXQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAaAAAAAACXQAAAAAATwAAAAAATwAAAAAATwAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAXQAAAAADaAAAAAADfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,0: ind: -1,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAACIgAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAJQAAAAADIgAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJwAAAAACJAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJwAAAAADJAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-1: ind: -1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAIgAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAJAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAA version: 6 0,-2: ind: 0,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAIgAAAAABIgAAAAACHQAAAAACHQAAAAADHQAAAAABHQAAAAABeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAHQAAAAABHQAAAAACHQAAAAABIgAAAAADIgAAAAADHQAAAAACeQAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAQgAAAAAAQgAAAAAAQgAAAAAAJAAAAAABJAAAAAACHwAAAAACHwAAAAADHwAAAAABHwAAAAABfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAHwAAAAABHwAAAAACHwAAAAABJAAAAAADJAAAAAADHwAAAAACfgAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,-2: ind: -1,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAeAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAfQAAAAAA version: 6 - type: Broadphase - type: Physics @@ -1889,276 +1889,303 @@ entities: rot: 1.5707963267948966 rad pos: 2.5,-17.5 parent: 2 -- proto: CargoPallet +- proto: CargoPalletBuy entities: - - uid: 20 - components: - - type: Transform - pos: 7.5,0.5 - parent: 2 - uid: 21 components: - type: Transform - pos: 8.5,0.5 + rot: -1.5707963267948966 rad + pos: 3.5,-9.5 parent: 2 - uid: 24 components: - type: Transform - pos: 8.5,-0.5 + rot: -1.5707963267948966 rad + pos: 2.5,-9.5 parent: 2 - uid: 25 components: - type: Transform - pos: 7.5,-0.5 + rot: -1.5707963267948966 rad + pos: 2.5,-8.5 parent: 2 - uid: 26 components: - type: Transform - pos: 7.5,-1.5 + rot: -1.5707963267948966 rad + pos: 3.5,-8.5 parent: 2 - uid: 27 components: - type: Transform - pos: 8.5,-1.5 + rot: -1.5707963267948966 rad + pos: 3.5,-7.5 parent: 2 - uid: 30 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,0.5 - parent: 2 - - uid: 32 - components: - - type: Transform pos: 2.5,-7.5 parent: 2 - - uid: 34 + - uid: 32 components: - type: Transform rot: -1.5707963267948966 rad - pos: 7.5,-7.5 + pos: 4.5,-9.5 parent: 2 - uid: 35 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,-7.5 + rot: 1.5707963267948966 rad + pos: 7.5,-0.5 parent: 2 - uid: 36 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-1.5 + rot: 1.5707963267948966 rad + pos: 6.5,-0.5 parent: 2 - uid: 37 components: - type: Transform rot: -1.5707963267948966 rad - pos: 8.5,-9.5 + pos: 4.5,-7.5 parent: 2 - uid: 39 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,-8.5 + rot: 1.5707963267948966 rad + pos: 6.5,-2.5 parent: 2 - uid: 41 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 7.5,-8.5 + rot: 1.5707963267948966 rad + pos: 6.5,-1.5 parent: 2 - uid: 42 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-8.5 + rot: 1.5707963267948966 rad + pos: 7.5,-1.5 parent: 2 - uid: 43 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-9.5 + rot: 1.5707963267948966 rad + pos: 8.5,-2.5 parent: 2 - uid: 44 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-0.5 + rot: 1.5707963267948966 rad + pos: 8.5,-1.5 parent: 2 - - uid: 45 + - uid: 47 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-8.5 + rot: 1.5707963267948966 rad + pos: 8.5,0.5 parent: 2 - - uid: 46 + - uid: 49 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,-6.5 + rot: 1.5707963267948966 rad + pos: 8.5,-0.5 parent: 2 - - uid: 47 + - uid: 50 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-9.5 + rot: 1.5707963267948966 rad + pos: 7.5,-2.5 parent: 2 - - uid: 48 + - uid: 56 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,-7.5 + pos: 4.5,-6.5 parent: 2 - - uid: 49 + - uid: 61 components: - type: Transform - pos: 7.5,-9.5 + rot: -1.5707963267948966 rad + pos: 4.5,-8.5 parent: 2 - - uid: 50 + - uid: 67 components: - type: Transform - pos: 3.5,-7.5 + rot: -1.5707963267948966 rad + pos: 3.5,-6.5 parent: 2 - - uid: 51 + - uid: 71 components: - type: Transform - pos: 3.5,-9.5 + rot: -1.5707963267948966 rad + pos: 2.5,-6.5 parent: 2 - - uid: 52 + - uid: 183 components: - type: Transform - pos: 3.5,-8.5 + rot: 1.5707963267948966 rad + pos: 6.5,0.5 parent: 2 - - uid: 54 + - uid: 900 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-7.5 + rot: 1.5707963267948966 rad + pos: 7.5,0.5 parent: 2 - - uid: 55 +- proto: CargoPalletSell + entities: + - uid: 34 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,-2.5 + pos: 4.5,-0.5 parent: 2 - - uid: 56 + - uid: 45 components: - type: Transform - pos: 3.5,-1.5 + rot: 1.5707963267948966 rad + pos: 8.5,-7.5 parent: 2 - - uid: 57 + - uid: 46 components: - type: Transform - pos: 2.5,-8.5 + rot: -1.5707963267948966 rad + pos: 4.5,-2.5 parent: 2 - - uid: 58 + - uid: 48 components: - type: Transform - pos: 3.5,-0.5 + rot: -1.5707963267948966 rad + pos: 3.5,-2.5 parent: 2 - - uid: 59 + - uid: 51 components: - type: Transform - pos: 3.5,0.5 + rot: -1.5707963267948966 rad + pos: 3.5,-1.5 parent: 2 - - uid: 60 + - uid: 52 components: - type: Transform rot: -1.5707963267948966 rad - pos: 6.5,-0.5 + pos: 2.5,-2.5 parent: 2 - - uid: 61 + - uid: 54 components: - type: Transform - pos: 2.5,-9.5 + rot: 1.5707963267948966 rad + pos: 6.5,-9.5 parent: 2 - - uid: 66 + - uid: 55 components: - type: Transform rot: -1.5707963267948966 rad - pos: 7.5,-2.5 + pos: 2.5,-1.5 parent: 2 - - uid: 67 + - uid: 57 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 8.5,-9.5 + parent: 2 + - uid: 58 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-2.5 + pos: 4.5,0.5 parent: 2 - - uid: 68 + - uid: 59 components: - type: Transform - pos: 2.5,-1.5 + rot: 1.5707963267948966 rad + pos: 8.5,-6.5 parent: 2 - - uid: 69 + - uid: 60 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-2.5 + rot: 1.5707963267948966 rad + pos: 7.5,-7.5 parent: 2 - - uid: 70 + - uid: 66 components: - type: Transform rot: -1.5707963267948966 rad - pos: 8.5,-2.5 + pos: 3.5,0.5 parent: 2 - - uid: 71 + - uid: 68 components: - type: Transform - pos: 2.5,-0.5 + rot: 1.5707963267948966 rad + pos: 7.5,-8.5 parent: 2 - - uid: 72 + - uid: 69 components: - type: Transform - pos: 2.5,0.5 + rot: 1.5707963267948966 rad + pos: 8.5,-8.5 parent: 2 - - uid: 73 + - uid: 70 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,-6.5 + rot: 1.5707963267948966 rad + pos: 7.5,-9.5 parent: 2 - - uid: 183 + - uid: 72 components: - type: Transform - rot: -1.5707963267948966 rad + rot: 1.5707963267948966 rad pos: 7.5,-6.5 parent: 2 - - uid: 900 + - uid: 73 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,-6.5 + rot: 1.5707963267948966 rad + pos: 6.5,-6.5 parent: 2 - uid: 901 components: - type: Transform rot: -1.5707963267948966 rad - pos: 2.5,-6.5 + pos: 2.5,-0.5 parent: 2 - uid: 903 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,0.5 + pos: 3.5,-0.5 parent: 2 - uid: 907 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,-6.5 + rot: 1.5707963267948966 rad + pos: 7.5,-7.5 parent: 2 - uid: 908 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-2.5 + pos: 4.5,-1.5 parent: 2 - uid: 909 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,-8.5 + parent: 2 + - uid: 960 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 6.5,-7.5 + parent: 2 + - uid: 961 components: - type: Transform rot: -1.5707963267948966 rad - pos: 4.5,-1.5 + pos: 2.5,0.5 parent: 2 - proto: CarpetBlack entities: diff --git a/Resources/Maps/reach.yml b/Resources/Maps/reach.yml index a4d369582b..9d704e6490 100644 --- a/Resources/Maps/reach.yml +++ b/Resources/Maps/reach.yml @@ -3,25 +3,25 @@ meta: postmapinit: false tilemap: 0: Space - 29: FloorDark - 34: FloorDarkMono - 45: FloorGlass - 46: FloorGold - 47: FloorGrass - 58: FloorHydro - 60: FloorKitchen - 75: FloorPlastic - 76: FloorRGlass - 77: FloorReinforced - 78: FloorReinforcedHardened - 89: FloorSteel - 104: FloorTechMaint - 105: FloorTechMaint2 - 106: FloorTechMaint3 - 108: FloorWhite - 118: FloorWood - 120: Lattice - 121: Plating + 31: FloorDark + 36: FloorDarkMono + 47: FloorGlass + 48: FloorGold + 49: FloorGrass + 60: FloorHydro + 62: FloorKitchen + 77: FloorPlastic + 78: FloorRGlass + 79: FloorReinforced + 80: FloorReinforcedHardened + 93: FloorSteel + 108: FloorTechMaint + 109: FloorTechMaint2 + 110: FloorTechMaint3 + 112: FloorWhite + 122: FloorWood + 125: Lattice + 126: Plating entities: - proto: "" entities: @@ -46,43 +46,47 @@ entities: chunks: -1,-1: ind: -1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAHQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAHQAAAAADHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAHQAAAAAAHQAAAAADHQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAABHQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAHQAAAAADHQAAAAABeQAAAAAAHQAAAAABHQAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAHQAAAAABHQAAAAABHQAAAAACHQAAAAAAHQAAAAACHQAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAHQAAAAADHQAAAAACHQAAAAAAHQAAAAACeQAAAAAAHQAAAAAAHQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAACHQAAAAABeQAAAAAAdgAAAAAAdgAAAAACdgAAAAABLwAAAAAAdgAAAAACdgAAAAACdgAAAAACLwAAAAAAdgAAAAACdgAAAAACdgAAAAAAdgAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAeQAAAAAAdgAAAAAAdgAAAAADdgAAAAACLwAAAAAAdgAAAAABdgAAAAADdgAAAAAALwAAAAAAdgAAAAABdgAAAAAAdgAAAAACdgAAAAAAeQAAAAAAHQAAAAABHQAAAAACeQAAAAAAdgAAAAAAdgAAAAAAdgAAAAABLwAAAAAAdgAAAAADdgAAAAABdgAAAAADLwAAAAAAdgAAAAAAdgAAAAABdgAAAAACdgAAAAABeQAAAAAAHQAAAAAAHQAAAAADeQAAAAAAdgAAAAADdgAAAAACdgAAAAADeQAAAAAAdgAAAAAAdgAAAAACdgAAAAADeQAAAAAAdgAAAAADdgAAAAADdgAAAAACdgAAAAADeQAAAAAAHQAAAAABHQAAAAAAeQAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAAHQAAAAABHQAAAAAAHQAAAAAD + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAHwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAADHwAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAfgAAAAAAHwAAAAACHwAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAHwAAAAAAHwAAAAABHwAAAAABHwAAAAAAHwAAAAABHwAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAADHwAAAAADHwAAAAAAHwAAAAACfgAAAAAAHwAAAAABHwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAABHwAAAAABfgAAAAAAegAAAAABegAAAAABegAAAAACMQAAAAAAegAAAAAAegAAAAACegAAAAABMQAAAAAAegAAAAABegAAAAACegAAAAABegAAAAABfgAAAAAAHwAAAAAAHwAAAAAAfgAAAAAAegAAAAAAegAAAAADegAAAAACMQAAAAAAegAAAAAAegAAAAAAegAAAAAAMQAAAAAAegAAAAACegAAAAABegAAAAAAegAAAAABfgAAAAAAHwAAAAABHwAAAAAAfgAAAAAAegAAAAAAegAAAAACegAAAAADMQAAAAAAegAAAAACegAAAAADegAAAAAAMQAAAAAAegAAAAABegAAAAABegAAAAABegAAAAAAfgAAAAAAHwAAAAADHwAAAAABfgAAAAAAegAAAAABegAAAAAAegAAAAABfgAAAAAAegAAAAAAegAAAAADegAAAAAAfgAAAAAAegAAAAABegAAAAACegAAAAACegAAAAAAfgAAAAAAHwAAAAAAHwAAAAACfgAAAAAATgAAAAABTgAAAAABTgAAAAADTgAAAAADTgAAAAADTgAAAAAATgAAAAAATgAAAAAATgAAAAACTgAAAAACTgAAAAACTgAAAAAAHwAAAAADHwAAAAACHwAAAAAC version: 6 0,0: ind: 0,0 - tiles: HQAAAAAAbAAAAAAAbAAAAAADbAAAAAABbAAAAAADeQAAAAAAbAAAAAADbAAAAAAAbAAAAAADbAAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAbAAAAAABHQAAAAADHQAAAAABHQAAAAAAeQAAAAAAbAAAAAACbAAAAAABbAAAAAABeQAAAAAAbAAAAAADbAAAAAACbAAAAAABeQAAAAAAbAAAAAACbAAAAAABbAAAAAADeQAAAAAAHQAAAAAAHQAAAAAAHQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAADHQAAAAADHQAAAAADHQAAAAACHQAAAAAAHQAAAAABHQAAAAAAHQAAAAACHQAAAAADHQAAAAADHQAAAAABHQAAAAACHQAAAAAAHQAAAAACHQAAAAABeQAAAAAAHQAAAAAAHQAAAAACHQAAAAABHQAAAAABHQAAAAABHQAAAAACHQAAAAAAHQAAAAADHQAAAAAAHQAAAAADHQAAAAACHQAAAAABHQAAAAADHQAAAAADHQAAAAABHQAAAAACHQAAAAADHQAAAAAAHQAAAAACHQAAAAACHQAAAAACHQAAAAABHQAAAAABHQAAAAABHQAAAAAAHQAAAAADHQAAAAADHQAAAAABHQAAAAADHQAAAAABHQAAAAADeQAAAAAAHQAAAAAAHQAAAAACWQAAAAABeQAAAAAAeQAAAAAAWQAAAAADeQAAAAAAeQAAAAAAHQAAAAADHQAAAAAAHQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAABWQAAAAABeQAAAAAALQAAAAAAdgAAAAAAdgAAAAACdgAAAAADLQAAAAAAHQAAAAADeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAADWQAAAAADWQAAAAADeQAAAAAAHQAAAAAAdgAAAAACdgAAAAACdgAAAAAAHQAAAAABHQAAAAADeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAACWQAAAAACWQAAAAAAWQAAAAADeQAAAAAALQAAAAAAdgAAAAACdgAAAAACdgAAAAAALQAAAAAALgAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAABWQAAAAABWQAAAAABeQAAAAAAHQAAAAACdgAAAAAAdgAAAAABdgAAAAACHQAAAAABHQAAAAABeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAADWQAAAAAAWQAAAAADWQAAAAADeQAAAAAALQAAAAAAdgAAAAADdgAAAAADdgAAAAAALQAAAAAAHQAAAAABHQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAABWQAAAAABWQAAAAAAeQAAAAAAHQAAAAACdgAAAAABdgAAAAABdgAAAAADHQAAAAAAHQAAAAADHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAADeQAAAAAALQAAAAAAdgAAAAADdgAAAAADdgAAAAABLQAAAAAAHQAAAAADeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAADdgAAAAAAdgAAAAABdgAAAAACHQAAAAAALgAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAAALQAAAAAAdgAAAAAAdgAAAAADdgAAAAABLQAAAAAAHQAAAAABeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: HwAAAAADcAAAAAAAcAAAAAADcAAAAAADcAAAAAABfgAAAAAAcAAAAAABcAAAAAADcAAAAAADcAAAAAACcAAAAAADcAAAAAABcAAAAAADcAAAAAADHwAAAAADHwAAAAABHwAAAAABfgAAAAAAcAAAAAADcAAAAAAAcAAAAAACfgAAAAAAcAAAAAADcAAAAAADcAAAAAAAfgAAAAAAcAAAAAACcAAAAAABcAAAAAACfgAAAAAAHwAAAAADHwAAAAADHwAAAAACfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAABHwAAAAADHwAAAAABHwAAAAADHwAAAAAAHwAAAAACHwAAAAAAHwAAAAADHwAAAAABHwAAAAACHwAAAAADHwAAAAABHwAAAAAAHwAAAAACHwAAAAADfgAAAAAAHwAAAAADHwAAAAADHwAAAAACHwAAAAACHwAAAAABHwAAAAABHwAAAAADHwAAAAACHwAAAAACHwAAAAACHwAAAAAAHwAAAAACHwAAAAABHwAAAAADHwAAAAACHwAAAAAAHwAAAAAAHwAAAAAAHwAAAAABHwAAAAACHwAAAAAAHwAAAAABHwAAAAABHwAAAAABHwAAAAAAHwAAAAADHwAAAAABHwAAAAAAHwAAAAAAHwAAAAABHwAAAAAAfgAAAAAAHwAAAAAAHwAAAAAAXQAAAAABfgAAAAAAfgAAAAAAXQAAAAABfgAAAAAAfgAAAAAAHwAAAAAAHwAAAAADHwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAXQAAAAAAXQAAAAACXQAAAAABXQAAAAACfgAAAAAALwAAAAACegAAAAACegAAAAACegAAAAACLwAAAAACHwAAAAADfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAABXQAAAAACXQAAAAADXQAAAAACfgAAAAAAHwAAAAABegAAAAABegAAAAADegAAAAABHwAAAAABHwAAAAABfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXQAAAAABXQAAAAAAXQAAAAAAXQAAAAAAfgAAAAAALwAAAAACegAAAAADegAAAAADegAAAAADLwAAAAADMAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAABXQAAAAADXQAAAAACXQAAAAADfgAAAAAAHwAAAAABegAAAAABegAAAAAAegAAAAADHwAAAAABHwAAAAAAHwAAAAAAHwAAAAAATwAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAACXQAAAAADXQAAAAADfgAAAAAALwAAAAABegAAAAACegAAAAADegAAAAADLwAAAAAAHwAAAAAAHwAAAAABHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAXQAAAAADXQAAAAAAXQAAAAACXQAAAAADfgAAAAAAHwAAAAABegAAAAADegAAAAABegAAAAABHwAAAAACHwAAAAABHwAAAAAAHwAAAAAATwAAAAAAAAAAAAAAAAAAAAAAXQAAAAABXQAAAAADXQAAAAAAXQAAAAAAfgAAAAAALwAAAAADegAAAAABegAAAAABegAAAAAALwAAAAAAHwAAAAAAHwAAAAAAHwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAACegAAAAACegAAAAACegAAAAADHwAAAAACMAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAAALwAAAAABegAAAAACegAAAAABegAAAAADLwAAAAACHwAAAAADfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -1,0: ind: -1,0 - tiles: aQAAAAAATAAAAAAALQAAAAAALQAAAAAALQAAAAAALQAAAAAALQAAAAAALQAAAAAALQAAAAAALQAAAAAALQAAAAAALQAAAAAATAAAAAAAHQAAAAABHQAAAAACHQAAAAADeQAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAATAAAAAAAHQAAAAADHQAAAAACHQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAdgAAAAAAdgAAAAACdgAAAAACdgAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAADHQAAAAACeQAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAeQAAAAAAdgAAAAADdgAAAAADdgAAAAAAdgAAAAABeQAAAAAAPAAAAAAAPAAAAAAAPAAAAAAAeQAAAAAAHQAAAAACHQAAAAADeQAAAAAAOgAAAAAASwAAAAAASwAAAAABHQAAAAAAdgAAAAACdgAAAAABdgAAAAAAdgAAAAACHQAAAAAAPAAAAAAAPAAAAAAAPAAAAAAAeQAAAAAAHQAAAAADHQAAAAACeQAAAAAAOgAAAAAAOgAAAAAAOgAAAAAAeQAAAAAAHQAAAAAAHQAAAAADHQAAAAAAHQAAAAADeQAAAAAAPAAAAAAAPAAAAAAAPAAAAAAAeQAAAAAAHQAAAAABHQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAACeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAHQAAAAABHQAAAAADHQAAAAAAHQAAAAACHQAAAAABIgAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAHQAAAAAAHQAAAAADHQAAAAADIgAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAAHQAAAAABHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAATQAAAAAAHQAAAAADHQAAAAADIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAHQAAAAAAHQAAAAABIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAHQAAAAADeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAA + tiles: bQAAAAAATgAAAAABLwAAAAABLwAAAAADLwAAAAAALwAAAAADLwAAAAABLwAAAAADLwAAAAADLwAAAAACLwAAAAABLwAAAAABTgAAAAACHwAAAAAAHwAAAAADHwAAAAABfgAAAAAATgAAAAABTgAAAAABTgAAAAACTgAAAAADTgAAAAADTgAAAAADTgAAAAADTgAAAAABTgAAAAAATgAAAAAATgAAAAADTgAAAAAAHwAAAAABHwAAAAABHwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAegAAAAADegAAAAACegAAAAABegAAAAADfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAABHwAAAAADfgAAAAAAPAAAAAAAPAAAAAAAPAAAAAAAfgAAAAAAegAAAAAAegAAAAABegAAAAAAegAAAAAAfgAAAAAAPgAAAAAAPgAAAAAAPgAAAAAAfgAAAAAAHwAAAAADHwAAAAACfgAAAAAAPAAAAAAATQAAAAAATQAAAAADHwAAAAAAegAAAAAAegAAAAAAegAAAAABegAAAAACHwAAAAAAPgAAAAAAPgAAAAAAPgAAAAAAfgAAAAAAHwAAAAABHwAAAAABfgAAAAAAPAAAAAAAPAAAAAAAPAAAAAAAfgAAAAAAHwAAAAACHwAAAAABHwAAAAAAHwAAAAACfgAAAAAAPgAAAAAAPgAAAAAAPgAAAAAAfgAAAAAAHwAAAAACHwAAAAACfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAADfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAHwAAAAABHwAAAAAAHwAAAAADHwAAAAABHwAAAAAAJAAAAAABfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAHwAAAAAAHwAAAAACHwAAAAABHwAAAAACHwAAAAABJAAAAAABfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAATwAAAAAATwAAAAAAHwAAAAACHwAAAAABfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAATwAAAAAAHwAAAAAAHwAAAAABJAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAHwAAAAADHwAAAAADJAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAHwAAAAABHwAAAAABfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAA version: 6 0,-1: ind: 0,-1 - tiles: AAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATgAAAAAATgAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAHQAAAAACeQAAAAAAWQAAAAADeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATgAAAAAATgAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAHQAAAAACWQAAAAABWQAAAAAAWQAAAAABaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAHQAAAAABeQAAAAAAWQAAAAACeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAHQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAHQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAHQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAHQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAeQAAAAAAbAAAAAABbAAAAAADbAAAAAAAbAAAAAABbAAAAAACbAAAAAAAbAAAAAADbAAAAAACbAAAAAAAbAAAAAADbAAAAAABeQAAAAAAHQAAAAAAdgAAAAACHQAAAAACeQAAAAAAbAAAAAABbAAAAAAAbAAAAAACbAAAAAAAbAAAAAABbAAAAAACbAAAAAAAbAAAAAAAbAAAAAADbAAAAAADbAAAAAADeQAAAAAAHQAAAAAAdgAAAAABHQAAAAACeQAAAAAAbAAAAAACbAAAAAADbAAAAAADbAAAAAACbAAAAAADbAAAAAACbAAAAAAAbAAAAAADbAAAAAACbAAAAAACbAAAAAACeQAAAAAAHQAAAAAAdgAAAAADHQAAAAACeQAAAAAAeQAAAAAAbAAAAAADbAAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAADbAAAAAABbAAAAAADeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAACeQAAAAAAbAAAAAACbAAAAAAAbAAAAAABeQAAAAAAbAAAAAACbAAAAAABbAAAAAABeQAAAAAAbAAAAAACbAAAAAADbAAAAAACeQAAAAAAHQAAAAABHQAAAAAD + tiles: AAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAbAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAUAAAAAAAUAAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAbAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAfgAAAAAAXQAAAAAAfgAAAAAAbAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAUAAAAAAAUAAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAHwAAAAAAXQAAAAABXQAAAAADXQAAAAACbAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAHwAAAAADfgAAAAAAXQAAAAACfgAAAAAAbAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAHwAAAAABfgAAAAAAfgAAAAAAfgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAHwAAAAACfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAHwAAAAABfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAHwAAAAADfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAHwAAAAACfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAHwAAAAACfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAACfgAAAAAAcAAAAAAAcAAAAAABcAAAAAACcAAAAAADcAAAAAAAcAAAAAAAcAAAAAABcAAAAAADcAAAAAACcAAAAAADcAAAAAACfgAAAAAAHwAAAAADegAAAAADHwAAAAACfgAAAAAAcAAAAAABcAAAAAADcAAAAAAAcAAAAAACcAAAAAADcAAAAAACcAAAAAADcAAAAAAAcAAAAAACcAAAAAACcAAAAAAAfgAAAAAAHwAAAAADegAAAAABHwAAAAABfgAAAAAAcAAAAAAAcAAAAAADcAAAAAABcAAAAAAAcAAAAAACcAAAAAABcAAAAAACcAAAAAACcAAAAAAAcAAAAAACcAAAAAABfgAAAAAAHwAAAAAAegAAAAADHwAAAAACfgAAAAAAfgAAAAAAcAAAAAADcAAAAAADfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAcAAAAAADcAAAAAADcAAAAAADfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAAAfgAAAAAAcAAAAAABcAAAAAACcAAAAAACfgAAAAAAcAAAAAAAcAAAAAAAcAAAAAAAfgAAAAAAcAAAAAABcAAAAAABcAAAAAADfgAAAAAAHwAAAAABHwAAAAAC version: 6 -2,0: ind: -2,0 - tiles: AAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAaAAAAAAAagAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAaAAAAAAAagAAAAADaQAAAAAAaQAAAAAAaQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAWQAAAAACWQAAAAABWQAAAAACeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAADWQAAAAAAWQAAAAAAWQAAAAABWQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAABWQAAAAABWQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAbAAAAAAAbgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAbAAAAAAAbgAAAAABbQAAAAAAbQAAAAAAbQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAfgAAAAAAXQAAAAAAXQAAAAACXQAAAAABfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAXQAAAAABXQAAAAAAXQAAAAABXQAAAAACXQAAAAACfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAXQAAAAABXQAAAAABXQAAAAADfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 -2,-1: ind: -2,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAWQAAAAABWQAAAAACWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAABWQAAAAAAWQAAAAABeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAACWQAAAAACWQAAAAACeQAAAAAAWQAAAAABWQAAAAAAWQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAWQAAAAAAWQAAAAABWQAAAAACAAAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAAaAAAAAAAagAAAAABaQAAAAAAaQAAAAAAaQAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAXQAAAAABXQAAAAADXQAAAAADfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAXQAAAAADXQAAAAAAXQAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAXQAAAAABXQAAAAAAXQAAAAADfgAAAAAAXQAAAAACXQAAAAACXQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAbAAAAAAAfgAAAAAAXQAAAAABXQAAAAACXQAAAAABAAAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAATwAAAAAATwAAAAAATwAAAAAAbAAAAAAAbgAAAAABbQAAAAAAbQAAAAAAbQAAAAAA version: 6 0,-2: ind: 0,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfQAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 0,1: ind: 0,1 - tiles: eQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAADHQAAAAADdgAAAAABdgAAAAAAdgAAAAADHQAAAAACHQAAAAABeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAdgAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAdgAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAdgAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAdgAAAAACeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAdgAAAAACeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAdgAAAAACeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAATQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: fgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAAAHwAAAAADegAAAAABegAAAAADegAAAAADHwAAAAACHwAAAAACfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAegAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAegAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAATwAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 1,0: ind: 1,0 - tiles: HQAAAAABHQAAAAAAHQAAAAADHQAAAAACHQAAAAABHQAAAAABHQAAAAABHQAAAAABHQAAAAADHQAAAAACHQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAAAHQAAAAACHQAAAAACHQAAAAADeQAAAAAAHQAAAAACHQAAAAAAHQAAAAABHQAAAAAAHQAAAAABHQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAADeQAAAAAAHQAAAAADeQAAAAAAeQAAAAAAHQAAAAAAHQAAAAAAHQAAAAABHQAAAAADHQAAAAAAHQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAACeQAAAAAAHQAAAAACHQAAAAABeQAAAAAAHQAAAAADHQAAAAACHQAAAAAAHQAAAAAAHQAAAAADeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAACeQAAAAAAHQAAAAADHQAAAAADeQAAAAAAeQAAAAAAHQAAAAABHQAAAAADHQAAAAABeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAADeQAAAAAAHQAAAAAAHQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: HwAAAAADHwAAAAABHwAAAAAAHwAAAAAAHwAAAAADHwAAAAABHwAAAAABHwAAAAACHwAAAAAAHwAAAAABHwAAAAABfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAADHwAAAAAAHwAAAAADHwAAAAACfgAAAAAAHwAAAAADHwAAAAADHwAAAAAAHwAAAAABHwAAAAADHwAAAAADfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACfgAAAAAAHwAAAAAAfgAAAAAAfgAAAAAAHwAAAAACHwAAAAAAHwAAAAACHwAAAAABHwAAAAABHwAAAAADfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACfgAAAAAAHwAAAAAAHwAAAAABfgAAAAAAHwAAAAABHwAAAAABHwAAAAADHwAAAAADHwAAAAADfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABfgAAAAAAHwAAAAAAHwAAAAABfgAAAAAAfgAAAAAAHwAAAAACHwAAAAAAHwAAAAABfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAACfgAAAAAAHwAAAAAAHwAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 1,-1: ind: 1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdgAAAAADdgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdgAAAAABdgAAAAAAHQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAdgAAAAABdgAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdgAAAAAAdgAAAAAAdgAAAAACHQAAAAAAeQAAAAAAdgAAAAAAdgAAAAACdgAAAAACdgAAAAACdgAAAAADeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAACHQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQAAAAABHQAAAAACHQAAAAAAHQAAAAABeQAAAAAAHQAAAAADHQAAAAAAHQAAAAACHQAAAAADHQAAAAABHQAAAAABeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAegAAAAADegAAAAAAegAAAAACHwAAAAACfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAegAAAAADegAAAAADegAAAAACHwAAAAADfgAAAAAAegAAAAABegAAAAADegAAAAACegAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAegAAAAAAegAAAAABegAAAAAAHwAAAAABfgAAAAAAegAAAAADegAAAAABegAAAAABegAAAAACegAAAAADfgAAAAAAfQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAABHwAAAAADfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAHwAAAAABfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwAAAAADHwAAAAAAHwAAAAADHwAAAAADfgAAAAAAHwAAAAABHwAAAAADHwAAAAADHwAAAAADHwAAAAABHwAAAAACfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + -1,1: + ind: -1,1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAfgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 - type: Broadphase - type: Physics @@ -1034,8 +1038,7 @@ entities: -1,-3: 0: 65535 -1,-2: - 0: 65519 - 1: 16 + 0: 65535 -1,-4: 0: 60544 0,1: @@ -1053,22 +1056,17 @@ entities: 1,3: 0: 65535 2,0: - 0: 65519 - 1: 16 + 0: 65535 2,1: - 0: 65407 - 1: 128 + 0: 65535 2,2: - 0: 32767 - 1: 32768 + 0: 65535 2,3: - 0: 65527 - 1: 8 + 0: 65535 3,0: 0: 65535 3,1: - 0: 8175 - 1: 16 + 0: 8191 3,2: 0: 4369 3,3: @@ -1076,55 +1074,45 @@ entities: -4,0: 0: 65535 -4,1: - 0: 65533 - 1: 2 + 0: 65535 -4,2: 0: 243 -3,0: 0: 65535 -3,1: - 0: 65503 - 1: 32 + 0: 65535 -3,2: 0: 241 -2,0: - 0: 65471 - 1: 64 + 0: 65535 -2,1: - 0: 65407 - 1: 128 + 0: 65535 -2,2: - 0: 36091 - 1: 4 + 0: 36095 -1,1: 0: 65535 -1,2: - 0: 57343 - 1: 8192 + 0: 65535 -1,3: 0: 36079 0,-4: 0: 65532 0,-3: - 0: 65531 - 1: 4 + 0: 65535 0,-2: 0: 65535 1,-4: 0: 65535 1,-3: - 0: 53247 - 1: 12288 + 0: 65535 1,-2: - 0: 61327 - 1: 4208 + 0: 65535 1,-1: - 0: 65503 - 1: 32 + 0: 65535 2,-4: 0: 63993 - 2: 6 - 3: 1536 + 1: 6 + 2: 1536 2,-3: 0: 65535 2,-2: @@ -1136,29 +1124,23 @@ entities: 3,-3: 0: 13107 3,-2: - 0: 48947 - 1: 16384 + 0: 65331 3,-1: - 0: 65531 - 1: 4 + 0: 65535 -8,0: - 0: 63278 - 4: 64 + 0: 63342 -8,1: - 0: 55 - 4: 8 + 0: 63 -7,0: 0: 64751 -7,1: - 0: 140 - 4: 3 + 0: 143 -6,0: 0: 65535 -6,1: 0: 3327 -5,0: - 0: 57343 - 1: 8192 + 0: 65535 -5,1: 0: 65535 -5,2: @@ -1166,24 +1148,19 @@ entities: -8,-2: 0: 12288 -8,-1: - 0: 10231 - 4: 16392 + 0: 26623 -7,-1: - 0: 60668 - 4: 3 + 0: 60671 -7,-2: 0: 32768 -6,-2: 0: 64512 -6,-1: - 0: 65471 - 1: 64 + 0: 65535 -5,-2: - 0: 57088 - 1: 8192 + 0: 65280 -5,-1: - 0: 65493 - 1: 42 + 0: 65535 0,-5: 0: 34816 1,-5: @@ -1203,16 +1180,13 @@ entities: 3,4: 0: 1 4,0: - 0: 65407 - 1: 128 + 0: 65535 4,1: - 0: 3903 - 1: 192 + 0: 4095 5,0: 0: 65535 5,1: - 0: 507 - 1: 4 + 0: 511 6,0: 0: 65535 6,1: @@ -1224,8 +1198,7 @@ entities: 5,-2: 0: 61696 5,-1: - 0: 65503 - 1: 32 + 0: 65535 6,-2: 0: 12288 6,-1: @@ -1246,21 +1219,6 @@ entities: - 0 - 0 - 0 - - volume: 2500 - temperature: 293.15 - moles: - - 21.213781 - - 79.80423 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - volume: 2500 temperature: 293.15 moles: @@ -1291,21 +1249,6 @@ entities: - 0 - 0 - 0 - - volume: 2500 - temperature: 293.15 - moles: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 chunkSize: 4 - type: GasTileOverlay - type: RadiationGridResistance @@ -1337,8 +1280,6 @@ entities: entities: - uid: 1562 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-12.5 parent: 407 @@ -1346,8 +1287,6 @@ entities: entities: - uid: 1859 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-1.5 parent: 407 @@ -1362,8 +1301,6 @@ entities: entities: - uid: 1641 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,0.5 parent: 407 @@ -1378,11 +1315,16 @@ entities: entities: - uid: 1786 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,0.5 parent: 407 +- proto: AirlockExternalGlass + entities: + - uid: 1247 + components: + - type: Transform + pos: 7.5,17.5 + parent: 407 - proto: AirlockExternalGlassAtmosphericsLocked entities: - uid: 1242 @@ -1416,25 +1358,6 @@ entities: - type: Transform pos: 1.5,14.5 parent: 407 - - type: DeviceLinkSink - links: - - 1247 - - type: DeviceLinkSource - linkedPorts: - 1247: - - DoorStatus: DoorBolt - - uid: 1247 - components: - - type: Transform - pos: 1.5,16.5 - parent: 407 - - type: DeviceLinkSink - links: - - 1246 - - type: DeviceLinkSource - linkedPorts: - 1246: - - DoorStatus: DoorBolt - proto: AirlockExternalGlassEngineeringLocked entities: - uid: 1244 @@ -1461,13 +1384,33 @@ entities: linkedPorts: 1244: - DoorStatus: DoorBolt +- proto: AirlockExternalGlassShuttleArrivals + entities: + - uid: 241 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 13.5,10.5 + parent: 407 + - uid: 242 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 13.5,12.5 + parent: 407 - proto: AirlockExternalGlassShuttleLocked entities: - - uid: 1030 + - uid: 1031 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -0.5,17.5 + parent: 407 + - uid: 1106 components: - type: Transform rot: 3.141592653589793 rad - pos: 7.5,23.5 + pos: -2.5,17.5 parent: 407 - proto: AirlockGlass entities: @@ -1486,11 +1429,6 @@ entities: - type: Transform pos: 8.5,6.5 parent: 407 - - uid: 1571 - components: - - type: Transform - pos: 7.5,17.5 - parent: 407 - uid: 1572 components: - type: Transform @@ -1511,12 +1449,18 @@ entities: - type: Transform pos: -2.5,1.5 parent: 407 +- proto: AirlockGlassShuttle + entities: + - uid: 215 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 7.5,19.5 + parent: 407 - proto: AirlockJanitorLocked entities: - uid: 1673 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-7.5 parent: 407 @@ -1524,8 +1468,6 @@ entities: entities: - uid: 1240 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-6.5 parent: 407 @@ -1533,8 +1475,6 @@ entities: entities: - uid: 1241 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-5.5 parent: 407 @@ -1578,15 +1518,11 @@ entities: entities: - uid: 2122 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-1.5 parent: 407 - uid: 2123 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-1.5 parent: 407 @@ -1696,10 +1632,30 @@ entities: parent: 407 - proto: AtmosDeviceFanTiny entities: - - uid: 242 + - uid: 211 + components: + - type: Transform + pos: 7.5,19.5 + parent: 407 + - uid: 212 + components: + - type: Transform + pos: 13.5,10.5 + parent: 407 + - uid: 386 + components: + - type: Transform + pos: 13.5,12.5 + parent: 407 + - uid: 2151 + components: + - type: Transform + pos: -2.5,17.5 + parent: 407 + - uid: 2163 components: - type: Transform - pos: 7.5,23.5 + pos: -0.5,17.5 parent: 407 - proto: AtmosFixNitrogenMarker entities: @@ -1805,8 +1761,6 @@ entities: entities: - uid: 1250 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,10.5 parent: 407 @@ -1831,6 +1785,13 @@ entities: - type: Transform pos: 2.4605155,-3.2763605 parent: 407 +- proto: BoxFolderQmClipboard + entities: + - uid: 2166 + components: + - type: Transform + pos: -1.5352863,14.547528 + parent: 407 - proto: BoxHandcuff entities: - uid: 2103 @@ -3531,16 +3492,6 @@ entities: - type: Transform pos: 11.5,11.5 parent: 407 - - uid: 1010 - components: - - type: Transform - pos: 12.5,11.5 - parent: 407 - - uid: 1011 - components: - - type: Transform - pos: 12.5,12.5 - parent: 407 - uid: 1012 components: - type: Transform @@ -3606,25 +3557,25 @@ entities: - type: Transform pos: 6.5,7.5 parent: 407 - - uid: 2137 + - uid: 1571 components: - type: Transform - pos: 7.5,18.5 + pos: 0.5,15.5 parent: 407 - - uid: 2147 + - uid: 1656 components: - type: Transform - pos: 7.5,17.5 + pos: -0.5,15.5 parent: 407 - - uid: 2163 + - uid: 1725 components: - type: Transform - pos: 7.5,19.5 + pos: -1.5,15.5 parent: 407 - - uid: 2166 + - uid: 1886 components: - type: Transform - pos: 7.5,20.5 + pos: -2.5,15.5 parent: 407 - uid: 2186 components: @@ -3666,16 +3617,6 @@ entities: - type: Transform pos: 10.5,-8.5 parent: 407 - - uid: 2210 - components: - - type: Transform - pos: 7.5,22.5 - parent: 407 - - uid: 2211 - components: - - type: Transform - pos: 7.5,21.5 - parent: 407 - proto: CableHV entities: - uid: 243 @@ -5244,6 +5185,11 @@ entities: parent: 407 - proto: CarpetSBlue entities: + - uid: 232 + components: + - type: Transform + pos: 7.5,16.5 + parent: 407 - uid: 1675 components: - type: Transform @@ -5379,11 +5325,6 @@ entities: - type: Transform pos: 7.5,15.5 parent: 407 - - uid: 2043 - components: - - type: Transform - pos: 7.5,16.5 - parent: 407 - uid: 2044 components: - type: Transform @@ -5616,6 +5557,16 @@ entities: - type: Transform pos: 8.5,-6.5 parent: 407 + - uid: 1953 + components: + - type: Transform + pos: -1.5,14.5 + parent: 407 + - uid: 1954 + components: + - type: Transform + pos: -2.5,14.5 + parent: 407 - proto: Chair entities: - uid: 1564 @@ -5827,6 +5778,11 @@ entities: parent: 407 - proto: ClosetEmergencyFilledRandom entities: + - uid: 1033 + components: + - type: Transform + pos: 12.5,13.5 + parent: 407 - uid: 1846 components: - type: Transform @@ -5837,11 +5793,6 @@ entities: - type: Transform pos: 5.5,-8.5 parent: 407 - - uid: 2015 - components: - - type: Transform - pos: 11.5,12.5 - parent: 407 - uid: 2216 components: - type: Transform @@ -5859,10 +5810,10 @@ entities: parent: 407 - proto: ClosetFireFilled entities: - - uid: 2016 + - uid: 259 components: - type: Transform - pos: 11.5,11.5 + pos: 11.5,13.5 parent: 407 - proto: ClosetJanitorFilled entities: @@ -5952,8 +5903,6 @@ entities: entities: - uid: 1660 components: - - type: MetaData - flags: InContainer - type: Transform parent: 1659 - type: Physics @@ -6031,8 +5980,6 @@ entities: entities: - uid: 1662 components: - - type: MetaData - flags: InContainer - type: Transform parent: 1659 - type: Physics @@ -6042,8 +5989,6 @@ entities: entities: - uid: 1981 components: - - type: MetaData - flags: InContainer - type: Transform parent: 1980 - type: Physics @@ -6072,8 +6017,6 @@ entities: entities: - uid: 1661 components: - - type: MetaData - flags: InContainer - type: Transform parent: 1659 - type: Physics @@ -6273,10 +6216,10 @@ entities: parent: 407 - proto: ComputerRadar entities: - - uid: 1953 + - uid: 1396 components: - type: Transform - pos: 0.5,15.5 + pos: 1.5,16.5 parent: 407 - uid: 2095 components: @@ -6363,10 +6306,10 @@ entities: parent: 407 - proto: CrateArtifactContainer entities: - - uid: 1975 + - uid: 1035 components: - type: Transform - pos: -2.5,11.5 + pos: -2.5,12.5 parent: 407 - proto: CrateEngineeringCableBulk entities: @@ -6389,6 +6332,9 @@ entities: - type: Transform pos: 2.5,-2.5 parent: 407 + - type: SingletonDeviceNetServer + active: False + available: False - proto: CryogenicSleepUnitSpawnerLateJoin entities: - uid: 1753 @@ -6964,8 +6910,6 @@ entities: entities: - uid: 1982 components: - - type: MetaData - flags: InContainer - type: Transform parent: 1980 - type: Physics @@ -7257,10 +7201,10 @@ entities: parent: 407 - proto: FloorDrain entities: - - uid: 1656 + - uid: 1011 components: - type: Transform - pos: -5.5,3.5 + pos: -4.5,3.5 parent: 407 - type: Fixtures fixtures: {} @@ -7316,6 +7260,22 @@ entities: joinedGrid: 407 - proto: GasPassiveVent entities: + - uid: 238 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,-13.5 + parent: 407 + - type: AtmosDevice + joinedGrid: 407 + - uid: 239 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 9.5,-15.5 + parent: 407 + - type: AtmosDevice + joinedGrid: 407 - uid: 1538 components: - type: Transform @@ -7500,14 +7460,6 @@ entities: parent: 407 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 1390 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 7.5,15.5 - parent: 407 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 1401 components: - type: Transform @@ -7622,6 +7574,11 @@ entities: color: '#0335FCFF' - proto: GasPipeStraight entities: + - uid: 237 + components: + - type: Transform + pos: 5.5,15.5 + parent: 407 - uid: 676 components: - type: Transform @@ -8122,59 +8079,27 @@ entities: parent: 407 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 1391 + - uid: 1404 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 6.5,15.5 + rot: 3.141592653589793 rad + pos: -0.5,1.5 parent: 407 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 1392 + - uid: 1405 components: - type: Transform rot: 3.141592653589793 rad - pos: 7.5,16.5 + pos: -0.5,2.5 parent: 407 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 1393 + - uid: 1406 components: - type: Transform rot: 3.141592653589793 rad - pos: 7.5,17.5 - parent: 407 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 1394 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 7.5,18.5 - parent: 407 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 1404 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -0.5,1.5 - parent: 407 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 1405 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -0.5,2.5 - parent: 407 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 1406 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -1.5,4.5 + pos: -1.5,4.5 parent: 407 - type: AtmosPipeColor color: '#0335FCFF' @@ -8590,14 +8515,6 @@ entities: parent: 407 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 1389 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 5.5,15.5 - parent: 407 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 1400 components: - type: Transform @@ -8687,22 +8604,6 @@ entities: parent: 407 - proto: GasPort entities: - - uid: 1260 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 9.5,-15.5 - parent: 407 - - type: AtmosDevice - joinedGrid: 407 - - uid: 1261 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 9.5,-13.5 - parent: 407 - - type: AtmosDevice - joinedGrid: 407 - uid: 1272 components: - type: Transform @@ -8946,15 +8847,6 @@ entities: joinedGrid: 407 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 1396 - components: - - type: Transform - pos: 7.5,19.5 - parent: 407 - - type: AtmosDevice - joinedGrid: 407 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 1397 components: - type: Transform @@ -9121,35 +9013,40 @@ entities: - type: Transform pos: -30.5,-1.5 parent: 407 - - uid: 1031 + - uid: 222 components: - type: Transform - pos: 6.5,20.5 + pos: 6.5,18.5 parent: 407 - - uid: 1032 + - uid: 224 components: - type: Transform - pos: 6.5,21.5 + pos: 8.5,17.5 parent: 407 - - uid: 1033 + - uid: 226 components: - type: Transform - pos: 8.5,20.5 + pos: 8.5,18.5 parent: 407 - - uid: 1034 + - uid: 235 components: - type: Transform - pos: 8.5,21.5 + pos: 6.5,19.5 parent: 407 - - uid: 1035 + - uid: 236 + components: + - type: Transform + pos: 8.5,19.5 + parent: 407 + - uid: 256 components: - type: Transform - pos: 12.5,12.5 + pos: -1.5,17.5 parent: 407 - uid: 1036 components: - type: Transform - pos: 12.5,11.5 + pos: 2.5,17.5 parent: 407 - uid: 1037 components: @@ -9489,17 +9386,17 @@ entities: - uid: 1105 components: - type: Transform - pos: 0.5,16.5 + pos: 0.5,17.5 parent: 407 - - uid: 1106 + - uid: 1107 components: - type: Transform - pos: 2.5,16.5 + pos: 2.5,14.5 parent: 407 - - uid: 1107 + - uid: 1113 components: - type: Transform - pos: 2.5,14.5 + pos: 6.5,17.5 parent: 407 - uid: 1148 components: @@ -9598,6 +9495,13 @@ entities: - type: Transform pos: -26.5,-0.5 parent: 407 +- proto: HandheldCrewMonitor + entities: + - uid: 2137 + components: + - type: Transform + pos: 10.650544,-4.5766006 + parent: 407 - proto: HandTeleporter entities: - uid: 1813 @@ -9607,8 +9511,6 @@ entities: parent: 407 - uid: 1983 components: - - type: MetaData - flags: InContainer - type: Transform parent: 1980 - type: Physics @@ -9731,6 +9633,13 @@ entities: - type: Transform pos: 12.5,1.5 parent: 407 +- proto: KitchenSpike + entities: + - uid: 1394 + components: + - type: Transform + pos: -5.5,3.5 + parent: 407 - proto: Lamp entities: - uid: 2127 @@ -10070,15 +9979,11 @@ entities: entities: - uid: 1098 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,3.5 parent: 407 - uid: 2094 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,13.5 parent: 407 @@ -10160,13 +10065,6 @@ entities: - type: Transform pos: -19.5,-2.5 parent: 407 -- proto: PosterLegit50thAnniversaryVintageReprint - entities: - - uid: 2151 - components: - - type: Transform - pos: -2.5,12.5 - parent: 407 - proto: PosterLegitAnatomyPoster entities: - uid: 2214 @@ -10285,6 +10183,13 @@ entities: - type: Transform pos: -4.5,6.5 parent: 407 +- proto: PosterLegitScience + entities: + - uid: 2043 + components: + - type: Transform + pos: -1.5,13.5 + parent: 407 - proto: PosterLegitSecWatch entities: - uid: 2113 @@ -10409,16 +10314,12 @@ entities: entities: - uid: 206 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 0.5,9.5 parent: 407 - uid: 1479 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -18.5,4.5 @@ -10427,8 +10328,6 @@ entities: powerLoad: 0 - uid: 1480 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -16.5,6.5 @@ -10437,8 +10336,6 @@ entities: powerLoad: 0 - uid: 1481 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -17.5,-4.5 @@ -10447,8 +10344,6 @@ entities: powerLoad: 0 - uid: 1482 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -14.5,-0.5 @@ -10457,8 +10352,6 @@ entities: powerLoad: 0 - uid: 1483 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -11.5,-4.5 @@ -10467,26 +10360,12 @@ entities: powerLoad: 0 - uid: 1491 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -1.5,9.5 parent: 407 - - uid: 1492 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,15.5 - parent: 407 - - type: ApcPowerReceiver - powerLoad: 0 - uid: 1493 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 5.5,9.5 @@ -10495,8 +10374,6 @@ entities: powerLoad: 0 - uid: 1494 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 5.5,14.5 @@ -10505,8 +10382,6 @@ entities: powerLoad: 0 - uid: 1495 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 10.5,14.5 @@ -10515,28 +10390,14 @@ entities: powerLoad: 0 - uid: 1496 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 10.5,9.5 parent: 407 - type: ApcPowerReceiver powerLoad: 0 - - uid: 1497 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,19.5 - parent: 407 - - type: ApcPowerReceiver - powerLoad: 0 - uid: 1498 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,5.5 parent: 407 @@ -10544,8 +10405,6 @@ entities: powerLoad: 0 - uid: 1499 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,5.5 parent: 407 @@ -10553,8 +10412,6 @@ entities: powerLoad: 0 - uid: 1500 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 16.5,4.5 @@ -10563,8 +10420,6 @@ entities: powerLoad: 0 - uid: 1501 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 6.5,-0.5 @@ -10573,8 +10428,6 @@ entities: powerLoad: 0 - uid: 1502 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 4.5,-0.5 @@ -10583,8 +10436,6 @@ entities: powerLoad: 0 - uid: 1503 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 0.5,-1.5 @@ -10593,8 +10444,6 @@ entities: powerLoad: 0 - uid: 1504 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 0.5,-10.5 @@ -10603,8 +10452,6 @@ entities: powerLoad: 0 - uid: 1505 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 7.5,-14.5 @@ -10613,8 +10460,6 @@ entities: powerLoad: 0 - uid: 1506 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 10.5,-13.5 @@ -10623,8 +10468,6 @@ entities: powerLoad: 0 - uid: 1507 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 10.5,-15.5 @@ -10633,8 +10476,6 @@ entities: powerLoad: 0 - uid: 1508 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-10.5 parent: 407 @@ -10642,8 +10483,6 @@ entities: powerLoad: 0 - uid: 1516 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,1.5 parent: 407 @@ -10651,8 +10490,6 @@ entities: powerLoad: 0 - uid: 1518 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 19.5,-3.5 @@ -10661,8 +10498,6 @@ entities: powerLoad: 0 - uid: 1519 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 24.5,-0.5 @@ -10671,8 +10506,6 @@ entities: powerLoad: 0 - uid: 1520 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 14.5,-3.5 @@ -10681,8 +10514,6 @@ entities: powerLoad: 0 - uid: 1521 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 21.5,3.5 @@ -10691,8 +10522,6 @@ entities: powerLoad: 0 - uid: 1522 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 19.5,-0.5 @@ -10701,8 +10530,6 @@ entities: powerLoad: 0 - uid: 1523 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 14.5,-0.5 @@ -10711,8 +10538,6 @@ entities: powerLoad: 0 - uid: 1919 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,1.5 parent: 407 @@ -10720,8 +10545,6 @@ entities: powerLoad: 0 - uid: 2130 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -7.5,-4.5 @@ -10732,8 +10555,6 @@ entities: entities: - uid: 1475 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -25.5,3.5 @@ -10742,8 +10563,6 @@ entities: powerLoad: 0 - uid: 1476 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -25.5,-2.5 @@ -10752,8 +10571,6 @@ entities: powerLoad: 0 - uid: 1509 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 13.5,-9.5 @@ -10762,8 +10579,6 @@ entities: powerLoad: 0 - uid: 1524 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -18.5,8.5 @@ -10774,8 +10589,6 @@ entities: entities: - uid: 1477 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -20.5,-1.5 @@ -10784,8 +10597,6 @@ entities: powerLoad: 0 - uid: 1478 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -20.5,2.5 @@ -10888,6 +10699,18 @@ entities: rot: 3.141592653589793 rad pos: 2.5,-4.5 parent: 407 + - uid: 1975 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -2.5,15.5 + parent: 407 + - uid: 2015 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,15.5 + parent: 407 - proto: Protolathe entities: - uid: 205 @@ -10932,6 +10755,11 @@ entities: - type: Transform pos: 18.5,5.5 parent: 407 + - uid: 2147 + components: + - type: Transform + pos: -1.5,14.5 + parent: 407 - proto: RadiationCollector entities: - uid: 404 @@ -11002,6 +10830,17 @@ entities: parent: 407 - proto: RailingCornerSmall entities: + - uid: 223 + components: + - type: Transform + pos: 11.5,13.5 + parent: 407 + - uid: 1010 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 11.5,10.5 + parent: 407 - uid: 2030 components: - type: Transform @@ -11097,11 +10936,11 @@ entities: parent: 407 - proto: SalvageMagnet entities: - - uid: 1954 + - uid: 1492 components: - type: Transform rot: 3.141592653589793 rad - pos: 2.5,15.5 + pos: 2.5,16.5 parent: 407 - proto: Screen entities: @@ -11238,8 +11077,6 @@ entities: entities: - uid: 1252 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -19.5,-0.5 @@ -11249,8 +11086,6 @@ entities: - 1255 - uid: 1253 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -19.5,0.5 @@ -11260,8 +11095,6 @@ entities: - 1255 - uid: 1254 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -19.5,1.5 @@ -11439,47 +11272,42 @@ entities: - uid: 214 components: - type: Transform - pos: 2.5,16.5 - parent: 407 - - uid: 215 - components: - - type: Transform - pos: 0.5,16.5 + pos: 13.5,11.5 parent: 407 - uid: 216 components: - type: Transform pos: 2.5,14.5 parent: 407 - - uid: 234 + - uid: 225 components: - type: Transform - pos: 6.5,20.5 + pos: 8.5,19.5 parent: 407 - - uid: 235 + - uid: 227 components: - type: Transform - pos: 6.5,21.5 + pos: -1.5,17.5 parent: 407 - - uid: 236 + - uid: 229 components: - type: Transform - pos: 8.5,20.5 + pos: 6.5,17.5 parent: 407 - - uid: 237 + - uid: 234 components: - type: Transform - pos: 8.5,21.5 + pos: 8.5,17.5 parent: 407 - - uid: 253 + - uid: 255 components: - type: Transform - pos: 12.5,11.5 + pos: 2.5,17.5 parent: 407 - - uid: 254 + - uid: 261 components: - type: Transform - pos: 12.5,12.5 + pos: 0.5,17.5 parent: 407 - uid: 272 components: @@ -11696,6 +11524,21 @@ entities: - type: Transform pos: -24.5,2.5 parent: 407 + - uid: 1032 + components: + - type: Transform + pos: 8.5,18.5 + parent: 407 + - uid: 1112 + components: + - type: Transform + pos: 6.5,18.5 + parent: 407 + - uid: 1260 + components: + - type: Transform + pos: 6.5,19.5 + parent: 407 - proto: SignalButton entities: - uid: 1251 @@ -11768,6 +11611,13 @@ entities: - type: Transform pos: -2.5,2.5 parent: 407 +- proto: SignCargoDock + entities: + - uid: 2016 + components: + - type: Transform + pos: 3.5,14.5 + parent: 407 - proto: SignChem entities: - uid: 1744 @@ -11861,11 +11711,11 @@ entities: parent: 407 - proto: SinkWide entities: - - uid: 1725 + - uid: 228 components: - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,3.5 + rot: -1.5707963267948966 rad + pos: -4.5,3.5 parent: 407 - uid: 1726 components: @@ -11895,8 +11745,6 @@ entities: entities: - uid: 1579 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -6.5,3.5 parent: 407 @@ -11926,20 +11774,25 @@ entities: - type: Transform pos: -9.5,5.5 parent: 407 -- proto: SpawnMobCorgi +- proto: SpaceHeater entities: - - uid: 1826 + - uid: 1114 components: - type: Transform - pos: 18.5,-3.5 + pos: 6.5,-15.5 parent: 407 -- proto: SpawnMobFoxRenault +- proto: SpawnMobCorgi entities: - - uid: 1886 + - uid: 1030 components: - type: Transform pos: 21.5,-3.5 parent: 407 + - uid: 1826 + components: + - type: Transform + pos: 18.5,-3.5 + parent: 407 - proto: SpawnPointAtmos entities: - uid: 1814 @@ -12712,28 +12565,6 @@ entities: rot: 3.141592653589793 rad pos: 5.5,-17.5 parent: 407 - - uid: 1112 - components: - - type: Transform - pos: 5.5,18.5 - parent: 407 - - uid: 1113 - components: - - type: Transform - pos: 9.5,18.5 - parent: 407 - - uid: 1114 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 12.5,14.5 - parent: 407 - - uid: 1115 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 12.5,9.5 - parent: 407 - uid: 1116 components: - type: Transform @@ -12758,6 +12589,12 @@ entities: rot: 1.5707963267948966 rad pos: -31.5,4.5 parent: 407 + - uid: 1261 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,15.5 + parent: 407 - proto: ToolboxEmergencyFilled entities: - uid: 1824 @@ -12810,8 +12647,6 @@ entities: entities: - uid: 1776 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -7.5,5.5 parent: 407 @@ -12840,8 +12675,6 @@ entities: entities: - uid: 1566 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -2.5,-10.5 parent: 407 @@ -12849,8 +12682,6 @@ entities: entities: - uid: 1485 components: - - type: MetaData - flags: SessionSpecific - type: Transform rot: 3.141592653589793 rad pos: -3.5,2.5 @@ -12859,8 +12690,6 @@ entities: entities: - uid: 1654 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -5.5,5.5 parent: 407 @@ -12868,8 +12697,6 @@ entities: entities: - uid: 1811 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -18.5,-1.5 parent: 407 @@ -12884,8 +12711,6 @@ entities: entities: - uid: 1658 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -6.5,-6.5 parent: 407 @@ -12893,17 +12718,20 @@ entities: entities: - uid: 1746 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 2.5,-4.5 parent: 407 +- proto: VendingMachineSalvage + entities: + - uid: 1497 + components: + - type: Transform + pos: -2.5,14.5 + parent: 407 - proto: VendingMachineSec entities: - uid: 1910 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 15.5,-2.5 parent: 407 @@ -12911,8 +12739,6 @@ entities: entities: - uid: 2112 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 15.5,-0.5 parent: 407 @@ -12920,11 +12746,16 @@ entities: entities: - uid: 1780 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -13.5,5.5 parent: 407 +- proto: VendingMachineSnack + entities: + - uid: 240 + components: + - type: Transform + pos: 1.5,3.5 + parent: 407 - proto: VendingMachineSustenance entities: - uid: 1882 @@ -12943,15 +12774,11 @@ entities: entities: - uid: 1557 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 2.5,-13.5 parent: 407 - uid: 1805 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -16.5,2.5 parent: 407 @@ -12959,8 +12786,6 @@ entities: entities: - uid: 1789 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -18.5,4.5 parent: 407 @@ -12968,1987 +12793,1378 @@ entities: entities: - uid: 2 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-4.5 parent: 407 - uid: 3 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-12.5 parent: 407 - uid: 4 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-12.5 parent: 407 - uid: 5 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-12.5 parent: 407 - uid: 6 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-12.5 parent: 407 - uid: 7 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-13.5 parent: 407 - uid: 8 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-14.5 parent: 407 - uid: 9 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-15.5 parent: 407 - uid: 10 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-16.5 parent: 407 - uid: 11 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-14.5 parent: 407 - uid: 12 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-14.5 parent: 407 - uid: 13 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-14.5 parent: 407 - uid: 14 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-16.5 parent: 407 - uid: 15 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-16.5 parent: 407 - uid: 16 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-16.5 parent: 407 - uid: 17 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-17.5 parent: 407 - uid: 19 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-17.5 parent: 407 - uid: 20 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-17.5 parent: 407 - uid: 21 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-16.5 parent: 407 - uid: 22 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-16.5 parent: 407 - uid: 23 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-16.5 parent: 407 - uid: 24 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-16.5 parent: 407 - uid: 25 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-17.5 parent: 407 - uid: 26 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-14.5 parent: 407 - uid: 27 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-12.5 parent: 407 - uid: 28 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-9.5 parent: 407 - uid: 31 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-9.5 parent: 407 - uid: 32 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-9.5 parent: 407 - uid: 33 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-9.5 parent: 407 - uid: 34 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-9.5 parent: 407 - uid: 35 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-9.5 parent: 407 - uid: 36 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-9.5 parent: 407 - uid: 37 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-9.5 parent: 407 - uid: 38 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-9.5 parent: 407 - uid: 39 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-9.5 parent: 407 - uid: 40 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-10.5 parent: 407 - uid: 41 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-11.5 parent: 407 - uid: 42 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-11.5 parent: 407 - uid: 43 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-10.5 parent: 407 - uid: 44 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-9.5 parent: 407 - uid: 45 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-10.5 parent: 407 - uid: 46 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-13.5 parent: 407 - uid: 47 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-14.5 parent: 407 - uid: 48 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-14.5 parent: 407 - uid: 52 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-8.5 parent: 407 - uid: 53 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-7.5 parent: 407 - uid: 54 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-7.5 parent: 407 - uid: 56 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-5.5 parent: 407 - uid: 57 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-5.5 parent: 407 - uid: 58 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-5.5 parent: 407 - uid: 59 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-5.5 parent: 407 - uid: 60 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-5.5 parent: 407 - uid: 61 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-5.5 parent: 407 - uid: 62 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-5.5 parent: 407 - uid: 63 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-5.5 parent: 407 - uid: 64 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-5.5 parent: 407 - uid: 65 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-5.5 parent: 407 - uid: 66 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-5.5 parent: 407 - uid: 67 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-8.5 parent: 407 - uid: 68 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-7.5 parent: 407 - uid: 69 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-8.5 parent: 407 - uid: 75 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-12.5 parent: 407 - uid: 76 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-11.5 parent: 407 - uid: 77 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,-11.5 parent: 407 - uid: 78 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,-10.5 parent: 407 - uid: 79 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,-9.5 parent: 407 - uid: 80 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-9.5 parent: 407 - uid: 81 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-8.5 parent: 407 - uid: 82 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-6.5 parent: 407 - uid: 83 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-5.5 parent: 407 - uid: 84 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,-5.5 parent: 407 - uid: 85 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-5.5 parent: 407 - uid: 86 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,-5.5 parent: 407 - uid: 87 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-5.5 parent: 407 - uid: 88 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-5.5 parent: 407 - uid: 89 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-6.5 parent: 407 - uid: 90 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-7.5 parent: 407 - uid: 96 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-5.5 parent: 407 - uid: 97 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-5.5 parent: 407 - uid: 98 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-5.5 parent: 407 - uid: 99 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-5.5 parent: 407 - uid: 100 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-5.5 parent: 407 - uid: 101 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-5.5 parent: 407 - uid: 102 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-4.5 parent: 407 - uid: 103 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-3.5 parent: 407 - uid: 104 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-2.5 parent: 407 - uid: 105 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-1.5 parent: 407 - uid: 106 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-0.5 parent: 407 - uid: 107 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,1.5 parent: 407 - uid: 108 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,2.5 parent: 407 - uid: 109 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,3.5 parent: 407 - uid: 110 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,4.5 parent: 407 - uid: 111 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,5.5 parent: 407 - uid: 112 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,6.5 parent: 407 - uid: 113 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,7.5 parent: 407 - uid: 114 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,2.5 parent: 407 - uid: 116 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,4.5 parent: 407 - uid: 117 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,5.5 parent: 407 - uid: 118 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-1.5 parent: 407 - uid: 119 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-2.5 parent: 407 - uid: 120 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,5.5 parent: 407 - uid: 121 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-4.5 parent: 407 - uid: 122 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-4.5 parent: 407 - uid: 123 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-3.5 parent: 407 - uid: 124 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-3.5 parent: 407 - uid: 125 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-3.5 parent: 407 - uid: 126 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-3.5 parent: 407 - uid: 127 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-2.5 parent: 407 - uid: 128 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-2.5 parent: 407 - uid: 129 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,3.5 parent: 407 - uid: 130 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,3.5 parent: 407 - uid: 131 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,4.5 parent: 407 - uid: 132 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,4.5 parent: 407 - uid: 133 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,4.5 parent: 407 - uid: 134 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,4.5 parent: 407 - uid: 135 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,5.5 parent: 407 - uid: 136 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,6.5 parent: 407 - uid: 137 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,7.5 parent: 407 - uid: 140 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,-4.5 parent: 407 - uid: 141 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,-3.5 parent: 407 - uid: 142 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-3.5 parent: 407 - uid: 143 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-1.5 parent: 407 - uid: 144 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-2.5 parent: 407 - uid: 145 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-2.5 parent: 407 - uid: 146 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-1.5 parent: 407 - uid: 147 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,2.5 parent: 407 - uid: 148 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,3.5 parent: 407 - uid: 149 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,3.5 parent: 407 - uid: 150 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,4.5 parent: 407 - uid: 151 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,2.5 parent: 407 - uid: 152 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,4.5 parent: 407 - uid: 153 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,5.5 parent: 407 - uid: 154 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,5.5 parent: 407 - uid: 157 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,2.5 parent: 407 - uid: 158 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,2.5 parent: 407 - uid: 159 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,2.5 parent: 407 - uid: 160 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,3.5 parent: 407 - uid: 161 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,5.5 parent: 407 - uid: 162 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,6.5 parent: 407 - uid: 163 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,6.5 parent: 407 - uid: 164 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,6.5 parent: 407 - uid: 165 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,6.5 parent: 407 - uid: 166 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,6.5 parent: 407 - uid: 167 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,6.5 parent: 407 - uid: 168 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,5.5 parent: 407 - uid: 169 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,2.5 parent: 407 - uid: 170 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,2.5 parent: 407 - uid: 172 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,2.5 parent: 407 - uid: 173 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,3.5 parent: 407 - uid: 174 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,4.5 parent: 407 - uid: 175 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,5.5 parent: 407 - uid: 176 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,6.5 parent: 407 - uid: 177 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,6.5 parent: 407 - uid: 178 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,6.5 parent: 407 - uid: 179 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,6.5 parent: 407 - uid: 189 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-4.5 parent: 407 - uid: 190 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-3.5 parent: 407 - uid: 191 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-2.5 parent: 407 - uid: 192 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-1.5 parent: 407 - uid: 193 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,7.5 parent: 407 - uid: 194 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,8.5 parent: 407 - uid: 195 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,8.5 parent: 407 - uid: 196 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,9.5 parent: 407 - uid: 197 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,9.5 parent: 407 - uid: 198 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,10.5 parent: 407 - uid: 199 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,12.5 parent: 407 - uid: 200 components: - - type: MetaData - flags: PvsPriority - type: Transform - pos: -2.5,12.5 + pos: -3.5,14.5 parent: 407 - uid: 201 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,13.5 parent: 407 - uid: 202 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -1.5,13.5 parent: 407 - uid: 204 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,6.5 parent: 407 - uid: 207 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,9.5 parent: 407 - uid: 208 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,12.5 parent: 407 - uid: 209 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,13.5 parent: 407 - uid: 210 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,14.5 parent: 407 - - uid: 211 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: -1.5,14.5 - parent: 407 - - uid: 212 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: -0.5,15.5 - parent: 407 - uid: 217 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,14.5 parent: 407 - uid: 218 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,15.5 parent: 407 - uid: 219 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,16.5 parent: 407 - uid: 220 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,17.5 parent: 407 - uid: 221 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,17.5 parent: 407 - - uid: 222 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 4.5,18.5 - parent: 407 - - uid: 223 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 5.5,17.5 - parent: 407 - - uid: 224 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 6.5,17.5 - parent: 407 - - uid: 225 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 6.5,18.5 - parent: 407 - - uid: 226 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 6.5,19.5 - parent: 407 - - uid: 227 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 8.5,17.5 - parent: 407 - - uid: 228 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 8.5,18.5 - parent: 407 - - uid: 229 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 8.5,19.5 - parent: 407 - uid: 230 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,17.5 parent: 407 - uid: 231 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,17.5 parent: 407 - - uid: 232 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 10.5,18.5 - parent: 407 - uid: 233 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,17.5 parent: 407 - - uid: 238 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 6.5,22.5 - parent: 407 - - uid: 239 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 8.5,22.5 - parent: 407 - - uid: 240 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 8.5,23.5 - parent: 407 - - uid: 241 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 6.5,23.5 - parent: 407 - uid: 244 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,6.5 parent: 407 - uid: 245 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,7.5 parent: 407 - uid: 246 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,8.5 parent: 407 - uid: 247 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,9.5 parent: 407 - uid: 248 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,10.5 parent: 407 - uid: 249 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,11.5 parent: 407 - uid: 250 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,12.5 parent: 407 - uid: 252 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,14.5 parent: 407 - - uid: 255 + - uid: 253 components: - - type: MetaData - flags: PvsPriority - type: Transform - pos: 12.5,13.5 + pos: -3.5,17.5 parent: 407 - - uid: 256 + - uid: 254 components: - - type: MetaData - flags: PvsPriority - type: Transform - pos: 11.5,13.5 + pos: -3.5,15.5 parent: 407 - uid: 257 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,14.5 parent: 407 - uid: 258 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,15.5 parent: 407 - - uid: 259 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 12.5,15.5 - parent: 407 - uid: 260 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,16.5 parent: 407 - - uid: 261 - components: - - type: MetaData - flags: PvsPriority - - type: Transform - pos: 12.5,10.5 - parent: 407 - uid: 262 components: - - type: MetaData - flags: PvsPriority - type: Transform - pos: 11.5,10.5 + pos: -3.5,13.5 parent: 407 - uid: 263 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,9.5 parent: 407 - uid: 264 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,8.5 parent: 407 - uid: 265 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,8.5 parent: 407 - uid: 266 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,7.5 parent: 407 - uid: 267 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,6.5 parent: 407 - uid: 268 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,6.5 parent: 407 - uid: 269 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,6.5 parent: 407 - uid: 270 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,6.5 parent: 407 - uid: 271 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,6.5 parent: 407 - uid: 286 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-5.5 parent: 407 - uid: 287 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-5.5 parent: 407 - uid: 288 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-4.5 parent: 407 - uid: 289 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-3.5 parent: 407 - uid: 290 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-2.5 parent: 407 - uid: 291 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-1.5 parent: 407 - uid: 292 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-1.5 parent: 407 - uid: 293 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-1.5 parent: 407 - uid: 294 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-1.5 parent: 407 - uid: 295 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-1.5 parent: 407 - uid: 296 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-1.5 parent: 407 - uid: 297 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-2.5 parent: 407 - uid: 298 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-3.5 parent: 407 - uid: 299 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-4.5 parent: 407 - uid: 300 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-5.5 parent: 407 - uid: 301 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-5.5 parent: 407 - uid: 302 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-4.5 parent: 407 - uid: 303 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-4.5 parent: 407 - uid: 304 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-4.5 parent: 407 - uid: 305 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-1.5 parent: 407 - uid: 306 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-1.5 parent: 407 - uid: 307 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-1.5 parent: 407 - uid: 308 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-1.5 parent: 407 - uid: 309 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-1.5 parent: 407 - uid: 310 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-1.5 parent: 407 - uid: 311 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,6.5 parent: 407 - uid: 312 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,2.5 parent: 407 - uid: 313 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,5.5 parent: 407 - uid: 314 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,3.5 parent: 407 - uid: 315 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,4.5 parent: 407 - uid: 316 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,6.5 parent: 407 - uid: 317 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,6.5 parent: 407 - uid: 318 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,5.5 parent: 407 - uid: 319 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,4.5 parent: 407 - uid: 320 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,3.5 parent: 407 - uid: 321 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,2.5 parent: 407 - uid: 322 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,5.5 parent: 407 - uid: 323 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,5.5 parent: 407 - uid: 324 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,5.5 parent: 407 - uid: 336 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,6.5 parent: 407 - uid: 337 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,2.5 parent: 407 - uid: 338 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,2.5 parent: 407 - uid: 339 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,2.5 parent: 407 - uid: 340 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,2.5 parent: 407 - uid: 341 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,2.5 parent: 407 - uid: 342 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,2.5 parent: 407 - uid: 343 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,2.5 parent: 407 - uid: 344 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,2.5 parent: 407 - uid: 345 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,2.5 parent: 407 - uid: 346 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,2.5 parent: 407 - uid: 348 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,2.5 parent: 407 - uid: 349 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,2.5 parent: 407 - uid: 350 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,1.5 parent: 407 - uid: 351 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-0.5 parent: 407 - uid: 352 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-1.5 parent: 407 - uid: 353 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-1.5 parent: 407 - uid: 354 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-0.5 parent: 407 - uid: 355 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,1.5 parent: 407 - uid: 356 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-1.5 parent: 407 + - uid: 385 + components: + - type: Transform + pos: -3.5,16.5 + parent: 407 - uid: 393 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -7.5,-1.5 parent: 407 - uid: 394 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -11.5,-1.5 parent: 407 + - uid: 1034 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 12.5,14.5 + parent: 407 + - uid: 1115 + components: + - type: Transform + pos: 5.5,17.5 + parent: 407 + - uid: 1389 + components: + - type: Transform + pos: 12.5,9.5 + parent: 407 + - uid: 1390 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 13.5,14.5 + parent: 407 + - uid: 1391 + components: + - type: Transform + pos: 13.5,9.5 + parent: 407 + - uid: 1392 + components: + - type: Transform + pos: 13.5,13.5 + parent: 407 + - uid: 1393 + components: + - type: Transform + pos: 1.5,17.5 + parent: 407 - proto: WallShuttleDiagonal entities: - uid: 382 @@ -14969,17 +14185,6 @@ entities: rot: 1.5707963267948966 rad pos: 3.5,-17.5 parent: 407 - - uid: 385 - components: - - type: Transform - pos: 3.5,18.5 - parent: 407 - - uid: 386 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 11.5,18.5 - parent: 407 - uid: 387 components: - type: Transform diff --git a/Resources/Prototypes/Actions/crit.yml b/Resources/Prototypes/Actions/crit.yml index bdd09d697e..705ee6ee6b 100644 --- a/Resources/Prototypes/Actions/crit.yml +++ b/Resources/Prototypes/Actions/crit.yml @@ -1,4 +1,4 @@ -# Actions added to mobs in crit. +# Actions added to mobs in crit. - type: entity id: ActionCritSuccumb name: Succumb @@ -8,6 +8,7 @@ - type: InstantAction itemIconStyle: NoItem checkCanInteract: false + checkConsciousness: false icon: sprite: Mobs/Ghosts/ghost_human.rsi state: icon @@ -22,6 +23,7 @@ - type: InstantAction itemIconStyle: NoItem checkCanInteract: false + checkConsciousness: false icon: sprite: Interface/Actions/actions_crit.rsi state: fakedeath @@ -37,6 +39,7 @@ - type: InstantAction itemIconStyle: NoItem checkCanInteract: false + checkConsciousness: false icon: sprite: Interface/Actions/actions_crit.rsi state: lastwords diff --git a/Resources/Prototypes/Actions/diona.yml b/Resources/Prototypes/Actions/diona.yml index 73bc1ba529..2d188987af 100644 --- a/Resources/Prototypes/Actions/diona.yml +++ b/Resources/Prototypes/Actions/diona.yml @@ -8,6 +8,7 @@ icon: Mobs/Species/Diona/organs.rsi/brain.png event: !type:GibActionEvent {} checkCanInteract: false + checkConsciousness: false - type: entity id: DionaReformAction diff --git a/Resources/Prototypes/Actions/types.yml b/Resources/Prototypes/Actions/types.yml index 2d5ec9a678..84f0839b25 100644 --- a/Resources/Prototypes/Actions/types.yml +++ b/Resources/Prototypes/Actions/types.yml @@ -29,6 +29,7 @@ components: - type: InstantAction checkCanInteract: false + checkConsciousness: false icon: Interface/Actions/zombie-turn.png event: !type:ZombifySelfActionEvent @@ -66,6 +67,7 @@ components: - type: InstantAction checkCanInteract: false + checkConsciousness: false itemIconStyle: BigAction priority: -20 icon: @@ -82,6 +84,7 @@ components: - type: InstantAction checkCanInteract: false + checkConsciousness: false itemIconStyle: BigAction priority: -20 icon: @@ -143,6 +146,7 @@ noSpawn: true components: - type: InstantAction + checkCanInteract: false charges: 2 useDelay: 5 itemIconStyle: BigAction @@ -186,6 +190,7 @@ components: - type: InstantAction checkCanInteract: false + checkConsciousness: false icon: Interface/Actions/harmOff.png iconOn: Interface/Actions/harm.png event: !type:ToggleCombatActionEvent @@ -256,6 +261,7 @@ - type: InstantAction clientExclusive: true checkCanInteract: false + checkConsciousness: false temporary: true icon: { sprite: Objects/Tools/multitool.rsi, state: icon } event: !type:ClearAllOverlaysEvent @@ -279,6 +285,7 @@ components: - type: InstantAction checkCanInteract: false + checkConsciousness: false icon: { sprite: Clothing/Head/Hats/pyjamasyndicatered.rsi, state: icon } event: !type:SleepActionEvent @@ -291,6 +298,7 @@ - type: InstantAction icon: { sprite: Clothing/Head/Hats/pyjamasyndicatered.rsi, state: icon } checkCanInteract: false + checkConsciousness: false event: !type:WakeActionEvent - type: entity @@ -328,6 +336,7 @@ event: !type:ToggleEyesActionEvent useDelay: 1 # so u cant give yourself and observers eyestrain by rapidly spamming the action checkCanInteract: false + checkConsciousness: false - type: entity id: ActionToggleWagging diff --git a/Resources/Prototypes/Atmospherics/thresholds.yml b/Resources/Prototypes/Atmospherics/thresholds.yml index 9b09d64a10..bd7df23841 100644 --- a/Resources/Prototypes/Atmospherics/thresholds.yml +++ b/Resources/Prototypes/Atmospherics/thresholds.yml @@ -12,13 +12,14 @@ - type: alarmThreshold id: stationPressure upperBound: !type:AlarmThresholdSetting - threshold: 550 # as defined in Atmospherics.cs + threshold: 550 # HazardHighPressure from Atmospherics.cs lowerBound: !type:AlarmThresholdSetting - threshold: 20 # as defined in Atmospherics.cs + # Actual low pressure damage threshold is at 20 kPa, but below ~85 kPa you can't breathe due to lack of oxygen. + threshold: 85 upperWarnAround: !type:AlarmThresholdSetting - threshold: 0.7 + threshold: 0.7 # 385 kPa, WarningHighPressure from Atmospherics.cs lowerWarnAround: !type:AlarmThresholdSetting - threshold: 2.5 + threshold: 1.05 # ~90 kPa # a reminder that all of these are percentages (where 1 is 100%), # so 0.01 is 1%, diff --git a/Resources/Prototypes/Body/Organs/diona.yml b/Resources/Prototypes/Body/Organs/diona.yml index 8b4b78cac0..69fc630b9e 100644 --- a/Resources/Prototypes/Body/Organs/diona.yml +++ b/Resources/Prototypes/Body/Organs/diona.yml @@ -46,7 +46,7 @@ food: maxVol: 5 reagents: - - ReagentId: UncookedAnimalProteins + - ReagentId: GreyMatter Quantity: 5 - type: entity diff --git a/Resources/Prototypes/Body/Organs/human.yml b/Resources/Prototypes/Body/Organs/human.yml index fe33c11029..69081020ce 100644 --- a/Resources/Prototypes/Body/Organs/human.yml +++ b/Resources/Prototypes/Body/Organs/human.yml @@ -53,7 +53,21 @@ - type: Tag tags: - Meat - + - type: SolutionContainerManager + solutions: + organ: + reagents: + - ReagentId: Nutriment + Quantity: 10 + food: + maxVol: 5 + reagents: + - ReagentId: GreyMatter + Quantity: 5 + - type: FlavorProfile + flavors: + - people + - type: entity id: OrganHumanEyes parent: BaseHumanOrgan diff --git a/Resources/Prototypes/Body/Organs/slime.yml b/Resources/Prototypes/Body/Organs/slime.yml index 46b1801077..3da76c5d4a 100644 --- a/Resources/Prototypes/Body/Organs/slime.yml +++ b/Resources/Prototypes/Body/Organs/slime.yml @@ -27,10 +27,14 @@ food: maxVol: 5 reagents: - - ReagentId: UncookedAnimalProteins + - ReagentId: GreyMatter Quantity: 5 + organ: + reagents: + - ReagentId: Slime + Quantity: 10 - + - type: entity id: OrganSlimeLungs parent: BaseHumanOrgan @@ -56,7 +60,7 @@ solutions: organ: reagents: - - ReagentId: Nutriment + - ReagentId: Slime Quantity: 10 Lung: maxVol: 100.0 diff --git a/Resources/Prototypes/Catalog/Bounties/bounties.yml b/Resources/Prototypes/Catalog/Bounties/bounties.yml index bd753633e1..c9f20c69da 100644 --- a/Resources/Prototypes/Catalog/Bounties/bounties.yml +++ b/Resources/Prototypes/Catalog/Bounties/bounties.yml @@ -347,11 +347,11 @@ - type: cargoBounty id: BountyRadio - reward: 7500 + reward: 6500 description: bounty-description-radio entries: - name: bounty-item-radio - amount: 12 + amount: 7 whitelist: components: - Headset @@ -536,7 +536,7 @@ description: bounty-description-lasergun idPrefix: IV entries: - - name: bounty-lasergun + - name: bounty-item-lasergun amount: 6 whitelist: components: @@ -548,8 +548,185 @@ description: bounty-description-food idPrefix: UNTH entries: - - name: bounty-food + - name: bounty-item-food amount: 30 whitelist: tags: - Meat + +- type: cargoBounty + id: BountyFruit + reward: 5000 + description: bounty-description-fruit + entries: + - name: bounty-item-fruit + amount: 12 + whitelist: + tags: + - Fruit + +- type: cargoBounty + id: BountyVegetable + reward: 6000 + description: bounty-description-vegetable + entries: + - name: bounty-item-vegetable + amount: 14 + whitelist: + tags: + - Vegetable + +- type: cargoBounty + id: BountyChili + reward: 5555 + description: bounty-description-chili + entries: + - name: bounty-item-chili + amount: 3 + whitelist: + tags: + - ChiliBowl + +- type: cargoBounty + id: BountyRollerskates + reward: 6500 + description: bounty-description-rollerskates + entries: + - name: bounty-item-rollerskates + amount: 2 + whitelist: + components: + - Skates + +- type: cargoBounty + id: BountyBedsheet + reward: 4100 + description: bounty-description-bedsheet + entries: + - name: bounty-item-bedsheet + amount: 5 + whitelist: + tags: + - Bedsheet + +- type: cargoBounty + id: BountyBandana + reward: 4000 + description: bounty-description-bandana + entries: + - name: bounty-item-bandana + amount: 7 + whitelist: + tags: + - Bandana + +- type: cargoBounty + id: BountySteak + reward: 3200 + description: bounty-description-steak + entries: + - name: bounty-item-steak + amount: 4 + whitelist: + tags: + - Steak + +- type: cargoBounty + id: BountyBanana + reward: 6009 + description: bounty-description-banana + entries: + - name: bounty-item-banana + amount: 9 + whitelist: + tags: + - Banana + +- type: cargoBounty + id: BountyBeer + reward: 3100 + description: bounty-description-beer + entries: + - name: bounty-item-beer + amount: 6 + whitelist: + tags: + - Beer + +- type: cargoBounty + id: BountyHiVizVest + reward: 3030 + description: bounty-description-hi-viz-vest + entries: + - name: bounty-item-hi-viz-vest + amount: 3 + whitelist: + tags: + - HiViz + +- type: cargoBounty + id: BountyTorch + reward: 2220 + description: bounty-description-torch + entries: + - name: bounty-item-torch + amount: 6 + whitelist: + tags: + - Torch + +- type: cargoBounty + id: BountyMedkitBox + reward: 2300 + description: bounty-description-medkit-box + entries: + - name: bounty-item-medkit-box + amount: 4 + whitelist: + tags: + - Medkit + +- type: cargoBounty + id: BountyCardboardBox + reward: 1500 + description: bounty-description-cardobard-box + entries: + - name: bounty-item-cardboard-box + amount: 12 + whitelist: + tags: + - BoxCardboard + +- type: cargoBounty + id: BountyWine + reward: 3000 + description: bounty-description-wine + entries: + - name: bounty-item-wine + amount: 2 + whitelist: + tags: + - Wine + +- type: cargoBounty + id: BountyCottonBoll + reward: 8600 + description: bounty-description-cotton-boll + entries: + - name: bounty-item-cotton-boll + amount: 9 + whitelist: + tags: + - CottonBoll + +- type: cargoBounty + id: BountyMicrowaveMachineBoard + reward: 4000 + description: bounty-description-microwave-machine-board + entries: + - name: bounty-item-microwave-machine-board + amount: 2 + whitelist: + tags: + - MicrowaveMachineBoard + diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml b/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml index b51f0ec749..7f52d633cb 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_fun.yml @@ -68,6 +68,16 @@ category: cargoproduct-category-name-fun group: market +- type: cargoProduct + id: FunSprayPaints + icon: + sprite: Objects/Fun/spraycans.rsi + state: death2_cap + product: CrateFunSprayPaints + cost: 2000 + category: Fun + group: market + - type: cargoProduct id: FunParty icon: diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml index 143639301c..dda462abec 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_vending.yml @@ -33,7 +33,7 @@ sprite: Objects/Specific/Service/vending_machine_restock.rsi state: base product: CrateVendingMachineRestockClothesFilled - cost: 5000 + cost: 6000 category: cargoproduct-category-name-service group: market diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml index c326344384..bf1feeb185 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/backpack.yml @@ -202,6 +202,16 @@ - id: BoxSurvival - id: Bible - id: RubberStampChaplain + +- type: entity + noSpawn: true + parent: ClothingBackpack + id: ClothingBackpackLawyerFilled + components: + - type: StorageFill + contents: + - id: BoxSurvival + - id: RubberStampLawyer - type: entity noSpawn: true diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml index 4c56300626..85233de35b 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/duffelbag.yml @@ -212,6 +212,16 @@ - id: BoxSurvival - id: Bible - id: RubberStampChaplain + +- type: entity + noSpawn: true + parent: ClothingBackpackDuffel + id: ClothingBackpackDuffelLawyerFilled + components: + - type: StorageFill + contents: + - id: BoxSurvival + - id: RubberStampLawyer - type: entity noSpawn: true diff --git a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml index 423e125a4f..f61865940d 100644 --- a/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml +++ b/Resources/Prototypes/Catalog/Fills/Backpacks/StarterGear/satchel.yml @@ -215,6 +215,16 @@ - id: BoxSurvival - id: Bible - id: RubberStampChaplain + +- type: entity + noSpawn: true + parent: ClothingBackpackSatchel + id: ClothingBackpackSatchelLawyerFilled + components: + - type: StorageFill + contents: + - id: BoxSurvival + - id: RubberStampLawyer - type: entity noSpawn: true diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/general.yml b/Resources/Prototypes/Catalog/Fills/Boxes/general.yml index a35b7ad310..7c9b622379 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/general.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/general.yml @@ -6,6 +6,9 @@ components: - type: Sprite state: box + - type: Tag + tags: + - BoxCardboard - type: entity name: mousetrap box diff --git a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml index 889120e8df..74951658f0 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml @@ -312,14 +312,21 @@ contents: - id: SnapPopBox - id: CrazyGlue - amount: 2 - id: PlasticBanana + - id: FunnyPaint + orGroup: Paint + prob: 0.5 + - id: FunnyPaintYellow + orGroup: Paint + prob: 0.5 - id: WhoopieCushion - id: ToyHammer - id: MrChips - orGroup: GiftPool + prob: 0.5 + orGroup: Dummy - id: MrDips - orGroup: Giftpool + prob: 0.5 + orGroup: Dummy - id: RevolverCapGun - id: VehicleUnicycleFolded - id: BalloonNT @@ -353,6 +360,41 @@ amount: 15 prob: 0.05 +- type: entity + id: CrateFunSprayPaints + name: spray paint crate + description: a crate filled with spray paint. + parent: CratePlastic + suffix: Spray Paint + components: + - type: StorageFill + contents: + - id: SprayPaintBlue + amount: 2 + prob: 0.33 + - id: SprayPaintRed + amount: 2 + prob: 0.33 + - id: SprayPaintOrange + amount: 2 + prob: 0.33 + - id: SprayPaintBlack + amount: 2 + prob: 0.33 + - id: SprayPaintGreen + amount: 2 + prob: 0.33 + - id: SprayPaintPurple + amount: 2 + prob: 0.33 + - id: SprayPaintWhite + amount: 2 + prob: 0.33 + - id: DeathPaint + amount: 2 + - id: DeathPaintTwo + amount: 2 + - type: entity name: dartboard box set description: A box with everything you need for a fun game of darts. diff --git a/Resources/Prototypes/Catalog/Fills/Items/misc.yml b/Resources/Prototypes/Catalog/Fills/Items/misc.yml index 8f58df7ce5..543cd604a2 100644 --- a/Resources/Prototypes/Catalog/Fills/Items/misc.yml +++ b/Resources/Prototypes/Catalog/Fills/Items/misc.yml @@ -3,16 +3,18 @@ parent: ClothingShoesBootsCombat suffix: Filled components: - - type: StorageFill - contents: - - id: CombatKnife + - type: ContainerFill + containers: + item: + - CombatKnife - type: entity id: ClothingShoesBootsMercFilled parent: ClothingShoesBootsMerc suffix: Filled components: - - type: StorageFill - contents: - - id: KukriKnife + - type: ContainerFill + containers: + item: + - KukriKnife diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml b/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml index db13a3cd64..51df7d427f 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/misc.yml @@ -110,8 +110,21 @@ prob: 0.10 - id: Soap prob: 0.44 + - id: null + prob: 0.67 + orGroup: carp - id: PlushieCarp prob: 0.2 + orGroup: carp + - id: PlushieHolocarp + prob: 0.05 + orGroup: carp + - id: PlushieMagicarp + prob: 0.05 + orGroup: carp + - id: PlushieRainbowCarp + prob: 0.03 + orGroup: carp - id: PlushieSlime prob: 0.2 - id: PlushieSnake @@ -134,6 +147,10 @@ prob: 0.25 - id: StrangePill prob: 0.20 + - id: DeathPaint + prob: 0.05 + - id: DeathPaintTwo + prob: 0.05 - id: DrinkMopwataBottleRandom prob: 0.20 - id: ModularReceiver @@ -205,8 +222,21 @@ prob: 0.10 - id: Soap prob: 0.44 + - id: null + prob: 0.67 + orGroup: carp - id: PlushieCarp prob: 0.2 + orGroup: carp + - id: PlushieHolocarp + prob: 0.05 + orGroup: carp + - id: PlushieMagicarp + prob: 0.05 + orGroup: carp + - id: PlushieRainbowCarp + prob: 0.03 + orGroup: carp - id: PlushieSlime prob: 0.2 - id: PlushieSnake diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/security.yml b/Resources/Prototypes/Catalog/Fills/Lockers/security.yml index ec02744fd4..dff4aa62d2 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/security.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/security.yml @@ -226,7 +226,7 @@ contents: - id: WeaponSubMachineGunWt550 amount: 2 - - id: MagazinePistolSubMachineGun + - id: MagazinePistolSubMachineGunTopMounted amount: 4 - type: entity diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/wardrobe_colors.yml b/Resources/Prototypes/Catalog/Fills/Lockers/wardrobe_colors.yml index 0c7661452a..2038ef0013 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/wardrobe_colors.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/wardrobe_colors.yml @@ -24,46 +24,6 @@ components: - type: StorageFill contents: - - id: ClothingUniformJumpsuitColorWhite - prob: 0.25 - - id: ClothingUniformJumpskirtColorWhite - prob: 0.25 - - id: ClothingUniformJumpsuitColorBlue - prob: 0.25 - - id: ClothingUniformJumpskirtColorBlue - prob: 0.25 - - id: ClothingUniformJumpsuitColorYellow - prob: 0.25 - - id: ClothingUniformJumpskirtColorYellow - prob: 0.25 - - id: ClothingUniformJumpsuitColorGreen - prob: 0.25 - - id: ClothingUniformJumpskirtColorGreen - prob: 0.25 - - id: ClothingUniformJumpsuitColorOrange - prob: 0.25 - - id: ClothingUniformJumpskirtColorOrange - prob: 0.25 - - id: ClothingUniformJumpsuitColorPink - prob: 0.25 - - id: ClothingUniformJumpskirtColorPink - prob: 0.25 - - id: ClothingUniformJumpsuitColorRed - prob: 0.25 - - id: ClothingUniformJumpskirtColorRed - prob: 0.25 - - id: ClothingUniformJumpsuitColorDarkBlue - prob: 0.25 - - id: ClothingUniformJumpskirtColorDarkBlue - prob: 0.25 - - id: ClothingUniformJumpsuitColorTeal - prob: 0.25 - - id: ClothingUniformJumpskirtColorTeal - prob: 0.25 - - id: ClothingUniformJumpsuitColorPurple - prob: 0.25 - - id: ClothingUniformJumpskirtColorPurple - prob: 0.25 - id: ClothingShoesColorBlack amount: 1 - id: ClothingShoesColorBrown @@ -74,6 +34,16 @@ prob: 0.4 - id: ClothingOuterCoatGentle prob: 0.3 + - id: ClothingUniformRandomShorts + amount: 3 + - id: ClothingUniformRandomArmless + amount: 5 + - id: ClothingUniformRandomStandart + amount: 5 + - id: ClothingUniformRandomBra + amount: 5 + - id: ClothingUniformRandomShirt + amount: 4 - type: entity id: WardrobeYellowFilled diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml index 727f07110a..6d387eb877 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/clothesmate.yml @@ -1,3 +1,4 @@ +# DO NOT ADD MORE, USE UNIFORM DYING - type: vendingMachineInventory id: ClothesMateInventory startingInventory: @@ -5,6 +6,7 @@ ClothingBackpackDuffel: 5 ClothingBackpackSatchel: 3 ClothingBackpackSatchelLeather: 2 + ClothingRandomSpawner: 8 ClothingHeadHatBeret: 4 ClothingHeadBandBlack: 2 ClothingHeadBandBlue: 2 @@ -24,6 +26,7 @@ ClothingUniformJumpsuitColorYellow: 2 ClothingUniformJumpskirtColorYellow: 2 ClothingUniformJumpsuitColorGreen: 2 + # DO NOT ADD MORE, USE UNIFORM DYING ClothingUniformJumpskirtColorGreen: 2 ClothingUniformJumpsuitColorOrange: 2 ClothingUniformJumpskirtColorOrange: 2 @@ -50,6 +53,7 @@ ClothingUniformJumpskirtCasualPurple: 2 ClothingUniformJumpsuitCasualRed: 2 ClothingUniformJumpskirtCasualRed: 2 + # DO NOT ADD MORE, USE UNIFORM DYING ClothingShoesColorBlack: 8 ClothingShoesColorBrown: 4 ClothingShoesColorWhite: 3 @@ -66,6 +70,7 @@ ClothingHeadHatGreensoft: 2 ClothingHeadHatOrangesoft: 2 ClothingHeadHatRedsoft: 2 + # DO NOT ADD MORE, USE UNIFORM DYING ClothingHeadHatBlacksoft: 2 ClothingHeadHatPurplesoft: 2 ClothingHeadHatCorpsoft: 2 @@ -82,7 +87,10 @@ ClothingHandsGlovesColorGreen: 2 ClothingHandsGlovesColorOrange: 2 ClothingHandsGlovesColorPurple: 2 + ClothingEyesGlassesCheapSunglasses: 3 + # DO NOT ADD MORE, USE UNIFORM DYING contrabandInventory: ClothingMaskNeckGaiter: 2 ClothingUniformJumpsuitTacticool: 1 ClothingUniformJumpskirtTacticool: 1 + # DO NOT ADD MORE, USE UNIFORM DYING diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml index f39cda0ed4..960a8f8797 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/theater.yml @@ -53,6 +53,7 @@ ClothingShoesBootsCowboyBrown: 1 ClothingShoesBootsCowboyBlack: 1 ClothingShoesBootsCowboyWhite: 1 + ClothingMaskNeckGaiterRed: 2 emaggedInventory: ClothingShoesBling: 1 ClothingShoesBootsCowboyFancy: 1 diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index a26b40cfea..b663cfbc90 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -9,7 +9,7 @@ cost: Telecrystal: 3 categories: - - UplinkWeapons + - UplinkWeaponry - type: listing id: UplinkRevolverPython @@ -19,7 +19,7 @@ cost: Telecrystal: 8 # Originally was 13 TC but was not used due to high cost categories: - - UplinkWeapons + - UplinkWeaponry # Inbuilt suppressor so it's sneaky + more expensive. - type: listing @@ -30,7 +30,7 @@ cost: Telecrystal: 4 categories: - - UplinkWeapons + - UplinkWeaponry # Poor accuracy, slow to fire, cheap option - type: listing @@ -41,7 +41,7 @@ cost: Telecrystal: 1 categories: - - UplinkWeapons + - UplinkWeaponry - type: listing id: UplinkEsword @@ -52,7 +52,7 @@ cost: Telecrystal: 8 categories: - - UplinkWeapons + - UplinkWeaponry - type: listing id: UplinkEnergyDagger @@ -63,7 +63,7 @@ cost: Telecrystal: 2 categories: - - UplinkWeapons + - UplinkWeaponry - type: listing id: UplinkGlovesNorthStar @@ -73,7 +73,7 @@ cost: Telecrystal: 8 categories: - - UplinkWeapons + - UplinkWeaponry - type: listing id: UplinkDisposableTurret @@ -83,12 +83,83 @@ cost: Telecrystal: 6 categories: - - UplinkWeapons + - UplinkWeaponry conditions: - !type:StoreWhitelistCondition blacklist: tags: - NukeOpsUplink + +- type: listing + id: UplinkEshield + name: uplink-eshield-name + description: uplink-eshield-desc + icon: { sprite: /Textures/Objects/Weapons/Melee/e_shield.rsi, state: eshield-on } + productEntity: EnergyShield + cost: + Telecrystal: 8 + categories: + - UplinkWeaponry + conditions: + - !type:StoreWhitelistCondition + whitelist: + tags: + - NukeOpsUplink + +- type: listing + id: UplinkSniperBundle + name: uplink-sniper-bundle-name + description: uplink-sniper-bundle-desc + icon: { sprite: /Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi, state: base } + productEntity: BriefcaseSyndieSniperBundleFilled + cost: + Telecrystal: 12 + categories: + - UplinkWeaponry + +- type: listing + id: UplinkC20RBundle + name: uplink-c20r-bundle-name + description: uplink-c20r-bundle-desc + icon: { sprite: /Textures/Objects/Weapons/Guns/SMGs/c20r.rsi, state: icon } + productEntity: ClothingBackpackDuffelSyndicateFilledSMG + cost: + Telecrystal: 17 + categories: + - UplinkWeaponry + +- type: listing + id: UplinkBulldogBundle + name: uplink-buldog-bundle-name + description: uplink-buldog-bundle-desc + icon: { sprite: /Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi, state: icon } + productEntity: ClothingBackpackDuffelSyndicateFilledShotgun + cost: + Telecrystal: 20 + categories: + - UplinkWeaponry + +- type: listing + id: UplinkGrenadeLauncherBundle + name: uplink-grenade-launcher-bundle-name + description: uplink-grenade-launcher-bundle-desc + icon: { sprite: /Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi, state: icon } + productEntity: ClothingBackpackDuffelSyndicateFilledGrenadeLauncher + cost: + Telecrystal: 25 + categories: + - UplinkWeaponry + +- type: listing + id: UplinkL6SawBundle + name: uplink-l6-saw-bundle-name + description: uplink-l6-saw-bundle-desc + icon: { sprite: /Textures/Objects/Weapons/Guns/LMGs/l6.rsi, state: icon } + productEntity: ClothingBackpackDuffelSyndicateFilledLMG + cost: + Telecrystal: 30 + categories: + - UplinkWeaponry # Explosives @@ -284,6 +355,16 @@ categories: - UplinkExplosives +- type: listing + id: UplinkEmpKit + name: uplink-emp-kit-name + description: uplink-emp-kit-desc + productEntity: ElectricalDisruptionKit + cost: + Telecrystal: 6 + categories: + - UplinkExplosives + # Ammo - type: listing @@ -308,11 +389,6 @@ Telecrystal: 2 categories: - UplinkAmmo - conditions: - - !type:StoreWhitelistCondition - whitelist: - tags: - - NukeOpsUplink # For the Cobra - type: listing @@ -360,144 +436,171 @@ categories: - UplinkAmmo -#Utility +- type: listing + id: UplinkAmmoBundle + name: uplink-ammo-bundle-name + description: uplink-ammo-bundle-desc + productEntity: ClothingBackpackDuffelSyndicateAmmoFilled + cost: + Telecrystal: 15 + categories: + - UplinkAmmo + conditions: + - !type:StoreWhitelistCondition + whitelist: + tags: + - NukeOpsUplink + - !type:BuyerWhitelistCondition + blacklist: + components: + - SurplusBundle + +#Chemicals - type: listing - id: UplinkHoloparaKit - name: uplink-holopara-kit-name - description: uplink-holopara-kit-desc - icon: { sprite: /Textures/Objects/Misc/guardian_info.rsi, state: icon } - productEntity: BoxHoloparasite + id: UplinkHypopen + name: uplink-hypopen-name + description: uplink-hypopen-desc + icon: { sprite: /Textures/Objects/Misc/bureaucracy.rsi, state: pen } + productEntity: HypopenBox cost: - Telecrystal: 14 + Telecrystal: 6 + categories: + - UplinkChemicals + +- type: listing + id: UplinkHypoDart + name: uplink-hypodart-name + description: uplink-hypodart-desc + icon: { sprite: /Textures/Objects/Fun/Darts/dart_red.rsi, state: icon } + productEntity: HypoDartBox + cost: + Telecrystal: 2 + categories: + - UplinkChemicals + +- type: listing + id: UplinkChemistryKitBundle + name: uplink-chemistry-kit-name + description: uplink-chemistry-kit-desc + icon: { sprite: /Textures/Objects/Storage/boxicons.rsi, state: vials } + productEntity: ChemicalSynthesisKit + cost: + Telecrystal: 4 + categories: + - UplinkChemicals + +- type: listing + id: UplinkZombieBundle + name: uplink-zombie-bundle-name + description: uplink-zombie-bundle-desc + icon: { sprite: /Textures/Structures/Wallmounts/signs.rsi, state: bio } + productEntity: ClothingBackpackDuffelZombieBundle + cost: + Telecrystal: 40 categories: - - UplinkUtility + - UplinkChemicals conditions: - !type:StoreWhitelistCondition - blacklist: + whitelist: tags: - NukeOpsUplink + - !type:BuyerWhitelistCondition + blacklist: + components: + - SurplusBundle - type: listing - id: UplinkHolster - name: uplink-holster-name - description: uplink-holster-desc - productEntity: ClothingBeltSyndieHolster + id: UplinkNocturineChemistryBottle + name: uplink-nocturine-chemistry-bottle-name + description: uplink-nocturine-chemistry-bottle-desc + productEntity: NocturineChemistryBottle cost: - Telecrystal: 1 + Telecrystal: 6 categories: - - UplinkUtility + - UplinkChemicals - type: listing - id: UplinkEmag - name: uplink-emag-name - description: uplink-emag-desc - productEntity: Emag + id: UplinkCombatMedkit + name: uplink-combat-medkit-name + description: uplink-combat-medkit-desc + productEntity: MedkitCombatFilled cost: - Telecrystal: 8 + Telecrystal: 5 categories: - - UplinkUtility + - UplinkChemicals - type: listing - id: UplinkAgentIDCard - name: uplink-agent-id-card-name - description: uplink-agent-id-card-desc - productEntity: AgentIDCard + id: UplinkCombatMedipen + name: uplink-combat-medipen-name + description: uplink-combat-medipen-desc + productEntity: CombatMedipen cost: - Telecrystal: 3 + Telecrystal: 4 categories: - - UplinkUtility + - UplinkChemicals - type: listing - id: UplinkJetpack - name: uplink-black-jetpack-name - description: uplink-black-jetpack-desc - productEntity: JetpackBlackFilled + id: UplinkStimpack + name: uplink-stimpack-name + description: uplink-stimpack-desc + productEntity: Stimpack cost: - Telecrystal: 2 + Telecrystal: 4 categories: - - UplinkUtility + - UplinkChemicals - type: listing - id: UplinkReinforcementRadioSyndicate - name: uplink-reinforcement-radio-name - description: uplink-reinforcement-radio-desc - productEntity: ReinforcementRadioSyndicate - icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } + id: UplinkStimkit + name: uplink-stimkit-name + description: uplink-stimkit-desc + productEntity: StimkitFilled cost: - Telecrystal: 16 + Telecrystal: 12 categories: - - UplinkUtility - conditions: - - !type:StoreWhitelistCondition - blacklist: - tags: - - NukeOpsUplink - + - UplinkChemicals + - type: listing - id: UplinkReinforcementRadioSyndicateNukeops # Version for Nukeops that spawns an agent with the NukeOperative component. - name: uplink-reinforcement-radio-name - description: uplink-reinforcement-radio-desc - productEntity: ReinforcementRadioSyndicateNukeops - icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } + id: UplinkCigarettes + name: uplink-cigarettes-name + description: uplink-cigarettes-desc + productEntity: CigPackSyndicate cost: - Telecrystal: 16 + Telecrystal: 2 categories: - - UplinkUtility - conditions: - - !type:StoreWhitelistCondition - whitelist: - tags: - - NukeOpsUplink + - UplinkChemicals - type: listing - id: UplinkReinforcementRadioSyndicateCyborgAssault - name: uplink-reinforcement-radio-cyborg-assault-name - description: uplink-reinforcement-radio-cyborg-assault-desc - productEntity: ReinforcementRadioSyndicateCyborgAssault - icon: { sprite: Mobs/Silicon/chassis.rsi, state: synd_sec } + id: UplinkMedsBundle + name: uplink-meds-bundle-name + description: uplink-meds-bundle-desc + productEntity: ClothingBackpackDuffelSyndicateMedicalBundleFilled cost: - Telecrystal: 65 + Telecrystal: 20 categories: - - UplinkUtility + - UplinkChemicals conditions: - !type:StoreWhitelistCondition whitelist: tags: - NukeOpsUplink + - !type:BuyerWhitelistCondition + blacklist: + components: + - SurplusBundle +# Deception + - type: listing - id: UplinkReinforcementRadioSyndicateMonkey - name: uplink-reinforcement-radio-monkey-name - description: uplink-reinforcement-radio-monkey-desc - productEntity: ReinforcementRadioSyndicateMonkey - icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } + id: UplinkAgentIDCard + name: uplink-agent-id-card-name + description: uplink-agent-id-card-desc + productEntity: AgentIDCard cost: - Telecrystal: 8 + Telecrystal: 3 categories: - - UplinkUtility - conditions: - - !type:StoreWhitelistCondition - blacklist: - tags: - - NukeOpsUplink - -- type: listing - id: UplinkReinforcementRadioSyndicateMonkeyNukeops # Version for Nukeops that spawns a syndicate monkey with the NukeOperative component. - name: uplink-reinforcement-radio-monkey-name - description: uplink-reinforcement-radio-monkey-desc - productEntity: ReinforcementRadioSyndicateMonkeyNukeops - icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } - cost: - Telecrystal: 8 - categories: - - UplinkUtility - conditions: - - !type:StoreWhitelistCondition - whitelist: - tags: - - NukeOpsUplink - + - UplinkDeception + - type: listing id: UplinkStealthBox name: uplink-stealth-box-name @@ -506,7 +609,7 @@ cost: Telecrystal: 5 categories: - - UplinkUtility + - UplinkDeception - type: listing id: UplinkHeadsetEncryptionKey @@ -517,7 +620,7 @@ cost: Telecrystal: 2 categories: - - UplinkUtility + - UplinkDeception - type: listing id: UplinkBinaryTranslatorKey @@ -525,48 +628,94 @@ description: uplink-binary-translator-key-desc icon: { sprite: /Textures/Objects/Devices/encryption_keys.rsi, state: rd_label } productEntity: EncryptionKeyBinary + cost: + Telecrystal: 1 + categories: + - UplinkDeception + +- type: listing + id: UplinkCyberpen + name: uplink-cyberpen-name + description: uplink-cyberpen-desc + productEntity: CyberPen cost: Telecrystal: 1 + categories: + - UplinkDeception +- type: listing + id: UplinkDecoyDisk + name: uplink-decoy-disk-name + description: uplink-decoy-disk-desc + productEntity: NukeDiskFake + cost: + Telecrystal: 1 + categories: + - UplinkDeception + +- type: listing + id: UplinkUltrabrightLantern + name: uplink-ultrabright-lantern-name + description: uplink-ultrabright-lantern-desc + productEntity: LanternFlash + cost: + Telecrystal: 2 categories: - - UplinkUtility + - UplinkDeception - type: listing - id: UplinkHypopen - name: uplink-hypopen-name - description: uplink-hypopen-desc - icon: { sprite: /Textures/Objects/Misc/bureaucracy.rsi, state: pen } - productEntity: HypopenBox + id: UplinkBribe + name: uplink-bribe-name + description: uplink-bribe-desc + productEntity: BriefcaseSyndieLobbyingBundleFilled cost: - Telecrystal: 6 + Telecrystal: 4 categories: - - UplinkUtility + - UplinkDeception + +# - type: listing +# id: UplinkGigacancerScanner +# name: Ultragigacancer Health Analyzer +# description: Works like a normal health analyzer, other than giving everyone it scans ultragigacancer. +# productEntity: HandheldHealthAnalyzerGigacancer +# cost: +# Telecrystal: 5 +# categories: +# - UplinkDeception - type: listing - id: UplinkVoiceMask - name: uplink-voice-mask-name - description: uplink-voice-mask-desc - productEntity: ClothingMaskGasVoiceChameleon + id: UplinkDecoyKit + name: uplink-decoy-kit-name + description: uplink-decoy-kit-desc + icon: { sprite: /Textures/Objects/Tools/Decoys/operative_decoy.rsi, state: folded } + productEntity: ClothingBackpackDuffelSyndicateDecoyKitFilled cost: - Telecrystal: 2 + Telecrystal: 6 categories: - - UplinkUtility - + - UplinkDeception + - type: listing - id: UplinkClothingEyesHudSyndicate - name: uplink-clothing-eyes-hud-syndicate-name - description: uplink-clothing-eyes-hud-syndicate-desc - productEntity: ClothingEyesHudSyndicate + id: UplinkSyndicateBombFake + name: uplink-exploding-syndicate-bomb-fake-name + description: uplink-exploding-syndicate-bomb-fake-desc + productEntity: SyndicateBombFake cost: - Telecrystal: 2 + Telecrystal: 4 categories: - - UplinkUtility - conditions: - - !type:StoreWhitelistCondition - whitelist: - tags: - - NukeOpsUplink + - UplinkDeception + +# Disruption +- type: listing + id: UplinkEmag + name: uplink-emag-name + description: uplink-emag-desc + productEntity: Emag + cost: + Telecrystal: 8 + categories: + - UplinkDisruption + - type: listing id: UplinkRadioJammer name: uplink-radio-jammer-name @@ -575,18 +724,7 @@ cost: Telecrystal: 4 categories: - - UplinkUtility - -- type: listing - id: UplinkHypoDart - name: uplink-hypodart-name - description: uplink-hypodart-desc - icon: { sprite: /Textures/Objects/Fun/Darts/dart_red.rsi, state: icon } - productEntity: HypoDartBox - cost: - Telecrystal: 2 - categories: - - UplinkUtility + - UplinkDisruption - type: listing id: UplinkSyndicateWeaponModule @@ -596,82 +734,85 @@ cost: Telecrystal: 5 categories: - - UplinkUtility -# Implants + - UplinkDisruption - type: listing - id: UplinkStorageImplanter - name: uplink-storage-implanter-name - description: uplink-storage-implanter-desc - icon: { sprite: /Textures/Clothing/Back/Backpacks/backpack.rsi, state: icon } - productEntity: StorageImplanter + id: UplinkSoapSyndie + name: uplink-soap-name + description: uplink-soap-desc + productEntity: SoapSyndie cost: - Telecrystal: 8 + Telecrystal: 1 categories: - - UplinkImplants - conditions: - - !type:StoreWhitelistCondition - blacklist: - tags: - - NukeOpsUplink + - UplinkDisruption - type: listing - id: UplinkFreedomImplanter - name: uplink-freedom-implanter-name - description: uplink-freedom-implanter-desc - icon: { sprite: /Textures/Actions/Implants/implants.rsi, state: freedom } - productEntity: FreedomImplanter + id: UplinkSlipocalypseClusterSoap + name: uplink-slipocalypse-clustersoap-name + description: uplink-slipocalypse-clustersoap-desc + productEntity: SlipocalypseClusterSoap cost: - Telecrystal: 5 + Telecrystal: 3 categories: - - UplinkImplants + - UplinkDisruption + +- type: listing + id: UplinkToolbox + name: uplink-toolbox-name + description: uplink-toolbox-desc + productEntity: ToolboxSyndicateFilled + cost: + Telecrystal: 2 + categories: + - UplinkDisruption - type: listing - id: UplinkScramImplanter - name: uplink-scram-implanter-name - description: uplink-scram-implanter-desc - icon: { sprite: /Textures/Structures/Specific/anomaly.rsi, state: anom4 } - productEntity: ScramImplanter + id: UplinkSyndicateJawsOfLife + name: uplink-syndicate-jaws-of-life-name + description: uplink-syndicate-jaws-of-life-desc + productEntity: SyndicateJawsOfLife cost: - Telecrystal: 6 # it's a gamble that may kill you easily so 6 TC per 2 uses, second one more of a backup + Telecrystal: 2 categories: - - UplinkImplants + - UplinkDisruption - type: listing - id: UplinkDnaScramblerImplant - name: uplink-dna-scrambler-implanter-name - description: uplink-dna-scrambler-implanter-desc - icon: { sprite: /Textures/Mobs/Species/Human/parts.rsi, state: full } - productEntity: DnaScramblerImplanter + id: UplinkDuffelSurgery + name: uplink-duffel-surgery-name + description: uplink-duffel-surgery-desc + productEntity: ClothingBackpackDuffelSyndicateFilledMedical cost: - Telecrystal: 5 + Telecrystal: 4 categories: - - UplinkImplants + - UplinkDisruption - type: listing - id: UplinkEmpImplanter - name: uplink-emp-implanter-name - description: uplink-emp-implanter-desc - icon: { sprite: /Textures/Objects/Magic/magicactions.rsi, state: shield } - productEntity: EmpImplanter + id: UplinkPowerSink + name: uplink-power-sink-name + description: uplink-power-sink-desc + productEntity: PowerSink cost: - Telecrystal: 2 + Telecrystal: 8 categories: - - UplinkImplants + - UplinkDisruption + conditions: + - !type:BuyerWhitelistCondition + blacklist: + components: + - SurplusBundle - type: listing - id: UplinkMicroBombImplanter - name: uplink-micro-bomb-implanter-name - description: uplink-micro-bomb-implanter-desc - icon: { sprite: /Textures/Actions/Implants/implants.rsi, state: explosive } - productEntity: MicroBombImplanter + id: UplinkSurplusBundle + name: uplink-surplus-bundle-name + description: uplink-surplus-bundle-desc + productEntity: CrateSyndicateSurplusBundle cost: - Telecrystal: 2 + Telecrystal: 20 categories: - - UplinkImplants + - UplinkDisruption conditions: - !type:StoreWhitelistCondition - whitelist: + blacklist: tags: - NukeOpsUplink - !type:BuyerWhitelistCondition @@ -680,51 +821,62 @@ - SurplusBundle - type: listing - id: UplinkMacroBombImplanter - name: uplink-macro-bomb-implanter-name - description: uplink-macro-bomb-implanter-desc - icon: { sprite: /Textures/Actions/Implants/implants.rsi, state: explosive } - productEntity: MacroBombImplanter + id: UplinkSuperSurplusBundle + name: uplink-super-surplus-bundle-name + description: uplink-super-surplus-bundle-desc + productEntity: CrateSyndicateSuperSurplusBundle cost: - Telecrystal: 13 + Telecrystal: 40 categories: - - UplinkImplants + - UplinkDisruption conditions: - - !type:StoreWhitelistCondition - whitelist: - tags: - - NukeOpsUplink - - !type:BuyerWhitelistCondition - blacklist: - components: - - SurplusBundle + - !type:StoreWhitelistCondition + blacklist: + tags: + - NukeOpsUplink + - !type:BuyerWhitelistCondition + blacklist: + components: + - SurplusBundle - type: listing - id: UplinkDeathAcidifierImplanter - name: uplink-death-acidifier-implant-name - description: uplink-death-acidifier-implant-desc - icon: { sprite: /Textures/Objects/Magic/magicactions.rsi, state: gib } - productEntity: DeathAcidifierImplanter + id: UplinkSingarityBeacon + name: uplink-singularity-beacon-name + description: uplink-singularity-beacon-desc + productEntity: SingularityBeacon cost: - Telecrystal: 4 + Telecrystal: 12 categories: - - UplinkImplants - conditions: - - !type:StoreWhitelistCondition - whitelist: - tags: - - NukeOpsUplink - + - UplinkDisruption + +# Allies + - type: listing - id: UplinkUplinkImplanter # uplink uplink real - name: uplink-uplink-implanter-name - description: uplink-uplink-implanter-desc - icon: { sprite: /Textures/Objects/Devices/communication.rsi, state: old-radio } - productEntity: UplinkImplanter + id: UplinkHoloparaKit + name: uplink-holopara-kit-name + description: uplink-holopara-kit-desc + icon: { sprite: /Textures/Objects/Misc/guardian_info.rsi, state: icon } + productEntity: BoxHoloparasite cost: - Telecrystal: 2 + Telecrystal: 14 categories: - - UplinkImplants + - UplinkAllies + conditions: + - !type:StoreWhitelistCondition + blacklist: + tags: + - NukeOpsUplink + +- type: listing + id: UplinkReinforcementRadioSyndicate + name: uplink-reinforcement-radio-name + description: uplink-reinforcement-radio-desc + productEntity: ReinforcementRadioSyndicate + icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } + cost: + Telecrystal: 16 + categories: + - UplinkAllies conditions: - !type:StoreWhitelistCondition blacklist: @@ -732,485 +884,298 @@ - NukeOpsUplink - type: listing - id: UplinkDeathRattle - name: uplink-deathrattle-implant-name - description: uplink-deathrattle-implant-desc - productEntity: BoxDeathRattleImplants + id: UplinkReinforcementRadioSyndicateNukeops # Version for Nukeops that spawns an agent with the NukeOperative component. + name: uplink-reinforcement-radio-name + description: uplink-reinforcement-radio-desc + productEntity: ReinforcementRadioSyndicateNukeops + icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } cost: - Telecrystal: 4 + Telecrystal: 16 categories: - - UplinkImplants + - UplinkAllies conditions: - !type:StoreWhitelistCondition whitelist: tags: - NukeOpsUplink - - !type:BuyerWhitelistCondition - blacklist: - components: - - SurplusBundle - -# Bundles - -- type: listing - id: UplinkEmpKit - name: uplink-emp-kit-name - description: uplink-emp-kit-desc - productEntity: ElectricalDisruptionKit - cost: - Telecrystal: 6 - categories: - - UplinkBundles - type: listing - id: UplinkAmmoBundle - name: uplink-ammo-bundle-name - description: uplink-ammo-bundle-desc - productEntity: ClothingBackpackDuffelSyndicateAmmoFilled + id: UplinkReinforcementRadioSyndicateCyborgAssault + name: uplink-reinforcement-radio-cyborg-assault-name + description: uplink-reinforcement-radio-cyborg-assault-desc + productEntity: ReinforcementRadioSyndicateCyborgAssault + icon: { sprite: Mobs/Silicon/chassis.rsi, state: synd_sec } cost: - Telecrystal: 15 + Telecrystal: 65 categories: - - UplinkBundles + - UplinkAllies conditions: - !type:StoreWhitelistCondition whitelist: tags: - NukeOpsUplink - - !type:BuyerWhitelistCondition - blacklist: - components: - - SurplusBundle - -- type: listing - id: UplinkChemistryKitBundle - name: uplink-chemistry-kit-name - description: uplink-chemistry-kit-desc - icon: { sprite: /Textures/Objects/Storage/boxicons.rsi, state: vials } - productEntity: ChemicalSynthesisKit - cost: - Telecrystal: 4 - categories: - - UplinkBundles - type: listing - id: UplinkDecoyKit - name: uplink-decoy-kit-name - description: uplink-decoy-kit-desc - icon: { sprite: /Textures/Objects/Tools/Decoys/operative_decoy.rsi, state: folded } - productEntity: ClothingBackpackDuffelSyndicateDecoyKitFilled + id: UplinkReinforcementRadioSyndicateMonkey + name: uplink-reinforcement-radio-monkey-name + description: uplink-reinforcement-radio-monkey-desc + productEntity: ReinforcementRadioSyndicateMonkey + icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } cost: Telecrystal: 6 categories: - - UplinkBundles - -- type: listing - id: UplinkMedsBundle - name: uplink-meds-bundle-name - description: uplink-meds-bundle-desc - productEntity: ClothingBackpackDuffelSyndicateMedicalBundleFilled - cost: - Telecrystal: 20 - categories: - - UplinkBundles + - UplinkAllies conditions: - !type:StoreWhitelistCondition - whitelist: + blacklist: tags: - NukeOpsUplink - - !type:BuyerWhitelistCondition - blacklist: - components: - - SurplusBundle - type: listing - id: UplinkSniperBundle - name: uplink-sniper-bundle-name - description: uplink-sniper-bundle-desc - icon: { sprite: /Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi, state: base } - productEntity: BriefcaseSyndieSniperBundleFilled - cost: - Telecrystal: 12 - categories: - - UplinkBundles - -- type: listing - id: UplinkC20RBundle - name: uplink-c20r-bundle-name - description: uplink-c20r-bundle-desc - icon: { sprite: /Textures/Objects/Weapons/Guns/SMGs/c20r.rsi, state: icon } - productEntity: ClothingBackpackDuffelSyndicateFilledSMG - cost: - Telecrystal: 17 - categories: - - UplinkBundles - -- type: listing - id: UplinkBulldogBundle - name: uplink-buldog-bundle-name - description: uplink-buldog-bundle-desc - icon: { sprite: /Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi, state: icon } - productEntity: ClothingBackpackDuffelSyndicateFilledShotgun - cost: - Telecrystal: 20 - categories: - - UplinkBundles - -- type: listing - id: UplinkGrenadeLauncherBundle - name: uplink-grenade-launcher-bundle-name - description: uplink-grenade-launcher-bundle-desc - icon: { sprite: /Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi, state: icon } - productEntity: ClothingBackpackDuffelSyndicateFilledGrenadeLauncher - cost: - Telecrystal: 25 - categories: - - UplinkBundles - -- type: listing - id: UplinkL6SawBundle - name: uplink-l6-saw-bundle-name - description: uplink-l6-saw-bundle-desc - icon: { sprite: /Textures/Objects/Weapons/Guns/LMGs/l6.rsi, state: icon } - productEntity: ClothingBackpackDuffelSyndicateFilledLMG - cost: - Telecrystal: 30 - categories: - - UplinkBundles - -- type: listing - id: UplinkZombieBundle - name: uplink-zombie-bundle-name - description: uplink-zombie-bundle-desc - icon: { sprite: /Textures/Structures/Wallmounts/signs.rsi, state: bio } - productEntity: ClothingBackpackDuffelZombieBundle + id: UplinkReinforcementRadioSyndicateMonkeyNukeops # Version for Nukeops that spawns a syndicate monkey with the NukeOperative component. + name: uplink-reinforcement-radio-monkey-name + description: uplink-reinforcement-radio-monkey-desc + productEntity: ReinforcementRadioSyndicateMonkeyNukeops + icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } cost: - Telecrystal: 40 + Telecrystal: 6 categories: - - UplinkBundles + - UplinkAllies conditions: - - !type:StoreWhitelistCondition - whitelist: - tags: - - NukeOpsUplink - - !type:BuyerWhitelistCondition - blacklist: - components: - - SurplusBundle + - !type:StoreWhitelistCondition + whitelist: + tags: + - NukeOpsUplink - type: listing - id: UplinkSurplusBundle - name: uplink-surplus-bundle-name - description: uplink-surplus-bundle-desc - productEntity: CrateSyndicateSurplusBundle + id: UplinkCarpDehydrated + name: uplink-carp-dehydrated-name + description: uplink-carp-dehydrated-desc + productEntity: DehydratedSpaceCarp cost: - Telecrystal: 20 + Telecrystal: 2 categories: - - UplinkBundles + - UplinkAllies conditions: - !type:StoreWhitelistCondition blacklist: tags: - NukeOpsUplink - - !type:BuyerWhitelistCondition - blacklist: - components: - - SurplusBundle - type: listing - id: UplinkSuperSurplusBundle - name: uplink-super-surplus-bundle-name - description: uplink-super-surplus-bundle-desc - productEntity: CrateSyndicateSuperSurplusBundle + id: UplinkMobCatMicrobomb + name: uplink-mobcat-microbomb-name + description: uplink-mobcat-microbomb-desc + icon: { sprite: /Textures/Mobs/Pets/cat.rsi, state: syndicat } + productEntity: MobCatSyndy cost: - Telecrystal: 40 + Telecrystal: 10 categories: - - UplinkBundles + - UplinkAllies conditions: - - !type:StoreWhitelistCondition - blacklist: - tags: - - NukeOpsUplink - - !type:BuyerWhitelistCondition - blacklist: - components: - - SurplusBundle - -# Tools - -- type: listing - id: UplinkToolbox - name: uplink-toolbox-name - description: uplink-toolbox-desc - productEntity: ToolboxSyndicateFilled - cost: - Telecrystal: 2 - categories: - - UplinkTools + - !type:StoreWhitelistCondition + whitelist: + tags: + - NukeOpsUplink - type: listing - id: UplinkSyndicateJawsOfLife - name: uplink-syndicate-jaws-of-life-name - description: uplink-syndicate-jaws-of-life-desc - productEntity: SyndicateJawsOfLife + id: UplinkSyndicatePersonalAI + name: uplink-syndicate-pai-name + description: uplink-syndicate-pai-desc + icon: { sprite: /Textures/Objects/Fun/pai.rsi, state: syndicate-icon-pai-off } + productEntity: SyndicatePersonalAI cost: - Telecrystal: 2 + Telecrystal: 1 categories: - - UplinkTools + - UplinkAllies + conditions: + - !type:ListingLimitedStockCondition + stock: 1 -- type: listing - id: UplinkDuffelSurgery - name: uplink-duffel-surgery-name - description: uplink-duffel-surgery-desc - productEntity: ClothingBackpackDuffelSyndicateFilledMedical - cost: - Telecrystal: 4 - categories: - - UplinkTools +# Implants - type: listing - id: UplinkPowerSink - name: uplink-power-sink-name - description: uplink-power-sink-desc - productEntity: PowerSink + id: UplinkStorageImplanter + name: uplink-storage-implanter-name + description: uplink-storage-implanter-desc + icon: { sprite: /Textures/Clothing/Back/Backpacks/backpack.rsi, state: icon } + productEntity: StorageImplanter cost: Telecrystal: 8 categories: - - UplinkTools + - UplinkImplants conditions: - - !type:BuyerWhitelistCondition + - !type:StoreWhitelistCondition blacklist: - components: - - SurplusBundle + tags: + - NukeOpsUplink - type: listing - id: UplinkCarpDehydrated - name: uplink-carp-dehydrated-name - description: uplink-carp-dehydrated-desc - productEntity: DehydratedSpaceCarp + id: UplinkFreedomImplanter + name: uplink-freedom-implanter-name + description: uplink-freedom-implanter-desc + icon: { sprite: /Textures/Actions/Implants/implants.rsi, state: freedom } + productEntity: FreedomImplanter cost: - Telecrystal: 2 + Telecrystal: 5 categories: - - UplinkTools - conditions: - - !type:StoreWhitelistCondition - blacklist: - tags: - - NukeOpsUplink - -# Job Specific + - UplinkImplants - type: listing - id: uplinkGatfruitSeeds - name: uplink-gatfruit-seeds-name - description: uplink-gatfruit-seeds-desc - productEntity: GatfruitSeeds + id: UplinkScramImplanter + name: uplink-scram-implanter-name + description: uplink-scram-implanter-desc + icon: { sprite: /Textures/Structures/Specific/anomaly.rsi, state: anom4 } + productEntity: ScramImplanter cost: - Telecrystal: 6 + Telecrystal: 6 # it's a gamble that may kill you easily so 6 TC per 2 uses, second one more of a backup categories: - - UplinkJob - conditions: - - !type:BuyerJobCondition - whitelist: - - Botanist + - UplinkImplants - type: listing - id: uplinkRiggedBoxingGlovesPassenger - name: uplink-rigged-boxing-gloves-name - description: uplink-rigged-boxing-gloves-desc - productEntity: ClothingHandsGlovesBoxingRigged + id: UplinkDnaScramblerImplant + name: uplink-dna-scrambler-implanter-name + description: uplink-dna-scrambler-implanter-desc + icon: { sprite: /Textures/Mobs/Species/Human/parts.rsi, state: full } + productEntity: DnaScramblerImplanter cost: - Telecrystal: 6 + Telecrystal: 5 categories: - - UplinkJob - conditions: - - !type:BuyerJobCondition - whitelist: - - Passenger + - UplinkImplants - type: listing - id: uplinkRiggedBoxingGlovesBoxer - name: uplink-rigged-boxing-gloves-name - description: uplink-rigged-boxing-gloves-desc - productEntity: ClothingHandsGlovesBoxingRigged + id: UplinkEmpImplanter + name: uplink-emp-implanter-name + description: uplink-emp-implanter-desc + icon: { sprite: /Textures/Objects/Magic/magicactions.rsi, state: shield } + productEntity: EmpImplanter cost: - Telecrystal: 4 + Telecrystal: 2 categories: - - UplinkJob - conditions: - - !type:BuyerJobCondition - whitelist: - - Boxer + - UplinkImplants - type: listing - id: uplinkNecronomicon - name: uplink-necronomicon-name - description: uplink-necronomicon-desc - productEntity: BibleNecronomicon + id: UplinkMicroBombImplanter + name: uplink-micro-bomb-implanter-name + description: uplink-micro-bomb-implanter-desc + icon: { sprite: /Textures/Actions/Implants/implants.rsi, state: explosive } + productEntity: MicroBombImplanter cost: - Telecrystal: 4 + Telecrystal: 2 categories: - - UplinkJob + - UplinkImplants conditions: - - !type:BuyerJobCondition + - !type:StoreWhitelistCondition whitelist: - - Chaplain + tags: + - NukeOpsUplink - !type:BuyerWhitelistCondition blacklist: components: - SurplusBundle - type: listing - id: uplinkHolyHandGrenade - name: uplink-holy-hand-grenade-name - description: uplink-holy-hand-grenade-desc - productEntity: HolyHandGrenade - cost: - Telecrystal: 20 - categories: - - UplinkJob - conditions: - - !type:BuyerJobCondition - whitelist: - - Chaplain - -- type: listing - id: uplinkRevolverCapGunFake - name: uplink-revolver-cap-gun-fake-name - description: uplink-revolver-cap-gun-fake-desc - productEntity: RevolverCapGunFake - cost: - Telecrystal: 9 - categories: - - UplinkJob - conditions: - - !type:BuyerJobCondition - whitelist: - - Mime - - Clown - -- type: listing - id: uplinkBananaPeelExplosive - name: uplink-banana-peel-explosive-name - description: uplink-banana-peel-explosive-desc - icon: { sprite: Objects/Specific/Hydroponics/banana.rsi, state: peel } - productEntity: TrashBananaPeelExplosiveUnarmed - cost: - Telecrystal: 2 - categories: - - UplinkJob - conditions: - - !type:BuyerJobCondition - whitelist: - - Clown - -- type: listing - id: UplinkClusterBananaPeel - name: uplink-cluster-banana-peel-name - description: uplink-cluster-banana-peel-desc - productEntity: ClusterBananaPeel + id: UplinkMacroBombImplanter + name: uplink-macro-bomb-implanter-name + description: uplink-macro-bomb-implanter-desc + icon: { sprite: /Textures/Actions/Implants/implants.rsi, state: explosive } + productEntity: MacroBombImplanter cost: - Telecrystal: 6 + Telecrystal: 13 categories: - - UplinkJob + - UplinkImplants conditions: - - !type:BuyerJobCondition - whitelist: - - Clown + - !type:StoreWhitelistCondition + whitelist: + tags: + - NukeOpsUplink + - !type:BuyerWhitelistCondition + blacklist: + components: + - SurplusBundle - type: listing - id: UplinkHoloclownKit - name: uplink-holoclown-kit-name - description: uplink-holoclown-kit-desc - icon: { sprite: /Textures/Objects/Fun/figurines.rsi, state: holoclown } - productEntity: BoxHoloclown + id: UplinkDeathAcidifierImplanter + name: uplink-death-acidifier-implant-name + description: uplink-death-acidifier-implant-desc + icon: { sprite: /Textures/Objects/Magic/magicactions.rsi, state: gib } + productEntity: DeathAcidifierImplanter cost: - Telecrystal: 12 + Telecrystal: 4 categories: - - UplinkJob + - UplinkImplants conditions: - - !type:BuyerJobCondition - whitelist: - - Clown - + - !type:StoreWhitelistCondition + whitelist: + tags: + - NukeOpsUplink + - type: listing - id: uplinkHotPotato - name: uplink-hot-potato-name - description: uplink-hot-potato-desc - productEntity: HotPotato + id: UplinkUplinkImplanter # uplink uplink real + name: uplink-uplink-implanter-name + description: uplink-uplink-implanter-desc + icon: { sprite: /Textures/Objects/Devices/communication.rsi, state: old-radio } + productEntity: UplinkImplanter cost: - Telecrystal: 4 + Telecrystal: 2 categories: - - UplinkJob + - UplinkImplants conditions: - - !type:BuyerJobCondition - whitelist: - - Chef - - Botanist - - Clown - - Mime + - !type:StoreWhitelistCondition + blacklist: + tags: + - NukeOpsUplink - type: listing - id: UplinkChimpUpgradeKit - name: uplink-chimp-upgrade-kit-name - description: uplink-chimp-upgrade-kit-desc - productEntity: WeaponPistolCHIMPUpgradeKit + id: UplinkDeathRattle + name: uplink-deathrattle-implant-name + description: uplink-deathrattle-implant-desc + productEntity: BoxDeathRattleImplants cost: Telecrystal: 4 categories: - - UplinkJob + - UplinkImplants conditions: - - !type:BuyerDepartmentCondition + - !type:StoreWhitelistCondition whitelist: - - Science + tags: + - NukeOpsUplink + - !type:BuyerWhitelistCondition + blacklist: + components: + - SurplusBundle + +# Wearables - type: listing - id: uplinkProximityMine - name: uplink-proximity-mine-name - description: uplink-proximity-mine-desc - productEntity: WetFloorSignMineExplosive + id: UplinkJetpack + name: uplink-black-jetpack-name + description: uplink-black-jetpack-desc + productEntity: JetpackBlackFilled cost: - Telecrystal: 5 # was 4, with my buff made it 5 to be closer to minibomb -panzer + Telecrystal: 2 categories: - - UplinkJob - conditions: - - !type:BuyerJobCondition - whitelist: - - Janitor - - !type:BuyerWhitelistCondition - blacklist: - components: - - SurplusBundle + - UplinkWearables - type: listing - id: UplinkSyndicateSpongeBox - name: uplink-syndicate-sponge-box-name - description: uplink-syndicate-sponge-box-desc - icon: { sprite: Objects/Misc/monkeycube.rsi, state: box} - productEntity: SyndicateSpongeBox + id: UplinkVoiceMask + name: uplink-voice-mask-name + description: uplink-voice-mask-desc + productEntity: ClothingMaskGasVoiceChameleon cost: - Telecrystal: 7 + Telecrystal: 2 categories: - - UplinkJob - conditions: - - !type:BuyerJobCondition # We can't use BuyerDepartmentCondition here since Zookeeper and Chef can also get this - whitelist: - - Zookeeper - - Scientist - - SeniorResearcher #CD Role - - ResearchDirector - - Chef + - UplinkWearables - type: listing - id: UplinkSingarityBeacon - name: uplink-singularity-beacon-name - description: uplink-singularity-beacon-desc - productEntity: SingularityBeacon + id: UplinkHolster + name: uplink-holster-name + description: uplink-holster-desc + productEntity: ClothingBeltSyndieHolster cost: - Telecrystal: 12 + Telecrystal: 1 categories: - - UplinkUtility - -# Armor + - UplinkWearables - type: listing id: UplinkChameleon @@ -1221,7 +1186,7 @@ cost: Telecrystal: 4 categories: - - UplinkArmor + - UplinkWearables - type: listing id: UplinkClothingNoSlipsShoes @@ -1231,7 +1196,7 @@ cost: Telecrystal: 2 categories: - - UplinkArmor + - UplinkWearables - type: listing id: UplinkgClothingThievingGloves @@ -1241,7 +1206,7 @@ cost: Telecrystal: 4 categories: - - UplinkArmor + - UplinkWearables - type: listing id: UplinkClothingOuterVestWeb @@ -1251,7 +1216,7 @@ cost: Telecrystal: 3 categories: - - UplinkArmor + - UplinkWearables - type: listing id: UplinkClothingShoesBootsMagSyndie @@ -1261,7 +1226,7 @@ cost: Telecrystal: 4 categories: - - UplinkArmor + - UplinkWearables - type: listing id: UplinkEVASyndie @@ -1272,7 +1237,7 @@ cost: Telecrystal: 2 categories: - - UplinkArmor + - UplinkWearables - type: listing id: UplinkHardsuitSyndie @@ -1283,7 +1248,7 @@ cost: Telecrystal: 8 categories: - - UplinkArmor + - UplinkWearables - type: listing id: UplinkHardsuitSyndieElite @@ -1294,218 +1259,53 @@ cost: Telecrystal: 10 categories: - - UplinkArmor + - UplinkWearables - type: listing id: UplinkClothingOuterHardsuitJuggernaut name: uplink-clothing-outer-hardsuit-juggernaut-name - description: uplink-clothing-outer-hardsuit-juggernaut-desc - icon: { sprite: /Textures/Structures/Storage/Crates/syndicate.rsi, state: icon } - productEntity: CrateCybersunJuggernautBundle - cost: - Telecrystal: 12 - categories: - - UplinkArmor - -# Misc - -- type: listing - id: UplinkCyberpen - name: uplink-cyberpen-name - description: uplink-cyberpen-desc - productEntity: CyberPen - cost: - Telecrystal: 1 - categories: - - UplinkMisc - -- type: listing - id: UplinkDecoyDisk - name: uplink-decoy-disk-name - description: uplink-decoy-disk-desc - productEntity: NukeDiskFake - cost: - Telecrystal: 1 - categories: - - UplinkMisc - -- type: listing - id: UplinkCigarettes - name: uplink-cigarettes-name - description: uplink-cigarettes-desc - productEntity: CigPackSyndicate - cost: - Telecrystal: 2 - categories: - - UplinkMisc - -- type: listing - id: UplinkClothingConductingGloves - name: uplink-clothing-conducting-gloves-name - description: uplink-clothing-conducting-gloves-desc - productEntity: ClothingHandsGlovesConducting - cost: - Telecrystal: 2 - categories: - - UplinkMisc - -- type: listing - id: UplinkSnackBox - name: uplink-snack-box-name - description: uplink-snack-box-desc - productEntity: HappyHonkNukieSnacks - cost: - Telecrystal: 1 - categories: - - UplinkMisc - -- type: listing - id: UplinkEshield - name: uplink-eshield-name - description: uplink-eshield-desc - icon: { sprite: /Textures/Objects/Weapons/Melee/e_shield.rsi, state: eshield-on } - productEntity: EnergyShield - cost: - Telecrystal: 8 - categories: - - UplinkMisc - conditions: - - !type:StoreWhitelistCondition - whitelist: - tags: - - NukeOpsUplink - -- type: listing - id: UplinkSoapSyndie - name: uplink-soap-name - description: uplink-soap-desc - productEntity: SoapSyndie - cost: - Telecrystal: 1 - categories: - - UplinkMisc - -- type: listing - id: UplinkSlipocalypseClusterSoap - name: uplink-slipocalypse-clustersoap-name - description: uplink-slipocalypse-clustersoap-desc - productEntity: SlipocalypseClusterSoap - cost: - Telecrystal: 3 - categories: - - UplinkMisc - -- type: listing - id: UplinkUltrabrightLantern - name: uplink-ultrabright-lantern-name - description: uplink-ultrabright-lantern-desc - productEntity: LanternFlash - cost: - Telecrystal: 2 - categories: - - UplinkMisc - -# - type: listing -# id: UplinkGigacancerScanner -# name: Ultragigacancer Health Analyzer -# description: Works like a normal health analyzer, other than giving everyone it scans ultragigacancer. -# productEntity: HandheldHealthAnalyzerGigacancer -# cost: -# Telecrystal: 5 -# categories: -# - UplinkMisc - -- type: listing - id: UplinkNocturineChemistryBottle - name: uplink-nocturine-chemistry-bottle-name - description: uplink-nocturine-chemistry-bottle-desc - productEntity: NocturineChemistryBottle - cost: - Telecrystal: 6 - categories: - - UplinkMisc - -- type: listing - id: UplinkCombatMedkit - name: uplink-combat-medkit-name - description: uplink-combat-medkit-desc - productEntity: MedkitCombatFilled - cost: - Telecrystal: 5 - categories: - - UplinkMisc - -- type: listing - id: UplinkCombatMedipen - name: uplink-combat-medipen-name - description: uplink-combat-medipen-desc - productEntity: CombatMedipen - cost: - Telecrystal: 4 - categories: - - UplinkMisc - -- type: listing - id: UplinkStimpack - name: uplink-stimpack-name - description: uplink-stimpack-desc - productEntity: Stimpack - cost: - Telecrystal: 4 - categories: - - UplinkMisc - -- type: listing - id: UplinkStimkit - name: uplink-stimkit-name - description: uplink-stimkit-desc - productEntity: StimkitFilled + description: uplink-clothing-outer-hardsuit-juggernaut-desc + icon: { sprite: /Textures/Structures/Storage/Crates/syndicate.rsi, state: icon } + productEntity: CrateCybersunJuggernautBundle cost: Telecrystal: 12 categories: - - UplinkMisc + - UplinkWearables - type: listing - id: UplinkSyndicateSegwayCrate - name: uplink-syndicate-segway-crate-name - description: uplink-syndicate-segway-crate-desc - icon: { sprite: /Textures/Objects/Vehicles/syndicatesegway.rsi, state: icon } - productEntity: CrateFunSyndicateSegway + id: UplinkClothingEyesHudSyndicate + name: uplink-clothing-eyes-hud-syndicate-name + description: uplink-clothing-eyes-hud-syndicate-desc + productEntity: ClothingEyesHudSyndicate cost: - Telecrystal: 5 + Telecrystal: 2 categories: - - UplinkMisc + - UplinkWearables conditions: - - !type:BuyerWhitelistCondition - blacklist: - components: - - SurplusBundle + - !type:StoreWhitelistCondition + whitelist: + tags: + - NukeOpsUplink - type: listing - id: UplinkBribe - name: uplink-bribe-name - description: uplink-bribe-desc - productEntity: BriefcaseSyndieLobbyingBundleFilled + id: UplinkClothingConductingGloves + name: uplink-clothing-conducting-gloves-name + description: uplink-clothing-conducting-gloves-desc + productEntity: ClothingHandsGlovesConducting cost: - Telecrystal: 4 + Telecrystal: 2 categories: - - UplinkMisc + - UplinkWearables - type: listing - id: UplinkMobCatMicrobomb - name: uplink-mobcat-microbomb-name - description: uplink-mobcat-microbomb-desc - icon: { sprite: /Textures/Mobs/Pets/cat.rsi, state: syndicat } - productEntity: MobCatSyndy + id: UplinkBackpackSyndicate + name: uplink-backpack-syndicate-name + description: uplink-backpack-syndicate-desc + productEntity: ClothingBackpackSyndicate cost: - Telecrystal: 10 + Telecrystal: 2 categories: - - UplinkMisc - conditions: - - !type:StoreWhitelistCondition - whitelist: - tags: - - NukeOpsUplink + - UplinkWearables # Pointless @@ -1519,6 +1319,16 @@ categories: - UplinkPointless +- type: listing + id: UplinkSnackBox + name: uplink-snack-box-name + description: uplink-snack-box-desc + productEntity: HappyHonkNukieSnacks + cost: + Telecrystal: 1 + categories: + - UplinkPointless + - type: listing id: UplinkRevolverCapGun name: uplink-revolver-cap-gun-name @@ -1649,16 +1459,205 @@ categories: - UplinkPointless +# Job Specific + - type: listing - id: UplinkSyndicatePersonalAI - name: uplink-syndicate-pai-name - description: uplink-syndicate-pai-desc - icon: { sprite: /Textures/Objects/Fun/pai.rsi, state: syndicate-icon-pai-off } - productEntity: SyndicatePersonalAI + id: uplinkGatfruitSeeds + name: uplink-gatfruit-seeds-name + description: uplink-gatfruit-seeds-desc + productEntity: GatfruitSeeds cost: - Telecrystal: 1 + Telecrystal: 6 categories: - - UplinkPointless + - UplinkJob conditions: - - !type:ListingLimitedStockCondition - stock: 1 + - !type:BuyerJobCondition + whitelist: + - Botanist + +- type: listing + id: uplinkRiggedBoxingGlovesPassenger + name: uplink-rigged-boxing-gloves-name + description: uplink-rigged-boxing-gloves-desc + productEntity: ClothingHandsGlovesBoxingRigged + cost: + Telecrystal: 6 + categories: + - UplinkJob + conditions: + - !type:BuyerJobCondition + whitelist: + - Passenger + +- type: listing + id: uplinkRiggedBoxingGlovesBoxer + name: uplink-rigged-boxing-gloves-name + description: uplink-rigged-boxing-gloves-desc + productEntity: ClothingHandsGlovesBoxingRigged + cost: + Telecrystal: 4 + categories: + - UplinkJob + conditions: + - !type:BuyerJobCondition + whitelist: + - Boxer + +- type: listing + id: uplinkNecronomicon + name: uplink-necronomicon-name + description: uplink-necronomicon-desc + productEntity: BibleNecronomicon + cost: + Telecrystal: 4 + categories: + - UplinkJob + conditions: + - !type:BuyerJobCondition + whitelist: + - Chaplain + - !type:BuyerWhitelistCondition + blacklist: + components: + - SurplusBundle + +- type: listing + id: uplinkHolyHandGrenade + name: uplink-holy-hand-grenade-name + description: uplink-holy-hand-grenade-desc + productEntity: HolyHandGrenade + cost: + Telecrystal: 20 + categories: + - UplinkJob + conditions: + - !type:BuyerJobCondition + whitelist: + - Chaplain + +- type: listing + id: uplinkRevolverCapGunFake + name: uplink-revolver-cap-gun-fake-name + description: uplink-revolver-cap-gun-fake-desc + productEntity: RevolverCapGunFake + cost: + Telecrystal: 9 + categories: + - UplinkJob + conditions: + - !type:BuyerJobCondition + whitelist: + - Mime + - Clown + +- type: listing + id: uplinkBananaPeelExplosive + name: uplink-banana-peel-explosive-name + description: uplink-banana-peel-explosive-desc + icon: { sprite: Objects/Specific/Hydroponics/banana.rsi, state: peel } + productEntity: TrashBananaPeelExplosiveUnarmed + cost: + Telecrystal: 2 + categories: + - UplinkJob + conditions: + - !type:BuyerJobCondition + whitelist: + - Clown + +- type: listing + id: UplinkClusterBananaPeel + name: uplink-cluster-banana-peel-name + description: uplink-cluster-banana-peel-desc + productEntity: ClusterBananaPeel + cost: + Telecrystal: 6 + categories: + - UplinkJob + conditions: + - !type:BuyerJobCondition + whitelist: + - Clown + +- type: listing + id: UplinkHoloclownKit + name: uplink-holoclown-kit-name + description: uplink-holoclown-kit-desc + icon: { sprite: /Textures/Objects/Fun/figurines.rsi, state: holoclown } + productEntity: BoxHoloclown + cost: + Telecrystal: 12 + categories: + - UplinkJob + conditions: + - !type:BuyerJobCondition + whitelist: + - Clown + +- type: listing + id: uplinkHotPotato + name: uplink-hot-potato-name + description: uplink-hot-potato-desc + productEntity: HotPotato + cost: + Telecrystal: 4 + categories: + - UplinkJob + conditions: + - !type:BuyerJobCondition + whitelist: + - Chef + - Botanist + - Clown + - Mime + +- type: listing + id: UplinkChimpUpgradeKit + name: uplink-chimp-upgrade-kit-name + description: uplink-chimp-upgrade-kit-desc + productEntity: WeaponPistolCHIMPUpgradeKit + cost: + Telecrystal: 4 + categories: + - UplinkJob + conditions: + - !type:BuyerDepartmentCondition + whitelist: + - Science + +- type: listing + id: uplinkProximityMine + name: uplink-proximity-mine-name + description: uplink-proximity-mine-desc + productEntity: WetFloorSignMineExplosive + cost: + Telecrystal: 5 # was 4, with my buff made it 5 to be closer to minibomb -panzer + categories: + - UplinkJob + conditions: + - !type:BuyerJobCondition + whitelist: + - Janitor + - !type:BuyerWhitelistCondition + blacklist: + components: + - SurplusBundle + +- type: listing + id: UplinkSyndicateSpongeBox + name: uplink-syndicate-sponge-box-name + description: uplink-syndicate-sponge-box-desc + icon: { sprite: Objects/Misc/monkeycube.rsi, state: box} + productEntity: SyndicateSpongeBox + cost: + Telecrystal: 7 + categories: + - UplinkJob + conditions: + - !type:BuyerJobCondition # We can't use BuyerDepartmentCondition here since Zookeeper and Chef can also get this + whitelist: + - Zookeeper + - Scientist + - SeniorResearcher #CD Role + - ResearchDirector + - Chef diff --git a/Resources/Prototypes/Datasets/tips.yml b/Resources/Prototypes/Datasets/tips.yml index 765918bb7e..124edb2d1e 100644 --- a/Resources/Prototypes/Datasets/tips.yml +++ b/Resources/Prototypes/Datasets/tips.yml @@ -125,8 +125,8 @@ - "In a pinch, you can throw drinks or other reagent containers behind you to create a spill that can slip people chasing you." - "Some weapons, such as knives & shivs, have a fast attack speed." - "The jaws of life can be used to open powered doors." - - "You can drink blood to heal back some of your blood volume, albeit very inefficiently." - - "If you're not a lizard, don't drink blood! It makes you sick and you begin to take damage." + - "If you're not a human, you can drink blood to heal back some of your blood volume, albeit very inefficiently." + - "If you're a human, don't drink blood! It makes you sick and you'll begin to take damage." - "There is a chemical metabolism limit that limits the amount of reagents of a certain type you can digest at once. Certain species have higher metabolism limits, such as slimes." - "Welding without proper eye protection can cause eye damage, which must be cured with oculine." - "Zombies are very vulnerable to heat damage, making welding tools and laser guns extremely effective against them." diff --git a/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml b/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml index 9cc90f4cf9..d90b1d75aa 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml @@ -245,6 +245,18 @@ - type: Sprite sprite: Clothing/Back/Backpacks/ertclown.rsi +#Syndicate +- type: entity + parent: ClothingBackpack + id: ClothingBackpackSyndicate + name: syndicate backpack + description: + components: + - type: Sprite + sprite: Clothing/Back/Backpacks/syndicate.rsi + - type: ExplosionResistance + damageCoefficient: 0.1 + #Special - type: entity parent: ClothingBackpack diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index af1b0e0f98..9ee1e5cf54 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -41,6 +41,7 @@ - Geiger - TrayScanner - GasAnalyzer + - HandLabeler - type: ItemMapper mapLayers: drill: @@ -260,10 +261,12 @@ - PillCanister - Radio - DiscreteHealthAnalyzer + - SurgeryTool components: - Hypospray - Injector - Pill + - HandLabeler - type: ItemMapper mapLayers: bottle: @@ -336,6 +339,7 @@ components: - Seed - Smokable + - HandLabeler - type: ItemMapper mapLayers: hatchet: diff --git a/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml b/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml index c19571feba..ad893e88b2 100644 --- a/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml +++ b/Resources/Prototypes/Entities/Clothing/Eyes/glasses.yml @@ -125,17 +125,14 @@ - type: entity parent: ClothingEyesBase - id: ClothingEyesGlassesSunglasses - name: sun glasses - description: A pair of black sunglasses. + id: ClothingEyesGlassesCheapSunglasses + name: cheap sunglasses + description: A pair of black sunglasses. Doesn't block light well, more of an accessory than something useful. components: - type: Sprite sprite: Clothing/Eyes/Glasses/sunglasses.rsi - type: Clothing sprite: Clothing/Eyes/Glasses/sunglasses.rsi - - type: FlashImmunity - - type: EyeProtection - protectionTime: 5 - type: Tag tags: - HamsterWearable @@ -143,6 +140,16 @@ - type: IdentityBlocker coverage: EYES +- type: entity + parent: ClothingEyesGlassesCheapSunglasses + id: ClothingEyesGlassesSunglasses + name: sun glasses + description: A pair of black sunglasses. + components: + - type: FlashImmunity + - type: EyeProtection + protectionTime: 5 + - type: entity parent: ClothingEyesBase id: ClothingEyesGlassesSecurity diff --git a/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml b/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml index 8ee6479ee6..51a56f1f1d 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/bandanas.yml @@ -20,6 +20,9 @@ - state: icon_mask map: [ "unfoldedLayer" ] visible: false + - type: Tag + tags: + - Bandana - type: entity parent: [ClothingHeadBandBase, ClothingMaskBandBlack] @@ -69,4 +72,4 @@ - type: entity parent: [ClothingHeadBandBase, ClothingMaskBandBrown] id: ClothingHeadBandBrown - name: brown bandana \ No newline at end of file + name: brown bandana diff --git a/Resources/Prototypes/Entities/Clothing/Head/hardhats.yml b/Resources/Prototypes/Entities/Clothing/Head/hardhats.yml index 3e291f5dff..15cda5a69f 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hardhats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hardhats.yml @@ -62,6 +62,9 @@ - type: ContainerContainer containers: cell_slot: !type:ContainerSlot + - type: Tag + tags: + - WhitelistChameleon - type: entity parent: ClothingHeadHatHardhatBase diff --git a/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml b/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml index 2d65e67982..246b47b800 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/bandanas.yml @@ -24,6 +24,7 @@ visible: false - type: Tag tags: + - Bandana - HidesNose - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml index 28f01b4a46..79a2fee0f2 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/masks.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/masks.yml @@ -512,6 +512,16 @@ tags: - WhitelistChameleon +- type: entity + parent: ClothingMaskNeckGaiter + id: ClothingMaskNeckGaiterRed + name: red neck gaiter + components: + - type: Sprite + sprite: Clothing/Mask/neckgaiterred.rsi + - type: Clothing + sprite: Clothing/Mask/neckgaiterred.rsi + - type: entity parent: ClothingMaskClownBase id: ClothingMaskSexyClown diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml index ba8641175c..fc02afe35f 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/misc.yml @@ -90,6 +90,9 @@ sprite: Clothing/OuterClothing/Misc/cardborg.rsi - type: TypingIndicatorClothing proto: robot + - type: Tag + tags: + - WhitelistChameleon - type: entity parent: ClothingOuterBaseToggleable diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml index f49f5f4804..b867abfeed 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/vests.yml @@ -63,6 +63,9 @@ sprite: Clothing/OuterClothing/Vests/hazard.rsi - type: Clothing sprite: Clothing/OuterClothing/Vests/hazard.rsi + - type: Tag + tags: + - HiViz #(Bartender) vest - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/base_clothingshoes.yml b/Resources/Prototypes/Entities/Clothing/Shoes/base_clothingshoes.yml index 402cae690f..1a2a29d9f5 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/base_clothingshoes.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/base_clothingshoes.yml @@ -8,6 +8,8 @@ - FEET - type: Sprite state: icon + - type: Item + size: 5 - type: Food requiresSpecialDigestion: true - type: SolutionContainerManager @@ -33,21 +35,21 @@ - id: MaterialCloth1 amount: 1 +# stuff common to all military boots - type: entity abstract: true - parent: ClothingShoesBase - id: ClothingShoesStorageBase + parent: [ClothingShoesBase, ClothingSlotBase] + id: ClothingShoesMilitaryBase components: - - type: Storage - capacity: 10 - - type: ContainerContainer - containers: - storagebase: !type:Container - ents: [] - - type: UserInterface - interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + - type: Matchbox + - type: ItemSlots + slots: + item: + name: clothing-boots-sidearm + whitelist: + tags: + - Knife + - Sidearm - type: entity abstract: true @@ -57,3 +59,4 @@ components: - type: TemperatureProtection coefficient: 0.2 + \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml b/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml index 49a16e1f62..83edadcb3a 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/boots.yml @@ -11,7 +11,7 @@ - type: Matchbox - type: entity - parent: ClothingShoesBaseButcherable + parent: ClothingShoesMilitaryBase id: ClothingShoesBootsJack name: jackboots description: A set of Jackboots, once able to hold knifes they have fallen from grace due to budget cuts, now just some stylish boots. @@ -20,7 +20,6 @@ sprite: Clothing/Shoes/Boots/jackboots.rsi - type: Clothing sprite: Clothing/Shoes/Boots/jackboots.rsi - - type: Matchbox - type: entity parent: ClothingShoesBaseButcherable @@ -46,7 +45,7 @@ sprite: Clothing/Shoes/Boots/performer.rsi - type: entity - parent: ClothingShoesStorageBase + parent: ClothingShoesMilitaryBase id: ClothingShoesBootsCombat name: combat boots description: Robust combat boots for combat scenarios or combat situations. All combat, all the time. @@ -55,15 +54,9 @@ sprite: Clothing/Shoes/Boots/combatboots.rsi - type: Clothing sprite: Clothing/Shoes/Boots/combatboots.rsi - - type: Matchbox - - type: Storage - whitelist: - tags: - - Knife - - Sidearm - type: entity - parent: ClothingShoesStorageBase + parent: ClothingShoesMilitaryBase id: ClothingShoesHighheelBoots name: high-heeled boots description: Snazy boots for when you want to be stylish, yet prepared. @@ -76,14 +69,9 @@ sprite: Clothing/Shoes/Boots/highheelboots.rsi - type: Clothing sprite: Clothing/Shoes/Boots/highheelboots.rsi - - type: Storage - whitelist: - tags: - - Knife - - Sidearm - type: entity - parent: ClothingShoesStorageBase + parent: ClothingShoesMilitaryBase id: ClothingShoesBootsMerc name: mercenary boots description: Boots that have gone through many conflicts and that have proven their combat reliability. @@ -92,12 +80,6 @@ sprite: Clothing/Shoes/Boots/mercboots.rsi - type: Clothing sprite: Clothing/Shoes/Boots/mercboots.rsi - - type: Matchbox - - type: Storage - whitelist: - tags: - - Knife - - Sidearm - type: entity parent: ClothingShoesBaseButcherable @@ -208,7 +190,7 @@ node: boots - type: entity - parent: ClothingShoesStorageBase + parent: ClothingShoesMilitaryBase id: ClothingShoesBootsCowboyBrown name: brown cowboy boots description: They got spurs that jingle and/or jangle. @@ -220,13 +202,7 @@ - type: FootstepModifier footstepSoundCollection: collection: FootstepSpurs - - type: Matchbox - - type: Storage - whitelist: - tags: - - Knife - - Sidearm - + - type: entity parent: ClothingShoesBootsCowboyBrown id: ClothingShoesBootsCowboyBlack @@ -236,7 +212,7 @@ sprite: Clothing/Shoes/Boots/cowboybootsblack.rsi - type: Clothing sprite: Clothing/Shoes/Boots/cowboybootsblack.rsi - + - type: entity parent: ClothingShoesBootsCowboyBrown id: ClothingShoesBootsCowboyWhite @@ -246,7 +222,7 @@ sprite: Clothing/Shoes/Boots/cowboybootswhite.rsi - type: Clothing sprite: Clothing/Shoes/Boots/cowboybootswhite.rsi - + - type: entity parent: ClothingShoesBootsCowboyBrown id: ClothingShoesBootsCowboyFancy @@ -255,4 +231,4 @@ - type: Sprite sprite: Clothing/Shoes/Boots/cowboybootsfancy.rsi - type: Clothing - sprite: Clothing/Shoes/Boots/cowboybootsfancy.rsi \ No newline at end of file + sprite: Clothing/Shoes/Boots/cowboybootsfancy.rsi diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml b/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml index ee1708caef..d1f6e083f4 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/misc.yml @@ -47,6 +47,9 @@ collection: FootstepDuck params: variation: 0.07 + - type: Construction + graph: ClothingShoeSlippersDuck + node: shoes - type: entity parent: ClothingShoesBaseButcherable diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml index 4e7d7f903a..9564d77d64 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml @@ -9,8 +9,26 @@ - type: Clothing sprite: Clothing/Shoes/Specific/chef.rsi +# stuff common to all clown & jester shoes - type: entity - parent: ClothingShoesBaseButcherable + abstract: true + parent: [ClothingShoesBaseButcherable, ClothingSlotBase] + id: ClothingShoesClownBase + components: + - type: ItemSlots + slots: + item: + name: clothing-boots-sidearm + whitelist: + tags: + - Knife + - ToySidearm + blacklist: + components: + - Sharp + +- type: entity + parent: ClothingShoesClownBase id: ClothingShoesClown name: clown shoes description: "The prankster's standard-issue clowning shoes. Damn they're huge!" @@ -49,7 +67,7 @@ acceleration: 5 - type: entity - parent: ClothingShoesBaseButcherable + parent: ClothingShoesClownBase id: ClothingShoesBling name: bling clown shoes description: Made of refined bananium and shined with the pulp of a fresh banana peel. These make a flashy statement. diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/random_suit.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/random_suit.yml new file mode 100644 index 0000000000..88278077b5 --- /dev/null +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/random_suit.yml @@ -0,0 +1,169 @@ + +- type: entity + parent: ClothingUniformBase + id: ClothingUniformRandom + abstract: true + description: Generated by neural networks based on the latest fashion trends. + suffix: Random visual + components: + - type: SuitSensor + - type: Sprite + sprite: Clothing/Uniforms/procedural.rsi + layers: + - state: base_torso_standart + map: [ "torso" ] + - state: base_leg_standart + map: [ "leg" ] + - state: mask_null + map: [ "decor" ] + - state: mask_null + map: [ "overlay" ] + - type: Clothing + femaleMask: UniformTop + maleMask: UniformTop + sprite: Clothing/Uniforms/procedural.rsi + clothingVisuals: + jumpsuit: + - state: base_torso_standart + map: [ "torso" ] + - state: base_leg_standart + map: [ "leg" ] + - state: mask_null + map: [ "decor" ] + - state: mask_null + map: [ "overlay" ] + +- type: entity + parent: ClothingUniformRandom + id: ClothingRandomSpawner + name: random colorful costume + components: + - type: RandomSpawner + offset: 0 + prototypes: + - ClothingUniformRandomArmless + - ClothingUniformRandomStandart + - ClothingUniformRandomBra + - ClothingUniformRandomShorts + - ClothingUniformRandomShirt + +- type: entity + parent: ClothingUniformRandom + id: ClothingUniformRandomArmless + name: colorful hands-free costume + components: + - type: RandomSprite + available: + - torso: + base_torso_armless: Sixteen + leg: + base_leg_standart: Sixteen + base_leg_short: Sixteen + base_leg_skirt: Sixteen + base_leg_skirt_long: Sixteen + decor: + decor_torso_armless1: Sixteen + decor_torso_armless2: Sixteen + decor_torso_armless3: Sixteen + decor_torso_armless4: Sixteen + decor_torso_armless5: Sixteen + decor_torso_armless6: Sixteen + decor_torso_armless7: Sixteen + decor_torso_armless8: Sixteen + decor_torso_armless9: Sixteen + decor_torso_armless10: Sixteen + mask_null: "" + +- type: entity + parent: ClothingUniformRandom + id: ClothingUniformRandomStandart + name: colorful costume + components: + - type: RandomSprite + available: + - torso: + base_torso_standart: Sixteen + base_torso_standart2: Sixteen + leg: + base_leg_standart: Sixteen + base_leg_short: Sixteen + base_leg_skirt: Sixteen + base_leg_skirt_long: Sixteen + decor: + decor_torso_armless1: Sixteen + decor_torso_armless2: Sixteen + decor_torso_armless3: Sixteen + decor_torso_armless4: Sixteen + decor_torso_armless5: Sixteen + decor_torso_armless6: Sixteen + decor_torso_armless7: Sixteen + decor_torso_armless8: Sixteen + decor_torso_armless9: Sixteen + decor_torso_armless10: Sixteen + decor_torso_standart1: Sixteen + decor_torso_standart2: Sixteen + decor_torso_standart3: Sixteen + decor_torso_standart4: Sixteen + decor_torso_standart5: Sixteen + decor_torso_standart6: Sixteen + decor_torso_standart7: Sixteen + decor_torso_standart8: Sixteen + decor_torso_standart9: Sixteen + mask_null: "" + +- type: entity + parent: ClothingUniformRandom + id: ClothingUniformRandomBra + name: colorful bra + components: + - type: RandomSprite + available: + - torso: + base_torso_bra: Sixteen + leg: + base_leg_standart: Sixteen + base_leg_short: Sixteen + base_leg_skirt: Sixteen + base_leg_skirt_long: Sixteen + decor: + decor_torso_bra1: Sixteen + decor_torso_bra2: Sixteen + decor_torso_bra3: Sixteen + decor_torso_bra4: Sixteen + decor_torso_bra5: Sixteen + mask_null: "" + +- type: entity + parent: ClothingUniformRandom + id: ClothingUniformRandomShorts + name: colorful pants + components: + - type: RandomSprite + available: + - torso: + mask_null: "" + leg: + base_leg_standart: Sixteen + base_leg_short: Sixteen + base_leg_skirt: Sixteen + base_leg_skirt_long: Sixteen + +- type: entity + parent: ClothingUniformRandom + id: ClothingUniformRandomShirt + name: colorful costume + components: + - type: RandomSprite + available: + - torso: + base_torso_armless: Sixteen + mask_null: "" + leg: + base_leg_standart: Sixteen + base_leg_short: Sixteen + decor: + base_torso_shirt: Sixteen + overlay: + decor_torso_shirt1: Sixteen + decor_torso_shirt2: Sixteen + decor_torso_shirt3: Sixteen \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml index 19793f873f..d7a5e2b787 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml @@ -20,4 +20,4 @@ - type: UserInterface interfaces: - key: enum.ChameleonUiKey.Key - type: ChameleonBoundUserInterface + type: ChameleonBoundUserInterface \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/crates.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/crates.yml index ae7e5bcf76..883182aae8 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/crates.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/crates.yml @@ -44,6 +44,7 @@ - CrateMaterialPlastic - CrateMaterialWood - CrateMaterialPlasteel + - CrateFunSprayPaints - CrateFunArtSupplies - CrateEngineeringCableLV - CrateEngineeringCableMV diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/fancytables.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/fancytables.yml new file mode 100644 index 0000000000..274db34437 --- /dev/null +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/fancytables.yml @@ -0,0 +1,22 @@ +- type: entity + name: random fancy table spawner + id: FancyTableSpawner + parent: MarkerBase + components: + - type: Sprite + layers: + - state: red + - sprite: Structures/Furniture/Tables/Fancy/blue.rsi + state: full + - type: RandomSpawner + prototypes: + - TableFancyBlue + - TableFancyCyan + - TableFancyBlack + - TableFancyRed + - TableFancyPurple + - TableFancyPink + - TableFancyGreen + - TableFancyOrange + - TableFancyWhite + offset: 0.0 diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml index 84693b14ab..c33f858fff 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml @@ -174,7 +174,12 @@ - MaterialCloth10 - MaterialWoodPlank10 - ResearchDisk + - DeathPaint - Plunger + - SprayPaintBlue + - SprayPaintRed + - SprayPaintGreen + - SprayPaintOrange - TechnologyDisk - PowerCellMedium - PowerCellSmall diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index fa575d216a..14e1f7e4ec 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1347,12 +1347,13 @@ baseSprintSpeed: 5 - type: MeleeWeapon soundHit: - path: /Audio/Weapons/pierce.ogg + collection: AlienClaw angle: 30 - animation: WeaponArcPunch + animation: WeaponArcClaw damage: types: - Piercing: 9 + Slash: 5 + Piercing: 4 - type: Temperature heatDamageThreshold: 360 coldDamageThreshold: 285 @@ -2420,6 +2421,22 @@ gender: epicene - type: Bloodstream bloodMaxVolume: 100 + - type: MeleeWeapon + angle: 0 + animation: WeaponArcBite + soundHit: + path: /Audio/Effects/bite.ogg + damage: + types: + Piercing: 8 + - type: NpcFactionMember + factions: + - Passive + - type: NPCRetaliation + attackMemoryLength: 10 + - type: HTN + rootTask: + task: RuminantHostileCompound - type: Tag tags: - VimPilot @@ -3186,4 +3203,3 @@ components: - type: ReplacementAccent accent: nymph - \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 7308267473..3e6c603626 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -70,6 +70,7 @@ tags: - Carp - DoorBumpOpener + - NoPaint - type: ReplacementAccent accent: genericAggressive - type: Speech diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml index 68ebf52dc0..4a35f71ac0 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml @@ -93,3 +93,6 @@ - RevenantTheme - type: Speech speechVerb: Ghost + - type: Tag + tags: + - NoPaint diff --git a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml index d892b31fac..9f0d54ee64 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml @@ -104,6 +104,7 @@ - type: Tag tags: - CannotSuicide + - NoPaint # From the uplink injector - type: entity @@ -212,6 +213,7 @@ tags: - CannotSuicide - FootstepSound + - NoPaint - type: Inventory templateId: holoclown - type: Hands @@ -253,3 +255,4 @@ event: !type:GuardianToggleActionEvent useDelay: 2 checkCanInteract: false + checkConsciousness: false diff --git a/Resources/Prototypes/Entities/Mobs/Player/human.yml b/Resources/Prototypes/Entities/Mobs/Player/human.yml index 7ceabee4c8..2c4ac2d70f 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/human.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/human.yml @@ -46,7 +46,7 @@ randomizeName: false - type: NukeOperative - type: Loadout - prototypes: [SyndicateOperativeGearFull] + prototypes: [SyndicateLoneOperativeGearFull] - type: RandomMetadata nameSegments: - SyndicateNamesPrefix diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml index 5404a0fd70..d59c7bfd02 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml @@ -49,7 +49,7 @@ - type: MeleeWeapon animation: WeaponArcBite soundHit: - collection: AlienClaw + path: /Audio/Effects/bite.ogg damage: types: Piercing: 5 diff --git a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml index f00c2f6db3..6c01673322 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/reptilian.yml @@ -40,7 +40,7 @@ damageModifierSet: Scale - type: MeleeWeapon soundHit: - path: /Audio/Weapons/pierce.ogg + collection: AlienClaw angle: 30 animation: WeaponArcClaw damage: diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index 184711ec1e..a271e9d084 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -14,6 +14,8 @@ - type: HumanoidAppearance species: Vox #- type: VoxAccent # Not yet coded + - type: Inventory + speciesId: vox - type: Speech speechVerb: Vox speechSounds: Vox @@ -41,7 +43,7 @@ bloodReagent: AmmoniaBlood - type: MeleeWeapon soundHit: - path: /Audio/Weapons/pierce.ogg + collection: AlienClaw angle: 30 animation: WeaponArcClaw damage: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml index 07569efd0c..bf00dd6327 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml @@ -369,6 +369,9 @@ - type: Icon sprite: Objects/Consumable/Drinks/beerglass.rsi state: icon + - type: Tag + tags: + - Beer - type: entity parent: DrinkGlass @@ -943,6 +946,9 @@ - type: Icon sprite: Objects/Consumable/Drinks/iced_beerglass.rsi state: icon + - type: Tag + tags: + - Beer - type: entity parent: DrinkGlass diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml index 9328ddfff9..a3d5592dbc 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_bottles.yml @@ -355,6 +355,9 @@ - type: Sprite sprite: Objects/Consumable/Drinks/pwinebottle.rsi - type: Sealable + - type: Tag + tags: + - Wine - type: entity parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] @@ -501,6 +504,9 @@ - type: Sprite sprite: Objects/Consumable/Drinks/winebottle.rsi - type: Sealable + - type: Tag + tags: + - Wine # Small Bottles @@ -523,6 +529,9 @@ sprite: Objects/Consumable/Drinks/beer.rsi - type: Openable closeable: false + - type: Tag + tags: + - Beer - type: entity parent: [DrinkBottleVisualsAll, DrinkBottleGlassBaseFull] @@ -543,6 +552,9 @@ sprite: Objects/Consumable/Drinks/beer.rsi - type: Openable closeable: false + - type: Tag + tags: + - Beer - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml index 9f1f7d501a..2c15228e5d 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml @@ -182,6 +182,9 @@ sprite: Objects/Consumable/Drinks/rootbeer.rsi - type: Item sprite: Objects/Consumable/Drinks/rootbeer.rsi + - type: Tag + tags: + - Beer - type: entity parent: DrinkCanBaseFull @@ -479,6 +482,9 @@ sprite: Objects/Consumable/Drinks/beer_can.rsi - type: Item sprite: Objects/Consumable/Drinks/beer_can.rsi + - type: Tag + tags: + - Beer - type: entity parent: DrinkCanBaseFull @@ -498,3 +504,6 @@ sprite: Objects/Consumable/Drinks/wine_can.rsi - type: Item sprite: Objects/Consumable/Drinks/wine_can.rsi + - type: Tag + tags: + - Wine diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml index ba70efb205..a5d9b31760 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml @@ -152,6 +152,8 @@ path: /Audio/Weapons/Guns/Empty/empty.ogg ejectSound: path: /Audio/Weapons/Guns/Empty/empty.ogg + swap: false + disableEject: true - type: Tag tags: - Fruit diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml index b9adbbf051..2793f89065 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml @@ -400,6 +400,9 @@ Quantity: 3 - ReagentId: Fat Quantity: 3 + - type: SliceableFood + count: 3 + slice: FoodMeatCutlet - type: entity name: raw lizard meat @@ -715,6 +718,7 @@ tags: - Cooked - Meat + - Steak - type: Sprite layers: - state: plain-cooked @@ -774,6 +778,7 @@ tags: - Cooked - Meat + - Steak - type: Sprite layers: - state: product-cooked @@ -942,6 +947,7 @@ tags: - Cooked - Meat + - Steak - type: Sprite layers: - state: goliath-cooked @@ -971,6 +977,7 @@ tags: - Cooked - Meat + - Steak - type: Sprite layers: - state: rouny-cooked @@ -996,6 +1003,7 @@ tags: - Cooked - Meat + - Steak - type: Sprite layers: - state: lizard-cooked diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml index 51eb135ecf..3040cb7175 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml @@ -124,6 +124,9 @@ sprite: Objects/Specific/Hydroponics/laughin_pea.rsi - type: Produce seedId: laughinPea + - type: Tag + tags: + - Vegetable - type: entity name: tower-cap log @@ -258,7 +261,8 @@ - type: Tag tags: - Fruit - + - Banana + - type: entity name: mimana parent: FoodProduceBase @@ -413,6 +417,7 @@ - type: Tag tags: - Carrot + - Vegetable - type: SolutionContainerManager solutions: food: @@ -458,6 +463,9 @@ sprite: Objects/Specific/Hydroponics/cabbage.rsi - type: Produce seedId: cabbage + - type: Tag + tags: + - Vegetable - type: entity name: garlic @@ -483,6 +491,9 @@ sprite: Objects/Specific/Hydroponics/garlic.rsi - type: Produce seedId: garlic + - type: Tag + tags: + - Vegetable - type: entity name: lemon @@ -658,6 +669,8 @@ - type: Tag tags: - Potato + - Vegetable + - type: entity name: tomato @@ -712,6 +725,7 @@ - type: Tag tags: - Fruit + - Vegetable - type: entity name: blue tomato @@ -756,6 +770,7 @@ - type: Tag tags: - Fruit + - Vegetable - type: entity name: blood tomato @@ -798,6 +813,7 @@ - type: Tag tags: - Fruit # Fuck you they're a fruit + - Vegetable - type: entity name: eggplant @@ -824,6 +840,7 @@ - type: Tag tags: - Fruit + - Vegetable - type: entity name: apple @@ -912,6 +929,7 @@ - type: Tag tags: - Corn + - Vegetable - type: Sprite sprite: Objects/Specific/Hydroponics/corn.rsi - type: Produce @@ -974,6 +992,9 @@ - type: SliceableFood count: 5 slice: FoodOnionSlice + - type: Tag + tags: + - Vegetable - type: entity name: red onion @@ -1002,6 +1023,9 @@ - type: SliceableFood count: 5 slice: FoodOnionRedSlice + - type: Tag + tags: + - Vegetable - type: entity name: chanterelle cluster @@ -1019,6 +1043,9 @@ sprite: Objects/Specific/Hydroponics/chanterelle.rsi - type: Produce seedId: chanterelle + - type: Tag + tags: + - Vegetable # Slices @@ -1129,6 +1156,9 @@ sprite: Objects/Specific/Hydroponics/chili.rsi - type: Produce seedId: chili + - type: Tag + tags: + - Vegetable - type: entity name: chilly pepper @@ -1180,6 +1210,9 @@ seedId: aloe - type: Extractable grindableSolutionName: food + - type: Tag + tags: + - Vegetable - type: entity name: poppy @@ -1459,6 +1492,9 @@ reagents: - ReagentId: MilkSoy Quantity: 5 + - type: Tag + tags: + - Vegetable - type: entity name: spaceman's trumpet @@ -1512,6 +1548,9 @@ reagents: - ReagentId: CarpoToxin Quantity: 2 + - type: Tag + tags: + - Vegetable - type: entity name: watermelon @@ -1604,9 +1643,6 @@ reagents: - ReagentId: JuiceWatermelon Quantity: 4 - - type: Tag - tags: - - Fruit - type: entity name: grapes @@ -1635,6 +1671,9 @@ reagents: - ReagentId: JuiceGrape Quantity: 10 + - type: Tag + tags: + - Fruit - type: entity name: berries @@ -1707,7 +1746,6 @@ tags: - Recyclable - Trash - - Fruit - type: SolutionContainerManager solutions: food: @@ -1746,6 +1784,9 @@ sprite: Objects/Specific/Hydroponics/pea.rsi - type: Produce seedId: pea + - type: Tag + tags: + - Vegetable - type: entity name: pumpkin @@ -1794,6 +1835,7 @@ - type: Tag tags: - Fruit + - Vegetable - type: entity name: cotton boll @@ -1821,4 +1863,5 @@ seedId: cotton - type: Tag tags: - - ClothMade \ No newline at end of file + - ClothMade + - CottonBoll diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/skewer.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/skewer.yml index 89eb0ee52b..cd05e95a28 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/skewer.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/skewer.yml @@ -96,7 +96,7 @@ - type: entity name: lizard-tail kebab - parent: FoodSkewerBase + parent: FoodMeatKebab id: FoodMeatLizardtailKebab description: Severed lizard tail on a stick. components: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml index 0dca39ea48..ecc3df9589 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/soup.yml @@ -804,6 +804,10 @@ Quantity: 4 - ReagentId: Allicin Quantity: 3 + - type: Tag + tags: + - ChiliBowl + - type: entity name: cold chili @@ -828,6 +832,9 @@ Quantity: 8 - ReagentId: Vitamin Quantity: 4 + - type: Tag + tags: + - ChiliBowl - type: entity name: chili con carnival @@ -858,6 +865,9 @@ Quantity: 4 - ReagentId: Allicin Quantity: 3 + - type: Tag + tags: + - ChiliBowl - type: entity name: monkey's delight diff --git a/Resources/Prototypes/Entities/Objects/Decoration/flora.yml b/Resources/Prototypes/Entities/Objects/Decoration/flora.yml index 1579ffd3d1..0b6b854379 100644 --- a/Resources/Prototypes/Entities/Objects/Decoration/flora.yml +++ b/Resources/Prototypes/Entities/Objects/Decoration/flora.yml @@ -38,7 +38,6 @@ description: Yep, it's a tree. abstract: true components: - - type: IgnoreWeather - type: SpriteFade - type: Clickable - type: Sprite diff --git a/Resources/Prototypes/Entities/Objects/Decoration/present.yml b/Resources/Prototypes/Entities/Objects/Decoration/present.yml index 5c7b49e6f0..bf2fecdec4 100644 --- a/Resources/Prototypes/Entities/Objects/Decoration/present.yml +++ b/Resources/Prototypes/Entities/Objects/Decoration/present.yml @@ -70,6 +70,12 @@ orGroup: GiftPool - id: PlushieCarp orGroup: GiftPool + - id: PlushieMagicarp + orGroup: GiftPool + - id: PlushieHolocarp + orGroup: GiftPool + - id: PlushieRainbowCarp + orGroup: GiftPool - id: PlushieSlime orGroup: GiftPool - id: PlushieSnake diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml index be6c9050a6..c9f2ba5047 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml @@ -1067,6 +1067,9 @@ materialRequirements: Glass: 2 Cable: 2 + - type: Tag + tags: + - MicrowaveMachineBoard - type: entity id: FatExtractorMachineCircuitboard @@ -1285,7 +1288,7 @@ materialRequirements: Steel: 5 CableHV: 5 - + - type: entity id: ShuttleGunPerforatorCircuitboard parent: BaseMachineCircuitboard @@ -1302,7 +1305,7 @@ materialRequirements: Steel: 10 CableHV: 5 - + - type: entity id: ShuttleGunFriendshipCircuitboard parent: BaseMachineCircuitboard @@ -1318,8 +1321,8 @@ Manipulator: 2 materialRequirements: Steel: 7 - CableHV: 5 - + CableHV: 5 + - type: entity id: ShuttleGunDusterCircuitboard parent: BaseMachineCircuitboard @@ -1337,7 +1340,7 @@ Steel: 10 CableHV: 5 Uranium: 2 - + - type: entity id: ShuttleGunKineticCircuitboard parent: BaseMachineCircuitboard @@ -1354,4 +1357,3 @@ materialRequirements: Steel: 5 CableHV: 2 - \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Fun/pai.yml b/Resources/Prototypes/Entities/Objects/Fun/pai.yml index 36e20c22a9..537562f461 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/pai.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/pai.yml @@ -138,6 +138,7 @@ components: - type: InstantAction checkCanInteract: false + checkConsciousness: false icon: Interface/Actions/pai-midi.png event: !type:OpenUiActionEvent key: enum.InstrumentUiKey.Key @@ -150,6 +151,7 @@ components: - type: InstantAction checkCanInteract: false + checkConsciousness: false icon: { sprite: Interface/Actions/pai-map.rsi, state: icon } event: !type:OpenUiActionEvent key: enum.StationMapUiKey.Key diff --git a/Resources/Prototypes/Entities/Objects/Fun/spray_paint.yml b/Resources/Prototypes/Entities/Objects/Fun/spray_paint.yml new file mode 100644 index 0000000000..1b417f6cde --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Fun/spray_paint.yml @@ -0,0 +1,292 @@ +# Base Paints +- type: entity + parent: BaseItem + id: PaintBase + name: spray paint + description: A tin of spray paint. + noSpawn: true + components: + - type: Appearance + - type: Sprite + sprite: Objects/Fun/spraycans.rsi + state: clown_cap + layers: + - state: clown_cap + map: ["enum.OpenableVisuals.Layer"] + - type: Paint + consumptionUnit: 10 + blacklist: + tags: + - NoPaint + - type: Item + sprite: Objects/Fun/spraycans.rsi + heldPrefix: spray + - type: SolutionContainerManager + solutions: + drink: + maxVol: 50 + reagents: + - ReagentId: SpaceGlue + Quantity: 50 + - type: TrashOnSolutionEmpty + solution: drink + - type: Sealable + - type: Openable + sound: + path: /Audio/Effects/pop_high.ogg + closeable: true + closeSound: + path: /Audio/Effects/pop_high.ogg + +# Paints + +# funnypaint +- type: entity + parent: PaintBase + id: FunnyPaint + name: funny paint + description: A tin of funny paint, manufactured by Honk! Co. + components: + - type: Paint + color: "#fa74df" + - type: Item + sprite: Objects/Fun/spraycans.rsi + heldPrefix: clown + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "clown"} + False: {state: "clown_cap"} + +- type: entity + parent: PaintBase + id: FunnyPaintYellow + name: funny paint + description: A tin of funny paint, manufactured by Honk! Co. + components: + - type: Paint + color: "#d5e028" + - type: Item + sprite: Objects/Fun/spraycans.rsi + heldPrefix: clown + - type: Sprite + sprite: Objects/Fun/spraycans.rsi + state: clown2_cap + layers: + - state: clown2_cap + map: ["enum.OpenableVisuals.Layer"] + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "clown2"} + False: {state: "clown2_cap"} + +#death paint +- type: entity + parent: PaintBase + id: DeathPaint + components: + - type: Paint + color: "#ff20c8" + - type: Item + sprite: Objects/Fun/spraycans.rsi + heldPrefix: spray + - type: Sprite + sprite: Objects/Fun/spraycans.rsi + state: death_cap + layers: + - state: death_cap + map: ["enum.OpenableVisuals.Layer"] + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "death"} + False: {state: "death_cap"} + +- type: entity + parent: PaintBase + id: DeathPaintTwo + components: + - type: Paint + color: "#ff2020" + - type: Item + sprite: Objects/Fun/spraycans.rsi + heldPrefix: spray + - type: Sprite + sprite: Objects/Fun/spraycans.rsi + state: death2_cap + layers: + - state: death2_cap + map: ["enum.OpenableVisuals.Layer"] + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "death2"} + False: {state: "death2_cap"} + +#Sprays + +#Blue +- type: entity + parent: PaintBase + id: SprayPaintBlue + suffix: Blue + components: + - type: Sprite + sprite: Objects/Fun/spraycans.rsi + layers: + - state: spray + map: ["Base"] + - state: spray_cap_colors + map: ["enum.OpenableVisuals.Layer"] + color: "#5890f7" + - type: Paint + color: "#5890f7" + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "spray_colors" , color: "#5890f7"} + False: {state: "spray_cap_colors" , color: "#5890f7"} + +#Red +- type: entity + parent: PaintBase + id: SprayPaintRed + suffix: Red + components: + - type: Sprite + sprite: Objects/Fun/spraycans.rsi + layers: + - state: spray + map: ["Base"] + - state: spray_cap_colors + map: ["enum.OpenableVisuals.Layer"] + color: "#ff3b3b" + - type: Paint + color: "#ff3b3b" + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "spray_colors" , color: "#ff3b3b"} + False: {state: "spray_cap_colors" , color: "#ff3b3b"} + +#Green +- type: entity + parent: PaintBase + id: SprayPaintGreen + suffix: Green + components: + - type: Sprite + sprite: Objects/Fun/spraycans.rsi + layers: + - state: spray + map: ["Base"] + - state: spray_cap_colors + map: ["enum.OpenableVisuals.Layer"] + color: "#73f170" + - type: Paint + color: "#73f170" + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "spray_colors" , color: "#73f170"} + False: {state: "spray_cap_colors" , color: "#73f170"} + +#Black +- type: entity + parent: PaintBase + id: SprayPaintBlack + suffix: Black + components: + - type: Sprite + sprite: Objects/Fun/spraycans.rsi + layers: + - state: spray + map: ["Base"] + - state: spray_cap_colors + map: ["enum.OpenableVisuals.Layer"] + color: "#3a3a3a" + - type: Paint + color: "#3a3a3a" + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "spray_colors" , color: "#3a3a3a"} + False: {state: "spray_cap_colors" , color: "#3a3a3a"} + +#Orange +- type: entity + parent: PaintBase + id: SprayPaintOrange + suffix: Orange + components: + - type: Sprite + sprite: Objects/Fun/spraycans.rsi + layers: + - state: spray + map: ["Base"] + - state: spray_cap_colors + map: ["enum.OpenableVisuals.Layer"] + color: "#f6a44b" + - type: Paint + color: "#f6a44b" + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "spray_colors" , color: "#f6a44b"} + False: {state: "spray_cap_colors" , color: "#f6a44b"} + +#Purple +- type: entity + parent: PaintBase + id: SprayPaintPurple + suffix: Purple + components: + - type: Sprite + sprite: Objects/Fun/spraycans.rsi + layers: + - state: spray + map: ["Base"] + - state: spray_cap_colors + map: ["enum.OpenableVisuals.Layer"] + color: "#c063f5" + - type: Paint + color: "#c063f5" + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "spray_colors" , color: "#c063f5"} + False: {state: "spray_cap_colors" , color: "#c063f5"} + +#White +- type: entity + parent: PaintBase + id: SprayPaintWhite + suffix: White + components: + - type: Sprite + sprite: Objects/Fun/spraycans.rsi + layers: + - state: spray + map: ["Base"] + - state: spray_cap_colors + map: ["enum.OpenableVisuals.Layer"] + color: "#f2f2f2" + - type: Paint + color: "#f2f2f2" + - type: GenericVisualizer + visuals: + enum.OpenableVisuals.Opened: + enum.OpenableVisuals.Layer: + True: {state: "spray_colors" , color: "#f2f2f2"} + False: {state: "spray_cap_colors" , color: "#f2f2f2"} diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index 6c4f5e9cfc..7f3195a700 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -510,6 +510,38 @@ angle: 0 animation: WeaponArcBite # Rrrr! +- type: entity + parent: PlushieCarp + id: PlushieMagicarp + name: magicarp plushie + description: An adorable stuffed toy resembling the exceedingly rare magicarp. + components: + - type: Sprite + state: magicplush + +- type: entity + parent: PlushieCarp + id: PlushieRainbowCarp + name: rainbow carp plushie + description: An adorable stuffed toy resembling the legendary rainbow carp. + components: + - type: Sprite + state: rainbowcarpplush + - type: PointLight + radius: 1.5 + energy: 2 + - type: RgbLightController + layers: [ 0 ] + +- type: entity + parent: PlushieCarp + id: PlushieHolocarp + name: holocarp plushie + description: A holographic stuffed toy resembling science's nemesis - the holocarp. + components: + - type: Sprite + state: holoplush + - type: entity parent: BasePlushie id: PlushieSlime @@ -595,6 +627,9 @@ requiresSpecialDigestion: true useSound: path: /Audio/Items/Toys/mousesqueek.ogg + - type: Tag + tags: + - ToyRubberDuck - type: entity parent: BasePlushie @@ -876,6 +911,7 @@ - type: Tag tags: - Sidearm + - ToySidearm - type: Gun selectedMode: SemiAuto availableModes: @@ -908,14 +944,14 @@ suffix: Fake description: Looks almost like the real thing! Ages 8 and up. components: - - type: RevolverAmmoProvider - whitelist: - tags: - - CartridgeCap - - SpeedLoaderCap - - CartridgeMagnum - - SpeedLoaderMagnum - proto: CartridgeMagnumAP + - type: RevolverAmmoProvider + whitelist: + tags: + - CartridgeCap + - SpeedLoaderCap + - CartridgeMagnum + - SpeedLoaderMagnum + proto: CartridgeMagnumAP - type: entity parent: BaseItem @@ -1368,6 +1404,9 @@ reagents: - ReagentId: Nothing Quantity: 100 + - type: Tag + tags: + - Banana - type: entity parent: DrinkBase @@ -1404,6 +1443,9 @@ Quantity: 100 - type: TrashOnSolutionEmpty solution: drink + - type: Tag + tags: + - DrinkSpaceGlue - type: entity parent: BaseItem diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml index 858f3d4539..c8c65d337d 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/glass.yml @@ -15,6 +15,7 @@ - type: Tag tags: - Sheet + - NoPaint - type: Material - type: Damageable damageContainer: Inorganic diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml index 32c21d9d86..75b8b093bd 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/metal.yml @@ -15,6 +15,7 @@ tags: - Sheet - Metal + - NoPaint - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic diff --git a/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml b/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml index a54c51d05d..5327fa0a9b 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/Sheets/other.yml @@ -12,6 +12,7 @@ - type: Tag tags: - Sheet + - NoPaint - type: Damageable damageContainer: Inorganic - type: Destructible @@ -112,6 +113,7 @@ - type: Tag tags: - Sheet + - NoPaint - type: entity parent: SheetPlasma @@ -136,6 +138,7 @@ tags: - Plastic - Sheet + - NoPaint - type: Material - type: PhysicalComposition materialComposition: diff --git a/Resources/Prototypes/Entities/Objects/Materials/materials.yml b/Resources/Prototypes/Entities/Objects/Materials/materials.yml index a137362af8..2accb6cd42 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/materials.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/materials.yml @@ -12,6 +12,7 @@ - type: Tag tags: - RawMaterial + - NoPaint - type: Damageable damageContainer: Inorganic - type: Destructible @@ -614,3 +615,22 @@ count: 1 - type: Item size: 1 + +- type: entity + parent: MaterialBase + id: MaterialGunpowder + name: gunpowder + description: An explosive compound. + components: + - type: Stack + stackType: Gunpowder + count: 1 + - type: Sprite + sprite: Objects/Misc/reagent_fillings.rsi + state: powderpile + color: darkgray + - type: PhysicalComposition + materialComposition: + Gunpowder: 100 + - type: Item + size: 1 diff --git a/Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml b/Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml index 902fc8321f..0b8b113681 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/bedsheets.yml @@ -20,6 +20,9 @@ - neck - type: StaticPrice price: 100 + - type: Tag + tags: + - Bedsheet - type: entity id: BedsheetBlack diff --git a/Resources/Prototypes/Entities/Objects/Misc/carpets.yml b/Resources/Prototypes/Entities/Objects/Misc/carpets.yml index d8f3266730..dca2d40aed 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/carpets.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/carpets.yml @@ -15,7 +15,7 @@ - type: Stack stackType: FloorCarpetRed - type: Tag - tags: + tags: - CarpetRed - type: SpawnAfterInteract #Nuke after convert to FloorTile prototype: Carpet @@ -34,7 +34,7 @@ - type: Stack stackType: FloorCarpetBlack - type: Tag - tags: + tags: - CarpetBlack - type: SpawnAfterInteract #Nuke after convert to FloorTile prototype: CarpetBlack @@ -53,7 +53,7 @@ - type: Stack stackType: FloorCarpetBlue - type: Tag - tags: + tags: - CarpetBlue - type: SpawnAfterInteract #Nuke after convert to FloorTile prototype: CarpetBlue @@ -72,7 +72,7 @@ - type: Stack stackType: FloorCarpetGreen - type: Tag - tags: + tags: - CarpetGreen - type: SpawnAfterInteract #Nuke after convert to FloorTile prototype: CarpetGreen @@ -91,7 +91,7 @@ - type: Stack stackType: FloorCarpetOrange - type: Tag - tags: + tags: - CarpetOrange - type: SpawnAfterInteract #Nuke after convert to FloorTile prototype: CarpetOrange @@ -109,6 +109,9 @@ heldPrefix: carpet-skyblue - type: Stack stackType: FloorCarpetSkyBlue + - type: Tag + tags: + - CarpetSBlue - type: SpawnAfterInteract #Nuke after convert to FloorTile prototype: CarpetSBlue doAfter: 0.5 @@ -126,7 +129,7 @@ - type: Stack stackType: FloorCarpetPurple - type: Tag - tags: + tags: - CarpetPurple - type: SpawnAfterInteract #Nuke after convert to FloorTile prototype: CarpetPurple @@ -145,7 +148,7 @@ - type: Stack stackType: FloorCarpetPink - type: Tag - tags: + tags: - CarpetPink - type: SpawnAfterInteract #Nuke after convert to FloorTile prototype: CarpetPink @@ -164,7 +167,7 @@ - type: Stack stackType: FloorCarpetCyan - type: Tag - tags: + tags: - CarpetCyan - type: SpawnAfterInteract #Nuke after convert to FloorTile prototype: CarpetCyan @@ -183,7 +186,7 @@ - type: Stack stackType: FloorCarpetWhite - type: Tag - tags: + tags: - CarpetWhite - type: SpawnAfterInteract #Nuke after convert to FloorTile prototype: CarpetWhite diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index 868776a715..f4dfaf68f8 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -586,8 +586,8 @@ id: AgentIDCard suffix: Agent components: - - type: IdCard - jobTitle: Passenger + - type: PresetIdCard + job: Passenger - type: Access tags: - Maintenance diff --git a/Resources/Prototypes/Entities/Objects/Misc/implanters.yml b/Resources/Prototypes/Entities/Objects/Misc/implanters.yml index d9d0cb5829..1129815665 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/implanters.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/implanters.yml @@ -119,6 +119,8 @@ implantOnly: True: {state: broken} False: {state: implanter1} + - type: Tag + tags: [] #Fun implanters diff --git a/Resources/Prototypes/Entities/Objects/Misc/kudzu.yml b/Resources/Prototypes/Entities/Objects/Misc/kudzu.yml index 5de1f0b7f9..657201912e 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/kudzu.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/kudzu.yml @@ -82,7 +82,7 @@ - type: AtmosExposed growthTickChance: 0.3 spreadChance: 0.4 - - type: SlowContacts + - type: SpeedModifierContacts walkSpeedModifier: 0.2 sprintSpeedModifier: 0.2 ignoreWhitelist: @@ -123,7 +123,7 @@ - type: Kudzu spriteVariants: 5 spreadChance: 0.01 - - type: SlowContacts + - type: SpeedModifierContacts walkSpeedModifier: 0.8 sprintSpeedModifier: 0.8 ignoreWhitelist: @@ -237,7 +237,7 @@ Heat: 3 growthTickChance: 0.3 - type: AtmosExposed - - type: SlowContacts + - type: SpeedModifierContacts walkSpeedModifier: 0.3 sprintSpeedModifier: 0.3 ignoreWhitelist: diff --git a/Resources/Prototypes/Entities/Objects/Misc/rubber_stamp.yml b/Resources/Prototypes/Entities/Objects/Misc/rubber_stamp.yml index 45d258a30d..89d44b5108 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/rubber_stamp.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/rubber_stamp.yml @@ -76,6 +76,19 @@ - type: Sprite state: stamp-chaplain +- type: entity + name: lawyer's rubber stamp + parent: RubberStampBase + id: RubberStampLawyer + suffix: DO NOT MAP + components: + - type: Stamp + stampedName: stamp-component-stamped-name-lawyer + stampedColor: "#233D57" + stampState: "paper_stamp-lawyer" + - type: Sprite + state: stamp-lawyer + - type: entity name: clown's rubber stamp parent: RubberStampBase diff --git a/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml b/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml index af65ac95a8..e1f4d086d4 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/spider_web.yml @@ -72,7 +72,7 @@ Flammable: [Touch] Extinguish: [Touch] - type: SpiderWebObject - - type: SlowContacts + - type: SpeedModifierContacts walkSpeedModifier: 0.5 sprintSpeedModifier: 0.5 ignoreWhitelist: diff --git a/Resources/Prototypes/Entities/Objects/Misc/tiles.yml b/Resources/Prototypes/Entities/Objects/Misc/tiles.yml index f90fa8aeec..1d0c90feca 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/tiles.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/tiles.yml @@ -14,6 +14,9 @@ Blunt: 5 - type: Stack count: 1 + - type: Tag + tags: + - NoPaint - type: Damageable damageContainer: Inorganic - type: Destructible diff --git a/Resources/Prototypes/Entities/Objects/Misc/utensils.yml b/Resources/Prototypes/Entities/Objects/Misc/utensils.yml index 4ac05e1e4b..4250669581 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/utensils.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/utensils.yml @@ -7,9 +7,6 @@ sprite: Objects/Misc/utensils.rsi - type: Item # TODO add inhand sprites for all utensils sprite: Objects/Misc/utensils.rsi - - type: Tag - tags: - - Metal - type: SpaceGarbage - type: entity @@ -23,8 +20,14 @@ price: 0 - type: Tag tags: - - Plastic - - Trash + - Plastic + - Trash + - type: MeleeWeapon + wideAnimationRotation: 180 + attackRate: 1.5 + damage: + types: + Blunt: 0 - type: entity parent: UtensilBase @@ -66,6 +69,9 @@ name: spoon description: There is no spoon. components: + - type: Tag + tags: + - Metal - type: Sprite state: spoon - type: Item @@ -99,7 +105,7 @@ speedModifier: 0.1 # you can try - type: entity - parent: UtensilBase + parent: UtensilBasePlastic id: KnifePlastic name: plastic knife description: That's not a knife. This is a knife. @@ -109,3 +115,8 @@ - type: Utensil types: - Knife + - type: Tag + tags: + - Plastic + - Trash + - Knife diff --git a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml index 925e036e09..c628d199a9 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Cargo/cargo_pallet.yml @@ -21,6 +21,7 @@ mask: - MachineMask - type: CargoPallet + palletType: All - type: StaticPrice price: 100 - type: Sprite @@ -53,3 +54,33 @@ - type: GuideHelp guides: - Cargo + +- type: entity + id: CargoPalletSell + name: cargo selling pallet + description: Designates valid items to sell with a selling computer, or to CentCom when a shuttle is recalled. + parent: CargoPallet + components: + - type: CargoPallet + palletType: sell + - type: Sprite + drawdepth: FloorTiles + layers: + - sprite: Structures/cargo_pallets.rsi + state: cargo_pallet_sell + + +- type: entity + id: CargoPalletBuy + name: cargo buying pallet + description: Designates where orders will appear when purchased. + parent: CargoPallet + components: + - type: CargoPallet + palletType: buy + - type: Sprite + drawdepth: FloorTiles + layers: + - sprite: Structures/cargo_pallets.rsi + state: cargo_pallet_buy + diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml index 2f80d6ff97..13c740e310 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/soap.yml @@ -61,6 +61,7 @@ solution: soap - type: DeleteOnSolutionEmpty solution: soap + - type: PaintRemover - type: FlavorProfile flavors: - clean diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml index 2b443dc18b..4601824afc 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/surgery.yml @@ -8,6 +8,9 @@ - type: Sprite - type: StaticPrice price: 20 + - type: Tag + tags: + - SurgeryTool # Cautery diff --git a/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml b/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml index d6ebe60a91..eb2509de85 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml @@ -112,6 +112,19 @@ tags: - NukeOpsUplink +- type: entity + parent: BaseUplinkRadio + id: BaseUplinkRadio60TC + suffix: 60 TC, LoneOps + components: + - type: Store + preset: StorePresetUplink + balance: + Telecrystal: 60 + - type: Tag + tags: + - NukeOpsUplink + - type: entity parent: BaseUplinkRadio id: BaseUplinkRadioDebug diff --git a/Resources/Prototypes/Entities/Objects/Tools/jammer.yml b/Resources/Prototypes/Entities/Objects/Tools/jammer.yml index e0a68156e0..beb3695627 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/jammer.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/jammer.yml @@ -2,7 +2,7 @@ name: radio jammer parent: BaseItem id: RadioJammer - description: This device will disrupt any nearby outgoing radio communication when activated. + description: This device will disrupt any nearby outgoing radio communication as well as suit sensors when activated. components: - type: Sprite sprite: Objects/Devices/jammer.rsi diff --git a/Resources/Prototypes/Entities/Objects/Tools/lantern.yml b/Resources/Prototypes/Entities/Objects/Tools/lantern.yml index 71b27ed31e..89101e34ff 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/lantern.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/lantern.yml @@ -61,6 +61,9 @@ quickEquip: false slots: - Belt + - type: Tag + tags: + - Flashlight - type: entity parent: Lantern diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/ied.yml b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/firebomb.yml similarity index 83% rename from Resources/Prototypes/Entities/Objects/Weapons/Bombs/ied.yml rename to Resources/Prototypes/Entities/Objects/Weapons/Bombs/firebomb.yml index c4420a43a3..a0e6fe7728 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/ied.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/firebomb.yml @@ -3,8 +3,8 @@ # with that you could make napalm ied instead of welding fuel with no additional complexity - type: entity parent: BaseItem - id: ImprovisedExplosive - name: improvised explosive device + id: FireBomb + name: fire bomb description: A weak, improvised incendiary device. components: - type: Sprite @@ -26,10 +26,10 @@ volume: 1 - type: RandomTimerTrigger min: 0 - max: 60 - - type: Explosive # Weak explosion in a very small radius. Doesn't break underplating. - explosionType: Default - totalIntensity: 20 + max: 15 + - type: Explosive # Weak explosion in a very small radius. Ignites surrounding entities. + explosionType: FireBomb + totalIntensity: 25 intensitySlope: 5 maxIntensity: 3 canCreateVacuum: false @@ -50,14 +50,14 @@ acts: ["Destruction"] - !type:ExplodeBehavior - type: Construction - graph: ImprovisedExplosive - node: ied + graph: FireBomb + node: firebomb # has igniter but no fuel or wires - type: entity parent: DrinkColaCanEmpty - id: ImprovisedExplosiveEmpty - name: improvised explosive device + id: FireBombEmpty + name: fire bomb suffix: empty description: A weak, improvised incendiary device. This one has no fuel. components: @@ -74,17 +74,17 @@ True: {state: "base"} False: {state: "base"} - type: Construction - graph: ImprovisedExplosive + graph: FireBomb node: empty - defaultTarget: ied + defaultTarget: firebomb - type: Tag tags: - Trash # no DrinkCan, prevent using it to make another ied - type: entity - parent: ImprovisedExplosiveEmpty - id: ImprovisedExplosiveFuel + parent: FireBombEmpty + id: FireBombFuel suffix: fuel description: A weak, improvised incendiary device. This one is missing wires. components: @@ -102,6 +102,6 @@ Quantity: 30 - type: Construction node: fuel - defaultTarget: ied + defaultTarget: firebomb - type: Tag tags: [] diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/funny.yml b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/funny.yml index 909a63d1b8..752cd6b72e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/funny.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/funny.yml @@ -117,3 +117,6 @@ - id: TrashBananaPeelExplosive sound: path: /Audio/Effects/unwrap.ogg + - type: Tag + tags: + - Banana diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Bombs/pipebomb.yml b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/pipebomb.yml new file mode 100644 index 0000000000..5fb6829ac2 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Bombs/pipebomb.yml @@ -0,0 +1,62 @@ +- type: entity + parent: GrenadeBase + id: PipeBomb + name: pipe bomb + description: An improvised explosive made from pipes and wire. + components: + - type: Sprite + sprite: Objects/Weapons/Bombs/pipebomb.rsi + layers: + - state: base + map: ["enum.TriggerVisualLayers.Base"] + - state: wires + - type: OnUseTimerTrigger # todo: make it activate through welder/lighter/fire instead + delay: 5 + examinable: false + initialBeepDelay: 0 + beepSound: /Audio/Effects/lightburn.ogg + - type: RandomTimerTrigger + min: 1 + max: 10 + - type: ExplodeOnTrigger + - type: Explosive # Weak explosion in a very small radius. Doesn't break underplating. + explosionType: Default + totalIntensity: 50 + intensitySlope: 5 + maxIntensity: 6 + canCreateVacuum: false + - type: Appearance + - type: TimerTriggerVisuals + - type: Construction + graph: PipeBomb + node: pipebomb + +- type: entity + parent: BaseItem + id: PipeBombGunpowder + name: pipe bomb + description: An improvised explosive made from a pipe. This one has no gunpowder. + suffix: Gunpowder + components: + - type: Sprite + sprite: Objects/Weapons/Bombs/pipebomb.rsi + state: base + - type: Construction + graph: PipeBomb + node: gunpowder + defaultTarget: pipebomb + +- type: entity + parent: BaseItem + id: PipeBombCable + name: pipe bomb + description: An improvised explosive made from a pipe. This one has no cable. + suffix: Cable + components: + - type: Sprite + sprite: Objects/Weapons/Bombs/pipebomb.rsi + state: base + - type: Construction + graph: PipeBomb + node: cable + defaultTarget: pipebomb \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index f859e44eaf..19345e5ee9 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -81,6 +81,7 @@ quickEquip: false slots: - Belt + - suitStorage - type: entity id: BaseWeaponPowerCellSmall diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml index 696cbcff9b..72d7ef9d76 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Launchers/launchers.yml @@ -33,6 +33,9 @@ map: ["enum.GunVisualLayers.Base"] - type: Clothing sprite: Objects/Weapons/Guns/Launchers/china_lake.rsi + slots: + - Back + - suitStorage - type: AmmoCounter - type: Gun fireRate: 1 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml index e0ae8361d3..6af98fb8e4 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Snipers/snipers.yml @@ -16,6 +16,7 @@ quickEquip: false slots: - Back + - suitStorage - type: AmmoCounter - type: Gun fireRate: 0.75 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml index d41346380c..8ed80bfbe6 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/flare_gun.yml @@ -36,3 +36,4 @@ quickEquip: false slots: - Belt + - suitStorage diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index d0c7b463a2..9eea5de78e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -78,6 +78,9 @@ malus: 0 - type: Reflect enabled: false + - type: Tag + tags: + - NoPaint - type: IgnitionSource temperature: 700 @@ -156,6 +159,7 @@ - type: Tag tags: - Write + - NoPaint - type: DisarmMalus malus: 0 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml index d63cbdd31d..896a26c8e1 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml @@ -358,11 +358,11 @@ duration: 30 spreadAmount: 50 - type: SoundOnTrigger - sound: /Audio/Effects/smoke.ogg + sound: /Audio/Items/smoke_grenade_smoke.ogg - type: DeleteOnTrigger - type: TimerTriggerVisuals primingSound: - path: /Audio/Effects/Smoke-grenade.ogg + path: /Audio/Items/smoke_grenade_prime.ogg - type: entity parent: SmokeGrenade diff --git a/Resources/Prototypes/Entities/Structures/Decoration/bonfire.yml b/Resources/Prototypes/Entities/Structures/Decoration/bonfire.yml index 7777153bba..f82fe8b51b 100644 --- a/Resources/Prototypes/Entities/Structures/Decoration/bonfire.yml +++ b/Resources/Prototypes/Entities/Structures/Decoration/bonfire.yml @@ -31,6 +31,9 @@ sound: path: /Audio/Ambience/Objects/fireplace.ogg - type: AlwaysHot + - type: Tag + tags: + - NoPaint - type: entity id: LegionnaireBonfire diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml index a185d45353..5fca081998 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml @@ -147,6 +147,7 @@ - Airlock # This tag is used to nagivate the Airlock construction graph. It's needed because the construction graph is shared between Airlock, AirlockGlass, and HighSecDoor - type: PryUnpowered + - type: BlockWeather placement: mode: SnapgridCenter diff --git a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml index d3b8521a9b..4b6f72de93 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/MaterialDoors/material_doors.yml @@ -56,6 +56,7 @@ key: walls mode: NoSprite - type: Occluder + - type: BlockWeather - type: entity parent: BaseMaterialDoor diff --git a/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml b/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml index 154467213a..2c54d3cd41 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/SecretDoor/secret_door.yml @@ -64,6 +64,7 @@ - type: ContainerContainer containers: battery-container: !type:Container + - type: BlockWeather - type: entity id: BaseSecretDoorAssembly diff --git a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml index 87fd8ef010..e38ba1fd66 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml @@ -97,6 +97,7 @@ messagePerceivedByOthers: comp-window-knock interactSuccessSound: path: /Audio/Effects/glass_knock.ogg + - type: BlockWeather - type: entity id: ShuttersNormal diff --git a/Resources/Prototypes/Entities/Structures/Furniture/bookshelf.yml b/Resources/Prototypes/Entities/Structures/Furniture/bookshelf.yml index a61b19c72f..42eafd4511 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/bookshelf.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/bookshelf.yml @@ -66,3 +66,4 @@ - type: Construction graph: Bookshelf node: bookshelf + - type: BlockWeather diff --git a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml index 7853879d8c..31a21c8f6b 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/chairs.yml @@ -4,7 +4,7 @@ abstract: true description: You sit in this. Either by will or force. placement: - mode: SnapgridCenter + mode: PlaceFree components: - type: Clickable - type: InteractionOutline @@ -65,6 +65,8 @@ id: ChairBase abstract: true parent: UnanchoredChairBase + placement: + mode: SnapgridCenter components: - type: Physics bodyType: Static @@ -87,6 +89,8 @@ id: StoolBase parent: OfficeChairBase abstract: true + placement: + mode: SnapgridCenter components: - type: Physics bodyType: Static @@ -116,7 +120,7 @@ - type: entity name: stool id: Stool - parent: ChairBase + parent: UnanchoredChairBase description: Apply butt. components: - type: Sprite @@ -241,7 +245,7 @@ - type: entity id: ChairMeat - parent: ChairBase + parent: UnanchoredChairBase name: meat chair description: Uncomfortably sweaty. components: @@ -285,7 +289,7 @@ name: web chair id: ChairWeb description: For true web developers. - parent: ChairBase + parent: UnanchoredChairBase components: - type: Sprite sprite: Structures/Web/chair.rsi @@ -347,8 +351,6 @@ parent: ChairFolding id: ChairFoldingSpawnFolded suffix: folded - placement: - mode: PlaceFree components: - type: Foldable folded: true @@ -365,3 +367,32 @@ graph: Seat node: chairSteelBench +- type: entity + name: wooden bench + id: WoodenBench + parent: ChairBase + description: Did you get a splinter? Well, at least it’s eco friendly. + components: + - type: Sprite + state: wooden-bench + - type: Construction + graph: Seat + node: chairWoodBench + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 50 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - !type:PlaySoundBehavior + sound: + collection: WoodDestroy + - !type:SpawnEntitiesBehavior + spawn: + MaterialWoodPlank: + min: 2 + max: 4 + - type: StaticPrice + price: 20 diff --git a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml index 7f7100f40a..cc1295333d 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml @@ -51,6 +51,18 @@ components: - type: StorageFill contents: + - id: ClothingUniformRandomArmless + prob: 0.05 + orGroup: dressermainloot + - id: ClothingUniformRandomStandart + prob: 0.05 + orGroup: dressermainloot + - id: ClothingUniformRandomBra + prob: 0.05 + orGroup: dressermainloot + - id: ClothingUniformRandomShorts + prob: 0.05 + orGroup: dressermainloot - id: ClothingNeckLGBTPin prob: 0.06 orGroup: dressermainloot diff --git a/Resources/Prototypes/Entities/Structures/Holographic/projections.yml b/Resources/Prototypes/Entities/Structures/Holographic/projections.yml index d2a5853fcb..b8717cf6cc 100644 --- a/Resources/Prototypes/Entities/Structures/Holographic/projections.yml +++ b/Resources/Prototypes/Entities/Structures/Holographic/projections.yml @@ -25,6 +25,9 @@ behaviors: - !type:DoActsBehavior acts: [ "Destruction" ] + - type: Tag + tags: + - NoPaint - type: entity id: HoloFan diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml index d2ba7cd544..85f6dc6894 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml @@ -63,6 +63,9 @@ - PlushieSpaceLizard - PlushieNuke - PlushieCarp + - PlushieMagicarp + - PlushieHolocarp + - PlushieRainbowCarp - PlushieRatvar - PlushieNar - PlushieSnake diff --git a/Resources/Prototypes/Entities/Structures/Machines/bombs.yml b/Resources/Prototypes/Entities/Structures/Machines/bombs.yml index 580253f118..89cadab6b1 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/bombs.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/bombs.yml @@ -127,6 +127,18 @@ intensitySlope: 3 maxIntensity: 400 +- type: entity + parent: SyndicateBomb + id: SyndicateBombFake + suffix: fake + components: + - type: Explosive + explosionType: Default + totalIntensity: 5.0 + intensitySlope: 5 + maxIntensity: 4 + canCreateVacuum: false + - type: entity parent: SyndicateBomb id: DebugHardBomb diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 7d217376b1..3c2b8f2516 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -907,6 +907,8 @@ - ClothingUniformJumpskirtDetective - ClothingUniformJumpsuitEngineering - ClothingUniformJumpskirtEngineering + - ClothingUniformJumpsuitSeniorEngineer + - ClothingUniformJumpskirtSeniorEngineer - ClothingHeadHatHopcap - ClothingUniformJumpsuitHoP - ClothingUniformJumpskirtHoP @@ -932,11 +934,15 @@ - ClothingHeadHatBeretSeniorPhysician - ClothingUniformJumpsuitMedicalDoctor - ClothingUniformJumpskirtMedicalDoctor + - ClothingUniformJumpsuitSeniorPhysician + - ClothingUniformJumpskirtSeniorPhysician - ClothingUniformJumpsuitMime - ClothingUniformJumpskirtMime - ClothingUniformJumpsuitMusician - ClothingUniformJumpsuitParamedic - ClothingUniformJumpskirtParamedic + - ClothingUniformJumpsuitSeniorOfficer + - ClothingUniformJumpskirtSeniorOfficer - ClothingUniformJumpsuitPrisoner - ClothingUniformJumpskirtPrisoner - ClothingHeadHatQMsoft @@ -951,6 +957,8 @@ - ClothingUniformJumpskirtResearchDirector - ClothingUniformJumpsuitScientist - ClothingUniformJumpskirtScientist + - ClothingUniformJumpsuitSeniorResearcher + - ClothingUniformJumpskirtSeniorResearcher - ClothingHeadHatBeretSecurity - ClothingUniformJumpsuitSec - ClothingUniformJumpskirtSec diff --git a/Resources/Prototypes/Entities/Structures/Machines/material_reclaimer.yml b/Resources/Prototypes/Entities/Structures/Machines/material_reclaimer.yml index 829525439e..028e348fd4 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/material_reclaimer.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/material_reclaimer.yml @@ -77,6 +77,7 @@ - Material - Pda - IdCard + - Brain tags: - HighRiskItem soundCooldown: 0 diff --git a/Resources/Prototypes/Entities/Structures/Machines/stasisbed.yml b/Resources/Prototypes/Entities/Structures/Machines/stasisbed.yml index 5f7182f7dd..c523e7d68d 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/stasisbed.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/stasisbed.yml @@ -7,6 +7,11 @@ - type: StasisBed baseMultiplier: 10 - type: AntiRotOnBuckle + - type: HealOnBuckle + damage: + types: + Poison: -0.001 + Blunt: -0.001 - type: Sprite sprite: Structures/Machines/stasis_bed.rsi noRot: true diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index 88ae5bb6d7..472f40fdcc 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -359,6 +359,7 @@ screenState: screen ejectDelay: 5 soundVend: /Audio/Machines/machine_vend_hot_drink.ogg + initialStockQuality: 0.33 - type: Advertise pack: HotDrinksMachineAds - type: Speech @@ -396,6 +397,7 @@ ejectState: eject-unshaded denyState: deny-unshaded ejectDelay: 1.9 + initialStockQuality: 0.33 - type: Advertise pack: RobustSoftdrinksAds - type: Speech @@ -539,6 +541,7 @@ ejectState: eject-unshaded denyState: deny-unshaded ejectDelay: 1.9 + initialStockQuality: 0.33 - type: Advertise pack: RobustSoftdrinksAds - type: Speech @@ -573,6 +576,7 @@ ejectState: eject-unshaded denyState: deny-unshaded ejectDelay: 1.9 + initialStockQuality: 0.33 - type: Advertise pack: RobustSoftdrinksAds - type: Speech @@ -607,6 +611,7 @@ ejectState: eject-unshaded denyState: deny-unshaded ejectDelay: 1.9 + initialStockQuality: 0.33 - type: Advertise pack: RobustSoftdrinksAds - type: Speech @@ -697,6 +702,7 @@ offState: off brokenState: broken normalState: normal-unshaded + initialStockQuality: 0.33 - type: Advertise pack: DiscountDansAds - type: Speech @@ -902,6 +908,7 @@ normalState: normal-unshaded ejectState: eject-unshaded denyState: deny-unshaded + initialStockQuality: 0.33 - type: Advertise pack: GetmoreChocolateCorpAds - type: Speech @@ -1045,6 +1052,7 @@ normalState: normal-unshaded ejectState: eject-unshaded denyState: deny-unshaded + initialStockQuality: 0.33 - type: Advertise pack: BodaAds - type: Speech @@ -1236,6 +1244,7 @@ offState: off brokenState: broken normalState: normal-unshaded + initialStockQuality: 0.33 - type: Advertise pack: ChangAds - type: Speech @@ -1258,7 +1267,7 @@ parent: VendingMachine id: VendingMachineSalvage name: Salvage Vendor - description: A dwarves best friend! + description: A dwarf's best friend! components: - type: VendingMachine pack: SalvageEquipmentInventory @@ -1299,6 +1308,7 @@ offState: off brokenState: broken normalState: normal-unshaded + initialStockQuality: 0.33 - type: Advertise pack: DonutAds - type: Speech @@ -1911,6 +1921,7 @@ denyState: deny-unshaded ejectDelay: 1.9 soundVend: /Audio/Items/bikehorn.ogg + initialStockQuality: 1.0 # Nobody knows how Honk does it, but their vending machines always seem well-stocked... - type: Sprite sprite: Structures/Machines/VendingMachines/happyhonk.rsi layers: diff --git a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml index 897b7be6ff..cd44f5f585 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml @@ -74,7 +74,7 @@ bounds: "-0.25,-0.25,0.25,0.25" density: 190 mask: - - MachineMask + - SmallMobMask layer: - MachineLayer - type: AtmosDevice diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml index 7ab24f6b5c..783bec3ba0 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/base_structurelockers.yml @@ -44,6 +44,11 @@ SheetSteel1: min: 1 max: 2 + - type: Construction + graph: ClosetSteel + node: done + containers: + - entity_storage - type: entity id: LockerBaseSecure @@ -61,3 +66,8 @@ behaviors: - !type:DoActsBehavior acts: ["Destruction"] + - type: Construction + graph: ClosetSteelSecure + node: done + containers: + - entity_storage diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml index 0207a8977b..89dc4d4755 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/Lockers/lockers.yml @@ -18,6 +18,18 @@ openSound: path: /Audio/Effects/woodenclosetopen.ogg +# Basic +- type: entity + id: LockerSteel + parent: LockerBaseSecure + name: secure closet + components: + - type: Appearance + - type: EntityStorageVisuals + stateBaseClosed: secure + stateDoorOpen: secure_open + stateDoorClosed: secure_door + # Cargo - type: entity id: LockerQuarterMaster diff --git a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml index 66647d168f..0ef99b9f47 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Closets/base_structureclosets.yml @@ -171,6 +171,11 @@ SheetSteel1: min: 1 max: 1 + - type: Construction + graph: ClosetWall + node: done + containers: + - entity_storage #Wall locker - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml index 5ddd6fd57b..24bcf7cf7a 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Crates/crates.yml @@ -283,6 +283,18 @@ - type: AccessReader access: [["Armory"]] +- type: entity + parent: CrateBaseSecure + suffix: Armory, Secure + id: CrateContrabandStorageSecure + name: contraband storage crate + description: An armory access locked crate for storing contraband confiscated from suspects or prisoners. + components: + - type: Sprite + sprite: Structures/Storage/Crates/sec_gear.rsi + - type: AccessReader + access: [["Armory"]] + - type: entity parent: CrateBaseSecure id: CrateCommandSecure diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/fireaxe_cabinet.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/fireaxe_cabinet.yml index 070c6e526d..acd865aa62 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/fireaxe_cabinet.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/fireaxe_cabinet.yml @@ -3,9 +3,27 @@ name: fire axe cabinet description: There is a small label that reads "For Emergency use only" along with details for safe use of the axe. As if. components: - - type: Damageable # adding destructible causes the entity inside to be deleted when the cabinet is destroyed :( + - type: Damageable damageContainer: Inorganic damageModifierSet: Glass + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 300 + behaviors: + - !type:DoActsBehavior + acts: [ "Destruction" ] + - trigger: + !type:DamageTrigger + damage: 200 #20ish crowbar hits + behaviors: + - !type:EmptyAllContainersBehaviour + - !type:DoActsBehavior + acts: [ "Destruction" ] + - !type:PlaySoundBehavior + sound: + collection: MetalGlassBreak - type: MeleeSound soundGroups: Brute: diff --git a/Resources/Prototypes/Entities/Structures/Walls/fence_wood.yml b/Resources/Prototypes/Entities/Structures/Walls/fence_wood.yml new file mode 100644 index 0000000000..539eca32b6 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Walls/fence_wood.yml @@ -0,0 +1,418 @@ +- type: entity + parent: BaseStructure + id: BaseFenceWood + name: wooden fence + description: Wooden piece of fencing. I hope there is babushka's garden behind it. + abstract: true + components: + - type: MeleeSound + soundGroups: + Brute: + path: + "/Audio/Weapons/boxingpunch1.ogg" + - type: Tag + tags: + - RCDDeconstructWhitelist + - Wooden + - type: Sprite + sprite: Structures/Walls/wooden_fence.rsi + drawdepth: WallTops + - type: Physics + bodyType: Static + - type: Transform + anchored: true + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Wood + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 125 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: WoodDestroy + - !type:SpawnEntitiesBehavior + spawn: + MaterialWoodPlank: + min: 1 + max: 2 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Climbable + delay: 5.0 + - type: Appearance + +- type: entity + parent: BaseFenceWood + id: BaseFenceWoodSmall + name: small wooden fence + description: Wooden piece of small fence. The best protection for the fencing of a private territory! + abstract: true + components: + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 75 + behaviors: + - !type:PlaySoundBehavior + sound: + collection: WoodDestroy + - !type:SpawnEntitiesBehavior + spawn: + MaterialWoodPlank: + min: 0 + max: 1 + - !type:DoActsBehavior + acts: [ "Destruction" ] + - type: Climbable + delay: 2.5 + + +#High +- type: entity + parent: BaseFenceWood + id: FenceWoodHighStraight + suffix: Straight + components: + - type: Icon + sprite: Structures/Walls/wooden_fence.rsi + state: straight + - type: Sprite + layers: + - state: straight + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.10,-0.5,0.10,0.5" + density: 1000 + mask: + - FullTileMask + layer: + - MidImpassable + - LowImpassable + - type: Construction + graph: FenceWood + node: straight + +- type: entity + parent: BaseFenceWood + id: FenceWoodHighEnd + suffix: End + components: + - type: Icon + sprite: Structures/Walls/wooden_fence.rsi + state: end + - type: Sprite + layers: + - state: end + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.1,-0.5,0.1,0.0" + density: 1000 + mask: + - FullTileMask + layer: + - MidImpassable + - LowImpassable + - type: Construction + graph: FenceWood + node: end + +- type: entity + parent: BaseFenceWood + id: FenceWoodHighCorner + suffix: Corner + components: + - type: Icon + sprite: Structures/Walls/wooden_fence.rsi + state: corner + - type: Sprite + layers: + - state: corner + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.1,-0.1,0.1,0.5" + density: 1000 + mask: + - TableMask + layer: + - TableLayer + fix2: + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.1,-0.1,0.1" + density: 1000 + mask: + - TableMask + layer: + - MidImpassable + - LowImpassable + - type: Construction + graph: FenceWood + node: corner + +- type: entity + parent: BaseFenceWood + id: FenceWoodHighTJunction + suffix: T-Junction + components: + - type: Icon + sprite: Structures/Walls/wooden_fence.rsi + state: tjunction + - type: Sprite + layers: + - state: tjunction + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.10,-0.5,0.10,0.5" + density: 1000 + mask: + - TableMask + layer: + - TableLayer + fix2: + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.1,-0.1,0.1" + density: 1000 + mask: + - TableMask + layer: + - MidImpassable + - LowImpassable + - type: Construction + graph: FenceWood + node: tjunction + +- type: entity + parent: BaseFenceWood + id: FenceWoodHighGate + name: wooden fence gate + description: Do you have any idea what awaits you behind these gates? It can be either a toilet or a luxurious mansion. But you continue to love your emo boys. + components: + - type: Sprite + layers: + - state: end + map: ["enum.DoorVisualLayers.Base"] + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.1,0.5,0.1" + density: 1000 + mask: + - FullTileMask + layer: + - MidImpassable + - LowImpassable + - type: InteractionOutline + - type: Door + openSpriteState: door_opened + closedSpriteState: door_closed_small #idk how, but it's working + canPry: false + occludes: false + changeAirtight: false + bumpOpen: false + clickOpen: true + canCrush: false + closeTimeOne: 0 + closeTimeTwo: 0 + openTimeOne: 0 + openTimeTwo: 0 + openingAnimationTime: 0 + closingAnimationTime: 0 + openSound: + path: /Audio/Effects/door_open.ogg + closeSound: + path: /Audio/Effects/door_close.ogg + - type: Construction + graph: FenceWood + node: gate + +#Small +- type: entity + parent: BaseFenceWoodSmall + id: FenceWoodSmallStraight + suffix: Straight + components: + - type: Icon + sprite: Structures/Walls/wooden_fence.rsi + state: straight_small + - type: Sprite + layers: + - state: straight_small + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.10,-0.5,0.10,0.5" + density: 1000 + mask: + - FullTileMask + layer: + - MidImpassable + - LowImpassable + - type: Construction + graph: FenceWood + node: straight_small + +- type: entity + parent: BaseFenceWoodSmall + id: FenceWoodSmallEnd + suffix: End + components: + - type: Icon + sprite: Structures/Walls/wooden_fence.rsi + state: end_small + - type: Sprite + layers: + - state: end_small + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.1,-0.5,0.1,0.0" + density: 1000 + mask: + - FullTileMask + layer: + - MidImpassable + - LowImpassable + - type: Construction + graph: FenceWood + node: end_small + +- type: entity + parent: BaseFenceWoodSmall + id: FenceWoodSmallCorner + suffix: Corner + components: + - type: Icon + sprite: Structures/Walls/wooden_fence.rsi + state: corner_small + - type: Sprite + layers: + - state: corner_small + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.1,-0.1,0.1,0.5" + density: 1000 + mask: + - TableMask + layer: + - TableLayer + fix2: + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.1,-0.1,0.1" + density: 1000 + mask: + - TableMask + layer: + - MidImpassable + - LowImpassable + - type: Construction + graph: FenceWood + node: corner_small + +- type: entity + parent: BaseFenceWoodSmall + id: FenceWoodSmallTJunction + suffix: T-Junction + components: + - type: Icon + sprite: Structures/Walls/wooden_fence.rsi + state: tjunction_small + - type: Sprite + layers: + - state: tjunction_small + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.10,-0.5,0.10,0.5" + density: 1000 + mask: + - TableMask + layer: + - TableLayer + fix2: + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.1,-0.1,0.1" + density: 1000 + mask: + - TableMask + layer: + - MidImpassable + - LowImpassable + - type: Construction + graph: FenceWood + node: tjunction_small + +- type: entity + parent: BaseFenceWoodSmall + id: FenceWoodSmallGate + name: wooden fence gate + description: Looking at this gate, a familiar image pops up in your head. Where's my piggy? + components: + - type: Sprite + layers: + - state: end + map: ["enum.DoorVisualLayers.Base"] + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.5,-0.1,0.5,0.1" + density: 1000 + mask: + - FullTileMask + layer: + - MidImpassable + - LowImpassable + - type: InteractionOutline + - type: Door + openSpriteState: door_opened_small + closedSpriteState: door_closed + canPry: false + occludes: false + changeAirtight: false + bumpOpen: false + clickOpen: true + canCrush: false + closeTimeOne: 0 + closeTimeTwo: 0 + openTimeOne: 0 + openTimeTwo: 0 + openingAnimationTime: 0 + closingAnimationTime: 0 + openSound: + path: /Audio/Effects/door_open.ogg + closeSound: + path: /Audio/Effects/door_close.ogg + - type: Construction + graph: FenceWood + node: gate_small \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Walls/walls.yml b/Resources/Prototypes/Entities/Structures/Walls/walls.yml index 3add206295..f06c0fc424 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/walls.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/walls.yml @@ -49,6 +49,7 @@ price: 75 - type: RadiationBlocker resistance: 2 + - type: BlockWeather - type: entity parent: BaseWall diff --git a/Resources/Prototypes/Entities/Structures/Windows/window.yml b/Resources/Prototypes/Entities/Structures/Windows/window.yml index 750a26bcf1..375d0c16ae 100644 --- a/Resources/Prototypes/Entities/Structures/Windows/window.yml +++ b/Resources/Prototypes/Entities/Structures/Windows/window.yml @@ -88,6 +88,7 @@ sprite: Structures/Windows/cracks.rsi - type: StaticPrice price: 100 + - type: BlockWeather - type: entity id: WindowDirectional diff --git a/Resources/Prototypes/Entities/Structures/hydro_tray.yml b/Resources/Prototypes/Entities/Structures/hydro_tray.yml index 1ab1fd5b2f..43b8bd197a 100644 --- a/Resources/Prototypes/Entities/Structures/hydro_tray.yml +++ b/Resources/Prototypes/Entities/Structures/hydro_tray.yml @@ -92,6 +92,9 @@ - type: GuideHelp guides: - Botany + - type: Tag + tags: + - NoPaint - type: entity parent: hydroponicsTray diff --git a/Resources/Prototypes/Entities/Structures/stairs.yml b/Resources/Prototypes/Entities/Structures/stairs.yml index 628c933148..0ff3b0d7d3 100644 --- a/Resources/Prototypes/Entities/Structures/stairs.yml +++ b/Resources/Prototypes/Entities/Structures/stairs.yml @@ -1,7 +1,7 @@ - type: entity id: Stairs name: stairs - suffix: steel + suffix: Steel description: The greatest invention since rocket-propelled grenades. placement: mode: SnapgridCenter @@ -39,7 +39,7 @@ - type: entity id: StairStage parent: Stairs - suffix: steel, stage + suffix: Steel, stage components: - type: Sprite sprite: Structures/stairs.rsi @@ -49,7 +49,7 @@ - type: entity id: StairWhite parent: Stairs - suffix: white + suffix: White components: - type: Sprite sprite: Structures/stairs.rsi @@ -59,7 +59,7 @@ - type: entity id: StairStageWhite parent: Stairs - suffix: white, stage + suffix: White, stage components: - type: Sprite sprite: Structures/stairs.rsi @@ -69,7 +69,7 @@ - type: entity id: StairDark parent: Stairs - suffix: dark + suffix: Dark components: - type: Sprite sprite: Structures/stairs.rsi @@ -79,9 +79,29 @@ - type: entity id: StairStageDark parent: Stairs - suffix: dark, stage + suffix: Dark, stage components: - type: Sprite sprite: Structures/stairs.rsi state: stairs_stage_dark drawdepth: FloorTiles + +- type: entity + id: StairWood + parent: Stairs + suffix: Wood + components: + - type: Sprite + sprite: Structures/stairs.rsi + state: stairs_wood + drawdepth: FloorTiles + +- type: entity + id: StairStageWood + parent: Stairs + suffix: Wood, stage + components: + - type: Sprite + sprite: Structures/stairs.rsi + state: stairs_stage_wood + drawdepth: FloorTiles diff --git a/Resources/Prototypes/Entities/Tiles/water.yml b/Resources/Prototypes/Entities/Tiles/water.yml index e2c0421aef..2fd1c8547d 100644 --- a/Resources/Prototypes/Entities/Tiles/water.yml +++ b/Resources/Prototypes/Entities/Tiles/water.yml @@ -32,7 +32,7 @@ Quantity: 100 - type: DrainableSolution solution: pool - - type: SlowContacts + - type: SpeedModifierContacts walkSpeedModifier: 0.5 sprintSpeedModifier: 0.5 - type: Physics diff --git a/Resources/Prototypes/Flavors/flavors.yml b/Resources/Prototypes/Flavors/flavors.yml index 44d8847bae..446abf99ed 100644 --- a/Resources/Prototypes/Flavors/flavors.yml +++ b/Resources/Prototypes/Flavors/flavors.yml @@ -174,6 +174,11 @@ flavorType: Base description: flavor-base-clean +- type: flavor + id: mindful + flavorType: Base + description: flavor-base-mindful + - type: flavor id: mustard flavorType: Complex diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index d579057e9d..c8af894545 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -419,7 +419,7 @@ # - type: StationEvent # earliestStart: 45 # weight: 5 - # minimumPlayers: 10 + # minimumPlayers: 20 # reoccurrenceDelay: 30 # duration: 1 # - type: LoneOpsSpawnRule @@ -462,7 +462,6 @@ components: - type: StationEvent weight: 11 - earliestStart: 20 reoccurrenceDelay: 20 duration: 1 - type: IonStormRule diff --git a/Resources/Prototypes/Maps/saltern.yml b/Resources/Prototypes/Maps/saltern.yml index 3302301d9d..a009d5eccd 100644 --- a/Resources/Prototypes/Maps/saltern.yml +++ b/Resources/Prototypes/Maps/saltern.yml @@ -40,6 +40,7 @@ Chemist: [ 2, 2 ] MedicalDoctor: [ 2, 2 ] MedicalIntern: [ 4, 4 ] + Paramedic: [ 1, 1 ] #science ResearchDirector: [ 1, 1 ] SeniorResearcher: [1, 1 ] diff --git a/Resources/Prototypes/Reagents/Materials/materials.yml b/Resources/Prototypes/Reagents/Materials/materials.yml index fa51608a22..9446b9d27f 100644 --- a/Resources/Prototypes/Reagents/Materials/materials.yml +++ b/Resources/Prototypes/Reagents/Materials/materials.yml @@ -116,3 +116,11 @@ icon: { sprite: Objects/Materials/ore.rsi, state: coal } color: "#404040" price: 0 + +- type: material + id: Gunpowder + name: materials-gunpowder + unit: materials-unit-piece + icon: { sprite: Objects/Misc/reagent_fillings.rsi, state: powderpile } + color: "#A9A9A9" + price: 0 \ No newline at end of file diff --git a/Resources/Prototypes/Reagents/biological.yml b/Resources/Prototypes/Reagents/biological.yml index af6f2557ba..c24c073f03 100644 --- a/Resources/Prototypes/Reagents/biological.yml +++ b/Resources/Prototypes/Reagents/biological.yml @@ -201,3 +201,24 @@ collection: FootstepBlood params: volume: 6 + +- type: reagent + id: GreyMatter + name: reagent-name-grey-matter + group: Biological + desc: reagent-desc-grey-matter + physicalDesc: reagent-physical-desc-neural + flavor: mindful + color: "#C584B8" + slippery: false + metabolisms: + Drink: + effects: + - !type:SatiateHunger + factor: 1.5 + Poison: + effects: + - !type:HealthChange + damage: + types: + Cellular: 2 diff --git a/Resources/Prototypes/Reagents/toxins.yml b/Resources/Prototypes/Reagents/toxins.yml index fd13aeb5e3..f60dbb4519 100644 --- a/Resources/Prototypes/Reagents/toxins.yml +++ b/Resources/Prototypes/Reagents/toxins.yml @@ -468,6 +468,7 @@ physicalDesc: reagent-physical-desc-necrotic flavor: bitter color: "#7e916e" + worksOnTheDead: true metabolisms: Medicine: effects: diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml new file mode 100644 index 0000000000..e017096fa9 --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/ducky_slippers.yml @@ -0,0 +1,22 @@ +- type: constructionGraph + id: ClothingShoeSlippersDuck + start: start + graph: + - node: start + edges: + - to: shoes + steps: + - tag: ToyRubberDuck + name: a rubber ducky + icon: + sprite: Objects/Fun/ducky.rsi + state: icon + doAfter: 1 + - tag: ToyRubberDuck + name: a rubber ducky + icon: + sprite: Objects/Fun/ducky.rsi + state: icon + doAfter: 1 + - node: shoes + entity: ClothingShoeSlippersDuck diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/food/egg.yml b/Resources/Prototypes/Recipes/Construction/Graphs/food/egg.yml index f5eea53bcc..3c3bca2585 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/food/egg.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/food/egg.yml @@ -15,7 +15,8 @@ completed: - !type:DamageEntity damage: - Blunt: 10 + types: + Blunt: 10 steps: # egg explodes some time after the water in it boils and increases pressure, guessing ~110C - minTemperature: 383 diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/furniture/seats.yml b/Resources/Prototypes/Recipes/Construction/Graphs/furniture/seats.yml index f859daabc9..c587e47efb 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/furniture/seats.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/furniture/seats.yml @@ -68,6 +68,11 @@ - material: Steel amount: 2 doAfter: 1 + - to: chairWoodBench + steps: + - material: WoodPlank + amount: 4 + doAfter: 2 - to: redComfBench steps: - material: Steel @@ -226,6 +231,18 @@ - tool: Screwing doAfter: 1 + - node: chairWoodBench + entity: WoodenBench + edges: + - to: start + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 4 + steps: + - tool: Screwing + doAfter: 2 + - node: redComfBench entity: BenchRedComfy edges: diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/structures/fence_wood.yml b/Resources/Prototypes/Recipes/Construction/Graphs/structures/fence_wood.yml new file mode 100644 index 0000000000..081328f161 --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/structures/fence_wood.yml @@ -0,0 +1,176 @@ +- type: constructionGraph + id: FenceWood + start: start + graph: + - node: start + edges: + - to: straight + steps: + - material: WoodPlank + amount: 2 + doAfter: 2.0 + - to: end + steps: + - material: WoodPlank + amount: 2 + doAfter: 2.0 + - to: corner + steps: + - material: WoodPlank + amount: 2 + doAfter: 2.0 + - to: tjunction + steps: + - material: WoodPlank + amount: 2 + doAfter: 2.0 + - to: gate + steps: + - material: WoodPlank + amount: 2 + doAfter: 2.0 + - to: straight_small + steps: + - material: WoodPlank + amount: 2 + doAfter: 2.0 + - to: end_small + steps: + - material: WoodPlank + amount: 2 + doAfter: 2.0 + - to: corner_small + steps: + - material: WoodPlank + amount: 2 + doAfter: 2.0 + - to: tjunction_small + steps: + - material: WoodPlank + amount: 2 + doAfter: 2.0 + - to: gate_small + steps: + - material: WoodPlank + amount: 2 + doAfter: 2.0 + - node: straight + entity: FenceWoodHighStraight + edges: + - to: start + steps: + - tool: Prying + doAfter: 5.0 + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 2 + - !type:DeleteEntity {} + - node: end + entity: FenceWoodHighEnd + edges: + - to: start + steps: + - tool: Prying + doAfter: 2.5 + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 2 + - !type:DeleteEntity {} + - node: corner + entity: FenceWoodHighCorner + edges: + - to: start + steps: + - tool: Prying + doAfter: 5.0 + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 2 + - !type:DeleteEntity {} + - node: tjunction + entity: FenceWoodHighTJunction + edges: + - to: start + steps: + - tool: Prying + doAfter: 5.0 + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 2 + - !type:DeleteEntity {} + - node: gate + entity: FenceWoodHighGate + edges: + - to: start + steps: + - tool: Prying + doAfter: 5.0 + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 2 + - !type:DeleteEntity {} + - node: straight_small + entity: FenceWoodSmallStraight + edges: + - to: start + steps: + - tool: Prying + doAfter: 2.5 + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 1 + - !type:DeleteEntity {} + - node: end_small + entity: FenceWoodSmallEnd + edges: + - to: start + steps: + - tool: Prying + doAfter: 1.25 + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 1 + - !type:DeleteEntity {} + - node: corner_small + entity: FenceWoodSmallCorner + edges: + - to: start + steps: + - tool: Prying + doAfter: 2.5 + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 1 + - !type:DeleteEntity {} + - node: tjunction_small + entity: FenceWoodSmallTJunction + edges: + - to: start + steps: + - tool: Prying + doAfter: 2.5 + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 1 + - !type:DeleteEntity {} + - node: gate_small + entity: FenceWoodSmallGate + edges: + - to: start + steps: + - tool: Prying + doAfter: 2.5 + completed: + - !type:SpawnPrototype + prototype: MaterialWoodPlank1 + amount: 1 + - !type:DeleteEntity {} \ No newline at end of file diff --git a/Resources/Prototypes/Recipes/Construction/clothing.yml b/Resources/Prototypes/Recipes/Construction/clothing.yml index 75d3dd7f95..89f22cdf30 100644 --- a/Resources/Prototypes/Recipes/Construction/clothing.yml +++ b/Resources/Prototypes/Recipes/Construction/clothing.yml @@ -84,4 +84,15 @@ category: construction-category-clothing description: Two huds joined by arms icon: { sprite: Clothing/Eyes/Hud/medsec.rsi, state: icon } - objectType: Item \ No newline at end of file + objectType: Item + +- type: construction + name: ducky slippers + id: ClothingShoeSlippersDuck + graph: ClothingShoeSlippersDuck + startNode: start + targetNode: shoes + category: construction-category-clothing + description: Comfy, yet haunted by the ghosts of ducks you fed bread to as a child. + icon: { sprite: Clothing/Shoes/Misc/duck-slippers.rsi, state: icon } + objectType: Item diff --git a/Resources/Prototypes/Recipes/Construction/furniture.yml b/Resources/Prototypes/Recipes/Construction/furniture.yml index 4e05a4dfb8..1a17b2f856 100644 --- a/Resources/Prototypes/Recipes/Construction/furniture.yml +++ b/Resources/Prototypes/Recipes/Construction/furniture.yml @@ -220,6 +220,23 @@ conditions: - !type:TileNotBlocked +- type: construction + name: wooden bench + id: ChairWoodBench + graph: Seat + startNode: start + targetNode: chairWoodBench + category: construction-category-furniture + description: Did you get a splinter? Well, at least it’s eco friendly. + icon: + sprite: Structures/Furniture/chairs.rsi + state: wooden-bench + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + - type: construction name: comfortable red bench id: RedComfBench diff --git a/Resources/Prototypes/Recipes/Construction/structures.yml b/Resources/Prototypes/Recipes/Construction/structures.yml index f5b4f085d3..963a289bab 100644 --- a/Resources/Prototypes/Recipes/Construction/structures.yml +++ b/Resources/Prototypes/Recipes/Construction/structures.yml @@ -1069,6 +1069,179 @@ conditions: - !type:TileNotBlocked +#Wooden fence high +- type: construction + name: wooden high fence + id: FenceWood + graph: FenceWood + startNode: start + targetNode: straight + category: construction-category-structures + description: Part of a wooden fence meant to cordon off areas. + icon: + sprite: Structures/Walls/wooden_fence.rsi + state: straight + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + +- type: construction + name: wooden high fence end + id: FenceWoodEnd + graph: FenceWood + startNode: start + targetNode: end + category: construction-category-structures + description: Part of a wooden fence meant to cordon off areas. + icon: + sprite: Structures/Walls/wooden_fence.rsi + state: end + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + +- type: construction + name: wooden high fence corner + id: FenceWoodCorner + graph: FenceWood + startNode: start + targetNode: corner + category: construction-category-structures + description: Part of a wooden fence meant to cordon off areas. + icon: + sprite: Structures/Walls/wooden_fence.rsi + state: corner + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + +- type: construction + name: wooden high fence t-junction + id: FenceWoodTJunction + graph: FenceWood + startNode: start + targetNode: tjunction + category: construction-category-structures + description: Part of a wooden fence meant to cordon off areas. + icon: + sprite: Structures/Walls/wooden_fence.rsi + state: tjunction + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + +- type: construction + name: wooden high fence gate + id: FenceWoodGate + graph: FenceWood + startNode: start + targetNode: gate + category: construction-category-structures + description: Part of a wooden fence meant to cordon off areas. + icon: + sprite: Structures/Walls/wooden_fence.rsi + state: door_closed + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + +#Wooden fence small +- type: construction + name: wooden small fence + id: FenceWoodSmall + graph: FenceWood + startNode: start + targetNode: straight_small + category: construction-category-structures + description: Part of a wooden fence meant to cordon off areas. + icon: + sprite: Structures/Walls/wooden_fence.rsi + state: straight_small + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + +- type: construction + name: wooden small fence end + id: FenceWoodEndSmall + graph: FenceWood + startNode: start + targetNode: end_small + category: construction-category-structures + description: Part of a wooden fence meant to cordon off areas. + icon: + sprite: Structures/Walls/wooden_fence.rsi + state: end_small + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + +- type: construction + name: wooden small fence corner + id: FenceWoodCornerSmall + graph: FenceWood + startNode: start + targetNode: corner_small + category: construction-category-structures + description: Part of a wooden fence meant to cordon off areas. + icon: + sprite: Structures/Walls/wooden_fence.rsi + state: corner_small + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + +- type: construction + name: wooden small fence t-junction + id: FenceWoodTJunctionSmall + graph: FenceWood + startNode: start + targetNode: tjunction_small + category: construction-category-structures + description: Part of a wooden fence meant to cordon off areas. + icon: + sprite: Structures/Walls/wooden_fence.rsi + state: tjunction_small + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + +- type: construction + name: wooden small fence gate + id: FenceWoodGateSmall + graph: FenceWood + startNode: start + targetNode: gate_small + category: construction-category-structures + description: Part of a wooden fence meant to cordon off areas. + icon: + sprite: Structures/Walls/wooden_fence.rsi + state: door_closed_small + objectType: Structure + placementMode: SnapgridCenter + canBuildInImpassable: false + conditions: + - !type:TileNotBlocked + +#Airlocks - type: construction name: airlock id: Airlock diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/ied.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/firebomb.yml similarity index 90% rename from Resources/Prototypes/Recipes/Crafting/Graphs/improvised/ied.yml rename to Resources/Prototypes/Recipes/Crafting/Graphs/improvised/firebomb.yml index bdf06e558f..529585583c 100644 --- a/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/ied.yml +++ b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/firebomb.yml @@ -1,5 +1,5 @@ - type: constructionGraph - id: ImprovisedExplosive + id: FireBomb start: start graph: - node: start @@ -19,7 +19,7 @@ state: icon doAfter: 1 - node: empty - entity: ImprovisedExplosiveEmpty + entity: FireBombEmpty edges: - to: start completed: @@ -42,7 +42,7 @@ - tool: Screwing doAfter: 1 - node: fuel - entity: ImprovisedExplosiveFuel + entity: FireBombFuel edges: - to: empty conditions: @@ -51,7 +51,7 @@ steps: - tool: Screwing doAfter: 1 - - to: ied + - to: firebomb conditions: # no dumping out 29u of the fuel then adding wires :) - !type:MinSolution solution: drink @@ -62,8 +62,8 @@ - material: Cable amount: 5 doAfter: 2 - - node: ied - entity: ImprovisedExplosive + - node: firebomb + entity: FireBomb edges: - to: fuel completed: diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/pipebomb.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/pipebomb.yml new file mode 100644 index 0000000000..bc661b47d9 --- /dev/null +++ b/Resources/Prototypes/Recipes/Crafting/Graphs/improvised/pipebomb.yml @@ -0,0 +1,43 @@ +- type: constructionGraph + id: PipeBomb + start: start + graph: + - node: start + edges: + - to: gunpowder + steps: + - tag: Pipe + icon: + sprite: Structures/Piping/Atmospherics/pipe.rsi + state: pipeStraight + name: pipe + - material: Steel + amount: 1 + doAfter: 3 + - node: gunpowder + entity: PipeBombGunpowder + edges: + - to: cable + steps: + - material: Gunpowder + amount: 5 + doAfter: 3 + - node: cable + entity: PipeBombCable + edges: + - to: pipebomb + steps: + - material: Cable + amount: 5 + doAfter: 2 + - node: pipebomb + entity: PipeBomb + edges: + - to: cable + completed: + - !type:SpawnPrototype + prototype: CableApcStack1 + amount: 5 + steps: + - tool: Cutting + doAfter: 2 diff --git a/Resources/Prototypes/Recipes/Crafting/Graphs/storage/tallbox.yml b/Resources/Prototypes/Recipes/Crafting/Graphs/storage/tallbox.yml index 5b0cc1f9a2..e72c56ff44 100644 --- a/Resources/Prototypes/Recipes/Crafting/Graphs/storage/tallbox.yml +++ b/Resources/Prototypes/Recipes/Crafting/Graphs/storage/tallbox.yml @@ -25,3 +25,66 @@ amount: 4 - !type:EmptyAllContainers - !type:DeleteEntity + +- type: constructionGraph + id: ClosetSteelSecure + start: start + graph: + - node: start + edges: + - to: done + steps: + - material: Steel + amount: 4 + - material: Cable + amount: 2 + doAfter: 5 + - node: done + entity: LockerSteel + edges: + - to: start + steps: + - tool: Screwing + doAfter: 5 + conditions: + - !type:StorageWelded + welded: false + - !type:Locked + locked: false + completed: + - !type:SpawnPrototype + prototype: SheetSteel1 + amount: 4 + - !type:SpawnPrototype + prototype: CableApcStack1 + amount: 2 + - !type:EmptyAllContainers + - !type:DeleteEntity + +- type: constructionGraph + id: ClosetWall + start: start + graph: + - node: start + edges: + - to: done + steps: + - material: Steel + amount: 4 + doAfter: 5 + - node: done + entity: ClosetWall + edges: + - to: start + steps: + - tool: Screwing + doAfter: 5 + conditions: + - !type:StorageWelded + welded: false + completed: + - !type:SpawnPrototype + prototype: SheetSteel1 + amount: 4 + - !type:EmptyAllContainers + - !type:DeleteEntity diff --git a/Resources/Prototypes/Recipes/Crafting/improvised.yml b/Resources/Prototypes/Recipes/Crafting/improvised.yml index 23b9eb2c92..7414837592 100644 --- a/Resources/Prototypes/Recipes/Crafting/improvised.yml +++ b/Resources/Prototypes/Recipes/Crafting/improvised.yml @@ -190,11 +190,11 @@ state: icon - type: construction - name: improvised explosive device - id: improvisedexplosive - graph: ImprovisedExplosive + name: fire bomb + id: firebomb + graph: FireBomb startNode: start - targetNode: ied + targetNode: firebomb category: construction-category-weapons objectType: Item description: A weak, improvised incendiary device. @@ -227,3 +227,16 @@ sprite: Clothing/Head/Hats/straw_hat.rsi state: icon objectType: Item + +- type: construction + name: pipe bomb + id: pipebomb + graph: PipeBomb + startNode: start + targetNode: pipebomb + category: construction-category-weapons + objectType: Item + description: An improvised explosive made from pipes and wire. + icon: + sprite: Objects/Weapons/Bombs/pipebomb.rsi + state: icon \ No newline at end of file diff --git a/Resources/Prototypes/Recipes/Crafting/tallbox.yml b/Resources/Prototypes/Recipes/Crafting/tallbox.yml index 09469093f7..21a7ec8225 100644 --- a/Resources/Prototypes/Recipes/Crafting/tallbox.yml +++ b/Resources/Prototypes/Recipes/Crafting/tallbox.yml @@ -8,3 +8,30 @@ description: A tall steel box that cannot be locked. icon: { sprite: Structures/Storage/closet.rsi, state: generic_icon } objectType: Structure + +- type: construction + id: ClosetSteelSecure + name: secure closet + graph: ClosetSteelSecure + startNode: start + targetNode: done + category: construction-category-storage + description: A tall steel box that can be locked. + icon: { sprite: Structures/Storage/closet.rsi, state: secure_icon } + objectType: Structure + +- type: construction + id: ClosetWall + name: wall closet + graph: ClosetWall + startNode: start + targetNode: done + category: construction-category-storage + description: A standard-issue Nanotrasen storage unit, now on walls. + icon: { sprite: Structures/Storage/wall_locker.rsi, state: generic_icon } + objectType: Structure + placementMode: SnapgridCenter + canRotate: true + canBuildInImpassable: true + conditions: + - !type:WallmountCondition \ No newline at end of file diff --git a/Resources/Prototypes/Recipes/Lathes/clothing.yml b/Resources/Prototypes/Recipes/Lathes/clothing.yml index 7dcd9d4083..e56f71c19e 100644 --- a/Resources/Prototypes/Recipes/Lathes/clothing.yml +++ b/Resources/Prototypes/Recipes/Lathes/clothing.yml @@ -244,6 +244,20 @@ materials: Cloth: 300 +- type: latheRecipe + id: ClothingUniformJumpsuitSeniorEngineer + result: ClothingUniformJumpsuitSeniorEngineer + completetime: 4 + materials: + Cloth: 300 + +- type: latheRecipe + id: ClothingUniformJumpskirtSeniorEngineer + result: ClothingUniformJumpskirtSeniorEngineer + completetime: 4 + materials: + Cloth: 300 + - type: latheRecipe id: ClothingUniformJumpsuitHoP result: ClothingUniformJumpsuitHoP @@ -395,6 +409,20 @@ materials: Cloth: 300 +- type: latheRecipe + id: ClothingUniformJumpsuitSeniorPhysician + result: ClothingUniformJumpsuitSeniorPhysician + completetime: 4 + materials: + Cloth: 300 + +- type: latheRecipe + id: ClothingUniformJumpskirtSeniorPhysician + result: ClothingUniformJumpskirtSeniorPhysician + completetime: 4 + materials: + Cloth: 300 + - type: latheRecipe id: ClothingUniformJumpsuitMime result: ClothingUniformJumpsuitMime @@ -444,6 +472,20 @@ materials: Cloth: 300 +- type: latheRecipe + id: ClothingUniformJumpsuitSeniorOfficer + result: ClothingUniformJumpsuitSeniorOfficer + completetime: 4 + materials: + Cloth: 300 + +- type: latheRecipe + id: ClothingUniformJumpskirtSeniorOfficer + result: ClothingUniformJumpskirtSeniorOfficer + completetime: 4 + materials: + Cloth: 300 + - type: latheRecipe id: ClothingUniformJumpsuitPrisoner result: ClothingUniformJumpsuitPrisoner @@ -523,6 +565,20 @@ materials: Cloth: 300 +- type: latheRecipe + id: ClothingUniformJumpsuitSeniorResearcher + result: ClothingUniformJumpsuitSeniorResearcher + completetime: 4 + materials: + Cloth: 300 + +- type: latheRecipe + id: ClothingUniformJumpskirtSeniorResearcher + result: ClothingUniformJumpskirtSeniorResearcher + completetime: 4 + materials: + Cloth: 300 + - type: latheRecipe id: ClothingUniformJumpsuitSec result: ClothingUniformJumpsuitSec diff --git a/Resources/Prototypes/Recipes/Reactions/fun.yml b/Resources/Prototypes/Recipes/Reactions/fun.yml index a8ccd5f045..fd1f42f101 100644 --- a/Resources/Prototypes/Recipes/Reactions/fun.yml +++ b/Resources/Prototypes/Recipes/Reactions/fun.yml @@ -171,3 +171,18 @@ products: Laughter: 2 +- type: reaction + id: Gunpowder + impact: Low + quantized: true + minTemp: 374 + reactants: + Potassium: + amount: 6 + Sulfur: + amount: 2 + Charcoal: + amount: 2 + effects: + - !type:CreateEntityReactionEffect + entity: MaterialGunpowder \ No newline at end of file diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml index 0092392ebf..5132102f48 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/lawyer.yml @@ -15,8 +15,8 @@ - type: startingGear id: LawyerGear equipment: - jumpsuit: ClothingUniformJumpsuitLawyerBlack # TODO change jumpsuit to randomiser of the 4 variants - back: ClothingBackpackFilled + jumpsuit: ClothingUniformJumpsuitLawyerBlack # TODO change jumpsuit to randomiser of the 4 variants # ignoring this since loadouts are gonna be out soon + back: ClothingBackpackLawyerFilled shoes: ClothingShoesBootsLaceup id: LawyerPDA ears: ClothingHeadsetSecurity @@ -24,5 +24,5 @@ inhand: - BriefcaseBrownFilled innerClothingSkirt: ClothingUniformJumpskirtLawyerBlack - satchel: ClothingBackpackSatchelFilled - duffelbag: ClothingBackpackDuffelFilled + satchel: ClothingBackpackSatchelLawyerFilled + duffelbag: ClothingBackpackDuffelLawyerFilled diff --git a/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml b/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml index 9bbe874233..fa1fac965c 100644 --- a/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml +++ b/Resources/Prototypes/Roles/Jobs/Fun/misc_startinggear.yml @@ -159,6 +159,26 @@ satchel: ClothingBackpackDuffelSyndicateOperativeMedic duffelbag: ClothingBackpackDuffelSyndicateOperativeMedic +#Syndicate Lone Operative Outfit - Full Kit +- type: startingGear + id: SyndicateLoneOperativeGearFull + equipment: + jumpsuit: ClothingUniformJumpsuitOperative + back: ClothingBackpackDuffelSyndicateOperative + mask: ClothingMaskGasSyndicate + eyes: ClothingEyesHudSyndicate + ears: ClothingHeadsetAltSyndicate + gloves: ClothingHandsGlovesCombat + outerClothing: ClothingOuterHardsuitSyndie + shoes: ClothingShoesBootsCombatFilled + id: SyndiPDA + pocket1: DoubleEmergencyOxygenTankFilled + pocket2: BaseUplinkRadio60TC + belt: ClothingBeltMilitaryWebbing + innerClothingSkirt: ClothingUniformJumpskirtOperative + satchel: ClothingBackpackDuffelSyndicateOperative + duffelbag: ClothingBackpackDuffelSyndicateOperative + # Syndicate Footsoldier Gear - type: startingGear id: SyndicateFootsoldierGear diff --git a/Resources/Prototypes/Stacks/Materials/materials.yml b/Resources/Prototypes/Stacks/Materials/materials.yml index 00153ef23c..d20bb2f347 100644 --- a/Resources/Prototypes/Stacks/Materials/materials.yml +++ b/Resources/Prototypes/Stacks/Materials/materials.yml @@ -85,3 +85,11 @@ spawn: MaterialBones1 maxCount: 30 itemSize: 1 + +- type: stack + id: Gunpowder + name: gunpowder + icon: { sprite: /Textures/Objects/Misc/reagent_fillings.rsi, state: powderpile } + spawn: MaterialGunpowder + maxCount: 60 + itemSize: 1 \ No newline at end of file diff --git a/Resources/Prototypes/StatusEffects/health.yml b/Resources/Prototypes/StatusEffects/health.yml index 0a1df020c0..12c16e57f0 100644 --- a/Resources/Prototypes/StatusEffects/health.yml +++ b/Resources/Prototypes/StatusEffects/health.yml @@ -4,4 +4,29 @@ icon: sprite: /Textures/Interface/Misc/health_icons.rsi state: Fine - locationPreference: Right \ No newline at end of file + locationPreference: Right + +- type: statusIcon + id: HealthIconCritical + priority: 1 + icon: + sprite: /Textures/Interface/Misc/health_icons.rsi + state: Critical + locationPreference: Right + +- type: statusIcon + id: HealthIconDead + priority: 1 + icon: + sprite: /Textures/Interface/Misc/health_icons.rsi + state: Dead + locationPreference: Right + +- type: statusIcon + id: HealthIconRotting + priority: 1 + icon: + sprite: /Textures/Interface/Misc/health_icons.rsi + state: Rotting + locationPreference: Right + diff --git a/Resources/Prototypes/StatusEffects/security.yml b/Resources/Prototypes/StatusEffects/security.yml index 46e1eb9e08..51d087104d 100644 --- a/Resources/Prototypes/StatusEffects/security.yml +++ b/Resources/Prototypes/StatusEffects/security.yml @@ -1,8 +1,9 @@ - type: statusIcon id: SecurityIcon abstract: true - priority: 1 - locationPreference: Left + priority: 2 + offset: 1 + locationPreference: Right - type: statusIcon parent: SecurityIcon diff --git a/Resources/Prototypes/StatusIcon/antag.yml b/Resources/Prototypes/StatusIcon/antag.yml index 3b64517530..87576f93b7 100644 --- a/Resources/Prototypes/StatusIcon/antag.yml +++ b/Resources/Prototypes/StatusIcon/antag.yml @@ -5,6 +5,13 @@ sprite: /Textures/Interface/Misc/job_icons.rsi state: Zombie +- type: statusIcon + id: InitialInfectedFaction + priority: 11 + icon: + sprite: /Textures/Interface/Misc/job_icons.rsi + state: InitialInfected + - type: statusIcon id: RevolutionaryFaction priority: 11 @@ -21,7 +28,7 @@ - type: statusIcon id: MindShieldIcon - priority: 2 + priority: 1 locationPreference: Right layer: Mod icon: diff --git a/Resources/Prototypes/Store/categories.yml b/Resources/Prototypes/Store/categories.yml index c16972c8a3..6cf641061e 100644 --- a/Resources/Prototypes/Store/categories.yml +++ b/Resources/Prototypes/Store/categories.yml @@ -9,7 +9,7 @@ #uplink categoires - type: storeCategory - id: UplinkWeapons + id: UplinkWeaponry name: store-category-weapons priority: 0 @@ -24,44 +24,44 @@ priority: 2 - type: storeCategory - id: UplinkMisc - name: store-category-misc + id: UplinkWearables + name: store-category-wearables priority: 3 - type: storeCategory - id: UplinkBundles - name: store-category-bundles + id: UplinkChemicals + name: store-category-chemicals priority: 4 - type: storeCategory - id: UplinkTools - name: store-category-tools + id: UplinkDeception + name: store-category-deception priority: 5 - type: storeCategory - id: UplinkUtility - name: store-category-utility + id: UplinkDisruption + name: store-category-disruption priority: 6 - type: storeCategory id: UplinkImplants name: store-category-implants - priority: 6 - -- type: storeCategory - id: UplinkJob - name: store-category-job priority: 7 - type: storeCategory - id: UplinkArmor - name: store-category-armor + id: UplinkAllies + name: store-category-allies priority: 8 +- type: storeCategory + id: UplinkJob + name: store-category-job + priority: 9 + - type: storeCategory id: UplinkPointless name: store-category-pointless - priority: 9 + priority: 10 #revenant - type: storeCategory diff --git a/Resources/Prototypes/Store/presets.yml b/Resources/Prototypes/Store/presets.yml index e623f4c8cd..84aa7db544 100644 --- a/Resources/Prototypes/Store/presets.yml +++ b/Resources/Prototypes/Store/presets.yml @@ -2,16 +2,16 @@ id: StorePresetUplink storeName: Uplink categories: - - UplinkWeapons + - UplinkWeaponry - UplinkAmmo - UplinkExplosives - - UplinkMisc - - UplinkBundles - - UplinkTools - - UplinkUtility + - UplinkChemicals + - UplinkDeception + - UplinkDisruption - UplinkImplants + - UplinkAllies + - UplinkWearables - UplinkJob - - UplinkArmor - UplinkPointless currencyWhitelist: - Telecrystal diff --git a/Resources/Prototypes/explosion.yml b/Resources/Prototypes/explosion.yml index ff0c78d86e..a768dead6d 100644 --- a/Resources/Prototypes/explosion.yml +++ b/Resources/Prototypes/explosion.yml @@ -117,3 +117,19 @@ lightColor: Orange texturePath: /Textures/Effects/fire.rsi fireStates: 6 + +- type: explosion + id: FireBomb + damagePerIntensity: + types: + Heat: 1 + Blunt: 2 + Piercing: 3 + lightColor: Orange + texturePath: /Textures/Effects/fire.rsi + fireStates: 6 + fireStacks: 2 + +# STOP +# BEFORE YOU ADD MORE EXPLOSION TYPES CONSIDER IF AN EXISTING ONE IS SUITABLE +# ADDING NEW ONES IS PROHIBITIVELY EXPENSIVE diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 69c18a5dcc..b95823f6cf 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -1,3 +1,5 @@ +# PUT YOUR TAGS IN ALPHABETICAL ORDER + - type: Tag id: AirAlarm @@ -17,10 +19,10 @@ id: AppraisalTool - type: Tag - id: ArtifactFragment + id: Arrow - type: Tag - id: Arrow + id: ArtifactFragment - type: Tag id: ATVKeys @@ -31,18 +33,30 @@ - type: Tag id: Balloon +- type: Tag + id: Banana + - type: Tag id: BananaPeel +- type: Tag + id: Bandana + - type: Tag id: BaseballBat - type: Tag id: BBQsauce +- type: Tag + id: Bedsheet + - type: Tag id: Bee +- type: Tag + id: Beer + - type: Tag id: BikeHorn @@ -203,10 +217,10 @@ id: Bottle - type: Tag - id: BoxHug + id: BoxCardboard - type: Tag - id: Burnt + id: BoxHug - type: Tag id: BrassInstrument @@ -232,6 +246,9 @@ - type: Tag id: BulletFoam +- type: Tag + id: Burnt + - type: Tag id: BypassDropChecks @@ -242,13 +259,22 @@ id: CableCoil - type: Tag - id: CapacitorStockPart + id: CannonBall - type: Tag - id: Carrot + id: CannonRestrict - type: Tag - id: CarrotFries + id: CannotSuicide + +- type: Tag + id: CanPilot + +- type: Tag + id: CapacitorStockPart + +- type: Tag + id: CaptainSabre - type: Tag id: Carpet @@ -269,31 +295,25 @@ id: CarpetOrange - type: Tag - id: CarpetPurple + id: CarpetPink - type: Tag - id: CarpetPink + id: CarpetPurple - type: Tag id: CarpetRed - type: Tag - id: CarpetWhite + id: CarpetSBlue - type: Tag - id: CanPilot - -- type: Tag - id: CannonBall - -- type: Tag - id: CannonRestrict + id: CarpetWhite - type: Tag - id: CannotSuicide + id: Carrot - type: Tag - id: CaptainSabre + id: CarrotFries - type: Tag id: Carp @@ -344,6 +364,9 @@ - type: Tag id: ChemDispensable # container that can go into the chem dispenser +- type: Tag + id: ChiliBowl + - type: Tag id: Cigarette @@ -380,11 +403,26 @@ - type: Tag id: CluwneHorn +- type: Tag + id: Cola + +- type: Tag + id: Coldsauce + +- type: Tag + id: CombatKnife + +- type: Tag + id: ComputerTelevisionCircuitboard + +- type: Tag + id: ConveyorAssembly + - type: Tag #Ohioans die happy id: Corn - type: Tag - id: Coldsauce + id: CottonBoll - type: Tag id: Cow @@ -425,14 +463,11 @@ - type: Tag id: Cryobeaker -- type: Tag - id: CrystalCyan - - type: Tag id: CrystalBlue - type: Tag - id: CrystalPink + id: CrystalCyan - type: Tag id: CrystalGreen @@ -441,19 +476,10 @@ id: CrystalOrange - type: Tag - id: CrystalRed - -- type: Tag - id: ConveyorAssembly - -- type: Tag - id: Cola - -- type: Tag - id: CombatKnife + id: CrystalPink - type: Tag - id: ComputerTelevisionCircuitboard + id: CrystalRed - type: Tag id: CubanCarp @@ -483,25 +509,25 @@ id: Document - type: Tag - id: DoorBumpOpener + id: DonkPocket - type: Tag - id: DoorElectronics + id: Donut - type: Tag - id: DonkPocket + id: DoorBumpOpener - type: Tag - id: Donut + id: DoorElectronics - type: Tag - id: DrinkCan + id: DrinkBottle - type: Tag - id: DrinkSpaceGlue + id: DrinkCan - type: Tag - id: DrinkBottle + id: DrinkSpaceGlue - type: Tag id: Duck @@ -536,9 +562,6 @@ - type: Tag id: FireAxe -- type: Tag - id: Flesh - - type: Tag id: FirelockElectronics @@ -548,6 +571,9 @@ - type: Tag id: Flashlight +- type: Tag + id: Flesh + - type: Tag id: Flower @@ -633,10 +659,10 @@ id: HamtrLLeg - type: Tag - id: HamtrRLeg + id: HamtrRArm - type: Tag - id: HamtrRArm + id: HamtrRLeg - type: Tag id: Handcuffs @@ -671,6 +697,9 @@ - type: Tag id: HighSecDoor +- type: Tag + id: HiViz + - type: Tag id: Hoe @@ -696,10 +725,10 @@ id: HonkerLLeg - type: Tag - id: HonkerRLeg + id: HonkerRArm - type: Tag - id: HonkerRArm + id: HonkerRLeg - type: Tag id: Hotsauce @@ -729,10 +758,10 @@ id: JawsOfLife - type: Tag - id: Katana + id: Kangaroo - type: Tag - id: Kangaroo + id: Katana - type: Tag id: Ketchup @@ -761,18 +790,6 @@ - type: Tag id: MacroBomb -- type: Tag - id: MicroBomb - -- type: Tag - id: MimeBelt - -- type: Tag - id: MimeHappyHonk - -- type: Tag - id: Mineshaft - # Magazines ordered by slot then caliber - type: Tag @@ -826,6 +843,8 @@ - type: Tag id: MagazineGrenade +# Magazines end + - type: Tag id: MailingUnitElectronics @@ -844,18 +863,36 @@ - type: Tag id: Metal +- type: Tag + id: MicroBomb + +- type: Tag + id: MicrowaveMachineBoard + +- type: Tag + id: MimeBelt + +- type: Tag + id: MimeHappyHonk + - type: Tag id: MindShield - type: Tag id: MindTransferTarget +- type: Tag + id: Mineshaft + - type: Tag id: ModularReceiver - type: Tag id: MonkeyCube +- type: Tag + id: MonkeyWearable + - type: Tag id: Mop @@ -874,6 +911,9 @@ - type: Tag id: NoBlockAnchoring +- type: Tag + id: NoPaint + - type: Tag id: NozzleBackTank @@ -893,10 +933,10 @@ id: Paper - type: Tag - id: Payload # for grenade/bomb crafting + id: Pancake - type: Tag - id: Pancake + id: Payload # for grenade/bomb crafting - type: Tag id: Pen @@ -910,9 +950,6 @@ - type: Tag id: PetWearable -- type: Tag - id: MonkeyWearable - - type: Tag id: Pickaxe @@ -959,10 +996,10 @@ id: PlushieSharkBlue - type: Tag - id: PlushieSharkPink + id: PlushieSharkGrey - type: Tag - id: PlushieSharkGrey + id: PlushieSharkPink - type: Tag id: Potato @@ -971,13 +1008,13 @@ id: PotatoBattery - type: Tag - id: PowerCell + id: PowerCage - type: Tag - id: PowerCellSmall + id: PowerCell - type: Tag - id: PowerCage + id: PowerCellSmall - type: Tag id: Powerdrill @@ -1026,10 +1063,10 @@ id: RipleyLLeg - type: Tag - id: RipleyRLeg + id: RipleyRArm - type: Tag - id: RipleyRArm + id: RipleyRLeg - type: Tag id: RodMetal1 @@ -1086,10 +1123,10 @@ id: SmallMech - type: Tag - id: SnapPop + id: Smokable - type: Tag - id: Smokable + id: SnapPop - type: Tag id: SnowyLabs @@ -1102,13 +1139,6 @@ - type: Tag id: Soup - -- type: Tag - id: SpookyFog - -- type: Tag - id: Spray - - type: Tag id: Spear @@ -1128,20 +1158,32 @@ id: SpiderCraft - type: Tag - id: SpreaderIgnore + id: SpookyFog - type: Tag - id: StringInstrument + id: Spray + +- type: Tag + id: SpreaderIgnore - type: Tag id: StationMapElectronics +- type: Tag + id: Steak + +- type: Tag + id: StringInstrument + - type: Tag id: SubdermalImplant - type: Tag id: SuitEVA +- type: Tag + id: SurgeryTool + - type: Tag id: SurveillanceCameraMonitorCircuitboard @@ -1157,15 +1199,15 @@ - type: Tag id: Spellbook -- type: Tag - id: Taser - - type: Tag id: TabletopBoard - type: Tag id: TabletopPiece +- type: Tag + id: Taser + - type: Tag id: TimerBrigElectronics @@ -1181,6 +1223,12 @@ - type: Tag id: Torch +- type: Tag + id: ToyRubberDuck + +- type: Tag + id: ToySidearm + - type: Tag id: Trash @@ -1199,6 +1247,9 @@ - type: Tag id: VehicleKey +- type: Tag + id: Vegetable + - type: Tag id: VimPilot @@ -1239,13 +1290,16 @@ id: Window - type: Tag - id: WizardWand # that evil vvizard vvand + id: Wine + +- type: Tag + id: Wirecutter - type: Tag id: WizardStaff - type: Tag - id: Wirecutter + id: WizardWand # that evil vvizard vvand - type: Tag id: Wooden # just like our atmos @@ -1264,5 +1318,3 @@ - type: Tag id: WriteIgnoreStamps - -# PUT YOUR TAGS IN ALPHABETICAL ORDER diff --git a/Resources/ServerInfo/Guidebook/Engineering/TEG.xml b/Resources/ServerInfo/Guidebook/Engineering/TEG.xml index a2a04e03ef..9e8697a9e1 100644 --- a/Resources/ServerInfo/Guidebook/Engineering/TEG.xml +++ b/Resources/ServerInfo/Guidebook/Engineering/TEG.xml @@ -1,18 +1,18 @@ - + # Thermo-electric Engine (TEG) - The TEG generates power by exchanging heat between hot and cold gases. On station, hot gas is usually created by burning plasma, and an array of heat-exchanging pipes in space radiates away heat to make a cold side. + The TEG generates power by exchanging heat between hot and cold gases. On the station, hot gas is usually created by burning plasma, and an array of heat-exchanging pipes in space radiates away heat to cool down circulated gases. - The TEG relies heavily on atmospherics piping. The only truly special component about it is the generator core, the rest is all off-the-shelf atmospherics equipment. Note that while the exact layout may vary significantly depending on station, the general components and setup are usually the same. + The TEG relies heavily on atmospherics piping. The only truly special component about it is the generator core and circulators; the rest is all off-the-shelf atmospherics equipment. Note that while the exact layout may vary significantly depending on station, the general components and setup are usually the same. ## Generator - The main generator itself is a machine made up of multiple parts: the core generator and two "circulators", in this arrangement: + The main generator itself is a machine made up of 3 major parts: the central generator and two "circulators", in this arrangement: - - - + + + The circulators take in either a hot or cold gas, and pass it through the machine to exchange heat. The gas then gets output on the other end of the circulator. The generator produces the actual power and outputs it over an HV wire. @@ -21,19 +21,172 @@ There is no preference for which side must be hot or cold, there need only be a difference in temperature between them. The gases in the two "loops" are never mixed, only energy is exchanged between them. The hot side will cool down, the cold side will heat up. - ## Burn Chamber + ## The Pipes + + There are 2 major pipenets to worry about here: The Hot Loop (where gas will be burnt for heat), and The Cold Loop (where circulated, heated waste gas will either be removed into space or cooled back down). Make sure that [bold]both pipenets do NOT mix[/bold], as only heat should be transferred between the two through the TEG. + + # The Hot Loop + + As I'm sure a wise person once said: the best way to make something hot is to light it on fire. Well, depending on context, that may not be very wise, but luckily your engineering department has just what's needed to do it wisely after all. + + As stated above, there are many different layouts one can follow to heat up (or cool down) gases; this part of the guide will cover 2 common methods one will often see for the hot loop when the TEG is setup: The Pipe Burn, and the Burn chamber. + + Side note: Plasma fires burn relatively cool compared to, for example, Tritium fires. It may be viable to extract Tritium from an extraction setup (using a 97/3 ratio of O2/Plasma) and react it with Oxygen to get truly hellish temperatures for power. Although, this is just a recommendation; I'm not ya mum. + + ## The Pipe Burn + + Also known as the naive method, this is generally discouraged when working for efficiency. However, if all you need is a smidge of power to run the station, and you don't feel like setting up the burn chamber, this method will do. + + TODO: Remove this section when atmos pipes are updated to have pressure/temperature limits in a future atmos refactor. + + Most (if not all) pipe burns follow this general layout: + + Gas input -> High-pressure pump -> Pipe segment (with heater) -> Low-pressure pump -> Circulator + + + + + + + + + + + + - The Gas input is pretty self-explanatory; this is where you will input the O2-Plasma mix to be burnt. A 2:1 (67/33) ratio of Oxygen to Plasma is recommended for the hottest burn. + - The High-pressure pump serves 2 purposes; first, it prevents the burn from backwashing into the supply pipe, which would be.. bad, for many reasons. Second, it maintains a positive pressure in the following pipe segment, which is important to allow the burn to continue, especially since hot gases expand. + - The Pipe segment is where the burn actually occurs; to start it off, one can use a heater to increase the temperature up to the ignition temperature of Plasma. Afterwards, the reaction should be self-sustaining, so long as the Pressure and Moles supplied remains high enough. Be warned; if you wish to remove the heater, it will carry some of this superheated gas with it, transferring it to the next pipenet you connect it to. Best to space the gas through a space vent, if you must. + - The Low-pressure pump (whose pressure should be [italics]slightly lower[/italics] than the input pump) prevents [italics]all[/italics] the gas from passing through the circulator, which could result in the loss of the Moles required to sustain a burn. + - The Circulator is where this generated heat will flow to the cold loop; afterwards, feel free to space the waste gases. + + Note: Pressure pumps are used here as, while they pump on pressure (not flow-rate, which is comparatively faster), they are a bit easier to control when it comes to the limited Plasma supply on-station. However, the steps shown can be followed with volumetric pumps too. + + ## The Burn Chamber + + The burn chamber is the preferred method for heating up gases, and it is commonly used for other purposes too. (see: Tritium production) + + Most (if not all) stations have the burn chamber separated from the main atmospherics block by a 1-wide spaced grid, presumably to prevent conduction. The chambers consist of 3(+1) important parts: + - The Air Injector/Passive Vent + - The Space Vent + - The Radiator Loop + + Most normal burn chambers don't come with Heat-Exchangers; instead, they have air scrubbers (and optionally, an air alarm) to help filter for Tritium, which is a highly reactive, hot-burning gas that can also be used to heat the TEG efficiently. + However, this is a slightly more advanced setup than just burning plasma, as it needs 2 burn chambers instead of 1 (one for tritium production, one for burning said tritium), so remove the scrubbers and retrofit the burn chamber with a parallel array of heat-exchangers instead. + + The air injector (or Passive Vent) injects air (or allows air to flow) into the burn chamber. Either should be supplemented with a pump before it, to keep pressures high. + There is a notable difference between the passive vent and the air injector; the air injector can only keep injecting air up to 9MPa, which can be reached very easily with a good burn. Ideally, switch out the air injector for a passive vent connected to a volume pump. + + The space vent (designated as a blast door to space on one side of the burn chamber) allows waste gases to be expelled and destroyed. Open this to keep the pressure under control. + + The radiator loop collects heat from the burnt gases and brings it to the TEG. To maximize efficiency, hook up the heat-exchangers [italics]in parallel to each other[/italics], with a pressure pump at max pressure after the array and a volumetric pump before the array. + The pressure of the volumetric pump should be set to ( 200 / number of heat-exchangers ) L/s. For example, having 2 heat-exchangers would mean you should set the pressure to 100 L/s. + Finally, fill the whole loop with (ideally) a high heat capacity gas, like Frezon or Plasma. (Yes, Frezon =/= Cold. Frezon has one of the highest heat capacities in the game; so long as it isn't reacting with Nitrogen, it can actually be heated and can store heat really well!) + + # The Cold Loop + + As with the Hot Loop, the Cold Loop must also be setup in order to operate the TEG. However, the Cold Loop is usually a lot more low-tech than the Hot Loop; in reality, the Cold Loop only has to be "relatively" cooler -- hey, room temperature is technically cooler than the surface of the sun, right? + + There are 3 main methods you will see used for the Cold Loop: The Water Cooler (see: Liltenhead's video on the TEG), the Coolant Array and the Freezer Loop. + + ## The Water Cooler - As I'm sure a wise person once said: the best way to make something hot is to light it on fire. Well, depending on context that may not be very wise, but luckily your engineering department has just what's needed to do it wisely after all. + An equally naive method as the Pipe Burn, this simply involves taking some useless gas (in this case, Water Vapour) and flowing it through the TEG and into space. It's dirt-cheap and simple, at the cost of efficiency and permanant loss of gas. - TODO: somebody fill this out once we settle on a general mapped layout for burn chambers. + Setting this up is so simple, even Hamlet could manage it. Just take an output of a gas (here, Water Vapour), send it through the Cold side of the TEG, and then vent it into space. + + + + + + + + + + + TODO: Remove this section when gas miners are removed in a future atmos refactor. ## Coolant Array - A whole bunch of heat-exchanger piping in space. There's not much to say here: gas goes through and cools down. + This is the default method for the Cold Loop you will see on a variety of stations. Being of moderate complexity and having no losses of any resource, this [italics]should[/italics] be the main method of cooling down the TEG. However, every station at the moment somehow has their heat exchangers hooked up wrong, reducing efficiency greatly. (Thanks a bunch, NT!) - ## The Pipes + To use heat-exchangers properly, they must be setup in [italics]parallel[/italics], not in series (like what you see on most stations). A gas pump at max pressure should be placed after, and a volumetric pump before the heat-exchangers. + The flow-rate of the volumetric pump should be set to ( 200 / number of heat-exchangers ) L/s. - TODO: somebody fill this out once we settle on a general mapped layout for burn chambers. + Simply speaking, the Coolant Array consists of 3 major parts: An input connector port, a few pumps and the heat-exchanger array out in space. It can be setup like so: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - Connector Port: Use this to input a gas with high heat capacity; most of the time, Plasma or Frezon is used to do so, as they both have very high specific heat capacities (although most any gas will do). (Yes, Plasma =/= Hot. You can cool it down, and it acts as a really good heat exchange medium.) + - Input/Output Pumps: Used to make sure gas keeps flowing through both the Circulator and the Heat-Exchanger array. As the gas cools down and heats up (and as it flows through the Exchanger), pressure must be applied for it to keep flowing. + - Heat-Exchanger: Basically, just a bunch of heat-exchanger pipes in space. Not much to say, besides the fact that it cools down the gas inside it. Make sure the heat-exchangers are placed on lattice, not plating! Otherwise, the heat-exchange efficiency will be greatly reduced, as the heat-exchangers aren't directly exposed to space below them. + + ## The Freezer Loop + + Most of the time, you will see this method being used in efficient TEG setups. It's basically just the Coolant array, but replacing the Heat-Exchangers with a freezer. Even though the freezer does use power, it is only a small fraction of what the TEG can generate, and it's better than the default Coolant array at the moment, so go fish. + + Just follow the steps for the Coolant array, but use a freezer in place of the Heat-Exchangers. As so: + + + + + + + + + + + + + + + + + + + + Once again, use Plasma or Frezon in the loop for max efficiency (although most any gas will do). diff --git a/Resources/ServerInfo/Guidebook/Medical/Cryogenics.xml b/Resources/ServerInfo/Guidebook/Medical/Cryogenics.xml index ad97f1b2d7..ef6e1a49e8 100644 --- a/Resources/ServerInfo/Guidebook/Medical/Cryogenics.xml +++ b/Resources/ServerInfo/Guidebook/Medical/Cryogenics.xml @@ -41,7 +41,7 @@ Once things have been set up, you're going to require a specific medication, Cry ## Additional Information: -The standard pressure for a gas pump is 1.325 kpa. Cryoxadone works at under 170K, but it is standard practice to set the freezer to 100K for faster freezing. +The standard pressure for a gas pump is 100.325 kpa. Cryoxadone works at under 170K, but it is standard practice to set the freezer to 100K for faster freezing. diff --git a/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml b/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml index 3d7e5131ca..b7ba3d4c8b 100644 --- a/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml +++ b/Resources/ServerInfo/Guidebook/Science/ArtifactReports.xml @@ -14,7 +14,7 @@ A large portion of Xenoarchaeology gameplay revolves around the interpretation o - [color=#a4885c]Edges:[/color] the amount of nodes that are connected to the current node. Using this, you can calculate the total number of nodes as well as organize a map of their connections. -- [color=#a4885c]Current value:[/color] the amount of research points an artifact is currently worth. This is an important factor in choosing when to stop research and destroy the artifact in exchange for points. +- [color=#a4885c]Unextracted value:[/color] the amount of research points an artifact will give when extracted. Extracting sets this to zero and traversing new nodes increases it. Reports are a helpful tool in manipulating an artifact, especially in the later stages where you are traversing nodes that have already been activated. diff --git a/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/equipped-BACKPACK.png b/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/equipped-BACKPACK.png new file mode 100644 index 0000000000..a7bf0a8b42 Binary files /dev/null and b/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/equipped-BACKPACK.png differ diff --git a/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/icon.png b/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/icon.png new file mode 100644 index 0000000000..2c60bb0007 Binary files /dev/null and b/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/inhand-left.png b/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/inhand-left.png new file mode 100644 index 0000000000..02acae54c9 Binary files /dev/null and b/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/inhand-left.png differ diff --git a/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/inhand-right.png b/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/inhand-right.png new file mode 100644 index 0000000000..6faa13ba39 Binary files /dev/null and b/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/meta.json b/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/meta.json new file mode 100644 index 0000000000..f087cc75d1 --- /dev/null +++ b/Resources/Textures/Clothing/Back/Backpacks/syndicate.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by gabova (discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-BACKPACK", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} \ No newline at end of file diff --git a/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/equipped-MASK-reptilian.png b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/equipped-MASK-reptilian.png new file mode 100644 index 0000000000..88542905cf Binary files /dev/null and b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/equipped-MASK-reptilian.png differ diff --git a/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/equipped-MASK.png b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/equipped-MASK.png new file mode 100644 index 0000000000..e34c9a995e Binary files /dev/null and b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/equipped-MASK.png differ diff --git a/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/icon.png b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/icon.png new file mode 100644 index 0000000000..e1c0aecc28 Binary files /dev/null and b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-left.png b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-left.png new file mode 100644 index 0000000000..5a37ace23e Binary files /dev/null and b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-left.png differ diff --git a/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-right.png b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-right.png new file mode 100644 index 0000000000..47cfa5ae34 Binary files /dev/null and b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json new file mode 100644 index 0000000000..9094fa918f --- /dev/null +++ b/Resources/Textures/Clothing/Mask/neckgaiterred.rsi/meta.json @@ -0,0 +1,30 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Originally sprited by belay5 (Discord) then recolored by Nairod (Github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-MASK", + "directions": 4 + }, + { + "name": "equipped-MASK-reptilian", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_short.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_short.png new file mode 100644 index 0000000000..e3b74ba7b6 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_short.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_skirt.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_skirt.png new file mode 100644 index 0000000000..3341ff4418 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_skirt.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_skirt_long.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_skirt_long.png new file mode 100644 index 0000000000..5c83cae137 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_skirt_long.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_standart.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_standart.png new file mode 100644 index 0000000000..7140a3869c Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_leg_standart.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_armless.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_armless.png new file mode 100644 index 0000000000..2864e1c04e Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_armless.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_bra.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_bra.png new file mode 100644 index 0000000000..03c8d493fb Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_bra.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_shirt.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_shirt.png new file mode 100644 index 0000000000..b03f394279 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_shirt.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_standart.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_standart.png new file mode 100644 index 0000000000..1db1be4c68 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_standart.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_standart2.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_standart2.png new file mode 100644 index 0000000000..5397d8e8d7 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/base_torso_standart2.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless1.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless1.png new file mode 100644 index 0000000000..d2110b9f5a Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless1.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless10.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless10.png new file mode 100644 index 0000000000..4060a0d6a5 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless10.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless2.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless2.png new file mode 100644 index 0000000000..7f504cbc7a Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless2.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless3.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless3.png new file mode 100644 index 0000000000..6897496738 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless3.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless4.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless4.png new file mode 100644 index 0000000000..7f464aabec Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless4.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless5.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless5.png new file mode 100644 index 0000000000..e971de5bd4 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless5.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless6.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless6.png new file mode 100644 index 0000000000..fbc8f296ee Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless6.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless7.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless7.png new file mode 100644 index 0000000000..6055cdc652 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless7.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless8.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless8.png new file mode 100644 index 0000000000..979b9b8078 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless8.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless9.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless9.png new file mode 100644 index 0000000000..3e5919e126 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_armless9.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra1.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra1.png new file mode 100644 index 0000000000..da752a9f45 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra1.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra2.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra2.png new file mode 100644 index 0000000000..a92430a43b Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra2.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra3.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra3.png new file mode 100644 index 0000000000..516e059ac5 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra3.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra4.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra4.png new file mode 100644 index 0000000000..f7c46e8ed6 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra4.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra5.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra5.png new file mode 100644 index 0000000000..7a4c269dda Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_bra5.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_shirt1.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_shirt1.png new file mode 100644 index 0000000000..c742af5197 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_shirt1.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_shirt2.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_shirt2.png new file mode 100644 index 0000000000..79f1cf1a83 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_shirt2.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_shirt3.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_shirt3.png new file mode 100644 index 0000000000..6223263eaa Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_shirt3.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart1.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart1.png new file mode 100644 index 0000000000..4771eb9456 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart1.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart2.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart2.png new file mode 100644 index 0000000000..3882611398 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart2.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart3.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart3.png new file mode 100644 index 0000000000..30533972f2 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart3.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart4.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart4.png new file mode 100644 index 0000000000..38879be4bd Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart4.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart5.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart5.png new file mode 100644 index 0000000000..fc747a3e99 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart5.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart6.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart6.png new file mode 100644 index 0000000000..e6b7276801 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart6.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart7.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart7.png new file mode 100644 index 0000000000..f2aa726ae6 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart7.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart8.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart8.png new file mode 100644 index 0000000000..042b7f9d09 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart8.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart9.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart9.png new file mode 100644 index 0000000000..11e048f48b Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/decor_torso_standart9.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/mask_null.png b/Resources/Textures/Clothing/Uniforms/procedural.rsi/mask_null.png new file mode 100644 index 0000000000..2975c479be Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/procedural.rsi/mask_null.png differ diff --git a/Resources/Textures/Clothing/Uniforms/procedural.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/procedural.rsi/meta.json new file mode 100644 index 0000000000..08133fc00b --- /dev/null +++ b/Resources/Textures/Clothing/Uniforms/procedural.rsi/meta.json @@ -0,0 +1,159 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "The sprite base is taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c838ba21dae97db345e0113f99596decd1d66039, separated into layers and added new ones by TheShuEd (github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "base_leg_short", + "directions": 4 + }, + { + "name": "base_leg_skirt", + "directions": 4 + }, + { + "name": "base_leg_skirt_long", + "directions": 4 + }, + { + "name": "base_leg_standart", + "directions": 4 + }, + { + "name": "base_torso_armless", + "directions": 4 + }, + { + "name": "base_torso_bra", + "directions": 4 + }, + { + "name": "base_torso_shirt", + "directions": 4 + }, + { + "name": "base_torso_standart", + "directions": 4 + }, + { + "name": "base_torso_standart2", + "directions": 4 + }, + { + "name": "decor_torso_armless1", + "directions": 4 + }, + { + "name": "decor_torso_armless2", + "directions": 4 + }, + { + "name": "decor_torso_armless3", + "directions": 4 + }, + { + "name": "decor_torso_armless4", + "directions": 4 + }, + { + "name": "decor_torso_armless5", + "directions": 4 + }, + { + "name": "decor_torso_armless6", + "directions": 4 + }, + { + "name": "decor_torso_armless7", + "directions": 4 + }, + { + "name": "decor_torso_armless8", + "directions": 4 + }, + { + "name": "decor_torso_armless9", + "directions": 4 + }, + { + "name": "decor_torso_armless10", + "directions": 4 + }, + { + "name": "decor_torso_bra1", + "directions": 4 + }, + { + "name": "decor_torso_bra2", + "directions": 4 + }, + { + "name": "decor_torso_bra3", + "directions": 4 + }, + { + "name": "decor_torso_bra4", + "directions": 4 + }, + { + "name": "decor_torso_bra5", + "directions": 4 + }, + { + "name": "decor_torso_shirt1", + "directions": 4 + }, + { + "name": "decor_torso_shirt2", + "directions": 4 + }, + { + "name": "decor_torso_shirt3", + "directions": 4 + }, + { + "name": "decor_torso_standart1", + "directions": 4 + }, + { + "name": "decor_torso_standart2", + "directions": 4 + }, + { + "name": "decor_torso_standart3", + "directions": 4 + }, + { + "name": "decor_torso_standart4", + "directions": 4 + }, + { + "name": "decor_torso_standart5", + "directions": 4 + }, + { + "name": "decor_torso_standart6", + "directions": 4 + }, + { + "name": "decor_torso_standart7", + "directions": 4 + }, + { + "name": "decor_torso_standart8", + "directions": 4 + }, + { + "name": "decor_torso_standart9", + "directions": 4 + }, + { + "name": "mask_null", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Fluids/puddle.rsi/meta.json b/Resources/Textures/Fluids/puddle.rsi/meta.json index b47a24b44d..5e0b79b314 100644 --- a/Resources/Textures/Fluids/puddle.rsi/meta.json +++ b/Resources/Textures/Fluids/puddle.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "Made by Alekshhh on github", + "copyright": "Made by Alekshhh and modified by potato1234x on github", "states": [ { "name": "splata" diff --git a/Resources/Textures/Fluids/puddle.rsi/splat10.png b/Resources/Textures/Fluids/puddle.rsi/splat10.png index 2b2abe9c32..96bd6b8cc2 100644 Binary files a/Resources/Textures/Fluids/puddle.rsi/splat10.png and b/Resources/Textures/Fluids/puddle.rsi/splat10.png differ diff --git a/Resources/Textures/Fluids/puddle.rsi/splat11.png b/Resources/Textures/Fluids/puddle.rsi/splat11.png index b3f0497f72..86334a69c6 100644 Binary files a/Resources/Textures/Fluids/puddle.rsi/splat11.png and b/Resources/Textures/Fluids/puddle.rsi/splat11.png differ diff --git a/Resources/Textures/Fluids/puddle.rsi/splat12.png b/Resources/Textures/Fluids/puddle.rsi/splat12.png index a8a2e7f90c..cd0c9b32c7 100644 Binary files a/Resources/Textures/Fluids/puddle.rsi/splat12.png and b/Resources/Textures/Fluids/puddle.rsi/splat12.png differ diff --git a/Resources/Textures/Fluids/puddle.rsi/splat13.png b/Resources/Textures/Fluids/puddle.rsi/splat13.png index a1cb82ad90..52c6b80abd 100644 Binary files a/Resources/Textures/Fluids/puddle.rsi/splat13.png and b/Resources/Textures/Fluids/puddle.rsi/splat13.png differ diff --git a/Resources/Textures/Fluids/puddle.rsi/splat14.png b/Resources/Textures/Fluids/puddle.rsi/splat14.png index fa2c45ae75..811c4f6557 100644 Binary files a/Resources/Textures/Fluids/puddle.rsi/splat14.png and b/Resources/Textures/Fluids/puddle.rsi/splat14.png differ diff --git a/Resources/Textures/Fluids/puddle.rsi/splat3.png b/Resources/Textures/Fluids/puddle.rsi/splat3.png index dbffc99bb7..73bd680478 100644 Binary files a/Resources/Textures/Fluids/puddle.rsi/splat3.png and b/Resources/Textures/Fluids/puddle.rsi/splat3.png differ diff --git a/Resources/Textures/Fluids/puddle.rsi/splat5.png b/Resources/Textures/Fluids/puddle.rsi/splat5.png index ca044c8285..97e0003022 100644 Binary files a/Resources/Textures/Fluids/puddle.rsi/splat5.png and b/Resources/Textures/Fluids/puddle.rsi/splat5.png differ diff --git a/Resources/Textures/Fluids/puddle.rsi/splat6.png b/Resources/Textures/Fluids/puddle.rsi/splat6.png index 02ca2579e5..05f90e61e7 100644 Binary files a/Resources/Textures/Fluids/puddle.rsi/splat6.png and b/Resources/Textures/Fluids/puddle.rsi/splat6.png differ diff --git a/Resources/Textures/Fluids/puddle.rsi/splat7.png b/Resources/Textures/Fluids/puddle.rsi/splat7.png index 05bbc5b8a9..d8e8633e08 100644 Binary files a/Resources/Textures/Fluids/puddle.rsi/splat7.png and b/Resources/Textures/Fluids/puddle.rsi/splat7.png differ diff --git a/Resources/Textures/Fluids/puddle.rsi/splat9.png b/Resources/Textures/Fluids/puddle.rsi/splat9.png index 05122c6752..b6f3f4f279 100644 Binary files a/Resources/Textures/Fluids/puddle.rsi/splat9.png and b/Resources/Textures/Fluids/puddle.rsi/splat9.png differ diff --git a/Resources/Textures/Interface/Misc/health_icons.rsi/Critical.png b/Resources/Textures/Interface/Misc/health_icons.rsi/Critical.png new file mode 100644 index 0000000000..779874eaae Binary files /dev/null and b/Resources/Textures/Interface/Misc/health_icons.rsi/Critical.png differ diff --git a/Resources/Textures/Interface/Misc/health_icons.rsi/Dead.png b/Resources/Textures/Interface/Misc/health_icons.rsi/Dead.png new file mode 100644 index 0000000000..beceebd05c Binary files /dev/null and b/Resources/Textures/Interface/Misc/health_icons.rsi/Dead.png differ diff --git a/Resources/Textures/Interface/Misc/health_icons.rsi/Fine.png b/Resources/Textures/Interface/Misc/health_icons.rsi/Fine.png index 8d07f93496..45725aa73c 100644 Binary files a/Resources/Textures/Interface/Misc/health_icons.rsi/Fine.png and b/Resources/Textures/Interface/Misc/health_icons.rsi/Fine.png differ diff --git a/Resources/Textures/Interface/Misc/health_icons.rsi/Rotting.png b/Resources/Textures/Interface/Misc/health_icons.rsi/Rotting.png new file mode 100644 index 0000000000..8965b1308d Binary files /dev/null and b/Resources/Textures/Interface/Misc/health_icons.rsi/Rotting.png differ diff --git a/Resources/Textures/Interface/Misc/health_icons.rsi/meta.json b/Resources/Textures/Interface/Misc/health_icons.rsi/meta.json index 9bc6327145..fb584d6b7f 100644 --- a/Resources/Textures/Interface/Misc/health_icons.rsi/meta.json +++ b/Resources/Textures/Interface/Misc/health_icons.rsi/meta.json @@ -5,10 +5,29 @@ "y": 8 }, "license": "CC-BY-SA-3.0", - "copyright": "https://github.com/tgstation/tgstation/blob/master/icons/mob/huds/hud.dmi", + "copyright": "Taken from /tg/station at commit https://github.com/tgstation/tgstation/commit/20ae083f140ac5b4da7e8bc40f95349001b6c086", "states": [ { "name": "Fine" + }, + { + "name": "Critical" + }, + { + "name": "Dead", + "delays": [ + [ + 0.125, + 0.125, + 0.125, + 0.125, + 0.125, + 0.125 + ] + ] + }, + { + "name": "Rotting" } ] -} \ No newline at end of file +} diff --git a/Resources/Textures/Interface/Misc/job_icons.rsi/InitialInfected.png b/Resources/Textures/Interface/Misc/job_icons.rsi/InitialInfected.png new file mode 100644 index 0000000000..3684fc4488 Binary files /dev/null and b/Resources/Textures/Interface/Misc/job_icons.rsi/InitialInfected.png differ diff --git a/Resources/Textures/Interface/Misc/job_icons.rsi/meta.json b/Resources/Textures/Interface/Misc/job_icons.rsi/meta.json index c8ec131c28..745cc43b84 100644 --- a/Resources/Textures/Interface/Misc/job_icons.rsi/meta.json +++ b/Resources/Textures/Interface/Misc/job_icons.rsi/meta.json @@ -182,6 +182,9 @@ }, { "name": "Visitor" + }, + { + "name": "InitialInfected" } ] } diff --git a/Resources/Textures/Interface/VerbIcons/paint.svg b/Resources/Textures/Interface/VerbIcons/paint.svg new file mode 100644 index 0000000000..78a56e3570 --- /dev/null +++ b/Resources/Textures/Interface/VerbIcons/paint.svg @@ -0,0 +1,39 @@ + + + + + + diff --git a/Resources/Textures/Interface/VerbIcons/paint.svg.192dpi.png b/Resources/Textures/Interface/VerbIcons/paint.svg.192dpi.png new file mode 100644 index 0000000000..b7bd88245f Binary files /dev/null and b/Resources/Textures/Interface/VerbIcons/paint.svg.192dpi.png differ diff --git a/Resources/Textures/Interface/VerbIcons/paint.svg.192dpi.png.yml b/Resources/Textures/Interface/VerbIcons/paint.svg.192dpi.png.yml new file mode 100644 index 0000000000..5c43e23305 --- /dev/null +++ b/Resources/Textures/Interface/VerbIcons/paint.svg.192dpi.png.yml @@ -0,0 +1,2 @@ +sample: + filter: true diff --git a/Resources/Textures/Objects/Fun/spraycans.rsi/clown-inhand-left.png b/Resources/Textures/Objects/Fun/spraycans.rsi/clown-inhand-left.png new file mode 100644 index 0000000000..d90d5b21b7 Binary files /dev/null and b/Resources/Textures/Objects/Fun/spraycans.rsi/clown-inhand-left.png differ diff --git a/Resources/Textures/Objects/Fun/spraycans.rsi/clown-inhand-right.png b/Resources/Textures/Objects/Fun/spraycans.rsi/clown-inhand-right.png new file mode 100644 index 0000000000..27b68e2cfe Binary files /dev/null and b/Resources/Textures/Objects/Fun/spraycans.rsi/clown-inhand-right.png differ diff --git a/Resources/Textures/Objects/Fun/spraycans.rsi/meta.json b/Resources/Textures/Objects/Fun/spraycans.rsi/meta.json index 0f883ee280..f34820cec4 100644 --- a/Resources/Textures/Objects/Fun/spraycans.rsi/meta.json +++ b/Resources/Textures/Objects/Fun/spraycans.rsi/meta.json @@ -58,9 +58,6 @@ { "name": "spray" }, - { - "name": "spray_cap" - }, { "name": "spray_cap_colors" }, @@ -70,6 +67,22 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "clown-inhand-right", + "directions": 4 + }, + { + "name": "clown-inhand-left", + "directions": 4 + }, + { + "name": "spray-inhand-right", + "directions": 4 + }, + { + "name": "spray-inhand-left", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Fun/spraycans.rsi/spray-inhand-left.png b/Resources/Textures/Objects/Fun/spraycans.rsi/spray-inhand-left.png new file mode 100644 index 0000000000..ad3ad959de Binary files /dev/null and b/Resources/Textures/Objects/Fun/spraycans.rsi/spray-inhand-left.png differ diff --git a/Resources/Textures/Objects/Fun/spraycans.rsi/spray-inhand-right.png b/Resources/Textures/Objects/Fun/spraycans.rsi/spray-inhand-right.png new file mode 100644 index 0000000000..353e47c56f Binary files /dev/null and b/Resources/Textures/Objects/Fun/spraycans.rsi/spray-inhand-right.png differ diff --git a/Resources/Textures/Objects/Fun/spraycans.rsi/spray_cap.png b/Resources/Textures/Objects/Fun/spraycans.rsi/spray_cap.png deleted file mode 100644 index 01d2d49bc0..0000000000 Binary files a/Resources/Textures/Objects/Fun/spraycans.rsi/spray_cap.png and /dev/null differ diff --git a/Resources/Textures/Objects/Fun/toys.rsi/holoplush.png b/Resources/Textures/Objects/Fun/toys.rsi/holoplush.png new file mode 100644 index 0000000000..811bf9e649 Binary files /dev/null and b/Resources/Textures/Objects/Fun/toys.rsi/holoplush.png differ diff --git a/Resources/Textures/Objects/Fun/toys.rsi/magicplush.png b/Resources/Textures/Objects/Fun/toys.rsi/magicplush.png new file mode 100644 index 0000000000..950de931a0 Binary files /dev/null and b/Resources/Textures/Objects/Fun/toys.rsi/magicplush.png differ diff --git a/Resources/Textures/Objects/Fun/toys.rsi/meta.json b/Resources/Textures/Objects/Fun/toys.rsi/meta.json index ef50532eba..fc92a47936 100644 --- a/Resources/Textures/Objects/Fun/toys.rsi/meta.json +++ b/Resources/Textures/Objects/Fun/toys.rsi/meta.json @@ -1,328 +1,355 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432, orb, orb-inhand-left and orb-inhand-right created by Pancake, plushie_diona and plushie_diona1 created by discord user Deos#5630, toy-mouse-equipped-HELMET is a resprited 1-equipped-HELMET in mouse.rsi by PuroSlavKing (Github), plushie_xeno by LinkUyx#6557, plushie_hampter by RenLou#4333, beachball taken from https://github.com/ss220-space/Paradise/commit/662c08272acd7be79531550919f56f846726eabb, beachb-inhand by ;3#1161, bee hat and in-hand sprites drawn by Ubaser, plushie_penguin by netwy, plushie_arachnid by PixelTheKermit (github), plushie human by TheShuEd, NanoTrasen Balloon by MACMAN2003", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432, orb, orb-inhand-left and orb-inhand-right created by Pancake, plushie_diona and plushie_diona1 created by discord user Deos#5630, toy-mouse-equipped-HELMET is a resprited 1-equipped-HELMET in mouse.rsi by PuroSlavKing (Github), plushie_xeno by LinkUyx#6557, plushie_hampter by RenLou#4333, beachball taken from https://github.com/ss220-space/Paradise/commit/662c08272acd7be79531550919f56f846726eabb, beachb-inhand by ;3#1161, bee hat and in-hand sprites drawn by Ubaser, plushie_penguin by netwy, plushie_arachnid by PixelTheKermit (github), plushie human by TheShuEd, NanoTrasen Balloon by MACMAN2003, holoplush and magicplush modified by deltanedas (github)", "size": { "x": 32, "y": 32 }, - "states": [ - { - "name": "plushie_ratvar" - }, - { - "name": "plushie_penguin" - }, - { - "name": "plushie_moth" - }, - { - "name": "plushie_rouny", - "directions": 4 - }, - { - "name": "plushie_spacelizard" - }, - { - "name": "carpplush" - }, - { - "name": "narplush" - }, - { - "name": "plushie_h" - }, - { - "name": "bee-equipped-HELMET", - "directions": 4 - }, - { - "name": "bee-inhand-left", - "directions": 4 - }, - { - "name": "bee-inhand-right", - "directions": 4 - }, - { - "name": "plushie_hampter" - }, - { - "name": "plushie_arachnid" - }, - { - "name": "plushie_lizard" - }, - { - "name": "plushie_lizard_mirrored" - }, - { - "name": "plushie_lamp" - }, - { - "name": "plushie_nuke" - }, - { - "name": "plushie_atmosian" - }, - { - "name": "plushie_slime" - }, - { - "name": "plushie_snake" - }, - { - "name": "plushie_vox" - }, - { - "name": "plushie_diona" - }, - { - "name": "plushie_human" - }, - { - "name": "plushie_diona1" - }, - { - "name": "plushie_xeno" - }, - { - "name": "carpplush-inhand-left", - "directions": 4 - }, - { - "name": "carpplush-inhand-right", - "directions": 4 - }, - { - "name": "AI" - }, - { - "name": "base" - }, - { - "name": "bolt-closed" - }, - { - "name": "bolt-open" - }, - { - "name": "foamblade" - }, - { - "name": "foamcrossbow" - }, - { - "name": "foamdart" - }, - { - "name": "foambox" - }, - { - "name": "ian" - }, - { - "name": "nuketoy" - }, - { - "name": "snappop" - }, - { - "name": "spbox" - }, - { - "name": "toy_mouse" - }, - { - "name": "mouse-equipped-HELMET", - "directions": 4 - }, - { - "name": "capbullet" - }, - { - "name": "foamcrossbow-inhand-right", - "directions": 4 - }, - { - "name": "foamcrossbow-inhand-left", - "directions": 4 - }, - { - "name": "capgun-inhand-right", - "directions": 4 - }, - { - "name": "capgun-inhand-left", - "directions": 4 - }, - { - "name": "foamblade-inhand-right", - "directions": 4 - }, - { - "name": "foamblade-inhand-left", - "directions": 4 - }, - { - "name": "corgib-inhand-right", - "directions": 4 - }, - { - "name": "corgib-inhand-left", - "directions": 4 - }, - { - "name": "ntb-inhand-right", - "directions": 4 - }, - { - "name": "ntb-inhand-left", - "directions": 4 - }, - { - "name": "synb-inhand-left", - "directions": 4 - }, - { - "name": "synb-inhand-right", - "directions": 4 - }, - { - "name": "synb" - }, - { - "name": "ntb" - }, - { - "name": "corgib" - }, - { - "name": "football" - }, - { - "name": "footb-inhand-right", - "directions": 4 - }, - { - "name": "footb-inhand-left", - "directions": 4 - }, - { - "name": "basketball" - }, - { - "name": "bask-inhand-right", - "directions": 4, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "bask-inhand-left", - "directions": 4, - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ], - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "singularitytoy", - "delays": [ - [ - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1, - 0.1 - ] - ] - }, - { - "name": "orb", - "delays": [ - [ - 0.2, - 0.2, - 0.2, - 0.2 - ] - ] - }, - { - "name": "orb-inhand-left", - "directions": 4 - }, - { - "name": "orb-inhand-right", - "directions": 4 - }, - { - "name": "beachball" - }, - { - "name": "beachb-inhand-left", - "directions": 4 - }, - { - "name": "beachb-inhand-right", - "directions": 4 - } - ] + "states": [ + { + "name": "plushie_ratvar" + }, + { + "name": "plushie_penguin" + }, + { + "name": "plushie_moth" + }, + { + "name": "plushie_rouny", + "directions": 4 + }, + { + "name": "plushie_spacelizard" + }, + { + "name": "carpplush" + }, + { + "name": "holoplush", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "magicplush" + }, + { + "name": "rainbowcarpplush" + }, + { + "name": "narplush" + }, + { + "name": "plushie_h" + }, + { + "name": "bee-equipped-HELMET", + "directions": 4 + }, + { + "name": "bee-inhand-left", + "directions": 4 + }, + { + "name": "bee-inhand-right", + "directions": 4 + }, + { + "name": "plushie_hampter" + }, + { + "name": "plushie_arachnid" + }, + { + "name": "plushie_lizard" + }, + { + "name": "plushie_lizard_mirrored" + }, + { + "name": "plushie_lamp" + }, + { + "name": "plushie_nuke" + }, + { + "name": "plushie_atmosian" + }, + { + "name": "plushie_slime" + }, + { + "name": "plushie_snake" + }, + { + "name": "plushie_vox" + }, + { + "name": "plushie_diona" + }, + { + "name": "plushie_human" + }, + { + "name": "plushie_diona1" + }, + { + "name": "plushie_xeno" + }, + { + "name": "carpplush-inhand-left", + "directions": 4 + }, + { + "name": "carpplush-inhand-right", + "directions": 4 + }, + { + "name": "AI" + }, + { + "name": "base" + }, + { + "name": "bolt-closed" + }, + { + "name": "bolt-open" + }, + { + "name": "foamblade" + }, + { + "name": "foamcrossbow" + }, + { + "name": "foamdart" + }, + { + "name": "foambox" + }, + { + "name": "ian" + }, + { + "name": "nuketoy" + }, + { + "name": "snappop" + }, + { + "name": "spbox" + }, + { + "name": "toy_mouse" + }, + { + "name": "mouse-equipped-HELMET", + "directions": 4 + }, + { + "name": "capbullet" + }, + { + "name": "foamcrossbow-inhand-right", + "directions": 4 + }, + { + "name": "foamcrossbow-inhand-left", + "directions": 4 + }, + { + "name": "capgun-inhand-right", + "directions": 4 + }, + { + "name": "capgun-inhand-left", + "directions": 4 + }, + { + "name": "foamblade-inhand-right", + "directions": 4 + }, + { + "name": "foamblade-inhand-left", + "directions": 4 + }, + { + "name": "corgib-inhand-right", + "directions": 4 + }, + { + "name": "corgib-inhand-left", + "directions": 4 + }, + { + "name": "ntb-inhand-right", + "directions": 4 + }, + { + "name": "ntb-inhand-left", + "directions": 4 + }, + { + "name": "synb-inhand-left", + "directions": 4 + }, + { + "name": "synb-inhand-right", + "directions": 4 + }, + { + "name": "synb" + }, + { + "name": "ntb" + }, + { + "name": "corgib" + }, + { + "name": "football" + }, + { + "name": "footb-inhand-right", + "directions": 4 + }, + { + "name": "footb-inhand-left", + "directions": 4 + }, + { + "name": "basketball" + }, + { + "name": "bask-inhand-right", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "bask-inhand-left", + "directions": 4, + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ], + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "singularitytoy", + "delays": [ + [ + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1, + 0.1 + ] + ] + }, + { + "name": "orb", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + }, + { + "name": "orb-inhand-left", + "directions": 4 + }, + { + "name": "orb-inhand-right", + "directions": 4 + }, + { + "name": "beachball" + }, + { + "name": "beachb-inhand-left", + "directions": 4 + }, + { + "name": "beachb-inhand-right", + "directions": 4 + } + ] } diff --git a/Resources/Textures/Objects/Fun/toys.rsi/rainbowcarpplush.png b/Resources/Textures/Objects/Fun/toys.rsi/rainbowcarpplush.png new file mode 100644 index 0000000000..2897243871 Binary files /dev/null and b/Resources/Textures/Objects/Fun/toys.rsi/rainbowcarpplush.png differ diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json index 8f21f8a25b..91602db51e 100644 --- a/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/bureaucracy.rsi/meta.json @@ -209,6 +209,9 @@ { "name": "paper_stamp-chaplain" }, + { + "name": "paper_stamp-lawyer" + }, { "name": "paper_stamp-clown" }, diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-detective.png b/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-detective.png index 097234f283..284d01c6dd 100644 Binary files a/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-detective.png and b/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-detective.png differ diff --git a/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-lawyer.png b/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-lawyer.png new file mode 100644 index 0000000000..dd57529475 Binary files /dev/null and b/Resources/Textures/Objects/Misc/bureaucracy.rsi/paper_stamp-lawyer.png differ diff --git a/Resources/Textures/Objects/Misc/stamps.rsi/meta.json b/Resources/Textures/Objects/Misc/stamps.rsi/meta.json index 13d35ad878..8ce4882a2f 100644 --- a/Resources/Textures/Objects/Misc/stamps.rsi/meta.json +++ b/Resources/Textures/Objects/Misc/stamps.rsi/meta.json @@ -1,62 +1,65 @@ { - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432. New stamp- icons taken from tgstation at https://github.com/tgstation/tgstation/commit/fb1012102257b7b0a08d861fd2b8ba963c416e93. stamp-warden is a darker version of stamp-hos.", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "stamp-cap" - }, - { - "name": "stamp-ce" - }, - { - "name": "stamp-centcom" - }, - { - "name": "stamp-chaplain" - }, - { - "name": "stamp-clown" - }, - { - "name": "stamp-cmo" - }, - { - "name": "stamp-deny" - }, - { - "name": "stamp-detective" - }, - { - "name": "stamp-hop" - }, - { - "name": "stamp-hos" - }, - { - "name": "stamp-ok" - }, - { - "name": "stamp-mime" - }, - { - "name": "stamp-qm" - }, - { - "name": "stamp-rd" - }, - { - "name": "stamp-syndicate" - }, - { - "name": "stamp-trader" - }, - { - "name": "stamp-warden" - } - ] + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432. New stamp- icons taken from tgstation at https://github.com/tgstation/tgstation/commit/fb1012102257b7b0a08d861fd2b8ba963c416e93. stamp-warden is a darker version of stamp-hos. stamp-lawyer is a darker version of stamp-cap.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "stamp-cap" + }, + { + "name": "stamp-ce" + }, + { + "name": "stamp-centcom" + }, + { + "name": "stamp-chaplain" + }, + { + "name": "stamp-lawyer" + }, + { + "name": "stamp-clown" + }, + { + "name": "stamp-cmo" + }, + { + "name": "stamp-deny" + }, + { + "name": "stamp-detective" + }, + { + "name": "stamp-hop" + }, + { + "name": "stamp-hos" + }, + { + "name": "stamp-ok" + }, + { + "name": "stamp-mime" + }, + { + "name": "stamp-qm" + }, + { + "name": "stamp-rd" + }, + { + "name": "stamp-syndicate" + }, + { + "name": "stamp-trader" + }, + { + "name": "stamp-warden" + } + ] } diff --git a/Resources/Textures/Objects/Misc/stamps.rsi/stamp-lawyer.png b/Resources/Textures/Objects/Misc/stamps.rsi/stamp-lawyer.png new file mode 100644 index 0000000000..ff0dd4d714 Binary files /dev/null and b/Resources/Textures/Objects/Misc/stamps.rsi/stamp-lawyer.png differ diff --git a/Resources/Textures/Objects/Specific/Medical/healthanalyzer.rsi/icon.png b/Resources/Textures/Objects/Specific/Medical/healthanalyzer.rsi/icon.png index 39298cf9f0..61c8a2844a 100644 Binary files a/Resources/Textures/Objects/Specific/Medical/healthanalyzer.rsi/icon.png and b/Resources/Textures/Objects/Specific/Medical/healthanalyzer.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Specific/Medical/healthanalyzer.rsi/meta.json b/Resources/Textures/Objects/Specific/Medical/healthanalyzer.rsi/meta.json index af66c180db..bf3ad807d6 100644 --- a/Resources/Textures/Objects/Specific/Medical/healthanalyzer.rsi/meta.json +++ b/Resources/Textures/Objects/Specific/Medical/healthanalyzer.rsi/meta.json @@ -5,7 +5,7 @@ "y": 32 }, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f07f847706d85b7cfa4b398e5175732212b69a63", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/f07f847706d85b7cfa4b398e5175732212b69a63 and recolored", "states": [ { "name": "analyzer", diff --git a/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/base.png b/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/base.png new file mode 100644 index 0000000000..14d0ec5870 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/base.png differ diff --git a/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/icon.png b/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/icon.png new file mode 100644 index 0000000000..e388313f0e Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/meta.json b/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/meta.json new file mode 100644 index 0000000000..b7585556c6 --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/meta.json @@ -0,0 +1,31 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Pipebomb sprites made by girthquake", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "base" + }, + { + "name": "wires" + }, + { + "name": "primed", + "delays": [ + [ + 0.2, + 0.2, + 0.2, + 0.2 + ] + ] + } + ] +} diff --git a/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/primed.png b/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/primed.png new file mode 100644 index 0000000000..27a70981fe Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/primed.png differ diff --git a/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/wires.png b/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/wires.png new file mode 100644 index 0000000000..e564f71eab Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Bombs/pipebomb.rsi/wires.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Basic/kinetic_accelerator.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Basic/kinetic_accelerator.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..2be82246c2 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Basic/kinetic_accelerator.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Basic/kinetic_accelerator.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Basic/kinetic_accelerator.rsi/meta.json index c40db27806..3aac7e3788 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Basic/kinetic_accelerator.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Basic/kinetic_accelerator.rsi/meta.json @@ -38,6 +38,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/advancedlasergun.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Battery/advancedlasergun.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..a4d64471de Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Battery/advancedlasergun.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/advancedlasergun.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Battery/advancedlasergun.rsi/meta.json index a9431c65cc..907ff1d8ea 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Battery/advancedlasergun.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Battery/advancedlasergun.rsi/meta.json @@ -39,6 +39,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/antiquelasergun.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Battery/antiquelasergun.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..a4d64471de Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Battery/antiquelasergun.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/antiquelasergun.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Battery/antiquelasergun.rsi/meta.json index e63711d47d..04e2ac9309 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Battery/antiquelasergun.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Battery/antiquelasergun.rsi/meta.json @@ -71,6 +71,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..9686a1911d Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/meta.json index 970a230bf8..3b1547beb7 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Battery/disabler.rsi/meta.json @@ -72,6 +72,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } \ No newline at end of file diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/laser_cannon.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Battery/laser_cannon.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..c58b7e3c45 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Battery/laser_cannon.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/laser_cannon.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Battery/laser_cannon.rsi/meta.json index d002675273..6657216b76 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Battery/laser_cannon.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Battery/laser_cannon.rsi/meta.json @@ -68,6 +68,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..e511f1379e Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/meta.json index 4c6f32507b..7ec48da4fe 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Battery/laser_gun.rsi/meta.json @@ -36,6 +36,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/makeshift.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Battery/makeshift.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..2e4445adfa Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Battery/makeshift.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/makeshift.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Battery/makeshift.rsi/meta.json index 897d4233af..dabe44dce0 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Battery/makeshift.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Battery/makeshift.rsi/meta.json @@ -36,6 +36,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 }, { "name": "equipped-BELT", diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/practice_disabler.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Battery/practice_disabler.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..eead59f2cb Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Battery/practice_disabler.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/practice_disabler.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Battery/practice_disabler.rsi/meta.json index 3617fdd66b..dc1ee0684f 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Battery/practice_disabler.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Battery/practice_disabler.rsi/meta.json @@ -64,6 +64,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } \ No newline at end of file diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/pulse_carbine.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Battery/pulse_carbine.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..5ac3c6c8c4 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Battery/pulse_carbine.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/pulse_carbine.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Battery/pulse_carbine.rsi/meta.json index 159cf411e0..3b48bfc87c 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Battery/pulse_carbine.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Battery/pulse_carbine.rsi/meta.json @@ -36,6 +36,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/pulse_rifle.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Battery/pulse_rifle.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..e13760d4eb Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Battery/pulse_rifle.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/pulse_rifle.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Battery/pulse_rifle.rsi/meta.json index fd779f5a3a..1a906ef965 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Battery/pulse_rifle.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Battery/pulse_rifle.rsi/meta.json @@ -36,6 +36,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/taser.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Battery/taser.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..ed96666e88 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Battery/taser.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/taser.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Battery/taser.rsi/meta.json index f0d5f9dfc9..08eb87f871 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Battery/taser.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Battery/taser.rsi/meta.json @@ -77,6 +77,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/xray.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Battery/xray.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..6ae9d358cd Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Battery/xray.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Battery/xray.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Battery/xray.rsi/meta.json index a0c1ca8b1d..990ba51185 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Battery/xray.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Battery/xray.rsi/meta.json @@ -45,6 +45,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..63c4bdf3d6 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/meta.json index 9a5cf766c7..a5e32a3b39 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Launchers/china_lake.rsi/meta.json @@ -24,6 +24,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Pistols/N1984.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Pistols/N1984.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..ab0d0a822f Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Pistols/N1984.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Pistols/N1984.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Pistols/N1984.rsi/meta.json index 9ca4968722..748eb1de0e 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Pistols/N1984.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Pistols/N1984.rsi/meta.json @@ -30,6 +30,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Pistols/cobra.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Pistols/cobra.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..07f1f9fa26 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Pistols/cobra.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Pistols/cobra.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Pistols/cobra.rsi/meta.json index 946d9a1814..f0a41ab20d 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Pistols/cobra.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Pistols/cobra.rsi/meta.json @@ -27,6 +27,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Pistols/mk58.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Pistols/mk58.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..785f4037d7 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Pistols/mk58.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Pistols/mk58.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Pistols/mk58.rsi/meta.json index 707c54c0bb..4e40f6e842 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Pistols/mk58.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Pistols/mk58.rsi/meta.json @@ -30,6 +30,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Pistols/viper.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Pistols/viper.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..07f1f9fa26 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Pistols/viper.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Pistols/viper.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Pistols/viper.rsi/meta.json index b611235f4d..6ac14bfc8f 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Pistols/viper.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Pistols/viper.rsi/meta.json @@ -33,6 +33,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/chimp.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Revolvers/chimp.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..5a38166c22 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Revolvers/chimp.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/chimp.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Revolvers/chimp.rsi/meta.json index e5f6d6c61f..02697b6d5e 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Revolvers/chimp.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Revolvers/chimp.rsi/meta.json @@ -27,6 +27,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/deckard.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Revolvers/deckard.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..65f3aacd30 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Revolvers/deckard.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/deckard.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Revolvers/deckard.rsi/meta.json index 61f086e93d..fb84e5e63c 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Revolvers/deckard.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Revolvers/deckard.rsi/meta.json @@ -33,6 +33,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/inspector.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Revolvers/inspector.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..65f3aacd30 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Revolvers/inspector.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/inspector.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Revolvers/inspector.rsi/meta.json index f24ef91bcf..1faecd06b3 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Revolvers/inspector.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Revolvers/inspector.rsi/meta.json @@ -24,6 +24,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/mateba.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Revolvers/mateba.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..65f3aacd30 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Revolvers/mateba.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/mateba.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Revolvers/mateba.rsi/meta.json index f24ef91bcf..1faecd06b3 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Revolvers/mateba.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Revolvers/mateba.rsi/meta.json @@ -24,6 +24,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..65f3aacd30 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi/meta.json index 504a793820..3cdd175e71 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Revolvers/pirate_revolver.rsi/meta.json @@ -24,6 +24,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..d20bca74f5 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/meta.json index 12a95021c6..919d0f87ac 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Rifles/ak.rsi/meta.json @@ -30,6 +30,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..8e2f1548b1 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/meta.json index eae8c0dd9a..cac6899c48 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Rifles/carbine.rsi/meta.json @@ -30,6 +30,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..7e73d94ffa Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/meta.json index 955dc6e8bf..2f30ef18a8 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Rifles/lecter.rsi/meta.json @@ -30,6 +30,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/atreides.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/atreides.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..17384b5857 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/SMGs/atreides.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/atreides.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/SMGs/atreides.rsi/meta.json index 4ed311cb4a..df17b6ce6a 100644 --- a/Resources/Textures/Objects/Weapons/Guns/SMGs/atreides.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/SMGs/atreides.rsi/meta.json @@ -33,6 +33,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..caac143bc4 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/meta.json index ef54ce952a..8b1af3c504 100644 --- a/Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/SMGs/c20r.rsi/meta.json @@ -48,6 +48,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..38a2686dfb Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/meta.json index cbdbfefd14..25feebd92c 100644 --- a/Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/SMGs/drozd.rsi/meta.json @@ -33,6 +33,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/vector.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/vector.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..061f8bdae9 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/SMGs/vector.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/vector.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/SMGs/vector.rsi/meta.json index 66274aa8a6..02ba281891 100644 --- a/Resources/Textures/Objects/Weapons/Guns/SMGs/vector.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/SMGs/vector.rsi/meta.json @@ -30,6 +30,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/wt550.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/wt550.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..ee46b3bcf7 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/SMGs/wt550.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/wt550.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/SMGs/wt550.rsi/meta.json index 8de70644d1..66f9e56c3b 100644 --- a/Resources/Textures/Objects/Weapons/Guns/SMGs/wt550.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/SMGs/wt550.rsi/meta.json @@ -147,6 +147,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..c325b84c7e Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/meta.json index 607db55835..5ef981dec9 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Shotguns/bulldog.rsi/meta.json @@ -30,6 +30,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..79fe8aa7cd Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun.rsi/meta.json index 7408c3f4ac..27d7ebd665 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Shotguns/db_shotgun.rsi/meta.json @@ -16,6 +16,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..c5e9fb4324 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer.rsi/meta.json index 67bfc37e93..f3a7f48582 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Shotguns/enforcer.rsi/meta.json @@ -16,6 +16,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/flaregun.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Shotguns/flaregun.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..c17f5ce777 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Shotguns/flaregun.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/flaregun.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Shotguns/flaregun.rsi/meta.json index 6358c26299..fc96d8d519 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Shotguns/flaregun.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Shotguns/flaregun.rsi/meta.json @@ -24,6 +24,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/hm_pistol.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Shotguns/hm_pistol.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..785f4037d7 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Shotguns/hm_pistol.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/hm_pistol.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Shotguns/hm_pistol.rsi/meta.json index 4e592b59a4..9fd38ac1fe 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Shotguns/hm_pistol.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Shotguns/hm_pistol.rsi/meta.json @@ -25,6 +25,10 @@ { "name": "equipped-BELT", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/improvised_shotgun.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Shotguns/improvised_shotgun.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..0d1800fa5c Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Shotguns/improvised_shotgun.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/improvised_shotgun.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Shotguns/improvised_shotgun.rsi/meta.json index 92bc382a42..211d71bf1f 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Shotguns/improvised_shotgun.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Shotguns/improvised_shotgun.rsi/meta.json @@ -14,6 +14,10 @@ "name": "equipped-BACKPACK", "directions": 4 }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 + }, { "name": "ishotgunstep1" }, diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/pump.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Shotguns/pump.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..302e6d14b5 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Shotguns/pump.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/pump.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Shotguns/pump.rsi/meta.json index 7408c3f4ac..27d7ebd665 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Shotguns/pump.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Shotguns/pump.rsi/meta.json @@ -16,6 +16,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/sawn.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Shotguns/sawn.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..d4e3306e6b Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Shotguns/sawn.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Shotguns/sawn.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Shotguns/sawn.rsi/meta.json index bb01559033..55becacf83 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Shotguns/sawn.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Shotguns/sawn.rsi/meta.json @@ -16,6 +16,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..a9ad62c9be Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/meta.json index c223e6b194..4f7fc5d6f5 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Snipers/bolt_gun_wood.rsi/meta.json @@ -24,6 +24,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi/equipped-SUITSTORAGE.png b/Resources/Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi/equipped-SUITSTORAGE.png new file mode 100644 index 0000000000..a349de44b0 Binary files /dev/null and b/Resources/Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi/equipped-SUITSTORAGE.png differ diff --git a/Resources/Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi/meta.json index 33ee152a4e..da8881c7c5 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Snipers/heavy_sniper.rsi/meta.json @@ -24,6 +24,10 @@ { "name": "equipped-BACKPACK", "directions": 4 + }, + { + "name": "equipped-SUITSTORAGE", + "directions": 4 } ] } diff --git a/Resources/Textures/Structures/Furniture/chairs.rsi/meta.json b/Resources/Textures/Structures/Furniture/chairs.rsi/meta.json index c94ef97909..cbfc417444 100644 --- a/Resources/Textures/Structures/Furniture/chairs.rsi/meta.json +++ b/Resources/Textures/Structures/Furniture/chairs.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/11402f6ae62facc2e8bcfa1f8ef5353b26663278, meat.png is CC0-1.0 by EmoGarbage404 (github) for Space Station 14. chair.png and its derrivatives taken from shiptest at commit https://github.com/shiptest-ss13/Shiptest/commit/f761c784812e827960a66cd10aac17ebc6edfac3, palette for chair.png, steel-bench.png and chair-greyscale.png taken from paradise equivalent chairs at commit https://github.com/ParadiseSS13/Paradise/commit/5ce5a66c814c4a60118d24885389357fd0240002, steel by SonicHDC, brass chair.png taken from tgstation at https://github.com/tgstation/tgstation/blob/b7e7779c19b76449c290aaf2150fb93545b1a79a/icons/obj/chairs.dmi", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/11402f6ae62facc2e8bcfa1f8ef5353b26663278, meat.png is CC0-1.0 by EmoGarbage404 (github) for Space Station 14. chair.png and its derrivatives taken from shiptest at commit https://github.com/shiptest-ss13/Shiptest/commit/f761c784812e827960a66cd10aac17ebc6edfac3, palette for chair.png, steel-bench.png and chair-greyscale.png taken from paradise equivalent chairs at commit https://github.com/ParadiseSS13/Paradise/commit/5ce5a66c814c4a60118d24885389357fd0240002, steel by SonicHDC, brass chair.png taken from tgstation at https://github.com/tgstation/tgstation/blob/b7e7779c19b76449c290aaf2150fb93545b1a79a/icons/obj/chairs.dmi, wooden bench by Ko4erga (discord)", "size": { "x": 32, "y": 32 @@ -71,6 +71,10 @@ "name": "wooden", "directions": 4 }, + { + "name": "wooden-bench", + "directions": 4 + }, { "name": "wooden-wings", "directions": 4 diff --git a/Resources/Textures/Structures/Furniture/chairs.rsi/wooden-bench.png b/Resources/Textures/Structures/Furniture/chairs.rsi/wooden-bench.png new file mode 100644 index 0000000000..00192a1447 Binary files /dev/null and b/Resources/Textures/Structures/Furniture/chairs.rsi/wooden-bench.png differ diff --git a/Resources/Textures/Structures/Storage/closet.rsi/meta.json b/Resources/Textures/Structures/Storage/closet.rsi/meta.json index 3e06ae44b2..143b2e059c 100644 --- a/Resources/Textures/Structures/Storage/closet.rsi/meta.json +++ b/Resources/Textures/Structures/Storage/closet.rsi/meta.json @@ -470,6 +470,9 @@ { "name": "secure_door" }, + { + "name": "secure_icon" + }, { "name": "secure_open" }, diff --git a/Resources/Textures/Structures/Storage/closet.rsi/secure_icon.png b/Resources/Textures/Structures/Storage/closet.rsi/secure_icon.png new file mode 100644 index 0000000000..03b98c64db Binary files /dev/null and b/Resources/Textures/Structures/Storage/closet.rsi/secure_icon.png differ diff --git a/Resources/Textures/Structures/Storage/wall_locker.rsi/generic_icon.png b/Resources/Textures/Structures/Storage/wall_locker.rsi/generic_icon.png new file mode 100644 index 0000000000..63e9dcb0fa Binary files /dev/null and b/Resources/Textures/Structures/Storage/wall_locker.rsi/generic_icon.png differ diff --git a/Resources/Textures/Structures/Storage/wall_locker.rsi/meta.json b/Resources/Textures/Structures/Storage/wall_locker.rsi/meta.json index 3408841645..b6ed63c7a3 100644 --- a/Resources/Textures/Structures/Storage/wall_locker.rsi/meta.json +++ b/Resources/Textures/Structures/Storage/wall_locker.rsi/meta.json @@ -18,6 +18,7 @@ { "name": "fire_open" }, { "name": "generic" }, { "name": "generic_door" }, + { "name": "generic_icon" }, { "name": "generic_open" }, { "name": "gray_door" }, { "name": "green_door" }, diff --git a/Resources/Textures/Structures/Walls/wooden_fence.rsi/corner.png b/Resources/Textures/Structures/Walls/wooden_fence.rsi/corner.png new file mode 100644 index 0000000000..a7fe858c4b Binary files /dev/null and b/Resources/Textures/Structures/Walls/wooden_fence.rsi/corner.png differ diff --git a/Resources/Textures/Structures/Walls/wooden_fence.rsi/corner_small.png b/Resources/Textures/Structures/Walls/wooden_fence.rsi/corner_small.png new file mode 100644 index 0000000000..4e80b4d19e Binary files /dev/null and b/Resources/Textures/Structures/Walls/wooden_fence.rsi/corner_small.png differ diff --git a/Resources/Textures/Structures/Walls/wooden_fence.rsi/door_closed.png b/Resources/Textures/Structures/Walls/wooden_fence.rsi/door_closed.png new file mode 100644 index 0000000000..2f02a6f743 Binary files /dev/null and b/Resources/Textures/Structures/Walls/wooden_fence.rsi/door_closed.png differ diff --git a/Resources/Textures/Structures/Walls/wooden_fence.rsi/door_closed_small.png b/Resources/Textures/Structures/Walls/wooden_fence.rsi/door_closed_small.png new file mode 100644 index 0000000000..2b3693e9dc Binary files /dev/null and b/Resources/Textures/Structures/Walls/wooden_fence.rsi/door_closed_small.png differ diff --git a/Resources/Textures/Structures/Walls/wooden_fence.rsi/door_opened.png b/Resources/Textures/Structures/Walls/wooden_fence.rsi/door_opened.png new file mode 100644 index 0000000000..4464eac3be Binary files /dev/null and b/Resources/Textures/Structures/Walls/wooden_fence.rsi/door_opened.png differ diff --git a/Resources/Textures/Structures/Walls/wooden_fence.rsi/door_opened_small.png b/Resources/Textures/Structures/Walls/wooden_fence.rsi/door_opened_small.png new file mode 100644 index 0000000000..99dc852d35 Binary files /dev/null and b/Resources/Textures/Structures/Walls/wooden_fence.rsi/door_opened_small.png differ diff --git a/Resources/Textures/Structures/Walls/wooden_fence.rsi/end.png b/Resources/Textures/Structures/Walls/wooden_fence.rsi/end.png new file mode 100644 index 0000000000..8e4a035214 Binary files /dev/null and b/Resources/Textures/Structures/Walls/wooden_fence.rsi/end.png differ diff --git a/Resources/Textures/Structures/Walls/wooden_fence.rsi/end_small.png b/Resources/Textures/Structures/Walls/wooden_fence.rsi/end_small.png new file mode 100644 index 0000000000..aefaef6ed3 Binary files /dev/null and b/Resources/Textures/Structures/Walls/wooden_fence.rsi/end_small.png differ diff --git a/Resources/Textures/Structures/Walls/wooden_fence.rsi/meta.json b/Resources/Textures/Structures/Walls/wooden_fence.rsi/meta.json new file mode 100644 index 0000000000..9253b538d9 --- /dev/null +++ b/Resources/Textures/Structures/Walls/wooden_fence.rsi/meta.json @@ -0,0 +1,59 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "by Ko4erga (discord)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "straight", + "directions": 4 + }, + { + "name": "end", + "directions": 4 + }, + { + "name": "corner", + "directions": 4 + }, + { + "name": "door_closed", + "directions": 4 + }, + { + "name": "door_opened", + "directions": 4 + }, + { + "name": "tjunction", + "directions": 4 + }, + { + "name": "straight_small", + "directions": 4 + }, + { + "name": "end_small", + "directions": 4 + }, + { + "name": "corner_small", + "directions": 4 + }, + { + "name": "door_closed_small", + "directions": 4 + }, + { + "name": "door_opened_small", + "directions": 4 + }, + { + "name": "tjunction_small", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Structures/Walls/wooden_fence.rsi/straight.png b/Resources/Textures/Structures/Walls/wooden_fence.rsi/straight.png new file mode 100644 index 0000000000..4eb510ff69 Binary files /dev/null and b/Resources/Textures/Structures/Walls/wooden_fence.rsi/straight.png differ diff --git a/Resources/Textures/Structures/Walls/wooden_fence.rsi/straight_small.png b/Resources/Textures/Structures/Walls/wooden_fence.rsi/straight_small.png new file mode 100644 index 0000000000..b148fc8431 Binary files /dev/null and b/Resources/Textures/Structures/Walls/wooden_fence.rsi/straight_small.png differ diff --git a/Resources/Textures/Structures/Walls/wooden_fence.rsi/tjunction.png b/Resources/Textures/Structures/Walls/wooden_fence.rsi/tjunction.png new file mode 100644 index 0000000000..85cd3d431a Binary files /dev/null and b/Resources/Textures/Structures/Walls/wooden_fence.rsi/tjunction.png differ diff --git a/Resources/Textures/Structures/Walls/wooden_fence.rsi/tjunction_small.png b/Resources/Textures/Structures/Walls/wooden_fence.rsi/tjunction_small.png new file mode 100644 index 0000000000..8dc3ee32f6 Binary files /dev/null and b/Resources/Textures/Structures/Walls/wooden_fence.rsi/tjunction_small.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy.png new file mode 100644 index 0000000000..024678fc20 Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_buy.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell.png b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell.png new file mode 100644 index 0000000000..0d11fb19d3 Binary files /dev/null and b/Resources/Textures/Structures/cargo_pallets.rsi/cargo_pallet_sell.png differ diff --git a/Resources/Textures/Structures/cargo_pallets.rsi/meta.json b/Resources/Textures/Structures/cargo_pallets.rsi/meta.json new file mode 100644 index 0000000000..4751d95b9b --- /dev/null +++ b/Resources/Textures/Structures/cargo_pallets.rsi/meta.json @@ -0,0 +1,17 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Created by TheShuEd (github) for Space Station 14)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "cargo_pallet_buy" + }, + { + "name": "cargo_pallet_sell" + } + ] +} diff --git a/Resources/Textures/Structures/stairs.rsi/meta.json b/Resources/Textures/Structures/stairs.rsi/meta.json index d9f5a22fbe..586e1cd2e4 100644 --- a/Resources/Textures/Structures/stairs.rsi/meta.json +++ b/Resources/Textures/Structures/stairs.rsi/meta.json @@ -27,6 +27,13 @@ }, { "name": "stairs_stage_dark" + }, + { + "name": "stairs_wood", + "directions": 4 + }, + { + "name": "stairs_stage_wood" } ] } diff --git a/Resources/Textures/Structures/stairs.rsi/stairs_stage_wood.png b/Resources/Textures/Structures/stairs.rsi/stairs_stage_wood.png new file mode 100644 index 0000000000..615933e917 Binary files /dev/null and b/Resources/Textures/Structures/stairs.rsi/stairs_stage_wood.png differ diff --git a/Resources/Textures/Structures/stairs.rsi/stairs_wood.png b/Resources/Textures/Structures/stairs.rsi/stairs_wood.png new file mode 100644 index 0000000000..7c5d17a6c8 Binary files /dev/null and b/Resources/Textures/Structures/stairs.rsi/stairs_wood.png differ diff --git a/Resources/engineCommandPerms.yml b/Resources/engineCommandPerms.yml index 15200531e3..51743c6e82 100644 --- a/Resources/engineCommandPerms.yml +++ b/Resources/engineCommandPerms.yml @@ -67,6 +67,7 @@ - scene - replay_recording_stats - print_pvs_ack + - pvs_override_info - merge_grids diff --git a/Resources/mapping_actions.yml b/Resources/mapping_actions.yml index 0dda6b38a5..9498c3062a 100644 --- a/Resources/mapping_actions.yml +++ b/Resources/mapping_actions.yml @@ -3,6 +3,7 @@ entity: ReinforcedWindow keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -17,6 +18,7 @@ entity: WallSolid keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -31,6 +33,7 @@ entity: WallReinforced keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -45,6 +48,7 @@ entity: Window keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -59,6 +63,7 @@ entity: Firelock keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -73,6 +78,7 @@ entity: Grille keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -86,6 +92,7 @@ icon: Interface/VerbIcons/delete.svg.192dpi.png keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -104,6 +111,7 @@ entity: GasPipeStraight keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -118,6 +126,7 @@ entity: GasPipeBend keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -132,6 +141,7 @@ entity: GasPipeTJunction keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -146,6 +156,7 @@ entity: GasPipeFourway keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -160,6 +171,7 @@ entity: GasVentScrubber keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -174,6 +186,7 @@ entity: GasVentPump keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -188,6 +201,7 @@ entity: AirAlarm keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -202,6 +216,7 @@ entity: FireAlarm keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -216,6 +231,7 @@ entity: APCBasic keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -230,6 +246,7 @@ entity: CableApcExtension keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -244,6 +261,7 @@ entity: CableMV keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -258,6 +276,7 @@ entity: CableHV keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -272,6 +291,7 @@ entity: SubstationBasic keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -286,6 +306,7 @@ entity: Poweredlight keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -300,6 +321,7 @@ entity: EmergencyLight keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -314,6 +336,7 @@ entity: SMESBasic keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -328,6 +351,7 @@ entity: TableWood keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -342,6 +366,7 @@ entity: Table keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -356,6 +381,7 @@ entity: ChairWood keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -370,6 +396,7 @@ entity: Chair keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -384,6 +411,7 @@ entity: ChairOfficeLight keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -398,6 +426,7 @@ entity: StoolBar keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -412,6 +441,7 @@ entity: Stool keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -426,6 +456,7 @@ entity: Rack keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -440,6 +471,7 @@ entity: ChairOfficeDark keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -454,6 +486,7 @@ entity: LampGold keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -468,6 +501,7 @@ entity: DisposalPipe keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -482,6 +516,7 @@ entity: DisposalBend keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -496,6 +531,7 @@ entity: DisposalJunction keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -510,6 +546,7 @@ entity: DisposalJunctionFlipped keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -524,6 +561,7 @@ entity: DisposalRouter keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -538,6 +576,7 @@ entity: DisposalRouterFlipped keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -552,6 +591,7 @@ entity: DisposalUnit keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -566,6 +606,7 @@ entity: DisposalTrunk keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -580,6 +621,7 @@ entity: SignDisposalSpace keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -594,6 +636,7 @@ entity: Windoor keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -608,6 +651,7 @@ entity: WindowDirectional keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -622,6 +666,7 @@ entity: WindowReinforcedDirectional keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -636,6 +681,7 @@ entity: PlasmaWindowDirectional keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -650,6 +696,7 @@ entity: Railing keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -664,6 +711,7 @@ entity: RailingCorner keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -678,6 +726,7 @@ entity: RailingCornerSmall keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -693,6 +742,7 @@ name: RailingRound keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -706,6 +756,7 @@ entity: AirlockMaintLocked keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -720,6 +771,7 @@ entity: AirlockGlass keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -734,6 +786,7 @@ entity: AirlockServiceLocked keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -748,6 +801,7 @@ entity: AirlockSecurityLocked keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -762,6 +816,7 @@ entity: AirlockCommand keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -776,6 +831,7 @@ entity: AirlockScience keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -790,6 +846,7 @@ entity: AirlockMedical keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -804,6 +861,7 @@ entity: AirlockEngineering keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -818,6 +876,7 @@ entity: AirlockCargo keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -837,6 +896,7 @@ state: bot_left iconColor: '#EFB34196' checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -857,6 +917,7 @@ state: delivery iconColor: '#EFB34196' checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -877,6 +938,7 @@ state: warn_full iconColor: '#EFB34196' checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -897,6 +959,7 @@ state: halftile_overlay iconColor: '#EFB34196' checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -917,6 +980,7 @@ state: halftile_overlay iconColor: '#334E6DC8' checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -937,6 +1001,7 @@ state: halftile_overlay iconColor: '#52B4E996' checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -957,6 +1022,7 @@ state: halftile_overlay iconColor: '#9FED5896' checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -977,6 +1043,7 @@ state: halftile_overlay iconColor: '#DE3A3A96' checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -997,6 +1064,7 @@ state: halftile_overlay iconColor: '#D381C996' checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -1017,6 +1085,7 @@ state: halftile_overlay iconColor: '#A4610696' checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -1031,6 +1100,7 @@ icon: /Textures/Tiles/steel.png keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -1044,6 +1114,7 @@ icon: /Textures/Tiles/plating.png keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True @@ -1059,6 +1130,7 @@ icon: /Textures/Tiles/cropped_parallax.png keywords: [] checkCanInteract: False + checkConsciousness: False clientExclusive: True autoPopulate: False temporary: True diff --git a/Resources/migration.yml b/Resources/migration.yml index 93af464fbe..5ba5934144 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -204,3 +204,13 @@ AirlockExternalEasyPryLocked: AirlockExternalLocked AirlockExternalGlassEasyPryLocked: AirlockExternalGlassLocked AirlockGlassShuttleEasyPryLocked: AirlockExternalGlassShuttleLocked AirlockShuttleEasyPryLocked: AirlockExternalShuttleLocked + +#2024-03-10 +ClothingBackpackFilledDetective: ClothingBackpackSecurityFilledDetective +ClothingBackpackDuffelFilledDetective: ClothingBackpackDuffelSecurityFilledDetective +ClothingBackpackSatchelFilledDetective: ClothingBackpackSatchelSecurityFilledDetective + +# 2024-03-11 +ImprovisedExplosive: FireBomb +ImprovisedExplosiveEmpty: FireBombEmpty +ImprovisedExplosiveFuel: FireBombFuel diff --git a/RobustToolbox b/RobustToolbox index 2b6381c332..b1f9d011ce 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 2b6381c332793b6207db2d865234674f36824bbe +Subproject commit b1f9d011ce08166f47fdef60cd310ab7765ca2b1